From af7882601aad93ada881486eeaabc562f1733961 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 23 Apr 2018 08:17:58 -0700 Subject: [PATCH] - fd5f3d7077270ffc5ea74cdb9e18bbae3b9b46aa Fix typo optional -> variant by Abseil Team - 9136c06dfa8dbfdde0a427ad3509e34763d607a6 Fix string_view_test and str_cat_test build under MSVC de... by Derek Mauro - a463820f9441888f4368aa87328599e3209f9b07 Removes constexpr optional::operator->(). This was don... by Abseil Team - 3bf78a7f126daafff329f7815d507422f1ca378d Remove dependencies on external CCTZ project. by Shaindel Schwartz - a4ae574a11b1ddf6e88459af3d638cf79aea7ecd Internal change by Jon Cohen GitOrigin-RevId: fd5f3d7077270ffc5ea74cdb9e18bbae3b9b46aa Change-Id: I6ab8ab99863716fe9b2745a12ef285f7a6da6d1e --- CMake/AbseilHelpers.cmake | 2 +- CMake/README.md | 9 +- CMakeLists.txt | 6 - WORKSPACE | 7 - absl/base/config.h | 2 +- absl/strings/str_cat_test.cc | 2 + absl/strings/string_view_test.cc | 2 + absl/time/BUILD.bazel | 8 +- absl/time/CMakeLists.txt | 25 +- absl/time/format.cc | 4 +- absl/time/internal/cctz/BUILD.bazel | 105 ++ .../internal/cctz/include/cctz/civil_time.h | 329 ++++ .../cctz/include/cctz/civil_time_detail.h | 564 +++++++ .../internal/cctz/include/cctz/time_zone.h | 316 ++++ .../cctz/include/cctz/zone_info_source.h | 91 ++ .../internal/cctz/src/civil_time_detail.cc | 90 ++ .../time/internal/cctz/src/civil_time_test.cc | 1049 ++++++++++++ .../time/internal/cctz/src/time_zone_fixed.cc | 133 ++ absl/time/internal/cctz/src/time_zone_fixed.h | 49 + .../internal/cctz/src/time_zone_format.cc | 848 ++++++++++ .../cctz/src/time_zone_format_test.cc | 1408 +++++++++++++++++ absl/time/internal/cctz/src/time_zone_if.cc | 41 + absl/time/internal/cctz/src/time_zone_if.h | 70 + absl/time/internal/cctz/src/time_zone_impl.cc | 117 ++ absl/time/internal/cctz/src/time_zone_impl.h | 97 ++ absl/time/internal/cctz/src/time_zone_info.cc | 956 +++++++++++ absl/time/internal/cctz/src/time_zone_info.h | 132 ++ absl/time/internal/cctz/src/time_zone_libc.cc | 156 ++ absl/time/internal/cctz/src/time_zone_libc.h | 50 + .../internal/cctz/src/time_zone_lookup.cc | 142 ++ .../cctz/src/time_zone_lookup_test.cc | 1259 +++++++++++++++ .../time/internal/cctz/src/time_zone_posix.cc | 155 ++ absl/time/internal/cctz/src/time_zone_posix.h | 118 ++ absl/time/internal/cctz/src/tzfile.h | 117 ++ .../internal/cctz/src/zone_info_source.cc | 70 + .../internal/cctz/testdata/README.zoneinfo | 37 + absl/time/internal/cctz/testdata/version | 1 + .../cctz/testdata/zoneinfo/Africa/Abidjan | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Accra | Bin 0 -> 842 bytes .../cctz/testdata/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Algiers | Bin 0 -> 760 bytes .../cctz/testdata/zoneinfo/Africa/Asmara | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Asmera | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Bamako | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Bangui | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Banjul | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Bissau | Bin 0 -> 208 bytes .../cctz/testdata/zoneinfo/Africa/Blantyre | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Brazzaville | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Bujumbura | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Cairo | Bin 0 -> 1972 bytes .../cctz/testdata/zoneinfo/Africa/Casablanca | Bin 0 -> 1643 bytes .../cctz/testdata/zoneinfo/Africa/Ceuta | Bin 0 -> 2059 bytes .../cctz/testdata/zoneinfo/Africa/Conakry | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Dakar | Bin 0 -> 170 bytes .../testdata/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Djibouti | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Douala | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/El_Aaiun | Bin 0 -> 1473 bytes .../cctz/testdata/zoneinfo/Africa/Freetown | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Gaborone | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Harare | Bin 0 -> 171 bytes .../testdata/zoneinfo/Africa/Johannesburg | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Juba | Bin 0 -> 683 bytes .../cctz/testdata/zoneinfo/Africa/Kampala | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Khartoum | Bin 0 -> 713 bytes .../cctz/testdata/zoneinfo/Africa/Kigali | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Kinshasa | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lagos | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Libreville | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lome | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Luanda | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lubumbashi | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lusaka | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Malabo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Maputo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Maseru | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Mbabane | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Mogadishu | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Monrovia | Bin 0 -> 233 bytes .../cctz/testdata/zoneinfo/Africa/Nairobi | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Ndjamena | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Africa/Niamey | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Nouakchott | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Ouagadougou | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Porto-Novo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Sao_Tome | Bin 0 -> 234 bytes .../cctz/testdata/zoneinfo/Africa/Timbuktu | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Tripoli | Bin 0 -> 655 bytes .../cctz/testdata/zoneinfo/Africa/Tunis | Bin 0 -> 710 bytes .../cctz/testdata/zoneinfo/Africa/Windhoek | Bin 0 -> 1030 bytes .../cctz/testdata/zoneinfo/America/Adak | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/America/Anchorage | Bin 0 -> 2380 bytes .../cctz/testdata/zoneinfo/America/Anguilla | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Antigua | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Araguaina | Bin 0 -> 910 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1081 bytes .../zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1123 bytes .../zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Argentina/Salta | Bin 0 -> 1081 bytes .../zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1123 bytes .../zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1139 bytes .../zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1137 bytes .../zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Aruba | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/Asuncion | Bin 0 -> 2077 bytes .../cctz/testdata/zoneinfo/America/Atikokan | Bin 0 -> 345 bytes .../cctz/testdata/zoneinfo/America/Atka | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/America/Bahia | Bin 0 -> 1050 bytes .../testdata/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1588 bytes .../cctz/testdata/zoneinfo/America/Barbados | Bin 0 -> 344 bytes .../cctz/testdata/zoneinfo/America/Belem | Bin 0 -> 602 bytes .../cctz/testdata/zoneinfo/America/Belize | Bin 0 -> 978 bytes .../testdata/zoneinfo/America/Blanc-Sablon | Bin 0 -> 307 bytes .../cctz/testdata/zoneinfo/America/Boa_Vista | Bin 0 -> 658 bytes .../cctz/testdata/zoneinfo/America/Bogota | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/America/Boise | Bin 0 -> 2403 bytes .../testdata/zoneinfo/America/Buenos_Aires | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2098 bytes .../testdata/zoneinfo/America/Campo_Grande | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/America/Cancun | Bin 0 -> 816 bytes .../cctz/testdata/zoneinfo/America/Caracas | Bin 0 -> 289 bytes .../cctz/testdata/zoneinfo/America/Catamarca | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Cayenne | Bin 0 -> 224 bytes .../cctz/testdata/zoneinfo/America/Cayman | Bin 0 -> 203 bytes .../cctz/testdata/zoneinfo/America/Chicago | Bin 0 -> 3585 bytes .../cctz/testdata/zoneinfo/America/Chihuahua | Bin 0 -> 1522 bytes .../testdata/zoneinfo/America/Coral_Harbour | Bin 0 -> 345 bytes .../cctz/testdata/zoneinfo/America/Cordoba | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Costa_Rica | Bin 0 -> 341 bytes .../cctz/testdata/zoneinfo/America/Creston | Bin 0 -> 233 bytes .../cctz/testdata/zoneinfo/America/Cuiaba | Bin 0 -> 1988 bytes .../cctz/testdata/zoneinfo/America/Curacao | Bin 0 -> 212 bytes .../testdata/zoneinfo/America/Danmarkshavn | Bin 0 -> 712 bytes .../cctz/testdata/zoneinfo/America/Dawson | Bin 0 -> 2093 bytes .../testdata/zoneinfo/America/Dawson_Creek | Bin 0 -> 1059 bytes .../cctz/testdata/zoneinfo/America/Denver | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/America/Detroit | Bin 0 -> 2188 bytes .../cctz/testdata/zoneinfo/America/Dominica | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Edmonton | Bin 0 -> 2402 bytes .../cctz/testdata/zoneinfo/America/Eirunepe | Bin 0 -> 690 bytes .../testdata/zoneinfo/America/El_Salvador | Bin 0 -> 250 bytes .../cctz/testdata/zoneinfo/America/Ensenada | Bin 0 -> 2356 bytes .../testdata/zoneinfo/America/Fort_Nelson | Bin 0 -> 2249 bytes .../cctz/testdata/zoneinfo/America/Fort_Wayne | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/America/Fortaleza | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/America/Glace_Bay | Bin 0 -> 2206 bytes .../cctz/testdata/zoneinfo/America/Godthab | Bin 0 -> 1892 bytes .../cctz/testdata/zoneinfo/America/Goose_Bay | Bin 0 -> 3219 bytes .../cctz/testdata/zoneinfo/America/Grand_Turk | Bin 0 -> 1881 bytes .../cctz/testdata/zoneinfo/America/Grenada | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Guadeloupe | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Guatemala | Bin 0 -> 306 bytes .../cctz/testdata/zoneinfo/America/Guayaquil | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/America/Guyana | Bin 0 -> 266 bytes .../cctz/testdata/zoneinfo/America/Halifax | Bin 0 -> 3438 bytes .../cctz/testdata/zoneinfo/America/Havana | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/America/Hermosillo | Bin 0 -> 454 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1675 bytes .../testdata/zoneinfo/America/Indiana/Knox | Bin 0 -> 2437 bytes .../testdata/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1731 bytes .../zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1913 bytes .../zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1735 bytes .../testdata/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1423 bytes .../zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1703 bytes .../testdata/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1787 bytes .../testdata/zoneinfo/America/Indianapolis | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/America/Inuvik | Bin 0 -> 1928 bytes .../cctz/testdata/zoneinfo/America/Iqaluit | Bin 0 -> 2046 bytes .../cctz/testdata/zoneinfo/America/Jamaica | Bin 0 -> 507 bytes .../cctz/testdata/zoneinfo/America/Jujuy | Bin 0 -> 1081 bytes .../cctz/testdata/zoneinfo/America/Juneau | Bin 0 -> 2362 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2781 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2361 bytes .../cctz/testdata/zoneinfo/America/Knox_IN | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/America/Kralendijk | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/La_Paz | Bin 0 -> 257 bytes .../cctz/testdata/zoneinfo/America/Lima | Bin 0 -> 431 bytes .../testdata/zoneinfo/America/Los_Angeles | Bin 0 -> 2845 bytes .../cctz/testdata/zoneinfo/America/Louisville | Bin 0 -> 2781 bytes .../testdata/zoneinfo/America/Lower_Princes | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/Maceio | Bin 0 -> 770 bytes .../cctz/testdata/zoneinfo/America/Managua | Bin 0 -> 463 bytes .../cctz/testdata/zoneinfo/America/Manaus | Bin 0 -> 630 bytes .../cctz/testdata/zoneinfo/America/Marigot | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Martinique | Bin 0 -> 257 bytes .../cctz/testdata/zoneinfo/America/Matamoros | Bin 0 -> 1416 bytes .../cctz/testdata/zoneinfo/America/Mazatlan | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/America/Mendoza | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Menominee | Bin 0 -> 2283 bytes .../cctz/testdata/zoneinfo/America/Merida | Bin 0 -> 1456 bytes .../cctz/testdata/zoneinfo/America/Metlakatla | Bin 0 -> 1418 bytes .../testdata/zoneinfo/America/Mexico_City | Bin 0 -> 1618 bytes .../cctz/testdata/zoneinfo/America/Miquelon | Bin 0 -> 1696 bytes .../cctz/testdata/zoneinfo/America/Moncton | Bin 0 -> 3163 bytes .../cctz/testdata/zoneinfo/America/Monterrey | Bin 0 -> 1416 bytes .../cctz/testdata/zoneinfo/America/Montevideo | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/America/Montreal | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/America/Montserrat | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Nassau | Bin 0 -> 2284 bytes .../cctz/testdata/zoneinfo/America/New_York | Bin 0 -> 3545 bytes .../cctz/testdata/zoneinfo/America/Nipigon | Bin 0 -> 2131 bytes .../cctz/testdata/zoneinfo/America/Nome | Bin 0 -> 2376 bytes .../cctz/testdata/zoneinfo/America/Noronha | Bin 0 -> 742 bytes .../zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2389 bytes .../zoneinfo/America/North_Dakota/Center | Bin 0 -> 2389 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2389 bytes .../cctz/testdata/zoneinfo/America/Ojinaga | Bin 0 -> 1522 bytes .../cctz/testdata/zoneinfo/America/Panama | Bin 0 -> 203 bytes .../testdata/zoneinfo/America/Pangnirtung | Bin 0 -> 2108 bytes .../cctz/testdata/zoneinfo/America/Paramaribo | Bin 0 -> 296 bytes .../cctz/testdata/zoneinfo/America/Phoenix | Bin 0 -> 353 bytes .../testdata/zoneinfo/America/Port-au-Prince | Bin 0 -> 1455 bytes .../testdata/zoneinfo/America/Port_of_Spain | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Porto_Acre | Bin 0 -> 662 bytes .../testdata/zoneinfo/America/Porto_Velho | Bin 0 -> 602 bytes .../testdata/zoneinfo/America/Puerto_Rico | Bin 0 -> 255 bytes .../testdata/zoneinfo/America/Punta_Arenas | Bin 0 -> 1911 bytes .../testdata/zoneinfo/America/Rainy_River | Bin 0 -> 2131 bytes .../testdata/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Recife | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/America/Regina | Bin 0 -> 994 bytes .../cctz/testdata/zoneinfo/America/Resolute | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Rio_Branco | Bin 0 -> 662 bytes .../cctz/testdata/zoneinfo/America/Rosario | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Santa_Isabel | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/America/Santarem | Bin 0 -> 632 bytes .../cctz/testdata/zoneinfo/America/Santiago | Bin 0 -> 2538 bytes .../testdata/zoneinfo/America/Santo_Domingo | Bin 0 -> 491 bytes .../cctz/testdata/zoneinfo/America/Sao_Paulo | Bin 0 -> 2016 bytes .../testdata/zoneinfo/America/Scoresbysund | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Shiprock | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/America/Sitka | Bin 0 -> 2350 bytes .../testdata/zoneinfo/America/St_Barthelemy | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Johns | Bin 0 -> 3664 bytes .../cctz/testdata/zoneinfo/America/St_Kitts | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Lucia | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Thomas | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Vincent | Bin 0 -> 170 bytes .../testdata/zoneinfo/America/Swift_Current | Bin 0 -> 574 bytes .../testdata/zoneinfo/America/Tegucigalpa | Bin 0 -> 278 bytes .../cctz/testdata/zoneinfo/America/Thule | Bin 0 -> 1528 bytes .../testdata/zoneinfo/America/Thunder_Bay | Bin 0 -> 2211 bytes .../cctz/testdata/zoneinfo/America/Tijuana | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/America/Toronto | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/America/Tortola | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Vancouver | Bin 0 -> 2901 bytes .../cctz/testdata/zoneinfo/America/Virgin | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Whitehorse | Bin 0 -> 2093 bytes .../cctz/testdata/zoneinfo/America/Winnipeg | Bin 0 -> 2891 bytes .../cctz/testdata/zoneinfo/America/Yakutat | Bin 0 -> 2314 bytes .../testdata/zoneinfo/America/Yellowknife | Bin 0 -> 1980 bytes .../cctz/testdata/zoneinfo/Antarctica/Casey | Bin 0 -> 311 bytes .../cctz/testdata/zoneinfo/Antarctica/Davis | Bin 0 -> 311 bytes .../zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 216 bytes .../testdata/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1543 bytes .../cctz/testdata/zoneinfo/Antarctica/Mawson | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2460 bytes .../cctz/testdata/zoneinfo/Antarctica/Palmer | Bin 0 -> 1432 bytes .../cctz/testdata/zoneinfo/Antarctica/Rothera | Bin 0 -> 186 bytes .../testdata/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2460 bytes .../cctz/testdata/zoneinfo/Antarctica/Syowa | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Antarctica/Troll | Bin 0 -> 1176 bytes .../cctz/testdata/zoneinfo/Antarctica/Vostok | Bin 0 -> 187 bytes .../testdata/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2251 bytes .../internal/cctz/testdata/zoneinfo/Asia/Aden | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Almaty | Bin 0 -> 1031 bytes .../cctz/testdata/zoneinfo/Asia/Amman | Bin 0 -> 1877 bytes .../cctz/testdata/zoneinfo/Asia/Anadyr | Bin 0 -> 1222 bytes .../cctz/testdata/zoneinfo/Asia/Aqtau | Bin 0 -> 1017 bytes .../cctz/testdata/zoneinfo/Asia/Aqtobe | Bin 0 -> 1047 bytes .../cctz/testdata/zoneinfo/Asia/Ashgabat | Bin 0 -> 651 bytes .../cctz/testdata/zoneinfo/Asia/Ashkhabad | Bin 0 -> 651 bytes .../cctz/testdata/zoneinfo/Asia/Atyrau | Bin 0 -> 1025 bytes .../cctz/testdata/zoneinfo/Asia/Baghdad | Bin 0 -> 1004 bytes .../cctz/testdata/zoneinfo/Asia/Bahrain | Bin 0 -> 225 bytes .../internal/cctz/testdata/zoneinfo/Asia/Baku | Bin 0 -> 1269 bytes .../cctz/testdata/zoneinfo/Asia/Bangkok | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Barnaul | Bin 0 -> 1255 bytes .../cctz/testdata/zoneinfo/Asia/Beirut | Bin 0 -> 2175 bytes .../cctz/testdata/zoneinfo/Asia/Bishkek | Bin 0 -> 1045 bytes .../cctz/testdata/zoneinfo/Asia/Brunei | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Calcutta | Bin 0 -> 312 bytes .../cctz/testdata/zoneinfo/Asia/Chita | Bin 0 -> 1257 bytes .../cctz/testdata/zoneinfo/Asia/Choibalsan | Bin 0 -> 991 bytes .../cctz/testdata/zoneinfo/Asia/Chongqing | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Chungking | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Colombo | Bin 0 -> 413 bytes .../cctz/testdata/zoneinfo/Asia/Dacca | Bin 0 -> 370 bytes .../cctz/testdata/zoneinfo/Asia/Damascus | Bin 0 -> 2320 bytes .../cctz/testdata/zoneinfo/Asia/Dhaka | Bin 0 -> 370 bytes .../internal/cctz/testdata/zoneinfo/Asia/Dili | Bin 0 -> 253 bytes .../cctz/testdata/zoneinfo/Asia/Dubai | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Dushanbe | Bin 0 -> 621 bytes .../cctz/testdata/zoneinfo/Asia/Famagusta | Bin 0 -> 2042 bytes .../internal/cctz/testdata/zoneinfo/Asia/Gaza | Bin 0 -> 2295 bytes .../cctz/testdata/zoneinfo/Asia/Harbin | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Hebron | Bin 0 -> 2323 bytes .../cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 389 bytes .../cctz/testdata/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1189 bytes .../internal/cctz/testdata/zoneinfo/Asia/Hovd | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Irkutsk | Bin 0 -> 1276 bytes .../cctz/testdata/zoneinfo/Asia/Istanbul | Bin 0 -> 2166 bytes .../cctz/testdata/zoneinfo/Asia/Jakarta | Bin 0 -> 392 bytes .../cctz/testdata/zoneinfo/Asia/Jayapura | Bin 0 -> 251 bytes .../cctz/testdata/zoneinfo/Asia/Jerusalem | Bin 0 -> 2265 bytes .../cctz/testdata/zoneinfo/Asia/Kabul | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Kamchatka | Bin 0 -> 1198 bytes .../cctz/testdata/zoneinfo/Asia/Karachi | Bin 0 -> 417 bytes .../cctz/testdata/zoneinfo/Asia/Kashgar | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Kathmandu | Bin 0 -> 238 bytes .../cctz/testdata/zoneinfo/Asia/Katmandu | Bin 0 -> 238 bytes .../cctz/testdata/zoneinfo/Asia/Khandyga | Bin 0 -> 1311 bytes .../cctz/testdata/zoneinfo/Asia/Kolkata | Bin 0 -> 312 bytes .../cctz/testdata/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1243 bytes .../cctz/testdata/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 424 bytes .../cctz/testdata/zoneinfo/Asia/Kuching | Bin 0 -> 521 bytes .../cctz/testdata/zoneinfo/Asia/Kuwait | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Macao | Bin 0 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Macau | Bin 0 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Magadan | Bin 0 -> 1258 bytes .../cctz/testdata/zoneinfo/Asia/Makassar | Bin 0 -> 288 bytes .../cctz/testdata/zoneinfo/Asia/Manila | Bin 0 -> 367 bytes .../cctz/testdata/zoneinfo/Asia/Muscat | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Nicosia | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1255 bytes .../internal/cctz/testdata/zoneinfo/Asia/Omsk | Bin 0 -> 1243 bytes .../internal/cctz/testdata/zoneinfo/Asia/Oral | Bin 0 -> 1039 bytes .../cctz/testdata/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Pontianak | Bin 0 -> 395 bytes .../cctz/testdata/zoneinfo/Asia/Pyongyang | Bin 0 -> 272 bytes .../cctz/testdata/zoneinfo/Asia/Qatar | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1047 bytes .../cctz/testdata/zoneinfo/Asia/Rangoon | Bin 0 -> 297 bytes .../cctz/testdata/zoneinfo/Asia/Riyadh | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Saigon | Bin 0 -> 389 bytes .../cctz/testdata/zoneinfo/Asia/Sakhalin | Bin 0 -> 1234 bytes .../cctz/testdata/zoneinfo/Asia/Samarkand | Bin 0 -> 619 bytes .../cctz/testdata/zoneinfo/Asia/Seoul | Bin 0 -> 531 bytes .../cctz/testdata/zoneinfo/Asia/Shanghai | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Singapore | Bin 0 -> 424 bytes .../cctz/testdata/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1244 bytes .../cctz/testdata/zoneinfo/Asia/Taipei | Bin 0 -> 790 bytes .../cctz/testdata/zoneinfo/Asia/Tashkent | Bin 0 -> 635 bytes .../cctz/testdata/zoneinfo/Asia/Tbilisi | Bin 0 -> 1080 bytes .../cctz/testdata/zoneinfo/Asia/Tehran | Bin 0 -> 1718 bytes .../cctz/testdata/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2265 bytes .../cctz/testdata/zoneinfo/Asia/Thimbu | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Thimphu | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Tokyo | Bin 0 -> 318 bytes .../cctz/testdata/zoneinfo/Asia/Tomsk | Bin 0 -> 1255 bytes .../cctz/testdata/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 288 bytes .../cctz/testdata/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Urumqi | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1290 bytes .../cctz/testdata/zoneinfo/Asia/Vientiane | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Vladivostok | Bin 0 -> 1244 bytes .../cctz/testdata/zoneinfo/Asia/Yakutsk | Bin 0 -> 1243 bytes .../cctz/testdata/zoneinfo/Asia/Yangon | Bin 0 -> 297 bytes .../cctz/testdata/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1281 bytes .../cctz/testdata/zoneinfo/Asia/Yerevan | Bin 0 -> 1213 bytes .../cctz/testdata/zoneinfo/Atlantic/Azores | Bin 0 -> 3493 bytes .../cctz/testdata/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2004 bytes .../cctz/testdata/zoneinfo/Atlantic/Canary | Bin 0 -> 1911 bytes .../testdata/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 284 bytes .../cctz/testdata/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1829 bytes .../cctz/testdata/zoneinfo/Atlantic/Faroe | Bin 0 -> 1829 bytes .../cctz/testdata/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2251 bytes .../cctz/testdata/zoneinfo/Atlantic/Madeira | Bin 0 -> 3484 bytes .../cctz/testdata/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1188 bytes .../testdata/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 181 bytes .../cctz/testdata/zoneinfo/Atlantic/St_Helena | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Atlantic/Stanley | Bin 0 -> 1251 bytes .../cctz/testdata/zoneinfo/Australia/ACT | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Adelaide | Bin 0 -> 2238 bytes .../cctz/testdata/zoneinfo/Australia/Brisbane | Bin 0 -> 452 bytes .../testdata/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2274 bytes .../cctz/testdata/zoneinfo/Australia/Canberra | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Currie | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Darwin | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Australia/Eucla | Bin 0 -> 503 bytes .../cctz/testdata/zoneinfo/Australia/Hobart | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Australia/LHI | Bin 0 -> 1889 bytes .../cctz/testdata/zoneinfo/Australia/Lindeman | Bin 0 -> 522 bytes .../testdata/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1889 bytes .../testdata/zoneinfo/Australia/Melbourne | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/NSW | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/North | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Australia/Perth | Bin 0 -> 479 bytes .../testdata/zoneinfo/Australia/Queensland | Bin 0 -> 452 bytes .../cctz/testdata/zoneinfo/Australia/South | Bin 0 -> 2238 bytes .../cctz/testdata/zoneinfo/Australia/Sydney | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Tasmania | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Australia/Victoria | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/West | Bin 0 -> 479 bytes .../testdata/zoneinfo/Australia/Yancowinna | Bin 0 -> 2274 bytes .../cctz/testdata/zoneinfo/Brazil/Acre | Bin 0 -> 662 bytes .../cctz/testdata/zoneinfo/Brazil/DeNoronha | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/Brazil/East | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Brazil/West | Bin 0 -> 630 bytes absl/time/internal/cctz/testdata/zoneinfo/CET | Bin 0 -> 2102 bytes .../internal/cctz/testdata/zoneinfo/CST6CDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Canada/Atlantic | Bin 0 -> 3438 bytes .../cctz/testdata/zoneinfo/Canada/Central | Bin 0 -> 2891 bytes .../cctz/testdata/zoneinfo/Canada/Eastern | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/Canada/Mountain | Bin 0 -> 2402 bytes .../testdata/zoneinfo/Canada/Newfoundland | Bin 0 -> 3664 bytes .../cctz/testdata/zoneinfo/Canada/Pacific | Bin 0 -> 2901 bytes .../testdata/zoneinfo/Canada/Saskatchewan | Bin 0 -> 994 bytes .../cctz/testdata/zoneinfo/Canada/Yukon | Bin 0 -> 2093 bytes .../cctz/testdata/zoneinfo/Chile/Continental | Bin 0 -> 2538 bytes .../cctz/testdata/zoneinfo/Chile/EasterIsland | Bin 0 -> 2242 bytes .../time/internal/cctz/testdata/zoneinfo/Cuba | Bin 0 -> 2437 bytes absl/time/internal/cctz/testdata/zoneinfo/EET | Bin 0 -> 1876 bytes absl/time/internal/cctz/testdata/zoneinfo/EST | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/EST5EDT | Bin 0 -> 2294 bytes .../internal/cctz/testdata/zoneinfo/Egypt | Bin 0 -> 1972 bytes .../time/internal/cctz/testdata/zoneinfo/Eire | Bin 0 -> 3531 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+1 | Bin 0 -> 148 bytes .../cctz/testdata/zoneinfo/Etc/GMT+10 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT+11 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT+12 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+2 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+3 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+4 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+5 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+6 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+7 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+8 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+9 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-1 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT-10 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-11 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-12 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-13 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-14 | Bin 0 -> 150 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-2 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-3 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-4 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-5 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-6 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-7 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-8 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-9 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT0 | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Etc/Greenwich | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/UCT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/UTC | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Etc/Universal | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/Zulu | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Europe/Amsterdam | Bin 0 -> 2949 bytes .../cctz/testdata/zoneinfo/Europe/Andorra | Bin 0 -> 1751 bytes .../cctz/testdata/zoneinfo/Europe/Astrakhan | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Europe/Athens | Bin 0 -> 2271 bytes .../cctz/testdata/zoneinfo/Europe/Belfast | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Belgrade | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Berlin | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Europe/Bratislava | Bin 0 -> 2272 bytes .../cctz/testdata/zoneinfo/Europe/Brussels | Bin 0 -> 2970 bytes .../cctz/testdata/zoneinfo/Europe/Bucharest | Bin 0 -> 2221 bytes .../cctz/testdata/zoneinfo/Europe/Budapest | Bin 0 -> 2405 bytes .../cctz/testdata/zoneinfo/Europe/Busingen | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Chisinau | Bin 0 -> 2445 bytes .../cctz/testdata/zoneinfo/Europe/Copenhagen | Bin 0 -> 2160 bytes .../cctz/testdata/zoneinfo/Europe/Dublin | Bin 0 -> 3531 bytes .../cctz/testdata/zoneinfo/Europe/Gibraltar | Bin 0 -> 3061 bytes .../cctz/testdata/zoneinfo/Europe/Guernsey | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Helsinki | Bin 0 -> 1909 bytes .../cctz/testdata/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Istanbul | Bin 0 -> 2166 bytes .../cctz/testdata/zoneinfo/Europe/Jersey | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1518 bytes .../cctz/testdata/zoneinfo/Europe/Kiev | Bin 0 -> 2097 bytes .../cctz/testdata/zoneinfo/Europe/Kirov | Bin 0 -> 1167 bytes .../cctz/testdata/zoneinfo/Europe/Lisbon | Bin 0 -> 3469 bytes .../cctz/testdata/zoneinfo/Europe/Ljubljana | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/London | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Luxembourg | Bin 0 -> 2974 bytes .../cctz/testdata/zoneinfo/Europe/Madrid | Bin 0 -> 2637 bytes .../cctz/testdata/zoneinfo/Europe/Malta | Bin 0 -> 2629 bytes .../cctz/testdata/zoneinfo/Europe/Mariehamn | Bin 0 -> 1909 bytes .../cctz/testdata/zoneinfo/Europe/Minsk | Bin 0 -> 1370 bytes .../cctz/testdata/zoneinfo/Europe/Monaco | Bin 0 -> 2953 bytes .../cctz/testdata/zoneinfo/Europe/Moscow | Bin 0 -> 1544 bytes .../cctz/testdata/zoneinfo/Europe/Nicosia | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Europe/Oslo | Bin 0 -> 2251 bytes .../cctz/testdata/zoneinfo/Europe/Paris | Bin 0 -> 2971 bytes .../cctz/testdata/zoneinfo/Europe/Podgorica | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Prague | Bin 0 -> 2272 bytes .../cctz/testdata/zoneinfo/Europe/Riga | Bin 0 -> 2235 bytes .../cctz/testdata/zoneinfo/Europe/Rome | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Samara | Bin 0 -> 1253 bytes .../cctz/testdata/zoneinfo/Europe/San_Marino | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Sarajevo | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Saratov | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Europe/Simferopol | Bin 0 -> 1490 bytes .../cctz/testdata/zoneinfo/Europe/Skopje | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Sofia | Bin 0 -> 2130 bytes .../cctz/testdata/zoneinfo/Europe/Stockholm | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Tallinn | Bin 0 -> 2187 bytes .../cctz/testdata/zoneinfo/Europe/Tirane | Bin 0 -> 2098 bytes .../cctz/testdata/zoneinfo/Europe/Tiraspol | Bin 0 -> 2445 bytes .../cctz/testdata/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1281 bytes .../cctz/testdata/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2103 bytes .../cctz/testdata/zoneinfo/Europe/Vaduz | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Vatican | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Vienna | Bin 0 -> 2237 bytes .../cctz/testdata/zoneinfo/Europe/Vilnius | Bin 0 -> 2199 bytes .../cctz/testdata/zoneinfo/Europe/Volgograd | Bin 0 -> 1167 bytes .../cctz/testdata/zoneinfo/Europe/Warsaw | Bin 0 -> 2705 bytes .../cctz/testdata/zoneinfo/Europe/Zagreb | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2115 bytes .../cctz/testdata/zoneinfo/Europe/Zurich | Bin 0 -> 1918 bytes .../internal/cctz/testdata/zoneinfo/Factory | Bin 0 -> 148 bytes absl/time/internal/cctz/testdata/zoneinfo/GB | Bin 0 -> 3687 bytes .../internal/cctz/testdata/zoneinfo/GB-Eire | Bin 0 -> 3687 bytes absl/time/internal/cctz/testdata/zoneinfo/GMT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/GMT+0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/GMT-0 | Bin 0 -> 127 bytes .../time/internal/cctz/testdata/zoneinfo/GMT0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Greenwich | Bin 0 -> 127 bytes absl/time/internal/cctz/testdata/zoneinfo/HST | Bin 0 -> 128 bytes .../internal/cctz/testdata/zoneinfo/Hongkong | Bin 0 -> 1189 bytes .../internal/cctz/testdata/zoneinfo/Iceland | Bin 0 -> 1188 bytes .../testdata/zoneinfo/Indian/Antananarivo | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Chagos | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Indian/Christmas | Bin 0 -> 182 bytes .../cctz/testdata/zoneinfo/Indian/Cocos | Bin 0 -> 191 bytes .../cctz/testdata/zoneinfo/Indian/Comoro | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Kerguelen | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Indian/Mahe | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Indian/Maldives | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Indian/Mauritius | Bin 0 -> 267 bytes .../cctz/testdata/zoneinfo/Indian/Mayotte | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Reunion | Bin 0 -> 187 bytes .../time/internal/cctz/testdata/zoneinfo/Iran | Bin 0 -> 1718 bytes .../internal/cctz/testdata/zoneinfo/Israel | Bin 0 -> 2265 bytes .../internal/cctz/testdata/zoneinfo/Jamaica | Bin 0 -> 507 bytes .../internal/cctz/testdata/zoneinfo/Japan | Bin 0 -> 318 bytes .../internal/cctz/testdata/zoneinfo/Kwajalein | Bin 0 -> 259 bytes .../internal/cctz/testdata/zoneinfo/Libya | Bin 0 -> 655 bytes absl/time/internal/cctz/testdata/zoneinfo/MET | Bin 0 -> 2102 bytes absl/time/internal/cctz/testdata/zoneinfo/MST | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/MST7MDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/Mexico/BajaSur | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/Mexico/General | Bin 0 -> 1618 bytes absl/time/internal/cctz/testdata/zoneinfo/NZ | Bin 0 -> 2460 bytes .../internal/cctz/testdata/zoneinfo/NZ-CHAT | Bin 0 -> 2087 bytes .../internal/cctz/testdata/zoneinfo/Navajo | Bin 0 -> 2453 bytes absl/time/internal/cctz/testdata/zoneinfo/PRC | Bin 0 -> 414 bytes .../internal/cctz/testdata/zoneinfo/PST8PDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Pacific/Apia | Bin 0 -> 1134 bytes .../cctz/testdata/zoneinfo/Pacific/Auckland | Bin 0 -> 2460 bytes .../testdata/zoneinfo/Pacific/Bougainville | Bin 0 -> 296 bytes .../cctz/testdata/zoneinfo/Pacific/Chatham | Bin 0 -> 2087 bytes .../cctz/testdata/zoneinfo/Pacific/Chuuk | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Easter | Bin 0 -> 2242 bytes .../cctz/testdata/zoneinfo/Pacific/Efate | Bin 0 -> 492 bytes .../cctz/testdata/zoneinfo/Pacific/Enderbury | Bin 0 -> 259 bytes .../cctz/testdata/zoneinfo/Pacific/Fakaofo | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Fiji | Bin 0 -> 1104 bytes .../cctz/testdata/zoneinfo/Pacific/Funafuti | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Galapagos | Bin 0 -> 268 bytes .../cctz/testdata/zoneinfo/Pacific/Gambier | Bin 0 -> 186 bytes .../testdata/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 188 bytes .../cctz/testdata/zoneinfo/Pacific/Guam | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Pacific/Honolulu | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/Pacific/Johnston | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/Pacific/Kiritimati | Bin 0 -> 263 bytes .../cctz/testdata/zoneinfo/Pacific/Kosrae | Bin 0 -> 251 bytes .../cctz/testdata/zoneinfo/Pacific/Kwajalein | Bin 0 -> 259 bytes .../cctz/testdata/zoneinfo/Pacific/Majuro | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Marquesas | Bin 0 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Midway | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Nauru | Bin 0 -> 282 bytes .../cctz/testdata/zoneinfo/Pacific/Niue | Bin 0 -> 266 bytes .../cctz/testdata/zoneinfo/Pacific/Norfolk | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Pacific/Noumea | Bin 0 -> 328 bytes .../cctz/testdata/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Palau | Bin 0 -> 182 bytes .../cctz/testdata/zoneinfo/Pacific/Pitcairn | Bin 0 -> 223 bytes .../cctz/testdata/zoneinfo/Pacific/Pohnpei | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Ponape | Bin 0 -> 183 bytes .../testdata/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 206 bytes .../cctz/testdata/zoneinfo/Pacific/Rarotonga | Bin 0 -> 602 bytes .../cctz/testdata/zoneinfo/Pacific/Saipan | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Pacific/Samoa | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Tahiti | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Pacific/Tarawa | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Tongatapu | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Pacific/Truk | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Wake | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Wallis | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Yap | Bin 0 -> 183 bytes .../internal/cctz/testdata/zoneinfo/Poland | Bin 0 -> 2705 bytes .../internal/cctz/testdata/zoneinfo/Portugal | Bin 0 -> 3469 bytes absl/time/internal/cctz/testdata/zoneinfo/ROC | Bin 0 -> 790 bytes absl/time/internal/cctz/testdata/zoneinfo/ROK | Bin 0 -> 531 bytes .../internal/cctz/testdata/zoneinfo/Singapore | Bin 0 -> 424 bytes .../internal/cctz/testdata/zoneinfo/Turkey | Bin 0 -> 2166 bytes absl/time/internal/cctz/testdata/zoneinfo/UCT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/US/Alaska | Bin 0 -> 2380 bytes .../cctz/testdata/zoneinfo/US/Aleutian | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/US/Arizona | Bin 0 -> 353 bytes .../cctz/testdata/zoneinfo/US/Central | Bin 0 -> 3585 bytes .../cctz/testdata/zoneinfo/US/East-Indiana | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/US/Eastern | Bin 0 -> 3545 bytes .../internal/cctz/testdata/zoneinfo/US/Hawaii | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/US/Indiana-Starke | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/US/Michigan | Bin 0 -> 2188 bytes .../cctz/testdata/zoneinfo/US/Mountain | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/US/Pacific | Bin 0 -> 2845 bytes .../internal/cctz/testdata/zoneinfo/US/Samoa | Bin 0 -> 196 bytes absl/time/internal/cctz/testdata/zoneinfo/UTC | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Universal | Bin 0 -> 127 bytes .../time/internal/cctz/testdata/zoneinfo/W-SU | Bin 0 -> 1544 bytes absl/time/internal/cctz/testdata/zoneinfo/WET | Bin 0 -> 1873 bytes .../time/internal/cctz/testdata/zoneinfo/Zulu | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/iso3166.tab | 274 ++++ .../internal/cctz/testdata/zoneinfo/localtime | Bin 0 -> 148 bytes .../cctz/testdata/zoneinfo/zone1970.tab | 382 +++++ absl/time/internal/test_util.cc | 8 +- absl/time/time.cc | 6 +- absl/time/time.h | 20 +- absl/time/time_zone_test.cc | 4 +- absl/types/optional.h | 12 +- absl/types/optional_test.cc | 47 +- 638 files changed, 9262 insertions(+), 58 deletions(-) create mode 100644 absl/time/internal/cctz/BUILD.bazel create mode 100644 absl/time/internal/cctz/include/cctz/civil_time.h create mode 100644 absl/time/internal/cctz/include/cctz/civil_time_detail.h create mode 100644 absl/time/internal/cctz/include/cctz/time_zone.h create mode 100644 absl/time/internal/cctz/include/cctz/zone_info_source.h create mode 100644 absl/time/internal/cctz/src/civil_time_detail.cc create mode 100644 absl/time/internal/cctz/src/civil_time_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.h create mode 100644 absl/time/internal/cctz/src/time_zone_format.cc create mode 100644 absl/time/internal/cctz/src/time_zone_format_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.h create mode 100644 absl/time/internal/cctz/src/time_zone_impl.cc create mode 100644 absl/time/internal/cctz/src/time_zone_impl.h create mode 100644 absl/time/internal/cctz/src/time_zone_info.cc create mode 100644 absl/time/internal/cctz/src/time_zone_info.h create mode 100644 absl/time/internal/cctz/src/time_zone_libc.cc create mode 100644 absl/time/internal/cctz/src/time_zone_libc.h create mode 100644 absl/time/internal/cctz/src/time_zone_lookup.cc create mode 100644 absl/time/internal/cctz/src/time_zone_lookup_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.h create mode 100644 absl/time/internal/cctz/src/tzfile.h create mode 100644 absl/time/internal/cctz/src/zone_info_source.cc create mode 100644 absl/time/internal/cctz/testdata/README.zoneinfo create mode 100644 absl/time/internal/cctz/testdata/version create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Casablanca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Adak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Antigua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Aruba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Barbados create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belize create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bogota create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boise create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cancun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Caracas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chicago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Creston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Curacao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Denver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Detroit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dominica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Godthab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guyana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Halifax create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Havana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vincennes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Juneau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Monticello create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lima create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lower_Princes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Maceio create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Managua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Manaus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Marigot create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Martinique create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Menominee create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Merida create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Moncton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montreal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nassau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/New_York create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Noronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Panama create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Recife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Regina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Resolute create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rosario create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santarem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santiago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sitka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thule create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Toronto create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tortola create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Virgin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Palmer create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Syowa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Samarkand create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tel_Aviv create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Bermuda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/North create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/South create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/East create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CST6CDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Cuba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST5EDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Egypt create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Athens create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/London create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Rome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Simferopol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Warsaw create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Factory create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB-Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/HST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Hongkong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iceland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Israel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Japan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Libya create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST7MDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/General create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ-CHAT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Navajo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PRC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PST8PDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Bougainville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Noumea create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Poland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Portugal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROK create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Turkey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Alaska create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Arizona create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Michigan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/W-SU create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/WET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/localtime create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake index b114b297c..0520fba3f 100644 --- a/CMake/AbseilHelpers.cmake +++ b/CMake/AbseilHelpers.cmake @@ -34,7 +34,7 @@ function(absl_library) cmake_parse_arguments(ABSL_LIB "DISABLE_INSTALL" # keep that in case we want to support installation one day "TARGET;EXPORT_NAME" - "SOURCES;PUBLIC_LIBRARIES;PRIVATE_COMPILE_FLAGS;PUBLIC_INCLUDE_DIRS;PRIVATE_INCLUDE_DIRS" + "SOURCES;PUBLIC_LIBRARIES;PRIVATE_COMPILE_FLAGS" ${ARGN} ) diff --git a/CMake/README.md b/CMake/README.md index bfcf5807a..e99340cc6 100644 --- a/CMake/README.md +++ b/CMake/README.md @@ -19,10 +19,8 @@ googletest framework ### Step-by-Step Instructions -1. If you haven't done so already, integrate the Abseil dependency -[CCTZ](https://github.com/google/cctz) into your CMake project. Consequently, the -target 'cctz' needs to be declared in your CMake project **before** including Abseil.
-Note: If you want to build the Abseil tests, you'll also need [Google Test](https://github.com/google/googletest). To disable Abseil tests, you have to pass +1. If you want to build the Abseil tests, integrate the Abseil dependency +[Google Test](https://github.com/google/googletest) into your CMake project. To disable Abseil tests, you have to pass `-DBUILD_TESTING=OFF` when configuring your project with CMake. 2. Download Abseil and copy it into a subdirectory in your CMake project or add @@ -31,8 +29,7 @@ CMake project. 3. You can then use the CMake command [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) -to include Abseil directly in your CMake project. In addition, it's possible to -customize the name of the `cctz` target with the `-DABSL_CCTZ_TARGET=*my_cctz*` option. +to include Abseil directly in your CMake project. 4. Add the **absl::** target you wish to use to the [`target_link_libraries()`](https://cmake.org/cmake/help/latest/command/target_link_libraries.html) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e715afc6..e46bdf455 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,15 +65,9 @@ set(ABSL_EXCEPTIONS_FLAG "${CMAKE_CXX_EXCEPTIONS}") ## pthread find_package(Threads REQUIRED) -if(NOT ABSL_CCTZ_TARGET) - set(ABSL_CCTZ_TARGET cctz) -endif() - # commented: used only for standalone test # Don't remove these or else CMake CI will break -#add_subdirectory(cctz) #add_subdirectory(googletest) -check_target(${ABSL_CCTZ_TARGET}) ## check targets if(BUILD_TESTING) diff --git a/WORKSPACE b/WORKSPACE index cac4047fc..0546573f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -17,13 +17,6 @@ http_archive( strip_prefix = "googletest-master", ) -# CCTZ (Time-zone framework). -http_archive( - name = "com_googlesource_code_cctz", - urls = ["https://github.com/google/cctz/archive/master.zip"], - strip_prefix = "cctz-master", -) - # RE2 regular-expression framework. Used by some unit-tests. http_archive( name = "com_googlesource_code_re2", diff --git a/absl/base/config.h b/absl/base/config.h index de33120f2..2f5f15951 100644 --- a/absl/base/config.h +++ b/absl/base/config.h @@ -384,7 +384,7 @@ // ABSL_HAVE_STD_VARIANT // -// Checks whether C++17 std::optional is available. +// Checks whether C++17 std::variant is available. #ifdef ABSL_HAVE_STD_VARIANT #error "ABSL_HAVE_STD_VARIANT cannot be directly set." #endif diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index 58ab743ac..c86a5952f 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -206,6 +206,8 @@ struct Mallocator { typedef Mallocator other; }; Mallocator() = default; + template + Mallocator(const Mallocator&) {} // NOLINT(runtime/explicit) T* allocate(size_t n) { return static_cast(std::malloc(n * sizeof(T))); } void deallocate(T* p, size_t) { std::free(p); } diff --git a/absl/strings/string_view_test.cc b/absl/strings/string_view_test.cc index a26f6c3ae..bb149d5c2 100644 --- a/absl/strings/string_view_test.cc +++ b/absl/strings/string_view_test.cc @@ -50,6 +50,8 @@ struct Mallocator { typedef Mallocator other; }; Mallocator() = default; + template + Mallocator(const Mallocator&) {} // NOLINT(runtime/explicit) T* allocate(size_t n) { return static_cast(std::malloc(n * sizeof(T))); } void deallocate(T* p, size_t) { std::free(p); } diff --git a/absl/time/BUILD.bazel b/absl/time/BUILD.bazel index 3d1d2df56..d4f653f40 100644 --- a/absl/time/BUILD.bazel +++ b/absl/time/BUILD.bazel @@ -44,8 +44,8 @@ cc_library( "//absl/base", "//absl/base:core_headers", "//absl/numeric:int128", - "@com_googlesource_code_cctz//:civil_time", - "@com_googlesource_code_cctz//:time_zone", + "//absl/time/internal/cctz:civil_time", + "//absl/time/internal/cctz:time_zone", ], ) @@ -63,7 +63,7 @@ cc_library( deps = [ ":time", "//absl/base", - "@com_googlesource_code_cctz//:time_zone", + "//absl/time/internal/cctz:time_zone", ], ) @@ -91,7 +91,7 @@ cc_test( "//absl/base", "//absl/base:config", "//absl/base:core_headers", + "//absl/time/internal/cctz:time_zone", "@com_google_googletest//:gtest_main", - "@com_googlesource_code_cctz//:time_zone", ], ) diff --git a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt index a35617895..72bb4d25b 100644 --- a/absl/time/CMakeLists.txt +++ b/absl/time/CMakeLists.txt @@ -22,6 +22,10 @@ list(APPEND TIME_PUBLIC_HEADERS list(APPEND TIME_INTERNAL_HEADERS "internal/test_util.h" + "internal/cctz/include/cctz/civil_time.h" + "internal/cctz/include/cctz/civil_time_detail.h" + "internal/cctz/include/cctz/time_zone.h" + "internal/cctz/include/cctz/zone_info_source.h" ) list(APPEND TIME_SRC @@ -29,10 +33,27 @@ list(APPEND TIME_SRC "clock.cc" "duration.cc" "format.cc" + "internal/cctz/src/civil_time_detail.cc" + "internal/cctz/src/time_zone_fixed.cc" + "internal/cctz/src/time_zone_fixed.h" + "internal/cctz/src/time_zone_format.cc" + "internal/cctz/src/time_zone_if.cc" + "internal/cctz/src/time_zone_if.h" + "internal/cctz/src/time_zone_impl.cc" + "internal/cctz/src/time_zone_impl.h" + "internal/cctz/src/time_zone_info.cc" + "internal/cctz/src/time_zone_info.h" + "internal/cctz/src/time_zone_libc.cc" + "internal/cctz/src/time_zone_libc.h" + "internal/cctz/src/time_zone_lookup.cc" + "internal/cctz/src/time_zone_posix.cc" + "internal/cctz/src/time_zone_posix.h" + "internal/cctz/src/tzfile.h" + "internal/cctz/src/zone_info_source.cc" ${TIME_PUBLIC_HEADERS} ${TIME_INTERNAL_HEADERS} ) -set(TIME_PUBLIC_LIBRARIES absl::base absl::stacktrace absl::int128 ${ABSL_CCTZ_TARGET}) +set(TIME_PUBLIC_LIBRARIES absl::base absl::stacktrace absl::int128) absl_library( TARGET @@ -41,8 +62,6 @@ absl_library( ${TIME_SRC} PUBLIC_LIBRARIES ${TIME_PUBLIC_LIBRARIES} - PUBLIC_INCLUDE_DIRS - ${CCTZ_INCLUDE_DIRS} EXPORT_NAME time ) diff --git a/absl/time/format.cc b/absl/time/format.cc index 7c88db5b0..5dc01bda1 100644 --- a/absl/time/format.cc +++ b/absl/time/format.cc @@ -16,8 +16,10 @@ #include #include +#include "absl/time/internal/cctz/include/cctz/time_zone.h" #include "absl/time/time.h" -#include "cctz/time_zone.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { diff --git a/absl/time/internal/cctz/BUILD.bazel b/absl/time/internal/cctz/BUILD.bazel new file mode 100644 index 000000000..fe17b3e31 --- /dev/null +++ b/absl/time/internal/cctz/BUILD.bazel @@ -0,0 +1,105 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # Apache License + +### libraries + +cc_library( + name = "includes", + textual_hdrs = [ + "include/cctz/civil_time.h", + "include/cctz/civil_time_detail.h", + "include/cctz/time_zone.h", + ], + visibility = ["//absl/time:__pkg__"], +) + +cc_library( + name = "civil_time", + srcs = ["src/civil_time_detail.cc"], + hdrs = [ + "include/cctz/civil_time.h", + ], + textual_hdrs = ["include/cctz/civil_time_detail.h"], + visibility = ["//visibility:public"], +) + +cc_library( + name = "time_zone", + srcs = [ + "src/time_zone_fixed.cc", + "src/time_zone_fixed.h", + "src/time_zone_format.cc", + "src/time_zone_if.cc", + "src/time_zone_if.h", + "src/time_zone_impl.cc", + "src/time_zone_impl.h", + "src/time_zone_info.cc", + "src/time_zone_info.h", + "src/time_zone_libc.cc", + "src/time_zone_libc.h", + "src/time_zone_lookup.cc", + "src/time_zone_posix.cc", + "src/time_zone_posix.h", + "src/tzfile.h", + "src/zone_info_source.cc", + ], + hdrs = [ + "include/cctz/time_zone.h", + "include/cctz/zone_info_source.h", + ], + visibility = ["//visibility:public"], + deps = [":civil_time"], +) + +### tests + +cc_test( + name = "civil_time_test", + size = "small", + srcs = ["src/civil_time_test.cc"], + deps = [ + ":civil_time", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "time_zone_format_test", + size = "small", + srcs = ["src/time_zone_format_test.cc"], + deps = [ + ":civil_time", + ":time_zone", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "time_zone_lookup_test", + size = "small", + srcs = ["src/time_zone_lookup_test.cc"], + deps = [ + ":civil_time", + ":time_zone", + "@com_google_googletest//:gtest_main", + ], +) + +### benchmarks + +### examples + +### binaries diff --git a/absl/time/internal/cctz/include/cctz/civil_time.h b/absl/time/internal/cctz/include/cctz/civil_time.h new file mode 100644 index 000000000..898222b4c --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/civil_time.h @@ -0,0 +1,329 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ +#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ + +#include "absl/time/internal/cctz/include/cctz/civil_time_detail.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// The term "civil time" refers to the legally recognized human-scale time +// that is represented by the six fields YYYY-MM-DD hh:mm:ss. Modern-day civil +// time follows the Gregorian Calendar and is a time-zone-independent concept. +// A "date" is perhaps the most common example of a civil time (represented in +// this library as cctz::civil_day). This library provides six classes and a +// handful of functions that help with rounding, iterating, and arithmetic on +// civil times while avoiding complications like daylight-saving time (DST). +// +// The following six classes form the core of this civil-time library: +// +// * civil_second +// * civil_minute +// * civil_hour +// * civil_day +// * civil_month +// * civil_year +// +// Each class is a simple value type with the same interface for construction +// and the same six accessors for each of the civil fields (year, month, day, +// hour, minute, and second, aka YMDHMS). These classes differ only in their +// alignment, which is indicated by the type name and specifies the field on +// which arithmetic operates. +// +// Each class can be constructed by passing up to six optional integer +// arguments representing the YMDHMS fields (in that order) to the +// constructor. Omitted fields are assigned their minimum valid value. Hours, +// minutes, and seconds will be set to 0, month and day will be set to 1, and +// since there is no minimum valid year, it will be set to 1970. So, a +// default-constructed civil-time object will have YMDHMS fields representing +// "1970-01-01 00:00:00". Fields that are out-of-range are normalized (e.g., +// October 32 -> November 1) so that all civil-time objects represent valid +// values. +// +// Each civil-time class is aligned to the civil-time field indicated in the +// class's name after normalization. Alignment is performed by setting all the +// inferior fields to their minimum valid value (as described above). The +// following are examples of how each of the six types would align the fields +// representing November 22, 2015 at 12:34:56 in the afternoon. (Note: the +// std::string format used here is not important; it's just a shorthand way of +// showing the six YMDHMS fields.) +// +// civil_second 2015-11-22 12:34:56 +// civil_minute 2015-11-22 12:34:00 +// civil_hour 2015-11-22 12:00:00 +// civil_day 2015-11-22 00:00:00 +// civil_month 2015-11-01 00:00:00 +// civil_year 2015-01-01 00:00:00 +// +// Each civil-time type performs arithmetic on the field to which it is +// aligned. This means that adding 1 to a civil_day increments the day field +// (normalizing as necessary), and subtracting 7 from a civil_month operates +// on the month field (normalizing as necessary). All arithmetic produces a +// valid civil time. Difference requires two similarly aligned civil-time +// objects and returns the scalar answer in units of the objects' alignment. +// For example, the difference between two civil_hour objects will give an +// answer in units of civil hours. +// +// In addition to the six civil-time types just described, there are +// a handful of helper functions and algorithms for performing common +// calculations. These are described below. +// +// Note: In C++14 and later, this library is usable in a constexpr context. +// +// CONSTRUCTION: +// +// Each of the civil-time types can be constructed in two ways: by directly +// passing to the constructor up to six (optional) integers representing the +// YMDHMS fields, or by copying the YMDHMS fields from a differently aligned +// civil-time type. +// +// civil_day default_value; // 1970-01-01 00:00:00 +// +// civil_day a(2015, 2, 3); // 2015-02-03 00:00:00 +// civil_day b(2015, 2, 3, 4, 5, 6); // 2015-02-03 00:00:00 +// civil_day c(2015); // 2015-01-01 00:00:00 +// +// civil_second ss(2015, 2, 3, 4, 5, 6); // 2015-02-03 04:05:06 +// civil_minute mm(ss); // 2015-02-03 04:05:00 +// civil_hour hh(mm); // 2015-02-03 04:00:00 +// civil_day d(hh); // 2015-02-03 00:00:00 +// civil_month m(d); // 2015-02-01 00:00:00 +// civil_year y(m); // 2015-01-01 00:00:00 +// +// m = civil_month(y); // 2015-01-01 00:00:00 +// d = civil_day(m); // 2015-01-01 00:00:00 +// hh = civil_hour(d); // 2015-01-01 00:00:00 +// mm = civil_minute(hh); // 2015-01-01 00:00:00 +// ss = civil_second(mm); // 2015-01-01 00:00:00 +// +// ALIGNMENT CONVERSION: +// +// The alignment of a civil-time object cannot change, but the object may be +// used to construct a new object with a different alignment. This is referred +// to as "realigning". When realigning to a type with the same or more +// precision (e.g., civil_day -> civil_second), the conversion may be +// performed implicitly since no information is lost. However, if information +// could be discarded (e.g., civil_second -> civil_day), the conversion must +// be explicit at the call site. +// +// void fun(const civil_day& day); +// +// civil_second cs; +// fun(cs); // Won't compile because data may be discarded +// fun(civil_day(cs)); // OK: explicit conversion +// +// civil_day cd; +// fun(cd); // OK: no conversion needed +// +// civil_month cm; +// fun(cm); // OK: implicit conversion to civil_day +// +// NORMALIZATION: +// +// Integer arguments passed to the constructor may be out-of-range, in which +// case they are normalized to produce a valid civil-time object. This enables +// natural arithmetic on constructor arguments without worrying about the +// field's range. Normalization guarantees that there are no invalid +// civil-time objects. +// +// civil_day d(2016, 10, 32); // Out-of-range day; normalized to 2016-11-01 +// +// Note: If normalization is undesired, you can signal an error by comparing +// the constructor arguments to the normalized values returned by the YMDHMS +// properties. +// +// PROPERTIES: +// +// All civil-time types have accessors for all six of the civil-time fields: +// year, month, day, hour, minute, and second. Recall that fields inferior to +// the type's aligment will be set to their minimum valid value. +// +// civil_day d(2015, 6, 28); +// // d.year() == 2015 +// // d.month() == 6 +// // d.day() == 28 +// // d.hour() == 0 +// // d.minute() == 0 +// // d.second() == 0 +// +// COMPARISON: +// +// Comparison always considers all six YMDHMS fields, regardless of the type's +// alignment. Comparison between differently aligned civil-time types is +// allowed. +// +// civil_day feb_3(2015, 2, 3); // 2015-02-03 00:00:00 +// civil_day mar_4(2015, 3, 4); // 2015-03-04 00:00:00 +// // feb_3 < mar_4 +// // civil_year(feb_3) == civil_year(mar_4) +// +// civil_second feb_3_noon(2015, 2, 3, 12, 0, 0); // 2015-02-03 12:00:00 +// // feb_3 < feb_3_noon +// // feb_3 == civil_day(feb_3_noon) +// +// // Iterates all the days of February 2015. +// for (civil_day d(2015, 2, 1); d < civil_month(2015, 3); ++d) { +// // ... +// } +// +// STREAMING: +// +// Each civil-time type may be sent to an output stream using operator<<(). +// The output format follows the pattern "YYYY-MM-DDThh:mm:ss" where fields +// inferior to the type's alignment are omitted. +// +// civil_second cs(2015, 2, 3, 4, 5, 6); +// std::cout << cs << "\n"; // Outputs: 2015-02-03T04:05:06 +// +// civil_day cd(cs); +// std::cout << cd << "\n"; // Outputs: 2015-02-03 +// +// civil_year cy(cs); +// std::cout << cy << "\n"; // Outputs: 2015 +// +// ARITHMETIC: +// +// Civil-time types support natural arithmetic operators such as addition, +// subtraction, and difference. Arithmetic operates on the civil-time field +// indicated in the type's name. Difference requires arguments with the same +// alignment and returns the answer in units of the alignment. +// +// civil_day a(2015, 2, 3); +// ++a; // 2015-02-04 00:00:00 +// --a; // 2015-02-03 00:00:00 +// civil_day b = a + 1; // 2015-02-04 00:00:00 +// civil_day c = 1 + b; // 2015-02-05 00:00:00 +// int n = c - a; // n = 2 (civil days) +// int m = c - civil_month(c); // Won't compile: different types. +// +// EXAMPLE: Adding a month to January 31. +// +// One of the classic questions that arises when considering a civil-time +// library (or a date library or a date/time library) is this: "What happens +// when you add a month to January 31?" This is an interesting question +// because there could be a number of possible answers: +// +// 1. March 3 (or 2 if a leap year). This may make sense if the operation +// wants the equivalent of February 31. +// 2. February 28 (or 29 if a leap year). This may make sense if the operation +// wants the last day of January to go to the last day of February. +// 3. Error. The caller may get some error, an exception, an invalid date +// object, or maybe false is returned. This may make sense because there is +// no single unambiguously correct answer to the question. +// +// Practically speaking, any answer that is not what the programmer intended +// is the wrong answer. +// +// This civil-time library avoids the problem by making it impossible to ask +// ambiguous questions. All civil-time objects are aligned to a particular +// civil-field boundary (such as aligned to a year, month, day, hour, minute, +// or second), and arithmetic operates on the field to which the object is +// aligned. This means that in order to "add a month" the object must first be +// aligned to a month boundary, which is equivalent to the first day of that +// month. +// +// Of course, there are ways to compute an answer the question at hand using +// this civil-time library, but they require the programmer to be explicit +// about the answer they expect. To illustrate, let's see how to compute all +// three of the above possible answers to the question of "Jan 31 plus 1 +// month": +// +// const civil_day d(2015, 1, 31); +// +// // Answer 1: +// // Add 1 to the month field in the constructor, and rely on normalization. +// const auto ans_normalized = civil_day(d.year(), d.month() + 1, d.day()); +// // ans_normalized == 2015-03-03 (aka Feb 31) +// +// // Answer 2: +// // Add 1 to month field, capping to the end of next month. +// const auto next_month = civil_month(d) + 1; +// const auto last_day_of_next_month = civil_day(next_month + 1) - 1; +// const auto ans_capped = std::min(ans_normalized, last_day_of_next_month); +// // ans_capped == 2015-02-28 +// +// // Answer 3: +// // Signal an error if the normalized answer is not in next month. +// if (civil_month(ans_normalized) != next_month) { +// // error, month overflow +// } +// +using civil_year = detail::civil_year; +using civil_month = detail::civil_month; +using civil_day = detail::civil_day; +using civil_hour = detail::civil_hour; +using civil_minute = detail::civil_minute; +using civil_second = detail::civil_second; + +// An enum class with members monday, tuesday, wednesday, thursday, friday, +// saturday, and sunday. These enum values may be sent to an output stream +// using operator<<(). The result is the full weekday name in English with a +// leading capital letter. +// +// weekday wd = weekday::thursday; +// std::cout << wd << "\n"; // Outputs: Thursday +// +using detail::weekday; + +// Returns the weekday for the given civil_day. +// +// civil_day a(2015, 8, 13); +// weekday wd = get_weekday(a); // wd == weekday::thursday +// +using detail::get_weekday; + +// Returns the civil_day that strictly follows or precedes the given +// civil_day, and that falls on the given weekday. +// +// For example, given: +// +// August 2015 +// Su Mo Tu We Th Fr Sa +// 1 +// 2 3 4 5 6 7 8 +// 9 10 11 12 13 14 15 +// 16 17 18 19 20 21 22 +// 23 24 25 26 27 28 29 +// 30 31 +// +// civil_day a(2015, 8, 13); // get_weekday(a) == weekday::thursday +// civil_day b = next_weekday(a, weekday::thursday); // b = 2015-08-20 +// civil_day c = prev_weekday(a, weekday::thursday); // c = 2015-08-06 +// +// civil_day d = ... +// // Gets the following Thursday if d is not already Thursday +// civil_day thurs1 = prev_weekday(d, weekday::thursday) + 7; +// // Gets the previous Thursday if d is not already Thursday +// civil_day thurs2 = next_weekday(d, weekday::thursday) - 7; +// +using detail::next_weekday; +using detail::prev_weekday; + +// Returns the day-of-year for the given civil_day. +// +// civil_day a(2015, 1, 1); +// int yd_jan_1 = get_yearday(a); // yd_jan_1 = 1 +// civil_day b(2015, 12, 31); +// int yd_dec_31 = get_yearday(b); // yd_dec_31 = 365 +// +using detail::get_yearday; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ diff --git a/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/absl/time/internal/cctz/include/cctz/civil_time_detail.h new file mode 100644 index 000000000..4c39c7d12 --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/civil_time_detail.h @@ -0,0 +1,564 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ +#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ + +#include +#include +#include +#include + +// Disable constexpr support unless we are using clang in C++14 mode. +#if __clang__ && __cpp_constexpr >= 201304 +#define CONSTEXPR_D constexpr // data +#define CONSTEXPR_F constexpr // function +#define CONSTEXPR_M constexpr // member +#else +#define CONSTEXPR_D const +#define CONSTEXPR_F inline +#define CONSTEXPR_M +#endif + +namespace absl { +namespace time_internal { +namespace cctz { + +// Support years that at least span the range of 64-bit time_t values. +using year_t = std::int_fast64_t; + +// Type alias that indicates an argument is not normalized (e.g., the +// constructor parameters and operands/results of addition/subtraction). +using diff_t = std::int_fast64_t; + +namespace detail { + +// Type aliases that indicate normalized argument values. +using month_t = std::int_fast8_t; // [1:12] +using day_t = std::int_fast8_t; // [1:31] +using hour_t = std::int_fast8_t; // [0:23] +using minute_t = std::int_fast8_t; // [0:59] +using second_t = std::int_fast8_t; // [0:59] + +// Normalized civil-time fields: Y-M-D HH:MM:SS. +struct fields { + CONSTEXPR_M fields(year_t year, month_t month, day_t day, + hour_t hour, minute_t minute, second_t second) + : y(year), m(month), d(day), hh(hour), mm(minute), ss(second) {} + std::int_least64_t y; + std::int_least8_t m; + std::int_least8_t d; + std::int_least8_t hh; + std::int_least8_t mm; + std::int_least8_t ss; +}; + +struct second_tag {}; +struct minute_tag : second_tag {}; +struct hour_tag : minute_tag {}; +struct day_tag : hour_tag {}; +struct month_tag : day_tag {}; +struct year_tag : month_tag {}; + +//////////////////////////////////////////////////////////////////////// + +// Field normalization (without avoidable overflow). + +namespace impl { + +CONSTEXPR_F bool is_leap_year(year_t y) noexcept { + return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); +} +CONSTEXPR_F int year_index(year_t y, month_t m) noexcept { + return (static_cast((y + (m > 2)) % 400) + 400) % 400; +} +CONSTEXPR_F int days_per_century(year_t y, month_t m) noexcept { + const int yi = year_index(y, m); + return 36524 + (yi == 0 || yi > 300); +} +CONSTEXPR_F int days_per_4years(year_t y, month_t m) noexcept { + const int yi = year_index(y, m); + return 1460 + (yi == 0 || yi > 300 || (yi - 1) % 100 < 96); +} +CONSTEXPR_F int days_per_year(year_t y, month_t m) noexcept { + return is_leap_year(y + (m > 2)) ? 366 : 365; +} +CONSTEXPR_F int days_per_month(year_t y, month_t m) noexcept { + CONSTEXPR_D int k_days_per_month[1 + 12] = { + -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 // non leap year + }; + return k_days_per_month[m] + (m == 2 && is_leap_year(y)); +} + +CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, + hour_t hh, minute_t mm, second_t ss) noexcept { + y += (cd / 146097) * 400; + cd %= 146097; + if (cd < 0) { + y -= 400; + cd += 146097; + } + y += (d / 146097) * 400; + d = d % 146097 + cd; + if (d > 0) { + if (d > 146097) { + y += 400; + d -= 146097; + } + } else { + if (d > -365) { + // We often hit the previous year when stepping a civil time backwards, + // so special case it to avoid counting up by 100/4/1-year chunks. + y -= 1; + d += days_per_year(y, m); + } else { + y -= 400; + d += 146097; + } + } + if (d > 365) { + for (int n = days_per_century(y, m); d > n; n = days_per_century(y, m)) { + d -= n; + y += 100; + } + for (int n = days_per_4years(y, m); d > n; n = days_per_4years(y, m)) { + d -= n; + y += 4; + } + for (int n = days_per_year(y, m); d > n; n = days_per_year(y, m)) { + d -= n; + ++y; + } + } + if (d > 28) { + for (int n = days_per_month(y, m); d > n; n = days_per_month(y, m)) { + d -= n; + if (++m > 12) { + ++y; + m = 1; + } + } + } + return fields(y, m, static_cast(d), hh, mm, ss); +} +CONSTEXPR_F fields n_mon(year_t y, diff_t m, diff_t d, diff_t cd, + hour_t hh, minute_t mm, second_t ss) noexcept { + if (m != 12) { + y += m / 12; + m %= 12; + if (m <= 0) { + y -= 1; + m += 12; + } + } + return n_day(y, static_cast(m), d, cd, hh, mm, ss); +} +CONSTEXPR_F fields n_hour(year_t y, diff_t m, diff_t d, diff_t cd, + diff_t hh, minute_t mm, second_t ss) noexcept { + cd += hh / 24; + hh %= 24; + if (hh < 0) { + cd -= 1; + hh += 24; + } + return n_mon(y, m, d, cd, static_cast(hh), mm, ss); +} +CONSTEXPR_F fields n_min(year_t y, diff_t m, diff_t d, diff_t hh, diff_t ch, + diff_t mm, second_t ss) noexcept { + ch += mm / 60; + mm %= 60; + if (mm < 0) { + ch -= 1; + mm += 60; + } + return n_hour(y, m, d, hh / 24 + ch / 24, hh % 24 + ch % 24, + static_cast(mm), ss); +} +CONSTEXPR_F fields n_sec(year_t y, diff_t m, diff_t d, diff_t hh, diff_t mm, + diff_t ss) noexcept { + // Optimization for when (non-constexpr) fields are already normalized. + if (0 <= ss && ss < 60) { + const second_t nss = static_cast(ss); + if (0 <= mm && mm < 60) { + const minute_t nmm = static_cast(mm); + if (0 <= hh && hh < 24) { + const hour_t nhh = static_cast(hh); + if (1 <= d && d <= 28 && 1 <= m && m <= 12) { + const day_t nd = static_cast(d); + const month_t nm = static_cast(m); + return fields(y, nm, nd, nhh, nmm, nss); + } + return n_mon(y, m, d, 0, nhh, nmm, nss); + } + return n_hour(y, m, d, hh / 24, hh % 24, nmm, nss); + } + return n_min(y, m, d, hh, mm / 60, mm % 60, nss); + } + diff_t cm = ss / 60; + ss %= 60; + if (ss < 0) { + cm -= 1; + ss += 60; + } + return n_min(y, m, d, hh, mm / 60 + cm / 60, mm % 60 + cm % 60, + static_cast(ss)); +} + +} // namespace impl + +//////////////////////////////////////////////////////////////////////// + +// Increments the indicated (normalized) field by "n". +CONSTEXPR_F fields step(second_tag, fields f, diff_t n) noexcept { + return impl::n_sec(f.y, f.m, f.d, f.hh, f.mm + n / 60, f.ss + n % 60); +} +CONSTEXPR_F fields step(minute_tag, fields f, diff_t n) noexcept { + return impl::n_min(f.y, f.m, f.d, f.hh + n / 60, 0, f.mm + n % 60, f.ss); +} +CONSTEXPR_F fields step(hour_tag, fields f, diff_t n) noexcept { + return impl::n_hour(f.y, f.m, f.d + n / 24, 0, f.hh + n % 24, f.mm, f.ss); +} +CONSTEXPR_F fields step(day_tag, fields f, diff_t n) noexcept { + return impl::n_day(f.y, f.m, f.d, n, f.hh, f.mm, f.ss); +} +CONSTEXPR_F fields step(month_tag, fields f, diff_t n) noexcept { + return impl::n_mon(f.y + n / 12, f.m + n % 12, f.d, 0, f.hh, f.mm, f.ss); +} +CONSTEXPR_F fields step(year_tag, fields f, diff_t n) noexcept { + return fields(f.y + n, f.m, f.d, f.hh, f.mm, f.ss); +} + +//////////////////////////////////////////////////////////////////////// + +namespace impl { + +// Returns (v * f + a) but avoiding intermediate overflow when possible. +CONSTEXPR_F diff_t scale_add(diff_t v, diff_t f, diff_t a) noexcept { + return (v < 0) ? ((v + 1) * f + a) - f : ((v - 1) * f + a) + f; +} + +// Map a (normalized) Y/M/D to the number of days before/after 1970-01-01. +// Probably overflows for years outside [-292277022656:292277026595]. +CONSTEXPR_F diff_t ymd_ord(year_t y, month_t m, day_t d) noexcept { + const diff_t eyear = (m <= 2) ? y - 1 : y; + const diff_t era = (eyear >= 0 ? eyear : eyear - 399) / 400; + const diff_t yoe = eyear - era * 400; + const diff_t doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; + const diff_t doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; + return era * 146097 + doe - 719468; +} + +// Returns the difference in days between two normalized Y-M-D tuples. +// ymd_ord() will encounter integer overflow given extreme year values, +// yet the difference between two such extreme values may actually be +// small, so we take a little care to avoid overflow when possible by +// exploiting the 146097-day cycle. +CONSTEXPR_F diff_t day_difference(year_t y1, month_t m1, day_t d1, + year_t y2, month_t m2, day_t d2) noexcept { + const diff_t a_c4_off = y1 % 400; + const diff_t b_c4_off = y2 % 400; + diff_t c4_diff = (y1 - a_c4_off) - (y2 - b_c4_off); + diff_t delta = ymd_ord(a_c4_off, m1, d1) - ymd_ord(b_c4_off, m2, d2); + if (c4_diff > 0 && delta < 0) { + delta += 2 * 146097; + c4_diff -= 2 * 400; + } else if (c4_diff < 0 && delta > 0) { + delta -= 2 * 146097; + c4_diff += 2 * 400; + } + return (c4_diff / 400 * 146097) + delta; +} + +} // namespace impl + +// Returns the difference between fields structs using the indicated unit. +CONSTEXPR_F diff_t difference(year_tag, fields f1, fields f2) noexcept { + return f1.y - f2.y; +} +CONSTEXPR_F diff_t difference(month_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(year_tag{}, f1, f2), 12, (f1.m - f2.m)); +} +CONSTEXPR_F diff_t difference(day_tag, fields f1, fields f2) noexcept { + return impl::day_difference(f1.y, f1.m, f1.d, f2.y, f2.m, f2.d); +} +CONSTEXPR_F diff_t difference(hour_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(day_tag{}, f1, f2), 24, (f1.hh - f2.hh)); +} +CONSTEXPR_F diff_t difference(minute_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(hour_tag{}, f1, f2), 60, (f1.mm - f2.mm)); +} +CONSTEXPR_F diff_t difference(second_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(minute_tag{}, f1, f2), 60, f1.ss - f2.ss); +} + +//////////////////////////////////////////////////////////////////////// + +// Aligns the (normalized) fields struct to the indicated field. +CONSTEXPR_F fields align(second_tag, fields f) noexcept { + return f; +} +CONSTEXPR_F fields align(minute_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, f.hh, f.mm, 0}; +} +CONSTEXPR_F fields align(hour_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, f.hh, 0, 0}; +} +CONSTEXPR_F fields align(day_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, 0, 0, 0}; +} +CONSTEXPR_F fields align(month_tag, fields f) noexcept { + return fields{f.y, f.m, 1, 0, 0, 0}; +} +CONSTEXPR_F fields align(year_tag, fields f) noexcept { + return fields{f.y, 1, 1, 0, 0, 0}; +} + +//////////////////////////////////////////////////////////////////////// + +template +class civil_time { + public: + explicit CONSTEXPR_M civil_time(year_t y, diff_t m = 1, diff_t d = 1, + diff_t hh = 0, diff_t mm = 0, + diff_t ss = 0) noexcept + : civil_time(impl::n_sec(y, m, d, hh, mm, ss)) {} + + CONSTEXPR_M civil_time() noexcept : f_{1970, 1, 1, 0, 0, 0} {} + civil_time(const civil_time&) = default; + civil_time& operator=(const civil_time&) = default; + + // Conversion between civil times of different alignment. Conversion to + // a more precise alignment is allowed implicitly (e.g., day -> hour), + // but conversion where information is discarded must be explicit + // (e.g., second -> minute). + template + using preserves_data = + typename std::enable_if::value>::type; + template + CONSTEXPR_M civil_time(const civil_time& ct, + preserves_data* = nullptr) noexcept + : civil_time(ct.f_) {} + template + explicit CONSTEXPR_M civil_time(const civil_time& ct, + preserves_data* = nullptr) noexcept + : civil_time(ct.f_) {} + + // Factories for the maximum/minimum representable civil_time. + static civil_time max() { + const auto max_year = std::numeric_limits::max(); + return civil_time(max_year, 12, 31, 23, 59, 59); + } + static civil_time min() { + const auto min_year = std::numeric_limits::min(); + return civil_time(min_year, 1, 1, 0, 0, 0); + } + + // Field accessors. Note: All but year() return an int. + CONSTEXPR_M year_t year() const noexcept { return f_.y; } + CONSTEXPR_M int month() const noexcept { return f_.m; } + CONSTEXPR_M int day() const noexcept { return f_.d; } + CONSTEXPR_M int hour() const noexcept { return f_.hh; } + CONSTEXPR_M int minute() const noexcept { return f_.mm; } + CONSTEXPR_M int second() const noexcept { return f_.ss; } + + // Assigning arithmetic. + CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept { + f_ = step(T{}, f_, n); + return *this; + } + CONSTEXPR_M civil_time& operator-=(diff_t n) noexcept { + if (n != std::numeric_limits::min()) { + f_ = step(T{}, f_, -n); + } else { + f_ = step(T{}, step(T{}, f_, -(n + 1)), 1); + } + return *this; + } + CONSTEXPR_M civil_time& operator++() noexcept { + return *this += 1; + } + CONSTEXPR_M civil_time operator++(int) noexcept { + const civil_time a = *this; + ++*this; + return a; + } + CONSTEXPR_M civil_time& operator--() noexcept { + return *this -= 1; + } + CONSTEXPR_M civil_time operator--(int) noexcept { + const civil_time a = *this; + --*this; + return a; + } + + // Binary arithmetic operators. + inline friend CONSTEXPR_M civil_time operator+(civil_time a, + diff_t n) noexcept { + return a += n; + } + inline friend CONSTEXPR_M civil_time operator+(diff_t n, + civil_time a) noexcept { + return a += n; + } + inline friend CONSTEXPR_M civil_time operator-(civil_time a, + diff_t n) noexcept { + return a -= n; + } + inline friend CONSTEXPR_M diff_t operator-(const civil_time& lhs, + const civil_time& rhs) noexcept { + return difference(T{}, lhs.f_, rhs.f_); + } + + private: + // All instantiations of this template are allowed to call the following + // private constructor and access the private fields member. + template + friend class civil_time; + + // The designated constructor that all others eventually call. + explicit CONSTEXPR_M civil_time(fields f) noexcept : f_(align(T{}, f)) {} + + fields f_; +}; + +// Disallows difference between differently aligned types. +// auto n = civil_day(...) - civil_hour(...); // would be confusing. +template +CONSTEXPR_F diff_t operator-(civil_time, civil_time) = delete; + +using civil_year = civil_time; +using civil_month = civil_time; +using civil_day = civil_time; +using civil_hour = civil_time; +using civil_minute = civil_time; +using civil_second = civil_time; + +//////////////////////////////////////////////////////////////////////// + +// Relational operators that work with differently aligned objects. +// Always compares all six fields. +template +CONSTEXPR_F bool operator<(const civil_time& lhs, + const civil_time& rhs) noexcept { + return (lhs.year() < rhs.year() || + (lhs.year() == rhs.year() && + (lhs.month() < rhs.month() || + (lhs.month() == rhs.month() && + (lhs.day() < rhs.day() || + (lhs.day() == rhs.day() && + (lhs.hour() < rhs.hour() || + (lhs.hour() == rhs.hour() && + (lhs.minute() < rhs.minute() || + (lhs.minute() == rhs.minute() && + (lhs.second() < rhs.second()))))))))))); +} +template +CONSTEXPR_F bool operator<=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(rhs < lhs); +} +template +CONSTEXPR_F bool operator>=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(lhs < rhs); +} +template +CONSTEXPR_F bool operator>(const civil_time& lhs, + const civil_time& rhs) noexcept { + return rhs < lhs; +} +template +CONSTEXPR_F bool operator==(const civil_time& lhs, + const civil_time& rhs) noexcept { + return lhs.year() == rhs.year() && lhs.month() == rhs.month() && + lhs.day() == rhs.day() && lhs.hour() == rhs.hour() && + lhs.minute() == rhs.minute() && lhs.second() == rhs.second(); +} +template +CONSTEXPR_F bool operator!=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(lhs == rhs); +} + +//////////////////////////////////////////////////////////////////////// + +enum class weekday { + monday, + tuesday, + wednesday, + thursday, + friday, + saturday, + sunday, +}; + +CONSTEXPR_F weekday get_weekday(const civil_day& cd) noexcept { + CONSTEXPR_D weekday k_weekday_by_sun_off[7] = { + weekday::sunday, weekday::monday, weekday::tuesday, + weekday::wednesday, weekday::thursday, weekday::friday, + weekday::saturday, + }; + CONSTEXPR_D int k_weekday_offsets[1 + 12] = { + -1, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4, + }; + year_t wd = cd.year() - (cd.month() < 3); + if (wd >= 0) { + wd += wd / 4 - wd / 100 + wd / 400; + } else { + wd += (wd - 3) / 4 - (wd - 99) / 100 + (wd - 399) / 400; + } + wd += k_weekday_offsets[cd.month()] + cd.day(); + return k_weekday_by_sun_off[(wd % 7 + 7) % 7]; +} + +//////////////////////////////////////////////////////////////////////// + +CONSTEXPR_F civil_day next_weekday(civil_day cd, weekday wd) noexcept { + do { cd += 1; } while (get_weekday(cd) != wd); + return cd; +} + +CONSTEXPR_F civil_day prev_weekday(civil_day cd, weekday wd) noexcept { + do { cd -= 1; } while (get_weekday(cd) != wd); + return cd; +} + +CONSTEXPR_F int get_yearday(const civil_day& cd) noexcept { + CONSTEXPR_D int k_month_offsets[1 + 12] = { + -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + }; + const int feb29 = (cd.month() > 2 && impl::is_leap_year(cd.year())); + return k_month_offsets[cd.month()] + feb29 + cd.day(); +} + +//////////////////////////////////////////////////////////////////////// + +std::ostream& operator<<(std::ostream& os, const civil_year& y); +std::ostream& operator<<(std::ostream& os, const civil_month& m); +std::ostream& operator<<(std::ostream& os, const civil_day& d); +std::ostream& operator<<(std::ostream& os, const civil_hour& h); +std::ostream& operator<<(std::ostream& os, const civil_minute& m); +std::ostream& operator<<(std::ostream& os, const civil_second& s); +std::ostream& operator<<(std::ostream& os, weekday wd); + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#undef CONSTEXPR_M +#undef CONSTEXPR_F +#undef CONSTEXPR_D + +#endif // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ diff --git a/absl/time/internal/cctz/include/cctz/time_zone.h b/absl/time/internal/cctz/include/cctz/time_zone.h new file mode 100644 index 000000000..31abc2c4b --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/time_zone.h @@ -0,0 +1,316 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// A library for translating between absolute times (represented by +// std::chrono::time_points of the std::chrono::system_clock) and civil +// times (represented by cctz::civil_second) using the rules defined by +// a time zone (cctz::time_zone). + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Convenience aliases. Not intended as public API points. +template +using time_point = std::chrono::time_point; +using sys_seconds = std::chrono::duration; + +namespace detail { +template +inline std::pair, D> +split_seconds(const time_point& tp) { + auto sec = std::chrono::time_point_cast(tp); + auto sub = tp - sec; + if (sub.count() < 0) { + sec -= sys_seconds(1); + sub += sys_seconds(1); + } + return {sec, std::chrono::duration_cast(sub)}; +} +inline std::pair, sys_seconds> +split_seconds(const time_point& tp) { + return {tp, sys_seconds(0)}; +} +} // namespace detail + +// cctz::time_zone is an opaque, small, value-type class representing a +// geo-political region within which particular rules are used for mapping +// between absolute and civil times. Time zones are named using the TZ +// identifiers from the IANA Time Zone Database, such as "America/Los_Angeles" +// or "Australia/Sydney". Time zones are created from factory functions such +// as load_time_zone(). Note: strings like "PST" and "EDT" are not valid TZ +// identifiers. +// +// Example: +// cctz::time_zone utc = cctz::utc_time_zone(); +// cctz::time_zone pst = cctz::fixed_time_zone(std::chrono::hours(-8)); +// cctz::time_zone loc = cctz::local_time_zone(); +// cctz::time_zone lax; +// if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } +// +// See also: +// - http://www.iana.org/time-zones +// - http://en.wikipedia.org/wiki/Zoneinfo +class time_zone { + public: + time_zone() : time_zone(nullptr) {} // Equivalent to UTC + time_zone(const time_zone&) = default; + time_zone& operator=(const time_zone&) = default; + + std::string name() const; + + // An absolute_lookup represents the civil time (cctz::civil_second) within + // this time_zone at the given absolute time (time_point). There are + // additionally a few other fields that may be useful when working with + // older APIs, such as std::tm. + // + // Example: + // const cctz::time_zone tz = ... + // const auto tp = std::chrono::system_clock::now(); + // const cctz::time_zone::absolute_lookup al = tz.lookup(tp); + struct absolute_lookup { + civil_second cs; + // Note: The following fields exist for backward compatibility with older + // APIs. Accessing these fields directly is a sign of imprudent logic in + // the calling code. Modern time-related code should only access this data + // indirectly by way of cctz::format(). + int offset; // civil seconds east of UTC + bool is_dst; // is offset non-standard? + const char* abbr; // time-zone abbreviation (e.g., "PST") + }; + absolute_lookup lookup(const time_point& tp) const; + template + absolute_lookup lookup(const time_point& tp) const { + return lookup(detail::split_seconds(tp).first); + } + + // A civil_lookup represents the absolute time(s) (time_point) that + // correspond to the given civil time (cctz::civil_second) within this + // time_zone. Usually the given civil time represents a unique instant + // in time, in which case the conversion is unambiguous. However, + // within this time zone, the given civil time may be skipped (e.g., + // during a positive UTC offset shift), or repeated (e.g., during a + // negative UTC offset shift). To account for these possibilities, + // civil_lookup is richer than just a single time_point. + // + // In all cases the civil_lookup::kind enum will indicate the nature + // of the given civil-time argument, and the pre, trans, and post + // members will give the absolute time answers using the pre-transition + // offset, the transition point itself, and the post-transition offset, + // respectively (all three times are equal if kind == UNIQUE). If any + // of these three absolute times is outside the representable range of a + // time_point the field is set to its maximum/minimum value. + // + // Example: + // cctz::time_zone lax; + // if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } + // + // // A unique civil time. + // auto jan01 = lax.lookup(cctz::civil_second(2011, 1, 1, 0, 0, 0)); + // // jan01.kind == cctz::time_zone::civil_lookup::UNIQUE + // // jan01.pre is 2011/01/01 00:00:00 -0800 + // // jan01.trans is 2011/01/01 00:00:00 -0800 + // // jan01.post is 2011/01/01 00:00:00 -0800 + // + // // A Spring DST transition, when there is a gap in civil time. + // auto mar13 = lax.lookup(cctz::civil_second(2011, 3, 13, 2, 15, 0)); + // // mar13.kind == cctz::time_zone::civil_lookup::SKIPPED + // // mar13.pre is 2011/03/13 03:15:00 -0700 + // // mar13.trans is 2011/03/13 03:00:00 -0700 + // // mar13.post is 2011/03/13 01:15:00 -0800 + // + // // A Fall DST transition, when civil times are repeated. + // auto nov06 = lax.lookup(cctz::civil_second(2011, 11, 6, 1, 15, 0)); + // // nov06.kind == cctz::time_zone::civil_lookup::REPEATED + // // nov06.pre is 2011/11/06 01:15:00 -0700 + // // nov06.trans is 2011/11/06 01:00:00 -0800 + // // nov06.post is 2011/11/06 01:15:00 -0800 + struct civil_lookup { + enum civil_kind { + UNIQUE, // the civil time was singular (pre == trans == post) + SKIPPED, // the civil time did not exist (pre >= trans > post) + REPEATED, // the civil time was ambiguous (pre < trans <= post) + } kind; + time_point pre; // uses the pre-transition offset + time_point trans; // instant of civil-offset change + time_point post; // uses the post-transition offset + }; + civil_lookup lookup(const civil_second& cs) const; + + class Impl; + + private: + explicit time_zone(const Impl* impl) : impl_(impl) {} + const Impl* impl_; +}; + +// Relational operators. +bool operator==(time_zone lhs, time_zone rhs); +inline bool operator!=(time_zone lhs, time_zone rhs) { return !(lhs == rhs); } + +// Loads the named time zone. May perform I/O on the initial load. +// If the name is invalid, or some other kind of error occurs, returns +// false and "*tz" is set to the UTC time zone. +bool load_time_zone(const std::string& name, time_zone* tz); + +// Returns a time_zone representing UTC. Cannot fail. +time_zone utc_time_zone(); + +// Returns a time zone that is a fixed offset (seconds east) from UTC. +// Note: If the absolute value of the offset is greater than 24 hours +// you'll get UTC (i.e., zero offset) instead. +time_zone fixed_time_zone(const sys_seconds& offset); + +// Returns a time zone representing the local time zone. Falls back to UTC. +time_zone local_time_zone(); + +// Returns the civil time (cctz::civil_second) within the given time zone at +// the given absolute time (time_point). Since the additional fields provided +// by the time_zone::absolute_lookup struct should rarely be needed in modern +// code, this convert() function is simpler and should be preferred. +template +inline civil_second convert(const time_point& tp, const time_zone& tz) { + return tz.lookup(tp).cs; +} + +// Returns the absolute time (time_point) that corresponds to the given civil +// time within the given time zone. If the civil time is not unique (i.e., if +// it was either repeated or non-existent), then the returned time_point is +// the best estimate that preserves relative order. That is, this function +// guarantees that if cs1 < cs2, then convert(cs1, tz) <= convert(cs2, tz). +inline time_point convert(const civil_second& cs, + const time_zone& tz) { + const time_zone::civil_lookup cl = tz.lookup(cs); + if (cl.kind == time_zone::civil_lookup::SKIPPED) return cl.trans; + return cl.pre; +} + +namespace detail { +using femtoseconds = std::chrono::duration; +std::string format(const std::string&, const time_point&, + const femtoseconds&, const time_zone&); +bool parse(const std::string&, const std::string&, const time_zone&, + time_point*, femtoseconds*, std::string* err = nullptr); +} // namespace detail + +// Formats the given time_point in the given cctz::time_zone according to +// the provided format std::string. Uses strftime()-like formatting options, +// with the following extensions: +// +// - %Ez - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm) +// - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss) +// - %E#S - Seconds with # digits of fractional precision +// - %E*S - Seconds with full fractional precision (a literal '*') +// - %E#f - Fractional seconds with # digits of precision +// - %E*f - Fractional seconds with full precision (a literal '*') +// - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999) +// +// Note that %E0S behaves like %S, and %E0f produces no characters. In +// contrast %E*f always produces at least one digit, which may be '0'. +// +// Note that %Y produces as many characters as it takes to fully render the +// year. A year outside of [-999:9999] when formatted with %E4Y will produce +// more than four characters, just like %Y. +// +// Tip: Format strings should include the UTC offset (e.g., %z, %Ez, or %E*z) +// so that the resulting std::string uniquely identifies an absolute time. +// +// Example: +// cctz::time_zone lax; +// if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } +// auto tp = cctz::convert(cctz::civil_second(2013, 1, 2, 3, 4, 5), lax); +// std::string f = cctz::format("%H:%M:%S", tp, lax); // "03:04:05" +// f = cctz::format("%H:%M:%E3S", tp, lax); // "03:04:05.000" +template +inline std::string format(const std::string& fmt, const time_point& tp, + const time_zone& tz) { + const auto p = detail::split_seconds(tp); + const auto n = std::chrono::duration_cast(p.second); + return detail::format(fmt, p.first, n, tz); +} + +// Parses an input std::string according to the provided format std::string and +// returns the corresponding time_point. Uses strftime()-like formatting +// options, with the same extensions as cctz::format(), but with the +// exceptions that %E#S is interpreted as %E*S, and %E#f as %E*f. %Ez +// and %E*z also accept the same inputs. +// +// %Y consumes as many numeric characters as it can, so the matching data +// should always be terminated with a non-numeric. %E4Y always consumes +// exactly four characters, including any sign. +// +// Unspecified fields are taken from the default date and time of ... +// +// "1970-01-01 00:00:00.0 +0000" +// +// For example, parsing a std::string of "15:45" (%H:%M) will return a time_point +// that represents "1970-01-01 15:45:00.0 +0000". +// +// Note that parse() returns time instants, so it makes most sense to parse +// fully-specified date/time strings that include a UTC offset (%z, %Ez, or +// %E*z). +// +// Note also that parse() only heeds the fields year, month, day, hour, +// minute, (fractional) second, and UTC offset. Other fields, like weekday (%a +// or %A), while parsed for syntactic validity, are ignored in the conversion. +// +// Date and time fields that are out-of-range will be treated as errors rather +// than normalizing them like cctz::civil_second() would do. For example, it +// is an error to parse the date "Oct 32, 2013" because 32 is out of range. +// +// A second of ":60" is normalized to ":00" of the following minute with +// fractional seconds discarded. The following table shows how the given +// seconds and subseconds will be parsed: +// +// "59.x" -> 59.x // exact +// "60.x" -> 00.0 // normalized +// "00.x" -> 00.x // exact +// +// Errors are indicated by returning false. +// +// Example: +// const cctz::time_zone tz = ... +// std::chrono::system_clock::time_point tp; +// if (cctz::parse("%Y-%m-%d", "2015-10-09", tz, &tp)) { +// ... +// } +template +inline bool parse(const std::string& fmt, const std::string& input, + const time_zone& tz, time_point* tpp) { + time_point sec; + detail::femtoseconds fs; + const bool b = detail::parse(fmt, input, tz, &sec, &fs); + if (b) { + // TODO: Return false if unrepresentable as a time_point. + *tpp = std::chrono::time_point_cast(sec); + *tpp += std::chrono::duration_cast(fs); + } + return b; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ diff --git a/absl/time/internal/cctz/include/cctz/zone_info_source.h b/absl/time/internal/cctz/include/cctz/zone_info_source.h new file mode 100644 index 000000000..4d9d8f875 --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/zone_info_source.h @@ -0,0 +1,91 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ +#define ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ + +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +// A stdio-like interface for providing zoneinfo data for a particular zone. +class ZoneInfoSource { + public: + virtual ~ZoneInfoSource(); + + virtual std::size_t Read(void* ptr, std::size_t size) = 0; // like fread() + virtual int Skip(std::size_t offset) = 0; // like fseek() +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +namespace absl { +namespace time_internal { +namespace cctz_extension { + +// A function-pointer type for a factory that returns a ZoneInfoSource +// given the name of a time zone and a fallback factory. Returns null +// when the data for the named zone cannot be found. +using ZoneInfoSourceFactory = + std::unique_ptr (*)( + const std::string&, + const std::function( + const std::string&)>&); + +// The user can control the mapping of zone names to zoneinfo data by +// providing a definition for cctz_extension::zone_info_source_factory. +// For example, given functions my_factory() and my_other_factory() that +// can return a ZoneInfoSource for a named zone, we could inject them into +// cctz::load_time_zone() with: +// +// namespace cctz_extension { +// namespace { +// std::unique_ptr CustomFactory( +// const std::string& name, +// const std::function( +// const std::string& name)>& fallback_factory) { +// if (auto zip = my_factory(name)) return zip; +// if (auto zip = fallback_factory(name)) return zip; +// if (auto zip = my_other_factory(name)) return zip; +// return nullptr; +// } +// } // namespace +// ZoneInfoSourceFactory zone_info_source_factory = CustomFactory; +// } // namespace cctz_extension +// +// This might be used, say, to use zoneinfo data embedded in the program, +// or read from a (possibly compressed) file archive, or both. +// +// cctz_extension::zone_info_source_factory() will be called: +// (1) from the same thread as the cctz::load_time_zone() call, +// (2) only once for any zone name, and +// (3) serially (i.e., no concurrent execution). +// +// The fallback factory obtains zoneinfo data by reading files in ${TZDIR}, +// and it is used automatically when no zone_info_source_factory definition +// is linked into the program. +extern ZoneInfoSourceFactory zone_info_source_factory; + +} // namespace cctz_extension +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ diff --git a/absl/time/internal/cctz/src/civil_time_detail.cc b/absl/time/internal/cctz/src/civil_time_detail.cc new file mode 100644 index 000000000..780d5c96e --- /dev/null +++ b/absl/time/internal/cctz/src/civil_time_detail.cc @@ -0,0 +1,90 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/civil_time_detail.h" + +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { +namespace detail { + +// Output stream operators output a format matching YYYY-MM-DDThh:mm:ss, +// while omitting fields inferior to the type's alignment. For example, +// civil_day is formatted only as YYYY-MM-DD. +std::ostream& operator<<(std::ostream& os, const civil_year& y) { + std::stringstream ss; + ss << y.year(); // No padding. + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_month& m) { + std::stringstream ss; + ss << civil_year(m) << '-'; + ss << std::setfill('0') << std::setw(2) << m.month(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_day& d) { + std::stringstream ss; + ss << civil_month(d) << '-'; + ss << std::setfill('0') << std::setw(2) << d.day(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_hour& h) { + std::stringstream ss; + ss << civil_day(h) << 'T'; + ss << std::setfill('0') << std::setw(2) << h.hour(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_minute& m) { + std::stringstream ss; + ss << civil_hour(m) << ':'; + ss << std::setfill('0') << std::setw(2) << m.minute(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_second& s) { + std::stringstream ss; + ss << civil_minute(s) << ':'; + ss << std::setfill('0') << std::setw(2) << s.second(); + return os << ss.str(); +} + +//////////////////////////////////////////////////////////////////////// + +std::ostream& operator<<(std::ostream& os, weekday wd) { + switch (wd) { + case weekday::monday: + return os << "Monday"; + case weekday::tuesday: + return os << "Tuesday"; + case weekday::wednesday: + return os << "Wednesday"; + case weekday::thursday: + return os << "Thursday"; + case weekday::friday: + return os << "Friday"; + case weekday::saturday: + return os << "Saturday"; + case weekday::sunday: + return os << "Sunday"; + } + return os; // Should never get here, but -Wreturn-type may warn without this. +} + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/civil_time_test.cc b/absl/time/internal/cctz/src/civil_time_test.cc new file mode 100644 index 000000000..6df0395ba --- /dev/null +++ b/absl/time/internal/cctz/src/civil_time_test.cc @@ -0,0 +1,1049 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" + +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +template +std::string Format(const T& t) { + std::stringstream ss; + ss << t; + return ss.str(); +} + +} // namespace + +#if __clang__ && __cpp_constexpr >= 201304 +// Construction constexpr tests + +TEST(CivilTime, Normal) { + constexpr civil_second css(2016, 1, 28, 17, 14, 12); + static_assert(css.second() == 12, "Normal.second"); + constexpr civil_minute cmm(2016, 1, 28, 17, 14); + static_assert(cmm.minute() == 14, "Normal.minute"); + constexpr civil_hour chh(2016, 1, 28, 17); + static_assert(chh.hour() == 17, "Normal.hour"); + constexpr civil_day cd(2016, 1, 28); + static_assert(cd.day() == 28, "Normal.day"); + constexpr civil_month cm(2016, 1); + static_assert(cm.month() == 1, "Normal.month"); + constexpr civil_year cy(2016); + static_assert(cy.year() == 2016, "Normal.year"); +} + +TEST(CivilTime, Conversion) { + constexpr civil_year cy(2016); + static_assert(cy.year() == 2016, "Conversion.year"); + constexpr civil_month cm(cy); + static_assert(cm.month() == 1, "Conversion.month"); + constexpr civil_day cd(cm); + static_assert(cd.day() == 1, "Conversion.day"); + constexpr civil_hour chh(cd); + static_assert(chh.hour() == 0, "Conversion.hour"); + constexpr civil_minute cmm(chh); + static_assert(cmm.minute() == 0, "Conversion.minute"); + constexpr civil_second css(cmm); + static_assert(css.second() == 0, "Conversion.second"); +} + +// Normalization constexpr tests + +TEST(CivilTime, Normalized) { + constexpr civil_second cs(2016, 1, 28, 17, 14, 12); + static_assert(cs.year() == 2016, "Normalized.year"); + static_assert(cs.month() == 1, "Normalized.month"); + static_assert(cs.day() == 28, "Normalized.day"); + static_assert(cs.hour() == 17, "Normalized.hour"); + static_assert(cs.minute() == 14, "Normalized.minute"); + static_assert(cs.second() == 12, "Normalized.second"); +} + +TEST(CivilTime, SecondOverflow) { + constexpr civil_second cs(2016, 1, 28, 17, 14, 121); + static_assert(cs.year() == 2016, "SecondOverflow.year"); + static_assert(cs.month() == 1, "SecondOverflow.month"); + static_assert(cs.day() == 28, "SecondOverflow.day"); + static_assert(cs.hour() == 17, "SecondOverflow.hour"); + static_assert(cs.minute() == 16, "SecondOverflow.minute"); + static_assert(cs.second() == 1, "SecondOverflow.second"); +} + +TEST(CivilTime, SecondUnderflow) { + constexpr civil_second cs(2016, 1, 28, 17, 14, -121); + static_assert(cs.year() == 2016, "SecondUnderflow.year"); + static_assert(cs.month() == 1, "SecondUnderflow.month"); + static_assert(cs.day() == 28, "SecondUnderflow.day"); + static_assert(cs.hour() == 17, "SecondUnderflow.hour"); + static_assert(cs.minute() == 11, "SecondUnderflow.minute"); + static_assert(cs.second() == 59, "SecondUnderflow.second"); +} + +TEST(CivilTime, MinuteOverflow) { + constexpr civil_second cs(2016, 1, 28, 17, 121, 12); + static_assert(cs.year() == 2016, "MinuteOverflow.year"); + static_assert(cs.month() == 1, "MinuteOverflow.month"); + static_assert(cs.day() == 28, "MinuteOverflow.day"); + static_assert(cs.hour() == 19, "MinuteOverflow.hour"); + static_assert(cs.minute() == 1, "MinuteOverflow.minute"); + static_assert(cs.second() == 12, "MinuteOverflow.second"); +} + +TEST(CivilTime, MinuteUnderflow) { + constexpr civil_second cs(2016, 1, 28, 17, -121, 12); + static_assert(cs.year() == 2016, "MinuteUnderflow.year"); + static_assert(cs.month() == 1, "MinuteUnderflow.month"); + static_assert(cs.day() == 28, "MinuteUnderflow.day"); + static_assert(cs.hour() == 14, "MinuteUnderflow.hour"); + static_assert(cs.minute() == 59, "MinuteUnderflow.minute"); + static_assert(cs.second() == 12, "MinuteUnderflow.second"); +} + +TEST(CivilTime, HourOverflow) { + constexpr civil_second cs(2016, 1, 28, 49, 14, 12); + static_assert(cs.year() == 2016, "HourOverflow.year"); + static_assert(cs.month() == 1, "HourOverflow.month"); + static_assert(cs.day() == 30, "HourOverflow.day"); + static_assert(cs.hour() == 1, "HourOverflow.hour"); + static_assert(cs.minute() == 14, "HourOverflow.minute"); + static_assert(cs.second() == 12, "HourOverflow.second"); +} + +TEST(CivilTime, HourUnderflow) { + constexpr civil_second cs(2016, 1, 28, -49, 14, 12); + static_assert(cs.year() == 2016, "HourUnderflow.year"); + static_assert(cs.month() == 1, "HourUnderflow.month"); + static_assert(cs.day() == 25, "HourUnderflow.day"); + static_assert(cs.hour() == 23, "HourUnderflow.hour"); + static_assert(cs.minute() == 14, "HourUnderflow.minute"); + static_assert(cs.second() == 12, "HourUnderflow.second"); +} + +TEST(CivilTime, MonthOverflow) { + constexpr civil_second cs(2016, 25, 28, 17, 14, 12); + static_assert(cs.year() == 2018, "MonthOverflow.year"); + static_assert(cs.month() == 1, "MonthOverflow.month"); + static_assert(cs.day() == 28, "MonthOverflow.day"); + static_assert(cs.hour() == 17, "MonthOverflow.hour"); + static_assert(cs.minute() == 14, "MonthOverflow.minute"); + static_assert(cs.second() == 12, "MonthOverflow.second"); +} + +TEST(CivilTime, MonthUnderflow) { + constexpr civil_second cs(2016, -25, 28, 17, 14, 12); + static_assert(cs.year() == 2013, "MonthUnderflow.year"); + static_assert(cs.month() == 11, "MonthUnderflow.month"); + static_assert(cs.day() == 28, "MonthUnderflow.day"); + static_assert(cs.hour() == 17, "MonthUnderflow.hour"); + static_assert(cs.minute() == 14, "MonthUnderflow.minute"); + static_assert(cs.second() == 12, "MonthUnderflow.second"); +} + +TEST(CivilTime, C4Overflow) { + constexpr civil_second cs(2016, 1, 292195, 17, 14, 12); + static_assert(cs.year() == 2816, "C4Overflow.year"); + static_assert(cs.month() == 1, "C4Overflow.month"); + static_assert(cs.day() == 1, "C4Overflow.day"); + static_assert(cs.hour() == 17, "C4Overflow.hour"); + static_assert(cs.minute() == 14, "C4Overflow.minute"); + static_assert(cs.second() == 12, "C4Overflow.second"); +} + +TEST(CivilTime, C4Underflow) { + constexpr civil_second cs(2016, 1, -292195, 17, 14, 12); + static_assert(cs.year() == 1215, "C4Underflow.year"); + static_assert(cs.month() == 12, "C4Underflow.month"); + static_assert(cs.day() == 30, "C4Underflow.day"); + static_assert(cs.hour() == 17, "C4Underflow.hour"); + static_assert(cs.minute() == 14, "C4Underflow.minute"); + static_assert(cs.second() == 12, "C4Underflow.second"); +} + +TEST(CivilTime, MixedNormalization) { + constexpr civil_second cs(2016, -42, 122, 99, -147, 4949); + static_assert(cs.year() == 2012, "MixedNormalization.year"); + static_assert(cs.month() == 10, "MixedNormalization.month"); + static_assert(cs.day() == 4, "MixedNormalization.day"); + static_assert(cs.hour() == 1, "MixedNormalization.hour"); + static_assert(cs.minute() == 55, "MixedNormalization.minute"); + static_assert(cs.second() == 29, "MixedNormalization.second"); +} + +// Relational constexpr tests + +TEST(CivilTime, Less) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2(2016, 1, 28, 17, 14, 13); + constexpr bool less = cs1 < cs2; + static_assert(less, "Less"); +} + +// Arithmetic constexpr tests + +TEST(CivilTime, Addition) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2 = cs1 + 50; + static_assert(cs2.year() == 2016, "Addition.year"); + static_assert(cs2.month() == 1, "Addition.month"); + static_assert(cs2.day() == 28, "Addition.day"); + static_assert(cs2.hour() == 17, "Addition.hour"); + static_assert(cs2.minute() == 15, "Addition.minute"); + static_assert(cs2.second() == 2, "Addition.second"); +} + +TEST(CivilTime, Subtraction) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2 = cs1 - 50; + static_assert(cs2.year() == 2016, "Subtraction.year"); + static_assert(cs2.month() == 1, "Subtraction.month"); + static_assert(cs2.day() == 28, "Subtraction.day"); + static_assert(cs2.hour() == 17, "Subtraction.hour"); + static_assert(cs2.minute() == 13, "Subtraction.minute"); + static_assert(cs2.second() == 22, "Subtraction.second"); +} + +TEST(CivilTime, Difference) { + constexpr civil_day cd1(2016, 1, 28); + constexpr civil_day cd2(2015, 1, 28); + constexpr int diff = cd1 - cd2; + static_assert(diff == 365, "Difference"); +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(CivilTime, DifferenceWithHugeYear) { + { + constexpr civil_day d1(9223372036854775807, 1, 1); + constexpr civil_day d2(9223372036854775807, 12, 31); + static_assert(d2 - d1 == 364, "DifferenceWithHugeYear"); + } + { + constexpr civil_day d1(-9223372036854775807 - 1, 1, 1); + constexpr civil_day d2(-9223372036854775807 - 1, 12, 31); + static_assert(d2 - d1 == 365, "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value at the end of the year range. + constexpr civil_day d1(9223372036854775807, 1, 1); + constexpr civil_day d2(9198119301927009252, 6, 6); + static_assert(d1 - d2 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert((d2 - 1) - d1 == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value at the start of the year range. + constexpr civil_day d1(-9223372036854775807 - 1, 1, 1); + constexpr civil_day d2(-9198119301927009254, 7, 28); + static_assert(d2 - d1 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert(d1 - (d2 + 1) == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value from either side of year 0. + constexpr civil_day d1(-12626367463883278, 9, 3); + constexpr civil_day d2(12626367463883277, 3, 28); + static_assert(d2 - d1 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert(d1 - (d2 + 1) == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(CivilTime, DifferenceNoIntermediateOverflow) { + { + // The difference up to the minute field would be below the minimum + // diff_t, but the 52 extra seconds brings us back to the minimum. + constexpr civil_second s1(-292277022657, 1, 27, 8, 29 - 1, 52); + constexpr civil_second s2(1970, 1, 1, 0, 0 - 1, 0); + static_assert(s1 - s2 == -9223372036854775807 - 1, + "DifferenceNoIntermediateOverflow"); + } + { + // The difference up to the minute field would be above the maximum + // diff_t, but the -53 extra seconds brings us back to the maximum. + constexpr civil_second s1(292277026596, 12, 4, 15, 30, 7 - 7); + constexpr civil_second s2(1970, 1, 1, 0, 0, 0 - 7); + static_assert(s1 - s2 == 9223372036854775807, + "DifferenceNoIntermediateOverflow"); + } +} + +// Helper constexpr tests + +TEST(CivilTime, WeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr weekday wd = get_weekday(cd); + static_assert(wd == weekday::thursday, "Weekday"); +} + +TEST(CivilTime, NextWeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr civil_day next = next_weekday(cd, weekday::thursday); + static_assert(next.year() == 2016, "NextWeekDay.year"); + static_assert(next.month() == 2, "NextWeekDay.month"); + static_assert(next.day() == 4, "NextWeekDay.day"); +} + +TEST(CivilTime, PrevWeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr civil_day prev = prev_weekday(cd, weekday::thursday); + static_assert(prev.year() == 2016, "PrevWeekDay.year"); + static_assert(prev.month() == 1, "PrevWeekDay.month"); + static_assert(prev.day() == 21, "PrevWeekDay.day"); +} + +TEST(CivilTime, YearDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr int yd = get_yearday(cd); + static_assert(yd == 28, "YearDay"); +} +#endif // __clang__ && __cpp_constexpr >= 201304 + +// The remaining tests do not use constexpr. + +TEST(CivilTime, DefaultConstruction) { + civil_second ss; + EXPECT_EQ("1970-01-01T00:00:00", Format(ss)); + + civil_minute mm; + EXPECT_EQ("1970-01-01T00:00", Format(mm)); + + civil_hour hh; + EXPECT_EQ("1970-01-01T00", Format(hh)); + + civil_day d; + EXPECT_EQ("1970-01-01", Format(d)); + + civil_month m; + EXPECT_EQ("1970-01", Format(m)); + + civil_year y; + EXPECT_EQ("1970", Format(y)); +} + +TEST(CivilTime, StructMember) { + struct S { + civil_day day; + }; + S s = {}; + EXPECT_EQ(civil_day{}, s.day); +} + +TEST(CivilTime, FieldsConstruction) { + EXPECT_EQ("2015-01-02T03:04:05", Format(civil_second(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03:04:00", Format(civil_second(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03:00:00", Format(civil_second(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00:00:00", Format(civil_second(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00:00:00", Format(civil_second(2015, 1))); + EXPECT_EQ("2015-01-01T00:00:00", Format(civil_second(2015))); + + EXPECT_EQ("2015-01-02T03:04", Format(civil_minute(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03:04", Format(civil_minute(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03:00", Format(civil_minute(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00:00", Format(civil_minute(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00:00", Format(civil_minute(2015, 1))); + EXPECT_EQ("2015-01-01T00:00", Format(civil_minute(2015))); + + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00", Format(civil_hour(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00", Format(civil_hour(2015, 1))); + EXPECT_EQ("2015-01-01T00", Format(civil_hour(2015))); + + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2))); + EXPECT_EQ("2015-01-01", Format(civil_day(2015, 1))); + EXPECT_EQ("2015-01-01", Format(civil_day(2015))); + + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1))); + EXPECT_EQ("2015-01", Format(civil_month(2015))); + + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2))); + EXPECT_EQ("2015", Format(civil_year(2015, 1))); + EXPECT_EQ("2015", Format(civil_year(2015))); +} + +TEST(CivilTime, FieldsConstructionLimits) { + const int kIntMax = std::numeric_limits::max(); + EXPECT_EQ("2038-01-19T03:14:07", + Format(civil_second(1970, 1, 1, 0, 0, kIntMax))); + EXPECT_EQ("6121-02-11T05:21:07", + Format(civil_second(1970, 1, 1, 0, kIntMax, kIntMax))); + EXPECT_EQ("251104-11-20T12:21:07", + Format(civil_second(1970, 1, 1, kIntMax, kIntMax, kIntMax))); + EXPECT_EQ("6130715-05-30T12:21:07", + Format(civil_second(1970, 1, kIntMax, kIntMax, kIntMax, kIntMax))); + EXPECT_EQ( + "185087685-11-26T12:21:07", + Format(civil_second(1970, kIntMax, kIntMax, kIntMax, kIntMax, kIntMax))); + + const int kIntMin = std::numeric_limits::min(); + EXPECT_EQ("1901-12-13T20:45:52", + Format(civil_second(1970, 1, 1, 0, 0, kIntMin))); + EXPECT_EQ("-2182-11-20T18:37:52", + Format(civil_second(1970, 1, 1, 0, kIntMin, kIntMin))); + EXPECT_EQ("-247165-02-11T10:37:52", + Format(civil_second(1970, 1, 1, kIntMin, kIntMin, kIntMin))); + EXPECT_EQ("-6126776-08-01T10:37:52", + Format(civil_second(1970, 1, kIntMin, kIntMin, kIntMin, kIntMin))); + EXPECT_EQ( + "-185083747-10-31T10:37:52", + Format(civil_second(1970, kIntMin, kIntMin, kIntMin, kIntMin, kIntMin))); +} + +TEST(CivilTime, ImplicitCrossAlignment) { + civil_year year(2015); + civil_month month = year; + civil_day day = month; + civil_hour hour = day; + civil_minute minute = hour; + civil_second second = minute; + + second = year; + EXPECT_EQ(second, year); + second = month; + EXPECT_EQ(second, month); + second = day; + EXPECT_EQ(second, day); + second = hour; + EXPECT_EQ(second, hour); + second = minute; + EXPECT_EQ(second, minute); + + minute = year; + EXPECT_EQ(minute, year); + minute = month; + EXPECT_EQ(minute, month); + minute = day; + EXPECT_EQ(minute, day); + minute = hour; + EXPECT_EQ(minute, hour); + + hour = year; + EXPECT_EQ(hour, year); + hour = month; + EXPECT_EQ(hour, month); + hour = day; + EXPECT_EQ(hour, day); + + day = year; + EXPECT_EQ(day, year); + day = month; + EXPECT_EQ(day, month); + + month = year; + EXPECT_EQ(month, year); + + // Ensures unsafe conversions are not allowed. + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); +} + +TEST(CivilTime, ExplicitCrossAlignment) { + // + // Assign from smaller units -> larger units + // + + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ("2015-01-02T03:04:05", Format(second)); + + civil_minute minute(second); + EXPECT_EQ("2015-01-02T03:04", Format(minute)); + + civil_hour hour(minute); + EXPECT_EQ("2015-01-02T03", Format(hour)); + + civil_day day(hour); + EXPECT_EQ("2015-01-02", Format(day)); + + civil_month month(day); + EXPECT_EQ("2015-01", Format(month)); + + civil_year year(month); + EXPECT_EQ("2015", Format(year)); + + // + // Now assign from larger units -> smaller units + // + + month = civil_month(year); + EXPECT_EQ("2015-01", Format(month)); + + day = civil_day(month); + EXPECT_EQ("2015-01-01", Format(day)); + + hour = civil_hour(day); + EXPECT_EQ("2015-01-01T00", Format(hour)); + + minute = civil_minute(hour); + EXPECT_EQ("2015-01-01T00:00", Format(minute)); + + second = civil_second(minute); + EXPECT_EQ("2015-01-01T00:00:00", Format(second)); +} + +// Metafunction to test whether difference is allowed between two types. +template +struct HasDifference { + template + static std::false_type test(...); + template + static std::true_type test(decltype(std::declval() - std::declval())); + static constexpr bool value = decltype(test(0))::value; +}; + +TEST(CivilTime, DisallowCrossAlignedDifference) { + // Difference is allowed between types with the same alignment. + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + + // Difference is disallowed between types with different alignments. + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); +} + +TEST(CivilTime, ValueSemantics) { + const civil_hour a(2015, 1, 2, 3); + const civil_hour b = a; + const civil_hour c(b); + civil_hour d; + d = c; + EXPECT_EQ("2015-01-02T03", Format(d)); +} + +TEST(CivilTime, Relational) { + // Tests that the alignment unit is ignored in comparison. + const civil_year year(2014); + const civil_month month(year); + EXPECT_EQ(year, month); + +#define TEST_RELATIONAL(OLDER, YOUNGER) \ + do { \ + EXPECT_FALSE(OLDER < OLDER); \ + EXPECT_FALSE(OLDER > OLDER); \ + EXPECT_TRUE(OLDER >= OLDER); \ + EXPECT_TRUE(OLDER <= OLDER); \ + EXPECT_FALSE(YOUNGER < YOUNGER); \ + EXPECT_FALSE(YOUNGER > YOUNGER); \ + EXPECT_TRUE(YOUNGER >= YOUNGER); \ + EXPECT_TRUE(YOUNGER <= YOUNGER); \ + EXPECT_EQ(OLDER, OLDER); \ + EXPECT_NE(OLDER, YOUNGER); \ + EXPECT_LT(OLDER, YOUNGER); \ + EXPECT_LE(OLDER, YOUNGER); \ + EXPECT_GT(YOUNGER, OLDER); \ + EXPECT_GE(YOUNGER, OLDER); \ + } while (0) + + // Alignment is ignored in comparison (verified above), so kSecond is used + // to test comparison in all field positions. + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2015, 1, 1, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 2, 1, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 1, 2, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 1, 1, 1, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 1, 0, 0), + civil_second(2014, 1, 1, 1, 1, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 1, 1, 0), + civil_second(2014, 1, 1, 1, 1, 1)); + + // Tests the relational operators of two different CivilTime types. + TEST_RELATIONAL(civil_day(2014, 1, 1), civil_minute(2014, 1, 1, 1, 1)); + TEST_RELATIONAL(civil_day(2014, 1, 1), civil_month(2014, 2)); + +#undef TEST_RELATIONAL +} + +TEST(CivilTime, Arithmetic) { + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ("2015-01-02T03:04:06", Format(second += 1)); + EXPECT_EQ("2015-01-02T03:04:07", Format(second + 1)); + EXPECT_EQ("2015-01-02T03:04:08", Format(2 + second)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second - 1)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second -= 1)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second++)); + EXPECT_EQ("2015-01-02T03:04:07", Format(++second)); + EXPECT_EQ("2015-01-02T03:04:07", Format(second--)); + EXPECT_EQ("2015-01-02T03:04:05", Format(--second)); + + civil_minute minute(2015, 1, 2, 3, 4); + EXPECT_EQ("2015-01-02T03:05", Format(minute += 1)); + EXPECT_EQ("2015-01-02T03:06", Format(minute + 1)); + EXPECT_EQ("2015-01-02T03:07", Format(2 + minute)); + EXPECT_EQ("2015-01-02T03:04", Format(minute - 1)); + EXPECT_EQ("2015-01-02T03:04", Format(minute -= 1)); + EXPECT_EQ("2015-01-02T03:04", Format(minute++)); + EXPECT_EQ("2015-01-02T03:06", Format(++minute)); + EXPECT_EQ("2015-01-02T03:06", Format(minute--)); + EXPECT_EQ("2015-01-02T03:04", Format(--minute)); + + civil_hour hour(2015, 1, 2, 3); + EXPECT_EQ("2015-01-02T04", Format(hour += 1)); + EXPECT_EQ("2015-01-02T05", Format(hour + 1)); + EXPECT_EQ("2015-01-02T06", Format(2 + hour)); + EXPECT_EQ("2015-01-02T03", Format(hour - 1)); + EXPECT_EQ("2015-01-02T03", Format(hour -= 1)); + EXPECT_EQ("2015-01-02T03", Format(hour++)); + EXPECT_EQ("2015-01-02T05", Format(++hour)); + EXPECT_EQ("2015-01-02T05", Format(hour--)); + EXPECT_EQ("2015-01-02T03", Format(--hour)); + + civil_day day(2015, 1, 2); + EXPECT_EQ("2015-01-03", Format(day += 1)); + EXPECT_EQ("2015-01-04", Format(day + 1)); + EXPECT_EQ("2015-01-05", Format(2 + day)); + EXPECT_EQ("2015-01-02", Format(day - 1)); + EXPECT_EQ("2015-01-02", Format(day -= 1)); + EXPECT_EQ("2015-01-02", Format(day++)); + EXPECT_EQ("2015-01-04", Format(++day)); + EXPECT_EQ("2015-01-04", Format(day--)); + EXPECT_EQ("2015-01-02", Format(--day)); + + civil_month month(2015, 1); + EXPECT_EQ("2015-02", Format(month += 1)); + EXPECT_EQ("2015-03", Format(month + 1)); + EXPECT_EQ("2015-04", Format(2 + month)); + EXPECT_EQ("2015-01", Format(month - 1)); + EXPECT_EQ("2015-01", Format(month -= 1)); + EXPECT_EQ("2015-01", Format(month++)); + EXPECT_EQ("2015-03", Format(++month)); + EXPECT_EQ("2015-03", Format(month--)); + EXPECT_EQ("2015-01", Format(--month)); + + civil_year year(2015); + EXPECT_EQ("2016", Format(year += 1)); + EXPECT_EQ("2017", Format(year + 1)); + EXPECT_EQ("2018", Format(2 + year)); + EXPECT_EQ("2015", Format(year - 1)); + EXPECT_EQ("2015", Format(year -= 1)); + EXPECT_EQ("2015", Format(year++)); + EXPECT_EQ("2017", Format(++year)); + EXPECT_EQ("2017", Format(year--)); + EXPECT_EQ("2015", Format(--year)); +} + +TEST(CivilTime, ArithmeticLimits) { + const int kIntMax = std::numeric_limits::max(); + const int kIntMin = std::numeric_limits::min(); + + civil_second second(1970, 1, 1, 0, 0, 0); + second += kIntMax; + EXPECT_EQ("2038-01-19T03:14:07", Format(second)); + second -= kIntMax; + EXPECT_EQ("1970-01-01T00:00:00", Format(second)); + second += kIntMin; + EXPECT_EQ("1901-12-13T20:45:52", Format(second)); + second -= kIntMin; + EXPECT_EQ("1970-01-01T00:00:00", Format(second)); + + civil_minute minute(1970, 1, 1, 0, 0); + minute += kIntMax; + EXPECT_EQ("6053-01-23T02:07", Format(minute)); + minute -= kIntMax; + EXPECT_EQ("1970-01-01T00:00", Format(minute)); + minute += kIntMin; + EXPECT_EQ("-2114-12-08T21:52", Format(minute)); + minute -= kIntMin; + EXPECT_EQ("1970-01-01T00:00", Format(minute)); + + civil_hour hour(1970, 1, 1, 0); + hour += kIntMax; + EXPECT_EQ("246953-10-09T07", Format(hour)); + hour -= kIntMax; + EXPECT_EQ("1970-01-01T00", Format(hour)); + hour += kIntMin; + EXPECT_EQ("-243014-03-24T16", Format(hour)); + hour -= kIntMin; + EXPECT_EQ("1970-01-01T00", Format(hour)); + + civil_day day(1970, 1, 1); + day += kIntMax; + EXPECT_EQ("5881580-07-11", Format(day)); + day -= kIntMax; + EXPECT_EQ("1970-01-01", Format(day)); + day += kIntMin; + EXPECT_EQ("-5877641-06-23", Format(day)); + day -= kIntMin; + EXPECT_EQ("1970-01-01", Format(day)); + + civil_month month(1970, 1); + month += kIntMax; + EXPECT_EQ("178958940-08", Format(month)); + month -= kIntMax; + EXPECT_EQ("1970-01", Format(month)); + month += kIntMin; + EXPECT_EQ("-178955001-05", Format(month)); + month -= kIntMin; + EXPECT_EQ("1970-01", Format(month)); + + civil_year year(0); + year += kIntMax; + EXPECT_EQ("2147483647", Format(year)); + year -= kIntMax; + EXPECT_EQ("0", Format(year)); + year += kIntMin; + EXPECT_EQ("-2147483648", Format(year)); + year -= kIntMin; + EXPECT_EQ("0", Format(year)); +} + +TEST(CivilTime, ArithmeticDifference) { + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ(0, second - second); + EXPECT_EQ(10, (second + 10) - second); + EXPECT_EQ(-10, (second - 10) - second); + + civil_minute minute(2015, 1, 2, 3, 4); + EXPECT_EQ(0, minute - minute); + EXPECT_EQ(10, (minute + 10) - minute); + EXPECT_EQ(-10, (minute - 10) - minute); + + civil_hour hour(2015, 1, 2, 3); + EXPECT_EQ(0, hour - hour); + EXPECT_EQ(10, (hour + 10) - hour); + EXPECT_EQ(-10, (hour - 10) - hour); + + civil_day day(2015, 1, 2); + EXPECT_EQ(0, day - day); + EXPECT_EQ(10, (day + 10) - day); + EXPECT_EQ(-10, (day - 10) - day); + + civil_month month(2015, 1); + EXPECT_EQ(0, month - month); + EXPECT_EQ(10, (month + 10) - month); + EXPECT_EQ(-10, (month - 10) - month); + + civil_year year(2015); + EXPECT_EQ(0, year - year); + EXPECT_EQ(10, (year + 10) - year); + EXPECT_EQ(-10, (year - 10) - year); +} + +TEST(CivilTime, DifferenceLimits) { + const int kIntMax = std::numeric_limits::max(); + const int kIntMin = std::numeric_limits::min(); + + // Check day arithmetic at the end of the year range. + const civil_day max_day(kIntMax, 12, 31); + EXPECT_EQ(1, max_day - (max_day - 1)); + EXPECT_EQ(-1, (max_day - 1) - max_day); + + // Check day arithmetic at the end of the year range. + const civil_day min_day(kIntMin, 1, 1); + EXPECT_EQ(1, (min_day + 1) - min_day); + EXPECT_EQ(-1, min_day - (min_day + 1)); + + // Check the limits of the return value. + const civil_day d1(1970, 1, 1); + const civil_day d2(5881580, 7, 11); + EXPECT_EQ(kIntMax, d2 - d1); + EXPECT_EQ(kIntMin, d1 - (d2 + 1)); +} + +TEST(CivilTime, Properties) { + civil_second ss(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, ss.year()); + EXPECT_EQ(2, ss.month()); + EXPECT_EQ(3, ss.day()); + EXPECT_EQ(4, ss.hour()); + EXPECT_EQ(5, ss.minute()); + EXPECT_EQ(6, ss.second()); + + civil_minute mm(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, mm.year()); + EXPECT_EQ(2, mm.month()); + EXPECT_EQ(3, mm.day()); + EXPECT_EQ(4, mm.hour()); + EXPECT_EQ(5, mm.minute()); + EXPECT_EQ(0, mm.second()); + + civil_hour hh(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, hh.year()); + EXPECT_EQ(2, hh.month()); + EXPECT_EQ(3, hh.day()); + EXPECT_EQ(4, hh.hour()); + EXPECT_EQ(0, hh.minute()); + EXPECT_EQ(0, hh.second()); + + civil_day d(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, d.year()); + EXPECT_EQ(2, d.month()); + EXPECT_EQ(3, d.day()); + EXPECT_EQ(0, d.hour()); + EXPECT_EQ(0, d.minute()); + EXPECT_EQ(0, d.second()); + EXPECT_EQ(weekday::tuesday, get_weekday(d)); + EXPECT_EQ(34, get_yearday(d)); + + civil_month m(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, m.year()); + EXPECT_EQ(2, m.month()); + EXPECT_EQ(1, m.day()); + EXPECT_EQ(0, m.hour()); + EXPECT_EQ(0, m.minute()); + EXPECT_EQ(0, m.second()); + + civil_year y(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, y.year()); + EXPECT_EQ(1, y.month()); + EXPECT_EQ(1, y.day()); + EXPECT_EQ(0, y.hour()); + EXPECT_EQ(0, y.minute()); + EXPECT_EQ(0, y.second()); +} + +TEST(CivilTime, OutputStream) { + // Tests formatting of civil_year, which does not pad. + EXPECT_EQ("2016", Format(civil_year(2016))); + EXPECT_EQ("123", Format(civil_year(123))); + EXPECT_EQ("0", Format(civil_year(0))); + EXPECT_EQ("-1", Format(civil_year(-1))); + + // Tests formatting of sub-year types, which pad to 2 digits + EXPECT_EQ("2016-02", Format(civil_month(2016, 2))); + EXPECT_EQ("2016-02-03", Format(civil_day(2016, 2, 3))); + EXPECT_EQ("2016-02-03T04", Format(civil_hour(2016, 2, 3, 4))); + EXPECT_EQ("2016-02-03T04:05", Format(civil_minute(2016, 2, 3, 4, 5))); + EXPECT_EQ("2016-02-03T04:05:06", Format(civil_second(2016, 2, 3, 4, 5, 6))); + + // Tests formatting of weekday. + EXPECT_EQ("Monday", Format(weekday::monday)); + EXPECT_EQ("Tuesday", Format(weekday::tuesday)); + EXPECT_EQ("Wednesday", Format(weekday::wednesday)); + EXPECT_EQ("Thursday", Format(weekday::thursday)); + EXPECT_EQ("Friday", Format(weekday::friday)); + EXPECT_EQ("Saturday", Format(weekday::saturday)); + EXPECT_EQ("Sunday", Format(weekday::sunday)); +} + +TEST(CivilTime, OutputStreamLeftFillWidth) { + civil_second cs(2016, 2, 3, 4, 5, 6); + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_year(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016.................X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_month(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02..............X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_day(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03...........X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_hour(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04........X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_minute(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04:05.....X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_second(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04:05:06..X..", ss.str()); + } +} + +TEST(CivilTime, NextPrevWeekday) { + // Jan 1, 1970 was a Thursday. + const civil_day thursday(1970, 1, 1); + EXPECT_EQ(weekday::thursday, get_weekday(thursday)); + + // Thursday -> Thursday + civil_day d = next_weekday(thursday, weekday::thursday); + EXPECT_EQ(7, d - thursday) << Format(d); + EXPECT_EQ(d - 14, prev_weekday(thursday, weekday::thursday)); + + // Thursday -> Friday + d = next_weekday(thursday, weekday::friday); + EXPECT_EQ(1, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::friday)); + + // Thursday -> Saturday + d = next_weekday(thursday, weekday::saturday); + EXPECT_EQ(2, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::saturday)); + + // Thursday -> Sunday + d = next_weekday(thursday, weekday::sunday); + EXPECT_EQ(3, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::sunday)); + + // Thursday -> Monday + d = next_weekday(thursday, weekday::monday); + EXPECT_EQ(4, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::monday)); + + // Thursday -> Tuesday + d = next_weekday(thursday, weekday::tuesday); + EXPECT_EQ(5, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::tuesday)); + + // Thursday -> Wednesday + d = next_weekday(thursday, weekday::wednesday); + EXPECT_EQ(6, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::wednesday)); +} + +TEST(CivilTime, NormalizeWithHugeYear) { + civil_month c(9223372036854775807, 1); + EXPECT_EQ("9223372036854775807-01", Format(c)); + c = c - 1; // Causes normalization + EXPECT_EQ("9223372036854775806-12", Format(c)); + + c = civil_month(-9223372036854775807 - 1, 1); + EXPECT_EQ("-9223372036854775808-01", Format(c)); + c = c + 12; // Causes normalization + EXPECT_EQ("-9223372036854775807-01", Format(c)); +} + +TEST(CivilTime, LeapYears) { + // Test data for leap years. + const struct { + int year; + int days; + struct { + int month; + int day; + } leap_day; // The date of the day after Feb 28. + } kLeapYearTable[]{ + {1900, 365, {3, 1}}, + {1999, 365, {3, 1}}, + {2000, 366, {2, 29}}, // leap year + {2001, 365, {3, 1}}, + {2002, 365, {3, 1}}, + {2003, 365, {3, 1}}, + {2004, 366, {2, 29}}, // leap year + {2005, 365, {3, 1}}, + {2006, 365, {3, 1}}, + {2007, 365, {3, 1}}, + {2008, 366, {2, 29}}, // leap year + {2009, 365, {3, 1}}, + {2100, 365, {3, 1}}, + }; + + for (const auto& e : kLeapYearTable) { + // Tests incrementing through the leap day. + const civil_day feb28(e.year, 2, 28); + const civil_day next_day = feb28 + 1; + EXPECT_EQ(e.leap_day.month, next_day.month()); + EXPECT_EQ(e.leap_day.day, next_day.day()); + + // Tests difference in days of leap years. + const civil_year year(feb28); + const civil_year next_year = year + 1; + EXPECT_EQ(e.days, civil_day(next_year) - civil_day(year)); + } +} + +TEST(CivilTime, FirstThursdayInMonth) { + const civil_day nov1(2014, 11, 1); + const civil_day thursday = prev_weekday(nov1, weekday::thursday) + 7; + EXPECT_EQ("2014-11-06", Format(thursday)); + + // Bonus: Date of Thanksgiving in the United States + // Rule: Fourth Thursday of November + const civil_day thanksgiving = thursday + 7 * 3; + EXPECT_EQ("2014-11-27", Format(thanksgiving)); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_fixed.cc b/absl/time/internal/cctz/src/time_zone_fixed.cc new file mode 100644 index 000000000..8d3b14425 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_fixed.cc @@ -0,0 +1,133 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "time_zone_fixed.h" + +#include +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// The prefix used for the internal names of fixed-offset zones. +const char kFixedOffsetPrefix[] = "Fixed/"; + +int Parse02d(const char* p) { + static const char kDigits[] = "0123456789"; + if (const char* ap = std::strchr(kDigits, *p)) { + int v = static_cast(ap - kDigits); + if (const char* bp = std::strchr(kDigits, *++p)) { + return (v * 10) + static_cast(bp - kDigits); + } + } + return -1; +} + +} // namespace + +bool FixedOffsetFromName(const std::string& name, sys_seconds* offset) { + if (name.compare(0, std::string::npos, "UTC", 3) == 0) { + *offset = sys_seconds::zero(); + return true; + } + + const std::size_t prefix_len = sizeof(kFixedOffsetPrefix) - 1; + const char* const ep = kFixedOffsetPrefix + prefix_len; + if (name.size() != prefix_len + 12) // "UTC+99:99:99" + return false; + if (!std::equal(kFixedOffsetPrefix, ep, name.begin())) + return false; + const char* np = name.data() + prefix_len; + if (*np++ != 'U' || *np++ != 'T' || *np++ != 'C') + return false; + if (np[0] != '+' && np[0] != '-') + return false; + if (np[3] != ':' || np[6] != ':') // see note below about large offsets + return false; + + int hours = Parse02d(np + 1); + if (hours == -1) return false; + int mins = Parse02d(np + 4); + if (mins == -1) return false; + int secs = Parse02d(np + 7); + if (secs == -1) return false; + + secs += ((hours * 60) + mins) * 60; + if (secs > 24 * 60 * 60) return false; // outside supported offset range + *offset = sys_seconds(secs * (np[0] == '-' ? -1 : 1)); // "-" means west + return true; +} + +std::string FixedOffsetToName(const sys_seconds& offset) { + if (offset == sys_seconds::zero()) return "UTC"; + if (offset < std::chrono::hours(-24) || offset > std::chrono::hours(24)) { + // We don't support fixed-offset zones more than 24 hours + // away from UTC to avoid complications in rendering such + // offsets and to (somewhat) limit the total number of zones. + return "UTC"; + } + int seconds = static_cast(offset.count()); + const char sign = (seconds < 0 ? '-' : '+'); + int minutes = seconds / 60; + seconds %= 60; + if (sign == '-') { + if (seconds > 0) { + seconds -= 60; + minutes += 1; + } + seconds = -seconds; + minutes = -minutes; + } + int hours = minutes / 60; + minutes %= 60; + char buf[sizeof(kFixedOffsetPrefix) + sizeof("UTC-24:00:00")]; + snprintf(buf, sizeof(buf), "%sUTC%c%02d:%02d:%02d", + kFixedOffsetPrefix, sign, hours, minutes, seconds); + return buf; +} + +std::string FixedOffsetToAbbr(const sys_seconds& offset) { + std::string abbr = FixedOffsetToName(offset); + const std::size_t prefix_len = sizeof(kFixedOffsetPrefix) - 1; + const char* const ep = kFixedOffsetPrefix + prefix_len; + if (abbr.size() >= prefix_len) { + if (std::equal(kFixedOffsetPrefix, ep, abbr.begin())) { + abbr.erase(0, prefix_len); + if (abbr.size() == 12) { // UTC+99:99:99 + abbr.erase(9, 1); // UTC+99:9999 + abbr.erase(6, 1); // UTC+999999 + if (abbr[8] == '0' && abbr[9] == '0') { // UTC+999900 + abbr.erase(8, 2); // UTC+9999 + if (abbr[6] == '0' && abbr[7] == '0') { // UTC+9900 + abbr.erase(6, 2); // UTC+99 + if (abbr[4] == '0') { // UTC+09 + abbr.erase(4, 1); // UTC+9 + } + } + } + } + } + } + return abbr; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_fixed.h b/absl/time/internal/cctz/src/time_zone_fixed.h new file mode 100644 index 000000000..7c9d11db9 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_fixed.h @@ -0,0 +1,49 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ + +#include + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Helper functions for dealing with the names and abbreviations +// of time zones that are a fixed offset (seconds east) from UTC. +// FixedOffsetFromName() extracts the offset from a valid fixed-offset +// name, while FixedOffsetToName() and FixedOffsetToAbbr() generate +// the canonical zone name and abbreviation respectively for the given +// offset. +// +// A fixed-offset name looks like "Fixed/UTC<+->::". +// Its abbreviation is of the form "UTC(<+->H?H(MM(SS)?)?)?" where the +// optional pieces are omitted when their values are zero. (Note that +// the sign is the opposite of that used in a POSIX TZ specification.) +// +// Note: FixedOffsetFromName() fails on syntax errors or when the parsed +// offset exceeds 24 hours. FixedOffsetToName() and FixedOffsetToAbbr() +// both produce "UTC" when the argument offset exceeds 24 hours. +bool FixedOffsetFromName(const std::string& name, sys_seconds* offset); +std::string FixedOffsetToName(const sys_seconds& offset); +std::string FixedOffsetToAbbr(const sys_seconds& offset); + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ diff --git a/absl/time/internal/cctz/src/time_zone_format.cc b/absl/time/internal/cctz/src/time_zone_format.cc new file mode 100644 index 000000000..6d5ccba1c --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_format.cc @@ -0,0 +1,848 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#if !defined(HAS_STRPTIME) +# if !defined(_MSC_VER) +# define HAS_STRPTIME 1 // assume everyone has strptime() except windows +# endif +#endif + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !HAS_STRPTIME +#include +#include +#endif + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "time_zone_if.h" + +namespace absl { +namespace time_internal { +namespace cctz { +namespace detail { + +namespace { + +#if !HAS_STRPTIME +// Build a strptime() using C++11's std::get_time(). +char* strptime(const char* s, const char* fmt, std::tm* tm) { + std::istringstream input(s); + input >> std::get_time(tm, fmt); + if (input.fail()) return nullptr; + return const_cast(s) + + (input.eof() ? strlen(s) : static_cast(input.tellg())); +} +#endif + +std::tm ToTM(const time_zone::absolute_lookup& al) { + std::tm tm{}; + tm.tm_sec = al.cs.second(); + tm.tm_min = al.cs.minute(); + tm.tm_hour = al.cs.hour(); + tm.tm_mday = al.cs.day(); + tm.tm_mon = al.cs.month() - 1; + + // Saturate tm.tm_year is cases of over/underflow. + if (al.cs.year() < std::numeric_limits::min() + 1900) { + tm.tm_year = std::numeric_limits::min(); + } else if (al.cs.year() - 1900 > std::numeric_limits::max()) { + tm.tm_year = std::numeric_limits::max(); + } else { + tm.tm_year = static_cast(al.cs.year() - 1900); + } + + switch (get_weekday(civil_day(al.cs))) { + case weekday::sunday: + tm.tm_wday = 0; + break; + case weekday::monday: + tm.tm_wday = 1; + break; + case weekday::tuesday: + tm.tm_wday = 2; + break; + case weekday::wednesday: + tm.tm_wday = 3; + break; + case weekday::thursday: + tm.tm_wday = 4; + break; + case weekday::friday: + tm.tm_wday = 5; + break; + case weekday::saturday: + tm.tm_wday = 6; + break; + } + tm.tm_yday = get_yearday(civil_day(al.cs)) - 1; + tm.tm_isdst = al.is_dst ? 1 : 0; + return tm; +} + +const char kDigits[] = "0123456789"; + +// Formats a 64-bit integer in the given field width. Note that it is up +// to the caller of Format64() [and Format02d()/FormatOffset()] to ensure +// that there is sufficient space before ep to hold the conversion. +char* Format64(char* ep, int width, std::int_fast64_t v) { + bool neg = false; + if (v < 0) { + --width; + neg = true; + if (v == std::numeric_limits::min()) { + // Avoid negating minimum value. + std::int_fast64_t last_digit = -(v % 10); + v /= 10; + if (last_digit < 0) { + ++v; + last_digit += 10; + } + --width; + *--ep = kDigits[last_digit]; + } + v = -v; + } + do { + --width; + *--ep = kDigits[v % 10]; + } while (v /= 10); + while (--width >= 0) *--ep = '0'; // zero pad + if (neg) *--ep = '-'; + return ep; +} + +// Formats [0 .. 99] as %02d. +char* Format02d(char* ep, int v) { + *--ep = kDigits[v % 10]; + *--ep = kDigits[(v / 10) % 10]; + return ep; +} + +// Formats a UTC offset, like +00:00. +char* FormatOffset(char* ep, int offset, const char* mode) { + char sign = '+'; + if (offset < 0) { + offset = -offset; // bounded by 24h so no overflow + sign = '-'; + } + char sep = mode[0]; + if (sep != '\0' && mode[1] == '*') { + ep = Format02d(ep, offset % 60); + *--ep = sep; + } + int minutes = offset / 60; + ep = Format02d(ep, minutes % 60); + if (sep != '\0') *--ep = sep; + ep = Format02d(ep, minutes / 60); + *--ep = sign; + return ep; +} + +// Formats a std::tm using strftime(3). +void FormatTM(std::string* out, const std::string& fmt, const std::tm& tm) { + // strftime(3) returns the number of characters placed in the output + // array (which may be 0 characters). It also returns 0 to indicate + // an error, like the array wasn't large enough. To accommodate this, + // the following code grows the buffer size from 2x the format std::string + // length up to 32x. + for (std::size_t i = 2; i != 32; i *= 2) { + std::size_t buf_size = fmt.size() * i; + std::vector buf(buf_size); + if (std::size_t len = strftime(&buf[0], buf_size, fmt.c_str(), &tm)) { + out->append(&buf[0], len); + return; + } + } +} + +// Used for %E#S/%E#f specifiers and for data values in parse(). +template +const char* ParseInt(const char* dp, int width, T min, T max, T* vp) { + if (dp != nullptr) { + const T kmin = std::numeric_limits::min(); + bool erange = false; + bool neg = false; + T value = 0; + if (*dp == '-') { + neg = true; + if (width <= 0 || --width != 0) { + ++dp; + } else { + dp = nullptr; // width was 1 + } + } + if (const char* const bp = dp) { + while (const char* cp = strchr(kDigits, *dp)) { + int d = static_cast(cp - kDigits); + if (d >= 10) break; + if (value < kmin / 10) { + erange = true; + break; + } + value *= 10; + if (value < kmin + d) { + erange = true; + break; + } + value -= d; + dp += 1; + if (width > 0 && --width == 0) break; + } + if (dp != bp && !erange && (neg || value != kmin)) { + if (!neg || value != 0) { + if (!neg) value = -value; // make positive + if (min <= value && value <= max) { + *vp = value; + } else { + dp = nullptr; + } + } else { + dp = nullptr; + } + } else { + dp = nullptr; + } + } + } + return dp; +} + +// The number of base-10 digits that can be represented by a signed 64-bit +// integer. That is, 10^kDigits10_64 <= 2^63 - 1 < 10^(kDigits10_64 + 1). +const int kDigits10_64 = 18; + +// 10^n for everything that can be represented by a signed 64-bit integer. +const std::int_fast64_t kExp10[kDigits10_64 + 1] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, +}; + +} // namespace + +// Uses strftime(3) to format the given Time. The following extended format +// specifiers are also supported: +// +// - %Ez - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm) +// - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss) +// - %E#S - Seconds with # digits of fractional precision +// - %E*S - Seconds with full fractional precision (a literal '*') +// - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999) +// +// The standard specifiers from RFC3339_* (%Y, %m, %d, %H, %M, and %S) are +// handled internally for performance reasons. strftime(3) is slow due to +// a POSIX requirement to respect changes to ${TZ}. +// +// The TZ/GNU %s extension is handled internally because strftime() has +// to use mktime() to generate it, and that assumes the local time zone. +// +// We also handle the %z and %Z specifiers to accommodate platforms that do +// not support the tm_gmtoff and tm_zone extensions to std::tm. +// +// Requires that zero() <= fs < seconds(1). +std::string format(const std::string& format, const time_point& tp, + const detail::femtoseconds& fs, const time_zone& tz) { + std::string result; + result.reserve(format.size()); // A reasonable guess for the result size. + const time_zone::absolute_lookup al = tz.lookup(tp); + const std::tm tm = ToTM(al); + + // Scratch buffer for internal conversions. + char buf[3 + kDigits10_64]; // enough for longest conversion + char* const ep = buf + sizeof(buf); + char* bp; // works back from ep + + // Maintain three, disjoint subsequences that span format. + // [format.begin() ... pending) : already formatted into result + // [pending ... cur) : formatting pending, but no special cases + // [cur ... format.end()) : unexamined + // Initially, everything is in the unexamined part. + const char* pending = format.c_str(); // NUL terminated + const char* cur = pending; + const char* end = pending + format.length(); + + while (cur != end) { // while something is unexamined + // Moves cur to the next percent sign. + const char* start = cur; + while (cur != end && *cur != '%') ++cur; + + // If the new pending text is all ordinary, copy it out. + if (cur != start && pending == start) { + result.append(pending, static_cast(cur - pending)); + pending = start = cur; + } + + // Span the sequential percent signs. + const char* percent = cur; + while (cur != end && *cur == '%') ++cur; + + // If the new pending text is all percents, copy out one + // percent for every matched pair, then skip those pairs. + if (cur != start && pending == start) { + std::size_t escaped = static_cast(cur - pending) / 2; + result.append(pending, escaped); + pending += escaped * 2; + // Also copy out a single trailing percent. + if (pending != cur && cur == end) { + result.push_back(*pending++); + } + } + + // Loop unless we have an unescaped percent. + if (cur == end || (cur - percent) % 2 == 0) continue; + + // Simple specifiers that we handle ourselves. + if (strchr("YmdeHMSzZs%", *cur)) { + if (cur - 1 != pending) { + FormatTM(&result, std::string(pending, cur - 1), tm); + } + switch (*cur) { + case 'Y': + // This avoids the tm.tm_year overflow problem for %Y, however + // tm.tm_year will still be used by other specifiers like %D. + bp = Format64(ep, 0, al.cs.year()); + result.append(bp, static_cast(ep - bp)); + break; + case 'm': + bp = Format02d(ep, al.cs.month()); + result.append(bp, static_cast(ep - bp)); + break; + case 'd': + case 'e': + bp = Format02d(ep, al.cs.day()); + if (*cur == 'e' && *bp == '0') *bp = ' '; // for Windows + result.append(bp, static_cast(ep - bp)); + break; + case 'H': + bp = Format02d(ep, al.cs.hour()); + result.append(bp, static_cast(ep - bp)); + break; + case 'M': + bp = Format02d(ep, al.cs.minute()); + result.append(bp, static_cast(ep - bp)); + break; + case 'S': + bp = Format02d(ep, al.cs.second()); + result.append(bp, static_cast(ep - bp)); + break; + case 'z': + bp = FormatOffset(ep, al.offset, ""); + result.append(bp, static_cast(ep - bp)); + break; + case 'Z': + result.append(al.abbr); + break; + case 's': + bp = Format64(ep, 0, ToUnixSeconds(tp)); + result.append(bp, static_cast(ep - bp)); + break; + case '%': + result.push_back('%'); + break; + } + pending = ++cur; + continue; + } + + // Loop if there is no E modifier. + if (*cur != 'E' || ++cur == end) continue; + + // Format our extensions. + if (*cur == 'z') { + // Formats %Ez. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = FormatOffset(ep, al.offset, ":"); + result.append(bp, static_cast(ep - bp)); + pending = ++cur; + } else if (*cur == '*' && cur + 1 != end && *(cur + 1) == 'z') { + // Formats %E*z. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = FormatOffset(ep, al.offset, ":*"); + result.append(bp, static_cast(ep - bp)); + pending = cur += 2; + } else if (*cur == '*' && cur + 1 != end && + (*(cur + 1) == 'S' || *(cur + 1) == 'f')) { + // Formats %E*S or %E*F. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + char* cp = ep; + bp = Format64(cp, 15, fs.count()); + while (cp != bp && cp[-1] == '0') --cp; + switch (*(cur + 1)) { + case 'S': + if (cp != bp) *--bp = '.'; + bp = Format02d(bp, al.cs.second()); + break; + case 'f': + if (cp == bp) *--bp = '0'; + break; + } + result.append(bp, static_cast(cp - bp)); + pending = cur += 2; + } else if (*cur == '4' && cur + 1 != end && *(cur + 1) == 'Y') { + // Formats %E4Y. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = Format64(ep, 4, al.cs.year()); + result.append(bp, static_cast(ep - bp)); + pending = cur += 2; + } else if (std::isdigit(*cur)) { + // Possibly found %E#S or %E#f. + int n = 0; + if (const char* np = ParseInt(cur, 0, 0, 1024, &n)) { + if (*np == 'S' || *np == 'f') { + // Formats %E#S or %E#f. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = ep; + if (n > 0) { + if (n > kDigits10_64) n = kDigits10_64; + bp = Format64(bp, n, (n > 15) ? fs.count() * kExp10[n - 15] + : fs.count() / kExp10[15 - n]); + if (*np == 'S') *--bp = '.'; + } + if (*np == 'S') bp = Format02d(bp, al.cs.second()); + result.append(bp, static_cast(ep - bp)); + pending = cur = ++np; + } + } + } + } + + // Formats any remaining data. + if (end != pending) { + FormatTM(&result, std::string(pending, end), tm); + } + + return result; +} + +namespace { + +const char* ParseOffset(const char* dp, const char* mode, int* offset) { + if (dp != nullptr) { + const char first = *dp++; + if (first == '+' || first == '-') { + char sep = mode[0]; + int hours = 0; + int minutes = 0; + int seconds = 0; + const char* ap = ParseInt(dp, 2, 0, 23, &hours); + if (ap != nullptr && ap - dp == 2) { + dp = ap; + if (sep != '\0' && *ap == sep) ++ap; + const char* bp = ParseInt(ap, 2, 0, 59, &minutes); + if (bp != nullptr && bp - ap == 2) { + dp = bp; + if (sep != '\0' && *bp == sep) ++bp; + const char* cp = ParseInt(bp, 2, 0, 59, &seconds); + if (cp != nullptr && cp - bp == 2) dp = cp; + } + *offset = ((hours * 60 + minutes) * 60) + seconds; + if (first == '-') *offset = -*offset; + } else { + dp = nullptr; + } + } else if (first == 'Z') { // Zulu + *offset = 0; + } else { + dp = nullptr; + } + } + return dp; +} + +const char* ParseZone(const char* dp, std::string* zone) { + zone->clear(); + if (dp != nullptr) { + while (*dp != '\0' && !std::isspace(*dp)) zone->push_back(*dp++); + if (zone->empty()) dp = nullptr; + } + return dp; +} + +const char* ParseSubSeconds(const char* dp, detail::femtoseconds* subseconds) { + if (dp != nullptr) { + std::int_fast64_t v = 0; + std::int_fast64_t exp = 0; + const char* const bp = dp; + while (const char* cp = strchr(kDigits, *dp)) { + int d = static_cast(cp - kDigits); + if (d >= 10) break; + if (exp < 15) { + exp += 1; + v *= 10; + v += d; + } + ++dp; + } + if (dp != bp) { + v *= kExp10[15 - exp]; + *subseconds = detail::femtoseconds(v); + } else { + dp = nullptr; + } + } + return dp; +} + +// Parses a std::string into a std::tm using strptime(3). +const char* ParseTM(const char* dp, const char* fmt, std::tm* tm) { + if (dp != nullptr) { + dp = strptime(dp, fmt, tm); + } + return dp; +} + +} // namespace + +// Uses strptime(3) to parse the given input. Supports the same extended +// format specifiers as format(), although %E#S and %E*S are treated +// identically (and similarly for %E#f and %E*f). %Ez and %E*z also accept +// the same inputs. +// +// The standard specifiers from RFC3339_* (%Y, %m, %d, %H, %M, and %S) are +// handled internally so that we can normally avoid strptime() altogether +// (which is particularly helpful when the native implementation is broken). +// +// The TZ/GNU %s extension is handled internally because strptime() has to +// use localtime_r() to generate it, and that assumes the local time zone. +// +// We also handle the %z specifier to accommodate platforms that do not +// support the tm_gmtoff extension to std::tm. %Z is parsed but ignored. +bool parse(const std::string& format, const std::string& input, + const time_zone& tz, time_point* sec, + detail::femtoseconds* fs, std::string* err) { + // The unparsed input. + const char* data = input.c_str(); // NUL terminated + + // Skips leading whitespace. + while (std::isspace(*data)) ++data; + + const year_t kyearmax = std::numeric_limits::max(); + const year_t kyearmin = std::numeric_limits::min(); + + // Sets default values for unspecified fields. + bool saw_year = false; + year_t year = 1970; + std::tm tm{}; + tm.tm_year = 1970 - 1900; + tm.tm_mon = 1 - 1; // Jan + tm.tm_mday = 1; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_wday = 4; // Thu + tm.tm_yday = 0; + tm.tm_isdst = 0; + auto subseconds = detail::femtoseconds::zero(); + bool saw_offset = false; + int offset = 0; // No offset from passed tz. + std::string zone = "UTC"; + + const char* fmt = format.c_str(); // NUL terminated + bool twelve_hour = false; + bool afternoon = false; + + bool saw_percent_s = false; + std::int_fast64_t percent_s = 0; + + // Steps through format, one specifier at a time. + while (data != nullptr && *fmt != '\0') { + if (std::isspace(*fmt)) { + while (std::isspace(*data)) ++data; + while (std::isspace(*++fmt)) continue; + continue; + } + + if (*fmt != '%') { + if (*data == *fmt) { + ++data; + ++fmt; + } else { + data = nullptr; + } + continue; + } + + const char* percent = fmt; + if (*++fmt == '\0') { + data = nullptr; + continue; + } + switch (*fmt++) { + case 'Y': + // Symmetrically with FormatTime(), directly handing %Y avoids the + // tm.tm_year overflow problem. However, tm.tm_year will still be + // used by other specifiers like %D. + data = ParseInt(data, 0, kyearmin, kyearmax, &year); + if (data != nullptr) saw_year = true; + continue; + case 'm': + data = ParseInt(data, 2, 1, 12, &tm.tm_mon); + if (data != nullptr) tm.tm_mon -= 1; + continue; + case 'd': + case 'e': + data = ParseInt(data, 2, 1, 31, &tm.tm_mday); + continue; + case 'H': + data = ParseInt(data, 2, 0, 23, &tm.tm_hour); + twelve_hour = false; + continue; + case 'M': + data = ParseInt(data, 2, 0, 59, &tm.tm_min); + continue; + case 'S': + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + continue; + case 'I': + case 'l': + case 'r': // probably uses %I + twelve_hour = true; + break; + case 'R': // uses %H + case 'T': // uses %H + case 'c': // probably uses %H + case 'X': // probably uses %H + twelve_hour = false; + break; + case 'z': + data = ParseOffset(data, "", &offset); + if (data != nullptr) saw_offset = true; + continue; + case 'Z': // ignored; zone abbreviations are ambiguous + data = ParseZone(data, &zone); + continue; + case 's': + data = ParseInt(data, 0, + std::numeric_limits::min(), + std::numeric_limits::max(), + &percent_s); + if (data != nullptr) saw_percent_s = true; + continue; + case '%': + data = (*data == '%' ? data + 1 : nullptr); + continue; + case 'E': + if (*fmt == 'z' || (*fmt == '*' && *(fmt + 1) == 'z')) { + data = ParseOffset(data, ":", &offset); + if (data != nullptr) saw_offset = true; + fmt += (*fmt == 'z') ? 1 : 2; + continue; + } + if (*fmt == '*' && *(fmt + 1) == 'S') { + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + if (data != nullptr && *data == '.') { + data = ParseSubSeconds(data + 1, &subseconds); + } + fmt += 2; + continue; + } + if (*fmt == '*' && *(fmt + 1) == 'f') { + if (data != nullptr && std::isdigit(*data)) { + data = ParseSubSeconds(data, &subseconds); + } + fmt += 2; + continue; + } + if (*fmt == '4' && *(fmt + 1) == 'Y') { + const char* bp = data; + data = ParseInt(data, 4, year_t{-999}, year_t{9999}, &year); + if (data != nullptr) { + if (data - bp == 4) { + saw_year = true; + } else { + data = nullptr; // stopped too soon + } + } + fmt += 2; + continue; + } + if (std::isdigit(*fmt)) { + int n = 0; // value ignored + if (const char* np = ParseInt(fmt, 0, 0, 1024, &n)) { + if (*np == 'S') { + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + if (data != nullptr && *data == '.') { + data = ParseSubSeconds(data + 1, &subseconds); + } + fmt = ++np; + continue; + } + if (*np == 'f') { + if (data != nullptr && std::isdigit(*data)) { + data = ParseSubSeconds(data, &subseconds); + } + fmt = ++np; + continue; + } + } + } + if (*fmt == 'c') twelve_hour = false; // probably uses %H + if (*fmt == 'X') twelve_hour = false; // probably uses %H + if (*fmt != '\0') ++fmt; + break; + case 'O': + if (*fmt == 'H') twelve_hour = false; + if (*fmt == 'I') twelve_hour = true; + if (*fmt != '\0') ++fmt; + break; + } + + // Parses the current specifier. + const char* orig_data = data; + std::string spec(percent, static_cast(fmt - percent)); + data = ParseTM(data, spec.c_str(), &tm); + + // If we successfully parsed %p we need to remember whether the result + // was AM or PM so that we can adjust tm_hour before ConvertDateTime(). + // So reparse the input with a known AM hour, and check if it is shifted + // to a PM hour. + if (spec == "%p" && data != nullptr) { + std::string test_input = "1"; + test_input.append(orig_data, static_cast(data - orig_data)); + const char* test_data = test_input.c_str(); + std::tm tmp{}; + ParseTM(test_data, "%I%p", &tmp); + afternoon = (tmp.tm_hour == 13); + } + } + + // Adjust a 12-hour tm_hour value if it should be in the afternoon. + if (twelve_hour && afternoon && tm.tm_hour < 12) { + tm.tm_hour += 12; + } + + if (data == nullptr) { + if (err != nullptr) *err = "Failed to parse input"; + return false; + } + + // Skip any remaining whitespace. + while (std::isspace(*data)) ++data; + + // parse() must consume the entire input std::string. + if (*data != '\0') { + if (err != nullptr) *err = "Illegal trailing data in input string"; + return false; + } + + // If we saw %s then we ignore anything else and return that time. + if (saw_percent_s) { + *sec = FromUnixSeconds(percent_s); + *fs = detail::femtoseconds::zero(); + return true; + } + + // If we saw %z, %Ez, or %E*z then we want to interpret the parsed fields + // in UTC and then shift by that offset. Otherwise we want to interpret + // the fields directly in the passed time_zone. + time_zone ptz = saw_offset ? utc_time_zone() : tz; + + // Allows a leap second of 60 to normalize forward to the following ":00". + if (tm.tm_sec == 60) { + tm.tm_sec -= 1; + offset -= 1; + subseconds = detail::femtoseconds::zero(); + } + + if (!saw_year) { + year = year_t{tm.tm_year}; + if (year > kyearmax - 1900) { + // Platform-dependent, maybe unreachable. + if (err != nullptr) *err = "Out-of-range year"; + return false; + } + year += 1900; + } + + const int month = tm.tm_mon + 1; + civil_second cs(year, month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + + // parse() should not allow normalization. Due to the restricted field + // ranges above (see ParseInt()), the only possibility is for days to roll + // into months. That is, parsing "Sep 31" should not produce "Oct 1". + if (cs.month() != month || cs.day() != tm.tm_mday) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + + // Accounts for the offset adjustment before converting to absolute time. + if ((offset < 0 && cs > civil_second::max() + offset) || + (offset > 0 && cs < civil_second::min() + offset)) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + cs -= offset; + + const auto tp = ptz.lookup(cs).pre; + // Checks for overflow/underflow and returns an error as necessary. + if (tp == time_point::max()) { + const auto al = ptz.lookup(time_point::max()); + if (cs > al.cs) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + } + if (tp == time_point::min()) { + const auto al = ptz.lookup(time_point::min()); + if (cs < al.cs) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + } + + *sec = tp; + *fs = subseconds; + return true; +} + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_format_test.cc b/absl/time/internal/cctz/src/time_zone_format_test.cc new file mode 100644 index 000000000..6cea0360d --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_format_test.cc @@ -0,0 +1,1408 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +using std::chrono::time_point_cast; +using std::chrono::system_clock; +using std::chrono::nanoseconds; +using std::chrono::microseconds; +using std::chrono::milliseconds; +using std::chrono::seconds; +using std::chrono::minutes; +using std::chrono::hours; +using testing::HasSubstr; + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// This helper is a macro so that failed expectations show up with the +// correct line numbers. +#define ExpectTime(tp, tz, y, m, d, hh, mm, ss, off, isdst, zone) \ + do { \ + time_zone::absolute_lookup al = tz.lookup(tp); \ + EXPECT_EQ(y, al.cs.year()); \ + EXPECT_EQ(m, al.cs.month()); \ + EXPECT_EQ(d, al.cs.day()); \ + EXPECT_EQ(hh, al.cs.hour()); \ + EXPECT_EQ(mm, al.cs.minute()); \ + EXPECT_EQ(ss, al.cs.second()); \ + EXPECT_EQ(off, al.offset); \ + EXPECT_TRUE(isdst == al.is_dst); \ + EXPECT_STREQ(zone, al.abbr); \ + } while (0) + +const char RFC3339_full[] = "%Y-%m-%dT%H:%M:%E*S%Ez"; +const char RFC3339_sec[] = "%Y-%m-%dT%H:%M:%S%Ez"; + +const char RFC1123_full[] = "%a, %d %b %Y %H:%M:%S %z"; +const char RFC1123_no_wday[] = "%d %b %Y %H:%M:%S %z"; + +// A helper that tests the given format specifier by itself, and with leading +// and trailing characters. For example: TestFormatSpecifier(tp, "%a", "Thu"). +template +void TestFormatSpecifier(time_point tp, time_zone tz, const std::string& fmt, + const std::string& ans) { + EXPECT_EQ(ans, format(fmt, tp, tz)) << fmt; + EXPECT_EQ("xxx " + ans, format("xxx " + fmt, tp, tz)); + EXPECT_EQ(ans + " yyy", format(fmt + " yyy", tp, tz)); + EXPECT_EQ("xxx " + ans + " yyy", format("xxx " + fmt + " yyy", tp, tz)); +} + +} // namespace + +// +// Testing format() +// + +TEST(Format, TimePointResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + const time_point t0 = system_clock::from_time_t(1420167845) + + milliseconds(123) + microseconds(456) + + nanoseconds(789); + EXPECT_EQ("03:04:05.123456789", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05.123456", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05.123", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:00", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:00:00", + format(kFmt, time_point_cast(t0), utc)); +} + +TEST(Format, TimePointExtendedResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + const time_point tp = + std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0)) + + std::chrono::hours(12) + std::chrono::minutes(34) + + std::chrono::seconds(56); + + EXPECT_EQ( + "12:34:56.123456789012345", + detail::format(kFmt, tp, detail::femtoseconds(123456789012345), utc)); + EXPECT_EQ( + "12:34:56.012345678901234", + detail::format(kFmt, tp, detail::femtoseconds(12345678901234), utc)); + EXPECT_EQ( + "12:34:56.001234567890123", + detail::format(kFmt, tp, detail::femtoseconds(1234567890123), utc)); + EXPECT_EQ( + "12:34:56.000123456789012", + detail::format(kFmt, tp, detail::femtoseconds(123456789012), utc)); + + EXPECT_EQ("12:34:56.000000000000123", + detail::format(kFmt, tp, detail::femtoseconds(123), utc)); + EXPECT_EQ("12:34:56.000000000000012", + detail::format(kFmt, tp, detail::femtoseconds(12), utc)); + EXPECT_EQ("12:34:56.000000000000001", + detail::format(kFmt, tp, detail::femtoseconds(1), utc)); +} + +TEST(Format, Basics) { + time_zone tz = utc_time_zone(); + time_point tp = system_clock::from_time_t(0); + + // Starts with a couple basic edge cases. + EXPECT_EQ("", format("", tp, tz)); + EXPECT_EQ(" ", format(" ", tp, tz)); + EXPECT_EQ(" ", format(" ", tp, tz)); + EXPECT_EQ("xxx", format("xxx", tp, tz)); + std::string big(128, 'x'); + EXPECT_EQ(big, format(big, tp, tz)); + // Cause the 1024-byte buffer to grow. + std::string bigger(100000, 'x'); + EXPECT_EQ(bigger, format(bigger, tp, tz)); + + tp += hours(13) + minutes(4) + seconds(5); + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("1970-01-01", format("%Y-%m-%d", tp, tz)); + EXPECT_EQ("13:04:05", format("%H:%M:%S", tp, tz)); + EXPECT_EQ("13:04:05.006", format("%H:%M:%E3S", tp, tz)); + EXPECT_EQ("13:04:05.006007", format("%H:%M:%E6S", tp, tz)); + EXPECT_EQ("13:04:05.006007008", format("%H:%M:%E9S", tp, tz)); +} + +TEST(Format, PosixConversions) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%d", "01"); + TestFormatSpecifier(tp, tz, "%e", " 1"); // extension but internal support + TestFormatSpecifier(tp, tz, "%H", "00"); + TestFormatSpecifier(tp, tz, "%I", "12"); + TestFormatSpecifier(tp, tz, "%j", "001"); + TestFormatSpecifier(tp, tz, "%m", "01"); + TestFormatSpecifier(tp, tz, "%M", "00"); + TestFormatSpecifier(tp, tz, "%S", "00"); + TestFormatSpecifier(tp, tz, "%U", "00"); + TestFormatSpecifier(tp, tz, "%w", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%W", "00"); + TestFormatSpecifier(tp, tz, "%y", "70"); + TestFormatSpecifier(tp, tz, "%Y", "1970"); + TestFormatSpecifier(tp, tz, "%z", "+0000"); + TestFormatSpecifier(tp, tz, "%Z", "UTC"); + TestFormatSpecifier(tp, tz, "%%", "%"); + +#if defined(__linux__) + // SU/C99/TZ extensions + TestFormatSpecifier(tp, tz, "%C", "19"); + TestFormatSpecifier(tp, tz, "%D", "01/01/70"); + TestFormatSpecifier(tp, tz, "%F", "1970-01-01"); + TestFormatSpecifier(tp, tz, "%g", "70"); + TestFormatSpecifier(tp, tz, "%G", "1970"); + TestFormatSpecifier(tp, tz, "%k", " 0"); + TestFormatSpecifier(tp, tz, "%l", "12"); + TestFormatSpecifier(tp, tz, "%n", "\n"); + TestFormatSpecifier(tp, tz, "%R", "00:00"); + TestFormatSpecifier(tp, tz, "%t", "\t"); + TestFormatSpecifier(tp, tz, "%T", "00:00:00"); + TestFormatSpecifier(tp, tz, "%u", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%V", "01"); + TestFormatSpecifier(tp, tz, "%s", "0"); +#endif +} + +TEST(Format, LocaleSpecific) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%a", "Thu"); + TestFormatSpecifier(tp, tz, "%A", "Thursday"); + TestFormatSpecifier(tp, tz, "%b", "Jan"); + TestFormatSpecifier(tp, tz, "%B", "January"); + + // %c should at least produce the numeric year and time-of-day. + const std::string s = format("%c", tp, utc_time_zone()); + EXPECT_THAT(s, HasSubstr("1970")); + EXPECT_THAT(s, HasSubstr("00:00:00")); + + TestFormatSpecifier(tp, tz, "%p", "AM"); + TestFormatSpecifier(tp, tz, "%x", "01/01/70"); + TestFormatSpecifier(tp, tz, "%X", "00:00:00"); + +#if defined(__linux__) + // SU/C99/TZ extensions + TestFormatSpecifier(tp, tz, "%h", "Jan"); // Same as %b + TestFormatSpecifier(tp, tz, "%P", "am"); + TestFormatSpecifier(tp, tz, "%r", "12:00:00 AM"); + + // Modified conversion specifiers %E_ + TestFormatSpecifier(tp, tz, "%Ec", "Thu Jan 1 00:00:00 1970"); + TestFormatSpecifier(tp, tz, "%EC", "19"); + TestFormatSpecifier(tp, tz, "%Ex", "01/01/70"); + TestFormatSpecifier(tp, tz, "%EX", "00:00:00"); + TestFormatSpecifier(tp, tz, "%Ey", "70"); + TestFormatSpecifier(tp, tz, "%EY", "1970"); + + // Modified conversion specifiers %O_ + TestFormatSpecifier(tp, tz, "%Od", "01"); + TestFormatSpecifier(tp, tz, "%Oe", " 1"); + TestFormatSpecifier(tp, tz, "%OH", "00"); + TestFormatSpecifier(tp, tz, "%OI", "12"); + TestFormatSpecifier(tp, tz, "%Om", "01"); + TestFormatSpecifier(tp, tz, "%OM", "00"); + TestFormatSpecifier(tp, tz, "%OS", "00"); + TestFormatSpecifier(tp, tz, "%Ou", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%OU", "00"); + TestFormatSpecifier(tp, tz, "%OV", "01"); + TestFormatSpecifier(tp, tz, "%Ow", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%OW", "00"); + TestFormatSpecifier(tp, tz, "%Oy", "70"); +#endif +} + +TEST(Format, Escaping) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%%", "%"); + TestFormatSpecifier(tp, tz, "%%a", "%a"); + TestFormatSpecifier(tp, tz, "%%b", "%b"); + TestFormatSpecifier(tp, tz, "%%Ea", "%Ea"); + TestFormatSpecifier(tp, tz, "%%Es", "%Es"); + TestFormatSpecifier(tp, tz, "%%E3S", "%E3S"); + TestFormatSpecifier(tp, tz, "%%OS", "%OS"); + TestFormatSpecifier(tp, tz, "%%O3S", "%O3S"); + + // Multiple levels of escaping. + TestFormatSpecifier(tp, tz, "%%%Y", "%1970"); + TestFormatSpecifier(tp, tz, "%%%E3S", "%00.000"); + TestFormatSpecifier(tp, tz, "%%%%E3S", "%%E3S"); +} + +TEST(Format, ExtendedSeconds) { + const time_zone tz = utc_time_zone(); + + // No subseconds. + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + EXPECT_EQ("05", format("%E*S", tp, tz)); + EXPECT_EQ("05", format("%E0S", tp, tz)); + EXPECT_EQ("05.0", format("%E1S", tp, tz)); + EXPECT_EQ("05.00", format("%E2S", tp, tz)); + EXPECT_EQ("05.000", format("%E3S", tp, tz)); + EXPECT_EQ("05.0000", format("%E4S", tp, tz)); + EXPECT_EQ("05.00000", format("%E5S", tp, tz)); + EXPECT_EQ("05.000000", format("%E6S", tp, tz)); + EXPECT_EQ("05.0000000", format("%E7S", tp, tz)); + EXPECT_EQ("05.00000000", format("%E8S", tp, tz)); + EXPECT_EQ("05.000000000", format("%E9S", tp, tz)); + EXPECT_EQ("05.0000000000", format("%E10S", tp, tz)); + EXPECT_EQ("05.00000000000", format("%E11S", tp, tz)); + EXPECT_EQ("05.000000000000", format("%E12S", tp, tz)); + EXPECT_EQ("05.0000000000000", format("%E13S", tp, tz)); + EXPECT_EQ("05.00000000000000", format("%E14S", tp, tz)); + EXPECT_EQ("05.000000000000000", format("%E15S", tp, tz)); + + // With subseconds. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("05.006007008", format("%E*S", tp, tz)); + EXPECT_EQ("05", format("%E0S", tp, tz)); + EXPECT_EQ("05.0", format("%E1S", tp, tz)); + EXPECT_EQ("05.00", format("%E2S", tp, tz)); + EXPECT_EQ("05.006", format("%E3S", tp, tz)); + EXPECT_EQ("05.0060", format("%E4S", tp, tz)); + EXPECT_EQ("05.00600", format("%E5S", tp, tz)); + EXPECT_EQ("05.006007", format("%E6S", tp, tz)); + EXPECT_EQ("05.0060070", format("%E7S", tp, tz)); + EXPECT_EQ("05.00600700", format("%E8S", tp, tz)); + EXPECT_EQ("05.006007008", format("%E9S", tp, tz)); + EXPECT_EQ("05.0060070080", format("%E10S", tp, tz)); + EXPECT_EQ("05.00600700800", format("%E11S", tp, tz)); + EXPECT_EQ("05.006007008000", format("%E12S", tp, tz)); + EXPECT_EQ("05.0060070080000", format("%E13S", tp, tz)); + EXPECT_EQ("05.00600700800000", format("%E14S", tp, tz)); + EXPECT_EQ("05.006007008000000", format("%E15S", tp, tz)); + + // Times before the Unix epoch. + tp = system_clock::from_time_t(0) + microseconds(-1); + EXPECT_EQ("1969-12-31 23:59:59.999999", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); + + // Here is a "%E*S" case we got wrong for a while. While the first + // instant below is correctly rendered as "...:07.333304", the second + // one used to appear as "...:07.33330499999999999". + tp = system_clock::from_time_t(0) + microseconds(1395024427333304); + EXPECT_EQ("2014-03-17 02:47:07.333304", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); + tp += microseconds(1); + EXPECT_EQ("2014-03-17 02:47:07.333305", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); +} + +TEST(Format, ExtendedSubeconds) { + const time_zone tz = utc_time_zone(); + + // No subseconds. + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + EXPECT_EQ("0", format("%E*f", tp, tz)); + EXPECT_EQ("", format("%E0f", tp, tz)); + EXPECT_EQ("0", format("%E1f", tp, tz)); + EXPECT_EQ("00", format("%E2f", tp, tz)); + EXPECT_EQ("000", format("%E3f", tp, tz)); + EXPECT_EQ("0000", format("%E4f", tp, tz)); + EXPECT_EQ("00000", format("%E5f", tp, tz)); + EXPECT_EQ("000000", format("%E6f", tp, tz)); + EXPECT_EQ("0000000", format("%E7f", tp, tz)); + EXPECT_EQ("00000000", format("%E8f", tp, tz)); + EXPECT_EQ("000000000", format("%E9f", tp, tz)); + EXPECT_EQ("0000000000", format("%E10f", tp, tz)); + EXPECT_EQ("00000000000", format("%E11f", tp, tz)); + EXPECT_EQ("000000000000", format("%E12f", tp, tz)); + EXPECT_EQ("0000000000000", format("%E13f", tp, tz)); + EXPECT_EQ("00000000000000", format("%E14f", tp, tz)); + EXPECT_EQ("000000000000000", format("%E15f", tp, tz)); + + // With subseconds. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("006007008", format("%E*f", tp, tz)); + EXPECT_EQ("", format("%E0f", tp, tz)); + EXPECT_EQ("0", format("%E1f", tp, tz)); + EXPECT_EQ("00", format("%E2f", tp, tz)); + EXPECT_EQ("006", format("%E3f", tp, tz)); + EXPECT_EQ("0060", format("%E4f", tp, tz)); + EXPECT_EQ("00600", format("%E5f", tp, tz)); + EXPECT_EQ("006007", format("%E6f", tp, tz)); + EXPECT_EQ("0060070", format("%E7f", tp, tz)); + EXPECT_EQ("00600700", format("%E8f", tp, tz)); + EXPECT_EQ("006007008", format("%E9f", tp, tz)); + EXPECT_EQ("0060070080", format("%E10f", tp, tz)); + EXPECT_EQ("00600700800", format("%E11f", tp, tz)); + EXPECT_EQ("006007008000", format("%E12f", tp, tz)); + EXPECT_EQ("0060070080000", format("%E13f", tp, tz)); + EXPECT_EQ("00600700800000", format("%E14f", tp, tz)); + EXPECT_EQ("006007008000000", format("%E15f", tp, tz)); + + // Times before the Unix epoch. + tp = system_clock::from_time_t(0) + microseconds(-1); + EXPECT_EQ("1969-12-31 23:59:59.999999", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); + + // Here is a "%E*S" case we got wrong for a while. While the first + // instant below is correctly rendered as "...:07.333304", the second + // one used to appear as "...:07.33330499999999999". + tp = system_clock::from_time_t(0) + microseconds(1395024427333304); + EXPECT_EQ("2014-03-17 02:47:07.333304", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); + tp += microseconds(1); + EXPECT_EQ("2014-03-17 02:47:07.333305", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); +} + +TEST(Format, CompareExtendSecondsVsSubseconds) { + const time_zone tz = utc_time_zone(); + + // This test case illustrates the differences/similarities between: + // fmt_A: %ES + // fmt_B: %S.%Ef + auto fmt_A = [](const std::string& prec) { return "%E" + prec + "S"; }; + auto fmt_B = [](const std::string& prec) { return "%S.%E" + prec + "f"; }; + + // No subseconds: + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + // ... %E*S and %S.%E*f are different. + EXPECT_EQ("05", format(fmt_A("*"), tp, tz)); + EXPECT_EQ("05.0", format(fmt_B("*"), tp, tz)); + // ... %E0S and %S.%E0f are different. + EXPECT_EQ("05", format(fmt_A("0"), tp, tz)); + EXPECT_EQ("05.", format(fmt_B("0"), tp, tz)); + // ... %ES and %S.%Ef are the same for prec in [1:15]. + for (int prec = 1; prec <= 15; ++prec) { + const std::string a = format(fmt_A(std::to_string(prec)), tp, tz); + const std::string b = format(fmt_B(std::to_string(prec)), tp, tz); + EXPECT_EQ(a, b) << "prec=" << prec; + } + + // With subseconds: + // ... %E*S and %S.%E*f are the same. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("05.006007008", format(fmt_A("*"), tp, tz)); + EXPECT_EQ("05.006007008", format(fmt_B("*"), tp, tz)); + // ... %E0S and %S.%E0f are different. + EXPECT_EQ("05", format(fmt_A("0"), tp, tz)); + EXPECT_EQ("05.", format(fmt_B("0"), tp, tz)); + // ... %ES and %S.%Ef are the same for prec in [1:15]. + for (int prec = 1; prec <= 15; ++prec) { + const std::string a = format(fmt_A(std::to_string(prec)), tp, tz); + const std::string b = format(fmt_B(std::to_string(prec)), tp, tz); + EXPECT_EQ(a, b) << "prec=" << prec; + } +} + +TEST(Format, ExtendedOffset) { + auto tp = system_clock::from_time_t(0); + + time_zone tz = utc_time_zone(); + TestFormatSpecifier(tp, tz, "%Ez", "+00:00"); + + EXPECT_TRUE(load_time_zone("America/New_York", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "-05:00"); + + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "-08:00"); + + EXPECT_TRUE(load_time_zone("Australia/Sydney", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "+10:00"); + + EXPECT_TRUE(load_time_zone("Africa/Monrovia", &tz)); + // The true offset is -00:44:30 but %z only gives (truncated) minutes. + TestFormatSpecifier(tp, tz, "%z", "-0044"); + TestFormatSpecifier(tp, tz, "%Ez", "-00:44"); +} + +TEST(Format, ExtendedSecondOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + time_zone tz; + + EXPECT_TRUE(load_time_zone("America/New_York", &tz)); + tp = convert(civil_second(1883, 11, 18, 16, 59, 59), utc); + if (tz.lookup(tp).offset == -5 * 60 * 60) { + // We're likely dealing with zoneinfo that doesn't support really old + // timestamps, so America/New_York never looks to be on local mean time. + } else { + TestFormatSpecifier(tp, tz, "%E*z", "-04:56:02"); + TestFormatSpecifier(tp, tz, "%Ez", "-04:56"); + } + tp += seconds(1); + TestFormatSpecifier(tp, tz, "%E*z", "-05:00:00"); + + EXPECT_TRUE(load_time_zone("Europe/Moscow", &tz)); + tp = convert(civil_second(1919, 6, 30, 23, 59, 59), utc); + TestFormatSpecifier(tp, tz, "%E*z", "+04:31:19"); + TestFormatSpecifier(tp, tz, "%Ez", "+04:31"); + tp += seconds(1); + TestFormatSpecifier(tp, tz, "%E*z", "+04:00:00"); +} + +TEST(Format, ExtendedYears) { + const time_zone utc = utc_time_zone(); + const char e4y_fmt[] = "%E4Y%m%d"; // no separators + + // %E4Y zero-pads the year to produce at least 4 chars, including the sign. + auto tp = convert(civil_second(-999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-9991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-99, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-9, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0091127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-1, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0011127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(0, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00001127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(1, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00011127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(9, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00091127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(99, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("09991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(9999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("99991127", format(e4y_fmt, tp, utc)); + + // When the year is outside [-999:9999], more than 4 chars are produced. + tp = convert(civil_second(-1000, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-10001127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(10000, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("100001127", format(e4y_fmt, tp, utc)); +} + +TEST(Format, RFC3339Format) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + + time_point tp = + convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(100); + EXPECT_EQ("1977-06-28T09:08:07.1-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(20); + EXPECT_EQ("1977-06-28T09:08:07.12-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(3); + EXPECT_EQ("1977-06-28T09:08:07.123-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(400); + EXPECT_EQ("1977-06-28T09:08:07.1234-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(50); + EXPECT_EQ("1977-06-28T09:08:07.12345-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(6); + EXPECT_EQ("1977-06-28T09:08:07.123456-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(700); + EXPECT_EQ("1977-06-28T09:08:07.1234567-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(80); + EXPECT_EQ("1977-06-28T09:08:07.12345678-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(9); + EXPECT_EQ("1977-06-28T09:08:07.123456789-07:00", + format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); +} + +TEST(Format, RFC1123Format) { // locale specific + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + + auto tp = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + EXPECT_EQ("Tue, 28 Jun 1977 09:08:07 -0700", format(RFC1123_full, tp, tz)); + EXPECT_EQ("28 Jun 1977 09:08:07 -0700", format(RFC1123_no_wday, tp, tz)); +} + +// +// Testing parse() +// + +TEST(Parse, TimePointResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + + time_point tp_ns; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456789", utc, &tp_ns)); + EXPECT_EQ("03:04:05.123456789", format(kFmt, tp_ns, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_ns)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_ns, utc)); + + time_point tp_us; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456789", utc, &tp_us)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_us, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_us)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_us, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_us)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_us, utc)); + + time_point tp_ms; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_ms)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_ms, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_ms)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_ms, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_ms)); + EXPECT_EQ("03:04:05", format(kFmt, tp_ms, utc)); + + time_point tp_s; + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_s)); + EXPECT_EQ("03:04:05", format(kFmt, tp_s, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_s)); + EXPECT_EQ("03:04:05", format(kFmt, tp_s, utc)); + + time_point tp_m; + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_m)); + EXPECT_EQ("03:04:00", format(kFmt, tp_m, utc)); + + time_point tp_h; + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_h)); + EXPECT_EQ("03:00:00", format(kFmt, tp_h, utc)); +} + +TEST(Parse, TimePointExtendedResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + + time_point tp; + detail::femtoseconds fs; + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.123456789012345", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.123456789012345", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.012345678901234", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.012345678901234", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.001234567890123", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.001234567890123", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000123", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000123", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000012", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000012", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000001", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000001", detail::format(kFmt, tp, fs, utc)); +} + +TEST(Parse, Basics) { + time_zone tz = utc_time_zone(); + time_point tp = system_clock::from_time_t(1234567890); + + // Simple edge cases. + EXPECT_TRUE(parse("", "", tz, &tp)); + EXPECT_EQ(system_clock::from_time_t(0), tp); // everything defaulted + EXPECT_TRUE(parse(" ", " ", tz, &tp)); + EXPECT_TRUE(parse(" ", " ", tz, &tp)); + EXPECT_TRUE(parse("x", "x", tz, &tp)); + EXPECT_TRUE(parse("xxx", "xxx", tz, &tp)); + + EXPECT_TRUE( + parse("%Y-%m-%d %H:%M:%S %z", "2013-06-28 19:08:09 -0800", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 29, 3, 8, 9, 0, false, "UTC"); +} + +TEST(Parse, WithTimeZone) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + time_point tp; + + // We can parse a std::string without a UTC offset if we supply a timezone. + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2013-06-28 19:08:09", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 19, 8, 9, -7 * 60 * 60, true, "PDT"); + + // But the timezone is ignored when a UTC offset is present. + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S %z", "2013-06-28 19:08:09 +0800", + utc_time_zone(), &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 19 - 8 - 7, 8, 9, -7 * 60 * 60, true, "PDT"); + + // Check a skipped time (a Spring DST transition). parse() returns + // the preferred-offset result, as defined for ConvertDateTime(). + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2011-03-13 02:15:00", tz, &tp)); + ExpectTime(tp, tz, 2011, 3, 13, 3, 15, 0, -7 * 60 * 60, true, "PDT"); + + // Check a repeated time (a Fall DST transition). parse() returns + // the preferred-offset result, as defined for ConvertDateTime(). + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2011-11-06 01:15:00", tz, &tp)); + ExpectTime(tp, tz, 2011, 11, 6, 1, 15, 0, -7 * 60 * 60, true, "PDT"); +} + +TEST(Parse, LeapSecond) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + time_point tp; + + // ":59" -> ":59" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:59-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 8, 59, -7 * 60 * 60, true, "PDT"); + + // ":59.5" -> ":59.5" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:59.5-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 8, 59, -7 * 60 * 60, true, "PDT"); + + // ":60" -> ":00" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:60-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 9, 0, -7 * 60 * 60, true, "PDT"); + + // ":60.5" -> ":00.0" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:60.5-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 9, 0, -7 * 60 * 60, true, "PDT"); + + // ":61" -> error + EXPECT_FALSE(parse(RFC3339_full, "2013-06-28T07:08:61-08:00", tz, &tp)); +} + +TEST(Parse, ErrorCases) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + // Illegal trailing data. + EXPECT_FALSE(parse("%S", "123", tz, &tp)); + + // Can't parse an illegal format specifier. + EXPECT_FALSE(parse("%Q", "x", tz, &tp)); + + // Fails because of trailing, unparsed data "blah". + EXPECT_FALSE(parse("%m-%d", "2-3 blah", tz, &tp)); + + // Trailing whitespace is allowed. + EXPECT_TRUE(parse("%m-%d", "2-3 ", tz, &tp)); + EXPECT_EQ(2, convert(tp, utc_time_zone()).month()); + EXPECT_EQ(3, convert(tp, utc_time_zone()).day()); + + // Feb 31 requires normalization. + EXPECT_FALSE(parse("%m-%d", "2-31", tz, &tp)); + + // Check that we cannot have spaces in UTC offsets. + EXPECT_TRUE(parse("%z", "-0203", tz, &tp)); + EXPECT_FALSE(parse("%z", "- 2 3", tz, &tp)); + EXPECT_TRUE(parse("%Ez", "-02:03", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "- 2: 3", tz, &tp)); + + // Check that we reject other malformed UTC offsets. + EXPECT_FALSE(parse("%Ez", "+-08:00", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "-+08:00", tz, &tp)); + + // Check that we do not accept "-0" in fields that allow zero. + EXPECT_FALSE(parse("%Y", "-0", tz, &tp)); + EXPECT_FALSE(parse("%E4Y", "-0", tz, &tp)); + EXPECT_FALSE(parse("%H", "-0", tz, &tp)); + EXPECT_FALSE(parse("%M", "-0", tz, &tp)); + EXPECT_FALSE(parse("%S", "-0", tz, &tp)); + EXPECT_FALSE(parse("%z", "+-000", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "+-0:00", tz, &tp)); + EXPECT_FALSE(parse("%z", "-00-0", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "-00:-0", tz, &tp)); +} + +TEST(Parse, PosixConversions) { + time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + const auto reset = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + + tp = reset; + EXPECT_TRUE(parse("%d", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); + + // %e is an extension, but is supported internally. + tp = reset; + EXPECT_TRUE(parse("%e", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); // Equivalent to %d + + tp = reset; + EXPECT_TRUE(parse("%H", "17", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%I", "5", tz, &tp)); + EXPECT_EQ(5, convert(tp, tz).hour()); + + // %j is parsed but ignored. + EXPECT_TRUE(parse("%j", "32", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%m", "11", tz, &tp)); + EXPECT_EQ(11, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%M", "33", tz, &tp)); + EXPECT_EQ(33, convert(tp, tz).minute()); + + tp = reset; + EXPECT_TRUE(parse("%S", "55", tz, &tp)); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %U is parsed but ignored. + EXPECT_TRUE(parse("%U", "15", tz, &tp)); + + // %w is parsed but ignored. + EXPECT_TRUE(parse("%w", "2", tz, &tp)); + + // %W is parsed but ignored. + EXPECT_TRUE(parse("%W", "22", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%y", "04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%Y", "2004", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + EXPECT_TRUE(parse("%%", "%", tz, &tp)); + +#if defined(__linux__) + // SU/C99/TZ extensions + + // Because we handle each (non-internal) specifier in a separate call + // to strptime(), there is no way to group %C and %y together. So we + // just skip the %C/%y case. +#if 0 + tp = reset; + EXPECT_TRUE(parse("%C %y", "20 04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); +#endif + + tp = reset; + EXPECT_TRUE(parse("%D", "02/03/04", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + EXPECT_EQ(3, convert(tp, tz).day()); + EXPECT_EQ(2004, convert(tp, tz).year()); + + EXPECT_TRUE(parse("%n", "\n", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%R", "03:44", tz, &tp)); + EXPECT_EQ(3, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + + EXPECT_TRUE(parse("%t", "\t\v\f\n\r ", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%T", "03:44:55", tz, &tp)); + EXPECT_EQ(3, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + tp = reset; + EXPECT_TRUE(parse("%s", "1234567890", tz, &tp)); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // %s conversion, like %z/%Ez, pays no heed to the optional zone. + time_zone lax; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &lax)); + tp = reset; + EXPECT_TRUE(parse("%s", "1234567890", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // This is most important when the time has the same YMDhms + // breakdown in the zone as some other time. For example, ... + // 1414917000 in US/Pacific -> Sun Nov 2 01:30:00 2014 (PDT) + // 1414920600 in US/Pacific -> Sun Nov 2 01:30:00 2014 (PST) + tp = reset; + EXPECT_TRUE(parse("%s", "1414917000", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1414917000), tp); + tp = reset; + EXPECT_TRUE(parse("%s", "1414920600", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1414920600), tp); +#endif +} + +TEST(Parse, LocaleSpecific) { + time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + const auto reset = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + + // %a is parsed but ignored. + EXPECT_TRUE(parse("%a", "Mon", tz, &tp)); + + // %A is parsed but ignored. + EXPECT_TRUE(parse("%A", "Monday", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%b", "Feb", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%B", "February", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + + // %p is parsed but ignored if it's alone. But it's used with %I. + EXPECT_TRUE(parse("%p", "AM", tz, &tp)); + tp = reset; + EXPECT_TRUE(parse("%I %p", "5 PM", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%x", "02/03/04", tz, &tp)); + if (convert(tp, tz).month() == 2) { + EXPECT_EQ(3, convert(tp, tz).day()); + } else { + EXPECT_EQ(2, convert(tp, tz).day()); + EXPECT_EQ(3, convert(tp, tz).month()); + } + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%X", "15:44:55", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + +#if defined(__linux__) + // SU/C99/TZ extensions + + tp = reset; + EXPECT_TRUE(parse("%h", "Feb", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); // Equivalent to %b + + tp = reset; + EXPECT_TRUE(parse("%l %p", "5 PM", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%r", "03:44:55 PM", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + tp = reset; + EXPECT_TRUE(parse("%Ec", "Tue Nov 19 05:06:07 2013", tz, &tp)); + EXPECT_EQ(convert(civil_second(2013, 11, 19, 5, 6, 7), tz), tp); + + // Modified conversion specifiers %E_ + + tp = reset; + EXPECT_TRUE(parse("%Ex", "02/03/04", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + EXPECT_EQ(3, convert(tp, tz).day()); + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%EX", "15:44:55", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %Ey, the year offset from %EC, doesn't really make sense alone as there + // is no way to represent it in tm_year (%EC is not simply the century). + // Yet, because we handle each (non-internal) specifier in a separate call + // to strptime(), there is no way to group %EC and %Ey either. So we just + // skip the %EC and %Ey cases. + + tp = reset; + EXPECT_TRUE(parse("%EY", "2004", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + // Modified conversion specifiers %O_ + + tp = reset; + EXPECT_TRUE(parse("%Od", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); + + tp = reset; + EXPECT_TRUE(parse("%Oe", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); // Equivalent to %d + + tp = reset; + EXPECT_TRUE(parse("%OH", "17", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%OI", "5", tz, &tp)); + EXPECT_EQ(5, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%Om", "11", tz, &tp)); + EXPECT_EQ(11, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%OM", "33", tz, &tp)); + EXPECT_EQ(33, convert(tp, tz).minute()); + + tp = reset; + EXPECT_TRUE(parse("%OS", "55", tz, &tp)); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %OU is parsed but ignored. + EXPECT_TRUE(parse("%OU", "15", tz, &tp)); + + // %Ow is parsed but ignored. + EXPECT_TRUE(parse("%Ow", "2", tz, &tp)); + + // %OW is parsed but ignored. + EXPECT_TRUE(parse("%OW", "22", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%Oy", "04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); +#endif +} + +TEST(Parse, ExtendedSeconds) { + const time_zone tz = utc_time_zone(); + const time_point unix_epoch = system_clock::from_time_t(0); + + // All %ES cases are treated the same as %E*S on input. + auto precisions = {"*", "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12", "13", "14", "15"}; + for (const std::string& prec : precisions) { + const std::string fmt = "%E" + prec + "S"; + SCOPED_TRACE(fmt); + time_point tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "5", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.0", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.00", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.6", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.60", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.600", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.67", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.670", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.678", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(678), tp); + } + + // Here is a "%E*S" case we got wrong for a while. The fractional + // part of the first instant is less than 2^31 and was correctly + // parsed, while the second (and any subsecond field >=2^31) failed. + time_point tp = unix_epoch; + EXPECT_TRUE(parse("%E*S", "0.2147483647", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + tp = unix_epoch; + EXPECT_TRUE(parse("%E*S", "0.2147483648", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + + // We should also be able to specify long strings of digits far + // beyond the current resolution and have them convert the same way. + tp = unix_epoch; + EXPECT_TRUE(parse( + "%E*S", "0.214748364801234567890123456789012345678901234567890123456789", + tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); +} + +TEST(Parse, ExtendedSecondsScan) { + const time_zone tz = utc_time_zone(); + time_point tp; + for (int ms = 0; ms < 1000; ms += 111) { + for (int us = 0; us < 1000; us += 27) { + const int micros = ms * 1000 + us; + for (int ns = 0; ns < 1000; ns += 9) { + const auto expected = + system_clock::from_time_t(0) + nanoseconds(micros * 1000 + ns); + std::ostringstream oss; + oss << "0." << std::setfill('0') << std::setw(3); + oss << ms << std::setw(3) << us << std::setw(3) << ns; + const std::string input = oss.str(); + EXPECT_TRUE(parse("%E*S", input, tz, &tp)); + EXPECT_EQ(expected, tp) << input; + } + } + } +} + +TEST(Parse, ExtendedSubeconds) { + const time_zone tz = utc_time_zone(); + const time_point unix_epoch = system_clock::from_time_t(0); + + // All %Ef cases are treated the same as %E*f on input. + auto precisions = {"*", "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12", "13", "14", "15"}; + for (const std::string& prec : precisions) { + const std::string fmt = "%E" + prec + "f"; + SCOPED_TRACE(fmt); + time_point tp = unix_epoch - seconds(1); + EXPECT_TRUE(parse(fmt, "", tz, &tp)); + EXPECT_EQ(unix_epoch, tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "6", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "60", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "600", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "67", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "670", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "678", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(678), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "6789", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(678) + microseconds(900), tp); + } + + // Here is a "%E*f" case we got wrong for a while. The fractional + // part of the first instant is less than 2^31 and was correctly + // parsed, while the second (and any subsecond field >=2^31) failed. + time_point tp = unix_epoch; + EXPECT_TRUE(parse("%E*f", "2147483647", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + tp = unix_epoch; + EXPECT_TRUE(parse("%E*f", "2147483648", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + + // We should also be able to specify long strings of digits far + // beyond the current resolution and have them convert the same way. + tp = unix_epoch; + EXPECT_TRUE(parse( + "%E*f", "214748364801234567890123456789012345678901234567890123456789", + tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); +} + +TEST(Parse, ExtendedSubecondsScan) { + time_point tp; + const time_zone tz = utc_time_zone(); + for (int ms = 0; ms < 1000; ms += 111) { + for (int us = 0; us < 1000; us += 27) { + const int micros = ms * 1000 + us; + for (int ns = 0; ns < 1000; ns += 9) { + std::ostringstream oss; + oss << std::setfill('0') << std::setw(3) << ms; + oss << std::setw(3) << us << std::setw(3) << ns; + const std::string nanos = oss.str(); + const auto expected = + system_clock::from_time_t(0) + nanoseconds(micros * 1000 + ns); + for (int ps = 0; ps < 1000; ps += 250) { + std::ostringstream oss; + oss << std::setfill('0') << std::setw(3) << ps; + const std::string input = nanos + oss.str() + "999"; + EXPECT_TRUE(parse("%E*f", input, tz, &tp)); + EXPECT_EQ(expected + nanoseconds(ps) / 1000, tp) << input; + } + } + } + } +} + +TEST(Parse, ExtendedOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // %z against +-HHMM. + EXPECT_TRUE(parse("%z", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%z", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%z", "-123", utc, &tp)); + + // %z against +-HH. + EXPECT_TRUE(parse("%z", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%z", "-1", utc, &tp)); + + // %Ez against +-HH:MM. + EXPECT_TRUE(parse("%Ez", "+00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12:3", utc, &tp)); + + // %Ez against +-HHMM. + EXPECT_TRUE(parse("%Ez", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-123", utc, &tp)); + + // %Ez against +-HH. + EXPECT_TRUE(parse("%Ez", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-1", utc, &tp)); +} + +TEST(Parse, ExtendedSecondOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // %Ez against +-HH:MM:SS. + EXPECT_TRUE(parse("%Ez", "+00:00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12:34:5", utc, &tp)); + + // %Ez against +-HHMMSS. + EXPECT_TRUE(parse("%Ez", "+000000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%Ez", "+123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12345", utc, &tp)); + + // %E*z against +-HH:MM:SS. + EXPECT_TRUE(parse("%E*z", "+00:00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12:34:5", utc, &tp)); + + // %E*z against +-HHMMSS. + EXPECT_TRUE(parse("%E*z", "+000000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%E*z", "+123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12345", utc, &tp)); + + // %E*z against +-HH:MM. + EXPECT_TRUE(parse("%E*z", "+00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12:3", utc, &tp)); + + // %E*z against +-HHMM. + EXPECT_TRUE(parse("%E*z", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-123", utc, &tp)); + + // %E*z against +-HH. + EXPECT_TRUE(parse("%E*z", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-1", utc, &tp)); +} + +TEST(Parse, ExtendedYears) { + const time_zone utc = utc_time_zone(); + const char e4y_fmt[] = "%E4Y%m%d"; // no separators + time_point tp; + + // %E4Y consumes exactly four chars, including any sign. + EXPECT_TRUE(parse(e4y_fmt, "-9991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-999, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-99, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0091127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-9, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0011127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-1, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00001127", utc, &tp)); + EXPECT_EQ(convert(civil_second(0, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00011127", utc, &tp)); + EXPECT_EQ(convert(civil_second(1, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00091127", utc, &tp)); + EXPECT_EQ(convert(civil_second(9, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(99, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "09991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(999, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "99991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(9999, 11, 27, 0, 0, 0), utc), tp); + + // When the year is outside [-999:9999], the parse fails. + EXPECT_FALSE(parse(e4y_fmt, "-10001127", utc, &tp)); + EXPECT_FALSE(parse(e4y_fmt, "100001127", utc, &tp)); +} + +TEST(Parse, RFC3339Format) { + const time_zone tz = utc_time_zone(); + time_point tp; + EXPECT_TRUE(parse(RFC3339_sec, "2014-02-12T20:21:00+00:00", tz, &tp)); + ExpectTime(tp, tz, 2014, 2, 12, 20, 21, 0, 0, false, "UTC"); + + // Check that %Ez also accepts "Z" as a synonym for "+00:00". + time_point tp2; + EXPECT_TRUE(parse(RFC3339_sec, "2014-02-12T20:21:00Z", tz, &tp2)); + EXPECT_EQ(tp, tp2); +} + +TEST(Parse, MaxRange) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // tests the upper limit using +00:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "292277026596-12-04T15:30:07+00:00", utc, &tp)); + EXPECT_EQ(tp, time_point::max()); + EXPECT_FALSE( + parse(RFC3339_sec, "292277026596-12-04T15:30:08+00:00", utc, &tp)); + + // tests the upper limit using -01:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "292277026596-12-04T14:30:07-01:00", utc, &tp)); + EXPECT_EQ(tp, time_point::max()); + EXPECT_FALSE( + parse(RFC3339_sec, "292277026596-12-04T15:30:07-01:00", utc, &tp)); + + // tests the lower limit using +00:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:52+00:00", utc, &tp)); + EXPECT_EQ(tp, time_point::min()); + EXPECT_FALSE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:51+00:00", utc, &tp)); + + // tests the lower limit using +01:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "-292277022657-01-27T09:29:52+01:00", utc, &tp)); + EXPECT_EQ(tp, time_point::min()); + EXPECT_FALSE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:51+01:00", utc, &tp)); + + // tests max/min civil-second overflow + EXPECT_FALSE(parse(RFC3339_sec, "9223372036854775807-12-31T23:59:59-00:01", + utc, &tp)); + EXPECT_FALSE(parse(RFC3339_sec, "-9223372036854775808-01-01T00:00:00+00:01", + utc, &tp)); + + // TODO: Add tests that parsing times with fractional seconds overflow + // appropriately. This can't be done until cctz::parse() properly detects + // overflow when combining the chrono seconds and femto. +} + +// +// Roundtrip test for format()/parse(). +// + +TEST(FormatParse, RoundTrip) { + time_zone lax; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &lax)); + const auto in = convert(civil_second(1977, 6, 28, 9, 8, 7), lax); + const auto subseconds = nanoseconds(654321); + + // RFC3339, which renders subseconds. + { + time_point out; + const std::string s = format(RFC3339_full, in + subseconds, lax); + EXPECT_TRUE(parse(RFC3339_full, s, lax, &out)) << s; + EXPECT_EQ(in + subseconds, out); // RFC3339_full includes %Ez + } + + // RFC1123, which only does whole seconds. + { + time_point out; + const std::string s = format(RFC1123_full, in, lax); + EXPECT_TRUE(parse(RFC1123_full, s, lax, &out)) << s; + EXPECT_EQ(in, out); // RFC1123_full includes %z + } + +#if defined(_WIN32) || defined(_WIN64) + // Initial investigations indicate the %c does not roundtrip on Windows. + // TODO: Figure out what is going on here (perhaps a locale problem). +#else + // Even though we don't know what %c will produce, it should roundtrip, + // but only in the 0-offset timezone. + { + time_point out; + time_zone utc = utc_time_zone(); + const std::string s = format("%c", in, utc); + EXPECT_TRUE(parse("%c", s, utc, &out)) << s; + EXPECT_EQ(in, out); + } +#endif +} + +TEST(FormatParse, RoundTripDistantFuture) { + const time_zone utc = utc_time_zone(); + const time_point in = time_point::max(); + const std::string s = format(RFC3339_full, in, utc); + time_point out; + EXPECT_TRUE(parse(RFC3339_full, s, utc, &out)) << s; + EXPECT_EQ(in, out); +} + +TEST(FormatParse, RoundTripDistantPast) { + const time_zone utc = utc_time_zone(); + const time_point in = time_point::min(); + const std::string s = format(RFC3339_full, in, utc); + time_point out; + EXPECT_TRUE(parse(RFC3339_full, s, utc, &out)) << s; + EXPECT_EQ(in, out); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_if.cc b/absl/time/internal/cctz/src/time_zone_if.cc new file mode 100644 index 000000000..380834a17 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_if.cc @@ -0,0 +1,41 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "time_zone_if.h" +#include "time_zone_info.h" +#include "time_zone_libc.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +std::unique_ptr TimeZoneIf::Load(const std::string& name) { + // Support "libc:localtime" and "libc:*" to access the legacy + // localtime and UTC support respectively from the C library. + if (name.compare(0, 5, "libc:") == 0) { + return std::unique_ptr(new TimeZoneLibC(name.substr(5))); + } + + // Otherwise use the "zoneinfo" implementation by default. + std::unique_ptr tz(new TimeZoneInfo); + if (!tz->Load(name)) tz.reset(); + return std::unique_ptr(tz.release()); +} + +// Defined out-of-line to avoid emitting a weak vtable in all TUs. +TimeZoneIf::~TimeZoneIf() {} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_if.h b/absl/time/internal/cctz/src/time_zone_if.h new file mode 100644 index 000000000..ce4da1b72 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_if.h @@ -0,0 +1,70 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A simple interface used to hide time-zone complexities from time_zone::Impl. +// Subclasses implement the functions for civil-time conversions in the zone. +class TimeZoneIf { + public: + // A factory function for TimeZoneIf implementations. + static std::unique_ptr Load(const std::string& name); + + virtual ~TimeZoneIf(); + + virtual time_zone::absolute_lookup BreakTime( + const time_point& tp) const = 0; + virtual time_zone::civil_lookup MakeTime( + const civil_second& cs) const = 0; + + virtual std::string Description() const = 0; + virtual bool NextTransition(time_point* tp) const = 0; + virtual bool PrevTransition(time_point* tp) const = 0; + + protected: + TimeZoneIf() {} +}; + +// Convert between time_point and a count of seconds since +// the Unix epoch. We assume that the std::chrono::system_clock and the +// Unix clock are second aligned, but not that they share an epoch. +inline std::int_fast64_t ToUnixSeconds(const time_point& tp) { + return (tp - std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0))) + .count(); +} +inline time_point FromUnixSeconds(std::int_fast64_t t) { + return std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0)) + + sys_seconds(t); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ diff --git a/absl/time/internal/cctz/src/time_zone_impl.cc b/absl/time/internal/cctz/src/time_zone_impl.cc new file mode 100644 index 000000000..b3f635f78 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_impl.cc @@ -0,0 +1,117 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "time_zone_impl.h" + +#include +#include +#include +#include + +#include "time_zone_fixed.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// time_zone::Impls are linked into a map to support fast lookup by name. +using TimeZoneImplByName = + std::unordered_map; +TimeZoneImplByName* time_zone_map = nullptr; + +// Mutual exclusion for time_zone_map. +std::mutex time_zone_mutex; + +} // namespace + +time_zone time_zone::Impl::UTC() { + return time_zone(UTCImpl()); +} + +bool time_zone::Impl::LoadTimeZone(const std::string& name, time_zone* tz) { + const time_zone::Impl* const utc_impl = UTCImpl(); + + // First check for UTC (which is never a key in time_zone_map). + auto offset = sys_seconds::zero(); + if (FixedOffsetFromName(name, &offset) && offset == sys_seconds::zero()) { + *tz = time_zone(utc_impl); + return true; + } + + // Then check, under a shared lock, whether the time zone has already + // been loaded. This is the common path. TODO: Move to shared_mutex. + { + std::lock_guard lock(time_zone_mutex); + if (time_zone_map != nullptr) { + TimeZoneImplByName::const_iterator itr = time_zone_map->find(name); + if (itr != time_zone_map->end()) { + *tz = time_zone(itr->second); + return itr->second != utc_impl; + } + } + } + + // Now check again, under an exclusive lock. + std::lock_guard lock(time_zone_mutex); + if (time_zone_map == nullptr) time_zone_map = new TimeZoneImplByName; + const Impl*& impl = (*time_zone_map)[name]; + if (impl == nullptr) { + // The first thread in loads the new time zone. + Impl* new_impl = new Impl(name); + new_impl->zone_ = TimeZoneIf::Load(new_impl->name_); + if (new_impl->zone_ == nullptr) { + delete new_impl; // free the nascent Impl + impl = utc_impl; // and fallback to UTC + } else { + impl = new_impl; // install new time zone + } + } + *tz = time_zone(impl); + return impl != utc_impl; +} + +const time_zone::Impl& time_zone::Impl::get(const time_zone& tz) { + if (tz.impl_ == nullptr) { + // Dereferencing an implicit-UTC time_zone is expected to be + // rare, so we don't mind paying a small synchronization cost. + return *UTCImpl(); + } + return *tz.impl_; +} + +void time_zone::Impl::ClearTimeZoneMapTestOnly() { + std::lock_guard lock(time_zone_mutex); + if (time_zone_map != nullptr) { + // Existing time_zone::Impl* entries are in the wild, so we simply + // leak them. Future requests will result in reloading the data. + time_zone_map->clear(); + } +} + +time_zone::Impl::Impl(const std::string& name) : name_(name) {} + +const time_zone::Impl* time_zone::Impl::UTCImpl() { + static Impl* utc_impl = [] { + Impl* impl = new Impl("UTC"); + impl->zone_ = TimeZoneIf::Load(impl->name_); // never fails + return impl; + }(); + return utc_impl; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_impl.h b/absl/time/internal/cctz/src/time_zone_impl.h new file mode 100644 index 000000000..2c1c30b69 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_impl.h @@ -0,0 +1,97 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ + +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" +#include "time_zone_if.h" +#include "time_zone_info.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// time_zone::Impl is the internal object referenced by a cctz::time_zone. +class time_zone::Impl { + public: + // The UTC time zone. Also used for other time zones that fail to load. + static time_zone UTC(); + + // Load a named time zone. Returns false if the name is invalid, or if + // some other kind of error occurs. Note that loading "UTC" never fails. + static bool LoadTimeZone(const std::string& name, time_zone* tz); + + // Dereferences the time_zone to obtain its Impl. + static const time_zone::Impl& get(const time_zone& tz); + + // Clears the map of cached time zones. Primarily for use in benchmarks + // that gauge the performance of loading/parsing the time-zone data. + static void ClearTimeZoneMapTestOnly(); + + // The primary key is the time-zone ID (e.g., "America/New_York"). + const std::string& name() const { return name_; } + + // Breaks a time_point down to civil-time components in this time zone. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const { + return zone_->BreakTime(tp); + } + + // Converts the civil-time components in this time zone into a time_point. + // That is, the opposite of BreakTime(). The requested civil time may be + // ambiguous or illegal due to a change of UTC offset. + time_zone::civil_lookup MakeTime(const civil_second& cs) const { + return zone_->MakeTime(cs); + } + + // Returns an implementation-specific description of this time zone. + std::string Description() const { return zone_->Description(); } + + // Finds the time of the next/previous offset change in this time zone. + // + // By definition, NextTransition(&tp) returns false when tp has its + // maximum value, and PrevTransition(&tp) returns false when tp has its + // mimimum value. If the zone has no transitions, the result will also + // be false no matter what the argument. + // + // Otherwise, when tp has its mimimum value, NextTransition(&tp) returns + // true and sets tp to the first recorded transition. Chains of calls + // to NextTransition()/PrevTransition() will eventually return false, + // but it is unspecified exactly when NextTransition(&tp) jumps to false, + // or what time is set by PrevTransition(&tp) for a very distant tp. + bool NextTransition(time_point* tp) const { + return zone_->NextTransition(tp); + } + bool PrevTransition(time_point* tp) const { + return zone_->PrevTransition(tp); + } + + private: + explicit Impl(const std::string& name); + static const Impl* UTCImpl(); + + const std::string name_; + std::unique_ptr zone_; +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ diff --git a/absl/time/internal/cctz/src/time_zone_info.cc b/absl/time/internal/cctz/src/time_zone_info.cc new file mode 100644 index 000000000..20bba28b3 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_info.cc @@ -0,0 +1,956 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file implements the TimeZoneIf interface using the "zoneinfo" +// data provided by the IANA Time Zone Database (i.e., the only real game +// in town). +// +// TimeZoneInfo represents the history of UTC-offset changes within a time +// zone. Most changes are due to daylight-saving rules, but occasionally +// shifts are made to the time-zone's base offset. The database only attempts +// to be definitive for times since 1970, so be wary of local-time conversions +// before that. Also, rule and zone-boundary changes are made at the whim +// of governments, so the conversion of future times needs to be taken with +// a grain of salt. +// +// For more information see tzfile(5), http://www.iana.org/time-zones, or +// http://en.wikipedia.org/wiki/Zoneinfo. +// +// Note that we assume the proleptic Gregorian calendar and 60-second +// minutes throughout. + +#include "time_zone_info.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "time_zone_fixed.h" +#include "time_zone_posix.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +inline bool IsLeap(year_t year) { + return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0); +} + +// The number of days in non-leap and leap years respectively. +const std::int_least32_t kDaysPerYear[2] = {365, 366}; + +// The day offsets of the beginning of each (1-based) month in non-leap and +// leap years respectively (e.g., 335 days before December in a leap year). +const std::int_least16_t kMonthOffsets[2][1 + 12 + 1] = { + {-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, + {-1, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}, +}; + +// We reject leap-second encoded zoneinfo and so assume 60-second minutes. +const std::int_least32_t kSecsPerDay = 24 * 60 * 60; + +// 400-year chunks always have 146097 days (20871 weeks). +const std::int_least64_t kSecsPer400Years = 146097LL * kSecsPerDay; + +// Like kDaysPerYear[] but scaled up by a factor of kSecsPerDay. +const std::int_least32_t kSecsPerYear[2] = { + 365 * kSecsPerDay, + 366 * kSecsPerDay, +}; + +// Single-byte, unsigned numeric values are encoded directly. +inline std::uint_fast8_t Decode8(const char* cp) { + return static_cast(*cp) & 0xff; +} + +// Multi-byte, numeric values are encoded using a MSB first, +// twos-complement representation. These helpers decode, from +// the given address, 4-byte and 8-byte values respectively. +// Note: If int_fastXX_t == intXX_t and this machine is not +// twos complement, then there will be at least one input value +// we cannot represent. +std::int_fast32_t Decode32(const char* cp) { + std::uint_fast32_t v = 0; + for (int i = 0; i != (32 / 8); ++i) v = (v << 8) | Decode8(cp++); + const std::int_fast32_t s32max = 0x7fffffff; + const auto s32maxU = static_cast(s32max); + if (v <= s32maxU) return static_cast(v); + return static_cast(v - s32maxU - 1) - s32max - 1; +} + +std::int_fast64_t Decode64(const char* cp) { + std::uint_fast64_t v = 0; + for (int i = 0; i != (64 / 8); ++i) v = (v << 8) | Decode8(cp++); + const std::int_fast64_t s64max = 0x7fffffffffffffff; + const auto s64maxU = static_cast(s64max); + if (v <= s64maxU) return static_cast(v); + return static_cast(v - s64maxU - 1) - s64max - 1; +} + +// Generate a year-relative offset for a PosixTransition. +std::int_fast64_t TransOffset(bool leap_year, int jan1_weekday, + const PosixTransition& pt) { + std::int_fast64_t days = 0; + switch (pt.date.fmt) { + case PosixTransition::J: { + days = pt.date.j.day; + if (!leap_year || days < kMonthOffsets[1][3]) days -= 1; + break; + } + case PosixTransition::N: { + days = pt.date.n.day; + break; + } + case PosixTransition::M: { + const bool last_week = (pt.date.m.week == 5); + days = kMonthOffsets[leap_year][pt.date.m.month + last_week]; + const std::int_fast64_t weekday = (jan1_weekday + days) % 7; + if (last_week) { + days -= (weekday + 7 - 1 - pt.date.m.weekday) % 7 + 1; + } else { + days += (pt.date.m.weekday + 7 - weekday) % 7; + days += (pt.date.m.week - 1) * 7; + } + break; + } + } + return (days * kSecsPerDay) + pt.time.offset; +} + +inline time_zone::civil_lookup MakeUnique(const time_point& tp) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::UNIQUE; + cl.pre = cl.trans = cl.post = tp; + return cl; +} + +inline time_zone::civil_lookup MakeUnique(std::int_fast64_t unix_time) { + return MakeUnique(FromUnixSeconds(unix_time)); +} + +inline time_zone::civil_lookup MakeSkipped(const Transition& tr, + const civil_second& cs) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::SKIPPED; + cl.pre = FromUnixSeconds(tr.unix_time - 1 + (cs - tr.prev_civil_sec)); + cl.trans = FromUnixSeconds(tr.unix_time); + cl.post = FromUnixSeconds(tr.unix_time - (tr.civil_sec - cs)); + return cl; +} + +inline time_zone::civil_lookup MakeRepeated(const Transition& tr, + const civil_second& cs) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::REPEATED; + cl.pre = FromUnixSeconds(tr.unix_time - 1 - (tr.prev_civil_sec - cs)); + cl.trans = FromUnixSeconds(tr.unix_time); + cl.post = FromUnixSeconds(tr.unix_time + (cs - tr.civil_sec)); + return cl; +} + +inline civil_second YearShift(const civil_second& cs, year_t shift) { + return civil_second(cs.year() + shift, cs.month(), cs.day(), + cs.hour(), cs.minute(), cs.second()); +} + +} // namespace + +// What (no leap-seconds) UTC+seconds zoneinfo would look like. +bool TimeZoneInfo::ResetToBuiltinUTC(const sys_seconds& offset) { + transition_types_.resize(1); + TransitionType& tt(transition_types_.back()); + tt.utc_offset = static_cast(offset.count()); + tt.is_dst = false; + tt.abbr_index = 0; + + // We temporarily add some redundant, contemporary (2012 through 2021) + // transitions for performance reasons. See TimeZoneInfo::LocalTime(). + // TODO: Fix the performance issue and remove the extra transitions. + transitions_.clear(); + transitions_.reserve(12); + for (const std::int_fast64_t unix_time : { + -(1LL << 59), // BIG_BANG + 1325376000LL, // 2012-01-01T00:00:00+00:00 + 1356998400LL, // 2013-01-01T00:00:00+00:00 + 1388534400LL, // 2014-01-01T00:00:00+00:00 + 1420070400LL, // 2015-01-01T00:00:00+00:00 + 1451606400LL, // 2016-01-01T00:00:00+00:00 + 1483228800LL, // 2017-01-01T00:00:00+00:00 + 1514764800LL, // 2018-01-01T00:00:00+00:00 + 1546300800LL, // 2019-01-01T00:00:00+00:00 + 1577836800LL, // 2020-01-01T00:00:00+00:00 + 1609459200LL, // 2021-01-01T00:00:00+00:00 + 2147483647LL, // 2^31 - 1 + }) { + Transition& tr(*transitions_.emplace(transitions_.end())); + tr.unix_time = unix_time; + tr.type_index = 0; + tr.civil_sec = LocalTime(tr.unix_time, tt).cs; + tr.prev_civil_sec = tr.civil_sec - 1; + } + + default_transition_type_ = 0; + abbreviations_ = FixedOffsetToAbbr(offset); + abbreviations_.append(1, '\0'); // add NUL + future_spec_.clear(); // never needed for a fixed-offset zone + extended_ = false; + + tt.civil_max = LocalTime(sys_seconds::max().count(), tt).cs; + tt.civil_min = LocalTime(sys_seconds::min().count(), tt).cs; + + transitions_.shrink_to_fit(); + return true; +} + +// Builds the in-memory header using the raw bytes from the file. +bool TimeZoneInfo::Header::Build(const tzhead& tzh) { + std::int_fast32_t v; + if ((v = Decode32(tzh.tzh_timecnt)) < 0) return false; + timecnt = static_cast(v); + if ((v = Decode32(tzh.tzh_typecnt)) < 0) return false; + typecnt = static_cast(v); + if ((v = Decode32(tzh.tzh_charcnt)) < 0) return false; + charcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_leapcnt)) < 0) return false; + leapcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_ttisstdcnt)) < 0) return false; + ttisstdcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_ttisgmtcnt)) < 0) return false; + ttisgmtcnt = static_cast(v); + return true; +} + +// How many bytes of data are associated with this header. The result +// depends upon whether this is a section with 4-byte or 8-byte times. +std::size_t TimeZoneInfo::Header::DataLength(std::size_t time_len) const { + std::size_t len = 0; + len += (time_len + 1) * timecnt; // unix_time + type_index + len += (4 + 1 + 1) * typecnt; // utc_offset + is_dst + abbr_index + len += 1 * charcnt; // abbreviations + len += (time_len + 4) * leapcnt; // leap-time + TAI-UTC + len += 1 * ttisstdcnt; // UTC/local indicators + len += 1 * ttisgmtcnt; // standard/wall indicators + return len; +} + +// Check that the TransitionType has the expected offset/is_dst/abbreviation. +void TimeZoneInfo::CheckTransition(const std::string& name, + const TransitionType& tt, + std::int_fast32_t offset, bool is_dst, + const std::string& abbr) const { + if (tt.utc_offset != offset || tt.is_dst != is_dst || + &abbreviations_[tt.abbr_index] != abbr) { + std::clog << name << ": Transition" + << " offset=" << tt.utc_offset << "/" + << (tt.is_dst ? "DST" : "STD") + << "/abbr=" << &abbreviations_[tt.abbr_index] + << " does not match POSIX spec '" << future_spec_ << "'\n"; + } +} + +// zic(8) can generate no-op transitions when a zone changes rules at an +// instant when there is actually no discontinuity. So we check whether +// two transitions have equivalent types (same offset/is_dst/abbr). +bool TimeZoneInfo::EquivTransitions(std::uint_fast8_t tt1_index, + std::uint_fast8_t tt2_index) const { + if (tt1_index == tt2_index) return true; + const TransitionType& tt1(transition_types_[tt1_index]); + const TransitionType& tt2(transition_types_[tt2_index]); + if (tt1.is_dst != tt2.is_dst) return false; + if (tt1.utc_offset != tt2.utc_offset) return false; + if (tt1.abbr_index != tt2.abbr_index) return false; + return true; +} + +// Use the POSIX-TZ-environment-variable-style std::string to handle times +// in years after the last transition stored in the zoneinfo data. +void TimeZoneInfo::ExtendTransitions(const std::string& name, + const Header& hdr) { + extended_ = false; + bool extending = !future_spec_.empty(); + + PosixTimeZone posix; + if (extending && !ParsePosixSpec(future_spec_, &posix)) { + std::clog << name << ": Failed to parse '" << future_spec_ << "'\n"; + extending = false; + } + + if (extending && posix.dst_abbr.empty()) { // std only + // The future specification should match the last/default transition, + // and that means that handling the future will fall out naturally. + std::uint_fast8_t index = default_transition_type_; + if (hdr.timecnt != 0) index = transitions_[hdr.timecnt - 1].type_index; + const TransitionType& tt(transition_types_[index]); + CheckTransition(name, tt, posix.std_offset, false, posix.std_abbr); + extending = false; + } + + if (extending && hdr.timecnt < 2) { + std::clog << name << ": Too few transitions for POSIX spec\n"; + extending = false; + } + + if (!extending) { + // Ensure that there is always a transition in the second half of the + // time line (the BIG_BANG transition is in the first half) so that the + // signed difference between a civil_second and the civil_second of its + // previous transition is always representable, without overflow. + const Transition& last(transitions_.back()); + if (last.unix_time < 0) { + const std::uint_fast8_t type_index = last.type_index; + Transition& tr(*transitions_.emplace(transitions_.end())); + tr.unix_time = 2147483647; // 2038-01-19T03:14:07+00:00 + tr.type_index = type_index; + } + return; // last transition wins + } + + // Extend the transitions for an additional 400 years using the + // future specification. Years beyond those can be handled by + // mapping back to a cycle-equivalent year within that range. + // zic(8) should probably do this so that we don't have to. + // TODO: Reduce the extension by the number of compatible + // transitions already in place. + transitions_.reserve(hdr.timecnt + 400 * 2 + 1); + transitions_.resize(hdr.timecnt + 400 * 2); + extended_ = true; + + // The future specification should match the last two transitions, + // and those transitions should have different is_dst flags. Note + // that nothing says the UTC offset used by the is_dst transition + // must be greater than that used by the !is_dst transition. (See + // Europe/Dublin, for example.) + const Transition* tr0 = &transitions_[hdr.timecnt - 1]; + const Transition* tr1 = &transitions_[hdr.timecnt - 2]; + const TransitionType* tt0 = &transition_types_[tr0->type_index]; + const TransitionType* tt1 = &transition_types_[tr1->type_index]; + const TransitionType& dst(tt0->is_dst ? *tt0 : *tt1); + const TransitionType& std(tt0->is_dst ? *tt1 : *tt0); + CheckTransition(name, dst, posix.dst_offset, true, posix.dst_abbr); + CheckTransition(name, std, posix.std_offset, false, posix.std_abbr); + + // Add the transitions to tr1 and back to tr0 for each extra year. + last_year_ = LocalTime(tr0->unix_time, *tt0).cs.year(); + bool leap_year = IsLeap(last_year_); + const civil_day jan1(last_year_, 1, 1); + std::int_fast64_t jan1_time = civil_second(jan1) - civil_second(); + int jan1_weekday = (static_cast(get_weekday(jan1)) + 1) % 7; + Transition* tr = &transitions_[hdr.timecnt]; // next trans to fill + if (LocalTime(tr1->unix_time, *tt1).cs.year() != last_year_) { + // Add a single extra transition to align to a calendar year. + transitions_.resize(transitions_.size() + 1); + assert(tr == &transitions_[hdr.timecnt]); // no reallocation + const PosixTransition& pt1(tt0->is_dst ? posix.dst_end : posix.dst_start); + std::int_fast64_t tr1_offset = TransOffset(leap_year, jan1_weekday, pt1); + tr->unix_time = jan1_time + tr1_offset - tt0->utc_offset; + tr++->type_index = tr1->type_index; + tr0 = &transitions_[hdr.timecnt]; + tr1 = &transitions_[hdr.timecnt - 1]; + tt0 = &transition_types_[tr0->type_index]; + tt1 = &transition_types_[tr1->type_index]; + } + const PosixTransition& pt1(tt0->is_dst ? posix.dst_end : posix.dst_start); + const PosixTransition& pt0(tt0->is_dst ? posix.dst_start : posix.dst_end); + for (const year_t limit = last_year_ + 400; last_year_ < limit;) { + last_year_ += 1; // an additional year of generated transitions + jan1_time += kSecsPerYear[leap_year]; + jan1_weekday = (jan1_weekday + kDaysPerYear[leap_year]) % 7; + leap_year = !leap_year && IsLeap(last_year_); + std::int_fast64_t tr1_offset = TransOffset(leap_year, jan1_weekday, pt1); + tr->unix_time = jan1_time + tr1_offset - tt0->utc_offset; + tr++->type_index = tr1->type_index; + std::int_fast64_t tr0_offset = TransOffset(leap_year, jan1_weekday, pt0); + tr->unix_time = jan1_time + tr0_offset - tt1->utc_offset; + tr++->type_index = tr0->type_index; + } + assert(tr == &transitions_[0] + transitions_.size()); +} + +bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { + // Read and validate the header. + tzhead tzh; + if (zip->Read(&tzh, sizeof(tzh)) != sizeof(tzh)) + return false; + if (strncmp(tzh.tzh_magic, TZ_MAGIC, sizeof(tzh.tzh_magic)) != 0) + return false; + Header hdr; + if (!hdr.Build(tzh)) + return false; + std::size_t time_len = 4; + if (tzh.tzh_version[0] != '\0') { + // Skip the 4-byte data. + if (zip->Skip(hdr.DataLength(time_len)) != 0) + return false; + // Read and validate the header for the 8-byte data. + if (zip->Read(&tzh, sizeof(tzh)) != sizeof(tzh)) + return false; + if (strncmp(tzh.tzh_magic, TZ_MAGIC, sizeof(tzh.tzh_magic)) != 0) + return false; + if (tzh.tzh_version[0] == '\0') + return false; + if (!hdr.Build(tzh)) + return false; + time_len = 8; + } + if (hdr.typecnt == 0) + return false; + if (hdr.leapcnt != 0) { + // This code assumes 60-second minutes so we do not want + // the leap-second encoded zoneinfo. We could reverse the + // compensation, but the "right" encoding is rarely used + // so currently we simply reject such data. + return false; + } + if (hdr.ttisstdcnt != 0 && hdr.ttisstdcnt != hdr.typecnt) + return false; + if (hdr.ttisgmtcnt != 0 && hdr.ttisgmtcnt != hdr.typecnt) + return false; + + // Read the data into a local buffer. + std::size_t len = hdr.DataLength(time_len); + std::vector tbuf(len); + if (zip->Read(tbuf.data(), len) != len) + return false; + const char* bp = tbuf.data(); + + // Decode and validate the transitions. + transitions_.reserve(hdr.timecnt + 2); // We might add a couple. + transitions_.resize(hdr.timecnt); + for (std::size_t i = 0; i != hdr.timecnt; ++i) { + transitions_[i].unix_time = (time_len == 4) ? Decode32(bp) : Decode64(bp); + bp += time_len; + if (i != 0) { + // Check that the transitions are ordered by time (as zic guarantees). + if (!Transition::ByUnixTime()(transitions_[i - 1], transitions_[i])) + return false; // out of order + } + } + bool seen_type_0 = false; + for (std::size_t i = 0; i != hdr.timecnt; ++i) { + transitions_[i].type_index = Decode8(bp++); + if (transitions_[i].type_index >= hdr.typecnt) + return false; + if (transitions_[i].type_index == 0) + seen_type_0 = true; + } + + // Decode and validate the transition types. + transition_types_.resize(hdr.typecnt); + for (std::size_t i = 0; i != hdr.typecnt; ++i) { + transition_types_[i].utc_offset = + static_cast(Decode32(bp)); + if (transition_types_[i].utc_offset >= kSecsPerDay || + transition_types_[i].utc_offset <= -kSecsPerDay) + return false; + bp += 4; + transition_types_[i].is_dst = (Decode8(bp++) != 0); + transition_types_[i].abbr_index = Decode8(bp++); + if (transition_types_[i].abbr_index >= hdr.charcnt) + return false; + } + + // Determine the before-first-transition type. + default_transition_type_ = 0; + if (seen_type_0 && hdr.timecnt != 0) { + std::uint_fast8_t index = 0; + if (transition_types_[0].is_dst) { + index = transitions_[0].type_index; + while (index != 0 && transition_types_[index].is_dst) + --index; + } + while (index != hdr.typecnt && transition_types_[index].is_dst) + ++index; + if (index != hdr.typecnt) + default_transition_type_ = index; + } + + // Copy all the abbreviations. + abbreviations_.assign(bp, hdr.charcnt); + bp += hdr.charcnt; + + // Skip the unused portions. We've already dispensed with leap-second + // encoded zoneinfo. The ttisstd/ttisgmt indicators only apply when + // interpreting a POSIX spec that does not include start/end rules, and + // that isn't the case here (see "zic -p"). + bp += (8 + 4) * hdr.leapcnt; // leap-time + TAI-UTC + bp += 1 * hdr.ttisstdcnt; // UTC/local indicators + bp += 1 * hdr.ttisgmtcnt; // standard/wall indicators + assert(bp == tbuf.data() + tbuf.size()); + + future_spec_.clear(); + if (tzh.tzh_version[0] != '\0') { + // Snarf up the NL-enclosed future POSIX spec. Note + // that version '3' files utilize an extended format. + auto get_char = [](ZoneInfoSource* zip) -> int { + unsigned char ch; // all non-EOF results are positive + return (zip->Read(&ch, 1) == 1) ? ch : EOF; + }; + if (get_char(zip) != '\n') + return false; + for (int c = get_char(zip); c != '\n'; c = get_char(zip)) { + if (c == EOF) + return false; + future_spec_.push_back(static_cast(c)); + } + } + + // We don't check for EOF so that we're forwards compatible. + + // Trim redundant transitions. zic may have added these to work around + // differences between the glibc and reference implementations (see + // zic.c:dontmerge) and the Qt library (see zic.c:WORK_AROUND_QTBUG_53071). + // For us, they just get in the way when we do future_spec_ extension. + while (hdr.timecnt > 1) { + if (!EquivTransitions(transitions_[hdr.timecnt - 1].type_index, + transitions_[hdr.timecnt - 2].type_index)) { + break; + } + hdr.timecnt -= 1; + } + transitions_.resize(hdr.timecnt); + + // Ensure that there is always a transition in the first half of the + // time line (the second half is handled in ExtendTransitions()) so that + // the signed difference between a civil_second and the civil_second of + // its previous transition is always representable, without overflow. + // A contemporary zic will usually have already done this for us. + if (transitions_.empty() || transitions_.front().unix_time >= 0) { + Transition& tr(*transitions_.emplace(transitions_.begin())); + tr.unix_time = -(1LL << 59); // see tz/zic.c "BIG_BANG" + tr.type_index = default_transition_type_; + hdr.timecnt += 1; + } + + // Extend the transitions using the future specification. + ExtendTransitions(name, hdr); + + // Compute the local civil time for each transition and the preceding + // second. These will be used for reverse conversions in MakeTime(). + const TransitionType* ttp = &transition_types_[default_transition_type_]; + for (std::size_t i = 0; i != transitions_.size(); ++i) { + Transition& tr(transitions_[i]); + tr.prev_civil_sec = LocalTime(tr.unix_time, *ttp).cs - 1; + ttp = &transition_types_[tr.type_index]; + tr.civil_sec = LocalTime(tr.unix_time, *ttp).cs; + if (i != 0) { + // Check that the transitions are ordered by civil time. Essentially + // this means that an offset change cannot cross another such change. + // No one does this in practice, and we depend on it in MakeTime(). + if (!Transition::ByCivilTime()(transitions_[i - 1], tr)) + return false; // out of order + } + } + + // Compute the maximum/minimum civil times that can be converted to a + // time_point for each of the zone's transition types. + for (auto& tt : transition_types_) { + tt.civil_max = LocalTime(sys_seconds::max().count(), tt).cs; + tt.civil_min = LocalTime(sys_seconds::min().count(), tt).cs; + } + + transitions_.shrink_to_fit(); + return true; +} + +namespace { + +// fopen(3) adaptor. +inline FILE* FOpen(const char* path, const char* mode) { +#if defined(_MSC_VER) + FILE* fp; + if (fopen_s(&fp, path, mode) != 0) fp = nullptr; + return fp; +#else + return fopen(path, mode); // TODO: Enable the close-on-exec flag. +#endif +} + +// A stdio(3)-backed implementation of ZoneInfoSource. +class FileZoneInfoSource : public ZoneInfoSource { + public: + static std::unique_ptr Open(const std::string& name); + + std::size_t Read(void* ptr, std::size_t size) override { + size = std::min(size, len_); + std::size_t nread = fread(ptr, 1, size, fp_.get()); + len_ -= nread; + return nread; + } + int Skip(std::size_t offset) override { + offset = std::min(offset, len_); + int rc = fseek(fp_.get(), static_cast(offset), SEEK_CUR); + if (rc == 0) len_ -= offset; + return rc; + } + + protected: + explicit FileZoneInfoSource( + FILE* fp, std::size_t len = std::numeric_limits::max()) + : fp_(fp, fclose), len_(len) {} + + private: + std::unique_ptr fp_; + std::size_t len_; +}; + +std::unique_ptr FileZoneInfoSource::Open( + const std::string& name) { + // Use of the "file:" prefix is intended for testing purposes only. + if (name.compare(0, 5, "file:") == 0) return Open(name.substr(5)); + + // Map the time-zone name to a path name. + std::string path; + if (name.empty() || name[0] != '/') { + const char* tzdir = "/usr/share/zoneinfo"; + char* tzdir_env = nullptr; +#if defined(_MSC_VER) + _dupenv_s(&tzdir_env, nullptr, "TZDIR"); +#else + tzdir_env = std::getenv("TZDIR"); +#endif + if (tzdir_env && *tzdir_env) tzdir = tzdir_env; + path += tzdir; + path += '/'; +#if defined(_MSC_VER) + free(tzdir_env); +#endif + } + path += name; + + // Open the zoneinfo file. + FILE* fp = FOpen(path.c_str(), "rb"); + if (fp == nullptr) return nullptr; + std::size_t length = 0; + if (fseek(fp, 0, SEEK_END) == 0) { + long pos = ftell(fp); + if (pos >= 0) { + length = static_cast(pos); + } + rewind(fp); + } + return std::unique_ptr(new FileZoneInfoSource(fp, length)); +} + +#if defined(__ANDROID__) +class AndroidZoneInfoSource : public FileZoneInfoSource { + public: + static std::unique_ptr Open(const std::string& name); + + private: + explicit AndroidZoneInfoSource(FILE* fp, std::size_t len) + : FileZoneInfoSource(fp, len) {} +}; + +std::unique_ptr AndroidZoneInfoSource::Open( + const std::string& name) { + // Use of the "file:" prefix is intended for testing purposes only. + if (name.compare(0, 5, "file:") == 0) return Open(name.substr(5)); + + // See Android's libc/tzcode/bionic.cpp for additional information. + for (const char* tzdata : {"/data/misc/zoneinfo/current/tzdata", + "/system/usr/share/zoneinfo/tzdata"}) { + std::unique_ptr fp(FOpen(tzdata, "rb"), fclose); + if (fp.get() == nullptr) continue; + + char hbuf[24]; // covers header.zonetab_offset too + if (fread(hbuf, 1, sizeof(hbuf), fp.get()) != sizeof(hbuf)) continue; + if (strncmp(hbuf, "tzdata", 6) != 0) continue; + const std::int_fast32_t index_offset = Decode32(hbuf + 12); + const std::int_fast32_t data_offset = Decode32(hbuf + 16); + if (index_offset < 0 || data_offset < index_offset) continue; + if (fseek(fp.get(), static_cast(index_offset), SEEK_SET) != 0) + continue; + + char ebuf[52]; // covers entry.unused too + const std::size_t index_size = + static_cast(data_offset - index_offset); + const std::size_t zonecnt = index_size / sizeof(ebuf); + if (zonecnt * sizeof(ebuf) != index_size) continue; + for (std::size_t i = 0; i != zonecnt; ++i) { + if (fread(ebuf, 1, sizeof(ebuf), fp.get()) != sizeof(ebuf)) break; + const std::int_fast32_t start = data_offset + Decode32(ebuf + 40); + const std::int_fast32_t length = Decode32(ebuf + 44); + if (start < 0 || length < 0) break; + ebuf[40] = '\0'; // ensure zone name is NUL terminated + if (strcmp(name.c_str(), ebuf) == 0) { + if (fseek(fp.get(), static_cast(start), SEEK_SET) != 0) break; + return std::unique_ptr(new AndroidZoneInfoSource( + fp.release(), static_cast(length))); + } + } + } + return nullptr; +} +#endif + +} // namespace + +bool TimeZoneInfo::Load(const std::string& name) { + // We can ensure that the loading of UTC or any other fixed-offset + // zone never fails because the simple, fixed-offset state can be + // internally generated. Note that this depends on our choice to not + // accept leap-second encoded ("right") zoneinfo. + auto offset = sys_seconds::zero(); + if (FixedOffsetFromName(name, &offset)) { + return ResetToBuiltinUTC(offset); + } + + // Find and use a ZoneInfoSource to load the named zone. + auto zip = cctz_extension::zone_info_source_factory( + name, [](const std::string& name) -> std::unique_ptr { + if (auto zip = FileZoneInfoSource::Open(name)) return zip; +#if defined(__ANDROID__) + if (auto zip = AndroidZoneInfoSource::Open(name)) return zip; +#endif + return nullptr; + }); + return zip != nullptr && Load(name, zip.get()); +} + +// BreakTime() translation for a particular transition type. +time_zone::absolute_lookup TimeZoneInfo::LocalTime( + std::int_fast64_t unix_time, const TransitionType& tt) const { + // A civil time in "+offset" looks like (time+offset) in UTC. + // Note: We perform two additions in the civil_second domain to + // sidestep the chance of overflow in (unix_time + tt.utc_offset). + return {(civil_second() + unix_time) + tt.utc_offset, + tt.utc_offset, tt.is_dst, &abbreviations_[tt.abbr_index]}; +} + +// BreakTime() translation for a particular transition. +time_zone::absolute_lookup TimeZoneInfo::LocalTime( + std::int_fast64_t unix_time, const Transition& tr) const { + const TransitionType& tt = transition_types_[tr.type_index]; + // Note: (unix_time - tr.unix_time) will never overflow as we + // have ensured that there is always a "nearby" transition. + return {tr.civil_sec + (unix_time - tr.unix_time), // TODO: Optimize. + tt.utc_offset, tt.is_dst, &abbreviations_[tt.abbr_index]}; +} + +// MakeTime() translation with a conversion-preserving +N * 400-year shift. +time_zone::civil_lookup TimeZoneInfo::TimeLocal(const civil_second& cs, + year_t c4_shift) const { + assert(last_year_ - 400 < cs.year() && cs.year() <= last_year_); + time_zone::civil_lookup cl = MakeTime(cs); + if (c4_shift > sys_seconds::max().count() / kSecsPer400Years) { + cl.pre = cl.trans = cl.post = time_point::max(); + } else { + const auto offset = sys_seconds(c4_shift * kSecsPer400Years); + const auto limit = time_point::max() - offset; + for (auto* tp : {&cl.pre, &cl.trans, &cl.post}) { + if (*tp > limit) { + *tp = time_point::max(); + } else { + *tp += offset; + } + } + } + return cl; +} + +time_zone::absolute_lookup TimeZoneInfo::BreakTime( + const time_point& tp) const { + std::int_fast64_t unix_time = ToUnixSeconds(tp); + const std::size_t timecnt = transitions_.size(); + assert(timecnt != 0); // We always add a transition. + + if (unix_time < transitions_[0].unix_time) { + return LocalTime(unix_time, transition_types_[default_transition_type_]); + } + if (unix_time >= transitions_[timecnt - 1].unix_time) { + // After the last transition. If we extended the transitions using + // future_spec_, shift back to a supported year using the 400-year + // cycle of calendaric equivalence and then compensate accordingly. + if (extended_) { + const std::int_fast64_t diff = + unix_time - transitions_[timecnt - 1].unix_time; + const year_t shift = diff / kSecsPer400Years + 1; + const auto d = sys_seconds(shift * kSecsPer400Years); + time_zone::absolute_lookup al = BreakTime(tp - d); + al.cs = YearShift(al.cs, shift * 400); + return al; + } + return LocalTime(unix_time, transitions_[timecnt - 1]); + } + + const std::size_t hint = local_time_hint_.load(std::memory_order_relaxed); + if (0 < hint && hint < timecnt) { + if (transitions_[hint - 1].unix_time <= unix_time) { + if (unix_time < transitions_[hint].unix_time) { + return LocalTime(unix_time, transitions_[hint - 1]); + } + } + } + + const Transition target = {unix_time, 0, civil_second(), civil_second()}; + const Transition* begin = &transitions_[0]; + const Transition* tr = std::upper_bound(begin, begin + timecnt, target, + Transition::ByUnixTime()); + local_time_hint_.store(static_cast(tr - begin), + std::memory_order_relaxed); + return LocalTime(unix_time, *--tr); +} + +time_zone::civil_lookup TimeZoneInfo::MakeTime(const civil_second& cs) const { + const std::size_t timecnt = transitions_.size(); + assert(timecnt != 0); // We always add a transition. + + // Find the first transition after our target civil time. + const Transition* tr = nullptr; + const Transition* begin = &transitions_[0]; + const Transition* end = begin + timecnt; + if (cs < begin->civil_sec) { + tr = begin; + } else if (cs >= transitions_[timecnt - 1].civil_sec) { + tr = end; + } else { + const std::size_t hint = time_local_hint_.load(std::memory_order_relaxed); + if (0 < hint && hint < timecnt) { + if (transitions_[hint - 1].civil_sec <= cs) { + if (cs < transitions_[hint].civil_sec) { + tr = begin + hint; + } + } + } + if (tr == nullptr) { + const Transition target = {0, 0, cs, civil_second()}; + tr = std::upper_bound(begin, end, target, Transition::ByCivilTime()); + time_local_hint_.store(static_cast(tr - begin), + std::memory_order_relaxed); + } + } + + if (tr == begin) { + if (tr->prev_civil_sec >= cs) { + // Before first transition, so use the default offset. + const TransitionType& tt(transition_types_[default_transition_type_]); + if (cs < tt.civil_min) return MakeUnique(time_point::min()); + return MakeUnique(cs - (civil_second() + tt.utc_offset)); + } + // tr->prev_civil_sec < cs < tr->civil_sec + return MakeSkipped(*tr, cs); + } + + if (tr == end) { + if (cs > (--tr)->prev_civil_sec) { + // After the last transition. If we extended the transitions using + // future_spec_, shift back to a supported year using the 400-year + // cycle of calendaric equivalence and then compensate accordingly. + if (extended_ && cs.year() > last_year_) { + const year_t shift = (cs.year() - last_year_ - 1) / 400 + 1; + return TimeLocal(YearShift(cs, shift * -400), shift); + } + const TransitionType& tt(transition_types_[tr->type_index]); + if (cs > tt.civil_max) return MakeUnique(time_point::max()); + return MakeUnique(tr->unix_time + (cs - tr->civil_sec)); + } + // tr->civil_sec <= cs <= tr->prev_civil_sec + return MakeRepeated(*tr, cs); + } + + if (tr->prev_civil_sec < cs) { + // tr->prev_civil_sec < cs < tr->civil_sec + return MakeSkipped(*tr, cs); + } + + if (cs <= (--tr)->prev_civil_sec) { + // tr->civil_sec <= cs <= tr->prev_civil_sec + return MakeRepeated(*tr, cs); + } + + // In between transitions. + return MakeUnique(tr->unix_time + (cs - tr->civil_sec)); +} + +std::string TimeZoneInfo::Description() const { + std::ostringstream oss; + // TODO: It would nice if the zoneinfo data included the zone name. + // TODO: It would nice if the zoneinfo data included the tzdb version. + oss << "#trans=" << transitions_.size(); + oss << " #types=" << transition_types_.size(); + oss << " spec='" << future_spec_ << "'"; + return oss.str(); +} + +bool TimeZoneInfo::NextTransition(time_point* tp) const { + if (transitions_.empty()) return false; + const Transition* begin = &transitions_[0]; + const Transition* end = begin + transitions_.size(); + if (begin->unix_time <= -(1LL << 59)) { + // Do not report the BIG_BANG found in recent zoneinfo data as it is + // really a sentinel, not a transition. See tz/zic.c. + ++begin; + } + std::int_fast64_t unix_time = ToUnixSeconds(*tp); + const Transition target = { unix_time }; + const Transition* tr = std::upper_bound(begin, end, target, + Transition::ByUnixTime()); + if (tr != begin) { // skip no-op transitions + for (; tr != end; ++tr) { + if (!EquivTransitions(tr[-1].type_index, tr[0].type_index)) break; + } + } + // When tr == end we return false, ignoring future_spec_. + if (tr == end) return false; + *tp = FromUnixSeconds(tr->unix_time); + return true; +} + +bool TimeZoneInfo::PrevTransition(time_point* tp) const { + if (transitions_.empty()) return false; + const Transition* begin = &transitions_[0]; + const Transition* end = begin + transitions_.size(); + if (begin->unix_time <= -(1LL << 59)) { + // Do not report the BIG_BANG found in recent zoneinfo data as it is + // really a sentinel, not a transition. See tz/zic.c. + ++begin; + } + std::int_fast64_t unix_time = ToUnixSeconds(*tp); + if (FromUnixSeconds(unix_time) != *tp) { + if (unix_time == std::numeric_limits::max()) { + if (end == begin) return false; // Ignore future_spec_. + *tp = FromUnixSeconds((--end)->unix_time); + return true; + } + unix_time += 1; // ceils + } + const Transition target = { unix_time }; + const Transition* tr = std::lower_bound(begin, end, target, + Transition::ByUnixTime()); + if (tr != begin) { // skip no-op transitions + for (; tr - 1 != begin; --tr) { + if (!EquivTransitions(tr[-2].type_index, tr[-1].type_index)) break; + } + } + // When tr == end we return the "last" transition, ignoring future_spec_. + if (tr == begin) return false; + *tp = FromUnixSeconds((--tr)->unix_time); + return true; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_info.h b/absl/time/internal/cctz/src/time_zone_info.h new file mode 100644 index 000000000..b4d1696bf --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_info.h @@ -0,0 +1,132 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ + +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" +#include "time_zone_if.h" +#include "tzfile.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A transition to a new UTC offset. +struct Transition { + std::int_least64_t unix_time; // the instant of this transition + std::uint_least8_t type_index; // index of the transition type + civil_second civil_sec; // local civil time of transition + civil_second prev_civil_sec; // local civil time one second earlier + + struct ByUnixTime { + inline bool operator()(const Transition& lhs, const Transition& rhs) const { + return lhs.unix_time < rhs.unix_time; + } + }; + struct ByCivilTime { + inline bool operator()(const Transition& lhs, const Transition& rhs) const { + return lhs.civil_sec < rhs.civil_sec; + } + }; +}; + +// The characteristics of a particular transition. +struct TransitionType { + std::int_least32_t utc_offset; // the new prevailing UTC offset + civil_second civil_max; // max convertible civil time for offset + civil_second civil_min; // min convertible civil time for offset + bool is_dst; // did we move into daylight-saving time + std::uint_least8_t abbr_index; // index of the new abbreviation +}; + +// A time zone backed by the IANA Time Zone Database (zoneinfo). +class TimeZoneInfo : public TimeZoneIf { + public: + TimeZoneInfo() = default; + TimeZoneInfo(const TimeZoneInfo&) = delete; + TimeZoneInfo& operator=(const TimeZoneInfo&) = delete; + + // Loads the zoneinfo for the given name, returning true if successful. + bool Load(const std::string& name); + + // TimeZoneIf implementations. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const override; + time_zone::civil_lookup MakeTime( + const civil_second& cs) const override; + std::string Description() const override; + bool NextTransition(time_point* tp) const override; + bool PrevTransition(time_point* tp) const override; + + private: + struct Header { // counts of: + std::size_t timecnt; // transition times + std::size_t typecnt; // transition types + std::size_t charcnt; // zone abbreviation characters + std::size_t leapcnt; // leap seconds (we expect none) + std::size_t ttisstdcnt; // UTC/local indicators (unused) + std::size_t ttisgmtcnt; // standard/wall indicators (unused) + + bool Build(const tzhead& tzh); + std::size_t DataLength(std::size_t time_len) const; + }; + + void CheckTransition(const std::string& name, const TransitionType& tt, + std::int_fast32_t offset, bool is_dst, + const std::string& abbr) const; + bool EquivTransitions(std::uint_fast8_t tt1_index, + std::uint_fast8_t tt2_index) const; + void ExtendTransitions(const std::string& name, const Header& hdr); + + bool ResetToBuiltinUTC(const sys_seconds& offset); + bool Load(const std::string& name, ZoneInfoSource* zip); + + // Helpers for BreakTime() and MakeTime(). + time_zone::absolute_lookup LocalTime(std::int_fast64_t unix_time, + const TransitionType& tt) const; + time_zone::absolute_lookup LocalTime(std::int_fast64_t unix_time, + const Transition& tr) const; + time_zone::civil_lookup TimeLocal(const civil_second& cs, + year_t c4_shift) const; + + std::vector transitions_; // ordered by unix_time and civil_sec + std::vector transition_types_; // distinct transition types + std::uint_fast8_t default_transition_type_; // for before first transition + std::string abbreviations_; // all the NUL-terminated abbreviations + + std::string future_spec_; // for after the last zic transition + bool extended_; // future_spec_ was used to generate transitions + year_t last_year_; // the final year of the generated transitions + + // We remember the transitions found during the last BreakTime() and + // MakeTime() calls. If the next request is for the same transition we + // will avoid re-searching. + mutable std::atomic local_time_hint_ = {}; // BreakTime() hint + mutable std::atomic time_local_hint_ = {}; // MakeTime() hint +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ diff --git a/absl/time/internal/cctz/src/time_zone_libc.cc b/absl/time/internal/cctz/src/time_zone_libc.cc new file mode 100644 index 000000000..b0b56a522 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_libc.cc @@ -0,0 +1,156 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#if defined(_WIN32) || defined(_WIN64) +#define _CRT_SECURE_NO_WARNINGS 1 +#endif + +#include "time_zone_libc.h" + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// .first is seconds east of UTC; .second is the time-zone abbreviation. +using OffsetAbbr = std::pair; + +// Defines a function that can be called as follows: +// +// std::tm tm = ...; +// OffsetAbbr off_abbr = get_offset_abbr(tm); +// +#if defined(_WIN32) || defined(_WIN64) +// Uses the globals: '_timezone', '_dstbias' and '_tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = _timezone + (is_dst ? _dstbias : 0); + const char* abbr = _tzname[is_dst]; + return {off, abbr}; +} +#elif defined(__sun) +// Uses the globals: 'timezone', 'altzone' and 'tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = is_dst ? altzone : timezone; + const char* abbr = tzname[is_dst]; + return {off, abbr}; +} +#elif defined(__native_client__) || defined(__myriad2__) || \ + defined(__EMSCRIPTEN__) +// Uses the globals: 'timezone' and 'tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = _timezone + (is_dst ? 60 * 60 : 0); + const char* abbr = tzname[is_dst]; + return {off, abbr}; +} +#else +// +// Returns an OffsetAbbr using std::tm fields with various spellings. +// +#if !defined(tm_gmtoff) && !defined(tm_zone) +template +OffsetAbbr get_offset_abbr(const T& tm, decltype(&T::tm_gmtoff) = nullptr, + decltype(&T::tm_zone) = nullptr) { + return {tm.tm_gmtoff, tm.tm_zone}; +} +#endif // !defined(tm_gmtoff) && !defined(tm_zone) +#if !defined(__tm_gmtoff) && !defined(__tm_zone) +template +OffsetAbbr get_offset_abbr(const T& tm, decltype(&T::__tm_gmtoff) = nullptr, + decltype(&T::__tm_zone) = nullptr) { + return {tm.__tm_gmtoff, tm.__tm_zone}; +} +#endif // !defined(__tm_gmtoff) && !defined(__tm_zone) +#endif + +} // namespace + +TimeZoneLibC::TimeZoneLibC(const std::string& name) + : local_(name == "localtime") {} + +time_zone::absolute_lookup TimeZoneLibC::BreakTime( + const time_point& tp) const { + time_zone::absolute_lookup al; + std::time_t t = ToUnixSeconds(tp); + std::tm tm; + if (local_) { +#if defined(_WIN32) || defined(_WIN64) + localtime_s(&tm, &t); +#else + localtime_r(&t, &tm); +#endif + std::tie(al.offset, al.abbr) = get_offset_abbr(tm); + } else { +#if defined(_WIN32) || defined(_WIN64) + gmtime_s(&tm, &t); +#else + gmtime_r(&t, &tm); +#endif + al.offset = 0; + al.abbr = "UTC"; + } + al.cs = civil_second(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + al.is_dst = tm.tm_isdst > 0; + return al; +} + +time_zone::civil_lookup TimeZoneLibC::MakeTime(const civil_second& cs) const { + time_zone::civil_lookup cl; + std::time_t t; + if (local_) { + // Does not handle SKIPPED/AMBIGUOUS or huge years. + std::tm tm; + tm.tm_year = static_cast(cs.year() - 1900); + tm.tm_mon = cs.month() - 1; + tm.tm_mday = cs.day(); + tm.tm_hour = cs.hour(); + tm.tm_min = cs.minute(); + tm.tm_sec = cs.second(); + tm.tm_isdst = -1; + t = std::mktime(&tm); + } else { + t = cs - civil_second(); + } + cl.kind = time_zone::civil_lookup::UNIQUE; + cl.pre = cl.trans = cl.post = FromUnixSeconds(t); + return cl; +} + +std::string TimeZoneLibC::Description() const { + return local_ ? "localtime" : "UTC"; +} + +bool TimeZoneLibC::NextTransition(time_point* tp) const { + return false; +} + +bool TimeZoneLibC::PrevTransition(time_point* tp) const { + return false; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_libc.h b/absl/time/internal/cctz/src/time_zone_libc.h new file mode 100644 index 000000000..41f7dde2b --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_libc.h @@ -0,0 +1,50 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ + +#include + +#include "time_zone_if.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A time zone backed by gmtime_r(3), localtime_r(3), and mktime(3), +// and which therefore only supports UTC and the local time zone. +// TODO: Add support for fixed offsets from UTC. +class TimeZoneLibC : public TimeZoneIf { + public: + explicit TimeZoneLibC(const std::string& name); + + // TimeZoneIf implementations. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const override; + time_zone::civil_lookup MakeTime( + const civil_second& cs) const override; + std::string Description() const override; + bool NextTransition(time_point* tp) const override; + bool PrevTransition(time_point* tp) const override; + + private: + const bool local_; // localtime or UTC +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ diff --git a/absl/time/internal/cctz/src/time_zone_lookup.cc b/absl/time/internal/cctz/src/time_zone_lookup.cc new file mode 100644 index 000000000..fbd86e16b --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_lookup.cc @@ -0,0 +1,142 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#if defined(__ANDROID__) +#include +#if __ANDROID_API__ >= 21 +#include +#endif +#endif +#include +#include +#include + +#include "time_zone_fixed.h" +#include "time_zone_impl.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +#if defined(__ANDROID__) && __ANDROID_API__ >= 21 +namespace { +// Android 'L' removes __system_property_get() from the NDK, however +// it is still a hidden symbol in libc so we use dlsym() to access it. +// See Chromium's base/sys_info_android.cc for a similar example. + +using property_get_func = int (*)(const char*, char*); + +property_get_func LoadSystemPropertyGet() { + int flag = RTLD_LAZY | RTLD_GLOBAL; +#if defined(RTLD_NOLOAD) + flag |= RTLD_NOLOAD; // libc.so should already be resident +#endif + if (void* handle = dlopen("libc.so", flag)) { + void* sym = dlsym(handle, "__system_property_get"); + dlclose(handle); + return reinterpret_cast(sym); + } + return nullptr; +} + +int __system_property_get(const char* name, char* value) { + static property_get_func system_property_get = LoadSystemPropertyGet(); + return system_property_get ? system_property_get(name, value) : -1; +} + +} // namespace +#endif + +std::string time_zone::name() const { + return time_zone::Impl::get(*this).name(); +} + +time_zone::absolute_lookup time_zone::lookup( + const time_point& tp) const { + return time_zone::Impl::get(*this).BreakTime(tp); +} + +time_zone::civil_lookup time_zone::lookup(const civil_second& cs) const { + return time_zone::Impl::get(*this).MakeTime(cs); +} + +bool operator==(time_zone lhs, time_zone rhs) { + return &time_zone::Impl::get(lhs) == &time_zone::Impl::get(rhs); +} + +bool load_time_zone(const std::string& name, time_zone* tz) { + return time_zone::Impl::LoadTimeZone(name, tz); +} + +time_zone utc_time_zone() { + return time_zone::Impl::UTC(); // avoid name lookup +} + +time_zone fixed_time_zone(const sys_seconds& offset) { + time_zone tz; + load_time_zone(FixedOffsetToName(offset), &tz); + return tz; +} + +time_zone local_time_zone() { + const char* zone = ":localtime"; + + // Allow ${TZ} to override to default zone. + char* tz_env = nullptr; +#if defined(_MSC_VER) + _dupenv_s(&tz_env, nullptr, "TZ"); +#else + tz_env = std::getenv("TZ"); +#endif +#if defined(__ANDROID__) + char sysprop[PROP_VALUE_MAX]; + if (tz_env == nullptr) + if (__system_property_get("persist.sys.timezone", sysprop) > 0) + tz_env = sysprop; +#endif + if (tz_env) zone = tz_env; + + // We only support the "[:]" form. + if (*zone == ':') ++zone; + + // Map "localtime" to a system-specific name, but + // allow ${LOCALTIME} to override the default name. + char* localtime_env = nullptr; + if (strcmp(zone, "localtime") == 0) { +#if defined(_MSC_VER) + // System-specific default is just "localtime". + _dupenv_s(&localtime_env, nullptr, "LOCALTIME"); +#else + zone = "/etc/localtime"; // System-specific default. + localtime_env = std::getenv("LOCALTIME"); +#endif + if (localtime_env) zone = localtime_env; + } + + const std::string name = zone; +#if defined(_MSC_VER) + free(localtime_env); + free(tz_env); +#endif + + time_zone tz; + load_time_zone(name, &tz); // Falls back to UTC. + return tz; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_lookup_test.cc b/absl/time/internal/cctz/src/time_zone_lookup_test.cc new file mode 100644 index 000000000..a5d73d549 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_lookup_test.cc @@ -0,0 +1,1259 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "gtest/gtest.h" + +using std::chrono::time_point_cast; +using std::chrono::system_clock; +using std::chrono::nanoseconds; +using std::chrono::microseconds; +using std::chrono::milliseconds; +using std::chrono::seconds; +using std::chrono::minutes; +using std::chrono::hours; + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// A list of known time-zone names. +const char* const kTimeZoneNames[] = { + "Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Asmera", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Timbuktu", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/ComodRivadavia", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Atka", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Buenos_Aires", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Catamarca", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Coral_Harbour", + "America/Cordoba", + "America/Costa_Rica", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Ensenada", + "America/Fort_Nelson", + "America/Fort_Wayne", + "America/Fortaleza", + "America/Glace_Bay", + "America/Godthab", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Indianapolis", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Jujuy", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Knox_IN", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Louisville", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Mendoza", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Acre", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Punta_Arenas", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Rosario", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Virgin", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/South_Pole", + "Antarctica/Syowa", + "Antarctica/Troll", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Ashkhabad", + "Asia/Atyrau", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Barnaul", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Calcutta", + "Asia/Chita", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Chungking", + "Asia/Colombo", + "Asia/Dacca", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Famagusta", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Istanbul", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Katmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macao", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qyzylorda", + "Asia/Rangoon", + "Asia/Riyadh", + "Asia/Saigon", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Srednekolymsk", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Tel_Aviv", + "Asia/Thimbu", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Tomsk", + "Asia/Ujung_Pandang", + "Asia/Ulaanbaatar", + "Asia/Ulan_Bator", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yangon", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faeroe", + "Atlantic/Faroe", + "Atlantic/Jan_Mayen", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/ACT", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Canberra", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/LHI", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/NSW", + "Australia/North", + "Australia/Perth", + "Australia/Queensland", + "Australia/South", + "Australia/Sydney", + "Australia/Tasmania", + "Australia/Victoria", + "Australia/West", + "Australia/Yancowinna", + "Brazil/Acre", + "Brazil/DeNoronha", + "Brazil/East", + "Brazil/West", + "CET", + "CST6CDT", + "Canada/Atlantic", + "Canada/Central", + "Canada/East-Saskatchewan", + "Canada/Eastern", + "Canada/Mountain", + "Canada/Newfoundland", + "Canada/Pacific", + "Canada/Saskatchewan", + "Canada/Yukon", + "Chile/Continental", + "Chile/EasterIsland", + "Cuba", + "EET", + "EST", + "EST5EDT", + "Egypt", + "Eire", + "Etc/GMT", + "Etc/GMT+0", + "Etc/GMT+1", + "Etc/GMT+10", + "Etc/GMT+11", + "Etc/GMT+12", + "Etc/GMT+2", + "Etc/GMT+3", + "Etc/GMT+4", + "Etc/GMT+5", + "Etc/GMT+6", + "Etc/GMT+7", + "Etc/GMT+8", + "Etc/GMT+9", + "Etc/GMT-0", + "Etc/GMT-1", + "Etc/GMT-10", + "Etc/GMT-11", + "Etc/GMT-12", + "Etc/GMT-13", + "Etc/GMT-14", + "Etc/GMT-2", + "Etc/GMT-3", + "Etc/GMT-4", + "Etc/GMT-5", + "Etc/GMT-6", + "Etc/GMT-7", + "Etc/GMT-8", + "Etc/GMT-9", + "Etc/GMT0", + "Etc/Greenwich", + "Etc/UCT", + "Etc/UTC", + "Etc/Universal", + "Etc/Zulu", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Astrakhan", + "Europe/Athens", + "Europe/Belfast", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kiev", + "Europe/Kirov", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Nicosia", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Saratov", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Tiraspol", + "Europe/Ulyanovsk", + "Europe/Uzhgorod", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zaporozhye", + "Europe/Zurich", + "GB", + "GB-Eire", + "GMT", + "GMT+0", + "GMT-0", + "GMT0", + "Greenwich", + "HST", + "Hongkong", + "Iceland", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Iran", + "Israel", + "Jamaica", + "Japan", + "Kwajalein", + "Libya", + "MET", + "MST", + "MST7MDT", + "Mexico/BajaNorte", + "Mexico/BajaSur", + "Mexico/General", + "NZ", + "NZ-CHAT", + "Navajo", + "PRC", + "PST8PDT", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Bougainville", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Enderbury", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Ponape", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Samoa", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Truk", + "Pacific/Wake", + "Pacific/Wallis", + "Pacific/Yap", + "Poland", + "Portugal", + "ROC", + "ROK", + "Singapore", + "Turkey", + "UCT", + "US/Alaska", + "US/Aleutian", + "US/Arizona", + "US/Central", + "US/East-Indiana", + "US/Eastern", + "US/Hawaii", + "US/Indiana-Starke", + "US/Michigan", + "US/Mountain", + "US/Pacific", + "US/Samoa", + "UTC", + "Universal", + "W-SU", + "WET", + "Zulu", + nullptr +}; + +// Helper to return a loaded time zone by value (UTC on error). +time_zone LoadZone(const std::string& name) { + time_zone tz; + load_time_zone(name, &tz); + return tz; +} + +// This helper is a macro so that failed expectations show up with the +// correct line numbers. +#define ExpectTime(tp, tz, y, m, d, hh, mm, ss, off, isdst, zone) \ + do { \ + time_zone::absolute_lookup al = tz.lookup(tp); \ + EXPECT_EQ(y, al.cs.year()); \ + EXPECT_EQ(m, al.cs.month()); \ + EXPECT_EQ(d, al.cs.day()); \ + EXPECT_EQ(hh, al.cs.hour()); \ + EXPECT_EQ(mm, al.cs.minute()); \ + EXPECT_EQ(ss, al.cs.second()); \ + EXPECT_EQ(off, al.offset); \ + EXPECT_TRUE(isdst == al.is_dst); \ + /* EXPECT_STREQ(zone, al.abbr); */ \ + } while (0) + +} // namespace + +TEST(TimeZones, LoadZonesConcurrently) { + std::promise ready_promise; + std::shared_future ready_future(ready_promise.get_future()); + auto load_zones = [ready_future](std::promise* started, + std::set* failures) { + started->set_value(); + ready_future.wait(); + for (const char* const* np = kTimeZoneNames; *np != nullptr; ++np) { + std::string zone = *np; + time_zone tz; + if (load_time_zone(zone, &tz)) { + EXPECT_EQ(zone, tz.name()); + } else { + failures->insert(zone); + } + } + }; + + const std::size_t n_threads = 128; + std::vector threads; + std::vector> thread_failures(n_threads); + for (std::size_t i = 0; i != n_threads; ++i) { + std::promise started; + threads.emplace_back(load_zones, &started, &thread_failures[i]); + started.get_future().wait(); + } + ready_promise.set_value(); + for (auto& thread : threads) { + thread.join(); + } + + // Allow a small number of failures to account for skew between + // the contents of kTimeZoneNames and the zoneinfo data source. + const std::size_t max_failures = 3; + std::set failures; + for (const auto& thread_failure : thread_failures) { + failures.insert(thread_failure.begin(), thread_failure.end()); + } + EXPECT_LE(failures.size(), max_failures) << testing::PrintToString(failures); +} + +TEST(TimeZone, NamedTimeZones) { + const time_zone utc = utc_time_zone(); + EXPECT_EQ("UTC", utc.name()); + const time_zone nyc = LoadZone("America/New_York"); + EXPECT_EQ("America/New_York", nyc.name()); + const time_zone syd = LoadZone("Australia/Sydney"); + EXPECT_EQ("Australia/Sydney", syd.name()); + const time_zone fixed0 = fixed_time_zone(sys_seconds::zero()); + EXPECT_EQ("UTC", fixed0.name()); + const time_zone fixed_pos = + fixed_time_zone(hours(3) + minutes(25) + seconds(45)); + EXPECT_EQ("Fixed/UTC+03:25:45", fixed_pos.name()); + const time_zone fixed_neg = + fixed_time_zone(-(hours(12) + minutes(34) + seconds(56))); + EXPECT_EQ("Fixed/UTC-12:34:56", fixed_neg.name()); +} + +TEST(TimeZone, Failures) { + time_zone tz; + EXPECT_FALSE(load_time_zone(":America/Los_Angeles", &tz)); + + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("Invalid/TimeZone", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC + + // Ensures that the load still fails on a subsequent attempt. + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("Invalid/TimeZone", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC + + // Loading an empty std::string timezone should fail. + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC +} + +TEST(TimeZone, Equality) { + const time_zone a; + const time_zone b; + EXPECT_EQ(a, b); + EXPECT_EQ(a.name(), b.name()); + + const time_zone implicit_utc; + const time_zone explicit_utc = utc_time_zone(); + EXPECT_EQ(implicit_utc, explicit_utc); + EXPECT_EQ(implicit_utc.name(), explicit_utc.name()); + + const time_zone fixed_zero = fixed_time_zone(sys_seconds::zero()); + EXPECT_EQ(fixed_zero, LoadZone(fixed_zero.name())); + EXPECT_EQ(fixed_zero, explicit_utc); + + const time_zone fixed_utc = LoadZone("Fixed/UTC+00:00:00"); + EXPECT_EQ(fixed_utc, LoadZone(fixed_utc.name())); + EXPECT_EQ(fixed_utc, explicit_utc); + + const time_zone fixed_pos = + fixed_time_zone(hours(3) + minutes(25) + seconds(45)); + EXPECT_EQ(fixed_pos, LoadZone(fixed_pos.name())); + EXPECT_NE(fixed_pos, explicit_utc); + const time_zone fixed_neg = + fixed_time_zone(-(hours(12) + minutes(34) + seconds(56))); + EXPECT_EQ(fixed_neg, LoadZone(fixed_neg.name())); + EXPECT_NE(fixed_neg, explicit_utc); + + const time_zone fixed_lim = fixed_time_zone(hours(24)); + EXPECT_EQ(fixed_lim, LoadZone(fixed_lim.name())); + EXPECT_NE(fixed_lim, explicit_utc); + const time_zone fixed_ovfl = fixed_time_zone(hours(24) + seconds(1)); + EXPECT_EQ(fixed_ovfl, LoadZone(fixed_ovfl.name())); + EXPECT_EQ(fixed_ovfl, explicit_utc); + + EXPECT_EQ(fixed_time_zone(seconds(1)), fixed_time_zone(seconds(1))); + + const time_zone local = local_time_zone(); + EXPECT_EQ(local, LoadZone(local.name())); + + time_zone la = LoadZone("America/Los_Angeles"); + time_zone nyc = LoadZone("America/New_York"); + EXPECT_NE(la, nyc); +} + +TEST(StdChronoTimePoint, TimeTAlignment) { + // Ensures that the Unix epoch and the system clock epoch are an integral + // number of seconds apart. This simplifies conversions to/from time_t. + auto diff = system_clock::time_point() - system_clock::from_time_t(0); + EXPECT_EQ(system_clock::time_point::duration::zero(), diff % seconds(1)); +} + +TEST(BreakTime, TimePointResolution) { + const time_zone utc = utc_time_zone(); + const auto t0 = system_clock::from_time_t(0); + + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); +} + +TEST(BreakTime, LocalTimeInUTC) { + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(0); + ExpectTime(tp, tz, 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInUTCUnaligned) { + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(0) - milliseconds(500); + ExpectTime(tp, tz, 1969, 12, 31, 23, 59, 59, 0, false, "UTC"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimePosix) { + // See IEEE Std 1003.1-1988 B.2.3 General Terms, Epoch. + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(536457599); + ExpectTime(tp, tz, 1986, 12, 31, 23, 59, 59, 0, false, "UTC"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneImpl, LocalTimeInFixed) { + const sys_seconds offset = -(hours(8) + minutes(33) + seconds(47)); + const time_zone tz = fixed_time_zone(offset); + const auto tp = system_clock::from_time_t(0); + ExpectTime(tp, tz, 1969, 12, 31, 15, 26, 13, offset.count(), false, + "UTC-083347"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInNewYork) { + const time_zone tz = LoadZone("America/New_York"); + const auto tp = system_clock::from_time_t(45); + ExpectTime(tp, tz, 1969, 12, 31, 19, 0, 45, -5 * 60 * 60, false, "EST"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInMTV) { + const time_zone tz = LoadZone("America/Los_Angeles"); + const auto tp = system_clock::from_time_t(1380855729); + ExpectTime(tp, tz, 2013, 10, 3, 20, 2, 9, -7 * 60 * 60, true, "PDT"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInSydney) { + const time_zone tz = LoadZone("Australia/Sydney"); + const auto tp = system_clock::from_time_t(90); + ExpectTime(tp, tz, 1970, 1, 1, 10, 1, 30, 10 * 60 * 60, false, "AEST"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(MakeTime, TimePointResolution) { + const time_zone utc = utc_time_zone(); + const time_point tp_ns = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_ns, utc)); + const time_point tp_us = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_us, utc)); + const time_point tp_ms = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_ms, utc)); + const time_point tp_s = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_s, utc)); + const time_point tp_s64 = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_s64, utc)); + + // These next two require time_point_cast because the conversion from a + // resolution of seconds (the return value of convert()) to a coarser + // resolution requires an explicit cast. + const time_point tp_m = + time_point_cast( + convert(civil_second(2015, 1, 2, 3, 4, 5), utc)); + EXPECT_EQ("04:00", format("%M:%E*S", tp_m, utc)); + const time_point tp_h = + time_point_cast( + convert(civil_second(2015, 1, 2, 3, 4, 5), utc)); + EXPECT_EQ("00:00", format("%M:%E*S", tp_h, utc)); +} + +TEST(MakeTime, Normalization) { + const time_zone tz = LoadZone("America/New_York"); + const auto tp = convert(civil_second(2009, 2, 13, 18, 31, 30), tz); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // Now requests for the same time_point but with out-of-range fields. + EXPECT_EQ(tp, convert(civil_second(2008, 14, 13, 18, 31, 30), tz)); // month + EXPECT_EQ(tp, convert(civil_second(2009, 1, 44, 18, 31, 30), tz)); // day + EXPECT_EQ(tp, convert(civil_second(2009, 2, 12, 42, 31, 30), tz)); // hour + EXPECT_EQ(tp, convert(civil_second(2009, 2, 13, 17, 91, 30), tz)); // minute + EXPECT_EQ(tp, convert(civil_second(2009, 2, 13, 18, 30, 90), tz)); // second +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(MakeTime, SysSecondsLimits) { + const char RFC3339[] = "%Y-%m-%dT%H:%M:%S%Ez"; + const time_zone utc = utc_time_zone(); + const time_zone east = fixed_time_zone(hours(14)); + const time_zone west = fixed_time_zone(-hours(14)); + time_point tp; + + // Approach the maximal time_point value from below. + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 6), utc); + EXPECT_EQ("292277026596-12-04T15:30:06+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 7), utc); + EXPECT_EQ("292277026596-12-04T15:30:07+00:00", format(RFC3339, tp, utc)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 8), utc); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), utc); + EXPECT_EQ(time_point::max(), tp); + + // Checks that we can also get the maximal value for a far-east zone. + tp = convert(civil_second(292277026596, 12, 5, 5, 30, 7), east); + EXPECT_EQ("292277026596-12-05T05:30:07+14:00", format(RFC3339, tp, east)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 5, 5, 30, 8), east); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), east); + EXPECT_EQ(time_point::max(), tp); + + // Checks that we can also get the maximal value for a far-west zone. + tp = convert(civil_second(292277026596, 12, 4, 1, 30, 7), west); + EXPECT_EQ("292277026596-12-04T01:30:07-14:00", format(RFC3339, tp, west)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 4, 7, 30, 8), west); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), west); + EXPECT_EQ(time_point::max(), tp); + + // Approach the minimal time_point value from above. + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 53), utc); + EXPECT_EQ("-292277022657-01-27T08:29:53+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 52), utc); + EXPECT_EQ("-292277022657-01-27T08:29:52+00:00", format(RFC3339, tp, utc)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 51), utc); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), utc); + EXPECT_EQ(time_point::min(), tp); + + // Checks that we can also get the minimal value for a far-east zone. + tp = convert(civil_second(-292277022657, 1, 27, 22, 29, 52), east); + EXPECT_EQ("-292277022657-01-27T22:29:52+14:00", format(RFC3339, tp, east)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 27, 22, 29, 51), east); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), east); + EXPECT_EQ(time_point::min(), tp); + + // Checks that we can also get the minimal value for a far-west zone. + tp = convert(civil_second(-292277022657, 1, 26, 18, 29, 52), west); + EXPECT_EQ("-292277022657-01-26T18:29:52-14:00", format(RFC3339, tp, west)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 26, 18, 29, 51), west); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), west); + EXPECT_EQ(time_point::min(), tp); +} + +TEST(TimeZoneEdgeCase, AmericaNewYork) { + const time_zone tz = LoadZone("America/New_York"); + + // Spring 1:59:59 -> 3:00:00 + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -5 * 3600, false, "EST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 3, 0, 0, -4 * 3600, true, "EDT"); + + // Fall 1:59:59 -> 1:00:00 + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -4 * 3600, true, "EDT"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 1, 0, 0, -5 * 3600, false, "EST"); +} + +TEST(TimeZoneEdgeCase, AmericaLosAngeles) { + const time_zone tz = LoadZone("America/Los_Angeles"); + + // Spring 1:59:59 -> 3:00:00 + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -8 * 3600, false, "PST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 3, 0, 0, -7 * 3600, true, "PDT"); + + // Fall 1:59:59 -> 1:00:00 + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -7 * 3600, true, "PDT"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 1, 0, 0, -8 * 3600, false, "PST"); +} + +TEST(TimeZoneEdgeCase, ArizonaNoTransition) { + const time_zone tz = LoadZone("America/Phoenix"); + + // No transition in Spring. + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -7 * 3600, false, "MST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 2, 0, 0, -7 * 3600, false, "MST"); + + // No transition in Fall. + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -7 * 3600, false, "MST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 2, 0, 0, -7 * 3600, false, "MST"); +} + +TEST(TimeZoneEdgeCase, AsiaKathmandu) { + const time_zone tz = LoadZone("Asia/Kathmandu"); + + // A non-DST offset change from +0530 to +0545 + // + // 504901799 == Tue, 31 Dec 1985 23:59:59 +0530 (+0530) + // 504901800 == Wed, 1 Jan 1986 00:15:00 +0545 (+0545) + auto tp = convert(civil_second(1985, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1985, 12, 31, 23, 59, 59, 5.5 * 3600, false, "+0530"); + tp += seconds(1); + ExpectTime(tp, tz, 1986, 1, 1, 0, 15, 0, 5.75 * 3600, false, "+0545"); +} + +TEST(TimeZoneEdgeCase, PacificChatham) { + const time_zone tz = LoadZone("Pacific/Chatham"); + + // One-hour DST offset changes, but at atypical values + // + // 1365256799 == Sun, 7 Apr 2013 03:44:59 +1345 (+1345) + // 1365256800 == Sun, 7 Apr 2013 02:45:00 +1245 (+1245) + auto tp = convert(civil_second(2013, 4, 7, 3, 44, 59), tz); + ExpectTime(tp, tz, 2013, 4, 7, 3, 44, 59, 13.75 * 3600, true, "+1345"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 4, 7, 2, 45, 0, 12.75 * 3600, false, "+1245"); + + // 1380376799 == Sun, 29 Sep 2013 02:44:59 +1245 (+1245) + // 1380376800 == Sun, 29 Sep 2013 03:45:00 +1345 (+1345) + tp = convert(civil_second(2013, 9, 29, 2, 44, 59), tz); + ExpectTime(tp, tz, 2013, 9, 29, 2, 44, 59, 12.75 * 3600, false, "+1245"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 9, 29, 3, 45, 0, 13.75 * 3600, true, "+1345"); +} + +TEST(TimeZoneEdgeCase, AustraliaLordHowe) { + const time_zone tz = LoadZone("Australia/Lord_Howe"); + + // Half-hour DST offset changes + // + // 1365260399 == Sun, 7 Apr 2013 01:59:59 +1100 (+11) + // 1365260400 == Sun, 7 Apr 2013 01:30:00 +1030 (+1030) + auto tp = convert(civil_second(2013, 4, 7, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 4, 7, 1, 59, 59, 11 * 3600, true, "+11"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 4, 7, 1, 30, 0, 10.5 * 3600, false, "+1030"); + + // 1380986999 == Sun, 6 Oct 2013 01:59:59 +1030 (+1030) + // 1380987000 == Sun, 6 Oct 2013 02:30:00 +1100 (+11) + tp = convert(civil_second(2013, 10, 6, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 10, 6, 1, 59, 59, 10.5 * 3600, false, "+1030"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 10, 6, 2, 30, 0, 11 * 3600, true, "+11"); +} + +TEST(TimeZoneEdgeCase, PacificApia) { + const time_zone tz = LoadZone("Pacific/Apia"); + + // At the end of December 2011, Samoa jumped forward by one day, + // skipping 30 December from the local calendar, when the nation + // moved to the west of the International Date Line. + // + // A one-day, non-DST offset change + // + // 1325239199 == Thu, 29 Dec 2011 23:59:59 -1000 (-10) + // 1325239200 == Sat, 31 Dec 2011 00:00:00 +1400 (+14) + auto tp = convert(civil_second(2011, 12, 29, 23, 59, 59), tz); + ExpectTime(tp, tz, 2011, 12, 29, 23, 59, 59, -10 * 3600, true, "-10"); + EXPECT_EQ(363, get_yearday(civil_day(convert(tp, tz)))); + tp += seconds(1); + ExpectTime(tp, tz, 2011, 12, 31, 0, 0, 0, 14 * 3600, true, "+14"); + EXPECT_EQ(365, get_yearday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneEdgeCase, AfricaCairo) { + const time_zone tz = LoadZone("Africa/Cairo"); + + // An interesting case of midnight not existing. + // + // 1400191199 == Thu, 15 May 2014 23:59:59 +0200 (EET) + // 1400191200 == Fri, 16 May 2014 01:00:00 +0300 (EEST) + auto tp = convert(civil_second(2014, 5, 15, 23, 59, 59), tz); + ExpectTime(tp, tz, 2014, 5, 15, 23, 59, 59, 2 * 3600, false, "EET"); + tp += seconds(1); + ExpectTime(tp, tz, 2014, 5, 16, 1, 0, 0, 3 * 3600, true, "EEST"); +} + +TEST(TimeZoneEdgeCase, AfricaMonrovia) { + const time_zone tz = LoadZone("Africa/Monrovia"); + + // Strange offset change -00:44:30 -> +00:00:00 (non-DST) + // + // 63593069 == Thu, 6 Jan 1972 23:59:59 -0044 (MMT) + // 63593070 == Fri, 7 Jan 1972 00:44:30 +0000 (GMT) + auto tp = convert(civil_second(1972, 1, 6, 23, 59, 59), tz); + ExpectTime(tp, tz, 1972, 1, 6, 23, 59, 59, -44.5 * 60, false, "MMT"); + tp += seconds(1); +#ifndef TZDATA_2017B_IS_UBIQUITOUS + // The 2017b tzdata release moved the shift from -004430 to +00 + // from 1972-05-01 to 1972-01-07, so we temporarily accept both + // outcomes until 2017b is ubiquitous. + if (tz.lookup(tp).offset == -44.5 * 60) { + tp = convert(civil_second(1972, 4, 30, 23, 59, 59), tz); + ExpectTime(tp, tz, 1972, 4, 30, 23, 59, 59, -44.5 * 60, false, "LRT"); + tp += seconds(1); + ExpectTime(tp, tz, 1972, 5, 1, 0, 44, 30, 0 * 60, false, "GMT"); + return; + } +#endif + ExpectTime(tp, tz, 1972, 1, 7, 0, 44, 30, 0 * 60, false, "GMT"); +} + +TEST(TimeZoneEdgeCase, AmericaJamaica) { + // Jamaica discontinued DST transitions in 1983, and is now at a + // constant -0500. This makes it an interesting edge-case target. + // Note that the 32-bit times used in a (tzh_version == 0) zoneinfo + // file cannot represent the abbreviation-only transition of 1890, + // so we ignore the abbreviation by expecting what we received. + const time_zone tz = LoadZone("America/Jamaica"); + + // Before the first transition. + auto tp = convert(civil_second(1889, 12, 31, 0, 0, 0), tz); +#if AMERICA_JAMAICA_PRE_1913_OFFSET_FIX + // Commit 907241e: Fix off-by-1 error for Jamaica and T&C before 1913. + // Until that commit has made its way into a full release we avoid the + // expectations on the -18430 offset below. TODO: Uncomment these. + ExpectTime(tp, tz, 1889, 12, 31, 0, 0, 0, -18430, false, + tz.lookup(tp).abbr); + + // Over the first (abbreviation-change only) transition. + // -2524503170 == Tue, 31 Dec 1889 23:59:59 -0507 (LMT) + // -2524503169 == Wed, 1 Jan 1890 00:00:00 -0507 (KMT) + tp = convert(civil_second(1889, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1889, 12, 31, 23, 59, 59, -18430, false, + tz.lookup(tp).abbr); + tp += seconds(1); + ExpectTime(tp, tz, 1890, 1, 1, 0, 0, 0, -18430, false, "KMT"); +#endif + + // Over the last (DST) transition. + // 436341599 == Sun, 30 Oct 1983 01:59:59 -0400 (EDT) + // 436341600 == Sun, 30 Oct 1983 01:00:00 -0500 (EST) + tp = convert(civil_second(1983, 10, 30, 1, 59, 59), tz); + ExpectTime(tp, tz, 1983, 10, 30, 1, 59, 59, -4 * 3600, true, "EDT"); + tp += seconds(1); + ExpectTime(tp, tz, 1983, 10, 30, 1, 0, 0, -5 * 3600, false, "EST"); + + // After the last transition. + tp = convert(civil_second(1983, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1983, 12, 31, 23, 59, 59, -5 * 3600, false, "EST"); +} + +TEST(TimeZoneEdgeCase, WET) { + // Cover some non-existent times within forward transitions. + const time_zone tz = LoadZone("WET"); + + // Before the first transition. + auto tp = convert(civil_second(1977, 1, 1, 0, 0, 0), tz); + ExpectTime(tp, tz, 1977, 1, 1, 0, 0, 0, 0, false, "WET"); + + // Over the first transition. + // 228877199 == Sun, 3 Apr 1977 00:59:59 +0000 (WET) + // 228877200 == Sun, 3 Apr 1977 02:00:00 +0100 (WEST) + tp = convert(civil_second(1977, 4, 3, 0, 59, 59), tz); + ExpectTime(tp, tz, 1977, 4, 3, 0, 59, 59, 0, false, "WET"); + tp += seconds(1); + ExpectTime(tp, tz, 1977, 4, 3, 2, 0, 0, 1 * 3600, true, "WEST"); + + // A non-existent time within the first transition. + time_zone::civil_lookup cl1 = tz.lookup(civil_second(1977, 4, 3, 1, 15, 0)); + EXPECT_EQ(time_zone::civil_lookup::SKIPPED, cl1.kind); + ExpectTime(cl1.pre, tz, 1977, 4, 3, 2, 15, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl1.trans, tz, 1977, 4, 3, 2, 0, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl1.post, tz, 1977, 4, 3, 0, 15, 0, 0 * 3600, false, "WET"); + + // A non-existent time within the second forward transition. + time_zone::civil_lookup cl2 = tz.lookup(civil_second(1978, 4, 2, 1, 15, 0)); + EXPECT_EQ(time_zone::civil_lookup::SKIPPED, cl2.kind); + ExpectTime(cl2.pre, tz, 1978, 4, 2, 2, 15, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl2.trans, tz, 1978, 4, 2, 2, 0, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl2.post, tz, 1978, 4, 2, 0, 15, 0, 0 * 3600, false, "WET"); +} + +TEST(TimeZoneEdgeCase, FixedOffsets) { + const time_zone gmtm5 = LoadZone("Etc/GMT+5"); // -0500 + auto tp = convert(civil_second(1970, 1, 1, 0, 0, 0), gmtm5); + ExpectTime(tp, gmtm5, 1970, 1, 1, 0, 0, 0, -5 * 3600, false, "-05"); + EXPECT_EQ(system_clock::from_time_t(5 * 3600), tp); + + const time_zone gmtp5 = LoadZone("Etc/GMT-5"); // +0500 + tp = convert(civil_second(1970, 1, 1, 0, 0, 0), gmtp5); + ExpectTime(tp, gmtp5, 1970, 1, 1, 0, 0, 0, 5 * 3600, false, "+05"); + EXPECT_EQ(system_clock::from_time_t(-5 * 3600), tp); +} + +TEST(TimeZoneEdgeCase, NegativeYear) { + // Tests transition from year 0 (aka 1BCE) to year -1. + const time_zone tz = utc_time_zone(); + auto tp = convert(civil_second(0, 1, 1, 0, 0, 0), tz); + ExpectTime(tp, tz, 0, 1, 1, 0, 0, 0, 0 * 3600, false, "UTC"); + EXPECT_EQ(weekday::saturday, get_weekday(civil_day(convert(tp, tz)))); + tp -= seconds(1); + ExpectTime(tp, tz, -1, 12, 31, 23, 59, 59, 0 * 3600, false, "UTC"); + EXPECT_EQ(weekday::friday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneEdgeCase, UTC32bitLimit) { + const time_zone tz = utc_time_zone(); + + // Limits of signed 32-bit time_t + // + // 2147483647 == Tue, 19 Jan 2038 03:14:07 +0000 (UTC) + // 2147483648 == Tue, 19 Jan 2038 03:14:08 +0000 (UTC) + auto tp = convert(civil_second(2038, 1, 19, 3, 14, 7), tz); + ExpectTime(tp, tz, 2038, 1, 19, 3, 14, 7, 0 * 3600, false, "UTC"); + tp += seconds(1); + ExpectTime(tp, tz, 2038, 1, 19, 3, 14, 8, 0 * 3600, false, "UTC"); +} + +TEST(TimeZoneEdgeCase, UTC5DigitYear) { + const time_zone tz = utc_time_zone(); + + // Rollover to 5-digit year + // + // 253402300799 == Fri, 31 Dec 9999 23:59:59 +0000 (UTC) + // 253402300800 == Sat, 1 Jan 1000 00:00:00 +0000 (UTC) + auto tp = convert(civil_second(9999, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 9999, 12, 31, 23, 59, 59, 0 * 3600, false, "UTC"); + tp += seconds(1); + ExpectTime(tp, tz, 10000, 1, 1, 0, 0, 0, 0 * 3600, false, "UTC"); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_posix.cc b/absl/time/internal/cctz/src/time_zone_posix.cc new file mode 100644 index 000000000..75ad8bcba --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_posix.cc @@ -0,0 +1,155 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "time_zone_posix.h" + +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +const char kDigits[] = "0123456789"; + +const char* ParseInt(const char* p, int min, int max, int* vp) { + int value = 0; + const char* op = p; + const int kMaxInt = std::numeric_limits::max(); + for (; const char* dp = strchr(kDigits, *p); ++p) { + int d = static_cast(dp - kDigits); + if (d >= 10) break; // '\0' + if (value > kMaxInt / 10) return nullptr; + value *= 10; + if (value > kMaxInt - d) return nullptr; + value += d; + } + if (p == op || value < min || value > max) return nullptr; + *vp = value; + return p; +} + +// abbr = <.*?> | [^-+,\d]{3,} +const char* ParseAbbr(const char* p, std::string* abbr) { + const char* op = p; + if (*p == '<') { // special zoneinfo <...> form + while (*++p != '>') { + if (*p == '\0') return nullptr; + } + abbr->assign(op + 1, static_cast(p - op) - 1); + return ++p; + } + while (*p != '\0') { + if (strchr("-+,", *p)) break; + if (strchr(kDigits, *p)) break; + ++p; + } + if (p - op < 3) return nullptr; + abbr->assign(op, static_cast(p - op)); + return p; +} + +// offset = [+|-]hh[:mm[:ss]] (aggregated into single seconds value) +const char* ParseOffset(const char* p, int min_hour, int max_hour, int sign, + std::int_fast32_t* offset) { + if (p == nullptr) return nullptr; + if (*p == '+' || *p == '-') { + if (*p++ == '-') sign = -sign; + } + int hours = 0; + int minutes = 0; + int seconds = 0; + + p = ParseInt(p, min_hour, max_hour, &hours); + if (p == nullptr) return nullptr; + if (*p == ':') { + p = ParseInt(p + 1, 0, 59, &minutes); + if (p == nullptr) return nullptr; + if (*p == ':') { + p = ParseInt(p + 1, 0, 59, &seconds); + if (p == nullptr) return nullptr; + } + } + *offset = sign * ((((hours * 60) + minutes) * 60) + seconds); + return p; +} + +// datetime = ( Jn | n | Mm.w.d ) [ / offset ] +const char* ParseDateTime(const char* p, PosixTransition* res) { + if (p != nullptr && *p == ',') { + if (*++p == 'M') { + int month = 0; + if ((p = ParseInt(p + 1, 1, 12, &month)) != nullptr && *p == '.') { + int week = 0; + if ((p = ParseInt(p + 1, 1, 5, &week)) != nullptr && *p == '.') { + int weekday = 0; + if ((p = ParseInt(p + 1, 0, 6, &weekday)) != nullptr) { + res->date.fmt = PosixTransition::M; + res->date.m.month = static_cast(month); + res->date.m.week = static_cast(week); + res->date.m.weekday = static_cast(weekday); + } + } + } + } else if (*p == 'J') { + int day = 0; + if ((p = ParseInt(p + 1, 1, 365, &day)) != nullptr) { + res->date.fmt = PosixTransition::J; + res->date.j.day = static_cast(day); + } + } else { + int day = 0; + if ((p = ParseInt(p, 0, 365, &day)) != nullptr) { + res->date.fmt = PosixTransition::N; + res->date.j.day = static_cast(day); + } + } + } + if (p != nullptr) { + res->time.offset = 2 * 60 * 60; // default offset is 02:00:00 + if (*p == '/') p = ParseOffset(p + 1, -167, 167, 1, &res->time.offset); + } + return p; +} + +} // namespace + +// spec = std offset [ dst [ offset ] , datetime , datetime ] +bool ParsePosixSpec(const std::string& spec, PosixTimeZone* res) { + const char* p = spec.c_str(); + if (*p == ':') return false; + + p = ParseAbbr(p, &res->std_abbr); + p = ParseOffset(p, 0, 24, -1, &res->std_offset); + if (p == nullptr) return false; + if (*p == '\0') return true; + + p = ParseAbbr(p, &res->dst_abbr); + if (p == nullptr) return false; + res->dst_offset = res->std_offset + (60 * 60); // default + if (*p != ',') p = ParseOffset(p, 0, 24, -1, &res->dst_offset); + + p = ParseDateTime(p, &res->dst_start); + p = ParseDateTime(p, &res->dst_end); + + return p != nullptr && *p == '\0'; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_posix.h b/absl/time/internal/cctz/src/time_zone_posix.h new file mode 100644 index 000000000..6619f27ed --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_posix.h @@ -0,0 +1,118 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Parsing of a POSIX zone spec as described in the TZ part of section 8.3 in +// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html. +// +// The current POSIX spec for America/Los_Angeles is "PST8PDT,M3.2.0,M11.1.0", +// which would be broken down as ... +// +// PosixTimeZone { +// std_abbr = "PST" +// std_offset = -28800 +// dst_abbr = "PDT" +// dst_offset = -25200 +// dst_start = PosixTransition { +// date { +// m { +// month = 3 +// week = 2 +// weekday = 0 +// } +// } +// time { +// offset = 7200 +// } +// } +// dst_end = PosixTransition { +// date { +// m { +// month = 11 +// week = 1 +// weekday = 0 +// } +// } +// time { +// offset = 7200 +// } +// } +// } + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ + +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +// The date/time of the transition. The date is specified as either: +// (J) the Nth day of the year (1 <= N <= 365), excluding leap days, or +// (N) the Nth day of the year (0 <= N <= 365), including leap days, or +// (M) the Nth weekday of a month (e.g., the 2nd Sunday in March). +// The time, specified as a day offset, identifies the particular moment +// of the transition, and may be negative or >= 24h, and in which case +// it would take us to another day, and perhaps week, or even month. +struct PosixTransition { + enum DateFormat { J, N, M }; + struct { + DateFormat fmt; + union { + struct { + std::int_fast16_t day; // day of non-leap year [1:365] + } j; + struct { + std::int_fast16_t day; // day of year [0:365] + } n; + struct { + std::int_fast8_t month; // month of year [1:12] + std::int_fast8_t week; // week of month [1:5] (5==last) + std::int_fast8_t weekday; // 0==Sun, ..., 6=Sat + } m; + }; + } date; + struct { + std::int_fast32_t offset; // seconds before/after 00:00:00 + } time; +}; + +// The entirety of a POSIX-std::string specified time-zone rule. The standard +// abbreviation and offset are always given. If the time zone includes +// daylight saving, then the daylight abbrevation is non-empty and the +// remaining fields are also valid. Note that the start/end transitions +// are not ordered---in the southern hemisphere the transition to end +// daylight time occurs first in any particular year. +struct PosixTimeZone { + std::string std_abbr; + std::int_fast32_t std_offset; + + std::string dst_abbr; + std::int_fast32_t dst_offset; + PosixTransition dst_start; + PosixTransition dst_end; +}; + +// Breaks down a POSIX time-zone specification into its constituent pieces, +// filling in any missing values (DST offset, or start/end transition times) +// with the standard-defined defaults. Returns false if the specification +// could not be parsed (although some fields of *res may have been altered). +bool ParsePosixSpec(const std::string& spec, PosixTimeZone* res); + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ diff --git a/absl/time/internal/cctz/src/tzfile.h b/absl/time/internal/cctz/src/tzfile.h new file mode 100644 index 000000000..90cfc0c42 --- /dev/null +++ b/absl/time/internal/cctz/src/tzfile.h @@ -0,0 +1,117 @@ +#ifndef TZFILE_H + +#define TZFILE_H + +/* +** This file is in the public domain, so clarified as of +** 1996-06-05 by Arthur David Olson. +*/ + +/* +** This header is for use ONLY with the time conversion code. +** There is no guarantee that it will remain unchanged, +** or that it will remain at all. +** Do NOT copy it to any system include directory. +** Thank you! +*/ + +/* +** Information about time zone files. +*/ + +#ifndef TZDIR +#define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */ +#endif /* !defined TZDIR */ + +#ifndef TZDEFAULT +#define TZDEFAULT "/etc/localtime" +#endif /* !defined TZDEFAULT */ + +#ifndef TZDEFRULES +#define TZDEFRULES "posixrules" +#endif /* !defined TZDEFRULES */ + +/* +** Each file begins with. . . +*/ + +#define TZ_MAGIC "TZif" + +struct tzhead { + char tzh_magic[4]; /* TZ_MAGIC */ + char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */ + char tzh_reserved[15]; /* reserved; must be zero */ + char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ + char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ + char tzh_leapcnt[4]; /* coded number of leap seconds */ + char tzh_timecnt[4]; /* coded number of transition times */ + char tzh_typecnt[4]; /* coded number of local time types */ + char tzh_charcnt[4]; /* coded number of abbr. chars */ +}; + +/* +** . . .followed by. . . +** +** tzh_timecnt (char [4])s coded transition times a la time(2) +** tzh_timecnt (unsigned char)s types of local time starting at above +** tzh_typecnt repetitions of +** one (char [4]) coded UT offset in seconds +** one (unsigned char) used to set tm_isdst +** one (unsigned char) that's an abbreviation list index +** tzh_charcnt (char)s '\0'-terminated zone abbreviations +** tzh_leapcnt repetitions of +** one (char [4]) coded leap second transition times +** one (char [4]) total correction after above +** tzh_ttisstdcnt (char)s indexed by type; if 1, transition +** time is standard time, if 0, +** transition time is wall clock time +** if absent, transition times are +** assumed to be wall clock time +** tzh_ttisgmtcnt (char)s indexed by type; if 1, transition +** time is UT, if 0, +** transition time is local time +** if absent, transition times are +** assumed to be local time +*/ + +/* +** If tzh_version is '2' or greater, the above is followed by a second instance +** of tzhead and a second instance of the data in which each coded transition +** time uses 8 rather than 4 chars, +** then a POSIX-TZ-environment-variable-style std::string for use in handling +** instants after the last transition time stored in the file +** (with nothing between the newlines if there is no POSIX representation for +** such instants). +** +** If tz_version is '3' or greater, the above is extended as follows. +** First, the POSIX TZ std::string's hour offset may range from -167 +** through 167 as compared to the POSIX-required 0 through 24. +** Second, its DST start time may be January 1 at 00:00 and its stop +** time December 31 at 24:00 plus the difference between DST and +** standard time, indicating DST all year. +*/ + +/* +** In the current implementation, "tzset()" refuses to deal with files that +** exceed any of the limits below. +*/ + +#ifndef TZ_MAX_TIMES +#define TZ_MAX_TIMES 2000 +#endif /* !defined TZ_MAX_TIMES */ + +#ifndef TZ_MAX_TYPES +/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */ +#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ +#endif /* !defined TZ_MAX_TYPES */ + +#ifndef TZ_MAX_CHARS +#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ + /* (limited by what unsigned chars can hold) */ +#endif /* !defined TZ_MAX_CHARS */ + +#ifndef TZ_MAX_LEAPS +#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ +#endif /* !defined TZ_MAX_LEAPS */ + +#endif /* !defined TZFILE_H */ diff --git a/absl/time/internal/cctz/src/zone_info_source.cc b/absl/time/internal/cctz/src/zone_info_source.cc new file mode 100644 index 000000000..b77c0a585 --- /dev/null +++ b/absl/time/internal/cctz/src/zone_info_source.cc @@ -0,0 +1,70 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Defined out-of-line to avoid emitting a weak vtable in all TUs. +ZoneInfoSource::~ZoneInfoSource() {} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +namespace absl { +namespace time_internal { +namespace cctz_extension { + +namespace { + +// A default for cctz_extension::zone_info_source_factory, which simply +// defers to the fallback factory. +std::unique_ptr DefaultFactory( + const std::string& name, + const std::function( + const std::string& name)>& fallback_factory) { + return fallback_factory(name); +} + +} // namespace + +// A "weak" definition for cctz_extension::zone_info_source_factory. +// The user may override this with their own "strong" definition (see +// zone_info_source.h). +#if defined(_MSC_VER) +extern ZoneInfoSourceFactory zone_info_source_factory; +extern ZoneInfoSourceFactory default_factory; +ZoneInfoSourceFactory default_factory = DefaultFactory; +#if defined(_M_IX86) +#pragma comment( \ + linker, \ + "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZA=?default_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZA") +#elif defined(_M_IA_64) || defined(_M_AMD64) +#pragma comment( \ + linker, \ + "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZEA=?default_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZEA") +#else +#error Unsupported MSVC platform +#endif +#else +ZoneInfoSourceFactory zone_info_source_factory + __attribute__((weak)) = DefaultFactory; +#endif // _MSC_VER + +} // namespace cctz_extension +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/testdata/README.zoneinfo b/absl/time/internal/cctz/testdata/README.zoneinfo new file mode 100644 index 000000000..95fb4a91d --- /dev/null +++ b/absl/time/internal/cctz/testdata/README.zoneinfo @@ -0,0 +1,37 @@ +testdata/zoneinfo contains time-zone data files that may be used with CCTZ. +Install them in a location referenced by the ${TZDIR} environment variable. +Symbolic and hard links have been eliminated for portability. + +On Linux systems the distribution's versions of these files can probably +already be found in the default ${TZDIR} location, /usr/share/zoneinfo. + +New versions can be generated using the following shell script. + + #!/bin/sh - + set -e + DESTDIR=$(mktemp -d) + trap "rm -fr ${DESTDIR}" 0 2 15 + ( + cd ${DESTDIR} + git clone https://github.com/eggert/tz.git + make --directory=tz \ + install DESTDIR=${DESTDIR} \ + DATAFORM=vanguard \ + TZDIR=/zoneinfo \ + REDO=posix_only \ + LOCALTIME=Factory \ + TZDATA_TEXT= \ + ZONETABLES=zone1970.tab + tar --create --dereference --hard-dereference --file tzfile.tar \ + --directory=tz tzfile.h + tar --create --dereference --hard-dereference --file zoneinfo.tar \ + --exclude=zoneinfo/posixrules zoneinfo \ + --directory=tz version + ) + tar --extract --directory src --file ${DESTDIR}/tzfile.tar + tar --extract --directory testdata --file ${DESTDIR}/zoneinfo.tar + exit 0 + +To run the CCTZ tests using the testdata/zoneinfo files, execute: + + bazel test --test_env=TZDIR=${PWD}/testdata/zoneinfo ... diff --git a/absl/time/internal/cctz/testdata/version b/absl/time/internal/cctz/testdata/version new file mode 100644 index 000000000..05c3ec280 --- /dev/null +++ b/absl/time/internal/cctz/testdata/version @@ -0,0 +1 @@ +2018d-2-g8d1dac0 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra new file mode 100644 index 0000000000000000000000000000000000000000..8726e80df27f8d6794b295674a18a71c9cab4c85 GIT binary patch literal 842 zcmWHE%1kq2zyQn)3=AL)k}!a>`5G7)80HzIZCPwm-LUxbpMa&J>lv1A)xWUp+oOi% z(~<*L+z?|}Sw8K;s$H`gR!2!+STp-v!&+;}b+KoVYB>aI$FT zg;QI68cqkF4LCEkf#Iwv!vzK=Mv~zF|NqZ`0)S-$BMXRT;PUYeVbC@(Ffw3p_YDCH zF))x4f8U; zHi!m=IEV&?I*0~^JctH`K8Oaz0Eh;~0+{~04QwAMHb8t(jDToRtbpl*d0_iNu><0R zVhBWoVhKcpVhTiqVhcorVhlusVhu!tVh%)uVh==vVh}`wVi81xViH7yViQcisRFwP z6ssUUC}u%4D0ad0x`$wSP%MM^pqK{Hpx6e{pcn_ypjZddpqK~Ipx6h|v`Yb8?!F-g FTmWHgm;L|% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers new file mode 100644 index 0000000000000000000000000000000000000000..2a25f3ac268fd5c605c58d36260759c8f8d125bc GIT binary patch literal 760 zcmWHE%1kq2zyKT!3=AL)l2C%Or5YF*7$znJ_|JB)_%QprPQjc#6AR`Z@c1yV^IyUI z1zH~#BrN@~uz}~pB0ZrGi>rJ-EHQ2Tuw(~Y!Lk2r1;-lctK(e zybKI73XFmvaRxCE$;jd38^RFa8^RFo8Vn*r7@R>2XV(x01_nk(ur4S;M0hE~!s`cA z&;S4b|7V}@d;p?B;Rm8YVF;$L>lA=!P*{R!PVqCw#gqCs&0qCxQhqCs&1qCxQiqCs&2qCxQj z@&+hwKr|?RKr|?hKr|?xKr|?>Kr|@6Kr|@MKr|@cKr|@sKr|@+1~dY>oLxh74Y>g8 CboU$p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau new file mode 100644 index 0000000000000000000000000000000000000000..8e32be3e6e843379e69000273552ab8588c5ca34 GIT binary patch literal 208 zcmWHE%1kq2zyQn)3=AL)k^s>l%+tWYz%c3AoC%!ii2@9aO#lCXOkrU7|Nr9$1{RPy s1`Z$J5C&ZXLk4%>5C#TD5F*9+A7Dd3CjS2qvIfK@!746y-w*>X038@4g#Z8m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo new file mode 100644 index 0000000000000000000000000000000000000000..ba097504459673e254831edea689c2f8143990df GIT binary patch literal 1972 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 QXR2qQ<7;RDqVfF*awCTI z3;YWEXnN->O9pzYo1H;K*)i;5e51f%^py15cv+2i}wR4Sao{ z3ivMvHVCLME|A*3j6tqvf`EKYqkuwAk$_@MvVf9Lh=8(-wx1x$jb37E>x6)-cZ5HR~&FJK`(WrD@sL;=g+WfQFSIty6ej+kJxEPjIRZmS7) zZH^P{XUj}*NK>BR*kUQ*TJZD0PkNbpBalZ*+ zI+_#0z8g%45OouXxGppy@~ehG)V41ZqOWoZ#4HdLh~4r=Ag=ziK>U<*0txX~1rlpt zO-QoeE|461WEoPpQJH-sVF6@-IB7@S=}I5-5Pn2~{z5kxaE zG7^#KL1`V70mOcQ^)N8}|NsAgo!M3}4ax){J}4uAXi#PV)6et3@}Nus;)5~5foM=h0@0w% z1foG13Pgi46^I69ED#OKTp${h!9X-9lYwYZMg!5H%m$)C84g5)G98EpWjqiK%6uRi zlmWr?SCa`K8k7-1G$=EIXi$a((V$ETqCpuGMC(qu1y&ErpddadlY(eaMg`HJ%nG7G z85Tr?GA)P(Wn2&q%Df;Nl!3wY-+BQM4a&%1`feha56aLWJ}6UzXi&xm(V)x?qCpuP zM1wLphz4bJ5Dm)gAR3h6K{P1SgJ@932hpI+528T@0Eh+^0w5Yx5P<1-&%pMB3Iq@z zR49OGP{9DAL4^Z|1{Dw>8dOMtXiz}`qCtfPhz1oHAR1I?fM`&`0ir>L2Z#n0ARro4 zh=6ENK?0_~8-T+XRG@(Pph5*ig9;W94JuqfG^l_9(V#*GM1u+%5DhA9Ks2bp0nwmB z2SkGk9uN&Gd_Xj)00PmVLI^~I3L+2 zAR1IqfoM=+1)@O(7KjEFS|A!!aDix0;RT{W1sI416=EP7RFHvaP+l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun b/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun new file mode 100644 index 0000000000000000000000000000000000000000..f5f8ffbc61716d3a421f555fa962a2b3e488d78e GIT binary patch literal 1473 zcmWHE%1kq2zyK@^3=AL)l8Az`1sfO`81{I4c))#e!vyXZJPbUE?jLwh+Bfj^eJbF; z9M~YBzPP}{@mYh%ZlwY*Whn-)-m3-PcMdf8#6B(XoxY>N&!p#r|C|L20yuUr2r!(b z5RkrnL10bOg1{T67X-1+TM(2}ydc=TYC-Ti#Rb84+!R85LKlRJ$1Dh~d7u!wnq@(l zj`@PH?{*8qgWDH`H?C2L5Dig?xUR4uQsK*j$cW$tkzdUeqP8=1wLcal zm8&Qu$KG0y;xbVo)ppN9X?{q3{bKG(V(OQqCv?AM1ztLhz2DiFuhx;07Qe56PWJ33g&~76^IW?S|A#fyg)Q4 ziGgTPG6T_|qz0x9XDNW`^yLdcG$`4D=^LlPd{FWO@j*!tM1ztcm|mv{mIozA5FeBz zK{O~?g6WzEU~@sq6T}B4Q84}84y+H9R6%@Das|<#BnzgmD}d!eNf*QiC0{W8)eLMN zC>ewJprj0woB|tPNTYzX#)&SEVA>jbZA|O5}n}BFg zRsqqV>;j@eSq4OdvJHp^WgQR=%03_(l!ZVvC>w!jP*wubpzH*qL0Jk!gR&Kf24yWU z{ow=HAD}D-;)Ajohz4af5Dm(1AR3hAKr|@ZfoM?H1JR)D2ckh)5KIrQY{(Vv8e#y- VoI1Y7dZu~?I=+SmAX?v;3jk4fXO#c| literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg new file mode 100644 index 0000000000000000000000000000000000000000..ddf3652e159e4c3cd844bdedf4784dcd29da23c7 GIT binary patch literal 271 zcmWHE%1kq2zyK@^3=AL)l3;_fIU5)l7@FM9XPjBr({OfPe!;oEyoU32fd!1rOw3Ho z3=C2ZAmySGAe~wUj4TWcG71bVKE5Fg!H&TpAUQB5!b*0Sl|R5b7#RNl|NlR?+R*_- ggPZ`OLCyftAg6$6kaIvZ$Vm(&x`_+qLR}*+09Bqn8vpjeLyg~qng3|*|hTsca3@Q(}9<~Q?KVW;nbA%^=cmInAd`s;w@ULV|5NIn7 z5bSuKAe6rBf^f#k1Q9Ro3!)yY6U4OR1H?6Y6C`*hU6AC+Pmp|jEI{gG_XFt*-T^Wf zb05fVth->*;HtpD#7F=#Gcd?50l8nxfRTlPK}LarlYv3YfPvS?H-y32F&IRIFt|E~ zfYg97DPi#gtb>8!|NsC0!C?a8&l7(DqCjB-qCw#UqCsH zqCw#XqCsH?qCw#YrXRKkfM`%Sf@n}!f@n~9f@n~ff@n~?gUlEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum new file mode 100644 index 0000000000000000000000000000000000000000..f2c9e303797396981ce1900c06cb51e65f94b830 GIT binary patch literal 713 zcmWHE%1kq2zyPca3=AL)l2C!N1sfO`7`83G#lSF6`~hQ?NdQyr&j-xW=@(cM>K?G# zzPZ5Wknn(AULk-(!RY}fL+}MI29*a~58DH{AFw^(Il>dbyZ^-lzNPjT_*b$f2(%Rk z2zESA5K3QmK{(@Nf{2&)1yPUH31Zsu0pc3H2@*V$E=Y3ZCrG|M79jPp`+@WY?*N&L zxesJF)?Kh@a8-!>@g#tOiID(gW@2EF138;P%Yc!Efk8%rfs=tj%YcCw!uIhEVQ_W~ z1`#0)u8tuf??N#t0rLZ@=l}oz|G@zS;?EO*0HQzv1)@QL1)@O#2BJZM2BJX$2ckiN z2ckg%2%tJJBH{QaRC6H4To+3 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz|iD&^a}$c1A|--NJ>V5fyKu+gu&S{1jJ<^ Z#k3z_9SjWr|NsAw-&8JV#}Hj3E&!~&6rcbA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru new file mode 100644 index 0000000000000000000000000000000000000000..ddf3652e159e4c3cd844bdedf4784dcd29da23c7 GIT binary patch literal 271 zcmWHE%1kq2zyK@^3=AL)l3;_fIU5)l7@FM9XPjBr({OfPe!;oEyoU32fd!1rOw3Ho z3=C2ZAmySGAe~wUj4TWcG71bVKE5Fg!H&TpAUQB5!b*0Sl|R5b7#RNl|NlR?+R*_- ggPZ`OLCyftAg6$6kaIvZ$Vm(&x`_+qLR}*+09Bqn8vplEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia new file mode 100644 index 0000000000000000000000000000000000000000..b434c67fa5a3808cea974aaeec9cb4befa99c3bd GIT binary patch literal 233 zcmWHE%1kq2zyK@^3=AL)l3<3ic^ViP7#76m%wawimB+}${Qv*gCkzZ=lI8#Zualq} zIDC9V7<_$07~FkBK-$5W2x~yrfiTYxunv&P|Nlo-Et~WI|Ns9WYeB*ws~JeNo6Frd H#DEI`eYG=~ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena new file mode 100644 index 0000000000000000000000000000000000000000..bbfe19d60a5fc8b8d1a5e5319e4d687e2a2b078d GIT binary patch literal 225 zcmWHE%1kq2zyQn)3=AL)l3;D~!VvBV!oeXR83qOhQY`ra)${-V|NkJ%KwOZ8AetmgxxyVobPc%xED#(Q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz_2jza{vP)0|T=GNQzH@fyKu+gdyB91jJ<^ Z#k3z_9SjWr|NsAw-&C$}#}HjZE&w<@6Bz&i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome new file mode 100644 index 0000000000000000000000000000000000000000..a4ece7ff2b7aba7f8e99fb8ee4ddbe1d439056cf GIT binary patch literal 234 zcmWHE%1kq2zyK@^3=AL)l3<3ic^ViP7$!aIYl!mf5MX3tW?*0oU|{(F|9dh>6+{uA z00W1QZwQ0CZwN!UV+aES10xs{VGYPS5a#&-HSYia|NrA`{u+R2khLITkkt$%+RYX2 J7@}*)1puTXB<}zK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli new file mode 100644 index 0000000000000000000000000000000000000000..b32e2202f572b8ca6ef3c5cf1d9e787a24f2c328 GIT binary patch literal 655 zcmWHE%1kq2zyK@^3=AL)l2C-Q1sfO`7#4mysB(ArMuB_EYZD$;ToQQrJoUj-efxr^ zE6+T5?RV^h*d(U}agOf=;=i;XNW9YeAbC4JLF&x<57K*|B*<*3`XD=B{DItL?gIIy zcL@pwUImJYbq|z+&KD@VFh5W+Vfvt|YM!9xu>FIP-^T=F7qbEr)2s&pb7wLHhTLoj z%G}bxz{CiK%wQ72hLFrmj3C6oz!L*E1x!CreE_0Cp#!E@o&obgp#(Ap z6jC4>6k1^Vm-Yh?4GJ|74GK9B4GKLF4GKXJ4GKjN4GKvR4GK*V4GK{Z4GL8d4GLKh z4GLWl4GLip4GLut4GL)x4GL`#4GM7(4GMJ-4GMV>4GMh_4T=E}O`BNYa&-;SHR1vQ DWhAPk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis new file mode 100644 index 0000000000000000000000000000000000000000..4bd3885a96f61bbf9c0db6b42956b02d6e2bccc4 GIT binary patch literal 710 zcmWHE%1kq2zyNFv3=AL)l2C%O1sfO`7$znJ_#dJt9pS`3GWAIn+66K)#npjo&O5Bv7VgZu6$p> z{oOMGPv(OHj4VvdOf0N$$i$2e85lTwKu%{eWME-nkWpadU|`@AVBm$3AQ2zm5QYHX z5C&)0U=R_)z`(%B2+{doa1sjM41s#Y61s{k81tFL|BnCDQ6qF!7C^$hhC`dsxC|E%>C}=@6D0o5600l9K z1_d*S1_d>U1_d{W1_e2Y1_e8a1_eEc1_eKe21Nmg21Nsi21Nyk21N&m21N;o21N^q f21N~s21O5;e)miOM1!J@&~#-#}o82Wd!tV zUoseY{1Y%tXKgUjcpzZx_PoJF@XrKOwUZ5|AMZ^tXItH1e(}Hri)XzJmKzsMusW9C zU_G&Ag3bCK2HV2433mN?4E9mY0uK2B431W*0#5!$49-&S0xtR@3@*Pk1>E?)F}U60 z7I6O|)ZlSgeS+upFAZLcIVX5;zt-T>^m>Bt^c@X;NoObcm(OYla9TehFkw4GkkZ5n z!45MSLb%rngep`sgub325Y7iL?swl z7#L&}7`PZ1vVGx^997Hnk`}l@1Xd4(B8!!Yr28S>>JBBcXgK=;O zD1cEg5fNeri;y2so&W#;|DRj!T>+v&5d@+^kp!Ya5d~5PiYyQfiZBojiZl=niZ~Dr ziaZbvia-zzibN0%ibxO*icAm#12?#`k5)p_7B_t3HN=zUcl%PN~ rC{clEP{IP!uP1=*2PH5NAC$;IG$^5gXi#Ef7<8$P%h@qR*N6)MQxVaU literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Adak b/absl/time/internal/cctz/testdata/zoneinfo/America/Adak new file mode 100644 index 0000000000000000000000000000000000000000..5696e0f8bedee72515c43f686881a561af339db9 GIT binary patch literal 2365 zcmWHE%1kq2zyO>K3=AL)l9&KxD>g7NFr4mmxo}DOOTneY0Eb_fLO1-|Q5f)lMTi5# zjNkyq4l@U)3ey1Q!k_~ziGdeb15FOFIT~MJHxxU--kW=YQ{cw|&b2QCxIWxE!2RIn z1)iJV9e5AyzQDKhrUU=V8vz0{cRL7n?g|j9oa-Q*IVV6Qvfe?|vo1i)GSNX?Ga*1i zsrG;*r&E9wQ~UubZ6yV%PXPy{9~p0uxny)e_K@fXxlJMmj9n`gU8L0o~JfO)n$3XMm>jPS^>I}5^ojss)dDaHqdFv18 zZLZm%UpMi9!Q{9NhUx1ZjEWsL7`sn!FbP)LV5(l^U}ns+!JIwB!9qsSz~Z@?gXJG) z1FPc_4%WAy8rWe9Kv z_49iNcim+M?w2n*c=C1_cy8Y8;Pp1kze+kmogsIBMY#`R~0!)KV#j=zA9pVp{$< z#O~W{5SMb#A%5Oeg9P7S2NK&iZb;I-b09f=@`e=NeFswAOE;vxU2q^>J$ys@*`@=T z?3Noc*QOlEdM>>ods?GI&IJpD+_GecybV$Y`C+aO1^s^v3eD6Vit_In6pL{>l=vSo zDEY5?pv>aVhO+zY2P!1?ZK&Ay@<8Q}1skg7ojy=~qiI7;-P!}SJ5n~(#q}SkpW(KF zk%^g+g%uxU<6x&F{Qo~HiGkt&|I`2mmjC~Y6Bs$bBoA0b0L&Hvkqi?5|2Gye%7WRF zKE5Fge!(FOe&HbuegPp2PQf7zPA(w~jvm1w3?42ape(}(B0w0zz>&$g7#J8p7^H9# zl&$y!#A5(C>;HfILw_&+|NsAgZF^K4hz4ao5Dm(JU^+3t0Yrl`B8UcOMi2v(AwlNM z2o3;Ipo|HkL75XogEA8kAWE7H6AR3f$!SvdfVDms37{mu< zVh|0=$RHY&nL#utLxX5grUucVj18henHxldGB}6^WpWS=%IF{(l-WTvD8qwjP^Jgb zpo|ZqL75*!g9-pJt*xX0rauK70MVer07Qcd1P~1>6hJhnU;xpe!U05s3J4GlDkMNO zsGtDRpuz$~g9;1~4JtH1G^pSJ(V)TuO#kNu+XpH{KzvX^0-`~M35W(2C?FbCsDNlt z!2+T|g$sxV6)+$gRLFp6P(cHtL4^&71{F9U8dT_jXi&ieqCtfZhz1ovAR1H%f$8UF z4j>v-7=dU|fdryKg%XGc6-*!+R5*cXPyq#^L4_2E1{G8w8dO+;Xi$L#qCtfghz1p0 zAR1J7f$7ih!S;a)F%TbAkb!7WVFso*ZwAYQ3N;WPRIq_)P~irmK?NL$1{HE38dT7M zXi#AXqCo{7hz1pUAR1KgfoM?S2d4j6g2NwF2!i;af)GT53PUh`)B z_=0Fq0Sux+g)o@@uL?FFR2YN!paL00g9>FZz3(Mh9#lAk_@DwBM1u-x5DhA*K{Tka z2GO7b8$^Q&Z3adrW)>z^HhhqslY@?sfnoI{Q29u!!kYn7XoCU(!s7A>4ly+Fa0$`z THP$oIGtluhG}JTHGvERMhxmM- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage b/absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage new file mode 100644 index 0000000000000000000000000000000000000000..6c8bdf226900d7f4c6a4d47338e6742d4d6747cd GIT binary patch literal 2380 zcmWHE%1kq2zyO>K3=AL)l9&KxYcw!0Fr4l*J8(()OTnc?Cxc&?+!y@Yk?in)g_{Ax z3|9xn4h;jQ3UvqOLYECJiOvUD1JyRLIjSCDH{{sB-Wz{_Q{dGG&b7B4xIUcO!2RI# z0iK&L4R{Z%J;1l~v;qIhQw{<%*BS_Ru5l2m>^Bh3>~j!_EHn`HEN~FB3^owg404cA z%HJT#Y2qNo6u3c3TSP$WlhX$2N2&{CE~#vgJ;c61ZWG%E`GqeRD3njUcFnxi6QL)hiWA`QllVFhrrs^pMW=7u@n6tYXSjY$~SUlG-u>Ad1 z!Rk1df%Wa{3N{PT4 z{ru3tU3Z3p`{lz1p1f5Go|~5%c)g8L@SbyUgU_{!1->xDF1>&vFLAu68}vK zCI7`Ylv$ixPA-cb2t(t@gadpA_yC|OWbH-AIzj<5xFag7`5XILy? zWMXDyVZ{g8IN0e3|Nk$pU|{(Fzc_(`<^TW20!9un$paP<0JB9wB!krd|NRY&a$vTy zk8cQrV{izAV|WOIV?YRlqX&rN;S$0S31WD=gfKXI2Zw-i4kL&FVF&|9UgKh5U;tr| z!bwoJ#t#sW0pz;>|LqU`z4-tC|Nph^jvgQylm|idCFL&#U^>ys07QfGBZvm)Ne}~+ zFG1$aaCHDtp!^A2G$`MK>E8GQAR3f^!SveOVDmuv z7{mwVWe^R@&mbCkhz6BGAR1H-foM=! z1g4*B7=UO{nFOLi{ zvI|6m$}bQND#O6^=Z9eXKxG+-4=T?xq zIuH#i??5!D%mdM&at}m<%03VcD*r$LEoCVRKvKB;x%3BZ(Dsw?JsN4n7pt2W4 zgUVkJ4Jv~{G^iW~(V(&zO#c@Ln-40JL3~iT45C40Gnn3Y8!Qhhqd|O7ISrygWi^Nf zmDeB|RAz%{P`M4FL1i}sBNHl%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Antigua b/absl/time/internal/cctz/testdata/zoneinfo/America/Antigua new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina b/absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina new file mode 100644 index 0000000000000000000000000000000000000000..8b295a98bac071e39551940705ea050839e37b9d GIT binary patch literal 910 zcmWHE%1kq2zyQn)3=AL)k}!p`c^ViP7^bZ%G1$TH`C!LihXp%7ni%Z5SE6vsVx7UQ z*S`$zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszS zKdSJH>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL14RSqdf=AqFNt4l0-_$QziQ&sbpo?brs39jywM z_a7Tr_3JFKKJkBpO+McO+anVV?EF3~2xv|<2vo3KQ2+n`e+DK-k|ERo|CcT>F#P}j z_yHr!|NmDnFmU+zhA`+F7%}J?7=wb0fq{XPfc*j0^Z)<<|DXT{(V##E(|;WnfM`%) zgJ@8IgJ@8ogX!153_vs}@WJ%XNCglLiUbf1iU<%5iVP49iVzSDiWCqHiWm?LiX0FP ziXadTiXh!2Wr5DkiK5DkiO5DkiSF#Y2oSUo86L3~gG0MVdC z0HQ$&0Yrlm1BeDC2oMcQ6d)RuFhDdYae!!00s+yWL;|8g2?a#cG_i2m=o%Q?8FK*u DSqMkX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires new file mode 100644 index 0000000000000000000000000000000000000000..e4866ce1778fd2678a85dc6791a6c1b3fcaa5d1e GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&1&?2gHhAtyRH*;||34!WGm(&$1qm{P*{uKnpEO}$`2YX#1qPP? z|BoMF;Q0Ul>IFug|NkF9U=#qc8F+krLl~TWLl|@oOc-VU;v^)F$t!(F5Up5K`{!VL9q&= zK`{%WL9q*>K`{)XL9q;?K`{-YL9q>@K`{=ZL9q^^K`{@e|7n5k1El~EACw9}G$02fM`&v0Mi@Zg887-0pf#F2#5xy5->gg8(1EcT0neIiUHHl=7aqMN;x1t zDD{A7PznOkpi~5+K`9ADgHjWS2Bjzv4Ng@cMvsXDD0o4s3q*rb7>EX?G7t?)X&@Su z+Q9UOvIQU-l?8mH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca new file mode 100644 index 0000000000000000000000000000000000000000..9fe9ad6470939d78d5dfd94276f0ff332f1a91e6 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!D07D1Ba{J2i(g!H@M%aSE&F0|34!WGm(&$1p=8sG&3s`D+?>@|NnHk>~&a#}60}#aT?1nVT?5oOAtILS zVX^cB6lV+|8~^_=nzLT#|NsC0L9qs+K`{rSL9qv-K`{uXuM`-7Xi!Xo>8*=5fM`&R zf@n~zf@o08f@o0ef@n|-gJ@7JgJ@7pgJ@7}gJ@8UgJ@8!gJ@99gXw=-VEaHR0K^BS z0uT*K2_PDj8o>0swgVs7foM=l0@0w<1foGH3Pgib6^PMe;s6R>Q0fBFpcDq8L8%Nx zgHjrZ2BkJI{h@3Dhz6xPFnu8c%m<}D5FeBRK{O~8f@n}m1ks?>2%v*QYV6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!D07D1Ba{J2i(g!H@M%aSE&F0|34!WGm(&$1p=8sG&3s`D+?>@|NnHk>~&a#}60}#aT?1nVT?5oOAtILS zVX^cB6lV+|8~^_=nzLT#|NsC0L9qs+K`{rSL9qv-K`{uXuM`-7Xi!Xo>8*=5fM`&R zf@n~zf@o08f@o0ef@n|-gJ@7JgJ@7pgJ@7}gJ@8UgJ@8!gJ@99gXw=-VEaHR0K^BS z0uT*K2_PDj8o>0swgVs7foM=l0@0w<1foGH3Pgib6^PMe;s6R>Q0fBFpcDq8L8%Nx zgHjrZ2BkJI{h@3Dhz6xPFnu8c%m<}D5FeBRK{O~8f@n}m1ks?>2%v*QYV6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&1&?2gHhAtyRH*;||34!WGm(&$1p=8sG&7jZ`v3po3k(cklI8#Z z;|CZx{{O#vfsyC`|Hls)1wd>D9v|Nj24~+823-Ra23-SV23-TxI3XgI>|wF=0~BWr zARGVxFPgJ8VpHi!nrIEV(tI*10vJedBc1-1{A0ziCFDge=-lmMbZ zsR2yCYdZj6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q8*=5fM`%Wf@n}&f@n~D zf@n~jf@n~@f@o0Of@o0uf@n}2gJ@7ZgJ@7(gJ@8EgXw=-VEaJv4&sC29z=uUA4G%F z0GNK)b^t_!(gK*?@D|Jmr3nxplrBItC~bi0`QO0upfm#FgVG6@el{QMA5eM$@j+<@ zM1#@|hz6w{5DiK{AR3g0Kr|>FfoO1A0x^0_96-SfN>d;jl&(NDC~bjgQ2GMVpfm=i zKa?#1(V(;jrXStj0HQ%@4n%{}9f$^{JrE5_e;^u^20=6^9fD|3S_IQ~>J>mVC`~d9 PbfV<4(KRr(Gv)#SHnQoE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja new file mode 100644 index 0000000000000000000000000000000000000000..cb184d6a80d3c4976cb78d82b37409190edc65f3 GIT binary patch literal 1123 zcmWHE%1kq2zyNFv3=AL)lCX!eMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q&HDfU!4L+9 z|NjqPU|{+G|M&q0j{pC!USQ<;|Nrp=Mgb6;fyc);gu&T2ghAK9ghAK9m_gS7HDZW} zDhF6p{QyNA1IWhz|BL2q(E0!W|9?=_foM?lfoM<^f@n}Qg6S&-1|S*~onU(F;te1g z6s;f{6ty546ulrC6vZGK6wM$S6xARa6x|>i6y+cq6zw1y6!jn)6#ZcOpBC6YP%;4V zK}i8bgOUS?1|huXi(Aw m(V*lBrmu1z0MVdi3a0PWD}ZQFa%C6<>6Oby*TC4$m6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QI=GO@C-vi|?SzlMR~ z|Np}m7+C)QKYoCLuziT@HqCu$wOmBD#=7UlPh!093AR3fP!1VlYV0ln#0r5d8224Mj z5B3iz<$(C0)B~bHDF{S^QW1y-r6dpyN=+adl%ha1I8}idJthvI;02{F5DiLUAR3g) zKr|?&foM=_1JfVM7Jz6_ssqz!4{rd`pwtJVK`9VKgHj=g2Bkz04N8q58k8bIG$>Vq hXi&-o(V)}`rtj1%fM`%EWf=Hm%4MT#U~Fg11ps7H?qmP} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos new file mode 100644 index 0000000000000000000000000000000000000000..966a529ba9ed8a4fc6385077cf188f95d47665e3 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHO zu-LD)!D07D1Ba{J2i(g!H@M%aSE&F0|34!WGm(&$1qm{uziT@HqCu$wOmBD#=7UlPh!093AR3fP!1VlYV0ln#0r5d8224Mj5B3iz z<$(C0)B~bHDF{S^QW1y-r6dpyN=+adl%ha1I8}idJthvI;02{F5DiLUAR3g)Kr|?& zfoM=_1JfVM7Jz6_ssqy(BEWo5>I3mXDG)@1QXz;2r9==7N{t{Ilp;YiC{=>#tK0`b dG$?g~={xlbAR3fP83sO?a@pt_7~2_h0RR(L>%ss4 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta new file mode 100644 index 0000000000000000000000000000000000000000..b19aa222f91d07c4fcdc8b50497244c64f2df1a2 GIT binary patch literal 1081 zcmWHE%1kq2zyNFv3=AL)lCXiYMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&h5G;h|1&Z%6A4*aAdm?}GqbX=vi|>nXbl6y|NnCfoM>ifoM>?f$1v+1|S*~e_(p+;te1g6ptVp6qg_x6rUg( z6sI5>6t5r}6t^H66u%%E6vrSM6we?U6xSdc6yIR_pBC6YP`rcqptuLop!f&Tpfmuc z-?be8(V(;drZ>C=^Fe6>#0RAd5DiKjV0!*HuskS@fcT(v0;ZqM2m1$6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Qq1k+av3_vs}I>GeT#T!60 zC|W@@C~848D0)FOD2hQeD4IbuD5^m;D7ry3D9S-JDB3|ZDC$8pDEh(lKP|9*pkx5z zgOUP>1|;>P?7@CpkxK2!AT3m=rI9>GXp4zfr1&7%s@0K zsex!vas$zzBnPHHlq~?!pri+;&u#_tK}itA2PH!=y}=4B4oZ$7J}60oXi%~Q(V(OW lqCv?MM1ztjhz2E7Fny<90Yrn6E5jg2uUs~|2F7;ATmZBZ?Tr8c literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis new file mode 100644 index 0000000000000000000000000000000000000000..af8aa99860119c9fd4af7b9356f7b548b771ac1b GIT binary patch literal 1139 zcmWHE%1kq2zyRzF3=AL)lCX!eMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QGF%t<{SwN79nTeH|m5G%Fq>YvJ z|Nnz$7#RNlKYW3K<^TWV2N*d1|G#>Hk>~&a#}60>I+MYhc2l zYhcWvYk(d-L`0bbEXsa>B9H-O^Z)-vbJlP9|NsAgP!xh_P&9&QP*j3wP;`RnD+LB1 z8WgQydh6m1AQ}|CAQ}|KAQ}|SAQ}|aAQ}|iAQ}|qAQ}|yAQ}|)AQ}|?AR3eeKr|>B zfa!l)VEaJH0mKI-2@nlR79bjwG{E$`wgVspyUFgK}iNo&;JIN z2PGX4AC!E+^t1V3|A3Mah!09iAR3gMKr|>xfoM>&0@0wP1)@R83q*sH7>Lnh0t#ma zP*MX0Gbp)%Xi$;^(V%1pqCrUyO#fZF07Qe5AecUTcms$AB}EVoN{%2Jlq5kkC|QDN wP|^g^pyUarC;tJP14^bKJ}9YzXi#zm(V!#?qCv@)VGyNTE*o6~V>@Fm0KB66IRF3v literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman new file mode 100644 index 0000000000000000000000000000000000000000..bbb03a0c705626dd22776818b61035ff501b7932 GIT binary patch literal 1137 zcmWHE%1kq2zyNFv3=AL)l5l{sMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!D07D1BcTW9o)+~H@M%aSMd0?XoKgTM1}hQ|Nk>GF%t<{Ss;)JL^HE8fqAU| z{~x-;!0`Y7;R_5b|NkF9z`*hU|J4hOJpcbce!wUIVl(jg_=Yez`-U*+8kjKX8W=O^ z8lc7w5%J{+i?1J`*kb_M`2T;=oOMh7|Ns9V6n`KZ6o()h6ptVp6qjK7N`V202E{3u z-nw`Lhz7+ihz7+khz7+mhz7+ohz7+qhz7+shz7+uhz7+whz7+yhz7+!hz6wrF#S&p zY#%5sfcT*F0HQ%@0z`w-1(<%YbM1#^2hz6x65DiLGAR3geKr|?AfoO300x^0_K>30Jl+HlG z3`%Pt8kF8ZG$_r1Xi&NX(;vzffM`(q1Jf5Gz5k!O1BZvm2Ne~T6mmnIH vHbFEfeS+!J7s2*}(kX}!N~<6mlwLtJD9wUsP`YIp3<;OZM%TdD&X@}TYhU(! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia new file mode 100644 index 0000000000000000000000000000000000000000..07e4e9f0bd5f87ae067f613f52ce4327dae4f882 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHO zu-LD)!C|MLfx}hq1McOV8{F^IE7br0|DTbGnMlaWf&`ganOIp^S^xjv|AT?y|Np}m z7+C)QKYoCLuziT@HqCu$wOmBD#=7UlPh!093AR3fP!1VlYV0ln#0r5d8224Mj5B3iz z<$(C0)B~bHDF{S^QW1y-r6dpyN=+adl%ha1I8}idJthvI;02{F5DiLUAR3g)Kr|?& zfoM=_1JfVM7Jz6_ssqy(BEWo5>I3mXDG)@1QXz;2r9==7N{t{Ilp;YiC{=>#tK0`b dG$?g~={xlbAR3fP83sO?a@pt_7~2_h0RW_V>{9>$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba b/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba new file mode 100644 index 0000000000000000000000000000000000000000..d308336bec9a539742ca3885c44a4d3c5a674463 GIT binary patch literal 212 zcmWHE%1kq2zyQn)3=AL)k^s>l%-6ucz%W@(Px;%7Hy#X(O#lDyk7Z!^|Np=a2A2Q- xj~`&*^6?E}&^0hIHehfJ4gqOpU|=A{f*(*l|NsC053&eElVll}V{nKG7XX!!FPQ)U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion b/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion new file mode 100644 index 0000000000000000000000000000000000000000..3c61ddb5a7a9956e2448ec7185edea75df08bd3e GIT binary patch literal 2077 zcmWHE%1kq2zyNFv3=AL)l4ydm1sWI_7mVUUpClX5XOf65*g?Vr`)6 zXzidTnzuonZNG#1w?zgT@46f`H+XE&I=}aT_D)U%oz<%ybPISk==Iz?pzr@~gF&8< zgP~c5fl;{L0b~A68%)dv4w(EnZ(t_&>44e8*Bi{gT{&QJ@azW5YugT3EnL6BdjDky zoAuiaYzrqGu~*C!6CoOz_IY1gOl-^4bFiV99)F^HnP0t)^)1p4I|1O+^B2-fp6 z2r)S15Xxs@5GJt1A?&-)hVTz<4iVS&Hbh>?aERJ2upxS9%Ym3_pEktKOgj))c4b3+ zrN@DU_>TsOky;0m>@OQ6Tk;%8k>6^ND)H_>>i_8m=}g=X>GvxQG9JEl$lM=okah69 zL-vaD4LJ)pI^=dlZpdq#?2w;fy`dm${eeOc*$qWr6Au)t|KCueReYdSP{yE)EA&9w zhkpj;ugnirTzFtmc}ns?)rLa`)tk*6Y9=f(sGTg~P*>1qP+#=Rq5l8>|BOt`Oe_Nl zS^ob&`GJ7}OtSp{fBXOg$N&FVFEH?cNJburh>vdwgQIT9f$3ij4j>won?N)uM}cTit^(1Z zoCTsmxeG*tau|pPP>u%C76;F60MVeF4WdE08$^S0IEV)2au5y5=^z@E z+d(ua$Af54t_RVeoDZTwxgSJ>N&pZIDg{6^s3ZW>p9{eDfl34rA5r1&9Wf7$6!{YJg}^$pNB4r3Z)xl^`G*REmITP)P!!L8S?Z z29+pa`nwOkWK_wB029-u28dM^I>HpKg@dGNEKzvZ?1foGD6o>|uQXm>sQh{htX$7J| zB^HPVm0BPgRC0l6Q0WDtK_wW729;tU8dQ>jXi#YeqCq7Zhz6BvAR1J%f$0zb!0rK+ za3DUYlmpSAk`6?JN;?n@D)B%xsMG_|ppp+ngGxUT4JrY_^#A|=8HRo_$YrBzU}9%t bqibMnr{imApl7IOpl_h#YpiDiVsHTfKf4=k literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan b/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan new file mode 100644 index 0000000000000000000000000000000000000000..5708b55ac6bcb7580498bed9721a43fbd5a1773f GIT binary patch literal 345 zcmWHE%1kq2zyNFv3=AL)l3<6jB^nqQ80PI**f4+B&w>*_!V^w+{A;+R{H5ShBIgGt zMkYpP7S{j&SIICi{Qtjm10&1-|Em`;aDdr7U{U}?GKl#2hA=q0gfKVy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Atka b/absl/time/internal/cctz/testdata/zoneinfo/America/Atka new file mode 100644 index 0000000000000000000000000000000000000000..5696e0f8bedee72515c43f686881a561af339db9 GIT binary patch literal 2365 zcmWHE%1kq2zyO>K3=AL)l9&KxD>g7NFr4mmxo}DOOTneY0Eb_fLO1-|Q5f)lMTi5# zjNkyq4l@U)3ey1Q!k_~ziGdeb15FOFIT~MJHxxU--kW=YQ{cw|&b2QCxIWxE!2RIn z1)iJV9e5AyzQDKhrUU=V8vz0{cRL7n?g|j9oa-Q*IVV6Qvfe?|vo1i)GSNX?Ga*1i zsrG;*r&E9wQ~UubZ6yV%PXPy{9~p0uxny)e_K@fXxlJMmj9n`gU8L0o~JfO)n$3XMm>jPS^>I}5^ojss)dDaHqdFv18 zZLZm%UpMi9!Q{9NhUx1ZjEWsL7`sn!FbP)LV5(l^U}ns+!JIwB!9qsSz~Z@?gXJG) z1FPc_4%WAy8rWe9Kv z_49iNcim+M?w2n*c=C1_cy8Y8;Pp1kze+kmogsIBMY#`R~0!)KV#j=zA9pVp{$< z#O~W{5SMb#A%5Oeg9P7S2NK&iZb;I-b09f=@`e=NeFswAOE;vxU2q^>J$ys@*`@=T z?3Noc*QOlEdM>>ods?GI&IJpD+_GecybV$Y`C+aO1^s^v3eD6Vit_In6pL{>l=vSo zDEY5?pv>aVhO+zY2P!1?ZK&Ay@<8Q}1skg7ojy=~qiI7;-P!}SJ5n~(#q}SkpW(KF zk%^g+g%uxU<6x&F{Qo~HiGkt&|I`2mmjC~Y6Bs$bBoA0b0L&Hvkqi?5|2Gye%7WRF zKE5Fge!(FOe&HbuegPp2PQf7zPA(w~jvm1w3?42ape(}(B0w0zz>&$g7#J8p7^H9# zl&$y!#A5(C>;HfILw_&+|NsAgZF^K4hz4ao5Dm(JU^+3t0Yrl`B8UcOMi2v(AwlNM z2o3;Ipo|HkL75XogEA8kAWE7H6AR3f$!SvdfVDms37{mu< zVh|0=$RHY&nL#utLxX5grUucVj18henHxldGB}6^WpWS=%IF{(l-WTvD8qwjP^Jgb zpo|ZqL75*!g9-pJt*xX0rauK70MVer07Qcd1P~1>6hJhnU;xpe!U05s3J4GlDkMNO zsGtDRpuz$~g9;1~4JtH1G^pSJ(V)TuO#kNu+XpH{KzvX^0-`~M35W(2C?FbCsDNlt z!2+T|g$sxV6)+$gRLFp6P(cHtL4^&71{F9U8dT_jXi&ieqCtfZhz1ovAR1H%f$8UF z4j>v-7=dU|fdryKg%XGc6-*!+R5*cXPyq#^L4_2E1{G8w8dO+;Xi$L#qCtfghz1p0 zAR1J7f$7ih!S;a)F%TbAkb!7WVFso*ZwAYQ3N;WPRIq_)P~irmK?NL$1{HE38dT7M zXi#AXqCo{7hz1pUAR1KgfoM?S2d4j6g2NwF2!i;af)GT53PUh`)B z_=0Fq0Sux+g)o@@uL?FFR2YN!paL00g9>FZz3(Mh9#lAk_@DwBM1u-x5DhA*K{Tka z2GO7b8$^Q&Z3adrW)>z^HhhqslY@?sfnoI{Q29u!!kYn7XoCU(!s7A>4ly+Fa0$`z THP$oIGtluhG}JTHGvERMhxmM- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia b/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia new file mode 100644 index 0000000000000000000000000000000000000000..6008a5749d01875a6995189735aa8b4e8747d250 GIT binary patch literal 1050 zcmWHE%1kq2zyQn)3=AL)lCX!ec^ViP7^bbtmf6AY`C!LihXp%7ni%Z5SE6vsVx7UQ z*S`$zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszS zKdSJH>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1C;`!+XaUoI9TtFSQ1pOkP!xe^P&9$* z*S`!vG$^{j^v*~H5Dkhp5Dkht5Dkhx5Dkh#5Dkh(5Dkh-5Dkh>5Dkh_5Dkh}Fn#8Gz|W1qvV< zlpMhHmE&MOC|Q8`priq!LCFJ5Pw58BgOUk|4@xQ^8kAf>G$_e{Xi%~N(V(OQqCv?A zM1ztLhz2Di5DiL7AR3gM!1RxUVDmxA3d9E`Ef5V#ULYEj#6UDCnSp3fQUlSTa{uSH|0X^401SYCC z1m*1f5bVg=5aKiYL#V>*hA^Gl58(`F8zMw!6+}E(-w^q=rXcFT#D?graRo6e*D=Iy zbts7IoWKx2RjD8$vxp(F&hA5!X9z=boWh3`O*4j6JEjk5LO~7bvQIvwe==#v_4q=7+Lh^$ZpK-XAJ%B{EdL*Zokn%bB72JpYH9#qkZb>pp&{Yj$j?@4NhgfsqLe znHgE|KvpL5;Q#+~Ll_wT|DQX7f#v`I)e9In{{Qc9VBi6<83q3T-?@QN1jJ_G@bL{{ z@C^=Oa1IV(2nY^g@O24caCQj+r4b}dN{adc)%XAZ|No$r1)@Qz3q*rb7>EX?G7t?) zX<+(q+XoO0N^u|>lIlPP6@U^b11R-@c%T#rqCu$;M1xWyhz6xb5DiL^AR3e^K{P03 zg6Zcx0w5ZcLP0brm4awcN(IrN)C!_ODHcS7QZ0xErCbmVO1&T&l!8GtC>4WfP)Y{T zpwtYaK`9zUgHkn!2BmB;{bM57eozVr@joB*OhxdB9jas-G5ffoM>U0@0vc1)@PY3q*r*7l;Ps zFfjee1Z+Pjr-AsO+yMfgP)-EVpxg+eK{*mc zgK{N^2IWi;4a%J$8k9r9^sjml1`2YV2X$A%`$@2gI)eDRq|NkF9z`*0<8^Yk^8^Yk| z62jmZ90IZmj7f3Q53ml9>Hq(Ooc90!|NkK8frLR$1k+P`E`Vr|Q$aMyxgZ+kWDpH< THi!l}9Yj;;d@je}5ECu{R<%?$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Belem b/absl/time/internal/cctz/testdata/zoneinfo/America/Belem new file mode 100644 index 0000000000000000000000000000000000000000..b8e13b02fe93679946331a1736945d033ea82525 GIT binary patch literal 602 zcmWHE%1kq2zyQn)3=AL)l8}e8c^ViP7^bZ%DcQmA`C!LihXp%7ni%Z5SE6vsVx7UQ z*S`$zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszS zKdSJH>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL1@-^`|7T!g z!~>cB|G(73!0`Y7;|Gi^|NmdTz`)_-8^WM#V8oznU<~pE0|NsoUi|^p^Z)<<{~#}e zXppzT^k0VsAR6R-5Df|f5Df|jF#Y^@9bjfj1V`%RX47mlv@(?*D@& zd;t+l?H)c@`pzg~x%$6^<>y2qR`(ay0PZ?l7zKoUv8{h-j=XF z?AnbD?HLIh&34?_RM7HZv)HT~TLRJ^Z24AmW1E4;gKhU`M(hyKdaz@Eb;QmOJP&rw zkB!)UQ!`;ty?w;qo!klg;uRzI&v=_~z@9ncV8!`_LmKio4o7TEIKshrPx!|34@OKr|>8Kr|>OKr|>eKr|>uKr|>;Kr|?3!1Oz# z2oMd5AuxST1k4A;6o?OsEf5WgF%S)kH4qJoIS>tsJrE6wK@bg!MGy^&Ne~T+O%M%= zQ4kG^RS*q|Sup*r<_3rc#W0w@KND;}D5gPtP;7%}P>h3UP^^P!P|Sm9Q0#+fPznIi zpi}^&K`8-5gHi*C2BioP4N4Ut8k90XG$?g|Xiy3P)6XA+-2+M~AU-IyfM`&P0n^Ku ugXKXf2gC=Z9uN&mK_D8Gia^l=N=aaP=Y;?e4N6g9ny#se%Q-m2j0*rzjq3OS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon b/absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon new file mode 100644 index 0000000000000000000000000000000000000000..abcde7d98693a9d583928c6f1acdf46b190a500a GIT binary patch literal 307 zcmWHE%1kq2zyPca3=AL)l3;_fMH(0w80PJ0O_;yyZouh|M+ujdzZ6_bczc0~k%^gw z>Hq&zB@7Jz|6jep$nyXH@dFGTU^Wk!6!7s4VQ_Q_VQ>r%VQ>r&VQ>rx0h!If2qGDY za0NTe6+b{a7(h1t{~u>-$@BmJ|NkIYfoPD+Ks3m8AR6RCFrD!B0t4mF-QUU%_h!E_xPNzr!-EhRt`Uo zUpDx~_29s-m24Y+zY%fx)7`y6_T(G~xr(P7%M4p{7% zY+!l+ql4v3*$wso|Nm!TVk7{W{{KI&z`*eT|J4hOEdT!>Kfu7@;~T=DYhcWvYhVKM z7y|i6 jhyVZo{|7k&Bn)y0hz2qn`;?-vmae{O^e{5@gC@Nb8u!2cC83=A`*1sL1^F))??6<{uuYG6r} zoWL6Jr-9Ak_XKu>dkyTHyi*#?C&Spmhy^$kj){{@t@&M>H$J`_;(TF0O!dRRbRYXXD% zzxxw3xr!Jx?;V_=^(urxd*9*-I+qI?bmz5B(Ayl;pkJ3h!C zfJxAg22*tp0W+gp4d(1x0v6KW87!Xj2w48U$zXNtoq+Z2-3&GxxF*={p37j@|7L>y z?0N=={Bsi=TV^*n`EQuuoKoB1qCaVZt4n-?>*u2a?z%M$?w6Mfc=EHTcJ5P6(K$&=6?jJt3%!sUcWKcS1<$lZKE#{1d`Vk2Qon z)e(r0d(04Vlusb?-%*CBB_9N$?=5GDX}Kg2yRVZWE@g{A{Jd<21m6o265HDwl5{ss zNKVgeNa39_A=TZxA@yz9gmiV?hV-)$6EfNP8#32gO~`uou_1d}xIoSYK8D;fOM$%g z9~kn(qy-B4FEJFF{uL<7-@;HVdS9T#e;Px{zuyzeEH*Wi-Mc%XLSjlo#lHO$Du0wU zRLxsBq54KdLrq=tgxVce4Rvv;6Y6KkG%ztTF*30-v#_!aD)|5ZWPS#Q|NrMsU}X9K zzrTTj^W*P%#7IgNhmu4JvLxG^oe{(V$`nM1zVR5DhARKs2Zb0@0vi2tZDxN?zsE7j5pkfM4Kj#6*2dKCL@j*ovhz1o~AR1J3foM?i1)@Pk z7>EWHV;~w-l!0haaR#D6MH+|(6>A_GRJ4I;Q1J$)KOY6#2P)=3d{9vbqCv$SnBLq8 zmIoDkAU>$*1JR)34@85CKoAWo20=8aCyQenEUt5e%Y1 z#W08l6~!PLR2+k7P>~FxLB%qN1{KX98dN-kXiyOiqCv$pnEv-0Y(A*C2Jt~fHi!ll z+hBU%ey}{K_y+MoML38C72_ZpRFs2gP;m~TK}9-<1{LcJBdA>G@(m6#_jL);@io>n Q(lgNUH8j*S)HC1$0E#hiAOHXW literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires b/absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires new file mode 100644 index 0000000000000000000000000000000000000000..e4866ce1778fd2678a85dc6791a6c1b3fcaa5d1e GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&1&?2gHhAtyRH*;||34!WGm(&$1qm{P*{uKnpEO}$`2YX#1qPP? z|BoMF;Q0Ul>IFug|NkF9U=#qc8F+krLl~TWLl|@oOc-VU;v^)F$t!(F5Up5K`{!VL9q&= zK`{%WL9q*>K`{)XL9q;?K`{-YL9q>@K`{=ZL9q^^K`{@e|7n5k1El~EACw9}G$02fM`&v0Mi@Zg887-0pf#F2#5xy5->gg8(1EcT0neIiUHHl=7aqMN;x1t zDD{A7PznOkpi~5+K`9ADgHjWS2Bjzv4Ng@cMvsXDD0o4s3q*rb7>EX?G7t?)X&@Su z+Q9UOvIQU-l?8mH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay new file mode 100644 index 0000000000000000000000000000000000000000..d322f01ed1d11856e0f17d1ba5d5f6ca867533c3 GIT binary patch literal 2098 zcmWHE%1kq2zyRC~3=AL)lBj{QRT~%>7#4my+i<#*XTl}rF9nwpB^bWzM-}|gX#F6Z znIa$(>CPbP=_Vj%smUO&sUaYt=G z2!r;%#S?Tc7c}V3Yn`CCIjBLuE`5T*WRnKN^cDf5VzCBe_cQ^MpdSsU>K+1SMz$56Sl`~wV6%a1g6;0P40io*CfLueXK=_rH^H%G zc7v1uh6&CowGA%%lP0*j#5cHpJ}Tg@Tf^XfdAWcmZybZ?=1u{xw+;;6bCyoHW5ALH4cnl2x|F2%a$O0xg{{Npl zfr01$|D78c1;8SrV74TP%^(Y6Gbn=CjG_>gx&{UezTqJZz5yW&zQG|3zAi2xB80)& zC4|8_IE2A9ID~!2aEQ6DONfrIv7V8hfsU`C Kp`M|h0T%#MmJine literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande b/absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande new file mode 100644 index 0000000000000000000000000000000000000000..de52bb68143db08d381e441ba26a84c62048f0b5 GIT binary patch literal 2016 zcmWHE%1kq2zyQn)3=AL)l4yjoc^ViP7^bbNGTFf&{$a;ozYRM-IyvmR*JNd$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gK~u20p&+^ z2C5be2UM?IHBeWSbx_~?af2qqe+SJeGYzy}NgvS8cG#eE;IM;k+9dmZqvpG14|21$9yx`#c{l0;#Z{h*h2fsJC3r=xx z-@e$u=3Bnz9A?%)FGHb zb3=%;xkJcHH-j)`Nr$kL8U_(eza1i0av4NEy6X_t@x~zfUfzM2jB^ID`vMNcd2BF< zpJ#L+!SKw6#CCs&B*AqXlG6NWECJAzkgOL;A*$4Vi4$9WrMX8e~1& z>5yF&Y>;#Q>Ve!SQ-i$q+YjVhi5nF3&pc2l`O}~%zxqJY&)Wti{;>y2ZtgWGv#4?? zJ9KkHg+z=)#p-Vcl|Sqps+#6*sJ@}#P?J=@p>_w8L!I{=gZk-D92l4w2NwSSf94DW z!~g$RFEFzF|9|`d1BZ`q2!pPHF@vsw2`ITTFfb62sGDJl`Uh0c|NsC0gAzB01|@JX z{nu{;hz2Ee5DiM~AR3h5!Sovr2M`TP_+WZxx&ep=WdINj$^;-9lo3EQC^LX)P=)}} zpiBXxK^X%?gE9w*24xU1ef%=mJWxgf@j;mdM1wL6hz4aEkn=$q2SkH14~Pb3AP^18 zL?9ZJkw7#kGl6JOh62-%>I^_MC}V-?D_6mMPzD3>L75ChgEAVJo-z|G56W;LJ}A?H zXi&xj(V)x+qCpuDM1wLRhz4au5Dm(VAR3e*K{O~+f@o021k*pxgUttJP!J!KNkKFy zqk?EqW(Cop3=5(`nHEHYGA@V)WnK^s%D^BRl!-w!C?kVtP-X_vpbQP7L75svgEBUl z{(c{9KPZEP_@GP^}}3JVYoDlowGN-nTGsNewc zL4^m11{EM68dQjYXiz}{qCtfThz1oXAR1JtfM`&`0-`~M3y204Fkt%EX|VaAf(FC~ z6*eFmRN#Q=jUgLAG^pSK)3XY}>Oln%h@V{*4CaFhA`l-`7=dU|fdryKg%XGc6-*!+ zR5*cXPyq#|f8GY`2NhHxKB%w)(VzkgOdq-lwjWe*f%u@p3q*qoFc1wY#6UEtAOq2$ z!VE-%3N#Q6D%3zUxL{*oU}(^Wu Q>KW)8==d7x8G{&H08PhVumAu6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun b/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun new file mode 100644 index 0000000000000000000000000000000000000000..7e69f73de44698b65b61038ea40972f1e7c7affa GIT binary patch literal 816 zcmWHE%1kq2zyPca3=AL)lF){-MH(0w7?y6kl_1u3HNh}F{ew}_uLNUv&krU+cM?q1 zwLh31VMs7DI#XcIF2i6U{o;egvwsYhzfXOz`pVK^z3tEkoArMhY>yM%xO z1&T=tz8_FM|NsC04+=&Q7Zj8r8Wfx$8Wf};8WgM`8Wgl38Wg->`Upb;hz12Shz12U zhz12Wn11#TM1g}H!~g|7hz12ehz3Oghz3Oihz3Okhz3Omhz3Oohz3Oqhz3Oshz3Ou zhz3Owhz3Oyhz3O!hz3O$nEufWqQKDxVt}F!M1!IaM1!IbM1!IcM1!IdM1!IeM1!If iM1!IgM1!IhM1!IiM1!IjM1!IkOw%u_xm<%oOt}C}X3j(a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Caracas b/absl/time/internal/cctz/testdata/zoneinfo/America/Caracas new file mode 100644 index 0000000000000000000000000000000000000000..c8cab1af26b03a7008d34078efdf5ae093f50c10 GIT binary patch literal 289 zcmWHE%1kq2zyK@^3=AL)l3;_fg&G(b7$(c<*nFGu#=|{&QbD-t%7Xg;|Nk>GF*7kU z|Nno`fq~)w|AQ_JEdT!>*ulW@|Nrp=417MmAq>vGAq=_(CdLLJ5@aSA6Ja+y%6d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!D07D1Ba{J2i(g!H@M%aSE&F0|34!WGm(&$1p=8sG&3s`D+?>@|NnHk>~&a#}60}#aT?1nVT?5oOAtILS zVX^cB6lV+|8~^_=nzLT#|NsC0L9qs+K`{rSL9qv-K`{uXuM`-7Xi!Xo>8*=5fM`&R zf@n~zf@o08f@o0ef@n|-gJ@7JgJ@7pgJ@7}gJ@8UgJ@8!gJ@99gXw=-VEaHR0K^BS z0uT*K2_PDj8o>0swgVs7foM=l0@0w<1foGH3Pgib6^PMe;s6R>Q0fBFpcDq8L8%Nx zgHjrZ2BkJI{h@3Dhz6xPFnu8c%m<}D5FeBRK{O~8f@n}m1ks?>2%v*QYV4EzH|Nk>EGBN%Cf9?YV!~g%s z4=}L&|9|xY1BZ`q2!pPH34^YIF-SK90|O~`{DA8D|NsAgkX;}eWFJVF6g#(fq}!v zH-y32H-y18I0U4Jfq{VtlR-9sFwYODp8x;<|Ich!69Ca5n;3|*ipw=P#FPsF=|C+j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Chicago b/absl/time/internal/cctz/testdata/zoneinfo/America/Chicago new file mode 100644 index 0000000000000000000000000000000000000000..3dd8f0fa82a60710c0711f35dee93ef5013ca796 GIT binary patch literal 3585 zcmWHE%1kq2zyRzF3=AL)l6V7UOEfSrFw9$~(=dP6&w>SQd<_d{-7Z*kx`bhI^Y;%+ zTrV{&O}_bIS@2DU<)YIIRv7PQSn+T3hgHIJ8CKn!`eF6wdWJRo%0H~VoXD_lUgU@M zo1Gap)LDPnI48bgQ+hwmKm6qP zYWT&G{^8e;bcWwAJU{%o;mPp#g!YGjJG2@8ui*W_FoTzYvHkrArt6rNH}Krt@PYS0X#?NRNgw!EPGS(4 zS@J=!vxGsYGVFtJW*CD=q{RnOPYVVyOQ{dynoSqpisuopxC&uKq>SigL2m14=SdY8C1RIe^3+M%Al^*_(A>O z#Rg5TmnNrCaV<~rk61o6>}6AyGJmX z1idOSRkva=GdfdX&Mw1XA^qZm#j}45mcLJZusZgD!TR=^4>s%nG}!L$`(W39ufcwH z!3T%@0}YNXy#-GGiyE9$@(Wz_TN+$l0t;L}Z)b4V&Hdnhc_xD=um10K13~f#1MUN#)p`eBMhV-nNERciV#0w;2uT>hcBYXT2IS*%=Em*XlH6J$qb`JgdCuC$?chfYCVTzEtM488&;Mj{|Hk{T9PBn~l}2alTn|JPn&VEF%k=LSZW z|NmDnVBi3;8F)Y>qX3u`fr$I~hA=q0gfKV;EQkh`vmhE&)`DnIc?+UJWiE&Y zmAfDsRQ7^sQ27g@L1i$A29?7g8dMg8Xi#|!qCsUchz6C*VEWmE0uT) z4yJ#kg6#v9?;t*?j0e%6avns3%6c%J$O#T7P?-K70Vs$)PjsGb4Q zpt=S`gX$X)4XSfMG^pMI(V)5qM1$%d5Dlt>Ks2Zx0@0wl2tJn2Gw;S8dTqbXi%L8 zqCxc@hz8YtAR1KvfoM=22%f@n~^38F!DCx`~spCB4khk|HOJqn^hbt#Aj)u$jDRHuSy zP`wJK|6K%!2dI7p@j-Pghz8ZOAR1KHf@n~E3!*`FE{F!zyC51=_kw6p{R^T&bufqq z)x#hfR2PG2P<;%dL3J{S2Gz?T8dNufXi)tOrl0)-QQ&$S!~oURAR1I(gJ@8l4WdEy zHi!n*-5?rNe}iaH9S)*F^*D$I)#V@>RG))rP@N8xTegM&+HUx+UwIe_@ zs4W4aLG1|;4Qf+>Xi&QXM1$HEAR5%Z0Ml_#(Z4(d;YM+4Ve{aF&gW4$| zKB%n%qCxEyFuiXhSRT}F0r5d?7Z43owZo{^q`j<2Dio}r!r7XY`pcJBZH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua b/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua new file mode 100644 index 0000000000000000000000000000000000000000..e3adbdbfb25b557db2a2edfc721c365d90706233 GIT binary patch literal 1522 zcmWHE%1kq2zyNFv3=AL)l8A<~MH(0w7?y5(QLz3~-h*vvVF}xvFD2~YF-zF-x9x*r zdKrUJF-L*1djx|?(5nJdbq@hEqgxH;>{S{4TX3Q2*0o@We!iKY{Ra!xP=JBm*T@ma+X zs_=6{m`)EvIK%A;5uz&^A|C9W5c##MA?m>V3DH+`8e&%N5s2OD*AUk^PauA(K|?}j zgFs@PFGG@Nl0b5tK0}J8i$JQKAVZo^!i03$&kX6GoF-)ay~>bzNo7LT-R%t7o7g7g z9J}0*JMqPYyk%P(@(WK*C}^ABP#E=GpeU`fq1fuAK#5y)L#fnifinFHhO%G10u}sG z3>CNX1uEa$FjVad6sSHg$5694cS7xY28Oz3{|WVdj~EyjnLv=4iJ6Iok-G5z|2aJj z4FCVnoxs5I|NrU*3>^Re@7%!117b4@K*W7~Ll}I6Ll~Sv*d>I)*Chm$6yTVYWb*^6 z>;M1%|3S$IM1ztLhz2Di5DiL7AR3gM!1Uj?4l$1d< zC^>^@P?84GpkxiAK}j1#gOWFh1|@M24NB%98kE#QG$^@)Xi$;|(V%1xqCrU?Oh4E= z0Yrnc0Eh-<0}u_$3LqMk9Y8cFOMqxlwgAzftO24y*#ks_vIvL9Xi#61JR%?2ckjQ4n%{p9+>{s3yu#^76kD@*$_m7vLc8EWk(PV%90=& slr2FtC~JafQ1%4TLm-QC`38rW`?`ea_?qY$>KW+x8XD-C>KSkW0A>k%D*ylh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour b/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour new file mode 100644 index 0000000000000000000000000000000000000000..5708b55ac6bcb7580498bed9721a43fbd5a1773f GIT binary patch literal 345 zcmWHE%1kq2zyNFv3=AL)l3<6jB^nqQ80PI**f4+B&w>*_!V^w+{A;+R{H5ShBIgGt zMkYpP7S{j&SIICi{Qtjm10&1-|Em`;aDdr7U{U}?GKl#2hA=q0gfKVy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba b/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..8c58f8c23eb0d66d80714a9789b5c20abf043ca2 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&1&?2gHhAtyRH*;||34!WGm(&$1p=8sG&7jZ`v3po3k(cklI8#Z z;|CZx{{O#vfsyC`|Hls)1wd>D9v|Nj24~+823-Ra23-SV23-TxI3XgI>|wF=0~BWr zARGVxFPgJ8VpHi!nrIEV(tI*10vJedBc1-1{A0ziCFDge=-lmMbZ zsR2yCYdZj(fsyn7|J4f^czt|B7=pcgLl~T0LKvKb zLqOJmF%iz;hB@a4SO>`X|Nk@FwS52o|NkH4JdiNRiC}trUI2&&ITcJ#4*>H)P6qKo Y&IZvSr-SK3H!m-QUU%_h!E_xPNzr!-EhRt`Uo zUpDx~_29s-m24Y+zY%fx)7`y6_T(G~xr(P7!7~(;|5KJ{|=f{W*TU{l0KlF?XW@Tz+ng7v`Yqh3zj~Rvaw=XvE__g7H z=k!(suUnH2csDHE;IpgbfNw(c2ESQh2mC!37z8vII|M4YZwN{bbqHqA+z{ey?hx|Q z%^*x!(jn}mhCu|=Z-{xm4cuRc)p^R_{Wf9!#hn|lq)EUFyJ4&B^PAra$H zvHF`qj_frS76pUz=m`2YXv1xA+t z|BoMF;PCMcVbC=&X3#Y-0VPrf1_mOMaw9A$|A6ZG|NsAgP?84GpkxiE|N3nJ(V*lF zqCrUw%2W2%74a#mH8kFTg zG$`AFXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XVEV^-u=${D3F3pYCWr=QPY?~tq97WS zO+hp$tAc1yb_LO(EDNGR*%m~DvMz`QWnT~t%EBNTl#Rjk_xoV`K-n3@2W4px4a(MF zdi!FqJScmE_@FEfqCwdlM1!(Ai1yi4asWhwvOI|Pn-vD;gR(w|56b=^8dL;;XizZ# zqCrIghz1o0VEUyS*gjCP0OEs+1`rJ@9>DZUF0eePm;muXMFofk6&D~HRAhi?P_Y4` zK}83M1{EJ58dQXUXizZ%qCrIohz1oWVEWf-u=${31;hsxEg%|HynyMAAsaw6sF(rM zvkJlLLB$P-pIsFU=7WkI5Fb?ZfM`(h1EN7i5Qqj9Lm(Pd6oF_^aRjD+-UjOj6-yvK zsAvMwpyCNkAG!&)A5=_%_@JT+M1zVe5DhA_Ks2b>0@0wN3q*s8FAxnX!ay{*7-L{y zXwZhF|Hej!0|Q*FF)l%-6ucz%W@(Px;%7Hy#X(O#lDyk7Z!^|Np=a2A2Q- xj~`&*^6?E}&^0hIHehfJ4gqOpU|=A{f*(*l|NsC053&eElVll}V{nKG7XX!!FPQ)U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn b/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn new file mode 100644 index 0000000000000000000000000000000000000000..ad68c722f8f56d14a0a9b3e2e98fe56ee17256e8 GIT binary patch literal 712 zcmWHE%1kq2zyNFv3=AL)l2C@S1sWI_7-lzkG6?(D1c(^_njotDdV-knoeAR1XD5h% z-Zw$w@%jmpmlsTsIy`ZL^q#!}GHcce$j+HBAlEZNK)$9?Kq03{Krtp+K*=XWK-tDs zKt;z)KvhOvK#fO2K%Lcjg8EmJ2^vpTCum+3o1k@+eS-Fu9}{$zyqusr<<4@8545JZE55k!N65=4W76GVf86hwo96-0xA7DR)B7es@C7(|1D8AOAE z8bpJF8$^SG97KbH9YlkI9!!5V0lNbf1t2~s8bCBCDnK+SIzTiiNCsR1er@>3uF)eoFKRH#{&6Kg5(SfBwh5-{VG3qOFD96?TPRq_unJf_mr}6&{anE6*dGP!+b0EVHb^Y6-Mw1C zuK(8p``Nt$4*7Q$IJT^u;N-t=fpbdt1Q-1U3tU}tC%AsTtl+NOCE$K}tAZzQj)3Rp z=?Y$N{RF({Y+m4VEo*{r&C~^c+k7VY$CNJ!n5H)&&?a(0P?^AlU>WNLA)%ipg#3|R z5N3L1LfBI)g$TKi0ue`L6e9m!7KmE%Pa*o=R)Lt72MV$KrVGTS98!p%S1FL-dv8Hv z`_u_Zx(5~{rf4qD>FU-K($A(X$YhtDkh#`lLDsYX6SAkJD&$;{ z5y&lbSIArcPar=`Q=y>$fk2@dw?a|=A%SAiw+bcxO9V>(b1o>eI545?-s=Sw5{o8O z>^r-l@<+>rs(I@dRNqLOP*XQ?LG2EY33YMB3+iWRO<-bVVq{`wVPa)sV;=zc|9`Cy z1H=FS{SAyP|Nl1@FmQm`JYZ7b|NprY7)3yA21zhm*2g!5A<`v;Au>3GAu>FKAu<5O zcL`w#2o7Nga0vmWYX(Lz$pEH_$OoY056TmYKcM>l|NsBLwykdqhz8{g5Dm&3AR3fE zKr|?ifM`%Y0nwnm0;Us96hJg6&wyx9z5y8v$~zz$lz%`pC=Y>XP(A|Dpu7a4LHP+p zgYp!J2IVUd4a!?!`jg255Dm&>AR3gE1JR&72ckjw4n%|U9*73zKM)Pd zgCH7|4?#32FM?=Legx5=JPD@%y#?C`%9|iQD1U-zP#y)*pnM9VL3tHKgYqkg2IW~0 z4a&D58kBcIG${XqXiy#o(V%<`qCt5XM1%4(hz8|p5Dm)LAR3gn!Sr(}1rQC&;~*N8 z&p|XOuY+h%eh1N@JP)El`5r`r@;-DnCFps0;zopmGF6 zgUS*R4JuDSG^k7g(|=^a;SVZXKzva70-`}>446JD1GXPj)`0k+@&-hM${Y|4DtACM zsO$mJpz;SqgUTQf4JwB~G^i{B(V+4OM1#sC5DhAqKs2aq0@H6>!0rK+Q6N63oC49H zvIuhz6BuAR1JzfoM?K z2B!aWg3Sk&aUedZoCDFIvJOn|I}4Tvm3bgOsN4h5pt27{gUUY;4JrdcG^iW|(V()B gVYnBDTmiu$76C3HI=;qwMtTN1zJ`W+hI$5E0C^-WhyVZp literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek b/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek new file mode 100644 index 0000000000000000000000000000000000000000..78f9076308013c2c0b46f8d1b9700abae2f435d3 GIT binary patch literal 1059 zcmWHE%1kq2zyNFv3=AL)lCXlZB^nqQ80PKRyI}rq(FvzJr50RL{!(x$QBB}#=tqTX z3aKM!R-SR1n%71yx{K2H52abo4VkBXWxVe^U4=I z%q*Djs4jBBW6z)oPvWc>Jk>Or@XS3z;ki(tzzcONg%_WU1zxesD7?BPD)9Q*KZQ3N zzYDxQ_CVp?#G3-|*Z*1Yp>Vgr$NqZ@KGh$b@Hzj$f-mulCw%o^wBVb4>xA$6Een2V zEE4$1pSIu^M~lF(AI%ECU!)2Axsj^y_k@SQza8!h|5s=UFwD?YVC>)#V5;C&U@p{{ zz>=uGfR*vX1SUo%W)>z!(jn{r|NR~e4FCVnoxsTQ|9^i20|%JR111GPB!h^LZwNzx zO9(?ia0o*{cnCv4KnR0xa0n=*85p4?5wT(oiJs?~E|BtgRvH1W0|9?;{foM=n zfoM={foM>Sf$2mw0T2y}IS>tsJrE6wK@bg!MGy^&Nih9j9audmMnQZ~tb%Az%z|i8 z?1E@e41;J;EQ4rJOoM1pY=dY}jDu)Utb=G!%!6o9?1N}f3INfdQ~;tuDFIA>G6vfZ zN)aGFC{=)HP|5(&pwt1PK`8`8gHj2I2Bj1b4N5H_8kAx{G$_@8Xi&-l(V)}=qCqJL zM1xWhhz6x35DiLAAR3gSKr|>-f$1O33LqMkx^CHrLn literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Denver b/absl/time/internal/cctz/testdata/zoneinfo/America/Denver new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmWHE%1kq2zyPca3=AL)l9&f&i!?AWFw9$KHDUg4_J##*G7}cgdfBij_1}cWEo=-+ zTpvtW(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%k ztQh|7uoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;* z&b1o_xIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^U zHvutAO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($ zIgfzl@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhV zCb+u9H@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1u zX$lR2Hr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{N zhM1O10BmQ6@k*KJ5Y z8!;i1oxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8G zO8loWl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFMk2AEg2y z8kCzsG$==dXi%;O(cqj7Vt{ft$lWuf1wa%imxE|fP6yGT+zz5aIUYoVay^I!<$Mqg z%Kc!v*K`7i29*L}dhJHAd7#n�QlKAR1IEfM`(30HQ&q1BeEd5Fi>hVK_v}{29-7-8dTzdXi%vGqCq7Ohz6BDAR1HxfoM=E1g8Jp2ipfK zjX-=*i3FlSr4on+l}sQSR62oZPzeR1L8TOk29;DG8dO?=Xi$j-qCuq=hz6BhAR1J9 zfoM<(2BJZw7>EXyWFQ(;nt|!(JmB~Mm1-b9sAL1tpwbOQgGx9M4Jze8G^nHl(V)@} zM1x8^5DhBzKs2c21JR(;4@84XKoAWo1;O;^qhR|$r6Gt9DiJ|6s8j^gn>)espwbb< z2bGW@8dOSxXi!NBqCur4hz6CIAR1I^f@o0538F!zCx`}>pdcDlih}7s{NV5hm8Kv* zs6++Ppi&h~ALRqv4=P`hsXs z2@Ik^r7(yFmBb(#R2qZnw`E}WfJ$W$A5=1fXi(`4rq^15N^uYkD#<}Ks5A%D|9*qb2bJm|KB!~|(V)^DOz+zd zmIsycAU>$12hpI?9z=smd=L#P^+7bKqA=t_k-2~o|}sv@E%An;M>{qfPZE42Z5Ps z4+J|?KL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB|Z$C&eaVJQ9;wq4S_%=c2 z;+q25gXa_EHl8bxU$`+rp^V{!V&milrO-zol(W`9P%%C7LDg&G12xfQAJnyqAE^I3 zT%gGn`atvE(gLkl<`1;@wHN4I4oT3Rmsy~<*(^c7&bz>1vP6Pmdin>WqF)Kd?w%h^ zg6<@ks%w8RGuoG6&d&S6Li*MNi)ZgYSpMGg!0On=57xKmJ+N8-uE2J8!vnki3kCMG zlO8zaZz^zXsZVh7pHkqQl9=G4UsmAi;+)|6dBq2J-S`LYm%BcA@;W~7+??~l>#gzw z?>U_XKGz%)d~31`{I)42_{aDb1WaQ|2(-~J2r7M+5G*5D5E6PKA>{Yxf-uun31Lt9 zKSanKdk}Ht#aK>+{%-=xaG@c;kn1q>|z|L@$u z!14e8@dJ!JU{U}~ium}3FgOQ?Ft~zncnE`QKnR1YO9&|CGcZC)QgX=;upW@D|Nnz> z%m4rX|ATT2hz8{v5Dm&XU^?OV0}u_$K_D8Gi$K~zISE9Aaub;Dl`H_!pj-u_K{*Rd ze`rep(V!d#qCvR~M1yh~hz8|05Dm(4AR3hGKr|@lfoM?f1JR%y2%u!Bpj->0K{*#hgK{s3 z2IXK74a&tJ8kCbkG$=QNXi$y@(V$!nrvDuV+Xu?sAU-IEgJ@7L2hpIM4x&N19Ylk2 zJctJ6dJqlD`5+pU`$06Q1OU;XQUFAQN&*lKDh)t1s6+tKpi%)ugGvSv4JsYL^t1OL zKs2b70MVe50z`vK3lI$|F+en^)Bw?-k^@A8N)HeXDnURrs1yOwpppbcgGv(+4JuJU zG^kVo)1Oy>?E{rAAU>#s0nwmR225|x0n39*8xS8<;(%ySsRN=xB@c)Ol|CRER04r$ zP$>kWK_wB029-u28dM^IXi%vHrhk71hd-!v0`Wm56o>|uQegVXN3i{%(h9@}l~^De zRBC}}P{{?NL8TXn29;nS8dQpbXi!N8qCuq@hz6BtAR1JvfoM?42BJZw8<>6@1$Gap zlmqcWB^`(cm3ClytsGb$RO*5Fppp+ngGxUT4JrXaG^i8=(V&tLM1x905Dh93K{TjT z1ks?95k!MZM=<^GKG=LvDGB0(N=gt7DlNhEzQtg9P^k&xgGx>i4JtiBG^hjx(V$Wk lM1x9F5IsCgQ!dxw5K~u|5FKA*JtI8>9bZF3JwrVME&#j*Y<&O# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica b/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton b/absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton new file mode 100644 index 0000000000000000000000000000000000000000..d02fbcd47f845bd101a7ec97150df7821b826357 GIT binary patch literal 2402 zcmWHE%1kq2zyPca3=AL)l9&x;i!?AWFm&8I_h8<0H5I27(q;1oE}z{RkC0@sH{4creF zPT;w@pMm#4^8~(~3mN!VE)Woy*~}o=*(4xTnaUuXnIa$(>CPbP=_Vj%smUO&sUaYt z=G2!r;%#S?Tc7c}V3Yn`CCIjBLu zE`5T*WRnKN^cDf5VzCBe_cQ^MpdSsU>K+1SMzexF0 z>)X2-Y&LLBu-!eE!LI+!1pC?b3=a9{COEdtZgBG7Fu^&cw!uYz(gatR_y*U{M+Mw< zYZ%-wFBkCSjbrfK+$rGo)`7u$&e91!*J2ucYuYFHZL@3ekI9@6FioK$(8ha0P#IH0 zu#E16kkBU$A%FNMgqa>|2z#m{5Fz)NA>t^XK;*xp3{guy2t?mo&JfdbNg#G#CqrDy z7J>MA*$fH37bYaOw>Ko|Zkmvsp4pJXJ7q$uyLUtC+p-Di>bec-XCo$Lvhz1&uCmP?W!gp;+|3K#Bh}hLV53CzM%i zYACyRcS424l!l6Z`zKWXC~K&iw{SxBjfjSty5alK$(bv z5kxYQlHGoQbTEKy`u`u4?f(D&{~wg~Kr|@(foM<`1k;yV8$dKDD}rcHb_CI&ED54P z*%Cy9vL=WIWls}pVU1~EWc8bpJ#HHZdfZ4eF0-XI#3#X&SEn}g{OiyA;QD7%AbP?iVLpllDK zL0KO}gR(z}1{DDy8dMB`Xi!lAqCv$0h!%--2T|Z+0mKlq)C5uB;sL|}6%imBR7`+q zP*DM$L1JR%&4@__F1j~bpJ`f*N{DEjt5eT9|#UO|V6@?%gR2+h6P>~3tLB%471{IAU z8dN-jXiyOervLDR!yi;sg7~1~5=4WFOfY?v4{SfE=mhaW#V3dc6`>#+RE&aXP*Dn^ zLB%PE1{J9w8dR);Xi(7#qCv$ghz1q0AR1K6f@n}t3#Q+ef!zZtazT7hu?wO>MK73M zYXz1E6~Q1rs2B#(prRN=gNkDi4JwjBG^khx(V(IkM1zWF5DhA#K{TkC2GO9R8chHD z4K^QCWP|viVjDz*if%ByZ$DTbRD^^0pkf?EgNkwx4Jyt-G^j`i(V$`-L=WSloy#{k Z#N5{RB0|Iv4o8WNE;#9z` zH(~*IB>!Hxv$NFU?r+0@d$WHz+`qdm;6aGL!cEdckANS? zA3FTvdUxU1N|6J<-zWwA>7IE&_T;Jnxr)yRXizYMXi!jsXi#v1Xi$)XXi%_%Xi(6C>EjQ<=7EA3#0Ld4 zhz12Uhz12W$oZfk2hpHl2hpIQ2hpJ52hpG?0MVdm0MVeR0MVf60MVc*0nwmn0ns#! N8ZH}M15-OwE&!6>AP)cl literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador b/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador new file mode 100644 index 0000000000000000000000000000000000000000..9b8bc7a8778a0b8caea494cd5995318ca30d4fa8 GIT binary patch literal 250 zcmWHE%1kq2zyQn)3=AL)l3;_fc^ViP7#3e$rl2tE&I84m*#Syb`yMFU)CMpxF)}eS z{r|rvfq~)w|D78cS^ocDy?}wk$2Ww**(HR*IXDDl4g&)NDYpH9>iPfw|9_CJATG#e Y5Um(9I{-w3TmYg;a|M@kaEKWf03CTYLjV8( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada b/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada new file mode 100644 index 0000000000000000000000000000000000000000..29c83e71ffa6b071c52b2360295bf55009c09b76 GIT binary patch literal 2356 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

^XkP}TKZJp&zILqk17Jp(QPd$4g= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza b/absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza new file mode 100644 index 0000000000000000000000000000000000000000..22396bb5151aa9345133b2835aeedcc4d8b401d2 GIT binary patch literal 742 zcmWHE%1kq2zyQn)3=AL)lF)>*c^ViP7^bbtme|4X`C!LihXp%7ni%Z5SE6vsVx7UQ z*S`$zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszS zKdSJH>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL14j3MerB*I@yO z1_c<11_c_31_d0Le*Mb;M1uklOz(_T0MVd;1ks?t1ks=X1<{~D1<{~@1<|0u1<{}Y z2GO8E2GO8^2Ghrng3SX3IEW7lbPx>+cn}Q=e30`&5dfk=kpQAW5doq>kpZGX5dxw? zkpiMY5d)?l6)1pcPy~VLE62fnP(*?FpvVHzpa=ugpS-~GpojzUL6HZdsUCq`Ho6AJ HcE(%)K~E*K literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay new file mode 100644 index 0000000000000000000000000000000000000000..f58522b674c2e06fb5a184130fbc470ae9db72de GIT binary patch literal 2206 zcmWHE%1kq2zyPca3=AL)lIVr9MH(0w7#cpVFqyZbHDUg)y8)*=9wl5-{!(x$;q8S7 z^XwBIW?BTWB)m^x4Y(A*=5R5A-C#=qhr;FrPJw9wTntkaxIR<_a6c$d;JG>F0`Gyy z1iqbR7x-6}J`k80aY3*%{DDxV)dk^9%LgKnG8aTWr5}h{{JS8o@%Mp*l5~J1$NdLV zjDG{9KK@CNet17X=Hk5s*@FiIF#dFlYP!z(V@W1&e17A6Wigcfsn|;Rn{YCtR>u z{~*D3chLpA{zD1&vqLU8Zf3q$`Ejjui`d-b2n3m-aV)w;eh)d~w5I@i1 zLW1wIgv9pPfF#|HgyeMlfE3=Wgj9FMfYi4>3F+$00qJM;5;EDI24t=kNXUA2JRp0T z&V!uuk1ynw@jb{}fAm6r=!XXd{mU;DnqGQPl;3%wSai#S694QACI2oalv#8Hl-=8$ zP$7{OP_b`nLgf#ifU0@r3Dr0B0&40a6KZz|1k}Y@C)7{>6u`j5$i&RT#5gG6|NqC& zFfjc8fAs<*%m4q!4=`|m**suUz{fX)!O8YOK_nw78RZ8^ z2Ls5a|NlW5=Kufy|3R4sM1wL8hz4aI5Dm&eU^?OL1rQC&NFW-NnLx&XG8BjgWhxL2 z%2*&8l(|4OD1(7$PJw9wAR3g>!1RX-FdvlRKzvZ91JR(22ckil4@849AczKKLJ$qg zh#(r289_8CLxN~frUcQTj0vJanG-~VGAM`!Wl|6g%BUb3lv%;_$3F=m8kA{4G$`YO zXi(+_(Vz?rqCuG$M1wLihz4b55Dm)EAR3gZK{P01gJ@9Z2GO7l4x&Ms98CY)3bqfF z*+G0zh6mB0Ob?<#86QN0GCzn06#yU_R0x1*P(c8qL4^T`1{DY(8dNBNXi&ibqCtfN zhz1o9AR1IifM`%b0ir>L1(<&J@BxSh6&fHKRB(W3P~ichK?Mki1{ES88dQ*gXi#AS zqCo`;hz1oZAR1J#fM`(R0-`|$42T95GGO}iEU5DhAnKs2ae0@0wt2}FYmC=d-Qq`>s=r{M4h6;>cV zsK5fzph62wA9)P6A5?gO_@Dv|M1u-35DhBGKs2Z@1JR%Y4Mc+qH4qId*g!O>a0Ahx z0uDrj3ONuBD(FBosIUXmZ+*b-0Tp^6KB(XW(V)T)Os^FH%YzC*5FbRpH9z7#w2a=n|siYpiFaXQ1P2XsBnX HXTSvjB;sY5 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab b/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab new file mode 100644 index 0000000000000000000000000000000000000000..ea293cc4066c0e01ffafcc98e2db8a710596997e GIT binary patch literal 1892 zcmWHE%1kq6zyPca3=AL)k|>9=c^ViP7-lzQFbMnB1c(^_njotDdV-knoeAR1XD5h% z-Zw$w@%jmpmlsTsIy`ZL^q#!}GHcce$j+HBAlEZNK)$9?Kq03{Krtp+K*=XWK-tDs zKt;z)KvhOvK#fO2K%Lcjg8EmJ2^vpTCum+3o1k@+eS-Fu9}{$zyqusr<<E?FnEkC6u#lcI!QyVBfaUM9308ZZ z1*~sJOt4uNKf!jl)dagX#|iecWhOYJDNk^0u@rD}W1ZlfA}!#e`h0?`^Iris){_(5 zmG29me=5b5I^!k}wl%%E#v#K6G7$Os`wNwPmc z377$7!~g%FqzmGLk}rq`C1DT^O2!}>l$1d`a&-*5TXi%~S(V(OaqCv?UM1ztz zhz2Ed5DiM|AR3h1K{P1IgJ@8)2hpIU528WIA4G$)0Eh-<0}u_$3LqMk9Y8cFOMvOG zCSZ4fvId9`${rvZltn-^D4T$2P*wrapzH#oL0JYwgR%{X24x)(4az<6MjSr9~nvLT2DWknDT%8no!lqEqlC|iPPP}T&~@1B9}2W3$ZACyf&G$^Zr zXi#i0Q1%DWpdtW7gNgwV4JryiG^jWL z(V!v$M1zV25Dh9CKs2a$0MVc#0!+V{4t5Wyr~vUn#RZ546&WBJRBV7~P|*RRLB$7% z1{EP78dQvcXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F<|<`BXE3xiW(3fRNR1Q zP>}-6rXd#qVUWP1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay new file mode 100644 index 0000000000000000000000000000000000000000..b4b945e8d8d26ff300b54916bcbea257817addcf GIT binary patch literal 3219 zcmWHE%1kq2zyRC~3=AL)k~jlpD>g7NFwEOg*E4_DwVHkNd~*)$Ftj*W`F_Qr8NwEa zBQLHvQvTKAsO9Dr#}Wm19G9HB;)KKJ9VeMKX`E8Hy5rQNDH>-Ow(q#4{H5Sh!m|^X zJ6vvD@nZJ4nxS^%n&wlF>mD38Zg3v=xT*f?#?6;2J#GuKN8G-2^u(QeB@uU5=6c-Q z7Z!29)8FI4Jd22jnT8&Z>ZBqbdkT9ziTxAtRO741Gk1v_&xHg}yiogfm~f+@V@Zthu4GOFLW>bxuNsm?+N}3|90>__`m$) z1%~M#9x%3FzQ9y|=>c=WhX9s@_X(^4mjc)vE+()WYzg2{*qp#AFfD+KVQK=`hl&91 z2jvMoH>X_SJrJ3|x3la5|H{$_0y85n2zG`)5URAgAe?FWKqOM;f~cqT12Kz#7sNIG zK9Eq74v^%y|3HfIZ-CUtKMB$g?+3_Syq6$*@L+)4#sdlR3l|3{lwSLz*qE846uRS& za#r~r71LRNRK3#QsEOA6QP=W(qyBGZjV71&8_j#wHCnHD-)QfPtzkAvA$jM#%BGI8r$7rZ|wS))!5Irc;k@YQRCPWn&af3RpXpup5vnLQ{(C)ndADo z?vJ~!=^OXU34c6!#ou^tcKYM>=I0ylIq@|<*TiysYaDC*wuuDz$Ji$XO#K!RXrq`A zRC*&IScW+vBy?9m$nU2KVWx8e!k#idh>+WHA>zp62a*3~U5Hw8^g;B!nhP;4%OAw< zi@Ok)()l2Mp2LL%-(?Aj?Xdw#x*ZA0>GlCByjcmU?ur4aZ+#Nd)tLj*&*~*)vONvR zTq}@}_3U^+_B5RbIp-f=$Svc0khlKmh5XPD4+{F1Unn%a^q?re^Fp!cmIo#N*%wOw zT}&vm=m;pgw>hCgA}gR`-_(T4A3gz9^U4#dZ|DWo)I}!L?hpv5i?dFspZ+O;k%^I+ z1qrgTB5{xU=0 z62jmZ45D2^Kt&A$10#e2kq{;k1=Lws0rdl?QdXo6@^!3m;4g(rx968k3tM1u-Z z5Dh9wK{Ti^1<{}a6-{@QXm>sQGw}aNB@9mP=y7eL6sJW231@j8dQ0KXix

L2BJZg8i)o}Y#$_1ks=h6hwn6Q4kHPNI^8HG6m6~3Kc|y zDpe2-s#rlZsB#6-pb8d5gDP1N4XS9t^jjaWdq5Q~h!3iCK{Tl11=DK39bZF3JwrVME&vSZy}ked literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk b/absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk new file mode 100644 index 0000000000000000000000000000000000000000..4c8ca6f7fe8e432b6d0a2f511d7993546f3a5c68 GIT binary patch literal 1881 zcmWHE%1kq2zyNFv3=AL)k|=?)MH(0w7$);?`6t+!`a!7Dnjge0 zc^-&sa(|Fe(oB%#c>6($i912+6IX%s!?y`C7vB`f9z35QxA9zo{KAb13S|r*6dNZe zD1|=ypq#b-fr{yo52{`hAE=2g`=G8>{6PKR;Q~#r&0OAlO+-i)6+i~75z#ucK7^X5_BiQR9*XnnbE!kb9UYj7SgvKSUh|G z!SeT>2Uf=}ez3kh?}5$wcLlb)8y?v8UnsDjo%FyVe^Y^DOMQZq|C9pfl*9xV{jvgA z7v}`m&nrH->&8EDzufh~lh^Tq=jNObUT>8jc+cr9@VVxY;9HYj;I~aF!9T{gAYd9x zLZFR)K~U+lgkTxLf{@S?2_e5f7lfIvN{Cu=`9t)*t_LwKTR+6^%Xtu&GW|pRJiiAC zzFP_s+p`mrbf*<0r~4+P@KzM0y6Y#TzKtqKR~Jl3KWkHv$@V!RbFExK*0ZY#+0(2( zJC!H1&!=?{uU4}B={uY6GQ?|wm<#k7R7dj|_D zBq|ar_AM@`{1KHAkOa{~j%|NqAiF!F#%1_6kOk8cQrw{Hl8Yj6mIt4j!jV{iy49l|jYX|@!W zW`96+{r~^}e`dR!0f+{rVURE=9fN34S_aXe^bDdwX&OX>(lv+%rEL%mO5Y$Fl*U0c zD4m07P+AAmpSTJ@G$_r3Xi&Nb(V(;sqCx2&M1%4Ghz8{Y5Dm%;AR3e(Kr|>%fM`&@ z0MVel0ir?q14M)J2$=qN7;GOXuYmZV`~spuc?Lv-@(qXvu I>KSkW04wGEO8@`> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada b/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe b/absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala b/absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala new file mode 100644 index 0000000000000000000000000000000000000000..abf943be0fe277c7435ac9e5d51718028ef216b2 GIT binary patch literal 306 zcmWHE%1kq2zyQn)3=AL)lHh`}c^ViP80OD?b%#B4O#=JbX%{4QDiS2mKM7EO_3nYj ziI@v6AwdbQ^4p(Qfg&-Q_N)S!DOSznbL(I4U Dm;yx` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil b/absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil new file mode 100644 index 0000000000000000000000000000000000000000..92de38bed407d9d7154cd3875edbc2e01c993f6f GIT binary patch literal 271 zcmWHE%1kq2zyK@^3=AL)l3<0h1sWI_7`82OlF%0Wb3wcCnM3{m|Nj}8nV6aX|KF;? z!0`Y7whRWA|NoC4VC4A!f9D1U9v|NjhCtsC23-Ra23-SFkYQjK)qcvgvuDbz?=88Kk zHrQyeq$=mi-CZu)=1q!-_j58&=88cUX1S%3$@MMu#=~CmO7Mcf(;_ z&p(6pdt4nh)Q1{uTsOyIlXt;}&3$zaTU2%%Y|Tq>*d}^l!*)L>haDW^8+NL^Jh1cm z&keg-P9NBPQOsa3L#)HzxrQ6|ecIx%f5I(;1DBs4I2h+{aHzM>;c&n_gCn^G4o3|d z42~7qI2;#9GB{zDci_a&x(%nq0uG$InXut>$D@Qx%3lgDCA__Gx%AqDD-P!`Tn*jv z;F`k53)f9&J-ERz`NB=nng=%@lwP=VuR7uG%94P4`(hLBcZLN#m}j5xFw-L7QJrGK zV^67oXYTS3o(oA_c%jbt;Kj#Z7hbVFe(>tzoeQs@9ewa-~z3)AE5xq|60TPw59@7XL1Y zYy5p6p(Gt3$#MUI6yx6jsgHjWq#xc7khyp-LH6Lm0J)6^666;y4p1ol^gyw(H9#r! z$^+%Bg%?yzw>?nxYQCT*I^%)5R_X=ye_InYx!f;k-kYAF^-A-C_P)vloy%?ky7QtF z^fqe*=-1gM7)<60FiekpU{v%bz}VgTfl1K008@3@2WCba0?gU|Kd_KKbHU=-!v~hX z*IlqWcKCty?Fkob);~zF-CcCSuK!Si{p^qn4*5$G99s$loc!AooKu1WT=X*%TwP29 zTtClx;I12Z!Toa015aM#3!aG0fQGjnvY=Yl5kpTY~`-Fh0-vR<{ z6cd6_Kh`v{IA*N;d zgV=p>7vfSnAH>gdxRBtxEFrNyHXup2BOy86J|KlRDGuFpu|7> zLdn0231t=?0cH0#Csase1yt;tno#+}C!lIxc|!FKy?~m!$b{M*0s(b#)(Q2~KLs!_ zF_H+GSxD4Css+?n|NsAy1O|rx|F2$PWcmO9_yGnEFq;QV3i$YjFgUt|FgON>FgS*X zFgON;fQl^!Mi9wJN&)u+q=Nxu)BpdVg6{wS|NlXS9f$@Mcpw^7=z(ZZ!3Uy2g&&9p z6@VZbR0x7-P(cWyL4_fh{u8tTM1u-NFnz}a%m)>YAU>#o1ktPiG&+E2P(cZzL4_rV z1{Ihf8dPY4Xi&ikqCtfxhz1p)AR1JNf@n}d3Zg-UDToFYs300tsDfxv!3v^5g)5kT z{uAsTP$3KAg9=&@4JvHG^jt%*JgCqG@j(SIhz1qDAR1HvgJ@7845C2=F^C2g#vmG0 zAcJU7p$wuy1v7{S70zJ#XC2slP$3QCg9>U84JxcbG^oG^(+O`cfM`&`4WdDXH;4um z;2;`Qh=XWQK@Orpg*k`@73g64K`B^2s9*>2L4`Yr1{Lri8dS)GXiz~9qCtf{hz1q- zAR1KYgJ@8}528VZKZpiZ0ATv#FR=NbiU7n1RR$m$R3U(9P^AE(K@|gt22~Cq8dO1m zXiy~qqCph}hz3;_AR1I*fM`&q0ir<_2Z#n$9$@;1*8>p!`-Lvpeo#dM;{QFt59a>^ zRVW|BL6tg)531NfG^lb1(Vz+*M1v}M5Dlv6K{Tkc2hpGkA4G#HeGm<*_(3$N@(0nN z1^|c#H3Go&TOY7{K#c(qAJiZK(V#{Fm|iOYmIpNsKzvXG0Yrlu2_PEOPyo@O#sY{2 zH5foNsL=qTK@A5G4Qf1qXix(JM1vX;VEW%hu=$|I1c(o6P=IJqqXJCtgXC9G;{wD7 zH84OlsF4ApK@ANM4QgzFXi$R#M2|K)K+O;WjSeoy;1Cl>mk=FaV?851107#OLp?)1 G11eou?{Dq(=MF29O!V$+T+5h zJ-G+YsH6s*nd5)p;t}qEOV(cxTweS(;EMG11K$%^FMR)B>+sXo<-*U$!3Tcbw!ZLt zd7HzZqbo1`ZO?G{w}aur|K*PlFid}RfwBGQ0jBaJ7nlnkIj|%=3}7`CIl$&{IDlQu z!+}F#X#mIf>H}O1?EzdLvK+V{WCrluY&*bvz&n6%XT|~kO^X5qYG*qL2EMu=l(zkV zu;G~tB5pGeh(w@fhI|sR{ z-~jo41qX#F(*VVMCI= z5McIqdw_-XnF|)rE?=jv;I}Q8ua7c^3;Ob%; z;QG1eg1d@%fcu@50iMi113WheT=05)JHUHRZh+63?-zVqJ1_X{_q*U<{@_Bu)NcWS zHo^fxr8feCrN0J*gzgFm`F%Yg%ydpb*ptr}BII^lh&XcfLgc?$7owJIzYu+|=0Z%% z%nPym;x5FcR9}dn=WrpxcSb;Bdu%|GZdE{Xx_v+jZ%ja{yJA4@KdvkC#3 zY)=C+*D?iUJv$zdJx%UH&iTg|a?2Pl}Tqw%#yihE<>_Ulu z_JxvvhXcwiIs(e>Ee)uU$O@>~*B(&$!zZ9>US>e`4ZVPxI`4qm9RdM$ak>HZ(?10; zGBZ&MS(uO@D+~4D|Nom#Ffjc8zv%!2%m4q!4={54|G#qs0}qS@iTL=2FnIWeFgUw} zFgOQ?fbtRpBO{n%AR^z*h2^^+5G@S<|NsA=*{-nzM1%4nhz8|F5Dm(YAR3e>!Sv-o z2M`U)n_zlR?g0=D%A;UjG$KV&(8Xi%8|qCw>Xhz6AnAR1IYfM`$|0ir?W z1c(Ne6(AZ^UVvy&nE|3f42TAmGawpN)_`bGc>|(BWe$i2l{+9BRQ7;qQ27I*L1hq#29-l# z`rmS}|3T#uhz}~0Ks2aa0@0wd2}Fa+ClC!Pqd+vMoC49HvI<0l$}12JDziW|sN4e4 zpt1`@gUT-u4JyMxG^iW{(|@;v?FW@-AU>!}1JRbh*MZ|1RJMWmpz;kwgUUD%4JzkA zG^nft(V+4UM1#sa5DhB#!1U)HusNXe55xzRfgl=G4ua{;0bqGhc?jZz%0v(iDi=XC zsB8q$pz;w!gUUz{4Js!=G^nfu(V+4YM1#sq5Dh9f!SwIzVE=*2PY@qehJt8NISQta zTm{QK8dSc5XiymoqCw>>hz6ClAR1KOf@n~g3!*{gE{Fz| zy&xJ?{(|YZc3}5_%3%;6R2GA1P;M1%|3Ur$(ICHoXpnzEG{{dN8ssl9{kQD{hz9u&L__=tGN=F)91I}8f_NbRf@qMR XK{UwUAR6R%5KSxpbNL2`m~#ODn4XX> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAsxxh4N8t+`i6S}hz2D~ z5DiM2U^euj zP*MibpyUjqK}i}!gOW9f1|@9}4NBf18kEFAG$@&aXi!oI(V*lGqCrU>M1zw(hyhCa zpzxUf?*oVeWdRTk$_5}Bloi1A=M`XiP?iAkLD>RCgR%yg-kbxL2W1fuACyf%G$^Zp zXi#Tf$86$3qUj|OM&U9{9yY)SqsDm zWiJp7%3>fIl+8diD64^JP<8{+pezTXLD>#OgR&lo24z1G4a$Nb8k7w|G$<>AXi#

^XkP}TKZJp&zILqk17Jp(QPd$4g= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox new file mode 100644 index 0000000000000000000000000000000000000000..cc785da97de0a5614613f9ba6e502d7dc5f525b5 GIT binary patch literal 2437 zcmWHE%1kq2zyRzF3=AL)l9&Z$OEfSrFw9$~(=dP6&w>SQd<_d{-7YxY@vq^M@|S{3 ziJTvyAzyH8g{+@xkkf(qpk-LF4;9UWm!`lXSg9`=hz3L5|0-Fjr z*Dhw@`Y@${`@!S}o|_v!@E#~_;M+Or1OLiN3<5JtJ_vS}FbGwKeGtwJV-Sh7_#o%J>-+ z8y6NRg??mE&f5Dy#q=_Rs@MDvYNA^i)U_HvsQ5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDHLtM%- zhWL3g9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#Uyy#*t09w}u^@A;PD9qS z#|7EbJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#V?^8f$3Qw$9M|L@$u$nyXH>IDoOU^Wk!6abM7A`o#O-w+08mkBShL8TIi29-=88dN%gXiy0SqCuq;hz6BZAR1I!f$2}+!kqzB zYJvEmk_$wGN-q!%D#1WBs1yUypppzkgGw_H4Jy$5)VX!N|PW;L;Gp0F{U!8dNHR zXy2Mju=$|U5yS_TkRTdVN`h!mNeQAsr6q_4m6#wJRBD3hKa61gpwbh>2bG{88dQpc z>7yVLQksHTpb`~CgGyBp4JuhdG^lh1(V!9*M1x9M5DhA6K{Tke1<{}q7es?fT@Vc_ zc|kO&^aayzGr;ZvmBJuCs3Zo_pwbvjuhjv|gGyx(A5=1fXi(`4qCq7zhz6C?AR1Is zgJ@7`4WdCMHi!n5+8`QKa)W44=?$j;y#<>OD#by3P)QD=L8UpE-nS7f4=U9`d{D^_ zqCurQhz6DLAR1K4gJ@7m528V(Jp;G|9udVomveB4nX^lXj<2zvk)DB$uc4uyp`HO3 E0FQJ|s{jB1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo new file mode 100644 index 0000000000000000000000000000000000000000..a23d7b7596fc3019a2b6847a7593007f985e7e13 GIT binary patch literal 1731 zcmWHE%1kq2zyRzF3=AL)l1PWLWf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vR)?oDsFyK+LoqdMD$$DU>dPvYboo@z=IJae~UcrIk};f1;!!;4R1A6~IDFuc0> z-G8{9pe60mJlv9~j#oK42<;@PWDDUjj?Q z-vZWv2MKHr_Y2q!4kfVnN)~VmY%1VfJLLn{hqeS4{jvgA7v}`m&nrH->&8EDzufh~ zlh^Tq=jNObUT>8jc+cr9@VVxY;9HYj;I~aF!9T{gAYd9xLZFR)K~U+lgkTxLf{@S? z2_e5f7lfIvN(g(({~k5x_qra$v~2wlyD#TKT*~wh@$>v1 zB=~MANNmqeNYb5Fkeu$DkiuJ0km|0Vkoq>NAYENBA^ogPK_=Vhgv_;a1zFFoCS*^u z`jB(}^yO{KqQ06|NqAiFiQCNhA=q0gfKV< zhcGyYhcGw?gfO@UhcLLhgn$wi10$FOQA8xc3|JEU0nx?q|NsC0am@b~fM`&X1ks>m z38Fzs6GVfOCx`|mQ4kGEreHde^8<(mC07s)O0pmtlx#sXDCvS|Q1S)Qpd<{ULCF|I zgOW0c1|?@O{YeaL9w=FZ_@JZ>qCv?UM1ztzhz2Ed5DiM|AR3h1K{PnYgBYM>5Axsi ze;+^;DEWhEP!<5uplkr5L0JJrgR%pN24x8l4ayc^x>vFQM1!&im|i;tY#u0^fcT)S z0-{0L1x$Zl0hR}48xS9qbwD&I`+(`qIbeBEHUjZMSqVggvJ;2~WhoF1%2ps6l(j%K zD0_iuP!Q1%7! zL0K3?gR(K0UMmNd2W4jvAC#p*G$>nxXi(M$(V*-NqCr_4M1!(9hz4bK5Dm)iAR3hA zK{P1agXw?w!RCXqKZp-10zfpV7y#4z7K7zM#Q}&9DiT06s8|5eprQdpgNg?b4Jsl) nG^m(h02dHLvz*{^4GuANbqUe&HP$oIGtluhG}JTHGvERMZ&+XJ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg new file mode 100644 index 0000000000000000000000000000000000000000..f16cb30406e3b28e82ab528d0781280ab5f13a59 GIT binary patch literal 1913 zcmWHE%1kq2zyRzF3=AL)k|=?)Wf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vRS(rq6+)s!fB=5E9AT*&0Z3w1e$7oWsFykciycy;l|hu6;@F}&G$>%-e)M;P8s z-1Fi6`Uedk<{vKj*ng#Tpy+sa6g#bz;koM2i^mv4SYK%eQ?n)D{yrQEO7n2oxxo<_k;W8 zt`DBPjt@LH=X~&btNg%wPG^D7HHQS>n(P9(^wJ$ZS)I*N}nYJ%Lo>P zgq}zU`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^ z=l3ANcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD- zdz#gUobw+a z?_fcNL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGiIItsiJ1jVftbjc z6{{#CDWuHV>E-0FewL|NkF9z$oG48^Yl1 z62jmd9Kzrn9>U-p5W?UZ9Kzu05&}w<42)nBL=lmOOJQmF2SgXc|NsC0$1(p~0HQ%@ z8bpKAHHZeKZ4eDg-yj;4#z8bForCE_&JQ3Ol-@x!D9wXtP`U@vptKL7LFpe%e-Z<$ z2jv40ACwnBG$=oSXi%O2(V%<*qCt5BM1%4Nhz8{m5Dm&FAR3fcKr|@7fM`&j0nwm* z1EN8B2SkJN4~PckAu#%SVE#W)z5)q=@)jtZX7GYYa2^9O zK=}+rgYp`P2IV&p4a##M8kFxqG`qot0x;dH4k|JjI0ZI=`Jj9V5(ni)5Dm(YAR3e> zK{O~|f@o0Q1ks@U38F!H6ik2K4x+$$6~qALR}c-#vtW92&Ib?;%DW&Mlz%}qC=Y{Z zP(B9Hpu7yCLHQX(gYqEEBh{s8555FeD^K{P1OgXtq5 z!S;jlK8O#>{~#Jv27qW#IRK(TWdVo=l?NaiR3?CEP`Lo2L1hDo29*yW8dOGrXizx; zqCsT^n0^}tb`Pk`0P#WP28afg9bkH`99SMyhJg5>as)(!$`TL_Do;Q(s7wLTpmGI7 zgUS{V4JuziG^mUL(V%h$M1#s2F#Yd7*nCi#1LA|q9S{vFd%*O*#b9|*83f{k${`R9 zDvLlgs5}DEpfU+WgUTfk4Jw-$z~#>{D4e)lgF{SRT|#txjrEN540L=A4fPE547dRH C#I;iZ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City new file mode 100644 index 0000000000000000000000000000000000000000..0250bf90f8fc8716a77163e7c1b92663fc6d96f7 GIT binary patch literal 1735 zcmWHE%1kq2zyO>K3=AL)l1PQJWf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vSFOFuJQad`dV!Mx~(hnXP-kLqk29($Sc^7+!o5 z`|ygLf#KD~A0J*nd&KZ&9VC1)uYmG<=C~ zFZk-;*6?qK%!mKW|36@u{_g{0`@;t=`eg;KE`bHEpSLr(>*juNzdVz{lh^-)=jLh# zueXLDyyr}B@VVw!;9FDK;J3}7z&|FsAz+$NL7hLF%}1tEVJ8^TO? z6ofsMV~CKu@*(0V14HD$Z6BhRJYtBxH{(N0%MpgyeN`XgQkF5q&x`qx;CrYcvAwb& zNq0#@a(Z+@3U6COs=IAL>f4NlbanZH^s`4##`iwq_H?H@}1y=^G7SW-}S?|egrL|Z|{zKso) zKQaoc=1p#>zTs6+Q&-whyF;g-E-t*Geg1|>`o4N9CK8k9gm zG$@gRXi!20(V)Z%rV}|ofM`&n1<{~{3!*`Z7es>+Fo*^vVh{~V$RHY&m_alsL4#;e zq6X2RgbkuWi5pCR5(AqLO5`9uD4~OBP+|wspac)1L5UtjgAzW71|@zF4axu@8k7k@ zG$8UeY7h;|*dQ8|xj{52gM(;LCI``=j1HnfnH@xfGCYU|WqL6E?=9GTQ052m zK?MMa1{DHedf!H{Jg6`L@j(Rwhz1o3AR1IKfM`(R0HQ$!1c(L|5)9ztVK|f$T+YEE YX3j1lI=;qwMtTN1zJ`W+hI$5E0BhQRBme*a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay new file mode 100644 index 0000000000000000000000000000000000000000..e934de61adb342d238789c5dab9155408f8cd778 GIT binary patch literal 1423 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 X)g?s7*I3U;&p^l5&`{4%&wvX66U)25 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis b/absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAsxxh4N8t+`i6S}hz2D~ z5DiM2U^euj zP*MibpyUjqK}i}!gOW9f1|@9}4NBf18kEFAG$@&aXi!oI(V*lGqCrU>M1zw(hyhCa zpzxUf?*oVeWdRTk$_5}Bloi1A=M`XiP?iAkLD>RCgR%yg-kbxL2W1fuACyf%G$^Zp zXi#Tf$86$3qUj|OM&U9{9yY)SqsDm zWiJp7%3>fIl+8diD64^JP<8{+pezTXLD>#OgR&lo24z1G4a$Nb8k7w|G$<>AXi#

^XkP}TKZJp&zILqk17Jp(QPd$4g= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik b/absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik new file mode 100644 index 0000000000000000000000000000000000000000..1388e8a4d93dc8e04680aa2aa9e33f32495e26fd GIT binary patch literal 1928 zcmWHE%1kq2zyPca3=AL)lBk5TMH?6x7#^_sHGJ34X!xNqg+Z`$f`V{nihxL@JAwmw*(LdV|y_wF%OXI2&XxaZHds__{%ERJ;R)c@U|pvhIlpn31$1g%#g4BGn^Ptdts z(4af7b%NgJpa%WA^a%!&O&Sc-TLg@X#Tty=(*#U{el(b>dkB~r-D)sr*AlRh{?1_W zoJYX&_e}}S_AIOLz3;Mg*|!O4Ha1m~361{eKF z6I@;58(cph6>!(BVQ{~^T)>kzj=^(tr-0X62L|ssODFhTi)rw!X`kS?&91>eCUZi- zG=+vh8}A80WlRmhGP)B&LZ38*{NbMvW_qk4?5U1Ggxq6>h@*T0k^hb|L@oIs5Pfes zLrlvhf!KYW3~?!21mfpqGbH$4n2^}s-jJlbX+m;(Wo%mH zjhK+h&fk!^)@nl5vyTng)4~OEF7PqrmRSnqt^dG~A0{nO(0_@c(DbiBQT`T&V$u5o zCH~VGO8)(xP-d~Iq3qt>2^A7k8Y=efpHTUutf6Y&!U@$kA{uJynkUrmuxhA_OPx?Z zL#Ba&iIIt!WdI;3r7UKf8pi~W#2BmBe4NBc0S|rjPM1fN|h#_XF z38KKM9mD{ocn}Rr^&lFQ^1<{cwFw{^lmkFCC>MZeP)-2RpxgkWK{*0MgK`Ck2IUM8 z4ayxL8k9poG$@yVXi!c8(V*M{qCq(ZO#izNwhxqZKzvZ{0nwlw1foH?2tuavF#RXi!cB(V*N2qCq(lM1yiAhz8|M5Dm(mAR3fIK{P0rf@n}q1<|0~3Zg+d z7EFIW3bqfFb3uGi?gi1H91Ny6cY@_XIT^$UGKt0K^BC1|S+#B7kU6 zsQ{uuB?E{Cl@1^pR6>AgP$>bTK_vx<29*{d8dPF{Xi%vEqCq7Gn0{LZb`Pio0r5el z2#5xiBw%{26<8irqJa3IQUyeVN)`|eDqTP{sDuI0pi%}zgGw3@4JvIwG^oS@(V$WX zM1x8mF#Yd0*nCh41mc5AArK8JiNN%}{a|@ei3H+wKP3{j8N}36h9B)5JF>xnIec~#Re)u*)=Hi7%YFE`e1eJ;s@*7^B&l&e^+3;yWxRd|Ahkk*+~x^@;4PYw$vv$`A;cu zPDxB~(Jw1-b#YE`{k-CXyKejg_sd-$Jb4`-cy7-5;PqDdf%lxw0-tLR3BEPi1%BI< z68vL)3j(IGBm~;%7X+0)O9++`EC>lbkr49xb3vHts)Vqo{2wCZjy;Gt^6^9DzZDOn zmR$Z2eXr|5Ov}~}vHNl!#HCFC5I@iFL4xm=g2eXhge2W*1ED2P-ZbLq3qtlf(nU>go=HO3o3s^B~;C8EvUX>lTcHaUQoM3 zE}<^Yv!H$kLjnUUBNH}FK*MJZP*WeHaR~Hu$5yIda9>U-p9Kzu262id1 z2r-@kiA75C{{hwh|NsC0plkr5L0JJzC;WZ@qCr^#M1!&gNI58LfM`(m0MVc<0-{0L z1Vn?f3Wx?}7Z44~G9Vh1ZNT&=t^yDZ%03_(l!ZVvC>w!jP*wubpzH*qL0Jk!gR&Kf z24yV}4a#018kEIAG$@;aXi!!I(V*-GrvDuV+Xu>aAU-JTfoM?n1JR%?2%u3(N;)e-Iy31b}EzF#w`LMFEHg6$c<1R3w0CP_Y1_K}7?I1{Dt= z8dOApXizZ$qCrIkhz1oGVEXrGaQK6Y4G%A5foM<> i2ckzfRG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy b/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy new file mode 100644 index 0000000000000000000000000000000000000000..a74ba046226060a01c6255b6714a40211f739a24 GIT binary patch literal 1081 zcmWHE%1kq2zyNFv3=AL)lCXiYMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^Q8*=5fM`%Wf@n}&f@n~D zf@n~jf@n~@f@o0Of@o0uf@n}2gJ@7ZgJ@7(gJ@8EgXw=-VEaJv4&sC29z=uUA4G%F z0GNK)b^t_!(gK*?@D|Jmr3nxplrBItC~bi0`QO0upfm#FgVG6@el{QMA5eM$@j+<@ zM1#@|hz6w{5DiK{AR3g0Kr|>FfoO1A0x^0_96-SfN>d;jl&(NDC~bjgQ2GMVpfm=i zKa?#1(V(;jrXStj0HQ%@4n%{}9f$^{JrE5_e;^u^20=6^9fD|3S_IQ~>J>mVC`~d9 PbfV<4(KRr(Gv)#SHnQoE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Juneau b/absl/time/internal/cctz/testdata/zoneinfo/America/Juneau new file mode 100644 index 0000000000000000000000000000000000000000..d00668ad189cc7627b9301e08c00d84f1688ab92 GIT binary patch literal 2362 zcmWHE%1kq2zyO>K3=AL)lIVxB)fyNW7*2OeEx4rorQlMcn!vvu?h5}`XbCXP&{SaT z;1OV|;8tKR)R@4MsJ?(TkZS^)Bj*BkgEte{dz}|>3Y?q3xpuz-*M|)gxF4)vz;pAg z0Plf`3;1@f7vNvHPC;PiL;=Ch2?|1$#R9^aMG7L3$qJ&LAqrxa<^tlHW(pEY!4o7o zB^0EXOeaWbiwH=4a@rvMNOghCC6x`bhu9a$ZDQLXzwqS(g)&P6#m3VMl)|J9l(Swa zsF?mWQ1v>cpeB0XKwWE%g8IMT8#KB46g2PM-JtcVKtX%o{tY^pdlu-&{SczkJxhlebF2bMsOIueUJ@-g6Fa@VQp8z_(`c2ET1l3;bhRHv~+xSrBNGz9Fbg zZb7h&=Z26lh6N#iv^RvAK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j)AG(BcHdHk zxReV9@$=dh5`5omNNiucAW8S!hUE0t1u486Hl(_zFGzhmX+yfY=YsUJB^xr?wHIWr z4cn0QoOeO?v|@vt3t9@fWuXRn8+a7*!^{l|`rj!Onn@ZIXThYfi zgdrd}gdre2gdrdxgdxBsgdq}ygF_e`y=a0n>NFoFmWhA?nsGA;%N1`q}*oCsyB z{Q&V8KyLg0-~Q0wi~s-s|6ki~bQDB`G9QS(r2M4-Oed-dfM{?=1TjFF5u|^HrUHlp zWl9hY%9tP;lsQ2(D1(A%P$mV@po|KlL75dy_c|{C(V$EVrq}KVn+M9gAU-GqgJ@7D z2GO9545C4q8AO9JG>8UeY7h;|*dQ8|xj{52gM(;LCI``=j1HnfnH@xfGCYU|WqJ?| z%J?7}l=;E5wuk_j{^Ya)M1u+f5Dh8}Ks2a80MVdA0Yrle1`rJ@96&UvfB?~;LIOmC z3JMSnDl9-WsK5Zxph5#gg9;8X{qHx}K2QMy;)4ni5Dh9wKs2Z@0nwlW1w?}i6%Y+7 zSU@zWZ~@Vv0tQ5b3KE5=4UvN)QbyEI~A=zy#5tLK8%T3QiCWDm+0nr~n1iZzqA>11d;C zd{AKuqCo{Jm|hzOmIoEAAU>#Y1<{}a7DR&zSr82>XhAfnum#be0vAMs3SAHlDtJLO zsPF~RpaK|7{}%_F4=RX3d{AKwqCo{RnBI3AEDtJ}L3~i*45C2=G>8Tj(jXdCP=jbt zVGW`|1vUdC6Eh1FD^|z`5oPD(pd(~pxLge?7HL{=Ge8P#P#{29T#nwsA(o)RUB}m0 R&q&We$JfwM&rr{R3jnkYTb=*_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville b/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville new file mode 100644 index 0000000000000000000000000000000000000000..fdf2e88b48cecddf4eafa6d8a41ba7363e4874d6 GIT binary patch literal 2781 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 E0FQJ|s{jB1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk b/absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk new file mode 100644 index 0000000000000000000000000000000000000000..d308336bec9a539742ca3885c44a4d3c5a674463 GIT binary patch literal 212 zcmWHE%1kq2zyQn)3=AL)k^s>l%-6ucz%W@(Px;%7Hy#X(O#lDyk7Z!^|Np=a2A2Q- xj~`&*^6?E}&^0hIHehfJ4gqOpU|=A{f*(*l|NsC053&eElVll}V{nKG7XX!!FPQ)U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz b/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz new file mode 100644 index 0000000000000000000000000000000000000000..bc3df523516d19191aa9d9b88ecc97c3ea1acd4c GIT binary patch literal 257 zcmWHE%1kq2zyK@^3=AL)k^s>lEYQHfz_3GZ+LImcu3oAC|NlQD6EpMw{|96k7{DaU z|NrN77&-p`KYoCL$HzB>!Pz&2!6`U|LD#?pWDXb;VIM2hZh;?Q9U#;H|IcifPWk`; d|9_DEVEWzFD!A$vBOb)uM5ZIbq^fp*ST=~ zKmP$ai6a4W{jm=6Kfhm4D41|Sb>8C(YN9m@}KO-{}3S|EOfBO*z zhX4P!uK|(A4=}R)|G#qs1BZ`q2!pPH34^YIDaa9EOoU^FV2=F()&Vl}|NqQ(_h9tP91=YZ9NJkCIo&$(=L4NUD!xd4VyhqwR$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles b/absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles new file mode 100644 index 0000000000000000000000000000000000000000..c0ce4402f60a135017d49933afdbee55916b9be3 GIT binary patch literal 2845 zcmWHE%1kq2zyPca3=AL)lGp`hi!?AWFw9%#v0(mg(FqIMv=%I!^?kzWPN@Z#l)n^Q zN>mfL_OB%7M#I_(xBeZTaQnanfjjq>PPn^r&4hdV+9%xa?3?glUgm^{nFSLb)p<{N z>=`uSNu2J4rfmfGA1ztbWJLMeEHB&URe6qD%$sZS;gq#ub-khvtb zK=$Cz333~MERbJ#dxAolwt`~g-U&)!yb8)$w**v7-z%tk?GaEDy{MqBHBUhO-`fS6 zTnz%6_s%cSdX*%gy>H_Joy&C-bmvW8ptm_;f_`1;0)xp;6AaTQDHs*2OfYsYQ7{Q+ zn_#LQreJ3DVuCrlg@T0)tANFGDFw^l&jqZG{ZX*KeNw-gz5OGvSA@bj4fv6?_6r%5K6^Lnhpb)!nx!OA_ZB3!Po0pYdtgCw zdijJD-bD*i-6JQYzHM2Mu5LXc{cPHTOm^7`nQJ{3WIg*oA$wY?Le2#lf!s28g}n9u z1oFc)6$<(v2o#!eD-`7)5-1jZt5D*BMfL8S_a29+!z8dSP~Xiy0QqCuq$hz6B3AR1KKfM`&O z1EN8t4w(LA40aEw^a1ffB@l=Pl|mpIR1$$`P-z6BK_wE129-)68dNfYXi(_{qCq7T zhz6BXAR1IsfoM=^1)@PE7KjFwS|A!!a)D@2=>?)eB^a3g(X0TXK_wZ829;(Y8dRcz zXmF_pVt`6EP`u30Q~*(+5)MRzN;wb>D(OHpsI&vopb`&6gGxOR4J!G-bg%OQ5Dh8; z!SvewVDmsFA&3tu4M8-hLvaIDp^4^sB{I8$^Rja1aeD z#X&TvBnQ*arNHq4D$zlFP^k{0K_xqg29@q08dSoAXizB+qCq7+hz6DRAR1KSgJ@8x z528UOKZpjE{vaAu1Aytzm%;XdY61`+R2zV3P>lelH%|x4gK7p4A5=SlXiyCSqCvF; zhz8XZAR1I#fM`&S0ir>*28agL93UE0dw^(A4FabB$b!QkRFi=CpxOjPgK88oeN+Z) zKd5E_@jwsub%>$xAwGW5})j%K`R11M< zP)!7;-?o6=1FDfgd{C_fqCqtim|p7vmIu{PAU>#;0@0wF3PgiyD-aE;u|PDa)&kL> znhQjOYA+BCs=+`ss1^g!pqdO!|K|jo5312Xd{C_hqCqtqnBI35EDx&TKzvXw2ckhW z9f$_ib|4y5Utp}n(H6H`G&Kq%6A6Gzdh(&-)h>owZo{^q`j<2Dio}r!r7XTp5 Bm^=Ug literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville b/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville new file mode 100644 index 0000000000000000000000000000000000000000..fdf2e88b48cecddf4eafa6d8a41ba7363e4874d6 GIT binary patch literal 2781 zcmWHE%1kq2zyRzF3=AL)lGp@g%QP@BFw9$~(=dP6&w>SQd<_d{-7Z*C{GDN`m|(#v zUcZJ@H{1(Ocl>L(r2M7eQX=PvOSh*dTwcOia5eNQ!|embAMV_n-f(y2go1nfDjV*1 z78N|07v1nMGo;{Aoo&NoPqTt2aql>|I7bBV3_{z17rKc z2TbJ;J}?*jOJGU(TfiFdAc4){egV6|p#=6`$pTJ+O$D55r+nc0(3ZgcptXSK=As9@ z2ht1pcD6j=U)lUYU}o9_!OqkVLX{p5gfrbgh(u~V5cSmjAZE$)KwOjigM^Z1f+WY= z4^m9r2~wZ93Zx&tO^~_xra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm} z^_uuVO?24@b*i-TGXmW)<(7d;_Kn(P9(^wJ$ZS)I*N}nYJ%Lo>P zgq}zU`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^ z=l3ANcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD- zdz#gUobw+a z?_fcNL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGi4h8!S)dG<020m0 zh6EXr*vR7aV*mfYeij46|NlETFtYsrzj^@!2bj$RCIvtwgUJ8?#}6<{`1pn}IJ<-} zI0uI?IERNYI0u9m;_NonobB@BoLl`8dUOtXi(_`roTM`yAM?)eB^ZbXm0}^@Kl3F3oFNe~SxDM2)- zv;@(h5)(v&N=*>xgAVN_r3BzsL8U&329^9E8dUm&XiyCRqCvF)hz8XJAR1H~fM`&S0H%L`28TbWW&rU)wF8I- z)evC%$VagKpqc{22h|oJ8dPI|Xi%*IqCqtWhz8XjAR1JIfM`%H0-`}R35W*OCLkJA zqkw2otpcJ!H4B)28wGX`sD=UYLA4Bs2GulRdaWE-9#rFi_@G(`M1yJ`5Dlt*Ks2ZZ z0@0va2t^XkPz?p*gK8-d4XUZY^uEPlc~Ff7 z;)7}}5DluiKs2cK0@0uv3`B!!F%S)^$r#}E*NCplxLkunOkG_l%-6ucz%W@(Px;%7Hy#X(O#lDyk7Z!^|Np=a2A2Q- xj~`&*^6?E}&^0hIHehfJ4gqOpU|=A{f*(*l|NsC053&eElVll}V{nKG7XX!!FPQ)U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Maceio b/absl/time/internal/cctz/testdata/zoneinfo/America/Maceio new file mode 100644 index 0000000000000000000000000000000000000000..54442dc737ede2aab1b597ee71a1db3aa8e33aa1 GIT binary patch literal 770 zcmWHE%1kq2zyQn)3=AL)lF){-c^ViP7^bbtsM*2q`C!LihXp%7ni%Z5SE6vsVx7UQ z*S`$zNIu+fXJ@3s-QS`H_h#QyxPNz+!GjQEg)h_pZ}`d@r||7Sioth2xdlH0bqszS zKdSJH>(Yi_D}F5a{f5opPj~GC*^_++auwGX$S*M6pkRD{fnsB(ffDzL14j1t1y}4It-(q5?#Nq60*Oq69>P zq6I{Qq6S2Rq6b8Sq6kbsDo_B?pr``VSB``EpeO_JLD2@HK~V>yLD2`IK~V^%KY4-G YgQ60|2Sq1{ra_c)+2|S=+Zl5K03;MD&huK)l4|IcjKNdeIy|A2%+ege@Te}QO_-@x>h`~VOQ@*|ku5(wsl{0icO{0pK% jeg@GXe}ia{-$69U{~#I^1|S*~4h*yi2rlQ~5Hl_Sd@pf= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Manaus b/absl/time/internal/cctz/testdata/zoneinfo/America/Manaus new file mode 100644 index 0000000000000000000000000000000000000000..855cb02c4082719f3a51c8401288c013efefe683 GIT binary patch literal 630 zcmWHE%1kq2zyQn)3=AL)l2C-Qc^ViP7^bbNciF)o{$a;ozYRM-IyvmR*JNd$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gU*4&4!UWV z4C?>?|Ifh0h!-;b|9^ZB1H=FSS1&NK{QrOa00W1QZwP~~fiZ)wfeFYv3=9mUc=`ua z&;S4b|ARaaqCo)wrvLhF0MVd;0MVep0MVcT0n=|d96&TEV8HawbOR6#3Lp>-3M3E> z3Mdc_3M>!}3NR223N#Q63OEoA3Oo=E3P3P@{4&@)P(XtCpuhytpa2EYpg;vV9~7`4 s8Wgx78Wg}F8WhMN8WhkV8Wh+d8Wi9l8WiXtnrZ>hWut3gVrRky0Nm{dRR910 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot b/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Martinique b/absl/time/internal/cctz/testdata/zoneinfo/America/Martinique new file mode 100644 index 0000000000000000000000000000000000000000..f9e2399c9d2254d5c447fbd0b6dc6be303569262 GIT binary patch literal 257 zcmWHE%1kq2zyK@^3=AL)k^s>lEZD%nz%X&~2^V4CJO>dIu?>t&%uN6PAKSyg047=f z|37|!f%E_Ws}~q~eSAY0+}wOa7#xE`7#v+fKn8&^5f-vSEf@R&)&Vm9|NqQ(kt6^A b|Njqi07w|*2oMc&2m@Iz;c^TPG2sFL5=%V} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros b/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros new file mode 100644 index 0000000000000000000000000000000000000000..5671d25816de263b5de2d310bd974fed88238605 GIT binary patch literal 1416 zcmWHE%1kq2zyQn)3=AL)l8At^c^ViP7?y6km7o;*kwH0Y?+3&5G6th!jsj!%2nLg& zR|Tf(Rt#oFX9~>OWf&}^Uwp85_K(5x_o)w7Us)Qgw;lRmv;I$m?e4x0cK!Dn>}MBz zaL7N<;Mmez;N-uk!8s+rz(v2M!POPnx!Cl3;!2L%vgC~n2Cv883%ut{ zZ}7S1SKwPy+2FU$puj&Sx*=eiP(h%LZ9`D$mx5p!`G%0tYXu>H7#qS&cNBy@m1BsI zyYeC8C<8;}zil6)mONsJzBl7TOv@35*nL$W;!>6|#LtWQkl=f$A+f!(AW3&gLvng_ zK?-kML#n%NLF(I#hIDoLg7mXq4VmnW1(|Dg8nT`}F36td$&hpY|A*W%ZHBz{4?pCG z@iG+jAO28i`ktXEf9Z!}(TfZv{_P)1{=ID|vshA4cJF*cg+yCH#lDRVl|M2Hs^(2@ zsJ`JFfoM=#0@0xK1foG{3Pgj_6^I68VJYY+`e+aMa0zCko7je}@VItS69v<{*{=^aFa(maR; zrF$^_HUsP)Q2Gb)L3sc~gYp5GUaJF^2jvG4ACxCRG$>zyXi(k&(V+YRqCt5CM1%4P zhz8{q5Dm&NAR3fsKr|@dfa!m4!RCYV4~P%SLm(QIkHGZ4jbM3Degg49c?v{>@)d{% rKZJp&zILqk17Jp(QP#x-QS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan b/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan new file mode 100644 index 0000000000000000000000000000000000000000..afa94c2ac5c1679d39143eae062b812070876492 GIT binary patch literal 1564 zcmWHE%1kq2zyNFv3=AL)l8A${MH(0w7?y5(QLz3~-h*vvVF}xvFD2~YF-zF-x9!8} zSA_{TCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;8wIlGpCh4gm@i|0H7mcMT@ zSbY_mV7=`kgUtr63AVfEGT8OMnP5M=p1~pi+yuv#*$qzq8zwlX)Hb;2PnzKB65rs) zUoyd6#j(Nt$3y{77Uc%d8^r=%PgongcZ3S~oK<4*onbEEx0Z#$zd}+VpywGwV4~@S zpqvv7!H(h+LVQ*+gev@;5T?_^5YBLWLWJmwhKL7yCq#bjYKS^8e?s)toQ9Z{djw*) z`ZdIL&J&2AYS567*&vWu=gW}fnIw=Lr_Ye0=^~J7C&-W{lrSM(_A^8JC#MM+f3GrR zUQ(Hmb$2^M_9nIoIma$HAkOdI1B+|Ns3B3_Kt;M1%|3RqKWbK&cKygHj%d2Bkg_4N8F^8k7n_G$-f@o061ks?> z38FzM6hwnkDToH8R1ghHtsokdVnH-0)q-eH$_3G&)C;0PDHue9QZa}IrDPBdO3h&U z$3(FGpi~XwgHkq#2BmHg4NBo48kEXGG$^HmXi#bg(V!F$qCu%1M1xX3hz6y85Dm%! zAR3elKr|>PfM`%|0MVcv0ir><0!%;HI{`$4atDY8uo7 zpj-o@K{*FRgK`gu2IU|S4a!9z8kCbjG$=QLXi$y<(V$!fraw7>?FZ#95FeDoKr|?q zfoM=p1JR(|2BJYZ4n%`;9f$_yJP-}aeIOc?13@$>7lLR|P6W}Q+z6sUITA#JawVAl z)eDXfQ0@frK{*segK{Z|2IW)`4a%(`8kA!}G$_}CXi&}t(L*Ema`^^_nESef==hrG R8R{A6_!=7Mnd%vE0RWqRkqZC- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza b/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza new file mode 100644 index 0000000000000000000000000000000000000000..5e8c44c8934960e2010e7b0505966747cb2c6e50 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QI=GO@C-vi|?SzlMR~ z|Np}m7+C)QKYoCLuziT@HqCu$wOmBD#=7UlPh!093AR3fP!1VlYV0ln#0r5d8224Mj z5B3iz<$(C0)B~bHDF{S^QW1y-r6dpyN=+adl%ha1I8}idJthvI;02{F5DiLUAR3g) zKr|?&foM=_1JfVM7Jz6_ssqz!4{rd`pwtJVK`9VKgHj=g2Bkz04N8q58k8bIG$>Vq hXi&-o(V)}`rtj1%fM`%EWf=Hm%4MT#U~Fg11ps7H?qmP} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee b/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee new file mode 100644 index 0000000000000000000000000000000000000000..55d6e326692c81a3a526ee65fa5ece091ba5101e GIT binary patch literal 2283 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 T*I3U;&p^l5&`{4%&wvX6S6XeT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City b/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City new file mode 100644 index 0000000000000000000000000000000000000000..f11e3d2d66a2d7c21f498df96c3fd1db3a0d8817 GIT binary patch literal 1618 zcmWHE%1kq2zyPca3=AL)l1PTKMH(0w7?y5(QLz3~-h*vvVF}xvFD2~YF-zF-x9!8x zdm9ptO*aWR8T#?T$yav+&NCf*aDIDOz^$304{nz=UocEBV=yY_C@^-9U@!@KRbZ-a z#b9Q1rofzChQUJm#RrRL{}?QPpZZ|+m8HRY+o2CO>;E*^?(X|w*MG0Ues;kJhx`K# zjxD_fPX3D;oKx}(T=ZKSTwMYS-1yTP+*OPV+{f?@xXuX-@l%xw5;BVz66@?fBzcA~B*!UyNYON7 zNVQ}7kR}w=kS_b=L;5F^hK#?*K4e}JYsk90;zRbv9}PLjjuzxjyw#AmY1Tc@`&G|S!SDT{;#ML<<$K)^RlA%Ss?YO( zs97A}P`mEqhq`9RhWftC9~c;!K#-YZZ4N87s`qkY45DiL(V0wEPm=8*hAU-Hbf~*B4OArl8 znjjjKJV7)liGpZQG6m6~qza-z$rVI{k}Q~h_76mXlP-t>O1>Z(l!QSvC>eujP*Mib zpyUjqK}i}!gOW9f1|@9}4NBf18kEFAG$@&aXi!oI(V*lGqCrU>O#f&GQQ)KxVt|rA zhz4Z=5Dm%(AR3evK(y}+O%Mgn5+DXBTYzX#)&S9<>;a-dSp-CbvI&R=Wfc$&$}S)p zlx09PDBFN&P}Tv{57vW92?kIW0`WoF2tdgPbOgdL0J&Q2W3ML4a$lj8k8MDG$>1g zXi&BU(V(meqCwdcM1!&@hz4a-5Dm(zAR3fiK{P1Kf@n~-1<|0a3#Nb7gD7wo1~EX{ z7(|1zGKdCcXAlj_(jXd?twA&>YlCP|_6E^IAd7Q32ZxwByM*ZYn&=to8R+;L8t9qo H8E^pr0tw_& literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon b/absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon new file mode 100644 index 0000000000000000000000000000000000000000..75bbcf2bcf70ebc700cb98526d0f2a1e5cccc438 GIT binary patch literal 1696 zcmWHE%1kq2zyK@^3=AL)lE{Lx1sWI_7$$DBSRtI3d_bY}$pyv6atEc*V;7XOCLd5S zU2#FxtMq`HXx9aGt?&ct|CR@6a#SoKsvKT=b&?TwT;1TtD|*aMyJ{ z;C?ypf+w%)0ng0=7rfrGAMl=&8{l(I#lg46KfrGrn}dIhVL-st7Y>0o!T~|0ryPQ% zzXpVau5k$YeLWz|w9g^z$>$3Za;pwR9JzWS@?Xz^s3qGkMBmFh5YsaALhQbP192(U z7vkp`9Z2w<5s=vK?~tTh6_A{6=#au26OigI?2!7_E+Ad)t3&!(g@8=9>kgS~nF6w& z?R3bVCU+s{{M7@wWegYc)^9(MANuG*LI2DHg{DU?6y;YRC>C9Ip~OG-K*_(u0c93d z4rTY222@DII8^Lw52*ZM=TJ2-Gobp0f-GKV(PaNw1|Nqax$iz$+ z$n^jJ=?Dgf|NoC4U|{+G|LO$>j{pB3KVanX@eN^c3=Uz?H85t-H9({EGAE;SI`RAU-IUfoM=p z1Jg&Yg6#+8I1nF{>p(Op=YeQY?gP=F90;O8xe!Eyaw3QZXi$y?(`%W)@}Qgx;)8N8hz8|g5Dm)3AR3gDK{O~g zgJ@8W2GO8g4WdCg8$^S0H;4x1a4`MvFxY%hP6zQpxgA70$6 zs00Afpi%%tgGvGr4Jr*lG^j)X(}TKH;Ih#*Ft#(c(KRr#)A2RdGtx8A@ijEmGt@KS F0sz2&ve*Cs literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Moncton b/absl/time/internal/cctz/testdata/zoneinfo/America/Moncton new file mode 100644 index 0000000000000000000000000000000000000000..51cb1ba3d2de0ad19453704e4b796dfdf0dd8464 GIT binary patch literal 3163 zcmWHE%1kq2zyNFv3=AL)k~j}#OEfSrFf@GJ7BFu|Yr_0pcLR3YSX|h>McHAmjMRm_ zQ&=7L{r+=dfAMpN1Gn#8I2e4=;n3~_7Y-Y*b~rM7(S@VJy$;6;eq1=td)DEE$HxmN z-mZ5zB^Gz#)V0$GPIo*?xTO50;8Mcd3zti;J-Fg<{=(JJ9S^Q4Y`k#Ybk>6#43jV1 z6s>u1^Fir_TmNPz+&&O~;m*D4gu5$C0`BdLO}O6~7Vu!6eZs>`i-1RUiV2TBr2?MB zF(*9L_!IEVUH-vyA&Cnw)EOVV6nk>v72D$nuf83-@cP-&2XC&exbXJa@(1ts9}RfF z{z$@y`O5=7_Ag8LRNoo!Ilm*}OMG^~SO2VpZ}z?c-}QYGerRM~_{p!A@QcIy!ml4* z4}QPUz3}IT&V#=v_%Hn1!S~?*@{bo7rhj;nJF(gy-FBQ6MbhCdLhw7MXiY571T zQs#oFr}P6ci+>lyHU2)3P?8RiyOmf?hbon*T1aBezwIMhy0Ej$Cl6>C;zM( z=M?iC7k!@^R~N|~*Uz&axa$U9aKBvhz?0Ybg6HPA2VQSQFL=+XPVl*A6yRGEo8Y%i zB)~t$J|ST0w}3z!#e|^J8v(&G%n2c(y8=RfKTQZTof8oDl<`4?+>Q$oM;w4M@`MNJvh%4@lw7N=S8A3`l+J zlaQ{?9FTriFCmldX+Y*$frPAQ#{;sb={(3e|M)^~8Q+7v^+zw{hkkfa(7*gbq3NXu zMfsfd zKtNrbbwd60PXUa~OjsZbD;7a)3J06m|Nnk1{HrG8dL;=XizZ-rXQ4o^@EB-5Fb<|f@n~&2%VEWrJuzNtoDu@p%T0u0Zcm>g*A{Io0idhg1Dr!MAsJI2upduGUgNj`c4Jvv; zG^qFm(V!w2M1zW95DhAdK{Tj12GO7*8BG81dH|w9MKg#770)30?+Jde`~HE7X^;S@ zs0O8{=^q||C{U3NqCv$rhz1qiAR1JBgJ@6@4x&NDIEdyHm=*w{xfrG z4XQdoG^qLj(V!{>M1!gk5DltI!1TYZVEaH-3WyJ?RzNhUY5~!p>IFoDsu&Ors%Ahm zsHy?cpy~!hgQ^@54XSoPG^pwU(V*%FM1!gz5Dlt^Ks2Z-0@0xA2tW^os?tDwP_+i4K~)==-W&&(2UT$(KB$@l(V(ghM1!h35DlvGKs2b@1JR(W z4@85iKM)P70zovW8U)dxst`>7ehLnMP?ZScgQ`Uk4XPT!^pVG4`$1JCh!3hJK{TkU z1ks@C5=4WlOb`vKHbFF~>IBiC>JvnRs!$LOszyOHs44}~pz0JvgQ`?8{niKU9#GW^ z;)AMJ5Dltg!Sq@Iuso=$1@S@EErOWf&}^Uwp85_K(5x_o)w7Us)Qgw;lRmv;I$m?e4x0cK!Dn>}MBz zaL7N<;Mmez;N-uk!8s+rz(v2M!POPnx!Cl3;!2L%vgC~n2Cv883%qx@ zGx(ep{@^=9lfiGz*AM;`+zbId*FOX%sy77X?EDby$k`C$Gy6lR!s~`Go!SrK3}+i6 zL}wL5JXqfl`L(7X>cGT?=&NxBF)P_g@yv4*U>D?Vgz{Lzqe>}Wym#9Iw{%a#}9 z7w%~&XzMH}jJnBCl$KpkY_*%A#Lc&$RBA3mnSSPnvS0NK75v^GDsCk*RKC~!P_@gM zq53@khnmIl4Ylh&eyD49Y^d+M{DFayi6-#>|Ak)|82|^b4jR ztOsR322eT%@j+=BM1#^Zhz6x;5DiM#AR3gmK{P0RgJ@712hpH(4x&M69YllDJBS9Q zc@Pas_aGXS_CYi#{e$UGCSdzP`2fTR1G$`MIXi(k((V+YTrhnCgC~!UkF+h0e8ZVmEzIny}+YT!~@^4u6DAHo}C1-;* zhkJIc-CVX|_m{0Z_UzxfVeggcJNC_=zG45C${h#lD>odR620S4eDsFHwG|de>}@w3 zjg7K6CNIC?xI~b}2@V^Bld^IaCtt`Joa&x$aaQh_!P%*48gIB;H@x{|s`1vO(@G5(ZUiZ?gm-OVIcBwheVX(J_WQSHa2%Vj!5QUe zz44V>?F-&>;vIZe@Luq(adhx&e}BP0M%f{t zkS8F}hSeb`;9Wql^mB(0g9`y6zfU^U|NsA=fsu)Y87pLCWn*P$Wrva+5DrLy7|i^RepF6?8^Z)}#aT?1od0}#oeYhVOs88PS@7#bUZQV9koC1w49>i+-#|9?;l1JR&V z2BJYJ4Mc-d8;Ay_I1mj=bs!p)@<22w^?_(m3Ix%hR0yI$DG@}2QX_~4rAQDBN|hiQ zlrljyD0PBpPznXnpi~N?K`9kPgHkJq2BlaKeS*Wr07QdQE|`8H2j+uPFo+LI#bA1B zng)mlrDibw$rQ{7rD_l#l(IoID0PGBU(yO78kEXGG&rS$!UvSvLG+Cv1rP;F^D$F%eV`lx;)8Mphz8{h5Dm&5AR3fIKr|?qfay-% z4ImnnTR=1@$AD;1t^v`YoCBgkxd%jpauAq)ZUeRtl#@VwP;LUzpd1CJH$dDC%2^;j zD0hKqP!0pppj-x`K{*XXy9m!Y0HQ%T4orWp1M@*S55x!MJ`fGcfgl=`3qdp}CxU2D zZUoVw90{U9xe`Q!awdod!CrF$i8t}!my;;xghHAb{xn>t^@cI)p2JJ>!X>{J#0u=ClagxxG( zKkPpL?!lfX*FWrCf8oKtBRfCr@89&`z>?V?4(3mJaHysB!(soj2S-xkKOEJMcyP?O zrr>hud9duk*+i4!b% zs>zk`%w6}xb0M_{FVy)zycGNN;1%1)53jymdGPw#l>|I7bBV3_{z17rKc2TbJ;J}?*jOJGU(TfiFdAc4){egV6| zp#%*LoSdK(`sjml*7^r3rbj-gdQE(wCc5l{x>oT6^?!#8G`T__Xx>{| zp!Lf9f%d-k0-eht3A*z#3-mUdCFs|A7Z^;INH9!K|6o+~E5X>^^Mgsyodi>L?GI)~ z`x4CAc|TZ4-+Ey2?EMGJ-+LZd9lQ9!`u4mBHtXLN*zRt4VAp@4zB6I?&9_~5P^|G@on*9T8t#|NI9b3S;zRes<-r?bH4nnQwb zO?H9bHl+mr7~g_`X)FnWHu?oYrOy(AWdsXCLQf=w{Qg`JX1XdN>?!|;2)SbqB946g z5czM#gQz8!KSbZ_dJxmH^+W8woCk3!(?7(|^LvosyQLtpJv$*ucUnPmx^F@XZ$&|> zyM99I+o*zcb-{%6vo-~pY@ZV{*UA-SJ-eEaJ2md??DF{-9X&(1#NL$_FL??iZ9;uK51172 z@eN^cbqQf`4Gv*&4G&>(4F~}hWekiUl97l)?-i`j`vKCy0J7=-|DtylZ~p)P{~uHc zf@n}d2%8Tj(jXdCP=jbtVGW`|1vZEV71|&gRB(f6P~i=x6Mlou0~O*R zKByoE(V)T{M1u-+5DhBSK{Tjf2hpIy9Yli)crg8Mc>##NBU}RZAE>Yg@j(SXhz1q< zAR1KggJ@9U528U80Eh-v0w5Yx5rAk=WdNc<6#|F`RSF;)R55^PP~`xkK@|ju22~PZ z`r8$-e?XN5h!3hTKs2b*0MVd|14M%=4-gHiKtMF85&_YmiUdT1DiaV5s!%{Qs8RvZ zpo#@VgDMvg4XR*3G^mmR(V&V3O#g`Z0HS}tum-yaROx{De^1DQ`Tszb4@dx10fF+v z^nV{f6sRHs(V)r*M1v|M5Dlu7Ks2ag0@0w#2}H9S97+Juph^lva|$d0^SKxn7l8Pn z3JXMoDlHHVs<=QjsPY2Qpb88`gDNo)4XVgMG^jEI(Vz+qM1v|d5Dlu>Ks2aw1JR%g z4n%`0IS>u1=s+~6vIEhe3J*+w;sUz|RPllMpvn(KgDOA}4XOk|G^ip3(V)r@M1v|s z5DlsnK{Tjh1ks?%5k!M3NDvLGBtbN&q6E|b4ukCjRhS??sL}+{po$YjgDOuD4XQvv zG^i2<(V&VHM1v|*5DltOK{TjR1<|026-0w7R}c-VU_msfk_FMAiWWqJDq9c@s&K*d zv-jZm1y#HtKB)2q(Vz+#M1v|}5Dlt`K{Ti`2GO7j8AO9BWe^Rjm_anCat6_$3K~R% zDrpc6s;I&A=M`Z4KovHK53005G^pYR)0=a^@}LSF#0OR4AR1JWgJ@7?4x&L7I*0~U z>L40av4dz(KXix(IM1vX$AR5$A0MVev0*D4R7{K(~ zD6o4#4F?b()OY~Vpauk(UMmNd2Q?%>d{AQoM1vX>AR5%D0MVd^1&9VUEfdQgH zjSLVCYG{CHP-6o`gBl!Q`rm!9`Jjdeh!1LffM`$y1WfOP(IYM6j%P~!wdgBmCdq_rYOXbXkQH8{l7)g?s7*I3U;&p^l5&`{4%&wvX66J?UO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat b/absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Nassau b/absl/time/internal/cctz/testdata/zoneinfo/America/Nassau new file mode 100644 index 0000000000000000000000000000000000000000..e5d0289b511f89e273438cc487b0dafad48093ee GIT binary patch literal 2284 zcmWHE%1kq2zyQn)3=AL)l9&c%^E5CpFibXg>iX(mQSi+^I^ny1RKX98@&`ZpZ3=#I zL_YZSBjUsF7uFB{+_3ua_k`?&e>-G8{9pe60mJlv9~j#oK42<;@PWDDUjj?Q-vZWv z2MKHr_Y2q!4kd6X94z1zSdzfSu(*KhLt6s(gVq9`n~NUs9!M|X+u8Dfe`WIrfthI! z1Upkd2vvGK5YBY}AQGwdK-5$7gP0}H194664-!h636dOdKS(igCrEwbDv*BoHbLg% zn*!N`=M&^Mo-2@FxG_PYjNyY~e$5(*0<+9uv!1Ez;<`T1H1kU1@^O( z9ysK0DsXJ6PjK>|QsA7DnBbycR^aO5oZ$L-#RqrY_y_KnyFPgGIzI5+ob$o!t?~o! zIh_SQ*BlajYqAUcwkaj}$M_ZmOk+t1w9zjJDt(p^EF)MD5_%#bnf@Vup5KE6-z^1+?b!)Qy3-1h z(|r?Ccq)F+W>}ggXa?XEzkXt76A#eTV z2l=7@J{0tCeNbrn;6qXV^asVFhdz|}S3W5DcfX*_Vp>Aky@Lf65)}y*`xX~e{)kGb zn%7!TeZwZ9rY^mpc86R-U7Tk@{S1Z#1}4Tq2><`zUdF)i|Nrp=j4c2E@7%z^;o}>^ z;OY{>;2InP$`=d_45Z|qA5cC2|Ns9F%0(a=l#@U-C^vy

ur8pj-u_K{*RVgK`&` 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon b/absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon new file mode 100644 index 0000000000000000000000000000000000000000..f8a0292b25999d4726ceed52d1b55a4713700045 GIT binary patch literal 2131 zcmWHE%1kq2zyPca3=AL)l4ysrMH(0w80PJmTrhvv>x2_OJOfU5d?>i2{H5Sh!tVzh z3I_`~1(qamF)S|N`p}lZ{h+mg=jNgZya&k54}>$_ zKZrzXJrMQO{2*q@^FUma`-6m%W`ZQg+YeGq+zC>jxC*2nzDsDfH0?<*fA&R7{V2Q1zPlKuvVn2X(FD2kQS07ie;YKG3|kv_R{X z`2+2J?FBlQLlSi7WftgdHcQa2^DZ!$ERkTCp8mn8=vRWVyXOa!pgRes>e?U7jP@m% zv-5tikiPZ6;@SHTmcRErusU|}gZ1rs4{X-IE3n<&@W8JBLV^A4qz4Z9n+hCT>Jyy& zrxZA+Bqq4%mle3WI48J%Uh%JcFAk1`CLfBLO4-s<59z-1Z_#yJ& ziU(0kE`Nx=*YzN#W$TC7eK`-}Ql@{1pXc`=!FNkRVtaN%lJ2yEFR1S;UGTA;SWUiGf$a;1)A$ywDhn({tALN$Fe8^jW`9Xf@zYhidTOSmf zKKM|SKm9?m=%EiK{*@0({@pJqvzV4pcJE+8g+xU{#lFP_l|P~qs^+y8RNt^ksHsaY zsNEr#P#5P}P(Onqfr*ick(mWV4k-Trf2{)p!~g%s4=}R)|G#qs0|%JR111H0d_x#q zT|yXKgF_fx!$TNc142LvoPiNUG7^y$I$&Ah2S^74$fp1Qi{3Rl{Qv*|KPYQ}Xi)Y5 z(V#2>qCwdNM1!&lm`?cp0Hht1Wk572+kj|L)&bKW+7duCC<}pTP&NY5psWOmJ zgR&He24yP{4a!;|8kD_2G$@OKXizo-(V(mbqCwdWM1!&%hz4al5Dm(DAR3hY!1O1s z0uT+#h9DZ06+tv8JA!CXmITqDYzd-4SrbHqvL}cJWl<0f%BCP1lvP1AD7%7aP?iPJ zpll1K{~ZR~2g<%6J}3)=Xizo=(V(mhqCwdiM1!(4hz4bA5Dm)OAR3gtK{P0fgJ@7T z2hpIc4x&NX9Ylk&JctHmdk_uE`XCyV{lWCJ_a8tss2BjzprQaogNg$X4Jr~qG^khr z(V(IMM1zV45Dh9KKs2bB0MVeL0z`v~3lI$|GC(w_*Z|X?SAgvU6(1lzs0abkpkf3} zZ_WYBgNhRnA5^4(Xi%{NqCrIqhz1oeAR1J}fM`%L1EN7i4TuI6Hy|2R+=m ze+Gv?sQ3Z#K}8UV1{FhK`p8GH{h;Cq#0M2gAR1IGfoM?C1foI36Nm;CQ6L&rOo3=n zQ3aww#TAGK6e{qH{5d{8k6;)9Ap z5Dh90!SuexV0lon2;zf^Mi31u9zisyhy>A~ViH7yib@a-DlQp7rQ{GVFS%TULrh&= VLUeqM^^EikbbJjB^$hh4xBy{_T@e5P literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Nome b/absl/time/internal/cctz/testdata/zoneinfo/America/Nome new file mode 100644 index 0000000000000000000000000000000000000000..c886c9bc0f46a6677e9824fb188761b6dbc418ff GIT binary patch literal 2376 zcmWHE%1kq2zyO>K3=AL)l9&Kxt2Hn%Fr4mmxo}DOOTneY0Eb_fLO1-|Q5f)lMTi5# zjNkyq4l@U)3ey1Q!k_~ziGdeb15FOFIT~MJHxxU--kW=YQ{cw|&b2QCxIWxE!2RIn z1)iJV9e5AyzQDKhrUU=V8vz0{cRL7n?g|j9oa-Q*IVV6Qvfe?|vo1i)GSNX?Ga*1i zsrG;*r&E9wQ~UubZ4m*fPfi=8AE_>oxumi|_7M95xlL>vX zfpXRh1r^i32C81C6x2lT8>nloQBeQ)dxIudpMvJSyBoA#6)0%$+rL5Qa?b+Yc?&n_ zZO&VuU)Q|BU~<3$!}J9PM#V-8jNO|IOoBxgn5w53m>GRrV9xGlU?C%{VDVhT!1DK3 z1*_v+2G+N)E7)vM+hDtUr-I!Cjt%y+XDc}5zuMr~vVDP*|CtTWDKi(i=&#%0>QcSH z_47jmcikBZ?w1c6c=A>$cy3;5;Po~}!F$fZ4L;W@7WmdI-r%<_YJq=D>xO`7HVXo6 z(l-Q^$t?($@!Sv+#;_pdkM@Qz(?<)!o_ZKW$o*G{II3k3`R}1Z)KVUU=zE71Vp`rA z#O_pv-b3scXw=C2kZv&4)ewevILH|32LNiH&qWlXA#iG9rO8hq| zl>8UpP-by%LD{{Z8!99=EU4Ibdqd@qNeimx?cGp)qhvu%-TV!;JHi&!#WilIpJB0p zk%^g+g%uxU<6x&F{Qp1Y9RtJv|EU2CEdT!(Copn=Ngl9>0GKWE|9@ivgT(*;{SAyV zV78)K$E z0Ky=Jlb~$1A0QqB$Zh}s+aLOS@&Et-|7+X*FM()K4g}Gcl)n^!>BImB5Dm(WAR3$_ zK@3o?1er4U}awmueu!Bpj->4dvh;(6P5FeD2K{O~ggJ@8W2GO8g4WdCg8$^S0H;4x1a1ag3i_bR0@D;Z4m)5{mE$qhz6AiAR1IEfM`(30HQ&q1BeEd5Fi>< zN`PokNdclkr3Huvl^7rzRBC`|P{{$JL8S+X29+RS`rmJ`eV~#A#0QloAR1JnfM`&u z0-`}B3y21lE+86I!hmQ{DFdQGB@KuMl{O$6RN{bWP^kl=K_w4}29-V_8dL&-XizBx zqCq7Qn0~Hd0HQ%95{L$sN+8<$_H_ji4Jw^LG^m6E(V$WaM1x8y5DhA=Ks2bt0@0vS z3q*rTE)WeWy+Aam1OwBbAA;=zm1H13s5Ar7pb`yCZ(a(P2bF9fKB#m9(V!9zM1x8> z5DhBnKs2bd1JR%o4@84XJrE5l`9L(N^aIhL5)e%P(FTV;)6;@5Dh9JK{Tk81ks?95=4VaOArkzF+nt_)CAF>k`qLON>30CDnUUss1ya! zppq0!znuhj52!>1@j<03hz6CcV0vvBSRPcug7~0P7DR(eS`ZB?Z9z1s#0AlyQWr#n zN?s5RDt$pTs00Slpi&q_gGypB{a+kxKBz8V3 z)F2vET7&4?9bpSVG^o@D(V&u>fsu)sg^867A7tm`pd(~p*p>$>A8A^GGeAmiP$)oH dT#nwsA(o(0UdPv1&q&We$JfwM&rr{R3jhZfb?X2C literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha b/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha new file mode 100644 index 0000000000000000000000000000000000000000..6d91f91452d0c8474f917c41add3395838504ac6 GIT binary patch literal 742 zcmWHE%1kq2zyQn)3=AL)lF)>*c^ViP7^baCP1(V3ePPF6qX|1dswwQcmnLw_Vu8Y~ z*KZW=NM2rWXQ#Ko-QVmA_hw%ZxPP}t;X#P1z?bPC7kp(65cqZ=OyN79z=R)xatc3= zZx{H*b!5S>6|W}ze*Ht?Pj~(V*^>4 zG$_D8^sakp0w5X`aA5lN8wC&z3P3Qu(;F-g3P=zi6qq0y6rdm)6sRB?6tEx~6u2N7 z6u=-F6v!YN6wqM$_;#>)pa2K)L4gjUK>-hL)G$>-g^rIvJ5DkhTFnwhwm=B655FZp-AQ}{5VEQHF1P~31I1mkrJP=Lw2;{QS KH88R>;sO9ib|13< literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah new file mode 100644 index 0000000000000000000000000000000000000000..8174c8828851a7ac72aa65cbd5135664152e3182 GIT binary patch literal 2389 zcmWHE%1kq2zyRzF3=AL)l9&c%%QP@BFw9$KHDUg4_J##*G7}cgdf9NglV`#uuy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_ z!OkWDp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!> zAbaq2gWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41EYl7|WxeRvwZzkB!u4iz_ zKR3a#Wp;y;|Aq<9DYXqQ`jaNOy2LlQem*MTu3N+4etEfoCvO~s=jKiUueS~i-gA~t z@VOS#;9FDK;J3}7z&|FsAz+$NL7hLF%}1tEVJ8^TO?6ofsMV~CKu z@*(0V14HD$Z6BhRJYtBxH{(N0%MpgyeN`XgQkF5q&x`qx;CrYcvAwb&Nq0#@a(Z+@ z3U6COs=IAL>f4NlbanZH^s`4##`iwq_H?H@}1y=^G7SW-}S?|egrL|Z|{zKso)KQaoc=1p#> zzTs6+Q&-whyF;g-E-t*GegfM_vGO%Mex5kL%3sQ{uuB?E{Cl@4I~lN#84pi%fpO1p=1C?$dKB$BP(V$WeOmFT4%Y#Zg z5Fb?HfoM>v2cmszDjPsFsPqHTpb`*7gGxaV4JrviG^jKL(V!9$M1x92F#U%StRGZ5 zg7}~k5=4VaNicmBL_$hS5DQddf@n~w38FzICx`}>o*)`jf`VvJDGH)NB`Jsom8KvX zRHA}tP^k){K_x4Q29>U0`fUc-J)lw+#0QnMAR1KKg6Xw7V0lof3*v)HUJwl`eL*y+ z1P0NdQW!*oN@5TVDvd!js6+N^uYkD#<}Ks5EB)m*XR%IOlQ>4l#3f3DNO2)-%#G O(D5}i)HBpG-~s^2MskM$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center new file mode 100644 index 0000000000000000000000000000000000000000..8035b24fafeff6fad833094f814905213b2f3a0b GIT binary patch literal 2389 zcmWHE%1kq2zyRzF3=AL)l9&c%%QP@BFw9$KHDUg4_J##*G7}cgdf9NglV`#uuy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_ z!OkWDp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!> zAbaq2gWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41JFmP!Z?j8*eqCgP!DO`p!}Kx+qhgK%WA_LKlb}}x zrs`G5!SeU14_3z>Fj(JS^TB5Qp9b6AeIM-l?={%ZF8JV( zf1ts!rMJMze^G;TN`8TheoKR^OJITP=j{ycy15_RFVAG~#gAj?>W;O ze6INw_|{Z5_-!*N@Q;aZ2$&{R5NKoD5LEi5AXrAeAtdx#LC7D*hA`6|1z}I+7$W4Z ze26&8z!3Rw+lQznj~Jrw&G-=0a)cpvU)6`Wlw}O@^I|?E_#SFVY_BXx(p}P!oE}|} z!rRu6>TX+*`Zl8>U0uE){j66*COcz6=31SGtY?o4vZr}6>Fff8i z5Jg08n-0ruKOnjo{{R2~KaPcG1BeFYJ`fGcfgl=`3qdp}CxU2DZUoVw90{fqCBXVY zITOSOM6A%q5Q9v}PQ~}ff?t|?E zl`bGYsDuI0pi%}zgGw3@4JvIwG^oS@(V$WXM1x8m5DhAQKs2ZX0@0vS2t}qeN;nV=D&@fR=4ucHF6}@J zP>BbkL8Tsu_N}RG0MVe*4@84XKoAWo1wk~ZBm~i*(hx+0N<A4af#Q0WNb zgGxvc4JswU^idEADJ?-PP>BhmL8T^$29=y38dQ3MXiy0XqCur7hz6CUAR1Jff@n~Q z3Zg-!Du@P^tRNaxx`OGq8DRH-N?8yeRMLWIP-zRM*Xn@fL8UH;4=Q;>pkBH)&%Q-m2%-JPG$JbcTNY6mW M*U(VUP|tu10NBZX3jhEB literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem new file mode 100644 index 0000000000000000000000000000000000000000..5b630ee66715d60ee99405709d86e0e6a0c8b29c GIT binary patch literal 2389 zcmWHE%1kq2zyRzF3=AL)l9&c%%QP@BFw9$KHDUg4_J##*G7}cgdf9NglV`#uuy6v;&HW6#2bw4F?Oe#fzjA?qz|3X_ z!OkWDp~_SS;mi~Pkw|w2QBOAkF-uJbaZL>Y2_@GCNlq>SDJJy>sZVMXq#toM$Xw!> zAbaq2gWSef6XX}3ZBQta6;Nzk-=GxwUqCtQ41EYl7|WxeRvwZzkB!u4iz_ zKhWUV(p%uUTuj)fw$})!dc`+Xnd=E7wwpSJ;=`LwVPLD1~ z;caV3b+;`@eVfsct}b7Ye%7lYlbx|3bFEH8*0aY2+0#53a?bz%kXxqBkhlKfhx{;J zhJyaX9|}$1GZf`7{ZK4=k)g!D{X@yWw+&?$OA5;Foo}d+Xe+4Lx3Qt}M@B)_yvYsK zH@pgJ>Pj1Gcjy$<#f3N2&)_RyVq{`uVrBtTAST6_jg<=U|NjMV85sWmU%h~l<^TV= z6BszaY#uNv@c;kL4U8fnHiLwZZwQ00O9+E+a0r8McnE`UKnR1gO9+E=a0n>>Fff8i z5Jg08n-0ruKOnjo{{R2~KaPcG1BeFYJ`fGcfgl=`3qdp}CxU2DZUoVw90{fqCBXVY zITOSOM6A%q5Q9v}PQ~}ff?t|?E zl`bGYsDuI0pi%}zgGw3@4JvIwG^oS@(V$WXM1x8m5DhAQKs2ZX0@0vS2tC-Xi#YdqCq7Vhz6BfAR1J1foM?a z1)@PE7>EXyVjvn+l7VPYX$GP}B^rnZm1BelL8T&?{=*2?4=No& zd{7AqqCur3m_7<3A*CgV1u8K?G^o@B(V&tOM1x9C5Dh9pK{Tio1<|0A6hwncQxFX* zQ9(4QR0YwXk`+XQN>?!bHUsP)P$>)IgGyQu4JvKH^jaOTJgC$K@j)dohz6CuAR1Hx zgJ@7G45C3LF^C40#vmG0B73ti) z@}N>1#0Qn!AR1J9gJ@6*4x&M&IEV(7{@JuO@y z=K>!?ZkeS(-ue#=`C-xm1^t&83QhkC6yFghP~tz0q2%B131t?W8p`h7olqe$ zrJ-Wq{t1;o${MQXEu2t&Bch?Eu6aW34y%T`xYP;tGh`YV7@0tjnTeT+g^{}O|NnV1 z3=IGO&z-=)^8f$p1q>Yj|L@$u$OB?C3P8ktd_x#~gF_gcLD(gP!Pg}Oloa5Ylw|V* zs_Xy%|NlYB2SkIC5QqjPBM=QrN+24PoWS(owhtg}pkxK2K}iclgOV4B1|=~N4N7Jp z8kE#PG$^@&Xi$;^)6aPXKr|@nfoM?j1JR%)2%C07s)O0r=3$3(FGpri}pgOV?Z1|?w-4NAr!8kCel zG$=WPXi$;{(V%1vqCrU;M1ztyhz2Eb5DiM^AR3g^!So;g2_PDjT5FeC%Kr|=|f$6nYV0lnh0`WoF2}Fak6o>|8D-aFJS|A#fy+AZ5 zi-BlRHUrV1tOlY%*$qU4vK*NH_Zw_JDC>dvpzH^tL0J$?@7oWS2W3SNACw(IG$>1g tXi&BU(V(meqCwdcL=S;1%H(fq}!v zH-y32H-y18I0U4Jfq{VtlR-9sFwYODp8x;<|Ich!69Ca5n;3|*ipw=P#FPsF=|C+j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung b/absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung new file mode 100644 index 0000000000000000000000000000000000000000..df78b62682a5b376f6d7ca894c842f6b3d57f363 GIT binary patch literal 2108 zcmWHE%1kq2zyLf93=AL)lBkBVH5(Wh7#3d*YB=5TDB+Uwmx4?nxYQCT*I^%)5R_X=ye_InYx!f;k-kYAF z^-A-C_P)vloy%?ky7QtF^fqe*=-1gM7)+K(FicPXU{v%g!PwpNgGtbx1XFeG4`xRD z63p3oKUhfLdSLPFAA{xZQy;93UHo8ud)@<^_3sL7cQ-t+>%UN7KRfAxL;j`$$Cmm8 zC;ur0&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@S>SWcA;GsM zyTEUoQi6YsZ$ZE`mV`hX{eqyYFf(0R=ClW$_e=Z0!U6l~_l>bA7+_47{M?QXt z{I}vk)RM~|qVIJ*h-umSA$DKRgSeFGAL8fvJxK7~Qjpl5osgtEtsptwHz9?$q9D~> zKOyyPR6)ABU_$y?n}STX&k31p*ANub@LI2hV zg{BWa6y;BUP%L`rLy3RogOY#u3(72}C6wJeSWqERkx;R3aY5yesD!F{tp(LLY!Yhf z(hF*L$R*Upc^1^qU`SwKW@KV!VP?e(+1R0wgA>N00u4%Y3=IGOU%kM{0wy{B|37|! zf#?7K#}601foM=Z0@0wn1foIt2}FbP6o>}pD=_`>PXdSr z#Nc^O25@-v7AQ27MngUTon4JxO=^jbNvJgB?^@j+!4hz6Bg zAR1J5foM?q1)@P^7>EXyV;~w-mVszcc?P0EWg3VEm1|)7-+i$8pz;mG2bFOk8dT1K z>3xgA@}Tk##0QmmAR1KefoM?K2ckjcABYB(fgpOc90Y{|0|S?9aEPg^ONfrIv7V8h OfsU`Cp`M|h0T%$ApJa0Y literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo b/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo new file mode 100644 index 0000000000000000000000000000000000000000..1b608b3e57479c8ba49789483e4f19e037058d9a GIT binary patch literal 296 zcmWHE%1kq2zyPca3=AL)l3;_fg&G(b7$&mz?bxT~edJP-&KBu?hCAy2|Nqax$i&RT z^8f!C4+e(+|IgSkfY?4D^4tjqj{pC!USQz!@eN@J@C{+mH83_d0FfY*p_mjm{DA8D j|NsAgkXt}B$UPt$^{*jb+yCB8*-a+c)y8!8j7ae3SUI>sq zxYa#hPtba0{y=+QWrEJ-kObX%(FuB+%@XwMY!eJ7OC%VkM?Nqr`juepZvDU{=uU!@ ze?@?EimQW*epG;~i@Jk zP-yz#Ls99(6C<%gSP%;G3pri<*LCFzB zgOVhO1|>@n4N96I8k9UiG$@IJXizc*(V(OXqCv?OM1ztnhz2EF5DiMYAR3f>K{O}{ zgJ@7P2GO9T45oj7E&$P>Bn_fL$r?n1k~WA2C2tT7O5z|Il*~aiD5-;JP;v*+pd=5X zLCGFOgOWao1|@$G4ax!_8k7w{G$<>8>9l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre b/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre new file mode 100644 index 0000000000000000000000000000000000000000..b612ac23562126db6b0aa3ce26dea6760c15be24 GIT binary patch literal 662 zcmWHE%1kq2zyPca3=AL)l2C-Qc^ViP7^baio3MjFjbX>%m;*aM1_bQ7H^JeS#i@W> zZ^Q!bNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg& zKXmxT_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU10D(W0YUXF z2kQU-|Ifh0hzBw=G5!C4pn!ql|Nr9$7+L=R-?@Q-1H@*4vVD9*7<3Ix7<3IxL0*Gm zQUc)zRL}qa|Nnym14M%Y1Wf;pIRK(T0Ry5zfdisJ0R*Pshy{RXP(Xp{ouv*S8Wdn4 z8Wd4Ks3!Fg3CtNz|_u^3jmP>7=-`; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho b/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho new file mode 100644 index 0000000000000000000000000000000000000000..2423fc19a8a0c15451876f0f8f7c469112c2d078 GIT binary patch literal 602 zcmWHE%1kq2zyQn)3=AL)l8}e8c^ViP7^baida;8){KJmFej9dvbaL2rugTz+#U6)S zZ#W$8NWMRCXJ@*>-QUU%_h!E_xPNzr!-EhRt`Uo zUpDx~_29s-m24Y+zY%fx)7`y6_T(G~xr(P7IFuY|NoC4VBqla4PnqVFlNv-Faddjfq{V(ul|7Q`Tzg_e~_0! zG|1av`mf&x5DoG^hz11#hz11%n0~|I0HQ&`0j77R8-Qp~uz+Y#(12)A@PKGg5P@h= zFo9@LP=RPraDix0kb!7Wuz~60m%-+Nf)B(81tEwA1tW+C1trM&px^}2pdba&pkM{j bpr8fOpx_13pdbd(R0?J;8(jkvI}lEYQHfz;ODT(Sb|KUkWZIyuHB4%*6Qr{~>k;hX4PM zA7Ehl|NrU*Mh-B^*bS3R4$ e^Z)<<|3UVHXpkGgbi&&U4CFY3%P}~_gbM&iPD_#i literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas b/absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas new file mode 100644 index 0000000000000000000000000000000000000000..4d84eed4e235bdcfb3ed8ea457e1bef3717db3bd GIT binary patch literal 1911 zcmWHE%1kq2zyKT!3=AL)k|>3;MH(0w82Sy|-Dbx;4VYi^=-5Jr!UG%P%8zXI&iOeXTY=fx&v>=1p~ghJ018lHW>)CT|FS^F~vYAZTkUXjWPof zx0we-1t)C~Q>#88_OWDx1Y7I@iHl(yB%j$IklJXmLHc}*gUm#!4YKR)9OMfAY>@9) za8RgcHc-rGa!|7TZJ_M;#6d;!u7Ror!vWQw`wi4S{Wze0bD@F8_ag^15AEHcb$!_Z z?M3r9=xpyepxe~AL2r820sW-p4F(PE4u(#y8;lY%9gJ&26w?J4({)n3_L!TIe6~LH}JX`;o!Z4VS~>`D+k|W>;`@T zO$YqvtlJRabn`%9&4dj>+TR?4V~RF}aNlqUH-BajzW&XD2XJlezW@KT4 zL1rdqCT3PPnnHH=|Nr;4Ffjc8zjqe{%m4p7H!yJg|9|`d0}qH~IFst5E~?N z^#X%{k8cP=ux|*1u7N3ou7L@Iu7NQqVKOimPyz?hphOO$K?xm1gAzN41|@h94NCMN8kF!sG$`?dXix?K(V$EKrk~6X z0MVe#0HQ$|0z`u{1(?oxegQ;-G6$G0o8$nZL74{O_ZQvS0HQ#d21J80 z4u}S29uN)6Kp+~Fi9j?cBY|j8W&+dq--GpoG8Kpq%2*&8l(|4OD1(7$P$mP>po|8h zL75FigEAb524y-B4a#^R8kG4!G$;dtXiz2u(V&b7qCuGvOn)o^+Yic=AU-H#f@o0Y z1ks=j3Zg-o6hwnEDu@PURuB!!upkj2Nf_N z8dS)DXiz}|qCtfXhz1onAR1KYfM`&`1EN8N4~Pa8Kp+}a2!Uu&K?I^fg%OAb6-Xc& lR49RHP{9PI*S|RcqCo`|hz1o>48x|B;NFV?J literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River b/absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River new file mode 100644 index 0000000000000000000000000000000000000000..70dcd2d8014a3dccb9c3cdcd83158af262afe6a2 GIT binary patch literal 2131 zcmWHE%1kq2zyPca3=AL)l4ysrMH(0w80PI**f4+B&w>*_!V^w+{A;+R{H5ShBIgGV zh4T%Z0-FlB7&bO=eV9_f{a|tf&&>@Vcn_2|@a>%Rfq&&B27#F+9|Su~7=$XrJ_u)q zF^EK3d=T}tU=XvE`XH_;#UP<%ULeWwhe3)-vOwySM1%Ch-vu%ke>KP+yjvi*@lJ#M z!uROE-)c;*<(Bw+~pm}d|gVrn8 z58C^tHt1YVD$t!*-k`VHr9i(fvcX`oT7hAD8G}(VM}e_>1cOP?s{&JXD+V*8GX>`C zG7J{dFFsg2`^RAU`_u=kV-FatZ?E}av;I$m?e4x0cK!Dn>}MBzaL7N<;Mmez;N-uk z!8s+rz(v2M!PO5hW1r*aGta#ub?9A#jL{I~5x z)RIRG(f4M2h-o>(5WBDHLtM%-hWL3g9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv z(U7h#Uyy#*t09w}u^@A;PD9qS#|7EbJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#V z9Xi#61JR%?2ckjQ4n%{p9*72IKQR4C0+iz! zK-mz)2W3SN4a$xn8k8kLG$>nwXi(M!(V*-JqCr^{M1!&^hz4a<5Dm(%AR3fqK{P1a zg6V%3!S;c&FNhDy!XO%yjX^XhD}!iIb_UU)EDfST*&0NHvNnhYWp5A-%Hkjzl+8gj zD64~LP<98=pezrfLD?QegR(w|24#OR{p=rz0v7`y2B;_i(V*f0M1zV15Dh98Ks2am z0MVf00Yrm}2oMb_CO|Z(r~uKR;sQj2iVP49DmK9M=j|X0Tzr5SpdtiBgNhL_y}24h zfr}Fm15~7dXi%{NqCrIqhz1oeAR1J}fM`%L1EN7i4TuI6Hy|2R+?6FoMG$ zRQ!PWpdtuFgNh+AeH27OiX#vUR3w3DP_YD}K}8dY1{F^r8dOAqXizZ)qCrI!hz1o` zAR1I;foM>%1)@Pk7l;NGUts!e2G~8IVhqFw6=fhARGfk7wK`yVP_YK$gNil~4JzJ1 zG^mIJ(V$`uM1zVt5DhBsKs2bx1JR&j4@85CJ`fEm{=oFVw_x)@#UO|eDhfd~s5k`E z`!<5*LB%474=Nf#G^lt4(V!v{M1zV+5Dh9SK{TkiWB`?tL%h7?at;nLb9M>Q@io>n Q(lgNUH8j*S)HC1$0BZ_0k^lez literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet b/absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet new file mode 100644 index 0000000000000000000000000000000000000000..9f50f36ef45a0210a0dbcfda1ff734fab79f8153 GIT binary patch literal 1930 zcmWHE%1kq2zyNFv3=AL)lBj^PMH?6x7@qg!F?`qeN%)~r{y;c0j6o#Q;)AHC1%sHS z)CX}*DFz88^8!hZKMYb#k_A$qBpRe2{w|QY_^Uzo;N1ebjdvR47w#`mDC1{PY+P8N z6#9`tIcx6+71PTMs$TOysEKZ6P}gewp#JY-gC)lE(Q8^kqriu)d~#L%NUG`ISP#3BN$AAUKNjh9A7=OmFbH=2zfbQ`z9R&7i6e0F8Tp2g&}#)De;6CWOm`H7J(XjKkh}6B;wS?{RkcDWK1Wg1bG6shK|BoMFWcmMp^#TUY|NnPxVB`gn41y35T>}FKXBU?c2It@q z24|NL2G`&ah(0JuN<#ht)${-V|No!_4WdDb8bpHbfM`&L0MVdK0ir<}14M%| z2Z#n`5D*Q@Bp@1;Q9v{(vw&z&h5^(6E`sd?WgHM6lzBijCKzvXk0-`|$ z37B511C|FBC?GzlPyx}Pf(1l_3KtL!Dquh~sE`5Cpn?WOg9;lE4JvRzG^o%4(V&6{ zO#gceHXl>~f%u?82t*c^ViP7^baC-?4+=^TCe44hwdEG%?t9uSDUN#X5sq zuYVcbk$kw}&dx}MyT3&Z?#;fZaR2Tsg9jnT3SXxG-|&?+PT|{u6oc=4atnS0>KObu zepKNX*QE`=R{U7-`wg4HpYGZPvM2it#Em110Vg3zQ=SHYh(T zP*64hv_bXCaRu{l$2M5(XjQPh|JcCtCI15J6aP2Z*b`yLDo z|NlRJz{v9d|J4f&96r7w47vtJ47vu!Aa64;Fpv^BKcIU4|Ns9V6i6T%6i{ILufqZm z4GJ(24GJ_64GK6g{rZ;yhz129nBEzw0HQ$w38F!P38Fy(3Zg-Q3Zg*)3!*`R3!*^* z45C4S45C2+4W^GD1)B#7a1b99=pY&t@E{r#_#o$lA^=2#A^}8$A_7E%A_GK&A_PQ( zA_YW)A_h!9Do_B?pa=rfSB``EpojwTL6HTbK@kR~U-B;i(V&O}(V)l!(NvE>E*o6~ IV>@Fm04~=iD*ylh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Regina b/absl/time/internal/cctz/testdata/zoneinfo/America/Regina new file mode 100644 index 0000000000000000000000000000000000000000..5fe8d6b618e34c4c87a7eac43f7a27af41161d02 GIT binary patch literal 994 zcmWHE%1kq2zyNFv3=AL)k}!j^B^nqQ7~1|$mYKI>{e=0u*&DW|`hVDF;PGI)tKo+o z0$LAtstSMD`GM!bZa#y8-RIvu*z-=PVDC=ughNFf9}XwJesCo4)rX@NlM{{^p80TG zas7i6QZEZma-B&y`RjDSsaNX~PIvN5xTO50;8LOl!{y{2fh)oJ3|B)R3tUsU!*Jd7 zsK5<|eGE56mkZo{uz=y#zrz!5A82B@b8qQ{yDR54+}qba;eKaB!-IL56CP$JH9V^G zp77YyrQu1O?u4hBY7Niay#$^MIWxRa*AaN}NtNOCvkwAqu3ct$d+d?`0}~@w$jpLO z7^0Z<|Nps97#RNlU%h~l<^TV=6BszaY#uNv03sPge0)O~d|g5qe1k(6e8WQ+d;>xl zoP$F^p~}DrB}s{aA7DKoTmSzD#l-*r|Nnzx14M&j1Vn>k1w?~l21J8m2SkHn2ttn8u?42jzXS6@u?FIUVh%)uVh==vVh}`wVi81xViH7yViQDzViZJ!ViiP# zVirvQI$Z#wK`{)XL9q;?K`{-c6D1fxG$_VFG$__VG$`glG${5#G$;jtXizEu(V&z7 zrXMT->j$L>5FeB(Kr|?2fM`(a0MVcn0-`~w1Vn>U3Wx@!77z_eF(4Y0YCtq7<$!2V p>H*Q96a=C{sR%@aQWBW{qzbkll%haa}*f6M=+QKy(%zOw_-3eI#XcIF2i6U{o;egvwsYh zzfXOzI`)9U`u3U+HtYX1*zWH8VAp@I!G3nZ2Z#Iv4UR3n1y25p8k|$|3taSD8eClh z3tT^MXK>fe{osCiCW9xh{|C>_)eK&54L^9#ncm=Y&9A_>rn13rn?ZqpOmsuQG@*h( z8{3AU(k}(UGV%=}q1OsR{xCL#neHeEdn(5eA$R3N#8C!@$bZ{DL@jy55PfgPhnSWl z46*yFKE$OgV~C#@^C7|aP(xySWkHhel7{5;=zNI3Mdt8t`&66SL{QnQRW!emR>mPo|594Jh=s*0S(DXe+QU1~o#iAD(O8nbD zl>B?!P-d~DpzPlHh6;(cf{J|`8!CTf6jaTd+)#bPtDvT?w4ru~PC;EiPfw|9?<|2GO8I4WdB_8zc=%+#nj1z(F)9k%MSZ zLI=^H#15iC2_8g)5rfM`&r0MVd~ z0ir>f14M%|2#5w{5)ci_C?Fb?SwJ)>!+`037s2*{G7g9j$~+(%lz~7rC=-EbP(}jL zpv(lKK^Y1}gEAF}24yS|4a!^~8kE66G$@mSXi!E2(V)x*qCpuBM1wLNhz4amF#YTw zhyrIo5CfD6K{O~Mf@n}?1ks=j38F!n5=4VCCWr=QP7n>spdcEQNkKFyqk?EqW(Cop z3=5_|ZwFD}j0<9bGB1b*WneJ9xf(=)Gct$)%FG}dl%YYiZ%rjQ{6HBS#0O<=5Dm)U zAR3g(K{P0%gJ@7@2hpGm52pVxg7t$kK8O#>{2&@s0D$SEAQDm#fLNfy07Qcd1P~1> z6hJhnU;xpe!U05s3J4GlDkMNOsGtDRpuz$~g9;1~4JtH1G^pSJ({D4t?g14bAU>!N z0nwm>1Wd2h0n3956c8U&sDNlt!2+T|g$sxV6)+$gRLFp6P(cHtL4^&71{F9U8dT_j zXi&iervJSKn-400KzvXk1foF&5t!b$5iAcXkU)G;p#-8q1rvw{6;2=;R6v1fP$31P ghkQZB%m;*aM1_bQ7H^JeS#i@W> zZ^Q!bNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg& zKXmxT_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU10D(W0YUXF z2kQU-|Ifh0hzBw=G5!C4pn!ql|Nr9$7+L=R-?@Q-1H@*4vVD9*7<3Ix7<3IxL0*Gm zQUc)zRL}qa|Nnym14M%Y1Wf;pIRK(T0Ry5zfdisJ0R*Pshy{RXP(Xp{ouv*S8Wdn4 z8Wd4Ks3!Fg3CtNz|_u^3jmP>7=-`; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rosario b/absl/time/internal/cctz/testdata/zoneinfo/America/Rosario new file mode 100644 index 0000000000000000000000000000000000000000..8c58f8c23eb0d66d80714a9789b5c20abf043ca2 GIT binary patch literal 1109 zcmWHE%1kq2zyNFv3=AL)lCXoaMH(0w7#26d3FhuRXA9 z>*5W&e{6KvGwr&;-kVPj?5p6~uz$CN!-1&&4F~7WbvR^w*x+#8g#$-qzHK;~z~XT9 zpO(RKNAm;6AFMYx(KyB7l<&d~r{1+4IOqG{;M|6{2QF)xZn)x{a^QVY++ejp>%nCM?U~^U=HHHO zu-LD)!M&VwgZrI&1&?2gHhAtyRH*;||34!WGm(&$1p=8sG&7jZ`v3po3k(cklI8#Z z;|CZx{{O#vfsyC`|Hls)1wd>D9v|Nj24~+823-Ra23-SV23-TxI3XgI>|wF=0~BWr zARGVxFPgJ8VpHi!nrIEV(tI*10vJedBc1-1{A0ziCFDge=-lmMbZ zsR2yCYdZj(}yCJUq=iBFKZ zB(^~I;Lizi8-Fa2UwC_hLYcOLV&mQkN@2VT%2~GrR7~G1sCw-YP!qkVpsqDfK>gp_ z1)5w90-E>EFVK3GB%r--;{u(_brW>wO8NEwG>6 zE8viSXMtnO$_Y;X`xZE-bWd>6U$DT{C3k`wf71eY75@qDKjtfVvKUVAywRxO^+b4r z_ngfOe6D3p@U5A;z;Bz+1pk=w1p(9aCIs3)AB$ecHeY?xRgT*@$)JL5`6D1NNk@vAxZbZ zg5>n_2`Rjb7NojIPDp**vLIdEdP4fyv;~>$vJ*1bdMwC#_J2b5v{Z$h3o-(^W$p@j z>;DPlhiNJl^gj?NG~-q%%0DDfEc#ZV#D9rE$$!oTWflh}l-+y1ph9BNgo=G<7gYXe znNT%v{etQnX%lMdCN8Mm;W42uu6RNH46O+aj7*G7%uFn-Ow5A_{{KJ8hk@b$|G5(w zSpNU-Z(!g6u^D;5qyU%{@$n5|@C^=O2moQ15Qc#85Qcz&5KyjRU|p(Op=YeQY?gP=F90;O8xe!dx+*JUgLAen`gK{K@ z2IWc+4a%7y8k9RhG$@CHXizQ%(V(0PqCvS8On)*K0MVda3#KoLg887_3*v)vFo*`_ zVh|0=$sq55ax;hqhw=7a4Am1rP7s8j>dppp$lgGx6L4JzS4G^msV(V&tJ zM1x8@5DhBvKs2b-1JR(84@84XKM)Nn0m1YiS#bD+NBepkII1E11cFo zd{F5KqCq7jhz6CCAR1Isf@n}_38FzICWr==njjifa)M}3=?S7iB`Amnm7*XTRFZ<} zw=H1zfJ#&lA5^M>Xi&)trq_Cad$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gGWN4L;e5% z{~4GV@jzzg|NqbIU|{(F|LO%smjC~cA7J1Bu^Cu=d_x#?4U8Fd4NO4(0b^49{R6B6 zWb*(2ApigW|NlQI48ZhXzYQQ76c!*F6doWN6eeK$4Tl4W289in-kELyqCsHqCw#XqCsH?qCw#YqCsH@rjK6+n+FO@5FZqtAQ}{=AQ}{|Am@X^ p7DR)>7es@?7(|1@8AOA^8bpJ_8$^S`97Iz)+_`LY4UFxKxd1|y3Q+(6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Santiago b/absl/time/internal/cctz/testdata/zoneinfo/America/Santiago new file mode 100644 index 0000000000000000000000000000000000000000..ab766a41bc06db2956154da6e2fb0dfc3e9c1b2a GIT binary patch literal 2538 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock b/absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmWHE%1kq2zyPca3=AL)l9&f&i!?AWFw9$KHDUg4_J##*G7}cgdfBij_1}cWEo=-+ zTpvtW(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%k ztQh|7uoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;* z&b1o_xIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^U zHvutAO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($ zIgfzl@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhV zCb+u9H@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1u zX$lR2Hr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{N zhM1O10BmQ6@k*KJ5Y z8!;i1oxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8G zO8loWl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFMk2AEg2y z8kCzsG$==dXi%;O(cqj7Vt{ft$lWuf1wa%imxE|fP6yGT+zz5aIUYoVay^I!<$Mqg z%Kc!v*K`7i29*L}dhJHAd7#n�QlKAR1IEfM`(30HQ&q1BeEd5Fi>hVK_v}{29-7-8dTzdXi%vGqCq7Ohz6BDAR1HxfoM=E1g8Jp2ipfK zjX-=*i3FlSr4on+l}sQSR62oZPzeR1L8TOk29;DG8dO?=Xi$j-qCuq=hz6BhAR1J9 zfoM<(2BJZw7>EXyWFQ(;nt|!(JmB~Mm1-b9sAL1tpwbOQgGx9M4Jze8G^nHl(V)@} zM1x8^5DhBzKs2c21JR(;4@84XKoAWo1;O;^qhR|$r6Gt9DiJ|6s8j^gn>)espwbb< z2bGW@8dOSxXi!NBqCur4hz6CIAR1I^f@o0538F!zCx`}>pdcDlih}7s{NV5hm8Kv* zs6++Ppi&h~ALRqv4=P`hsXs z2@Ik^r7(yFmBb(#R2qZnw`E}WfJ$W$A5=1fXi(`4rq^15N^uYkD#<}Ks5A%D|9*qb2bJm|KB!~|(V)^DOz+zd zmIsycAU>$12hpI?9z=smd=L#P^+7bK3Y?q3xpuz-*M|)gxF4)vz;pAg z0Plf`3;1@f7vNvHPC;PiL;=Ch2?|1$#R9^aMG7L3p#q|wAqrxa<^tlHW(pEY!4o7o zB^0EXOeaWbiwH=4a@rvMNOghCC6x`bhu9a$ZDQLXzwqS(g)&P6#m3VMl)|J9l(Swa zsF?mWQ1v>cpeB0XKwWE%g8IMT8#KB46g2PM-JtcVKtX%o{tY^pdlu-&{SczkJxhlebF2bMsOIueUJ@-g6Fa@VQp8z_(`c2ET1l3;bhRHv~+xSrBNGz9Fbg zZb7h&=Z26lh6N#iv^RvAK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j)AG(BcHdHk zxReV9@$=dh5`5omNNiucAW8S!hUE0t1u486Hl(_zFGzhmX+yfY=YsUJB^xr?wHIWr z4cn0QoOeO?v|@vt3t9@fWuXRn8+a7*!^{l|`rj!Onn@ZI4Jr^oG^kJj(V&6>M1u+k5Dh9I zKs2b30MVd=0z`uf3o!lfH`qQExl$UroxFayz`0u4li3N;W7D%e0YsBi<(paKp= zg91-2hl2!i;af)GT53PTVLDiA?5 zs89sapn?%Zg9=9w4Jsf(G^mgS(V&77M1u-T5Dh9YK{Tk)1k-OPf!zZtJVAU=0Scl) zg(#R_8wQpK6{a9Qs6YkLph6Wyg9=s<4JuqgG^l_D(V#*WM1u-i5DhA9K{Tkq1<{~F z7fk;b2b&Knd_jCr0Sux+g)o@jcN;7ZDvUvVP=O4hL4`7i1{KU88dNxgXixzSqCtf; z10xeN3ll3o$i~S*N65f%X*sA^B)+ijZ(x)G7ukxqitI>mi47(o#Wtk82898X#pUQ7 Z9AXJ7+I4)5^^EikbbJjB^$hh4xB&gdRU-fZ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns new file mode 100644 index 0000000000000000000000000000000000000000..a1d14854af6b82bfe814f2c64aac01bc053d5fcb GIT binary patch literal 3664 zcmWHE%1kq2zyO>K3=AL)l6VhgOExetFw8lh#4~rvvp@58)b-5Yb**N>wvIasE&lr~ znkpHyxaE(}l9JysOH=OoEQ=Grv)tu?&kEb0cUGz_@>wN&`_5{X7N6CB_ug6aB+X~- z-T8Ocooza^esANQ4Qo@*Y+N=kW>c@*nayntFH z#T7@&zgir%+`QsgqTr6>l2cclaQM9AB-191QwmpioO(1x;|#<09ha296kJMpcH(k} z%Z)2u%pO-W)NWkUeCl!CgX6{x&f^|8)nDDX`EsSlZ9(>k+n0`>xO1;0;_k{^k9+&V zBJOwkdpwwD5%Dn7(Bn~^RK#OXVUH)Vemrt;G_mQU=29!!RBx(g56-P2ZzF%2u^{14=#qj2(Ax>9^4NKB6x20 zp5Q$Y6v4MM{{;Wayc+^D15XHc2HX&;G(I7mX>>y*QuKtVr^pR4i|;4IHNM@DP!jQw z6@r!a+!4(zL z$zN2x5}v4umVQy!a(bfvZ&HaSm&y~(dnF}Wuh^bw?+Yu@xvZR`JI|s-Z!>F(ew|c_ z!KCLYhUsQsjEYXC7`sb+F$r3oVygD*iye_YtPBBPv(RVFzbrDK&{apUVU03gk z`{l?lp1cB2JU3f^@p|*=iT9j{5}#}QDZVvUC4Sp@J^W)VA_Atq_XxC+iU=yb=n*Xa zCn6+tvq#A9dl6x#Q$50-{JIe#xA8>8kvlgc|4lv-wPfFo=zFCnVp6A8ZaBNE%gJd$)9Ba+iCJW_a*BU0U^JW}7fMx?9#@kl?b9+Am*&m(g!XGGSs z10LDaRBz;*zjGqDjQvL5`h6$zLtow~=wEQ6(Dd|;qWq>4#iDC(l=!EdDEW6PqRgVv zqwLY?>wFeU;5s-x$1+uZC za8V`6=dshoR8;r;|9@@@1H=FSca|`+fY}`X|KGU*W}jeyuzA2D0{{QNdci0HX0!PC zhA{ZKgfRF8hcNgBgfRGpgZM5Xpi+>5fe}JM7(|qtA7JI?52(if|NsAwvo(1GqCw>- zhz6CVAR1Jjf@n~g3Zg;fDu@P^tsojyzJh2_84IF8m9-!mRNjJUP?-y&LFF!p z29>=a8dUy*XiymprvL7}1EN7?F^C40#~>P1CWB~DxeTH~WiyBdmCqm=R7QhnP&o~v zL1i_F29?(!8dPS3Xi&KgqCsUhhz6D4AR1JLgJ@7W4yM1p_5snL@*G5i%5)G7D%ZjE zdA1cG8dSc6XiymsqCw?6hz6DQAR1KOgJ@8h528WkK8OaD{U91t{)6Zf4xe{`Xiz-> zqCs^5n0_=x14M)B1P~3X7r=DFvlAd1R6l@dP#poHLG=WP2GtcH8dP6^Xi%L2qCxcr zn0~p^14Q2zWRC#TmyUwX1JxrSKBz7M(V+SSM1$%S5DltVKs2as0nwoP1w@1D7!VDr zXFxQlt^v`Y`UXUU>KqUas&~Nj$IoEMIZpsP8R^svki# zsE!2Dpn4KSgX&5U4XQ6eG^ox5(V%)0M1$&15Dlt7K{Tii1<{~-6hwpSQZW7TE7(1t zIu*nR)vF*HRJVd?Q2h#`L3J#M2Gz458dTSUXi$9%qCs^ohz8ZWAR1Knf@o0v3!*`F zFqr-~sRTrW>S8c`uLR5o)yW_}s9pxqpt>1EgX(7x4XUF-G^m~i(V)5-M1$&U5Dluc zK{Tk|2GO9p8$^TZZx9Wt!$CBt9tY8&x*SYD+xG=TgX(k;4XW2cG^lO|(V+SrM1$&h z5Dlv5K{TkY2hpJV9z=ucd=L$)_dztM?g!DJ`X5At+5lksb2->PP+I`R2ek)4G^kAg zrZ-!Il%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current b/absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current new file mode 100644 index 0000000000000000000000000000000000000000..4db1300a26ed4ad20bed915020eb3af8ba639e33 GIT binary patch literal 574 zcmWHE%1kq2zyNFv3=AL)l8}J1B^nqQ7~1|$lbE+-{e=0u*&9xG@=Um-{H5Shq6EX` zGDd+b!TAhVLmvxVQ@F!$-Snuy4TgOTH$|5V+3vvU9R*ab)0HQ%|0ns4$fM}4Lz%+^O;&KiSG2;RNH`G1} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Thule b/absl/time/internal/cctz/testdata/zoneinfo/America/Thule new file mode 100644 index 0000000000000000000000000000000000000000..deefcc8df5a1111fb1ccacd1d67f44165d9a736c GIT binary patch literal 1528 zcmWHE%1kq2zyQn)3=AL)l1PBEc^ViP7-lz=|55*1^+4lk>;=uMF%Ptk+F#J#SDB!5 z*)2eKUUY)qW{m*-I@<(;$y@=3>5&hNirxemyIVgn2|5>GsxJG$%xFV^IotmS7Sd-f zSUh|9!1DLH3s%PtKd`<%;eyTj2MM;ji!RvpA4;&F9df}Te@TL4OJRVMe_MicN^pRS zenx_;i)n!C=UETjbptQBU#@xJ$!mPUb93ASueYKXyysLW_*^pz@U4kW@Y^O5;2&e3 z5HR&yK%k9cLQv_AfM6Nsgpkl(0U^JiCWM*J2?%@2_#i@V$AyR^j~_(-n{^>-$B(}!}Bt3W=fKmbj0|P1P?@mP+A1hp!5i$L1_|1 zgVH642Bl394N9LN8k9ysG$@^dXi!=O(V+ASqCsgEM1#^TnEpHqY#%87g7}~`45C5l z7))=D1IvTbGl&mL(;ym@u0b>?ZG&h~`UcUUG!CLc=^R9Z(mIF+rFRewO7kEZlv1IkArJ}57NXi$Cv(`yC5@}PVL;)C)Q zhz8{^5Dm&>AR3gE1JR&72ckjw4n%|U9*73zKQR68BG`OTJ_PYWc@ac| z@*|kuHx(=o%9kKMC~tyjQ2qqbpganqLHQI!gYqhf9xVBl%P}~_#L*>0$JbcTNY6mW M*U(VUP|tu108^us;{X5v literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay new file mode 100644 index 0000000000000000000000000000000000000000..aa1d486097689f5c686d24abbeea0868667118e6 GIT binary patch literal 2211 zcmWHE%1kq2zyNFv3=AL)lIVuAB^nqQ82VMJADr&^P;g24OTndt-wzn3|NFq${_p`) z`GXJ41^*IQ68;vj20TdMP&in?DX=7gi(zpA*N3(Q?gy;}JU16T;60FDz_+vI0sqS8 z4+1mO9td`(eh{kkcp#kV{y`*C>w&1J<_9rLo(JNZ+#e*AG!rB_-hPl`;!cqI#8n{u z@NI(3#Ww}A2hS(SZ9G>Xzi?xMLK(vc#m31AN}-QFC}*vIpkjLDgR0lW2Wq0rKB#LI zKT!X7xImLD^nvERr3G5A%pYj)YcJ5b9Fm|rFS9^zvsr?Eop*u3WQhdB^z;u#MZXe^ z-90~;1l>t6RoDJtX0$KCoSpZBh4ifl7SG;)u>8H}fz`2#AFOZBdtkHvU4iZHh6i^2 z7YgiWCp~b;-&Ek(QlH@DKc&DqB{9K8zpTL3#W}(C^NJ7dy73R(FL!_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE z62hMHe~6Gf_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#A zl60pPB&Yi(r0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucd zsQeL?P&Kc$p!$YQLQP$ILG2E?gt|D-g8CT@35-n4EKIC}0{;KMCWL|E|Nqqs7+C)Q z-?@Q-vMgR&Z!{?L{HqCr^>M1!&&hz4an5Dm(HAR3efK{O~Ef@n}y1ks@E z2%1hXi&BW(V(miqCwdkM1!(8hz4bIF#Yc^*gjBp2k}8! z9z=t(J%|QneGm=G{vaAu1b}EzF#w`LMFEHg6$c<1R3w0CP_Y1_K}7?I1{Dt=8dOAp zXizZ$qCrIkhz1oGVEWm6aD0M_4Gpdt)JgNiW_4Jyh&G^jWO(V!v?M1zVo5DhBYKs2a$1JR%&4n%{B zIS>sh>OeH8xC7H~qrmO~6?-5)sOSUHpyCfquayJKgNi{AA5;{AXi#woqCrI>hz1pl zAR1IOf@o0j2%U%6a^Lrh&=LUeqM^^EikbbJjB^$hh4 FxBw+wZU6uP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana b/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana new file mode 100644 index 0000000000000000000000000000000000000000..29c83e71ffa6b071c52b2360295bf55009c09b76 GIT binary patch literal 2356 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Tortola b/absl/time/internal/cctz/testdata/zoneinfo/America/Tortola new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver b/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver new file mode 100644 index 0000000000000000000000000000000000000000..9b5d924173e6e71c2c0a73cf2aca368d3af002e6 GIT binary patch literal 2901 zcmWHE%1kq2zyPca3=AL)lGq1ji!?AWFwEPrcftJKq7zPcN-emg{H5ShqME?vGJb_C z!LZ zQGwUb{wciK_+8-bu?Gt8Cf*cyzy8mH4~4r0KK9>R@TvabgwOd07JP|cJmIVVq6OdV zTPJ+iZ&~m|W0Am5{pGAQBlWAnF;SAZBSUAg*bqAfXgIL6TEK zL5j(Ag48FI1=5eiC&*k9TOfPz=LETpKNiR@ygfmoOj|**aqk4BFkS`atXl#qrtcM0 zz4i#GiC$Dt*P17w{_pJqO|Aw3&3oq;XuV1j(B8LkfzIW+3A*zpFVNeZFhRerbb-NS zrwNAXlN5}KRVEm_mnfJ7vrRBn4^uERdNIMA-9o`ahE>4gxs-zC@8<$m$Nnf--##f| zvq55k?e5hAcKyE=*w5}2aLB*2z_DfJ1SkJ}3!GEBC%EV@Sm5fCJHhqyWd(QLE&=z; zTNONca|Ap$Pgn4I>nGqnXY&G|YgrR~Yo;#n+vYRDKc;*^z%;!Hfi{r~g31IY1j|@2 z2nqc(A>@zjf-uu76T+TaDMZM96o@z~qY(M;vOv_5e+tp}whF|wJWz<;H(eku<&Z-B zyh?!t-+K!Z+ow)Q(mk*sIlX*B3h$x?sqT>zQs1^LNLRO>kbX98K_4+#{DzEvpkUm{TQpL0Q(#eoTB z_g*ikkXSUKV&B;Xl|Nc0RLxtzp!!DIgqpgE3upwb9LgGwY24JwsDG^k_()1QpN_Jc|&5Fb=ZfoM=k z1)@Qv6^I6vSRfiyYJq4_$pxZ8r5A_>m0%zmREmLUP)P=&L8Tdp29;vaIDp^4^sB{IBwrL8Ur~29@j}8dSQ2Xiy0cqCurRhz6DPAR1KKgX!l|;P?fV`XD~2FY5))oss%tas3ri>pxOXLgK7j24XPDDG^l0((V*G^M1yJw5Dls&!1U+KVEaI| z1&9x-F+en^)&SF+r-S7|wFig~szE?Bs1^aypqd0kgK85H4XRNkE!Ql_8Z9sfbjRT@VwGNm*Dg(A3RQrJVpc)87gK8lV4XTMiG^jQL z(V!X$M1yK25DluCKs2a!0@0uv3PgiyDG&{+sX#QSwgS^{TfpuC)mk7vsOAFEpxO&e zuk`@SgK9AlA5@cpXi#kiqCqtphz8YaAR1J&foM?e2BJYV9Eb+hav&O1(}8GEZ3m|R zbArtW)p{U4sOAIFpxO^i?>h^Y2i1ZgKBy)H(V*H8M1yKX5DlsoK{Tjl1ks?{kzwRk dk6Z!4Ar=8HAv(UsdPaH%I=+U6dWL!iTmYZ+xyt|m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Virgin b/absl/time/internal/cctz/testdata/zoneinfo/America/Virgin new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%bd|cnt&N|NqBA7#RNlKYoCL#m6^_OY(|&+;fK2)SAHS(wj=>=&TmUU;9%BFi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse b/absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse new file mode 100644 index 0000000000000000000000000000000000000000..6b62e2d3c39a8406cdc087b387fbdac0709f9141 GIT binary patch literal 2093 zcmWHE%1kq2zyKT!3=AL)lBkEW6&n~B80PIby<5f`3x+S1u`d&fRYmb1M=tTu} zt$70K|K2Xp-%6ZGp!7Z^--nqZhdNx`UC zWrDGLiGoQm+XPefFafH-2)4f)5|BM@Ge@A>K-{E^=-?7bam?q>1WdxWU|Xn$Xx5OAnV!x3E9(96>=`f z2;`QzE99;JCy*besZh}WK%mf!TcIfbkU+8MTZIz;B?2Y?ITw^!9GFmc@AZNTiA57C z_MKf&`J-h*)x7l!s&AxCsHvN{pmvAHgu1xm1@$wuCNMEFF)}f;FtIYRu@3*E{35a|-a5E&f85E&lA5E%gC zyM!>l3LqMkXFxP4-+*XP-T@g8%0D0)l!rhxC?A1nP+kJjp!@`) zL3s*9gYp%K2IVa<{mEnjhz8{`5Dm&_AR3g{Kr|@7foM>k1JR&-2ckiF4@86VABYC! zK@bhfhaei17eO>AKZ0mbo&?kX-h%A|)Xiz=|(V)BxqCxo?M1%4)hz8|r5Dm)PVEVa~0*D6XaS#p4 z=O7xC*FiKWzk_H{o(IvOd=H{Qc^^cB@;`_Ml>s0cR1Sb>P+0(?LFEC629*h5`txP5 zeW0=d#0QlRAR1Igfa%TC!SbN80>lTE7a$r`W`Jl=xdEa#k0nwl`223B70oxBMYe0NZc>|(BWe$i2l{+9B zRQ7;qQ27I*L1hq#29-k~8dMg6Xi#|sqCsU6hz6BQAR1IQf$6s`VE2H^C=ef1PJw7p zSp}xodVu9YWfq7JDz`v1sO$pKpz;eugUT=v4JyY#G^i{C(V+4SM1#sS5DhBVKs2aq z1JnOG!RCX?I1nFH&Vgu9SqG-~odwH-$~+JsRPKRjP}v8fLFFHa29<#z8dMH~Xi!u15C1=bCR{aZeq z?)cYmN%>2`r9{pTmpd{Tt^_B1xEgwu;hMtP57$k%Gu&WU|KX=DD8Yezo3J$8iQ-NZc~KIboK_+ps!;U~XW!!M39 zhF?F@8GgTrVEA*xli}|PD~5kNv>E=dkYQk$!OOtd{*QsF{5=D6p;QA)B6kC8z@G*- zhqn#v2KO2`6wWtr3LI$QV%XTg^Bu-G)O<>J5t3meQ z>jt@vcN*juo^4Pl<7ZH8T;HG+`jJ67>kNa6>1760uXPM+qFWi%wI(pA|GU_r$yLOl zd2e%r)~gT(?R`@lbS@V(=*}x|(Ayl;pkEi+U@+OF!7#my!KhfQ!Pq^5!6fKMgQ>a| zgPGB-26J{91`Fx$3>MG+Fa;0^gd-2ET0v1^zM74FS`H3Ic6x8-hx|6a>r2H-v;NKjfBaGvuv*_#r=x zm!Y8l@P|Uv_Y6h(OFtBgUSufoZ~sv8?`=bw#gc-ud*>S}B-#op_HAsa{E<;mHE(i5 z^$o9rn!3`4+8sItb#dVh^)vVim>9v3nFUNiIM_*6HtIrx7Gie>LiGRtC2trQ{{P>( zfsy6^|J4f^IKXTkFev~gq2fNiAq>tgAq>vJAq>vpAq>s|A)pM;z{to5q8S+&h$tTR zz>0?-AUzBqoB#h$d9q>3|NsC0gNh3T0`Wn`7KjEFT_74%e1T|C5eA|`#TbYN6=fhARGfimP>}|rLB$%F{*lfA zqCv$Qhz1pLAR1K6f#`prq7K9W6?dR`nZXMp!Nnek0V?`HG^qFk(V!v_M1zV!5Dh8{ zK{Tj11ks=(5k!NEMGy@t8o~63MW9-N0aQeS_@H7EM1zV-5Dh9WK{Tky1ks>k6GVfG zP7n<$K0!372nErgViZJ!ic$~_Do#N(s7M9Tpkft7gNjxV4Juy2^d||hJ3z%Ohz}}i zK{Tki1<{})7es@KT@Vc_dOsu2(ks!BjKs5$}BpehAKgQ^t}4XRqe^dClW zJb{fM`%v1E!CHNJy0fVu7k15Dlt&Ks2cO0nwl;2tEDx%>Kzva31)@P! z7>EW{V;~w-m4Rqbbq1nART_u}Rcjy`RJDO{`VGaKB%e#@j=xchz3=8 zV0zz1uso>h1MxxCABYB3fgl=G4T5M;RS2R%)gg!mRf!DHnrWohiCoUXA!g1lAv(Us RdPaH%I=+U6dWL!iTmWG7vC;ql literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat b/absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat new file mode 100644 index 0000000000000000000000000000000000000000..523b0a1081ade2feb2e163279c0b9960f8550099 GIT binary patch literal 2314 zcmWHE%1kq2zyRzF3=AL)lIVxBeFgIZA zkWyf(kThT}G+V%uXu5$lP+|d_qxc4PgI^2SdjmIc3fx)1x%R99*N1%zxF77@z;pAq z0`GzO8~AqaRp4K_$3S4_dcpeB0XKwWE%g8IMT8#KB46g2PM-JtcVKtX%o{tY^pdlu-&{SczkJxhlebF2bMsOIueUJ@-g6Fa@VQp8z_(`c2ET1l3;bhRHv~+xSrBNGz9Fbg zZb7h&=Z26lh6N#iv^RvAK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j)AG(BcHdHk zxReV9@$=dh5`5omNNiucAW8S!hUE0t1u486Hl(_zFGzhmX+yfY=YsUJB^xr?wHIWr z4cn0QoOeO?v|@vt3t9@fWuXRn8+a7*!^{l|`rj!Onn@ZIBBx8-OTK<^$273<#n@nGi&SG9riuWkwJU z%8(!$lqtb$L=sX;U-V}oc=<_6KA3=X0}nH)@OiwJ<}PflQWf-*da z56bi)8kF%tG$`|fXixzFqCtfKhz1n|AR1H{fM`&G0HQ&K0*D3`3?Ld*IDlwS0Rg7} z{RZ0yDkwmFP+E1tpk%I|=L_P=N{Jg9=R$4JtUn^x816Jg5K#@j-` z4JvrS^uF6*c~Aii;)4od5DhAbK{Ti^2GO7b8AO8$We^Q2m>C$Em|2)u@j`YsIzk49 sbB&;4k!l4rxM&7>7gR)ZIeG_&Sb_?09baQTBRvBhUqeGZLp=j70O(>)4gdfE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife b/absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife new file mode 100644 index 0000000000000000000000000000000000000000..d9d6eff70d7aadc55e202b7d31ccb1359870b81a GIT binary patch literal 1980 zcmWHE%1kq2zyNFv3=AL)lBkBVB^wwR81`vNFr4n>nQ%$@OTnc?35M_bQ3XFVT0aP9 zrU-~cx-*D+x(SF`YBGpxY6wUuxi(00atTN=sW(V{Qkx+Ch_gZF62}DDgRdLpHolr5 zzwm5>LYb_9V&nP-rO^KZ%2{U^R7@WVsCunqP!l~YpsqE6LH*zT37T9*44U^2PSAQ4 z!l1ox@dTaA1r56MS|{jj4rF*2{&v^taf8S)VI`&S$`u1)Hn+;qOY@JuO@y=K>!?ZkeS(-ue#=`C-xm1^t&83QhkC z6yFghP~tz0q2%B131t?W8p`h7olqe$rJ-Wq{t1;o${MQXEu2t&Bch?Eu6aW3 z4y%T`xYP;tGh`YVm>HRvS(sS|0D{sS1H=FSs~0e`fJu)3|L0C%;Q9Z5=LSXru!yLx zfdPYWcnE`UKnR0xa0r91iwlSdVPIfj1nUQpq@?X1U|k?<|NjT2@&Et-{|BXW5DiM} zU^-EP0Yrn+JctIRdyqCz+6U1hk?tT0oCiP*F-uJl191Vn@K35W*e6%Y-|FCZF}XFxP4-+*XP-T~2|`~#vvc?d*<@)3vzbW-+i!spnL`5gYp)L2IVgh4a#F68kEmKG$^luXi$Cw(V#pBqCxo%M1%4khz8|9 z5Dm(MAR3epK{O~Yf@n~F1ks>838F#y5==km5dhJk{0X8#c@#v0@+pW0L3tQNgYq$m2IXZC4a(18`twn+eV}{|;)C)whz8|vFul1G zEDy@(AU-IsgJ@8G2hpHB528W&9z=ukK8Ob8e-I5S13)yW901XvvH(Pb$^$U{haVjN zpmG7k2bB#V8dN@j>7#sL`$6Rdhz}|&Ks2bl0MVc_14M($4G;|~J3ut3`~cCQG6Y0} z$`KF^Doa2#s5}ADpfUwSgUS^!{k9D39#HuL;)BW<5DhA4!1P)xuso=|0r5d)4u}So zJ0KcV_JC+m`2(UsWe|u4l|vvJR2G3~Pe}*#)9OVx0PIST&HXD38(SvN#2 z;TNd?|NlP&BNHPNGZP~tNGAvvG=L16wSj?yfdRzUH85b%Hn3pOHZ%lDgVZsS;)ow0 zT?`Bi|NsC04{{8M3vv*M2002ugB%8;L5>5_AP0hIkRw4f*$(Bh(KfKK)3x9N0IIGt A!vFvP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis new file mode 100644 index 0000000000000000000000000000000000000000..40a992664e2b228b0f6ab99a7aa655df53015dcf GIT binary patch literal 311 zcmWHE%1kq2zyK@^3=AL)lHi20c^ViP7@p5@VEE>KU*MnnY6h=cA_m^me>wQATxHEWr4n%_-2%ljz}!yPoC^Tm CbUc>; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville new file mode 100644 index 0000000000000000000000000000000000000000..06863534c4c733f9a1a11800b614ec901e64cc6c GIT binary patch literal 216 zcmWHE%1kq2zyM4P3=AL)l3<0hIT{!k7_RIoYq)2Uknr4wsiFS=|Njh(42+B*RUq86 zfPqEVz<@#9&;Z0`AjR+>U>yt$|NsC053&SAgDe8kAj?3~1TEyU(Ka-&(={~U0stJG BDkA^@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie new file mode 100644 index 0000000000000000000000000000000000000000..aea2be77cccb5187ecacca5673cc5b42543dd3c9 GIT binary patch literal 1543 zcmWHE%1kq2zyRzF3=AL)l8Aw_g&G(b7-nCsXqdA{;lqOVEeY3oG8ldz>Sg$|sgB|A z@koY$Wg8m)FSll32%FTv*e=V!WWSz)xxli4g;$1wH9)$7^_xWlyZ+w>_G?lNoc#A2 zIJf?3;Cg?sfqT9r1J8|n47_!}8TfV_VBn9t%OEgg5rd%Jeg>h676xItg$yDQX$&I& zni<3_JQ&28{TU<_QyL^58!|{Sx;02GPi~NYsL>$P?%E)GkgGv1UA;km`X&a2$hro_ zhI0){PO}-5GhZ{PDAh8kdY)xaV~S@`*Idt_{$(43#@mMtnpb8pXq`RWpuMGvL1*pK z2Hhz!40^ro4f-W^3QV;BxC;$VuI&uYcAFYp^cFX` z%1vo-WA$cmXWz)+{(TXH$MeYyp4VF#ypESLcyCW*sQ>@}KO++(Gb0Nt4ImpEC}Kgl zX8{8X1H-HhjGQ1I2t(K~aRxqJ0|N#}*WeHaM^~2+25mz_kRnD#Mi2$UM5LftSPJ?9 z(!jvL@c;k+|23>)U>cO7KzvZD0@0w91)@Qz3q*rb7>EX?G7t?)X&@S$+CU6YiUXM& zHVKqK89*ry#08~35DiL!AR3ekK{O~Og6VG-VD+FB3F3oNC5Q&4OfbFm4_F?QLP2~` zDh1J?lnSCjsTD+nQY?rDrCJaTO1U5!lzKrlCgHk$(2Bmfo4NCDK8kFimG$`eRXi(}0(V!dvqCvR;M1yhy zhz8{b5Dm%^AR3e_Kr|?4fax#WKomHKfEb`$0-`}V1w?~#3y22g7!VE0H6R+4b3imG z_kd_n4g%4jTm+&)ISE9AaubLKe38Fzc6GVe@Cx`~+ sP%!;{5r_ikR1gD{TR}7^$AV~3t_9JcoXapYvM!g6wxOY&uAw0p0J_Lj2mk;8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson new file mode 100644 index 0000000000000000000000000000000000000000..5197dd97b9f871f533ff418b1870e593530cd501 GIT binary patch literal 225 zcmWHE%1kq2zyQn)3=AL)l3;J57#J8xvEv6+&;S4b|AXuTaY6QhXj1Itve7m$wbM1_0st>~ B9s>XX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo new file mode 100644 index 0000000000000000000000000000000000000000..a5f5b6d5e60f15ebdbb747228006e8fe06dd4a01 GIT binary patch literal 2460 zcmWHE%1kq2zyRzF3=AL)l9&T!3pX$@Fl^Ye>BYvt_J~atPct?<&^igj!R{OW8G9bTc(8Zfw-@^kpL(#r@5YM*i`P6j zn78Z2q2|5^hyCWfIFelO;HX~Ri(@{$3CH;oUYyX$PdM?tHsjK*Sq_{Me;;tJS^9wM z{n7;Pd4C@8+&K7vx9;8pz8#An@W&l^ATXo#fuP-@2SOF;4}|4f9*9JEJ`nkr_CU-+ z`+?Z=<^%~vj|7S1sR>eyS_x9i-4moA@+8Q#YbMAZc$XlT&Yd8?;6j3e+uH=ihD`}d z2AmI+GtWIx;eY)=RgW=2jmhbOI`88I^+zfXG~OOf&^*NUKE%u`++G}Z-SYa?gO*WD<7DD<9}drx%+|T z)sGLXHs?OD-p`j{Gui)v?Ys{OcEyGd?CUNiIK=oRIL2*BaI!H-aJHM4;36ZG;3`*< z;QISZg4@5S1o!W)4?OPKBzRs=f8e!GF2Q@d=L4U43<uJ1+k*$e4m=4VYKI<#%D+npV_Whd?Ei&?@MmogBJOWWh&-0@AZq`Vgy{9H2{9`+ zJc#X2Pl)T7^dLUpGa(_PnliwCKE?-SAlLle?|a6d@@Xr7R9 z{q2Lyi;@Xh+s{A9-tapiXZpqmxfAXtf9>H460rP+g;MM(*@oe~e~np_gLM%b75KV2UOGl|Ns9xZueOMqCr^_M1!&=hz4a%5Dm(nAR3fK zK{P0vf@n}y1<|1F3Zg+-7EHf6`T#_OvMz`QWnT~t%EBNTl#M|&C@X_#P<95E-TVKB!0m@j=B3hz1ocAR1J>fM`$=1EN92 z42T95H6R*P+<<6MkprSZ#SVxD6+IvtRQ!NwP!R;CAE|)d2P%p{d{A)&qCrIxhz1o) zAR1IOfoM?i1foGj6o>{DQy>~tRDozvaRs75MHYw#6U5Fb<=f@n~Y2%~6uLB%GB1{Iwk8dQ9OXiyOfqCv$dhz1pZoe%ste%avXmvV<+m(4c( zK5Tm6&z@j|ziWaV{>?Ep_}^pVz`odP1BXif0&#;q8zk6b4@g`L+aUSO{(#g*iw)A} zV;p2AN^Ou`Z|5La@MnX3zk-88J+pygK9hrzpm}KT2CeJM4rni$zd>hv#{u1@#tnMYvkvGdC2ufjXm>Dla@}B*km+D- zd)>gq!P~)<+r_|)cZY*H+tm#g4Ezojr#TEPUuqw)TJ_4n`XuiGo31kkwkzHru*+I! zVBc}^fJ5-94UQR`4>%dG+2HIk^?-|T-v(F1O%AS~3pTh5PH}L5&t%~7vCP49PriZI z#Rv!Q9Sj?MHd;CO9%DD~3urpvKWE*B0H>P=0&6C02-5!M5FAsqA%y#eL%8`fgYfll z4n#P&ZK(hM|33p0BMh=IvoNxEj1P7sLPm|Nn#137CF1e*=gH zr57-L{IUUv2BjMi4N5y88kBxOG$;*$Xiz!=(crWMV)U3efQ$#FDG&`xS0Eacwm>u} zeSztVVH-d+D4l_5P+9}gp!5c!L1_*|gVG&{2Bkd^4N89?8k7b>G$C_RH{P?`qOpmYtQL1`OAgVHyM2BmQj4NB)=`ZNdFeW3IX;)BvW zhz6y55DiNEAR3hZK{O~2fM`%Y0MVel0HQ(p0YroH1c(OZ3lI&;8z35#Kfv_o0&w_) z@(G9!$}1omlwUwJD9?asP`&}tpu7X3LHP$ngYpoF2IV6V4a!R(8kCDjXi&Za m(V)BqqCxo!M1%4em|p+p0Ehwpj-qd_bJ#&g-|8W`Ida{&O3ix)-! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole new file mode 100644 index 0000000000000000000000000000000000000000..a5f5b6d5e60f15ebdbb747228006e8fe06dd4a01 GIT binary patch literal 2460 zcmWHE%1kq2zyRzF3=AL)l9&T!3pX$@Fl^Ye>BYvt_J~atPct?<&^igj!R{OW8G9bTc(8Zfw-@^kpL(#r@5YM*i`P6j zn78Z2q2|5^hyCWfIFelO;HX~Ri(@{$3CH;oUYyX$PdM?tHsjK*Sq_{Me;;tJS^9wM z{n7;Pd4C@8+&K7vx9;8pz8#An@W&l^ATXo#fuP-@2SOF;4}|4f9*9JEJ`nkr_CU-+ z`+?Z=<^%~vj|7S1sR>eyS_x9i-4moA@+8Q#YbMAZc$XlT&Yd8?;6j3e+uH=ihD`}d z2AmI+GtWIx;eY)=RgW=2jmhbOI`88I^+zfXG~OOf&^*NUKE%u`++G}Z-SYa?gO*WD<7DD<9}drx%+|T z)sGLXHs?OD-p`j{Gui)v?Ys{OcEyGd?CUNiIK=oRIL2*BaI!H-aJHM4;36ZG;3`*< z;QISZg4@5S1o!W)4?OPKBzRs=f8e!GF2Q@d=L4U43<uJ1+k*$e4m=4VYKI<#%D+npV_Whd?Ei&?@MmogBJOWWh&-0@AZq`Vgy{9H2{9`+ zJc#X2Pl)T7^dLUpGa(_PnliwCKE?-SAlLle?|a6d@@Xr7R9 z{q2Lyi;@Xh+s{A9-tapiXZpqmxfAXtf9>H460rP+g;MM(*@oe~e~np_gLM%b75KV2UOGl|Ns9xZueOMqCr^_M1!&=hz4a%5Dm(nAR3fK zK{P0vf@n}y1<|1F3Zg+-7EHf6`T#_OvMz`QWnT~t%EBNTl#M|&C@X_#P<95E-TVKB!0m@j=B3hz1ocAR1J>fM`$=1EN92 z42T95H6R*P+<<6MkprSZ#SVxD6+IvtRQ!NwP!R;CAE|)d2P%p{d{A)&qCrIxhz1o) zAR1IOfoM?i1foGj6o>{DQy>~tRDozvaRs75MHYw#6U5Fb<=f@n~Y2%~6uLB%GB1{Iwk8dQ9OXiyOfqCv$dhz1p@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll new file mode 100644 index 0000000000000000000000000000000000000000..3757faccb282a975e3130e5ed9a84bc0e5881a79 GIT binary patch literal 1176 zcmWHE%1kq2zyK@^3=AL)l5mBxc^ViP7@Tff^t$P z1e@nf2=Q^B5Gw9BAxuYeLfChM2@#@h0uk4RCPaSK5Qy6LWkU2-E`gW@f&#Hy-U!6i ze-?9P|hq`#OxA>(h+gv=9_ z6SD4xOvqjlJt5~>YGxjqP`hsKgu2Ql6YBfwC)EG{|DS=G zk%>~s1PWykmQi4Y1Ud(Z$H1X$V8EblV8ozpV8Fn@$Oy)yMA#3oF%SY2aUd2b@<22w z0zot=5QW4N7<*8kG1zG$;XrXiy>q(V&C~ zqCtrfM1v9}hz2D}5DiM0VEV%&aQK4~D2NYAq#zoUP(d^(v4Ut&f(6l_L<^!p2^U0z u5-*4bC15Z;5Q&(}M%%!^&cH_7z{pP5NXOS$&s5Jq-%!Wb&;ZOb<^llM7yXm~ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok new file mode 100644 index 0000000000000000000000000000000000000000..9fa335c4478a8205ecacb645c636ebc07ad714b0 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7+ywnHq`(B|DS=85hMq~AqfmDx&{Ue+6HDI hE(0k>{s8M>VEF(4|9_CtAT9ypxoorz%y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6Rzw zAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{ zVO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_ zCK#lwonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyG zw<9LlEQ_CDyW47lU7OD~~6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Z zoly4Skw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U}9uqWM;tv znONEA4;dJ^L_o<}MuCxqfq_qeffGhTL?9$c+{ZVB!Pzw!M1+8JFfuYSf@lUtMk2CJ zKP=n)0PA63`2YX^|Dty)IUpL8jllGk>I4uC%1$5}l%+s4C|iMOP}Ty`pzH;rL0Jq$ zgR&Wj24yu64a#mH8kFTgG$`AFXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XAR3engH?+D4T+4P*w%epzI2wL0J|=gR(7%24!6^{dpf)A1Dih_@HbI zqCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx4x&L>9Ylk&JBS8lc@PcC_8=OR z^+7Z!`-ADPCSZ4fiUANGR1|<{P;mgFK}7%A5sh>OeH8 zxC7CkA`e7^iaihwD*8Y)sQ3fXpdt`NgNi{A4JryjG^jWP(=Voj-2*BXL3~ir2%tsojyyn<*@5euS0#Vm*h6}2E5RNR7SP>~CwLB%e^Ff4buoLxh7 Y4MBynj<2zvsh)w3ub}~m);Hz?04sM{>i_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden new file mode 100644 index 0000000000000000000000000000000000000000..e71bc4e802cbdfd9f90598029e0fda04c4074ab3 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7_Lg2ZK?nN|33pGBLjo>8IZh|0RxMVZwQ07 kfiZ~7K#Gw+z&aQh{{R2~A7nI$OTc(88*Kw)J6&Tg0DqDi!2kdN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty new file mode 100644 index 0000000000000000000000000000000000000000..49a4b4de7b31924d138a6e22aa0a16af1868cf1a GIT binary patch literal 1031 zcmWHE%1kq2zyMqf3=AL)k}!p`1sWI_7*hi|pyb1QK-v1=0Tu1{ z2UMjW98lxFctD-yuY>xRcMcj)-Uet^ObyVya=}6C$Uz6~Et?#4mMnJAoifEiucg&N zzog8;ASKI zIbeNT$iZfrq=W6QFAjFCza8vnU2||qz3brE{OLgb|Ns9P7@3(MkcAZqvaus^kR?ED z76t|n6;Q~y1u(EMFeDW)axgH2Brx#6NSFvC4+8_b8Xw;f25kdV25kd#25kc~kTDF5 zU;t)<2~r~E2UrIK!~g&P|AQh2M1vv-Bn*lq5Dkhb5DkhfF#YrC1P~31G!PAnI1mkr zJP-|vKoAXzL=X*%NDvK*Ob`u32@FJo5*dgdvHrQE^8}8!_bza;WzK+&2DGHb6U$j;}yAUEl6f_&410EMFa35rRF z0+fOdCMbK~yP%S?CqY&Fzy&q)`~-FGMHe)Ft3`NVE$^+1B*vB z4=gY5Pp~=^_rQAd!UUVelM-wvHz(LNmn7KF@K10^4oh&%`}V-er|5yRP4WX5osb8v zj`|PWc+4KSD+)eve0!yP6*l@ z7Z7YRKOrP&%Y#sn#)L4VX%E8w&V3LeRPi9G^al(^viotlLCGCNgOWUm1|@qC4NCeT8kGD&G$;#zXizo)(V(mV zqCwdKM1!&fhz4Z~5Dm&2VEU04*nOZZ0^);s}fSqMafvJr>|WhD>|%1$5}l%+s4C|iMOP}Ty|uNFN3(V#2_qCwdVM1!&#hz4ah z5Dm(5AR3hIKr|@pfoM?n1JR%?2%gR(D(24!Io4a&wK8kChmG$=cRXi%00 z(V%P%rvJ_b+Xu?tAU-IIgJ@7T2hpIc4x&NX9Ylk&JctHmdk_uE`XCyV{XsOS2msNb zVgN*giUJS~Dh@z2s7L_Opke_;gNgvws3-x^pyC8XgNhUo4JuYZG^l6+(V*f5On>(W+XpIU zKzvY91EN924TuI6IUpKT?0{%c(F3AE#Se%E6+s|+h!sOzuC5`vMxgRZ$JbcTRL?}; R$VA82&_K^r&s5)#3jiv3)%E}Y literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr new file mode 100644 index 0000000000000000000000000000000000000000..0e623cf746b29bf73989ffec96f26c49e737ccc7 GIT binary patch literal 1222 zcmWHE%1kq2zyMqf3=AL)l5m2uMH(0w7*&OPFGolXCdz2Dn)(9ua&S6QA>;9S`U;QjWA^UoQV)TgwCGVXH%GRqARJ3O& zs7m)FsBzaOsI#nip#Ej%1C1v$K4?}re9*j7{XpwT&I9c&u@7{X_&v~_V*fy|#o&Q{ ziQ)r;6rl%(v33bYMUn}|wh9R*fxi<>WtkGp4DTkG{dtmLA@%ct#hqgbmcMR4u-daC z!TQ$T2R2KOJh0t0|AAfWvIq9F8Xq{Mc06!wo|oX{n)Sdrxgo(t)#rh$b5epEtKI{5 zWtRl^cist}%xVdq=X4Xi9&;pkuj5bfIb-y}xA%WR{r~^}85o(Fm{}NE7+F}^kRUq; z5(ilVmCeq<%F4j7ECm#_D-JNQFfbf>z{tVCuQVWO%r5F$mN;P2m%ghHL8kBlKG$;ju=_}P>aZpME z@j8VJY7h-d*&rH}xj*KpyVTcLD`1qf{OOv3#!uZ zE~s(ezo5>_9iaZ@Pk_dg-wB!(ixV`j+zZe;ay~$N%Ygu$B^v{Drz{H4YndFNUot7d zAf-9MFm~MoqoU3S#pAsBWeL~^zjX0&^9n(&^9n-&^9mw z8NwqqCsf@M1#@+hz6wv5DiKXAR3e=Kr|>_ zfM`(K0MVfI0ir=^1Vn?<35W)z6)^obj1|Vh70xo|Nm!TWMXDvW@2VyW@STy>>NlO zWC;+Pm4U%@1}J1K92i&_7~BFFI2ag05*T?vBm)nsh+6<72Ll5{B}5HKy^n7QgSLSQ zgSLSwgSLSg$S?*5MlgV|!6Ye>^8>7df#LuE|NlXe1foF^1ri2D7KjE#7>EW%8kqk1 zc>#z9MIML-MIeXMI?v@MJ9*_MJR{{MJk8}MJ$L0MJ|X2MKFj4MKXv6MKp*8 zMK*{AML38CMLLKEMLd}P@+Sa9gAxFU1|DqCp7*M1v9s zhz2DP5DiKsAR3fVKr|?^fM`&H0nwmD1EN6*2SkGs519Vzb^%0#5)qibs{!VN5)+6I xN>Csgl&C;7C}DwUP~rm7pace@L5U1RgAy8u1|>ESJ?Il0myNc8shzGV7XX(W-9rEX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat new file mode 100644 index 0000000000000000000000000000000000000000..046c472827eb47d46e31cd69611cff04e45400c0 GIT binary patch literal 651 zcmWHE%1kq2zyO>K3=AL)l8}b71sWI_7*KQ|Nm!TWM+au7FHz4#?H*lz+koq1rLY@1reD3`FR0|1_c#}1_c+01_c?21_c|4 z1_d361_d981_dFA1_dLC1_dRE1_dXG1_ddI1_djK1_dpM1_dvO1_d#Q1_d*i{_-aP aM1z7GM1z7HL=RA~bJ=JcnA+)@asdGQIe^0e literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad new file mode 100644 index 0000000000000000000000000000000000000000..046c472827eb47d46e31cd69611cff04e45400c0 GIT binary patch literal 651 zcmWHE%1kq2zyO>K3=AL)l8}b71sWI_7*KQ|Nm!TWM+au7FHz4#?H*lz+koq1rLY@1reD3`FR0|1_c#}1_c+01_c?21_c|4 z1_d361_d981_dFA1_dLC1_dRE1_dXG1_ddI1_djK1_dpM1_dvO1_d#Q1_d*i{_-aP aM1z7GM1z7HL=RA~bJ=JcnA+)@asdGQIe^0e literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau new file mode 100644 index 0000000000000000000000000000000000000000..27072eb51cd838727233db12dee866fae3b81967 GIT binary patch literal 1025 zcmWHE%1kq2zyMqf3=AL)k}!d?MH(0w7*J zq?862#xA&ER8)Pz*tY3{Nl@$sQ`wXYW=8fG%>KGvu#nD5u()gX!1A|Gg4JG$2iCXs z5^R>4CfM#4NU&=YPq3f$DZwH2XM$r3--G)9|Nk>EGBL9-u`sc)vLQis4kQjpf}H~n zSy>qv3^srQMazJJg@M5>fPsU7AtZr;2ShURAVeT+Mh*rB3kL=Ph`5h$2!pnPF@v^& zDTB6w8H2U~C}tP#l72P&|TYP+Wp&P<(=DP@IBjP`rX@P~3uOQ2c^u zP#lA3P&|WZP+WuQFMk3+G$_tNG$`J|^p$&HaZvn&_@FcZqCx2ZM1#@-hz6wx5DiKb zAR3e|Kr|?AfM`(q0MVc{0-{0b1Vn?<3Wx@!7cl+T?E;7fr5iAP*X#j^2BjYm4N5~G u8kCMeG$<{BXi$0r(V#R1qCx2jM1#^6hz6xE5IvaF7?+Kz57-R83$w%{nvW?UO6&>yes?vWRsByo2pw23p zp#H6bLF4(Z2F)9P8MIE>H)!uNXwX?*%%D3vg+Z@pS%ZGf^ag|6TMUNrG7Uxn@eIZe z0SqRFlNwAFn;Xo8jxm@sZD%n5{IkL0sSShWwYmnYWBCo%+cz=TEMLrEJL74CUB|Ts z`zlEWhwSJE$C!BxPCoq%&bAjDTyzgLxXQCKxbb~saA&Y+sQ>@}KO++}1hTM_09hCq zG?#$FNOJ)L3j>3e0RsmEgM|Yl4>H@wH-y2-H-tgkz?ebXzyze6fsqkRF%S{_7O>#| z0nx(n|NsC0nQa^IfM`&3fP_I&0;YfQ9{|yyr~%QS=mF87C<4)-Xadoor~=WT=mOE8 zCXDnJxCdO-|O6oY6` zG=peRRD)N){j* zlr+Hf=bxZd%K%CuAU-IWfM`%s0nwo30-`}l21J9B4TuIM9S{vlJ|G&Dgg`VX8G&d} sQUcMSa7} z#c)9KwyA;Cnbrf+dnP@QS=0PLc23Cyxt`Pq@-<-(6mr}jD8^VkQ1a1ypll=cKt+f9 zfvWVM2Ws4JAE>iRCa8bqO3--9S)h64SAo`%*98X8ULP=wy(wT+v_-(^WWfPr+qDcP zK^+XHvi%HZMp+DIe+wBbq}v)S?gleh{?2Hy+H1;SecP+SW?5i^?QWe0yEfwn``LUA z4r!tdjxE{@POje@oKtuiTvTs1xH`XQaAV!w;I4d;!TsG022bYA44&t9F?cgf|46$2ElbST=-;J2ZspNH^5~|NozX zk(mhsSy+)E8#@~dGY2O`h9Jqzz@WDW6x><{3@i)`ZUKxO3=9?y3_LIrCc?KQ3pi~2*K`94BgHjKO2Bjbn4N65|`YTrghz6x55DiLEAR3gaKr|?2foM?b0@0up z2BuFI901Xvlm?l%+tWYz_2JQ{Yd@)|Nj}8m>3x1Y(VmHHViBb3`qqH z96r7w3{Jiw4B7_fAPEKr1|p1Sfm+4$1FGl$|NsBPwzVDs(ID$U!XPUdh_sW-M%%#L IPS>0Z0J;4oF#rGn literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul new file mode 100644 index 0000000000000000000000000000000000000000..60efb41b45ba1dc51ad67f65be0361085ba9cb2b GIT binary patch literal 1255 zcmWHE%1kq2zyMqf3=AL)l5mBx1sWI_7#3cw{j+uPLj_Uw{0U+bOBlpC77K{~yxt)3 z^4bK++uRINXQC%a@5$I8vnFzb>>RHRay`}?kW*pyd63gR=F94Jz6X zH>gTq+MvdLc!N62djs_^4-7P(+;`BdXm`-Oa>zjI$YulWElUh^mP|F!oziBY*HUhv zUy@;IIbeNT$iZfrq=W6QFAjFCza8vnU2||qz3brE{ON#`>wX94fcLuO13qUe9en#-4}^GsHVFIn%Ax-M|Njh( z%uEo-!iogh*kK$Fb~e0_g`I_kfx)i@6w)CH3@i)`1r3ZG3=ByH3_LIrCc?+xlpsJfC{ciDP{IJwpu_>9K?wvz zgAxgd1|<{_4N5E^8kAr_G$_%4Xi&ld(V)ZwqCp7=On-S`0HQ$&2}FYu6PUho2rLdt zR3JVmVS#8+;sVj21O}o(i3~)85*nC3?gRE0D8YgFphO3vK?x5;gAyNz1|>ic4N8O{ z8k7*h^k0huAR3e)!Sr1zFdvjKL3~i+1ks=b3Zg-Y6hwm(Du@OpRuBzJupkRqK8bv=d#f@Ft^h+=K=r=&Kn>A literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut new file mode 100644 index 0000000000000000000000000000000000000000..72f0896341a76e6be611d04e0b1aaec26f6f4a45 GIT binary patch literal 2175 zcmWHE%1kq2zyQn)3=AL)lIVr9c^eoQ7#5`_KUiGd6tKjvAz`WgmJ7>N)gLTZufMQD z^YeohuQvs}&}x0~;)`y;EAE{MudXIsc>U(hgE!lz1iU?8_~6}4$$p49;yD&`3sZ|_~;V$FKMbzUfd`}z9^JR7G6@Sapo;G1;n0{=?Z z1c9P87o@)EJ&?XQ=Yq`Dqy*Vb7XswAO?@Cgh53TQ^pgpSrRD)ji*+6-hwlkcNsmuZ zwRnF)&1P$Yx|DK&hU|+68o$FXXffnI&^pI?L3_)&1f3-t19YcsNYHDU9H3t^DZwD6 zG{7)+-2)@vi5HA*Cp<9GExuqXTlBz;H}rzp-;f6u(lG%Rcg-GH{;hDz1_cru{J>>^oaRgedQYh-)trBEP)95Vh@8LiCl37h>i=dl0*2^M$zj6A$92 zOudj0zv@9^?WTYv`<@5Mu~Pz4#j^d z_6oyVq=9y8&e% zwm+!g+aFMIVdjI%cMAimHdH^TKGz&jGjm2l?Yh)}y2`4A`absnCdNSo85k5jKq*?w zfRTlPK}Lar)5kZ2!PPYwM1+837#J9c$Ps<89PtCH=l}oz|HHN&+5w_LIRr$5atVkA zM1yh^hz8{<5Dm&% zAR3grKr|?afoM=J133?r(?B#Rw}EI-jswx4TnC~-IS)*~y>|gbgK{94J}(piqCq(k zM1yi8hz8|I5Dm(eAR3f2K{P0Lf@n|<1<{~f3Zg+d6-0w_D~JZ=SP%`$wICXlb3rsH z_kw6p4hGSnTnwT?IT=KQax;hq6~Of0kOv?dR62m^ zyJlcMsFVQlK_vx<29*{d8dPF{Xi%vEqCq7Ghz6A&AR1JHfM`%D0-`}B35W)jCLkJA zqJU^nsRE)wB@2iKl`dfV-EOe`pi&0J2bDA+8dTbVXi$j*qCuq&hz6BBAR1KqfM`$& z1foHu5QqkqL?9Ye8i8m~i3FlSr4on+l}sQSR62p_?`#Pm8dOSw>1!{*d{Aix;)6;o z5DhA|Ks2c20@0w-3q*rTFc1wY#XvNuBm>c)(hNj{N;D7+D%C(VsAL1tpwbOQgGx9M z4Jzfp^ov}u{h-ng#0QmlAR1KafoM?42ckixABYB(fFK%F3W8`*NeH4rr6Gt0m53l3 zR4RgKP{|0QL8T*z29=N?8dOSx=?~k%@c}9=L3~h&38F!zCWr==oFE!hdV*+B2@0Y? wr6`C7m82jVRGKmjqQaDsiKya~%hfeR*9cU`>i8P#nd%wn8|e5N8bDZF04~>mZ~y=R literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek new file mode 100644 index 0000000000000000000000000000000000000000..e3f81ee3327308132b4e9910fffef558850d0ce4 GIT binary patch literal 1045 zcmWHE%1kq2zyMqf3=AL)k}!j^1sWI_7*rkH$icu6lEA=wZ#T1AJ#TJML#Tc0W`E&w^ z2E`nR2E`tT2E`zV2E`(X2E`tfM`&v0MVe70ir>v z14M&T2#5xy5)chaDIgk@T0k@?#eir~ssYn~eQ$thQ0f8GclE)1P$~lPK`9ADgHjWS z2Bjzv4N6rY8kDj?G$?g}Xiy3R(V$cYqCqJQO#hyw0HOzPisQ1;HZZf(HRA#R`Pkjt literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei new file mode 100644 index 0000000000000000000000000000000000000000..cad16b0dfea2ec12074c8cb674cffedbac27b0c6 GIT binary patch literal 229 zcmWHE%1kq2zyQn)3=AL)l3;iPfw|9_BeAR1&NNSHKRxoorzEbMeG FxB!OmCtUyl literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta new file mode 100644 index 0000000000000000000000000000000000000000..b57972dd8ab55785d8cb21b90b5277d8fc850fdc GIT binary patch literal 312 zcmWHE%1kq2zyK@^3=AL)l3;_fg&G(b7~1FV*>&o6kH#6+LWwg|jaFPL5t_ls#LUFZ z#J~`A0i@j94W!dIf`Nm9Av%MR$HO;-!Phs0!8167LEFI0*Z`ymjB(h_%D}(?!XPyq zP`20)5RZX@;s5{t|J8O$Xn<(v=dTSwG{{XL8sshz4RRZpo@%rLM1$POz{teR!py?V szz}o;WK_@vkSo32K(6$SVBi6}RlvtLgaNmE85p=cgF|#pt&9!00B71uiU0rr literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita new file mode 100644 index 0000000000000000000000000000000000000000..95f56456e5264b11295251f941115a9b877a64e8 GIT binary patch literal 1257 zcmWHE%1kq2zyRC~3=AL)l5l~t1sWI_7#80CxnS$!qYR?z!3AOx?GMB`+CGT?+?^ot za#w-mt#=Qk&e#`7@9~)+v&MFU>>Rxbay{}BbDC96sP>lXGLCO2^1ZC?h6I8U1 zPEeKJHbISh`2=;A%L3|OjtFQxIjo>rk*%P4Wto81k?8{3TRH@EmQ)JpPRSC`Yl#-n zFYysDNU;?#jLn!}ROCFt*w$-;Ns#IUQ(2t}W=8B2%>MFCu#i>}u(r?^fB(11bPz!GE_10xuKnNWh1c>V#^^Z)<<|DgB=(V#d734`JtM1$fUM1$fV zO#j>s_6H~(fcT)a0HQ(Z0Yrn+1c(Nu3lI%T8z35#K0q`mjeuxSIswt3v;v|*=>FGmDGG$<{BXi$0r(^r;(#X;!`#0RA<5DiLSAR3g$ zKr|?wfoM=#1JR)L2BJY}4n%{}9f$^{JrE5_e;^u^20=6^9fIksZ4eDg-yj;4#z8bFor7plS_jdf^bVpyX&yumwRF#A MqitYmr)$Xt0Jfe7;s5{u literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan new file mode 100644 index 0000000000000000000000000000000000000000..15b358f2f4ddec8b2543f883ada86d2aa3771136 GIT binary patch literal 991 zcmWHE%1kq2zyRzF3=AL)k}!p`MH(0w7}_pB*Wl;AGeP3zi3Z7A?;c2V*IApEIwLH+;#{}~vWSeS{2Osq_-OiT<6*%6?S zNh)AqVPGg|VBlb2sGGpR!@$t9fKdR%X5@j0`}l@1Xd9R_Xd75CXd75EXd4=UG$LVA zBH#y9-~a#r|AQg|#05nLhz3Onhz3Ophz3Orhz3Othz3Ovhz3Oxhz3Ozhz3O#hz3O% zhz3O(hz3O*hz3O-hz3Ohz3O@hz3O_nEtZ-1BeDiDu@O}EQkh0E{Fz2Fo*_4 zGKdC6G>8U8Hi!mAIEV&CI*0~EJctHGK8OY-01ypI1Rxre5I{62F@R`Lf&kH=L;<2f z2?Iof5(kI|B@hq|N+ci}lu$r4D6xQOP=W!`phN?rK?w&$gAxyj1|=X64N62H8kCU0 a^w*jNAR3gQK=hzUR9rUN1{QX@7F+9HMK%1ptvMSX}@B literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking new file mode 100644 index 0000000000000000000000000000000000000000..dbd132f2b0bcc8beab08e04b182751795c853127 GIT binary patch literal 414 zcmWHE%1kq2zyQn)3=AL)k`RQlc^ViP7*516Hk|mSUU2d%U&E=}Q6J=XnK8&`))y$$ zWi%*yCKf2gc{M0&Iv1$8r!%Mu#eYy!_heA}9HMK%1ptvMSX}@B literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo new file mode 100644 index 0000000000000000000000000000000000000000..28fe4307d75db1d500d815b4269cfd82de7cbfe7 GIT binary patch literal 413 zcmWHE%1kq2zyKT!3=AL)lHi20B^nqQ7~1FVl{prkHDB z!k}$nW^BNqZD0x}%^0)|%t2b=my&7K_9pEFoyGANbZ5Ii(CeuQ(66aZFvwkh!7!d7!6?Aw zg0bDB1QWxI08_am31&jGFPJmUdSL$fe1OGM`3IKQLISLg1t(Z#j48h0-t=i|(=nSE0WFZaiiW+_mfi+`k4VcybqB@I3wN zf!8ah0Pn5h2|g#E1o%$*nc%nbSb%@Y?Sz2N6#;=EdlP~(y8?nu<|l*%ExQmZ(wGot z)Nvu~OL9VlP}YTryY&wuKlxmU+MDl-$2c)sSNJy938j$|;-h3f@X3TU>r2Kdl=wshl=2xpDATbDD0?UJpn^vxpyIk= zLgnj!0ae?D6RJ-?2&kF%HKBIPp9^(m*Awce+`GWQ#5gD+1A`I=C?jYYFtRW($S5#y z`uK)0xVi>|h!Btr0|Nso8R-X9&;S4b|AR6Vhz4aU5Dm&$AR3gpKr|?WfoM=B1JR(2 z2BJZk4Mc-79Eb*GIuH%Ycpw^-`9L%%1A=H!CIr!-j0mDZnGsC?H~RphL75UvKim!G zgEA+G56Yk*8k9*vG$^Bj=zpNh3SxjVEXY6eOh6Ty z%FG}dl%YX1C{u&!x4%AsXfD=v5CzWQAO#K?MVd1{Dq<8dN}lXiy;mqCo`(hz1oF zAR1I)fa!114?r}i-~iE}!UIHu3J?$tDnvjus2~B+puz-1g9;Q74JuSXG^k(!(V)Tw zM1u+#5DhA1Ks2bJ0nwns21J7j91smEbinlI^8p|lRQP~sPyqy@L4^>A1{Fjg8dMm8 zXi$L!qCtfchz1o*AR1ISfoM{DR3I8uSb=Czfd!&Lg%*eg6SfoM>H2BJZQ8i)oJY#%N zP=N=cL4_WO1{Hi@`b#p{eoz4j;)4o75Dh8_K{Ti^1ks=Z5k!LuMGy@t7(q0sa0Jny z0un@n3P}(RDkwoTsIUalpaK&_g9=R$4JtT6G^p?d(VzkpOg}vZb`Pi^1@S?JDToFY zs300tsDfxv!3v^5g)4{#6|f*0RLFv8P(cf#L4_@d1{Js<8dT_lXi&imqCtf(hz1qF zVEUa1IQ&5cF^CT;j6pQ0KnBsELK#GZ3T6-uDx5(ysDK91ph6l%5BY+c%hfeR*9cU4 U>-ZY$nd+J98|e5N8bDZF07{6dV*mgE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka new file mode 100644 index 0000000000000000000000000000000000000000..98881f093ae76753e8757dc3fa50fcf7fd1f8b63 GIT binary patch literal 370 zcmWHE%1kq2zyNFv3=AL)lHh={Wf~Y57*5@8+i-@pP~yx~qZM~oT$rkHDB z!k}$nW^BNqZD0x}%^0)|%t2b=m}G|NnoGtsoj?Ge{U@ WJBS9k07R4K3N9OM14}zyOD+H*5->Xe literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai new file mode 100644 index 0000000000000000000000000000000000000000..c12f31a141db7e6e02f7274e114c1cd6be2ff1e6 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7#4n-xuX96|Njh(j0_CMH$d_h4h$?lz99_S k1|}db11U!S0PA32`2YX^e~{52E&=1YY_ttb>~u}I08rZ<9RL6T literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe new file mode 100644 index 0000000000000000000000000000000000000000..67c772b4d9d711dba166b802bfc5e1f64ae004da GIT binary patch literal 621 zcmWHE%1kq2zyKT!3=AL)l8}P31sWI_7*p=|Nm!TWM+au7FHz4#?H>b-~e(2gIfRt3j;$^ z0V4+kLr4Mx4~&F~F!C^f)%f^^FlZZ?GH4r^GiV!_fqcWj$jHbDW-u@?kmCCvP)+~; z|NjpP1rQAi36L--G(a>cL_jnsRKWDlrxQRlD0DzHD1<;XD3m}nD5O9%D6~K{D8xWC zDAYhSDC9siDD*%yC2SVX|A6c6qzl}?QXcT^I~KsZ#4>@e z>){3d7U=|mQvVBr$$t}sf*%A3`$|3#F+LO^s(dg(On6CvIP>BJ@y~4m5|3LGBrj(K zNF7d3klxdBL1s}Juow>5HR~&FJK`(WrD@sL;=g+WfQFSIty6ej+kJxEPjIR zZmS7)ZH^P{XUj}*NK>BR*kUQ*TJZD0PkNbpB zalZ*+I+_#0z8g#kzfgZ6@~ehG)V41ZqOWoZ#4HdLh~4r=Ag=ziK>U<*0txX~1rlpt zO-QoeE|461WKY6pLKw6Sj6u2>85tNE7#KhlDe3(ONG}5e z!~g&P|AW#!hzm;lAR3hZK{O~2fM`%Y0MVel0HQ(p0YroH1c(OZ3lI&;8z35#KR`4n zkAP@UJ^|67yaJ*@`2|FS@(h^%+!g?$B_6jXfM`(u0nwm51foIt2tDkXi&Zc(V)BuqCxo+M1%4uhz8|T5Dm(!AR3fkK{P1Of@n~_ z1=D})1wb??|AOheiC{h`AA|UyybPj2`58om@-&DB z35W)jCmR$}&_tgO6n zu_fWbrLL0&ms2-1T*-cL;e}ap!iz7u0k61sCcL_uaN+fvUmxCV&1HCdzW&3z>7N+h zZ`fS$p;EQsEXwQw+a; zT7LMg?i9dL)BS+s?}iJU-(DqfEi=9#v+u_P+0Ks_y%N1Jt%?1K91^A9u*Fb8N}d6S^EQvQPW?$if5os1WBXS+Yp zi(eU_U#Fzf#Oz+5ab!Gg^t zz~X=H1Izab7p(5bKd?UUbiro7;{)6EDi`eLD?hOBXS?7~&-%bIrtyJO-17&{j@v)D z=q^ie75W?C#&`39+l%}H_csy`Jhls7@I3wNf!6|?1n;$ab9@r_UhtjrbB>?sp#cAq z+X(^D6CVVI>`e%ASr8CxGCv{2GbbQa^wNVcO}~J!uZKQF2%k!bxVq#+TaYdz z@*w^0`+|($-yUQh=l+oOR5&4f+1n2}N4_THww?cwx8!<4e%i(l1uZ)h3f(4uC`y@~ zP^?z^p~R&&p_G48L7DE%2W9U|3MzQ3A5@$VE2w-M`=DyQMM3ph`v*1sQU$eZ6(7`9 zn0=_9W|zRkh##^r%9S7*lrupzD0hNrP!0vrpj--~K{*vfgK{f~2IW`~4a&738kBQEG${9i z>Hn@^e}Zx`h!4uiAR3gLK{O~wgMtH;tHJc&4HrN(D0hQsP!0#tpj-~3K{*{ngK|5F z2IY7V4a)T(8kF-vG${9jXiy0NqCuqqhz6AeAR1H}faz<`!1jSk1rQ%pGJt4M=>VcZ zB?O2Dl@cHtR8oLwP-y|8K_v!=29+8h8dP$C>F4YZKs2ZX0nwmR1Vn>M5)ch4O+YlL zL;=yDQUy$Re+KIVl`bGYsDuI2|7*eGpppi}2bDG;8dTzdXi%vGqCq7Ohz6BDAR1Hx zfoM=E1foGD5r_trMj#qgB7ta7sRW`yB@>7Sl}=##MScN@29;7E8dOq&Xi#YdqCq7V zhz6BfAR1J1foM?a1)@PE7>EXyVjvn+l7VPYX$GP}B^rnZm1-awRI-6+Q0WGuK_wiR z{(9&Ghz6B(VEXD3FdtOnf%u?O4@84XJ`fEm{XjIR1O(BbQV>LgNHH8dS1^Xi(`2qCq7rhz6CiAR1KCg6a1qVE2GZTo4~r z>Vjxc$qS-Er7wsEmB1hxR0@M=P)Q7;L8UQ>29?MRgo;d@1u`?sATE-*TwOzSjX9HMK%1ptvMSX}@B literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron new file mode 100644 index 0000000000000000000000000000000000000000..a2e1b364f9b50814468b5bf76290bfeec2bac37c GIT binary patch literal 2323 zcmWHE%1kq2zyNFv3=AL)l9&u-i#9MYFr0|o^x(|Xg8^sP{9`zG?8}Ao{b>&_tgO6n zu_fWbrLL0&ms2-1T*-cL;e}ap!iz7u0k61sCcL_uaN+fvUmxCV&1HCdzW&3z>7N+h zZ`fS$p;EQsEXwQw+a; zT7LMg?i9dL)BS+s?}iJU-(DqfEi=9#v+u_P+0Ks_y%N1Jt%?1K91^A9u*Fb8N}d6S^EQvQPW?$if5os1WBXS+Yp zi(eU_U#Fzf#Oz+5ab!Gg^t zz~X=H1Izab7p(5bKd?UUbiro7;{)6EDi`eLD?hOBXS?7~&-%bIrtyJO-17&{j@v)D z=q^ie75W?C#&`39+l%}H_csy`Ja)4Mc%J_Cz-xg`g7@k>4}22$UhtjrbB>?sp#Z-a z?gxG?cLMxNZYKmpPkayDX8GBeo%2ftf2C3?1QTH76sL3?H|%D1U-zP#y)*pnM9VL3tHKgYqkg2IW~04a&D58kBcIG${Xq zXiy#o(V%<`rvJNw{Rzs?AU-HhgJ@8`2GO9r4GIoW{sz;3H(UVGpnMLZL3tfSgYr9w z2IYAW4a)Z*8kF}zG${XrXiymdqCw>Vhz6AfAR1I2fM`&e0HQ(V0+_z`3~V2$d;sx5 zWdw)@l@lNuR91j!PEXyV;~w-mVxOQZm|17Wg3VND%U_XsB8n#pz;kwgUUD% z4JzkAG^nft(V+4UM1#saF#Yw=2M`S^`@r(hz6CFAR1I&f@n~g38w$?g2M$=c7phz@)JaZ%1{su zDn~&ys4NB1pz;(%gUVD84JubbG^lI^(V+4bM1#s$5DhA4K{TkW1<|1L7DR)}To4T^ zcR@6$>;=>BOTg{{mBAo>#rZHWA5<2D_@MF_M1#s?5DhAqK{Tjr2GOAM8AOB1Xa+)s oD9$39nPpHH(p;{tA-YDOa$LvPSkFYyOy5w)*U&)E6vW~J0AbJlkN^Mx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh new file mode 100644 index 0000000000000000000000000000000000000000..92642679c8f9e68c125a8c6fa740ebf61df82417 GIT binary patch literal 389 zcmWHE%1kq2zyNFv3=AL)lHi82MH?6x7&>~K8zwH+<~nQotl?thxq?g9b|0=9?G|{l z?McI1{TU2gw#OOj|NsBbz{teR!oA^95v3j;$^0RtxkLqP)rF9So} z1O`Efh>vdwLjZ`-HZW(3P;0QvW1Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong new file mode 100644 index 0000000000000000000000000000000000000000..dc9058e4b578ca8c9bb954af1bbe26a964eaf408 GIT binary patch literal 1189 zcmWHE%1kq2zyPca3=AL)l5m5v1sfO`7+N!W8+s}$Zv3>|af^>_#jTstJ8r*yvEt5-zdP=pJ+d9iKW3G(J0Au=tW8r14c@lf^gp zFB;!f>nwhVCTjd-O|ba+)mh`$Qzwhx_u^OlITyF%?>@&B|JFI|_&-m11w)_G4#qmx z6-;?7JD6jiuVC?gwu9B3MT5(5ml(axJD0zWsP!a>tpkxN3K}iingOVGF1|>NV4N7((8kF=vG${Fj>95Wj zAR3emLG@Yzxy1)d~mV^34oF&D8BlXc7P~Q5(UwqWD24|Nfktck}HS? zC0P&+O12=HUG13$m~OVU0MVRmC%}AAG6wNMNf|_gk~4?~C20^1O4cBH5F~9b5AP6N G3oZaPoDeGj literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd new file mode 100644 index 0000000000000000000000000000000000000000..f367a550ff9affc140c118081917effaa31d1f13 GIT binary patch literal 921 zcmWHE%1kq2zyK@^3=AL)k}!d?1sWI_7}_rXnZnQgYJtSdYZD}Ib2CVtiJl<6$F4zU zjqL>4ISLJOJ@OOeYnU1oau_ElMn7p#@_sx)+4@+6iuTb7s?sYO)VP;VP-i*Hp#J5E zfX0*M44PM#31}VZWYFHyA)vD)n?ZL!9207Qer8$^S` z97Kb{9Ylk|9z=t}A4G%V07Qf00Yro10z`x214M)31Vn@41w@1521JA62SkJ72twGxc8<*gxgOmG@-=b`6ms|%D8?`>Q1bq`K-v1y0u}Ac z3sj|#EKuX#xAs;vsH&a)P{v8F4y zE7vS=f7iUglR0jI=eg7cUXL9Xc&~F`;BzKc!M9IyL5TNtf%^ad|1&bNFhd|K8xmya zK;j@vptCtySs54-4}!us@gM^W14B{)0|x^`-2_G+28MzL1_2le6JZoUr~yR{Oq@Z$ z$2Ww*(>H`c+rXSb+rW}R+rR>3ECT~01VA_tl8ESbfkpQZh!%$b|Ns9F+ty?cqCwFQ zqCrUjBn?UiAR3euKr|>hfa#wn3qUj|S%7Fz(g4w*pyUIhK}iTigOU-51|=mB4N6WR8kD5K^p{HtAR3gkKr|?Mf$1w- zz~Z1}2I7N~8i)oZHxLa_9Xq>49ia@&nPJBnYBG$q+K{O}{gJ@7P z2GO9T45C5F8AOAUG>8TzYY+`e+8`Q~yutLlX0ZLBWDeqkk~)Y6C3g@FO7b8YlJMDqZbjkbY>ovsBJ0J=gHasU7T literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul new file mode 100644 index 0000000000000000000000000000000000000000..9a53b3a39063e86859b12aa755b78cfb38a26709 GIT binary patch literal 2166 zcmWHE%1kq2zyRC~3=AL)l4ypqB^wwR7$$UooiUq7JYn|LeHRv`CO=qQ-4w9IuOVTn z{gw;MRMj6WSFgXYN<$-I)x*CRR{!jLu;#E~z=`^I2`By^yl~R%Yr?5>4FRW5uS+=d z^kBfn!q*QjWpf5xUSyeY#hEGKst@mjYns&;u4})4aDy}U!cC^>2{&KbU%2&tMZ)b% zF#&h3Tu8XPx&Ok)FFO-HrR=)!HG?hTo4myZh6TGGFlKMQz|=730kiki3oMyC6Ie|) z1+e8!E?~D@(ZK$@lz~%n*#genRu8y7uwUR2IG4b4Qzd|RiDd%cvWWrwEz$`BZN&jX z=`#)p`)1F%@YE{yCwwXq)rI7*e4L;<31r&+;2jd-Mk55-wh^&pVteh|Ns9# zBQp~@kcAZnnV8wwiG|D@oEVUmm4QK81C&0cGZj;uz@fI-y9H-y2{H-y2}H5f#MFlZZ?FlZYXgG^;$U|?iqWP~z790nrtN(%!d z-$?#|YW)BI|NpRUCvJdfP~HL2p!@@-ukO15qCxoxM1%4Yhz8{+5Dm&xAR3gfKr|?C zfoM?v0@Dxwg7t&)8Hf+cYakkw-@x?$gJ5}3z60?=c@IQ`@*ju>GNDKs2Zv0MVeb07Qez0}u@=6F@YmTmaFavH?Vc$_Ee) zDkDHNsGI=Npt1r)gUSmK4JtFh^qnaOKs2cA0MVfG14M($5D*P2M?f^FECJD=@&rVK z$`lX{Dpx?XijL$55Dh9{K(re7Z!jNJ&Vcx!vIazh${P?3Dsw zsLTS%0>_kDjz{KsEh>BpmGvKgUU(}4Jt1|G^or3)87pyfM`(J38F#eC&NfA OK)GzR4UFw{jky3o@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta new file mode 100644 index 0000000000000000000000000000000000000000..37b4edded8bcd470f1afeab00ad16b6b1090ebd3 GIT binary patch literal 392 zcmWHE%1kq2zyRzF3=AL)lHh={6&e^A7*7;AU1pqU&U(^5q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura new file mode 100644 index 0000000000000000000000000000000000000000..39ddc84363768c6b407df1077f69ba9dfca8494c GIT binary patch literal 251 zcmWHE%1kq2zyK@^3=AL)k^s>lEY!fjz_3f~;EW3qJ3oBcx+sHzk%^gsq4@d_x$t4J<*}*nlD2GX$gvj7hQa2UrIK!~g&P|ATA>(IDGFH2E&z L3ik}rwd4W-l$&_ ztgO6nu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP> zoeB@`KImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE z|7Upd!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nI`W zJy2GN4N!?PNKj?44^ZQN`#|m5vkU64&p*&Oz#O1?GHSJ@Lv6s!Ka7wgYQ()2EX>%1^y-98v^2-J_Lr` zYzWHnEC@E)-4NoVT@WfVw;@c2w;=3GeM5w(=7)$Yi4Booxj#g0ac+pd^7cc_+ysW$ zE$2VP)jBc6Puch(Ay$PUvG!a+k}VrUa_okJ6qy$cskV~}(%4uU(q&5u(w{zS$oLyp zka_e(L)Kl3g6yTM8gh<>e8_F>X~yS)WfYris7pPOG$GhMKuc3opZUD@Y``o81>MrI~B zWI-?oip9X72u|J#KNwgT7_ zAR3gE1JR&72ckjw4ou&dKLDaZ`42>c@*s!?z!Xi(k+(V+YZqCt5SM1%4vhz8|V5Dm(&AR3fsK{P1ef@o0Q1<|1V3!*`J7)-zL zzW@pjP+kVpe>Z^npgaxYgYq?q2IXxK4a(mj8kEODG$@~gXi#1U(V+YeqCt5cM1%4@ zhz8|-5Dm)zAR1H#faz<`!1jU40uUcm9)M_2nE;|ebhz6A%AR1JDfM`$|0;WGM3jooevII<@XDk5GpfUwSgUS^U z4JuneG^l(5(V#L0M1#s15DhA8Ks2bl0nwl`2SkI)9S{vFdq6a(`~lIRG6+P2${`R9 zDvQAMo8%858dN5MXi&KXqCsU7hz6BUAR1IgfoM=U1)@P^6^I6vS0EZxW`Sr>xdoy@ zWfzDBm0utlREB|QP&o#oL1h_;29;-E`b#~iieUhiYal+TYy;7t@(o0T$~X`WD(65n zsH_9gpz;nxgUUP*4J!9QG^p$Y(V+4VM1#se5Dh8^K{Ti=1ks@K5JZE@L=X)s7s2$? zXJGe$%100%R7QemP&o;rL1iU~29=i}8dPS2Xi&KcqCsURhz6CPAR1JLf@n}V3Zg+} zDToG@ryv?srh;ftxeBJ=8G;Rrg{ck06OE;!Tl%-6ucz;NN`b%*-@|Nk>GF)=VWJOIgCI54m}G|NsBYwpj~6G{{1bFvwB{qHX1}(KawK NHn7t*u`)K`0sxX!C!YWS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka new file mode 100644 index 0000000000000000000000000000000000000000..fab27defad0cacc1110a5f513671def88583e0e9 GIT binary patch literal 1198 zcmWHE%1kq2zyO>K3=AL)l5m2u1sWI_7?uZ3JF<20tP7&*nhs(Tu^YrWVh)J^oM<5N za)N{8ts@(x&WJil?@>ySStFbvJBKAfuKR0(eD$*gh3xAIiqR($l)QH)C|j>eP|=>9 zpeo&ypvGOBpw6=5f%=!34>X?4_@G(g@ImuR^#iRVIS;hA#6Hkj;`cyziv0t<7J~=+ zC5jIWQiL8D#@Zzq6-g!-+bSfO1pZDim1RmWGrXH%_UB20h1Aan7I%&%SpK^Gz-rHm z1nXOSAJ{BC^1yc2{0DZe%O2RzYJA|3+VQ}#d0v8(Yt{qjXJBMzfF$|(Xu?(hvPBZ|~px6e{ zpcn_ypjZddpqK~Ipx6h|pcDY2L8$;lgHi&B2BiiN4N4Ip8k8zPG$>_&Xi(|^(V!Fp zqCu$yM1xWanEo>J0f+{r7!VCgHDLNmHCP;!dO&>$ zN>v~ll(IlHD0P8oPznRlpi~B;K`9MHgHjuq{_`XOM1xWtn7(ri%m<}D5FeBRK{O~8 zf@n}m1ks?>2%ln%a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi new file mode 100644 index 0000000000000000000000000000000000000000..b7dcaab8f2068adbf69cae0b1cd80f98e7a2da13 GIT binary patch literal 417 zcmWHE%1kq2zyNFv3=AL)lHh@|Wg8e67&`0zEIBjPXvL)xp&55qJXpcxzuLfNz3T?s z`5Fs692XdPa=S0^d~(;o>rJ%+10xe7Gb;-iGBDWP0U72S!N9`65S_uu#lYYez#zcD z5R$+s0%lA4_=YfO8<-j!FlZZ?fk{(_0Po-sh5+vnkX|?@#nC^Yy8i$F{~zRd5DoGG whz5BAM1wp6QU>x2hz5BGM1wp9qCp-5(IC%(=_hv$Kr~G~$ra!oqHD?p0O>+i)Bpeg literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar new file mode 100644 index 0000000000000000000000000000000000000000..b44a1e19e9b1212585e55bd65be77665f4ecf6b9 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7&iRdl~Vuz|9=KXMh1o;8IXKP0t1VWZwQ07 kff>Rxbay{}BbDC96sP>lXGLCO2^1ZC?h6I8U1 zPEeKJHbISh`2=;A%L3|OjtFQxIjo>rk*%P4Wto81k?8{3TRH@EmQ)JpPRSC`Yl#-n zFYysDNU;?#jLn!}ROCFt*w$-;Ns#IUQ(2t}W=8B2%>MFCu#i>}u(sQbH39_*xagZfgS-3bjks&uH3kw57y(lQ83mO<$7#MmMFmf<3)J6iol+n*gFg2^CD=`2gmF5-f-hO0*yvlyE^bDDi@5Pyz&o6kH#6+LWwg|jaFPL5t_ls#LUFZ z#J~`A0i@j94W!dIf`Nm9Av%MR$HO;-!Phs0!8167LEFI0*Z`ymjB(h_%D}(?!XPyq zP`20)5RZX@;s5{t|J8O$Xn<(v=dTSwG{{XL8sshz4RRZpo@%rLM1$POz{teR!py?V szz}o;WK_@vkSo32K(6$SVBi6}RlvtLgaNmE85p=cgF|#pt&9!00B71uiU0rr literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk new file mode 100644 index 0000000000000000000000000000000000000000..faec35d30403b70fccff6de6a523af81467036b8 GIT binary patch literal 1243 zcmWHE%1kq2zyRC~3=AL)l5mEy1sWI_7#9BI{j_!QLj_Uw{0U+bOBlpC77K{~yxt)3 z^4bK++uRINXQC%a@5$I8vnFzb>>RHRay`}?kW*pyd63gR=F94Jz6X zH>gTq+MvdLc!N62djs_^4-7P(+;`BdXm`-Oa>zjI$YulWElUh^mP|F!oziBY*HUhv zUy@;9kP>NN7~8VJs3?Aev2EH0lOV?prm`Lz%#4&bnEln-U?J^bU~!jcgXM1}1FJpn zHdx*)yW2~&MP*!v6dRR zD|c;he>ZW1Cv(mQ&vV5aydL{)@Lm_X!RJi2fp4Grh7j+k3ibd0|7T!iW`aN#RwT&A zj>JKhKxcEXurM%$^MS%QB!Pj2fuW#*k%NIDsepk8M#4lGc^DXAY8W_>Rr>gbFlZZ? zF=!iDFlZZ?gA8L}ga9xbLXZ;0KOkBd{{R2~9~9Lf8Wi0iVNjHVXi&6+Xi(IH>7Um@ zDT4u&1VDUHG62z_qyVBp$pJ)zk_3nbB?}M@N*W*Rf$1xUz~Z1J1>%E}6^I5UEf5V#ULYEj z#6UDCnSp3fQUlSTACx3P zd{D9k(V(OWqCv?MM1ztjhz2E75DiMIAR3fhK{P1If@n~(1<|0S3!*{E7es@SFo*^v zV-O8W%3%84M6ms!Bn{$&k~N41C2bH5O5PwEl*B+v%Ef F0RYPR3j_cF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur new file mode 100644 index 0000000000000000000000000000000000000000..5c95ebcdc377086c8c646e251569792fe3602c4d GIT binary patch literal 424 zcmWHE%1kq2zyKT!3=AL)lHi206&e^A7}}a!7w<~NP1u$0-m$-0y41Z=YZ?w-T@Y~C z?g7K$ZI>?`RS<4CI)gpnIHNnm@k*-;Cmx?+I2pbF!l@(w8&2DN4mdqAg5i=!?uYvS z|Nk>EGBcq-7G`D!hV%lErI{5BEDQ{#28>(`3_l z0}CTC$)Igu3DO3~r18IZh|0RxMVZwQ07 kfiZ~7K#Gw+z&aQh{{R2~A7nI$OTc(88*Kw)J6&Tg0DqDi!2kdN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao new file mode 100644 index 0000000000000000000000000000000000000000..2c20a32651d9da10d1d6f63495c3cf1fd55c7f16 GIT binary patch literal 771 zcmWHE%1kq2zyK@^3=AL)lF)*(c^ViP7$!ZFV|ZVFamR-hei|RcH}Ck=VW9EZJf-1F zhLFZrg-sUU+`njiXGmuFp}yq9Pu2vBpI@Cdem!-v_nU-wlfOYbf-74t8MwfA-08qlkJ2C=eOe)T+dc% za9>+#!E>xfgLhlE1>dqf4gP613<7O(9|X(f7=-ez3xwmX8bthM3mBLgnTUf73|TcG zFV;<9WMN<^Xkg%gkUqX449+eg49>wJAZbPh1_nk_Lh1)d7Xt&s|NsC0gF*~MgF+2N zgF+5OgF+8PgF+BQgF+ERgF+HSgF+KTgF+NUgF+QVgF+TWgF+Wfe|6RX(V$QU(V&n9 z(V)-<(SP?jt^m>CPzNzUArEq2pVAHx1&RR>4T=R24T=d64T=pA4T=#E4T=>I4T>2M z4T>EQ&B=B`15AHAZULe}F$JPQu?3<*F$SVRu?C_+F$bbSu?M0-F$khTu?V6;F$tnU Ru?eDS7o%Lx!6CX9TmXGx@kRgu literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau new file mode 100644 index 0000000000000000000000000000000000000000..2c20a32651d9da10d1d6f63495c3cf1fd55c7f16 GIT binary patch literal 771 zcmWHE%1kq2zyK@^3=AL)lF)*(c^ViP7$!ZFV|ZVFamR-hei|RcH}Ck=VW9EZJf-1F zhLFZrg-sUU+`njiXGmuFp}yq9Pu2vBpI@Cdem!-v_nU-wlfOYbf-74t8MwfA-08qlkJ2C=eOe)T+dc% za9>+#!E>xfgLhlE1>dqf4gP613<7O(9|X(f7=-ez3xwmX8bthM3mBLgnTUf73|TcG zFV;<9WMN<^Xkg%gkUqX449+eg49>wJAZbPh1_nk_Lh1)d7Xt&s|NsC0gF*~MgF+2N zgF+5OgF+8PgF+BQgF+ERgF+HSgF+KTgF+NUgF+QVgF+TWgF+Wfe|6RX(V$QU(V&n9 z(V)-<(SP?jt^m>CPzNzUArEq2pVAHx1&RR>4T=R24T=d64T=pA4T=#E4T=>I4T>2M z4T>EQ&B=B`15AHAZULe}F$JPQu?3<*F$SVRu?C_+F$bbSu?M0-F$khTu?V6;F$tnU Ru?eDS7o%Lx!6CX9TmXGx@kRgu literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan new file mode 100644 index 0000000000000000000000000000000000000000..2db063560c48c67f0280212a320b183d49d8cffd GIT binary patch literal 1258 zcmWHE%1kq2zyRC~3=AL)l5l~t1sWI_7*;vK)Sr^2A&UcV_ zIWIu+)};edXOsh^_ZSq&tWhkGog-8r*TY;OU;U*(A^T~8V)V5FCGX<}%GNsyRJ2zX zs7lW&P~+|{P-ofpLH*0}4;oLFGiX-$GiYAv{GfHD>Vx){><>CiVm|0j@%^CJV)sG6 zME`?9ioyrOSf2u;BJ~1eTfG94AkG3)S%CsG!`B67e?AphNV9*ixO1hz^4H4`R(rM; zSl>GR!Di{D54OA3ez0rZ^1*&q{|ATEX&)S$*AzIpR(xU1WhLvq^#HIqL$i$6^KE>tqXj&KQ00?fqX6;=SfUxbz%``v3p`GcYnUK_Ck& z5@cgX;vh?)vpLvVSQr?36F`C7vw(qxfnmh~Mh*ssSsNI5U?fb0k%xf+riOt7S*4F} z2!pnv0fV-o5rej&A;>TWMhF12Ap|M$`~#we;s5{t|3UE$qCs&E5(dRPhz7+yhz7+! znEpB60Yrn+0f+{r1rQBN4lEZV@pz_9RB?1WunS0|kAkZrgW_O5_|k%^gwfg%3` zNM-&91{MZ}f(8Z-28Ox`3_M`AfRAqogRgH0gSLSMgSLSsL%3&%BSJd9XUteZ;`PWut9i JVW(@s1pp+`WC#EN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat new file mode 100644 index 0000000000000000000000000000000000000000..c12f31a141db7e6e02f7274e114c1cd6be2ff1e6 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7#4n-xuX96|Njh(j0_CMH$d_h4h$?lz99_S k1|}db11U!S0PA32`2YX^e~{52E&=1YY_ttb>~u}I08rZ<9RL6T literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia new file mode 100644 index 0000000000000000000000000000000000000000..3e663b215327d8899a4b3fbe4623f066630b97b2 GIT binary patch literal 2016 zcmWHE%1kq2zyPca3=AL)l4yXkc|nY&<#IbX->!eab$8MQ?q4Ync=jC&;9X*wz}NNg z0)LBif?#+BtV>baf0~gwg8F8tqGEsGXkUz zrzc47X}KV?rul*FoU{vaJ*f}mYdkI}1Q2)x6pz-8wfaaAq30g4|5+e@$~l3A_^Sem zwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2kp5!&gp9vM6EaU!PRP0&G9i0K^n{#a zg#x)9wiEJ}1q(~4PkI~4F(Y*AXSWv3=9m6jHD#+A0T}U3=IGO|Njq4=pZgAv4dz( zf(Ox{L=U1t2_Hm*5O z2% zK{P0{gJ@8O2h;DKf$axnd=MX$`9UK3=AL)l5m2u1sWI_7*I_hf94SrfTIc8=EuxgP5c@-;de6mn!YD8}$@Q1br2LD~Al1{Ljx z8&st)ZBXMryg{Aiy@C3d2L>8X?mK8!v^!{CIb@)9WV3HU^u#k2zu(->!!Sc6~fz_UO z8?0}$7}zZ1Hn83G%)qYot%3cl69x{c=M5a2pKNe)-Du#Pd~Ab@>SO~~=M@{=SW6Au zmAf{$zni$hlR0OD=egnyUXT4Yc&`iH;B%(Z!MD%#K>h#!{}~vWnIMpb6$!GjBXN)= zP}ywkEG!HRfd@cA8KN2pi}{(K`8@7gHi{G z2Bi=X4N4^-8kADN^p^()AR3fnKr|@TfaxoTz~Z3P1LA{H5Qqk)A`lHqNgx`Onm{xt zMS*BgsshoVlm((esS8AdQW%H^r7{o=N@*Y(l-j`bU#$%w8kFk5^j#h>AC&q)d{7Dm z(V$caqCqJUM1xWzhz6xd5DiL|AR3f1K{P0Jf@n|*1<{~X3Zg+N6-0wlD~JZASP%_L wwP5<)M6ms!)C=N+QZR@HrD6~bO35G^l$t>_C`E(l!JVqPY_tu`?R3q#0L%*mq5uE@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk new file mode 100644 index 0000000000000000000000000000000000000000..a5d39dffc110700f3f423b7ddd2f525dc09b50bc GIT binary patch literal 1255 zcmWHE%1kq2zyMqf3=AL)l5mBx1sWI_7#7}^RN1=tp@OJ-{sb|JB@E&miv`4gUT=_i zd2NE^ZEgmsGtm>I_hf94SrfTIc8=EuxgP5c@-;de6mn!YD8}$@Q1br2LD~Al1{Ljx z8&st)ZBXMryg{Aiy@C3d2L>8X?mK8!v^!{CIb@)9WV3IIbeNT$iZfrq=W6QFAjFCza8vnU2||qz3brE{ON#`>wX94fcLuO13qUe9en#-4}^GsHVB`5=0N@b|Nj{n znVBGvg%t_1v4c1q>}&)f3p)!71B34#P)LU)Ft9K%6f`h$Ffb$)Fz~=gm z4N4>+8kA5#G$^rvXi$Oy(V#>FqCp7P8H@k` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk new file mode 100644 index 0000000000000000000000000000000000000000..5e0d9b67a3ee9bf444359b006b2da687604ef190 GIT binary patch literal 1243 zcmWHE%1kq2zyRC~3=AL)l5mEy1sWI_7#41J*tT`?djnDR+67_~n*_u;HY$k!d^$nm z<&y=HwQsY<${COk%JD}TQ)i9ELrTJJ7tQ4UQ4Tk zeo2{wK}x!VVeF&>Mn$;?jBQH}m<0JBFqI8EU}j`^!0fNZ0SjqA2aCH>2P}UZI9ToZ zbHMtxkb})KNeA0qUmWaOe>>REy5``Jde_0R`O^U>*ZmI8$yW}zs4jGHb>4QsjkVdq zU3ta<_jmITcrsTV@I2Re!0U0$0q=Fm2Yk*{I{5av9tiRNY*7FI|9=KXW+n(^VMT&$ z>_{AB33N6G3kw5-%PCO!x&<(>Ffb$)Fmf<3gd{NVz(|+~BM$=uObr7EvPvJ{5C&}n zQwD7Va|Ue#Gmv2nj1T~3LkLo$_yx>eOC(12PH`m zACxRXG$?6;Xi)M5(V!#>qCv?NM1ztlhz2EB5DiMQAR3fxK{P1of@o0k1<{}+45C5F z7(|1TGMIihA8bD;NrU*HWDTN0NgG6ik~fG3C2j*KpyVTcLD`1qf{OOv z3#!t89;k7@eW1=NnV|laD?#JQ?*z??#R-~M?geNaxtpN9n93GCFf;OfVD>lUfrWHdg2i342bRBm60G)0 zJg~m4mteEZG{JVaK!RPHc!K?`PYDjGKNB2V_#V{%|NozXk%^gwnTeT+nUxI+**QRv z6+~dgtgH+S1}dPC(K29QVPJ3zVBlb22uWb%0g((ms3L9wj2sLM77h#o5OE*h5C&}n zV+L&lQwD7VGX`w~6Od6142&QEVS-3fBIXB30|NuY|NsC0gCYn-gCYqe42mca4T>xf z4T>-@{qyqz5Dkhr5Dkhv5Dkhz5Dkh%5Dkh*5Dkh<5Dkh@5Dkh{5Dki05Dki45Dki8 z5DkiC5DkiG5DkiK5DkiO5DkiSF#VM)0Yrl$A4G!^0GPgVF91Y?5(0<@B?b@;N)R9# zlqf(nC}DtTP~rg5pacSAxWlKr|=;f$6(u zU_K}zf%u@r1foF+3Pghv6^I5UED#M!Tp${hz(6!8k%4GXLIcr*I6&r@ E0F1%lHvj+t literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh new file mode 100644 index 0000000000000000000000000000000000000000..8db5e8a61ee9e63164ce7f07969557fafa982dde GIT binary patch literal 220 zcmWHE%1kq2zyQn)3=AL)k^s>l%+tWYz_2JQ{Yd@)|Nj}8m>3x1Y(VmHHViBb3`qqH z96r7w3{Jiw4B7_fAPEKr1|p1Sfm+4$1FGl$|NsBPwzVDs(ID$U!XPUdh_sW-M%%#L IPS>0Z0J;4oF#rGn literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak new file mode 100644 index 0000000000000000000000000000000000000000..ec98c62bab86bc3afbe58caef094734022600c82 GIT binary patch literal 395 zcmWHE%1kq2zyRzF3=AL)lHi20%I=fTO|z)j7-c-EKICy3=C-?^&pakfg!VkfrEjeZUO@z14BUrgAkY$V_--sV379l z4PglI4PnqWFgG?}&^EAS&^EAO2=@$eWC-_k0=WPQlj7bVP<{XZ|NjqiH;4wg9YllN g528VS0MQ_SfM}3kKs3ldAno+<6IZyWldd@z0FB>XZ2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang new file mode 100644 index 0000000000000000000000000000000000000000..de5c2b156653e142ebf086402d9ba1ee13da3cd3 GIT binary patch literal 272 zcmWHE%1kq2zyPca3=AL)k^s>l%+tWYz|ejD&M$5g<;$i&RZz)<=G zq_Vt&frWvgZUO@bm}FsK0EzhchA?;shcI{rhkz78F)0@Rfa>}G|NnoG13)y$5g;1m U5Rf!Qj^XkS4$-x+GB)4>0K058hX4Qo literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar new file mode 100644 index 0000000000000000000000000000000000000000..a0c5f669628d8ecd61c398bc475cf2405d20000b GIT binary patch literal 225 zcmWHE%1kq2zyQn)3=AL)l3;j*KpyVTcLD`1qf{OOv z3#!uZE~s(ezo5>_9iaZ@Pk_dg-wB!(Qv)=wTyW4jay~$N%Ygu$B^v{Drz{H4YndFN zU(ym_kWw087`xztQBm~;W80<+CPA?mOl4Cpm>Jn$F#GFv!9qGFz~ZjP1qhDZs9cGr)eWJE|Nqax$i&RT%*4#Z%*uuY*;zS} zxhQN-P6h_s1W?FWI54mj!1_nkjfUv8!|NsC0L6HQaK@kNK21OQ#21OW%21Oc} z{`q+Uhz3O-hz3Ohz3O@hz3O_hz3O{hz3O}hz3P0hz3P2hz3P4hz3P6hz3P8 zhz3PAhz3PChz3PEhz3PGnEvu707Qcl0Eh-90x*5$f&+*KB?b@;N)R9#lqf(nC}DtT zP~rg5pacS3D)0CGOv ABLDyZ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon new file mode 100644 index 0000000000000000000000000000000000000000..3cc2aafac4e27bcbb2de4b08c6451c1a56452808 GIT binary patch literal 297 zcmWHE%1kq2zyPca3=AL)k^s>lEY!fjz_9RBap37seO8-#*|NnnRCT1ok28Jko zkjf~11{MZ}=nMu928Ox`415r_k8cP=kZ%Zswt<K`r0lU~v*UZY;fC~VzWj{Os literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh new file mode 100644 index 0000000000000000000000000000000000000000..e71bc4e802cbdfd9f90598029e0fda04c4074ab3 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7_Lg2ZK?nN|33pGBLjo>8IZh|0RxMVZwQ07 kfiZ~7K#Gw+z&aQh{{R2~A7nI$OTc(88*Kw)J6&Tg0DqDi!2kdN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon new file mode 100644 index 0000000000000000000000000000000000000000..92642679c8f9e68c125a8c6fa740ebf61df82417 GIT binary patch literal 389 zcmWHE%1kq2zyNFv3=AL)lHi82MH?6x7&>~K8zwH+<~nQotl?thxq?g9b|0=9?G|{l z?McI1{TU2gw#OOj|NsBbz{teR!oA^95v3j;$^0RtxkLqP)rF9So} z1O`Efh>vdwLjZ`-HZW(3P;0QvW1Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin new file mode 100644 index 0000000000000000000000000000000000000000..8d6b4dfe21720eb32abd17fcd627ee9567f93836 GIT binary patch literal 1234 zcmWHE%1kq2zyO>K3=AL)l5l~tMH(0w7}`FZ-Eqla(+5#?^8hi4>;vK)Sr^2A&UcV_ zIWIu+)};edXOsh^_ZSq&tWhkGog-8r*TY;OU;U*(A^T~8V)V5FCGX<}%GNsyRJ2zX zs7lW&P~+|{P-ofpLH*0}4;oLFGiX-$GiYAv{GfHD>Vx){><>CiVm|0j@%^CJV)sG6 zME`?9ioyrOSf2u;BJ~1eTfG94An^uMS-A!?!=DXie;FDqq{SF4?mTL+{PlyuYR{1d z>sz-NY?eM`u-&zX!LIc%gZ->|3=XMF862B;H8{DpGdL&DX>d`^WN>w^Yj9)rW^h+d zXmEd*-r&jX)Zlr}v%%}JN`v=0?FOGSjtstiybU4VyFP?{+r&`+|NnmmMrI}mWMM^u zZ0sl;Hg;T)g`I_kfuZ#TD3I$WFt9K%tT@2P!N4$U0|O6?go!ZnFfjBiU=VbH8(gcVGr3(-ZN*f>=ls-T- zD2;$Fr|A6ZG z|NsAgP!NDpL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul new file mode 100644 index 0000000000000000000000000000000000000000..312ec40a112d5ab54ea2d92d735735be4b27a44d GIT binary patch literal 531 zcmWHE%1kq2zyNFv3=AL)k`RNk1sWI_7`m^2sF?Ij?8hZ%^$(ByH9tJb-u~mMutdhQ zB<70ef<7-^=oeJHc>X2h6@O60tK-))UcWb~c(Z&*#@q8^74O<-WqdF#tWa2-FhMad zeS%W6(*$Kd&j}2SOw5cdNRXM8nU$G=p_~I`eR&513j;&l1O^T;$-=9HMK%1ptvMSX}@B literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore new file mode 100644 index 0000000000000000000000000000000000000000..78583666698a0332b822c0cd15daa58abf60eb27 GIT binary patch literal 424 zcmWHE%1kq2zyKT!3=AL)lHi206&e^A7}}a!7w<~;vK)Sr^2A&UcV_ zIWIu+)};edXOsh^_ZSq&tWhkGog-8r*TY;OU;U*(A^T~8V)V5FCGX<}%GNsyRJ2zX zs7lW&P~+|{P-ofpLH*0}4;oLFGiX-$GiYAv{GfHD>Vx){><>CiVm|0j@%^CJV)sG6 zME`?9ioyrOSf2u;BJ~1eTfG94AkG3)S%CsG!`B67e?AphNV9*ixO1hz^4H4`R(rM; zSl>GR!Di{D54OA3ez0rZ^1*&q{|ATEX&)S$*AzIpR(xU1WhLvq^#HIqL$i$6^KE>tqXj&KQ00?fqX6;=SfU{r~^}85o(FAdrO>39_*x zagZg@*&Hk^3=9)wK;hf7fPsa9VZ{MP4hDu<8yI+CBus>nhk*g6hJgcFrH^k2gSMdo zgSMd&gSMd|$S?**2mrGo1SwJc1EPiD|NsC0K~W8&LD3Bo21PlD21PrF21PxX{yE

xfM`&%0MVeN0ir?414M(82#5wH6A%qbDj*t^TtGA^ z$$)53vH{VcqywTs$p=h-S^fb;gOU-51|=mheWepD4oXrWJ}6m%Xi(Au(V*l7qCrUv zM1ztUhz2D!5DiLhAR3h9Kr|@XfoM?D1JR)52ckhq5KRC1Q~;tuNfAunxdP^ck|c-^ zN|qoRlr%v!D0zZtP!a{vpkxZ7K}i)vgOV$V1|?Y#4NA5k8kBTFG${FkXiyRc(V%1u zqCrU+Ouvf++Yd_8AU-HrgJ@9F2GOA84WdCw97KbXIfw=&br3zok~^1;wxOY&uAw0p E06SG9FaQ7m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei new file mode 100644 index 0000000000000000000000000000000000000000..748873bed9a167d0226bad2246556c45432880d6 GIT binary patch literal 790 zcmWHE%1kq2zyPca3=AL)lF)>*1sWI_7!HSeHe3pcY`ENA-EhTe?T4$bN(|S0_J6o; zv!CGxTUx%SVq?GtAU?mUQWxVwts!@Z(nhWlGn3Lez7GCZ6%{llZ! z9Sx7mPZvC~d&BV5K%wB7Vj;tGp``^cn3goW_e1`ZI($iu(@67lg3VQ>x(VekqLVQ_W{0V#xHA_7bc7GOW1dj9|a|G(ti z2MG`j3P2DI3PcbM3P=zQ3QQ0U3Q!OY3RDmc3Rn;g3S1Bk3Scn(eC7ub4GL%w4GL@! z4GM4&4GMG+4GMS=4GMe^4T=B|4T=O14T=a54T=m94T=yD4T=;H4T=~L4T>BP4T>Nz z{rLvieo#b#_@KxF(Vz$e(V$2J(V&O}(V)l!(Vz$f(V$2K1rI19K{O~bK{O~rK{O~* XK{P00K{P0G8E786T+YEEx)xjjVF6z% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent new file mode 100644 index 0000000000000000000000000000000000000000..6f7dea4abca3b703de677eba9a88fe02436b1ad5 GIT binary patch literal 635 zcmWHE%1kq2zyKT!3=AL)l8}b71sWI_7*k_s3(7#Knl7b15-O)Q!W50Xn$D% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi new file mode 100644 index 0000000000000000000000000000000000000000..4b2d2e296e7626c26b8ee570b59d171a8f2f72a9 GIT binary patch literal 1080 zcmWHE%1kq2zyRC~3=AL)k}!j^MH?6x7*a7} z#c)9KwyA;Cnbrf+dnP@QS=0PLc23Cyxt`Pq@-<-(6mr}jD8^VkQ1a1ypll=cKt+f9 zfvWVM2Ws4JAE>iRCa8bqO3--9S)iG4D?szgy#TEv2OYGx90<@^ve-d)%Ax?hmR1M- zk}?N_lt=@^*hvSBZPPZG1UYUnl?^*!W~98q?61WE3uy-fi@Q<>EPpE*Snc_9!1^|e zfz2{W2islG4D4EeJJ`=UVc?K@*TLcL@ePhGG9R2=Ul!E=|NozniG>*gS=o>vI|mad z2!f=b@*pM%b8@h-FfeHT2L+Gje+Cu?1}y^yP6h_I07hO01`7uUK^O@WVHAX^v2Xyf zL27(_Ll{Dwd_x$t4U8GI4NMud4NO2LGB7YQGBQF~P?CsfGKWRe52&91|Ns9F+qR1l zM1!IYM1!IZBn^r_5Dkh#5Dkh(F#U^h1BeDiCx`|`DToF|D~JX~ErDJBS8FJ%|QHKZph;0T2yJ1|S-g6u|UXt^^PbN)jL%lq|sX zm3sjo8k9UhG$@IHXizc%(V(OPqCv?8M1ztHhz2Da5DiK?AR3f>Kr|=`foM=N0@0wP z1g8I5901XvBn77LN`d*Hqy^%Gk{5^uB{2{UN@gG$l+-{pD7k@XP?7`DpkxQ8?;Zz- dFDUte_@E>RqCv@!VF;u{E*otF6FXfKE&#X}<3#`f literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran new file mode 100644 index 0000000000000000000000000000000000000000..3157f806b7d7fe650ec6726f31398824caf82cec GIT binary patch literal 1718 zcmWHE%1kq2zyRzF3=AL)l1PKHWf~Y57-r?vp15>d=mg*HMIQVmx()(;4h8~mtsDeH z(@zMwdhHN4e{(`aS9FJlLfHw8+jDnlo}P0;YoF2%?KKxXbmoUy==L$6&}-=2p`UN= zVUW1j!Z0A~gpt#S9mYoQPnf8d?l2Wm_Ap~xX<_y??1cIAJ3B0{b$M8x6tJ+`$?svk zda8xZETfu*qZQ-Bs;zU4n-i|=;+!H~zpLYc7Ec6JGSGNe|y>cRqA!vfoM>!0@0wH1)@Q@3q*r*7?^&~;Q^vSISoXEavO*S z&_ ztgO6nu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP> zoeB@`KImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE z|7Upd!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nI`W zJy2GN4N!?PNKj?44^ZQN`#|m5vkU64&p*&Oz#O1?GHSJ@Lv6s!Ka7wgYQ()2EX>%1^y-98v^2-J_Lr` zYzWHnEC@E)-4NoVT@WfVw;@c2w;=3GeM5w(=7)$Yi4Booxj#g0ac+pd^7cc_+ysW$ zE$2VP)jBc6Puch(Ay$PUvG!a+k}VrUa_okJ6qy$cskV~}(%4uU(q&5u(w{zS$oLyp zka_e(L)Kl3g6yTM8gh<>e8_F>X~yS)WfYris7pPOG$GhMKuc3opZUD@Y``o81>MrI~B zWI-?oip9X72u|J#KNwgT7_ zAR3gE1JR&72ckjw4ou&dKLDaZ`42>c@*s!?z!Xi(k+(V+YZqCt5SM1%4vhz8|V5Dm(&AR3fsK{P1ef@o0Q1<|1V3!*`J7)-zL zzW@pjP+kVpe>Z^npgaxYgYq?q2IXxK4a(mj8kEODG$@~gXi#1U(V+YeqCt5cM1%4@ zhz8|-5Dm)zAR1H#faz<`!1jU40uUcm9)M_2nE;|ebhz6A%AR1JDfM`$|0;WGM3jooevII<@XDk5GpfUwSgUS^U z4JuneG^l(5(V#L0M1#s15DhA8Ks2bl0nwl`2SkI)9S{vFdq6a(`~lIRG6+P2${`R9 zDvQAMo8%858dN5MXi&KXqCsU7hz6BUAR1IgfoM=U1)@P^6^I6vS0EZxW`Sr>xdoy@ zWfzDBm0utlREB|QP&o#oL1h_;29;-E`b#~iieUhiYal+TYy;7t@(o0T$~X`WD(65n zsH_9gpz;nxgUUP*4J!9QG^p$Y(V+4VM1#se5Dh8^K{Ti=1ks@K5JZE@L=X)s7s2$? zXJGe$%100%R7QemP&o;rL1iU~29=i}8dPS2Xi&KcqCsURhz6CPAR1JLf@n}V3Zg+} zDToG@ryv?srh;ftxeBJ=8G;Rrg{ck06OE;!TiPfw|9_BeATG#85KWq`TsGPUW_G$} FTmaSfA#(r# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu new file mode 100644 index 0000000000000000000000000000000000000000..a8bddb9fa333da5c60c48132507687b2da74470a GIT binary patch literal 229 zcmWHE%1kq2zyQn)3=AL)l3;iPfw|9_BeATG#85KWq`TsGPUW_G$} FTmaSfA#(r# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo new file mode 100644 index 0000000000000000000000000000000000000000..8ad44ba981a2d97d40d3de2c8bf29606be50aa4b GIT binary patch literal 318 zcmWHE%1kq2zyK@^3=AL)lHi20c^ViP7_Qqf6OQ#5&hX*(TK)%j zo;~_-x98&nW=19mWMF7!2I=luz{tYDP&a{r148=vhA?=!gfMsohk&FR85kHCiEsoL z%n?68x)>N3{{R2~KlRX(0uT*y6qtVN{QyLR90#I74g}F4M}q0K{9t*IV?lh7gBi$j MF_%|xh^{3U0KK7P_y7O^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk new file mode 100644 index 0000000000000000000000000000000000000000..919b0031d1cc782d9789984e00f074fb6f17c4e1 GIT binary patch literal 1255 zcmWHE%1kq2zyMqf3=AL)l5mBx1sWI_7#2SDySa7oLj_Uw{0U+bOBlpC77K{~yxt)3 z^4bK++uRINXQC%a@5$I8vnFzb>>RHRay`}?kW*pyd63gR=F94Jz6X zH>gTq+MvdLc!N62djs_^4-7P(+;`BdXm`-Oa>zjI$YulWElUh^mP|F!oziBY*HUhv zUy@;9kP>NN7~8VJs3?Aev2EH0lOV?prm`Lz%#4&bnEln-U?J^bU~!jcgXM1}1FJpn zHdx>REy5``Jde_0R`O^U>*ZmI8$yW}zs4jGHb>4Qs zjkVdqU3ta<_jmITcrsTV@I2Re!0U0$0q=Fm2Yk*{I{5av9tiRNY!L4G<3RoY|Nj{n znVBGvg%t_1u_JMiBskdF&>#yt3kw5-|8h`Bha@ntFfbG}Fmf<3Bo#35z(|+~BM$=u zL`_lwhz(NX;~T=DZD7WrZD7HmZD0;EhJlfhk&%HB%mfppMDh=?4hDw*|Ns97MK*{A zML0+p6zL!u6!9P$6!~EK=XFrpU;rfo5FeBfKr|>ZfM`&H0MVdC0ir<(14M%o2Z#nG z5D*PYBp@1;P(U;&v4Ch$f&tN>L<6Eh2?s=j5)X(5B_J^U<$(c+1|=jA4N6R4`pO}& zI4Dtp_@IOZqCtrZM1v9-hz2Dx5DiLbAR3g|Kr|@9foM>o1JR&_2ckiV4@83!AczJf zLNNVTYXgV|B}OoPmj}!TB}xzHq)$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang new file mode 100644 index 0000000000000000000000000000000000000000..3a5dcb27007e1a2ffa67bbf3a30095303b5d67a2 GIT binary patch literal 288 zcmWHE%1kq2zyPca3=AL)k^s>lEZV@pz_9RB?1WunS0|kAkZrgW_O5_|k%^gwfg%3` zNM-&91{MZ}f(8Z-28Ox`3_M`AfRAqogRgH0gSLSMgSLSsL%3&%BSdGeP3zi3Z7Ae?CZ^@okXaV^AQo zM!!LJj!=PIk6?p*^_K#L?9UB~(bo!;ystJWTkj}P(ca#mDm|+}jeBN;I?J{X>R+}o zXgrzmLG#KC2CXAiAGEhrG3YFb`Jg)`hC#2z?t^}b9fLuN!Ux0Hs0Jfn+X7=-n+6kI z`2tf}xdt;{#saICn-^GbSu??A$?65RQ~D;@we&8qFDaPdkdnW^F(hb$lS|+NXA_eN zE-JV*IApEIwLH+;#{}~vWnMj1p3=Aot@L)(P0EJK81V#=9 zhJpqL9v|Nj25kd#25kdN25kciP`H6HDdGDAtb>8!|NsC0LE#MIg2Ea^gTfm`gTfp{ zgTfs|gTfv}gTfy~gW>>0gW>^1gW>{2gW>~3gW?24gW?55gW?86gW?B7gW?E8gW?H9 zgW?KIf7u42z;Om*fZ`2AgW?WEgW?ZFgW?cGgW?fHgW?iIgW?lJgW?oKgW?rLgW?uM zgW?xNgW?!OgW?%PgW?)QgW?-RgW?=SgW?@TgW?`UgW?}VgVF$q2BiZK4N40j8k8PD vG$>7gXi&NU(V(;eqCx2cM1#@@nEqO`07Qe*3W%mxdf~FsHn6bMwcr8(`HaKE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator new file mode 100644 index 0000000000000000000000000000000000000000..94ddfea5f2df592be9967734c16563c72e63b021 GIT binary patch literal 921 zcmWHE%1kq2zyK@^3=AL)k}!d?1sWI_7}_qs^Wo>dGeP3zi3Z7Ae?CZ^@okXaV^AQo zM!!LJj!=PIk6?p*^_K#L?9UB~(bo!;ystJWTkj}P(ca#mDm|+}jeBN;I?J{X>R+}o zXgrzmLG#KC2CXAiAGEhrG3YFb`Jg)`hC#2z?t^}b9fLuN!Ux0Hs0Jfn+X7=-n+6kI z`2tf}xdt;{#saICn-^GbSu??A$?65RQ~D;@we&8qFDaPdkdnW^F(hb$lS|+NXA_eN zE-JV*IApEIwLH+;#{}~vWnMj1p3=Aot@L)(P0EJK81V#=9 zhJpqL9v|Nj25kd#25kdN25kciP`H6HDdGDAtb>8!|NsC0LE#MIg2Ea^gTfm`gTfp{ zgTfs|gTfv}gTfy~gW>>0gW>^1gW>{2gW>~3gW?24gW?55gW?86gW?B7gW?E8gW?H9 zgW?KIf7u42z;Om*fZ`2AgW?WEgW?ZFgW?cGgW?fHgW?iIgW?lJgW?oKgW?rLgW?uM zgW?xNgW?!OgW?%PgW?)QgW?-RgW?=SgW?@TgW?`UgW?}VgVF$q2BiZK4N40j8k8PD vG$>7gXi&NU(V(;eqCx2cM1#@@nEqO`07Qe*3W%mxdf~FsHn6bMwcr8(`HaKE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi new file mode 100644 index 0000000000000000000000000000000000000000..b44a1e19e9b1212585e55bd65be77665f4ecf6b9 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7&iRdl~Vuz|9=KXMh1o;8IXKP0t1VWZwQ07 kffqYR?z!3AOx*$2cqvMz}KobMp< za$bPstxE@_&L{^+?=dKlS)*7WJ4dKMu7|lmzWPgnLiW=F#pr7VO5Vo{l&yCZsA#V& zP?erlpvK)@pw6=GgZh`{A2gmUXV9$hXVART`9bSQ)d%e@*&lS4#C*`5;`>3b#qNWC ziT($J6on6lu|5SxMd}5{wt597L7WAqvH}HWhOZ0E{(LI1kY@j2apy{b<*%0?toCdx zu)cNrgU!-QA8dE6{b1L+<%9jK{tphR(>^#huPJbHt@z-a+*jbD8uh`|xuC#})#ih{ za!`T$yT}4hW|IQXbJhi3kHreS*U1+6oH6>~+xx%3FZYW>i1)4!_5c6>XJBMvVFp81 zHYCW-fy6kRUuwQY2Q2?FI$iu+Uvw%T_ zfnmh~1_2NWQUen4@eN_nHn3pOHn3#SHZ)|=HZ)?;HZ%Yk&A`A20T2#^BqiQ|K(sLY z|Ns9#DE>h-C=GywLFoWQgVF+s2Bilu{d2wphz6w#5DiKjAR3fDKr|?gfM`%U0nwne z0-{0b1w@0=42TA$8xRdjJ0KdAen2!R4S{G-Is(z4v;?9-=?O%G(iE8fvit*x2Bj?! z4N6~N`bsBQ9F)#Ld{9~g(V+AOqCsg6M1#^Dhz6xS5DiLyAR3egK{O~Gf@n}$1ks@M z2%l%+tWYz_2JQ{Yd@)|Nj}8m>3x1Y(VmHHViBb3`qqH z96r7w3{Jiw4B7_fAPEKr1|p1Sfm+4$1FGl$|NsBPwzVDs(ID$U!XPUdh_sW-M%%#L IPS>0Z0J;4oF#rGn literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok new file mode 100644 index 0000000000000000000000000000000000000000..80b170bca4100c8915a0eab6602589e22bce9ee3 GIT binary patch literal 1244 zcmWHE%1kq2zyRC~3=AL)l5mEy1sWI_7?wx6$8KG`?SrVgYl4_W%j%7GlmJ$d+Zuy*626L&QWNP>k({_uVHFX$o|}*82zL{$@^-9vh}eB747W} zs?sYO)VOChsIwepQ2(-xLF36*0nLh70nIBj7_^RbGH7q9V$fNV&7eCahC#2zmqEY8 zj=>;BpTRITs==tpw87ZcrokjgyunmfuEEUkXM@>ah6W31F$Rk}j~Xn0{a~=#bELug z)-48`r4JcwckN-YYdy?hKWiR?L+Vln$L3uPPOj|?&dGBcTvRg|T%GG0+*rLC+?5j= z+~1`)crrURc%JiY@OrG$;Jr?}!RL%4gKr;iLx}gT5B2~5|7T!iW`aN#RwT&Aj>JKh zKxcEXurM%GF9wBg-2?^}28LN17&#aidKNJ7z(|+~BM$=uObr7EvPvJ{5C&}nO9pL2 zLk4X_1CU`1j1T~3LkLo$_y`pOIt1x`{R1}Is9Xi(Au(V*l7qCrUvM1ztU zhz2D!5DiLhAR3h9Kr|@XfoM?D1JR)52ckhq5KRAN0Ob@0P*Mc(LCFzBgOVhO1|>@n z4N96I8k9UiG$@IJXizc*(V(OXqCv?OM1ztnhz2EF5DiMYAR3f>K{O}{gJ@7P2GO9T z45r_ugWUs4(jY!4S%YX$(gx9>K$s91j^IZ4@ug69cyw_Py@Hyiz;M*rXA;kM6L;e5%{}~vWnIMpb6$!Gj zBXN)=(AgX;EDQ{li$LL9(7?dLz|gaRk%NJuZUO@jjD(3W@-Q&K)G%-$tMu^=VbC_P zV9+)+V9++O1R2J_2mxR=gdin~e?YV_{Qv*|KPaj}G$^`3!k{Pz(V%Dt(V(aY(?547 zfM`$>0MVdi0HQ%j0Yrn61BeDC2@nlR79bjwG(a>cd4On85&_YmWCEf=Nd-iMk_(6i zB^eM6N;V)GlypEeDEWZtFGmDGG$pF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon new file mode 100644 index 0000000000000000000000000000000000000000..3cc2aafac4e27bcbb2de4b08c6451c1a56452808 GIT binary patch literal 297 zcmWHE%1kq2zyPca3=AL)k^s>lEY!fjz_9RBap37seO8-#*|NnnRCT1ok28Jko zkjf~11{MZ}=nMu928Ox`415r_k8cP=kZ%Zswt<K`r0lU~v*UZY;fC~VzWj{Os literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg new file mode 100644 index 0000000000000000000000000000000000000000..c1abb935c655ad4a8288bc3bd9445847e832f270 GIT binary patch literal 1281 zcmWHE%1kq2zyLf93=AL)l5l~tMH(0w7-q+FsxK7U_^Bhq z`FVlF%TF65Z>uXvohjcSy{F}Z%$m{*vUAcd$n}I@kgxH$ppavEK`}<_f|8H)1!Wta z3o6=wFQ`htyP(E>|AIOzcYykrKLHv~ekW*FEKbn8axXyZ$oT;6Ee8U0mTU~row6uE zuVr$8eo0G!K}uiPgz=OY)~ zSSJR!D=)j?{%-9BPv(vbp6B{6cs4|7T!iVqu0r zRyHKa&Vj^1mOy87va&KTSlk2!vdKXP76t|j2L=uXhL8kC9tH-t00sdV2@_!yK&S!5 z4@{gvz{fX)A;33;LEFHDLEFHLLEFF-WGn*%BLqM=5R#NQ{{hj$@c;k+|Dd=B(V+MT z(V#Q{k_M#%5DiKTAR3e&!1T}03qUj|U4Up%+5pj@^Z}wlX#_-r(g}zLr4+Uc5d0RV5aAW8rL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan new file mode 100644 index 0000000000000000000000000000000000000000..4c4e045bd3a47ef74883c0ec74261e8c6a41dc1a GIT binary patch literal 1213 zcmWHE%1kq2zyMqf3=AL)l5m2u1sWI_7*a7} z#c)9KwyA;Cnbrf+dnP@QS=0PLc23Cyxt`Pq@-<-(6mr}jD8^VkQ1a1ypll=cKt+f9 zfvWVM2Ws4JAE>iRCa8bqO3--9S)h64SAo`%*9F>J?iA=OIa{DRWnY0_%lZQSk_80@ zDH98fP8J+6ww>_6Bq;lVscg{$Gb7&zW`9E-SV(6jSll&xVENl8!D_F>1MAy*2{y}2 z6Kr=2B-piyC)m&Wl;Dv1Gr_Ti?}3x+?F8rK4-Z^a_a?YHUwYuiIzPc(dCLR$ce@{W zGEaNpd2a3lug4V+yw}w~@HsOz!B@`A!M88*f!~_)g!=#g|1&T$GeIB=D-vX5he8%+ zWMOnRGb;-V1B2!cP|#`_Ft9K%xCJnBFfdp+Fz~=gmdfM`&P0MVdS0ir=E14M&T2Z#ox5D*PYB_JA< zQb05)wSZ_)iUHGKxe`D$DCK}?Q0f8EpcDk6L8%BtgHjTR2Bjtt4N6fU8kDL)G$>_( zXi(|`(V!FtqCu$)M1xWqhz6xLF#R{=0f+{rIxv0L49o|mJ`f+20zot=6@q9`N(9lM z)Ci(MDH243QYDB6rA!bFN}V7YltMu?D3yX}P)Y^SpwtSYK`9nQgHkP+ezzNJKPdHr u_@ERFqCu$`M1xW?hz6x*5DiMvV7f06tPhm3LHwbSy18t$4NUBGO}GG4)e&d_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores new file mode 100644 index 0000000000000000000000000000000000000000..1895e1b1e19120123e67367e55de3f2a5dac99cb GIT binary patch literal 3493 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary new file mode 100644 index 0000000000000000000000000000000000000000..544f443a096dc1edb447ff85e71d0f17e40a227e GIT binary patch literal 1911 zcmWHE%1kq2zyNFv3=AL)k|>9=1sfO`7?!cbe7NHHT|wB_j6uZs*91}J*Av8q?@SP9 zK087D^S%iZkJnF-yu4t7)ZvK}r1$IJ6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#*VuH=G_zAYVttQyDIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5B zv7VgZu6$p>{oOMGPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ= zYeG;?>V#nPoCzU5?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+ zQb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9I zMkZz!R=UIg|36M(VEF(4;|B&7P+DW)U|`@AVB|q&`}l@1=o%O@gu8|?gu4cZfaDk% z86gxY>Guan3j@fy|NlYh`2YX^|3PUPBn(Q=AR3gWK{O~`gJ@9N2GOAO4W>Wun*gFg z=^R9Z(mIF+rFRewO7kEZlW- z2DTrRXF+^Wz6H^sybGd1`4>ck@-T=7~QqT?0b~21byvAc7Rze}FVGfNc2x iALNSv|Ns97xdcRmTmzB@xd=p4<|-~5T?0cqLoNVeAXEYX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe new file mode 100644 index 0000000000000000000000000000000000000000..c4865186b035081c6f216f75486310e78f03c716 GIT binary patch literal 1829 zcmWHE%1kq2zyK@^3=AL)k|=?)c^eoQ7`k(pM2ITCo**WCXM#BM*$LvG_f3#^ynce@ ze|yQ1S^8P_}UuP|-0HP?b>^ zP~(vhP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o| zjJ+vfRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~n zPq5u>HNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;G zG9MK1Ja+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDh zg75o;iVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NTGBMK|{{R1T1t?KL z(iEQnBL|qr;^P~_5bg@X!66I`42+B*OiJSX0XBz$;s5{t|3Qfq#04c(5DiMKAR3fl z!Sv^S6F@X5;eu#T;sw#51Pr18C}D$WP~ryBpac%0 zL5UnhgAzK31|@b74NCAJ8kFe4^j8zGJ3xsa#0O;n5Dm%%AR3erKr|>bfM`&L0MVdK z0ir<}14M%|2Z#n`5D*Q@Bp@1;Q9v{(vw&z&h5^x_OarF>)(e1WQ04*CcN4*UP$mNL zK^X}|gEA9{24yG^4a!s?8kDg>G$?a{Xix?N(V$EQqCpuAM1wLLhz4ai5Dm(7AR3hM zKr|@xf$4Y8!1jYOA&3vkh#(r289_8CLxN~frUcQTj0vJanG-~VGAM`!Wl|6g%BUb3 zlvzPED8qtiP^JaZpo|NmL75j!e>VWf2PhMR_@ImoqCuG%M1wLkhz4b95Dm)MAR3gp zK{P0XgJ@7D2hpI64x&Ms9YljNJctHmdJqlD_#hgT`9U{3A5@@#Xi%X7qCo`e|yQ1S^8P_}UuP|-0HP?b>^ zP~(vhP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o| zjJ+vfRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~n zPq5u>HNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;G zG9MK1Ja+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDh zg75o;iVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NTGBMK|{{R1T1t?KL z(iEQnBL|qr;^P~_5bg@X!66I`42+B*OiJSX0XBz$;s5{t|3Qfq#04c(5DiMKAR3fl z!Sv^S6F@X5;eu#T;sw#51Pr18C}D$WP~ryBpac%0 zL5UnhgAzK31|@b74NCAJ8kFe4^j8zGJ3xsa#0O;n5Dm%%AR3erKr|>bfM`&L0MVdK z0ir<}14M%|2Z#n`5D*Q@Bp@1;Q9v{(vw&z&h5^x_OarF>)(e1WQ04*CcN4*UP$mNL zK^X}|gEA9{24yG^4a!s?8kDg>G$?a{Xix?N(V$EQqCpuAM1wLLhz4ai5Dm(7AR3hM zKr|@xf$4Y8!1jYOA&3vkh#(r289_8CLxN~frUcQTj0vJanG-~VGAM`!Wl|6g%BUb3 zlvzPED8qtiP^JaZpo|NmL75j!e>VWf2PhMR_@ImoqCuG%M1wLkhz4b95Dm)MAR3gp zK{P0XgJ@7D2hpI64x&Ms9YljNJctHmdJqlD_#hgT`9U{3A5@@#Xi%X7qCo`y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6Rzw zAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{ zVO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_ zCK#lwonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyG zw<9LlEQ_CDyW47lU7OD~~6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Z zoly4Skw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U}9uqWM;tv znONEA4;dJ^L_o<}MuCxqfq_qeffGhTL?9$c+{ZVB!Pzw!M1+8JFfuYSf@lUtMk2CJ zKP=n)0PA63`2YX^|Dty)IUpL8jllGk>I4uC%1$5}l%+s4C|iMOP}Ty`pzH;rL0Jq$ zgR&Wj24yu64a#mH8kFTgG$`AFXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XAR3engH?+D4T+4P*w%epzI2wL0J|=gR(7%24!6^{dpf)A1Dih_@HbI zqCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx4x&L>9Ylk&JBS8lc@PcC_8=OR z^+7Z!`-ADPCSZ4fiUANGR1|<{P;mgFK}7%A5sh>OeH8 zxC7CkA`e7^iaihwD*8Y)sQ3fXpdt`NgNi{A4JryjG^jWP(=Voj-2*BXL3~ir2%tsojyyn<*@5euS0#Vm*h6}2E5RNR7SP>~CwLB%e^Ff4buoLxh7 Y4MBynj<2zvsh)w3ub}~m);Hz?04sM{>i_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira new file mode 100644 index 0000000000000000000000000000000000000000..e25f8a599622cb45cd2afd7bf739e4d1ed5ed589 GIT binary patch literal 3484 zcmWHE%1kq2zyQ1q3=AL)lDG?H%Qi4DFid(jXTogn>W10>u1=UU=Xb;0lM@@})i*TE zUv-pWL3~of!tNgpiyWUfEY7QKSfVV=u+)De!z$Ll4XeJ)WmtQ18^gNgMhxp0#5Qbb z7h%}gS;eraz@TAs(X@sw0YVMijiMTM@Ly}#@&9w3nc?i=$bxf48$O&ndbZ(wsVc+yHKiXe1Wo#IVd?sY zi=pfc7kk1#Trw*8aH(}-!{x}!3|BmlFkH2~Z*WcXg28pkg9bM^HyPacx!B<5%P9tT zcBUKL-85;#y+zF%?oTS&@SrJm!^5Jm4UdxCH#`oq*zm+jbHh_3sSVGRxHmkPHaB>| ztzq!ux1_<#*IWj#Zv8fRed>+Dn_YJe-mW@l@NU+AgZEt<3_esXH29b`$>3A+-VL9F z*KPRXJb%Mi;|UwSDK~ETE?l(X2XpdYD3OPjriZRIoNa5Na)W4cc(0HmkLG!BE z1g)d&6STMdn4q)d~Fn*h4hpO7IzZ`EPt0xu-fY^V0}Acg3Yq{3AVefCfKz(POzUXGr=KEd4gk$ zrGS$g>jdW%X#p42=M!9={|dOVo}A#Wd|$x*-7^7C=7R#B=S~QCJzgx}y>69&&zb!b zeEWI?{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB z(1ggZ8Uj(u$_>%ELb2vLw-U* zo2fuypp8ILnz%r*p`1X8>ra7FK?Z>`ebEVJA07!*@O__9ap8zS<-3~`sx~YWs6MxQ zLe0!W6KdDZolsY~WI}yk{RBofCT12^A|X2qD+@9vN*@;oClci5p(FhN|APht1DIq1 zl{AbT|Nnpdz`%pdhKcYAFbXg*@Ch)AfMgjYQAv=vk8cQrn{Nn%wt)eIu7M$gwt*o- zxNC3-L%3@QST!RUFfcNLc?@8Rk&%cJ@E)uL`~lI)@c;k+|8cg$5g-~=B7$g8sR*Y3 zU7Y};L8T*z29=N?8dOSxXi!NBqCur4hz6CIAR1I^f@o0538F!zCx`}>pdcDlih}7c zbHVnnJ-H1`gGyA8IH*(w(V&tQL~rb@0?UI+SP&mn%7SQ6NeiMur7egCmAGK~|M3P8 z4Jvs-G^q3i(V!9-M1x9U5DhAcK{Ti|2GO7r8AO9hWe^Q2nL#wDbOzC&5*kE5+6P2~Y9J5|s)ax_s3ro@pxOvTgK8u&{W)XroFE!hdxB_C4GN+`wJ4bWTQ2~jLA5EEzMBZ|#A ztqBkfYEgh_P^$t=e|Q9r4^Zm@#0Rx7Ks2b80ir=I4G;}#ZGdP{ivvW1S{)!7)baq) opw`w z&1}LF8})`IJ4*zP`ARVyw^dg-eoK7ANj2vMCl9MBoMuy9aC(i?f-`r{DxB?6S#WO8 zdWG{jYzr>TnW%8l`^ADwt!o!t);_i1N^1XttCklPuDKR2xGuR_;f8APf*U`lD%|2L zP`GuoT;cXp@dbBwMk?GrXQFU#QR#yF>%Q}-0!T&r8~cGUreciR#cyzg41@L`(M zf{$4(3ZLrZ6+QClkeP)n$ol{P>jY3pGcYi+{Qv*)0|N(y1c@=SfJg=&AKwrLZ36=aT?0b~ zci#|@AR{9qh+<$MB@%x?v@rbt|NlQIGC?#bLP0brQb9B*VnH-0azQjGfLi3LQ15)6n2B^nS7N;n`Ilz71OShL5T>&2PGsB z4N6QP8kC?wG$>JlXi&le(V)ZyqCp7^M1v9;hz2Dz5DiLfAR3h5Kr|@PfoM>|1JR(w z2ckg<5JZC#A((#k2kahDVg&I)2@*tu5+#TRB}@1|?h&4NANq8kB%RG$;{+>CbN9@CPMk5FeDFK{O~)gXlq%u({lQLkze8 DJz`ju literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia new file mode 100644 index 0000000000000000000000000000000000000000..56b383b16db1ec8394d33e31863e468ed4bbc9db GIT binary patch literal 181 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?it|NrkEU|{(F|M3F`79Zab23-S) o8AO=I3^keK2gqy&kSYKFXSV%40OEp7XTWVdmyNE0k)07200<~0qW}N^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz%c3ABo7A0|NsA3fTS207+8FKLm1qBL%>{8 YO#1=W!NBnU|NsB^P33a;4Kd&X0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley new file mode 100644 index 0000000000000000000000000000000000000000..3649415bd14a3356419efd7340b430e645509e0c GIT binary patch literal 1251 zcmWHE%1kq2zyRzF3=AL)l5mHzMH(0w7$&>K+Z^_fI&j2{+2E+Y&4FX0PYsSsL^>S* z&$!{l4{L{$_a1LJbwk$S^uD7T&TRkhaMrBRKvM9ZgXHBs8>BuSQIKAhVjy#InSyMW zn}OVl=ne8&W)2D+wi^_^Bpj47M|Nm!XW@{Qv*>0iys& zgn~ZW&qjz|9@t?;GX~g|NjR? zHHZd9H;4vBIfw>DJBS8FJ%|QHKbZc{xB*0ik^zVYB?S--N)8|zlq5hjC|Q7LP|^Td z3rZef`tqI)AR3fRKr|?+fM`&10nwl&1EN9621J9B4u}RN9}o>nLLeHHj6gIfDS>EE zasttyBn6^D$qG!r+~)wILCFhDU%GVwM1ztUhz2D!5DiLhAR3h9Kr|@XfoM?D1JR)5 z2ckhq5JZELA&3SgMGy^2jvyM8BtbMNS%T@`&S3jN$rHo}B~cI!N~RzhlvF`9D7k`Y zP?81Fpkxc8K}i=xgOV?Z1|?w-4NAr!8kCelG$=WPXi$;{(V%1vrhnxpfM`(i2Gh3! u!F*6M2k}8k9YlkYJBS7)c@Pas_8=OR^g%Qz`7;c{^v`9ZYhY|=%mn}z`*rsK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT b/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmWHE%1kq2zyPca3=AL)lIVl7`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c-21qxsezRy`*Z27^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&TdXIpT^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^b|~Kr|@d zfayI7A3!uH|A6V^;RPTXl#f6(C@+C%P<{f@pgaXK4wSDzG$?O@Xi)wF)88yW*^&X2 z&p>=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDHgFrN>90JjxvIsgUTlm4JxBRG^m^c(V(&lM1#sJ5DhA`Ks2b_0@MHBfZYKq zzd(FY83v+3xhz6B)AR1KO zfoM>f2ckjc9*72&eIOcC{(m8BpWRGxxp zP?-v%LFFol29>QK8dSc5XiymoqCw>>1GJcBWEup;EDJMv1ud7OYjB9Jp#i86*6}qo Q&@tzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9 z;H_uk;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Ma0otV2REyF=o5 zM~4)nZ->tz*(_Kb@iI+vz(=yq##=xwU#&@XZ2Fqjn8 zVHlg(VN_((VQlN%VG<v#=^_x4;4pXG5JzSI3V{MsEj{L2kF0t#X}0uy{Yf&%P1f*tfbLJSl- zLKOr%!UUK)!v25m2!H>iBjWzmj>z-JI->S(?}*;*m;wsFK)Eaynb zn8A@4(aDkIQN@vLkxGPGsoFYxvlaU+}1-Ad8QqF!Db~k>>}FV#|jdC7PEwN+l0-lyPq1DEqmTqx|JG zj*6S@9F-?4II4DLa#U}c(owUhwWD@YSw~${dPjXxL^&cP_l!w6d@wf^Q4a!R(8kCDjXi&Za84Jo=AR3gvKs0NB zQU{p+W)G%8c@4w|@(4tO$|MjCDwjYssB8k!pz;YsgUTon4JxNVG^nfs(V+4QM1#sK5DhA~Ks2cA z0@MFLgTn(UlS0eZ_EV% DgX#)E literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane new file mode 100644 index 0000000000000000000000000000000000000000..a327d83b7696f39c01a9b5cdff1d4f0fd4b1f94d GIT binary patch literal 452 zcmWHE%1kq2zyPca3=AL)k`RQl`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c#dY)xaegBFF*1Tk1|pm-1atNeunq=>|NsC0FM2zl z14M(o0jBpTd;rlP?||v!;RPTX}>lmmN23(G=!6CYa23!Ew7tzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9 z;H_uk;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Md+a&>^9i-63(j zqeF_(w?k@qR)_RM{SKLSpAOlBf*o>|i#z0}@8nR3Z0%5NxZ0uQw1`7F^Am@PQVWNw z=M@gs_a8abHMeo7pTEqZ$vJ~VbNyBht(R3C+A}V8=vhknG=4ueTi z9fq-q9Y#eq9mclK9VS6?9j3CX9cD%h9cF*oJ1nGSIV^J4->|szvcvM%e-5iXr#q}~ zJ>;-i`hvrD*I^F3)>9nzvzBr=q^{v`Y(CiGWhMQ>Gyt8;6I8*31UyK;Jm z`}dU`9?xfScwX=3@H$?@;k`YV!)JLMhwpTM4!?E>4*zmPj(~!gj=%)pj-UX$j$jA< zjt~Qdj!*@`jxYhHjT>4><0wIlNUv5u(y+dHCnJm!d5afKsx#!-&Aj%^(A z70WpiGG=fjMs#u{c~o&ETV!*jXvA=&O89c5308EZGiG+Ae~jwLc<9}cdC{gL>!5B& z_C~pmoQ3=yxf2;W@)|yN}T+GJ;4392te3fq?;pL24#J*}^|SJO&1a z|NsC0FBa=a0nueFOCNyfY9ZzV5Dm&mV0w@G4-gH?P+FGlFPPh6K@| zObMbv852Z4%NP=N=cL4_WO1{HiD8dUg!XixzNqCtfqhz1peAR1H{f@n~I2%Ovp^GMr`^R7+U6lT-URJfdyO^b22bYUctx*E{jpvKE5Fgj;`SH7)(G4 nWd;UlvCP201uCs|Ev<|VKqa=0uc3jSp`L+`uL+3KH|7EWaX}h( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmWHE%1kq2zyPca3=AL)lIVl7`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c-21qxsezRy`*Z27^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&TdXIpT^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^b|~Kr|@d zfayI7A3!uH|A6V^;RPTXl#f6(C@+C%P<{f@pgaXK4wSDzG$?O@Xi)wF)88yW*^&X2 z&p>=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDHgFrN>90JjxvIsgUTlm4JxBRG^m^c(V(&lM1#sJ5DhA`Ks2b_0@MHBfZYKq zzd(FY83v+3xhz6B)AR1KO zfoM>f2ckjc9*72&eIOcC{(m8BpWRGxxp zP?-v%LFFol29>QK8dSc5XiymoqCw>>1GJcBWEup;EDJMv1ud7OYjB9Jp#i86*6}qo Q&@RzgaY}>;G+Fzb4hd$$!6rbL*c5uJ;EUxaUhU@Z7k^ zz+3m5fp5nF2L8Ca3<5J2F$mi2XAr7rVGx#E$RHAt#vt;qnL*6LgF&3xpFu(~r9tAc zA%hg7TZ7c{l0tZPtgIM<-$G@C&=^EHEtQZ0k3 z=UE0drg#Q*&GiiGU$!x5ynWc9d1VHJ*4e`i+FPm^bk;6y(47*)px4{ppkHFgV33>H zU>F{14R&NG(_Kghg-xo1> zJfFv$=H_x3afpXK2UzSBJz{Ms!U{L8f%0t!MK0u$UCf&$DNf*mv(LJTAu zLKV0g!uWqTg#CZh5dQvdL&W`a4Uy;fH$?5<&=9@j4nxd}vkb8__A$hDtY?U?Siq2w zF_9rLqKP5NqnIJtB84GEBa|Uk!i^zKu&^PWF{vT_V{k*pLzjlki>3`(2h|#~H;Omp zEaYg&o$#|Eui;fge!=aAf-H81!pI*CMV>DiiY;$3lxUu2D3#p9P{z5Iq3q{8hVqyF z3>7yU7%EQ|GF0tMVyNEK+fcKpuAz2PenVYTLPLE~U;`r)6f(060?5G7_5hTudloRT zFfh#8z{m+BK_WiBAqk(Xi&ZZ z(V)BoqCxowOdk&~0MVd)1foHC2}FbP6Nm=oDUflXdOM)nH{sS>Uc@RW{@*#)@9D83Lj~hhz6B4AR1KOfM`&e1EN9Y4w(MF2t<1*ZSM0fz^u`~vYo zWf+JCm17_pRF;8gP92ckh` z9*72&dmtKA_JL?n`3I&y27}!LDhEM)P+16~LFFNc29=2*8dNTVXi(V*qCw>&hz6CB zAR1Iof@n}#38F#eC5Q%KI8dSD|Xi)hIqCsUWhz6Cj4A5ehiE$7VvnU0JME|70@Ev<|VxB&jHVk!Ut literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla new file mode 100644 index 0000000000000000000000000000000000000000..99f07a9fe53bfa85ef4c41f90dfbae413aaf12e4 GIT binary patch literal 503 zcmWHE%1kq2zyPca3=AL)k`RHi1sWI_80PrxFqpH)sO5CXktwH-XR@5xo*{B}xidp3EU4p68-P>i_@$ z&%_9Z%q$4V!oW~*0c2^X3?mBzLp2Wr7Xt%=?c*E5plx7jV#=UxU}0hkQpm^%A{mJA zhbYV+KfpQ|82JT_#IVsvYeTAth>{ZOMprrotc z_8?b-T)KLL{Pax>3XydUiVf!)l$>TWC}+NAP*JL7Q1v{^pvDx>psu-|LH)}%29385 z8#J%XV9+{yxIueM6@$*&r471MVi@##+Z*&t>=+DkGaC$JqZ*9D+8B&&Z5m9>G8jx{ zVyyco>>GBlWf(_yf<^Qggc`O5~YJx3a>_iHuSEPcpeJD;b)uJtg3ecihTht#DE zj&TxacizaFv_V;Ku6B;Lg60!TtLp29M{H89cAIFnAp=W$@mf#^AF& zoWXax2ZLX`C4+yt7DGTmXhUFvTSHKQc|)*+Mni~!WJ9O|S3?;8?}o7dZyLhi-))Gv zf36|&{Qich{Tmvhcidr!S#g#jcE&!2xQ_J<@f8ag5;7(-Bt|qbBzY7wBwM5~q-caP zq)NCkqzM)_q%$Tpq<;)<$av_|ka^LxA?u)8L-t1ThMa{Q4Y?D3Hsm$DYRE6R-B6Il z&QKWngQ3XtB}1|0Ert@!(+s7OdlPRehnYf5OSFA8j6WP(CwmO%s=7`kLY$-id-0}BJgtPPBuFcKu<;~T=@=o$zd$r7kAY}VJ_FOo!wWz(D8GSd zP@V(PpnM0SL3s~EgYqAU2IWBz4a$cg8k`qF3{ZXq*&8+ql${ws`4Yqhs0c zR1Sb>P+0(?LFEC629*gQ8dNTTXi(VzqCw>Yhz6ArAR1IofM`%z0ir?W1&9Wf86X-| zZh+}8+dve!`~WdPWeA7{l_MY;RF;5fP(pt1-=gUTZi4JwmBG^ktx z(V(&kM1#sF5DhA$Ks2bF0@0wd3Pgj-D-aDTvp_Vc+yc>{vI|6m$}ceeeG!NPmt!CX zs4N4~pz;hvgUU1z4Jy|_G^lI?(V+4TM1#sW5DhBlKs2bV1JR)J4n%{>JP-{k_dqnL z>;uuD@()b^e*+E=P&o+VgUUh>4Jr>oG^k7j(V%h>M1#sk5Dh9HK{Tk01ks>!5=4W_ zN)QbyFF`b@%mmS(auY;@%1#gsDnCIqs0;Ye6)qyamyqG8aUH%3Tl*DtkdRsQd-dpfVUlgUVqr{c|3O z0++`i2B=I1(V%h}M1#s^5DhAyK{Tk02GO8$8bpK2Y7h-7uNk1lH520?Dy~_W$t$qA eK&7~@p@E~TONfrIp@E*Eo`H_935e1+<^lkTm?|a! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI b/absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI new file mode 100644 index 0000000000000000000000000000000000000000..57597b0b9743475c547021ff8cdaa0049729d0e0 GIT binary patch literal 1889 zcmWHE%1kq2zyPca3=AL)k|=?)B^wwR7)1W1JrJ{S_#yVZD?>stwnE}~PKFeteTCF= zzYOVziWM^L1{tyknJeTf`wHZzulk`7Sx}(ZaJ)jvspo@o=HnkKN_ihtJ&*oSeSiCd zy5{m9>gV@<(B$m=p}Btk2d$UcKeT7;DbTspQK4HguRw28R)u~b8BHG& zBdUHRd8B+uwut$WqT%)-Rl@E^nqYE4I%9N2`bXD-jEA-rnHSXyvJT2uWN+jw$XUo( zkvrjaL0-e-iu{7J1qGS^e-uW({7~fi@JF%b=?^8EhkukxuKiHPx%5Zb&;AePFWY}q z+${W1c{1}y)z07#)tlNXY8Dj~)K1E%sA~!;s4w!WsQ>@}KO-{}6tXbW39>LSOjQ9T zs-6W5EDQ__cQA4?Fic*-z|X)iYXhUGk8cQrqib*ogSMfeu>pg&p#hjQ1nGccA`)yV zEW!SO>iPfw|NmmK@;e|dC;@|LP$CA?&$}`}G$=8H>Ek(IJ}6Ox_@IOhqCtrpM9Z`r zfaO7n9K;7DbPx?n>>wJH;6XGf(SvAE!Uxfy#1EoD8306sG69%=fBOT724w~?eSR;P z56ToEJ}6^=Xi(+=(Vz?hqCuGiM1wL4hz4aA5Dm&OAR3fuKr|@hfM`(W0nwlg1foHi z2tpo|8hL75FigEAb524y-B z4a#^R8kG4!G$;dtXiz2u(V&b7qCuGvM1wLUhz4a!F#UZpI6Od^6T}B)P!J8uq#zoU zQ9(2)vw~<)h6T}}Obenx85cx@GB1b*Wnd5u%ETZVl#xL+C^Lg-P=*H4piB*>|K9`q zAC$R4d{71l(V$EYqCpuQM1wLrhz4bN5Dm)oAR3hMK{P1ygJ@6z0HQ&K0Eh+^1Rxqz z7=UO{fdHaGg#w5M6$~I6R5*a?kFH?%fC>o^A5>6)Xi#ARqCo`)hz1oJAR1I~fM`(R z0ir<#2#5w1A|M)6kbr1VVFIE-1qz4;6)GSaRIq?(P~ifmfA)jp160U>_@IIYM1u+& z5DhADKs2b(0nwm>2SkGk9}o>HfIu{;5CYTx|Nmzgk|hzB4Y+)=(={}(GB&W$HZ-); UH8j-mH8jvO)HBfWH33mv0NOtJB`|NsC0qPL5#fM}5a!1Nx44V gVFjW=;l%(AE=F)Tfx-&RATPkU99@G$bPWx-0Hh0uumAu6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe new file mode 100644 index 0000000000000000000000000000000000000000..57597b0b9743475c547021ff8cdaa0049729d0e0 GIT binary patch literal 1889 zcmWHE%1kq2zyPca3=AL)k|=?)B^wwR7)1W1JrJ{S_#yVZD?>stwnE}~PKFeteTCF= zzYOVziWM^L1{tyknJeTf`wHZzulk`7Sx}(ZaJ)jvspo@o=HnkKN_ihtJ&*oSeSiCd zy5{m9>gV@<(B$m=p}Btk2d$UcKeT7;DbTspQK4HguRw28R)u~b8BHG& zBdUHRd8B+uwut$WqT%)-Rl@E^nqYE4I%9N2`bXD-jEA-rnHSXyvJT2uWN+jw$XUo( zkvrjaL0-e-iu{7J1qGS^e-uW({7~fi@JF%b=?^8EhkukxuKiHPx%5Zb&;AePFWY}q z+${W1c{1}y)z07#)tlNXY8Dj~)K1E%sA~!;s4w!WsQ>@}KO-{}6tXbW39>LSOjQ9T zs-6W5EDQ__cQA4?Fic*-z|X)iYXhUGk8cQrqib*ogSMfeu>pg&p#hjQ1nGccA`)yV zEW!SO>iPfw|NmmK@;e|dC;@|LP$CA?&$}`}G$=8H>Ek(IJ}6Ox_@IOhqCtrpM9Z`r zfaO7n9K;7DbPx?n>>wJH;6XGf(SvAE!Uxfy#1EoD8306sG69%=fBOT724w~?eSR;P z56ToEJ}6^=Xi(+=(Vz?hqCuGiM1wL4hz4aA5Dm&OAR3fuKr|@hfM`(W0nwlg1foHi z2tpo|8hL75FigEAb524y-B z4a#^R8kG4!G$;dtXiz2u(V&b7qCuGvM1wLUhz4a!F#UZpI6Od^6T}B)P!J8uq#zoU zQ9(2)vw~<)h6T}}Obenx85cx@GB1b*Wnd5u%ETZVl#xL+C^Lg-P=*H4piB*>|K9`q zAC$R4d{71l(V$EYqCpuQM1wLrhz4bN5Dm)oAR3hMK{P1ygJ@6z0HQ&K0Eh+^1Rxqz z7=UO{fdHaGg#w5M6$~I6R5*a?kFH?%fC>o^A5>6)Xi#ARqCo`)hz1oJAR1I~fM`(R z0ir<#2#5w1A|M)6kbr1VVFIE-1qz4;6)GSaRIq?(P~ifmfA)jp160U>_@IIYM1u+& z5DhADKs2b(0nwm>2SkGk9}o>HfIu{;5CYTx|Nmzgk|hzB4Y+)=(={}(GB&W$HZ-); UH8j-mH8jvO)HBfWH33mv0NO`X&a2$hro_@+k~TPO}-5GhZ{PDAh8k zdY)xaV~S@`*Idt_e*O%DCg(&3&GqXTv|bi7XwNv+pmV9eLAPQ}gWjgX2K^E{27^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&T+FyW@^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^W=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDWhz6AjAR1IIfM`(J0HQ(V1BeEd5g-~=PJn1oSplNW z41a?C4JtE0d{DUortdrgi-XD!5Fb>AfM`%T0-`}>35W)jCm<1*ZSM0lNcK zeu4O)G7Ln6$}tcPD$77Ls5}GFpfU|agUU4!4Jz9}G^l(7(V#L8M1#sX5DhBpKs2bl z1JR%|4@85?JrE5l`#?0P`~%Y;gTd|rm4hHYs4N80pz;tzgUUn@4JsEwG^lI@(V+4X zM1#sm5Dh9PK{TkW1ks@K5=4W_Ob`t!H$gP0>;%!E@)Jz|oCl)727^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&TdXIpT^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^b|~Kr|@d zfayI7A3!uH|A6V^;RPTXl#f6(C@+C%P<{f@pgaXK4wSDzG$?O@Xi)wF)88yW*^&X2 z&p>=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDHgFrN>90JjxvIsgUTlm4JxBRG^m^c(V(&lM1#sJ5DhA`Ks2b_0@MHBfZYKq zzd(FY83v+3xhz6B)AR1KO zfoM>f2ckjc9*72&eIOcC{(m8BpWRGxxp zP?-v%LFFol29>QK8dSc5XiymoqCw>>1GJcBWEup;EDJMv1ud7OYjB9Jp#i86*6}qo Q&@U0JME|70@Ev<|VxB&jHVk!Ut literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth new file mode 100644 index 0000000000000000000000000000000000000000..85c26d509a81d77ebfd6525b4777ed32cd6c9e1a GIT binary patch literal 479 zcmWHE%1kq2zyPca3=AL)k`RWn`5G7)80PpL+B0X5t-$G!^9rYr7f(2|y=cMN<)ITe z`F}6q+$OO=iZN+{)bjcTnyN7iG}oU}a4p=g;KrJ+;I3S=!2MnG0#D|+1)k?p7cen` zAu|gCGBD)K0ohkKfsuuQp`d|*lYs%j_VEp2a13_=5y2rKWsHmhh`>DX1FVCA z;s5{t|4WvMJps`m4}s}DwgMm;37Xw^`HO&@j-#Y01gvICPbJpvyc}mT#n(vA-Wb^ E0DG`^MgRZ+ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland new file mode 100644 index 0000000000000000000000000000000000000000..a327d83b7696f39c01a9b5cdff1d4f0fd4b1f94d GIT binary patch literal 452 zcmWHE%1kq2zyPca3=AL)k`RQl`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c#dY)xaegBFF*1Tk1|pm-1atNeunq=>|NsC0FM2zl z14M(o0jBpTd;rlP?||v!;RPTX}>lmmN23(G=!6CYa23!Ew7tzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9 z;H_uk;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Ma0otV2REyF=o5 zM~4)nZ->tz*(_Kb@iI+vz(=yq##=xwU#&@XZ2Fqjn8 zVHlg(VN_((VQlN%VG<v#=^_x4;4pXG5JzSI3V{MsEj{L2kF0t#X}0uy{Yf&%P1f*tfbLJSl- zLKOr%!UUK)!v25m2!H>iBjWzmj>z-JI->S(?}*;*m;wsFK)Eaynb zn8A@4(aDkIQN@vLkxGPGsoFYxvlaU+}1-Ad8QqF!Db~k>>}FV#|jdC7PEwN+l0-lyPq1DEqmTqx|JG zj*6S@9F-?4II4DLa#U}c(owUhwWD@YSw~${dPjXxL^&cP_l!w6d@wf^Q4a!R(8kCDjXi&Za84Jo=AR3gvKs0NB zQU{p+W)G%8c@4w|@(4tO$|MjCDwjYssB8k!pz;YsgUTon4JxNVG^nfs(V+4QM1#sK5DhA~Ks2cA z0@MFLgTn(UlS0eZ_EV% DgX#)E literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmWHE%1kq2zyPca3=AL)lIVl7`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c-21qxsezRy`*Z27^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&TdXIpT^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^b|~Kr|@d zfayI7A3!uH|A6V^;RPTXl#f6(C@+C%P<{f@pgaXK4wSDzG$?O@Xi)wF)88yW*^&X2 z&p>=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDHgFrN>90JjxvIsgUTlm4JxBRG^m^c(V(&lM1#sJ5DhA`Ks2b_0@MHBfZYKq zzd(FY83v+3xhz6B)AR1KO zfoM>f2ckjc9*72&eIOcC{(m8BpWRGxxp zP?-v%LFFol29>QK8dSc5XiymoqCw>>1GJcBWEup;EDJMv1ud7OYjB9Jp#i86*6}qo Q&@JT_#IVsvYeTAth>{ZOMprrotc z_8?b-T)KLL{Pax>3XydUiVf!)l$>TWC}+NAP*JL7Q1v{^pvDx>psu-|LH)}%29385 z8#J%XV9+{yxIueM6@$*&r471MVi@##+Z*&t>=+DkGaC$JqZ*9D+8B&&Z5m9>G8jx{ zVyyco>>GBlWf(_yf<^Qggc`O5~YJx3a>_iHuSEPcpeJD;b)uJtg3ecihTht#DE zj&TxacizaFv_V;Ku6B;Lg60!TtLp29M{H89cAIFnAp=W$@mf#^AF& zoWXax2ZLX`C4+yt7DGTmXhUFvTSHKQc|)*+Mni~!WJ9O|S3?;8?}o7dZyLhi-))Gv zf36|&{Qich{Tmvhcidr!S#g#jcE&!2xQ_J<@f8ag5;7(-Bt|qbBzY7wBwM5~q-caP zq)NCkqzM)_q%$Tpq<;)<$av_|ka^LxA?u)8L-t1ThMa{Q4Y?D3Hsm$DYRE6R-B6Il z&QKWngQ3XtB}1|0Ert@!(+s7OdlPRehnYf5OSFA8j6WP(CwmO%s=7`kLY$-id-0}BJgtPPBuFcKu<;~T=@=o$zd$r7kAY}VJ_FOo!wWz(D8GSd zP@V(PpnM0SL3s~EgYqAU2IWBz4a$cg8k`qF3{ZXq*&8+ql${ws`4Yqhs0c zR1Sb>P+0(?LFEC629*gQ8dNTTXi(VzqCw>Yhz6ArAR1IofM`%z0ir?W1&9Wf86X-| zZh+}8+dve!`~WdPWeA7{l_MY;RF;5fP(pt1-=gUTZi4JwmBG^ktx z(V(&kM1#sF5DhA$Ks2bF0@0wd3Pgj-D-aDTvp_Vc+yc>{vI|6m$}ceeeG!NPmt!CX zs4N4~pz;hvgUU1z4Jy|_G^lI?(V+4TM1#sW5DhBlKs2bV1JR)J4n%{>JP-{k_dqnL z>;uuD@()b^e*+E=P&o+VgUUh>4Jr>oG^k7j(V%h>M1#sk5Dh9HK{Tk01ks>!5=4W_ zN)QbyFF`b@%mmS(auY;@%1#gsDnCIqs0;Ye6)qyamyqG8aUH%3Tl*DtkdRsQd-dpfVUlgUVqr{c|3O z0++`i2B=I1(V%h}M1#s^5DhAyK{Tk02GO8$8bpK2Y7h-7uNk1lH520?Dy~_W$t$qA eK&7~@p@E~TONfrIp@E*Eo`H_935e1+<^lkTm?|a! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria new file mode 100644 index 0000000000000000000000000000000000000000..ec8dfe038c2d10aed29763ef8f664c8f0cd35c8c GIT binary patch literal 2223 zcmWHE%1kq2zyPca3=AL)lIVl7`5G7)80Ppbn=@yR!iUo#n;A|Y4=*^gJ*?sEa?65q z3yK-ew@Vi=7g#p1@X9c-21qxsezRy`*Z`X&a2$hro_@+k~TPO}-5GhZ{PDAh8k zdY)xaV~S@`*Idt_e*O%DCg(&3&GqXTv|bi7XwNv+pmV9eLAPQ}gWjgX2K^E{27^h# z4TiB%4Ms(#4aT-M4JJY24W_bk4Q7Tv8_fPPG+0QBF<9Jr)L^;%WrNk8BMsKKZZX&_ zeaK+DYY&56>tP1_S@ReiQkOC~Ht%Y1a&2dDPM*`?qPMug)w!<0jn$jMT{)q_{re&Y zkLQyaJg>JfcpWcg@ZO%r;IllO!FRd`gI~KPgMYaeLqI`jLtuhiLr{QuL$HHJLx_Q7 zL#P5*Lm2<>hOqx{8p7Y-ZHTykt|9XL{)VXi8ycc_++m1Wah4%=#y*C)j`a-j6$=;= zGA1%4Ml>-bc@#4wTcj|gXoNDPO1Lqk2^Kb_GbS~pe++KOc<9oQdC{~X>!4ag_D1oB zoP`_>xf6ai{vWP#F1xp~&+kL$T#8h7!%w45gBL7|J-;GL-$C$58&V zpP}Mr14HG>LWZiHNetDSdK+pM)iu;k%5SJ^N@%Dr3T$9vghFPPK>!&T+FyW@^{fqy zEDQ`i3m7;V7!Yh9-w*~zR~HZw90F3t$Os}Ch{z}Xuzd0Ztb>8!|NsC0i^W=oUIWpf{064C{sGH_@*RlJJzo+;f%6}T0m_3Q8k7$~G$=2EXi$Cx(V#pDqCxo* zM1%4shz8|PF#WF?M1k`uhylv0AR3fk!SwM)u>GKX3*v+FE{F!@Ul0w-!yp=zk3lpj zFN0`Meg@H?JPo2j`5Hun@-~PDWhz6AjAR1IIfM`(J0HQ(V1BeEd5g-~=PJn1oSplNW z41a?C4JtE0d{DUortdrgi-XD!5Fb>AfM`%T0-`}>35W)jCm<1*ZSM0lNcK zeu4O)G7Ln6$}tcPD$77Ls5}GFpfU|agUU4!4Jz9}G^l(7(V#L8M1#sX5DhBpKs2bl z1JR%|4@85?JrE5l`#?0P`~%Y;gTd|rm4hHYs4N80pz;tzgUUn@4JsEwG^lI@(V+4X zM1#sm5Dh9PK{TkW1ks@K5=4W_Ob`t!H$gP0>;%!E@)Jz|oCl)7hh`>DX1FVCA z;s5{t|4WvMJps`m4}s}DwgMm;37Xw^`HO&@j-#Y01gvICPbJpvyc}mT#n(vA-Wb^ E0DG`^MgRZ+ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna new file mode 100644 index 0000000000000000000000000000000000000000..768b167857dd82807b5ef912be31518086c77141 GIT binary patch literal 2274 zcmWHE%1kq2zyPca3=AL)lIVxBxf&Q480Pq`T{35n`j68gyEslCkE=MdJ+|ZQa)*j@ z3#vHIw<}dJ7dUjV@G5h#1}Jr~ezWgjH(=>tzoyv1$^Wc_a~pF9*ZUJ4-18MUcy2u9 z;H_uk;M;MWgFo&Ghro=L9D;VoID{&?IfUg_aEL_Ya)|uv;t;d&=Md+a&>^9i-63(j zqeF_(w?k@qR)_RM{SKLSpAOlBf*o>|i#z0}@8nR3Z0%5NxZ0uQw1`7F^Am@PQVWNw z=M@gs_a8abHMeo7pTEqZ$vJ~VbNyBht(R3C+A}V8=vhknG=4ueTi z9fq-q9Y#eq9mclK9VS6?9j3CX9cD%h9cF*oJ1nGSIV^J4->|szvcvM%e-5iXr#q}~ zJ>;-i`hvrD*I^F3)>9nzvzBr=q^{v`Y(CiGWhMQ>Gyt8;6I8*31UyK;Jm z`}dU`9?xfScwX=3@H$?@;k`YV!)JLMhwpTM4!?E>4*zmPj(~!gj=%)pj-UX$j$jA< zjt~Qdj!*@`jxYhHjT>4><0wIlNUv5u(y+dHCnJm!d5afKsx#!-&Aj%^(A z70WpiGG=fjMs#u{c~o&ETV!*jXvA=&O89c5308EZGiG+Ae~jwLc<9}cdC{gL>!5B& z_C~pmoQ3=yxf2;W@)|yN}T+GJ;4392te3fq?;pL24#J*}^|SJO&1a z|NsC0FBa=a0nueFOCNyfY9ZzV5Dm&mV0w@G4-gH?P+FGlFPPh6K@| zObMbv852Z4%NP=N=cL4_WO1{HiD8dUg!XixzNqCtfqhz1peAR1H{f@n~I2%Ovp^GMr`^R7+U6lT-URJfdyO^b22bYUctx*E{jpvKE5Fgj;`SH7)(G4 nWd;UlvCP201uCs|Ev<|VKqa=0uc3jSp`L+`uL+3KH|7EWaX}h( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre new file mode 100644 index 0000000000000000000000000000000000000000..b612ac23562126db6b0aa3ce26dea6760c15be24 GIT binary patch literal 662 zcmWHE%1kq2zyPca3=AL)l2C-Qc^ViP7^baio3MjFjbX>%m;*aM1_bQ7H^JeS#i@W> zZ^Q!bNdCQWXJ@Iy-QR`*_h$ccxPNzBz=IHfhc7dvFMMUKa`<+jA>cco)qx*@9sxg& zKXmxT_3py2l_CdzzflVK(>?Qm?8#LDauuHs$S(-IpkVy^fMR27fD-qU10D(W0YUXF z2kQU-|Ifh0hzBw=G5!C4pn!ql|Nr9$7+L=R-?@Q-1H@*4vVD9*7<3Ix7<3IxL0*Gm zQUc)zRL}qa|Nnym14M%Y1Wf;pIRK(T0Ry5zfdisJ0R*Pshy{RXP(Xp{ouv*S8Wdn4 z8Wd4Ks3!Fg3CtNz|_u^3jmP>7=-`; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha new file mode 100644 index 0000000000000000000000000000000000000000..6d91f91452d0c8474f917c41add3395838504ac6 GIT binary patch literal 742 zcmWHE%1kq2zyQn)3=AL)lF)>*c^ViP7^baCP1(V3ePPF6qX|1dswwQcmnLw_Vu8Y~ z*KZW=NM2rWXQ#Ko-QVmA_hw%ZxPP}t;X#P1z?bPC7kp(65cqZ=OyN79z=R)xatc3= zZx{H*b!5S>6|W}ze*Ht?Pj~(V*^>4 zG$_D8^sakp0w5X`aA5lN8wC&z3P3Qu(;F-g3P=zi6qq0y6rdm)6sRB?6tEx~6u2N7 z6u=-F6v!YN6wqM$_;#>)pa2K)L4gjUK>-hL)G$>-g^rIvJ5DkhTFnwhwm=B655FZp-AQ}{5VEQHF1P~31I1mkrJP=Lw2;{QS KH88R>;sO9ib|13< literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East new file mode 100644 index 0000000000000000000000000000000000000000..308a545ce5931939fb6353fa4273aedf00b49372 GIT binary patch literal 2016 zcmWHE%1kq2zyQn)3=AL)l4yjoc^ViP7^bZ%+OmV+^TCe44hwdEG%?t9uSDUN#X5sq zuYVcbk$kw}&dx}MyT3&Z?#;fZaR2Tsg9jnT3SXi)4ZgC*DSSJSV(^_$Zo!X09fKdo zk1G7)y0qcfiXRJpzhN`@(_Onj_GF)dT*dVT@(WBiC>Wn#pxBscpu~M*fpUbv2IWTu z3aaLxHmF`XuAr{SZ=k;S@d8bTj|Q4kx)rou@ov!0Hd>%_V5@;{+7Si41=9`m-IggB zG*lWG%K9!a3Rl=*%$B8KVi96s^5dX_nS#85+4+nG=HHHOu-MV6V0r(sfmOfG0_zk1 zH`wI!EwDW@(ZJ5{!vgz>{|p@TE-i3u`(fZD{$9a3@Q{J?_lpXyzQG$@AG}@QF4$(^ zzJ02K$FD^jJg1i{c-?B*;N38JfzPhA4ZaDb3;bqzZ1DG-q!7@YY7nSkxgaRn-5{7j zdO?V@ra{O{3xzOcZiBFsQVJ1FZw(?={85N}blxDU&p0km}BAka{s?LAu&=gY=DV3o_YG8f4B&R>*p` z+912iRUzm6@eR3A>I!-5S8m9+;#4T;@7_=-`C6eUKX*gX&$9|8{{9LjCk>1`JG$0}KEEzv9Ed z@c;kg2aGKL|6jepz~SQ?!k}wl#Gq?n3`(vH3=Bjh>SkD?{sGnV|NsC0pu`QLK?xj8 z|8-aZqCp8AM1vALhz2EiF#Y!YC_{i~ zP^JLUpo{^cL74+YgE9!1K7JHz9w?)L_@K-JqCpu3M1wL7$oZg*1EN8h2SkH15Qqk4 zA`lJANFW-NnLsosLxJf>1qvWq)%?>2Fn#4Xm=DTeAU-IQfoM=h1JhHw!SbLC2jYV= z9f$^HJP-}ad>|T>0YNk<6M|?^Mg-BI%m|`E84^T;G9`!xWlS*r;~?04PzD9@L75ap zgEA_J24z+d4a%?}8kA{4G$`YOXi(+_(Vz?rqCuG$M1wLihz4b55Dm)EAlga%J=i`_ z#s=|0nHxldGB}ui@OA-+24!?Gy?rWJJt)J2_@GP=qCpuSM1wLvi1yi)1`bb9Apqk0 z&GG>AL4^T`4=NBqG^kJj(V&6>M1u+k5Dh9I!1PNCuzjF{0>lRu79bi_V1Vfrf57sf zf&;_{6&@fORDghJP$2@MK?Mnj1{EeC8dRWwXi%X7qCo`Oln%h@V~M3g&|fA`l-`7=dU|fdryKg%XGc z6-*!+R5*cXPyq#|f1U;F2NhHxKB%w)(VzkgOdmQ8wjWe*f%u@p3q*qoFc1wY#6UEt zAOq2$!VE-%3N#Q6D%3zUxL{*oU}(^Wd$Zpd+`qfR;X#O_!Iv4l2fniA7<@ZWF(YjdvcD0T*cE3@(Y{~C>Y<}px9XMpu~M`gU*4&4!UWV z4C?>?|Ifh0h!-;b|9^ZB1H=FSS1&NK{QrOa00W1QZwP~~fiZ)wfeFYv3=9mUc=`ua z&;S4b|ARaaqCo)wrvLhF0MVd;0MVep0MVcT0n=|d96&TEV8HawbOR6#3Lp>-3M3E> z3Mdc_3M>!}3NR223N#Q63OEoA3Oo=E3P3P@{4&@)P(XtCpuhytpa2EYpg;vV9~7`4 s8Wgx78Wg}F8WhMN8WhkV8Wh+d8Wi9l8WiXtnrZ>hWut3gVrRky0Nm{dRR910 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/CET b/absl/time/internal/cctz/testdata/zoneinfo/CET new file mode 100644 index 0000000000000000000000000000000000000000..4c4f8ef9aed8bf567ce727c33ba1b97da6f6ee7d GIT binary patch literal 2102 zcmWHE%1kq2zyK@^3=AL)lIVc4IcM{TC(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd zGta#R&aM=naBh*a!1+lg0vDQ81uhne30(4Xn83Rvc>-UzlmLH=>jZ%kvk8JJ>Jx-Q zBqj*^x(J9E|C%7G{Ca|z@SO?b%x5Qvf8IAi;_>d4l>^lL;D6RVQd( z6`P=SlzoEsmLC&zmb{#xJLT2{y_VAx^h@?kFi2TD!7%owfKkyF0b|?U0wzJz1WaY; z3YZyH2$=n?7qF0?GQr|*qJZV^vI$muodv9KM@+C;7C*sux77r@HpdC}vt=eYq$y8u zY_Sw@a$}v~oFXmYqWXM-tMgw0H`bFA+?DSOxW9WQ;K_VY!1LS*0k6l41-#d-67V^* ze}ZpckAUBrg%kYq@&p2UnkNK?cTEV&Nu3aEo--lD$9+PmxZi{@9nA@0-wh^2h`I?x zTo;-U`Bg(8YTK6y(O0@|Fb)5foM=h0@0w%1foG13Pgi46^I69 zED#OKTp${h!NBzAeG@=5D5HUBP-X+spbQ71L75IjgEAh724y}F4a$HZ8k7k^G$+OkaX~aF z^MYtl1_sffObnty85u-_GBbzFq6@(xfR2YJ2P=N@d pL4_iS1{I7TdPo+IT+Xf`x`v=KQ^(g>&s5Jq$JfvRMC%)K0RX`k4B7wy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT b/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT new file mode 100644 index 0000000000000000000000000000000000000000..5c8a1d9a3ea46457985198597d90f95462a70168 GIT binary patch literal 2294 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 G11u15C1=bCR{aZeq z?)cYmN%>2`r9{pTmpd{Tt^_B1xEgwu;hMtP57$k%Gu&WU|KX=DD8Yezo3J$8iQ-NZc~KIboK_+ps!;U~XW!!M39 zhF?F@8GgTrVEA*xli}|PD~5kNv>E=dkYQk$!OOtd{*QsF{5=D6p;QA)B6kC8z@G*- zhqn#v2KO2`6wWtr3LI$QV%XTg^Bu-G)O<>J5t3meQ z>jt@vcN*juo^4Pl<7ZH8T;HG+`jJ67>kNa6>1760uXPM+qFWi%wI(pA|GU_r$yLOl zd2e%r)~gT(?R`@lbS@V(=*}x|(Ayl;pkEi+U@+OF!7#my!KhfQ!Pq^5!6fKMgQ>a| zgPGB-26J{91`Fx$3>MG+Fa;0^gd-2ET0v1^zM74FS`H3Ic6x8-hx|6a>r2H-v;NKjfBaGvuv*_#r=x zm!Y8l@P|Uv_Y6h(OFtBgUSufoZ~sv8?`=bw#gc-ud*>S}B-#op_HAsa{E<;mHE(i5 z^$o9rn!3`4+8sItb#dVh^)vVim>9v3nFUNiIM_*6HtIrx7Gie>LiGRtC2trQ{{P>( zfsy6^|J4f^IKXTkFev~gq2fNiAq>tgAq>vJAq>vpAq>s|A)pM;z{to5q8S+&h$tTR zz>0?-AUzBqoB#h$d9q>3|NsC0gNh3T0`Wn`7KjEFT_74%e1T|C5eA|`#TbYN6=fhARGfimP>}|rLB$%F{*lfA zqCv$Qhz1pLAR1K6f#`prq7K9W6?dR`nZXMp!Nnek0V?`HG^qFk(V!v_M1zV!5Dh8{ zK{Tj11ks=(5k!NEMGy@t8o~63MW9-N0aQeS_@H7EM1zV-5Dh9WK{Tky1ks>k6GVfG zP7n<$K0!372nErgViZJ!ic$~_Do#N(s7M9Tpkft7gNjxV4Juy2^d||hJ3z%Ohz}}i zK{Tki1<{})7es@KT@Vc_dOsu2(ks!BjKs5$}BpehAKgQ^t}4XRqe^dClW zJb{fM`%v1E!CHNJy0fVu7k15Dlt&Ks2cO0nwl;2tEDx%>Kzva31)@P! z7>EW{V;~w-m4Rqbbq1nART_u}Rcjy`RJDO{`VGaKB%e#@j=xchz3=8 zV0zz1uso>h1MxxCABYB3fgl=G4T5M;RS2R%)gg!mRf!DHnrWohiCoUXA!g1lAv(Us RdPaH%I=+U6dWL!iTmWG7vC;ql literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern new file mode 100644 index 0000000000000000000000000000000000000000..7b4682a39e2fc97450c99eed4576d2a4614bf294 GIT binary patch literal 3503 zcmWHE%1kq2zyPca3=AL)l6VPai!?AWFwEOAxnTaT*9i;S^-e6Dwb5bG6t)kGLsvR1 zX^Z`^RHGtcS(^Qa!CrF$i8t}!my;;xghHAb{xn>t^@cI)p2JJ>!X>{J#0u=ClagxxG( zKkPpL?!lfX*FWrCf8oKtBRfCr@89&`z>?V?4(3mJaHysB!(soj2S-xkKOEJMcyP?O zrr>hud9duk*+i4!b% zs>zk`%w6}xb0M_{FVy)zycGNN;1%1)53jymdGPw#l>|I7bBV3_{z17rKc2TbJ;J}?*jOJGU(TfiFdAc4){egV6| zp#%*LoSdK(`sjml*7^r3rbj-gdQE(wCc5l{x>oT6^?!#8G`T__Xx>{| zp!Lf9f%d-k0-eht3A*z#3-mUdCFs|A7Z^;INH9!K|6o+~E5X>^^Mgsyodi>L?GI)~ z`x4CAc|TZ4-+Ey2?EMGJ-+LZd9lQ9!`u4mBHtXLN*zRt4VAp@4zB6I?&9_~5P^|G@on*9T8t#|NI9b3S;zRes<-r?bH4nnQwb zO?H9bHl+mr7~g_`X)FnWHu?oYrOy(AWdsXCLQf=w{Qg`JX1XdN>?!|;2)SbqB946g z5czM#gQz8!KSbZ_dJxmH^+W8woCk3!(?7(|^LvosyQLtpJv$*ucUnPmx^F@XZ$&|> zyM99I+o*zcb-{%6vo-~pY@ZV{*UA-SJ-eEaJ2md??DF{-9X&(1#NL$_FL??iZ9;uK51172 z@eN^cbqQf`4Gv*&4G&>(4F~}hWekiUl97l)?-i`j`vKCy0J7=-|DtylZ~p)P{~uHc zf@n}d2%8Tj(jXdCP=jbtVGW`|1vZEV71|&gRB(f6P~i=x6Mlou0~O*R zKByoE(V)T{M1u-+5DhBSK{Tjf2hpIy9Yli)crg8Mc>##NBU}RZAE>Yg@j(SXhz1q< zAR1KggJ@9U528U80Eh-v0w5Yx5rAk=WdNc<6#|F`RSF;)R55^PP~`xkK@|ju22~PZ z`r8$-e?XN5h!3hTKs2b*0MVd|14M%=4-gHiKtMF85&_YmiUdT1DiaV5s!%{Qs8RvZ zpo#@VgDMvg4XR*3G^mmR(V&V3O#g`Z0HS}tum-yaROx{De^1DQ`Tszb4@dx10fF+v z^nV{f6sRHs(V)r*M1v|M5Dlu7Ks2ag0@0w#2}H9S97+Juph^lva|$d0^SKxn7l8Pn z3JXMoDlHHVs<=QjsPY2Qpb88`gDNo)4XVgMG^jEI(Vz+qM1v|d5Dlu>Ks2aw1JR%g z4n%`0IS>u1=s+~6vIEhe3J*+w;sUz|RPllMpvn(KgDOA}4XOk|G^ip3(V)r@M1v|s z5DlsnK{Tjh1ks?%5k!M3NDvLGBtbN&q6E|b4ukCjRhS??sL}+{po$YjgDOuD4XQvv zG^i2<(V&VHM1v|*5DltOK{TjR1<|026-0w7R}c-VU_msfk_FMAiWWqJDq9c@s&K*d zv-jZm1y#HtKB)2q(Vz+#M1v|}5Dlt`K{Ti`2GO7j8AO9BWe^Rjm_anCat6_$3K~R% zDrpc6s;I&A=M`Z4KovHK53005G^pYR)0=a^@}LSF#0OR4AR1JWgJ@7?4x&L7I*0~U z>L40av4dz(KXix(IM1vX$AR5$A0MVev0*D4R7{K(~ zD6o4#4F?b()OY~Vpauk(UMmNd2Q?%>d{AQoM1vX>AR5%D0MVd^1&9VUEfdQgH zjSLVCYG{CHP-6o`gBl!Q`rm!9`Jjdeh!1LffM`$y1WfOP(IYM6j%P~!wdgBmCdq_rYOXbXkQH8{l7)g?s7*I3U;&p^l5&`{4%&wvX66J?UO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain new file mode 100644 index 0000000000000000000000000000000000000000..d02fbcd47f845bd101a7ec97150df7821b826357 GIT binary patch literal 2402 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan new file mode 100644 index 0000000000000000000000000000000000000000..5fe8d6b618e34c4c87a7eac43f7a27af41161d02 GIT binary patch literal 994 zcmWHE%1kq2zyNFv3=AL)k}!j^B^nqQ7~1|$mYKI>{e=0u*&DW|`hVDF;PGI)tKo+o z0$LAtstSMD`GM!bZa#y8-RIvu*z-=PVDC=ughNFf9}XwJesCo4)rX@NlM{{^p80TG zas7i6QZEZma-B&y`RjDSsaNX~PIvN5xTO50;8LOl!{y{2fh)oJ3|B)R3tUsU!*Jd7 zsK5<|eGE56mkZo{uz=y#zrz!5A82B@b8qQ{yDR54+}qba;eKaB!-IL56CP$JH9V^G zp77YyrQu1O?u4hBY7Niay#$^MIWxRa*AaN}NtNOCvkwAqu3ct$d+d?`0}~@w$jpLO z7^0Z<|Nps97#RNlU%h~l<^TV=6BszaY#uNv03sPge0)O~d|g5qe1k(6e8WQ+d;>xl zoP$F^p~}DrB}s{aA7DKoTmSzD#l-*r|Nnzx14M&j1Vn>k1w?~l21J8m2SkHn2ttn8u?42jzXS6@u?FIUVh%)uVh==vVh}`wVi81xViH7yViQDzViZJ!ViiP# zVirvQI$Z#wK`{)XL9q;?K`{-c6D1fxG$_VFG$__VG$`glG${5#G$;jtXizEu(V&z7 zrXMT->j$L>5FeB(Kr|?2fM`(a0MVcn0-`~w1Vn>U3Wx@!77z_eF(4Y0YCtq7<$!2V p>H*Q96a=C{sR%@aQWBW{qzbkll%ha<5f`3x+S1u`d&fRYmb1M=tTu} zt$70K|K2Xp-%6ZGp!7Z^--nqZhdNx`UC zWrDGLiGoQm+XPefFafH-2)4f)5|BM@Ge@A>K-{E^=-?7bam?q>1WdxWU|Xn$Xx5OAnV!x3E9(96>=`f z2;`QzE99;JCy*besZh}WK%mf!TcIfbkU+8MTZIz;B?2Y?ITw^!9GFmc@AZNTiA57C z_MKf&`J-h*)x7l!s&AxCsHvN{pmvAHgu1xm1@$wuCNMEFF)}f;FtIYRu@3*E{35a|-a5E&f85E&lA5E%gC zyM!>l3LqMkXFxP4-+*XP-T@g8%0D0)l!rhxC?A1nP+kJjp!@`) zL3s*9gYp%K2IVa<{mEnjhz8{`5Dm&_AR3g{Kr|@7foM>k1JR&-2ckiF4@86VABYC! zK@bhfhaei17eO>AKZ0mbo&?kX-h%A|)Xiz=|(V)BxqCxo?M1%4)hz8|r5Dm)PVEVa~0*D6XaS#p4 z=O7xC*FiKWzk_H{o(IvOd=H{Qc^^cB@;`_Ml>s0cR1Sb>P+0(?LFEC629*h5`txP5 zeW0=d#0QlRAR1Igfa%TC!SbN80>lTE7a$r`W`Jl=xdEa#k0nwl`223B70oxBMYe0NZc>|(BWe$i2l{+9B zRQ7;qQ27I*L1hq#29-k~8dMg6Xi#|sqCsU6hz6BQAR1IQf$6s`VE2H^C=ef1PJw7p zSp}xodVu9YWfq7JDz`v1sO$pKpz;eugUT=v4JyY#G^i{C(V+4SM1#sS5DhBVKs2aq z1JnOG!RCX?I1nFH&Vgu9SqG-~odwH-$~+JsRPKRjP}v8fLFFHa29<#z8dMH~Xi!SGTh=K!KluQD)S}t+e#+-g(yVUgq+n>x1*zq^!z|P|e0cT|L9M0rCzi|0Z|A8yg zCpTO*4n1(SY?8y@i#87bCjHv*|IFC~3`KV~FqQ@!U~=%>z#M9HfJH%j1FN0C0~-VH z26pZ}4(#{eZ{YYR?7+GI;s&m}Umdttyffh0d)TYXD>x|BGaD%8GdU<({x(qdd*YxXdDlSIg5iMb&;15!pMD%rzq!yrwtbz@&<#3b_YWz*9}GqnGVLb*9}Y@yd6xr zT@1{4cQ}}{UEN^8!0%vjn!~{IrS<`C z;Fz)bfRpi>4bC1@54Z^TZE!W*kw%N#uSeqyur=^9XJlezW@KT4L1rdqR%Rw0h6NJgIj|F2$P6o8Q+aUb6hhG5?i23-SF23-Ra23-SKPGn>RWjqE3Mn)p? z=R#Qi`~lI#@c;k+|C#Nw$3QeFzk+B`o(0jMd<&vMc^5>3@-K)6qCt5aM1%4;>#}csppfU%<2bDV@8dUaxXi)hBqCsU4hz6BIAR1H_foM>9 z1foG@5{L$sOCTClHi2kR`2?atWfX`8l~W)ZR91oMpZg6!G^or1(V%h*M1#sM5DhB7 zKs2Zf1JR&z3`B#>^@K#2;zgvK@bfp3qdrfJOt68G7&_B%0&p&%Mmj)G`VSqh>-aRIY+(P}vHiLFFrm29>cO8dT1LXi!-TqCw>?hz6CpAR1Keg6Z{d4uEJ-`3t7| z&w=@%au~!1mBk<$R33w9P?-#(LFF=t29?bq8dN@mXiymqqCw>}nEp}h0HQ(VHJH8; z3g&~#Z4e(+c7te8`3w69RGwJIQL)Nz;*Yl1NVw|20VMOJMeZ~ zFyNcJ(}6!@lYv0n)dPYaQw)UCwjU7IC^Haon|VM~aMA`bwdw<6A4@h!u*DvbxEQuU z@|pbssf`vJq|e7V$V`;lAiLhqL9XD>2Kjyk2ZefO1I2tM2PMnj2FiX<98@Il8mL+@ z98mqa-$3otj|1vA7aC}MKXO3x(B2JN*Owj8UNnD$&i0N2x=oE6^rmMW&`(O)#xR6hC1Q*?;ap)b~{e(fJz=#9Z$&i1nXzAZ~k}LA-v+frRM+28j|A z9g-SyHYEKhc1TI^+mLc2)FI8mU_;stbB7ECp$!=`BpovUf7y^#{@Wq@{04|Gbypyal2``3ppY@)(E)J_gaCybPj2`58om@-&DB>^@LA0^)EG8dR==Xi(V-qCw>=hz6ChAR1K8g6aSN|1%8N!j{WM e*TBrq%tqJ1)K16OLeEIgOy9^z$JZ3f;sOA|noNQK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Cuba b/absl/time/internal/cctz/testdata/zoneinfo/Cuba new file mode 100644 index 0000000000000000000000000000000000000000..1a58fcdc988ea6ec1bb660ceabe85ea19e5b0774 GIT binary patch literal 2437 zcmWHE%1kq2zyNFv3=AL)l9&T!3p6k=Fsw;B)UfgLlz>eou?{Dq(=MF29O!V$+T+5h zJ-G+YsH6s*nd5)p;t}qEOV(cxTweS(;EMG11K$%^FMR)B>+sXo<-*U$!3Tcbw!ZLt zd7HzZqbo1`ZO?G{w}aur|K*PlFid}RfwBGQ0jBaJ7nlnkIj|%=3}7`CIl$&{IDlQu z!+}F#X#mIf>H}O1?EzdLvK+V{WCrluY&*bvz&n6%XT|~kO^X5qYG*qL2EMu=l(zkV zu;G~tB5pGeh(w@fhI|sR{ z-~jo41qX#F(*VVMCI= z5McIqdw_-XnF|)rE?=jv;I}Q8ua7c^3;Ob%; z;QG1eg1d@%fcu@50iMi113WheT=05)JHUHRZh+63?-zVqJ1_X{_q*U<{@_Bu)NcWS zHo^fxr8feCrN0J*gzgFm`F%Yg%ydpb*ptr}BII^lh&XcfLgc?$7owJIzYu+|=0Z%% z%nPym;x5FcR9}dn=WrpxcSb;Bdu%|GZdE{Xx_v+jZ%ja{yJA4@KdvkC#3 zY)=C+*D?iUJv$zdJx%UH&iTg|a?2Pl}Tqw%#yihE<>_Ulu z_JxvvhXcwiIs(e>Ee)uU$O@>~*B(&$!zZ9>US>e`4ZVPxI`4qm9RdM$ak>HZ(?10; zGBZ&MS(uO@D+~4D|Nom#Ffjc8zv%!2%m4q!4={54|G#qs0}qS@iTL=2FnIWeFgUw} zFgOQ?fbtRpBO{n%AR^z*h2^^+5G@S<|NsA=*{-nzM1%4nhz8|F5Dm(YAR3e>!Sv-o z2M`U)n_zlR?g0=D%A;UjG$KV&(8Xi%8|qCw>Xhz6AnAR1IYfM`$|0ir?W z1c(Ne6(AZ^UVvy&nE|3f42TAmGawpN)_`bGc>|(BWe$i2l{+9BRQ7;qQ27I*L1hq#29-l# z`rmS}|3T#uhz}~0Ks2aa0@0wd2}Fa+ClC!Pqd+vMoC49HvI<0l$}12JDziW|sN4e4 zpt1`@gUT-u4JyMxG^iW{(|@;v?FW@-AU>!}1JRbh*MZ|1RJMWmpz;kwgUUD%4JzkA zG^nft(V+4UM1#sa5DhB#!1U)HusNXe55xzRfgl=G4ua{;0bqGhc?jZz%0v(iDi=XC zsB8q$pz;w!gUUz{4Js!=G^nfu(V+4YM1#sq5Dh9f!SwIzVE=*2PY@qehJt8NISQta zTm{QK8dSc5XiymoqCw>>hz6ClAR1KOf@n~g3!*{gE{Fz| zy&xJ?{(|YZc3}5_%3%;6R2GA1P|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<7zYe8Xc;gvFfhm{FtED128S@Xx`r??GBPrfl1xEq7L-&$G$^@( zXi$;`(V%1tqCrU)M1ztqhz2EL5DiMkAR3gEK{O~igJ@8a2GgJSO#soLqz$4$$s0t2 zk~oM4C36rBO6njQl-xlyD9M9pP_hTnprj9?LCGIPgR%gK24w>f4ay228k8MCG$>1e zXi&BQ(_c-%?f_*E5FeC9Kr|?ufM`%w0nwoB0-`}#21J9h4TuJ19S{x5J|G&Dg+MeY z8-Zw0RszwW>;$4gSqemhvK5&ATQ2~jLD>sT-%SMbLD>w%2W2%74a#mH8kFTgG$`AF zXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XAR3e=@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/EST b/absl/time/internal/cctz/testdata/zoneinfo/EST new file mode 100644 index 0000000000000000000000000000000000000000..ae346633c1690d49530e760f8506218bfa9feef1 GIT binary patch literal 127 zcmWHE%1kq2zyOR43=AL)lK`<<{{P>(fq}s_ID~x2bu3e{NWP_qA=t_k-2~o|}sv@E%An;M>{qfPZE42Z5Ps4+J|? zKL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB|Z$C&eaVJQ9;wq4S_%=c2;+q25 zgXa_EHl8bxU$`+rp^V{!V&milrO-zol(W`9P%%C7LDg&G12xfQAJnyqAE^I3T%gGn z`atvE(gLkl<`1;@wHN4I4oT3Rmsy~<*(^c7&bz>1vP6Pmdin>WqF)Kd?w%h^g6<@k zs%w8RGuoG6&d&S6Li*MNi)ZgYSpMGg!0On=57xKmJ+N8-uE2J8!vnki3kCMGlO8za zZz^zXsZVh7pHkqQl9=G4UsmAi;+)|6dBq2J-S`LYm%BcA@;W~7+??~l>#gzw?>U_X zKGz%)d~31`{I)42_{aDb1WaQ|2(-~J2r7M+5G*5D5E6PKA>{Yxf-uun31Lt9KSanK zdk}Ht{gm|9t>apbQA2L75OlgEAtB z24zMN4a$%pn$6*U0f=TdIFtaUdnLhqPJtz0J}8rd#6cMqM1wLbhz4a?5Dm(-AR3f$ zK{P1yf@n|%2GO8Q45C398AO9JGl&LdXb=s`)F2v^u|YH_bAxD51_#lgOb((!868Z2 z;sU!5l;J^qP^Jgbpo|ZqL75*!g9-o;4JrgcG^ii|(V)TrM1u+h5Dh96Ks2ae0MVer z0Yrle2r&KcFxWm&K>^}}3JVYoDlkAasL%k>pn?NLg9;B24JtrDG^h{((V&6^M1u+w z5Dh9&Ks2aO0nwm>1w?}i7Z439U_dmekO9%4f(A@Kdk>CZP=N#Dg9;rG4Jvp*G^p?a z(VzkdM1u+;5DhAbKs2Z@0@0uX2}FYmB@hiNm_RhBa01bw0t!rjUIDfbR8WEVpu!47 zg92NiZ88dTtc=_4P(_JayO5Fb?dfoM|L4_oU1{IWG`fU{0J)i;;#0M3cAR1I~g6Xw#V0lmh z3gUwbQ4kF(NI^8HFa^<|0u@Aq3RMsdDp)}@sBi_*paK>|g9=#?4Jv5C^gl>`1r@j; zKB&+I(V&7COz&F^wjWdggZQ9A7({~#Vh{}~j6pQ0KnBsELK#F4n}V6kH8{l7)g?s7 T*I3U;&p^l5&`{4%&wvX6F;cIQ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Egypt b/absl/time/internal/cctz/testdata/zoneinfo/Egypt new file mode 100644 index 0000000000000000000000000000000000000000..ba097504459673e254831edea689c2f8143990df GIT binary patch literal 1972 zcmWHE%1kq2zyK@^3=AL)lBkEWc^eoQ7*0&y^5Dd;>I*0Tynk@&_=^jtPp?Zjb6@kq z*)~YQlxrZ+?Avvo)9D z?fLo-@1}oZc)wwD!G}uKhL01UefSg=$?&;Ys^E)tPs7*H`32wP1RK7aUHb6-zbnH} z3ATct4^J`t`f2&$_o2THe{S#l@ONob!@oVB3jVikV_=x4`hhY1Wdl=vWC63MECWm8 zy#iM4MGS1tf*;s3`QHyb8xJ<{o-{1roAi}|e^tr{ zff9`d!R{FaLZLAX!g;aGJ2e30J9 z&>(ZQpg?xM34`3W#UJDw(i;?}UoTKhoXwzA6;q(>qQIb%q+Xz^8r+~}bGSgAt(`$b z_S*-I=eruT7^**Low9Gxez?9sXLT`y?x9B?^m>*x=r0g{V35so!La`810%0@7mVYt zKQPg{aKY4m=L0jYO&82Ht|gd%J|AGou_M9q^2PwG7qb$qH%|_*IZ=~fJGnH#Zbe*z zeQ|hz!^Elwjxog-oC;$eINO9?a0#?~;41Vtz|BzMf!l+u01rW?2Oir6FL-`<^1!Qi zXMp!D#sr_ly%&5sBOdrH`4tdcYVja=P3MK+TYC~hRGI>q7-V*B`pFu1w~gNP82JR^u8B29ymGAMoX{s3uUU|{(F|NsBmy}qkK zG$@UO>0i|sKr|?=gJ@8C2hpH3528Wo9z=uEK8OaTe-I7I10Wid4?r|1FMw!JegM&+ zJOQS^=mvmjP~HI3R};YYf$|8556UMX8kAQ+G$_A-Xi%O3(V%<-qCt5FM1%4Vhz8{$ z5Dm&lAR3gHKr|>nfoM>k0@MFp!Ttv2Ef61+zd$r7kAY}VJ_FI9yau8{`3*#a^Bjl) z%6Fjfo2U8#M1k@jhz8|B5Dm(QAR3exK{O~of@n~l1ks>;38F!H6HLG31X18T3Sxlr zDToH;RS*rzuOJ$fXF)V5--2jR-UZR1{0pK%c^E{4@-c`8Vhz6Af zAR1I2fM`&e0HQ(V0*D5c4Imm+K7eRY83CrB?*gS$22fc6;)BWy5Dh9bKs2b_0MVeb z14M($4-gG1LqIgB90AdwvIInf$`cR`DpNo-s9XWjpt1!-gUS~W4Ju>6^yl*dAR1KG zfa%K{!F*7e1LA|q9S{vFdq6a(`~lIRG6+P2${`R9DvLlgs5}DEpfU+WgUTfk4Jw;J zG^l(6(V#L4Oh3p1+XpJEKzvYn1)@P^7KjFwTOb-#c7bS6`30ssBOZY1CBMM>L1h_; m4=T^V^sPM!AR1JzG0>=3V@t*~^8J;O591cl}5#}rm*=_sst{bRu@hRX|9 zT@_VW{qlptn&UYNYfoNMShw6yVf}*21smE86gEz}uwYYx&w|ZGn-**d&|9$8GfH8b zfxv?8Mr8|j@PAscQz&A=&i7Xq?0U(du=~bGg*~^!75479tgvt6zXkheY*jcgTUy~@ z#dL*3Reu!@M^q{t30$(^s718GF{^_L$0M#SIDU(B!4=O33RmS67hLmOqi|hEL*a&A zpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7EEO?Y%qVPCK zYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z-t0QB@OJaB1@C5U zRCwQ*zTm_BT7{2^o(n$J$18mHN>lg}@2K!qk$1s2du4_14DT2GkY`o+@!;ZupZ}gK z{5r6C!S5H$3;tBEUhwz$?gHk5V+t&q5elpUD-_r`trXY|x)j)7$|!IOnBM5=$asPc;W=R(MJXmasS(7Y-(LF?tm3EEqJOwc)bd4leg zTNCtFZk?cCvS)%p=ky7Nu{Q;bina(C+wK-H37RHgDmz!e%&0=Z>~Fn*h4hpO7IzZ` zEPt0xu-fY^V0}Acg3Yq{3AVefCfKz(POzUXGr=KEd4gk$rGS$g>jdW%X#p42=M!9= z{|dOVo}A#Wd|$x*-7^7C=7R#B=S~QCJzgx}y>69&&zb!beEWI?{MIa-;GdT#5YW>+ zAuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ8Uj(u$_>%ELb2vLw-U*o2fuypp8ILnz%r*p`1X8 z>ra7FK?Z>`ebEVJA07!*@O__9ap8zS<-3~`sx~YWs6MxQLe0!W6KdDZolsY~WI}yk z{RBoP7G^kPV`ZT-l#VQ}{iVPIfjWMpJyU}OYq0&^LNCy zegFUe{~vyl>kfzp6^vl|8n+;b1{IJX8dOMvXiz~3qCtfvhz1pyAR1I?f@n~|38F!T zCx`|WpdcDlh=S=U_6#5zRG5NjP=N}fL4_)qe*I$shz1p|VEU@40*D3`vLG5%(1K`C zVGE)`1ulpN6}liARPcgmP~i)rK?N{~1{J~}8dMO2Xi#AcqCo{Rhz1qPAR1IKgJ@9U z45r^-0lNoONQ3yGf*M4F3TqGzDzHH`sL%${pn@Ajg9>jD4JyDvG^h{<(V&7HM1u-* z5DhBOK{TjP2hpH{9ZcWi1ltQL;6Z#)ArGQK1wDuc74{$+RN#Z@pHso%1Svwkst`als8RsYpo#%RgDM9Q4XPkOG^mmQ(V&U~M1v{| z5Dls@Ks2b*0Moy@!R`Q69w0ub0s+yWN(4lMDiRP4s!TvMs6qkJph^WqgDMsf4XRu~ zG^m0B(V$8OM1v|C5DltqKs2br0nwmJ2SkG^9x(mjBG{jx3JAmpRYD;8_X}pQIH)oL z@j(?5C>ww(B@hj&m_RhBastty3JOHC8+0jv>6bEK8dO<<_@D|4M1v|V5DluhKs2cG z0@0uf3`Bz}F%S)^$UroxG6T_qfd>|VXi%jFqCpiKhz3<|AR1J`foM=A2ckh09f+2Y zSTO-iKVA=}L6she532Y;G^p|e(Vz+tM1v|p5DlsbK{Ti`1ks=h5k!M3MGy_D7(q0s zas<(!3KB$vDoGFxswhD;sImmpUroUFgDOoBA5?LIXi((|qCpiXhz3=nAR1JWf@n}> z3Zg+3Du@PEsvsIvv4Ut&37e-_Jb;K5Fb>5gJ@7C4x&L7Ifw>T<{%nWp@V2pr4FJ&6+4IqRqh}f zRKbI2P$dtdK@~lS237VT8dTwfXi%jOroS72;{#OrgZQ8Z0Eh-P0zfpVApoL5jR6o1 zY7l^EP@@1ugBk`P8q_!d(Vzwbhz2zhKs2bK0HQ&S1rQBtFo0-KqX9&N8V(>D)OY~X zFQ$Xt18PKo_@IUahz2z#Ks2a90ir>T3J?uySb%6y;{rs38W7b9wObe%KrI$>TPa+g!6CYa?!F-gI=+SmdZu~?I=;prO5czR E06*^bi~s-t literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT new file mode 100644 index 0000000000000000000000000000000000000000..c05e45fddbba6a96807d30915e25a16c100257e5 GIT binary patch literal 127 zcmWHE%1kq2zyOR43=AL)lK`< N+2|S?*%=yf0RZ}u6RZFL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 new file mode 100644 index 0000000000000000000000000000000000000000..721cde2f3896162d84430f832fc5426bf2edb9ad GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|Nr9$3=FykAf2R`@B?HX6l0pi MWut3gWM{+$0A>vp&;S4c literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 new file mode 100644 index 0000000000000000000000000000000000000000..ae06bcb654b641b86c40254dd0adce48af80c5bf GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|Nqqs3=Fyk#taM$q?qsnWF8b_ On#5(JYhY|=%mn~hu@#sA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 new file mode 100644 index 0000000000000000000000000000000000000000..5a7f878c98d53b58dfa59738c26f0689a1b6c6da GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|Nrp=3=FykCJYP=q?qsnWF8b_ On#5(JYhYq$!UX_LRTW?W literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 new file mode 100644 index 0000000000000000000000000000000000000000..18cbf1fe2bb028343e36285553af105cd1ed15cf GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|NqVn3=FykrVI=Wq?qsnWF8b_ On#5(JYhY?;$^`&G`4uPt literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 new file mode 100644 index 0000000000000000000000000000000000000000..1aa4be88302308a9a764d0dd632b74b3325592f5 GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|NrU*3=FykW(*7rq?qsnWF8b_ On#5(JYhY$)#svU0ofPl@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 new file mode 100644 index 0000000000000000000000000000000000000000..cd8ed49af3204f76cf25844942015205fe7e360b GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3|Ifhi|Nq_+t84Kfq@hget@(>F{Vje NHrj@UcDja!TmW+N5jg+= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 new file mode 100644 index 0000000000000000000000000000000000000000..09297f1bc24ec1d8c42eb6129d3a4641286f5a99 GIT binary patch literal 150 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^#eae#qA+YqFa6cc`cv_dhaNnAGC LhDLU}hDKZffSeI| literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 new file mode 100644 index 0000000000000000000000000000000000000000..97ae1e140a4db63082e006a9efff0ceeeb25aee8 GIT binary patch literal 150 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^$}c7cIG+t8SSfq@hget@(>F{Vje NHrj^9cDjbfTmX(n5xD>W literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 new file mode 100644 index 0000000000000000000000000000000000000000..58d6d1b2adcec0a790f8266afc78e02e653befe7 GIT binary patch literal 150 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^#8@_>Os+t7r8fq@hget@(>F{Vje NHrj?JcDjZpTmYN!5%~ZB literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 new file mode 100644 index 0000000000000000000000000000000000000000..f0dc70625cf4e9dd2fdef1ed8d3c91827199be5d GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^$BQD9)uHUQ})#e^Rqtx$|<5|@p( KfsviA5f=dLf)4Ef literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 new file mode 100644 index 0000000000000000000000000000000000000000..a0790fe9cd25455191d6e49e9557897e926d0d46 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^$>GGJiPHZW#jU?9bWA0VwzjA;^= MjkbZYovtw#0Qv0?EdT%j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 new file mode 100644 index 0000000000000000000000000000000000000000..a75a173dc6414570ed2a5da2de82f8500714207d GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^$haA082HZWmeU?9bWA0VwzjA;^= MjkbY_ovsNN00(CeZ2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 new file mode 100644 index 0000000000000000000000000000000000000000..85ebf22e8f941954a5b58e4a26071a5ae6135897 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^#$3t(W-HZWyiU?9bWA0VwzjA;^= MjkbZQovtYt02I;>tpET3 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 new file mode 100644 index 0000000000000000000000000000000000000000..95def1f9eaf83160e6dcd3d3e883fa8d4f6b0d31 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^!jNnl{mHZWsgU?9bWA0VwzjA;^= MjkbZAovs-d03tmP?EnA( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 new file mode 100644 index 0000000000000000000000000000000000000000..c6a776e95bda241701c82f9ee62e2c12f1f7c360 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^#ODqvvHHZW&kU?9bWA0VwzjA;^= MjkbZgovt|-057NzEdT%j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 new file mode 100644 index 0000000000000000000000000000000000000000..f74a16f98a8710c8ef291b73e1c3e66e368a6203 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^!@XkcK_Hn3n|U?9bWA0VwzjA;^= MjkbY>ovsBJ06h~BZ2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 new file mode 100644 index 0000000000000000000000000000000000000000..9b647c0fa95c3838ab9a1fd7caa888468c53d654 GIT binary patch literal 149 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^$Zo4~-JZD7g3z(9%#KR{Zc7}F#! M8*KwiJ6%gI07`xktpET3 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 new file mode 100644 index 0000000000000000000000000000000000000000..c05e45fddbba6a96807d30915e25a16c100257e5 GIT binary patch literal 127 zcmWHE%1kq2zyOR43=AL)lK`<O=5C#SYBJ_dufH2Dsh(;I*F@P)7ImCbq0J+r% AZU6uP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC b/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC new file mode 100644 index 0000000000000000000000000000000000000000..c3b97f1a199421d6d9625b280316d99b85a4a4e8 GIT binary patch literal 127 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan new file mode 100644 index 0000000000000000000000000000000000000000..90d7c2a810846febe4c2a6c60e8c0156505d4d91 GIT binary patch literal 1197 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 VxsI=~o~fRJj<2Bsh}Jje0sv~)fVBVs literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava new file mode 100644 index 0000000000000000000000000000000000000000..4eabe5c81bd1eaf255fe09cfe72f10f61762fd5f GIT binary patch literal 2272 zcmWHE%1kq2zyRzF3=AL)lIVl7c^eoQ7-sW`C(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f z1ZUxdGta#R&aM=naBh*a!1+lg0vGb)CS0uiFK}t0zrf`NnF&`sF9}@ru@JbXxkcc* zj+DR+&S?TS84Cn%zN`=sc$-onn4&&GC`4j{u&;}Ni1DupqROu)hzZ}BAkKVtg81is z6C@t5pCEa8!33$p6DLUT*()HkW}SfSocRKBJre}vYZ?UIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN|?j{OY{w|wfwbxm| z`gX(wn`QA6YwucIl*1| zzJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)ppr?64V0hPrpq$hR z!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)IOCV-}pg`=FHv)0> zp9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n(Ie`+_p8}61JR%?2ckjQ4n%{p9*72IKM)Pdf*=}{4M8+0D}rcHb_CI&ED54P z*%Cy9vL=WIWlu2uvO)ml4Nx`((V(mfqCwdeM1!&{hz4a_5Dm(@AR3f?K{O}}gXz!v zK;gmw%E}-24!&&4a(*q8kE&RG$^}+Xi%01(V%P( zqCr_7M1!(Fhz1n_AR1H*fa$L$V0VCu0}vlnB!Fm8u>hh$MFWTi6%Qa9R78MiP%#0b zK}7|K1{D_|8dPL}Xi%{MqCrImhz1oOAR1JJfM`%L0;d1ggToV4oPhYCA_YW)iWLwI zDq27^sCWU;RFr~f zP;m;PK}9Nv1{JGd`okk|e1M8q5Fb>;f@n}N3!*_qErMK6d3 z6~7FO%uLKIteB9QjeQ^>tN`ZiU|<0ky&T|Tm=_n@$2Wuly(ngYm&FW>j9kvHA-aa3 Wl3K^tSkF|?K*!h607UB>a{&Noms|z_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels new file mode 100644 index 0000000000000000000000000000000000000000..d8f19a6312a2c271e09103ca2674b33c6c33c439 GIT binary patch literal 2970 zcmWHE%1kq2zyRC~3=AL)lGp`hi#0GXFwAiAY?#fXS}^!@A|lAJ#AMFWAt|`e9>d_J>UcJ_|M%ZCbD;KySfT z&nSg$1_BGV8Okk;2{`mlgKS?_98d##V&` zv!xXdR!mnol+mGZIHFSFh`s)TqZZK$$E*%29FMrR;P@@h1t+{D70x{O7C5_7e8Ra! z&I0ErnFw5n-k)$GFK)ucA~AtWehw2ZPjnEt;;lS^SL<&9?~>#ReBDw4{4K5%1WL>% z2&Sk{5DJl)AnfZRAY%M$f~fNA31Y%`CWteiogn^s-vo)r>nBKFUNAxG@Wctyd-e** ztXU@@J7>OtT+ajn`I<%ng`6S*#h7FPC7%!hWgAxk6&*7HRT*^wH6958bynvI>R(MJ zXgpP&pm|kng4R*?3EEqJOwd{Ka)R!ZTNCtJPEXJ;*)zc)W$gsR*qZ`IMOy@nZFdWp z1Wgk#m7ObKW>g_y_P1WZLVC&si@S*emcPp;SnYKdu)ZBJ!Ddw1A81^9iobe+ArFPfl=GzAxbZ?wNom^Faa6b0-A69xoQ~ zUbjlX=gj^IzI{Ccerpy^@XyN=2 z7A%mTAwQv@%~YT;&_f zn7(@J1BeEdFCZFJ#(-#0IRm0WWeu1<_rm~0gUTEb4Jvm)G^p$W(V+4NM1#s85DhAa zKs2Z<0@0xI2tZJ}gUUw`A5=zyXizx`qCsUPhz6CHAR1I=g6X`t2_PC&c7kY7`3a&yWhjUSm7}0! z04htt^pfNWAR1Jrf@n~=3Zg+}D~JY_uOJ#!#)4>2ISZmeWi5yXmA4=oROW(cP`L}H zKkoyZ3o3s>d{7w-qCw>_hz6C#AR1I2gJ@8h45C5hGKdD1%^(_7K7(jb84aRAmV9b zwu5L;`3|B%Wju%mmGdAPRMvxNPA&>?AR1H$fa$x5U_PiW z0P#Wf0f+|G2_PC&FMw!J-2kFN^#h0o)e#^XR8N3tP+b9{LG=ZQ2GtoL8dPt9Xi(h& zqCxcshz8XmVEWxNu>GLA1jGl`CmLm~js+&MG zsD1*`pgIafgX$>|4XUd^G^oA;(V#jDM1$%r5DlukKs2cS0@0v43`B$KF%S)^%fR%D z>0tMO>NF4^RIh<(P~8TiLG>Gm2GwyO8dT4LXi!}TqCxc?hz8YpAR1KffoM?O2ckjs zABYCkfgl=G4}xe=T?nQ>JOalDs7?g&LG>bt2Gxxq8dN`mXiyyqqCxc}hz8Y_AR1I( zf@n~k$-v0O%*M>Z%EHRY&OtN;sb^th1yRgg+yez+wI+)csMcg)0M(j&0-!ofMuAZP zTzB$->rpV9Q5587kQ#_egc={;5C)v}Cj)u~3aU=IoLxh74V_(sLv(zN^-T2)bbJjB JK(xLw7XSfh#e)C< literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest new file mode 100644 index 0000000000000000000000000000000000000000..e0eac4ce33159ec614c51379c6c48935a114b470 GIT binary patch literal 2221 zcmWHE%1kq2zyKT!3=AL)lIVi61sfO`7`AV?#Ie)vbHdK|a}svl?@ic!zAjS|$hRmrP19NGT04j9vG@sHpmavF&aF zlb~q=rm}Md%#11o%>LF3SV&KqU~xB5!18z51gpKy0@k-9CfF>CpJ2P&YJy#x;{^NJ zG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3%J&7_-#ruXWIib1dG3UO*W<+k z-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscAP6#&7nGoXRJ|R@xZ$g-k=7g~C z1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aREtN$zzKjoZ2Li|;M#M)OAlI*t& zB*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKNDko&!4VjR=B6>p3u|k2|4%-QN z%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7(-)mk_TiC01>g4x6&H>ORKB}8 zp=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#WnxB!EUYXTVjvYzK~|7F3o9EtwIKt8 zL1P~3%N+24Poj^1wOMz%mwgSB%4#4Ql-)oyD9eH9qZUdJKr|@pfoM?n133$n1wk|@8-i$1Rs_+Y z>sc>|~vU;t%N5FeCHK{P0p>Ja%Yqo7Yzv}6SrD{0MVeV4x&NX z9Ylk&JctHmdk_uE`XCyV{lWB<4PbqsVgSSk6$Ky~R2+b4P>}$lLB#@y1{Dn;8dN-h zXiyOWqCv$3nEqQY0HQ&~1(?2@21{Fyl8dNNSXi(7vqCv$Ihz1o=AR1ImfoM=s1)@R46`1~R zFabn^iY+jGT?otv6<;7es0ahmpkfR}gNiZ`4Jyt+G^j`e(V$`tM1zVp5DhBcKs2a` z1JR&j4n%{BIuH#i?m#rC$OF-!Vh>Eem=3ldRQ!SXpdt`NgNi{A4JryjG^jWP(V!v` zM1zV&5Dh9CK{Tj%1ks=(5=4WFNe~SxDnT@;xCGIlA`?V|icK*6;So4KK*cAB4=O@I zG^iK_(V(IfM1zV`5Dh9)K{TjX1<`etOTg|26|W4#xP0Yubq&!q0u{eHzQ%f{dItK& MI=+SmV3r9N09ZIe5C8xG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest new file mode 100644 index 0000000000000000000000000000000000000000..3ddf6a528983fc02f9ec0a534756e4d6c17e0e70 GIT binary patch literal 2405 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau new file mode 100644 index 0000000000000000000000000000000000000000..2109b52a734c1eadbc8ffa4fbdd5e6a53fbbb60c GIT binary patch literal 2445 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 E06*^bi~s-t literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar new file mode 100644 index 0000000000000000000000000000000000000000..a7105faaeb14ccf0a5d3588e74be709fab224275 GIT binary patch literal 3061 zcmWHE%1kq2zyRzF3=AL)k~jusOEoYsFw9n4yI}S;R)sm|4HnE@a(KbKIdd1xpDwjv zLF+Dsg=K#hEJ~fDu(@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8 zzx<%E=6H_6+LMmR2}eF-wx z1x$jb37E>x6)-cZ5HR~&FJK`(WrD@sL;=g+WfQFSIty6ej+kJxEPjIRZmS7)ZH^P{ zXUj}*NK>BR*kUQ*TJZD0PkNbpBalZ*+I+_#0 zz8g%45OouXxGppy@~ehG)V41ZqOWoZ#4HdLh~4r=Ag=ziK>U<*0txX~1rlptO-Qoe zE|461WklZq z^9eArfM^B|1_l`gMji$RJ^=Xizx>qCsU5hz6BMAR1IAfoM><1foG@6NmMthz6B?AR1KufoM<}2%7wA0@SVEX<8uzFB=3*v*y zTo4T^cfs_}so;14mA@c9s0;?tpmG>QgUVtMefP*uus=X$GKdcWun*gFgx z9RQ}knt5 z28agL8z34~cYtV6{Q;subqJXLTQ2~jL3Ih3zMBZu1>p(Q9z5~&qIuAsH z>OBw*s{24RsQv@dpgIslgX%#L4XO)4G^joV(V#jJOuv{8b`Pj-1o1)jBZvmoksumW zPl9MrT?wK=^(BY~)tMj~RBwW4P~8clLG>qy2GyY;8dQ&hXi!}WqCxd3hz8ZEVEV%& zaD0I3RuCUlzk+B`9SfpC^(=@6)wLiRRNsPVP@M~+LG><(2GzX`pbC^U46Aw})h>iY jGhrB1zFf|(A-aanuE8NXzQ%f{dImbah6W&7-@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8 zzx<%E=6H_6+LMmR2}eFf_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t z@lS#4gP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EY zCx}@bn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S* z#YSHNC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj= z@&w%}w4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa z`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0} zgml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTr zcS2p|k_q*F^%IyFNrlXeFbLAgOoDzEHcZ8=Z1^BMK1p)r{{R2K6;z(_2{5vNXixzs zqrk|+z`!TKzycx>;-DhW$2Ww*DL90|9YnhXhcGZOGBPqSGJ^GjXd=qaFCc>$7#IY9 zKy)$u|NsBLR4nId5Dh9z!Spp&1rQA?Q$aMSTm{jfvK2&w%2yB#Dq}%3sGJ4Spt2T3 zgUVYF4Jva%G^pGK(V(&yM1#s-5DhAW!Sw4N3qUleEC$n8MZxxi%4859R4#*PP}vNk zLFF@u29?nu8dOe$Xi!-VqCw>~hz6C}AR1I|gJ@9M4WdEiH;4w6;UF4Rj)Q1WSq`S( zUje%ZRHlRYpmH5VgUWUg4JzM3G^mUR(V%i3M1#tD5DhBtK{Tk$2hpH%A4G%7eh>{R z|3NgU4gk@hdH_t{;so0Zst-VXP@MpxLG=QN2GtE98dN`kXiyyiqCxcphz8XaAR1I( zfa%{x0w5YxZ-8h}-2tLO^#_Os)gfTo>F)$Eeg6SiJ*Ykb@j-P8hz8XwVEX4&aJ+!( z7Z4v*$AD;1Jp-aabq$EVd*mnBAD}u1#0S+oAR1KnfM`(t1EN875QqlVLm(Pd7lCL{ zeFUOGbrOgM)k`26R5yX?-`rq#fa)j^A5>3)Xi!}RqCxc)hz8YJAR1I}foM?O1)@Rq z7l;PcVIUe*kAY}VT?V2-^%;l;)oCCaRIh<(P~8TiLG>G$esB@&Pf$Gv;)Cis5dHfF zGgur{=Yja3dJmM{Ky@F82GxHc8dL{@Xiz-}qS+0)6u|UL888j16G41Xy$GT~bt8xd z)sG+=R7ZknP(2BvL3JgF2Gy4!8dPV3Xu-e(3qUle?gY`G`V&Nh>QE33sz*UIs4fN3 zp!yUS_=T zs;@ybsLlq_pn4lbgX(TD{agh^f$MM(15}TLXi!}aqCxdJhz8Z^AR1J!gXzEZ0w5Yx zzk}(!iC{jco(J(kbv=j%)%PG8ROf?eP`wYLL3KZf2G#!{8q@{=(V%t!hz7L$g0-{0f77z_;yMSm=`vpXU+Ats*)Q$nsptcN% z2DN8EG^kAjqCxE%5DjYEfM`(r21J9}I3OC-&H>XO9)aTn)ZPK{L2Vuo4Qls*Xi(b+ zM1$HtAR5#L0@0v$5Qqk~g+Mf@J;VTN)R2Z@%^^rr2tpEP!fM&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstR zprT_Ypemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy z0@k-9CfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3 z%J&7_-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscA zP6#&7nGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aRE ztN$zzKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKN zDko&!4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7 z(-)mk_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#W&%SN zR(e7P2Juu-@)A#FU}0d;GGOFjV31K@;6-Np_=Yfe_=YgJx(0)Y5RiHXMn(|D$Vf!e zEr%uDA0RCZ3=IGO|NkGnOKmoY1|?+>4NA@+8kD3#%0S5)M1ztxhz2EZF#UN0Cf4ay228k8MCG$>1eXi&BQ z(V(mWqCwdMM1!&jnEq-q0Yrnc3Wx?}7Z44~G9Vh1Z9p_A>wsub_5snLECixK*$6~~ zvJ!{}WhW2~%2FU2l&wHCC~JXeQ1$}RpezQa|JDnDXi!!I({~fWd{CAH@j=-RM1!&( zhz4ap5Dm(LAR3enK{O~Uf@n~71ks=@38F#S5=4WtCWr=QPY?~tq97WSO+hp$tAgow z&%pMBvMh)X%C;aHlyyNgDEoqFP!7iXadTDuzHbs3-!_pyCKbgNh^&4JwvEG^l7|7@}npm#b@t Zt`Vr%((yIcGu1QDH`ehrGyt@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8 zzx<%E=6H_6+LMmR2}eFf_;q0Og5NKg7yPMSz2NWh-381A#}rsJBNSKzRw%G>S}Cv_bSbdElu_Um$Wh=t z@lS#4gP#KTCaDEH7Yr15C;nN$w?RmOzwq7yfth*>1OpE&5ULbdAZ)m3fk?!s1)|EY zCx}@bn;_17c7lY&iU|^r*H4iA(KSKp@Wcty50?wbtXU@@d$3bLu4jUP{K9Mjg`6S* z#YSHNC7%!hRP%J)W4cc(B$Hupm|kng4WBA6STMdn4oj= z@&w%}w4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa z`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0} zgml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTr zcS2p|k_q*F^%IyFNrlXeFbLAgOoDzEHcZ8=Z1^BMK1p)r{{R2K6;z(_2{5vNXixzs zqrk|+z`!TKzycx>;-DhW$2Ww*DL90|9YnhXhcGZOGBPqSGJ^GjXd=qaFCc>$7#IY9 zKy)$u|NsBLR4nId5Dh9z!Spp&1rQA?Q$aMSTm{jfvK2&w%2yB#Dq}%3sGJ4Spt2T3 zgUVYF4Jva%G^pGK(V(&yM1#s-5DhAW!Sw4N3qUleEC$n8MZxxi%4859R4#*PP}vNk zLFF@u29?nu8dOe$Xi!-VqCw>~hz6C}AR1I|gJ@9M4WdEiH;4w6;UF4Rj)Q1WSq`S( zUje%ZRHlRYpmH5VgUWUg4JzM3G^mUR(V%i3M1#tD5DhBtK{Tk$2hpH%A4G%7eh>{R z|3NgU4gk@hdH_t{;so0Zst-VXP@MpxLG=QN2GtE98dN`kXiyyiqCxcphz8XaAR1I( zfa%{x0w5YxZ-8h}-2tLO^#_Os)gfTo>F)$Eeg6SiJ*Ykb@j-P8hz8XwVEX4&aJ+!( z7Z4v*$AD;1Jp-aabq$EVd*mnBAD}u1#0S+oAR1KnfM`(t1EN875QqlVLm(Pd7lCL{ zeFUOGbrOgM)k`26R5yX?-`rq#fa)j^A5>3)Xi!}RqCxc)hz8YJAR1I}foM?O1)@Rq z7l;PcVIUe*kAY}VT?V2-^%;l;)oCCaRIh<(P~8TiLG>G$esB@&Pf$Gv;)Cis5dHfF zGgur{=Yja3dJmM{Ky@F82GxHc8dL{@Xiz-}qS+0)6u|UL888j16G41Xy$GT~bt8xd z)sG+=R7ZknP(2BvL3JgF2Gy4!8dPV3Xu-e(3qUle?gY`G`V&Nh>QE33sz*UIs4fN3 zp!yUS_=T zs;@ybsLlq_pn4lbgX(TD{agh^f$MM(15}TLXi!}aqCxdJhz8Z^AR1J!gXzEZ0w5Yx zzk}(!iC{jco(J(kbv=j%)%PG8ROf?eP`wYLL3KZf2G#!{8q@{=(V%t!hz7L$g0-{0f77z_;yMSm=`vpXU+Ats*)Q$nsptcN% z2DN8EG^kAjqCxE%5DjYEfM`(r21J9}I3OC-&H>XO9)aTn)ZPK{L2Vuo4Qls*Xi(b+ zM1$HtAR5#L0@0v$5Qqk~g+Mf@J;VTN)R2Z@%^^rr2tpEP!f4FRW5uS+=d z^kBfn!q*QjWpf5xUSyeY#hEGKst@mjYns&;u4})4aDy}U!cC^>2{&KbU%2&tMZ)b% zF#&h3Tu8XPx&Ok)FFO-HrR=)!HG?hTo4myZh6TGGFlKMQz|=730kiki3oMyC6Ie|) z1+e8!E?~D@(ZK$@lz~%n*#genRu8y7uwUR2IG4b4Qzd|RiDd%cvWWrwEz$`BZN&jX z=`#)p`)1F%@YE{yCwwXq)rI7*e4L;<31r&+;2jd-Mk55-wh^&pVteh|Ns9# zBQp~@kcAZnnV8wwiG|D@oEVUmm4QK81C&0cGZj;uz@fI-y9H-y2{H-y2}H5f#MFlZZ?FlZYXgG^;$U|?iqWP~z790nrtN(%!d z-$?#|YW)BI|NpRUCvJdfP~HL2p!@@-ukO15qCxoxM1%4Yhz8{+5Dm&xAR3gfKr|?C zfoM?v0@Dxwg7t&)8Hf+cYakkw-@x?$gJ5}3z60?=c@IQ`@*ju>GNDKs2Zv0MVeb07Qez0}u@=6F@YmTmaFavH?Vc$_Ee) zDkDHNsGI=Npt1r)gUSmK4JtFh^qnaOKs2cA0MVfG14M($5D*P2M?f^FECJD=@&rVK z$`lX{Dpx?XijL$55Dh9{K(re7Z!jNJ&Vcx!vIazh${P?3Dsw zsLTS%0>_kDjz{KsEh>BpmGvKgUU(}4Jt1|G^or3)87pyfM`(J38F#eC&NfA OK)GzR4UFw{jky3o@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 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 Kh6Z4k2^Ro-H1nqb literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov new file mode 100644 index 0000000000000000000000000000000000000000..40b558f82117925877dc9ad67522db00a7b169d4 GIT binary patch literal 1167 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 XsG*|cYpiFgXP|GW<7;RDVsQZghvW_C literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid new file mode 100644 index 0000000000000000000000000000000000000000..9b51a73bd52e9afe7d788f548213ef57415f65ee GIT binary patch literal 2637 zcmWHE%1kq2zyRC~3=AL)l2{C7OE)kuFwEO^^uzoGmJACfNPk$^nA5O|^?kvr=Xnfk zPcHwkZn+V|`UU<48`?z}Hg;AqY$`Bl*j&_6uq8mK;n2x99}Y*vG92-+|8OK%`oU4l zl7!=m(GADH_I)`0^;sN3lL|QBu7ALFrKEs+x6A{c)zTk$mslq7b^ZOo-{Lw!pu}u~ zz}u7p!4&lgLLm|pgneBEM2vq;5LJFXK}`701aaoG6U0C7n;`Lc{RGL&3noY%o;X2z z&t3tUHR}Xq=gb$7>zN=RU(+a{kW(a}7?UiZu1&gwit z{j13Yji;&;G_Q(H&^pRKL3_)O2|7z&PSBllYl2?O=?VHJdnOp9tes#OdsD!uXp4Zc z?QQ{+plJf8vU3H@j4A}o{?-dvNKctyaW_%G@^{$;tG&(w*0&=j*er{mV7uFDf?b>A z1pC=C6CBc%CpflP3OKp3PH;|<7I0C0KEc)buYeot$qDYt_XXVFJrnR`J}BUM?u3BX zsAT)oY_CYx35RQZ_UC9{&{%<0X@wV0>ir|1m&bo2sY1|5aQ!LAynLNLYR)` zgs|@h6Cy<21R|~rO^E!eArQ6g%Y^8wTmmr*1O;NZyb*}2|11zc<(xo5{8fR(+E){j z?6(Uf$DWyxB0p0g)pp&4G>)wk(q$)1NPjVXLdM^s37ID7mf&2 zzPmZ0YQr*t>T|m%)XY3Ip?2Ne33ZiACe-)UPheqWLW9hVOl+)JAUg*eC)Ys0|NsB= zfbtKY03!>CX5eICkWpadMPdsvFz^X5h=awkuzh?(7{XnHK?Df{*JDh)t1s6+tKpi%)ugGvSv4JsYL zbguLR5Dh9NKs2bN0MlRlK7eRYi2<&kd{Ai! zqCq7hhz6C4AR1IMf@o0b2%M1x9k5DhBHK{Ti|2hpGs z9Yljlbr20I*+Dd@bO+I(5*|c@N_h|sD(OKqsI&*spb{TMgGzl64J!G;^o!|W_kd~u z5Fbbf7wF8I-)es;WR7-$pP)z}%LA3>l2GtlK z8dPh5Xi&`orawFa#|Nke0r5e#2#5yNBp@18n}BFgjRK-UwF-y^)hr+yRJ(v^Pz}Q{ kTE&2?7PKmc%h@$V*AP?>>G&G!nd%wn_!=63XnkWY0Mu6R_y7O^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta new file mode 100644 index 0000000000000000000000000000000000000000..c1208e2d2ec5e948a30dc3976edee6921d3d4aa7 GIT binary patch literal 2629 zcmWHE%1kq2zyRzF3=AL)l2{34^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(1nraAq?wbu<3Zg5T$_-VZL!_S*X9{iTMRPcM}mJfgaY$^CVbJ~Z0 zPcMA<-?X`a;pnChj7d`qnC3(kFgukOu(XzaVAY=dflbP|fSpUFfJ0oYfa8`)0q1v- z30#MG8@R81o4~X1eFN{d8x!~%FE;Q`+ciNTadU%U*_;VNj#C?iU84m=v^Ft_D!-l} zCVXdtIP=*F;-B|Tka)a)g5>1|6QmALoFKhtuYk;&bpo<;<_pO6Oc0Q-X%tY%DH2eO zNfuD@2@z1XaTQR}F%wXgQ5R6-kq}U4b)KO9)ntOkQ`HHYSH&i19c7=Oz2(OQoh2_P z=uWvcL9gZX1pSgd6AV(;PB4tUDPUBzMZnm0w}45|GyzlDxdLWJ6#`~|>jf;Nr%bT8 znu7-EB3&uFY|R{cM>D4r$6099t{}oZMI^IHyPpxTrp# z;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_sVgc`Us|0+`?4RJ<*CXJ!X5j??ygY$` zp5_UG;awAga#AM*o99dj@o}FJD(*KSOh>pDB=PyKX`n$JPnyvJ)nx zznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWaguG?J0{I#86AIc)1quUg1d7tc1&R&j z1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0-JDRhVVOYnx!n_LW*(YQyKe4;y2>RJ z>ig;^Ff%g2Au|gz3o|1Vh-6`Afze=5kQiJY6C)EV8@(X|1MeJA?vhbpWMN?76JX$k zkq{9G2@?154PkJ04F(Y*ARUa1jEo?ffsv7j+`9^vdw+oSFfjc8|Nno%-peT<8kC#C z^wl#DKr|>;#9l>#6dR1$z_P-y_7K_vo+29*jR8dNfXXi(_@qCq7Dn105DhBnKs2bd1JR%o z4@`eG0lNcK@`3oE(ho#~NlXi#YmqCq7(hz6DFAR1J%gJ@9c4x&LNJctIB z@*o;i(t~JFX%C`7B|eA-mHHqWRPuvpQ0Wh%K{WuFelZ>F9#BmH;)7}f5DlskKs2aU z0MVeD0Yrmp2M`UaAwV>!mH^S9ngT?FY6}nzsxd$`sMY|{pqc|jgK7^D4XQ!F^oK{_ z_yE-;AU>!z0nwlu1w?~t6%Y-oSwJ+Xb^+0#8U{pzY8em>s%aQTR#n60>>8qL2&#v4 Te2w)?^$c`;4GloFzA+a7oBj3| literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn new file mode 100644 index 0000000000000000000000000000000000000000..29b3c817f4637e98623c5f76a6078f18157b5cfe GIT binary patch literal 1909 zcmWHE%1kq2zyNFv3=AL)k|=|+1sfO`7?u?0OP@X$m~iI6(*#lFyA5K(=NiPB_cw@t z-q0ZNc>M&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstR zprT_Ypemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy z0@k-9CfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3 z%J&7_-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscA zP6#&7nGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aRE ztN$zzKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKN zDko&!4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7 z(-)mk_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#W&%SN zR(e7P2Juu-@)A#FU}0d;GGOFjV31K@;6-Np_=Yfe_=YgJx(0)Y5RiHXMn(|D$Vf!e zEr%uDA0RCZ3=IGO|NkGnOKmoY1|?+>4NA@+8kD3#%0S5)M1ztxhz2EZF#UN0Cf4ay228k8MCG$>1eXi&BQ z(V(mWqCwdMM1!&jnEq-q0Yrnc3Wx?}7Z44~G9Vh1Z9p_A>wsub_5snLECixK*$6~~ zvJ!{}WhW2~%2FU2l&wHCC~JXeQ1$}RpezQa|JDnDXi!!I({~fWd{CAH@j=-RM1!&( zhz4ap5Dm(LAR3enK{O~Uf@n~71ks=@38F#S5=4WtCWr=QPY?~tq97WSO+hp$tAgow z&%pMBvMh)X%C;aHlyyNgDEoqFP!7iXadTDuzHbs3-!_pyCKbgNh^&4JwvEG^l7|7@}npm#b@t Zt`Vr%((yIcGu1QDH`ehrGyt#rGT~HQ!G$x=y#>y$6rXTzk+Z=0 zNhSgpxR??|)t6roleps`&T%_H{1^WLiC26VByT%ANS&E{L3+=E4>D^eevqBh^g*tt z_=9{+$_Is<&<~0+ZXc9<%s(jGXnau7k^G=4!}URRUU7i>SBV0Rr{WEoS2-HAj{I!U z-twwJXUXjb-6>}p^jh{d=$EW(Fi4r-U>JLv!Ki2%gR$*e29ux;22MOD4HkEU87zNiG+6C5Ww5^O)nKzMu)%h>PJ>;WafAJAz6OUh(FVsBZ3ZXT?+wl= zybLa?Hyd1?-!r(e?rv~bzR2MI?goP=^JWImbGsP49#3WPUN?uq=gh_i-@ZDA`v3p` zGcqx=v9PkRGP6S<2PYgdb8!;~d3YEYByWI%Tk-@03j>3U0s{vFgO&jU4+8_A0D}NX zgi!=WS~xID!en7=Mp=+7RF{&EZwQ00ZwP~{YY2mHus4IVYY2n0YcPo8!r%&GXd4)V ztYctgWME(f0Wc3n5Roq2Vd>%rRMY?e|Nn<=JEZ}lLFoiUgVG9!2BjAe4N5a08kBB8 zG$`$WXi)kA(V#R0G7glEKr|>VfoM>A0@J_v4}fS;x&qOlv<0F;=?g@I(in&ar85u> zN^2k*l-@uzD9wRrP`U%rptJ{~LFo@fgVG>~2Bkv~tt!Ly0Zh*;4gk@hGzp?X=@LYP z(k6%orB4tIN~0heluki3D6N8MP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco new file mode 100644 index 0000000000000000000000000000000000000000..0b40f1ec9321e0b521a0d36a8e6ca9a9de08282f GIT binary patch literal 2953 zcmWHE%1kq2zyRC~3=AL)lGq7l%QrAEFicDc@Sp8o@nQCLoq{=gCKk*+;PGKz=f8sa z3$#8gNLcz|VFS;HMS4OX7FYRvSYq1vVQHLl!7^3T56jhOe^?QrRbKdlgSJY-nfwu(31y!=?hIg3U!81zQ4G3buOcf7qt~ ztYEv5Pr(lU69qf|?=0B)epSJ)YY88A-#GSR&x!3H_U>5mVc-1tg8ehPJ{*|!;lsg- zoDYXGVm};?@cVGYp0(hpg~5koR?|Klk62T1{1)eeQ{vGdPCW{FaC&X#hcnN;1y{GWZ*iR93?VP6*k5#wJIM3rAp5EH&LL7e&Q1o6-NCP+M9KSA>Hf(cTGCr*&wvsXZ7%{l?u zIr9bNdL{_S*E9+!u|7tQp|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C*zUHPVAtk2!G5;P1cx-` z363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~4+?mmJ0alpc(H)@x>W)` zXZBCI!A?&-sga}bL zfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1e^nr{_SJ+W`|SeBv1cZv z$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCS_Lv?F}fmG8rl7#J8B z8NmiXDG-~Hk%;nR7p(mF0n)<2!0`Y7|Nq%1T&I9&PWeIS>sh>p(Q9yaUmo zG7m(9$~_PbD*He*sQd%bpfV6dgUUe=4Jr#kG^jiT)3-PmfM`&;2&Nx}JOI(4@)1OX z%196mDkniSsH_Chpz;z#gUU=04JtQ5G^p$ZMK`GY1ks=}6hwo{Q4kF(OF=ZKJO$C9 zG8IIF%2f~zDqBG`sC)&{pfVOjgUVSD4JvCvG^o4<)1UWE0MVdw7es@~UJwl`e?c^; z3(V+SPM1$%G5Dls)Ks2bX0MVfO0z`xA3=j>fH$XI~?f}#8o`LNL)gd50 zs2%~)pt=M^gX$9y4XRT>G^kzy(V)5oM1$%V5DlthKs2bH0nwnk21JAE8xReub3inx z-T~2|x(7^uHvq>6s15@0LG=)b2GvC%8dM*FXi%L5qCxc%hz8Y7AR1IZfoM=21)@Rq z6o>}ZRUjHvUx8>)odu#n^%jT*)mM1$%y5Dlu= zKs2as1JR)R4Mc5t^?7a`VK^c>O2q)s`o%NsO|&Np!yF)gX%yq{oxTf zK0tLLh!3g{K{TjN1ks>+5k!OPMi33EA3-#zjs(%5dJ;r~>Pm*u%96ColFQjOMAr~h Vqw4q?>zV2q==d5MfM|VVE&zi)#Z~|S literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow new file mode 100644 index 0000000000000000000000000000000000000000..906bd05f344ae9a806c1b20b8e2bfd7061d35fa1 GIT binary patch literal 1544 zcmWHE%1kq2zyN{_3=AL)lJJAF)fyNW7-q-I9iMCWsdApyyPxyETV~F03IDm^M$XHH z43-TGZI(GK5y(BT#MWrTQqhbJOKq7CESGZ)*t$eAK~#PD1u=;`4&ofQ1H^yvACP#( zcR}*DvxC%`$rq&eEchU^X5t6gIZYqrdWt{D*Q9(<$O-+R7~}Rq$;bSIvW>kITt z78DqyOe`>r-SfeyX!-|Z+j$>Mf+|0l$~Js3Gm8FT_BZK+g>*%M#a)*VmcOG4toEvX zu)b|mV6)7*z;?G>fnA$wf&FZT0*5sA0>>7a4^FNx3!IbxeQ;4dUEu2c;Da0M+5&gw zLm%AVo&4a*yyS!Dxz!)M9=Cn)Uf27<=gi^)-@g10AwIGRjLb~TEKDq{Z0sEDY@BTD z5Xi-i1bKLoILH#{Y(6dq24zc7v?yCLurM$fwli`tFesOU*!I&Ic^DWh92f-|7_648U~dL(15*Z9 z*ANC**WeJ4GZ+{cK@=kdfS3>gFpGhKi1g(TOJ6^rdj9|a|37Tof#V<=l-@uzD9wRr zP`U%t-z_siG${RnXiypi(V%n)rfrrvfM`&91k<)g8$dKDU4m&_<^v!als-W;D2;-w z2c=UG4N9vZ8kAna^e_GcAX?%T-vtm2O1mH$lzu@pC=G*XP&x+DptKC4LFpMpgVHpJ z2Bm8d4NBV}8kD|4G$@UOXiz!_(V(;rqSd&6e*n>-G!Le~N)&)-P}&F4p!5%>ulxdw zgYp5056TN58k8SEG$>DiXi&ZY(V)BmqCxosM1%4Ohz8{o5Dm&JAR3fkKr|@NfM`&@ z0n>kz!0rO&9}pjuhd?waAAx94UINje`~;#wc?v{>@)d{%K{O~|f@o0Q U1ks@U$uN>LD3@=rx2`c407?aswEzGB literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia new file mode 100644 index 0000000000000000000000000000000000000000..3e663b215327d8899a4b3fbe4623f066630b97b2 GIT binary patch literal 2016 zcmWHE%1kq2zyPca3=AL)l4yXkc|nY&<#IbX->!eab$8MQ?q4Ync=jC&;9X*wz}NNg z0)LBif?#+BtV>baf0~gwg8F8tqGEsGXkUz zrzc47X}KV?rul*FoU{vaJ*f}mYdkI}1Q2)x6pz-8wfaaAq30g4|5+e@$~l3A_^Sem zwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2kp5!&gp9vM6EaU!PRP0&G9i0K^n{#a zg#x)9wiEJ}1q(~4PkI~4F(Y*AXSWv3=9m6jHD#+A0T}U3=IGO|Njq4=pZgAv4dz( zf(Ox{L=U1t2_Hm*5O z2% zK{P0{gJ@8O2h;DKf$axnd=MX$`9Uy$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_jx#=H-eO&}ZjDJlKRen7|O!&?OaptoV#6Rzw zAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{ zVO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_ zCK#lwonRPyQ^2Tbi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyG zw<9LlEQ_CDyW47lU7OD~~6Yyj{DByYSgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Z zoly4Skw69C_X!mjjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U}9uqWM;tv znONEA4;dJ^L_o<}MuCxqfq_qeffGhTL?9$c+{ZVB!Pzw!M1+8JFfuYSf@lUtMk2CJ zKP=n)0PA63`2YX^|Dty)IUpL8jllGk>I4uC%1$5}l%+s4C|iMOP}Ty`pzH;rL0Jq$ zgR&Wj24yu64a#mH8kFTgG$`AFXi(Mz(V*-HqCr^@M1!&+hz4av5Dm(XAR3engH?+D4T+4P*w%epzI2wL0J|=gR(7%24!6^{dpf)A1Dih_@HbI zqCr_1M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx4x&L>9Ylk&JBS8lc@PcC_8=OR z^+7Z!`-ADPCSZ4fiUANGR1|<{P;mgFK}7%A5sh>OeH8 zxC7CkA`e7^iaihwD*8Y)sQ3fXpdt`NgNi{A4JryjG^jWP(=Voj-2*BXL3~ir2%tsojyyn<*@5euS0#Vm*h6}2E5RNR7SP>~CwLB%e^Ff4buoLxh7 Y4MBynj<2zvsh)w3ub}~m);Hz?04sM{>i_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris new file mode 100644 index 0000000000000000000000000000000000000000..cf6e2e2ee95355039a90146a7f77d14224551b65 GIT binary patch literal 2971 zcmWHE%1kq2zyQ1q3=AL)lGp)d%QrAEFicDc=$`Ff@nQCLoq{=gCKk*+;PGKz=f8sa z3$#8gNLcz|VFS;HMS4OX7FYRvSYq1vVQHLl!7^3T56jhOe^?QrRbKdlgSJY-nfwu(31y!=?hIg3U!81zQ4G3buOcf7qt~ ztYEv5Pr(lU69qf|?=0B)epSJ)YY88A-#GSR&x!3H_U>5mVc-1tg8ehPJ{*|!;lsg- zoDYXGVm};?@cVGYp0(hpg~5koR?|Klk62T1{1)ee6FKS+&OG-PIJ;7O!nsAx0_P{0 z2wd=g_~1h4#}5~a!~`z+IZWW*ZOOp1TKWU;lH>_|-BJSlEv^#;O3Wq*rl?O43Xzx~ z?CT;RV*G1@sPgLxV#0SOh%=v^ApUvZ1c}G%CrDmiFhT0@#0k=S_6o?XStlSnXTE@3 z&jbPannnSIoFW0mm}CJZpAZ3M8&?4p9Wwz{8Fc|Q9ti<;R_6)oUri=xJXM{bc~xwJ z)=~Be+FO21&{^_wg6@=C6ZBe6PtY&fGr=Hb?F7Tvn*v5fTLg@4cMF&VO%pJcohx8w zR3TvYw_d9IqPH^QmCj`76FBb4#w@Se0%>D_! zeLVtxYZgxM&&v}C=xLr17~VA@C?|D7uzAje5Fhsmq2hiM!gMqzgnc)d5FzR&5OG~- zLgZHsfv9a?CPZK55{OwKC=k2ljX+%eXMy-B=L8bsuL>mAzM7C^zg-|X_RNG7`I!Q# zw(BOOacrHCE<0gD`itokGX54#$UIRwA?t3)gzOd36LO9f3gmX!PRLspERdfeKcS$_ zRG=`>MxZE7T%g!cPN2l~r$DJ7gFu|isHbyos)%=i-U`sXP_Vh1Ct>rqcRyXurM(2 z2{3Yic%b}?%4QH`V31K@6h$JXKITuEq6I{QiWe|_U8evEWHV;~w- zl!0haaR#D6MH+|(6>A_GRJ4KV|2x6i6}cc9RP2K3&-*5TXi)JBqCrJ4hz1qIAR1H@ zgJ@8345C3rGKdBh%ODz5G=peR@eHCtMKp*871JOZR8)g#P;m{SK}9x*1{K>N8dP+H z>8~bWcYum;5Fb>GgJ@7u4x&NDIfw=o=^z?Ztb=G!(GH?P#XE=w74aY%RLp~DP*D$} zLB&0Y1{L`r8dU6qXi(7)rvKIpfM`$^0H*IIg887T0K^AX2Ot_$C4gv9wE&_)RRf3y zRSzH(wc)e49PRV^SIRK0*`P!$8BLDdY1230j68dTkYXi${{qCwRThz3Ig)Gsw5B%s+K@BsA>Yypy~-kgQ_SH4XUO*2ckh$ABYB3e;^uE1%hZ$H3*_XRUw%E@CY0q zpehl>2UUw88dNocXi)VCqCr(8hz3=YAR1Ivf@n~638Fz&Cc|i*Nl~52Sju7EtmD5m2^q6;RPJ6Ht{=7f|Do5Kw1zo}m8KWP-+1)d`wc#U^MSWuKtE<;Mh_ zB`+uFPPsKfujTXv{gOQs3{uukFpRw^U{th4z}R-TfJx9a0aMwz0%k@P0%m{f1uUee zOt83{C}8=!Y=YHZX94Tm5ff~d#ZR!^Z8gEJ&2fVLY?%oTY048ETPy{f+*l_#r$`I9 zs6Lik#0jrHUNcjfy6?(d!ncrqUp@H}@y!0Yj10q=FI1boiypWxfqBjC4Y;ROG@ zJb{3o<_Uq}T@!+GQYQqP=S&Fkai0(>?l&P!M{`2hcY_HLqHY2a*M%lTe$^0&+V*8a z^i?i_m<56Yv0L5<#MOTmh@Wy!AR+#$Kw|By2}$KdLE=8XAq>v0 zARHXRz`(%B2tpvOjEqF2<|%*Lz>n6-yvUS3|of9U^Z<#*f z1ZUxdGta#R&aM=naBh*a!1+lg0vGb)CS0uiFK}t0zrf`NnF&`sF9}@ru@JbXxkcc* zj+DR+&S?TS84Cn%zN`=sc$-onn4&&GC`4j{u&;}Ni1DupqROu)hzZ}BAkKVtg81is z6C@t5pCEa8!33$p6DLUT*()HkW}SfSocRKBJre}vYZ?UIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN|?j{OY{w|wfwbxm| z`gX(wn`QA6YwucIl*1| zzJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)ppr?64V0hPrpq$hR z!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)IOCV-}pg`=FHv)0> zp9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n(Ie`+_p8}61JR%?2ckjQ4n%{p9*72IKM)Pdf*=}{4M8+0D}rcHb_CI&ED54P z*%Cy9vL=WIWlu2uvO)ml4Nx`((V(mfqCwdeM1!&{hz4a_5Dm(@AR3f?K{O}}gXz!v zK;gmw%E}-24!&&4a(*q8kE&RG$^}+Xi%01(V%P( zqCr_7M1!(Fhz1n_AR1H*fa$L$V0VCu0}vlnB!Fm8u>hh$MFWTi6%Qa9R78MiP%#0b zK}7|K1{D_|8dPL}Xi%{MqCrImhz1oOAR1JJfM`%L0;d1ggToV4oPhYCA_YW)iWLwI zDq27^sCWU;RFr~f zP;m;PK}9Nv1{JGd`okk|e1M8q5Fb>;f@n}N3!*_qErMK6d3 z6~7FO%uLKIteB9QjeQ^>tN`ZiU|<0ky&T|Tm=_n@$2Wuly(ngYm&FW>j9kvHA-aa3 Wl3K^tSkF|?K*!h607UB>a{&Noms|z_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga new file mode 100644 index 0000000000000000000000000000000000000000..b729ee8c2ee26c7bd74535ead106e8160afdf181 GIT binary patch literal 2235 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 JK(xLw7XTo89Af|g literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara new file mode 100644 index 0000000000000000000000000000000000000000..0539acfd78ae58d4503ea88c2027c4b489a207e8 GIT binary patch literal 1253 zcmWHE%1kq2zyLf93=AL)l5m2uMH(0w7#1>EHf&wO9U!Vc^MIJdIRkNyvkv0F7&l0~ zVmKgq+tfhnOzQ#ZJ(C{DtZ9BAJE!D`&00vLQjQWnqGT z$)p5>l;#A(*mVz#iaH+{+fI035|sVGRJQ1WnUU`Uv%et^ETpp%Ebf{;u>9?lV6|7` zf%R>@1e;~13AVch671T<6YOVwN^nU1nc&#M_rS^Zc7k*AhX*dIdlOupFFkN$ouA;Y zyyb!WyWI~wnWsJQJU91&*W-!@-s|cg_?%f>;M{|t;w%n-=J3WaR!Z0sED zOfW7!nvI=>g@Hlu3n*x{3>a7#7%UtZI2ah*0vLJF*^C?v3=lP128=8W3^ED~0w6UY zagZ(_-w+0E17ikl0}}>q15*ZV10x0oMg|5(C;+iR_JA-cG5rIifq{YH|NsC0K`{=Z zL9q@J2E{yx2E{&z2BiQn{flt}hz6wu5DiKVAR3e+Kr|>-fM`(40MVe-0ir=E1Vn>U z35W)z6c7zcEg%|{Vn8$~)qrSF$^p@!)B~c`xPN~D(V$cWroT!QfM`%^0@0up1*WgO zNdVEHlm((esS8AdQW%H^r7{o=N@*Y(l-fWvD8+$jP^tsbpp*xqL8%W!gHj-f2Bks} z4N8e%`ftbs5DiL^VEV2Zm=8*sAU-H{f@n|*1<{~X3Zg+N6-0wlD~JZASP%_LwICXl zazQjG^@3}&VL2-7sxzV zkg)W_!n(Byi(XI66M^%Ok3G1M7dPQz zk(j_GpGzMu+Zj%{;(1Bns_gfIYnszPTzlOx;Rfe4fuF`(Km5FTSt|4o|<7>;iGz?d|(fN4%t0kczi0ZVJy2UhLLAK3CH7qD}ee&BGm z`oQrz`~#O>cmdaG%MUz!mIXYkr9bdKdGLX+>+c8tvwsT&N~8(|*WND>3jR|dbZ+_w zVP6*k5#wJIM3rAp5EH&LL7e&Q1o6-NCP+M9KSA>Hf(cTGCr*&wvsXZ7%{l?uIr9bN zdL{_S*E9+!u|7tQp|6me zqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C*zUHPVAtk2!G5;P1cx-`363q6 z0#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~4+?mmJ0alpc(H)@x>W)`XZBC< z?duWnTeEP2e_ozIKu`08!0@gKK{=@tg3WU#g!s5m2o?965T>I!A?&-sga}bLfr#ru z6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1e^nr{_SJ+W`|SeBv1cZv$j=l= zwOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCS8ocRfM`%=2hpGm528Vt9z=sOK8OZoeh>{R06;XT z5CGAjf&fH=3Ih-gDiA<4s89gWpn?HRFLD+D(VzkXOg}ybwii@TfcT)o0z`uf3=j<} zG(a?{-~iE}!UIHu3J@^;x?uu{1{EYA8dR8o>6=Hu=7I_p5Fb>qfM`(R0-`|$42T97 zG9U)1paF%`(M=yf6sW)f(V#*HM1u+*5DhAPKs2ZT0@0vC2tEWHWFQ(;n1N_efd-~O@0$RkK?NI#1{H1~8dSi6Xiy;sqCo{6hz1pQAR1KQfoM>n z2ckg*ABYAOejplD0D@>xAqb*D1tEwA6^0-hR3L(AP@xE>znXyE0V*6pd{6-iqCtfu zhz1puAR1Iyf@n~I38F!TCWr~f@n}-3!*^72qHmREUFUP(co&L4`Sp1{LTa8dRu*Xi&ipqCtf_nEq}6jt@{F58{Ig zdJqjN>_IfBzz5NwLLWqf3Vsj`D*Qn-r~&}dph^HlgDL_L4XO-4G^j!V(V$8JM1v{@ z5DlsvKs2a=0MVdI0!+V{4t5WyvH}~RB?c4P~`!lK@|vy22~;;8dQ;h zXi#MWqCpi3hz3XId_x$}D<%eb&BVaS$mQ%BqH74Mw{(1s^-T2)bbJjB JK(xLw7XTo89Af|g literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 zcmWHE%1kq2zyRzF3=AL)lBk5Tc^eoQ7)~*nJ~;E-Tj1Sju7EtmD5m2^q6;RPJ6Ht{=7f|Do5Kw1zo}m8KWP-+1)d`wc#U^MSWuKtE<;Mh_ zB`+uFPPsKfujTXv{gOQs3{uukFpRw^U{th4z}R-TfJx9a0aMwz0%k@P0%m{f1uUee zOt83{C}8=!Y=YHZX94Tm5ff~d#ZR!^Z8gEJ&2fVLY?%oTY048ETPy{f+*l_#r$`I9 zs6Lik#0jrHUNcjfy6?(d!ncrqUp@H}@y!0Yj10q=FI1boiypWxfqBjC4Y;ROG@ zJb{3o<_Uq}T@!+GQYQqP=S&Fkai0(>?l&P!M{`2hcY_HLqHY2a*M%lTe$^0&+V*8a z^i?i_m<56Yv0L5<#MOTmh@Wy!AR+#$Kw|By2}$KdLE=8XAq>v0 zARHXRz`(%B2tpvOjEqF2<|K3=AL)l5m2u1sWI_7#1>EHf&wO9U!Vc^MIJdIRkNyvkv0F7&l0~ zVmKgq+tfhnOzQ#ZJ(C{DtZ9BAJE!D?_b~Szn-EvY@~qWnzJ0 z?4A!sMbkeR+s^x75>)xYRJP%RnNjoyv%g6nETk(6Ebh8|u>2iWV6|86gY|8j0-I&d z1-8583hdfc3+!hz6gZ@@7dW=ad~kAoS>T-f?}Ll#=>k{h2Or#6*A}=dANt__?&Jqg z<|Q9I&#nI8^|K4%se`1a+02=S3kh;a5RsQ>@}KLaB(69lrbf*~6_2(o|( z!kC4fg@u7Z8yx6b1`I3=3~m9891IK=4h%dn5+=gP!@vMh1CsUe4PnqWFlNv;FlEp- zFkxU|WME(f0T2TeQw*fU<`1wA28RFt|NjTYDu@QfEJzp>yC51A!ypw1JR(A2cki#4@84f zAczK~LJ$o~i69!38bLHDMS^Hhssz!XlnJ6isS`wlQYeT9rBVy$6rXTzk+Z=0 zNhSj4=UY4wRbPHVOyZ7%ILGY(@n8H0Bwq1dki6~eAa!Q)1?fEtKFF+@_(66~(+9bp z;t%pQDIXMaLO&?RxP4IaG5?@!qwzsSNAiQJ4A%$MdBp*0y?P%sue?dnI&wZhd&{{5 zoh2Isbf;`c&^>hQf?i9jgMLX%fI&*SgJJA~3r0oD7>rKVT`;!YEnpHfO~6!ku7H_Q zg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg#}-Qg zCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD}`zQGJ z^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y=5Y-nKC%gnOw4R7tSqd|>=4Mo35U!~Tp$RN z;N)QD<{<=mIT#q^e}G~{{s99E1A~kL0|x_xmH`6~0|TD`g8)c`Q3OU>I50}WWMOPZ zS&#^bgy^+!0OM1ztZhz2D;F#U`F0Eh-9Ll6y0iXa-496>ZFNrGrlvINnfqzR%y z$rD6_k|>AgOWFh1|@M24NB%98kE#QG$^@)>63L}^`K-A;)9Ythz2Ep z5Dm%#VES*p0Eh-<1u%U#5zGf=2@oHYEkHCVYk+7__5jhKECQlI*#ty`vI>X>Wfu?) z$}%7tlx;vXDC>Y|Q1$`QpezKULD>jIgR&Bse)kM)KPXFq_@HbBqCr^;M1!&yhz4ab x5Dm&^AR3g_Kr|@3foM>c1JR&t2ckh)4@85qABYBJK?cT=kq5bagS~Z)xd0HPQfdGI literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 zcmWHE%1kq2zyRzF3=AL)lBk5Tc^eoQ7)~*nJ~;E-Tj1Sju7EtmD5m2^q6;RPJ6Ht{=7f|Do5Kw1zo}m8KWP-+1)d`wc#U^MSWuKtE<;Mh_ zB`+uFPPsKfujTXv{gOQs3{uukFpRw^U{th4z}R-TfJx9a0aMwz0%k@P0%m{f1uUee zOt83{C}8=!Y=YHZX94Tm5ff~d#ZR!^Z8gEJ&2fVLY?%oTY048ETPy{f+*l_#r$`I9 zs6Lik#0jrHUNcjfy6?(d!ncrqUp@H}@y!0Yj10q=FI1boiypWxfqBjC4Y;ROG@ zJb{3o<_Uq}T@!+GQYQqP=S&Fkai0(>?l&P!M{`2hcY_HLqHY2a*M%lTe$^0&+V*8a z^i?i_m<56Yv0L5<#MOTmh@Wy!AR+#$Kw|By2}$KdLE=8XAq>v0 zARHXRz`(%B2tpvOjEqF2<|b$)mCVZekoag)n@y{C?Bpxqpki0ypLF#aGgY=&D z3^HpLFv!lC$RO9##2{Z&%%G5y!k`!v%An-q#-MCt&Y+^B!JsN5$)Lu=#h}h=+Mr&) z<$?NFt^|!IZv!;1yh+eHay~$N%ee%dB^v{Dr))^jYndFNUot7dAf+_GFm~MoqoV2y z#%S>=cQ=Z`1VkzL{#yY_{MOwf`_4x!>=f47OtS2Y9E8iDzfA>tlllh>4=eZLC zUXK?Gc&}R};B#jG1mC_M0lzg1C-~>(2?X>sPY4X}nh=zeIw9CRXF`aN`-D(&zX@SF zniIml8%&50brXoVE;J$XtA;?-wl5Q+uW|{*ED#ik-SS2tuKu$?{FHM73Gr725^G;g zNV4B9kQ{qvLW=xMfmGXd6Vf=gPDq!XFd_ZL^a&Y%izZ~AsGN{>H)KNgis%VB#|i~< zJ8UQ9EejUN&yb%`&}J%77-%CKnAVe5Sa&S@` zGB8MIfYPFj0s{*J1D^l`2LpqQ0wWKMt!2O{2oeFwLf8-zq~6mvgu&G{guxk%gF&3& z5C#SYMn(_@ksy;nY#f<^n}LA=gh9$0p=_xiARYq)!~g&P|A%cmrvjpj4nLLv(V$EM zqCpu2M1wL5hz4aC5Dm&SVEPwh0f+`=9*}XM3G98EpWjqiK%6uRilmS6BC=-Hc zP(}pNpv(xOK^YQ6gEA$E24zeT4a%Hgx_-+8F#VM)0Yrl`Du@PURuB!!upk z3I`AkDj+~KsE`2Bpn?KSzk3F@A5>s~_@F`qM1u+r5Dh9kKs2ZT0nwmB1Vn=h5)ch4 zOh7cKKmpO9LIp&F3KkFzDqKJ`sDJ^{ph5;jg9;ij{oP;!hz1onVEVccm=7v=KzvZ) z1EN6%5Qqj9LLeGc5P@h=VFaQ<1rmq`6-po)R4{>PP~ilkK?M|u1{G2u8dOk$Xi#AV zqCo`~n0_%GY(J>r0`WnG7l;NGU?3V)h=FKOK?b5hg&Bwj6=)zDRH%VyP{9VGL4_NL z1{H818dS)EXiz~1qCtfnhz1pSVEV%&aD0FYJ`f*N_Fq6@(xfR2YJ2 zP=N@d>nfLk-47}l85o(ES(sUvS((@%keve!LWH3tCl|FL1B2)tkfWqCK!u--0;p)@ z6JX#06^D!h-~y6|fkDfFQ4}Nsl7+A#BuKrFZwLdfLK35tWME|Ea&-;SHF9+g4$<*7 S)-%;J&^OlcH8cRTOt=8E8|p{^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm new file mode 100644 index 0000000000000000000000000000000000000000..43c7f2e23f3c37c24d39e78f8822b12c5a74b5eb GIT binary patch literal 1918 zcmWHE%1kq2zyPca3=AL)k|>9=c^eoQ7-q}$B+R~g>w~bbi-3snuL+{cuP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zOpMGd^oI-#d~%>P#wWnQ!oVP-z{mk3K_bDfAq>u792^2t#mLCOz`)3eBh9igFff2H zNM$9IE%*b(V_;zT|NsC0kgM~jfasdg;v^6aO3PsS>a7nTWuP<-qCx2zM1#^chz6x^ z5DiM>VEXgE2_PDj)1 zfoM=Z0@0wn1foIt2}FbP6o>}pD-aFJTOb;gzd$r7kAY}VJ_FN#>jgkGD8GT}yNO^v zDBpqjpu7j7LHQ3vgYqDV2IWH#4a$ok8k8SFG$>DkXi&Zc(V)BuqCxo+M1%4uhz8|T z5Dm(!AR3fk!SuUlVEaM&7Q_eTT@Ve*zaScvhe0$bAA@L6UIx*i{0yQ&c^X86@->JC zNHfD0=IMn*1Y c*AQJpXV>5m9baQTQ#}J6Uqb^Bt#8Z)0K;gpr2qf` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn new file mode 100644 index 0000000000000000000000000000000000000000..18f903fa6fd864237a679dd06c6a55eecce89d98 GIT binary patch literal 2187 zcmWHE%1kq2zyJaa3=AL)lBj{Ql^Pfr80JOlo|(6E!i4!P(`L(o=N35&oS$SOaG~V%15x$m7sMp)IEZuH4iNvve?a0D-v!Cr&JI#% zCSQ==v*3fwnu#A|=QMqg>nZ*qUz74dAt&^MVvO4dB_Hz-$~GDwRCFXisLDt(sPS+y zsI!_jsDD*!(0D4|pm~*}LF>rR2JJ1c8g!Q2ZqS`_ra`Y|Z-aixx(0)k`3;7#rx}cj zmN6LHu4OO@>R>RH?PoA!+ZSMFR3TvYw_djfcv{=0-nqV1w7B45b%1uSipPTDgmD} z`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9 z#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRwe zX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e& zgn~9xfxZSQr>&6c{-e82AJjcwwZB0)rp}gO&k0kT@Kr|>Pf@n}~1ks=z38F!{5=4V? zCWr>*P7n>sp&%NROF=X!r-EouZUxbx91EgBxfVo&axRDlN&pZIDh0r_Q3be!1C<6KKBzKs2ay z0nwlm21J8O84wLBX+Sinv;one5(h+sN*xdlDtSOOsPqBRpb`j7e>a!_qCq7Qn7%Fq z=7UNk5Fb=3foM?41foHu6NmoKB^`(cm3AN+ zRN{eXP^kx^K_wrE29mAY5>uK*V}y zf~d#N0x{uD3F3xVKZyT1_dt?iN`d6<_ynml>pw{E*()HkW}SfSocRKBJre}vYZ?U< za*6~LW0D1wd_n}2ZCnLZbj$=)Wz+@Kcq9bWS)C`Se>It)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH z=_wN|?j{OY{w|wfwbxm|`gX(wn`QA6YwucIl*1|zJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1 zKQB)ppr?64V0hPrpq$hR!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTm znGk)IOCV-}pg`=FHv)0>p9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!U zae-n(Ie`+_p8}*l&7P| zfq{XMk(A{B1Ei0Ef#LuE|NlYR07Qeb0*D4>2M`U)5@34A%LyRmpsWF=-`gdCXiydb z(-#UKfM`%w0nwoB0-`}#21J9h4TuJ19S{x5J|G&Dg+MeY8-Zw0RszwW>;$4gSqemh zvK5F1Wi2rM=N#BRP!vMgR&Zk24y!84a#yL8kFroG$`wVXi)Y8(V#2{qCwdZ zM1!&-hz4ax5Dm(bAR3e{K{P09f@o0o1k+zlz~KVQrXW5jtAc1yb_LO(EDNGR*%m~D zvMz`QWnT~t%EBNTl#M|&C@X_#P<95iZKukD#}1Ks5k@Bpdt-KgNii}4Jz6|G^lt3 z(V!v@M1zVs5DhBoKs2bh1JfTKf#U;I?1A{8q7Ouaia!tyDgr??s2Bv%prQ~&gNj2C m4Jr~r^bju=xtv`?bPb(dgF|$DjrC0R40L=A4M4QMF&6;H(Bz>2 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol new file mode 100644 index 0000000000000000000000000000000000000000..2109b52a734c1eadbc8ffa4fbdd5e6a53fbbb60c GIT binary patch literal 2445 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican new file mode 100644 index 0000000000000000000000000000000000000000..bdd3449e76a51eb8ea7693fbc1ebeb5be5c1e5b9 GIT binary patch literal 2692 zcmWHE%1kq2zyRzF3=AL)l2`*}^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(XI66M^%Ok3G1M7dPQz zk(j_GpGzMu+Zj%{;(1Bns_gfIYnszPTzlOx;Rfe4fuF`(Km5FTSt|4o|<7>;iGz?d|(fN4%t0kczi0ZVJy2UhLLAK3CH7qD}ee&BGm z`oQrz`~#O>cmdaG%MUz!mIXYkr9bdKdGLX+>+c8tvwsT&N~8(|*WND>3jR|dbZ+_w zVP6*k5#wJIM3rAp5EH&LL7e&Q1o6-NCP+M9KSA>Hf(cTGCr*&wvsXZ7%{l?uIr9bN zdL{_S*E9+!u|7tQp|6me zqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C*zUHPVAtk2!G5;P1cx-`363q6 z0#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~4+?mmJ0alpc(H)@x>W)`XZBC< z?duWnTeEP2e_ozIKu`08!0@gKK{=@tg3WU#g!s5m2o?965T>I!A?&-sga}bLfr#ru z6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1e^nr{_SJ+W`|SeBv1cZv$j=l= zwOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCS8ocRfM`%=2hpGm528Vt9z=sOK8OZoeh>{R06;XT z5CGAjf&fH=3Ih-gDiA<4s89gWpn?HRFLD+D(VzkXOg}ybwii@TfcT)o0z`uf3=j<} zG(a?{-~iE}!UIHu3J@^;x?uu{1{EYA8dR8o>6=Hu=7I_p5Fb>qfM`(R0-`|$42T97 zG9U)1paF%`(M=yf6sW)f(V#*HM1u+*5DhAPKs2ZT0@0vC2tEWHWFQ(;n1N_efd-~O@0$RkK?NI#1{H1~8dSi6Xiy;sqCo{6hz1pQAR1KQfoM>n z2ckg*ABYAOejplD0D@>xAqb*D1tEwA6^0-hR3L(AP@xE>znXyE0V*6pd{6-iqCtfu zhz1puAR1Iyf@n~I38F!TCWr~f@n}-3!*^72qHmREUFUP(co&L4`Sp1{LTa8dRu*Xi&ipqCtf_nEq}6jt@{F58{Ig zdJqjN>_IfBzz5NwLLWqf3Vsj`D*Qn-r~&}dph^HlgDL_L4XO-4G^j!V(V$8JM1v{@ z5DlsvKs2a=0MVdI0!+V{4t5WyvH}~RB?c4P~`!lK@|vy22~;;8dQ;h zXi#MWqCpi3hz3XId_x$}D<%eb&BVaS$mQ%BqH74Mw{(1s^-T2)bbJjB JK(xLw7XTo89Af|g literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna new file mode 100644 index 0000000000000000000000000000000000000000..9c0fac5369e4924ceb9d6fe9f39ac14b0a712c98 GIT binary patch literal 2237 zcmWHE%1kq2zyRzF3=AL)lIVr9c^eoQ7-sW`C(OQj>%*Lz>n6-yvUS3|of9U^Z<#(} z;ivrtiwdL!7P~}GIKf#s;mmVyfwL>cC!Aa4EO363iNJ*>Re_5|VgeWIT?H=PHu-Ql zS$e`1&r1SVEe{J^)7&C(T}Mjb2In*ZVPEwRBE}aIM3rAp5EH&LL7e&Q1o6-NCP+M9 zKSA>Hf(cTGCr*&wvsXZ7%{l?uIr9bNdL{_S*E9+!u|7tQp|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elW zHp}8C*zUHPVAtk2!G5;P1cx-`363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67( z&jdV~4+?mmJ0alpc(H)@x>W)`XZBCI!A?&-sga}bLfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9 zIVX@1e^nr{_SJ+W`|SeBv1cZv$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeT zCSF9#Clr;)6;=5Dh97K{Tjj z1ks?<5k!MZNDvJwB|$W(qy*8R(h@|2N=y(9Dm6hgsN@9EpwbgWgGx{k4Jt*!^oK{_ z_yCorAU>!>1<{~V6-0wdRuBy;T|qRcgay%{QWivmN?H&NDs35tUvbOj>>8qL2r7$p Te2w)?^$c`;4GloFzA+a7Ye-qH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius new file mode 100644 index 0000000000000000000000000000000000000000..da380af0ed2f4f6eb399ab4a3bf3a0d9b6a7ebc0 GIT binary patch literal 2199 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Factory b/absl/time/internal/cctz/testdata/zoneinfo/Factory new file mode 100644 index 0000000000000000000000000000000000000000..afeeb88d062851fca5523d23a73edaa1d8f5ff6c GIT binary patch literal 148 zcmWHE%1kq2zyOR43=AL)l3;?eSsEA^80!E3{|^!bVO;|Q1_lOFO!xuP2E~{raoOk^ J7}yzb0RY4I4n_a~ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/GB b/absl/time/internal/cctz/testdata/zoneinfo/GB new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 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 G3oZaPoDeGj literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Iceland b/absl/time/internal/cctz/testdata/zoneinfo/Iceland new file mode 100644 index 0000000000000000000000000000000000000000..dc49c32470906fb2ff94fc599c73141597443f98 GIT binary patch literal 1188 zcmWHE%1kq2zyNFv3=AL)l5mBx1sWI_7`hXh7tEO`$1wL|$Ao!BferJoG7BsSZe>`w z&1}LF8})`IJ4*zP`ARVyw^dg-eoK7ANj2vMCl9MBoMuy9aC(i?f-`r{DxB?6S#WO8 zdWG{jYzr>TnW%8l`^ADwt!o!t);_i1N^1XttCklPuDKR2xGuR_;f8APf*U`lD%|2L zP`GuoT;cXp@dbBwMk?GrXQFU#QR#yF>%Q}-0!T&r8~cGUreciR#cyzg41@L`(M zf{$4(3ZLrZ6+QClkeP)n$ol{P>jY3pGcYi+{Qv*)0|N(y1c@=SfJg=&AKwrLZ36=aT?0b~ zci#|@AR{9qh+<$MB@%x?v@rbt|NlQIGC?#bLP0brQb9B*VnH-0azQjGfLi3LQ15)6n2B^nS7N;n`Ilz71OShL5T>&2PGsB z4N6QP8kC?wG$>JlXi&le(V)ZyqCp7^M1v9;hz2Dz5DiLfAR3h5Kr|@PfoM>|1JR(w z2ckg<5JZC#A((#k2kahDVg&I)2@*tu5+#TRB}@1|?h&4NANq8kB%RG$;{+>CbN9@CPMk5FeDFK{O~)gXlq%u({lQLkze8 DJz`ju literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos new file mode 100644 index 0000000000000000000000000000000000000000..0e5e7192795decc47a8d338520ce12197ae1cd31 GIT binary patch literal 225 zcmWHE%1kq2zyQn)3=AL)l3;3D) E04tg$82|tP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas new file mode 100644 index 0000000000000000000000000000000000000000..066c1e9fa6e0f6aa4121fe0f2378512523cd5fbd GIT binary patch literal 182 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28LuAkW^9u1B;Ju2!pnPIf%+v%Ef0RVWD88QF> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos new file mode 100644 index 0000000000000000000000000000000000000000..34a2457bef2a41129dccb62f4320ad66a52f64da GIT binary patch literal 191 zcmWHE%1kq2zyM4P3=AL)k^s>l%+lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen new file mode 100644 index 0000000000000000000000000000000000000000..e7d4d3d0660ed68ccf7a9fbe6cc0b41eea23dde5 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7;YsdHPrwA|DS=85hMq~ZUGD|x&{Ue+6JZ| hE(0k>{s8M>VEF(4|9_CtAT9ypxoorzOzm_{xc~~v85sZo literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe new file mode 100644 index 0000000000000000000000000000000000000000..db8ac687561c40e85c29806b30966d0d7f7d8076 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7&=m(wbcLr|DS=8k%7VZ4@lm^fq})xH-tgk kzy!o)AjQZZU>yt$|NsC04>B6WC15<4jkbY_ovsNN01I6lX#fBK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives new file mode 100644 index 0000000000000000000000000000000000000000..3f1a76e55bc1a7445d9dc2df31be87d6b35b4f74 GIT binary patch literal 220 zcmWHE%1kq2zyQn)3=AL)k^s>l%+tWY!0=Z8@QnKZ|Nk>GF)=W>ya36&ykKBqU~mgy z;PCMcVes`0VbC@(1xYY4Fc4up3)Cu}A5cC2|Ns9Vwr#!yhz3~)5(ZhxK%|{qHrfWJ IcDklq0EhG@{Qv*} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius new file mode 100644 index 0000000000000000000000000000000000000000..fd8d911129bc22fe5a1d1ff93e30a070d3452d84 GIT binary patch literal 267 zcmWHE%1kq2zyQn)3=AL)l3<6jc^ViP7&_}&XGpNVb&$ASWZ=m>?SbdH{tNa0|Nm!T zVq{`uVq#!0eF4(r7Qo2Dz+mCPz~SQ?!k}$n%Ajpv0+L{0U?9cHA5cC2|Ns9FvKqt% hSr4Xf7a4$PkTbyax&8|vnndSt*=QS>*y);Z0RY|cE0q8M literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPca3=AL)k^s>lEYiThz_9V%tv_21&AM=WqWg`v`VX%#FfuVSGB7B$ zfK+N3Ft9K%C~GiqFfgdCVc=t60EzhchA_A~hA?Ow7#SOYNE1_#VkjoX0Y9L6{{R2~ aALI}a4RQ>K1~~{sQ^iqSu8twP##{iI$2u_p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion new file mode 100644 index 0000000000000000000000000000000000000000..d5f9aa49d5e0f99abbb104072db7c781137365c4 GIT binary patch literal 187 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7$%;vY^eYL|33pGBLjm8NSeXIfq})xH-tgk i0KzB5$RA)67#RNl|NkFkG>A*UcrF`l0~0%46D|NolNs{> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Iran b/absl/time/internal/cctz/testdata/zoneinfo/Iran new file mode 100644 index 0000000000000000000000000000000000000000..3157f806b7d7fe650ec6726f31398824caf82cec GIT binary patch literal 1718 zcmWHE%1kq2zyRzF3=AL)l1PKHWf~Y57-r?vp15>d=mg*HMIQVmx()(;4h8~mtsDeH z(@zMwdhHN4e{(`aS9FJlLfHw8+jDnlo}P0;YoF2%?KKxXbmoUy==L$6&}-=2p`UN= zVUW1j!Z0A~gpt#S9mYoQPnf8d?l2Wm_Ap~xX<_y??1cIAJ3B0{b$M8x6tJ+`$?svk zda8xZETfu*qZQ-Bs;zU4n-i|=;+!H~zpLYc7Ec6JGSGNe|y>cRqA!vfoM>!0@0wH1)@Q@3q*r*7?^&~;Q^vSISoXEavO*S z&_ ztgO6nu_fWbrLL0&ms2-1T*-cL;d+!v!u9*|2X5$ZEx0M?_TZMlix0P6Z+>uliwVP> zoeB@`KImn*x8+>J{U!Sw9(0#6JPfO4c(l(e;jx*?g(q{qGdvX&yYQ^!@`LAsml|HE z|7Upd!v6wCP4@$izZ))aetVU`waoZ}%)TEFWII1zkUR4~K|Wz-fI`#81VzuS7nI`W zJy2GN4N!?PNKj?44^ZQN`#|m5vkU64&p*&Oz#O1?GHSJ@Lv6s!Ka7wgYQ()2EX>%1^y-98v^2-J_Lr` zYzWHnEC@E)-4NoVT@WfVw;@c2w;=3GeM5w(=7)$Yi4Booxj#g0ac+pd^7cc_+ysW$ zE$2VP)jBc6Puch(Ay$PUvG!a+k}VrUa_okJ6qy$cskV~}(%4uU(q&5u(w{zS$oLyp zka_e(L)Kl3g6yTM8gh<>e8_F>X~yS)WfYris7pPOG$GhMKuc3opZUD@Y``o81>MrI~B zWI-?oip9X72u|J#KNwgT7_ zAR3gE1JR&72ckjw4ou&dKLDaZ`42>c@*s!?z!Xi(k+(V+YZqCt5SM1%4vhz8|V5Dm(&AR3fsK{P1ef@o0Q1<|1V3!*`J7)-zL zzW@pjP+kVpe>Z^npgaxYgYq?q2IXxK4a(mj8kEODG$@~gXi#1U(V+YeqCt5cM1%4@ zhz8|-5Dm)zAR1H#faz<`!1jU40uUcm9)M_2nE;|ebhz6A%AR1JDfM`$|0;WGM3jooevII<@XDk5GpfUwSgUS^U z4JuneG^l(5(V#L0M1#s15DhA8Ks2bl0nwl`2SkI)9S{vFdq6a(`~lIRG6+P2${`R9 zDvQAMo8%858dN5MXi&KXqCsU7hz6BUAR1IgfoM=U1)@P^6^I6vS0EZxW`Sr>xdoy@ zWfzDBm0utlREB|QP&o#oL1h_;29;-E`b#~iieUhiYal+TYy;7t@(o0T$~X`WD(65n zsH_9gpz;nxgUUP*4J!9QG^p$Y(V+4VM1#se5Dh8^K{Ti=1ks@K5JZE@L=X)s7s2$? zXJGe$%100%R7QemP&o;rL1iU~29=i}8dPS2Xi&KcqCsURhz6CPAR1JLf@n}V3Zg+} zDToG@ryv?srh;ftxeBJ=8G;Rrg{ck06OE;!TfRG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Japan b/absl/time/internal/cctz/testdata/zoneinfo/Japan new file mode 100644 index 0000000000000000000000000000000000000000..8ad44ba981a2d97d40d3de2c8bf29606be50aa4b GIT binary patch literal 318 zcmWHE%1kq2zyK@^3=AL)lHi20c^ViP7_Qqf6OQ#5&hX*(TK)%j zo;~_-x98&nW=19mWMF7!2I=luz{tYDP&a{r148=vhA?=!gfMsohk&FR85kHCiEsoL z%n?68x)>N3{{R2~KlRX(0uT*y6qtVN{QyLR90#I74g}F4M}q0K{9t*IV?lh7gBi$j MF_%|xh^{3U0KK7P_y7O^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein new file mode 100644 index 0000000000000000000000000000000000000000..1a27122ee09410095d433adabe6bf2eb772710d0 GIT binary patch literal 259 zcmWHE%1kq2zyK@^3=AL)k^s>lEYQHf!0^9KIzXpn&w={?|Nk>GF*7qT%y|G(G;0F` z%m4r34h$R&3@Z*W@c8(KFlZYZGUyr_F=!hiY#_ouR;b+qKR^b9?EL@#f1R0x!haBG clMVn0gWLe3LGEB6$01xc+J;7Ux`swv01ZkpumAu6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Libya b/absl/time/internal/cctz/testdata/zoneinfo/Libya new file mode 100644 index 0000000000000000000000000000000000000000..b32e2202f572b8ca6ef3c5cf1d9e787a24f2c328 GIT binary patch literal 655 zcmWHE%1kq2zyK@^3=AL)l2C-Q1sfO`7#4mysB(ArMuB_EYZD$;ToQQrJoUj-efxr^ zE6+T5?RV^h*d(U}agOf=;=i;XNW9YeAbC4JLF&x<57K*|B*<*3`XD=B{DItL?gIIy zcL@pwUImJYbq|z+&KD@VFh5W+Vfvt|YM!9xu>FIP-^T=F7qbEr)2s&pb7wLHhTLoj z%G}bxz{CiK%wQ72hLFrmj3C6oz!L*E1x!CreE_0Cp#!E@o&obgp#(Ap z6jC4>6k1^Vm-Yh?4GJ|74GK9B4GKLF4GKXJ4GKjN4GKvR4GK*V4GK{Z4GL8d4GLKh z4GLWl4GLip4GLut4GL)x4GL`#4GM7(4GMJ-4GMV>4GMh_4T=E}O`BNYa&-;SHR1vQ DWhAPk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/MET b/absl/time/internal/cctz/testdata/zoneinfo/MET new file mode 100644 index 0000000000000000000000000000000000000000..71963d533e444362250dec5465ec58517ab6c09d GIT binary patch literal 2102 zcmWHE%1kq2zyK@^3=AL)lIVc4IcM{TC(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f1ZUxd zGta#R&aM=naBh*a!1+lg0vDQ81uhne30(4Xn83Rvc>-UzlmLH=>jZ%kvk8JJ>Jx-Q zBqj*^x(J9E|C%7G{Ca|z@SO?b%x5Qvf8IAi;_>d4l>^lL;D6RVQd( z6`P=SlzoEsmLC&zmb{#xJLT2{y_VAx^h@?kFi2TD!7%owfKkyF0b|?U0wzJz1WaY; z3YZyH2$=n?7qF0?GQr|*qJZV^vI$muodv9KM@+C;7C*sux77r@HpdC}vt=eYq$y8u zY_Sw@a$}v~oFXmYqWXM-tMgw0H`bFA+?DSOxW9WQ;K_VY!1LS*0k6l41-#d-67V^* ze}ZpckAUBrg%kYq@&p2UnkNK?cTEV&Nu3aEo--lD$9+PmxZi{@9nA@0-wh^2h`I?x zTo;-U`Bg(8YTK6y(O0@|Fb)5foM=h0@0w%1foG13Pgi46^I69 zED#OKTp${h!NBzAeG@=5D5HUBP-X+spbQ71L75IjgEAh724y}F4a$HZ8k7k^G$+OkaX~aF z^MYtl1_sffObnty85u-_GBbzFq6@(xfR2YJ2P=N@d pL4_iS1{I7TdPo+IT)wU$x`v=KQ^(g>&s5Jq$JfvRMC%)K0RS)e4Hf_Z literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/MST b/absl/time/internal/cctz/testdata/zoneinfo/MST new file mode 100644 index 0000000000000000000000000000000000000000..a1bee7c6f0b76b6b03373eba880f52e8e83471ac GIT binary patch literal 127 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 R8R{A6_!=7Mnd%vE0RWqRkqZC- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General b/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General new file mode 100644 index 0000000000000000000000000000000000000000..f11e3d2d66a2d7c21f498df96c3fd1db3a0d8817 GIT binary patch literal 1618 zcmWHE%1kq2zyPca3=AL)l1PTKMH(0w7?y5(QLz3~-h*vvVF}xvFD2~YF-zF-x9!8x zdm9ptO*aWR8T#?T$yav+&NCf*aDIDOz^$304{nz=UocEBV=yY_C@^-9U@!@KRbZ-a z#b9Q1rofzChQUJm#RrRL{}?QPpZZ|+m8HRY+o2CO>;E*^?(X|w*MG0Ues;kJhx`K# zjxD_fPX3D;oKx}(T=ZKSTwMYS-1yTP+*OPV+{f?@xXuX-@l%xw5;BVz66@?fBzcA~B*!UyNYON7 zNVQ}7kR}w=kS_b=L;5F^hK#?*K4e}JYsk90;zRbv9}PLjjuzxjyw#AmY1Tc@`&G|S!SDT{;#ML<<$K)^RlA%Ss?YO( zs97A}P`mEqhq`9RhWftC9~c;!K#-YZZ4N87s`qkY45DiL(V0wEPm=8*hAU-Hbf~*B4OArl8 znjjjKJV7)liGpZQG6m6~qza-z$rVI{k}Q~h_76mXlP-t>O1>Z(l!QSvC>eujP*Mib zpyUjqK}i}!gOW9f1|@9}4NBf18kEFAG$@&aXi!oI(V*lGqCrU>O#f&GQQ)KxVt|rA zhz4Z=5Dm%(AR3evK(y}+O%Mgn5+DXBTYzX#)&S9<>;a-dSp-CbvI&R=Wfc$&$}S)p zlx09PDBFN&P}Tv{57vW92?kIW0`WoF2tdgPbOgdL0J&Q2W3ML4a$lj8k8MDG$>1g zXi&BU(V(meqCwdcM1!&@hz4a-5Dm(zAR3fiK{P1Kf@n~-1<|0a3#Nb7gD7wo1~EX{ z7(|1zGKdCcXAlj_(jXd?twA&>YlCP|_6E^IAd7Q32ZxwByM*ZYn&=to8R+;L8t9qo H8E^pr0tw_& literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/NZ b/absl/time/internal/cctz/testdata/zoneinfo/NZ new file mode 100644 index 0000000000000000000000000000000000000000..a5f5b6d5e60f15ebdbb747228006e8fe06dd4a01 GIT binary patch literal 2460 zcmWHE%1kq2zyRzF3=AL)l9&T!3pX$@Fl^Ye>BYvt_J~atPct?<&^igj!R{OW8G9bTc(8Zfw-@^kpL(#r@5YM*i`P6j zn78Z2q2|5^hyCWfIFelO;HX~Ri(@{$3CH;oUYyX$PdM?tHsjK*Sq_{Me;;tJS^9wM z{n7;Pd4C@8+&K7vx9;8pz8#An@W&l^ATXo#fuP-@2SOF;4}|4f9*9JEJ`nkr_CU-+ z`+?Z=<^%~vj|7S1sR>eyS_x9i-4moA@+8Q#YbMAZc$XlT&Yd8?;6j3e+uH=ihD`}d z2AmI+GtWIx;eY)=RgW=2jmhbOI`88I^+zfXG~OOf&^*NUKE%u`++G}Z-SYa?gO*WD<7DD<9}drx%+|T z)sGLXHs?OD-p`j{Gui)v?Ys{OcEyGd?CUNiIK=oRIL2*BaI!H-aJHM4;36ZG;3`*< z;QISZg4@5S1o!W)4?OPKBzRs=f8e!GF2Q@d=L4U43<uJ1+k*$e4m=4VYKI<#%D+npV_Whd?Ei&?@MmogBJOWWh&-0@AZq`Vgy{9H2{9`+ zJc#X2Pl)T7^dLUpGa(_PnliwCKE?-SAlLle?|a6d@@Xr7R9 z{q2Lyi;@Xh+s{A9-tapiXZpqmxfAXtf9>H460rP+g;MM(*@oe~e~np_gLM%b75KV2UOGl|Ns9xZueOMqCr^_M1!&=hz4a%5Dm(nAR3fK zK{P0vf@n}y1<|1F3Zg+-7EHf6`T#_OvMz`QWnT~t%EBNTl#M|&C@X_#P<95E-TVKB!0m@j=B3hz1ocAR1J>fM`$=1EN92 z42T95H6R*P+<<6MkprSZ#SVxD6+IvtRQ!NwP!R;CAE|)d2P%p{d{A)&qCrIxhz1o) zAR1IOfoM?i1foGj6o>{DQy>~tRDozvaRs75MHYw#6U5Fb<=f@n~Y2%~6uLB%GB1{Iwk8dQ9OXiyOfqCv$dhz1pN2O|H{9*9|JKM;G~oFJj-ksxtA zH9?9|D?w_xdxG>so&=e8%>>y4?-JzFxfA3UTu4xGdz+xxuqi>wfb)TJ=D7zd{I4IV z>M{yhjx&`Jn$d+;FGfhQqE z?a+fz`F9CnY)c-5{lAb9{;cgm#QjYPk;gI~MD3rF5WT)NA!fyf2eJL>32_~h9>nK+ zCM0B(JV^A{PDt_ydyuTpn~$Mf_=YfO8yXp!GH4qbn}A3o6H^8T21Z7Z9tH*? z(tI;4&HsRCVfg?5|9{8rE-fG$lm|e{vI|6m$}bQND#JiDs2l^)pt1}^gUT}y4Jy+>G^kty(?1)* z?f{i#!1JR&z4n%{>IuH#i??5!D%mdM&at}m<%03VcD*wRr|Ns9PhI%2$Wut9q pWMXQkYiML;Vrl~}DeZK8E%i+G4D>-lI=&`)hI$72##Sb#TmU1e7hC`U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Navajo b/absl/time/internal/cctz/testdata/zoneinfo/Navajo new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmWHE%1kq2zyPca3=AL)l9&f&i!?AWFw9$KHDUg4_J##*G7}cgdfBij_1}cWEo=-+ zTpvtW(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%k ztQh|7uoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;* z&b1o_xIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^U zHvutAO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($ zIgfzl@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhV zCb+u9H@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1u zX$lR2Hr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{N zhM1O10BmQ6@k*KJ5Y z8!;i1oxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8G zO8loWl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFMk2AEg2y z8kCzsG$==dXi%;O(cqj7Vt{ft$lWuf1wa%imxE|fP6yGT+zz5aIUYoVay^I!<$Mqg z%Kc!v*K`7i29*L}dhJHAd7#n�QlKAR1IEfM`(30HQ&q1BeEd5Fi>hVK_v}{29-7-8dTzdXi%vGqCq7Ohz6BDAR1HxfoM=E1g8Jp2ipfK zjX-=*i3FlSr4on+l}sQSR62oZPzeR1L8TOk29;DG8dO?=Xi$j-qCuq=hz6BhAR1J9 zfoM<(2BJZw7>EXyWFQ(;nt|!(JmB~Mm1-b9sAL1tpwbOQgGx9M4Jze8G^nHl(V)@} zM1x8^5DhBzKs2c21JR(;4@84XKoAWo1;O;^qhR|$r6Gt9DiJ|6s8j^gn>)espwbb< z2bGW@8dOSxXi!NBqCur4hz6CIAR1I^f@o0538F!zCx`}>pdcDlih}7s{NV5hm8Kv* zs6++Ppi&h~ALRqv4=P`hsXs z2@Ik^r7(yFmBb(#R2qZnw`E}WfJ$W$A5=1fXi(`4rq^15N^uYkD#<}Ks5A%D|9*qb2bJm|KB!~|(V)^DOz+zd zmIsycAU>$12hpI?9z=smd=L#P^+7bK9HMK%1ptvMSX}@B literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT b/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT new file mode 100644 index 0000000000000000000000000000000000000000..6242ac04c09fd4e4952cd16503e954dcbdacec2e GIT binary patch literal 2294 zcmWHE%1kq2zyK@^3=AL)l9&o*3(Q;Qv0(mg(FqIMv=%I!^?kzWPN@Z#l)n^QN>mg0 z^`lwg_lq=vKQ~ep{+{p<__xDd;r|LP0frfx3XB~*0!$U$3e1HX6Ic?}7qA9$O<;56 zT)=MdW&(S!^8!wRa}zk%?pNUYuwerCgY^q|Zk`q3Juq{{43Wf2+W))AlNxU zL8!7=Ksd8VK_oI%K-4otLCn%zKwQ&IK|(2bf+VMef)tbK1gTFZ3#1>3PmsAJwm|ma z&k1rHe=Lw+czc3EnYMyrmhvP7@5%Cn*>et4uI|cxw<>t@<_LIhp042a)=$8D&gKO^ z*Rm$~)=XXCx6NmQe@yv;fN6RY0&OA}1eFO)2$r#45EA-nLdYN41!1OFCWJk;QizcI zC=hW}Mj`UwWr3(A{}iI{Z54=Vd7u!xZ@NHS${~gLd6fbQzV{X+wojdqq7Gyp9KOuWsszS~M8G+m~cZIz5{{-^G zG!+W^9|#nhaVr$%9}*}QeXCI7zeJ$qKj(rnivttN?!8`6A+cye#lEu(Du1+0sG7Ha zLG_Ka2{m;S7u4?Xm{1p2yr6!D)&vGd21X`kMi4c4@c;jFConSn|KH!hzyfA-fJvSJ zmk@@4;1Gs@@DPT8fDlmTU}RumU?e3I{r~^}KPV%CXi#PX(Vz?kqCuGoM1wLGhz4aY zFrBC-0HQ&e3`B!68i)pEHV_TUa3C6-=|Bun#sj%-hNc3D0%brD4a$Td8k7-1G$=EI zXi$a((V$ETqCpuGO!qo30MVcf3Z~cY2b%}Vs31Nlvw~<)h6T}}Obenx85cx@GB1b* zWnd5u%ETZVl#xL+C^Lg-P=*H4piB*-K^YrFgEBXW24!#%4a(#o8kEt&^d}Rr`#>2U z#0O=15Dm)sAR3hUK{TiU0MVdA07Qcd0uT)<3_vufKmgI8LIFgB3I-4jDjYyGsDJ>| z|K5V_0~Hh?KB%w&(VzkYM1u+q5Dh9gKs2cE0MVcV1Vn=h5fBY3NI*2GFagm<#VQj( zG^kJk(V&6_M1u+!5Dh9|Ks2b30nwm>224Mf0>=lazya|=g${@Y6+9psRQP~sPyqy@ zL4^>A1{Fjg8dMm8Xi$L!qCtfchz1o*AR1ISfoME1tpk%+X8kEsK5mAL4_uW1{IuOdaVao9#nvW_@F`* zM1u-a5Dh9!K{Tj91<{~F6-0vyRuBy;TtPIbfCbT@LKZ}W3R*DzpA&38sK5pBL4_`e z1{J(udf!>FJg5K$@j-uJ1+k*$e4m=4VYKI<#%D+npV_Whd?Ei&?@MmogBJOWWh&-0@AZq`V zgy{9H2{9`+Jc#X2Pl)T7^dLUpGa(_PnliwCKE?-SAlLle?| za6d@@Xr7R9{q2Lyi;@Xh+s{A9-tapiXZpqmxfAXtf9>H460rP+g;MM(*@oe~e~ znp_g|Ahn)4T^OT4T^aX4T^mb4N3tZ8k7n^G$2%a g=^7f_Xd9Z?>G)dend%wn8|(O*=o#u6=$mi>0LxV}*#H0l literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland new file mode 100644 index 0000000000000000000000000000000000000000..a5f5b6d5e60f15ebdbb747228006e8fe06dd4a01 GIT binary patch literal 2460 zcmWHE%1kq2zyRzF3=AL)l9&T!3pX$@Fl^Ye>BYvt_J~atPct?<&^igj!R{OW8G9bTc(8Zfw-@^kpL(#r@5YM*i`P6j zn78Z2q2|5^hyCWfIFelO;HX~Ri(@{$3CH;oUYyX$PdM?tHsjK*Sq_{Me;;tJS^9wM z{n7;Pd4C@8+&K7vx9;8pz8#An@W&l^ATXo#fuP-@2SOF;4}|4f9*9JEJ`nkr_CU-+ z`+?Z=<^%~vj|7S1sR>eyS_x9i-4moA@+8Q#YbMAZc$XlT&Yd8?;6j3e+uH=ihD`}d z2AmI+GtWIx;eY)=RgW=2jmhbOI`88I^+zfXG~OOf&^*NUKE%u`++G}Z-SYa?gO*WD<7DD<9}drx%+|T z)sGLXHs?OD-p`j{Gui)v?Ys{OcEyGd?CUNiIK=oRIL2*BaI!H-aJHM4;36ZG;3`*< z;QISZg4@5S1o!W)4?OPKBzRs=f8e!GF2Q@d=L4U43<uJ1+k*$e4m=4VYKI<#%D+npV_Whd?Ei&?@MmogBJOWWh&-0@AZq`Vgy{9H2{9`+ zJc#X2Pl)T7^dLUpGa(_PnliwCKE?-SAlLle?|a6d@@Xr7R9 z{q2Lyi;@Xh+s{A9-tapiXZpqmxfAXtf9>H460rP+g;MM(*@oe~e~np_gLM%b75KV2UOGl|Ns9xZueOMqCr^_M1!&=hz4a%5Dm(nAR3fK zK{P0vf@n}y1<|1F3Zg+-7EHf6`T#_OvMz`QWnT~t%EBNTl#M|&C@X_#P<95E-TVKB!0m@j=B3hz1ocAR1J>fM`$=1EN92 z42T95H6R*P+<<6MkprSZ#SVxD6+IvtRQ!NwP!R;CAE|)d2P%p{d{A)&qCrIxhz1o) zAR1IOfoM?i1foGj6o>{DQy>~tRDozvaRs75MHYw#6U5Fb<=f@n~Y2%~6uLB%GB1{Iwk8dQ9OXiyOfqCv$dhz1p{O7~`-NWD^L3)UY!!fDB_0 z{Q=@JFfjc8|Nnp3wjd1N2O|H{9*9|JKM;G~oFJj-ksxtA zH9?9|D?w_xdxG>so&=e8%>>y4?-JzFxfA3UTu4xGdz+xxuqi>wfb)TJ=D7zd{I4IV z>M{yhjx&`Jn$d+;FGfhQqE z?a+fz`F9CnY)c-5{lAb9{;cgm#QjYPk;gI~MD3rF5WT)NA!fyf2eJL>32_~h9>nK+ zCM0B(JV^A{PDt_ydyuTpn~$Mf_=YfO8yXp!GH4qbn}A3o6H^8T21Z7Z9tH*? z(tI;4&HsRCVfg?5|9{8rE-fG$lm|e{vI|6m$}bQND#JiDs2l^)pt1}^gUT}y4Jy+>G^kty(?1)* z?f{i#!1JR&z4n%{>IuH#i??5!D%mdM&at}m<%03VcD*wRr|Ns9PhI%2$Wut9q pWMXQkYiML;Vrl~}DeZK8E%i+G4D>-lI=&`)hI$72##Sb#TmU1e7hC`U literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk new file mode 100644 index 0000000000000000000000000000000000000000..289b795a8a8bcb6632ca97efc363267d2d491c09 GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28KQ#kW|kC1{NRR5C&~S0}z*i q2-BFMCUg7%>tJB`|NsC0Iy1E`ATG#s2HeJT*=QRY*y$P?Z~*|}&l)TM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter new file mode 100644 index 0000000000000000000000000000000000000000..060bef81898b9b45492ce2e2e35fb218f5cc213a GIT binary patch literal 2242 zcmWHE%1kq6zyRzF3=AL)lIVf5MH(0w7w69RGwJIQL)Nz;*Yl1NVw|20VMOJMeZ~ zFyNcJ(}6!@lYv0n)dPYaQw)UCwjU7IC^Haon|VM~aMA`bwdw<6A4@h!u*DvbxEQuU z@|pbssf`vJq|e7V$V`;lAiLhqL9XD>2Kjyk2ZefO1I2tM2PMnj2FiX<98@Il8mL+@ z98mqa-$3otj|1vA7aC}MKXO3x(B2JN*Owj8UNnD$&i0N2x=oE6^rmMW&`(O)#xR6hC1Q*?;ap)b~{e(fJz=#9Z$&i1nXzAZ~k}LA-v+frRM+28j|A z9g-SyHYEKhc1TI^+mLc2)FI8mU_;stbB7ECp$!=`BpovUf7y^#{@Wq@{04|Gbypyal2``3ppY@)(E)J_gaCybPj2`58om@-&DB>^@LA0^)EG8dR==Xi(V-qCw>=hz6ChAR1K8g6aSN|1%8N!j{WM e*TBrq%tqJ1)K16OLeEIgOy9^z$JZ3f;sOA|noNQK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate new file mode 100644 index 0000000000000000000000000000000000000000..5cee55df32f377df2dbde0d9764df5db388434a1 GIT binary patch literal 492 zcmWHE%1kq2zyQn)3=AL)k`RZoc^ViP7$$u^v_oZXJ-mm3Bd9(Vhdcv%dw% zHO)I9UwtD$A$zxjV)U*6CGWWo%GPrNRJ7|IRHf?z)VLEJ)P5%fsK0i0(0EdFL9;Q? zLF=W*1?@y*hx-5j|1&T#Vu4Hy40F$b+_2&RBMSq=tPKntKE5Fg+J;69+J=T82?hoR zQoQg3s^|az|NlW=0dYaz0ns2YfoPDoKs3l}AR6R75DoGohz5BRM1#BvqCwsT(I78_ zXppx-G|1~98svQt4GID<{W~E5M1z6?M1z6@M1z6^M1z6_M1z6`L{k_%TsGQlEYQHfz#tUHazLNeazp+9|Nj}8n3@0okDtT9@c)0f z0|U$d|EU2C91INGE->);_=Yg(8X7U^8X7Wa8ybVm0b?TUV};r+@B^#^WcvUAb>^Wd eATG#$5Djtzhz7ZXfgFc$*=QRY+vyq_a{&Ol%+tWYz~J|H=7#$J|Nk>GG5!A^U%|le|9@%#0}BJg zwhIg#KE5Fgx`u`f+J?p;jSLJ7L>SKkwTkBlRL}qa|NqyShjxItAnQOh$Vvtx?c}o2 MHZ-==H8kb|0IJq1xBvhE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji new file mode 100644 index 0000000000000000000000000000000000000000..912db189431adbc130b6397e317dd40733601fae GIT binary patch literal 1104 zcmWHE%1kq6zyQn)3=AL)l5m8wc^ViP7-k7?JYZ%m{=n?|uLKJflLU+HcM`k>bsl)H z<4^E8^eVx($nk;SqB9BpQb!&HG_6Yr__gdoQ1+<@LARn6nR?S2ra%%2cHH}^pT)5nCwwyuQ4N0$?l z({d7$4{c3Ib@NL|T{Jx*UCkgNy?gV6Og5o}%gS>U0 z9^`XdKPc$C@}S^LL_$&Cwg*L5tP)E6W;`g_B9l;NzBQq2^1p-%@#zT_#SaoHzgH$y z1s_VNz8;-WV{`98?RMLQI++6x>Zi*m)c;xZp#J~={|row6hS5ihUEu9p}Oq?BMSq= ziUSNBKE5Fg+J?pq+J;6T2?hoRQX=ICRL}qa|Nny`2gC(M5SYIHD*;4MI@O1wd?_i21O{CzEyPrM1vw0Oz+A9%Yz~q z#0Nz(hz3P8n6Ahz3PGhz3PIhz2D95DiKMAR3eqKr|>ZfM`&H0Mm~y zgZ%?a7$80|T>06{b;5rSw?LIlyE#0a862@*{ISp;@J-4Z63jkckYovxvgjkck&osO@e Vp`M|hfsU`Co{^rRzM+XZ7XWK%BgFs! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti new file mode 100644 index 0000000000000000000000000000000000000000..3289094a2740500bc374d20904a70d7b307c2264 GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28InjvpWc7#JA-|NsBL&Wz^|hzl~E0k`p7Hrj?pcDjZ}TmbPo8h!u( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos new file mode 100644 index 0000000000000000000000000000000000000000..76b2b3a126967bd410e57ce36cccebf7db167f67 GIT binary patch literal 268 zcmWHE%1kq2zyK@^3=AL)l3;_fc^ViP7`83(X^@jR5}+;4^+3DuOF;eq|Nj{nnVFcG z|NmdZz`*eT|IQ5zEFhAR<^TWH3m74as`+!{1O17$#V^tjjn;2of#JZ79%`1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier new file mode 100644 index 0000000000000000000000000000000000000000..625016d512b09d296dc340dd542a3d2d07c5c9ea GIT binary patch literal 186 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7^Vbxu+;zm|DS=8@&EtE8U}{{{~HS!SbTg# k7<3IRLCP6OG4cmk2gsEF|3OBBxCD&nve7lLw6o*_0H-k`kN^Mx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal new file mode 100644 index 0000000000000000000000000000000000000000..0c24095bf0f683d1e1c51fd30e294de40b3b3e5a GIT binary patch literal 188 zcmWHE%1kq2zyM4P3=AL)l3<3iIT{!k7^e6e_tgLY|DS=8k%3|A7m)m{4Gb(kz99_S lhK3+611U!S0PA32`2YX^e~{52E&=1YY_tsx?Q{(dxd2q09f1G< literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam new file mode 100644 index 0000000000000000000000000000000000000000..4286e6bac870c1ff15c73b8958c15210a3879c58 GIT binary patch literal 225 zcmWHE%1kq2zyQn)3=AL)l3;?ec^eoQ7_6M*5*V2n7}~dhq4OF#P}j|G&t?qh~;Lotdr=NEl=#10xgj W|NmwtAU+XRGca(09HMJzzy$zA7bPkH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu new file mode 100644 index 0000000000000000000000000000000000000000..bd855772054f8d41e0158e71c2bf2c04e50e47cc GIT binary patch literal 276 zcmWHE%1kq2zyK@^3=AL)l3;_fc^ViP7ffM}3wKs3ljAR6Q<2GX6yffM}3wKs3ljAR6Q<2GX6ylEY!fjz#tU*i9w%LdqMsG|Nj}8n3@0o&uL&_`2RnP zfq~`!|KbD&E(V4p4;c7-d_x#?4Gl~TKqP~dF~0x+ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae new file mode 100644 index 0000000000000000000000000000000000000000..f8222e66b554dc2e5e05be129662da3f8902280d GIT binary patch literal 251 zcmWHE%1kq2zyK@^3=AL)k^s>l%+tWY!0^9KI>4+u-J$;f|No3kjEoEnGtPh%&DsD` zzv2J`2Ll6$?c*E5plxW#plygSod~;Fq4x6p02vCh@Bjb*b!IXq|3RQlIshaLvL8f) T+`vGpBe-m|4Gryd4Gp;fvOz3Z literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein new file mode 100644 index 0000000000000000000000000000000000000000..1a27122ee09410095d433adabe6bf2eb772710d0 GIT binary patch literal 259 zcmWHE%1kq2zyK@^3=AL)k^s>lEYQHf!0^9KIzXpn&w={?|Nk>GF*7qT%y|G(G;0F` z%m4r34h$R&3@Z*W@c8(KFlZYZGUyr_F=!hiY#_ouR;b+qKR^b9?EL@#f1R0x!haBG clMVn0gWLe3LGEB6$01xc+J;7Ux`swv01ZkpumAu6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro new file mode 100644 index 0000000000000000000000000000000000000000..b3a8c184432efbe040cd44a386a99c2cb58ddf52 GIT binary patch literal 221 zcmWHE%1kq2zyQn)3=AL)k^s>l%+tWY!0^9KI-vgl|No3kObiSQKq3sYHZZU-FswMh zz~SQ?!k}$v$e?WqGm;47S)f+&`~X=7vf}^$|8-^}4gW!)O*#N146>4eNISV~v<;2y IbPbKT0C*23q5uE@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas new file mode 100644 index 0000000000000000000000000000000000000000..10c5c9bc1dd5807c7bd13e556a4644c5f07ef261 GIT binary patch literal 195 zcmWHE%1kq2zyM4P3=AL)l3<3ixf&Q47^VdHc+~&@|DS=8@&Er?3kHV&|En?>SbTg# o7<3IRjSWB=7)UYn2UrKlod5qphJ&~SE#R^NTV`izWo*C&0P8;_JOBUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQn)3=AL)l3;?eIT{!k7$&m*=3r!EVAxo}!0`Wn{0|VB8o|NsC0 h4{`&D2Dt-7gWLj=2Dt}BQ{pBr8*M`)J6%H~E&$x{IKcn_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue new file mode 100644 index 0000000000000000000000000000000000000000..df6110dd108e529d2425752744d6d2a4512a84f7 GIT binary patch literal 266 zcmWHE%1kq2zyK@^3=AL)k^s>lEYiThz;MUeG(n)`ltumj|Nj}8n3@0oPuRl1@c)0p z0tS}<|KmIuxc>i74PX%P@eN_nH8eCb0FlOE5@Z$_6JaMS)P9j4U>zVE{{OEt5Apf` e|NnoG8$iM!cYtV+TNuc743~|rp`o3jAr}BTXge|h literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk new file mode 100644 index 0000000000000000000000000000000000000000..d0b9607ed73a9a4bd6ca6b49a2b685609d561f96 GIT binary patch literal 323 zcmWHE%1kq2zyPca3=AL)l3;_fr5YF*816X!XyD{OmBG37W<(hOvyA%x|Nk>GF*C8S zFfh!m04bl_z`(-5uy6+h7X!ok6N~~346`;ci23-2FlZYZ8XAE}V*>_lLnAP02+{(@ zM7V_==9V8&J^%mz|6gY&-T|UPZUYH}+y|z&-i!dzAa{ajkXsq3%An2BJZZ1JNJ{f@qKfAQalF$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQn)3=AL)l3;?eIT{!k7$&m*=3r!EVAxo}!0`Wn{0|VB8ol%+bKWz)=7H|9?hC28KEjkW}3S1{NRR5C&}nOAwcV p2-BFMCUg7%>tJB`|NsC0Iy193ATG#s2HeJT*=QSB+UZ(y0RWr48JGY7 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn new file mode 100644 index 0000000000000000000000000000000000000000..54783cf62eac51e9a575eee75688c4de4a15578b GIT binary patch literal 223 zcmWHE%1kq2zyQn)3=AL)k^s>l%-6ucz+md)#8LnM|9?g%rvLxjco-P||L>?^VEO;Q zzkz|v$2WvQ*TBNq07QbcGB7X@VF3%&GQJ;BJ^%mz|6gaW_XWfSSqP#*mNF1+E0>L~ JfrXs~7XXl%+bKWz)=7H|9?hC28JmiAgNg!7+8FKLm0FT4MAK6 qB1~h3n#}P7tb>8!|NsC0>&z6^fVd#j8E_lVWut9qXs2sv$OQoTh#GnT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape new file mode 100644 index 0000000000000000000000000000000000000000..9743bc3c9b8e8d2dc3a66bde761c3ef1917be50a GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28JmiAgNg!7+8FKLm0FT4MAK6 qB1~h3n#}P7tb>8!|NsC0>&z6^fVd#j8E_lVWut9qXs2sv$OQoTh#GnT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby new file mode 100644 index 0000000000000000000000000000000000000000..3fa1f7fa80a3026d205cd0cb8870a75063ebc80d GIT binary patch literal 206 zcmWHE%1kq2zyM4P3=AL)k^s>l%-O)ez)=7H|9?hC28PZLAgP`O46FgZz99_Sh6W%$ z0}kVu85kHq7^H>;%I5t6;xRBV{Qv*|f7rGt4iH`RcF6>gFvuDPMkXc(hEA}u&JPSM d3=BOB7&v`=Ll{u3WMJU3(Ka-&(={~U0svF6B>(^b literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga new file mode 100644 index 0000000000000000000000000000000000000000..ace1ce4b718e928c238f7469561c7ec41c3cd41f GIT binary patch literal 602 zcmWHE%1kq2zyK@^3=AL)l8}M2MH(0w7zEZxYY5tJl@O|IR1lV*E+G<`tRV8gQbNqq zRYB~<)EN>=i3=o7l+Tc2a$X>{B65cGBh>{m9o92s53w(h%aENRzwqS(1^53m6dO-3 zP%@N}P|kXxpd#>3Le=Y(g6f9{66#uO6x1&qlBoax|34!$6E4W~|9_SR1H=FSIS~vj z|Nj>!FmV04OF#P}j|G&t?qh~;Lotdr=NEl=#10xgj W|NmwtAU+XRGca(09HMJzzy$zA7bPkH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQn)3=AL)l3;?eIT{!k7$&m*=3r!EVAxo}!0`Wn{0|VB8ol%+bKWz)=7H|9?hC28Kl@AgL7x7+8FKLm0FTA!ZO^ p8Z*>njvpWc7#JA-|NsBL&P?bGhzl~E0k`p7Hrj?pcDjZ}TmS=j8mIsO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu new file mode 100644 index 0000000000000000000000000000000000000000..b3a5a89b66d2b74971646be2fea8066d4dd91fab GIT binary patch literal 393 zcmWHE%1kq2zyNFv3=AL)lHi82g&G(b7)};DO)&rMe!=2$?FB0qjsUBo9S+uyUj^6% z&2os4y?!C0O5sBN|Ns9PnV4BvnLv<l%+bKWz)=7H|9?hC28KQ#kW|kC1{NRR5C&~S0}z*i q2-BFMCUg7%>tJB`|NsC0Iy1E`ATG#s2HeJT*=QRY*y$P?Z~*|}&l)TM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake new file mode 100644 index 0000000000000000000000000000000000000000..2dc630c606e32919db3ab5302f72d5523955c54b GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28KB%AgL7x7+8FKLm0FTA!ZO^ p8Z*>njvpWc7#JA-|NsBL&P?JAhzl~E0k`p7Hrj?pcDjZ}TmS&r8lnII literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis new file mode 100644 index 0000000000000000000000000000000000000000..b4f0f9bfb6a6cf6b98b85993dbf1632736e9e19f GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28J~eAgL7x7+8FKLm0FTA!ZO^ p8Z*>njvpWc7#JA-|NsBL&WvLPhzl~E0k`p7Hrj?pcDjZ}TmTnz8rA>+ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap new file mode 100644 index 0000000000000000000000000000000000000000..289b795a8a8bcb6632ca97efc363267d2d491c09 GIT binary patch literal 183 zcmWHE%1kq2zyM4P3=AL)k^s>l%+bKWz)=7H|9?hC28KQ#kW|kC1{NRR5C&~S0}z*i q2-BFMCUg7%>tJB`|NsC0Iy1E`ATG#s2HeJT*=QRY*y$P?Z~*|}&l)TM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Poland b/absl/time/internal/cctz/testdata/zoneinfo/Poland new file mode 100644 index 0000000000000000000000000000000000000000..5cbba412eef406b4baf89100f2c4a8e1f5d12798 GIT binary patch literal 2705 zcmWHE%1kq2zyRC~3=AL)l2`#{OEoYsFw9(`bzwG-c*5+fw?53dxo*PTC0i%V+c{yv z{Fdnx7R=hlurPHm!?N0%gcD`=1kOD77C5_7e8Ra!&I0ErnFw5HSebC4Wf#N6sgnvW zb?r{Lob6c7hR;*v7`|9pGkmSJYWOB4 z%fPGkw}5v^Xaiq24+DRTd4oWSMuT9AWP?x$SA(#x8H0%Nn+8$kyA5K(=NiPB_cw@t z-q0ZNcwvL&4&% z!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)jLK7mtY6wJa`!XT=Dwjaa0zrY; zEpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{NVQ!zA&q0}gml>n6VhKypOEpl zXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI2{khhO{iTrcS2p|k_q*F^%EGG znV4BvSvc6(nVDEwSXr1Ld=L`@gA`&2vam99a?u_#FbHn|Wh~(h3@i)`G75|w3=Dh% z47{jpEdxeDkO+eqf`qB`@eN@J_YGlib`1s*Aq=h{hO27`$XEtOMn*;kMn*6jL@+WE zk;_-Ya`_LC76t}}|NsC058HMj07QdwJ%|S7d@z0W)&~#`Dgi(=s1yLvpppPYgGvJs z4Jr{pG^kVn(V&t6M1x8P5Dh9JKs2b70MVe50z`vK3lI$|F~D@oF0gw*B?pKPDm_3n zs00Dgpi%@xgGv$*4Ju7QG^j)Y(V$WVM1x8eF#WPZ07QdI7%=^DO9O}ol{6q4RN8=O zP>BPkcWnmS4=Q;;d{F5FqCq7Phz6BHAR1H>foM=^1foGD5{L$sN+23kGJ$AN=>!U9 zPzeR5mxO`}R|Zf?1>%EBD-aDTu|PDa)B@3 zXi$j>qCur5hz6CMAR1J9f@n|)3Zg-!D2N7?q#znpnu2Ihi3*}Yr7D>ITQ2~jL8U90 zzMBZ{R{XsOS1_05ZS^z|YY61`qstrIis73(MpjrV$gK7p44XPbLG^mCE z(V$uaOuv{8b`Pkw0P#UJ28agL8Xy`}bAV`2?E#`eH3*0X)gmAoRFi;cP;CODK{X19 z2GuGc8dS4@Xi)6}qCqtbhz8X%VEV%&aD0Gj8xS8<nfLk-4Cjb7)GljT-6bmvulX1A*k}w@io>n)icoXH8cRx`o>%Udte*1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Portugal b/absl/time/internal/cctz/testdata/zoneinfo/Portugal new file mode 100644 index 0000000000000000000000000000000000000000..a85653044e0094363ea0f30d017a20ccdce2227d GIT binary patch literal 3469 zcmWHE%1kq2zyLf93=AL)lDG$DOE)kuFid*Z*D%{Vw_x_a;|+7>ye*h}vbkVheNn;u zRogx+hz}`P*!`+tk>kyR#d-M!OO$y&EcIXXVHNB9f>mGoKCC^t{KLBC${*G*@GscV z&iY|vXZD9p1xf{*i#iIn1h5orH}Wai!GEG)$N!xLJKwJ=*mGk0hrK&ieAqWXzF_~1 zt`7%hefV&&BIm=QjMxu{Bm6!bv1ctfYGLrtZiyxe6@P2US&Y}-zryn!lZg4J9xbbtU!p)a$ z3U_u!D%{=Fvf$pL(gpV?r7d{S6u#hLk;j5ZNtO#92Wc&M;v~J`sS(eDXNrFpJeSr~ zc)=~D@ZvYO!pm2G6kgqWtMK~NJ%u;B&MUlKbwJ_Wtc?oqyA~;YsG6+sF{?%4Q}X%+ zpMw`H_~JZq!B^v^1>cm57kn2^S@457bit3$ZVPx;YccT7mS*7V=3(G(F>eqk(P$7% zk!%nOk(eOt{JTNK_}2tc<<}F$gzrocXFfYY{PVsE5|8&Tki5KLg4E%O6QuX-6_8o8 zPC$0fd;z(h2?FvpjRFceMFNU3$pT6~Ap*)at^z7LW&)}*>H=y!5(4V1&J)zXnoQ7m zsyadQs@MdrqwEv3xBQr(v*hIj-6^*w=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=N zAx(LLV~eGLlN;*<=M-rH7uDwzT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8H zLexzl;=0g;$gdg#QQN*uh`!1t5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(anLD>Dl-GA2qNJ0bHqIKhyMjr#Ea z|L@75VunwEkp)CEa569;vt<+*c@g3aLLgZXDWkwB24cf>`S^w~gu4cV2oUxSVQ_W@ z;ouOEZbn8%Mg}ke;xRzjq!fNX!1@>%{{R2~A5;i}Xiz~2rvDvp0MVcV5k!LuMGy@t z7(q0sa0Jny0un@n3P}(RDkwoTsIUalpaK&_g9=R$4JtUn^q0O5AR1JFf@n}73Zg*; zDToFYrXU(rpn_;np$eiw1uKXK6|Nu}RKS90P$3JZ|L-gS(V)T>M1u-k5DhAHK{Tk~ z1<|0w7es>!U=R%|gh4c@AO_K(!Wcw@3SZ_D!@T}P$3SYK?OOOKDr-lE~r2U@j-<;hz1qx zV0!67uso=M2k}9LJctGr^kBNR87vPf@Iib~p%0=#1wV)e75*R^Q~`i!P$dASe@;~Z z(V)rzM1v{>5DlsnKs2ag0MVez0Yrl;2oMdbBtSH%q5#pL$^t}#Dhv<}sx&|}sNw+8 zpvnV8gDMa({hJ$XFQ_5`@j;adhz3CbKpK-q$4wHAm1S4bcRs8Ryapo$4Z zgDNKw4XU6(G^mmS(V&V7M1v|T5DluZKs2b*0@0v~3rv6BHvvS0DliZYs>DDvs3HT= zpvnwHgDNx-4XV^YG^k<&(V)r=M1v|g5Dlv2Ks2bL1JR($4n%`0JP-}4^guMI;sep3 z$`4F`H37Q=R0)Fkpo$PggDOK14XO}9G^kPp(V&VEM1v|v5DlszK{Tk61ks?15=4V4 zOArmJFhMk^(ge|1<{~N7DR(8S`ZDYY(X@r!UfTwN*6?fDqau`s(e8-r~(Gjph_4_zk3F@A51&9VUEfdQgHjSLVCYG{CHP-6o`gBlzldbH6&!$t>JxNC?3 XsG*|cYpiFgXP|GW<7;RDVsQZghvW_C literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/ROC b/absl/time/internal/cctz/testdata/zoneinfo/ROC new file mode 100644 index 0000000000000000000000000000000000000000..748873bed9a167d0226bad2246556c45432880d6 GIT binary patch literal 790 zcmWHE%1kq2zyPca3=AL)lF)>*1sWI_7!HSeHe3pcY`ENA-EhTe?T4$bN(|S0_J6o; zv!CGxTUx%SVq?GtAU?mUQWxVwts!@Z(nhWlGn3Lez7GCZ6%{llZ! z9Sx7mPZvC~d&BV5K%wB7Vj;tGp``^cn3goW_e1`ZI($iu(@67lg3VQ>x(VekqLVQ_W{0V#xHA_7bc7GOW1dj9|a|G(ti z2MG`j3P2DI3PcbM3P=zQ3QQ0U3Q!OY3RDmc3Rn;g3S1Bk3Scn(eC7ub4GL%w4GL@! z4GM4&4GMG+4GMS=4GMe^4T=B|4T=O14T=a54T=m94T=yD4T=;H4T=~L4T>BP4T>Nz z{rLvieo#b#_@KxF(Vz$e(V$2J(V&O}(V)l!(Vz$f(V$2K1rI19K{O~bK{O~rK{O~* XK{P00K{P0G8E786T+YEEx)xjjVF6z% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/ROK b/absl/time/internal/cctz/testdata/zoneinfo/ROK new file mode 100644 index 0000000000000000000000000000000000000000..312ec40a112d5ab54ea2d92d735735be4b27a44d GIT binary patch literal 531 zcmWHE%1kq2zyNFv3=AL)k`RNk1sWI_7`m^2sF?Ij?8hZ%^$(ByH9tJb-u~mMutdhQ zB<70ef<7-^=oeJHc>X2h6@O60tK-))UcWb~c(Z&*#@q8^74O<-WqdF#tWa2-FhMad zeS%W6(*$Kd&j}2SOw5cdNRXM8nU$G=p_~I`eR&513j;&l1O^T;$-=4FRW5uS+=d z^kBfn!q*QjWpf5xUSyeY#hEGKst@mjYns&;u4})4aDy}U!cC^>2{&KbU%2&tMZ)b% zF#&h3Tu8XPx&Ok)FFO-HrR=)!HG?hTo4myZh6TGGFlKMQz|=730kiki3oMyC6Ie|) z1+e8!E?~D@(ZK$@lz~%n*#genRu8y7uwUR2IG4b4Qzd|RiDd%cvWWrwEz$`BZN&jX z=`#)p`)1F%@YE{yCwwXq)rI7*e4L;<31r&+;2jd-Mk55-wh^&pVteh|Ns9# zBQp~@kcAZnnV8wwiG|D@oEVUmm4QK81C&0cGZj;uz@fI-y9H-y2{H-y2}H5f#MFlZZ?FlZYXgG^;$U|?iqWP~z790nrtN(%!d z-$?#|YW)BI|NpRUCvJdfP~HL2p!@@-ukO15qCxoxM1%4Yhz8{+5Dm&xAR3gfKr|?C zfoM?v0@Dxwg7t&)8Hf+cYakkw-@x?$gJ5}3z60?=c@IQ`@*ju>GNDKs2Zv0MVeb07Qez0}u@=6F@YmTmaFavH?Vc$_Ee) zDkDHNsGI=Npt1r)gUSmK4JtFh^qnaOKs2cA0MVfG14M($5D*P2M?f^FECJD=@&rVK z$`lX{Dpx?XijL$55Dh9{K(re7Z!jNJ&Vcx!vIazh${P?3Dsw zsLTS%0>_kDjz{KsEh>BpmGvKgUU(}4Jt1|G^or3)87pyfM`(J38F#eC&NfA OK)GzR4UFw{jky3o@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/UCT b/absl/time/internal/cctz/testdata/zoneinfo/UCT new file mode 100644 index 0000000000000000000000000000000000000000..40147b9e8349c50b9b5459d34a8bf683c91b182f GIT binary patch literal 127 zcmWHE%1kq2zyOR43=AL)lK`<O=5C#SYBJ_dufH2Dsh(;I*F@P)7ImCbq0J+r% AZU6uP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska b/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska new file mode 100644 index 0000000000000000000000000000000000000000..6c8bdf226900d7f4c6a4d47338e6742d4d6747cd GIT binary patch literal 2380 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 THP$oIGtluhG}JTHGvERMhxmM- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Arizona b/absl/time/internal/cctz/testdata/zoneinfo/US/Arizona new file mode 100644 index 0000000000000000000000000000000000000000..adf28236a2feb68f177f5b002ea068db59eea997 GIT binary patch literal 353 zcmWHE%1kq2zyK@^3=AL)lHi821sWI_80IarnlOJid&7b@nF$MLy=*w$$ur@+_SQd<_d{-7Z*kx`bhI^Y;%+ zTrV{&O}_bIS@2DU<)YIIRv7PQSn+T3hgHIJ8CKn!`eF6wdWJRo%0H~VoXD_lUgU@M zo1Gap)LDPnI48bgQ+hwmKm6qP zYWT&G{^8e;bcWwAJU{%o;mPp#g!YGjJG2@8ui*W_FoTzYvHkrArt6rNH}Krt@PYS0X#?NRNgw!EPGS(4 zS@J=!vxGsYGVFtJW*CD=q{RnOPYVVyOQ{dynoSqpisuopxC&uKq>SigL2m14=SdY8C1RIe^3+M%Al^*_(A>O z#Rg5TmnNrCaV<~rk61o6>}6AyGJmX z1idOSRkva=GdfdX&Mw1XA^qZm#j}45mcLJZusZgD!TR=^4>s%nG}!L$`(W39ufcwH z!3T%@0}YNXy#-GGiyE9$@(Wz_TN+$l0t;L}Z)b4V&Hdnhc_xD=um10K13~f#1MUN#)p`eBMhV-nNERciV#0w;2uT>hcBYXT2IS*%=Em*XlH6J$qb`JgdCuC$?chfYCVTzEtM488&;Mj{|Hk{T9PBn~l}2alTn|JPn&VEF%k=LSZW z|NmDnVBi3;8F)Y>qX3u`fr$I~hA=q0gfKV;EQkh`vmhE&)`DnIc?+UJWiE&Y zmAfDsRQ7^sQ27g@L1i$A29?7g8dMg8Xi#|!qCsUchz6C*VEWmE0uT) z4yJ#kg6#v9?;t*?j0e%6avns3%6c%J$O#T7P?-K70Vs$)PjsGb4Q zpt=S`gX$X)4XSfMG^pMI(V)5qM1$%d5Dlt>Ks2Zx0@0wl2tJn2Gw;S8dTqbXi%L8 zqCxc@hz8YtAR1KvfoM=22%f@n~^38F!DCx`~spCB4khk|HOJqn^hbt#Aj)u$jDRHuSy zP`wJK|6K%!2dI7p@j-Pghz8ZOAR1KHf@n~E3!*`FE{F!zyC51=_kw6p{R^T&bufqq z)x#hfR2PG2P<;%dL3J{S2Gz?T8dNufXi)tOrl0)-QQ&$S!~oURAR1I(gJ@8l4WdEy zHi!n*-5?rNe}iaH9S)*F^*D$I)#V@>RG))rP@N8xTegM&+HUx+UwIe_@ zs4W4aLG1|;4Qf+>Xi&QXM1$HEAR5%Z0Ml_#(Z4(d;YM+4Ve{aF&gW4$| zKB%n%qCxEyFuiXhSRT}F0r5d?7Z43owZo{^q`j<2Dio}r!r7XY`pcJBZH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana b/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAsxxh4N8t+`i6S}hz2D~ z5DiM2U^euj zP*MibpyUjqK}i}!gOW9f1|@9}4NBf18kEFAG$@&aXi!oI(V*lGqCrU>M1zw(hyhCa zpzxUf?*oVeWdRTk$_5}Bloi1A=M`XiP?iAkLD>RCgR%yg-kbxL2W1fuACyf%G$^Zp zXi#Tf$86$3qUj|OM&U9{9yY)SqsDm zWiJp7%3>fIl+8diD64^JP<8{+pezTXLD>#OgR&lo24z1G4a$Nb8k7w|G$<>AXi#

^XkP}TKZJp&zILqk17Jp(QPd$4g= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Eastern b/absl/time/internal/cctz/testdata/zoneinfo/US/Eastern new file mode 100644 index 0000000000000000000000000000000000000000..7553fee37a5d03e9163ee19b1ced730a02345cfb GIT binary patch literal 3545 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii b/absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii new file mode 100644 index 0000000000000000000000000000000000000000..bd855772054f8d41e0158e71c2bf2c04e50e47cc GIT binary patch literal 276 zcmWHE%1kq2zyK@^3=AL)l3;_fc^ViP7ffM}3wKs3ljAR6Q<2GX6ySQd<_d{-7YxY@vq^M@|S{3 ziJTvyAzyH8g{+@xkkf(qpk-LF4;9UWm!`lXSg9`=hz3L5|0-Fjr z*Dhw@`Y@${`@!S}o|_v!@E#~_;M+Or1OLiN3<5JtJ_vS}FbGwKeGtwJV-Sh7_#o%J>-+ z8y6NRg??mE&f5Dy#q=_Rs@MDvYNA^i)U_HvsQ5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDHLtM%- zhWL3g9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#Uyy#*t09w}u^@A;PD9qS z#|7EbJQ;G%|NoF%rp=JI{^5uGFkXg&{=**%P2V#V?^8f$3Qw$9M|L@$u$nyXH>IDoOU^Wk!6abM7A`o#O-w+08mkBShL8TIi29-=88dN%gXiy0SqCuq;hz6BZAR1I!f$2}+!kqzB zYJvEmk_$wGN-q!%D#1WBs1yUypppzkgGw_H4Jy$5)VX!N|PW;L;Gp0F{U!8dNHR zXy2Mju=$|U5yS_TkRTdVN`h!mNeQAsr6q_4m6#wJRBD3hKa61gpwbh>2bG{88dQpc z>7yVLQksHTpb`~CgGyBp4JuhdG^lh1(V!9*M1x9M5DhA6K{Tke1<{}q7es?fT@Vc_ zc|kO&^aayzGr;ZvmBJuCs3Zo_pwbvjuhjv|gGyx(A5=1fXi(`4qCq7zhz6C?AR1Is zgJ@7`4WdCMHi!n5+8`QKa)W44=?$j;y#<>OD#by3P)QD=L8UpE-nS7f4=U9`d{D^_ zqCurQhz6DLAR1K4gJ@7m528V(Jp;G|9udVomveB4nX^lXj<2zvk)DB$uc4uyp`HO3 E0FQJ|s{jB1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Michigan b/absl/time/internal/cctz/testdata/zoneinfo/US/Michigan new file mode 100644 index 0000000000000000000000000000000000000000..e3ea5c3ef1219fdc1b6e6663d2bf3a38c27df689 GIT binary patch literal 2188 zcmWHE%1kq2zyNFv3=AL)lIVi6B^nqQ7+Uu#MbEUE!f?9dL%}8GF9nwpem}Twy5hqP zhJ_E<9PSse8yret@0Bdz6j+kL#jv=5>qA=t_k-2~o|}sv@E%An;M>{qfPZE42Z5Ps z4+J|?KL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB|Z$C&eaVJQ9;wq4S_%=c2 z;+q25gXa_EHl8bxU$`+rp^V{!V&milrO-zol(W`9P%%C7LDg&G12xfQAJnyqAE^I3 zT%gGn`atvE(gLkl<`1;@wHN4I4oT3Rmsy~<*(^c7&bz>1vP6Pmdin>WqF)Kd?w%h^ zg6<@ks%w8RGuoG6&d&S6Li*MNi)ZgYSpMGg!0On=57xKmJ+N8-uE2J8!vnki3kCMG zlO8zaZz^zXsZVh7pHkqQl9=G4UsmAi;+)|6dBq2J-S`LYm%BcA@;W~7+??~l>#gzw z?>U_XKGz%)d~31`{I)42_{aDb1WaQ|2(-~J2r7M+5G*5D5E6PKA>{Yxf-uun31Lt9 zKSanKdk}Ht#aK>+{%-=xaG@c;kn1q>|z|L@$u z!14e8@dJ!JU{U}~ium}3FgOQ?Ft~zncnE`QKnR1YO9&|CGcZC)QgX=;upW@D|Nnz> z%m4rX|ATT2hz8{v5Dm&XU^?OV0}u_$K_D8Gi$K~zISE9Aaub;Dl`H_!pj-u_K{*Rd ze`rep(V!d#qCvR~M1yh~hz8|05Dm(4AR3hGKr|@lfoM?f1JR%y2%u!Bpj->0K{*#hgK{s3 z2IXK74a&tJ8kCbkG$=QNXi$y@(V$!nrvDuV+Xu?sAU-IEgJ@7L2hpIM4x&N19Ylk2 zJctJ6dJqlD`5+pU`$06Q1OU;XQUFAQN&*lKDh)t1s6+tKpi%)ugGvSv4JsYL^t1OL zKs2b70MVe50z`vK3lI$|F+en^)Bw?-k^@A8N)HeXDnURrs1yOwpppbcgGv(+4JuJU zG^kVo)1Oy>?E{rAAU>#s0nwmR225|x0n39*8xS8<;(%ySsRN=xB@c)Ol|CRER04r$ zP$>kWK_wB029-u28dM^IXi%vHrhk71hd-!v0`Wm56o>|uQegVXN3i{%(h9@}l~^De zRBC}}P{{?NL8TXn29;nS8dQpbXi!N8qCuq@hz6BtAR1JvfoM?42BJZw8<>6@1$Gap zlmqcWB^`(cm3ClytsGb$RO*5Fppp+ngGxUT4JrXaG^i8=(V&tLM1x905Dh93K{TjT z1ks?95k!MZM=<^GKG=LvDGB0(N=gt7DlNhEzQtg9P^k&xgGx>i4JtiBG^hjx(V$Wk lM1x9F5IsCgQ!dxw5K~u|5FKA*JtI8>9bZF3JwrVME&#j*Y<&O# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain b/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmWHE%1kq2zyPca3=AL)l9&f&i!?AWFw9$KHDUg4_J##*G7}cgdfBij_1}cWEo=-+ zTpvtW(!Z?XbSKY*OUhpgE+tAZeAh3V@Izw?!%zN*3BNeX7=HaI75M!kg5l4NaDl%k ztQh|7uoU>eLWY51hO_`<`#%Pz^1lMig;EVHiINjo1O7CyIsBf$Zg8)Gz1MUCr@(;* z&b1o_xIQdu;C`@h0?*C;47>-LC-CiD$iTmHfq=lwW(L8|CIO+!R0iS96akS)cLq^U zHvutAO$KpI4FL%y*9J*WE&(Yf^#-X=Y7?X%aW=?Y;+Pjb^cK@IwK=@Seln=}}vw+I*&i!~U#rwNz@{b(>%_Yg2My47ILt|ee0{hh($ zIgfzl@0$!($KDB8-`>q&vw>@Z?e4h@cKvTA*w3zKaL7M5!Lem_gOmS;3C=0C4KDhV zCb+u9H@JR2D&VeL!{B~-xqv5c9E0cPP64mC4h-INmQL`w7SrHc(>}p(n_Yu{Oy-1u zX$lR2Hr^A0%9t90WppQmgg$8q`NKaU%=B18*i#*W2)V}$5l8t1BL5v_h+6VNAo|{N zhM1O10BmQ6@k*KJ5Y z8!;i1oxdS-t<{9AXCE7~r-cjTT;OBKEwdEJTmOL}KTKMnp#Ks>q3K_NqWmok#iI8G zO8loWl>GZWq0C}aL)pE%6DlO8G*s-{KcVtRSwq#lg%hf8L^RaYHBYGBVbxFMk2AEg2y z8kCzsG$==dXi%;O(cqj7Vt{ft$lWuf1wa%imxE|fP6yGT+zz5aIUYoVay^I!<$Mqg z%Kc!v*K`7i29*L}dhJHAd7#n�QlKAR1IEfM`(30HQ&q1BeEd5Fi>hVK_v}{29-7-8dTzdXi%vGqCq7Ohz6BDAR1HxfoM=E1g8Jp2ipfK zjX-=*i3FlSr4on+l}sQSR62oZPzeR1L8TOk29;DG8dO?=Xi$j-qCuq=hz6BhAR1J9 zfoM<(2BJZw7>EXyWFQ(;nt|!(JmB~Mm1-b9sAL1tpwbOQgGx9M4Jze8G^nHl(V)@} zM1x8^5DhBzKs2c21JR(;4@84XKoAWo1;O;^qhR|$r6Gt9DiJ|6s8j^gn>)espwbb< z2bGW@8dOSxXi!NBqCur4hz6CIAR1I^f@o0538F!zCx`}>pdcDlih}7s{NV5hm8Kv* zs6++Ppi&h~ALRqv4=P`hsXs z2@Ik^r7(yFmBb(#R2qZnw`E}WfJ$W$A5=1fXi(`4rq^15N^uYkD#<}Ks5A%D|9*qb2bJm|KB!~|(V)^DOz+zd zmIsycAU>$12hpI?9z=smd=L#P^+7bKmfL_OB%7M#I_(xBeZTaQnanfjjq>PPn^r&4hdV+9%xa?3?glUgm^{nFSLb)p<{N z>=`uSNu2J4rfmfGA1ztbWJLMeEHB&URe6qD%$sZS;gq#ub-khvtb zK=$Cz333~MERbJ#dxAolwt`~g-U&)!yb8)$w**v7-z%tk?GaEDy{MqBHBUhO-`fS6 zTnz%6_s%cSdX*%gy>H_Joy&C-bmvW8ptm_;f_`1;0)xp;6AaTQDHs*2OfYsYQ7{Q+ zn_#LQreJ3DVuCrlg@T0)tANFGDFw^l&jqZG{ZX*KeNw-gz5OGvSA@bj4fv6?_6r%5K6^Lnhpb)!nx!OA_ZB3!Po0pYdtgCw zdijJD-bD*i-6JQYzHM2Mu5LXc{cPHTOm^7`nQJ{3WIg*oA$wY?Le2#lf!s28g}n9u z1oFc)6$<(v2o#!eD-`7)5-1jZt5D*BMfL8S_a29+!z8dSP~Xiy0QqCuq$hz6B3AR1KKfM`&O z1EN8t4w(LA40aEw^a1ffB@l=Pl|mpIR1$$`P-z6BK_wE129-)68dNfYXi(_{qCq7T zhz6BXAR1IsfoM=^1)@PE7KjFwS|A!!a)D@2=>?)eB^a3g(X0TXK_wZ829;(Y8dRcz zXmF_pVt`6EP`u30Q~*(+5)MRzN;wb>D(OHpsI&vopb`&6gGxOR4J!G-bg%OQ5Dh8; z!SvewVDmsFA&3tu4M8-hLvaIDp^4^sB{I8$^Rja1aeD z#X&TvBnQ*arNHq4D$zlFP^k{0K_xqg29@q08dSoAXizB+qCq7+hz6DRAR1KSgJ@8x z528UOKZpjE{vaAu1Aytzm%;XdY61`+R2zV3P>lelH%|x4gK7p4A5=SlXiyCSqCvF; zhz8XZAR1I#fM`&S0ir>*28agL93UE0dw^(A4FabB$b!QkRFi=CpxOjPgK88oeN+Z) zKd5E_@jwsub%>$xAwGW5})j%K`R11M< zP)!7;-?o6=1FDfgd{C_fqCqtim|p7vmIu{PAU>#;0@0wF3PgiyD-aE;u|PDa)&kL> znhQjOYA+BCs=+`ss1^g!pqdO!|K|jo5312Xd{C_hqCqtqnBI35EDx&TKzvXw2ckhW z9f$_ib|4y5Utp}n(H6H`G&Kq%6A6Gzdh(&-)h>owZo{^q`j<2Dio}r!r7XTp5 Bm^=Ug literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa b/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQn)3=AL)l3;?eIT{!k7$&m*=3r!EVAxo}!0`Wn{0|VB8okITt z78DqyOe`>r-SfeyX!-|Z+j$>Mf+|0l$~Js3Gm8FT_BZK+g>*%M#a)*VmcOG4toEvX zu)b|mV6)7*z;?G>fnA$wf&FZT0*5sA0>>7a4^FNx3!IbxeQ;4dUEu2c;Da0M+5&gw zLm%AVo&4a*yyS!Dxz!)M9=Cn)Uf27<=gi^)-@g10AwIGRjLb~TEKDq{Z0sEDY@BTD z5Xi-i1bKLoILH#{Y(6dq24zc7v?yCLurM$fwli`tFesOU*!I&Ic^DWh92f-|7_648U~dL(15*Z9 z*ANC**WeJ4GZ+{cK@=kdfS3>gFpGhKi1g(TOJ6^rdj9|a|37Tof#V<=l-@uzD9wRr zP`U%t-z_siG${RnXiypi(V%n)rfrrvfM`&91k<)g8$dKDU4m&_<^v!als-W;D2;-w z2c=UG4N9vZ8kAna^e_GcAX?%T-vtm2O1mH$lzu@pC=G*XP&x+DptKC4LFpMpgVHpJ z2Bm8d4NBV}8kD|4G$@UOXiz!_(V(;rqSd&6e*n>-G!Le~N)&)-P}&F4p!5%>ulxdw zgYp5056TN58k8SEG$>DiXi&ZY(V)BmqCxosM1%4Ohz8{o5Dm&JAR3fkKr|@NfM`&@ z0n>kz!0rO&9}pjuhd?waAAx94UINje`~;#wc?v{>@)d{%K{O~|f@o0Q U1ks@U$uN>LD3@=rx2`c407?aswEzGB literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/WET b/absl/time/internal/cctz/testdata/zoneinfo/WET new file mode 100644 index 0000000000000000000000000000000000000000..444a1933d72525ab3045980eab2fbf79266cf158 GIT binary patch literal 1873 zcmWHE%1kq2zyM4P3=AL)lBj~RIeC{PPvGm865wxfogh$RHbF2&eS%Pk!~|hq7XcCD zUlT-?Ur!JdzB56b`RoMo&-*4wJYGLR^74WSQimr_klwRbKxWN40ogh81>|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<7zYe8@Ch)2(i{T=Yq)E02t&AQ2m>P{BO@uv6r>-NR6#T-xq@g= zk_FMAWDBA}Nf$(ek}rq`C1DT^O2!}>l$1d^@P?84IpZ84w(V(OaqCv?UM1ztz zhz2Ed5DiM|AR3h1K{P1IgJ@8)2hpIU528WIA4G$)0Eh-<0}u_$3LqMk9Y8cFOMqxl zwgA&#O~CE|We*S^ltn-^D4T$2P*wrapzH#oL0JYwgR%{X24x)(4az<6MjSr9~nvLT2DWknDT%8no!lqEqlC|iPPP}T&|pzH~z-#r7{56Y$>J}9e# zXi#i0Q1%DWpdtW7gNgwV4JryiG^jWL z(V!v$M1zV25Dh9CKs2a$0MVc#0z`v~2{8R)I@mp+;sV466&WBJRBV7~P|*RRLB$7% z1{EP78dQvcXi!lCqCv$8hz1oYAR1JxfM`(B0-{013y204F(4XL%z)_+kHGN(DsDi0 zP>} #include "absl/base/internal/raw_logging.h" -#include "cctz/zone_info_source.h" +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { namespace time_internal { @@ -33,6 +35,8 @@ TimeZone LoadTimeZone(const std::string& name) { } // namespace time_internal } // namespace absl +namespace absl { +namespace time_internal { namespace cctz_extension { namespace { @@ -115,3 +119,5 @@ std::unique_ptr TestFactory( ZoneInfoSourceFactory zone_info_source_factory = TestFactory; } // namespace cctz_extension +} // namespace time_internal +} // namespace absl diff --git a/absl/time/time.cc b/absl/time/time.cc index 0fb285a7b..1dde40d7e 100644 --- a/absl/time/time.cc +++ b/absl/time/time.cc @@ -36,8 +36,10 @@ #include #include -#include "cctz/civil_time.h" -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { namespace { diff --git a/absl/time/time.h b/absl/time/time.h index 30c49d412..c50d69a56 100644 --- a/absl/time/time.h +++ b/absl/time/time.h @@ -64,7 +64,7 @@ #include #include "absl/base/port.h" // Needed for string vs std::string -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" namespace absl { @@ -1032,12 +1032,12 @@ std::string UnparseFlag(Time t); // - http://en.wikipedia.org/wiki/Zoneinfo class TimeZone { public: - explicit TimeZone(cctz::time_zone tz) : cz_(tz) {} + explicit TimeZone(time_internal::cctz::time_zone tz) : cz_(tz) {} TimeZone() = default; // UTC, but prefer UTCTimeZone() to be explicit. TimeZone(const TimeZone&) = default; TimeZone& operator=(const TimeZone&) = default; - explicit operator cctz::time_zone() const { return cz_; } + explicit operator time_internal::cctz::time_zone() const { return cz_; } std::string name() const { return cz_.name(); } @@ -1048,7 +1048,7 @@ class TimeZone { return os << tz.name(); } - cctz::time_zone cz_; + time_internal::cctz::time_zone cz_; }; // LoadTimeZone() @@ -1058,11 +1058,11 @@ class TimeZone { // `false` and `*tz` is set to the UTC time zone. inline bool LoadTimeZone(const std::string& name, TimeZone* tz) { if (name == "localtime") { - *tz = TimeZone(cctz::local_time_zone()); + *tz = TimeZone(time_internal::cctz::local_time_zone()); return true; } - cctz::time_zone cz; - const bool b = cctz::load_time_zone(name, &cz); + time_internal::cctz::time_zone cz; + const bool b = time_internal::cctz::load_time_zone(name, &cz); *tz = TimeZone(cz); return b; } @@ -1074,14 +1074,14 @@ inline bool LoadTimeZone(const std::string& name, TimeZone* tz) { // you'll get UTC (i.e., no offset) instead. inline TimeZone FixedTimeZone(int seconds) { return TimeZone( - cctz::fixed_time_zone(std::chrono::seconds(seconds))); + time_internal::cctz::fixed_time_zone(std::chrono::seconds(seconds))); } // UTCTimeZone() // // Convenience method returning the UTC time zone. inline TimeZone UTCTimeZone() { - return TimeZone(cctz::utc_time_zone()); + return TimeZone(time_internal::cctz::utc_time_zone()); } // LocalTimeZone() @@ -1091,7 +1091,7 @@ inline TimeZone UTCTimeZone() { // and particularly so in a server process, as the zone configured for the // local machine should be irrelevant. Prefer an explicit zone name. inline TimeZone LocalTimeZone() { - return TimeZone(cctz::local_time_zone()); + return TimeZone(time_internal::cctz::local_time_zone()); } // ============================================================================ diff --git a/absl/time/time_zone_test.cc b/absl/time/time_zone_test.cc index 299156829..7138560ac 100644 --- a/absl/time/time_zone_test.cc +++ b/absl/time/time_zone_test.cc @@ -12,12 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" #include "gtest/gtest.h" #include "absl/time/internal/test_util.h" #include "absl/time/time.h" +namespace cctz = absl::time_internal::cctz; + namespace { TEST(TimeZone, ValueSemantics) { diff --git a/absl/types/optional.h b/absl/types/optional.h index 581321dc3..98b29e591 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -774,7 +774,9 @@ class optional : private optional_internal::optional_data, // // Accesses the underlying `T` value's member `m` of an `optional`. If the // `optional` is empty, behavior is undefined. - constexpr const T* operator->() const { return this->pointer(); } + // + // If you need myOpt->foo in constexpr, use (*myOpt).foo instead. + const T* operator->() const { return this->pointer(); } T* operator->() { assert(this->engaged_); return this->pointer(); @@ -870,12 +872,12 @@ class optional : private optional_internal::optional_data, private: // Private accessors for internal storage viewed as pointer to T. - constexpr const T* pointer() const { return &this->data_; } - T* pointer() { return &this->data_; } + const T* pointer() const { return std::addressof(this->data_); } + T* pointer() { return std::addressof(this->data_); } // Private accessors for internal storage viewed as reference to T. - constexpr const T& reference() const { return *this->pointer(); } - T& reference() { return *(this->pointer()); } + constexpr const T& reference() const { return this->data_; } + T& reference() { return this->data_; } // T constraint checks. You can't have an optional of nullopt_t, in_place_t // or a reference. diff --git a/absl/types/optional_test.cc b/absl/types/optional_test.cc index 5eedfcfd5..179bfd66d 100644 --- a/absl/types/optional_test.cc +++ b/absl/types/optional_test.cc @@ -263,7 +263,7 @@ TEST(optionalTest, CopyConstructor) { constexpr absl::optional o1(42); constexpr absl::optional o2 = o1; static_assert(o2, ""); - static_assert(o2->x == 42, ""); + static_assert((*o2).x == 42, ""); #ifndef ABSL_GLIBCXX_OPTIONAL_TRIVIALITY_BUG EXPECT_TRUE(absl::is_trivially_copy_constructible< absl::optional>::value); @@ -327,14 +327,14 @@ TEST(optionalTest, Destructor) { TEST(optionalTest, InPlaceConstructor) { constexpr absl::optional opt0{absl::in_place_t()}; static_assert(opt0, ""); - static_assert(opt0->x == ConstexprType::kCtorDefault, ""); + static_assert((*opt0).x == ConstexprType::kCtorDefault, ""); constexpr absl::optional opt1{absl::in_place_t(), 1}; static_assert(opt1, ""); - static_assert(opt1->x == ConstexprType::kCtorInt, ""); + static_assert((*opt1).x == ConstexprType::kCtorInt, ""); #ifndef ABSL_HAVE_NO_CONSTEXPR_INITIALIZER_LIST constexpr absl::optional opt2{absl::in_place_t(), {1, 2}}; static_assert(opt2, ""); - static_assert(opt2->x == ConstexprType::kCtorInitializerList, ""); + static_assert((*opt2).x == ConstexprType::kCtorInitializerList, ""); #endif // TODO(absl-team): uncomment these when std::is_constructible @@ -362,13 +362,13 @@ TEST(optionalTest, ValueConstructor) { // optional via ConstexprType::ConstexprType(const char*). constexpr absl::optional opt1 = {"abc"}; static_assert(opt1, ""); - static_assert(ConstexprType::kCtorConstChar == opt1->x, ""); + static_assert(ConstexprType::kCtorConstChar == (*opt1).x, ""); EXPECT_TRUE( (std::is_convertible>::value)); // direct initialization constexpr absl::optional opt2{2}; static_assert(opt2, ""); - static_assert(ConstexprType::kCtorInt == opt2->x, ""); + static_assert(ConstexprType::kCtorInt == (*opt2).x, ""); EXPECT_FALSE( (std::is_convertible>::value)); @@ -934,6 +934,33 @@ TEST(optionalTest, Swap) { EXPECT_TRUE(noexcept(swap(opt1, opt2))); } +template +struct DeletedOpAddr { + constexpr static const int value = v; + constexpr DeletedOpAddr() = default; + constexpr const DeletedOpAddr* operator&() const = delete; // NOLINT + DeletedOpAddr* operator&() = delete; // NOLINT +}; + +// The static_assert featuring a constexpr call to operator->() is commented out +// to document the fact that the current implementation of absl::optional +// expects such usecases to be malformed and not compile. +TEST(optionalTest, OperatorAddr) { + constexpr const int v = -1; + { // constexpr + constexpr const absl::optional> opt(absl::in_place_t{}); + static_assert(opt.has_value(), ""); + // static_assert(opt->value == v, ""); + static_assert((*opt).value == v, ""); + } + { // non-constexpr + const absl::optional> opt(absl::in_place_t{}); + EXPECT_TRUE(opt.has_value()); + EXPECT_TRUE(opt->value == v); + EXPECT_TRUE((*opt).value == v); + } +} + TEST(optionalTest, PointerStuff) { absl::optional opt(absl::in_place, "foo"); EXPECT_EQ("foo", *opt); @@ -943,7 +970,7 @@ TEST(optionalTest, PointerStuff) { EXPECT_EQ(opt_const->size(), 3); constexpr absl::optional opt1(1); - static_assert(opt1->x == ConstexprType::kCtorInt, ""); + static_assert((*opt1).x == ConstexprType::kCtorInt, ""); } // gcc has a bug pre 4.9.1 where it doesn't do correct overload resolution @@ -1123,13 +1150,13 @@ TEST(optionalTest, make_optional) { constexpr TrivialCopyable v; constexpr absl::optional c_opt0 = absl::make_optional(v); - static_assert(c_opt0->x == 0, ""); + static_assert((*c_opt0).x == 0, ""); constexpr absl::optional c_opt1 = absl::make_optional(); - static_assert(c_opt1->x == 0, ""); + static_assert((*c_opt1).x == 0, ""); constexpr absl::optional c_opt2 = absl::make_optional(42); - static_assert(c_opt2->x == 42, ""); + static_assert((*c_opt2).x == 42, ""); } }