From 4cd39829ac4397430e73870ae7421b2e505d09ac Mon Sep 17 00:00:00 2001 From: chriszero Date: Fri, 10 May 2013 21:24:34 +0200 Subject: [PATCH] initial commit --- .gitattributes | 22 + .gitignore | 163 + pytz/__init__.py | 1543 ++++++++ pytz/exceptions.py | 48 + pytz/reference.py | 127 + pytz/tzfile.py | 137 + pytz/tzinfo.py | 563 +++ pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 156 bytes pytz/zoneinfo/Africa/Accra | Bin 0 -> 378 bytes pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 180 bytes pytz/zoneinfo/Africa/Algiers | Bin 0 -> 734 bytes pytz/zoneinfo/Africa/Asmara | Bin 0 -> 201 bytes pytz/zoneinfo/Africa/Asmera | Bin 0 -> 201 bytes pytz/zoneinfo/Africa/Bamako | Bin 0 -> 224 bytes pytz/zoneinfo/Africa/Bangui | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Banjul | Bin 0 -> 232 bytes pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 140 bytes pytz/zoneinfo/Africa/Cairo | Bin 0 -> 1906 bytes pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 1558 bytes pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2049 bytes pytz/zoneinfo/Africa/Conakry | Bin 0 -> 224 bytes pytz/zoneinfo/Africa/Dakar | Bin 0 -> 194 bytes pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 229 bytes pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Douala | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 194 bytes pytz/zoneinfo/Africa/Freetown | Bin 0 -> 665 bytes pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 234 bytes pytz/zoneinfo/Africa/Harare | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 245 bytes pytz/zoneinfo/Africa/Juba | Bin 0 -> 669 bytes pytz/zoneinfo/Africa/Kampala | Bin 0 -> 269 bytes pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 669 bytes pytz/zoneinfo/Africa/Kigali | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 140 bytes pytz/zoneinfo/Africa/Lagos | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Libreville | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Lome | Bin 0 -> 139 bytes pytz/zoneinfo/Africa/Luanda | Bin 0 -> 178 bytes pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 140 bytes pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Malabo | Bin 0 -> 195 bytes pytz/zoneinfo/Africa/Maputo | Bin 0 -> 157 bytes pytz/zoneinfo/Africa/Maseru | Bin 0 -> 204 bytes pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 160 bytes pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 210 bytes pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 215 bytes pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 269 bytes pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 211 bytes pytz/zoneinfo/Africa/Niamey | Bin 0 -> 225 bytes pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 224 bytes pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 156 bytes pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 195 bytes pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 173 bytes pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 224 bytes pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 1350 bytes pytz/zoneinfo/Africa/Tunis | Bin 0 -> 684 bytes pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 1556 bytes pytz/zoneinfo/America/Adak | Bin 0 -> 2353 bytes pytz/zoneinfo/America/Anchorage | Bin 0 -> 2358 bytes pytz/zoneinfo/America/Anguilla | Bin 0 -> 156 bytes pytz/zoneinfo/America/Antigua | Bin 0 -> 194 bytes pytz/zoneinfo/America/Araguaina | Bin 0 -> 1609 bytes pytz/zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1061 bytes pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1103 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1119 bytes pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1117 bytes pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1147 bytes pytz/zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1075 bytes pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1117 bytes pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1125 bytes pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1131 bytes pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Aruba | Bin 0 -> 194 bytes pytz/zoneinfo/America/Asuncion | Bin 0 -> 2036 bytes pytz/zoneinfo/America/Atikokan | Bin 0 -> 319 bytes pytz/zoneinfo/America/Atka | Bin 0 -> 2353 bytes pytz/zoneinfo/America/Bahia | Bin 0 -> 1022 bytes pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1574 bytes pytz/zoneinfo/America/Barbados | Bin 0 -> 330 bytes pytz/zoneinfo/America/Belem | Bin 0 -> 574 bytes pytz/zoneinfo/America/Belize | Bin 0 -> 962 bytes pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 281 bytes pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 630 bytes pytz/zoneinfo/America/Bogota | Bin 0 -> 231 bytes pytz/zoneinfo/America/Boise | Bin 0 -> 2377 bytes pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1061 bytes pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2084 bytes pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 2001 bytes pytz/zoneinfo/America/Cancun | Bin 0 -> 1466 bytes pytz/zoneinfo/America/Caracas | Bin 0 -> 240 bytes pytz/zoneinfo/America/Catamarca | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Cayenne | Bin 0 -> 186 bytes pytz/zoneinfo/America/Cayman | Bin 0 -> 177 bytes pytz/zoneinfo/America/Chicago | Bin 0 -> 3559 bytes pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1508 bytes pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 319 bytes pytz/zoneinfo/America/Cordoba | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 315 bytes pytz/zoneinfo/America/Creston | Bin 0 -> 207 bytes pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1973 bytes pytz/zoneinfo/America/Curacao | Bin 0 -> 194 bytes pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 700 bytes pytz/zoneinfo/America/Dawson | Bin 0 -> 2067 bytes pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1033 bytes pytz/zoneinfo/America/Denver | Bin 0 -> 2427 bytes pytz/zoneinfo/America/Detroit | Bin 0 -> 2202 bytes pytz/zoneinfo/America/Dominica | Bin 0 -> 156 bytes pytz/zoneinfo/America/Edmonton | Bin 0 -> 2388 bytes pytz/zoneinfo/America/Eirunepe | Bin 0 -> 640 bytes pytz/zoneinfo/America/El_Salvador | Bin 0 -> 236 bytes pytz/zoneinfo/America/Ensenada | Bin 0 -> 2342 bytes pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1649 bytes pytz/zoneinfo/America/Fortaleza | Bin 0 -> 714 bytes pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes pytz/zoneinfo/America/Godthab | Bin 0 -> 8296 bytes pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3193 bytes pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1871 bytes pytz/zoneinfo/America/Grenada | Bin 0 -> 156 bytes pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 156 bytes pytz/zoneinfo/America/Guatemala | Bin 0 -> 292 bytes pytz/zoneinfo/America/Guayaquil | Bin 0 -> 177 bytes pytz/zoneinfo/America/Guyana | Bin 0 -> 256 bytes pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes pytz/zoneinfo/America/Havana | Bin 0 -> 2411 bytes pytz/zoneinfo/America/Hermosillo | Bin 0 -> 440 bytes pytz/zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1649 bytes pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2411 bytes pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1705 bytes pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1887 bytes pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1709 bytes pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1397 bytes pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1677 bytes pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1761 bytes pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1649 bytes pytz/zoneinfo/America/Inuvik | Bin 0 -> 1914 bytes pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2032 bytes pytz/zoneinfo/America/Jamaica | Bin 0 -> 481 bytes pytz/zoneinfo/America/Jujuy | Bin 0 -> 1119 bytes pytz/zoneinfo/America/Juneau | Bin 0 -> 2336 bytes pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2755 bytes pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2335 bytes pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2411 bytes pytz/zoneinfo/America/Kralendijk | Bin 0 -> 194 bytes pytz/zoneinfo/America/La_Paz | Bin 0 -> 217 bytes pytz/zoneinfo/America/Lima | Bin 0 -> 395 bytes pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2819 bytes pytz/zoneinfo/America/Louisville | Bin 0 -> 2755 bytes pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 194 bytes pytz/zoneinfo/America/Maceio | Bin 0 -> 742 bytes pytz/zoneinfo/America/Managua | Bin 0 -> 437 bytes pytz/zoneinfo/America/Manaus | Bin 0 -> 602 bytes pytz/zoneinfo/America/Marigot | Bin 0 -> 156 bytes pytz/zoneinfo/America/Martinique | Bin 0 -> 231 bytes pytz/zoneinfo/America/Matamoros | Bin 0 -> 1402 bytes pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1550 bytes pytz/zoneinfo/America/Mendoza | Bin 0 -> 1147 bytes pytz/zoneinfo/America/Menominee | Bin 0 -> 2257 bytes pytz/zoneinfo/America/Merida | Bin 0 -> 1442 bytes pytz/zoneinfo/America/Metlakatla | Bin 0 -> 717 bytes pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1604 bytes pytz/zoneinfo/America/Miquelon | Bin 0 -> 1670 bytes pytz/zoneinfo/America/Moncton | Bin 0 -> 3137 bytes pytz/zoneinfo/America/Monterrey | Bin 0 -> 1402 bytes pytz/zoneinfo/America/Montevideo | Bin 0 -> 2134 bytes pytz/zoneinfo/America/Montreal | Bin 0 -> 3477 bytes pytz/zoneinfo/America/Montserrat | Bin 0 -> 156 bytes pytz/zoneinfo/America/Nassau | Bin 0 -> 2270 bytes pytz/zoneinfo/America/New_York | Bin 0 -> 3519 bytes pytz/zoneinfo/America/Nipigon | Bin 0 -> 2105 bytes pytz/zoneinfo/America/Nome | Bin 0 -> 2350 bytes pytz/zoneinfo/America/Noronha | Bin 0 -> 714 bytes pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2363 bytes pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2363 bytes pytz/zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2363 bytes pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1508 bytes pytz/zoneinfo/America/Panama | Bin 0 -> 177 bytes pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2094 bytes pytz/zoneinfo/America/Paramaribo | Bin 0 -> 294 bytes pytz/zoneinfo/America/Phoenix | Bin 0 -> 327 bytes pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1457 bytes pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 156 bytes pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 612 bytes pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 574 bytes pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 229 bytes pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2105 bytes pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1916 bytes pytz/zoneinfo/America/Recife | Bin 0 -> 714 bytes pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes pytz/zoneinfo/America/Resolute | Bin 0 -> 1916 bytes pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 612 bytes pytz/zoneinfo/America/Rosario | Bin 0 -> 1103 bytes pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2342 bytes pytz/zoneinfo/America/Santarem | Bin 0 -> 612 bytes pytz/zoneinfo/America/Santiago | Bin 0 -> 9227 bytes pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 463 bytes pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 2001 bytes pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1911 bytes pytz/zoneinfo/America/Shiprock | Bin 0 -> 2427 bytes pytz/zoneinfo/America/Sitka | Bin 0 -> 2324 bytes pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 156 bytes pytz/zoneinfo/America/St_Johns | Bin 0 -> 3638 bytes pytz/zoneinfo/America/St_Kitts | Bin 0 -> 156 bytes pytz/zoneinfo/America/St_Lucia | Bin 0 -> 177 bytes pytz/zoneinfo/America/St_Thomas | Bin 0 -> 156 bytes pytz/zoneinfo/America/St_Vincent | Bin 0 -> 177 bytes pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 264 bytes pytz/zoneinfo/America/Thule | Bin 0 -> 1514 bytes pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 2185 bytes pytz/zoneinfo/America/Tijuana | Bin 0 -> 2342 bytes pytz/zoneinfo/America/Toronto | Bin 0 -> 3477 bytes pytz/zoneinfo/America/Tortola | Bin 0 -> 156 bytes pytz/zoneinfo/America/Vancouver | Bin 0 -> 2875 bytes pytz/zoneinfo/America/Virgin | Bin 0 -> 156 bytes pytz/zoneinfo/America/Whitehorse | Bin 0 -> 2067 bytes pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2865 bytes pytz/zoneinfo/America/Yakutat | Bin 0 -> 2288 bytes pytz/zoneinfo/America/Yellowknife | Bin 0 -> 1966 bytes pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 255 bytes pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 276 bytes pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 213 bytes pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1549 bytes pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 190 bytes pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2001 bytes pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 8762 bytes pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 159 bytes pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2001 bytes pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 160 bytes pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 160 bytes pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2225 bytes pytz/zoneinfo/Asia/Aden | Bin 0 -> 157 bytes pytz/zoneinfo/Asia/Almaty | Bin 0 -> 922 bytes pytz/zoneinfo/Asia/Amman | Bin 0 -> 1863 bytes pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1183 bytes pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 1128 bytes pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 1038 bytes pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 657 bytes pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 657 bytes pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 962 bytes pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 195 bytes pytz/zoneinfo/Asia/Baku | Bin 0 -> 1942 bytes pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 178 bytes pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2149 bytes pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 1047 bytes pytz/zoneinfo/Asia/Brunei | Bin 0 -> 187 bytes pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 265 bytes pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 890 bytes pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 389 bytes pytz/zoneinfo/Asia/Chungking | Bin 0 -> 389 bytes pytz/zoneinfo/Asia/Colombo | Bin 0 -> 363 bytes pytz/zoneinfo/Asia/Dacca | Bin 0 -> 364 bytes pytz/zoneinfo/Asia/Damascus | Bin 0 -> 2306 bytes pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 364 bytes pytz/zoneinfo/Asia/Dili | Bin 0 -> 293 bytes pytz/zoneinfo/Asia/Dubai | Bin 0 -> 157 bytes pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 597 bytes pytz/zoneinfo/Asia/Gaza | Bin 0 -> 1562 bytes pytz/zoneinfo/Asia/Harbin | Bin 0 -> 463 bytes pytz/zoneinfo/Asia/Hebron | Bin 0 -> 1590 bytes pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 255 bytes pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1175 bytes pytz/zoneinfo/Asia/Hovd | Bin 0 -> 834 bytes pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1203 bytes pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 2721 bytes pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 344 bytes pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 225 bytes pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 9251 bytes pytz/zoneinfo/Asia/Kabul | Bin 0 -> 173 bytes pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1167 bytes pytz/zoneinfo/Asia/Karachi | Bin 0 -> 389 bytes pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 419 bytes pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 198 bytes pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 198 bytes pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1281 bytes pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 265 bytes pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1182 bytes pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 372 bytes pytz/zoneinfo/Asia/Kuching | Bin 0 -> 505 bytes pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 157 bytes pytz/zoneinfo/Asia/Macao | Bin 0 -> 781 bytes pytz/zoneinfo/Asia/Macau | Bin 0 -> 781 bytes pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1183 bytes pytz/zoneinfo/Asia/Makassar | Bin 0 -> 263 bytes pytz/zoneinfo/Asia/Manila | Bin 0 -> 335 bytes pytz/zoneinfo/Asia/Muscat | Bin 0 -> 157 bytes pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1220 bytes pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1196 bytes pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1182 bytes pytz/zoneinfo/Asia/Oral | Bin 0 -> 1086 bytes pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 255 bytes pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 359 bytes pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 258 bytes pytz/zoneinfo/Asia/Qatar | Bin 0 -> 195 bytes pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1068 bytes pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 259 bytes pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 157 bytes pytz/zoneinfo/Asia/Riyadh87 | Bin 0 -> 8685 bytes pytz/zoneinfo/Asia/Riyadh88 | Bin 0 -> 8539 bytes pytz/zoneinfo/Asia/Riyadh89 | Bin 0 -> 8539 bytes pytz/zoneinfo/Asia/Saigon | Bin 0 -> 255 bytes pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1213 bytes pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 677 bytes pytz/zoneinfo/Asia/Seoul | Bin 0 -> 396 bytes pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 405 bytes pytz/zoneinfo/Asia/Singapore | Bin 0 -> 402 bytes pytz/zoneinfo/Asia/Taipei | Bin 0 -> 724 bytes pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 667 bytes pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1116 bytes pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1638 bytes pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 9251 bytes pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 195 bytes pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 195 bytes pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 331 bytes pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 263 bytes pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 834 bytes pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 834 bytes pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 389 bytes pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1249 bytes pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 255 bytes pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1197 bytes pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1183 bytes pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1252 bytes pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1263 bytes pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3462 bytes pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 1990 bytes pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1899 bytes pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 240 bytes pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2225 bytes pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3452 bytes pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1141 bytes pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 139 bytes pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 177 bytes pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1220 bytes pytz/zoneinfo/Australia/ACT | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2202 bytes pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 413 bytes pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2237 bytes pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/Currie | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/Darwin | Bin 0 -> 288 bytes pytz/zoneinfo/Australia/Eucla | Bin 0 -> 446 bytes pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2295 bytes pytz/zoneinfo/Australia/LHI | Bin 0 -> 1821 bytes pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 483 bytes pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1821 bytes pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/NSW | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/North | Bin 0 -> 288 bytes pytz/zoneinfo/Australia/Perth | Bin 0 -> 440 bytes pytz/zoneinfo/Australia/Queensland | Bin 0 -> 413 bytes pytz/zoneinfo/Australia/South | Bin 0 -> 2202 bytes pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2295 bytes pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2183 bytes pytz/zoneinfo/Australia/West | Bin 0 -> 440 bytes pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2237 bytes pytz/zoneinfo/Brazil/Acre | Bin 0 -> 612 bytes pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 714 bytes pytz/zoneinfo/Brazil/East | Bin 0 -> 2001 bytes pytz/zoneinfo/Brazil/West | Bin 0 -> 602 bytes pytz/zoneinfo/CET | Bin 0 -> 2102 bytes pytz/zoneinfo/CST6CDT | Bin 0 -> 2294 bytes pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes pytz/zoneinfo/Canada/Central | Bin 0 -> 2865 bytes pytz/zoneinfo/Canada/East-Saskatchewan | Bin 0 -> 980 bytes pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3477 bytes pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2388 bytes pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3638 bytes pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2875 bytes pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes pytz/zoneinfo/Canada/Yukon | Bin 0 -> 2067 bytes pytz/zoneinfo/Chile/Continental | Bin 0 -> 9227 bytes pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 8989 bytes pytz/zoneinfo/Cuba | Bin 0 -> 2411 bytes pytz/zoneinfo/EET | Bin 0 -> 1876 bytes pytz/zoneinfo/EST | Bin 0 -> 118 bytes pytz/zoneinfo/EST5EDT | Bin 0 -> 2294 bytes pytz/zoneinfo/Egypt | Bin 0 -> 1906 bytes pytz/zoneinfo/Eire | Bin 0 -> 3533 bytes pytz/zoneinfo/Etc/GMT | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 130 bytes pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 130 bytes pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 130 bytes pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 126 bytes pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 131 bytes pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 131 bytes pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 131 bytes pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 131 bytes pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 131 bytes pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 127 bytes pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/UCT | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/UTC | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/Universal | Bin 0 -> 118 bytes pytz/zoneinfo/Etc/Zulu | Bin 0 -> 118 bytes pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2917 bytes pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1725 bytes pytz/zoneinfo/Europe/Athens | Bin 0 -> 2245 bytes pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3661 bytes pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2309 bytes pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2246 bytes pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2944 bytes pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2195 bytes pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2407 bytes pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1892 bytes pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2407 bytes pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2134 bytes pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3533 bytes pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3035 bytes pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3661 bytes pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1883 bytes pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3661 bytes pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 2721 bytes pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3661 bytes pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1494 bytes pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2057 bytes pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3439 bytes pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/London | Bin 0 -> 3661 bytes pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2960 bytes pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2593 bytes pytz/zoneinfo/Europe/Malta | Bin 0 -> 2603 bytes pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1883 bytes pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1328 bytes pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2927 bytes pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1464 bytes pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2225 bytes pytz/zoneinfo/Europe/Paris | Bin 0 -> 2945 bytes pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/Prague | Bin 0 -> 2246 bytes pytz/zoneinfo/Europe/Riga | Bin 0 -> 2209 bytes pytz/zoneinfo/Europe/Rome | Bin 0 -> 2652 bytes pytz/zoneinfo/Europe/Samara | Bin 0 -> 1330 bytes pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2652 bytes pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 2113 bytes pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2104 bytes pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 1892 bytes pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2175 bytes pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2407 bytes pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2077 bytes pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1799 bytes pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2652 bytes pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2211 bytes pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2173 bytes pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1234 bytes pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2679 bytes pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1931 bytes pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2085 bytes pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1892 bytes pytz/zoneinfo/Factory | Bin 0 -> 255 bytes pytz/zoneinfo/GB | Bin 0 -> 3661 bytes pytz/zoneinfo/GB-Eire | Bin 0 -> 3661 bytes pytz/zoneinfo/GMT | Bin 0 -> 118 bytes pytz/zoneinfo/GMT+0 | Bin 0 -> 118 bytes pytz/zoneinfo/GMT-0 | Bin 0 -> 118 bytes pytz/zoneinfo/GMT0 | Bin 0 -> 118 bytes pytz/zoneinfo/Greenwich | Bin 0 -> 118 bytes pytz/zoneinfo/HST | Bin 0 -> 119 bytes pytz/zoneinfo/Hongkong | Bin 0 -> 1175 bytes pytz/zoneinfo/Iceland | Bin 0 -> 1141 bytes pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 227 bytes pytz/zoneinfo/Indian/Chagos | Bin 0 -> 187 bytes pytz/zoneinfo/Indian/Christmas | Bin 0 -> 140 bytes pytz/zoneinfo/Indian/Cocos | Bin 0 -> 143 bytes pytz/zoneinfo/Indian/Comoro | Bin 0 -> 157 bytes pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 157 bytes pytz/zoneinfo/Indian/Mahe | Bin 0 -> 157 bytes pytz/zoneinfo/Indian/Maldives | Bin 0 -> 178 bytes pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 239 bytes pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 157 bytes pytz/zoneinfo/Indian/Reunion | Bin 0 -> 157 bytes pytz/zoneinfo/Iran | Bin 0 -> 1638 bytes pytz/zoneinfo/Israel | Bin 0 -> 9251 bytes pytz/zoneinfo/Jamaica | Bin 0 -> 481 bytes pytz/zoneinfo/Japan | Bin 0 -> 331 bytes pytz/zoneinfo/Kwajalein | Bin 0 -> 211 bytes pytz/zoneinfo/Libya | Bin 0 -> 1350 bytes pytz/zoneinfo/MET | Bin 0 -> 2102 bytes pytz/zoneinfo/MST | Bin 0 -> 118 bytes pytz/zoneinfo/MST7MDT | Bin 0 -> 2294 bytes pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2342 bytes pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1550 bytes pytz/zoneinfo/Mexico/General | Bin 0 -> 1604 bytes pytz/zoneinfo/Mideast/Riyadh87 | Bin 0 -> 8685 bytes pytz/zoneinfo/Mideast/Riyadh88 | Bin 0 -> 8539 bytes pytz/zoneinfo/Mideast/Riyadh89 | Bin 0 -> 8539 bytes pytz/zoneinfo/NZ | Bin 0 -> 2434 bytes pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2018 bytes pytz/zoneinfo/Navajo | Bin 0 -> 2427 bytes pytz/zoneinfo/PRC | Bin 0 -> 405 bytes pytz/zoneinfo/PST8PDT | Bin 0 -> 2294 bytes pytz/zoneinfo/Pacific/Apia | Bin 0 -> 1079 bytes pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2434 bytes pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2018 bytes pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Easter | Bin 0 -> 8989 bytes pytz/zoneinfo/Pacific/Efate | Bin 0 -> 464 bytes pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 204 bytes pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 171 bytes pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 7782 bytes pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 141 bytes pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 197 bytes pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 159 bytes pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 158 bytes pytz/zoneinfo/Pacific/Guam | Bin 0 -> 199 bytes pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 250 bytes pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 119 bytes pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 204 bytes pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 204 bytes pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 211 bytes pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 171 bytes pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 162 bytes pytz/zoneinfo/Pacific/Midway | Bin 0 -> 268 bytes pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 240 bytes pytz/zoneinfo/Pacific/Niue | Bin 0 -> 200 bytes pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 182 bytes pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 300 bytes pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 290 bytes pytz/zoneinfo/Pacific/Palau | Bin 0 -> 140 bytes pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 177 bytes pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 163 bytes pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 548 bytes pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 229 bytes pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 290 bytes pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 160 bytes pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 313 bytes pytz/zoneinfo/Pacific/Truk | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Wake | Bin 0 -> 144 bytes pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 141 bytes pytz/zoneinfo/Pacific/Yap | Bin 0 -> 144 bytes pytz/zoneinfo/Poland | Bin 0 -> 2679 bytes pytz/zoneinfo/Portugal | Bin 0 -> 3439 bytes pytz/zoneinfo/ROC | Bin 0 -> 724 bytes pytz/zoneinfo/ROK | Bin 0 -> 396 bytes pytz/zoneinfo/Singapore | Bin 0 -> 402 bytes pytz/zoneinfo/Turkey | Bin 0 -> 2721 bytes pytz/zoneinfo/UCT | Bin 0 -> 118 bytes pytz/zoneinfo/US/Alaska | Bin 0 -> 2358 bytes pytz/zoneinfo/US/Aleutian | Bin 0 -> 2353 bytes pytz/zoneinfo/US/Arizona | Bin 0 -> 327 bytes pytz/zoneinfo/US/Central | Bin 0 -> 3559 bytes pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1649 bytes pytz/zoneinfo/US/Eastern | Bin 0 -> 3519 bytes pytz/zoneinfo/US/Hawaii | Bin 0 -> 250 bytes pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2411 bytes pytz/zoneinfo/US/Michigan | Bin 0 -> 2202 bytes pytz/zoneinfo/US/Mountain | Bin 0 -> 2427 bytes pytz/zoneinfo/US/Pacific | Bin 0 -> 2819 bytes pytz/zoneinfo/US/Pacific-New | Bin 0 -> 2819 bytes pytz/zoneinfo/US/Samoa | Bin 0 -> 290 bytes pytz/zoneinfo/UTC | Bin 0 -> 118 bytes pytz/zoneinfo/Universal | Bin 0 -> 118 bytes pytz/zoneinfo/W-SU | Bin 0 -> 1464 bytes pytz/zoneinfo/WET | Bin 0 -> 1873 bytes pytz/zoneinfo/Zulu | Bin 0 -> 118 bytes pytz/zoneinfo/iso3166.tab | 276 ++ pytz/zoneinfo/localtime | Bin 0 -> 118 bytes pytz/zoneinfo/posixrules | Bin 0 -> 3519 bytes pytz/zoneinfo/zone.tab | 444 +++ requests/__init__.py | 71 + requests/adapters.py | 261 ++ requests/api.py | 120 + requests/auth.py | 175 + requests/cacert.pem | 3290 +++++++++++++++++ requests/certs.py | 24 + requests/compat.py | 113 + requests/cookies.py | 385 ++ requests/exceptions.py | 55 + requests/hooks.py | 45 + requests/models.py | 676 ++++ requests/packages/__init__.py | 3 + requests/packages/charade/__init__.py | 32 + requests/packages/charade/big5freq.py | 925 +++++ requests/packages/charade/big5prober.py | 42 + requests/packages/charade/chardistribution.py | 231 ++ .../packages/charade/charsetgroupprober.py | 106 + requests/packages/charade/charsetprober.py | 62 + .../packages/charade/codingstatemachine.py | 61 + requests/packages/charade/compat.py | 34 + requests/packages/charade/constants.py | 39 + requests/packages/charade/cp949prober.py | 44 + requests/packages/charade/escprober.py | 86 + requests/packages/charade/escsm.py | 242 ++ requests/packages/charade/eucjpprober.py | 90 + requests/packages/charade/euckrfreq.py | 596 +++ requests/packages/charade/euckrprober.py | 42 + requests/packages/charade/euctwfreq.py | 428 +++ requests/packages/charade/euctwprober.py | 41 + requests/packages/charade/gb2312freq.py | 472 +++ requests/packages/charade/gb2312prober.py | 41 + requests/packages/charade/hebrewprober.py | 283 ++ requests/packages/charade/jisfreq.py | 569 +++ requests/packages/charade/jpcntx.py | 219 ++ .../packages/charade/langbulgarianmodel.py | 229 ++ .../packages/charade/langcyrillicmodel.py | 329 ++ requests/packages/charade/langgreekmodel.py | 225 ++ requests/packages/charade/langhebrewmodel.py | 201 + .../packages/charade/langhungarianmodel.py | 225 ++ requests/packages/charade/langthaimodel.py | 200 + requests/packages/charade/latin1prober.py | 139 + requests/packages/charade/mbcharsetprober.py | 86 + requests/packages/charade/mbcsgroupprober.py | 54 + requests/packages/charade/mbcssm.py | 575 +++ requests/packages/charade/sbcharsetprober.py | 120 + requests/packages/charade/sbcsgroupprober.py | 69 + requests/packages/charade/sjisprober.py | 91 + .../packages/charade/universaldetector.py | 172 + requests/packages/charade/utf8prober.py | 76 + requests/packages/urllib3/__init__.py | 58 + requests/packages/urllib3/_collections.py | 94 + requests/packages/urllib3/connectionpool.py | 595 +++ requests/packages/urllib3/contrib/__init__.py | 0 requests/packages/urllib3/contrib/ntlmpool.py | 120 + .../packages/urllib3/contrib/pyopenssl.py | 167 + requests/packages/urllib3/exceptions.py | 87 + requests/packages/urllib3/filepost.py | 98 + .../packages/urllib3/packages/__init__.py | 4 + .../packages/urllib3/packages/ordered_dict.py | 260 ++ requests/packages/urllib3/packages/six.py | 385 ++ .../packages/ssl_match_hostname/__init__.py | 61 + requests/packages/urllib3/poolmanager.py | 191 + requests/packages/urllib3/request.py | 142 + requests/packages/urllib3/response.py | 214 ++ requests/packages/urllib3/util.py | 378 ++ requests/sessions.py | 505 +++ requests/status_codes.py | 86 + requests/structures.py | 91 + requests/utils.py | 591 +++ tvsp2xmltv/__init__.py | 1 + tvsp2xmltv/defaults.py | 166 + tvsp2xmltv/logger.py | 41 + tvsp2xmltv/model.py | 220 ++ tvsp2xmltv/tvsGrabber.py | 100 + tvspielfilm2xmltv.py | 152 + 671 files changed, 20824 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 pytz/__init__.py create mode 100644 pytz/exceptions.py create mode 100644 pytz/reference.py create mode 100644 pytz/tzfile.py create mode 100644 pytz/tzinfo.py create mode 100644 pytz/zoneinfo/Africa/Abidjan create mode 100644 pytz/zoneinfo/Africa/Accra create mode 100644 pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 pytz/zoneinfo/Africa/Algiers create mode 100644 pytz/zoneinfo/Africa/Asmara create mode 100644 pytz/zoneinfo/Africa/Asmera create mode 100644 pytz/zoneinfo/Africa/Bamako create mode 100644 pytz/zoneinfo/Africa/Bangui create mode 100644 pytz/zoneinfo/Africa/Banjul create mode 100644 pytz/zoneinfo/Africa/Bissau create mode 100644 pytz/zoneinfo/Africa/Blantyre create mode 100644 pytz/zoneinfo/Africa/Brazzaville create mode 100644 pytz/zoneinfo/Africa/Bujumbura create mode 100644 pytz/zoneinfo/Africa/Cairo create mode 100644 pytz/zoneinfo/Africa/Casablanca create mode 100644 pytz/zoneinfo/Africa/Ceuta create mode 100644 pytz/zoneinfo/Africa/Conakry create mode 100644 pytz/zoneinfo/Africa/Dakar create mode 100644 pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 pytz/zoneinfo/Africa/Djibouti create mode 100644 pytz/zoneinfo/Africa/Douala create mode 100644 pytz/zoneinfo/Africa/El_Aaiun create mode 100644 pytz/zoneinfo/Africa/Freetown create mode 100644 pytz/zoneinfo/Africa/Gaborone create mode 100644 pytz/zoneinfo/Africa/Harare create mode 100644 pytz/zoneinfo/Africa/Johannesburg create mode 100644 pytz/zoneinfo/Africa/Juba create mode 100644 pytz/zoneinfo/Africa/Kampala create mode 100644 pytz/zoneinfo/Africa/Khartoum create mode 100644 pytz/zoneinfo/Africa/Kigali create mode 100644 pytz/zoneinfo/Africa/Kinshasa create mode 100644 pytz/zoneinfo/Africa/Lagos create mode 100644 pytz/zoneinfo/Africa/Libreville create mode 100644 pytz/zoneinfo/Africa/Lome create mode 100644 pytz/zoneinfo/Africa/Luanda create mode 100644 pytz/zoneinfo/Africa/Lubumbashi create mode 100644 pytz/zoneinfo/Africa/Lusaka create mode 100644 pytz/zoneinfo/Africa/Malabo create mode 100644 pytz/zoneinfo/Africa/Maputo create mode 100644 pytz/zoneinfo/Africa/Maseru create mode 100644 pytz/zoneinfo/Africa/Mbabane create mode 100644 pytz/zoneinfo/Africa/Mogadishu create mode 100644 pytz/zoneinfo/Africa/Monrovia create mode 100644 pytz/zoneinfo/Africa/Nairobi create mode 100644 pytz/zoneinfo/Africa/Ndjamena create mode 100644 pytz/zoneinfo/Africa/Niamey create mode 100644 pytz/zoneinfo/Africa/Nouakchott create mode 100644 pytz/zoneinfo/Africa/Ouagadougou create mode 100644 pytz/zoneinfo/Africa/Porto-Novo create mode 100644 pytz/zoneinfo/Africa/Sao_Tome create mode 100644 pytz/zoneinfo/Africa/Timbuktu create mode 100644 pytz/zoneinfo/Africa/Tripoli create mode 100644 pytz/zoneinfo/Africa/Tunis create mode 100644 pytz/zoneinfo/Africa/Windhoek create mode 100644 pytz/zoneinfo/America/Adak create mode 100644 pytz/zoneinfo/America/Anchorage create mode 100644 pytz/zoneinfo/America/Anguilla create mode 100644 pytz/zoneinfo/America/Antigua create mode 100644 pytz/zoneinfo/America/Araguaina create mode 100644 pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 pytz/zoneinfo/America/Argentina/Salta create mode 100644 pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 pytz/zoneinfo/America/Aruba create mode 100644 pytz/zoneinfo/America/Asuncion create mode 100644 pytz/zoneinfo/America/Atikokan create mode 100644 pytz/zoneinfo/America/Atka create mode 100644 pytz/zoneinfo/America/Bahia create mode 100644 pytz/zoneinfo/America/Bahia_Banderas create mode 100644 pytz/zoneinfo/America/Barbados create mode 100644 pytz/zoneinfo/America/Belem create mode 100644 pytz/zoneinfo/America/Belize create mode 100644 pytz/zoneinfo/America/Blanc-Sablon create mode 100644 pytz/zoneinfo/America/Boa_Vista create mode 100644 pytz/zoneinfo/America/Bogota create mode 100644 pytz/zoneinfo/America/Boise create mode 100644 pytz/zoneinfo/America/Buenos_Aires create mode 100644 pytz/zoneinfo/America/Cambridge_Bay create mode 100644 pytz/zoneinfo/America/Campo_Grande create mode 100644 pytz/zoneinfo/America/Cancun create mode 100644 pytz/zoneinfo/America/Caracas create mode 100644 pytz/zoneinfo/America/Catamarca create mode 100644 pytz/zoneinfo/America/Cayenne create mode 100644 pytz/zoneinfo/America/Cayman create mode 100644 pytz/zoneinfo/America/Chicago create mode 100644 pytz/zoneinfo/America/Chihuahua create mode 100644 pytz/zoneinfo/America/Coral_Harbour create mode 100644 pytz/zoneinfo/America/Cordoba create mode 100644 pytz/zoneinfo/America/Costa_Rica create mode 100644 pytz/zoneinfo/America/Creston create mode 100644 pytz/zoneinfo/America/Cuiaba create mode 100644 pytz/zoneinfo/America/Curacao create mode 100644 pytz/zoneinfo/America/Danmarkshavn create mode 100644 pytz/zoneinfo/America/Dawson create mode 100644 pytz/zoneinfo/America/Dawson_Creek create mode 100644 pytz/zoneinfo/America/Denver create mode 100644 pytz/zoneinfo/America/Detroit create mode 100644 pytz/zoneinfo/America/Dominica create mode 100644 pytz/zoneinfo/America/Edmonton create mode 100644 pytz/zoneinfo/America/Eirunepe create mode 100644 pytz/zoneinfo/America/El_Salvador create mode 100644 pytz/zoneinfo/America/Ensenada create mode 100644 pytz/zoneinfo/America/Fort_Wayne create mode 100644 pytz/zoneinfo/America/Fortaleza create mode 100644 pytz/zoneinfo/America/Glace_Bay create mode 100644 pytz/zoneinfo/America/Godthab create mode 100644 pytz/zoneinfo/America/Goose_Bay create mode 100644 pytz/zoneinfo/America/Grand_Turk create mode 100644 pytz/zoneinfo/America/Grenada create mode 100644 pytz/zoneinfo/America/Guadeloupe create mode 100644 pytz/zoneinfo/America/Guatemala create mode 100644 pytz/zoneinfo/America/Guayaquil create mode 100644 pytz/zoneinfo/America/Guyana create mode 100644 pytz/zoneinfo/America/Halifax create mode 100644 pytz/zoneinfo/America/Havana create mode 100644 pytz/zoneinfo/America/Hermosillo create mode 100644 pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 pytz/zoneinfo/America/Indiana/Knox create mode 100644 pytz/zoneinfo/America/Indiana/Marengo create mode 100644 pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 pytz/zoneinfo/America/Indiana/Vevay create mode 100644 pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 pytz/zoneinfo/America/Indiana/Winamac create mode 100644 pytz/zoneinfo/America/Indianapolis create mode 100644 pytz/zoneinfo/America/Inuvik create mode 100644 pytz/zoneinfo/America/Iqaluit create mode 100644 pytz/zoneinfo/America/Jamaica create mode 100644 pytz/zoneinfo/America/Jujuy create mode 100644 pytz/zoneinfo/America/Juneau create mode 100644 pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 pytz/zoneinfo/America/Knox_IN create mode 100644 pytz/zoneinfo/America/Kralendijk create mode 100644 pytz/zoneinfo/America/La_Paz create mode 100644 pytz/zoneinfo/America/Lima create mode 100644 pytz/zoneinfo/America/Los_Angeles create mode 100644 pytz/zoneinfo/America/Louisville create mode 100644 pytz/zoneinfo/America/Lower_Princes create mode 100644 pytz/zoneinfo/America/Maceio create mode 100644 pytz/zoneinfo/America/Managua create mode 100644 pytz/zoneinfo/America/Manaus create mode 100644 pytz/zoneinfo/America/Marigot create mode 100644 pytz/zoneinfo/America/Martinique create mode 100644 pytz/zoneinfo/America/Matamoros create mode 100644 pytz/zoneinfo/America/Mazatlan create mode 100644 pytz/zoneinfo/America/Mendoza create mode 100644 pytz/zoneinfo/America/Menominee create mode 100644 pytz/zoneinfo/America/Merida create mode 100644 pytz/zoneinfo/America/Metlakatla create mode 100644 pytz/zoneinfo/America/Mexico_City create mode 100644 pytz/zoneinfo/America/Miquelon create mode 100644 pytz/zoneinfo/America/Moncton create mode 100644 pytz/zoneinfo/America/Monterrey create mode 100644 pytz/zoneinfo/America/Montevideo create mode 100644 pytz/zoneinfo/America/Montreal create mode 100644 pytz/zoneinfo/America/Montserrat create mode 100644 pytz/zoneinfo/America/Nassau create mode 100644 pytz/zoneinfo/America/New_York create mode 100644 pytz/zoneinfo/America/Nipigon create mode 100644 pytz/zoneinfo/America/Nome create mode 100644 pytz/zoneinfo/America/Noronha create mode 100644 pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 pytz/zoneinfo/America/North_Dakota/Center create mode 100644 pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 pytz/zoneinfo/America/Ojinaga create mode 100644 pytz/zoneinfo/America/Panama create mode 100644 pytz/zoneinfo/America/Pangnirtung create mode 100644 pytz/zoneinfo/America/Paramaribo create mode 100644 pytz/zoneinfo/America/Phoenix create mode 100644 pytz/zoneinfo/America/Port-au-Prince create mode 100644 pytz/zoneinfo/America/Port_of_Spain create mode 100644 pytz/zoneinfo/America/Porto_Acre create mode 100644 pytz/zoneinfo/America/Porto_Velho create mode 100644 pytz/zoneinfo/America/Puerto_Rico create mode 100644 pytz/zoneinfo/America/Rainy_River create mode 100644 pytz/zoneinfo/America/Rankin_Inlet create mode 100644 pytz/zoneinfo/America/Recife create mode 100644 pytz/zoneinfo/America/Regina create mode 100644 pytz/zoneinfo/America/Resolute create mode 100644 pytz/zoneinfo/America/Rio_Branco create mode 100644 pytz/zoneinfo/America/Rosario create mode 100644 pytz/zoneinfo/America/Santa_Isabel create mode 100644 pytz/zoneinfo/America/Santarem create mode 100644 pytz/zoneinfo/America/Santiago create mode 100644 pytz/zoneinfo/America/Santo_Domingo create mode 100644 pytz/zoneinfo/America/Sao_Paulo create mode 100644 pytz/zoneinfo/America/Scoresbysund create mode 100644 pytz/zoneinfo/America/Shiprock create mode 100644 pytz/zoneinfo/America/Sitka create mode 100644 pytz/zoneinfo/America/St_Barthelemy create mode 100644 pytz/zoneinfo/America/St_Johns create mode 100644 pytz/zoneinfo/America/St_Kitts create mode 100644 pytz/zoneinfo/America/St_Lucia create mode 100644 pytz/zoneinfo/America/St_Thomas create mode 100644 pytz/zoneinfo/America/St_Vincent create mode 100644 pytz/zoneinfo/America/Swift_Current create mode 100644 pytz/zoneinfo/America/Tegucigalpa create mode 100644 pytz/zoneinfo/America/Thule create mode 100644 pytz/zoneinfo/America/Thunder_Bay create mode 100644 pytz/zoneinfo/America/Tijuana create mode 100644 pytz/zoneinfo/America/Toronto create mode 100644 pytz/zoneinfo/America/Tortola create mode 100644 pytz/zoneinfo/America/Vancouver create mode 100644 pytz/zoneinfo/America/Virgin create mode 100644 pytz/zoneinfo/America/Whitehorse create mode 100644 pytz/zoneinfo/America/Winnipeg create mode 100644 pytz/zoneinfo/America/Yakutat create mode 100644 pytz/zoneinfo/America/Yellowknife create mode 100644 pytz/zoneinfo/Antarctica/Casey create mode 100644 pytz/zoneinfo/Antarctica/Davis create mode 100644 pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 pytz/zoneinfo/Antarctica/Macquarie create mode 100644 pytz/zoneinfo/Antarctica/Mawson create mode 100644 pytz/zoneinfo/Antarctica/McMurdo create mode 100644 pytz/zoneinfo/Antarctica/Palmer create mode 100644 pytz/zoneinfo/Antarctica/Rothera create mode 100644 pytz/zoneinfo/Antarctica/South_Pole create mode 100644 pytz/zoneinfo/Antarctica/Syowa create mode 100644 pytz/zoneinfo/Antarctica/Vostok create mode 100644 pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 pytz/zoneinfo/Asia/Aden create mode 100644 pytz/zoneinfo/Asia/Almaty create mode 100644 pytz/zoneinfo/Asia/Amman create mode 100644 pytz/zoneinfo/Asia/Anadyr create mode 100644 pytz/zoneinfo/Asia/Aqtau create mode 100644 pytz/zoneinfo/Asia/Aqtobe create mode 100644 pytz/zoneinfo/Asia/Ashgabat create mode 100644 pytz/zoneinfo/Asia/Ashkhabad create mode 100644 pytz/zoneinfo/Asia/Baghdad create mode 100644 pytz/zoneinfo/Asia/Bahrain create mode 100644 pytz/zoneinfo/Asia/Baku create mode 100644 pytz/zoneinfo/Asia/Bangkok create mode 100644 pytz/zoneinfo/Asia/Beirut create mode 100644 pytz/zoneinfo/Asia/Bishkek create mode 100644 pytz/zoneinfo/Asia/Brunei create mode 100644 pytz/zoneinfo/Asia/Calcutta create mode 100644 pytz/zoneinfo/Asia/Choibalsan create mode 100644 pytz/zoneinfo/Asia/Chongqing create mode 100644 pytz/zoneinfo/Asia/Chungking create mode 100644 pytz/zoneinfo/Asia/Colombo create mode 100644 pytz/zoneinfo/Asia/Dacca create mode 100644 pytz/zoneinfo/Asia/Damascus create mode 100644 pytz/zoneinfo/Asia/Dhaka create mode 100644 pytz/zoneinfo/Asia/Dili create mode 100644 pytz/zoneinfo/Asia/Dubai create mode 100644 pytz/zoneinfo/Asia/Dushanbe create mode 100644 pytz/zoneinfo/Asia/Gaza create mode 100644 pytz/zoneinfo/Asia/Harbin create mode 100644 pytz/zoneinfo/Asia/Hebron create mode 100644 pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 pytz/zoneinfo/Asia/Hong_Kong create mode 100644 pytz/zoneinfo/Asia/Hovd create mode 100644 pytz/zoneinfo/Asia/Irkutsk create mode 100644 pytz/zoneinfo/Asia/Istanbul create mode 100644 pytz/zoneinfo/Asia/Jakarta create mode 100644 pytz/zoneinfo/Asia/Jayapura create mode 100644 pytz/zoneinfo/Asia/Jerusalem create mode 100644 pytz/zoneinfo/Asia/Kabul create mode 100644 pytz/zoneinfo/Asia/Kamchatka create mode 100644 pytz/zoneinfo/Asia/Karachi create mode 100644 pytz/zoneinfo/Asia/Kashgar create mode 100644 pytz/zoneinfo/Asia/Kathmandu create mode 100644 pytz/zoneinfo/Asia/Katmandu create mode 100644 pytz/zoneinfo/Asia/Khandyga create mode 100644 pytz/zoneinfo/Asia/Kolkata create mode 100644 pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 pytz/zoneinfo/Asia/Kuching create mode 100644 pytz/zoneinfo/Asia/Kuwait create mode 100644 pytz/zoneinfo/Asia/Macao create mode 100644 pytz/zoneinfo/Asia/Macau create mode 100644 pytz/zoneinfo/Asia/Magadan create mode 100644 pytz/zoneinfo/Asia/Makassar create mode 100644 pytz/zoneinfo/Asia/Manila create mode 100644 pytz/zoneinfo/Asia/Muscat create mode 100644 pytz/zoneinfo/Asia/Nicosia create mode 100644 pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 pytz/zoneinfo/Asia/Novosibirsk create mode 100644 pytz/zoneinfo/Asia/Omsk create mode 100644 pytz/zoneinfo/Asia/Oral create mode 100644 pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 pytz/zoneinfo/Asia/Pontianak create mode 100644 pytz/zoneinfo/Asia/Pyongyang create mode 100644 pytz/zoneinfo/Asia/Qatar create mode 100644 pytz/zoneinfo/Asia/Qyzylorda create mode 100644 pytz/zoneinfo/Asia/Rangoon create mode 100644 pytz/zoneinfo/Asia/Riyadh create mode 100644 pytz/zoneinfo/Asia/Riyadh87 create mode 100644 pytz/zoneinfo/Asia/Riyadh88 create mode 100644 pytz/zoneinfo/Asia/Riyadh89 create mode 100644 pytz/zoneinfo/Asia/Saigon create mode 100644 pytz/zoneinfo/Asia/Sakhalin create mode 100644 pytz/zoneinfo/Asia/Samarkand create mode 100644 pytz/zoneinfo/Asia/Seoul create mode 100644 pytz/zoneinfo/Asia/Shanghai create mode 100644 pytz/zoneinfo/Asia/Singapore create mode 100644 pytz/zoneinfo/Asia/Taipei create mode 100644 pytz/zoneinfo/Asia/Tashkent create mode 100644 pytz/zoneinfo/Asia/Tbilisi create mode 100644 pytz/zoneinfo/Asia/Tehran create mode 100644 pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 pytz/zoneinfo/Asia/Thimbu create mode 100644 pytz/zoneinfo/Asia/Thimphu create mode 100644 pytz/zoneinfo/Asia/Tokyo create mode 100644 pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 pytz/zoneinfo/Asia/Urumqi create mode 100644 pytz/zoneinfo/Asia/Ust-Nera create mode 100644 pytz/zoneinfo/Asia/Vientiane create mode 100644 pytz/zoneinfo/Asia/Vladivostok create mode 100644 pytz/zoneinfo/Asia/Yakutsk create mode 100644 pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 pytz/zoneinfo/Asia/Yerevan create mode 100644 pytz/zoneinfo/Atlantic/Azores create mode 100644 pytz/zoneinfo/Atlantic/Bermuda create mode 100644 pytz/zoneinfo/Atlantic/Canary create mode 100644 pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 pytz/zoneinfo/Atlantic/Faeroe create mode 100644 pytz/zoneinfo/Atlantic/Faroe create mode 100644 pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 pytz/zoneinfo/Atlantic/Madeira create mode 100644 pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 pytz/zoneinfo/Atlantic/St_Helena create mode 100644 pytz/zoneinfo/Atlantic/Stanley create mode 100644 pytz/zoneinfo/Australia/ACT create mode 100644 pytz/zoneinfo/Australia/Adelaide create mode 100644 pytz/zoneinfo/Australia/Brisbane create mode 100644 pytz/zoneinfo/Australia/Broken_Hill create mode 100644 pytz/zoneinfo/Australia/Canberra create mode 100644 pytz/zoneinfo/Australia/Currie create mode 100644 pytz/zoneinfo/Australia/Darwin create mode 100644 pytz/zoneinfo/Australia/Eucla create mode 100644 pytz/zoneinfo/Australia/Hobart create mode 100644 pytz/zoneinfo/Australia/LHI create mode 100644 pytz/zoneinfo/Australia/Lindeman create mode 100644 pytz/zoneinfo/Australia/Lord_Howe create mode 100644 pytz/zoneinfo/Australia/Melbourne create mode 100644 pytz/zoneinfo/Australia/NSW create mode 100644 pytz/zoneinfo/Australia/North create mode 100644 pytz/zoneinfo/Australia/Perth create mode 100644 pytz/zoneinfo/Australia/Queensland create mode 100644 pytz/zoneinfo/Australia/South create mode 100644 pytz/zoneinfo/Australia/Sydney create mode 100644 pytz/zoneinfo/Australia/Tasmania create mode 100644 pytz/zoneinfo/Australia/Victoria create mode 100644 pytz/zoneinfo/Australia/West create mode 100644 pytz/zoneinfo/Australia/Yancowinna create mode 100644 pytz/zoneinfo/Brazil/Acre create mode 100644 pytz/zoneinfo/Brazil/DeNoronha create mode 100644 pytz/zoneinfo/Brazil/East create mode 100644 pytz/zoneinfo/Brazil/West create mode 100644 pytz/zoneinfo/CET create mode 100644 pytz/zoneinfo/CST6CDT create mode 100644 pytz/zoneinfo/Canada/Atlantic create mode 100644 pytz/zoneinfo/Canada/Central create mode 100644 pytz/zoneinfo/Canada/East-Saskatchewan create mode 100644 pytz/zoneinfo/Canada/Eastern create mode 100644 pytz/zoneinfo/Canada/Mountain create mode 100644 pytz/zoneinfo/Canada/Newfoundland create mode 100644 pytz/zoneinfo/Canada/Pacific create mode 100644 pytz/zoneinfo/Canada/Saskatchewan create mode 100644 pytz/zoneinfo/Canada/Yukon create mode 100644 pytz/zoneinfo/Chile/Continental create mode 100644 pytz/zoneinfo/Chile/EasterIsland create mode 100644 pytz/zoneinfo/Cuba create mode 100644 pytz/zoneinfo/EET create mode 100644 pytz/zoneinfo/EST create mode 100644 pytz/zoneinfo/EST5EDT create mode 100644 pytz/zoneinfo/Egypt create mode 100644 pytz/zoneinfo/Eire create mode 100644 pytz/zoneinfo/Etc/GMT create mode 100644 pytz/zoneinfo/Etc/GMT+0 create mode 100644 pytz/zoneinfo/Etc/GMT+1 create mode 100644 pytz/zoneinfo/Etc/GMT+10 create mode 100644 pytz/zoneinfo/Etc/GMT+11 create mode 100644 pytz/zoneinfo/Etc/GMT+12 create mode 100644 pytz/zoneinfo/Etc/GMT+2 create mode 100644 pytz/zoneinfo/Etc/GMT+3 create mode 100644 pytz/zoneinfo/Etc/GMT+4 create mode 100644 pytz/zoneinfo/Etc/GMT+5 create mode 100644 pytz/zoneinfo/Etc/GMT+6 create mode 100644 pytz/zoneinfo/Etc/GMT+7 create mode 100644 pytz/zoneinfo/Etc/GMT+8 create mode 100644 pytz/zoneinfo/Etc/GMT+9 create mode 100644 pytz/zoneinfo/Etc/GMT-0 create mode 100644 pytz/zoneinfo/Etc/GMT-1 create mode 100644 pytz/zoneinfo/Etc/GMT-10 create mode 100644 pytz/zoneinfo/Etc/GMT-11 create mode 100644 pytz/zoneinfo/Etc/GMT-12 create mode 100644 pytz/zoneinfo/Etc/GMT-13 create mode 100644 pytz/zoneinfo/Etc/GMT-14 create mode 100644 pytz/zoneinfo/Etc/GMT-2 create mode 100644 pytz/zoneinfo/Etc/GMT-3 create mode 100644 pytz/zoneinfo/Etc/GMT-4 create mode 100644 pytz/zoneinfo/Etc/GMT-5 create mode 100644 pytz/zoneinfo/Etc/GMT-6 create mode 100644 pytz/zoneinfo/Etc/GMT-7 create mode 100644 pytz/zoneinfo/Etc/GMT-8 create mode 100644 pytz/zoneinfo/Etc/GMT-9 create mode 100644 pytz/zoneinfo/Etc/GMT0 create mode 100644 pytz/zoneinfo/Etc/Greenwich create mode 100644 pytz/zoneinfo/Etc/UCT create mode 100644 pytz/zoneinfo/Etc/UTC create mode 100644 pytz/zoneinfo/Etc/Universal create mode 100644 pytz/zoneinfo/Etc/Zulu create mode 100644 pytz/zoneinfo/Europe/Amsterdam create mode 100644 pytz/zoneinfo/Europe/Andorra create mode 100644 pytz/zoneinfo/Europe/Athens create mode 100644 pytz/zoneinfo/Europe/Belfast create mode 100644 pytz/zoneinfo/Europe/Belgrade create mode 100644 pytz/zoneinfo/Europe/Berlin create mode 100644 pytz/zoneinfo/Europe/Bratislava create mode 100644 pytz/zoneinfo/Europe/Brussels create mode 100644 pytz/zoneinfo/Europe/Bucharest create mode 100644 pytz/zoneinfo/Europe/Budapest create mode 100644 pytz/zoneinfo/Europe/Busingen create mode 100644 pytz/zoneinfo/Europe/Chisinau create mode 100644 pytz/zoneinfo/Europe/Copenhagen create mode 100644 pytz/zoneinfo/Europe/Dublin create mode 100644 pytz/zoneinfo/Europe/Gibraltar create mode 100644 pytz/zoneinfo/Europe/Guernsey create mode 100644 pytz/zoneinfo/Europe/Helsinki create mode 100644 pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 pytz/zoneinfo/Europe/Istanbul create mode 100644 pytz/zoneinfo/Europe/Jersey create mode 100644 pytz/zoneinfo/Europe/Kaliningrad create mode 100644 pytz/zoneinfo/Europe/Kiev create mode 100644 pytz/zoneinfo/Europe/Lisbon create mode 100644 pytz/zoneinfo/Europe/Ljubljana create mode 100644 pytz/zoneinfo/Europe/London create mode 100644 pytz/zoneinfo/Europe/Luxembourg create mode 100644 pytz/zoneinfo/Europe/Madrid create mode 100644 pytz/zoneinfo/Europe/Malta create mode 100644 pytz/zoneinfo/Europe/Mariehamn create mode 100644 pytz/zoneinfo/Europe/Minsk create mode 100644 pytz/zoneinfo/Europe/Monaco create mode 100644 pytz/zoneinfo/Europe/Moscow create mode 100644 pytz/zoneinfo/Europe/Nicosia create mode 100644 pytz/zoneinfo/Europe/Oslo create mode 100644 pytz/zoneinfo/Europe/Paris create mode 100644 pytz/zoneinfo/Europe/Podgorica create mode 100644 pytz/zoneinfo/Europe/Prague create mode 100644 pytz/zoneinfo/Europe/Riga create mode 100644 pytz/zoneinfo/Europe/Rome create mode 100644 pytz/zoneinfo/Europe/Samara create mode 100644 pytz/zoneinfo/Europe/San_Marino create mode 100644 pytz/zoneinfo/Europe/Sarajevo create mode 100644 pytz/zoneinfo/Europe/Simferopol create mode 100644 pytz/zoneinfo/Europe/Skopje create mode 100644 pytz/zoneinfo/Europe/Sofia create mode 100644 pytz/zoneinfo/Europe/Stockholm create mode 100644 pytz/zoneinfo/Europe/Tallinn create mode 100644 pytz/zoneinfo/Europe/Tirane create mode 100644 pytz/zoneinfo/Europe/Tiraspol create mode 100644 pytz/zoneinfo/Europe/Uzhgorod create mode 100644 pytz/zoneinfo/Europe/Vaduz create mode 100644 pytz/zoneinfo/Europe/Vatican create mode 100644 pytz/zoneinfo/Europe/Vienna create mode 100644 pytz/zoneinfo/Europe/Vilnius create mode 100644 pytz/zoneinfo/Europe/Volgograd create mode 100644 pytz/zoneinfo/Europe/Warsaw create mode 100644 pytz/zoneinfo/Europe/Zagreb create mode 100644 pytz/zoneinfo/Europe/Zaporozhye create mode 100644 pytz/zoneinfo/Europe/Zurich create mode 100644 pytz/zoneinfo/Factory create mode 100644 pytz/zoneinfo/GB create mode 100644 pytz/zoneinfo/GB-Eire create mode 100644 pytz/zoneinfo/GMT create mode 100644 pytz/zoneinfo/GMT+0 create mode 100644 pytz/zoneinfo/GMT-0 create mode 100644 pytz/zoneinfo/GMT0 create mode 100644 pytz/zoneinfo/Greenwich create mode 100644 pytz/zoneinfo/HST create mode 100644 pytz/zoneinfo/Hongkong create mode 100644 pytz/zoneinfo/Iceland create mode 100644 pytz/zoneinfo/Indian/Antananarivo create mode 100644 pytz/zoneinfo/Indian/Chagos create mode 100644 pytz/zoneinfo/Indian/Christmas create mode 100644 pytz/zoneinfo/Indian/Cocos create mode 100644 pytz/zoneinfo/Indian/Comoro create mode 100644 pytz/zoneinfo/Indian/Kerguelen create mode 100644 pytz/zoneinfo/Indian/Mahe create mode 100644 pytz/zoneinfo/Indian/Maldives create mode 100644 pytz/zoneinfo/Indian/Mauritius create mode 100644 pytz/zoneinfo/Indian/Mayotte create mode 100644 pytz/zoneinfo/Indian/Reunion create mode 100644 pytz/zoneinfo/Iran create mode 100644 pytz/zoneinfo/Israel create mode 100644 pytz/zoneinfo/Jamaica create mode 100644 pytz/zoneinfo/Japan create mode 100644 pytz/zoneinfo/Kwajalein create mode 100644 pytz/zoneinfo/Libya create mode 100644 pytz/zoneinfo/MET create mode 100644 pytz/zoneinfo/MST create mode 100644 pytz/zoneinfo/MST7MDT create mode 100644 pytz/zoneinfo/Mexico/BajaNorte create mode 100644 pytz/zoneinfo/Mexico/BajaSur create mode 100644 pytz/zoneinfo/Mexico/General create mode 100644 pytz/zoneinfo/Mideast/Riyadh87 create mode 100644 pytz/zoneinfo/Mideast/Riyadh88 create mode 100644 pytz/zoneinfo/Mideast/Riyadh89 create mode 100644 pytz/zoneinfo/NZ create mode 100644 pytz/zoneinfo/NZ-CHAT create mode 100644 pytz/zoneinfo/Navajo create mode 100644 pytz/zoneinfo/PRC create mode 100644 pytz/zoneinfo/PST8PDT create mode 100644 pytz/zoneinfo/Pacific/Apia create mode 100644 pytz/zoneinfo/Pacific/Auckland create mode 100644 pytz/zoneinfo/Pacific/Chatham create mode 100644 pytz/zoneinfo/Pacific/Chuuk create mode 100644 pytz/zoneinfo/Pacific/Easter create mode 100644 pytz/zoneinfo/Pacific/Efate create mode 100644 pytz/zoneinfo/Pacific/Enderbury create mode 100644 pytz/zoneinfo/Pacific/Fakaofo create mode 100644 pytz/zoneinfo/Pacific/Fiji create mode 100644 pytz/zoneinfo/Pacific/Funafuti create mode 100644 pytz/zoneinfo/Pacific/Galapagos create mode 100644 pytz/zoneinfo/Pacific/Gambier create mode 100644 pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 pytz/zoneinfo/Pacific/Guam create mode 100644 pytz/zoneinfo/Pacific/Honolulu create mode 100644 pytz/zoneinfo/Pacific/Johnston create mode 100644 pytz/zoneinfo/Pacific/Kiritimati create mode 100644 pytz/zoneinfo/Pacific/Kosrae create mode 100644 pytz/zoneinfo/Pacific/Kwajalein create mode 100644 pytz/zoneinfo/Pacific/Majuro create mode 100644 pytz/zoneinfo/Pacific/Marquesas create mode 100644 pytz/zoneinfo/Pacific/Midway create mode 100644 pytz/zoneinfo/Pacific/Nauru create mode 100644 pytz/zoneinfo/Pacific/Niue create mode 100644 pytz/zoneinfo/Pacific/Norfolk create mode 100644 pytz/zoneinfo/Pacific/Noumea create mode 100644 pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 pytz/zoneinfo/Pacific/Palau create mode 100644 pytz/zoneinfo/Pacific/Pitcairn create mode 100644 pytz/zoneinfo/Pacific/Pohnpei create mode 100644 pytz/zoneinfo/Pacific/Ponape create mode 100644 pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 pytz/zoneinfo/Pacific/Rarotonga create mode 100644 pytz/zoneinfo/Pacific/Saipan create mode 100644 pytz/zoneinfo/Pacific/Samoa create mode 100644 pytz/zoneinfo/Pacific/Tahiti create mode 100644 pytz/zoneinfo/Pacific/Tarawa create mode 100644 pytz/zoneinfo/Pacific/Tongatapu create mode 100644 pytz/zoneinfo/Pacific/Truk create mode 100644 pytz/zoneinfo/Pacific/Wake create mode 100644 pytz/zoneinfo/Pacific/Wallis create mode 100644 pytz/zoneinfo/Pacific/Yap create mode 100644 pytz/zoneinfo/Poland create mode 100644 pytz/zoneinfo/Portugal create mode 100644 pytz/zoneinfo/ROC create mode 100644 pytz/zoneinfo/ROK create mode 100644 pytz/zoneinfo/Singapore create mode 100644 pytz/zoneinfo/Turkey create mode 100644 pytz/zoneinfo/UCT create mode 100644 pytz/zoneinfo/US/Alaska create mode 100644 pytz/zoneinfo/US/Aleutian create mode 100644 pytz/zoneinfo/US/Arizona create mode 100644 pytz/zoneinfo/US/Central create mode 100644 pytz/zoneinfo/US/East-Indiana create mode 100644 pytz/zoneinfo/US/Eastern create mode 100644 pytz/zoneinfo/US/Hawaii create mode 100644 pytz/zoneinfo/US/Indiana-Starke create mode 100644 pytz/zoneinfo/US/Michigan create mode 100644 pytz/zoneinfo/US/Mountain create mode 100644 pytz/zoneinfo/US/Pacific create mode 100644 pytz/zoneinfo/US/Pacific-New create mode 100644 pytz/zoneinfo/US/Samoa create mode 100644 pytz/zoneinfo/UTC create mode 100644 pytz/zoneinfo/Universal create mode 100644 pytz/zoneinfo/W-SU create mode 100644 pytz/zoneinfo/WET create mode 100644 pytz/zoneinfo/Zulu create mode 100644 pytz/zoneinfo/iso3166.tab create mode 100644 pytz/zoneinfo/localtime create mode 100644 pytz/zoneinfo/posixrules create mode 100644 pytz/zoneinfo/zone.tab create mode 100644 requests/__init__.py create mode 100644 requests/adapters.py create mode 100644 requests/api.py create mode 100644 requests/auth.py create mode 100644 requests/cacert.pem create mode 100644 requests/certs.py create mode 100644 requests/compat.py create mode 100644 requests/cookies.py create mode 100644 requests/exceptions.py create mode 100644 requests/hooks.py create mode 100644 requests/models.py create mode 100644 requests/packages/__init__.py create mode 100644 requests/packages/charade/__init__.py create mode 100644 requests/packages/charade/big5freq.py create mode 100644 requests/packages/charade/big5prober.py create mode 100644 requests/packages/charade/chardistribution.py create mode 100644 requests/packages/charade/charsetgroupprober.py create mode 100644 requests/packages/charade/charsetprober.py create mode 100644 requests/packages/charade/codingstatemachine.py create mode 100644 requests/packages/charade/compat.py create mode 100644 requests/packages/charade/constants.py create mode 100644 requests/packages/charade/cp949prober.py create mode 100644 requests/packages/charade/escprober.py create mode 100644 requests/packages/charade/escsm.py create mode 100644 requests/packages/charade/eucjpprober.py create mode 100644 requests/packages/charade/euckrfreq.py create mode 100644 requests/packages/charade/euckrprober.py create mode 100644 requests/packages/charade/euctwfreq.py create mode 100644 requests/packages/charade/euctwprober.py create mode 100644 requests/packages/charade/gb2312freq.py create mode 100644 requests/packages/charade/gb2312prober.py create mode 100644 requests/packages/charade/hebrewprober.py create mode 100644 requests/packages/charade/jisfreq.py create mode 100644 requests/packages/charade/jpcntx.py create mode 100644 requests/packages/charade/langbulgarianmodel.py create mode 100644 requests/packages/charade/langcyrillicmodel.py create mode 100644 requests/packages/charade/langgreekmodel.py create mode 100644 requests/packages/charade/langhebrewmodel.py create mode 100644 requests/packages/charade/langhungarianmodel.py create mode 100644 requests/packages/charade/langthaimodel.py create mode 100644 requests/packages/charade/latin1prober.py create mode 100644 requests/packages/charade/mbcharsetprober.py create mode 100644 requests/packages/charade/mbcsgroupprober.py create mode 100644 requests/packages/charade/mbcssm.py create mode 100644 requests/packages/charade/sbcharsetprober.py create mode 100644 requests/packages/charade/sbcsgroupprober.py create mode 100644 requests/packages/charade/sjisprober.py create mode 100644 requests/packages/charade/universaldetector.py create mode 100644 requests/packages/charade/utf8prober.py create mode 100644 requests/packages/urllib3/__init__.py create mode 100644 requests/packages/urllib3/_collections.py create mode 100644 requests/packages/urllib3/connectionpool.py create mode 100644 requests/packages/urllib3/contrib/__init__.py create mode 100644 requests/packages/urllib3/contrib/ntlmpool.py create mode 100644 requests/packages/urllib3/contrib/pyopenssl.py create mode 100644 requests/packages/urllib3/exceptions.py create mode 100644 requests/packages/urllib3/filepost.py create mode 100644 requests/packages/urllib3/packages/__init__.py create mode 100644 requests/packages/urllib3/packages/ordered_dict.py create mode 100644 requests/packages/urllib3/packages/six.py create mode 100644 requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 requests/packages/urllib3/poolmanager.py create mode 100644 requests/packages/urllib3/request.py create mode 100644 requests/packages/urllib3/response.py create mode 100644 requests/packages/urllib3/util.py create mode 100644 requests/sessions.py create mode 100644 requests/status_codes.py create mode 100644 requests/structures.py create mode 100644 requests/utils.py create mode 100644 tvsp2xmltv/__init__.py create mode 100644 tvsp2xmltv/defaults.py create mode 100644 tvsp2xmltv/logger.py create mode 100644 tvsp2xmltv/model.py create mode 100644 tvsp2xmltv/tvsGrabber.py create mode 100644 tvspielfilm2xmltv.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ebd21a --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/pytz/__init__.py b/pytz/__init__.py new file mode 100644 index 0000000..1975ea6 --- /dev/null +++ b/pytz/__init__.py @@ -0,0 +1,1543 @@ +''' +datetime.tzinfo timezone definitions generated from the +Olson timezone database: + + ftp://elsie.nci.nih.gov/pub/tz*.tar.gz + +See the datetime section of the Python Library Reference for information +on how to use these modules. +''' + +# The Olson database is updated several times a year. +OLSON_VERSION = '2013b' +VERSION = OLSON_VERSION +# Version format for a patch release - only one so far. +#VERSION = OLSON_VERSION + '.2' +__version__ = OLSON_VERSION + +OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling + +__all__ = [ + 'timezone', 'utc', 'country_timezones', 'country_names', + 'AmbiguousTimeError', 'InvalidTimeError', + 'NonExistentTimeError', 'UnknownTimeZoneError', + 'all_timezones', 'all_timezones_set', + 'common_timezones', 'common_timezones_set', + ] + +import sys, datetime, os.path, gettext +try: + from UserDict import DictMixin +except ImportError: + from collections import Mapping as DictMixin + +try: + from pkg_resources import resource_stream +except ImportError: + resource_stream = None + +from pytz.exceptions import AmbiguousTimeError +from pytz.exceptions import InvalidTimeError +from pytz.exceptions import NonExistentTimeError +from pytz.exceptions import UnknownTimeZoneError +from pytz.tzinfo import unpickler +from pytz.tzfile import build_tzinfo, _byte_string + + +try: + unicode + +except NameError: # Python 3.x + + # Python 3.x doesn't have unicode(), making writing code + # for Python 2.3 and Python 3.x a pain. + unicode = str + + def ascii(s): + r""" + >>> ascii('Hello') + 'Hello' + >>> ascii('\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + UnicodeEncodeError: ... + """ + s.encode('US-ASCII') # Raise an exception if not ASCII + return s # But return the original string - not a byte string. + +else: # Python 2.x + + def ascii(s): + r""" + >>> ascii('Hello') + 'Hello' + >>> ascii(u'Hello') + 'Hello' + >>> ascii(u'\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + UnicodeEncodeError: ... + """ + return s.encode('US-ASCII') + + +def open_resource(name): + """Open a resource from the zoneinfo subdir for reading. + + Uses the pkg_resources module if available and no standard file + found at the calculated location. + """ + name_parts = name.lstrip('/').split('/') + for part in name_parts: + if part == os.path.pardir or os.path.sep in part: + raise ValueError('Bad path segment: %r' % part) + filename = os.path.join(os.path.dirname(__file__), + 'zoneinfo', *name_parts) + if not os.path.exists(filename) and resource_stream is not None: + # http://bugs.launchpad.net/bugs/383171 - we avoid using this + # unless absolutely necessary to help when a broken version of + # pkg_resources is installed. + return resource_stream(__name__, 'zoneinfo/' + name) + return open(filename, 'rb') + + +def resource_exists(name): + """Return true if the given resource exists""" + try: + open_resource(name).close() + return True + except IOError: + return False + + +# Enable this when we get some translations? +# We want an i18n API that is useful to programs using Python's gettext +# module, as well as the Zope3 i18n package. Perhaps we should just provide +# the POT file and translations, and leave it up to callers to make use +# of them. +# +# t = gettext.translation( +# 'pytz', os.path.join(os.path.dirname(__file__), 'locales'), +# fallback=True +# ) +# def _(timezone_name): +# """Translate a timezone name using the current locale, returning Unicode""" +# return t.ugettext(timezone_name) + + +_tzinfo_cache = {} + +def timezone(zone): + r''' Return a datetime.tzinfo implementation for the given timezone + + >>> from datetime import datetime, timedelta + >>> utc = timezone('UTC') + >>> eastern = timezone('US/Eastern') + >>> eastern.zone + 'US/Eastern' + >>> timezone(unicode('US/Eastern')) is eastern + True + >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) + >>> loc_dt = utc_dt.astimezone(eastern) + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> loc_dt.strftime(fmt) + '2002-10-27 01:00:00 EST (-0500)' + >>> (loc_dt - timedelta(minutes=10)).strftime(fmt) + '2002-10-27 00:50:00 EST (-0500)' + >>> eastern.normalize(loc_dt - timedelta(minutes=10)).strftime(fmt) + '2002-10-27 01:50:00 EDT (-0400)' + >>> (loc_dt + timedelta(minutes=10)).strftime(fmt) + '2002-10-27 01:10:00 EST (-0500)' + + Raises UnknownTimeZoneError if passed an unknown zone. + + >>> try: + ... timezone('Asia/Shangri-La') + ... except UnknownTimeZoneError: + ... print('Unknown') + Unknown + + >>> try: + ... timezone(unicode('\N{TRADE MARK SIGN}')) + ... except UnknownTimeZoneError: + ... print('Unknown') + Unknown + + ''' + if zone.upper() == 'UTC': + return utc + + try: + zone = ascii(zone) + except UnicodeEncodeError: + # All valid timezones are ASCII + raise UnknownTimeZoneError(zone) + + zone = _unmunge_zone(zone) + if zone not in _tzinfo_cache: + if zone in all_timezones_set: + fp = open_resource(zone) + try: + _tzinfo_cache[zone] = build_tzinfo(zone, fp) + finally: + fp.close() + else: + raise UnknownTimeZoneError(zone) + + return _tzinfo_cache[zone] + + +def _unmunge_zone(zone): + """Undo the time zone name munging done by older versions of pytz.""" + return zone.replace('_plus_', '+').replace('_minus_', '-') + + +ZERO = datetime.timedelta(0) +HOUR = datetime.timedelta(hours=1) + + +class UTC(datetime.tzinfo): + """UTC + + Optimized UTC implementation. It unpickles using the single module global + instance defined beneath this class declaration. + """ + zone = "UTC" + + _utcoffset = ZERO + _dst = ZERO + _tzname = zone + + def fromutc(self, dt): + if dt.tzinfo is None: + return self.localize(dt) + return super(utc.__class__, self).fromutc(dt) + + def utcoffset(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return ZERO + + def __reduce__(self): + return _UTC, () + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError('Not naive datetime (tzinfo is already set)') + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime''' + if dt.tzinfo is self: + return dt + if dt.tzinfo is None: + raise ValueError('Naive time - no tzinfo set') + return dt.astimezone(self) + + def __repr__(self): + return "" + + def __str__(self): + return "UTC" + + +UTC = utc = UTC() # UTC is a singleton + + +def _UTC(): + """Factory function for utc unpickling. + + Makes sure that unpickling a utc instance always returns the same + module global. + + These examples belong in the UTC class above, but it is obscured; or in + the README.txt, but we are not depending on Python 2.4 so integrating + the README.txt examples with the unit tests is not trivial. + + >>> import datetime, pickle + >>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc) + >>> naive = dt.replace(tzinfo=None) + >>> p = pickle.dumps(dt, 1) + >>> naive_p = pickle.dumps(naive, 1) + >>> len(p) - len(naive_p) + 17 + >>> new = pickle.loads(p) + >>> new == dt + True + >>> new is dt + False + >>> new.tzinfo is dt.tzinfo + True + >>> utc is UTC is timezone('UTC') + True + >>> utc is timezone('GMT') + False + """ + return utc +_UTC.__safe_for_unpickling__ = True + + +def _p(*args): + """Factory function for unpickling pytz tzinfo instances. + + Just a wrapper around tzinfo.unpickler to save a few bytes in each pickle + by shortening the path. + """ + return unpickler(*args) +_p.__safe_for_unpickling__ = True + + +class _LazyDict(DictMixin): + """Dictionary populated on first use.""" + data = None + def __getitem__(self, key): + if self.data is None: + self._fill() + return self.data[key.upper()] + + def __contains__(self, key): + if self.data is None: + self._fill() + return key in self.data + + def __iter__(self): + if self.data is None: + self._fill() + return iter(self.data) + + def __len__(self): + if self.data is None: + self._fill() + return len(self.data) + + def keys(self): + if self.data is None: + self._fill() + return self.data.keys() + + +class _CountryTimezoneDict(_LazyDict): + """Map ISO 3166 country code to a list of timezone names commonly used + in that country. + + iso3166_code is the two letter code used to identify the country. + + >>> def print_list(list_of_strings): + ... 'We use a helper so doctests work under Python 2.3 -> 3.x' + ... for s in list_of_strings: + ... print(s) + + >>> print_list(country_timezones['nz']) + Pacific/Auckland + Pacific/Chatham + >>> print_list(country_timezones['ch']) + Europe/Zurich + >>> print_list(country_timezones['CH']) + Europe/Zurich + >>> print_list(country_timezones[unicode('ch')]) + Europe/Zurich + >>> print_list(country_timezones['XXX']) + Traceback (most recent call last): + ... + KeyError: 'XXX' + + Previously, this information was exposed as a function rather than a + dictionary. This is still supported:: + + >>> print_list(country_timezones('nz')) + Pacific/Auckland + Pacific/Chatham + """ + def __call__(self, iso3166_code): + """Backwards compatibility.""" + return self[iso3166_code] + + def _fill(self): + data = {} + zone_tab = open_resource('zone.tab') + try: + for line in zone_tab: + line = line.decode('US-ASCII') + if line.startswith('#'): + continue + code, coordinates, zone = line.split(None, 4)[:3] + if zone not in all_timezones_set: + continue + try: + data[code].append(zone) + except KeyError: + data[code] = [zone] + self.data = data + finally: + zone_tab.close() + +country_timezones = _CountryTimezoneDict() + + +class _CountryNameDict(_LazyDict): + '''Dictionary proving ISO3166 code -> English name. + + >>> print(country_names['au']) + Australia + ''' + def _fill(self): + data = {} + zone_tab = open_resource('iso3166.tab') + try: + for line in zone_tab.readlines(): + line = line.decode('US-ASCII') + if line.startswith('#'): + continue + code, name = line.split(None, 1) + data[code] = name.strip() + self.data = data + finally: + zone_tab.close() + +country_names = _CountryNameDict() + + +# Time-zone info based solely on fixed offsets + +class _FixedOffset(datetime.tzinfo): + + zone = None # to match the standard pytz API + + def __init__(self, minutes): + if abs(minutes) >= 1440: + raise ValueError("absolute offset is too large", minutes) + self._minutes = minutes + self._offset = datetime.timedelta(minutes=minutes) + + def utcoffset(self, dt): + return self._offset + + def __reduce__(self): + return FixedOffset, (self._minutes, ) + + def dst(self, dt): + return ZERO + + def tzname(self, dt): + return None + + def __repr__(self): + return 'pytz.FixedOffset(%d)' % self._minutes + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError('Not naive datetime (tzinfo is already set)') + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime''' + if dt.tzinfo is None: + raise ValueError('Naive time - no tzinfo set') + return dt.replace(tzinfo=self) + + +def FixedOffset(offset, _tzinfos = {}): + """return a fixed-offset timezone based off a number of minutes. + + >>> one = FixedOffset(-330) + >>> one + pytz.FixedOffset(-330) + >>> one.utcoffset(datetime.datetime.now()) + datetime.timedelta(-1, 66600) + >>> one.dst(datetime.datetime.now()) + datetime.timedelta(0) + + >>> two = FixedOffset(1380) + >>> two + pytz.FixedOffset(1380) + >>> two.utcoffset(datetime.datetime.now()) + datetime.timedelta(0, 82800) + >>> two.dst(datetime.datetime.now()) + datetime.timedelta(0) + + The datetime.timedelta must be between the range of -1 and 1 day, + non-inclusive. + + >>> FixedOffset(1440) + Traceback (most recent call last): + ... + ValueError: ('absolute offset is too large', 1440) + + >>> FixedOffset(-1440) + Traceback (most recent call last): + ... + ValueError: ('absolute offset is too large', -1440) + + An offset of 0 is special-cased to return UTC. + + >>> FixedOffset(0) is UTC + True + + There should always be only one instance of a FixedOffset per timedelta. + This should be true for multiple creation calls. + + >>> FixedOffset(-330) is one + True + >>> FixedOffset(1380) is two + True + + It should also be true for pickling. + + >>> import pickle + >>> pickle.loads(pickle.dumps(one)) is one + True + >>> pickle.loads(pickle.dumps(two)) is two + True + """ + if offset == 0: + return UTC + + info = _tzinfos.get(offset) + if info is None: + # We haven't seen this one before. we need to save it. + + # Use setdefault to avoid a race condition and make sure we have + # only one + info = _tzinfos.setdefault(offset, _FixedOffset(offset)) + + return info + +FixedOffset.__safe_for_unpickling__ = True + + +def _test(): + import doctest, os, sys + sys.path.insert(0, os.pardir) + import pytz + return doctest.testmod(pytz) + +if __name__ == '__main__': + _test() + +all_timezones = \ +['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_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/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/Vostok', + 'Arctic/Longyearbyen', + 'Asia/Aden', + 'Asia/Almaty', + 'Asia/Amman', + 'Asia/Anadyr', + 'Asia/Aqtau', + 'Asia/Aqtobe', + 'Asia/Ashgabat', + 'Asia/Ashkhabad', + 'Asia/Baghdad', + 'Asia/Bahrain', + 'Asia/Baku', + 'Asia/Bangkok', + 'Asia/Beirut', + 'Asia/Bishkek', + 'Asia/Brunei', + 'Asia/Calcutta', + 'Asia/Choibalsan', + 'Asia/Chongqing', + 'Asia/Chungking', + 'Asia/Colombo', + 'Asia/Dacca', + 'Asia/Damascus', + 'Asia/Dhaka', + 'Asia/Dili', + 'Asia/Dubai', + 'Asia/Dushanbe', + '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/Taipei', + 'Asia/Tashkent', + 'Asia/Tbilisi', + 'Asia/Tehran', + 'Asia/Tel_Aviv', + 'Asia/Thimbu', + 'Asia/Thimphu', + 'Asia/Tokyo', + 'Asia/Ujung_Pandang', + 'Asia/Ulaanbaatar', + 'Asia/Ulan_Bator', + 'Asia/Urumqi', + 'Asia/Ust-Nera', + 'Asia/Vientiane', + 'Asia/Vladivostok', + 'Asia/Yakutsk', + '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/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/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/Simferopol', + 'Europe/Skopje', + 'Europe/Sofia', + 'Europe/Stockholm', + 'Europe/Tallinn', + 'Europe/Tirane', + 'Europe/Tiraspol', + '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/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/Pacific-New', + 'US/Samoa', + 'UTC', + 'Universal', + 'W-SU', + 'WET', + 'Zulu'] +all_timezones = [ + tz for tz in all_timezones if resource_exists(tz)] + +all_timezones_set = set(all_timezones) +common_timezones = \ +['Africa/Abidjan', + 'Africa/Accra', + 'Africa/Addis_Ababa', + 'Africa/Algiers', + 'Africa/Asmara', + '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/Tripoli', + 'Africa/Tunis', + 'Africa/Windhoek', + 'America/Adak', + 'America/Anchorage', + 'America/Anguilla', + 'America/Antigua', + 'America/Araguaina', + 'America/Argentina/Buenos_Aires', + 'America/Argentina/Catamarca', + '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/Bahia', + 'America/Bahia_Banderas', + 'America/Barbados', + 'America/Belem', + 'America/Belize', + 'America/Blanc-Sablon', + 'America/Boa_Vista', + 'America/Bogota', + 'America/Boise', + 'America/Cambridge_Bay', + 'America/Campo_Grande', + 'America/Cancun', + 'America/Caracas', + 'America/Cayenne', + 'America/Cayman', + 'America/Chicago', + 'America/Chihuahua', + '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/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/Inuvik', + 'America/Iqaluit', + 'America/Jamaica', + 'America/Juneau', + 'America/Kentucky/Louisville', + 'America/Kentucky/Monticello', + 'America/Kralendijk', + 'America/La_Paz', + 'America/Lima', + 'America/Los_Angeles', + 'America/Lower_Princes', + 'America/Maceio', + 'America/Managua', + 'America/Manaus', + 'America/Marigot', + 'America/Martinique', + 'America/Matamoros', + 'America/Mazatlan', + '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_Velho', + 'America/Puerto_Rico', + 'America/Rainy_River', + 'America/Rankin_Inlet', + 'America/Recife', + 'America/Regina', + 'America/Resolute', + 'America/Rio_Branco', + '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/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/Vostok', + 'Arctic/Longyearbyen', + 'Asia/Aden', + 'Asia/Almaty', + 'Asia/Amman', + 'Asia/Anadyr', + 'Asia/Aqtau', + 'Asia/Aqtobe', + 'Asia/Ashgabat', + 'Asia/Baghdad', + 'Asia/Bahrain', + 'Asia/Baku', + 'Asia/Bangkok', + 'Asia/Beirut', + 'Asia/Bishkek', + 'Asia/Brunei', + 'Asia/Choibalsan', + 'Asia/Chongqing', + 'Asia/Colombo', + 'Asia/Damascus', + 'Asia/Dhaka', + 'Asia/Dili', + 'Asia/Dubai', + 'Asia/Dushanbe', + 'Asia/Gaza', + 'Asia/Harbin', + 'Asia/Hebron', + 'Asia/Ho_Chi_Minh', + 'Asia/Hong_Kong', + 'Asia/Hovd', + 'Asia/Irkutsk', + 'Asia/Jakarta', + 'Asia/Jayapura', + 'Asia/Jerusalem', + 'Asia/Kabul', + 'Asia/Kamchatka', + 'Asia/Karachi', + 'Asia/Kashgar', + 'Asia/Kathmandu', + 'Asia/Khandyga', + 'Asia/Kolkata', + 'Asia/Krasnoyarsk', + 'Asia/Kuala_Lumpur', + 'Asia/Kuching', + 'Asia/Kuwait', + '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/Sakhalin', + 'Asia/Samarkand', + 'Asia/Seoul', + 'Asia/Shanghai', + 'Asia/Singapore', + 'Asia/Taipei', + 'Asia/Tashkent', + 'Asia/Tbilisi', + 'Asia/Tehran', + 'Asia/Thimphu', + 'Asia/Tokyo', + 'Asia/Ulaanbaatar', + 'Asia/Urumqi', + 'Asia/Ust-Nera', + 'Asia/Vientiane', + 'Asia/Vladivostok', + 'Asia/Yakutsk', + 'Asia/Yekaterinburg', + 'Asia/Yerevan', + 'Atlantic/Azores', + 'Atlantic/Bermuda', + 'Atlantic/Canary', + 'Atlantic/Cape_Verde', + 'Atlantic/Faroe', + 'Atlantic/Madeira', + 'Atlantic/Reykjavik', + 'Atlantic/South_Georgia', + 'Atlantic/St_Helena', + 'Atlantic/Stanley', + 'Australia/Adelaide', + 'Australia/Brisbane', + 'Australia/Broken_Hill', + 'Australia/Currie', + 'Australia/Darwin', + 'Australia/Eucla', + 'Australia/Hobart', + 'Australia/Lindeman', + 'Australia/Lord_Howe', + 'Australia/Melbourne', + 'Australia/Perth', + 'Australia/Sydney', + 'Canada/Atlantic', + 'Canada/Central', + 'Canada/Eastern', + 'Canada/Mountain', + 'Canada/Newfoundland', + 'Canada/Pacific', + 'Europe/Amsterdam', + 'Europe/Andorra', + 'Europe/Athens', + '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/Lisbon', + 'Europe/Ljubljana', + 'Europe/London', + 'Europe/Luxembourg', + 'Europe/Madrid', + 'Europe/Malta', + 'Europe/Mariehamn', + 'Europe/Minsk', + 'Europe/Monaco', + 'Europe/Moscow', + 'Europe/Oslo', + 'Europe/Paris', + 'Europe/Podgorica', + 'Europe/Prague', + 'Europe/Riga', + 'Europe/Rome', + 'Europe/Samara', + 'Europe/San_Marino', + 'Europe/Sarajevo', + 'Europe/Simferopol', + 'Europe/Skopje', + 'Europe/Sofia', + 'Europe/Stockholm', + 'Europe/Tallinn', + 'Europe/Tirane', + 'Europe/Uzhgorod', + 'Europe/Vaduz', + 'Europe/Vatican', + 'Europe/Vienna', + 'Europe/Vilnius', + 'Europe/Volgograd', + 'Europe/Warsaw', + 'Europe/Zagreb', + 'Europe/Zaporozhye', + 'Europe/Zurich', + 'GMT', + 'Indian/Antananarivo', + 'Indian/Chagos', + 'Indian/Christmas', + 'Indian/Cocos', + 'Indian/Comoro', + 'Indian/Kerguelen', + 'Indian/Mahe', + 'Indian/Maldives', + 'Indian/Mauritius', + 'Indian/Mayotte', + 'Indian/Reunion', + 'Pacific/Apia', + 'Pacific/Auckland', + '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/Port_Moresby', + 'Pacific/Rarotonga', + 'Pacific/Saipan', + 'Pacific/Tahiti', + 'Pacific/Tarawa', + 'Pacific/Tongatapu', + 'Pacific/Wake', + 'Pacific/Wallis', + 'US/Alaska', + 'US/Arizona', + 'US/Central', + 'US/Eastern', + 'US/Hawaii', + 'US/Mountain', + 'US/Pacific', + 'UTC'] +common_timezones = [ + tz for tz in common_timezones if tz in all_timezones] + +common_timezones_set = set(common_timezones) diff --git a/pytz/exceptions.py b/pytz/exceptions.py new file mode 100644 index 0000000..0376108 --- /dev/null +++ b/pytz/exceptions.py @@ -0,0 +1,48 @@ +''' +Custom exceptions raised by pytz. +''' + +__all__ = [ + 'UnknownTimeZoneError', 'InvalidTimeError', 'AmbiguousTimeError', + 'NonExistentTimeError', + ] + + +class UnknownTimeZoneError(KeyError): + '''Exception raised when pytz is passed an unknown timezone. + + >>> isinstance(UnknownTimeZoneError(), LookupError) + True + + This class is actually a subclass of KeyError to provide backwards + compatibility with code relying on the undocumented behavior of earlier + pytz releases. + + >>> isinstance(UnknownTimeZoneError(), KeyError) + True + ''' + pass + + +class InvalidTimeError(Exception): + '''Base class for invalid time exceptions.''' + + +class AmbiguousTimeError(InvalidTimeError): + '''Exception raised when attempting to create an ambiguous wallclock time. + + At the end of a DST transition period, a particular wallclock time will + occur twice (once before the clocks are set back, once after). Both + possibilities may be correct, unless further information is supplied. + + See DstTzInfo.normalize() for more info + ''' + + +class NonExistentTimeError(InvalidTimeError): + '''Exception raised when attempting to create a wallclock time that + cannot exist. + + At the start of a DST transition period, the wallclock time jumps forward. + The instants jumped over never occur. + ''' diff --git a/pytz/reference.py b/pytz/reference.py new file mode 100644 index 0000000..3dda13e --- /dev/null +++ b/pytz/reference.py @@ -0,0 +1,127 @@ +''' +Reference tzinfo implementations from the Python docs. +Used for testing against as they are only correct for the years +1987 to 2006. Do not use these for real code. +''' + +from datetime import tzinfo, timedelta, datetime +from pytz import utc, UTC, HOUR, ZERO + +# A class building tzinfo objects for fixed-offset time zones. +# Note that FixedOffset(0, "UTC") is a different way to build a +# UTC tzinfo object. + +class FixedOffset(tzinfo): + """Fixed offset in minutes east from UTC.""" + + def __init__(self, offset, name): + self.__offset = timedelta(minutes = offset) + self.__name = name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + +# A class capturing the platform's idea of local time. + +import time as _time + +STDOFFSET = timedelta(seconds = -_time.timezone) +if _time.daylight: + DSTOFFSET = timedelta(seconds = -_time.altzone) +else: + DSTOFFSET = STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = _time.mktime(tt) + tt = _time.localtime(stamp) + return tt.tm_isdst > 0 + +Local = LocalTimezone() + +# A complete implementation of current DST rules for major US time zones. + +def first_sunday_on_or_after(dt): + days_to_go = 6 - dt.weekday() + if days_to_go: + dt += timedelta(days_to_go) + return dt + +# In the US, DST starts at 2am (standard time) on the first Sunday in April. +DSTSTART = datetime(1, 4, 1, 2) +# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct. +# which is the first Sunday on or after Oct 25. +DSTEND = datetime(1, 10, 25, 1) + +class USTimeZone(tzinfo): + + def __init__(self, hours, reprname, stdname, dstname): + self.stdoffset = timedelta(hours=hours) + self.reprname = reprname + self.stdname = stdname + self.dstname = dstname + + def __repr__(self): + return self.reprname + + def tzname(self, dt): + if self.dst(dt): + return self.dstname + else: + return self.stdname + + def utcoffset(self, dt): + return self.stdoffset + self.dst(dt) + + def dst(self, dt): + if dt is None or dt.tzinfo is None: + # An exception may be sensible here, in one or both cases. + # It depends on how you want to treat them. The default + # fromutc() implementation (called by the default astimezone() + # implementation) passes a datetime with dt.tzinfo is self. + return ZERO + assert dt.tzinfo is self + + # Find first Sunday in April & the last in October. + start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year)) + end = first_sunday_on_or_after(DSTEND.replace(year=dt.year)) + + # Can't compare naive to aware objects, so strip the timezone from + # dt first. + if start <= dt.replace(tzinfo=None) < end: + return HOUR + else: + return ZERO + +Eastern = USTimeZone(-5, "Eastern", "EST", "EDT") +Central = USTimeZone(-6, "Central", "CST", "CDT") +Mountain = USTimeZone(-7, "Mountain", "MST", "MDT") +Pacific = USTimeZone(-8, "Pacific", "PST", "PDT") + diff --git a/pytz/tzfile.py b/pytz/tzfile.py new file mode 100644 index 0000000..9c007c8 --- /dev/null +++ b/pytz/tzfile.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +''' +$Id: tzfile.py,v 1.8 2004/06/03 00:15:24 zenzen Exp $ +''' + +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO +from datetime import datetime, timedelta +from struct import unpack, calcsize + +from pytz.tzinfo import StaticTzInfo, DstTzInfo, memorized_ttinfo +from pytz.tzinfo import memorized_datetime, memorized_timedelta + +def _byte_string(s): + """Cast a string or byte string to an ASCII byte string.""" + return s.encode('US-ASCII') + +_NULL = _byte_string('\0') + +def _std_string(s): + """Cast a string or byte string to an ASCII string.""" + return str(s.decode('US-ASCII')) + +def build_tzinfo(zone, fp): + head_fmt = '>4s c 15x 6l' + head_size = calcsize(head_fmt) + (magic, format, ttisgmtcnt, ttisstdcnt,leapcnt, timecnt, + typecnt, charcnt) = unpack(head_fmt, fp.read(head_size)) + + # Make sure it is a tzfile(5) file + assert magic == _byte_string('TZif'), 'Got magic %s' % repr(magic) + + # Read out the transition times, localtime indices and ttinfo structures. + data_fmt = '>%(timecnt)dl %(timecnt)dB %(ttinfo)s %(charcnt)ds' % dict( + timecnt=timecnt, ttinfo='lBB'*typecnt, charcnt=charcnt) + data_size = calcsize(data_fmt) + data = unpack(data_fmt, fp.read(data_size)) + + # make sure we unpacked the right number of values + assert len(data) == 2 * timecnt + 3 * typecnt + 1 + transitions = [memorized_datetime(trans) + for trans in data[:timecnt]] + lindexes = list(data[timecnt:2 * timecnt]) + ttinfo_raw = data[2 * timecnt:-1] + tznames_raw = data[-1] + del data + + # Process ttinfo into separate structs + ttinfo = [] + tznames = {} + i = 0 + while i < len(ttinfo_raw): + # have we looked up this timezone name yet? + tzname_offset = ttinfo_raw[i+2] + if tzname_offset not in tznames: + nul = tznames_raw.find(_NULL, tzname_offset) + if nul < 0: + nul = len(tznames_raw) + tznames[tzname_offset] = _std_string( + tznames_raw[tzname_offset:nul]) + ttinfo.append((ttinfo_raw[i], + bool(ttinfo_raw[i+1]), + tznames[tzname_offset])) + i += 3 + + # Now build the timezone object + if len(transitions) == 0: + ttinfo[0][0], ttinfo[0][2] + cls = type(zone, (StaticTzInfo,), dict( + zone=zone, + _utcoffset=memorized_timedelta(ttinfo[0][0]), + _tzname=ttinfo[0][2])) + else: + # Early dates use the first standard time ttinfo + i = 0 + while ttinfo[i][1]: + i += 1 + if ttinfo[i] == ttinfo[lindexes[0]]: + transitions[0] = datetime.min + else: + transitions.insert(0, datetime.min) + lindexes.insert(0, i) + + # calculate transition info + transition_info = [] + for i in range(len(transitions)): + inf = ttinfo[lindexes[i]] + utcoffset = inf[0] + if not inf[1]: + dst = 0 + else: + for j in range(i-1, -1, -1): + prev_inf = ttinfo[lindexes[j]] + if not prev_inf[1]: + break + dst = inf[0] - prev_inf[0] # dst offset + + # Bad dst? Look further. DST > 24 hours happens when + # a timzone has moved across the international dateline. + if dst <= 0 or dst > 3600*3: + for j in range(i+1, len(transitions)): + stdinf = ttinfo[lindexes[j]] + if not stdinf[1]: + dst = inf[0] - stdinf[0] + if dst > 0: + break # Found a useful std time. + + tzname = inf[2] + + # Round utcoffset and dst to the nearest minute or the + # datetime library will complain. Conversions to these timezones + # might be up to plus or minus 30 seconds out, but it is + # the best we can do. + utcoffset = int((utcoffset + 30) // 60) * 60 + dst = int((dst + 30) // 60) * 60 + transition_info.append(memorized_ttinfo(utcoffset, dst, tzname)) + + cls = type(zone, (DstTzInfo,), dict( + zone=zone, + _utc_transition_times=transitions, + _transition_info=transition_info)) + + return cls() + +if __name__ == '__main__': + import os.path + from pprint import pprint + base = os.path.join(os.path.dirname(__file__), 'zoneinfo') + tz = build_tzinfo('Australia/Melbourne', + open(os.path.join(base,'Australia','Melbourne'), 'rb')) + tz = build_tzinfo('US/Eastern', + open(os.path.join(base,'US','Eastern'), 'rb')) + pprint(tz._utc_transition_times) + #print tz.asPython(4) + #print tz.transitions_mapping diff --git a/pytz/tzinfo.py b/pytz/tzinfo.py new file mode 100644 index 0000000..a1e43cd --- /dev/null +++ b/pytz/tzinfo.py @@ -0,0 +1,563 @@ +'''Base classes and helpers for building zone specific tzinfo classes''' + +from datetime import datetime, timedelta, tzinfo +from bisect import bisect_right +try: + set +except NameError: + from sets import Set as set + +import pytz +from pytz.exceptions import AmbiguousTimeError, NonExistentTimeError + +__all__ = [] + +_timedelta_cache = {} +def memorized_timedelta(seconds): + '''Create only one instance of each distinct timedelta''' + try: + return _timedelta_cache[seconds] + except KeyError: + delta = timedelta(seconds=seconds) + _timedelta_cache[seconds] = delta + return delta + +_epoch = datetime.utcfromtimestamp(0) +_datetime_cache = {0: _epoch} +def memorized_datetime(seconds): + '''Create only one instance of each distinct datetime''' + try: + return _datetime_cache[seconds] + except KeyError: + # NB. We can't just do datetime.utcfromtimestamp(seconds) as this + # fails with negative values under Windows (Bug #90096) + dt = _epoch + timedelta(seconds=seconds) + _datetime_cache[seconds] = dt + return dt + +_ttinfo_cache = {} +def memorized_ttinfo(*args): + '''Create only one instance of each distinct tuple''' + try: + return _ttinfo_cache[args] + except KeyError: + ttinfo = ( + memorized_timedelta(args[0]), + memorized_timedelta(args[1]), + args[2] + ) + _ttinfo_cache[args] = ttinfo + return ttinfo + +_notime = memorized_timedelta(0) + +def _to_seconds(td): + '''Convert a timedelta to seconds''' + return td.seconds + td.days * 24 * 60 * 60 + + +class BaseTzInfo(tzinfo): + # Overridden in subclass + _utcoffset = None + _tzname = None + zone = None + + def __str__(self): + return self.zone + + +class StaticTzInfo(BaseTzInfo): + '''A timezone that has a constant offset from UTC + + These timezones are rare, as most locations have changed their + offset at some point in their history + ''' + def fromutc(self, dt): + '''See datetime.tzinfo.fromutc''' + if dt.tzinfo is not None and dt.tzinfo is not self: + raise ValueError('fromutc: dt.tzinfo is not self') + return (dt + self._utcoffset).replace(tzinfo=self) + + def utcoffset(self, dt, is_dst=None): + '''See datetime.tzinfo.utcoffset + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' + return self._utcoffset + + def dst(self, dt, is_dst=None): + '''See datetime.tzinfo.dst + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' + return _notime + + def tzname(self, dt, is_dst=None): + '''See datetime.tzinfo.tzname + + is_dst is ignored for StaticTzInfo, and exists only to + retain compatibility with DstTzInfo. + ''' + return self._tzname + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError('Not naive datetime (tzinfo is already set)') + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime. + + This is normally a no-op, as StaticTzInfo timezones never have + ambiguous cases to correct: + + >>> from pytz import timezone + >>> gmt = timezone('GMT') + >>> isinstance(gmt, StaticTzInfo) + True + >>> dt = datetime(2011, 5, 8, 1, 2, 3, tzinfo=gmt) + >>> gmt.normalize(dt) is dt + True + + The supported method of converting between timezones is to use + datetime.astimezone(). Currently normalize() also works: + + >>> la = timezone('America/Los_Angeles') + >>> dt = la.localize(datetime(2011, 5, 7, 1, 2, 3)) + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> gmt.normalize(dt).strftime(fmt) + '2011-05-07 08:02:03 GMT (+0000)' + ''' + if dt.tzinfo is self: + return dt + if dt.tzinfo is None: + raise ValueError('Naive time - no tzinfo set') + return dt.astimezone(self) + + def __repr__(self): + return '' % (self.zone,) + + def __reduce__(self): + # Special pickle to zone remains a singleton and to cope with + # database changes. + return pytz._p, (self.zone,) + + +class DstTzInfo(BaseTzInfo): + '''A timezone that has a variable offset from UTC + + The offset might change if daylight savings time comes into effect, + or at a point in history when the region decides to change their + timezone definition. + ''' + # Overridden in subclass + _utc_transition_times = None # Sorted list of DST transition times in UTC + _transition_info = None # [(utcoffset, dstoffset, tzname)] corresponding + # to _utc_transition_times entries + zone = None + + # Set in __init__ + _tzinfos = None + _dst = None # DST offset + + def __init__(self, _inf=None, _tzinfos=None): + if _inf: + self._tzinfos = _tzinfos + self._utcoffset, self._dst, self._tzname = _inf + else: + _tzinfos = {} + self._tzinfos = _tzinfos + self._utcoffset, self._dst, self._tzname = self._transition_info[0] + _tzinfos[self._transition_info[0]] = self + for inf in self._transition_info[1:]: + if inf not in _tzinfos: + _tzinfos[inf] = self.__class__(inf, _tzinfos) + + def fromutc(self, dt): + '''See datetime.tzinfo.fromutc''' + if (dt.tzinfo is not None + and getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos): + raise ValueError('fromutc: dt.tzinfo is not self') + dt = dt.replace(tzinfo=None) + idx = max(0, bisect_right(self._utc_transition_times, dt) - 1) + inf = self._transition_info[idx] + return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf]) + + def normalize(self, dt): + '''Correct the timezone information on the given datetime + + If date arithmetic crosses DST boundaries, the tzinfo + is not magically adjusted. This method normalizes the + tzinfo to the correct one. + + To test, first we need to do some setup + + >>> from pytz import timezone + >>> utc = timezone('UTC') + >>> eastern = timezone('US/Eastern') + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + + We next create a datetime right on an end-of-DST transition point, + the instant when the wallclocks are wound back one hour. + + >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) + >>> loc_dt = utc_dt.astimezone(eastern) + >>> loc_dt.strftime(fmt) + '2002-10-27 01:00:00 EST (-0500)' + + Now, if we subtract a few minutes from it, note that the timezone + information has not changed. + + >>> before = loc_dt - timedelta(minutes=10) + >>> before.strftime(fmt) + '2002-10-27 00:50:00 EST (-0500)' + + But we can fix that by calling the normalize method + + >>> before = eastern.normalize(before) + >>> before.strftime(fmt) + '2002-10-27 01:50:00 EDT (-0400)' + + The supported method of converting between timezones is to use + datetime.astimezone(). Currently, normalize() also works: + + >>> th = timezone('Asia/Bangkok') + >>> am = timezone('Europe/Amsterdam') + >>> dt = th.localize(datetime(2011, 5, 7, 1, 2, 3)) + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> am.normalize(dt).strftime(fmt) + '2011-05-06 20:02:03 CEST (+0200)' + ''' + if dt.tzinfo is None: + raise ValueError('Naive time - no tzinfo set') + + # Convert dt in localtime to UTC + offset = dt.tzinfo._utcoffset + dt = dt.replace(tzinfo=None) + dt = dt - offset + # convert it back, and return it + return self.fromutc(dt) + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time. + + This method should be used to construct localtimes, rather + than passing a tzinfo argument to a datetime constructor. + + is_dst is used to determine the correct timezone in the ambigous + period at the end of daylight savings time. + + >>> from pytz import timezone + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> amdam = timezone('Europe/Amsterdam') + >>> dt = datetime(2004, 10, 31, 2, 0, 0) + >>> loc_dt1 = amdam.localize(dt, is_dst=True) + >>> loc_dt2 = amdam.localize(dt, is_dst=False) + >>> loc_dt1.strftime(fmt) + '2004-10-31 02:00:00 CEST (+0200)' + >>> loc_dt2.strftime(fmt) + '2004-10-31 02:00:00 CET (+0100)' + >>> str(loc_dt2 - loc_dt1) + '1:00:00' + + Use is_dst=None to raise an AmbiguousTimeError for ambiguous + times at the end of daylight savings + + >>> try: + ... loc_dt1 = amdam.localize(dt, is_dst=None) + ... except AmbiguousTimeError: + ... print('Ambiguous') + Ambiguous + + is_dst defaults to False + + >>> amdam.localize(dt) == amdam.localize(dt, False) + True + + is_dst is also used to determine the correct timezone in the + wallclock times jumped over at the start of daylight savings time. + + >>> pacific = timezone('US/Pacific') + >>> dt = datetime(2008, 3, 9, 2, 0, 0) + >>> ploc_dt1 = pacific.localize(dt, is_dst=True) + >>> ploc_dt2 = pacific.localize(dt, is_dst=False) + >>> ploc_dt1.strftime(fmt) + '2008-03-09 02:00:00 PDT (-0700)' + >>> ploc_dt2.strftime(fmt) + '2008-03-09 02:00:00 PST (-0800)' + >>> str(ploc_dt2 - ploc_dt1) + '1:00:00' + + Use is_dst=None to raise a NonExistentTimeError for these skipped + times. + + >>> try: + ... loc_dt1 = pacific.localize(dt, is_dst=None) + ... except NonExistentTimeError: + ... print('Non-existent') + Non-existent + ''' + if dt.tzinfo is not None: + raise ValueError('Not naive datetime (tzinfo is already set)') + + # Find the two best possibilities. + possible_loc_dt = set() + for delta in [timedelta(days=-1), timedelta(days=1)]: + loc_dt = dt + delta + idx = max(0, bisect_right( + self._utc_transition_times, loc_dt) - 1) + inf = self._transition_info[idx] + tzinfo = self._tzinfos[inf] + loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo)) + if loc_dt.replace(tzinfo=None) == dt: + possible_loc_dt.add(loc_dt) + + if len(possible_loc_dt) == 1: + return possible_loc_dt.pop() + + # If there are no possibly correct timezones, we are attempting + # to convert a time that never happened - the time period jumped + # during the start-of-DST transition period. + if len(possible_loc_dt) == 0: + # If we refuse to guess, raise an exception. + if is_dst is None: + raise NonExistentTimeError(dt) + + # If we are forcing the pre-DST side of the DST transition, we + # obtain the correct timezone by winding the clock forward a few + # hours. + elif is_dst: + return self.localize( + dt + timedelta(hours=6), is_dst=True) - timedelta(hours=6) + + # If we are forcing the post-DST side of the DST transition, we + # obtain the correct timezone by winding the clock back. + else: + return self.localize( + dt - timedelta(hours=6), is_dst=False) + timedelta(hours=6) + + + # If we get this far, we have multiple possible timezones - this + # is an ambiguous case occuring during the end-of-DST transition. + + # If told to be strict, raise an exception since we have an + # ambiguous case + if is_dst is None: + raise AmbiguousTimeError(dt) + + # Filter out the possiblilities that don't match the requested + # is_dst + filtered_possible_loc_dt = [ + p for p in possible_loc_dt + if bool(p.tzinfo._dst) == is_dst + ] + + # Hopefully we only have one possibility left. Return it. + if len(filtered_possible_loc_dt) == 1: + return filtered_possible_loc_dt[0] + + if len(filtered_possible_loc_dt) == 0: + filtered_possible_loc_dt = list(possible_loc_dt) + + # If we get this far, we have in a wierd timezone transition + # where the clocks have been wound back but is_dst is the same + # in both (eg. Europe/Warsaw 1915 when they switched to CET). + # At this point, we just have to guess unless we allow more + # hints to be passed in (such as the UTC offset or abbreviation), + # but that is just getting silly. + # + # Choose the earliest (by UTC) applicable timezone. + sorting_keys = {} + for local_dt in filtered_possible_loc_dt: + key = local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset + sorting_keys[key] = local_dt + first_key = sorted(sorting_keys)[0] + return sorting_keys[first_key] + + def utcoffset(self, dt, is_dst=None): + '''See datetime.tzinfo.utcoffset + + The is_dst parameter may be used to remove ambiguity during DST + transitions. + + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.utcoffset(ambiguous, is_dst=False) + datetime.timedelta(-1, 73800) + + >>> tz.utcoffset(ambiguous, is_dst=True) + datetime.timedelta(-1, 77400) + + >>> try: + ... tz.utcoffset(ambiguous) + ... except AmbiguousTimeError: + ... print('Ambiguous') + Ambiguous + + ''' + if dt is None: + return None + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._utcoffset + else: + return self._utcoffset + + def dst(self, dt, is_dst=None): + '''See datetime.tzinfo.dst + + The is_dst parameter may be used to remove ambiguity during DST + transitions. + + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + + >>> normal = datetime(2009, 9, 1) + + >>> tz.dst(normal) + datetime.timedelta(0, 3600) + >>> tz.dst(normal, is_dst=False) + datetime.timedelta(0, 3600) + >>> tz.dst(normal, is_dst=True) + datetime.timedelta(0, 3600) + + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.dst(ambiguous, is_dst=False) + datetime.timedelta(0) + >>> tz.dst(ambiguous, is_dst=True) + datetime.timedelta(0, 3600) + >>> try: + ... tz.dst(ambiguous) + ... except AmbiguousTimeError: + ... print('Ambiguous') + Ambiguous + + ''' + if dt is None: + return None + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._dst + else: + return self._dst + + def tzname(self, dt, is_dst=None): + '''See datetime.tzinfo.tzname + + The is_dst parameter may be used to remove ambiguity during DST + transitions. + + >>> from pytz import timezone + >>> tz = timezone('America/St_Johns') + + >>> normal = datetime(2009, 9, 1) + + >>> tz.tzname(normal) + 'NDT' + >>> tz.tzname(normal, is_dst=False) + 'NDT' + >>> tz.tzname(normal, is_dst=True) + 'NDT' + + >>> ambiguous = datetime(2009, 10, 31, 23, 30) + + >>> tz.tzname(ambiguous, is_dst=False) + 'NST' + >>> tz.tzname(ambiguous, is_dst=True) + 'NDT' + >>> try: + ... tz.tzname(ambiguous) + ... except AmbiguousTimeError: + ... print('Ambiguous') + Ambiguous + ''' + if dt is None: + return self.zone + elif dt.tzinfo is not self: + dt = self.localize(dt, is_dst) + return dt.tzinfo._tzname + else: + return self._tzname + + def __repr__(self): + if self._dst: + dst = 'DST' + else: + dst = 'STD' + if self._utcoffset > _notime: + return '' % ( + self.zone, self._tzname, self._utcoffset, dst + ) + else: + return '' % ( + self.zone, self._tzname, self._utcoffset, dst + ) + + def __reduce__(self): + # Special pickle to zone remains a singleton and to cope with + # database changes. + return pytz._p, ( + self.zone, + _to_seconds(self._utcoffset), + _to_seconds(self._dst), + self._tzname + ) + + + +def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None): + """Factory function for unpickling pytz tzinfo instances. + + This is shared for both StaticTzInfo and DstTzInfo instances, because + database changes could cause a zones implementation to switch between + these two base classes and we can't break pickles on a pytz version + upgrade. + """ + # Raises a KeyError if zone no longer exists, which should never happen + # and would be a bug. + tz = pytz.timezone(zone) + + # A StaticTzInfo - just return it + if utcoffset is None: + return tz + + # This pickle was created from a DstTzInfo. We need to + # determine which of the list of tzinfo instances for this zone + # to use in order to restore the state of any datetime instances using + # it correctly. + utcoffset = memorized_timedelta(utcoffset) + dstoffset = memorized_timedelta(dstoffset) + try: + return tz._tzinfos[(utcoffset, dstoffset, tzname)] + except KeyError: + # The particular state requested in this timezone no longer exists. + # This indicates a corrupt pickle, or the timezone database has been + # corrected violently enough to make this particular + # (utcoffset,dstoffset) no longer exist in the zone, or the + # abbreviation has been changed. + pass + + # See if we can find an entry differing only by tzname. Abbreviations + # get changed from the initial guess by the database maintainers to + # match reality when this information is discovered. + for localized_tz in tz._tzinfos.values(): + if (localized_tz._utcoffset == utcoffset + and localized_tz._dst == dstoffset): + return localized_tz + + # This (utcoffset, dstoffset) information has been removed from the + # zone. Add it back. This might occur when the database maintainers have + # corrected incorrect information. datetime instances using this + # incorrect information will continue to do so, exactly as they were + # before being pickled. This is purely an overly paranoid safety net - I + # doubt this will ever been needed in real life. + inf = (utcoffset, dstoffset, tzname) + tz._tzinfos[inf] = tz.__class__(inf, tz._tzinfos) + return tz._tzinfos[inf] + diff --git a/pytz/zoneinfo/Africa/Abidjan b/pytz/zoneinfo/Africa/Abidjan new file mode 100644 index 0000000000000000000000000000000000000000..65d19ec2651aeb46c42ce7a74ae6ecbf3001edbb GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL@uTK{Uv%U>fLN5DjuOmo0ssr78}CcD`!UFH4Q3$=WF^#yf4~s(HDwBuVkNSiU*l`3EF}vz zSQ%e6B?}w-Q})LD+({AM(|Mn_bM7?vKEFhAezrsXs-T>(sYcn%k<3hdbh9s|H}kFD z)_KO;zUbFGYaiZjwnb-Wj`Uu-T<^Ds^}+IxKI~f6ho_ErRdBrPiL>{lFeLKkXpDIc!j8f=<+GbAle}6Ao?H*AsQhnAvz&SAzFQkT8LhV zVxOWJq8g$bq8y?fq8_3j5&<7W43H=waZp48iG?B>NIZ~;ATdFrGOU34ZCQ>j%W~v2 t$Ply~`M(#Qmc%40Nv!BpQj(G`iB0L%aXA3rc~ pK-fOMAq?(79PStb761_;Bv|tw2tZbWXpnUvnhYzsfNn700szD1FVy?NMT?AlPv%LfBe9} t0aDGth73jmNhB7*<` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Blantyre b/pytz/zoneinfo/Africa/Blantyre new file mode 100644 index 0000000000000000000000000000000000000000..2972580dad6a37f9e7728bb828905fbb62df03b6 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIhx!KZvb)>E`UU36c|{1d_x$V9Ya7|h7b}A`VRzn M4dVius%yjr0NP*^CIA2c literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Brazzaville b/pytz/zoneinfo/Africa/Brazzaville new file mode 100644 index 0000000000000000000000000000000000000000..abb0c08700a29d787d8682e020c7cf6fcac69cb0 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL@8&;fGzLO`N?0t_rZz99_Zj$kfB2nh!L2Lil? LaRE)$HRJ*SfPWF& literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Bujumbura b/pytz/zoneinfo/Africa/Bujumbura new file mode 100644 index 0000000000000000000000000000000000000000..cac56524574480a440cb06b171274ad1e1292e58 GIT binary patch literal 140 zcmWHE%1kq2zyORu5fFv}5SxX8K}Lar!Pzkc$O*x&j|nIR!XN`Wq;**wlo+0C`i_aGJ&{^xnPd>%F~?2q&P zt#awJ%ZtQ+POAM0A5Ojf@II`i>2uwZYzSJfUeImdb_eb4yZrBdzAyNGN0&bKO<&Nl zez^{|tqP8>_VtN3cY58$%lz)X0`J`LX8&BLAN+nkY0iJKQvA`;XnHpGiVJ)8NwX?f zUEJ`i>0MeaF4c{deKXgo{;Ey#^7yE_QhdT(8A^zOJJaPrSDQ!A>#$JcI;D(lnkL5Y-(v1oD^$+Llk%S0_r<;SHFCn-95M0f z$uc*0iJBDuT24-1EAnEOP2SnBRK931`E6xtO4n|A|MogjaP*9MVBII`!OdBE>hqaF zVPn58TF?_b^wdc`Ek6jRmo@9+$Y()G-j9CCr4Fw&<4eEvhrQm6?)Ute`K^wV-cYX}si_MdeX&N*iB|=47thv-k%Qj6!W=zMKj)Q4!@B%HG?;IG z(F@*g_8$8w{%?3%wY4br6LNY>9 zLUKZv6fb1Ov1tK$A&DWGaYzlxjYD!sc1U_on;(Y+oi;-xMI=WgNhC`SX(D+di6WVD zNEOMIL$XM=NV-m&FNcJkHe)1ZBxfXPBx??7BY7iNAd`X21~MJUd>|9zv@?QCiPO#rGAYQcAk%`( z3op9?it?)*;Ac|FfL7w6)9-o9W}XkMNz?Xs3JSdAs}BC+Fd**^%Dt(^l_iS0p;Mc47497dyWCfD?ab zb7aKFk=DraoJiu`1y0hDulA@%9w*t=W{+<_V@(=Y6Ukll-pTDuwU_lYX2`Knfj532I~$7+q;Bx^ISstWf#SvRUx zRnEL1mHk&_L*h}{(9y9i{yJ()O zD;}%1O`fQ>XZNceR!r?2^IYwG^H$aW{3g4)ZmHd`dSuVJ*RuEeHEB3>L-w5v%l@i1 z89ZpfYsi4-f#3hzb1c^Xj{iC-dC*X_hI4Nv{=Uz1`z-$wFK<3;vA+Hs-#_dprVkrJ zc7$xnsP}|y3fYxWZwuL%QE!Z2XJFg)8ufOO{TlU#ksTZLmXSRh^`?z_*T}Y!eH-=0je6(E){(s% z_2!Lw_eQ;aWdBCpfKhi~)GZ)A7`LMkDNsDX66DT7ijEvD5N z`?@ikYnD!jjU}0*T%*=<0RZl5v%9@FkPGd?Q?c~ogLiZkMntl z)^2UecWyfI<_$Ne)7(5yd;QCu-W!KoHw^f$cmo&fqsK>%MF)>%MBhHN$~&>w7k%gD z=IBXpo_F%QeO=?3;br5euXqW~-CYT1wncBdl;k8elt+_CO1n~efAentqN+=>j(B&T z>UZY!sHE?DLFTrE<*xM`WnM){GKzz8x4%d-)3W5Aq&p^Xkq^et1XitqU`=Au%w@cAPL>ABL z)5RAWWXX7&F8wed4}4Rr#r^eKGQ3nD+_PLuUrWpqEO|Kdq6PyK zQsx`c@{Dh#{PIt-BKBihF?v=W`QeB>IyfK|=RVTP-X2-`)?r=M+A5Fryr@+*ujuNQ zO91h zZ&Wtak4eMsU-YTcQ?jw{oHnK(kWD3n+LZ9FZl0~W`O>SpWg@Iw&vxk37ed z+FUo8_s-OsV92QnR)?H`c?j^}IIj7NUHji%H}wDCdV={eHz#6lo@e}HPG`~keK$hwKm8AhJVbi^v|4O(MHQwu$T$*(kD8WUI(t zk>QKpJ8-9YI=x^aN=N(iNmFNMDe~Ae}*4 zgY*Vz4$>W@JxG6$23bvqkQO05LYjnh32773C!|qGr;t`5y+WFWbPH)0(l4Z8R?{)0 zWmeNOq-jXkkhURxLmG#44sGjV+}OCu%Z<5l`KH9*n#)ANM9!Yc*qIoa@J;5)zHv!=H+5eLE^u>76cps literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Conakry b/pytz/zoneinfo/Africa/Conakry new file mode 100644 index 0000000000000000000000000000000000000000..75b8523fb2991ed402751e087afe8898e4bfb25d GIT binary patch literal 224 zcmWHE%1kq2zyK^j5fBCeW*`Q!c_uxZ9kXZBj)u1eViOpd82|tOtOAk;0+#>(KYn1~ pfUtdhLm1qFINUJ=EC3=xNU-KV5P+-#(ID$UG#OTM0o`E01pxUHF}DB! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Dakar b/pytz/zoneinfo/Africa/Dakar new file mode 100644 index 0000000000000000000000000000000000000000..31104133c293ab4358a8b52e7b6f66cd22150d6b GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}c_uxZcjJ_`zywC7|Nq~wU|{(F|KkS+7LXDK4j-yyn{6`U~%c(ylNvF)}cyTmi{z8GxkK)-Z5D s*gn1?46cqL3{I|&p&=jzU=TurMgM^SWEqGCSqP%ZvXl$x4qam|0AMpL82|tP literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Djibouti b/pytz/zoneinfo/Africa/Djibouti new file mode 100644 index 0000000000000000000000000000000000000000..297d93a3e464f417f88e8719af0ca9410294b4ad GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOI-!~^7Llz>FF3>a8^d_x#q9Ya7|h7b}A`VRzn M4dVius%y*z0M_pl4*&oF literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Douala b/pytz/zoneinfo/Africa/Douala new file mode 100644 index 0000000000000000000000000000000000000000..8627f2e05e95e60f75766d0100db6224616289bc GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL@8%>Z&ZB|xHl0t_rZz99_Zjv*i}LkI~5{RaZP MhH(K+)ivY-0D}n;+W-In literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/El_Aaiun b/pytz/zoneinfo/Africa/El_Aaiun new file mode 100644 index 0000000000000000000000000000000000000000..3275161b17a180e7788b534f24c65df108549a34 GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}dG>gGc))#e!vsdA|NlQPU|{(F|KkS+7N86R1BZ`q h2t&9d5W9we1sE7YNHF<75P(bvX(iqUE}&%wTmVZxCoKQ~ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Freetown b/pytz/zoneinfo/Africa/Freetown new file mode 100644 index 0000000000000000000000000000000000000000..720b8e3c905ea30f521204e3c75c29e55a5edcf8 GIT binary patch literal 665 zcmaLUze@sf7{~GF@-!8!a}XM$hH5`VB4`St7K6x(%0D0o94-igXt=$gBdWPkg5U14hYYzisPI2W)D}J0frAf^$RiE|p;IvlG zN1fX4wpLGBR=s>~HWE2%oVMI%tY$U$M$DJ@jP<&nHCvCzm@nRA zf+xL|ZKB{nL4tw>1q})w6htVPP*9=ZLP3Ut4F#Pn^PwP=WkwW~vdoEs6a}j+)1u&& zWnvV}vP_MF8wEKEb`p@?;Y?acn7?RpxgxO^Cp52q^NvGl8pcF LHi*K!AU*sAqmnM! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Gaborone b/pytz/zoneinfo/Africa/Gaborone new file mode 100644 index 0000000000000000000000000000000000000000..e2abcb664372359aa174fb5aefc4a1a780bddc52 GIT binary patch literal 234 zcmWHE%1kq2zyQoZ5fBCe7@M!j?R>_$zPyI>b%6zpOpFW+q7oo^83hJb1_mtyM$TZz z;1C99M-T=wARq+01uQ^W5C#DlTj)O!B*+(-fM}3qAR1&Lh=y3o%*4PT;RDhHv>T`o ZXg4R=ZeAbX5C&}aGca%gU8HNo1prskEHD57 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Harare b/pytz/zoneinfo/Africa/Harare new file mode 100644 index 0000000000000000000000000000000000000000..258b393637294912a6d6c78973c09424136ed50e GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIhx##rvN#!G9XbI1qK!$-w+08#}E*gA%p~j{sRGC M!?=K^>KbtY08XPjBr({OfPe!;oEyoU32fdx#AK*+!#Dgjcd zWxxm|WfT|~f*pfHKq5d8g53rdpcDv$02>g4*qr}?Ah+7l0Yrmr1JNKGK{Uu#5Dl^! rM1yQ+WM%?F1_mhypl*;OfTjQ)0VIKrVDa${L3RiO0~g3yx<*_84V*eb literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Juba b/pytz/zoneinfo/Africa/Juba new file mode 100644 index 0000000000000000000000000000000000000000..20284ff94b9bb40c738448781e8191b492d73305 GIT binary patch literal 669 zcmcK1%_~Gv7=ZCJpJuKZjIS}wQO8*c zZH?&g_J>54DmH4W5*vH9@d+b!-M&uvQ<79=>#1Jxp7wOT#3gl`(&?KQX*e6VjTbS~ zw7aP@`_HDia&B8z?@jA$(YDQ8n)c$d&h{Oej?|IOB{od%?M`>TA4r#-)A@&WDO^?U z=uXKGhkkh?N)=ArjaC0($lW~et0ZTYo?i&m^kkV=ph|9kuiy_EKHaLN;AfWuNP=WR z(ja+|L`Wti6_N`{hGeVh(jobfgh)mtC6W_KieyF7B6*R-NMw!i!N8!lhJhC%;^P~_;OZE{-~=T?LqKYwAcO>~{{sQYdJqkA0*D4V14L87DO^DJ I=^AqZ084x~F#rGn literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Khartoum b/pytz/zoneinfo/Africa/Khartoum new file mode 100644 index 0000000000000000000000000000000000000000..6f62fd764cef89254550b1e8204ffc6c98932605 GIT binary patch literal 669 zcmcK1y)Oho7=ZEjKHaT5oUd~nHlh$0iJ;JkuUsNNl1XkW3R5`>QRpNtS0NFNKR_cS zqS9zJBGHXjH7W`UrHXkjQ7J@WHnYFUCYwy2H(1_S8<8I?>b|g9eQtBkT%SIQoMdfi zXH126KWt>BY@)hiV-v3?KBaA4udfpRj7>_(c+zjZr+rm#<2H4hQt6u)+i*5%8ZTnH zX>VI)4xV*$`P{Uu-|N=-f@zz()a`{;l^r1(p$O*x&j|nIR!XN!#3=CXAGj$EQ0N4o))Bpeg literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Lagos b/pytz/zoneinfo/Africa/Lagos new file mode 100644 index 0000000000000000000000000000000000000000..cbdc0450fc3b97bc436f6d90798a30ebe0ac30b9 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UITi+f4ghkP4M3uN0t_rZz99_Zjv*i}LkI~5{RaZP MhH(K+)ivY-0B~s$p8x;= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Libreville b/pytz/zoneinfo/Africa/Libreville new file mode 100644 index 0000000000000000000000000000000000000000..d7691ae56f56a0c15e753bf3c5e64b3b2b577d93 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL@8T>|8A+yRO52{5qu_=YfqJBEO`3?U>K^dAWD M8pZ`QRo9RU014?6*#H0l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Lome b/pytz/zoneinfo/Africa/Lome new file mode 100644 index 0000000000000000000000000000000000000000..297ec5dae3787fd9d0a549b19af4d403f4032301 GIT binary patch literal 139 zcmWHE%1kq2zyORu5fFv}5SsK#=QcCIO!#3=CXAGj)x)0NS<<)c^nh literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Lusaka b/pytz/zoneinfo/Africa/Lusaka new file mode 100644 index 0000000000000000000000000000000000000000..87d7a95fc7f19a45ba90bb27009c65616a0b521d GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIhx!~{sD5NT0o*Q3Jfehz99_Gjv*i}LkI~5{RaZP MhH(K+)ivS*0Ns=mCIA2c literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Malabo b/pytz/zoneinfo/Africa/Malabo new file mode 100644 index 0000000000000000000000000000000000000000..c70de1f99d9f6c8af5e8f6691ddeb3ac822fdd74 GIT binary patch literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}c_uw;bNMoVUjrjhgu@0T1q3V%4159%96r7w4DLW2 c?id0QX9yv|jDcHnHU)uBu{|kWfT}#7#Oq+7+HLL kLl}Y`gF`@~KoCNL+5dq6WIl)n*#V-7wTBC2r>+qf0FFx~#{d8T literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Mbabane b/pytz/zoneinfo/Africa/Mbabane new file mode 100644 index 0000000000000000000000000000000000000000..be6ed60baaf85c3760f7f974b128490c5052f52f GIT binary patch literal 160 zcmWHE%1kq2zyM4@5fBCeMj!^UIh)*$M*ump8X!>_1qK!$-w=ji$KVhUpCN<=IR=80RW`q5>o&G literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Mogadishu b/pytz/zoneinfo/Africa/Mogadishu new file mode 100644 index 0000000000000000000000000000000000000000..bd08463429debfd950433c6fc8c1d53d5e732013 GIT binary patch literal 210 zcmWHE%1kq2zyQoZ5fBCeCLji}Ikzo77x28t>joo`qh$aj7?d>_SRiay#}Ec55CH)p z*o_4$25A5TkdYuZ?|&dD*pu=DM1!mV(O_$sfEH00b9rcl4RiV0a}D< MDFXu+&;N& IPuG|W0PW#A0RR91 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Ndjamena b/pytz/zoneinfo/Africa/Ndjamena new file mode 100644 index 0000000000000000000000000000000000000000..8779590e04a66e4287cabe801aee9c8d2d793892 GIT binary patch literal 211 zcmWHE%1kq2zyQoZ5fBCe7@K#}vxXF*w88>mwR;JSOpFW+d@>+;J^=<61_l`gMh+j} m5QcC^5DpFj$pAqJ3FiL?0+1abeIR>4G%0p*0qxc`vCL));UB04$6hfB*mh literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Timbuktu b/pytz/zoneinfo/Africa/Timbuktu new file mode 100644 index 0000000000000000000000000000000000000000..da18d7137740abeff3e856eefd86ff70d104ee09 GIT binary patch literal 224 zcmWHE%1kq2zyK^j5fBCeW*`Q!c_uxZ#;|A7j)r%F?E;KUjQ{`tXaEX>0L%aXA3rc~ pK-fOMAq?(79PStb761_;Bv|tw2tZbWXpnUvnhYzsfNn700szD1Fab^~2f)EeeUK zAu3uJL{x?g5sK)s5F$4bpcadTYe>w+9wqc3Ml$%`unuOc?Rzc5_)xmz7ZT%uLJ;v68Za1Ifwj zjFc?{fsBIBMrQ6>Gb_8vD)e2Dot~Gf$lI@qvj&x?=(+5g?^7iicctWOwKG1+(hhT8w|zBHeCA}!ah%7K>KKktC(cK!&U?$HtM!ZO?hTjVAo~;Y z$5Y?9>nAfGPXGM3lSpJGFDNcPC{!fMA>o{5?$kNo?UAi{#oRoSr>|)||M1d(X?XFN zmyZbm6M=0V0wxCAItWY@{3~H#;;^j)!9;=y1rrM<7)&&na4_*;0>VUu2?-MuCMZl) zn6NN$VFJTMh6xQ58xR~OI!t(&_<#U05!%)vVq&zdg9M@k!UW<30tF%kLIq;Q1Perq z2^WYL6EG%XOvsp+ZR?;hQQOvGW8ww^$3zZ<4#W-w4@3`y55x})02l#g2*4O@>p=jc vu&sxI83$${n2}(Hf*A`i82n$2CPMFMwTnfix--+V)3VcDsczRAP7%KWFWN_~ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Africa/Tunis b/pytz/zoneinfo/Africa/Tunis new file mode 100644 index 0000000000000000000000000000000000000000..dd559ee763401a47ae9a68883bc254b628aa1b30 GIT binary patch literal 684 zcmZvZJxfAS7{|}`B~s8%1V-Udn%Pi;QHwZbD$$$J9jeJ80yhaiKx0CK^#K}cDhm1v z6(p7Rwl*jQxy2n?qn_Udi>&A2IlptyJ;UMmH&^rPgQmcMjd z=sH@nbg{n>I*420#E3OC+GjpJuH zs%M;M+G#ipr|Y}rtF4uC#CUaZz;G$$*UHmcImynODw$ehF_kh5Zc3T|Tj-Eq3>A`L z-~B1IlJ0qj7=c)Un6W8#Aci28Af_O;Y>F|PVhv&rVh>^vVi96e-k`7vF$%E?F$=K^ zF$}Q`F%7W|F%Gc~F;8J1k^m$HND?+B4M-w}%i(mm+}|x=GrNpG`;-Kty4C9GZL)gMsGw9x@WBqXCX^*>uLe|E-wauIY@sT@ zlBp}UO;ziUPScfv6jN2}(i>7Hn~jBU^ri{l%;vbedh_R(rh43KseamPwhrBqn%)-mV&(OQb1dgK93T(K}-D)XwxGy~|x`c1OqS-EVWu zo?(w}xjW0WzWAi~UUZv%H=pRX!|%-g^B?6vL%2HF(J$@30p$vFjdF*N%tvI>RQ}wU z>Eafdo9MDndynMl@`!kpxctGKfcSI#0m-wMAeTQE__sQv?K>P+VGs8yKke$g)rIKm&?*ek7@{&nXNb}ets!bd^oA%7(Hx>WM0bYr5bYW2L-coO z6M$sk(53*%fsq6x3q~4{JRpfcGJ&K5$pw-OBpXONkbE54gdiC?v?)PyVk8C0ijfv1 zFGgaJ%owRba$_V1$qtepBtJ-kkPIE#6d^f6l7wUlNfVMMBvDAFj8q}Hvfs&$3JZ^L zkIY9zjp2uEx#3Q&W1VvC)0S(SwdIa?%5|6cY`FigS0vKDFfWO$<9%rfNePMZz7!Do E3+5nPNdN!< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Adak b/pytz/zoneinfo/America/Adak new file mode 100644 index 0000000000000000000000000000000000000000..391ec98ec0f31cd595ed05a9b91a41c4cdb25d31 GIT binary patch literal 2353 zcmciCUrd%&0LSr%zb~K|6%ZndLdHwdwv5!Hz6D=S$_GwO zxKVG9$_M+-x)1GrPd?l_=tghaCu2%`-Prs_`ABMm8<*6h7ls$Q@qt@({K}-I@xQuy z(NEbbVLVGO{yIi2`8--DzJFUS?JSYY_D`y$npBy*{SWbI?mW4?Y(hL1Gc8kAoE0hl zaGe@4C{m|>(JOxL6)VRs>a@%6sPv)FbjC=xTGe|@i-CHT+48B(>X0hCu}0^hF$-_Z~dY`^WRlkE{(@oYkxjSsvQ;abbZR zvqE5r$QqGFBCAA}iL4V@sMV|#S*q2n68Wq-;ptkisFALrRC#&T5K>RL^S4 zht$t%3W!t?DIrorq=-lrkuoB6L<)&i5-BB8OQe`cHLa$cNIk8lph!inrld$sk)k41 zMaqiQ6)7xIS){Z`ZIR+4)wP=PBK5VJ0wWc+ni3;5Mv9D787VVTXQa?LSLvYOz>v^; zJ)ZEe`}jD{CqL5Zx~+Uov;V2JDYvP$`Nh^cz|^{&s2A|4+C7E;j## cxpqfT^h`nA)5^0mvNA+kd1hutW`>CP3w~*NkN^Mx literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Anchorage b/pytz/zoneinfo/America/Anchorage new file mode 100644 index 0000000000000000000000000000000000000000..d14735026a09cff0104e479fa6543301d482deed GIT binary patch literal 2358 zcmciCeN2^A0LSr%*9!zjf`LeMd;#Ru0}4V>-YX!W5+Jvm7%3#iuo4W$@Qu=R=2lX+ zIh>7-b8NLqJJYRnExKi`P0TUedKt^qt(h!c>unar?R*dGubS&G&$H+GoZayk+wbdL z*Y;Gt^RE+Oe&OZxnU{Oo$bmxt*!*8Q#+sMQKgKH5)ai}xz*{S%(_iimdTF5y?n!rt zY%SBF&87aZx-=c`N%gz(BDCw34gSd32^~2!?vDELyuR!5h(G%4>oUea7=aq*rcD9 z>p53bRr1&Zec#6}m2xs%-+%1765Yje?(Pva&o@WT-~7E;Q1F*bU3pHV&H7fRXPyx0 zQY&KD^o`D(=nz@MAL{IjFRPq^V>iRe7yS=6B|+#T9$xlKOa6 zklrE-^M6xIT`Oc!a-1l-won#N{wf~$EJ{8&{-r3f==Ri_5!${USh)f*q_)nD|e>Yc~+ zBk!(LHI4gp?cowtSJJB2bf>8L+FY?!(t)(u9> z$1j}~jeBp(Cx!>b`j%0-VPL;#s{TPY??0}d%(wU3I=A`Hf zBZtDfO;z3tW^wSC|Nz2mDcwX^q4z3a43^{(HopYJbHLBUQ)=>cLasnZ>0TYhP}t}brJ)Cz88X$?R{>k$Lo}O9^+H%bv%{ze9F8| z1D93i;#p;GjuT{F&a~eD9#@q4176N+=H;FlFlU+nas=+$@2Nxvhm6i@hKGy~?Etwj zLXH_CFh*pM$S9FvBI85`ij351hKh{UY6gpp78x!wUSz;;9V@3vzj2am>GHztx z$jFhQBV$JfkBr`GhHo|FM*@IE00{vS10)DY6p%0=aX}O(dLF6Hg?dRufSqq*fDCB&bMK zk+33hMFNXN76~m9TO_zhbdm5{O?;66TTO(K5L-=*ksu>cM#7B583{BJX`BvqNN8|a z`0XB7WW*hO9Osi;q`I@mew&=>V4F~yc*odm&$Rahn`#qmlWk$|sjI6g_Ww)wKhfqN cF`e%yqFzkiv#S^9=I6@n>b$(%yj&UeH}EZKga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Anguilla b/pytz/zoneinfo/America/Anguilla new file mode 100644 index 0000000000000000000000000000000000000000..20bc9464b8dc49f9e814f26dafca1e779f763b6a GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVPK%Dlq>4f8+rJ!~g%s4=}L!_=Yez28RIU7#KoG QFz7!J;5Cd3XsQVp052#U=>Px# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Antigua b/pytz/zoneinfo/America/Antigua new file mode 100644 index 0000000000000000000000000000000000000000..608b635977bde87ab1e17875905d25b8fe1245a6 GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}c_y11f4JjxCxDUZ|NmnG3=IGO@7%z^^8f$w0}LEK hz99^*!66KeKnwvPB$)gk2tcNTXyR?)0$OIm1pv^6E<*qS literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Araguaina b/pytz/zoneinfo/America/Araguaina new file mode 100644 index 0000000000000000000000000000000000000000..e4ea527f988aa48b93b617a43dff1fea97126c17 GIT binary patch literal 1609 zcmciBduWYu9LMpqVP$eFWN!PhmSpkW&dgkshtz;iq@qBemh<48*Wa% zy?O3=^lV7#d(UaB|2a)x`j{%0TSBTS{k$}_N2EFKrD?vjOuhKgUs{g0sMZ&?(&h!# z=VQM4(ruOcdOcsh^%|zbSxFLZxUC|wk4@xESpRqzBOTS1dg#3x8CLd8$Ln!M1snD7 zy+tyj$6cL}-Nz)n+M*K2e=>}OZ zLzdhdq_U&mOZJ%#wd_@+gqbPCi$9PTYT8$_SHIX z?lzMbxvC0AFE#~_^7Z7BPv$gbS2 zy7KfM**&*L?K!YkqND!(<@=8x1_HkSx-F`!?>~JQ=sqvg3rt_Qh#!x6*yH_qMCTF!$Zc03=kP1GDKvIPCH0slukQL zWSq!A`Japw87eYXWU$C+k>Miab=m4F-t@2?vP>2?&V@2?>b_2?~h{ z2@8qKX#+zdbK205*qk;vBswHKBt9fSBtj%aBt|4iBuXSqBu=Ld6p7SnLq%eB+F+4r zk#LcCk${nik&uy?k)V;Nv1)YZUiKDb{Flh1qy8%MSX+FM^pi4^WlV64jFqI!l+K6P EUvU5X$^ZZW literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Buenos_Aires b/pytz/zoneinfo/America/Argentina/Buenos_Aires new file mode 100644 index 0000000000000000000000000000000000000000..5a52a51fc85a32108cca83676a4a78404568288b GIT binary patch literal 1061 zcma*lPe{{Y9LMqB{?!^qMu#FI7AfMoJeX@y2|wAv3ccu{@Kg{%5ELCUh>9+qf7j`qj^Seg5)L zQrR0F{@Sr4I@)|TzbiMco11d^med#B^65gpb>~LaT0WL<^FFIKy+5C*R@Cm>N8_pb z3%zeTp}Pmy>FzgIy&|!k)1L$GBz@}Q$|OIcgpxk07wK#2u_Is2?B}2DPbUS zI3*Ay5+oEP79#b}ST_@5pY` zL1<~TtI*?6ElssYV~utwfwYL=5K!C{l^Ehzum9&{5(RrN_x=u-OnINo@aa=M-d|Un zeBt3bA`jS30ta8su$OCdLebkEPT9f7gN4kG#_jw z)@zoMCvB}SqH5!H`!#$<)qC1?{r$LUY);xnsiMBsM)dc}0rR8SYk$rTs$cigdS$d% z`8W3Kwuz%A(s?$&J2z!I+jIG@#23@`=|aAH*9O&HKAw+xzK)qg`FORW_S_!oNYtO3 zgL84C3!jx-^~CUSus~F=RDlIj5|LEa;RK zktLBekwuYJk!6u}k%f_!k)@Hfk;R>|It6 zr8uP)q!_1EgOr2RgA{~Rgp`D?CJs`R{I?!eA!Q+TA%!88Ii)nDHm4MaROgiPkou4U zkqVI#ks6&+BvPf*l^G1I?hZ?h+^xKW;Z}LeRMMCWv>Bp{vSpnMRNfM(e33vmHqXZ- O(Emm1c~L2MU-UO#U-2OT literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/ComodRivadavia b/pytz/zoneinfo/America/Argentina/ComodRivadavia new file mode 100644 index 0000000000000000000000000000000000000000..b9c987bb56894c23ca7a74d02d792585e3f4fe00 GIT binary patch literal 1103 zcma*lJ!n%=9ES1Re6%qtRs|Iisn}8y9S+qRQ46PJD2Q3oK&6v|2!fzESV2@=oP>Y` zL1<~TtI*?6ElssYV~utwfwYL=5K!C{l^Ehzum9&{5(RrN_x=u-OnINo@aa=M-d|Un zeBt3bA`jS30ta8su$OCdLebkEPT9f7gN4kG#_jw z)@zoMCvB}SqH5!H`!#$<)qC1?{r$LUY);xnsiMBsM)dc}0rR8SYk$rTs$cigdS$d% z`8W3Kwuz%A(s?$&J2z!I+jIG@#23@`=|aAH*9O&HKAw+xzK)qg`FORW_S_!oNYtO3 zgL84C3!jx-^~CUSus~F=RDlIj5|LEa;RK zktLBekwuYJk!6u}k%f_!k)@Hfk;R>|It6 zr8uP)q!_1EgOr2RgA{~Rgp`D?CJs`R{I?!eA!Q+TA%!88Ii)nDHm4MaROgiPkou4U zkqVI#ks6&+BvPf*l^G1I?hZ?h+^xKW;Z}LeRMMCWv>Bp{vSpnMRNfM(e33vmHqXZ- O(Emm1c~L2MU-UO#U-2OT literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Cordoba b/pytz/zoneinfo/America/Argentina/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..a703e957d5ebe02e0651d77ddfff4d3f7b8b851b GIT binary patch literal 1103 zcma*lPe{{Y9LMqB{^c4)R!|WUixk|*%7YB1M9^VSbSom(SXTb}zMs({3iA2!+w0+nCqM7(;OSG{&R?fZ zzVLDm%FBJj*v*`JcqyYFZGB}Xx99Za!Z|gy`La7TF>a=t4|MU?YxVfed-uu3h?$w* zqTRuqc{(zppB*Tv(v^z)d|SiJ9uMl-<+v*MCf#!FzIu5rujkTt%-pBz?tI!)^X8*l zjU~)N>ZDum39I^O!~GgMqZ-}qy76JuG&iQ)X1S`q)ra&_b+7qeO1M9Y{p#o4j9wm2 zDDTD|-8O#2gged_cIGEcM|-}|nfzipKVK+x?O3O}D#r>j$I~&hzYwog)vntE(PZO= z**6n6eM75F-`lIvLrY`kaPdUc=U?Fy478pQ`t9BGN)^ZPyt3;AJ#Vq%3wz$X8o!Gb zzR35rt$Qk+b$TL>5I>MV3X@MHWU@MwUj_Mi#fq>d5j|Ssy6?slX~FAT?N}2&4+645SXL6oOQO zlwy@ykYcP-4N?wL4^j|P5mFM`nz%?&^1pSc3MmVz3n>h#%qpcJwOOS&q&lmVht!7@ zh*XG_h}3A6B9SVwRc64yvL_U5J*zNa@4wTOKwBZ&D1B>epz9*9A{fL7 z0>zcrsHcN9)bgoiGY>MD5>bay(JhHsWBv2(_kFqucG&aqyq|}Mo%Z{tN6(z@ceboH zdEu}Iiz9*{qvM=>`ItMsiJ<=#@(NlBl=e{W`56)s6Y2p?#4t+ zc{dNct<%SKxcgjwe{M#1x99Rb@o&24>sY=wnlZf}-suDDH{3owkdIa?>foJBSG@j8 zA6wxC+}Fy!u;+cO@?9(QBJbPn`_9ep ziDcRtN^wTgPKKL&?W@GCgF1$P}$INo1Nf5Lw+@9Nl_8}ewIRh>r8=ZMtJH@Sh*XG_h}4J_ ziByS{X|;6*{LSr9kloVSf&n=)m?iR*NdLuX!}M*lG0ImWl^2P0hmCai=Jyj4Y4f2< JgVOP#$X|a10A&CG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/La_Rioja b/pytz/zoneinfo/America/Argentina/La_Rioja new file mode 100644 index 0000000000000000000000000000000000000000..333819a15f79909ac5163a69b136f60b4591e2a9 GIT binary patch literal 1117 zcma*lPe{{Y9LMqBoXfR}te_$yjQrD9hX-pJh4IJ^LbS^q2%b7b5Clbs45Fe-r(h5x z2ozUdgPsm6ah6XlTM5ZvjtDvoif%=Q4g2S>@B7&)3iA2!+w0+nCqM7>(5aK%-e0Fh zzVLE-<>kKd&W((Ea51GHZhL7ac4YL#{8=@*<&vGukDJ2MeLZ#awR-gCy?uNkVx|jQ zwH?ZsC!?eK>EWU(UM|~b+v{fLc(a~aj;T^#k1f^isTWtXdNz66%znCN=aRmfGaqdw z8aMNa6LzsTtQN=W_G{?0s&}{Q`iC*Iv?*biN)`2Oaaez^956qMar<*>K>fO#(#s=p z=0{dYBf zt7X2(_jQeXBANF3QoI9cZ;;!cC;ji4!tz(VoFnpb-|WjdH)8f8lOeMq(;@RYWkO^| zr%Z{=iA;*jicE{li%g8nj7*KpjZBWr?v&|~`JIvgk^z!}Q*uC(a7q?P8b}^UB2LK! zNd?KpDajz&I3*nyZ|c7m^r~8Iqb)azm1HN_I$kNPbR9 z5Xlfp5y=rr63NmjX(D+#U82FJl|3P;l4q487(&@jVsoW7iga}b*1A&VS4x#HQtF1r R{g{;czgj&nA_?z{{048w^9%q0 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Mendoza b/pytz/zoneinfo/America/Argentina/Mendoza new file mode 100644 index 0000000000000000000000000000000000000000..76afd5909e0ed14e11c249473b34744ef58170c3 GIT binary patch literal 1147 zcma*lPe@cj9Ki9nyYKmr0!t_h2_eO_%V3&886$fzqP?t3f~O8q1VPaugZ|N_Q?L*c z1d3Z;gQma|wVc{)OGp+}BIvMDbSomZWwY}2`%V|Z4$d&|I}U>2?~@uhb)wx{v#RBV z!#W^`d;Q&;Y4zx0Qa|4Q+Dz<7>xsp)YI5skJ2^gPrpgcW^sTq*$-7VX>4h3IGgYtc zK-xST8PU)8XI1t}-o9uknb~8$o?U5Ext=bYE8JJFt_|tA#2qvD^}3x;glgV=u?wx8 zW-)%;7Q3rdakONA1gBN0y;he#kD78_+?I0->Su9KFE8vhzp|b7_jI57b1$h^hC5Yw zqeEAY9X3@>XEHm7#!XZ0P^P)-yJ`M*KGU+TL$|!inqA8$ZL2wC+6o`^?%Vy1U8R?1 z-%Oj)rq1*nJ!pFet4;6wtBsN9I=3HV2Nkkoe$)@-r!dUsJueJ%)|2~EK2jBi9}9e! z^1R6VM)$sX^?N*#@_Le-zLeL`O+Ip6yHfw3TaElCht(~IdqXJe-0(yBt6|6tDRZRE zk}^+MnJHzit}MN1}F|(#RA2HtC*m;pxAH~9~2|5 z;)G&_;)P8M6F dIG*wqw(=ruH#xRjR=*z+w(F-WDn<65n!okH1)cx^ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Rio_Gallegos b/pytz/zoneinfo/America/Argentina/Rio_Gallegos new file mode 100644 index 0000000000000000000000000000000000000000..65d0230a2d06ca8b94cfeb60aee0ba3b1a3faf0d GIT binary patch literal 1103 zcma*lPe{{Y9LMqB=9bHfte_$!j1<|rJXp4z}{A?`IH2LH>UH_ImbXr+wb(fs-dXy}zzT zdBekXSRT%sZ(Yl%`{z^o!HySZYG+1IEuL1>+b-DY$qAFI-PJSKU#f?%-r7g!n#^o& zyS4)v^LT7bKRJ|F`HMySw54k1j)(NzN=y}c;|J**tJo06pv-2-ja%%gV|W6r1sqCZ;e-< znFF&iqjO72m)F_e;kBms^`+K8aFutc;kP>&3d=X&&lf$<_Y2mObGaCZ`2L#;pXDNN z~PwAat+&nx}!g(C7R9QWLacgWMO1wWNBn=WO1jgjx6t#^^pRQ3Y<~`QiD^9K&n8>Kmj-*1M6L&@+pDJ8wqq%{d`mc O{a>V>*CgfcZTbmWsqo_f literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Salta b/pytz/zoneinfo/America/Argentina/Salta new file mode 100644 index 0000000000000000000000000000000000000000..963917a01a2639bd782d7f3580647153dc4edc5c GIT binary patch literal 1075 zcma*lPe{{Y9LMqB{^gP)E2xMFBSp3@57t^J!6Q2e(Jpgfc9+qfYQ-qiSyFWji-BW#*d?^un#z>hYWR_Q}O|vpBy? z+mW1kIx(T2^%qs~O4&Z&(=baX!+L2gu1W(*TdLhxFR$hGa{7*0{&d~0qXQxoHF8!pdOLLE!=!0$PuXUvqQ2F~^!LhP^P`xsKNp77uj!0l8&4?z z#v$D{b<9M&&K36OXG~W|zR;cgV!A(HDD>>xqI$|F3Ng>uG1FIw*DC73?cvU3GGFBT=GHxx&UynG z&QR7H=Jw~4{r4_W`6~`jzZ~v6e0k1~->V`UAv+;kA$vJxGh{cXY=`WJY>4cLY>DiN zY>MoPY>VuRY>e#el&z7yow7NyJF>k~_D33UN(V>_NDoL8PU!+^1L?yljUb&kr4^(X zq#2|eq#dLmbPaKlj^uyq(Gt=V(iGAa(w0;DLK<^QXGm*K=?!TP=?-ZR=?`hp={gJr x*Y`%kt#<>4JR_` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/San_Juan b/pytz/zoneinfo/America/Argentina/San_Juan new file mode 100644 index 0000000000000000000000000000000000000000..fe7007b85ca4a22659c2c3093d078893fa2f466d GIT binary patch literal 1117 zcma*lJ!n%=9ES0mFB^kmRZtO;iv2KgIaFgrshp6ZAa+Rug-#A42nEH#3ZmlTBm|@g zLQA4u1y6@)Nu#}*)@Z>JNQ(##1;tHKi6MUV`hQL)QLyK7^E+HR^?fqKXHNGzf1Nh@ z!prHCm;08xH?!)&rL=yy^M#q-oz>Gz=Tvd~Ww%(EG&9X9UApy3J$n7leS9%uW@mP2 zcQ|XFOibvfN6V^wrRvV@YMA+xK|Q}3Q{ z#?4adlw0o$t9q{CehrPNMsK@ryw92D)|A_<)YP~7sQz9%WPX(6?$6So`gJd@SI6VZ zyKzvrO&&Ml&a?TwV+GUMK9=uFd@)_0F64XmY*IZh3;BKB-8$-gR#9^#A6u!Z{kMlY z5{+l(@NCTJV$LK3O81YhH~nv}cKG~je1d`26SDY&=y~O;<9J@hb>zNW^@Tm}?Fzrk zRldmgjjelXAmb#{yn`8Mh})kh^Y59$@>jf^WAbv}=E*rfK2<^{LuNy!L*}!}gvg9m znG%^3nG~57nHHHBnHZTFnHrfJnH-tjD$^tLTO|P`10)5jafXp`b1S;_y_AuS{?Brzm2BsHt#h9qZ|?2z=3{H&57 zk|B~Jk|UBNk|mNRlBd-s8t|{}2}zYa>nwo~%9e99Dy6oHv~~J6*iz+JN|i5C>gLw{ Qgp~TfS{)}M2_K031`~$z4FCWD literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/San_Luis b/pytz/zoneinfo/America/Argentina/San_Luis new file mode 100644 index 0000000000000000000000000000000000000000..fa30a68397d231324df70d2d7833a95c68228fe9 GIT binary patch literal 1125 zcma*lK}eHf9LMoj_ipbR1y)d2(j~?6^dOo+7|-yqlDy18;i*FeK~QwaAPTy43WSnQ z%2v`X@QJcyT0XUGB_)d~(M>426%=c%Qs4gH$5Yh7_vL**4=+3I_stBPKGp91a|QB+ zhpSs2&W(3&45>$#()#hv*Jg6}ke*yPr}En`+x*0snX28_)3@HMCm%l9rxz1uW~x!! zfg$s3bW}e-SWty4CHtbOYGzOPdUmx<6_Z`IxHPU_T^-hQeYefr*K2mZFI4m9i!JZ# zGz&c^ZKXS|D%q<25j~@-?G3v6IcsWLdu**(RzE9)`d4|s`CaI=%hUa8JWdfy$_b@l7K{Rnq77WHF()Q`mE6br*b$@9XnXgxm+7fW^V zF#Nd0d$Gh9`M$}0-_p~U@seqt{)~5wlf2~k_m%noSaJCk57!}iI5&lIogW#0hzy5} zhYW~}=#(LmF`Y6fGAc4GGA=SOGBPqWGBz?eGCDFmGQLv+Kq7ET2uKV_5Kf5#3BxII zAb}u}AfY%V79Adx7Y5~fq)L;^)3#kEi)_3OK%(x+4!#G(PY2675yyEl|7y{>iX d8m-&tdX=~IDqp16&92vNN2S;GHS2ka#2*rw`nLc8 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Tucuman b/pytz/zoneinfo/America/Argentina/Tucuman new file mode 100644 index 0000000000000000000000000000000000000000..be7bd271639a551eff3b1bedb3b0646beab4e9b7 GIT binary patch literal 1131 zcma*lK}eHf9LMoj-E>Kj6;wpTB1LAG2Wu^g>JblCw96bAo(d!gf}%qPQPHJSFo+QZ zic332Jsm93l}{~O8OUNv1Re%Ox1wSVv-0i#eRhh1d|%%8^X$cwzi+blnZi%LP9^>^wNxNN$IiKGirRpMLRw^VkQ>u>+Fp;>e1Wx_VM{fGdZzQ z+uoFUGB~K8?#-#(rGkC7xnib{1@zQXo62{@Y`%0)y||Lr)A3to`qNcA6Zh4O`Dlxg zsG05Tv*mpuRUWF?Z^2Wl(%z&iABN1rx=y>0FRJh5e!W=SWq#zM_Gh+R{koITO9N5m zU)!l0Mh=@$^XbgC^r&fWN@rSPUro#BbD7qyt5s{^XeQ$MI%4)@+Db*W{bo-%R(WoA zPqrC7@kQxZuXR`d3ez=zIec(&*c{3p57*Q#^A6Ni?;zF&g6@~^=L(+Z`+4gHe1EP` z6Y~9cCEjxdzR34g)pKV&>2)M{x|3cHr$4Xczqbm>U-57qkcabnU#_zQcW)!RA=@GQ zAsaenM`TNLzgoYDc(0@8z1nn1d6N*hQY zNFzumPH6?{1!=}9-5~8ar5~grq$8vyq$i{)bX{?fw&Z{7(HGJf(izek(wkG7L%MTH zdq{syX%OiUX%XoWX%gwuDQzNsI;ByhQ>?aHSG&ABD1CC*^R5flyI(TiJh4i$)ihnE eH7i}R@|I-fizK_IdOjk_{x4h4Ym}CEH2wy7l=|QR literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Argentina/Ushuaia b/pytz/zoneinfo/America/Argentina/Ushuaia new file mode 100644 index 0000000000000000000000000000000000000000..18590effb093a4429c23fbcedaadf5ec0fae774e GIT binary patch literal 1103 zcma*lPe{{Y9LMqB=9X&}SwTfa7%8%Kd9c=^5+2z>i0q&P!&8R{grMkjq5&d|7PUS8X?31lkGj}wk=a%9s-4>PxXw`lWpHS8ICS83yYHAx&ww5odFO@<4wYbN8%O&jhnO^ndc8^{f zPALECZrwO`&_r5JW_M&JOiNQH+nW4jT0fl0wryXl+6qUqG4G>_nSI%Kxu|yD=xa_^ zpPIe1aii}aR=Tvxb`7pHU9T=S2ZGDILk+*(!BAMf`F^h8dA^^wo}5dCK*aZ7m-#Fe zcq8xE)X%BzwAb0g)0_7CIQ@C0|GiK|e#OJpArI$`zFen=$FCr3A&ViaAsJ!CKTovzG=;PURU)cEUe2(OT{OjsjL3A7%fi!!j<1uCBssJxLt*VWI5 PB+&mw>UmKqcUSZ$aBT3H literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Aruba b/pytz/zoneinfo/America/Aruba new file mode 100644 index 0000000000000000000000000000000000000000..73bb7eaa81662d3d6a36c187d6be8a4dce232161 GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}c_z#0TYQ`G#)FaR|Nng+3=IGOAK1ab^8f$w0}LEK iz99^ben1=?0@4EnAtadm9|%CEgJ|My-~w7^!UX`SuPyZe literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Asuncion b/pytz/zoneinfo/America/Asuncion new file mode 100644 index 0000000000000000000000000000000000000000..a0c56370aa08a89fcf8e142bfd92329ac721a14a GIT binary patch literal 2036 zcmc)KT};(=9LMnk_z;K*ngWt#X`zUR-@y}L^zb8mKm|cKgwT_QAsEr&p?v5;Y?hmI ziPF}?jYHkK(Bdm>F5Aj4by2t!HmVEVD%MR|F;>eJng4$8Kl7@(_J8(2umAq%>TJKy zJ5t+NpA-1kHQBx4=IU@a&(l9h`Mq=Ul8big)iFsJY}aXTo|D8=f9mud*UZgbOYMx> zkR-Kl(&Q~gGPCLpJ8RYFa!Y=iot<&j%tf6w8cmeofp0XsY*bA1OdHB=FgevhT{fdv!g)y={$tSO&iPey zM}CsLD_?4U|9M&d^=ZAgyGIJn4%_>BPMiB%I`x5rZ-F)&d(9I&i*-|Lz1duosZUlEo4VzRx+N#mJe4}C_35i*YwR?;^{++JF!GCSyp$l@ z`UmaPAO0*&-KXp`?_7}PJzef^h(x#bXiMFB)4KMMwiWf5_RKbYZowh*d_t9Ok83mA zFX!ow@2kwtb7{Kk(>(J+U#@-eWTm{+m1yEY<9P#Pfq>_Irh!SG z_tntEcg#%_ZwgBzf$|#e%7{Cy*RRNbAMh#ecW$md?&dk!b64ZOc{jL0C7Q6j@c#)%9R87VSUUpH1{u)c1z z$Z(PIA_GQ7j0_nWGcsso)X1=raU%mqMve>}89Op~UpIPW_`YuZNC1!sAR$0vfCK@F z0ulx!4oD!7NFbp=Vu1t$i3So5Bp$vlAV@@zkRUNZf`UW^2@4VzBrr&1kkBBpL4t!s z2MG@nA0$A&E<#9%kQgCBLZXC(35gRDC?rxysE}A8!9t>igbRrm5-=oUzAj`)%#ffV zQA5Ip#0?1?5;>d*U0m#>8~M3jx`8no=X&QF=X&RV$0Sa?DRI5~pXRwrxe|scVOD9# R1VcfSZL&(k!5khE{sD{Y5Ox3n literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Atikokan b/pytz/zoneinfo/America/Atikokan new file mode 100644 index 0000000000000000000000000000000000000000..1b49e37c943b55e971162900aa3c7ed4d2d6698f GIT binary patch literal 319 zcmWHE%1kq2zyPd35fBCeHXsJEMds~T*f4+B&w>*_!V^w+{A;+R{H5ShBIgGNMg}Hk zmjC~EZeV2i|9|xY1_+x2EW!gK83deNLKvKbfjAt9140;FfovdPgb*RvT>-Kggh7BE zh(T{t;WU!WtgI~d|(Ajt*vfhiXN%5QKt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Atka b/pytz/zoneinfo/America/Atka new file mode 100644 index 0000000000000000000000000000000000000000..391ec98ec0f31cd595ed05a9b91a41c4cdb25d31 GIT binary patch literal 2353 zcmciCUrd%&0LSr%zb~K|6%ZndLdHwdwv5!Hz6D=S$_GwO zxKVG9$_M+-x)1GrPd?l_=tghaCu2%`-Prs_`ABMm8<*6h7ls$Q@qt@({K}-I@xQuy z(NEbbVLVGO{yIi2`8--DzJFUS?JSYY_D`y$npBy*{SWbI?mW4?Y(hL1Gc8kAoE0hl zaGe@4C{m|>(JOxL6)VRs>a@%6sPv)FbjC=xTGe|@i-CHT+48B(>X0hCu}0^hF$-_Z~dY`^WRlkE{(@oYkxjSsvQ;abbZR zvqE5r$QqGFBCAA}iL4V@sMV|#S*q2n68Wq-;ptkisFALrRC#&T5K>RL^S4 zht$t%3W!t?DIrorq=-lrkuoB6L<)&i5-BB8OQe`cHLa$cNIk8lph!inrld$sk)k41 zMaqiQ6)7xIS){Z`ZIR+4)wP=PBK5VJ0wWc+ni3;5Mv9D787VVTXQa?LSLvYOz>v^; zJ)ZEe`}jD{CqL5Zx~+Uov;V2JDYvP$`Nh^cz|^{&s2A|4+C7E;j## cxpqfT^h`nA)5^0mvNA+kd1hutW`>CP3w~*NkN^Mx literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Bahia b/pytz/zoneinfo/America/Bahia new file mode 100644 index 0000000000000000000000000000000000000000..403d9d1060ea23b39094ac2a3f1ffdf5933d6729 GIT binary patch literal 1022 zcmciAKSM(6&-+=MBIr4udmXp^e(z6wW^f=C{c+a& zf4H13fB9W?`~FaEuBN+?`*p}ntz`63epnW=4|L&ESr@mxvx`&xvb45U^LO&HyfmqW zI4$2Moc+G>tgKF-(;wCKrgS2yrP-%aPQ0|`dnL2>xl(_QkD0pX*R+1*jcG7@tfc2n zCUr_|y7Gc#vax1LPozT{v}69f>0Etgv$?CXce$wht|!g@IcE=C ztTtUUH}qid7t=d=)E@7?DeEf!;p5!f4^iY?u~4zWxz{hEO~-oT=y2ajzGB|3Kk;7_ zaQ;vMDG~HFkRnJGq)gD)K?((ZC8QKm3n_+FL&_obkb+1>q-4<7M2ZG|RirFZm*=D~ zQW+_Y)JBRU)sgZ+UmsaO(60blLeQ@PSwzsU0$B#K4rC$7N|2=>Ye5!+tOi*QvL0kX oLBAqoNkP9RWKqbfkYyq3LKcRs3|ShoHe_-5e^!_91577=1KZPJLjV8( literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Bahia_Banderas b/pytz/zoneinfo/America/Bahia_Banderas new file mode 100644 index 0000000000000000000000000000000000000000..cd531078d0e8a4752bc242e83836dfdf0ae307ca GIT binary patch literal 1574 zcmdUuOGp(_0EUldSSC2wgD3*2APl>y>CLPxyOx>WG`p2q>b30JP18{;tb80u1R-(^ zf=GlQdQq4`nLQS5auXF5kqUtep{SsfAW0$9`NmZQLGAhvXTD)Jv-v(>VK9&=ep|Ty z!evGJ@;>)+?+5eNXw`6UV5k3{=as)N((Uh?XjM-?*7yfH?kFKlnNZ$hB-YK5D>4H{ zQvSG1Ub5M6Cl1M#;Y*E_`QJp!`$%Kek3o?-7HzHWeJR%TL|AJdc8Rq1&(^xmX0g8d zxs~41DL3TySe~**nX&w=wK1baZi+f$WiC#and2QsR@fq$HBe`48JQ}x`*s*P&t@v` z`B<^_=9tQ@pCR&2zg62xm&p9e`)Ygobm`0KR6Alm$(?bHYL|E>3ua$13x;pW-D3@A z;o}au=S{J>_jbEbrZ z{ozav{kLP=T|Oc7(-L8}edD5-X4~yjMDiYD*!KONkXe)8bG$y`-R=_}ee?A7X6Sc) zf1U3yWU}=T3L+ImEQnkX!5nJIAfmxZ+4#39c_JM|JcxV{0U;7XM1;r)5z?WS5+Wu; zPKclkNg<*#WQ7RJkQO2?L|%x%5Q!loLu7^s?NCb%5!<1b8zMMFa){^<*%`t^q-Tf^ zkslHOBmzhXkQg9AK%#(z;ZVl`2?P=eBos(2j9?(qFv5Yv!w3ix5hEl>OpKr)Q9;6T zsN;eJ28j$38YDJIaFFOA;X&eq1PFB3W=2wEF@Y; gxR7|^e;06s?%S=qj`JqD5?t|d-h_BpvMWB~Cwj`Z5C8xG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Barbados b/pytz/zoneinfo/America/Barbados new file mode 100644 index 0000000000000000000000000000000000000000..7bb7ac4d6ab698cc62fde7d1a357be3c06e34e8c GIT binary patch literal 330 zcmWHE%1kq2zyK^j5fBCeE+7W61y)w7Jl)Zn{FIO3(*wRKJs0?=GdvI|$-5v}_UM67 zNWcZ*`2Pta26h3A%uG=D|NjYT1_m(6^8f$U3yd89{~tfVz~kc^!r%nNjxInP90IZh z3_?h7&3_;Oxd=pqTm>=!`#b8#93R)(LK{no*EQgwu z0}+n9b;YPf@Mqam#(Ad-g5WH>&$4O1SFe^gCd7}^>ArAtitgsUfBz(kDuZ)r)eM)gDsGQ6leKhbq;fd_A!7TlboLKVMfL10|C!j;rjV zCi9>k=f|08KliB5oh?(m+Eb;?J2PUYVi{hW(e1Jt>$@}^g$^f&`Uf)*)RL^4?&igaiN!3-*NP@z3st2r%C?d zaysSmd;3t&Vx>?xU`LJ|H}?j1+WT!6)Po*pN4G|5?BJ3eTWMGE?lm2M+M$XmtBd7T z^>}$smu@$kCyh~EzWm!fjj!wRQ(sNx#(6!_Q8knOgZ5d=T{9K++NsrRW_n+jo&G+o zs@wM3>daMD`?c9VFPv5{7We3v13C4own@J}lT|Z!e(E>5q?*0*ST%w)XhS8%Pz#RdAD@QzP~xIKFpr9ANwDw)VXguRr?ZU&R*1+QfHJ1 z*ZoN*k_qR^Q4lyc`6z61t~3&Cbgotjw;Vl|4-R!5mah|X#lI)Nj`wzQcyr|4k+(f8`2KxhcrYwA}x`gUTKPS^-5c$uU8r) zosrf^Z=^ZW9chpBM>c@$0NDbv2V@h-F1)f0WFKDH2(lBeYz5g1vKeGI$aZMSe!Q|F PWJlirxTUm=t0VmfZ6N8? literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Blanc-Sablon b/pytz/zoneinfo/America/Blanc-Sablon new file mode 100644 index 0000000000000000000000000000000000000000..8a33789afcbb422ff086f021a0716992e463eb11 GIT binary patch literal 281 zcmWHE%1kq2zyK^j5fBCeRv-qk1?KH&O_;yyZouh|M+ujdzZ6_bczc0?k%^h{|NpBO z7#aTmKYoCL1F4RQpC1~~*ogB$~#r-s`k~Br>&z%seMl zSL~N3ib_exiK2(wSdY1DXJ9GkIoaGQFVC#Ocz@VBGQ;M`_Eu8>seqI~YFJGXq>9y) zLFyodkV;4?q!v;PsfLt8>RC-eq@vZ7L~0^M*^{bBS)?vf7^#euMrtF)k?PieEAN`0 HFzbE;7gY-W literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Bogota b/pytz/zoneinfo/America/Bogota new file mode 100644 index 0000000000000000000000000000000000000000..bddda98a2c929dc113b02cad6345e2f99cd684d9 GIT binary patch literal 231 zcmWHE%1kq2zyQoZ5fBCe7@K!SL}-B)b8&$7zE}q)MyCJ&cTHem`2YX-0Y;Yp|95U+ z;B@j0VQ}^j1`#0;y$m7P&1V5hgD?od*nQ?sc|U9YQ~mGv?04S3o%8qSu2kbib)k(FrmXTM^)IsJRL5F zRruj!(mnQ?y6($<9dYrLh#YR$QSbMQ=(qc%e5qYr-}S7#VMn95(bphj))tG{k`;1R zUW&LWb>bo>qGxr-&GZH1&PLGInZ;Z(YM-PhHj(~h1>Vmg+(jh;e5UE`(M?jo@)8nxhV0tKTke!WK1+y zCCHZUfY_WfCAT!65L;s}$!+C5V%zkD_U8^L|L7Nbd)!{Nedv_lG45AS_x9^&F4U;j zwsyVqWWH*vYt*~;B`V<(uHc{hj;UvITv4id;fc3Vdh^R?nU$Pp6HmX3yvSAtc|ib%IYY~qpXjzK*|bj z%@QeVq%4xMO3E^+T_-Orlrt+OER|!el*Lk3OIa>uy_5ypniW%)Y-`p`Su|zUlx1_Q zo3e0@l~b0^v3APhIaW_uKF9hg0&plmk$|EBMFd-;0!0Rj4iq6MN>HSrXh9K!q6S3{ z4m~J>a415N#MWp+5yjT1LXm|-7m6?xWhl~6w4sPYQHLTAMIVYl6on`fQ8c26WNTES z$i$%&MJNuXC{l4~MG=cbEs9(ey(ofF6r)IHYc!*XW@}WV$YyJFqX@^L97Q^cb`QUsQ=tmKdq98>=TcaUGL|daGMMhhrBSlCKB`H#JXh{*1LrsdD9C}g&r6@{~l%gp` zR9mAeMOIs*D@9maqbx;QinbJSIn<@d%b_ntU=D>T5_4!w5!u$LOp)2v=u8pX)+kMp znxZvDY>L_xxhZ;61P^kVPlypb^qTrO&YoyturrVw!VTpA5N9+qf7j`qj^Seg5)L zQrR0F{@Sr4I@)|TzbiMco11d^med#B^65gpb>~LaT0WL<^FFIKy+5C*R@Cm>N8_pb z3%zeTp}Pmy>FzgIy&|!k)1L$GBz@}Q$|OIcgpxk07wK#2u_Is2?B}2DPbUS zI3*Ay5+oEP79#b}ST_@5p2K@Js8qoc26|1xqr0AHmA$Oy!zJB1^Y*)Mw-;q8v>G6 zu~JPd$(Cob7pU|(<$C%AkD8I_)iWNJu8}}X1{+% z&si5&bGLmZ&lUZs=B@ff=BItGyg5d^V>e8;XNP1DUokm%Lh}5;Nt1iMRr`AP8~?c) zo!1dI`G*$if^erQ+&N7z3~W`4YDRUD_f_>m;dgp*N{%YdcqqlU#-!xY7bB&~x2sF9 z-cv7re@T|~d(2Chj?2;mznNu6_sQ~>ug%MyNA)XJ{boheUR{=V(3F>L)aAbqs(`Ou z0@qKgib;)9ajsjfy1QH|k9}xXf776Y?Oo=z3rlrXL&Q|~%+hO?RGOM-qF$TnGof|A z=+K{2Ol{FsU3)WE)y@1_>INsP4P%2+e`-X%K73jlI%DdMfo^GRI(yJ=Cd=E=67|lR z5oxK-P^|}I@@~;zYDdd?*_n1j?W*dLU1N_-wD_!!4*y_wryth42QHiUMx(l|x6kbP zwobQqd|>uoEY%&2&1T<`Or4aFn3SCK#Q6SFo=i;{=SRo!h5XNn#N!{GNJw_i)Oh^3 zk%{s6XZ;Dvy-9QT>D(oYyUhOQJ)dlAYm?ymkOZskS!+*O8IO>x;Mf=C_J}07A99a> zuc62AA#R5g5HBEZI9fj-jzB!&mv9B*3&Rr{>Aznhovq}hTjm!8JAe_CWdrX%M7CkQO=G9zmMqXuAYylcVhuq*0JgL0ZM=6{J~=Zb90`=oh46jE+HC z=4g8cX_}+$8l-KGwr`NeK{^L%9i(@V=0Um#|Ih97*j6sKnam9?^cVW`bAts1{sMo# F=WpJ+5FY>l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Campo_Grande b/pytz/zoneinfo/America/Campo_Grande new file mode 100644 index 0000000000000000000000000000000000000000..46840981043ea98f2af981e7e24e1f085ac0a4fe GIT binary patch literal 2001 zcmc)KZA{f=7{~Dg6*G#Oo10^aVPs0+@!}yRvbvBI4Gu}1kT6SOh=xTHL!#6J&e_JY z&6uXqq%}8<*6ud9(8YGIhdGj^6}E{W%+1XjTd^7Ppq=jT?aN-&JO5{g&)L~|!*+dt z;fgJrG6Vm5?r`7m=83pBpA!yz)|}ma|JpyhZx)-AW6Sl_rB)fp`C11?XXs$!A9nC$ zjSNkv=%tTFWq9bAj)e2%+J_1Due-L&xUJXg_obVOl3blQ{fkV+kJzc>ab|jSmfmP< zGfBN2I=AVHd9X9zCT9(qc`e)Zp?iKcDdlr*%H^FhKPO=4_n(&q^OAHy&zMOKL^ZYj zkUaYP12(NzO}hP77j61kf}KZo@yZh-k-eIcw9aI%4ce@@CdtmJ)a;3~vLtztE;-w1 zmX7z^obC_g@!>JeeLvSc(VJkG)y*+aes@HlD*oF%z5ia-;E2iF8>h=>-<154bDDpB zSXP8K+7%P}g+`%NuL zE-=qmy`ZImR1?l$s^Q;ON?A&xmh~=_^4MuDKOQeHULMklcSmL2nMwQ7<{xE!*G2pC zDkHD7_1Fy=eP(0r5nDO)3sY6tVymXkNOfA3t^TRr)Xa)#&6i=b`C6rJIlN6??SDpV zn@eTuiAVIcipS*j_8D52J6qn^@vz;NI4Sk(<81xpMQK=e)izw{k;XYc*v4-znC&+{ zw@qE+^48!!+uZuGdHee=eW!Al*>Ute-C5WnyY|#+Y|QO_MWcOvfj~5R{#?wR(dcO# zxVtD64&;SO`4e^*$`k(YgKl*{^9LPu4@Zq0w$~jua^T33BZuyF$BrDl*Bw1__{i}i z0U!||As{gzK_F2eVR&5}NFZJp2@(nt3;!p@gV^s5h5WXF(N^FU6e?eUKb}4C=w|WDiSLaED|jeE)p*i zFcL8mG7>WqwAV$Agza^4BY}He`3rP^ho$f{KxeQG9<{DAcKO83NkESH!jG)c-_b#L*sR0gA5Kb zI>_)KL7hD(^_eFG!`QifsolrmJOLVz)QsE0Wtc9mDzqwuFpTGoRzgQE4E!_XBEht zFu!swOO&q3HsQ91OZT%XvEj`ZnS0YE@ZJ$iHG2el=pSr>~@RT6$$mb~s)TPK=i>2SB&HdZFLU+xn-Ze+-^&J&{iO5QcH(tgsu#{bAco!x+3K=J08o z`|I~Sk5@R0ydpcxd`+FEzn}Ln5;4pp6aG&sNG?b+NH$11NIsTkLP$nPN*p;^nn`hF zg`|b#g(QY#hNOn%h9rk%hopz(ha`w(h@^<*XlW+Nk)@@XCP$t~q8ynbsdD6sB+HR4 zk}i@jk}#4nk}{Grk~EUFrI|L8Hj1JBXgkD44zTS&5@Y` zL1<~TtI*?6ElssYV~utwfwYL=5K!C{l^Ehzum9&{5(RrN_x=u-OnINo@aa=M-d|Un zeBt3bA`jS30ta8su$OCdLebkEPT9f7gN4kG#_jw z)@zoMCvB}SqH5!H`!#$<)qC1?{r$LUY);xnsiMBsM)dc}0rR8SYk$rTs$cigdS$d% z`8W3Kwuz%A(s?$&J2z!I+jIG@#23@`=|aAH*9O&HKAw+xzK)qg`FORW_S_!oNYtO3 zgL84C3!jx-^~CUSus~F=RDlIj5|LEa;RK zktLBekwuYJk!6u}k%f_!k)@Hfk;R>|It6 zr8uP)q!_1EgOr2RgA{~Rgp`D?CJs`R{I?!eA!Q+TA%!88Ii)nDHm4MaROgiPkou4U zkqVI#ks6&+BvPf*l^G1I?hZ?h+^xKW;Z}LeRMMCWv>Bp{vSpnMRNfM(e33vmHqXZ- O(Emm1c~L2MU-UO#U-2OT literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Cayenne b/pytz/zoneinfo/America/Cayenne new file mode 100644 index 0000000000000000000000000000000000000000..7109a98ec5cecf1c930240d6d67aedc82548a9cd GIT binary patch literal 186 zcmWHE%1kq2zyQoZ5fBCeCLji}IVOJ5p78sy=>bNj|NqZ@U|{(F|M&q0mjC~+USMGH g@eN^ccMAcj2Z9h1O#Kf8Ad^8fai((tEi&c;0G{hG1poj5 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Cayman b/pytz/zoneinfo/America/Cayman new file mode 100644 index 0000000000000000000000000000000000000000..a4095d38633409baf9fb0cdafddffde48851d554 GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIVSUOWnldOe+Q8L|NqVn3@qNhAq=j;AwWI@LkM<* zn1NCt3<4lSKy04>K#O(?YL!=cxMNs}%Y0#a~T!Sz17cKZ3}Cpw>NgF9qmu+9aR--XCrsnSyZ4tJ6R>Wa>`9!VX^F9kZxMSt1yQB&M?k}ke9UhVblr}rL-QeVC7(g!Pxwhz|`BTjI<%{*PHLt7kymbA; zyysO#)(Bmh6t9kFgzFR0J=DojzWUUVFjEy3CZ~J)m@|Gp^5bn{sy#%ie>rZ>Rvnk0 zN()U*QK6jMU8!nwDzsU)N1b0#pfAi?sp^um^~KS1)z5Kr^e+!3sb9NI(3kFe$^6zb zMqh4{Xf9t$lq+YV&DA5(@_TU?Q{RjS>h>fb8Ah5skPE@a&zTA<|f^!|2fsT zPmT5n{6=}q_tQ;VZB|V;d??M#o9d>DMY?&}M&p^Es$1+>Xj-mWD6N*Jn49ON$Svs! zrgc(+v>6s^yrM(p)?V$*ZJpXl+YUX|?M<#qy9T$bb{E>}_LWzZ_kqj$j?a%NpH1Iu z-xa&nooOxQuGuS8hr#EiCuW(s*K3RTb)IefTnBWgW@AmK@?71yI?{B> zdrSM5Jf*s3P1OOpeO0%NVLEWpy(%a%O@gO1QQf14%KZbYRfu12=@I<3>gnMvq3zF@ z&?=Yoy0X{wE~=0Rj;=RhIahV~&ezO?3(ECF?<&(LIbT1VIbS^z_koTWm#q4B%hZv5 z2dK!pZ4%Y>Srb*VRH8lOOmyxHiKz)PkG;28KVI5T#m-FE{k8_GxRE1t|F>^Z1H!`f zz|@OskhianA6%;9ue#}kknJkrl#dMcIb?=@Au`Oh)eO%*E+fj9n30)<@^z&7T`(kvGhnq^;;IAiEolwub z9W9gg*PCb4y2x`ml_ojCQ`CYzW^zcaJfFPMOz}D(DRFa6imOJag=VX?^8I>R+c|1l z-X@)XX@Z)bwMfr65~F5jr0N&8`>TvmL-edAEtI(Z_g91KKGV?sx*z`gSN~6+sIT9# z(M{^>*DV)!UP}|_o#xK>R@dH-=o>E)gW@I9J`qFg(?6coX8(+9-{b#z4cdQV;bDHV z53k$S+Zol+wH#TA$XY~JBeEWm6^X1#WK|;T5?PtZ+C)~Tqg|iK3U#z=6j`OnIz?70 zvR0ARimX>;#Ug7KS+&TzMOH4dc9GSKtY2gWJK8mjtYSyIj**p&tYu_1BkLJi(a4%c zRyDG&k(G_CZDe&L>l<0&j&_YBtK8A9b7Z9>Yu(YVc4WOHD;`<%$f`%yJ+ktVweM(G zKeGOj1RxneQh?+DNdl4uBn?O&kVGJvKvIF^0!apv4I~{%J{)aAkc=QHL2`m51<4AM z79=l7Vvx)rsX=msBnQb3k{%>KNP-+~hL98?IYN?zPL_B*_NEwndBxy+2khCFrV@Mp5Ifm3BxnoEkl0Am>A^BrSAd*3b6gt`* zB1uHDh@=t8Ba%oYlMJaua>LnS!PHxl4m5*NT!igBe_PBjbs~1HNIs8w@80a&|DB9?1E@aDpIb2*WAjXwMPkByqH7338e^+VccCQIInQIaQEz1vy!e zvjsU_8o1rSSHtT*3kNL-T4+stj^p6b+3J3}aZ1x9(^>6(E literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Chihuahua b/pytz/zoneinfo/America/Chihuahua new file mode 100644 index 0000000000000000000000000000000000000000..b2687241cd05b6904a7d95bae697642becbe5b1a GIT binary patch literal 1508 zcmd6mZD`F=9LIl`d1$R1A|Vn=wC*142{UHbX6$Y@cQbd`-OOgpHpaRhcZyat97@y- zCGwEAl$odUN+^UBlUkB3DI$4Ff9Lb}MtP;Y@I9SAr~jM(o6jc@tgeigKQ_>Q;j*B; zyoaCa?5l78P}|d4SrodQ@hH?4l@#jw(fmHHs!`$_2G>u^Dwc$TH}#2==c}anZk;@6 zs!AF2SyFnV)b#JqWX7jqW@hI@N$rRg=ZtYQd`kdSO?g%DFc|{6~^i?u7`+3y)HZT3$^`PS55?+GwN_<2{8FA>u2!yyk%}okwJL3>R1OQ7s<9uX>cd>K`o|Ngel*Ffd2w0R zUL0s@ZavoP4)mGY)0cGJ`n#sS`LJFe>{S~oH|vHOchttr61{2kdDR#bmd0;;Rd`5H z!rgUh^Se~pay4IVeK1b8om^+Ow~Or9nP-~zy%bMBPJeqMJpcAM&e0YT$7wSX;W+0{ z$Y960(&35X?NPtJ=lBESUmTDOuFt;h{e6MIFvhXN8i+X%dmsiuEOKd0;y>8LFbZN7 z!z_qh5W^srK}>ULZG#xcunuA#!#;?C3=1J9GHiqx39%AlCd5vNp%6*_!V^w+{A;+R{H5ShBIgGNMg}Hk zmjC~EZeV2i|9|xY1_+x2EW!gK83deNLKvKbfjAt9140;FfovdPgb*RvT>-Kggh7BE zh(T{t;WU!WtgI~d|(Ajt*vfhiXN%5QKt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Cordoba b/pytz/zoneinfo/America/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..a703e957d5ebe02e0651d77ddfff4d3f7b8b851b GIT binary patch literal 1103 zcma*lPe{{Y9LMqB{^c4)R!|WUixk|*%7YB1M9^VSbSom(SXTb}zMs({3iA2!+w0+nCqM7(;OSG{&R?fZ zzVLDm%FBJj*v*`JcqyYFZGB}Xx99Za!Z|gy`La7TF>a=t4|MU?YxVfed-uu3h?$w* zqTRuqc{(zppB*Tv(v^z)d|SiJ9uMl-<+v*MCf#!FzIu5rujkTt%-pBz?tI!)^X8*l zjU~)N>ZDum39I^O!~GgMqZ-}qy76JuG&iQ)X1S`q)ra&_b+7qeO1M9Y{p#o4j9wm2 zDDTD|-8O#2gged_cIGEcM|-}|nfzipKVK+x?O3O}D#r>j$I~&hzYwog)vntE(PZO= z**6n6eM75F-`lIvLrY`kaPdUc=U?Fy478pQ`t9BGN)^ZPyt3;AJ#Vq%3wz$X8o!Gb zzR35rt$Qk+b$TL>5I>MV3X@MHWU@MwUj_Mi#fq>d5j|Ssy6?slX~FAT?N}2&4+645SXL6oOQO zlwy@ykYcP-4N?wL4^j|P5mFM`nz%?&^1pSc3MmVz3n>h#%qpcJwOOS&q&lmVht!7@ zh*XG_h}3A6B9SVwRc64yvL_U5J*zNa@4wTOKwBZ&D1B>epzr@~Aaj8r1iS4lKq(Lg z0WKg0u?7DFL1w#_FNg-Y1SAP^4VVVH2tfLBMrI}` dggF)HU>2~0Il&I*^#QsUi=%;V0{Xy=3jpekNhJUP literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Creston b/pytz/zoneinfo/America/Creston new file mode 100644 index 0000000000000000000000000000000000000000..1cf719ae837475e9dfe22e1b7513a80906d5f789 GIT binary patch literal 207 zcmWHE%1kq2zyQoZ5fBCeCLji}Ic8t;E|~Yznt_qw|NprY7=UDd0|N_$?He4z5CFsw z5Q5!Q7N9H$g8;}x5S!;e5X9LQ>;cgr8$dMJ7AD63|0f**Sp&2TXbsRZ4hY-FH-rJz MLIwsdpny3S0OcGtc>n+a literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Cuiaba b/pytz/zoneinfo/America/Cuiaba new file mode 100644 index 0000000000000000000000000000000000000000..232ef670ff53dd575954275d367e9fa30129e73d GIT binary patch literal 1973 zcmc)KZA{f=7{~DgDl;55H#f%;!^n(4ym&~7%w33zh6f`~NSLKCM1vxUA!_15=WJu? zR;&lJNpo%)&fRWqqKoaG)f~~%65T`)=GIn?t=J5C&`$UF_N6cCo&U4L=j`mfVY|M+ zP}$ba8G#3$N$wloJWcM+=eUo*-qqUi=(@i;?iHGI!^`yi&Arl_{f+hxP1U~mKW*Q+ zD(Rm{(wmCIvC28+n>hSzo*p5h^^B*(^Ji8QI3vYydvYVgLeExjF}jksdrmi zOhVTYozwWMdAu#pCT8}Vxy{@4iD}nNQt2F2V!*Dtb3AIbXoK649JS$Cc9#A z!sO3r)%>%^WYxH_t3TNPw%jh)t%tYCn?1|5dS|iJoOw#$ zDtlJmZk?*NIkV)Q-A~$W@ncfAA;#8?-H`evzuEfhozgJ-2itJry4imBq-|^;ksW;p z?asYlm|fqu>wD#U%YmVlpK;jz%%5?@J)AOf&R%!Y$XO$&jhwgFoj7vlUU%xqxg#f!oIP^-$oV4) zAQ>PjAUSwl5=a(amj;ptk_i7NnINekxgg0P*&yj4`FLGINJd_l5|WeGC52?=b!j1a zA&DWGA*ms`A;}@xA?YFcAqgTGdR>Z0j$W4}k|mNRk|&ZVk|~lZk}Hxdk}Z-hlCRe# zjAZO}DI+<1UD8O_NZLr=Na9H5Na{%LNb*SbNcu?r$OIrW;B`}g%z@WU0x}C;Hx0-< zAQOSi1Tq!KTp*Ky%my+Y$b29Zg3O55O$jn5UN-ILtZyU$Q*gyBq6ipb<>2*6EacAOd(T+%oQ?O$ZR3gh0GU*Q|{k?b7j#( gp0ntv|21f_ZridLxzu2~q-CbbLP-r~-2V{!FU^EtE&u=k literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Curacao b/pytz/zoneinfo/America/Curacao new file mode 100644 index 0000000000000000000000000000000000000000..2d01c18860497141758685c332e130628cf1d793 GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}c_z#0DSw;s#)FaR|Ns553=IGOAK1ab^8f$w0}LEK iz99^ben1=?0@4EnAtadm9|%CEgJ|My-~w7^!UX`QpDpzO literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Danmarkshavn b/pytz/zoneinfo/America/Danmarkshavn new file mode 100644 index 0000000000000000000000000000000000000000..9feacfb1c9fffe62128c678397cac470dcd40f91 GIT binary patch literal 700 zcmci9ODIH97{Kv!%?z5TqhV$+UNgq^7~GJRoiwQ#DYumDNGU5>&SI3M#i#5j7M30x z%V8rcDW%!SLQRsCjg)Mz^PjR(%Eq~!^Sh7L{eSM<^3ss{u`10QHY;v6_jNn@NfpZG zrt614r6KVm;n2NAeAg0rJC|tbL>h1RrRicznhR$-c6h8?cK3Aars%fZx^7=t)gAK- zI-YTLVr)Wprbcx#X6vq+sI~*+V!w|__hV9eiec%!tdhRd4@n(7OaJzr3~XG<;95bP z#UpW^rX0&(;rsOpc;0JXDbFk3DF63ada$ZJkJJ2%Qni_^t7g;e8CRvvgHo2o7f$yN zSv<2y!y*ro2+4$`LUNTg$&hSFIwT*G5Xp$7L~YgP4 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Dawson b/pytz/zoneinfo/America/Dawson new file mode 100644 index 0000000000000000000000000000000000000000..fab060999850a62ccd916fc80d216c94daad8d2b GIT binary patch literal 2067 zcmc)Ke@xVM9LMoH1Wrk|&z2|2YWx_aK|-gNp0Kf6 zwc=AwZL6-2%zs*I;>hM^F>|Y}IhR3eEgN%fWvf`r+M;q?@8_r0Kehh#d;8quv+r&E z#p@Z_+}U2``PbuGLD6pDDEV;@pvA!{hzupIJIGUieGT`1Wf3YkAyE zFCA9CiXY64oxAnC*hZDp5Yh8ju22h#Yjy787Lzw8SLdhInEb2N_NK2En1b>7*8l!* zX5qXuAXQxw&;Ro|KwzMu{k zWT@bke7*9ID{9q;*L2;bkJRdsTzlJ@H`VP!zuP-rd0ySw{iVHY@C~!3Y0Tc;`kbjR zw{~s)F0=OM2^}hXR)r=`>4xl`s$uk~UO%-#-Sg_GZTzgug!dn|8{TO&O+Ji5b7?0QEO`GLS_hw{XhfgXs)bI7A zQUg7nba$WazUQV=uNkl6?#XfYyjXq26Kj!kzno?{_41-wUNnpHc=`H^$bbLa&z7G# zJO|})UzC#Pz*8^0jZ6TU0Wt+-4#*^sSvX}H$UKmV@W+`6G8JSl$YhY&Ak#tSgG>mS zkyECG%n6wkGAm?S$h?q=Au~g!hRh9_95Op(ddU2oGC^d9PMIPyM`V)7ERks<^F$_! z%oLd_GFN1>$ZV16BJ)KijLg_6Q%2^DOd6RrGHqnu$i$JEBU4A_j!YhzJu-b{{!U2% zk^!fr0Lg(ErFrEuD?KeEEz@@$J`$Zqk91G! zC*2$9@%+<0d81tM=DGUixx2qHO!4IWPXYf*FW4 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Dawson_Creek b/pytz/zoneinfo/America/Dawson_Creek new file mode 100644 index 0000000000000000000000000000000000000000..c3fb166b0887753eb80b078c47bf4c5876774662 GIT binary patch literal 1033 zcmb7?OGs2v7=X_mXG%=yCme`qaUe)-6ZD`mqD`Pd(o_>Y7KV!kT%{1ys)7u1lcz<{ zCOg=sAc}}Ukis?*)TW8b=`l?&8>W|59{*KHl^WP-& z4a;oMOMG_OL}#{rxjflDW}n)UJX`zN4x5LPOWv}%!Zmqbe&k;a zIeD4C>0e#B>hgEa`PV&XT%qrXf78+F-X7cM-)-IL-nVV^9~#%Vk>tZ%Z# z@zqkAztonpN%=HVwx4fI%9ncu`}J&2zFnX3qg{hC)|>a^$M3rDhlc#bflKbk_J03! z^C>sEvfEEJ^vkb>89!a!Ez?sc?eAhnW`+;iKlfXtJkV^z%PYj3Z?wVbT8SN9V5_>2x=KjRP@PZ3W81|kpm3wvcrk2x4YD?OrcIocXO{Gn%-gSb?k)B<` zJpIZtO}g9{hdOPW4zGs@fk=Uffyjxdf*_J0q9C#$!XVNjsyK)|h(L%$h)9S`h){@B zh**eRh+v3hh-ipxh;WGXh$PP_Z3 axIq6)yQ|yQs=dwLUL`&~Yc$4nHGcsaWcAYk literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Denver b/pytz/zoneinfo/America/Denver new file mode 100644 index 0000000000000000000000000000000000000000..f8908febf220f27b3efa68bcc119633c8efee299 GIT binary patch literal 2427 zcmd7TeN5F=9LMp)g90~@Q;8vb6-07=JX* ziZRO|P|{j6@nOxzhPsApE1ScuX)UzpvTXFQNdotF-Y4uI`@g<-KVHAx`}gOKYqe)> zhPdW}%{M$;r+IjnU3+u%8~q`w`^7lj^V*MUca2Z)X`U*2^DpS$w!P}3)^I&E?~nSS zs%UXJ)vHGrw2MC@-TF$XS6mr=T8{nT7UO5j<-~_M!gn-V`rnEZVrQ%jXz_`_XC`FO zh8PuGHB(P18CO$t$8<>AunKu8Q-{gpDs2Bj=@{9quDj5q!_OTP5yzYKwD)^N|R~3k;!u#cn>;!RB!U7pRH($*RbI6#$cop;8d>#8$n2H+; z)w53gq-GzysBi8$rRI2N$y;_DP;*!M<-Bzti(50ll(#K=SIm$4K*lF(5$`*%6C4{w z!te>5c+n+pAK0Ul&eW^qt`~I5;Zl{_SgX@sS)|fyn`OqP8ERp{TDhonRAt6LAn(Zd zOf3#clv%NtMb`J>GJEWt$T|6oyz}#Zv82zT@9OUqOWS_dckkLRa_c_P_cZTP_ZIi* z`>MC8ywsO0D|NEdUNNx}XXZFd$h)Pj-xK%E@lq-r}e^W32v_d%>TJ(eOEmg%8 z9$nHgM?JKpNSAs8)rz=e?OOSba*apovdojJ?As*ip8d6O4^ES-e1l?j?}&VOc%P_f z9+Hm?w2I2=BXUjGdhw|9w61DtQI91b(vR1ARCPqVt|=%|HJ7})Ha=O^o^oqXNTl-Y z&(Z6?`&F&)D3?#1o+h63X3M7zjEK6jSXtjTBsOGD$c=SJ#HOh8a&vKq*z6nA-mF8) zJN$*-65X!03>?#2N4@IVt{(l|S+{CvY|`6~=BUQX8ohmIoDu$$7L${i-BZIe^(Idl0#*YMmBLYYWIAVYVfg=h?7&zj91cD>vwq2Y)P5*(|E4iX-#i4PJWjtC(kLSlpj z35gOCCL~TsppZx*p+aJX1Ph545-zKW7ZNazh#?{4h#3+zj;JAFp%{_#pwbng}8xL?ntx7?C(4fkYySgc6A*5=^U!CK67oi6;_JtBEKQ zQjVA+LFI@l5>}45B7xN?B<@Jyk;o&V4-A<61O@-|diAUS zUeow?VVY-pZ%S`^KUsSFja=?DoxisEHu@sKVg3~?Ha{mh7p7#Sq$N4i(^Jw@(j0#Q DJ6nx# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Detroit b/pytz/zoneinfo/America/Detroit new file mode 100644 index 0000000000000000000000000000000000000000..da53d46df347ac70897f4f5c51feb83b6a878627 GIT binary patch literal 2202 zcmdtiZ%oxy9LMn=L|_+4C@EB;f{b0{KV3z=6$b2vdd2i&il#>c?+}V_Y7EM-7G&C- zb2`k`Sf(}lH&V0ZDyHVFt(7UO?9cGj7Hci)7(HmQaXas`p7p3_t>4`_uec2+ zV&x@CDmkr^c1@M5(he)1cSwBZDV3~yB;~6Yb?V8eTz#TjPk!Y|lXhT(PT$dFuIap6 zU)vlqQdj9S0BZcd86-k)qTbNp)Rq){_1K3Prs%_q~p8&z57f0i3gom1IIK9w5} z9#J>7d* z=8V6m=bk-p=6%zrg9E?F?e9LW@7VpB-1*#kUDXGyy0~3xs;gAZ zSicDsuGOKTou)Q*zOFsiY8H&<>V?nmkVRiqs_@npS^Rd6s#_hFCA|sio?x*oeRxDI z%Sx9>{YNS?J|@cpud3xgOg1aB&*~LtE}NAT{kq}skXbdnQ?KqmZtfdw)oU8}o3(w5 zwF$bP3^@Y81e>AKbQ#+(7RIHjt8zh>SuA-j=r8#j-HNTN98%I7@ExmJ1>$%JN zf%Yu(;J}b>tDi8k`?!86pv|VX{d#l8X|tuSQ*W8LB<&Tws(tvBbYym@j=@9H`A36# zq_0OFy%gJK3shO|5Ku)>CouS0uz=`Jed2Vn=6qUM%+73tmDjcH&KMQY`l2 z$+#4Er@4E|qHx5kS{CtYIQQDK#GdL1e}6CT?>q7@rV_Icb3rD9%m$f`)6NH(5HcfV zN=`c`Ud^PCSvl>rka-~!bK039Q$yy4Ob(eHGCgE|$OMrYB2z@>h)fchB{EH9p2$Rz znL6!Mk+~w1MP`dk7nv_IVPwY0l#w|jlSXEZOdFZE(@q?jxzkP^nL9FhWcJAPk@+JD zKr(=&0LcN81SAVc8jw67i9j;pw5dRHfg}UT29gdWA4o!wj36mNa)KlU$qJGdBri^z z7$h@Jn;IlHPMaJgJ4kwv{2&QJGK8cE$q|wyBuhw|kUTkUqL55EZK{x5Ic>6#Y$54F z@`WS}$rzF{Bxgv{kgOqTL-K|s4#}L;rVh!S(NxNFMR1+=$cy=Ax literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Edmonton b/pytz/zoneinfo/America/Edmonton new file mode 100644 index 0000000000000000000000000000000000000000..3fa0579891a9762b7c131ec5ece5d6d02495bfc0 GIT binary patch literal 2388 zcmdtiZ%oxy9LMnkp}>tlrxHU!BP|I6Mi>RMixs4Hr-gV79MKa` zWy~@ORD#wDQ`cy0pgG+7qjT5gvJx#Ton@mxTP*C}&ig!K>rs!|`riHS>v!St=j~eM zUXw2VansCSc(~Wi!~2XE#!j5?8XVAX4h5_3oiFKb?>4pP#Y=i`+jOz7;S=4Pc~res zc2V|4^{W1ik7d8_Bk^fRnD);9y~$e>Ej};5AWz4AE&iN%MowO;6u!Z1>F@KdQO! zU)DGE99MCkIr8SM18QEmU(Rp%Ox%+Bjl6Z)dtyP4dFNL{V#$7ozH4Z=Si1cuefO>{BDe8`zNc-My0>`0zOQz(%3Jud z&d*z|@_!qZ18x9bN#SgMMv+`6PQPCc}w zNSAs7RatDZc9nmpTvsD?MdmS8@qLo4oO?l3jz-9pzEQDi-?)5utWQ+6dF3O+9iqDS zkX+rhRy^uFscYKX)nmyA^yBqzRU5uT*A*10x+@-CAD^u1k5_7UaHMj-o1+_k_(iSl zTp^!086lqZWXq=p#zkXAjBMKO6;EgWCD%0`66>SR$qmJwVuNo|d$JBF&)8YLF?xsE zI6R^^O?cF^T|N4_FDg}YORL^In4?;%>-3hLu_`cN%IBJ(DLpT6eGjwWa=FtboO$LcGtUb1l(@`ngb1)-u79yKzd6>1EDl*6vOKFsS#2nq)JGc zkUAlSvYJXErQ)a+QY?;YA?4zz7g8{eiXkOKYK9aIsTxu?tEn4OIIF1~QaY=t9a21w z>LKMr>W35%sUT89q=rZlkt!l(w3<31g|wPVBBivNS|Y{ds3uZQj(Q>m<)|o9QjVG; zMMbKLlohEfQdq00EK*vlsV!1mtEnzhUZlQAfjKISl$fK&NRc_JjFg$9&PbuHrqW2M zt)|vUv8|@sNV$=EBLzn)j+7j!IsSi(?l7TWY=WQU%t%R3NlkL5rKO~$q&ofvy_=8y literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Eirunepe b/pytz/zoneinfo/America/Eirunepe new file mode 100644 index 0000000000000000000000000000000000000000..4e586a341f3a652bc6db845aff22bb3f9d8b9be4 GIT binary patch literal 640 zcmcK1txJPJ9Ki9L&fp^|f(Rn&T-M-A5YvfeLGd?yk{C<_{{TTO&L9XDlPDIeOG~mD z;BVDR^F&-b2d_j&x)jntI-F;REIVq$Kw?>oxur*pk2 zm20h;{IkeqKV06r0f2%K)^PGL8ZWQS8yr76l4lC1)Bm+L8rjef5G?M IpP2E!0B?Q}`Tzg` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/El_Salvador b/pytz/zoneinfo/America/El_Salvador new file mode 100644 index 0000000000000000000000000000000000000000..ac774e83f46bb2967f587ea3175d6d2d95a15387 GIT binary patch literal 236 zcmWHE%1kq2zyQoZ5fBCeRv-qkc@|$?rl2tE&I84m*#Syb`yMFU)CMpy0^$GvYZ4e3 z{{P>(fsy6^|J4f^IDC9V7@S>zI5-5T69hs?u;@P!fGh*)16c^7L6(AOki{UHB+I#g I?l9v508!&K$p8QV literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Ensenada b/pytz/zoneinfo/America/Ensenada new file mode 100644 index 0000000000000000000000000000000000000000..fffdc24bfc4c076584787843a5a6b457a23c5bf2 GIT binary patch literal 2342 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 I+rEAO1p%4dkN^Mx literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Goose_Bay b/pytz/zoneinfo/America/Goose_Bay new file mode 100644 index 0000000000000000000000000000000000000000..83e5a9b398fd1b600e8f0a72995855dc274d0bd3 GIT binary patch literal 3193 zcmb8we@v8h0LSq=Q9u+0f1+ZFnxG;AN}j(04C6qMCj~vsACHO=c%~VO<`d55CTwkP z&L3$GZ8^a|nkgm!B!TZ>gG8 zQGRwwu;bi-o#oDiyN+)<9g8?Ww9aw<+Kz||rW1~u;rCY8$j#2$;w0CPsXo@a*GIZ8 zj%u?0Wc7Esx}LLM3U6^;`u(u=anipfe zRy5Gon9|$&>q6bu6mj3$oE+l%tyi$~`p8GF>$mSZTYT$XE!B0-Kbk9D?xQE1H_je# z-TboBdh5s+w$}XzthcxAx82$FuJ!J!&9-}sbFB9>mf0S}zij<;+zeY=#8PM5&ns*X zdq&BR{Aa3<+ETU0*T<^5D^h#n?5VapdT5@q+p1}It7hI>t9B}^(R^07N}c6fau=ya z@=d6g{i2Uc{zEI|u0gw`0Mkx6pmn{}O)HeUU)rGtp30Vce6~*Qd3dcBw8y3fm(0_8 zZJ4a~&YPt5$qrTfrVP^hS=!b95l^&`VS}Ur{#Uet<|op?+qyjH>J=%px9ePtA3Y?5pVEqf^}B?R%6_0b|^w8a67U zTLRrd+;&Kb|G?r-SXHbfZppGw&&XF^ z%9&_S8keTbNE%?DakofM9vkOQu9fwa!2a%(is^c)`=NX0zQsz~#eVj5B~h96X&)(L zLA)&Od?39tHB6qp)+Nme^^r5PPD+`No8-B1`=q%|X3h4TL$#f0)Uw<6s`C$4X|FaY z>Vhq0+QQ03>Y|(yZE`(2cr z=i4OZeHU&%($XKBk zv{%dPEXC5gh6;IoNWQeba;LnZElqm6v{2sYijtI~Z228WkW{p2io9v}9m#C!k~nagjrV^}ng6{<-NX~zTo=U6 zIm{!jMboB^K(-0lCuF0LokF$>*(+qTkljMI3)wGZ!;l?AwhY-bL$PVdt|8lIDE1B6 zIArILtwZ(>**s+TknJ-R`-g0xq1ZuW3z0oUHWArHWE+uvL^cxHNn|ULy+k$>*-d0S z4aI&U8)_(a6xmW_PmxVUb`{xHWM7euMRpe1T4ZmL%|&(>*tm; literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Grand_Turk b/pytz/zoneinfo/America/Grand_Turk new file mode 100644 index 0000000000000000000000000000000000000000..733c17984b411c5a7bfdd87bd550a1db2d34388f GIT binary patch literal 1871 zcmc)Ke@xVM9LMnknK6VJ7D3CAJKFc^VhV0N*%McYV@fs{%BDj!zxu!5+jo!K-M{bW zE7q9UQt5l<8DoFp<=JarzGruh@AKszZ8j6y-_x%o!sgYr#X2t%Ft5$c))NEcOnzZN zUe6phlhVh@q=#8*@}I*}aPMC=<=P$bpZ`g{@!5Hqn)I1B4|hpn!(V3F)?WQq=%$&z z^b`Gd-WgL=yh|62-cW(81|1muQWgI*N6+Z*R3!s3DeXz9;KkWe)={U*yYi(X9ygUc zAIr>e#LQaxyM&5nnAw&6GUufnQ#JWlT{ZN-nfv5BJ@3{%Gyk_9UETYiT5#nfz3}*5 z_0FlydQsa2wfM*(dAI&kwWMj2)RZMvZOsy?9XV^lr5km4;FyWzEY^{Wt!C-)G+lT4 zs9N^(B8eVoQOmzAl=}5iwW2#i-mflGEB6e^s)Ae)oS&sAN^QBnPjlRDMcQ{hzD$M~$+t=VP`1muflC5myH<`K4n+L>)Tmlk~I~ z^6|V&_Od+h_SLiu&%1oimsuB$`D$zIyDDb?;fX!}L^JGPygVuU^8IDcK8a3$IdZN% zoGfy-$mt^Ii<~fW#>gon=Zu^*a@J0J+Q@k$Cytysa_Y#rBPWlXJ#zZU`6CG+86YVj zIXG<+NES|;29gJo2$Bhs3X%(w43Z6!4w4U&5Rws+5|R^=6q1$GriJ8%B!*;$q=w{% zB!^^&q=)2(B#2~)q=@9`v`HdaI&GRro=%%6k|~lZk}Hxdk}Z-hk}r}lk};AplC#q$ zjb!b#X(M?%ZQ@AgNa{%LNb*SbNcu?r$OIrWfJ^~02goEKv*5JTfXsu_P6RR&PCFII zTp*Ky%my+Y$b29Zg3JgqCCHp0lY-2O(@qOAFHSo#$jmtH)F5+%Ob#+T$n+rdgG>-I zLuq5uU&zPvzF)x(*)_5|WY;Lutx@(eyGGA0lFyfA=P6`osw6rySQ#uYiB?nuD}v=& FPXWmk_~HNn literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Grenada b/pytz/zoneinfo/America/Grenada new file mode 100644 index 0000000000000000000000000000000000000000..df1b6895f9c1f38580293eddad9f74af2e87751e GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOHFNn!l||CkH|!~g%s4=}L!_=Yez28VzYF@%s{ P(0?GnYZw>MR1+=$TCyEs literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Guadeloupe b/pytz/zoneinfo/America/Guadeloupe new file mode 100644 index 0000000000000000000000000000000000000000..15c0f1f7450c27dcc5971c9769455758f1606817 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVN6xxPkHi|6>6R4FCThKfu7^;~T=@7#spp#1KM) PLH~gOuVGw3Q%$%4?mi!V literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Guatemala b/pytz/zoneinfo/America/Guatemala new file mode 100644 index 0000000000000000000000000000000000000000..6118b5ce2d95b66dc88cc40c7470a53105dbd6c4 GIT binary patch literal 292 zcmWHE%1kq2zyQoZ5fBCeP9O%cdFIc3b%#B4O#=JbX%{4QDiS2mKM7EO_3nYjiI@v6 zAwdbQ^4- A_5c6? literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Guyana b/pytz/zoneinfo/America/Guyana new file mode 100644 index 0000000000000000000000000000000000000000..5f98c4a0e88b3bdfa80996461f4662dd4d0adfce GIT binary patch literal 256 zcmWHE%1kq2zyPd35fBCe79a+(d1u_L?D%PEw}-2Ci;a5yZv#dqW|sf|PgXE6{QrO2 zg#pM0lAQnlU%db#j~`&*^zjX0aCdSC5|JSwqo5#!1WW$|0mxzy4YC|$1jqp(nj%MV J0o`Q61pxc|L;U~% literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Halifax b/pytz/zoneinfo/America/Halifax new file mode 100644 index 0000000000000000000000000000000000000000..756099abe6cee44295a5566ad6cd0c352fb82e64 GIT binary patch literal 3424 zcmeI!dvwor9LMqB+*&Iv3>mrB(9CyZS}yHNw1bTgHVm6jB5jH#bIBT=h@DgD2<0+F zE){-jXvqBB9lCtBp(*Ag*F>2l*ZulDKmYbe$2tAkcjvpu@9b=6|Gl2?#35-fM|uA7 zR5d^0TczsIIfqlj81N7U?a# zzS-S1??=a1a?!UtHO|@d{v3C&$aVI;mf`MqraK45cXkg3k8lok80$N9JKKA>uJ9c` zA-zXt|167}-^eJIS5-;oaedVNUL8v+(8rtPsUM;j>r&5rbs{87pU|1=WZ6`CYW)OJ zR+u7B=L{4&H&&iWixEF(HZ?m(0s2z;9d)_dS$(~(uefLrub+0sB z-#=7SRTR|F{m$@^@KP6pLzZk$lM6ECQS4%ZGy(iXhJd z8FX#3ctlTyF#ttlNnl0@Z>TP?fJcwKbs`>uR`M_Zr|Mo;LsajjQ)T?|D3OqrBKvHuBl-@Dm14n7(XVq;**~*X3}{$cCMInciFeP- zfzeCF!1Dom@Dl}U@V>J;xni*zvU}2^?L9ob9?Ifoyx-KdOJm6R5Di8Pv5Bd-O```Eb_eqb(??0vjs`&i}eV#!3 z`BD2lI6fiK)3v*K2bgz|c}1cbDvu|?eoK6SZS$LleM2@5**RqEkiA1T57|9r`;h%Z zHqdHz5ZOYj*+XO#t!5XIZAA7F*+^t3k*!4b64^{-H<9f`_7mAqWJi%LMfMcgRIAxl zWLvFfUy+Tqnw>?q7TH^5bCKOewinr7WP_0%Mz$E)V`P)9W|xs|wwirLHX7M!tJ!K~ zuaV70b{pAlWWSLOM|Rw5wj9}WWYdvdN46c=cVy#{okzAF*?VO3k=?hN?ML?CY8rra z0BHfz1EdK^7mzj}eLxz4bOLDw(hH;+R?`in9Y{ZrhM?^TA7}}W=?Tyjq$@~UkiH;| zK{|u92I&pb9Hcu|(;lQhNQ00LAuU3Bgft2164EB5Pe`MXP9d#AdWAF#=@!y1tLYcg zFr;Hh%aEQSO+&hdv<>MS(m14ZNb8W^A_I^W^Fd|ItM3$hX6EV1ud2Q7X=|msrO^AX zbEKTkyyEq|e@VVi?DYm$#pqyUyL)whj$R!o_Wtb4)S=d$?qA3D>$Qe;?r?{rk=6mv zY3f&B!!gglxl^My^t;ikev+8LSTEK+Dz}Zxb4MiYlM#b;UYye)alfv2N1hK${0}?5 zQC_~>et4aCN85WcdV8~bXVEWuS4F!wCcRt7F52TIl)j?lrq_AnGuP;Z*fMWo;v$`R zG26R)C|MIvt#t3{i_=L5vfRmAi{;+kNp4a}K&I6A-TM|4>C}P??zE}1_5QTu?(~G$ zb;kI9Z^m$|BoCg}2hQ!12YV0cLr1D4rM*#8_XZ`cX^YORpDD98muPxrzGgfzPiN<* z>cj2|2~0X8b21LfoNMheH?dpiUhL6FhCb0pkAJS2eQ)Z#1E*#Fmm4)}_aVt{4yjwy zC<}7}vhea7nmcX0u{7Dru`#h-~jHqa;eE!DE5dr*Trc4@)a1zNcIyvp0ZOVPYB z^7sp9r8x15gqD6Gp`l(`7HE-W7cT4a$sM}9^Ng+-epgFAXxGwn+jQltd$jCGxt6b~ z(X4Fbqn>$6;Udocn8BtRCZIXmzf0ppaep!Ft)N4 z26^$1C9-vISnAHE$+r4@+1@c)>dRB*rKaD+@4ML><-6fVN8P#`iL`l+6N#Mge9@7} z;e*bI>u-L^3x=EpIp!%2nawypA8#l0|1*mbjilOY za*ZV0YO;-_+iLQSBpk^&l5!;HNYat4BWd?V`ET|{`){~0(YNlJ!gkSiQ+U&M)AN7Y t9&Zb8-u$w}6#ie8zn*y~&SXDe@}Cl%otBX{Yv!z!V0wC5y7@|v`x{(k@F4&I literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Hermosillo b/pytz/zoneinfo/America/Hermosillo new file mode 100644 index 0000000000000000000000000000000000000000..26c269d9674847059472850a5287339df9213bff GIT binary patch literal 440 zcmWHE%1kq2zyNGO5fBCeejo<1MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9!8}SA_{T zCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;7FBNG@hGqQl;|Nql}Ffjc8KX(EH z%m4qY7cg-A|KH!hzyo443P8ktd_x#~gF_gcfj9t&eO*F8&Vhpv5}f`Y2tdvU(I78? zXplERG{`F;8sr@?4fGO-26+oaL%asEwx9t-g1iW#LEZ$>Ag_XGkas~e$jcy_M&9NE IhKV^B0F_3Lv;Y7A literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Indiana/Indianapolis b/pytz/zoneinfo/America/Indiana/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..aa3dfc43730ed25bde9c967039951f5c2fc15cc9 GIT binary patch literal 1649 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Indiana/Vevay b/pytz/zoneinfo/America/Indiana/Vevay new file mode 100644 index 0000000000000000000000000000000000000000..de6167c08291f6cc510f655f2e7dc178d62b0119 GIT binary patch literal 1397 zcmb``Pe@cj0LSt7+|^356bw8p9`evd*FPad7#O;U<@zUAGcz4aTTIKT%(TorRF;=+ z8WCm`B}EjJVI8C*Du@V_A_!~>@+OSfp@{Z1-=RZL-JHj~&tv!c{YC2A_U1W%odoj> zms4pj-)W=QGY2j|`Yy-LtQxp-@q>JIHa0Mw@l{SYuh5_SHx0xl1KPXcDQ6_6-N8>P z?x@l}854f-Q^r>+QJmc^L&ZfRv^cIyvYJ%M%#bck+N?_Nb?7bg8EWgLbF%DRp$PZ2 z%kl?nMMXncRu20`RYA7gc4SUe2U29D=B0@ISd_K-H%0B2)w(YIxvG1%pm)T^RsFRY zy>oU*HJqBzyQVr+W6Owc8ZB2Md|x&Xwu{|a!*WkFELxI!WNS&bXq~T@(RC>z`no{2 zB`k`z+v#%O+*{E;yis?&Sy21C1Ny+78P!=6)AIa;I+(BYq0SL?c+FGYRne=uVjpGq zhGEe?`$YDn^@yIStFrf7y*M^{S{{F2Ao}{F^2B7i=x;2QCoed{aUD0#=lbK9=<&RV zcU{NxZjCv9`@P)0SMqj}J@3V1H?^oZ;uKYzyWQN%h!Zm3A@iF#E-&7Ze>bqq{LAH3 znag*;GpErP8$)_Pnn1ch+Cch18nK#AkXF$4!UxT8OgBI~NIytJNJmIZNKZ&pR?`*I zmeuryG-frOA*~_3A$ zi}Z^$jC72&jP#5&jdYE)Z8d!(jayCUNb6S9JJLMTJ<>kXKe7R22gnwXJs_Jvc7bfe zYW9I_#AW?wG r$#znyc2a3&VKb%w&+7NCAknNX->fY&ygry0%*hPr<_2?vIf=gj@u$3K literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Indiana/Vincennes b/pytz/zoneinfo/America/Indiana/Vincennes new file mode 100644 index 0000000000000000000000000000000000000000..b79f6725b62a3c16ef4abecf92a92b67b33d5579 GIT binary patch literal 1677 zcmbW%Urg0y9LMqJ$dS@zX;XJD7#Dfr+W2eHn#0W|j8PtuIQ~O~#{$m?h{qC!M)uf*4l{{{aKEoGxE;`nse6HT1%?A+US7JSC{+U0`(2<9O58nO7eDhW&xU}YuxwLnQo9IZZ zA2!}_HnlsLYEGExo(;iol~0)~$qjbq@tB#dC{pA16%&1~a@jMs@l+7MLu!lF@z2fP-WL5r{(yNg8P|==x=d3=p>CS1HOaLrbn@F$)0~~w%_F(y zrP&{K%fNcq`rW*3>&$U4k51V3Z5e0!$L#(R>t1Oew6Cr@?+#QQv2k+MEL#a2-YnMxPcTdv1ekxb@)K{9r?s!T)TSDFcF40ep~~gETz-=)!i#s}{yUQu zC?2jRdHBu=<*Luh3?Z9Cc86>a*&nh&WQShaBC&V{GZ=Mf!&n4Rj_K!4xbl{a1xah$v zO(0!(r46JHq!FYOq!pwWq#2|eq#dLmq#>juue5~pcN|UcMJ{hvCRPQwH1L&DOF=9zHerdqX>WqBk-o2GcY%u}qW>M%-B4s}5!&)@HR;zGi9;eYZ!pMRd)=lA_3 z%PNXzf%?+dxc$+}++v-97)*-Rruc?*DSdb)P(; z9_;wTJ#4XI>QJ_e_C;1Trd+W3x-HDBF-3(lOi|B4RXlQmEpFfDO8QT*CBIg?N!`Qk z)y;3Kw&hD2-GZj6RwsTl3pZEkMI#%`;);Y`(!bU$ zEzZ+RyUR?)h(WsIY}{04_UOv}F|)j@LsvC?-Vv6KBdh zTi)qORV3d<@|!#X7kBc_Qz-wr;^nE5m+$OIp7QimGcu9LR3ej!OeZp-$dr0zQjuvz zCKj1mWO9+|MJ5=TVy{dxGR??DBU6n`HZtAFgd zhSY`>hg64@ht%hl0+9;6QX*2LSBgZcM9M_!L<&VJMM_0#MT$kLMao6$MG8hL_Dab} z&0Z-QsoE=LBXuK%Bb6hiBef&NBh@42BlRO20NDaw*#yWo@XAI&wt`nS1F{{E4S{S4 zWK$s90@)bI)<_HFq-S{eeDmp*DJMwde)|(e2hK6TvOHvM$ntn)Z3F}T@)+!wN7j^t kERFwOATKuv^pm|(AbTYz@j>qB+)+7+{QTVf+)@2r02@NJQUCw| literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Indianapolis b/pytz/zoneinfo/America/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..aa3dfc43730ed25bde9c967039951f5c2fc15cc9 GIT binary patch literal 1649 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 JgVOP#$X|a10A&CG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Juneau b/pytz/zoneinfo/America/Juneau new file mode 100644 index 0000000000000000000000000000000000000000..48bd37e88e273741eb5b7df37417932f670a5e00 GIT binary patch literal 2336 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 UyaUs-(=*e&Sy|~>>6vkV13*u>o&W#< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Kentucky/Monticello b/pytz/zoneinfo/America/Kentucky/Monticello new file mode 100644 index 0000000000000000000000000000000000000000..fc2f1b0df86ece6228927ba6062f03ad43bac2cf GIT binary patch literal 2335 zcmb`{Z%kEn9LMqBHg(hC6@9uQ*)#m_{9GCXdY>DJtY z(EbczwnjB4Ni?lR+M2okERof07M&i%nj88fdQf5a_Iv-_SCgJ zmMi{tLHb{KxnBM99XIe=x_#u`U*+Jl3+-Le;g4<>L2qY07&t zP56c*lsFtATzju7zwK9r|CVqW(6GP`th^$Fie~KK?DI1C`4l@e>VynEc2tC^KDof@ zwZp$2Q4y!N*$Yn{RFSVA6j3jBsOWti;)d>Obz@7lh^ft2vE}*VrWNt(=G1r*m$Y0i z3b`iY{T9jipW^Jr-_Og0iQnv7&U`Bq-}=VBb?5_mTW6%WebVv%<=)XM*SwQtRjhZ*%KiZBp~5V=cH6YIE+JZas?J%S`8ipg_l8ydL!_!n zJnPhaG^=X8!%p3+lj@PF{m%N`W9rfIHmAPnklHY?#|zd*HpG3z|unV_CHKIybqd6hgc=4{Dx z)RXOpoUO4Rs*Z|or^EZ5?9A`CI;YOauDC9%Yy7C}{-w@(YG99i`eLEAqo-Lub28ED zsV|p14+~4Ugv-xg|NPGS9s`R7Rm>;L8D`t-|pf=^$)zjqLs7cwzqX2{f#xgnD?>e(UF zL*|EOf_yMTPEV0zj>sfAW{FG_nI|$)WTr+vRb;M4Jz0*~BGX0Yi%b}qF*0S2IU|$i zm^CtOj(H;!=a@M%b&k0sljoSdQBNP4Kav0>14s&x93V;H$O4iEjyxcV;K&4$3XWVD zbuy4_7{!yGJ>Q8$qAAaBr8Z-IP!udh9fgbYB+L(B!?qAMx7px{2&QJGK8cE z$q|wyBuhw|kUSxYLNbM<3dxmGCkx4zQKt*Zmr*AS$rzF{Bxgv{kgOqTL-K|s4#^yn zIwW^SojfFaMx8z+e@2}^B!fr_ksKmPM6!sa5y>NxNFY19ct zGHTQ*MRJNH70D`+RwS=TVv)=usYP;&Bp1o9QKuKluTdu$$*@tU7|Ah`WF*T-nvpys ziAFN*=hBaVfPv5d`~(GFx5wuj(E%}S)}7Y1{;Siv-%+O4F{ajWtKGWN|6c4rlMP`y Z;(0pe>F#BjxtZDN?wp*=oXqU7KLARimL32A literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Knox_IN b/pytz/zoneinfo/America/Knox_IN new file mode 100644 index 0000000000000000000000000000000000000000..33169f4596381b700b3598dabf7706dce25f65ba GIT binary patch literal 2411 zcmb8wZ%oxy7{Kx80*W9gnHZ9RX~hgAu%Wc!)~1eK62ZKH3Sp*(SmsfYM2(JHlYG%M zZ3?a-EONPKXideo(9~M1IYW~ml>pP6g&d6+q;_xTd+bG9Qmj7Q}re9Wc5>V zyuMtJVXkCm$j?*a%+-WAxq5SyxfUvNt)<`ma-~~-Z9QpvzC0<{k9Miv#!hW^pHMfp z9M^pds?@Fi61jcVYwomp<&UotjlU^T0v|*gsg4v+Rj&zpwO4{yMyQa5L-nBC>uT`R zJvubyTNV0Nf)0!NScUC-Pr}VRYG~(n9nrquL>^nChaK5whVR`bQ8i`ezRhJaq9Whi zUz#r?=cSuyZ@P?nD%LzOAy#6>O;MwV+>zLz(JJ<4jDE1|wi?rNOF#7aMHP48f{w30 zs>YTNmxnjjt8sZZWc;$v%p+-M<MpQg*tb~2sJxns(yA&pPDl! zUirC;ytq%5b(l=*vfd3u8??>Md3#%xk+n-A!U{-tVN z?RLGsElX{vT%%uWN>Y`@1^V^sVM;vW2@1Bid%Z&L`R;(<3>on0|M;Ci;K+WD1Ogw{ zNr*cSarX%B5_R|awCO&XHpgBC_R96i412cY;l|xJ@Uq!Iap7Wi*^6^bz)o?nzmBqa zl;xu=AY}c-9uz<*h)^JLwU|&qakZ#0z(T==0t^Ki3N#dK7{H;R!vGHj9|nLZ z2r)oJ!H5AQ3Q7zxxmuhkKv9sQKt;id0u}`=2Dm7AF#twEi~%wVW(=UYTGS}8QE;OG z=W3B-fX>xo#{izIMUMeK3Vsv-DF{*^q+mz^k%A%xMhcD;AYCnz6ewLSmJDFJS~MBp zq~OT_C|fG08EnQy`~cP63^QItBJ1k9`G)xNsc!HRxZS z5BzEObkIHC`%k|X2z>N4?pWWg?AG_c$?l1AzK^{7d}g+FePHANLY{=%e*u&2$C9$2 SOrDgSl9ZjAnw*-P68%bdh%NXZ2r}EHQ$RGx8ZZsEiWz1X&_O literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Lima b/pytz/zoneinfo/America/Lima new file mode 100644 index 0000000000000000000000000000000000000000..a37eeff7de59cabb56b583eec024d09e7ee6e2c4 GIT binary patch literal 395 zcma)%FAKsz7{+gZii0tWVA=$k$sq{#D=S0cz$L*d*bGLyMbNJJ2@Ez73xppJWA43QS!1@5{yxuIwS^3PLj>C$*R|48>U3aCsZ?sFQs*P9^an8$;Siq~uTtXQ z-AuZ|AXOUdZAFs0L39Pt7er?ey+L#@Nd4&_3=Rd!1B43*9}rF;yg;}WBtOm2 RON#^(2>zkTm_^P#>jTuEeU|_L literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Los_Angeles b/pytz/zoneinfo/America/Los_Angeles new file mode 100644 index 0000000000000000000000000000000000000000..3b7ce1dceebf9fa9db859068da1fa7eba6df1cfa GIT binary patch literal 2819 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 UyaUs-(=*e&Sy|~>>6vkV13*u>o&W#< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Lower_Princes b/pytz/zoneinfo/America/Lower_Princes new file mode 100644 index 0000000000000000000000000000000000000000..2d01c18860497141758685c332e130628cf1d793 GIT binary patch literal 194 zcmWHE%1kq2zyQoZ5fBCeCLji}c_z#0DSw;s#)FaR|Ns553=IGOAK1ab^8f$w0}LEK iz99^ben1=?0@4EnAtadm9|%CEgJ|My-~w7^!UX`QpDpzO literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Maceio b/pytz/zoneinfo/America/Maceio new file mode 100644 index 0000000000000000000000000000000000000000..b5201e81d42f9256adcb7125469509a08d77ba41 GIT binary patch literal 742 zcmb`^KP&@L0LSsGe~F4ei@~5CO$UkLQPK*7*a!n|z+e(#Vla@9kT6M%BrIeK7+Ew_Q{;KyTP-Bs`f*Cl7j90gxp}YNIhdW}rW)>@RD43DKkB8s?}|)%PiF0~c-_^`Tltj8pG?d5nt&>d zw8=u^R22Q!PVu0iKAtP&=hmufyx5k3r90K6x*QR{RL$#ivZd-=1;^{0;KPClMRHE) zCL!e7vTSc0R+0Rf6OC<(?#!d?&JBv5bM5rb*QgTTFE6d#4a?H{G3zVS`u57I92&N* z{?RcWHveso{f9c*9102Px=3N9vZpDH z)b=#Rk?Kf!{*(I10>}!;6380JBFHM9W*KB1PqPrR60#Js7P1(!nx|O~Sr7kzLBAO@ G?EeOOlO$IF literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Managua b/pytz/zoneinfo/America/Managua new file mode 100644 index 0000000000000000000000000000000000000000..f1c35040ce46c190d6def6984a7391616ce93a28 GIT binary patch literal 437 zcmZ{gy-EW?6h`mv#t?(xhFGK!wDqqrg{6XBdUi3IzTI@K;djw` zJ9q8%_oDqcbW6wAi_0&&ZYBFDy02eu`(RvTTe<7`v&;U%;V6ouL={gM!hOdqgu5H7 zh4A!X4bEt$nhXZsvVCuTb=LDNF^T_s-MXG>lB&7S1tq^)J%OywBkMyHAQ~m50?{cc zC5RS84Wb88glIxkA-b?qPU4y>Q9(J+<1BMI%e-_pIm8yquK0+>;0Ay9)#t+3 zk}bZ>nTy)KuFRB7CG0lU!6#QOuIr#RZfZxNeh5xY-OuRP!=!ub+|=)G%Y5{uZDV=X zG|IQS>D68Htjo5-0rQ#9+o7vtGraR?Qz!FoWGb+ud)sEL_ui)6rJ2ax=(fbKPZX6) zN=4D#b)rM=PW3EieU-_s@bOt8$N$6DNDh0E&9Sl@*^cZ-8pKKmq(!XsK$;+3kTysk uq!H2yX@&Gcn#D>tq+P7^LmDC-*-1;JC(;z@inK-gB8~CCI(w3Q+WQ7f-vFcl literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Marigot b/pytz/zoneinfo/America/Marigot new file mode 100644 index 0000000000000000000000000000000000000000..15c0f1f7450c27dcc5971c9769455758f1606817 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVN6xxPkHi|6>6R4FCThKfu7^;~T=@7#spp#1KM) PLH~gOuVGw3Q%$%4?mi!V literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Martinique b/pytz/zoneinfo/America/Martinique new file mode 100644 index 0000000000000000000000000000000000000000..c223ef5c2011dfe531514dba8262ba3be5552625 GIT binary patch literal 231 zcmWHE%1kq2zyQoZ5fBCe7@K$E;u9{yzIhHJCSn^HnHc~7KemT~;s5{R2N+oY|G#>H zk<-o1H-y147>Hd$AbJ@>u$#{Ulm=lCfUyPt13_lH$Po|?vI`^$vJXT<>||zwSqik8 Y1#C4Z*lJ!Mpv_pUXJFt0y2peI0E@6U5C8xG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Matamoros b/pytz/zoneinfo/America/Matamoros new file mode 100644 index 0000000000000000000000000000000000000000..5c59984def290712e183eea0655eaf8dc7a133b2 GIT binary patch literal 1402 zcmc)JPe{{Y9LMozB`A^wfe<7L6?kYZH`C0tELTHwnmYfaW>)Id{_H7rI5T@7(NlQ{ zOeiEoyM$PmVMG#Emnb9%kq$yh5`pvtMMC1Q=l#2O>JWX$kJlLN^m~5-HLcAa@yD$< zzwmHX=HdH>@#y=8Z57|d_O_?m9SjRkdz?)7Rf|1kUt~sVw#f9nmV0B9MAp{NI%{c7 z?ECdfXa9&%`=c{DXL42LKDnt63@)gHccjh>JyVDJZpgzWqbk2KB)z-))Ddr~Ji4h_ z`F5mB-^z7S5R)hi=9@&};!k<(?rl{xS1kQK5mg*blO=Vv>iE!RS(=lp$~wQx@}v|M zsF;(1Rfnp~n39#Bl0|j$J6-)!h!bm3T{HGk)GiF`y1p0ULZ@e!~jnwG||BO04 z5Rqqgjj6N2TG^P;ubOo@Z6t3baU^pjbtHFNlRT2Wtw|rr-_}e3nE^5djyWKc;Ftw64UTyr z6XBQ%G8K-w*qX^8v#~YPLFQv?CWOognG!N5WKzhikZIw6o>#nCTc%l?)1U70xYC?{ Lx7+1*rN#dSVcugw literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Mazatlan b/pytz/zoneinfo/America/Mazatlan new file mode 100644 index 0000000000000000000000000000000000000000..43ee12d84a7c7e47aaa92406d01a539ccf93079d GIT binary patch literal 1550 zcmdUuNk~>v97q3_4T#_^8mK6uf+)l(hX%78(kws6PcyCjEc?u|)HKlsy-)~+a7pLC(?eR=!Pu7NIZj;A}m*VE%4>FF767<~Al!qeY;eNd!ahZY}FVU<(#q9m^h z&-|t%=C4+fVJ~#lxP@x*jIXlzoxfW0^SLbjGSMvSdMeQ!erEa2R*7l)XjZh;%gVCH zCiYN^j!Ww>@kIx8Lhy03Dxp9p22`1(d9ga_TeC{`ovV}kE7h7eWAxgdY?bn8j<`-m zsnn~!l2$WKr8mBnjKT<$S$a>hVy7B+$`#3;{oUjQHp)7AX>uoD(zye-&H67#bl#n_ zCcm##Z@7F*ZR||dn+~5*1t&tZr$np5I+tut-mJE43YMY;32JN11o2MvnBtkArFbaL zY#Z*AlHPe{`>Sr*ac!(Az57h>Y<_QcUF_6l6%R~#!%1C{_fGBh*6PZo_f=J5zTPvv zO;rciNcE4SswN;$YF?D7+E3B4_eO@=_hgprKflu)XcwtFm}csay%wKQ&Kd3F`wxy~ zosJfgC7JuG-)X4V~ms?y}Zi%;Vx_w;TA(Apg zg~$pK79uS~T!_37fgut*v_*!W2?~@uhb)wx{v#RBV z!#W^`d;Q&;Y4zx0Qa|4Q+Dz<7>xsp)YI5skJ2^gPrpgcW^sTq*$-7VX>4h3IGgYtc zK-xST8PU)8XI1t}-o9uknb~8$o?U5Ext=bYE8JJFt_|tA#2qvD^}3x;glgV=u?wx8 zW-)%;7Q3rdakONA1gBN0y;he#kD78_+?I0->Su9KFE8vhzp|b7_jI57b1$h^hC5Yw zqeEAY9X3@>XEHm7#!XZ0P^P)-yJ`M*KGU+TL$|!inqA8$ZL2wC+6o`^?%Vy1U8R?1 z-%Oj)rq1*nJ!pFet4;6wtBsN9I=3HV2Nkkoe$)@-r!dUsJueJ%)|2~EK2jBi9}9e! z^1R6VM)$sX^?N*#@_Le-zLeL`O+Ip6yHfw3TaElCht(~IdqXJe-0(yBt6|6tDRZRE zk}^+MnJHzit}MN1}F|(#RA2HtC*m;pxAH~9~2|5 z;)G&_;)P8M6F dIG*wqw(=ruH#xRjR=*z+w(F-WDn<65n!okH1)cx^ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Menominee b/pytz/zoneinfo/America/Menominee new file mode 100644 index 0000000000000000000000000000000000000000..438f5ff0b846447eab7ef45c8ef19d49db69f12f GIT binary patch literal 2257 zcmc)KUrg0y9LMqRL6Seop9~6-ptNMj0RcnNq$pqv67kOwLC8Wd#4?@|j-p178^gL# zHYw9;C`E3qm>SEl7TMp6{>%{PY9?td*KDk(^dgm=)AN4pqAlO&o69j} z`bv1C2@Iyo#DbqxSk`wcY)7h&h<#T@^uHmI=0$b$*={}QheIanSgVdcy3548wM%06 zwwPO9XpzZnmFCu_N{Oq^Gx4Q)a@)K_b9-8%ButyDri716V#pMg_*a6SdhV)98or|M z_~eXAKK!Fj>HS#U>5q}Sw)LuM%m0+=>pn7f=Z?rdW&6yG`1d4r<~EZW7}jZ#^(Jj} zK+n8TY|@8b(%zBPDx+tk&KxLGv)Ze5R`(2*-RPH`4dH5bNtN8Y^n%JwoiB58zEN|- zk|b~HZzk`2K;~Wj%FO@rtlW3{9kbxzxX%A@r@6mtR6p>lG6l`Y^n)Ec)I$}o>%xX+ zRWz$Z7Z)v2#TVa~l8p7HWMr?DMpc;7fh|%tmTew>?Pb02)FM^BwM{QNlBFtYYxLsX zlhu+1`Fd&VCABOmMf;YYQoeDIuFM@&mA@uSRq{zw^@T`v;D}k-_p{WD?lH9;pUWdd zo6V|*1M+B3t$D2cQ(d>cO|8!8)Afxtsv)XVuPMn_YsS{<#?%zm_-&bP3iGI@ey?74 z{ulMc?oxU3c+jl(r^{0Z&za`RC{bOXnWuCAkY}3TG#lcFrKMuKX$g#Je_o&Rj~>^X z5<1nUp~JfE@3m@kPq*IkeVN+Y-m0G+^s4q%EA(@FqLp~W6EeZR#1qQv#(sjqqlY{a z48FZzLf!Xp_nyRCVz2#PSmcw!W%gNNpT#~Yw%_e}c=7gKe>GwDuRL6refXXbv{$#W zv>sUyvLa+j$eNHvA**uQWg+WA7KW@0SsJo7j>RFXbK2!0>vP%#a;y+pBCXGGhtlw!1fKDFRXjqzp(MkU}7pKuW<;3#1qv)j-O@Q4gdb92Ifel5o@n zDGEnbkg_0kK?;LZ1}P0v8>Bc$b&&EP^>Nw)aa71@OT&*(xNE;JEVt3U get`ciFhtru&$0jJEuWp4lbPi$&(6-w&diGZ2fbEx+W-In literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Merida b/pytz/zoneinfo/America/Merida new file mode 100644 index 0000000000000000000000000000000000000000..b46298e1f202ee4ec22ba3cf9f8079c83ebd6c7d GIT binary patch literal 1442 zcmd6mOGs2<97q3}ky&6AO7sAUKm;4#W>%(+I+!#0n$oO%l#WeWerk!8j}H_yp{!$fBdN_sEpKwbt9%IW4?Af z`^~n94|;oan<O;6 z&Fsl>%igjGQx%mg)oFpov$#;#tbAi?J}2sZ-^Y#jak$?9;)4=$hY+N_9mKQBQ(-^dLK<{q%{*BhtHE%qX}WLd|a z>E>tup8GGf@L59*K1C0RA`nd&sz7vMC78~t~i?t=$VncocWl?nK literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Metlakatla b/pytz/zoneinfo/America/Metlakatla new file mode 100644 index 0000000000000000000000000000000000000000..4145b9a58164680ce931c1db83eaf92f713bcf74 GIT binary patch literal 717 zcmaKpJugF17=TZ|RI4~B+D->asYxWhCJ_>mkW_j_*gBBdd@KwSg9L*(-54Zy5(Xb5 z6T2{UkTCfH27}r4K9`Bcd-I;>uJZ*)CDlZmyeB88 Qq*LW)Kh=E1={Okw0*}wEApigX literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Mexico_City b/pytz/zoneinfo/America/Mexico_City new file mode 100644 index 0000000000000000000000000000000000000000..1434ab08804dac08e4f595967d8c325691f08aef GIT binary patch literal 1604 zcmd6mU1*JA0LLG5WLQm@3m+vZt>*0OI2dMg#+vQehhv*zJDWLk7<=a9Gz?EoN-^7o ze5{o$U(q%fX3T|@Q)Eq(FwrTJxbRSme7&CEn>$y^h5ys@{@&iJ_u}{Sl?4MS;*X6o zU%0HwT;3<0>v=1?K5dKi1d9FFJ%j$<7`MOo$02?9Ww$?k!c}l@^~cD)cP|PCqQa4Z z>%|2_r{W^dLro8pYeFJrN3=}ME)}k#cXICRG~rHpAm@#qCgx9ltLMM@DHeRYuhWJd zYGKbEy{PNETHM#H(~rGWOWLH)sJpE)4<40E^Uo?zb)C#gJgAms70TtY0hK)~Rc3!_ z5;=}Ine%j`Sn=w!%YYI!*}J@)*-d+`~_K8 ze@n?jhh=@)GqF9eMea!J6FZlC<*q61B9s`^p|1x-Lu{^Y7^)PzKg`j4ZhFMtfmq$x zQK9yAe$@M$GSz|RM|wmQXQVj}`^nqCJ(krGBZOtOw+M%2T|OhCE$c@2h#31hKF{kD z-c>%~;bxgz;=_~Q^ZkWUmKjz-%!1ejF$`jvO=B9wHi&T$>uehHAokfb20|=^n8+_; zBg06Dl?*c>b}|fwSjsTfrm>Y_EW}!fxe$9H216`{m<+KQVl>2Rh}jUkA%;UNhnQ~D z*v>HCrm>!3KE!@T0gwt9B|vIm6alFMQU;_BNFk6)Af-TRffQrYR0AmoQV*mcNJWg2 zAT=?Hf>gyQ3sM)OFi2&L(jc`#inD2|gOmrU4^kkcLP&{_8X-kOs)UpYsgqGCq*6wy zkXjkV+BDTN%C%|gWfTmlm{BsMW=PSHs^R}%_E;0V+XSEBbvcurNeSNMBWv}aA7_aD zhljJtKKveW@_x82sis1w*7ch)2luG4#ocDy=F@t7PMevqs7_BDdDNt(FV|@UH)K-6 zbUmr>h@^i`){{H8NJdXs`CB6rxHDR1HfKuKsb4BsRcJyx`&4#;-%MGiRZiM)Gc|NY zO^g3(!pWUF{ISPO|9M%@=)PxWzCEO8wZD|vk1BQUiMulA;sUK|&&u4E3N6EGE^5{+9r!%jaQL01rl>A*{#kW-K=W8j+Ij&0jznRjMo4T~C*Q^*grpvB&n3a7sy1eCrS=A|e zb!C%T(;CuiBj;t^;iy{gZiE~H`gWXb{`gRB zIh$g(zUbB4>V2lBy+hX)zc<@YT+lmmy3EenCcSIqb+bFVO79+cEcM|=Ro{0_8b+0? zhR(yX_eZX3Y^|22H>ql0bD`{i5T}|~`{ls7el;j=@IU!@-m_Al&-0#W-w@C1HNIh< z_u<{3#Kn=AZ*Eb{ClU9R7h^r{#QtJso;@s$7g-y!IAnFm@{si*3q)3kED>3w(=HNO zrPD4GStqhkWTnVbk+mX=MOKR}7g;Z|U}VL}l94qdi$+%Mw97`;jVv5lIkI$Q?a1Ph z)g#MC){hi`RDhI#)Zny5AXPYR8Au&YTL@AKQVLQFQVdcJQVvoNQV>!RQW8>=(-wtP z<+NoXbvbQeNM%TANNq@QNOeegNPS3wNQFp=NR3F5NR>`oCQ_%<7K&8rw51}oBE=%r zBIP3WA_XHABPAm>BSj-sJ8juW-A-FLQn}NXj?|76k5rG8kJOLc0Qi630ts9U*%HZ% UWkj+Ap+HtfBp3_?16c{b0R`)=fB*mh literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Moncton b/pytz/zoneinfo/America/Moncton new file mode 100644 index 0000000000000000000000000000000000000000..b51125ebf1121965254ac60b6ef3afc0bf05913e GIT binary patch literal 3137 zcmd7TYfzL`0Eh8ixr~u0DHwvOXoVV}fF#~xEgeE3jtbrqJe9_PTab#E+^8lU;X~t$ zdCAM*SdHW~4VvblBw_)Yj(G$n%*3Mznt_6vk*?5r-uf1O_uV=Bd*|$a{y!;mGvAD| z{payAHyoay%;DYtgSG>ruw;$gap+gq zwQNx}xwZPNeu>J^5X8LqP{Fm zUMiR=bYYyloEa;w-9t7Gb&IC>f%;nSKy^LTu7B%$Ro(Dz&^PW?so$F_ zb#v{Ps->z(-#k(&ZWUL^)*VHnZQU+;`~3oOCp%x>oxe!@k(?#(#U+V9M$s_o?cB`xO1)dbo1eh3SXKd#R3+p1QNBP1!cLYWvz6)oppT_Q+`!p7NIT64j#n zpndW&zfHo&wo&@Dt`Lvw<+8{54a&ECj_i4Gnd-GWSNm<5t)3{DrF*X&tNLV)(f)J# ztAK=H-8Z&FJvsED4jddT`gOmggX|AQP@7u@U%n*zpQ)Em9X%=r>@AlAcYZDg<=)mI zAFdIDQ_t!lSv%F!F$eTBQ$AA927IbRhc8s29pB1fKJjW;{bo7*#xV6KGX_Uom|i`3GNGjdsMzF1bjPp$~e5-Z9! z%9ZVj;@!gKa#dY~aOKUB@0Iw8y!3JM{mr*UH+vT!56>o?>($93Rx*+sgSio77JM|WVw*_vNQ{ZteB-)GGxt= zMYA-khAbPhZpgwRD~Bu{vUbSgS(?>DmJeA!WC4*CM3xX)Lu3(=RYaB%Sx00ck(ET2 z5?M=RF_G0omebO#C$gZ(iXuyjtSPdn$f_dCimWTLu*k|HON*>6vbf0VBFl@cuccXF zWQCC>M%EauMdpQ7<}u3*tTVFE$VwwijjT1Y*vM)l%WY}a8(DB<#gQdP)*M-MWYv*n zN7fx#cx2^~rAO8tS$t&mk>y9$-_jHSsQ^*}qy|V4kSZW$K*sR>dPq$)^Rkh&m+K`Mik2B{5F9Hcr(d64>8ngSseLP~_x2q_X$ zC8SJ9osdEyl|o8|)CwsUQY}kUE~H+TreH|LEKSLfnju9)s)m#esT)!_q;g2prt7xQbVMONEMMXB6UOxiBu9PB~nYIm`F8|aw7G#GzCQ}YH3P} z)YQ@x6{#vxR-~>-VUfxrrA2Cs6c?#3QeLFKmZrc+g)L2qks4c?A|q8s%8b+*DKt`P zq|`{Q?H=8__;`ACaoN=$AGJFZw@KvMMBC)rMBC)rMEl=dTQ~lRNh!Af3->?ew%L75 Z(MOrGhb2WvL`94YONxw)h>RHN^EWgsxVQiS literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Monterrey b/pytz/zoneinfo/America/Monterrey new file mode 100644 index 0000000000000000000000000000000000000000..7dc50577749baded06400fbe5d2e8dbf2579253e GIT binary patch literal 1402 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/New_York b/pytz/zoneinfo/America/New_York new file mode 100644 index 0000000000000000000000000000000000000000..b2c2377f4e87960bb2adafda2a4ac6385cadceea GIT binary patch literal 3519 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 NC{k7yEDM(U{{__FS0DfY literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Nome b/pytz/zoneinfo/America/Nome new file mode 100644 index 0000000000000000000000000000000000000000..b682bfd9cd899e670ed89de3fbe79a0d06e14911 GIT binary patch literal 2350 zcmciCeN2^A0LSr%*9!zi3BDlG;~T`Q2M~p#ybwl+z=K?GLZna-!%{F9!xu12M{X6R zo5N{zoMWpk+nH{rvFMg-ZCUOPw~}0xZq0PbTCbMn?R*cbe`>D3JkOr{IeW%mY`?Fk zuJy?r>t82Af8pf}=$HGv)4NOjWAlG%A8T~nzmKg}H%@GF0) zvT2nsw6WSBR=wC4UX<&1Wl#6HUfkf1jJ@WIJaXBI`u+>wZC{W3qsM=B$M{D4x1St$ z-|@ydCwBjc`_A3(ICpJ+)jh5Cpc7ZS-5p=n>r5|bbk9g_aAwZy@y&`Xb`pZu`4ZCO zViSHSRt)SM4oGU;fzy8F;&X?GQfxqYYQJnw8VfBm=ig1kS)!WAFe$?;!_ zl(aYPlpEJoYSc@1>cp2S?Ml0yKKh=@IQxRk96F@3j%}2SdY@BbuOqWtq{!*Wk-4Qi z#NwJbnU~TemgM{*m%1Jj`H9o){7d(Ug6luq_kI*5?mPdvU8s`P{Uays2VRa)%MKi{ z-ECJ?(ayJJan&d4!KVGPWYJq{dC69}{KpHTG;`1{J$p)&#cZ+5jtz?ySL^NagYT=A zpLNTMZHHCm@j6*mze_p$3T1U+i(1u{Bx@4Ol*emH&mZZ^n|D!qzj;`!Neb9&K1>s} zH!j$9!_nf=iBop{&Pnmu=&-%E$uHIo_1g^<->Js_!}9UWGwO+!U9u@gspira*?e`6 zYDp=REuVI(R#&=gJ>pgCFU82G_H~G-{b}}wuGM0riniOlOGW#@q`hg$Eb&a6-|mRN zE;_4@+MR(Jsw@AD?3(yZbwQi2obbxtwS8*)V7?3r zwn9R0_Jp~@Z{ZUNG&`0R2y`?Ag__?8^CjBcV*`P{b}KFr7*ovf`dfIsKbNA2MG`oAtXdd zjF2E9Q9{Cm#0d!$5-B89NUV%HSV**tI$TJ+j5=UQ#E_67F++leL=6cW5;r7pNaT>v zA+a;+;33g7>hK})GwJ{$5kx|W#1IK05=A78NF0$sB9TNwiNq2KCK64f4kr>%qYfw% zQKJqi5>q6oNK}!qB5_3mi$oR)EfQNKxJY!3I=o1HjXJSnDr3*7~kvt&^=|t&^Q-?sHdG m=v@DgZ2ui>{s~j*jw0v*z%nZ-O!0?RXA8_qNBB5Io zEKT3MEYzS0)wJY1-&-vtp3B|ma@&1>_VPw5YW+AJ<_k9`Vs761_D|N=oPlKC`HHGc zeN1M{DN%@PS*X3p;^4I|W~M}`-7U+9c~L3t$*LU|ZwGb#-Zdv0XN&TqU#RAMP&O}5 zMJsTjTgT6;U2DqE-Lx9YZOhxs0b{JvjZu6uW6S*}}u^>w=LL)Ge;p0TaT*##ape`}8YhbFE$ zbV1s9nm$M)q!ZH0)AT}`d75rWJER}d5b21tM0z4kk*-KvPtzA^>}fh9t&!gRC(V)W pNPDC|vH`LKvW2JF1KGsW?1F5A?1OCNX?8-k!vEeYV5W-(z5&G687cq( literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/North_Dakota/Beulah b/pytz/zoneinfo/America/North_Dakota/Beulah new file mode 100644 index 0000000000000000000000000000000000000000..c1e3b025b916172bb8464c3de234656e12551c06 GIT binary patch literal 2363 zcmcK6ZA_JA9LMqN@O0z^c4c4)2&E-~fPi8^QWOwDo*+B|3Skt8*aNo@kQm}s5{wtk zd$|~85)@jknJ_npV*kH3Nd}I zTweJgOUw*sO5YpNLi9vQN9T<2d-96(-xR3=YUbI2CDSS>XUcY_j4S7J>2|O@rh*R+ zNtgFkbqbTCiR&E1gv7aresQX`iXvoCz``>Nk<`ZHUaAIxn)`|4H8d`G{CC z=(4j%_K7=o|7hR2cc;i{{Mf#$eXqK^c+k$R-J$Z9Ja6actyB5Go|FYit)k$}>#{Jk zS`;4cl0_3a;=Y&n+bhpjDR*m&y8lRuRa{l6O1kG*53I;mrA?QuRnf7^v-+&%nRckM z^kJ*)>ljfH^QpJuq!4Rnj(FD&Toje#J>IJJ_r!yv+r8Db2gJJGD(^$?cU4Vii}i5Q zfO@39(y9&ZP;~{_R^7w~RUa2?)t@R-4NiyEa4=DA{N^j`(e6U=*lC~l@#e+ii9;8> zjb)+2+I_;iDg9@$xpBXDOZX>ZYjLM{>&%2|&KR(o$4{$m5gpdH(IM3`xxw1ryGK2B zuE=U_Yf?Lg6Ro!Da<#K(wj~_G;peZv{+CZ+z*T*GzPI`u!spv(ivaUJ%Y29Ud`AZz zl6Mj2&hrTOD*cq}r^F+2_0PHbXMGO7`1btsxSaa0JY2Vac#rn!s}2YmqzsKRHp<{A zqoWLuGCos1K*|UyL!^w6GDvDh$qU2e^f(CvJd|h zOc^s}&>W+t44Y%zl!0@MoHBHdu~P=mF?!1IImS-`fPw%80#l6v1q2ET6c{KtP=KHy zL4ksT1qBQaG$?Rz;6VYzR3k!x#8hKK0fhq<3M>>{D8NvVp+G~yh5`-+9SS@Yd?)}> z5TZb2sxhK~#DNk8CJvk^Kye^NfrEcWI3RvV9Nn61ziq!Dfn^#OhK3fVpEMV1!Pl= zG6iN+jWY#k3eps)DOgj$rl3uM+s~mt{sAVu{>Pu7z^nRbEA_uCMr$p%_WLinwdmSH q?RS{*J7T3(9%( zrs;)D@vjTfzwmGe^uv2>@8Mkg-IJlJuhVV!zxj*$W>2I&Ht)I|tBVzX-e|F=u2qWZ zixt+*uX2TNILGq8?-rsb-g0&MM8MXYR^Y}s6;wCN4lbKkAxo$1(DZQ?x;M)Xw?Ii&8m)Ne z$>QGRhpgDSg=$uKgcTQ%q~d;0wBxUYEB9EKJ^R$JYR=GvozQ<)-PbzXx_{T8n!DO> z&0Bv)JdkzSda&eUkr;E@N}6wrB;SvAa>OQ)JbucaKj9S%Mh>Wy^J`^l?^cy|tUxYo zuTtsz6J*kH00IrOl)2iH^PU$aTe9Z6B^ul^)o>@F5Bo%1^zS{I0y2QNF# zCphS~ef<6p`&`2Bf5#R<<~_`ONBaFIj=C(~ zMYN~DD?F?8Q=y+SugKSb=j*@qx%lGS``_aV)&J$;y7j}m+pn)SDDo&}Xq2&021gkk zWq6eFnd$*jMo1YVWsHvF#GI);BQ-;qmehL5-1Sk-gY78hKP*9-2K*50m1O*8S z6cj8dU~r&8frA4N3LvH$5eg)x8WRdA9H>xWq2NLRhJp+Q8VWWX;84)vfQNz)2S5~r zI3P0B7;%6^L5Tw<3QiQDC`eJDqF_YK40-&izkOHBp#*hOfTSSF0VM@X4lpTbQsAWE zNdc6CCcnF2HgX$sU7tSMkq(5Ap0;L@MKAQN71;S&;k+dkUJFrlr}ervh4-~Y(1f6*3d pzoU)cvCBN#?f*CYZ^TK2W__{dJ;k#qEi)}W#gmbdmXVeo@fZ2$ct-#L literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/North_Dakota/New_Salem b/pytz/zoneinfo/America/North_Dakota/New_Salem new file mode 100644 index 0000000000000000000000000000000000000000..3488e466d5225d7f5185e7c910bab0f1bfd62eba GIT binary patch literal 2363 zcmb`{ZA_JA9LMqN@E~#myD~5Ygwm2gKtM4dDGP`ok02fag(wO{EaUP45;eR^g89OE zZ!W@00wY&zCd|!nY=l{@t(*&+)7mI)Jz3Pfa*G9Wy1w^XZ>m@EKfBNO=J5LW@vg7m zkS6|dGt4hM+zaO6J)-Mqmi6jjknV1awt8OrL4Uk2#2Q&}O^sAXh(E>~<;3^pV)9~{ zy#7&^m>S5GzBi(U=!}xC_9@}_^mXaKB~k}e&$R-JC-saK6IM{ls1DknZUxI>9ek`` zy6q$ShOc_8kW251(BZw-tW!PW#y7jAJhWHbwC_1NySY}}Twf!@*5!-vf(PWB%y@B2 z{GBplex9Bi?3R&!aXRwXg;vy+U>!X&)0%hsM;+6D)r##ot8Z93jwpbW`M#d#rB5vwSE8e|T#E+h~60Um1qM_HU#PdogbvFA{pjh7L zwz3Bgi+c|IWZnDn9S!<2AJ=I#zqvUQpgimo7~o zP^I6*i1L`v?D7wUST}XjUf+8~RE&1om96iKhlh6BRW(P&BVCpDqn`J4b$hdVEU8yN zURR-NLfdq0ezvL|+ovXR!?*kh$qka?9EM!#8byF+YP0m zLLE3`Z%O|}Y;Abm-WL9;*k06bZ=V{|O&PtaY4n`l5z(f04E5{g@r`O{*FnAOVxijI z(x{&qNK`FVWqMENEG1mR<>zm{rs)$HFbyA{@2zf^@c9l~BEWf{>3oOye5d+cl6Mj2 z$@L1)8uOHyr`RiU%-=cYZ*wlb`1bz$xPr`odAJVq@E+|mR}~P_M;RJrY?Q%KMn@SQ zWqeM}04XD+43RQM${?vTN?sTyXU0hwD91=CL#2$BGFZxJDZ_PY#!DHnQ!`@9kSSxP z44Pxqlwos>n=){YkyD1wF?Pz}IYv(zKF9be08kL1K;YD1Kmmb*0tE&N4iq3LNKl}l zU_k+c0}Tos9C%OwacU5uK;qP3LIH&X6$&gATqwX$kfA_B!G;131sw`J6nrQEQ4pd) zebGN%SJ4$zz$)HqBvQgGw|l7b`$loTvEz@(r_fs=wK z1yBm26iA&KOevr`HK>082rZ16m5U9N<#W<$#xhF9*OBggGE~YA~jN?9`x4 zf!V3SnF2HgX$sU7tSMkq(5Arc=Q1Dv04Kcu@6U|DY4{i`$Aq!Y_-*7ie*Z1E`Nddh p{0?*cj#%k2ZvVI8e<4oXhV^BJ_e9T<jI?hgq^V^lEJ=@nZ_KL*nh_ZaDp z7cwJqlaU$!U1YwGF|rn(i|lW!)Yj3bB4;RCZF|rsa=SjM?Y-?{N5d19*U>9?mJF%< z>Q-5>`KsDgP$hTAH7V!DJn5XjViZPfkcHEY#@^ZGvgrDNDt=ZWT`iqz-)OEZsR*e3 zJ?rIxoFY{k3YTRG$;y3jR=R)0DNouX>3N%Ec-OrV-icV_@X~}RzcptZnYk@0I;M=H zv3lY<2S8 z7g^VH$T&3_D^7>9jQYVj(cpcX^FwzOSTtz+4;t+Gb7UrUf-;XKRq6A|`rAJgnl5W+P3l!!3R zJ2ym>Y2F_Si{U%W`1O0S%Pm}GZjsMhpuhF|`?>$37*ikBAmt$SAO#^6S?ZGbA8O(# z3aN^tETk@^Fr+f1G)r9@QXEHhNO>IfAq8?&h?K}tBT^(%B~m6*CsHUXGs}>PHs9u>xcX9BV)p z!LbTt8OS=2g&-?ImSU;bf-J^TuLfC;rCtxRAY?_zk~r3cEQ(`Q$g()rg)EF?WysPj z_1cidS?bjx%d^z$Ll%gv5LqI!Mr4u5D)IkcX0)DdhMsGZE7j((r6jrRcAMRn68#fq Cu8G0` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Panama b/pytz/zoneinfo/America/Panama new file mode 100644 index 0000000000000000000000000000000000000000..3a4ff2aecf898647d8f22a8c9021bd83ce5d0003 GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIl8|jzF_?Sf2#xo!~g#~H!!d``-U*M28VzYF@#_@ zh#4pa!XN-L1jOd~4+NR*Y62h{Y$y}Z)B=#HK(krEW^?!e%|G~uppqfXFa*$!xT)92E8E^CsPJ5Lt8q_ zfBd5cZaS8uKU}R@8LrmGpfzi?)>WdlYH+H>A8oWlwB<72?R-zQ+S=OM`m_6X?&t3Q z^R~D5`^H;399Y&!7aGhd4fg+Iy*V%Ga9R9jy3AK zEqPvcG*?|;mGW*VzN~Tza@{2v(`sqpvb%Kd7m@qbw3~N+N-P^6ck^Ex6E~h5c5mAI zgIfO7A-ACU6IHnDq<3@ptXi@DY44WoW2$InyH}JN5ha-suViXato*LTTQ%AzN+<4d z%Z6G-@Jz8A>R%_ypUV*yiG;4){j*pdiRxRMz7*l2Rr*&Ydr_SqJhC|WEMA63ha1@ofgm3+BtW>Rzxtkqo~ax z^7NypCscQHO3R}o>anoWySoR~8Pik8BR1Jupsd3qx(<^#Mhh^Wz7Lgn} zB%k=KTI}mj$S2>-7ya9!a{n<$qy?@>OHaGW`=YK>luyMXOZuJqXO61H`%-iEb;xfUUioF{>v{o%Xtp0`0M**GU?Pl5O-=_b2ge&U(YS> zG;qv|I*xgEoPhnx-)?_C$N$AFd~-1kWFE*wtY#+2RFJvwT}%d<4Kf{MKFEZS86i_b z=43UKLS}_b3z-)(F=S@Q)R4I$lS5{QOb?kKGC^d9Rx?Fpj#e{CWR}P@k$EB$MP`aj z6`3nCS!A}zbdmWY6Gmo?Oc|N8)l8a;StHX%=8a4onK?3bWbVl1k=Y~DN9KBIl?$FJaInns3AD@$XmgO$PZ N(pW`Bup(HV`73F&WV-+W literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Paramaribo b/pytz/zoneinfo/America/Paramaribo new file mode 100644 index 0000000000000000000000000000000000000000..6f889ccaf1ffc6caac36d024ea0be15df86bbb77 GIT binary patch literal 294 zcmWHE%1kq2zyNGO5fBCeRv-qk1t+rh?bxT~edJP-&K7RLh#k`V40kXxF|)A#|9{4V zfdNR`Ft7kg9}s!&1Oo?{IDW~AKws$03h~rbq`?(4hjL832*w299}QO_2Qxi(odo_%!B892+&3j|_U8_wE}>*ROh3bYC%6o;%@L zRq|G?t{YHmavrL+ySvr8*gln<+NzRghD1tKiAtI16{%k~srADhB5m9!()%lfYjC4* zcWx6Im*Yfcpj>6O{1n**Th)f54`O>^(AZI(@5yufjr_c1Phq838a)oNFV`)Lj!%l> z#2D!-c_ng?qSut@@Rh}O*4-7Y`s_I_zVEh!0TLD8#yg%?>J@MPNS{cf zNT*1vNUunCMw&M>)0OGUi24Hv+KQe4 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Port_of_Spain b/pytz/zoneinfo/America/Port_of_Spain new file mode 100644 index 0000000000000000000000000000000000000000..bdedd1bd9bc85cbcf8259b6eee3aaa5ab041e954 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVPJMuVMWE|5ykE!~g%s4=}L!_=Yez1_QZ35JG}M O|A7FnVO&5{O}GFwj2!6z literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Porto_Acre b/pytz/zoneinfo/America/Porto_Acre new file mode 100644 index 0000000000000000000000000000000000000000..7be212b1e6510bea50ec61997a9bc880d0b5aa1e GIT binary patch literal 612 zcmcK0uS)}A7{Kv&I)f)Ff(Rl`-GAVZAf{I=3yRP1k{C<_n?(?d8njrJM6p<1T9TdV zZ9~)Lu}uY=LlA$Bo8$HU9+(8d;B&n9eec@y@mDu;Q|iYg-5(Bd&cC zd(8yTB3JdiuFT#@r7|E6Y$|1K z*(8$I21V7)UG*+5`D%V)g_k?-<9qx+tZdz|Hf8m=ZhZ;?g@Hm5*Ktrt;yM-z4TXn7 vL}8*(QMf2%6gCQ7T*pTtjO!RFloU>Og_Ocdp{4Lrh$+nUAE-U&KI44>AeRYn literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Porto_Velho b/pytz/zoneinfo/America/Porto_Velho new file mode 100644 index 0000000000000000000000000000000000000000..12774792326b5bb730494e6d2139c30d98eafb71 GIT binary patch literal 574 zcmb`@y-Ncz0EY3@FZ86kIOtG6SBIbu;*{!Y1u-D_2PlG*i>`LXfk+hYUh- z6GVs7t6c<#0~P!ztrGKO6$HT?cfaGNdmp{FxjrR+oOb_(o0IW3@9F)s{A00y^||=9 zWJ)jd>b#bhmDvkbNxD^a=*d<~8!~Q9sM=v7@8c6y*ID^`khX7~Tk_p*tB<}((^#HU zjq;6bMs?df?J})oKz$YpCUbS9hIb##$nk<5osP}e-i{jYy)$j8UoPh^2ZeC%_Bz$! zT-l1A#hez|+zJoPzx$*Au+aI#N@Qu!uSFIktC8hFzaA+N^c9d2NDZV2QUxi4)Ika% km5@?FUkfP~^wp4ZNIiB^5UGfiL~0^M@qemDKJZNR4I&`k literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Puerto_Rico b/pytz/zoneinfo/America/Puerto_Rico new file mode 100644 index 0000000000000000000000000000000000000000..eada37a111c074859e5d8b5600fb1d98e8df4df1 GIT binary patch literal 229 zcmWHE%1kq2zyQoZ5fBCe7@OzxH=_fWl)n^QN_cyLiIL&||KkT3faKK+j4WW1!!bC7 z!7%`c!$TMt7(plmyYVbQV?h`MU~GZ^Kv4B;>P`?1vI<0ltOL_PD;b%Y82|r2#166( aXfxDKu+2O^zCc@%Z3kHo#9Tl@6D|Pv-9}9S literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Rainy_River b/pytz/zoneinfo/America/Rainy_River new file mode 100644 index 0000000000000000000000000000000000000000..e006a30dbf358cc4bfa9bd2d9cd780697a9c5ca7 GIT binary patch literal 2105 zcmc(fe@xV69LJwSns|wlNg)!LnuH!FhoPrQKLo}=PyBHnAY}f)5X<ZRN&hoVPrqNMDlzj0p3}bJ&63;oxc2uI%ly`Ao!2=> z0`*aqzbi==lvb&`)?AW;>?LYp{#UYSe1-~6|J4L9#?<1gUzjDIomY2%|E5`bd`uU< z|BSik;E2BW1u^$Ep4Rub9gt-eFYBVZMk$`(rb~)fOUYmFs?yvYrgZqIDod^~Wqo^9 z`Dnl_fAM*};@nCJ?Q791Pv%KQZH-=ac#5oETBz4FUzW8QSvtJ#oP@_bI#SRtkzX=Z zRpvLQ>Wos=v6E(f&rhmmkKR&WBX!B` zdTVK+Y#rUE>$9_@{_AqxFy12#Z~650i$BZ5hs)F>gK@JXI!`@%{DNtWBr7@iiFvHx zceS(e6|*aKNHtY-n5NjMjs|-qIx?ttr?t!OfnMEmWt;5j>ePF`Eth?*&H9OcpR{hM z)K4CnB+8=_#(C`hx?b`4sS_R*kH7JfN_5Xj?mn@oIIN1++EZ!IsxWV~hZFw)H~$9v z8;5n+!}HX*-Ok@S?u1wXF#%!�ZELj@AtR1Un#xKrC^zra)|g7z42eVh+R}hCvXE z7$!k%Vi*OnieVPSE{0(c%NV9PTH7GTL9BzA2eA)gAjCq3i4YqZMnbG)m|4oE#91%XrqQW8i_AVq;x1yUAB zT_A;Vw3UIB#?jV>Q5?rJ?xQOYPt=D|AV`H6C4$t5Q6xx}AZ3Eo2~sFXr68qpw6%g1 z%h6T~QZ7eZFG#^46=RePQZq);AXQ_O4N^Bo;UJY`l+MxC4pKZvTRlkm9Bus|1%y-( zQbI@#Aw`5#5mLqkPl9J$BKPZh#pAD8CtMC~8f_r|OQZWHWktw_@!CkbN-B@nwsWEV U*%w;i&-dr~LV9EP4IS#gX(B0ii5g60E;Xv(M5Lr%r78`FO* z|8PF7hUw6M%Bf>Mtwm-&Y%S*)&bd|0hiT1?_0`&P$~eETU;nuENA_p$+wWet+wK1P zyk3z7^&jNPKlXzAhKDt}htJ8s?pPy#<;+<8Xk6pXA@vn9v?^qiOF}YiN~(P&D^*fP zPS)WAdnGktxTZc#F(Yn0(X`IT=GE_h(ex8Pn~a0s>TA)LzGUGHT^Fc65H1 zj43@}$0nbY%<)@oW?!etN?c~My4%h8`$cv_$8O{ATB_NtjV90@)|}=lle=rI2J51d zw|1aTEUuI{=G@o(%&9Ud??;_HAWcFeezT!_eKO_A4|eLMoATyQU)gELdQHLCpW3%} zcAM#+seQZQoO!3^6MeV*kSVNf&~Q$RDGJZlqCZYcarSCk+_hgylFDsK`$j443EKBQ z-)m-EpQ&Y=n#{~oxmsRRZD#FxS!YixFmu-bsdLjZOl015jr96VMgAGBxSKAO>DO%K zMUkq$Q+7eyZK>|wXKPw6$ij}8T~vES-fyk3i_6ZNCEJ^HX?B}gR#&aHN!!fw;sRaX zv%=J6W@z1&Qd2*`r}anuX63y*x@u2}e0Vi(S4Stvnq#+YLq(G4&hPC<`M=A@4TtU8 zoL(#n?}2@nhh!2bVJ7p)AVSC##(oojWyKk_2^t>`0CL)%kb8tbC=;S#9@fX z5SJl7L!5?q4RIUdH^gy>=N_Hw5Z^sI=NaC6bnY|!hctlE0Z0oNJ%BWU(FI5wAbo%| z0@4XcD*J#mrV@h1#dGg0+kJJrLAsy#Q!&+QG>d9fn{>vyV44LTxxsk%4gvZp1jg0pQ-@L^SiBCk&9 zCM6=}b0?bE60t%_#vc7@D6O606`!i}{OZ!WFlJd=mx`VSt#7Za=7~w$8l9fuVe_}< z*neoE&7lj@#?|ye8X=vKR<5QO(#+L#L)szzkcLP{q$Sc5X^M13+Pa#)NMl#i8EK95 u=09nUbVu4F{gDlj9grA5;gMUCATqHt^7hF5K z5s4sImBW-o-ctz1OIfDJyk9wlE5VNMb9AR0SH8o0K8Ime^L)c~(HBK>;#@M{a5=^1 z@}BkTp#6HRuUB^_((Lz*Rqls^2hPW`Lbp%db>g{K-MAZa5?2bW#P?n2({6_KIet0v zwK?4#sNZr1Yc}1X`|Xk8!U=ceX0J1vy6h7SJ!;nJl3)J^^zSb%GB@9?|GbIW^Zl)Qq0P3PSX3`Y zpWA<5KGsVQOYP-n`FiEfEqk^6ky^_rk@eeoYW-iXY^}O#duCF0hLh?-;M7k_>ZxBJ z{rIBibu5c`-rKG~s(IIv?!Slpr{XD@6_sJBEH$^*+^6PNho!{4a{|ZD@EQJm&m00E z5s(l_3?v8=1qp-1@il>vNWLZ%5(^22L_@+M@sNN>L?k2<6A9{Tq9S3DxJY1M6B!AO z#72T6(UI^-d}IK=W(3F(kTD>GKt_QK0~rT05M(6CP>``8gF!}v3O6*LRG7d!-P)%6Mh literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Resolute b/pytz/zoneinfo/America/Resolute new file mode 100644 index 0000000000000000000000000000000000000000..7713f5bead4314819aa3feefaaecc9f0ab2a5ebe GIT binary patch literal 1916 zcmdUvZ%ov69LGOLE{%;^8HGqtrV@G_9EzTQ(28RW5=lG>1j!UbH04w3A*a%pjp-xv zfy;C{)J8tBW{yR+7ODN)TFo((xur~NIp@awrfxc6oZr{aCu}{jhrMqEm7rrjvA(|bNP{=QY3-O+3UU17~>tv0!Pr)sbvDtVj6 z>5SqknOSi|^E2nlti0cJ_SiHDO}uVH*G6Q{(64sx&sSvLAD`R#Cx%VIw;$OBdj`zH zgKA%GI&EHS->t8ge`*Trn>3u$Zi>Q7wCMKNQk=cP7WW;HlB9B5(zQ)W2ZQ#FL!X#M z{fo71dy84zovY=wHRjEI&*+l*1*T%l9bKB1VIs@=H8SiomHDT%^6zx1N9)%||CE}6{kFFKM_JJmvvu{yU-RmNId?_Y2TQ5{P+=hA|C(dOJ5Ry<>`l?#9}ci42L69xYRw4 zMUJBv`42Z7cjJyBw+y*wevg}G+%@F38TSpjamJlPZk=)O9^K7D?jCacko$)?0Pz6g z0>cN06AUjPZZQ0SIKuG6qjLq~i$~`S#2bh^5Pu*JK|F%E1n~*t6vHcsTMWM-jxjug zxW@3!qjQeo9mG9`e-H;D9ztA%_y}(RN(@E77R z#AArd5T7AVL%fE#4e=Y|IK*?0&UJ|I9-Z?H?>##A8U8~Wz~}&^1&kg*n!xA+qz#Zh zKpFw*1f&&^UU+oPfONy7YX_ts9$iBq9f7oj(Gy5h7+rz1h0zyCV;G%*w1&|ekFGh8 z?s#&XBB literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Rio_Branco b/pytz/zoneinfo/America/Rio_Branco new file mode 100644 index 0000000000000000000000000000000000000000..7be212b1e6510bea50ec61997a9bc880d0b5aa1e GIT binary patch literal 612 zcmcK0uS)}A7{Kv&I)f)Ff(Rl`-GAVZAf{I=3yRP1k{C<_n?(?d8njrJM6p<1T9TdV zZ9~)Lu}uY=LlA$Bo8$HU9+(8d;B&n9eec@y@mDu;Q|iYg-5(Bd&cC zd(8yTB3JdiuFT#@r7|E6Y$|1K z*(8$I21V7)UG*+5`D%V)g_k?-<9qx+tZdz|Hf8m=ZhZ;?g@Hm5*Ktrt;yM-z4TXn7 vL}8*(QMf2%6gCQ7T*pTtjO!RFloU>Og_Ocdp{4Lrh$+nUAE-U&KI44>AeRYn literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Rosario b/pytz/zoneinfo/America/Rosario new file mode 100644 index 0000000000000000000000000000000000000000..a703e957d5ebe02e0651d77ddfff4d3f7b8b851b GIT binary patch literal 1103 zcma*lPe{{Y9LMqB{^c4)R!|WUixk|*%7YB1M9^VSbSom(SXTb}zMs({3iA2!+w0+nCqM7(;OSG{&R?fZ zzVLDm%FBJj*v*`JcqyYFZGB}Xx99Za!Z|gy`La7TF>a=t4|MU?YxVfed-uu3h?$w* zqTRuqc{(zppB*Tv(v^z)d|SiJ9uMl-<+v*MCf#!FzIu5rujkTt%-pBz?tI!)^X8*l zjU~)N>ZDum39I^O!~GgMqZ-}qy76JuG&iQ)X1S`q)ra&_b+7qeO1M9Y{p#o4j9wm2 zDDTD|-8O#2gged_cIGEcM|-}|nfzipKVK+x?O3O}D#r>j$I~&hzYwog)vntE(PZO= z**6n6eM75F-`lIvLrY`kaPdUc=U?Fy478pQ`t9BGN)^ZPyt3;AJ#Vq%3wz$X8o!Gb zzR35rt$Qk+b$TL>5I>MV3X@MHWU@MwUj_Mi#fq>d5j|Ssy6?slX~FAT?N}2&4+645SXL6oOQO zlwy@ykYcP-4N?wL4^j|P5mFM`nz%?&^1pSc3MmVz3n>h#%qpcJwOOS&q&lmVht!7@ zh*XG_h}3A6B9SVwRc64yvL_U5J*zNa@4wTOKwBZ&D1B>epzo6`u&ie7K4-@PV+J&6Rpc z-F#SfTCKsmEM?i)jKdr`U0a=UuT&7bmflvx%F4M z+R?3kX*wtOcDI-z=T6JelTBvWu@(t#epAVTCb@5iRw4B@GQ4`d3N4){Vc8xvV(Jtb z89P~pk1f*o-xIDP{8M$rK#GaHI8sM-jxY~={F@%tddrM{<$_kV6V;e)AL+5hL)EyI z=OsGzni`+;p*$G&g^HPQSYqy6HL*dB68qg5Gof#pOgzzQ;=XLq4;|iP;@?@K6B;&} z#62^0Qq_wpxh7gq%G#h(iU#Y{m|`_KxmQmKOjBu5gCwmdLQVa>N76g~P}44aCJ(Z#v4y=yUZICXo}+w z%6#WXQxevuOS(^)(i{7A*~z13!B?B~!sgG_qW2c+@*Que#rrb!lImS*X~P0pmhDx` z%co04Y@vE0W3*I;tT9!i{G@82z^wT5l2mslo0Z>wDo?&0YF2f8uU9wSG;3b_M6X@f zWxU&u=yhc`)cVTjbWQqMwP8-R-WYLA)h2A0+S`XzUGNI2JHJ)cU(1nA#}}*3XX0eb ztDDW%mSNKH%p&vDu72_J_w&EYKVXo3{yQI^Z*PI)_barx|FV93ajp&?^K28WCe86Gk|S35vtgvbz) zF(QLRMu`j)87DGOWTdWksK{7d?O>77BEv<-iwu~5&WMpABV$Gejf@%@HZpEx;K<04 zp(A5Q29Jy$89p+8Bmk~90!Rpu7$8AFqJV?}i31V{Boas{kXRtWK%#+!!_~$E35ctW z2oe$`CP+|_s32iM;(`PQi3}1NBsNHJkmw-cLE?i1$kj#&2@w(_BuGe}O(dL1JduDR5k*4kYGaB76^SYmRwS-S zV3Eiop+#bg1Q&@e5?&;}NPv+DBO!LRF-C&yYNL#V8HqCzXe81|sF7IX|3273w&rQJ W=5cu`@k#NCad}CJ@u~5NL4N_`Dx8r3 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Santarem b/pytz/zoneinfo/America/Santarem new file mode 100644 index 0000000000000000000000000000000000000000..45419528f9df01abda7f9c98663ea1d69e5ea920 GIT binary patch literal 612 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Santo_Domingo b/pytz/zoneinfo/America/Santo_Domingo new file mode 100644 index 0000000000000000000000000000000000000000..23ace9adc3e21ee0fc2b64f87f4f5c578d135b55 GIT binary patch literal 463 zcmaiwy-EW?6ov2X?wB74Bo--zJV3f2Hd;lEu%N;~wzAqPkj_%DunfL{wOv{Z3zZN9 z7D>67I;d};?ONQNGes;SxYu7kj?%n%n&rc{whn(X zIli8m!8|khO&nf+yKoW3*1bFXdK(v7kFIb(nw6?|ZvS`mdC>ey0~3U+69tj#I2BQy zPK;H3evp#tSyR-QyC&FTfeN-w=u_v3*T^rXjUdeAUF&8W=Li#f*}4R@>h|krE6o; zk(C?H_L*DF<(8i|Tj;Wp)6_XfI$Db%lKfMVE1T(gQrGAC@z4IK|NP#L$L)6iu)UwJ zpr)}tFZ8eH4)+ajo|t>{dDI7=G#~05Q#R1~*GzNxO1>WHZ;{@@PqlX_p?%|iw0(!? z%Y~cwYX6>oxp<*N2ZD%Ptx3~A?^-C=x|Zto(GyI(GOY2FCnS-6-X`|P&COp&=x|%B z8Gm|*PT26hnP?uj66rRRwlwM^BTt!(>bq^mr8P2n>K}G;&q>LgG)6Oz4w|gc70r6D zO&*|YG(Y~e6v#v^=x#7m zuYF?+JGaTSi-S6SXV^S(Drsk|9&MgH-mXv0`Q1F-{TC} znP%qJmS|PzArlm3Y4CHQ%*z<5^G-h~)v1@YdjGJ@ztpWY@AS({XNK&8hAw&ez*)Pn zbf3J^cF-=${mLwEYPUTs;x~NmAdQ~Y~8t~X4yT>y6m&rrr~O!jUBbJyr)2$ zHWkZ?Ll5Z6noL=>E1|2Wr^%Yu`|R3rL(;q;ZkunMm6jR3w&jO|vhLw8?Yd)U%=+OE z?S=zC$;Q5z-L!S5dHuv*ePhX5)B4e7eY1RrY~Hq5Q&Vp5E1B%62!)c#!GV-JlgaPC z4W(5?gV3zGRs0Fuh4KXdeb8Io&-_6r-NR8MhwXL8jT|^~Gq4$Z#R!g$x)nV#tso tV}=YG#-< zn2a?u;*ao0?zb^Cn>BMA)7*YPGlu!uZ|(Rzzy9!tzx?A5-*$R@*X6(W^W~qlq%g($ z;c0Jv!iQ(A`S2dGXQMZ&tFL5Kx70ot!sEZxMs$6ok-@h$^20feYB{dm@78LM%R4ms z%vp&!S}(DC_e;-emALhr%;F!Ad?n_E(gAC4Wl+>v^B`tQJq^Fci zdTXT&jjqw5kLSy<|I2jvS+|UMn5!9e`I^}{T>q>Ztt0ou=%~VY9ld3kjL8a7cR{p_ zO?asucdKND+|ca!CzAd4g^UZnDC3&0%lMXqGNJy6cyFCo-}Y*mc=UiyDk+i4)thz7 zjBPr#c#-A|DOSHXTc<@%)aj1?I{mX#bHlSF_g)vB`Kh1GI`vU!H;2lc+Azs$cq4Nw zKS+K}lg!I+miZh0(FG$<%fh@{S`fEe7G>6JVTY5tI97G>t6f^uTB=K~SLo8meqDBW zwiaJoCCj&FYDry=tSE}pl~rl7YD$Kb7DmcyS5H~v`66q>EGbJ4*Rprdq`dQIEx&U` zD&F4LbtmfNuck&_zx$GIsNbi5R~*vH?UfqTCb(VOkYD^22>e@QS%E;yQ>$$t@cvy; zhwtxJCvGk%?Av#*&u_W2`Q-R5k9qO%Vt#KP{=&Ri{+~GEfO$A${*_Zk&KWsrfY=Z_?SWPqfA9LUKZqLb5{ALh`aTi6NQUn$(cokmQi;ko1uJkOYwokra^}ktC5Uku;G! zkwlS9ZB433uC^vwBwHk1Bwr+9Bx59HBxfXPBx@vXByS{fBy(GnI+DAsNgl}_Ngv4{ znE+%4kSRds0GR}27LaK`<^h=qWG0ZQK<2{MOa?L=$aEm{flLT8Bgm8>bAn6?GAqcm zAoGGu3^Fsw)F5+XYbFPo9a}R!$owD^gv<~!MaUc>lZ3y?EQOl6axqs9-{7RQBxkbI L;d43dH&^Ia1&_b8 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Shiprock b/pytz/zoneinfo/America/Shiprock new file mode 100644 index 0000000000000000000000000000000000000000..f8908febf220f27b3efa68bcc119633c8efee299 GIT binary patch literal 2427 zcmd7TeN5F=9LMp)g90~@Q;8vb6-07=JX* ziZRO|P|{j6@nOxzhPsApE1ScuX)UzpvTXFQNdotF-Y4uI`@g<-KVHAx`}gOKYqe)> zhPdW}%{M$;r+IjnU3+u%8~q`w`^7lj^V*MUca2Z)X`U*2^DpS$w!P}3)^I&E?~nSS zs%UXJ)vHGrw2MC@-TF$XS6mr=T8{nT7UO5j<-~_M!gn-V`rnEZVrQ%jXz_`_XC`FO zh8PuGHB(P18CO$t$8<>AunKu8Q-{gpDs2Bj=@{9quDj5q!_OTP5yzYKwD)^N|R~3k;!u#cn>;!RB!U7pRH($*RbI6#$cop;8d>#8$n2H+; z)w53gq-GzysBi8$rRI2N$y;_DP;*!M<-Bzti(50ll(#K=SIm$4K*lF(5$`*%6C4{w z!te>5c+n+pAK0Ul&eW^qt`~I5;Zl{_SgX@sS)|fyn`OqP8ERp{TDhonRAt6LAn(Zd zOf3#clv%NtMb`J>GJEWt$T|6oyz}#Zv82zT@9OUqOWS_dckkLRa_c_P_cZTP_ZIi* z`>MC8ywsO0D|NEdUNNx}XXZFd$h)Pj-xK%E@lq-r}e^W32v_d%>TJ(eOEmg%8 z9$nHgM?JKpNSAs8)rz=e?OOSba*apovdojJ?As*ip8d6O4^ES-e1l?j?}&VOc%P_f z9+Hm?w2I2=BXUjGdhw|9w61DtQI91b(vR1ARCPqVt|=%|HJ7})Ha=O^o^oqXNTl-Y z&(Z6?`&F&)D3?#1o+h63X3M7zjEK6jSXtjTBsOGD$c=SJ#HOh8a&vKq*z6nA-mF8) zJN$*-65X!03>?#2N4@IVt{(l|S+{CvY|`6~=BUQX8ohmIoDu$$7L${i-BZIe^(Idl0#*YMmBLYYWIAVYVfg=h?7&zj91cD>vwq2Y)P5*(|E4iX-#i4PJWjtC(kLSlpj z35gOCCL~TsppZx*p+aJX1Ph545-zKW7ZNazh#?{4h#3+zj;JAFp%{_#pwbng}8xL?ntx7?C(4fkYySgc6A*5=^U!CK67oi6;_JtBEKQ zQjVA+LFI@l5>}45B7xN?B<@Jyk;o&V4-A<61O@-|diAUS zUeow?VVY-pZ%S`^KUsSFja=?DoxisEHu@sKVg3~?Ha{mh7p7#Sq$N4i(^Jw@(j0#Q DJ6nx# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Sitka b/pytz/zoneinfo/America/Sitka new file mode 100644 index 0000000000000000000000000000000000000000..f2ae47a323e7ae30dc82ab37bb67ef6ca0464b54 GIT binary patch literal 2324 zcmciCeN2^A0LSr%*9%vur-TF~I=+FtdVqK<%213D35@Gah%5?YSP2Sa_(oDXax1yo z=3o{b=UBC+p6OP)7Fw>gWip0aFLP14HOr}My{$%ZJKy7~t(<@QJUh?lx%d8ex8K*- z(E3!K^S{euzTt4~G>7+;Q#+E>_?(~H$D2~!siPGl_-2Od45W*Y7h~Me?r9=y-TXj! zQ<{oc?hQniMJtcI6!5&fSVg;|f#?Irh4%*?nD)&f74zk3H}=FXb;0VRl_0F*-pcg%$*oGUME&9~bGF=jW;9 z@wxi;4?Qa7aHPIt-}g#%mB?AWr_^l!OgU%GcVceApK{*PPef|`*D@{RZIL!LsnfkX zMf${7I^$xy$Q(JYv(CJvvWNERoFi-1f}R(&e5F?9wkVm`k*D%2o|kvl#i@d{W?7i` zt19x`FN>3>i{cCOWy$0(;;xUq^6s;ri&CAc?|JW-xHk}`7w+9F?rXcK%eK9%7S(*J z7dH>8@&yO=lJZSz$xr8GMfQNGICD}~#%>gqM~3Cn%Z;My)erQt&$?Ch=KcD?cN$bp z<91!Ur&KL3ZP5>PrKq~(O6~JI%J)a6_7|L2{%;?UD^r4E<#TOq>*r z+pfq*M~20!<}vx$P@j0b`jT$y+pnI;9@S5_Y*)>(TCc8XQL8WS)-7q3s^xU2ZuMlU z)&qXM=0dD`dQXRZW-LQI+qFWj)iI*YUnJZ6uZVSpiE@40nCOU~l$|w)MQ3n^?kXNt zT@%0S?gXv6N6zXEzwK5Vhu+tlzUWk&dtTRDj`~&4s$TuvK(Pu5b;7Q9het--z&jZ1 z-|9HQ;A?@9aQlq1&zNAax7~61H6+fyC)U>aoZ5%YsWqqE=hU0eWmV>-tjfGOPKY^w z|Ske(q;L%L=)ZA1EIHH||$XEm)udWSR*=^oNP zq<=^Qkq#m)M0$uc5$Ph*Mx>8c(@3O~R?|wPmsZnEq?<@Pk$xf#MLLSK6zM6_RHUm& zTamt6O=FSHT1{(_-das_k?tbxMf!_080j$5V!Ybpu<+1`>)nyjQ8(~*obfj(a&H>X z{;ke`x@<~qT4?HQx@_v4V4unMn_0`MO`EUL>3W;#e_Q=et<8UMwcB1QUP8~as`GR5 Pa%5I@Zf;I)j`aQoFr7}n literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/St_Barthelemy b/pytz/zoneinfo/America/St_Barthelemy new file mode 100644 index 0000000000000000000000000000000000000000..15c0f1f7450c27dcc5971c9769455758f1606817 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVN6xxPkHi|6>6R4FCThKfu7^;~T=@7#spp#1KM) PLH~gOuVGw3Q%$%4?mi!V literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/St_Johns b/pytz/zoneinfo/America/St_Johns new file mode 100644 index 0000000000000000000000000000000000000000..e7a18d601d0255c26885313540cbe755e009a77d GIT binary patch literal 3638 zcmcK6dr*{B9EWjGquWM^7MY6~lG}NXO*2$8HO;s?>*p01#_^Be^Ub@a zXij?A-(J!BD|~qUs6RZ%t=wMF^Z8ZHo#o!rM=Lh$SzNjHA^!`mko(0I13fP-?R2lQ zk9l6Un%u9WHQ8)xS0P*97LcYrd%PzrJlrV{Jp3 z|BV`}vF?>}&zs98HP%0Hzvr!a$&GK%De$b#iEUgrDbwQ}ajB!KuzQ=^SDtgLZ+m3byKmRVZ}O(O-dogG_5L&cT_4QcQT5@%cGpK^>#H{3 z(AWF%z!g=_gu~uXy1kjaW$Z?feV)$>G?FJFH7aIW~O+$Fy*N)z9dCdh9m z_ZNZdI^}oC?V>q5UVY!MuhWv)p;`_dc3LC-s&&V1=RmVh9jsgD{II!F{rIj=wAD7q zpDHTFq2(3w=lhn3!^LGXc)casa|`8>ODBn6MrFyP$py}@y^~}|bf(jB^m28qCDG|r z!_;q1v~%1Wr9!W^I$=-mSK$vfI^7m-RozSWi-_4Rvd6ToB67kO8I@Wiq6e>$F@2Vc z*s#ZB>`%9gQ@$#ZJ@+nidTp96PhDT^^sc^5^?CM6r|-klRKG~CI*s@KW-0?9U2(kWZUPpMh4FJ<=Z264Y5X+ zyX=(u9@ePR1UvQd@2#}C7X;Jq_{7S{jt`EWzSAfEU&OHeJ(99p}5SxZ0S^MVs4>*xs_^Vj>@vLGW%Is zhZhF3N2Ua_cg+k=?$swSx&ETyl!HG9u2?B;_nzKX&f;iY7r&g`5DdBcPGqF`j1ES&2SRF;ikwsAq#|b( zIjzWfMNTYoW|32ioLi$lxyac?PA_tPkrRxZVdNAe=NLK3$XP~CGjg7h6OEi{NxNFi6j)sD3Venr$|zftRiVe@`@xD$t;puB)3MLTqL_j zon9orNP>|JBPm95j3gP!GLmK_&q$(?Oe3jAa*ZS#$+l6a8_744a3teM%8{HSNk_7d zq#emSl6WNZNa~T?8+G!L>>G9Zk^CF=1VCm0G6j%1fJ_2p79i6AnFq*3KxP6m6_B}L z)RO_34Msg3kojQL69SnL$do|l1Tra*S%FLoWL_W>1DP4f)IjD2GC7dhVbs$DnIA?y zL68|@)KdhRBgiB{W(hJ)ka>bk6lA6#Qw5nT$Yeogi&0M(WWE^ngh6JEQBN6U&LEQp znKj6?LFNrIagdqQE&M;cBf58aN9v(-65dfK;dlP^-)R<(-Z^^h=$)h2PPExGJUf3p z_cUM8J4dgb0Vlre&SBx`&p$1mKPQiQh}A!nF)kxj|M-ZUjFj}0)DbypX(?$bsjMR1+=$HP#&I literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/St_Lucia b/pytz/zoneinfo/America/St_Lucia new file mode 100644 index 0000000000000000000000000000000000000000..b37a1cf7e807d05d1797d3e3fe6a783ead623244 GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL?jzJc-o|6>;z82^K wLCioY5C#E|As{x-e;~+g7uf)!!Go&W#< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/St_Thomas b/pytz/zoneinfo/America/St_Thomas new file mode 100644 index 0000000000000000000000000000000000000000..482f0b549fb8e2bb7e8ce74c8b51798a45662a38 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOHFPhkB2|F8lB!~g%s4=}L!_=Yez28RIU7#KoG QFz7!J;5Cd3XsQVp09vRWVE_OC literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/St_Vincent b/pytz/zoneinfo/America/St_Vincent new file mode 100644 index 0000000000000000000000000000000000000000..e553af77b5349c15371947e1d874e33009f556bb GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIVL?j{(|xU|6?;482^K wLCioY5C#E|As{x-e;~+g7kL4q!GPnf?;Jz(0@Rq17TML+sa@`EoPIj_O2KNba#TXX#lUSMSY}+(~!w(sW;H($D71TY6sJU&m(9Y0B^+ zGNWokKI$VoKDZXYn6U{jG3D#}{idBe?Ta{fRr7r3&aBMEcPie7Eeo6ZQ1Tl(1)Uw8 ztx(qWCf?5u|54Lvs0yhIsSK$NsUB17Lli(XKvY0UA>oEWT literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Tegucigalpa b/pytz/zoneinfo/America/Tegucigalpa new file mode 100644 index 0000000000000000000000000000000000000000..477e93950c2f09b8c338033c07a53d4ef5c01912 GIT binary patch literal 264 zcmWHE%1kq2zyQoZ5fBCeb|40^d6xKiyC}@M^FT3Xc7RgVz6Z)SwE-@%Jr7*2ow&fn z2!{Xvud`ub`2TbwKsmI@lw7BhhkMq9R8xhj!TVJX4OHmp<#V0!@rKHr&@$_Bi#jmyOuB}B zD!XY+=JYm;g9X>*q1qymn{-Cz<)(?eZ$sLhSg71{0i7R}qVgxJ^^uhrb#$a#dOkRX zH&7*yJ=`n`DqT_x{t$(kvGVw(1yQsuT>6S13Eyf^mZXh{l3m!1q{%*8vSe_M)w-WT(w@d0=+a`T}Vn#I;f6*5P##M9Ld)?C1uP(+s(5(fHs&(z1 zY)kJGZHtq#V@reRm>!g!KRu#rv|V;D*hQeHOkSRf7CqG&^2+V6VqMrjeL|rpy*67Y zG_S(eheESYZ5upZpDicX+#(+lnB)74R6^#E3;&S}k`0m$k`Iy)k`a;;k`s~?k`8PROK?Ss~Lx=7mfQnHe%QWNyghkl9(9 z=^^v8G!sN-XlbU1%n_L+GD~Ed$UKpW;(s#JNVC{fv)lx4irr~XPVhP$c85JV@;7N6 BlW70| literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Thunder_Bay b/pytz/zoneinfo/America/Thunder_Bay new file mode 100644 index 0000000000000000000000000000000000000000..34f750b4df72db9977cdcef0921cdd5eff95b799 GIT binary patch literal 2185 zcmd7SZ%oxy9LMn=2u2r3C@4}Q1B-$DHx!LZ14gJC@>Fp?gy zW`kOdRa&!uBQsmB#-yCJwK8S3{*8`p@t}nrqX#Y4y`A^5C#`z!`R)8(clSQMpLd`s zw6)Cp*NL~^a5;VU@;R-4-cJ3=<3>*B{3fT>wDtxgCZ_j{j=f)-84^)(>Q9Mp&?;f> zs9c57=;xmt_M7>9nzJ5_B9}CJQM|D(lc^a`g*`)ZDOVu6cN$ z%5MC@SU96l>IzW0#6ssD4i`PnUcY5QBUtY^2nrT!_YYTm4>i^Eb=U8QQK4w~A+O}cih z&(tL^({+d2%<{<`z2dpOvhvHN%D<~sR=tz0>NohMVIWT3R#_~o@0(C-GE*hc_^}F1 zPs!TySJm1dXPI?bC-l1G=gj)ZLEUs<%-k{Fr#JK*F?Wu%>5a{UX4B9rt^9Ax=H6Dd zrEoy*3i?%Za;LP^7OR%YCJE-Is^F)U5}G-sLT_ZrwuvuP>%bDzcJiFQJDh3m86MN^ zjS(aLNA$hr+H|xJ>h0+tm>u<9dPn4Y30DlL@c5{7W^}5~k^R#3dy{%#Xpijts#5Lh z4$6b?W~uItb+Y?uPsPN}h>5!(o@n&7=RGePJ^H2>7ma>&EGEIdliWL{YE8ha;ofd< zgT2)O`#1Mu&c6cxy^NXmS1#uXd->< zRAjBlVv*G%%SG0UEEriavSeh<$fBKg)yT4)cHPLrk(DD$N7jxk9$7uId}RGd0gwtH zB|vI`6alFMQU<5315ya25=beKS|G(hs)3XPsRvRJq#{U3keVPxaoVaNWpUcNAcb+- z${?jdYJ(I9sSZ*eq&`T2kP0CsLTZE*$!V*El*wu9gcQnYD}|H_sTEQzq*_S1ka{5n zLn?-p45=AXG^A=s*_^g+Na38ea!Bc%wsuJIkm@1jL+XbV5UC(iLZpUB5s@k)Wpvs) zB87C?N+P9n+FByTM5>9D6R9UsP^6;xcS+-7<1dIO8hzc?(FN6})CTn*DRn_jTj>vY h{}a{oRkd%QEpE9jZGnG5QCU$*fxoo0sI;iW_ZPOwXY~L8 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Tijuana b/pytz/zoneinfo/America/Tijuana new file mode 100644 index 0000000000000000000000000000000000000000..fffdc24bfc4c076584787843a5a6b457a23c5bf2 GIT binary patch literal 2342 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 PsH3w}r+`iYK_34C{Ai2_ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Tortola b/pytz/zoneinfo/America/Tortola new file mode 100644 index 0000000000000000000000000000000000000000..6f9d9323858c42dfe192bcf61fadf5e76b0e4540 GIT binary patch literal 156 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOHF7h(MW|8Nci!~g%s4=}L!_=Yez28VzYF@%s{ P(0?GnYZw>MR1+=$SFjyn literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Vancouver b/pytz/zoneinfo/America/Vancouver new file mode 100644 index 0000000000000000000000000000000000000000..0c1fa52690498b3cd087a90ba9ba4d4f0467d532 GIT binary patch literal 2875 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 F{Ry)=ETsSd literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Winnipeg b/pytz/zoneinfo/America/Winnipeg new file mode 100644 index 0000000000000000000000000000000000000000..2d22791686e86b2f17a0f7fa53ad71f03a3384fc GIT binary patch literal 2865 zcmb`IeN0t#9EZObQ4mGR#0UvYD~2Khis1`op<|E;>J?GQ)G)*{j&CTw;J3v@|5CGj z8Aa--bL0cyEa($RfYP;x`kFl zS(aYRb6br?33@4cxOI6(m|lqpvYL`c%b&f5*;m6uPEE{N zrHT9V8^#VP)^TGeTH|i-m!!e-?WCG*lI)*mC+}S$Da|qV8=r2`@wF4I)Rl!gVPCYB zmYt>Pn|oOkMTk(6j&{b(@N~cZOvK` zUv3rDpVDPPYpi8ed$h1+uC=^uldd?IVy!G%qN^$+t)dxIb@kRBmbf^)Iyrdoq2sG} z=O=qS_6Ixu8~;D`cn<7#iO2KxcJX%ZeVuFf_RkZ?x+QV4Ij5R4-OU^Ba=EyQxI4Ci zdFRY)`(TG2-uL#Hm<3`NhsH1v%Ro#6u?@sH5bHq91F;XpKoAQ-Oa!qJ#7Gb;IW%U1*vX+W6vR>x zQ$cJ6F&4yH5OYE71u>XIV=;)yAU1;-4LVli2D33^H-_ODmSdO>VmpZOAl8GJ4`M%v z0U;K2XiNyPA;gFbD?-f3up`5e3`;Uh$*?8Em<($&%*n7P!=Mn0GEC~w*c4(^h*cqG zh1eBhScqjAriIv+VO)lF8Rli!mtkOs#=;O2J2WYP?yF(1musp={4BJDD53xSP{0@!%Aq9X`z@aGt zqXrI55g1i)Xv)B-1Edg;NP9Y}c~^??)!QXxo*AT@GmiUg^WLsKS5ogA7%K`I3)6{A*=Vlk=( zDHo$&kb*HP1}Pb%W)4l!AXRf{$_A;MLsK|Nz7m-_ SG%7YKIx;mTCMqT>+V4Ls5UTkDs?ln@t*PF_H+9#C#Y84A%W5)iL%LS&)XJFEnQF}#3MI&#a) zY;!mp9Ou|-%XX$)=?b)5Ys+K|H>**UZq0J(TDMgcZ|8ehf93eo=h=Ba&z|S+-`CsF z@?4(tzbo8);c)FYhxeoldl&2R1;4h9H!Ty>r`O29n?=IuFO)&ACW+v#L>aQBK!rBt z>#*7c6=snH0QIC1u9OB>lWX&%3%vC66!E z_kQG3DJR4AeaC)KqO(}u-+MvL_sx?FHhnJ^=KmuXt@>1?#(g8xGTs(x(^ER#y#Ma$P~RIXpiy!Je`wBlvCtS(mNr!~uhyx&!! z>rq*hJXaK5TP%yGeiILT;+79id@f3Ks($GGGveWc5qkO2qvDa)>$-IJdum1XXL@Dx z5mmP29bI0wU6ucGMOI|@i;7Fc%~~ z=5UFsE%ECoI#X0#vPXM;j`IGUseSoZmG8U95(C^u6ay8GteiVt@=?n^&MC1vq$v?{~pyGt@XwVzuI`?koKo}l>cIfZgFL*mJ>d` z=~}dU{&2f|VJt(u*tte-)={F>S18*K+!R|166H&+W1>B7N_JGA6di$h-B~oMIw$|s zT?txsjZEmRe;iWV28Q+aFFMqYoy%d7hxzI_LFUXny|>;@g!#?kI%p2>DFJgW zKX-X2cJ~#YMfQYj%4&9nc3Zr#FD|n&U}wnIki8+BLw1L3580p9Y!KO@)oc;jBeF?k zm&i7eeIgr0c8Y8j*(MMF4A74zc|z2kkH_;S#MYPZM+?4w3iBZo1EI_-m=A}(XsY#;_50>;#sQv fUzcZemsZw!i>Y>2)zX~29GO*>o12rHBi;W3*T_f$ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/America/Yellowknife b/pytz/zoneinfo/America/Yellowknife new file mode 100644 index 0000000000000000000000000000000000000000..947bec914be3721c864580ae1ad150aebafcc957 GIT binary patch literal 1966 zcmdtiZ%h<)9LMn=V5v9M-&QCJ{z=Uf;*LK`0;yR+7t)2{iAaQ5;O#Vn)ZO$%{I+n6 zM}Ak1wW%yu%?GU{b*<(`a}A%A&7E7zTDbmimW}>wvRPce_wQ+sder9E-Mt(e>Tum?evpc;l-`p&1?VebEc>JzJhrN4C#N^dK zYG+p$nK?zvZT{jqnL9mT=Vb?F-tWt_;M?g^n4YHdFZ?VE-n*^~PhOHm$@%u4mrl## zO&Pmn$ERj#wD@|=+&A)umR#wU(9mHGpKX%T z-nf>%x>CyHeYRrHY*`W6ZdW!3dAhQUSh&a{lqv|A=eP3xQE_NlQ`rmZh+pB@=7?H%Xr)}fu|ndoKR*55DBhR*17 z@q~2DII5kI2I;(!)Oau?@k=e5m^w=m@6_myAAggbgPZO1muH$?$!hz;>2cH5TwuG8 zq|J+!f7{(%=ggkGYj$trpxHZlOOsV+BsuoA?#n+a`$j&}{S!$^4V}~jU$jV1@5_4d zgBs~=@6pGIi5c9{5cXp zGC)#5a`3t&kSvfikUWq?kW7$NkX(>tkZd^8LGs~92+7FnQbKa_x}=b-IMPD$LJ~tV zLsCO>Ly|+XL()U?LlQ(XL{da@^tvRGEIHCd^5jSq$&@2iBv+1Pk!+E4k$jPak&L}A zWh7^>OB%`A>(WN@=13gL97!F?9Z4R^9!Vd`ADIAT2E1+xkU8+WNkC@7>!tyj2abtA zW`biXkh$QP3}iMqrURJ|WI~V`L8b(m6R(>TWLCUxT9A41x`{z%2ALXUZa5|fnH`Sl zLFR{Jf{+>Fm?C73yl#?^S@ODRLgvZqCJLD;WU7$4LM98DEo8dzHkq%08@5$$(@LT% R!WH4Nl4yB(xIA1I_y;nR-WUJ? literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Antarctica/Casey b/pytz/zoneinfo/Antarctica/Casey new file mode 100644 index 0000000000000000000000000000000000000000..8ebf0598ff90ab24c884305f36947b002058691a GIT binary patch literal 255 zcmWHE%1kq2zyK^j5fBCeRv-qkdH>0sY4Ezmrr_Ow>Vx0PIST&HXD2W+F)}fORDnQ2 z14!Yl4GbI*c2!jsLwIlqgR>)$00Kr34k5wD|3Cn;6{HztGl&M+4x&LW0MX>Rf(z&_ HT?;M%FIg&< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Antarctica/Davis b/pytz/zoneinfo/Antarctica/Davis new file mode 100644 index 0000000000000000000000000000000000000000..cd7acad690b66f1ea56ce556858988a73135109b GIT binary patch literal 276 zcmWHE%1kq2zyK^j5fBCeb|40^IiJsQVEE>KU*MnnY6h=cA_m^me>wQATxHL-A{C7x1{6UR)mno69 zB8~JN(5UewjrO`UX3(LrhZA+#rCy1v^k}?}X+mL}EU)`0D-ur0%F5aF>CIlvIPR1+N9#0mf0brcoRzf&`MNIqh^&u^ z)$H&x$(|P7Fp(-bFW+je?}Kjaf1r5-DVpCkE(Ptu>O3?R&^Pw);QvFy9U0&Jh z?A2}Q*VGl;qDA&{DGt0L#os%n!9eg%uL4*sN!x+ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Antarctica/Mawson b/pytz/zoneinfo/Antarctica/Mawson new file mode 100644 index 0000000000000000000000000000000000000000..48e24e1e5ef8db1b70ab5233744037522bd06209 GIT binary patch literal 190 zcmWHE%1kq2zyQoZ5fBCeCLji}IUgw)HF(`pa$p3BfI&zC0}BI#TL1$~RaF&(uVZ)! YOo9Ys{{sQYXpmMSjpqVcrEAIs0EkZ)o&W#< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Antarctica/McMurdo b/pytz/zoneinfo/Antarctica/McMurdo new file mode 100644 index 0000000000000000000000000000000000000000..62ac42f078d52d6c24f5e0b0acd243cd1bfbb8cc GIT binary patch literal 2001 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Arctic/Longyearbyen b/pytz/zoneinfo/Arctic/Longyearbyen new file mode 100644 index 0000000000000000000000000000000000000000..6326961453f404a4a886362ee8b684b56fd5b4f1 GIT binary patch literal 2225 zcmciCe@xVM9LMqR0SC#-z5M}a0YV|2*2!=1M_gv-!OS~Lxr|f-6%p&Ayo^C=ta8pZ zV(%Ku9J#CAC#@`Sm5Q4DHO7- z#!l$u=&sn5;3An?^tYyDpVibU->NJAn7W4F(`kbT_4+UO>J1+~uW5&mNcw?p$$0q{ znck+7x%DZ@3P(IHU z*T}qonsojVpWOCMm6mnYsJC~%-o9g@F6d0xJLzz1Y;TjL2VT{?8yn@Gwr6zNeb4Ih@OrJB z6V_0mLhp4g)fJvux?(h6t5V9P>Z{3m|Hw>P`R)Z>HIOW;_fC@Po^$d*>#)>xM5VT7 zK-O&gMb|DkBzm!eIv@1=R-s5T$}SXzco=@V~v z$(CrZZr%N%ZtLEoPqysS*7jDl99CTXIF}>AdG#;LO3!kb|Ky2cIWK))d~@Z!&tDm` zeEyL6F^4$@V`%)9B$+R{Iql}=`MQ72i44sMBa5*$t3j57tOr>TvLa+j$eNHvA*(`` zg{%u%7_u^CX~^1;#UZOhmWQklSs=1PWQn$Bjr>t85?Lj(Ok|zNLXnl)nx!IZMHY*! z7FjN`USz?@ijgHFYep80tQuK1vTkJI$jXtW+nTi_i$_+EEFW1vQUIg^NC}V{AVol` zfRq8L15ya25=bd*O)ZdO*qUk}lnAL2QY55GNSTm2A%#LJg_H`Z6;do)Q!S)iwx(W4!H|j}B|~b4 z6b-2wQZ}S+Na2vmA*DlVhZGN~9#TGAQ$M7DNClA+A~i&ch*S|NBT`4CkVqwwQX;iP ziiuPcDW|QeCsI&bQ&FU(NKKKVB2`7oiqsV;Y@8#`5uY&573WO6`j=%TPvti=K~1m| sJK@sj#Wz>p2ZD6=a%?Zx);uJe{?0DoOHZ&UwKbza0ANNDcK`qY literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Almaty b/pytz/zoneinfo/Asia/Almaty new file mode 100644 index 0000000000000000000000000000000000000000..52f941e266a97069cc0c5ffba74808ee2acfa560 GIT binary patch literal 922 zcmc)IL1Vf^zEI+_I!>rLKw7tiK(i!B$a^h$x7tL?{?Tyli8K+9BvL zhNrQ^gN+?xm!w^Whu>kxU4+=hgdNtQ(;&Kpxq9E{4nn6+{l)irKE=cD`!gODUMAFE z=ZN)$H;1peKk>mg^<{l|FLo+2W1jA=c)UkHhP*$&&Ub&?HGOrT$G=rD1J#oBtmP%R z^iX==k4oQkT0*a)(*L+e2FAMNOlDug(LFgE*pYL`YZ7s_bYyngJpXysb7AwHihio- ziz~}|uw2%c-p=XE#gdLa&+GV;1xZZ4mZ5A>uH3sL!@&oVOvEMGN=YhkTc;X+8EM9J zy825p^^^MQs!wM(e&}m+O?`cFTk97MoqO|LZVcB#4(Flv%XPTpWj*Tr*m>_%>Q!Re_0kcOEj2t{{aG~$=m<{ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Amman b/pytz/zoneinfo/Asia/Amman new file mode 100644 index 0000000000000000000000000000000000000000..3e7d0da6243105f84835587321963390e5ba6ec3 GIT binary patch literal 1863 zcmdVaYfQ~?9LMqhk;v(|dtl}kNphU(D7oYkDp5MCqb0X5rIt%Ls^vbyBl93;ZOu&a zfY{9SfqUiwJ@B9F=K6ITv#{APHskmHn@1j)dE}g(|Lg3mo_*h+U{QIg-}>zpZhqmz ztIB-%-uZOXUAseQjdt`j2O^?VB;xI3+a10{-8Xs!B452%&;2U9^R>a!rS7`j^-#EU z3mvih9=#*|_I0xR*L{-#TQo2*^hBZ-wFCy`U6#Q!9^26+=VZw6OLk1k3K<&NXvapb z*4Ss$1H)cikhs=Td-&PK>TRB8k7&qLU(G2yert&&6du&Xk__>uwaCb+v62*ZK$4@~ zGRn1GQr7O0lsAn!`q_FNbL*mvZJDp*PVAS|raBqFt5zn|R?5WsT$xl{AZZn!baHk` zr=%9^RBuqz)8aM5GfFd~x@%@zZ_RT1B&+qSPJh!)W;8$4>}ww+XZIJGdFZy}Rz8rt z@_NZn+9$!hlRB%{W-0LR(SmP#wXjEx7Czdfvp*DR(fNfs=Vq$T-8)6+9q+I6Hw@7Q z4dX=Sb<~CH`pKe&ZLPNz_y4n}e%Is39>f+aG?=-3YoGUe+IH|dpC~Mk0 zvi3|*S=ahb*6;Z!8&0`(WA#1Rw7X5)x&HJHb2;z!VZ48S|JSEwMIAE-WyK}9+FMrN zfmWwqPkzbH30mpt`8nk*h^6*U?-ra>0(~ijhl3t{J&# zaLn=c`Lux~cL#ji{L+V2cL@Go|L~2BeM5=T& zWg>MtnnICEky4Rbkz$c*k#doGk%Ezmk&=;`9Zk_l)sCiYq;8~eq;jNmq;{luqFx z$f`J+WkJ@((JTzIGRV>(YlAEfvO37};QzHgZZk$B{LGR!XQVILmlW?$^5!Han6Jt4 GiS8dxMbv%( literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Anadyr b/pytz/zoneinfo/Asia/Anadyr new file mode 100644 index 0000000000000000000000000000000000000000..2841a6376d9f9694ab79586449398d15a57d20a5 GIT binary patch literal 1183 zcmdVYPe_wt9KiACb?P!2?OqC3dKT71;BAB@pV;vFGJ|KM&8l?XcfBbMW}F zxcX!H%?UTlF*o~?i9l%d*@NMkvT!iEu44aKxi6h7U%VNu_?jsz%m7 zE|t)zEgPQhn%^)FhuvZQF!wYP>6T!C|Rib6&!BR)@dd(VG`;7aGnw zg@!i+xh?tTvBsx^dh5fqj@;_hO_!s3+nH(|9a^hngB=n-9gywqRnk20Lw1CUq$T!2 zT7E7_YvrPDeg9H+et)NTO=YERep>H-l-KPq?(2>#uu7#wcXPDB`JNLdg*%|k$oS1l6+Dkso8j;|N7D?%TwgBEpvH`S6r)n zUfWuE@b|s>m{Q|I=6_V#8D%S#*VbyKCg<2s&aq!U|GnpAB*$CMQ~ep0NGIIKfegQ* zl*L-!^343hD3{D)oXAM|K4V2ji;UORj2Ia+GHPVp$jFhgBcn&gk0gL(fTV!rfFyxr zfuw=tfh6K;GC@*7a&a}uAlV@4Ao(B(AsHblAvqyQAz2}5A$cK*A(^?F)R5d#(f zNP0+qNP`VDf>x15{vtP E0Wz==iU0rr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Aqtau b/pytz/zoneinfo/Asia/Aqtau new file mode 100644 index 0000000000000000000000000000000000000000..27a3d50d373900078a7088e74e08ce25e002eda7 GIT binary patch literal 1128 zcmdtgPe_wt9KiACZCY+K*&*88GT*WqYU-M9%+i{ILvYfYJ`hB~b10!dCn>rF9U6ks zAxH?KLsWQ(kO_9GphL%q=ip7k=i0#z>m)Ji`94NPp1StDywB(1VZ4IBuRM2oCM&kB zn7!d;_1l+o`-|2E^Xgf>SX*7n>`i>k#G97=_~zFqiO;oa>ss1Rez;jpy{YJZFK_6! z$1{5Wy|cRg*0}bs4eA5uyY#_wN_Px3>qFgjeK_?+ABnE(bYnC~-@aSzoLJ0suCDl9 z?;pmxSKb9jpDzbJ3r~aI%7dWqdL_tQyrYg?STfn!dDB09-waG$HMzD~lh00?d|jGC z>WV6S%A3J&Wp(^*!kk#^RYQw8HT*iJPR_;EsYf+cytJuCDlKL-w^8(Vgc=${_Sw1X zk0%sv3P+-mX!GvvPgsaP-~Jm!p(q-JCMsJCB^jknA@hM7&#-icFAA1%ky~I|6cMRCi&eirin}xnJV98vdDCu zcEZS%kx3)dMkbC-9hp2beWU=S0;B|_2BZk23Zx9A4x|vLtpq8>X=_1>L8?K@LFz#Y zLMlQ^vIuHIibASF%0lWw3Uk`ZkkXvCHl#SDI;1?LKBPdTLZn2bMx;pmKdX$`f@M!G F@&l>+?gan< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Aqtobe b/pytz/zoneinfo/Asia/Aqtobe new file mode 100644 index 0000000000000000000000000000000000000000..3683be2db87b36a072090d2a32622182d23c9b5f GIT binary patch literal 1038 zcmdUtPe>F|9Dv{KuC;%Hx|pl$>X_-Io3*X3tp8UJBB=1Pfglt**iz6bk`4tyEFCJk zC=}vBR6K--73`#f2ag_p2X7)?yok_2Pa%uFZ?;2VmyW&1`+YORFo*d*_tCRlN?lkH z^Mu1{HHYh}Z(MQ{BDiW-{5+kH9-R~__Z+)w=T#xLk(cU~DT&YJ zq~_B@seLmf_VW&@8*i2yBQdG(z9KghMQMorkjBV?IAsy-y!}vU8eUE|?XKC)+h49F z*0%KRrB&TBv!L(fr}f>Jd7Ye`()T9jCH3O9wD!D{wy_CG$0wyd)hF%6LCM6%b!PvT zbe#3-&dsoN?b*6}+0i}gKHd91r2A$Mb@s`z?$0Y3NFO9EpFiODnO%12kL?Ry4u-;i z-$A9)U-=)ItO_VKsG06#E5y9`#JcLeQ|`U<`+8*5RsF-RHy)UI-z`m-&njhErBk{y z)BOiI=Vl=YB8iV63L*<4%%hP85eJb65eSh85ebnA5ektC5etzE5e$(G5e<Ad$iUCbY0g(QQeGe*tW;*x>*G literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ashgabat b/pytz/zoneinfo/Asia/Ashgabat new file mode 100644 index 0000000000000000000000000000000000000000..589dbc18ea2d733aa736b32ab888abda675118ab GIT binary patch literal 657 zcmc)Hy-UMD7=ZDMw%Vpb2ho1SkN6p@2qGv74iQ8;R0uR6h(o7>;3_&ex~czxgV0SJ zvbYs=6&&8(!NtYJL0v?P-g8k9oSb|^?zvt|2)~9KTlHD>YixbO%@p;`zWc0jymHZK z`90oY)SJI@bE(Uj-0Smc{^2Pq+DW;b%02hw-GBmF0J88}*(!Tqwh+lw-^IVr;x zM@E*qWOS+}W6qK3NUe$LseA=kag!nl;~MD{G-zu9nSG4OOT=GL{~*`C7t1fPClyg#yDPz@Y$9 zkW4ic1&abkL8HJ?@F;*3L<%GYlLAUXrNB~fDZmtD3bd)lrhrq>P5&F-*8j-#oc#%Z C>3_BW literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ashkhabad b/pytz/zoneinfo/Asia/Ashkhabad new file mode 100644 index 0000000000000000000000000000000000000000..589dbc18ea2d733aa736b32ab888abda675118ab GIT binary patch literal 657 zcmc)Hy-UMD7=ZDMw%Vpb2ho1SkN6p@2qGv74iQ8;R0uR6h(o7>;3_&ex~czxgV0SJ zvbYs=6&&8(!NtYJL0v?P-g8k9oSb|^?zvt|2)~9KTlHD>YixbO%@p;`zWc0jymHZK z`90oY)SJI@bE(Uj-0Smc{^2Pq+DW;b%02hw-GBmF0J88}*(!Tqwh+lw-^IVr;x zM@E*qWOS+}W6qK3NUe$LseA=kag!nl;~MD{G-zu9nSG4OOT=GL{~*`C7t1fPClyg#yDPz@Y$9 zkW4ic1&abkL8HJ?@F;*3L<%GYlLAUXrNB~fDZmtD3bd)lrhrq>P5&F-*8j-#oc#%Z C>3_BW literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Baghdad b/pytz/zoneinfo/Asia/Baghdad new file mode 100644 index 0000000000000000000000000000000000000000..3ad361495ce53b051219d0043eba265ef81130ce GIT binary patch literal 962 zcmb7?KS-2u9EZPm-i4@SwCJg2+8;gh>Qz(EI`#EmE*HGu;ZTANDM?C04G|Jw5Trp6 zY$!-1C~Am?S_DCe28(FOMWPyhi|EoM2#I0e=OmD7@$>S#=jD_ee$SJ+JThD_|14_X za9E=q-V5fulq>SC2SrW#ct5mb8<~9l9dhaRopAA4 z+T}w8KqNp!Kx9CKK%_v#K;%FKK_o#$L1aOML8L*%LF8p=0vQq^A{jCvLLpKaVi|HF zf+3O_q9L*w!Wq&b;vw=G0c2?rKtf=|00{yT1tSbb9FRaDkuXAm#KH)M5e+09NIZ;y t*lt8Q;p`KM?&GmLd&VzVOIDG!WEELU1$*Dq*3w@+{Rv9)EV4vH-fxKV!%qMJ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Bahrain b/pytz/zoneinfo/Asia/Bahrain new file mode 100644 index 0000000000000000000000000000000000000000..d87b7ce73915d8135e07945eec99d84d3d706880 GIT binary patch literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}c@}<}C&JP-=>Q{8L_Y^4W#PcU!oZ+qz`)_-8^Yio e9KzrT#1Ifdg314Z0AxByC-F9L0WH%t<^lk%D;cc- literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Baku b/pytz/zoneinfo/Asia/Baku new file mode 100644 index 0000000000000000000000000000000000000000..72ae96e9cc952d2aad5ffdf5284b9a62c24f2154 GIT binary patch literal 1942 zcmd^NfU!H`I3oQ2s4>PB!loiZzCbDB<}paobUP0cbZhA|++PR}ra^r#qcW;*IXZGogkDLAYo;zgUMMT-dud}!x-^w#$jUmmtjda))rF5`P5ghdHnW?q{kKEb#r>`8Ze5b~ zPk+`8=MTxo_Osf2xJ@^m+oPM;AJi?oo75H2rSpo6dgtmI-7VT36YK8&$uE(Ns~n)= zUWpVbDs{O<`~jXj?{DAm-uz8Z-n)9+U(K`m^}XkkU`QqwOtZI&kQ7w$F%QgT#@&AD zyqPbdk2u?}%{bqXGtNKZoI}n!iUkh2dt{}2Zt9za}x_yBPN;swMFh#wF~ zAf7;6f%pP(#?p8LamUj5191rA5yT~kPnO0hh*u1^7=AGvvoxMDT(dO3F`R>V$8Zng zAH+e3hY%MbK0=&icnNWn;U~mVhNlo$Esd`XXDyAl40jp+G8~3@%y1dvGs9_!*ATZM zenT9Gcn)#h()bQ>-qLsvai8HoqydZ$Fj~Oq0iy|wE-=~v=>ww?kWMgK0qFJ4CS zkaj@&0ci-NBaoIbdID(*qbrcMF#5u145KrQ)-Za*XpW`n4x>Gmraz1ZK{~`}5u`_u iCPBIcKgTx3n0}4SC19RlPKGbTo0;ngW_j(CFXjzafS}m` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Bangkok b/pytz/zoneinfo/Asia/Bangkok new file mode 100644 index 0000000000000000000000000000000000000000..44a1018ef6385dea4a0fbc4fc6a9cc0726ad067c GIT binary patch literal 178 zcmWHE%1kq2zyM4@5fBCeMj!^UITmH59|3aWY(Sz(1q>`sz99^r&LJQ!LkM<*n1NCt t3<4lSKy04>KoGXA^$3Ut8w!+xmp$g z*E6`Lep9~dKS!*6!^P2QFYXiG3)Py#?JvraWiP0srTsdRnPuM3>d@WyTs7U7`y`sZ z+e9Zka%swE>e7(Xmq$j-$Us=GoZDhXyY7&&-lJ-~twK+VtW)lsXZ7T=ICIm~k0d^$ zNX1{ds1w}{Ch^=YGUb;sGxhjENjj6RrtLqgr+?s9Gn$X-ac8_-DE-~t+FZpRaKW-C3Vq8_2l&hQh$26Y8XzDr@Hgh z=5LC1bq*T`M=aHGlop7cUW4-Pnhk~zL4#@ z%j_6^SK4~pP5a`E`zKCGbGiNgl|h%^AGD7y zSMdJ_5NChl;@E31?vwtqN9Dj*pCV&G27!zM83r;AWFW{$9PLn$u{henAfs`#!$HP_ z3c{jL0C7Q6j@c z#)%9R87VSUWUR}X_)X1=raU%mqMve>}89Op~Wc0}J zk?|t|aI_IXLf~j)fCK@F0ulx!4oD!7NFbp=Vu1t$i3So5BpygWkcc25akMc(g5qeS zf`kQ$3lbP4GDv8U*dW0{qJxA7i4PJWBtl4t9Bqt{AUWD7Az?z|gaitS6cQ>VR!Fdr zXd&T3;)MhZi5Llknkb#Ljs6I5D6g?LnMff z<0qVF!pJjmL;{IK5(y;|OC*>`G?8$|#@s-so$MognC<5zr=JNG0rL5;hT59goO<$k VnH!kzE%5s0`Emn!zJKl#{|4X}d;df!Yq@V!=hUeS=^I7s2761RNA`u_9ecsP%m>SVSkszQ?`q@$PZMeV=o=FrE9H#h-XE5SrhBA$GcFHbX_QAs_R6EZKjpFbsyrV3C{NVBmofiFI=1#L-Mlm>TfTHz zC*RDQ@wbN6`sA+JwotL!?-b0A*|KF_&zh&km#su@qIkORp4XYbR65gi!%HSorQ}A= zOGQWRRJp_Ju5{TwulISqD~5e`q229!S+Vzs5nMrhL7ZtSZxDA7e-MWdj}Vs-pAe@I zuMoEozYxa|&k)xT-w@{z@0!Xz#6P3~NC%J>AU!~ufOG+A1JVbi5lAPHRv^7Vnt^nq rsoH_`qp2E#bOdP$(i5a9NLP@yAbmj^gLDRIO>>*{7R(MgZOPy-caz>; literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Brunei b/pytz/zoneinfo/Asia/Brunei new file mode 100644 index 0000000000000000000000000000000000000000..d6e713d436fb05ccf2112eecda9943acfb86ccf2 GIT binary patch literal 187 zcmWHE%1kq2zyQoZ5fBCeCLji}Io5VDx$H`J?_dOqWbXk0CgIbS=05(J~!e literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Calcutta b/pytz/zoneinfo/Asia/Calcutta new file mode 100644 index 0000000000000000000000000000000000000000..bc909c92c14d0e35a1733204663dda841d768b19 GIT binary patch literal 265 zcmWHE%1kq2zyK^j5fBCe7@POh?Y0ePSPLc2Of_0@sYGZ7BNHn!V7i_uMf~ISlz?Gzy)-kuBnx=0T%%MvO7fp literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Choibalsan b/pytz/zoneinfo/Asia/Choibalsan new file mode 100644 index 0000000000000000000000000000000000000000..043b7ed5c2d721900d8f45f7a7ab122096d7ccb6 GIT binary patch literal 890 zcmc)IJ1hfn9Ki8^wIoWsVnEgVO_h2?ylI6*%ittJB!40jso_7^B;3$Q(BTFnVjvzd z8jTVL8a+rXx5&Et-AdY)3X(_>LU%Ncgbrt%w?I4(?R76d1X^q zy=wMk$`*HqYE6BY?JoyL$JwslxxZs{ZRvV&fW{f^9p!Wy-hQGN&50sS~ z18%< zk|EiUbVxoVA(9bEiR46*B3Y5NNM0l{k{L;jY?bOu$S_z!C8o(yWA96xBVYcptEQvSfm%!C9P7?R(Bj7=&4nOZl2k&}U;pn-wc z$2Ww*$KNl6!Py0fgF`@Sz#xPKC;kTlkTXFVK~4qHAm@Sr$jKlY-T(oRS3oq#J75~RNCC0F}}}iU0rr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Chungking b/pytz/zoneinfo/Asia/Chungking new file mode 100644 index 0000000000000000000000000000000000000000..8a7a28a480a405b75fd1684d757b0db5646b8eb2 GIT binary patch literal 389 zcmWHE%1kq2zyK^j5fBCeJ|G6M1vmU#F-17{q=4KmGY0w0`T~Wzj0Q!|!~&%_uLfmJ z=K>Y?bOu$S_z!C8o(yWA96xBVYcptEQvSfm%!C9P7?R(Bj7=&4nOZl2k&}U;pn-wc z$2Ww*$KNl6!Py0fgF`@Sz#xPKC;kTlkTXFVK~4qHAm@Sr$jKlY-T(oRS3oq#J75~RNCC0F}}}iU0rr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Colombo b/pytz/zoneinfo/Asia/Colombo new file mode 100644 index 0000000000000000000000000000000000000000..c71c0503d9998b579b22417f416c00672902e9c8 GIT binary patch literal 363 zcmWHE%1kq2zyRz(5fBCe7+bJ??p~SGQ8F55rfM&^RN7!+xQs!=sE|Ry#r~BBBNHK)R4X z2zGY?jbi{|5P-2o{{unTwwWp*8stV04RR-l2DuePgWLEuSx literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Dacca b/pytz/zoneinfo/Asia/Dacca new file mode 100644 index 0000000000000000000000000000000000000000..52e98ffc2c14d438032e6c2af40fd88433424eb2 GIT binary patch literal 364 zcmWHE%1kq2zyNGO5fBCeb|40^rBB^%+i-@pP~yx~qZM~oT$;h;KUcxa`iOwH&5aO7 zCPro!Ru%?^pbH>9(HRUtwr>OjCj&!B0s}9Y6k=dVDqs}z@C{*b3JnTj@C*)NaB*}7 z@?1a|$U_Dp*j)y44G4n(2M~kU^8bM#v#o6phz7Y5M1x!krh%>n(I6LtG=W?VqCqYP z(Gb@&GqJF;u>zfW1SAIZ1km|FPXKKIdII8nL9i#pz@Cuu0eXT+k1#NB0X?W|#svUC C*iQTa literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Damascus b/pytz/zoneinfo/Asia/Damascus new file mode 100644 index 0000000000000000000000000000000000000000..4b610b5a0836df1e06033c1b28afd4152e2493eb GIT binary patch literal 2306 zcmdVaeN0t#9LMn=AVP>}q$?i=q$0+{1+IVv2o@4y7yAVl$Aij`CKx>?zg1nZXG!*i-XjL`e8&M(CmvGxYZfJ1lso z2s`gFrdT4^o$>3MnA#d#|J>};8EG(jbH zSLvj#0?V_vT_(4;sg#EIbZV7QUYVws=3G>1sgKL_s83Z!WS3qR_^P#RcgkyL(PLq?mi?R_V=sex;?Ta z?RDiZ?$xEUwyQPXU3$%EjVg=WsLQ_Vw91Elx}v|@s{GQU*B;2T)*YRx*LTEPRb5F^ ztqZZL+h)i|vVXQ}Dz3;!7f)4>Wqu_$1Yc6MbC1i~p|h$k=nGwU>K(Q5hhw_FXPE9U)sn_JnK-*%h)aWM9a}kewl0L-vMj4%r>DJ!F5#23?&UB3pEI z_K0i}*(I_~WS{76loxi&Ia}q}E3#Q+x5##p{URIY*fFwYS7*=2rd^#~BirWKH?nbL z=g8JM_Ks|xWB17RIrfh^gZq#H;(kbWQy zK{|r81nCLV6r?LiTadmWjX^qtw8qux4bmK>J4kzw{vZuPI)tp}Lpq1F4(Xk%(>$bmu1@=q z{vi!SI*7Co=^@fYq>D%!kv<}gL^_GI66qz9(HRUtwr>OjCj&!B0s}9Y6k=dVDqs}z@C{*b3JnTj@C*)NaB*}7 z@?1a|$U_Dp*j)y44G4n(2M~kU^8bM#v#o6phz7Y5M1x!krh%>n(I6LtG=W?VqCqYP z(Gb@&GqJF;u>zfW1SAIZ1km|FPXKKIdII8nL9i#pz@Cuu0eXT+k1#NB0X?W|#svUC C*iQTa literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Dili b/pytz/zoneinfo/Asia/Dili new file mode 100644 index 0000000000000000000000000000000000000000..37bfc4b2786b53487a2507e39dd077d50eef6e70 GIT binary patch literal 293 zcmWHE%1kq2zyNGO5fBCeRv-qk1tvX{IC6TX(T7W6?+UnI85CF^p2@(-#LU9Xz)-pe zq_UuafrWvgZUO@bm;|zcB0Lbbk8cP=h))QES8xb}vu6lMIUIzL;E4Y~0CEV31~~>q WgB%1h4CE*fO*Myc0bQ(X$prwJB|29C literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Dubai b/pytz/zoneinfo/Asia/Dubai new file mode 100644 index 0000000000000000000000000000000000000000..53f70d57a15a664efcc942a4e1644b0fd0b31c9e GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UITn7JxdO;Bz5x=oaA08Z@eN^c4-Nrw8A3=f=sytP MHH-^rs;&ta0B1oJN&o-= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Dushanbe b/pytz/zoneinfo/Asia/Dushanbe new file mode 100644 index 0000000000000000000000000000000000000000..c65ff2a7b3e5020f2427309c65caa2e950565690 GIT binary patch literal 597 zcmchTzbi#?6u{5r;(3x+;@#^#JU_2`DJcuf9i-@~SFVx_GSDl7$wa-fD*gb&Et@Qq z&2VN}%oYQK#ak=}KhEdAlrmYIZ{PDdoxVRhpJ=tRIVry)WgRx**{1G1^AD<5r?rW$ zU_b8mE;HHGMIrn4bnHDp#{RvZ>A9`Mx$9lcpKodJ$%^(J&TIePv=+9DIp z&3x!^v8E%r2OVv@)4+WXgV&dE?B=NKG&a%9*81{ lCWtDCE{HOSHi$ZiK8QkyMu{eOBYcGhMZ{~f!2 z!p*7FH}9h#lwVO#KHfE-UifW1yFV;Dn`@P9t&`6W3-#jYL+{I)Hec5+CA(eQMfb4N z?1{P|dR__nrFYcddu_MT*V*9zdScM%Z@cRC*CqP~T0Z#)E6RIaJ}&V7jtE!NkXkyk zTIAS^%$)IhmD?}mviDUgud`4tzg?hKTuPEF&m^k+X1iR~5UvWg9#n;upVjJu>;59= zdEuTuW)@F-ql&xtc-IV6s{}Dh3?n_mrvJP#@%n}LVb<#u>&eu>bGO@LxZRsPMoE#r zwbtQV`gnp*C_;b4&8gBi?`MqbQ{P_NhRg|>6f!GhTFAVRi6JvXriRQ7nH(}ZOFcbg zewKQI$PAGwB6CD0iOdq2CNfWCqR32EUypf3`Ge@S5%pI9LGJ9nD$o!E6kPIw!3P=t}5=a(E8b}^UB1k4kDo8F!GL||U zBpoClBq1atBqby#OPv&w6_S>v&I?Hl$qY#i$qh*k$qq>m$qz{o$q-2q$q`8s$@)O%P2Wm&H8^#;5hW>&P>N28Y>}N literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Harbin b/pytz/zoneinfo/Asia/Harbin new file mode 100644 index 0000000000000000000000000000000000000000..11e352a511061f835f106d48e500a54e85a01663 GIT binary patch literal 463 zcmWHE%1kq2zyNGO5fBCeK_CXP1vmVgx@X7ba}~!Y{A&0qKJ|le?&cqIyUZBmGwTZ! z>M|M>JrfI*;=CG^HJuAo+|wCUh2lS`se3Z0eRBMu!LH4qaY^|DBNH1VFw9(IB6LX`t^x SG$;hXG)+Q*3m7!I7F+-vLSpU! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Hebron b/pytz/zoneinfo/Asia/Hebron new file mode 100644 index 0000000000000000000000000000000000000000..b5bcaa0d2fab7037c6f5019e0595a3e3638404bc GIT binary patch literal 1590 zcmZ|PSx8h-0Eh8AF5^alK~Z5YWonCNmZoi{Ihv++A$!OykCZ}0G*B;6(G(Swf%p&+ z1x17)6j>1wVvA6;ds-oS==4yET8&GZhS~Yf5D1Oua_2YPVG#8HSysNYCe8ZqIQ0{5 zj?g#nBOhA*>*z2H$1GN@bJ1X#YHwy6&M&?FdnecjSw-oHnr}FG(zoyDZYJcJCH0m)TgG5G&3=s=Bcn%#kBlD)0Eqwz0f_+#!lVS}lkdTm=kf4yLkg$w8E+jA{GNTR+i46%3i4F-5i4O@7i4X}9i4h4Bi4qAD zi4zIbs3S!}MPfyQMWRK*MdC#QMj|%qkc~QKBxoe+aUll=__>0ECcFXyom~FDHSU?7 nM+ZO5*RyWhS9Pd);;TB+v>jAjLfiiO*8g{WCtQD?oEH8UfDa^* literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ho_Chi_Minh b/pytz/zoneinfo/Asia/Ho_Chi_Minh new file mode 100644 index 0000000000000000000000000000000000000000..6401a10256bb3d7c420494dbcce37b3013522194 GIT binary patch literal 255 zcmWHE%1kq2zyPd35fBCe79a+(c{=i)8YafSyD+(RGTcL%^yaLE3T9Eb7Q*JhWJHgVxVyk!z8jf<%SZAD7A)q_o%R45M8rRWK#O+_RUA`%G+ ziG$OxhzJMc;;1h|yw+N@-ny%$>ZM&>T5F!agM*Ven9b~Gvd8^C@utM~rRt9pa=&mn zYux2sawyT1>mF*fJ?Z6gE4IJ=e%-dV2Rp8rhbL;~QT1ihd-}ROURh;Ri|0!!Ut!bJ z!jgV6%RU``E6?nteSW(~`p(TX{TDat7Y8QH%ah&uRYStO-g`m6SrRh?&7G2&US_hZ zIwU*3&JNB#B7><#cBrsR-q~XNzP~|+PmS0QU9Ea#-#zkMBF}a#i{dGaojL+Dr^Pw#!Kek$b8>lwl`%pZH&_S8#^~krk08ku{M; zkyVjpk#&)Uk(H69J>A;K;+}4GWO-zLqyVG>qy(e}qzI%6qzt4Eq!6SMq!dqA3sQ`y zs|G0tsRten+EhdGRW?q&sHVX?>GKyn5p!k;_P0;d~7&#r61OhR;SPitN2PSL%%szQk=*%O&mVO^KK z?ttp6a>{|XTWc_PZ4RAYS&{6C8O lL?k2<6A6k$MZzL+k-$h~Bs3Bm364a^e-B^DKZD+1`2$+rrzQXZ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Irkutsk b/pytz/zoneinfo/Asia/Irkutsk new file mode 100644 index 0000000000000000000000000000000000000000..7c38e7fd6b2863c2a7ec9fb0bc64705c88d49953 GIT binary patch literal 1203 zcmZ|NO-R#W9Ki8sZd03tQJI!6J!Q6*t=25@wPt2x%^k84AsJX%2p&d67)XpvB8cda z9i+pLtXo8fj1Vt^hXRSph>#$AxpavI5ky%%-)9U4%jeJk`93`Rw+gZ6%ZrMG;38So8W2>4!K zO>LbSSg3t;OK-b-Mf-0K>g|{N^^SAhI&dngclMl@;Mqe`*LqZTb=Ar4$|k7~mPq|# zg*220b;G+q()eq&Zkk$<=J_AG<=&!hoqVhJjJ(%-$0l{CZ(6qvzma_%u~J6MM~s&;V#=6p&8R8kri`32cFO1}1BDGDnJEebCRF$yyZH3~OdLyp4E z*3hHyqY$Jpq)?=Aq>!Yrq|l`Bq!6VrrBJ1CrI4ktwKa4pd~FS33S$ao3TJ9b=eeBe z$DN<`6coChuI!7Y&PHn5wAqbgqt+-lj+a~0=4@nV-Eg1zCUf73>|EVByp;$4{zlI~ D_#Ftv literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Istanbul b/pytz/zoneinfo/Asia/Istanbul new file mode 100644 index 0000000000000000000000000000000000000000..864099556bc9875b7e9258af6c3b221d84c68eae GIT binary patch literal 2721 zcmbu=eN0tl0LSrj?*%TGp*>oNB#Na7Dk`8T7>I?)RInpn%@p#ah?qpj*NHE2r_N=$ zd|WhjR3jyF>ZqmJ)KV*#7MeYsa;6 zFiz#T^_Kh&!LRx*vrhNF96aMIwp!gAjn)g<*4LM}8D~!v>E}*aM%%9S)-PA~8o!q8 zv)aqTjNjwZEvCM;{@Lpe}`C{s8eP@RU zBW$k~DVmMQ*4}!Dx(uUZ{RaJk)!huSW`W*$_NK-M3x;YBeUwLl2Ftb?Kv3e z>K)M-v$k4~Ial2nd*r0my(UWUv2LXnw|s%tv%Exmq-c`%X#QxeSLQIScT%Dj9~-0f ziHy(^Lel~X?On~p^FFihsXxqqhcBA_cb_wp>b@`sR39)0u71xPw6NApF4Q>WQOZ_KdMyDc%(+eXjbb*%kF?gcYv=AZVc_+w^nPSDQXlo}izdQ|51`bOkk`az8G91>%i zo5a}fw~BEM+eQBIgR)?Kn;gIMZTVzHh0xcnk`tbKSr(Shk`srOOMiZzoD@A?PEP78 zCtppLQ=&$TDW^Njr`r?7)IC?^w3Y}_RNF}u@BUdlQ}vseUfnE==`G^f6+g)t*&m6S z#m8ky+-5N=t3j5Ae<){nmvZ)x8)eyz`EpKErF^cv*`bbv? zzR^10`TgzRj4AMIxw#Yh$FKPd)r-H-&!5pWmpXsHsaOAhU+@U^13sLc>cjiPH`STE zr|ArG*^vwHs4hKn@sZ1q1OSNu5&|R!NDv%V6p%0=aXpVNLU z5>zCrNLU?JT#>*!s>mXtMPiEt7l|$sUL?LqfRP9zAx2`11R04k5@tsgXC%-_q#aeL zkytybU?b5+!i~fm2{;mQB;-iUk)R_{N5YQ89SJ-Vc}Ep`B=(Lf_(=4T@FVd@1^^iW zWC)NkKn4LB1!NeIaX`3Kj0!R=$haT_ zgNzI^G|1REs=+}<$59OrGCs%vAtQtg5i&-|AR(jV^0@Ei2?@RRxIJOsyL~+2zWaI9 zDmfQeZIfChwL9U?HmOxo+tkU~rY?7WfBQH2YMcINpZ+;e>ODd&*nm{FEU94dz_fwM Pg9axRq$E3ULn8hH9ONz6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Jakarta b/pytz/zoneinfo/Asia/Jakarta new file mode 100644 index 0000000000000000000000000000000000000000..a4cbe0c576a103f280aa5982e95456a71c4c537e GIT binary patch literal 344 zcmWHE%1kq2zyNGO5fBCeb|40^1y@$IKG-F8FX8n5=8j8Y?+UKl9OJn4Uyb3*)_om} zOw3FyOsotHDGETP4Cx9CEDQ{p6%3pV40RJ2co`T98bIu%0tQYm-w*~b$FLBFa8Dp3 zI0U2~4nnZI2jm721_2Hr2C+r|1A%>-X99=@xeY{v+y|mTZUoUFcYv;pXJpre6K7X&*U$Obx{*9YWue9mWJ-~#$e*PIIg!_8Xa literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Jayapura b/pytz/zoneinfo/Asia/Jayapura new file mode 100644 index 0000000000000000000000000000000000000000..0e79d3178813898789d7130d8e3fb8a40b927cfc GIT binary patch literal 225 zcmWHE%1kq2zyK^j5fBCeW*`Q!d3K2%oN*yy=Z7y_7iBOqF)}bTzW~YCO#n%^&S2nx quzh?(7+gI=7@UJcK+<3kLV`8_fdFI`hz3~)qRFt53+M)2OD+Hp6)zzG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Jerusalem b/pytz/zoneinfo/Asia/Jerusalem new file mode 100644 index 0000000000000000000000000000000000000000..e7864171d1be382b88823cfaca7e911af6276240 GIT binary patch literal 9251 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Kabul b/pytz/zoneinfo/Asia/Kabul new file mode 100644 index 0000000000000000000000000000000000000000..7392c0497a75a943ee6ffeb9b3eb19b2fd17d22f GIT binary patch literal 173 zcmWHE%1kq2zyM4@5fBCeMj!^USuXs%?f~RiH~={e_8trjj&30!CPN5zLzsb5APfQ^ v13+w!|3Hx0HfsTh1{(;Jad-ff0h!AJHkZZ6Hw11r0|OV(8eJ1BV*@S#M^+mc literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Kamchatka b/pytz/zoneinfo/Asia/Kamchatka new file mode 100644 index 0000000000000000000000000000000000000000..090bf488957b2fa56419a25c2b378ea9b5ce366c GIT binary patch literal 1167 zcmd7QO-K}B7{Kw_57X=*6nm6o(FE2BfdH&A!{rjTU zA8VmG;bz(9W?y!H>*d^&+o`GYK+vwJN@glcc1~2zUJ6%zzGzoZ=Q1^u<#uhhQI*WBi#kbw7|5ZP%o^_Pn$#IxYc!S_5CNYU|9EeDJ89 z555`8tju-XYI~g2Rd=>%XuMC`Plt8&kp>O#S*(#{uS5@5%bK2g=@|PVYwNty8TlZc zKWC(?W>&l2zm#>~-|6~nTDqrS=!UyF?RkDvd(Yg{zSK#z_ny^_r*6om*a7X|eL@DB z6B_H^C4)unI@B~ELto-D>}!$X*CE;bu|(pJ$|Nxv&5vA|JLK_s3zxrW-nF3E@Ab_; z`1{_xW?AD|^B=8L#xnb-Qy%kI(-Z6q&)+AU7vAAKG2&RGF~@yubNJr!u-qLF=O0Em zXBJ~bM#=Y#6B#KoR#!7xWW30Tkuf8qM#hbd92q+@dSv`a0!Ri(3P=t}5=a(E8m=Y} zBoQPNSCa~o3z7_y4U!I$50Vg)5t0&;6Ot5?6_OT`m#aw($;{QHhUA7Mhh&GOhvbJO uh-8SQh~$VQiDZeSiR6hSie&0)QblrgHOV5`BIzRe;(wfQDS?L~(b8Xd4G`%7 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Karachi b/pytz/zoneinfo/Asia/Karachi new file mode 100644 index 0000000000000000000000000000000000000000..a8ff8cb769d1cb07cd1cae49d0120c074d812a63 GIT binary patch literal 389 zcmWHE%1kq2zyNGO5fBCeZXgD+#X9T$EIBjPXvL)xp&55qJXpcxzuLfNz3Us>`5JdT z92XdPa=S0^d~(;o>rJ%+BNHPtD+?GhFxcGznd2M5z{0=~oxuns-2xam7#Knl7T-Od>kAa>G8z;;6AP5$ zyc(1>oeNal(-~BS;yn1RAGB6Z0F!1{LhA?>y8tneMt~3!-1{F0KyC)nAa{dI0l6JSgWL}SAU}X; wkUu~)$S)uoiND)8g%N~?`6;T*~2>qdp}Da88{Ub ze@%rx;l)Jti+#<5_qop#52rDP9pigbDZB%W+ z64mx&rD}J3W&4Lkwc~rS+&TGHb` z{N*evxQa`hc1PjCpS`QJtneydA;k4ce%h2NoI(uWx0MMosMzP% z&*j(j`0u^b=t+vhk%YDMCdDBml3$a2g|JzpW4&8mlK=4Bf9m1cQ=UJA0g3~P1*_Tv z#RSC##RkO(#R$a-#R|m>#SFy_#SX;}#Sq02#S+DnRc(smiek&E_C+y9aYnI5@kTL6 zaYwO7@kcR8aY(U9@klXgRlB6vw5oklj8dFZtWvyE%u?J^>{``+DTWywQ!F!hrkG}M jO|i}3+p0EBac)&xr+BBBr?_XZPyZMHF8(l0tu3x!;Xw>< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Kolkata b/pytz/zoneinfo/Asia/Kolkata new file mode 100644 index 0000000000000000000000000000000000000000..bc909c92c14d0e35a1733204663dda841d768b19 GIT binary patch literal 265 zcmWHE%1kq2zyK^j5fBCe7@POh?Y0ePSPLc2Of_0@sYGZ7BNHn!V7i_uMf~ISlz?Gzy)-kuBnx=0T%%MvO7fp literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Krasnoyarsk b/pytz/zoneinfo/Asia/Krasnoyarsk new file mode 100644 index 0000000000000000000000000000000000000000..580e8dd2f43ed3f49cba503c6397fa38348b08ed GIT binary patch literal 1182 zcmdVYU1-f=9KiAC?3^*@U~bqr4zpv9z43D}hhv;$X124rm?O4Gb9U3jiaOFBckXwOV7O^s_fKB|i=hqNsCT9*X+HRAgwk?$X6>F|d{`I$?J z@;A3k#j~@cm5;MhmAxs|H!jMup3}1YWQWM1Hd(Q^N2AC0>B`!6UDcY@)uF9g6Af$4 zuL_L?6B2trUDy6Bm34h18Xxq@`g;MXefn88T=*&*Z@-Yl;a8G8KdhVTA4%Q8=eoJ< zy42U**Dd*{q#=A+8%C~aqqkEVU!KsWPun#0aECSz9F>-$mo&rBMBfGASoa@AW0xuAZZ|ZAc;6_ zCP*qsE>4>ai)@f|kbIDYkc^O&keraDkgSljki3w@kj$JmH6%BuO%BNpNe{^nNf5~p uNfF5rNfOBtNfXHvNfgNxNfpV}X_G~=b=q{1e368ajPXB6*-z@#G5>FUbN{pe literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Kuala_Lumpur b/pytz/zoneinfo/Asia/Kuala_Lumpur new file mode 100644 index 0000000000000000000000000000000000000000..41bba37b0c5f62d76af6037ad86d42f7026383e3 GIT binary patch literal 372 zcmWHE%1kq2zyRz(5fBCe7+bupxpncbbiWA)xSk}O+Wa)(^u&0MOCGrp{_U}R!u zVP#=sU`UJw=}9VJU}0cLS777>ksx+v1&FMhz`)PIP|(029PAsy;OpoECW1p4ynxs@ zG6bX-34~yG9S2Ye2!jBOE&U$|>dZn{foPCRK{Uv41Z=YZ?w-T@Y~C?g7K$ zZI>?`RS<4CI)gpnIHNnm@k*-;Cmx?+I2pbF!l@(w8&2DN4mdqAg5i=!?gz1n?-&@F znNT1LGb;l_dI8A3%nAk;28L1tMotEXf(8(~ZUTbL{gOy!B97`NOO}&h=>7`N#qy| zUb)GLNn$bD)aX1~Z}t6}m@Ewbm+yXGZoA(vJUB7dB!0}LzHnHBI^6v$iCWj~%!Tb( zee!N#-@c!3ln>3L=HqyYOjhmbsh&sqBu2z@{igHc9@bxy-SYLiOMknHTJPsW_Q!Fj z^|{+&r#EUWu~cnqakrHfbJ^LE8_N|uG~Mm%h9|IQ=F}ZHx#b7K>p7F&)T!=E?8v;! zZ9V^FQ5GC6=!IJ`S+v?FisvdF|8%7&nQApkqb+7xsKU@An#j_A`D6<*Im<7`mo@c= zhAF(6cR_D3EP|naUSZL#_`UESbfwi$2GIsl2hj&n2+;^p3DF5r3egHt3(=dQQVh`y zQ4P@zQ4TZOxuBjY{eT3J43HF%9FQcCERZyiJd8vcs!WhnkX(>tkZh22kbI1Ukc^C! RkeraD@Sn5#RO5i|`vL%a^V9$U literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Macau b/pytz/zoneinfo/Asia/Macau new file mode 100644 index 0000000000000000000000000000000000000000..7c937795787238ba47b51ad3cd4722f3a484074f GIT binary patch literal 781 zcmcJMJ1hfX0LQL{gOy!B97`NOO}&h=>7`N#qy| zUb)GLNn$bD)aX1~Z}t6}m@Ewbm+yXGZoA(vJUB7dB!0}LzHnHBI^6v$iCWj~%!Tb( zee!N#-@c!3ln>3L=HqyYOjhmbsh&sqBu2z@{igHc9@bxy-SYLiOMknHTJPsW_Q!Fj z^|{+&r#EUWu~cnqakrHfbJ^LE8_N|uG~Mm%h9|IQ=F}ZHx#b7K>p7F&)T!=E?8v;! zZ9V^FQ5GC6=!IJ`S+v?FisvdF|8%7&nQApkqb+7xsKU@An#j_A`D6<*Im<7`mo@c= zhAF(6cR_D3EP|naUSZL#_`UESbfwi$2GIsl2hj&n2+;^p3DF5r3egHt3(=dQQVh`y zQ4P@zQ4TZOxuBjY{eT3J43HF%9FQcCERZyiJd8vcs!WhnkX(>tkZh22kbI1Ukc^C! RkeraD@Sn5#RO5i|`vL%a^V9$U literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Magadan b/pytz/zoneinfo/Asia/Magadan new file mode 100644 index 0000000000000000000000000000000000000000..e3c76b57f59f590e82cae053dafd15140a0c6322 GIT binary patch literal 1183 zcmdVYOGs2v7{Ku}&X_taiXb0NQ`%&cnU9%lvV1gZHkdOcHk+&{=m9mGk7yyZtX64l zqQwv;RA^!0!X(1QEQA(Ggh&f%5mXBa;v?J?ft~-60U=tn>|E~s9S)bfxZgiLaPdOa z{IUG@gqsz&H~V!@D`F!r9*%w77~a=cTAs<36<>N+_TxdkeDQu?#ll=}(`=|OFx@Dd z$EzfGZ-ZPSj3jboZl^T6ZU<_1D|A;Yx!xo~zWzsiZ_NhhyJ(#_%@$+}J|-yM4UDg zBo!99IBhaWHb^>1K1f1HMo3CXPDoNnR!CY%UPxj{W=@+LlAF^ehh&GOhvbJOh-8SQ uh~$VQiDZeSiR6hSie!qUisb6F$s*Z0ZMsOlNWw_Q_#dR~C-u5W)c+g&O%v$= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Makassar b/pytz/zoneinfo/Asia/Makassar new file mode 100644 index 0000000000000000000000000000000000000000..f35823303bcd8ae8184f664127c6208e9509e033 GIT binary patch literal 263 zcmWHE%1kq2zyPd35fBCe79a+(1r~maov=&n>V(rBvJIEQ-W4!1F*7kR7|E1Bj;79b7=C I=~{3B0K2C;L;wH) literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Manila b/pytz/zoneinfo/Asia/Manila new file mode 100644 index 0000000000000000000000000000000000000000..0e90ba6326a2e879f280184d6f481ab46fc80ab1 GIT binary patch literal 335 zcmWHE%1kq2zyK^j5fBCe4j=}xc@NI{(r`%3py2eU=L{ECsun!Tv1E93bn`v4NPaA08Z@eN^c4-Nrw8A3=f=sytP MHH-^rs;&ta0A@24N&o-= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Nicosia b/pytz/zoneinfo/Asia/Nicosia new file mode 100644 index 0000000000000000000000000000000000000000..f7f10ab7665e94ca44fd8cd98a362cd4b304eff1 GIT binary patch literal 2002 zcmdVaZAeuI9LMqNOjy@ye{0UQ>qF(rhpu|nY}s_Jnc9QbPV-i-GEb#fYtAi8r(5m5 z$Yg}XzY-#9P-GGju7RsTPxL@E2zOwMF+w`6v5iOxDx!vL=X;=6dll@>&gI_E<)ZKY z-(P6e#&DkJUr&tl3vZr?^XB{bW1l8}H+J}I+dH(^ihWjRkGpWq7~flHPS|zFdZp86 zO6yW9Zo{ZKvC1|k1t;6D=3h4AQ!kmXP3kogqK}#h54()l@9s1w|JZ1}aiziZo$Is` zPwudj4u!4c?s_|A+d^wfQ@K5LO{O)iBEwEC8fU%fkF}@!MywgJ!**IstdaKEYo`A; zY-Id&-^{%FgE4bp(De6yV`TN5GP67P897_`nt{4jBe$mC&I|6b@{84;m9@nxNNTZX z=e5i1(TL3P_2`_TbyE0Oo6bF7B5&WS)}p>zEj~L}-|3pK^A0BJyWv!w-&rW{mBnaD zolh1_|3gblMx`v~do54BE#)J>%cAH@vS{$SEWUeGmh_*HiW?U-xVu{_Pae^w&COzT z@6cr{cj^00^;-2-lZGnFb$LRiuJC8*iYEcBjxUqypC{@EkJDw<=|{TyrdQS+j+2^! z`?5CjP-=Sy#jL$4>$cz1_4CfihMF5%mvTVri~BYF^0(TMq}uT3er+6W(T&$Tbkk5s zKRmu#o33q^kG?F{=DsTVxG_aP=_-)T%Zj8WoFH3rlVxk^Q)!L!NLx<4wmtY&+9y2G zcI&EijQpaXo$8a%2hZxZ1DADs|5y4&N3TY9NA#tr7kfpI`A=USPs&1WF*6V~#^Xtx z;u-t=lV2)=Ax~*(6(1q~Dk{qT2))2<|Lr{7H~-F!BX^G6I&$yG%_Db@+&*&uNCQX* zNDD|0NE1jGNE@zBA4nreCrB$uFGw>;H%L23KS)DJM@UOZPe@ZpS4dk(U#?DLNM}fE zNN-4UNOwqkNPkF!NQX#^NRLR9NS8>PNT04wqe!Q&POC_-NV7<{NV`bCNW)0SNXtmi zNYhByNZUx?NaIN7u1@Pn@2*bsNcTwlNdL$NAUl9;0kQ|kCLp_jYy+|n$VMPL;p%J! zvKOw-W+1zPYzML*$c7+0f@}%0C&;ECyMk;BvM4YD_`&gLMygKQ77Kgb3l zJA`ZzvPZ}!A-jZZ6S7apMj<Z91c0qO^C*L2;4Y=QCdH(?jq|NOB literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Novokuznetsk b/pytz/zoneinfo/Asia/Novokuznetsk new file mode 100644 index 0000000000000000000000000000000000000000..f78c1f88bf659dc263bc62a3eccd1d77f1c9507f GIT binary patch literal 1220 zcmdVYOGs2v7{Ku}&R9AVCB&pTO_`HTzUnlUS(9}qn@lGsvRhye3M(-X8hX%!7D84K z5fc?evF6b*No_N<&^5t!I?r=br4(-W?2D)V4 zgLVnuX_5I?;Ln~r|}sF#d>uqsbq zvMS%)QdQ5+j#od<>6+Y4U3=rAUfO#~FFVnt^`UmXd|$7`j_sEf4V|*GEg`GITcj=) zk-DE%QXjH({refR=0~|+J1{2kVV_=iFQ6OxKkM}uzUmFPUuf&_E1ft$DjSoJbmPJ2 zvZ>;_PBz|`&G{#FQ{=KVja`#wZ?`nRJT5Jt(vo_(Q??GBv0ASt2R+_A_wnUVd8SSG z<$0%G{QX=|=vQj{p!pw_eL(q?%Jg^&mFmcFcK6>m+`I2|WIVH+bI^Gwm~ORIsx9Gc zJ8YHSw#(gZKC3+La?b8%|HE`A&0@mHl=%XaMyAbT;*MtO$mEgfvnT+m04V{f0Vx8h z0x1Kj11SWl1Stin1t|up#?h36)Poe{Xewe+5>gXV6jBvZ7E%{d7*ZKh8d4il98w)p zo};M`DbUeWh?I!bh!lxbiIj=di4=-dij<1fiWG}fib4eT7M_1Hr!}X)ffG0W8X@(scT8qMCVm)a8A|vrqt%LS1RE85(+H54{iDQPS#($ zE$gSp#n#tD^TDUtQ1E9$G-NZfacoR(yEQ7e4_=j_)8}N<$$L6{<&xgfGN^YR>CwCV zy}CKvq?><4bi|jCk=ZJ}XE7xA=DzD_zFh8mea ztGL8fg5tPnpS!T6rOr z`RxraOYF;eY2Pz>@}hq-x;%U(x1wk;P+0J^tnmBiTSZ^SbHUMIpm?|=7aHo)l1J@Y zdjE*7yphyZmut1`Ohi|=mgt()5-qR$scR#XS`qrF>lVM)uy01fQxmd&{A;H2!ktXz z$UtDjo9ia>d{8z%?3b$EUfFc5M>cnMN%Um9R3E#ovGZqjOMRzqJ=mh#N)KyItXgYk z;u;SfkoZ`!?wF2B?a&Xc8(k(l2ZB=nYD#wXOv~YLT^5;DZ7W(qM^Dq8( zE-+V1}iSxpId literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Oral b/pytz/zoneinfo/Asia/Oral new file mode 100644 index 0000000000000000000000000000000000000000..8da2a1dee74d07f108a25abe650b669b3899624e GIT binary patch literal 1086 zcmdVYPe>F|0LSq+{#{oyFWc_AsiRqonzpU&vXIw)F)kk~*^7KwC>c!zEpylV$9b`o9ceaDi>E*_g<-)9{B1OC45)$0>+ap0;p zZ}@O^nh(#luftC^mgfsjAo?hOEVOC|eQ)jH_V?M)x2=45J!;o}x|@%@%crks+ZWu_3`B(IMd>@!@|Tpx=b*wkP~Q0pmF1r2qf` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Phnom_Penh b/pytz/zoneinfo/Asia/Phnom_Penh new file mode 100644 index 0000000000000000000000000000000000000000..5a52722a16123f192e06553a51c513d11605c67b GIT binary patch literal 255 zcmWHE%1kq2zyPd35fBCe79a+(c{=i4R3^s1yD+(RGTcLqLk4AcO=v{{sQYUJwnk8$^Tb2ho(cfeYv)U2`q~ D#EUc~ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Pontianak b/pytz/zoneinfo/Asia/Pontianak new file mode 100644 index 0000000000000000000000000000000000000000..3e882dc3570532a0afbbc73deb6fe15c38f37286 GIT binary patch literal 359 zcmWHE%1kq2zyRz(5fBCe4j=}xMY{j@G3*k%&v3eO3CE?dcLmpNj&a=jug36Y>%I=f zTO|#QOw3FyOss4S3~3EO^&pakfg!U3WJ28p1|9~6f(8&9ND448Bo#1l`1pn}1ORck zX9$B=a0r7lkVXX|B)IQC5P;kWqCxHi(IB^iXpnnBG|0^$8su&e4RSlkMq0U_3+Odn Gb1nb`ep$%? literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Pyongyang b/pytz/zoneinfo/Asia/Pyongyang new file mode 100644 index 0000000000000000000000000000000000000000..9dbd3c1ae0061fa6dfa04364b4ca65754eed71e3 GIT binary patch literal 258 zcmWHE%1kq2zyK^j5fBCeRv-rRTPN35Z1~svVMoiBibwvMA3m5?G%zwSGBGkRly`ts z)=dDB1q~n)#P$vj0WrZK1iM8b!$BAX*nk+s=J*c;nQf_aKs3lw5Dl^zM1w2`(I5wa tXs{!g7@3%v7#K>QfQ$jU1?XI${Xi1v7AV`tHw48!3=CXA=jmE<0RW|SLqz}p literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Qatar b/pytz/zoneinfo/Asia/Qatar new file mode 100644 index 0000000000000000000000000000000000000000..49668c2583c83ca4db7f304af8e4155711d39bfb GIT binary patch literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}c@}<}YrxVq=>Q{8#2^49W#PcU!oZ+qz`)_-8^Yio e9KzrT#1Ifdg314Z0AxByC-F9L0WH%t<^lk(vl*=b literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Qyzylorda b/pytz/zoneinfo/Asia/Qyzylorda new file mode 100644 index 0000000000000000000000000000000000000000..fc3bf46bccc52f5b437d94424b6a55446b65a961 GIT binary patch literal 1068 zcmdVYJ7`l;9LMo<(`S-`rBvG_R0K^&s!A|1})=x_vaDaF~vp>-)W=>L0Md@YXNOU~!^1~T;b4aP1^WYiy5 zgS_Fx)h8dG<4c+!D z>V2uP^UYn=_40+@@nl|i&(7+escF4)@|sScJFk1s%$UrTOJ-Mo()1l0HT`WTOg7VN zvXz|4B}Q~^DQ*VV(t7v8SF>laNe`A{I{*5M-aEaf_dWWc_4tzBe|y;+=zr&Xp{nYt zklZ!3Ki#3aaD6xu{reqODqocUh01AFt<=E+XHfLyeNg=UjeNUKsk4{8X7}wc&%;Lo zHFS8)9mfN8^prfxA&>6zJi#45{+2WNho!#B#ahT>{0OTd%OUGIWkF;`WJzRAWKm>Q zWLacgWMO1wWNBn=WN~D5WO-zLqyVQ>fRx~r8k|xDQUw=fAax*xAeA7cAhjUHAk`q{ tAoU;xAr(2LB%~&%6opiUl!erV6oyoWl!nxX6o*uY|6h3#>g>)&z5^$s;N$=R literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Rangoon b/pytz/zoneinfo/Asia/Rangoon new file mode 100644 index 0000000000000000000000000000000000000000..68591c56e707a5b81aeaa4848df06ca1d713a114 GIT binary patch literal 259 zcmWHE%1kq2zyK^j5fBCeW*`Q!1s8rQjyV14kHp1U=^q%GfWlE4Ao=JFkaXPy22L=W zH^?`H!6`H-guyE~guxfcfq@Y0cCiBGK^O!;_JG);|A8QETjvcB4YC(RgX{*;Q2T*u kAr1hNKsL}B9AIbgg4u#TK$~$og@J(!=rUb1D`NvL07kGk^#A|> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Riyadh b/pytz/zoneinfo/Asia/Riyadh new file mode 100644 index 0000000000000000000000000000000000000000..6ebe393d0b866580e22349b749152995c6ebcaa7 GIT binary patch literal 157 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Riyadh89 b/pytz/zoneinfo/Asia/Riyadh89 new file mode 100644 index 0000000000000000000000000000000000000000..a50ca48a91b9f37ae573a09c21bc208d8b0bbe60 GIT binary patch literal 8539 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Shanghai b/pytz/zoneinfo/Asia/Shanghai new file mode 100644 index 0000000000000000000000000000000000000000..af6d6fbbd298f4698b748004b6d3c2c847dd6ad6 GIT binary patch literal 405 zcmWHE%1kq2zyQoZ5fBCeK_CXPc{co;HTy&iW5bDG>IEmS@->{g9rZzOml=b6W_^J| zT}FeVXJUa;oL7UgrgMRcdpd)vQ2Ylqbx#JhPmUin*tHonE-8OtVnl-s424fYw$x2v zWMN<^Xkg&*@eN^cb^+qx5Re2AgplCK|3Cn8D2N6*7EA*j45C4f2GJmggUkgv9t1!h y0MQ^%fM}3MKs3lRAR6Q$5DoGa2!K2WqCuVm(?Ab`XpkqtG`Sw-0{U6kf(rm2v0J79 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Singapore b/pytz/zoneinfo/Asia/Singapore new file mode 100644 index 0000000000000000000000000000000000000000..a6f2db8f3a887fa0f19283b52c2f801329bb4f53 GIT binary patch literal 402 zcmWHE%1kq2zyKUT5fBCe7+bupxpncbbiWA)xSk}O+Wa)(^u&0MOCGr&zVGtw5S#dw zgOQ1ug_VVkoq-`S7Njw$fPsa9Azguy6GVd8nH3s51**45C5K2GJm=gJ_WRK{Ut_y7O^ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Taipei b/pytz/zoneinfo/Asia/Taipei new file mode 100644 index 0000000000000000000000000000000000000000..70cfb27ca91f3e9dcacf7941b8432c7a10560c69 GIT binary patch literal 724 zcma)(Pbh<79DsitG2_C?MUfH*k&`6K94WP>C zWAk_OZ^OnL2M&t&*-3HmdwYA{@B8}t`ku$vJ2coJzs70ru$gMRIlB&mVL9v{SK&aO zK5APvk=`abu1u(t<}Hcl4XRk#tBxfX&FNQ_obB$b^LUTGSP^qMJR(C{`)JlsU(F;b+Sb_#WRz13viKjnF0+q}f; zvA%x3w!%A&!QvE7hHZ+xyCOb#&u61_U zDE9a}QLl5FN?Rvh`t^R_d8kM3t((eR)uQbAmd+io>%N0!-M=@l2ezlRw^7i8D>*$> z>eRzC?|P)r(4*NqJ=Srpee*5wpPz#K<&BrGKbFU<7e%AFDLH1#kJD50G-MN2$;tfQu$OPT*c;tRE-i#AoL!8E%%ut~fik4x@HN6eSox5`48#t3NZ_@3o#6_3^5I{9aD@$tj84d@PF91`xXhgo*$F literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Tbilisi b/pytz/zoneinfo/Asia/Tbilisi new file mode 100644 index 0000000000000000000000000000000000000000..d7e40548acec366bb1999324eeef7116a02788f9 GIT binary patch literal 1116 zcmaKqJ!n%=7=};Uq)qOP;-EG^tv{`rCboL5O^Dj+X`n4ag^OMSib4ik5F9!bCpVkT zskl^}R2;-1g9u88D+mhyOinG4yQnA#E-p5r-*eJH#GmusbDodyoaw%gcka^Mi27q~ zk_nrYmrb9%pImNyT#dWiGRyw<#2cq4`dasV57iQ%m7iS8JE>PyKfSUP^gg&2^xawr zc3htgc3v$9yDm=$yU!Pc{+VnrFqR7T4B5fnbR*bje+e>?WF_;>stl@^{^0xAe73Uc zX5YSZbI+dY{SSS2=4{ptuk05_25N;L zMZcKVPO+ZykF57QM^_sDv9+)>b}y;NpL}qRSJ(B4n=c$aTi3e&yf(4e`?WOrX+G51 z(X4Q!t-7M!u_$F*wk2PCMZ0aKa$){V&QTGirreOFR8iA6&(?&wyxGD$w6)dCt@QG8 zWA2qsdCDuDG{+fFO;56=VTELw=C{N9dup5I5t~(zP2cxZR{7E61|&g9iaa7oNScsD z4JB1bvXFEk2}4qbBn?R$k~k!FNb->MAqGG!fS3TW0b&Hi3PUjiVuzs^0?!1ThL?6~rtoS}`ha$8GuAD;AB*KWHi$Rzi_3X2cW&L^SD}r>JKpobtwK7)rEy Zxs_gCZp>$lm;aITA9gBB6doS6egSQg=Ewj5 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Tehran b/pytz/zoneinfo/Asia/Tehran new file mode 100644 index 0000000000000000000000000000000000000000..16149ed6bf5bc85657f6a684a70341d719df4f58 GIT binary patch literal 1638 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Thimbu b/pytz/zoneinfo/Asia/Thimbu new file mode 100644 index 0000000000000000000000000000000000000000..90294aea202619ab9697a161be8a42753b9067a7 GIT binary patch literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}d9FSaEm2JLUBL(x3E=@r`9?6X0NDu)96r7w44%Ou f3{D{-APFD{A;IMTKmalwq>p$TxPX@FnsEUDi!2#_ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Thimphu b/pytz/zoneinfo/Asia/Thimphu new file mode 100644 index 0000000000000000000000000000000000000000..90294aea202619ab9697a161be8a42753b9067a7 GIT binary patch literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}d9FSaEm2JLUBL(x3E=@r`9?6X0NDu)96r7w44%Ou f3{D{-APFD{A;IMTKmalwq>p$TxPX@FnsEUDi!2#_ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Tokyo b/pytz/zoneinfo/Asia/Tokyo new file mode 100644 index 0000000000000000000000000000000000000000..058c1e99ba26b1ab7855b81895c8d577e2f582a6 GIT binary patch literal 331 zcmWHE%1kq2zyQoZ5fBCeP9O%cc@CdzEx2wcH{tplv4$Hz#U|W5{iESFyR5+N)wde% zJo_(jw|h?m6C)HdFw{)|>F!y;$O2|_ID3UKc)0*^a0o~O2tu%1&I*(QVG!U3Vh~&4 zKMV(rBvJIEQ-W4!1F*7kR7|E1Bj;79b7=C I=~{3B0K2C;L;wH) literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ulaanbaatar b/pytz/zoneinfo/Asia/Ulaanbaatar new file mode 100644 index 0000000000000000000000000000000000000000..39bdd89416a5998472dad71d0a19bf079279e711 GIT binary patch literal 834 zcmcK2J1j$C9ES0)bkRm!Cbznlx>ZXL5!$*>+Myf^wMZiogKy|WBHz%MkTVz%!x?P4 zY06+U7;G+s7%g4oBsxksPghe1f2m*7)NtO1zPhzJBL1Ay{)87dWWRV{bMW*Tt8u>@ z4TT5Q`1WlzJ;qh@T~M}U1IlwzFIx}mRNG!rwr_u_jy&tDm-}9;Hzu&b6a=T*iGHLlwl42+mwF2p=2&USt;q_HD5|7AGB&;-l zn;iADs17P~V;>{(hYX2~i42O2iVTa4 ziwum6j0}y8jSP;Ajtq~Cj|4y>AR$WHF*t%CQ8>aNaX11YkvKvju{eSu(U5RRJR~3z l5ebRJM1mqwk+4WyBrp;g35~=?f+NxK-^083XYh}^egXf)uLb}B literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ulan_Bator b/pytz/zoneinfo/Asia/Ulan_Bator new file mode 100644 index 0000000000000000000000000000000000000000..39bdd89416a5998472dad71d0a19bf079279e711 GIT binary patch literal 834 zcmcK2J1j$C9ES0)bkRm!Cbznlx>ZXL5!$*>+Myf^wMZiogKy|WBHz%MkTVz%!x?P4 zY06+U7;G+s7%g4oBsxksPghe1f2m*7)NtO1zPhzJBL1Ay{)87dWWRV{bMW*Tt8u>@ z4TT5Q`1WlzJ;qh@T~M}U1IlwzFIx}mRNG!rwr_u_jy&tDm-}9;Hzu&b6a=T*iGHLlwl42+mwF2p=2&USt;q_HD5|7AGB&;-l zn;iADs17P~V;>{(hYX2~i42O2iVTa4 ziwum6j0}y8jSP;Ajtq~Cj|4y>AR$WHF*t%CQ8>aNaX11YkvKvju{eSu(U5RRJR~3z l5ebRJM1mqwk+4WyBrp;g35~=?f+NxK-^083XYh}^egXf)uLb}B literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Urumqi b/pytz/zoneinfo/Asia/Urumqi new file mode 100644 index 0000000000000000000000000000000000000000..f46ff380a0558ed590f3e02b26bcd2d991de0119 GIT binary patch literal 389 zcmWHE%1kq2zyK^j5fBCeJ|G6M1vmWLl_H#bT|sV_8H0RgeStzG$} literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Ust-Nera b/pytz/zoneinfo/Asia/Ust-Nera new file mode 100644 index 0000000000000000000000000000000000000000..ae89650f10aa7f25e91e2fea1926aa6d6b89615d GIT binary patch literal 1249 zcmdVZJ7`l;9Dwl?lh`JTh-e?iXltyo);m zVtowa5X1*6RjAUT7AYMvSR7hJN^z(FINAF z<6-s3SZ;Q>88LISF1`Qm!}#+DlWI+{SBgr~+2X>JZ;HR)jh4*c=`Nj{$*!Fabo(ai zWZiJN_;0V0^@C2?a5g7p>CaMr;H_*-ypllVg>0&NA{D-jY+iOng03+g%nj)+pN3TB zz&=$udpNuGW$Q@QXj*T3cu-g0OzE17ExPtht*$#-rbCC45gs~*J(Y_(mbjeusA*Kk^^)v-J-ryGTcLqLk4AcO=v{{sQYUJwnk8$^Tb2ho(cfeYv)U2`q~ D&EqsB literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Vladivostok b/pytz/zoneinfo/Asia/Vladivostok new file mode 100644 index 0000000000000000000000000000000000000000..1cae6d0fd9880e7de01c294cbecf820dde247f9f GIT binary patch literal 1197 zcmdUtJ7`l;7=Zsgsx>0k!K4~nt8I-n)|hHbwQcOf7-A9#8U(9_fG3yw&=SSK1JKu8sc3x^4Ac4Y*%Q;M zdUL+GV>bOF`0TRmd^jY{cTUQ#>nRCcjL7cOAqfxkYs-aJ-P6^ndyn|EwWe0v!i(DW zQ?%XhmG*ZZbl;EfvcE8^9i@_Vj=z_#>4HRV%*cVo?gTL)7 zMXuz{f0U8i;ugu}9jin}@3SwjODB%C_8s#ymtT4_naaqqWRG2rmRBQiSnSp=nSYq* zF9TD>OqLHYUCe|rQ?@pf#!MSCam>^)lgCUSQvjv{ObM78FhyXhz?6Zh15*g55=<%9 zrWT+WOf}Y~985i!f`E#El7O0kqJXM^vM_aF3d2-}DGgJbwJ8o$owX?sQy)+urb3`Z zphlobph}=jpiWGoK&6;cfm$)e0@YfZaxwKQ-9hdsXme-`&k literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Yakutsk b/pytz/zoneinfo/Asia/Yakutsk new file mode 100644 index 0000000000000000000000000000000000000000..461901f6f83bac90e1c1b4781469148325e6e6ae GIT binary patch literal 1183 zcmdVYOGs2v7{Ku}&iH78`ZlFCnNvDV<|Ca-G@H~W6P=MF2g0NXdeDowL{U;i&~q`w zx2R3DC@O-GHa!;RE`b#bOl%T9}i5BqdU-&b9loY3;-F|DW?(MaftE}MN%qk*>){WdJiKRgRpo;(z; z96Oa=F}(9t)uYQ&eWzb)t{#-y^L?`NSW4>l#HD`6evKVX=&E>^uHG8aHKoRqs`+VW!>E`5+8ga>o2^Pmg@u3y7!^9oqMhu+OJ7s_kG3}MMjH^*J($Lj2Rgt5BjZOBKr%p5KypBmK(av6K=MEmaoS9f zRFGVpHW?%vBpoClBq1atBqby#Bq<~-BrPN_Brzm2r%esX&1sWEvP05C@dI|K5iHGRy=6B4WZ9}Q%RejI)SU3pUW!6tkO@VXA}Od-j0%b( z3WDfh8J@Bh*r_599xZ+cZxTUyi9n*dgpGQ>&oG1z(Y5E{eLm0Ly=<`OJNL-(!HD`} zEHihw7;$s4ue`rpNqTSU&gxO=oEwww;w#eq=7#M5a6)<>pOVznW!-x{EuP|{!YuJFnoE`jN`3yo z-)EUpF)_cRip5olQf|iMQ!1(17uJP4-2eT|a{F%3KEG(Mf~j6tr4J_Tl6KYML{DLL z`3mJR!>;z#!s7nJY5z2X6Gu*+&*0>d(?<%hnhKB-kQ$I8kSdTekUEe;kV=qJkXn#p zkZO=}kb01UkczCPB%~&!D66RoDGR9!DGaF$DGjL&DGsR)DG#X+DG;d;DbZ?bM2fVU zDv>ggI*~$=N|92LT9IOrYLRl0dXa*Wijk6$nvtTdrfQ^YtEn3)9H|^B9siHo{pLU6 IHb(uw0GD+ZBme*a literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Asia/Yerevan b/pytz/zoneinfo/Asia/Yerevan new file mode 100644 index 0000000000000000000000000000000000000000..c4ab2197f803986ebe700b1cddbda26008dbdcb4 GIT binary patch literal 1263 zcmdthOK1~89Dwmz+t@s66-1LX)>o}*YFk5WLey3_)-+ZVDK!X+hY_vdrj*yYYq3 zi9LB_H$Au$Up74HG+!HcTF%{fS_f`9%lof7@!e;f#6zdFqT{r*_3oEs-9bqu3X=L- zlyqdDPCrY@%FlVdYBVIP%dNWodQx|c%+hO41ohg%ciQgzs51jKvMyWJox9%3`i4=R z?R+d&-3#WF<=AlE{s+cx4D?Pu=>E0@@ z&tGL`U`BP|Z&Rt*UGqDtrnst9s;kHHDV4U_Ppv;rI5+Ri?y{w*GUhQ;FdK$thP%2?KbPV^-1#>%xOe34`4;XUX#nZK)wF>0fHZ-0fwY12 zfi!}2g0zD4f;5A4gS3P6gEWM6gtX*pdP16VHC-WXA$=i@A)O(uA-y5ZA>ASEA^jl@ zA{`KyM U(mB#P(mVc7&HK$iqovLN9jTiZmjD0& literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Azores b/pytz/zoneinfo/Atlantic/Azores new file mode 100644 index 0000000000000000000000000000000000000000..19e40040672aca4a74011b89614eda7eff77e2e5 GIT binary patch literal 3462 zcmcK6dvwor9LMqR&l=m@-qO+<`DKOGVwYSqzAhuN#HN;#(#(p)!axoT}Ri& zz9e-POQ@7-U%6y$=GH2qizU}IAtbHO^HZm@Qys@Y{eI{7d;HFC+dt0ndcM<#-IJB* z{Oi%ce8Y>!F7x7Z)U#`T%g7%vQ}chX@?M=Au5(KZbYAXkEhyYB-iYx!Kd-JX=y^h4 z8~3y>jER-k2bD-+-TGR1{4H5hx=xDTaOG`pj4pk$mAo_aDOonYyDraJs4H#?>idb= zy0Y>2y0WHHKlo{b7H|AaR`pettt)Gi9cHoIOp}W{i<_JucVvol|8) z*X8m_#zy^Q#~CdR4A9b}-SpEvxl;D-{Ze+=cgm+{JLS7dWYhD5Wz*Wx(<^dHoQm~3 zb@QYo*}Qm$vt`J9XUprWb?eYb*_xN-Y)gF1+4gvWZol?jxB4bW_7dJiVH4EA4H9J=BT~bxHG-`X1cj?*!FS@ua*nDwu zu*IuOf|upZ3$}ddnP712^x);UPYAXeI5HU1EiHIOT%X{T%{v5JH)tJf6FS&ybE22m zc5jjwTX}_d)%r;9>J_InZs7sFX3kgIZbq55pIEH%nM*Wb_zp?TSs_WutK`}tFGz~I=Y4G=>0Eh z_Sqc0XX8}8cXzsudGj_MyJ3Rd_f)cuTa+gEXSdYxPjrw8gS$yiRx^1Z;WC++a#|)e zab$A)NS$20N2WA7sZ+MBlc`5`=(MGa%&EJ^^vIyHFtKd)(O-Jx!^pX zq2~8$zs~FL!s^yL=QBK_{{Qu?soC4sacXLgRtGMqsj2$biKzXV*$FhZ@8+jRtN;9| z6Tvr5WbN;-Pfd4v4jYta-|d_E;+B+j`#S;iaCrUw2n5pqd+-{XU*W}Lw|VioMU8pf zksPha_#p#mH6w@&Au@)@AR?oP3?nj*$Uq_^i3}w&mdIdQ&1fRSiHs*QpvZ_KLyC+k zGN{O?BEyP|tJMrFGP20fB4djTE;72v@FL@j3@|dn$PgoAj0`d|%2qSX$T(ZgKqDiK z47JsaH8R*%Gup^-Tg`Z5g&A zCRj+ckZ>XKLIQ?F3<(($GbCt8)R3?taYF)!L=FiZ5<4V#RuerWd`SF|03s1YLWsl= z2_h0jB#cNLkw7AmL_&$g5(%c&L=y?8)x;ACC=yX5q)1GWpdwL4!ivNd2`my>B(z9u zk>DcHMZ#+}@kIh`H4#QajKmlTG7@DZ%t)M(KqHYxLXE^42{saKB-~aLZzSMW6LBQu zNX(I-BT+}fj>H`aJQ8^%^hoTH;3LsT!jHrsIRLEY2tW=20^}$_4g=&kKn?`t zNI(t+LnHJ& zpLNae)qb7V--Xu;JLfZ^euMw(X{NNAOT*k7_Lc~Q*?Xgry*K{)%s)h+seL!!n0v$i z)M>;wPE_sh2b%NZTsH^j#y^h^^Ie3wQPLCap%Ryx)UHFj`1bK}sR{A+Q$oZaMg1)% literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Bermuda b/pytz/zoneinfo/Atlantic/Bermuda new file mode 100644 index 0000000000000000000000000000000000000000..3a5c6dbf7a9ad95ce3a2d7c1bf26e203b6fac30d GIT binary patch literal 1990 zcmdVaUrg0y9LMoPG)E^fEJ+hEu|J5x5e}Y0(9pupFiw1xgK<>oTY&^tBnd(i&1EH5 zwi#OH*jz5xMOnj~<;GAlZ%Q9Co2?BW=is8{X1cXDlhgBlZoBHL^*j6Rb#}IM_kDlj zYg;#j1OIqZ-7ma6+uY0dsfR~%Cer2(>1`RiB^Vgc;MH!q-EPsTKfhit1ffL zC!IFqgL*T)|7m+?Pno%^b+Mh1$Tpc(S@!PINi%c)O*?B|mfVwe(auh}DYJk7OS3Lr zlv%N~U>o-&U>uDJ-$x27T(t45?XP zp)&A?tXh(*t2-}9ZFZ{0>%Nxwjd5KQ*(YnpQ*8a5qo)3w%Qi8&*Q`Bo(yklpHS4z@ zv<<_Jrm?BtJ~Oz?XzXKs_MHZKu5gDw-%=q>>22B^&6VaW)!LGmDlOlKv~|k3w0@eQ zZ4;+t`{ z8`ADsZPGnFpgn(9%WH#MbnAtX^!6q6^`jZm*I2G^?71c>xBSPSWOB4D5J)CZjRbB@ zCeNFcwCY$qu)Nm2m2uA1J@J2W)JgYn*!+*(%;zI&NB1A$&Vnl*OqC~<(;zR;PB1J;=x>%85k!X={k$91Sk%*Cyk(iO7 zk*JZdk+_k-y)JSjbgzpY3Eu0XN5V(qM+N{H0b~e}F+c_Z83kk*ka0i;!s|u?849l( z3uG|7ZZweLK*j?Z5M)GL64gWX8 a7IZte$n9J~tRxf;6&1vai$lesqTt^>F$c;3 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Canary b/pytz/zoneinfo/Atlantic/Canary new file mode 100644 index 0000000000000000000000000000000000000000..972388be7176991cad31d91ac7241b45a7c32e84 GIT binary patch literal 1899 zcmdVaT}YJ&9LMqJOkJC-_*XM)YF1{}cBV&7*NfKdq*C+P%CmB%xytO#xv~=NO`?zp ziC-W^Y*A6j7|ptH+l94JThUmPpvhf8_SgIXiYx_`^-88JAN?Yx=!R53~SG-U7<#YX(9*azQh=#66< zcJZLz`f<17PMoy(qivS(#Q_`MEKA(9)kaj;+Q_mcHmWFWNjdp8+MjL7@hLXujiHtj z6;#Tj@fv$GS>w8f= zRuH9NWt>exeNxe7i#FfY;;G-+lJfJaOx$NnbK6w)+BaI3AT7JSSIc{Awc=cZ zR$dKj)t3uYeRhp~x+7OLttIx^@e6CV*L~gU z2lS}^!cW$4|B^NwZ?%n`9on?-v^KZx*OrDOYTVT*-zyQ3QUCc*U*F$y9QSv(6Umu5 zuRG2F^Y#Dddr>It1oMi+&b)j+C1Jkw`Ft-3|BKu0b06*(xnceTcg({rBlnElG;-IT z?rkIYjodhL=g6%i_m12=a`(vXBlnLqfOLSgfb@Vgfpmei;pz5)G=g-3w1V`4G=p@5 zw1f16G=y}7w1o78G=+49wB_mcg*4{rc80Wu^oBHtbceKu^oKNvbcnQw^oTTxbcwWy z^oca;>2`{=>go21G>deLw2SnMG>mkNw2btOG>vqPw2kzQH16qkjDAp3!A2(lx{mLPkAYznd~ z$hIK+f@}=3GsxC>x_g6cj;Fgj$o3%ngKQA8L&z2(dxZbzO^SAxD!@|tLz$^rse!a~ Ke<(e`Tl90%p0O(c literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Cape_Verde b/pytz/zoneinfo/Atlantic/Cape_Verde new file mode 100644 index 0000000000000000000000000000000000000000..5238ac8a6704a159bb67e0e19a674f62e2c6c9ae GIT binary patch literal 240 zcmWHE%1kq2zyK^j5fBCe7@N1VKCtJ^)Hw>5N@@hS#lJf+GBGm$|Nrs}1H=FSj~_6w z{Qv*)10x5BWMJ{}4PkH&1L5Ehh%rDigapg}0|CfF5Dl^vM1w2_8Ag`nTtMd-asdGF C$wV;# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Faeroe b/pytz/zoneinfo/Atlantic/Faeroe new file mode 100644 index 0000000000000000000000000000000000000000..4dab7ef0859c244b916d61b7489d7371881e0ca2 GIT binary patch literal 1815 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 N{tMXT+N77~{sm<$Mv6e;~+g`+I=# a|NpxO7#P6Du=x0fK#gKx-~yUy#03EHLK!>& literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/St_Helena b/pytz/zoneinfo/Atlantic/St_Helena new file mode 100644 index 0000000000000000000000000000000000000000..d365e3ddf349472f852a9b437fa945a20df772c7 GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIqo>kj$r)%|JMqTC=jrC`GzpK12G7MU^j>vC1BVaLTx9bZ7`T8|8E^prd)*@W literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Atlantic/Stanley b/pytz/zoneinfo/Atlantic/Stanley new file mode 100644 index 0000000000000000000000000000000000000000..34f9d022cd5aa2b03b601fbcb75f8897be6e50d5 GIT binary patch literal 1220 zcma*mPe>F|9Ki7zUGqRKtTS&o`(x?0cNHd_t1+>3T-jR*}Q>ei`$P!a@L z_YM^j74+)TA(0{1Y`3JT5XvH!q(ebaw=!sY-xt9`5x&RF=f|+%;rBH@G>R~Rv9NyP4-9Ka}gSpmBLx=rn)dy>~WKhhyrhNP@BvS7dW%^aQcrrC3pWb)H zT=10T^ZpdRmy@#eYtmnK^MJMb`Gmjxe8j4_u~$|e3JU*Nr>u&Wh&3aXa&2Hqtm`pl zb>Ul4(^z5Ee4G-sUc;(=v0w+jytnG^P1@_7q*Z_EioHQjSR0R>v>PstS=OHYcH{Bu zvMF>zG!LGYo63eoOWTNS`Oz&}eNox^rdn+NUN74oZKKe27cQ7L0VN2Qj%8HgcOBTg_MQVg%pNV zhLncXh7^ZXhm?oZhZLw)6(S{SRgFlINR>#LNS#QbNTo=rNUcb*NVQ10NWDnGT2(Pp zvR2iM6s=WNBV{9XBZVWCo4GkzH_xMP_J`%oEB<7zV*j0UfsVac$F63Txti5m&t^fN Qiv2&q8%7cT3e82o0My}d^Z)<= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/ACT b/pytz/zoneinfo/Australia/ACT new file mode 100644 index 0000000000000000000000000000000000000000..d95c245e5ee1cb22a2b88fa63bee6736a4d0a8ba GIT binary patch literal 2183 zcmd6p|4-C)9LHZLFyzumb9_}o%>+ZZQ_;IZGZlmsLpi>dMt~@4dT^;&dA?E`wfVgt zWOg&e8UA2lw5B;0vD{c8u==4dq&fPfVQtheB~#P)4b#OXrHUx7F+KYYs?%W1>II@73_J z6D6V`Q6v8HXk^AMjr=Y_qoS{B)TcMqIozcWy&o@Qe)w6&25-p2=f9BXHCN=3rWP5u zpi{;-?3G88PRNAP8kz9V9*ObfO6-_-G;VUW#&y4`36301Xsy!3!4#d?n5~n#oSL*F zq>mkKm*ldbPS!r1vgkdTTKk(kK4qs&%j=bC!`EbbYMV^&za*(qhb6V`BbhN2kSCkI z*0gUA>db~Sn%-Wg8Kno*b)-<;tIKs(eWuQypQUqF#cJlHB%SLX(Yd!oJ&7^mx%`WI zTZi5}x5n!PxvIT6cb z>C_5c`ge=u{`#)ueZN

)tBM&eh2B))L7-nky?Bz4H9_8B*Xc(v=lCx~gEF7A{Ot zpDSLAlAT%{eM5_H|E?v&SG4qMpO*D^YI)~bec}9NdGU0wtZw>T*1X*&FEunv#rnhY za_MfV%neADr&_90ieznEj?|2+({+wYUH509t{+^YwcljwhOQ@cBMM#<ph}o5e8HcqQ2xcVKW+<4kU} z(%OU)h$RqAAeulpfp}s9iis#Dq?nkFa@;$@!XJRc{4==7H#1EQw@o$I`}fQ9eR8*} d_rfYp^ElJ(GS{?xw=3P9?n=v_gED42?*R6K`>p^0 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Adelaide b/pytz/zoneinfo/Australia/Adelaide new file mode 100644 index 0000000000000000000000000000000000000000..b350cb6660a68969e89860ecefa57e708405ce71 GIT binary patch literal 2202 zcmd7U`%l$%9LMqR;Sz5wMT{}hATAkFTn=Ck4Dlq9k{lsC84!@Bf(N2bX!sQ^?Q+Ju zST}2W=G-ccz*axx8mMz?%q0~S)3n>#8f6(2={osWj8Sl+> zqeDK8nVu!FwV4|G(_)SD#%SC}85*DPjm8f}>$G!k>!r`9%VnQ@Ez`G0$&5pzlF)KS zW=0N3V)=2I<@U+tX@inf-ziCdJTA#4HIjVxWlhQG(3DZt*&e^n9%$D&69sx@Z?&e5 zBx>50{d(2z!;;<*){GseHFL>6$qN1;S7$ydbE{6tHBqgSoiila;~z>+d_;1_*6FpA zJ#t;-gyx>yrFnhxH2h$cQefd{Qdb?$?|0U(w2n zu-+V7Crh*1bm`9rWZBt0QuT44+%mdNmJfGI^+1dGch|^@UZ2!#E|l6(lis@8uXVNM zy3$vm0dKnAmY%4qW=83%sUP+Bb7!>vi__XLeq0;h9M(GyeI-qUr=&UZmbB=Q-02R; z>J1TDQ~#LUwX8?hmUPIvc}=oD#V@UiuC{rC+IGHCH%u(o;E6JAAIZ~>*VFXw7ZbGe z8AtEgabE8YeW{`L8FF94lyp^nFB?lIWK+&bx&Mk|(jEVXbpP5fnHW z!$H}4@HySKFRTyj?A8Y#Zqw~u_3C&ooKevi!Ra{94tmV5IUM14{m*^H%7A(9;Vmcd z|AV;1yv4=wl)1QOmB4kL&n5uCwVI(K zV?_pwj20O#GG1iB$cT|4BV$Gejf@%@HZpFj88|X>s~I{nc4Y9#=#k+g<3|F3L;wi^ z5(6X%NEDDTAaSsoKp>H@nouCIK!Slp0|^Hb485*H*eNMx)g zG)Qca;2_aK!h^&I2@nz?Bt%GzkRTyZLc)Z^2?-PuDXR$;5-TKFNVJe}A@M>2hC~br z84@!jXh_tMupx0n0*6En2^|tUs|g+wJtTZc{Ez@55kx|W#1IK05=A78NF0$sB9TNw ziNw-sf{8>E2`3UyB%nw{k&q%WMS_Y%)$?~uV`49Y({Ud9&VI$G`JZ62Y938u|8-yO k4>%Vx`&Vd9s>};{r3;I_#$11)H@`67o9mws1;x|;1RR|M*#H0l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Brisbane b/pytz/zoneinfo/Australia/Brisbane new file mode 100644 index 0000000000000000000000000000000000000000..3e899a163f51980c2f92952b002d4cc672a35dda GIT binary patch literal 413 zcmWHE%1kq2zyK^j5fBCe0U!qR=lCs~GiQ&&htnaO8BQM$FF3P3tl{i(%Yt(YiW$zg zOBXN~ST?Zm$}p&Uo@G#d|B69fb3KFl`7;cfoD&%|*RNw>V1z&>W(Z_pn6-fsXn4;8 zAc4eo4GsbF89`DEA=ur=3X}q25D)}n5S!ya5EQ+g52itG1@S@d1<@ckgK4025m! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Broken_Hill b/pytz/zoneinfo/Australia/Broken_Hill new file mode 100644 index 0000000000000000000000000000000000000000..d8f3155c84dff3c25e1590a0c1aa086cc9d51a39 GIT binary patch literal 2237 zcmbW(e@xVM9LMqRaS(3^Ma&s#5I@#6q4?K{%u<%4vSKfG+ z&G{?6Ikrq=V5_;TK%HA-E~%)Pre&?IDEq-*L~Z@riayUTZLP&$e82nh_}<;VgFo)| z9Nt>r`aJ7@N4R;1i(`+u?AM*kUwgUpT>5W=-m@||&=B~buU5D zkhr1?GBdDSZb#yfzw!1=ZjM=O4$;}!+pgPCl(K+2sI(IlnZ|*49g#I{9 z+;UuRIebQvYJ!@)^NOY{J|?NYpXAn*U6NLIS<*(wBt4^7(uY2ljHr-goP0}eA8D66 zLKijj(jm{MDmLdzrN2(^U**xN z$|7A+oTFY>l0J|Wrz>ZK>B{k+^}*3=TK(k}tr@zYwQu+7L#Mxyx}M8YA9_a`v{xPu zbjzv@Az5AhtUR)`UDmjpW$kTsvM$~u>*E62=c*F1 zwPl~BkM11P$NXQbziGNWUNbJOWk1TMf?;_ghirK- zAnj*-vh~zK-F7UfPwj8h?N2xAj@D|m91~}lbBd=m)dweg&aw{lILuc%7~;$Q?|sP% zuX*j@Bg;GaDk9BCTpat%#eK}UIX2DKwb&Nk^%ZWN>GUIuu{EnfmSbzygDePH5wav? zP5crTg{%r$maSPAvM^h-GGuACW^Ksgkkui}L)M2Z5LqFzL}ZP~B9T=h%d|D?L>7vy z6j`dRSu3(wTeDhZxyX8v1tTj)mW-?!Sv0b0WZB5Nk%ilul_N{HHETx}Z);YMEFW1v zQUIg^NC}V{AVol`fRq8L15ya25=bd*O)ZdO*qUnCnsOlZKnj9X1Sttp6Qn3eRgkhE zbwLV)R0b&xQX8Z=NOf#Yd64=b1wtx>lnAL2QY55GNSTm2A%#LJg_H`Z6;dpuTDGQK zNWGAPAr(VPhSUrx8d5c+Y)IXZ!XcGIN{7@ADIQWiqe}-kxC+^L~4l?6R9RrPNbf;rl3egk&+@cMT&}46)7uHSER5=WgTJR&VSB`>!x@* zr~2Sz&so;4PX4&(kMi%s_Pv(axivpcdjE4@?(tfsCchI2HjhkH*xW>$x3UTr+ZZQ_;IZGZlmsLpi>dMt~@4dT^;&dA?E`wfVgt zWOg&e8UA2lw5B;0vD{c8u==4dq&fPfVQtheB~#P)4b#OXrHUx7F+KYYs?%W1>II@73_J z6D6V`Q6v8HXk^AMjr=Y_qoS{B)TcMqIozcWy&o@Qe)w6&25-p2=f9BXHCN=3rWP5u zpi{;-?3G88PRNAP8kz9V9*ObfO6-_-G;VUW#&y4`36301Xsy!3!4#d?n5~n#oSL*F zq>mkKm*ldbPS!r1vgkdTTKk(kK4qs&%j=bC!`EbbYMV^&za*(qhb6V`BbhN2kSCkI z*0gUA>db~Sn%-Wg8Kno*b)-<;tIKs(eWuQypQUqF#cJlHB%SLX(Yd!oJ&7^mx%`WI zTZi5}x5n!PxvIT6cb z>C_5c`ge=u{`#)ueZN

)tBM&eh2B))L7-nky?Bz4H9_8B*Xc(v=lCx~gEF7A{Ot zpDSLAlAT%{eM5_H|E?v&SG4qMpO*D^YI)~bec}9NdGU0wtZw>T*1X*&FEunv#rnhY za_MfV%neADr&_90ieznEj?|2+({+wYUH509t{+^YwcljwhOQ@cBMM#<ph}o5e8HcqQ2xcVKW+<4kU} z(%OU)h$RqAAeulpfp}s9iis#Dq?nkFa@;$@!XJRc{4==7H#1EQw@o$I`}fQ9eR8*} d_rfYp^ElJ(GS{?xw=3P9?n=v_gED42?*R6K`>p^0 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Currie b/pytz/zoneinfo/Australia/Currie new file mode 100644 index 0000000000000000000000000000000000000000..43ca1e455803da69a06c0289048138fad5772e9f GIT binary patch literal 2183 zcmd6n>rd5n9LL{>%MjAYa>_*st>hAN@q$oFW`dxS7>8?$gviA*4}waT^qHFUAiBEA zvL(_OJ#i{sw2ei~HrEKOt$UhL4;tO9ty#{@zOSFoC-n#T`tA37o%220*?Dl@FMnlY z-E94b5O=~29q#tt@Bg&bUg?kjZOH$IhEA3RK0H=x!@b#ok*;Q)YL5*B2eK_>!c>J8 z#aih3EDKA!WMQAhSa{@F3xDfxi#RuEHynu8_%FWEgtm*i@%Vd+tU9BcI=eM7XFxZ% z?$#}F2Q{g@PLuxGrO8?Oni9NHQPXQJ>iZ1E`0^~Kcb&zKCfd~YT$?r+VR7{dcI&=A z#aFc1bQ`f5i}&lc#-DWij2*h8U|2JQ)+!#TY_yCul{UL{kLD~~U~@AYG;dm*WlmnE%uBNQ=Tnq*`a8?+9kaXo z-?zI5l5IiHs1_a=Z#hq$&^>Lx+M@M6y0_{hTb$dj`*QkhN$P8s8@Jc;LYHf4*ikM0 zvs?K;yrhE9cWc?nEn0r8PAhuLRJbo+_qS(j<+fxM1xjpHb)G#?G~bFBC7M4y+DhUh ztTghXm0teY%Fdm!^0OmWacaOS2aec-$4_hZ>%&^p`L3#-KCHE^U8-()K@XMhR84-f z)@9YIHnBwOqw-WYvB~OvHCF$7u{De?vBr<**@nTH_VCdu_Q=6;w(uf-yB`f2EeBA#I87*Vgbu+IrztZ5w+|tzViR`=CkN->K2#eI52hcbn~a zag(*}thOgNuQH#mTtUIt!6iM@#XtJxBfe`-PI8O=?!Avg`Tu_qq3$DYc-Gy#9(UQ% zk{S|^83$${n2~sPL&1y%GZ@ThFvHs6$3k(n$AT&U1fZzbp0m1{s z2M7=lAxwxcF~S516D3TTFmdwi0)>ebCRCVMVSQrhyfu3Vg>{ah#C+! zAZ|e5Fp=}@LWhYRCU}_WVZw)rA0~j92x3Bri6Ia~Ac{a3fj9zz1S09#g%XG*5KJJN zKsbSTVgibZC?=%Xi)oPW$`u@P9bD3$Z~0}epdnsUuRS?gQRu(g)vIAugv;!#jCA)* TDa=Su%}7m8DV&Sa=0yAp9G&vE literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Darwin b/pytz/zoneinfo/Australia/Darwin new file mode 100644 index 0000000000000000000000000000000000000000..c44512fbb73ba306be6c2ad6cb6f2615a95d7695 GIT binary patch literal 288 zcmWHE%1kq2zyM4@5fBCe4j=}xS?2hyT{35n`j68gyEslCkE=MdJ+|ZQa)*j@3#vHI zw<}dJFhU{2D z2H6d!f%b!FkQ=}>&>bKelTg0JwNuga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Eucla b/pytz/zoneinfo/Australia/Eucla new file mode 100644 index 0000000000000000000000000000000000000000..e78c2d42514ef555ce0201bc22f0e7ba8200abde GIT binary patch literal 446 zcmWHE%1kq2zyK^j5fBCeAs_~^S?BoeFqpH)sO5CXktwH-XR@5xo*{B}xidp3EU4p68-P7#Km2i5USI z7&>JbfmT%W00|_vb9itFP=FC6#}IK(B#lkoUke(2F1%%MjAYa>_lll1qr-1tAs91VJS+?xaYFTrBe-h-7*C%q&`qRc6Vu zCDIuE;zYV=n~TUc)(EYwdzz!#8r`g|Sq_n&*Q4{7`U8ADd!E;GzUPiTkyqbu2kBXY{7*jrJwoUGP+0Xt`i^H!oEaX)HSTd2PazQlP9&r_q#3K)TO&C zKCxw4t-2?(*On*0Zdoz=EIV+ORsMdcU821GIl8ws zLu+;0Jov~;Ml?gc$ix?5E_joO%At?Kw9Z3@d)&Ey8F^;B8yp9NMoyxi(P zoo}1_XWD~Dr`bb?CfJteFWSTQvu*W$Yu?R4YAE|h+j2+LnDLF85(c$B{Dhi=53Bj& zYuYjLoLas%J@Qe5cD`GsM|<1su}+`u+Pl?!yDRPSZEMY=E0>@Db#zJ3cJR-CrN?va z$w^j0q4U|pp$h+hIDyVr-0-q<^FCqRp($BEVn&1+5@t-Uok3wng&7uRT$q7jMur(0 zW^C9U950LxoZ%tH2MiDxA!dlc7+pJq#EjClGfd1lT{{ECj1)6eV64DkfzblP1;z^u z7#J}yWMIs$ok0Vm28Ioc+qE-rVC1fyp<~9589Zk6nBil_4+H=c0Za&h7yv;4q5y;e zh=Xe<5I`g_p#Wlm2?h`iOgMmeU;+X}1QQZWOn{(Zq5^~k6BpM`U@(yZLW7A7CODYr zV8R2$2NNJ5LYNQ%F~S51h!Q4Dm^fhq1w_iV6DlB9K(K&l0pSAT1q2L;7!WcbW|*L1 zqJ{|@CT^I(VIt?+2^}VOnBZZehY24hen0?$2m&DlVh98gh$0Y1AdWyFfk*cP=Cgr83B&Q~) MB<0ORv*(8V3!!2o8vp`Wp`=zNlV}T*d~q5 z)?yolCH+w;gfSS~T9l2}7Gua55lJkzqO$%7*&lrtgFb;|pXaw9|JdJtkGscl{^39G z=PSHARyoz__r%*@c=OcSH{ZR(o>$&a3g(%lM~9-x>E)8#SshLB2W8Z0w;KH>O69FZ|t%e|%eKWVV}(>p$yE@8>4- zyHk2%PnDU}a#>|{9hAv(Qu)qplPP75%6}vzf%1@=TI-W(IX*SLBvEFJOjI)iPh@8A z6BSH-*97m}RN3thWY*;iYW6=}X3m)|o%7RqGxyW;I`_meleguVp7+U*GCyDRf{JGO zz}Kwu7c|JiggJWA*oZ88dQ=xY`oa|6+N~FNZZ}IVuF|3QrKae3wk~c8n57M=dYLMg zs2d<{x2*0?y6Of|B|wMzpBXf4q5$6n_AOx)2uyvMVGf+ zFzXJU*6XFkY=|Dv8_V{ZO$D2EMR2XzJYk{Ul04T`zE`2Pde+F+|MFF|J4a$SGSs%K zX;SrrS5>!qWc%0us+z`!vO`@{D%NLqMtXE@VYjKv{!{PD{LSnh{;jU}o-y^$zS0dn zO-BCSsrUR5GkY(U>V4-vll^Tel1+EYi)-PN8va`wpSBj=AK zfMkHAfaHKAfnK+# q8T)BhW^kw|?DSh2#~H%%Ob+;GP4mC}7RV|J_QT#FzacC5vD!OIKsTA1%L>_(}F;R0SN>WN*D|)ii-+?blBzz a%f@EQ#@3&CW!0(3XBd!5wyiD9m%ah>UV+5` literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Lord_Howe b/pytz/zoneinfo/Australia/Lord_Howe new file mode 100644 index 0000000000000000000000000000000000000000..1f542d3700d59c575750e55470ea66114db86309 GIT binary patch literal 1821 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/North b/pytz/zoneinfo/Australia/North new file mode 100644 index 0000000000000000000000000000000000000000..c44512fbb73ba306be6c2ad6cb6f2615a95d7695 GIT binary patch literal 288 zcmWHE%1kq2zyM4@5fBCe4j=}xS?2hyT{35n`j68gyEslCkE=MdJ+|ZQa)*j@3#vHI zw<}dJFhU{2D z2H6d!f%b!FkQ=}>&>bKelTg0JwNuga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Perth b/pytz/zoneinfo/Australia/Perth new file mode 100644 index 0000000000000000000000000000000000000000..1c7ebb795cb7b10a4153c9ba18802c741b43d313 GIT binary patch literal 440 zcmWHE%1kq2zyK^j5fBCeAs`0x=lC7kGiQ&j!0C|l3a5`3PdKx^Xu;X#p%Xaye=p$N zCb2+@F=>I+^7;jusxb>R*Pl{wE!?l*#+t6+u3WRg{ay0{Pv*Dj5@(q{<`UpgWdV1z&>W(Z_pn6-fsXn4;8 zAc4eo4GsbF89`DEA=ur=3X}q25D)}n5S!ya5EQ+g52itG1@S@d1<@ckgK4025m! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/South b/pytz/zoneinfo/Australia/South new file mode 100644 index 0000000000000000000000000000000000000000..b350cb6660a68969e89860ecefa57e708405ce71 GIT binary patch literal 2202 zcmd7U`%l$%9LMqR;Sz5wMT{}hATAkFTn=Ck4Dlq9k{lsC84!@Bf(N2bX!sQ^?Q+Ju zST}2W=G-ccz*axx8mMz?%q0~S)3n>#8f6(2={osWj8Sl+> zqeDK8nVu!FwV4|G(_)SD#%SC}85*DPjm8f}>$G!k>!r`9%VnQ@Ez`G0$&5pzlF)KS zW=0N3V)=2I<@U+tX@inf-ziCdJTA#4HIjVxWlhQG(3DZt*&e^n9%$D&69sx@Z?&e5 zBx>50{d(2z!;;<*){GseHFL>6$qN1;S7$ydbE{6tHBqgSoiila;~z>+d_;1_*6FpA zJ#t;-gyx>yrFnhxH2h$cQefd{Qdb?$?|0U(w2n zu-+V7Crh*1bm`9rWZBt0QuT44+%mdNmJfGI^+1dGch|^@UZ2!#E|l6(lis@8uXVNM zy3$vm0dKnAmY%4qW=83%sUP+Bb7!>vi__XLeq0;h9M(GyeI-qUr=&UZmbB=Q-02R; z>J1TDQ~#LUwX8?hmUPIvc}=oD#V@UiuC{rC+IGHCH%u(o;E6JAAIZ~>*VFXw7ZbGe z8AtEgabE8YeW{`L8FF94lyp^nFB?lIWK+&bx&Mk|(jEVXbpP5fnHW z!$H}4@HySKFRTyj?A8Y#Zqw~u_3C&ooKevi!Ra{94tmV5IUM14{m*^H%7A(9;Vmcd z|AV;1yv4=wl)1QOmB4kL&n5uCwVI(K zV?_pwj20O#GG1iB$cT|4BV$Gejf@%@HZpFj88|X>s~I{nc4Y9#=#k+g<3|F3L;wi^ z5(6X%NEDDTAaSsoKp>H@nouCIK!Slp0|^Hb485*H*eNMx)g zG)Qca;2_aK!h^&I2@nz?Bt%GzkRTyZLc)Z^2?-PuDXR$;5-TKFNVJe}A@M>2hC~br z84@!jXh_tMupx0n0*6En2^|tUs|g+wJtTZc{Ez@55kx|W#1IK05=A78NF0$sB9TNw ziNw-sf{8>E2`3UyB%nw{k&q%WMS_Y%)$?~uV`49Y({Ud9&VI$G`JZ62Y938u|8-yO k4>%Vx`&Vd9s>};{r3;I_#$11)H@`67o9mws1;x|;1RR|M*#H0l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Sydney b/pytz/zoneinfo/Australia/Sydney new file mode 100644 index 0000000000000000000000000000000000000000..d95c245e5ee1cb22a2b88fa63bee6736a4d0a8ba GIT binary patch literal 2183 zcmd6p|4-C)9LHZLFyzumb9_}o%>+ZZQ_;IZGZlmsLpi>dMt~@4dT^;&dA?E`wfVgt zWOg&e8UA2lw5B;0vD{c8u==4dq&fPfVQtheB~#P)4b#OXrHUx7F+KYYs?%W1>II@73_J z6D6V`Q6v8HXk^AMjr=Y_qoS{B)TcMqIozcWy&o@Qe)w6&25-p2=f9BXHCN=3rWP5u zpi{;-?3G88PRNAP8kz9V9*ObfO6-_-G;VUW#&y4`36301Xsy!3!4#d?n5~n#oSL*F zq>mkKm*ldbPS!r1vgkdTTKk(kK4qs&%j=bC!`EbbYMV^&za*(qhb6V`BbhN2kSCkI z*0gUA>db~Sn%-Wg8Kno*b)-<;tIKs(eWuQypQUqF#cJlHB%SLX(Yd!oJ&7^mx%`WI zTZi5}x5n!PxvIT6cb z>C_5c`ge=u{`#)ueZN

)tBM&eh2B))L7-nky?Bz4H9_8B*Xc(v=lCx~gEF7A{Ot zpDSLAlAT%{eM5_H|E?v&SG4qMpO*D^YI)~bec}9NdGU0wtZw>T*1X*&FEunv#rnhY za_MfV%neADr&_90ieznEj?|2+({+wYUH509t{+^YwcljwhOQ@cBMM#<ph}o5e8HcqQ2xcVKW+<4kU} z(%OU)h$RqAAeulpfp}s9iis#Dq?nkFa@;$@!XJRc{4==7H#1EQw@o$I`}fQ9eR8*} d_rfYp^ElJ(GS{?xw=3P9?n=v_gED42?*R6K`>p^0 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Australia/Tasmania b/pytz/zoneinfo/Australia/Tasmania new file mode 100644 index 0000000000000000000000000000000000000000..c4604e5386ef6aaec79f1dbc1e8af557ef63ca96 GIT binary patch literal 2295 zcmd6n`%jg19LL{>%MjAYa>_lll1qr-1tAs91VJS+?xaYFTrBe-h-7*C%q&`qRc6Vu zCDIuE;zYV=n~TUc)(EYwdzz!#8r`g|Sq_n&*Q4{7`U8ADd!E;GzUPiTkyqbu2kBXY{7*jrJwoUGP+0Xt`i^H!oEaX)HSTd2PazQlP9&r_q#3K)TO&C zKCxw4t-2?(*On*0Zdoz=EIV+ORsMdcU821GIl8ws zLu+;0Jov~;Ml?gc$ix?5E_joO%At?Kw9Z3@d)&Ey8F^;B8yp9NMoyxi(P zoo}1_XWD~Dr`bb?CfJteFWSTQvu*W$Yu?R4YAE|h+j2+LnDLF85(c$B{Dhi=53Bj& zYuYjLoLas%J@Qe5cD`GsM|<1su}+`u+Pl?!yDRPSZEMY=E0>@Db#zJ3cJR-CrN?va z$w^j0q4U|pp$h+hIDyVr-0-q<^FCqRp($BEVn&1+5@t-Uok3wng&7uRT$q7jMur(0 zW^C9U950LxoZ%tH2MiDxA!dlc7+pJq#EjClGfd1lT{{ECj1)6eV64DkfzblP1;z^u z7#J}yWMIs$ok0Vm28Ioc+qE-rVC1fyp<~9589Zk6nBil_4+H=c0Za&h7yv;4q5y;e zh=Xe<5I`g_p#Wlm2?h`iOgMmeU;+X}1QQZWOn{(Zq5^~k6BpM`U@(yZLW7A7CODYr zV8R2$2NNJ5LYNQ%F~S51h!Q4Dm^fhq1w_iV6DlB9K(K&l0pSAT1q2L;7!WcbW|*L1 zqJ{|@CT^I(VIt?+2^}VOnBZZehY24hen0?$2m&DlVh98gh$0Y1AdWyFfk*cP=Cgr83B&Q~) MB<0ORv*(8V3!!2o8vpEmtmLuOi= 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Brazil/DeNoronha b/pytz/zoneinfo/Brazil/DeNoronha new file mode 100644 index 0000000000000000000000000000000000000000..c60239009e4695a66be6f44df8d332115be14764 GIT binary patch literal 714 zcmb`^y)Oe{0LSrb5mCXj8q`Bm-D_x@nk`;JTtwJ}CZ>*z%nZ-O!0?RXA8_qNBB5Io zEKT3MEYzS0)wJY1-&-vtp3B|ma@&1>_VPw5YW+AJ<_k9`Vs761_D|N=oPlKC`HHGc zeN1M{DN%@PS*X3p;^4I|W~M}`-7U+9c~L3t$*LU|ZwGb#-Zdv0XN&TqU#RAMP&O}5 zMJsTjTgT6;U2DqE-Lx9YZOhxs0b{JvjZu6uW6S*}}u^>w=LL)Ge;p0TaT*##ape`}8YhbFE$ zbV1s9nm$M)q!ZH0)AT}`d75rWJER}d5b21tM0z4kk*-KvPtzA^>}fh9t&!gRC(V)W pNPDC|vH`LKvW2JF1KGsW?1F5A?1OCNX?8-k!vEeYV5W-(z5&G687cq( literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Brazil/East b/pytz/zoneinfo/Brazil/East new file mode 100644 index 0000000000000000000000000000000000000000..8df63a17bd46413c2c5c4751d96b504cdaae30e2 GIT binary patch literal 2001 zcmc)Ke@xVM9LMp4$_<>FTfeN-w=u_v3*T^rXjUdeAUF&8W=Li#f*}4R@>h|krE6o; zk(C?H_L*DF<(8i|Tj;Wp)6_XfI$Db%lKfMVE1T(gQrGAC@z4IK|NP#L$L)6iu)UwJ zpr)}tFZ8eH4)+ajo|t>{dDI7=G#~05Q#R1~*GzNxO1>WHZ;{@@PqlX_p?%|iw0(!? z%Y~cwYX6>oxp<*N2ZD%Ptx3~A?^-C=x|Zto(GyI(GOY2FCnS-6-X`|P&COp&=x|%B z8Gm|*PT26hnP?uj66rRRwlwM^BTt!(>bq^mr8P2n>K}G;&q>LgG)6Oz4w|gc70r6D zO&*|YG(Y~e6v#v^=x#7m zuYF?+JGaTSi-S6SXV^S(Drsk|9&MgH-mXv0`Q1F-{TC} znP%qJmS|PzArlm3Y4CHQ%*z<5^G-h~)v1@YdjGJ@ztpWY@AS({XNK&8hAw&ez*)Pn zbf3J^cF-=${mLwEYPUTs;x~NmAdQ~Y~8t~X4yT>y6m&rrr~O!jUBbJyr)2$ zHWkZ?Ll5Z6noL=>E1|2Wr^%Yu`|R3rL(;q;ZkunMm6jR3w&jO|vhLw8?Yd)U%=+OE z?S=zC$;Q5z-L!S5dHuv*ePhX5)B4e7eY1RrY~Hq5Q&Vp5E1B%62!)c#!GV-JlgaPC z4W(5?gV3zGRs0Fuh4KXdeb8Io&-_6r-NR8MhwXL8jT|^~Gq4$Z#R!g$x)nV#tso tV}=YG#8yquK0+>;0Ay9)#t+3 zk}bZ>nTy)KuFRB7CG0lU!6#QOuIr#RZfZxNeh5xY-OuRP!=!ub+|=)G%Y5{uZDV=X zG|IQS>D68Htjo5-0rQ#9+o7vtGraR?Qz!FoWGb+ud)sEL_ui)6rJ2ax=(fbKPZX6) zN=4D#b)rM=PW3EieU-_s@bOt8$N$6DNDh0E&9Sl@*^cZ-8pKKmq(!XsK$;+3kTysk uq!H2yX@&Gcn#D>tq+P7^LmDC-*-1;JC(;z@inK-gB8~CCI(w3Q+WQ7f-vFcl literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/CET b/pytz/zoneinfo/CET new file mode 100644 index 0000000000000000000000000000000000000000..4c4f8ef9aed8bf567ce727c33ba1b97da6f6ee7d GIT binary patch literal 2102 zcmdVaUrd#C9LMoP#8PJTMTJ8GViBQre&hSvH!T1Zx74a>FV%Kpu{nX^A*^?N^8ZC!O&zq4nrXXm+jE}qXj zylz`lf$tyZYWEKpXP3LUpV~Lgzp-!p%*Fi^QS}cT*MT>sgWY>IGPPBs=U3XPSNs}# zF=(GWUu37B&azJ<$@W?G5?wpcpoC{<*>&9^SzCz`8?!Y%oT3?3%WP)h?@G%2Ny#(5 zl0Wv8{FmNR%DJPu{_{hc_1<$zJ#o^~jzlee|3RDGBg@$Sl+9_5*bN&R?8eHlWtN8Q zra*~hrDfaA(^4!uE~xCwMVk9y{6$(XB(jDlqVa=J%daPWQ*kZ9Ad7#@Ccz zH(>>lAuB8!wxTsJSaEv4l@xSX$z+!;NbS{vvzu(;AMILnGHADdS*y~)dX)_?(j7aO zYH?qhmNaE*Y4<|Avpi10##CFDbzY(1q?N~gq>9Y1t>VIWwmkM7TRt{oE6%-SE2FPk z<>=e0+S6mzM-J<*mKIyp^Nd#Cvs-JLH>>8hW`!#&bhp1+YXkGN_DY^=lgh33i|M-e z@?2Z@`Y&2P9&Z~CC0gCk&vsweC9CfpvyJuRwrR(Yx_|K-)=)R9#*BToxh$%tDaW-X zUE1>fUTvL>Xxm7q9ylA;gD1`I3R&QB7uYgiG`;N1`-WV7Y-yI zNI;N?AR$3wf&>ML3KAA1E=XXI$RMFXV&mz8gG9&Eg$Icb5+Ec(NQjUaAwfc-goFu+ z6A~ySQb?$fSRuheqUGtrg~SU97!olgWJt`ApdnF1!iK~R2^pZkl-QF^K{`u v;^*lCh(r(xAreC*h)5KXFyj9*j`6OP^YdwDpsFyZI43Vqm7j;Xh4Fs@!4?eK literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/CST6CDT b/pytz/zoneinfo/CST6CDT new file mode 100644 index 0000000000000000000000000000000000000000..5c8a1d9a3ea46457985198597d90f95462a70168 GIT binary patch literal 2294 zcmdtiUrg0y9LMqJAjKa!NEU@iP+BtNfPkTBQWh|FCY1QEJ@bm3u8lI+uGXvZOMWwP*028h zBHaWB(pBhnuTkAz<>?$VVOz%3q)jmrUOQP|SN^M9zj#zfWPK|UyHa&j+}jd$_*E5c zo|nnzyL8O=M~(MnvyMHn$4q%+kBZyhWNvu2Nlk67FgG?-sGF+tOuRo&-Mk>t+>(~4 z5@yVoX^|5uF>IP7{+^(xUl^C9p=swUL=17@aT&eC_c3E;$7pi$VU(5W6B$YS)lF7RmR13zxGz&jJukJqgmRWRULg&B# zoVjQBh`#qFF^d~d>igPv$^B)o=z_XNDV)=;iwc)Y(I4-s;*5=^czD0^d&`W!f4eFf z%{C9b{DOY)%n~Wx(W;jm&yup5YF)l>sw`cUua`Ank>yD#I02#Hzm3u!XpibeR{*ipXITAe)agNklEOhuAVq@!8BHQmF)h+Y|0%| zPd2`0HpdUCrm{}c6dctpd419{a!PMa=#Z_0$8_t}^|Gy}OK(40B0Jie^-}{rX1FB%TeJkxN4=@f7FYqr$6tc&V zkTD^HLPmuQ3mKQw4h$I?GBjjt$l%b8jt_>%+3|4<5E&uI5Row=gG5G&4AW`Hi44?f zN6Il&WURpM@Ekf9~nOq z03-q&AwXil5dz!3}j9!L0)_;Cafi6BP^kr;9W z5s4xaMkJ0%AdyHSp>*0Zs+IS)XMIy=(QY5AvK}Dj<5mqFw9Dzk5%Mn_q zjV%&fr;RQWUZ;&O5@004NQjXbBSA)@jQ^W3N84J@v(@&M&dtop%<`3HXJ=+-W<~!E D%injH literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Canada/Atlantic b/pytz/zoneinfo/Canada/Atlantic new file mode 100644 index 0000000000000000000000000000000000000000..756099abe6cee44295a5566ad6cd0c352fb82e64 GIT binary patch literal 3424 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Canada/Eastern b/pytz/zoneinfo/Canada/Eastern new file mode 100644 index 0000000000000000000000000000000000000000..1698477a48773fb8f306dc4e8f106011d4d1a60b GIT binary patch literal 3477 zcmd7UdsNSN9LMorBrTVO%!s*+gf6mN(k3G<{Nz%WT>7x+gy}PvWFxzTakk^^ux#UG z?zdTPnZ}aKu(Pv?+($l)=2CoepQwGFpR@n$pZ@dhe0%&({r-ME-!bvY&Exg>uV2G8~V1? z8%l!ICZAvBrc+L_`RQi)eNLd*a^Va4!&hD+dvA)|n(nW*EgvkmC-oCMW_6Z3BRh(m zk=}BbZ(Z?Yk4JL1n-;lk8tB~O6Jn3+1HI?iZMFC68U1s1fyz6StM@J1uJYF`)B97F zr~?_Z^}*;=bto}G{}LFd4m)SbBc7q^sQ+mB+hzJE=&UxvYhgAa$j*J zJy8A?)lOU;?Io}Id5GdjfBkp;w(7dCr@qnXuDa<~rf)txscsb)>XOsDRO#UyeS2S_ zxRZTC>J>SnY|&16cg|9AFC|mnPnanlM5oDzJx7Q~f${QjyBX>q&oKGKeYkq^I8K*e z@1dTa4b{(%Hd7V5eRSpeO66EupuF2Q-CYt1^kThsHZTk##;y?n0?Dw?RkxC#cB6 zg*vKEFBP?8lI~a9TJ>MPKn^$^E}XL_%7MFDiRh6|IVjUr3=RvFL#7vtp*~(RCibX^ zDZeL&g=`YTu6gRX=7&|>p)x(ZVuOlbQ>aH2EmR{ja`dRYNosWBQk{@BPzmQwIcEMu zG1fm*zMJF}iFMNCxX3^;t~6dI`Fe?@-@|0G+dYxIrMa9?d`e8r4Aqm4m8thqee~q) zLX{F*q2;0+^?r!bQ&N_yson?lwCI^?TE!)q+AUM07VVd5jnhP0-fB7XalH5-Yp(q8 zY?zppo+M}QZZ6VCN69%~JA}if3P07VSLNF;)ORZ@kL0^JDl2ohI$Z5%cl*0`M4uQ( z#8C6TW8OhAY?ljf%>Qp(4f8); zA+m|cE?UhtBKv4H8;R^BvX#hQBAbcqCbFH#ej*!+>?pFO$etpbitH+~t;oJw&Bh`- zYc*So>@Bjn$nGNBi|jA5!N?9HTa4^6vdPFUBioGZGqTahPFu}ZBYTZ(HnQ8ub|d?Z zY&f#x$d+5po+F!XHM@>%JF@S{#v?nAY(28~$mS!vk8D4(|40Ln4j?T+dSEq8K)Qgm z0qFzM2&5B8E0A6w%|N<=v;*k}(h#I0NK25OAWgBFt{`ne`hqkDZD;sEYj{j=faW0G zLE3}#2Wb$}A*4k}kB}xIU9y@sA$>v`g>(vO71ArDSxC2#b|L*j8isTXX&KTpq-jXk zkhWP(-;l;3okLoO^bTnr(mkYoNdJ%qA{|6pi1ZL?qSbT}X`|Kj5osjSNu-rXFOg;< z-9*}n^b=_)(ov+PNKcWbB3(t=YBhaD8jExmX)V%Qq`63Uk@h0}MH-BB7-=!mW2DJe z(`BU1R?}ys(N@!Gq}52Tk!B;^M%s<^8)-Pwairx)&yl8EP1ljOTTS1Q##>G2k=7%< zN1BgxA89|*f8+*0?f~Q#K<)wLCP3~2C?cv45#Iz-dmA=g$&*mpEKJ%(W6?{@u~pIUqP7 PsH3w}r+`iYK_34C{Ai2_ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Canada/Mountain b/pytz/zoneinfo/Canada/Mountain new file mode 100644 index 0000000000000000000000000000000000000000..3fa0579891a9762b7c131ec5ece5d6d02495bfc0 GIT binary patch literal 2388 zcmdtiZ%oxy9LMnkp}>tlrxHU!BP|I6Mi>RMixs4Hr-gV79MKa` zWy~@ORD#wDQ`cy0pgG+7qjT5gvJx#Ton@mxTP*C}&ig!K>rs!|`riHS>v!St=j~eM zUXw2VansCSc(~Wi!~2XE#!j5?8XVAX4h5_3oiFKb?>4pP#Y=i`+jOz7;S=4Pc~res zc2V|4^{W1ik7d8_Bk^fRnD);9y~$e>Ej};5AWz4AE&iN%MowO;6u!Z1>F@KdQO! zU)DGE99MCkIr8SM18QEmU(Rp%Ox%+Bjl6Z)dtyP4dFNL{V#$7ozH4Z=Si1cuefO>{BDe8`zNc-My0>`0zOQz(%3Jud z&d*z|@_!qZ18x9bN#SgMMv+`6PQPCc}w zNSAs7RatDZc9nmpTvsD?MdmS8@qLo4oO?l3jz-9pzEQDi-?)5utWQ+6dF3O+9iqDS zkX+rhRy^uFscYKX)nmyA^yBqzRU5uT*A*10x+@-CAD^u1k5_7UaHMj-o1+_k_(iSl zTp^!086lqZWXq=p#zkXAjBMKO6;EgWCD%0`66>SR$qmJwVuNo|d$JBF&)8YLF?xsE zI6R^^O?cF^T|N4_FDg}YORL^In4?;%>-3hLu_`cN%IBJ(DLpT6eGjwWa=FtboO$LcGtUb1l(@`ngb1)-u79yKzd6>1EDl*6vOKFsS#2nq)JGc zkUAlSvYJXErQ)a+QY?;YA?4zz7g8{eiXkOKYK9aIsTxu?tEn4OIIF1~QaY=t9a21w z>LKMr>W35%sUT89q=rZlkt!l(w3<31g|wPVBBivNS|Y{ds3uZQj(Q>m<)|o9QjVG; zMMbKLlohEfQdq00EK*vlsV!1mtEnzhUZlQAfjKISl$fK&NRc_JjFg$9&PbuHrqW2M zt)|vUv8|@sNV$=EBLzn)j+7j!IsSi(?l7TWY=WQU%t%R3NlkL5rKO~$q&ofvy_=8y literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Canada/Newfoundland b/pytz/zoneinfo/Canada/Newfoundland new file mode 100644 index 0000000000000000000000000000000000000000..e7a18d601d0255c26885313540cbe755e009a77d GIT binary patch literal 3638 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Canada/Yukon b/pytz/zoneinfo/Canada/Yukon new file mode 100644 index 0000000000000000000000000000000000000000..15216d55ff54fa59031ae33e898950fed4ff15e9 GIT binary patch literal 2067 zcmc)Ke`wTo9LMpyb3b%B_&`p#b+eDonw#70hub`z{j$lNZEm&m^2|(aKe(lBxpivk zxxpwhVxJN<$gYpWevY=VA>;3#h{ZsU>-{W(S58wM^ z|LpY)ZH{(UdH(fe${P+(Tn_hw#Mz6dwFj1#K`!-#g~>Q#|wY$9p7H9e=Cof z>7^s;Ml?Tpdvv#+7ul$C8bf;i$`xusajni>+-CCTG zFbhvl+dEHOF*>$PFB<&7EDmSu!tSrslA53NUF+XhcjtVji%JrzXlBY5XAP+0$xm&` z4?EPdvD3D6B5ukOhizbVn<8idZW_d%uu5QaPHAP`vTlKwJkr~uM zf4T}@%hxOaxTaQpd{ft5`9!Tw=GuGCy`%0O{@vd9#w+Unp0Di#LvNckEo1h<_Loh4 zxwUKScbT=nOz4KPL#koojBd={sTxO*>Ge|^)I-NdZPORsrg{GnyWzbi)3RlcZ9N(= z53i2cM`Fsf`Ri3dSzyC8pPTTvtMsOYKdVh2`E_JwLTx@dqaT|*qqYoP)sK%I zQ(N0F=qD2U)VAhHyZyx@W=Gk1`()Q1)1EzII~pRUV`|8D71f!pOPw~FSzw~?uCv|W zrOZ=DJM_-Wezhyspr1Z9qk6){x_9`hdZzX^y}Rdv>dTqZ{VgX|e`=161<#w<@@r1ui67=*O~a%K6~)>665iDyuMl9G;eywE%>BT!vkJV zDmB>aNpttv?t5-3^``ME?w%ZX&x_QDJdrjzkIHG4Q!g)CtiJ{cQP} z!*fs$_eCjr4!m&aI5Gib2FMhUIUtijX5o}+AoD;bg3N?J!c>sCAd^96gG>jR4>BQS zMoyU$GACqG$gGfQA@f2ehRh6^8ZtLza>(qE=^^uT$^?-aI%SH;9Fa*PvqYwe%oCX? zGE-!#$Xt=hBC|!Ni_909FfwDOOc|LoGHGPi$h47pBNInvj!YeyJ2H7>_Q>>+`8y>6 zNCupe0wf1cNdl4uBn?O&kVGJvKvIF^0!apv4I~{%KAe&eBqL5q36c}1Bn8O|k`^Q{ zNMex8AgMuegCqyZ4w4=uKS+X*3^^r5NRFJ6BqU2tNfVMMBvDAFkW?YLLXw4K3rQD} zFC<||#+;HeBxg=Z8j>}qqz%a%k~k!DNa~Q>A<09s=kv;ER+=x}myvl3K2p4Pk91G! zC*2$D_59O4c_R^#`pt9o%X9aFre=yK=YItO F{Ry)=ETsSd literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Chile/Continental b/pytz/zoneinfo/Chile/Continental new file mode 100644 index 0000000000000000000000000000000000000000..910cdc923e05f664bd15c5be6ae6951cc8b8c49d GIT binary patch literal 9227 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Chile/EasterIsland b/pytz/zoneinfo/Chile/EasterIsland new file mode 100644 index 0000000000000000000000000000000000000000..f22cc98af86af9006d6d25cbcd1d6147e32f13e3 GIT binary patch literal 8989 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 Q|F@6$|MLTWqm(G|ANCV3ga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Cuba b/pytz/zoneinfo/Cuba new file mode 100644 index 0000000000000000000000000000000000000000..28aca000283f5443b0fef54e617fad2227f9e284 GIT binary patch literal 2411 zcmb`{Z%kEn9LMo_I^W^Fd|ItM3$hX6EV1ud2Q7X=|msrO^AX zbEKTkyyEq|e@VVi?DYm$#pqyUyL)whj$R!o_Wtb4)S=d$?qA3D>$Qe;?r?{rk=6mv zY3f&B!!gglxl^My^t;ikev+8LSTEK+Dz}Zxb4MiYlM#b;UYye)alfv2N1hK${0}?5 zQC_~>et4aCN85WcdV8~bXVEWuS4F!wCcRt7F52TIl)j?lrq_AnGuP;Z*fMWo;v$`R zG26R)C|MIvt#t3{i_=L5vfRmAi{;+kNp4a}K&I6A-TM|4>C}P??zE}1_5QTu?(~G$ zb;kI9Z^m$|BoCg}2hQ!12YV0cLr1D4rM*#8_XZ`cX^YORpDD98muPxrzGgfzPiN<* z>cj2|2~0X8b21LfoNMheH?dpiUhL6FhCb0pkAJS2eQ)Z#1E*#Fmm4)}_aVt{4yjwy zC<}7}vhea7nmcX0u{7Dru`#h-~jHqa;eE!DE5dr*Trc4@)a1zNcIyvp0ZOVPYB z^7sp9r8x15gqD6Gp`l(`7HE-W7cT4a$sM}9^Ng+-epgFAXxGwn+jQltd$jCGxt6b~ z(X4Fbqn>$6;Udocn8BtRCZIXmzf0ppaep!Ft)N4 z26^$1C9-vISnAHE$+r4@+1@c)>dRB*rKaD+@4ML><-6fVN8P#`iL`l+6N#Mge9@7} z;e*bI>u-L^3x=EpIp!%2nawypA8#l0|1*mbjilOY za*ZV0YO;-_+iLQSBpk^&l5!;HNYat4BWd?V`ET|{`){~0(YNlJ!gkSiQ+U&M)AN7Y t9&Zb8-u$w}6#ie8zn*y~&SXDe@}Cl%otBX{Yv!z!V0wC5y7@|v`x{(k@F4&I literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/EET b/pytz/zoneinfo/EET new file mode 100644 index 0000000000000000000000000000000000000000..beb273a24838c96e81f0469e3827bea20ff930c3 GIT binary patch literal 1876 zcmd7ST};(=9LMoPj+LzFi-wRqS%fGa;qaIcM1}{Za#Y}Gq#_xJQba+-z$DgU&J}Z? zHdb@x)XA80dh!D60;%~pTgKcRYgW!JSK7l|n>wGy=I{N#?W(K#pPjw_JKMSYzCYo$ ztu1-Je>@MlU-^>999;l&O8B&feUTrnj~iT1QQ(b+#nf+qtRM6})Tj z#QCf{Ctlru|6)C{x7Bn0l=WV}sI5mv?A?hmZQFH1eUaUIuXkAeJNxB}`p-VTtU#1I zwd6Uz=wPre>^BWI4BI&$vF$s=cvoIY~?NCHR(ND4>}ND@dEo-Pd}4COnR~j_k=&8wk?fK5k^GSf zKxP1$0%Q)5NkC=+nFeGYkcmKM!qZI!G8f2XAhUr?2QnYXgdj75ObIe4$fO{%f=mlC zFUZ6oGvn!|2ALaAH#x}cAk%})4>Cc>3?Wm5|I;~&al5oIkA?Dw^0N!G13CHrP;S6` HD~Ndj&PSQE literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/EST b/pytz/zoneinfo/EST new file mode 100644 index 0000000000000000000000000000000000000000..074a4fc76ad816447121db6cd004aa83ea41d437 GIT binary patch literal 118 rcmWHE%1kq2zyORu5fFv}5S!)y|D78c7+ixxfSeFA^>G2Un{ojFs8bC{ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/EST5EDT b/pytz/zoneinfo/EST5EDT new file mode 100644 index 0000000000000000000000000000000000000000..54541fc271644e44973989a27f3846a16800caf5 GIT binary patch literal 2294 zcmdtiZ%oxy9LMnslIR5zDhd^;pkg5Z?J6P_CXB9jh4f-bre6)bLnuyaHz>oJDCyQ* z)1ZH&EHi6!WMy%7`BeL=@QuFW_VkvO@cuBz2CzT&)!FFGdi&rMbnlXuI+eLIcU zY>@=LStWk+hE6&XQdb}D(v#lVWRhQ6ty8u(nQJ=k(bqOto9mY5>QsM@xqfz{z9A>U zq-EyF>eAug&FryHblHhBX3lqgy1f54b;rj~ z>pQo9sqT7Zm9A)eU(M~>D0kQFRP!2FN@ZbKRaMTDs?oisI)8<(9^7X9NprRTK&zQQ zlBE~Cx>eo#b%g{rw5Ww2W=hSnfU50@ll#gG)uP9SWpR3n3f7&J;Mk~I;(J$?{5Z+f zXPnUW$1j?tk-fTM_n>)TXq#Tvb!a3$+A3P%FDzWL18TdMFf-#-w)D zR9z@dBMmB)og$%A<*Ir7s5I}(P-}+2l9rw_(|Y=%emI2!s9mmjkuf8KMn;Vc8yPn;aAf4j(4BVd$l#IDBg03=j|2dT z01^Tu21pQ)C?H`#;(!FgX(NGz!f9iH1Otf%5)LFDNI;N?AR$3wf&>ML3KAA1E=XXI z$RMF{+Snk$L860%2Z;|7AS6Oah>#c|K|-R0gb9fg5-6vQ6cQ?@jTI6sr;Qd8E+k$^ zz>tU`Awyz@1PzHA5;i1mNZ_0{a!BZ$Hg-txoHlw$_>lM^0YoB*gb;}#5=115NEneg zB7sCAiGh0lNKlceB4I`1iUbykED~C$jV%&fr;RQW uUZ;&O5@004NQjXbBSA)@jQ^W3du^?Kw%U1t83iQ;MR|eZ;)3FWBJbZZQm>H! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Egypt b/pytz/zoneinfo/Egypt new file mode 100644 index 0000000000000000000000000000000000000000..1c6a2fc8fa68d8e2e33d48e1faa018488f250f06 GIT binary patch literal 1906 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+4 b/pytz/zoneinfo/Etc/GMT+4 new file mode 100644 index 0000000000000000000000000000000000000000..0ad0ee3229bd1a4dae7670cfc3c0514d6da97aae GIT binary patch literal 126 vcmWHE%1kq2zyORu5fFv}5S#7)|KkT37~FkBv`v8A5VCc0*?`TkGvNXNFSQR6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+5 b/pytz/zoneinfo/Etc/GMT+5 new file mode 100644 index 0000000000000000000000000000000000000000..e53f3febecf64fa59b36cc90405bcb6afc79e692 GIT binary patch literal 126 vcmWHE%1kq2zyORu5fFv}5S#7)|D78c7~FkBv`vBB5VCc0*?`TkGvxvRBs~t= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+6 b/pytz/zoneinfo/Etc/GMT+6 new file mode 100644 index 0000000000000000000000000000000000000000..b41149616a316b2647b3bfbf65ffb55fdfefb3a9 GIT binary patch literal 126 vcmWHE%1kq2zyORu5fFv}5S#7)|J4f^7~FkBw9SCr5VCc0*?`TkGvfjP7{v~v literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+7 b/pytz/zoneinfo/Etc/GMT+7 new file mode 100644 index 0000000000000000000000000000000000000000..32fa6dcb42ccb1f685fb3cdb363b52ea61294ca0 GIT binary patch literal 126 vcmWHE%1kq2zyORu5fFv}5S#7)|G5(w7~FkBw9SFs5VCc0*?`TkGv@*T4NVSe literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+8 b/pytz/zoneinfo/Etc/GMT+8 new file mode 100644 index 0000000000000000000000000000000000000000..512578ca6d7c1e49ff5fdb0ec788e61fb414c27c GIT binary patch literal 126 ucmWHE%1kq2zyORu5fFv}5S#7)|NaIB26x{OZ3`ebglwH$HefUCEVuvx)ebTM literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT+9 b/pytz/zoneinfo/Etc/GMT+9 new file mode 100644 index 0000000000000000000000000000000000000000..d3e47e7b24e591d3d50c317d8e5c6c849a2273b8 GIT binary patch literal 126 ucmWHE%1kq2zyORu5fFv}5S#7)|Hc9a26x{OZA&0GglwH$HefUCEV%&oP7V41 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-0 b/pytz/zoneinfo/Etc/GMT-0 new file mode 100644 index 0000000000000000000000000000000000000000..2ee14295f108ab15ee013cd912e7688407fa3cde GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5SstA40xXE*pp`c0iN30C@!qNdN!< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-11 b/pytz/zoneinfo/Etc/GMT-11 new file mode 100644 index 0000000000000000000000000000000000000000..f1af0e290c988923609d96c86c23f03ea10b6671 GIT binary patch literal 131 xcmWHE%1kq2zyORu5fFv}5SyKWVb%r)26x{OT|+}4KZJa(Ts9C>?0_b50RV?0_b50RW)d3<&@L literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-14 b/pytz/zoneinfo/Etc/GMT-14 new file mode 100644 index 0000000000000000000000000000000000000000..41c6a1d1ca0a7bd4f391c13e069307859dff1924 GIT binary patch literal 131 xcmWHE%1kq2zyORu5fFv}5SyKW;m89926x{OT|*NfKZJa(Ts9C>?0_b50RXNc3`qb0 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-2 b/pytz/zoneinfo/Etc/GMT-2 new file mode 100644 index 0000000000000000000000000000000000000000..9f63268d09e0b2dff05a1ee179beab9b51ccbccc GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5SxvGK}Lar!QD4R7o;PEY@J*-U^DD=jko~hk_f8+ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-3 b/pytz/zoneinfo/Etc/GMT-3 new file mode 100644 index 0000000000000000000000000000000000000000..38ccd8a6108b6e1001a80414f799a10a6e1ae166 GIT binary patch literal 127 vcmWHE%1kq2zyORu5fFv}5SxvGLCb)F!QD4R*BHnRAzLSx4cH7jU1Kf)@c{_y literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-4 b/pytz/zoneinfo/Etc/GMT-4 new file mode 100644 index 0000000000000000000000000000000000000000..43badfb220c42d1577a376c2ce455faa3b35cc7b GIT binary patch literal 127 vcmWHE%1kq2zyORu5fFv}5SxvG!NP%o!QD4R*96E7AzLSx4cH7jT@x+<{cs5@ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-5 b/pytz/zoneinfo/Etc/GMT-5 new file mode 100644 index 0000000000000000000000000000000000000000..c88cf210c3ba7b6607e57b976ff35e74d7a24d70 GIT binary patch literal 127 vcmWHE%1kq2zyORu5fFv}5SxvG!7YG+!QD4R*A&PNAzLSx4cH7jT~jUq3GNAN literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-6 b/pytz/zoneinfo/Etc/GMT-6 new file mode 100644 index 0000000000000000000000000000000000000000..c1a0634cf5ca81e8d51493b3e7ed1ce53bff6eed GIT binary patch literal 127 vcmWHE%1kq2zyORu5fFv}5SxvGAtZr;!QD4R*9^!FAzLSx4cH7jT{A8K7F`Le literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT-7 b/pytz/zoneinfo/Etc/GMT-7 new file mode 100644 index 0000000000000000000000000000000000000000..bc152efdaf3c9c522cefa7f304db8a4facb1fb63 GIT binary patch literal 127 vcmWHE%1kq2zyORu5fFv}5SxvGA*q0Y!QD4R*Br6^LgS&5tt|gEgLbgsW8?YI6x|Uo3JE{t6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Etc/GMT0 b/pytz/zoneinfo/Etc/GMT0 new file mode 100644 index 0000000000000000000000000000000000000000..2ee14295f108ab15ee013cd912e7688407fa3cde GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5SsN_@rKW4sm0gV7%&9e2zxQEXT(0?_=f^p(!!!P2jQ7VgVOCy$ z>pxe3`GlLR#@xJjTxrK%UD^0$_NsGx?A2xa?T;#=>@~|n?X{ZZtSh=@uP=ynHe{Z+ z%QAeNjR|#jdDKLwBKn}SY0_n9v+o9HbJGNS%az4WW%MPx^7ssA>(6<1RmEs$Tf+*c z`t9D%_U&Dq9R*L?A1@nc*JSjvcg|hx?25DP-JZSno_0<4-r>d0-e1nxwc&G|+Ot=k zy4xG=`aKQKzVm0D{U2642kLX2gT>37Llq~TLl<(g4`Zr{R~kX@@V?YRALxYp1$;iKwiS&a2i) z7e}S*f;XgFexY>Fo+b~adL(jaiaZ>XAW;#~@`xQS(LTu+J#3$CufN>wlz|N~Bp?|R?G?&PrPNh2N z;#3*@dyx*QPnO5N&eEaflQpq+h(5j~Nr$bB(BXNJnzU%JJTcNolXE-Ch^Q-?lH4pK zeLm4qk>ALurtf5Q>w_}7;eC>}kONR57j(zrB9hW~{ z$3L2{p43tLOjx>R#`M(8n{k>IGE%a>3fAXt^pFX=e$|PM{*t{mNOEef%A}I(GP$%t zrc7>>sSAJ9=ZEc--MemiwWXVn?sFV~sPg*xlRe0|}fM_=4DQS*<@ zk(b^{)Y;|Z<>i@OwP49WnKO2%6y}A=+B6ej`uhAbEm>NkmRGCR_jn%g_A#f8ub+Et|F-w*SXOYEm-%P( zF15VxeD|)l{LCi@yzIZ8fno(&Rzx?ikUO6(pYu!~@3E57JXU%NxA`X7yd?8tSzhKc z55E4n%r~C97bDR85I5IObMxNi4|BB&9-EKU!_^c7sR&XMq$WsFkg6bMLF$4O2B{2E z8l*NzaggdD<#9FjK?;Oa$kmhxsS#2nq)JGckUAlSLMnxn3aJ%RETmdUxsZCfnt~w} zb2TMHYK9aIsTxu?q;5#zkjlB5(jm1&iicDWDIZclq<}~TkrE;`M2d)15h){5NB+1J z($!QFDJ4=%q?kxGk#ZvSL<)*j6e%fEQ&&?|q^d|+k-8##T%@{4d6D`e z1x6~2lo+WoQe;0tZ`mvocY4NcGW8-4d L`o&@2c>g~E-dmAr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Andorra b/pytz/zoneinfo/Europe/Andorra new file mode 100644 index 0000000000000000000000000000000000000000..cf9533a3e4d5acb318419d5829880e7197a13a16 GIT binary patch literal 1725 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Belgrade b/pytz/zoneinfo/Europe/Belgrade new file mode 100644 index 0000000000000000000000000000000000000000..5f0389f03919e0b56de9cf4bf89b591a0e8e9c2c GIT binary patch literal 1931 zcmciCdrXye9LMqJ0gf0e_BBV4fRKcs9qyMvq*P#xOmk@LILW%&JA8Gc|lUfA0qKa}Qa zn76ty?D`RX{>L7ja&ni3A3Y`!hx#P)lTT%8hf36z_awT$NnTh{Bh!j~5|izf7u}f> z8xbedpAM5amq+97rfd9-Se-HQoX$KQs4w;Zq3#2>HKFUWCT>5gNt=#pa_wPFsk|hq zP5qLVGa%_pKa`BfZpln-k<9Tn$qMh%tSc*J*289LLzmr4*7A@7DZluvzJ51e zD!%$%myZO=ik?YQ+5f9lwf!d5T|@Fl^@yz8`irj0{aR`&2eme8kF3t=)4GXY>Y7N^ zHMc&}wc|~??o6w$zv9z34=&gGZ#T$WJ94z4w@lt%8>Nly8M0wXwlvj+%EpwbvdMd2 zHczsoIVnV&?_86X;CtFKd`eo!F6ld8^vb(K1G;6;3EkS)t=n1;Xj^BS`rCfyw#+BM z^(1f03KkC9qwk1lJHWF3`^|fg*JqwGpJmxLA9LBZ@9~E>(EO2ytJOUGe&$beRb}6K z1v$vbVMY!#a;TAmjT~-AbHI^9jvRFUaSpqqIq=A#M-D!6_>lmR2#^qv7?2>4D3CCa zIFLY)NRUvFSR73-NHj<|NIXbDNJL0TNK8mjNK{BzNL)x@NMuN8NNkQKI3zkp6CM&D z5+D*G5+V{K5+o8O5+)KS5-1WW5-Jia5-bv}qX`#@*U`x#Et}yMDJ+AN8)!h1AvSGG6cvNAcKI60x}H9I3NRoj07?i$XFnQfs6(+9LRV$ zngKyZ1Q`-!OprlAMgPfEo*WX|A}C+%sxH(HY+vJ*{XlOd0$+@R{gzK{|=V< a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Berlin b/pytz/zoneinfo/Europe/Berlin new file mode 100644 index 0000000000000000000000000000000000000000..96059c7854e1f571ddf97fd285a28df361c4c99d GIT binary patch literal 2309 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 TS!vm6zVxgVe}>O_n(qA@15Z9| literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Budapest b/pytz/zoneinfo/Europe/Budapest new file mode 100644 index 0000000000000000000000000000000000000000..1b787b16cea3331865da27115642fd1e3461ad0a GIT binary patch literal 2407 zcmciCZA?~m7{~E*^Ps_uU1W$RC`AMm@+^r#W_Q3yFp)bW5Wz%zhzN-sl*UTuTqAeY z$cBg_5?M293+)A3Q?uzpB8&{wWukyRFwC4~bM^lona$N}&wq!{**UymY`?E7cSUim z^`C2udBe@M#oRo5)sOQptncX?+1lHx4b6LWTXas@w)estx4+#kja#~db`(`(HAzdEb5s*xf3DTer)U z8kMPQUX`Gda=Clq61gYCCBaE4a&JU}gam}jed8udsHamyFUM=x`4A27nV|O{9;*+u z{h<-f7j#-}pGL0#N~0?FX>`$t8k65EvE^+Nm)tJ#^Eb=%zy?W(t(1go)iPspt&ynm<6Y5hPlIzHFTO*Jxi_YQrcv{dHRtkbNgUf200OEvq! z5_M&y>689*bwNb9F1Qk{Iew{=`*uFl_mKdS~RszmL|7q@ojr_S)l5&p?7rowQ^l?q)JzwcImUb^0eg3Rr1`% zWG!vUmgkpG)v^uKWmQ&^lo$KU3o%oqBIQqc(btmIQGU956SOrm zM5c($5t$@1OJthJJdueaGexF~%oUlet(h${U1Yw#NJ@~LAW1>8f}{n>i>*lvk{Kj5NN$kiAlX6EgX9NE5RxGzMM#d2Bq3Qs(uCy6 z)+7qal&wh>k}D)xNVbr4A^AcQhGYy$8Im(3X-L+Pv>|yz5{G2Y)}#)}ovle8l077S zNdAxnA{j(dh~yASB9cWUjYuAmL?W5AHK{~$X={>+WD`jzl20U|NJf#AA~{8piewc@ zE0R|vu}Ef-)FQdHHOWP?i=-FHFOpy+!$^ve93x3avW%n|$up8@B-2Q$kzCuFWFy(O zHR(q3jU*h&IFfQC=Sb3#th+s6 q&Cfn!jlRjqB$Zd!?Uvsgq7 ziSIy)D9K1<4Ci`a^}sIFF1T_sD2rAxP-<6X(89)$_Iv+(B5aTQ%fHvD(}Ny--=BiT zo2$~zf1XhLC%ilj_T}@7*F0OywV^t5eKcVDuNIi7_}_KP%lFh1^1XT6veFwRYphx3N4M(y`(?7=p9Woc(I<=U7HM{8spj-9)Wrvv>XPFz`es$UE1M+_9pp@w`laI+ehalH`oynl>|nc=c$6(Pnw z{u!b}LeAFFo-T5}$O-ds z#>gon=j>=t8aZp^w2|{hP8>ONa_-NMcB4NNPxKNODMaNP0+qNPki{B#&f|q>to}OaL+i$P^%RfJ_213&=De^MFi*qn!z4Dv-HACIgubWIB-fKqds4 z5oAh`IYA}`nH6MOka%zg CSha-! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Chisinau b/pytz/zoneinfo/Europe/Chisinau new file mode 100644 index 0000000000000000000000000000000000000000..983cc707167654f15ee699872672384a4637157a GIT binary patch literal 2407 zcmb`|eN0tl9Ki8&l?&GkTpw$6kynFMFyu{CG(q$VWP)DhYNR5^Lc~N$d@#_IW=yUTL5)*qf{&-ol4&Msr) z_rX&``$Cr2L9etbi&hDee>5twp zJ~{HTapv_V6ujn3UZhCJnTR+}J%b_tJ7P<&TYW>S>R7q`zEFJ6tLAI;P6}Z8PNbH{)bMb+VkX zb&8l-WS5?*STSq#6Vntq?taf}TSH?@Z z^6G1{W}sfK>TZ-zU-HS-N0!Li3v0!i?Rm29aG7|fCQ&}SZK7B^f10STc8hgc31WTW zZ(_p;O>E4Fk{it*M1$*&Z18u9#v9+s=i3j9O}!nmY43U2+_qnCZagGgcD6`c$dI9T zFS{c&EHunHEU>~O2A5O48e$(@k*<5aG%e;9f6UPhT8O5N%d|N(EpC(+8N3HhTtXYc zi7hI4&n>XU@V=H1ya!K$pWrF=X*1O>EG*;Z(>&HzUzC>3QhSd2sWw|+s|OzccG+yc zf1g01USf0YP@Cs5f2wQIiSA#KX+$OxnMzAFnaFe^6N*eJGO5V4A`^>DEi$>t^db|C zOffRa$TTApjZ8H%*~oMw6OK$dGU>>)tKUgu;*qIGCf`y`KT-gs0!Rsv8X!eLs(_RM zsRL37q!LIekXj(cK&oM>%7N4aDF{*#q$HNACP-0`svu=S>VgyosSHvYq&7%#km?}i zLF$7P$Wm1ZDUqeB5mF?iN=TWIIw6HZDut8^sTEQzq*_S1ka{5nLn?-p%u>}1DVn9K z8d5f-Zb;#f$|0pgYKIgLsUA{3q<%;NkqROuv{W@jifE~-h?EhjBT`7Dl1M3$S|Y_n zs)>{nsV7oUq@qYkk(we!wNzC_%8Jw#DJ)W1q_jwFk>VoNMaqlR7b!4OVWh-JjgcZ- zswyL8wp4XS3XN16DK%1Sq}WKc(JJ>4`_PcPSLm=XN0=kr8CVgKgDYIUY7ZS;uHpB3 zsZm$4wgRrwtpcvTQn`+>(rx9MXa`PQLJOpOq!n;=SGf+PJIM;Tx(82!pHQOW{eL3< h9~D>Ma;o%?&*q;%TIq!JiRqac6VghvGOec^=U=5NntcEO literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Copenhagen b/pytz/zoneinfo/Europe/Copenhagen new file mode 100644 index 0000000000000000000000000000000000000000..af7e9269e5e4517167db0f74284cff125104bd93 GIT binary patch literal 2134 zcmciCdrXye9LMqJh(`^LebL}p+%zP#j@-dZpy~0zOpc|TlvKnEq7KU_iwp@8@>SoR^WBGeO&SA^HeV#qf>)CV8ALozr zdHd&8lxJA~I|i6HTpU}?#q$%*@r{d`Lr1$iJ#$xeU7jH)KXqyFBafVVKTEndCCLwg zXgNJf^i17WIUCcep@ppyy7;s76r9kWW5;D^aObUIzG?DQ=HD8XcwM81omW@bNp;;m zs>3gRu1}xYr_X%-p2i$LBC!YBByRU!iEmU%ShrC|R0d?^f~E3op>9Tq~y^`-dp#_N-rQpVIGCk}onI7zvmoI%RGul3r!meZL z+tDa94}7SvR8`5Vjhl7W-0eEMa+wy5t5knsfxhONsdL<8bk5y0Esn~U;+~=U`km1- z@6aDQKNKzt_C-ob`|q-_{XZ$K+L>-3Eaetq+k`C9p1wY;@0PpevrWaWwkUDc2+)w6OXQ0|hq)8l2e_b*u! zX-Q3Ll-At(MQS7NYHjy7Qg`E=zVk(ktPOVPx?RV0ecK-0P`6*}chsxpu=<5PbUOMw zAOC4tu_GMj9~vQ+^TGZ8o4)rRZ;{{fc>U&U4s#fc{zw1&2bmAKINmiE&yoL{qoUzd zJ5~?5nT0IE)~o_q2C@!hA;?OQr66lT7K5w?Sq`!uWI?uOMaYtD&6@aeEDBi_vMgj> z$ik47*_x#xYeN=?tPWWovOZ*i$O@4qB5OnziL4S?CbCXsp~y;+rP`XcB8x>^21pT*Dj;P* z>VOmisRU9Aq!vgqY)v(ga@d-BAO%4xf|LZQ2~rfKDo9z7x*&x?Dua{;sSQ#bTT>mR zJhrAjNP&5>h6lPDr7UN+G2}YK0UFsTNW$TT?HjU`WM~k|8xiiiT7T zDH~EZq;N>(kkTQwLyCt~4=JCmsUK26TT?-#gh&mMA|h2p%81kvDWrou{-=py0|q|+ z)3OG4@srHGzuij{wFt4Ed~i3VG;i+Td0*%=x#a5WW?wmZ3O6wwo6g5>UuH^nN}Ai3 Ko`$KJ;r9TrbtOpv literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Dublin b/pytz/zoneinfo/Europe/Dublin new file mode 100644 index 0000000000000000000000000000000000000000..3dec02693d78bbad11809142cc4b6c0502c45129 GIT binary patch literal 3533 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Guernsey b/pytz/zoneinfo/Europe/Guernsey new file mode 100644 index 0000000000000000000000000000000000000000..fe63ff7e7f1e9b47c45c62a7768e3924f8572c40 GIT binary patch literal 3661 zcmbW(dvwor9LMqR%&_J1Ax7r%(OjC={5F?_C4|PdTz>J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Helsinki b/pytz/zoneinfo/Europe/Helsinki new file mode 100644 index 0000000000000000000000000000000000000000..19d7babd531f6623710debe40497c4a50e4e613e GIT binary patch literal 1883 zcmciCe@x7A9LMoHb$&GL9m_=}B>8db`sr8sl`B6A>5w1Ek0d07R(_R)G;fuOzU+d7CM;cvqS7X*+R(Jjxjm>>1aU~5BpVBA^GxkYh*bzyJE0d(Q3KII`T@YjC!1-$#r>}(l}B_?;NLN4u$I2f(RW~HA2RxIW#ptL?%SOR8MM~ zq&eNr`CXMszS}bS*$J6ae@Zf%n>2GzwM;#IT&EQm%k=8)nl*d3&L~={ z*~5y|n~|5Ce{C2snX!YvKlk>Fb)>>J$ zD@BXzvSoE)xUSimC~LElrKG?q>tcJ$de2wc5NMOqm>?~E|5VDle%7*kH>CXCL*00; zPB!@(b@Rb%x~2YzZY{6XiaizD&ThT^{Qu|MW^)#DS%cknf153|kFC@1&l5AfHjgKp zFE78c+pRC}zc01D`6nM>OcxXDnUv?YC(!YszJ&@ z>Ol%ZDnd#^YO*v%AyrwLvXHuv!jQ_4(vaGa;*jc)@{szF0+9-l5|J8_B9SUBO_@lY zmZngoQlwO*R-{;@TBKa0UZh~8Vx(lGW~6AOYD-f#Qn#fk9H|^B9jP5D9;qHFAE_T% z0AvM_B|z2ySp;MikYzyD!O|=QvJ%KrAZvjv2C^E+avtbmZ23Z+Pvoy%sAd7>n4zfJR`XCF0tdQNWo%Qy2{LlBV88TyJX2^_DM{A6_{QjI_ k#^}#M`ngEvJHRZ|&^Wfrl^GwM810UUcV))9t*3;59}7mUG5`Po literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Isle_of_Man b/pytz/zoneinfo/Europe/Isle_of_Man new file mode 100644 index 0000000000000000000000000000000000000000..fe63ff7e7f1e9b47c45c62a7768e3924f8572c40 GIT binary patch literal 3661 zcmbW(dvwor9LMqR%&_J1Ax7r%(OjC={5F?_C4|PdTz>J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Istanbul b/pytz/zoneinfo/Europe/Istanbul new file mode 100644 index 0000000000000000000000000000000000000000..864099556bc9875b7e9258af6c3b221d84c68eae GIT binary patch literal 2721 zcmbu=eN0tl0LSrj?*%TGp*>oNB#Na7Dk`8T7>I?)RInpn%@p#ah?qpj*NHE2r_N=$ zd|WhjR3jyF>ZqmJ)KV*#7MeYsa;6 zFiz#T^_Kh&!LRx*vrhNF96aMIwp!gAjn)g<*4LM}8D~!v>E}*aM%%9S)-PA~8o!q8 zv)aqTjNjwZEvCM;{@Lpe}`C{s8eP@RU zBW$k~DVmMQ*4}!Dx(uUZ{RaJk)!huSW`W*$_NK-M3x;YBeUwLl2Ftb?Kv3e z>K)M-v$k4~Ial2nd*r0my(UWUv2LXnw|s%tv%Exmq-c`%X#QxeSLQIScT%Dj9~-0f ziHy(^Lel~X?On~p^FFihsXxqqhcBA_cb_wp>b@`sR39)0u71xPw6NApF4Q>WQOZ_KdMyDc%(+eXjbb*%kF?gcYv=AZVc_+w^nPSDQXlo}izdQ|51`bOkk`az8G91>%i zo5a}fw~BEM+eQBIgR)?Kn;gIMZTVzHh0xcnk`tbKSr(Shk`srOOMiZzoD@A?PEP78 zCtppLQ=&$TDW^Njr`r?7)IC?^w3Y}_RNF}u@BUdlQ}vseUfnE==`G^f6+g)t*&m6S z#m8ky+-5N=t3j5Ae<){nmvZ)x8)eyz`EpKErF^cv*`bbv? zzR^10`TgzRj4AMIxw#Yh$FKPd)r-H-&!5pWmpXsHsaOAhU+@U^13sLc>cjiPH`STE zr|ArG*^vwHs4hKn@sZ1q1OSNu5&|R!NDv%V6p%0=aXpVNLU z5>zCrNLU?JT#>*!s>mXtMPiEt7l|$sUL?LqfRP9zAx2`11R04k5@tsgXC%-_q#aeL zkytybU?b5+!i~fm2{;mQB;-iUk)R_{N5YQ89SJ-Vc}Ep`B=(Lf_(=4T@FVd@1^^iW zWC)NkKn4LB1!NeIaX`3Kj0!R=$haT_ zgNzI^G|1REs=+}<$59OrGCs%vAtQtg5i&-|AR(jV^0@Ei2?@RRxIJOsyL~+2zWaI9 zDmfQeZIfChwL9U?HmOxo+tkU~rY?7WfBQH2YMcINpZ+;e>ODd&*nm{FEU94dz_fwM Pg9axRq$E3ULn8hH9ONz6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Jersey b/pytz/zoneinfo/Europe/Jersey new file mode 100644 index 0000000000000000000000000000000000000000..fe63ff7e7f1e9b47c45c62a7768e3924f8572c40 GIT binary patch literal 3661 zcmbW(dvwor9LMqR%&_J1Ax7r%(OjC={5F?_C4|PdTz>J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Kaliningrad b/pytz/zoneinfo/Europe/Kaliningrad new file mode 100644 index 0000000000000000000000000000000000000000..fa6bab8620370007ccb2a308c44b84ba8b596286 GIT binary patch literal 1494 zcmai!TS${(7=YiE^DuQTLgy(n%|mKsT4rUnn$tXmrQLLZE+i^~w7QJ=2#JWOb&xK! z42dF0A*zcqp`eQ(vlRu^DuRf>i~4UOD5Boyx51*&_v8DY&(AS7d>-33@7hrz|4fSB zu$dO!oO61UyxV(UytevY4F%6%x)r=|I~eTmJ{NqL&=nm0)Z}@5)f*fe@Oz$|UhD}S zF7SlDJ362CbZ>ulY_RoNxbS^y(UnkI`Wv4&KHTd4o^mgJ+#SjY`+b?CXF^$bFIw5x zPFb`14qG|L_gk|Mc38Q4Hd%AF)>(PYORfBxVry<$hE^8m8ZnhOs-+_@PIdhWey=^tx#|aY)25ZF*!mW1MlZ z6DvL;YPk}Vl3j^YFSkf`u0#J4ZjU(sK9`hppPkEnwa<|tQc^C-k!R$_F~fdM8u!s> z$@B->+QlDemzK6#-AxkUBA^#_y7gP|_WFeOkstp|`~Ma4=&#w#dflA!e(CHT*s>0y zlTB3$q7_6fh+YuIAeuo`gXjiP4x$}IJ)5c@L_vs#HdRIaEP{>@B_UecR5c-bLKKB) z3Q-lJD@0j{wh(n8`a%?jXbe#qqBBHkh}ICbZK~c7#UYwQREOveQ68c_M16?hc149xFSumtwQ}bX*#HMD#kP0LhhGZbwK+=Ka14#&y5hNvsoFGXtWCcl!AumW` zHZ?Pb)NE>Q49PKM$B-T*ziFCZOk~A6W8>o{R)Q;PX@2g+q^Xzw6P#JiJ8Ok8c7@tm w^jWLYd#zCKwYiD@v^i~2pOG6!s{NWwyTYimS$7`C7l32qeZY*U7{OUX8yOlK8~&otgI^ zOWZZ@hbnLSWW@W|?VruNl9BLDhN|u!Ka|Kid(`%ye8bKje8tY`@3M3E#O%EG4fZ{o zYwY>;%k2D$1@^s#KD)s0u?ybmirn{lz+U*>)z(GlzKuLE8gDHe`Y5t^;8bg1|Dj0H z?z0+Gr8k-EqEGpS~2;XO3^u_AhtIv#(Za$8du@w>?*P9w?Jt z>nfzP%`08SIkLO@PkDZ>CEZ1t+HLL zT3+SKOun1Eclmh2E1#_kN3H7Ws1Ib1I1g5=?HMQ{G)zs>vx z7e|k|xS#)zIU3J=6+?!Ai~$)0G74lE$T%F$K=@;f1Q`l47DqD}WHiWdkntb`LPmrP z2^kYIC}dQ~u#j;f14BlJ49(Gu4H+CVI%Igr_>ci2BSeOXj1d_mGD>8a$T*RKA|pkH z>S)G_4A#+%78x!wUSz;;9V@3vzj2am>GHztx$jFhQBV$Jf?`TGk4Byd=9|-^w z0VD)S43HooQ9#0g!~qEe5(y*}NGyi5iX;wR3xIqeMT4f4n zI%f)(A^f+db9W|RP1~HR@ow_omF;xSyz<$4)4Bg`-OXZWo_S0l7ncyk!fwf?M literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Lisbon b/pytz/zoneinfo/Europe/Lisbon new file mode 100644 index 0000000000000000000000000000000000000000..168accf060c3837af1bd64361bd0dc157dec0ae9 GIT binary patch literal 3439 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 a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/London b/pytz/zoneinfo/Europe/London new file mode 100644 index 0000000000000000000000000000000000000000..fe63ff7e7f1e9b47c45c62a7768e3924f8572c40 GIT binary patch literal 3661 zcmbW(dvwor9LMqR%&_J1Ax7r%(OjC={5F?_C4|PdTz>J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Luxembourg b/pytz/zoneinfo/Europe/Luxembourg new file mode 100644 index 0000000000000000000000000000000000000000..6c194a5cdcb22da9319183df65478ec4e55555fc GIT binary patch literal 2960 zcmeIze{{`t9LMo{o5hyR+px)oTWbx?es3Xbm~mwD^TzU9X2_arX=f9b(~iiF^VV^a zM!RM<#Hfa8Lm1}7QcNf(ha;tqZpqP)v!l=Ro9cA(PyN$BeZS}XeSFXTvA=eoFXy;f zS+Tai9scGOE{+;=@f=uGwymzDOYxMFrt_Y)*D5crD_`S!bB}6i(P}NdSnqOA+2~on z=!&~6GQhK8{wyg^SnSz2DOoGR5El=m^`k zW0jt&%2?ZW_i)#am)qOkUN+nFjw|}bcXOAzsz*e+cMcin*cC1A-LZM@nl|6NYi?h5 z@A>w$`@J*E9kpk_bJR6la_p@+<=9uc%)S5hosRcQf*l9)S33^QTcnm3fKUHZxoUoE^1Y`ao$P_p^2g{aORteWpQPCp75BKJ9pU zyWW4wt(^|7)Zn_k60)^QIcCI`yVVXRc=9JLBsq#=nqJ)Kn%fqcZ zO1O85hTn|WZdbyzdsCqHINVYnss2$T%D>W{tIlg=(FYneuTG;gw`t78a}t|dEpbV; z5tDzauLClqu|b}=yg`OmZIQI&`!#(< zu?*X~UWe!8$cW;XbmZ7qbX4|q9sOvwI@1R0lR?9DOhk7bb1PaiIt-GGPXhF*o84sG zt{-%Kldnv0x0Q+2-^irG8!~xSqfD9HBvTh&)2EYn%e0BdHM8p)nVwXoS*>>JjLxbv zzFe&{n{#zmLxDbX!Kt%1jo0iWbLH8kNt#nJTIS5`s;(soGIwNO$;}Fq=VH3ZywsoM z`L;I6i|U|xo=cMNe@pXE)=RlnAL2QY1@LC8SJ9osdEyl|o8|)CwsUQZ1xh zNWGAPAr(VPhSUrxnx&~4QZ}S+Na2vmA*DlVhZGN~9#TG}enKS^+gJdR2V5SQe&jZNR^Q?BXvd!jZ_*bHBxJ&*p{Z+NV$=EBLzn)j+7j!IZ||_ z>PXpLANwY1Ri>AWO4C z$PyuIge(%WO2{%H>x3*6vQo%WA!~&!7P4B%av|%5ESRNPF=WY*HA5B+Sv6$Ykaa^A z4p}*5>5#QU77tlHWciTwLl)4|tRS+4mSzo+MMPE+Sw>_Xk%dH768~SyJA3)Bm(tg4 YYR?$fH6lGOG9fZLB0VM=qvCvj1?KmuQ2+n{ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Madrid b/pytz/zoneinfo/Europe/Madrid new file mode 100644 index 0000000000000000000000000000000000000000..931195955a1b17d8b0d60c027845decbcc68b0d1 GIT binary patch literal 2593 zcmc)LeN0t#7{Kv!g{w${51L*Q@Qn;LR1hUG$PB@m;OkAvH?E4PNp>W1QYv$rnIrbp zoXsVP$<&#m6_yKMmhYyLrLL$fmP^Z;orXkj%zoc9-CWV%p5M;>oO}MbV{Fg&@lTnb zKhXNm6=L3Sb8Rs<&%TWfj$MAR$$s<0W6q|EzD`Bi$M)tGGwdDSU+f)MbDdqMwmDVX zVx8R;W9>aJd7XD&Uf{fI_q5+DTw_;{3$_n$Z?cc%jB$>p9I}rMNpOx2UGJRek!_!7 zEOSmbeiJyeesAFHk+8B^*4JIx z=Y)ivtq-~Jn%(xdYk|-UMfN>4(e>@#j&i~(Qv%^@o1OMA7Su~o7ds*^PCNJ`wPW@O zxi{%g?G*cycJBDK`hw1?ui>CZUf!+uov+X?M_$#a{Rbp^XO+Zk+$3E~Rk|%*A>9iK zrN^|{(lg61v8fqye|)m^ijI>9+C@s7H(lcz2Wju`dugAGowe_=Hu_-o?;2nEqxM_( zrS@NSS_c&E*Mz)XnmD~q1{PLJQd*4+ny_95$COL*z$KF0Tp~lF*6EN-GbQD(#X9sr zx;*?4ARq&$9ki;S+?Az5b*X?9tujM=$a$1Yqb<4RZR_{nQ^LctuJ_)vlRvqtI@ zzA-u}zK>37O3<86nUeE)2Ys@!w@i8ehEBa0D$^<=WP0__GNYtHa@W;LAorroTy{-o z4f{Z5Pd}r1-8RUav?|RH*{gG7ROkNiy3T7Z)cGfi^{GpKU9f$s793wBPp?VSgIx@oTE$@_|s=|v_O znPOy;k!eOI8kuTWGug;=BNL8HIWpVgyosSHvYq&7%#km?}i zLF$7P2&oWKB3Dx*q)14WkTM~4LJEac3Mmy*E2LORwUBZl^+F1UR17H@QZrXmG^A=s z*^s&+g+nTbln$vKQaq%3NcoWZAq7M#h?Eeip{pq(Qbku&Mx>5NA(2WVr9^6p6cec? zQck3vNI{W`A|*v?iWC*8s;en0Qdd_~SfsK@X_49@#YL)%lozQlQedRQNQsdeBSl84 z>}tx4)Y;V(8mTl=YNXakv5{&cX;B0@)bI)<8A~vOSOuf^3mi zo|aFL$34M8t-W`gHX(Q8+`RdBDSxk7Cc#MA%>oI#{l+|ZaF>bCeShmY%dC+9St$S7 eDCTRZ*)#nT**NjpN&N@+Pl(S>Ouzw2q5lA0QUR3! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Malta b/pytz/zoneinfo/Europe/Malta new file mode 100644 index 0000000000000000000000000000000000000000..5f518a1f1773e00b8b3ebe8a3a32c8ae69256b67 GIT binary patch literal 2603 zcmciDdrXye7{KuZhoeAh4_?3o#6t3h%H2z%;Rzjiu+)>8mqbO>B6}qxEfu_G&AF#W zI43H2VcLwEp{>wbrj4eOVwg}amNP4xy_*?1Mf-i<`3GJ6*WbIB&-#5b9UPmD{8DA(}!3) zeSNLk{8anIrEzj{Z-mzE@XFV3r^u;QadNsKTbV-H*Z#3t((_3-@16pzP)O9j_cTdJ7D(fIe}$UE%)eG zte~}pwr9ZF=5{@jt@fe4t>B1oE4V4e3Tf%8p+`Cv-*@&;?NIT1amRz_wA0Gd#rKzf zqB85l;;_Op?VRyWahJ?#(zXA7SGU;98s6o5jc}jTh^wD!_Y3dq182&$#}{vDF zL%8-o)?Nox|E2M}e$jy?O*&}JaUHz)kS655r-?HfC8?lVlGAG>Wn!tMMsJn0q$QHp zS|mdwOLXY@Su*TKp$yW z?viGDTV;&rD;*pAgN(iMlVrI+m#n&4dHljo8CUhL_)dJL*&8>=_zxn_i`P!3T6+wCcQ{H|hM=0$otMRG&NV z*XQ?4)BGTI*6}(S#9FkQX5@CH9oXnb+mzFqae#?xuzIkFumw zi!M2JRF+<8)K@>Kl-KHNblK)3y1Z(uu2{NDi#8UiE8w43;GOqCciW5Kw0#fq-0REb zis}_$2C9>|Ja>EcW=`_EyqSJifcYgifBpYItnJO0+?>7U=DFi-bF9N>a*@GxG{cJw zFfzo*AS1(!3^X#-$Y3MGjSM(4F(cNJNp4A~8jRibNF&D-u^Eut;PbO=ywWI-1}j(M7_G#1{!L5@967NQ{vn zBT+`ejKmoUG!kh?6KW*ZjwaYhw2^Ql@kRoUL>vh@5_2TzNYs(ABXLIpk3=2`Jra9I z6MQ84NcfTXBMSgo0>~mjmI1O5kfneu24p!P3j$dZ$f7`&g`-&*$kK2$ivw96$O1u@ z2(n0!Wr8deWT^xO{OfYxd3Oi3z4%qzcTc-}eVOc(@lTuG66EZbkh?wmvRN&6_Dh=u dV;)1z${Co*m+{%jgHi`2#Ahca;NaxYzXA5l@uC0# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Mariehamn b/pytz/zoneinfo/Europe/Mariehamn new file mode 100644 index 0000000000000000000000000000000000000000..19d7babd531f6623710debe40497c4a50e4e613e GIT binary patch literal 1883 zcmciCe@x7A9LMoHb$&GL9m_=}B>8db`sr8sl`B6A>5w1Ek0d07R(_R)G;fuOzU+d7CM;cvqS7X*+R(Jjxjm>>1aU~5BpVBA^GxkYh*bzyJE0d(Q3KII`T@YjC!1-$#r>}(l}B_?;NLN4u$I2f(RW~HA2RxIW#ptL?%SOR8MM~ zq&eNr`CXMszS}bS*$J6ae@Zf%n>2GzwM;#IT&EQm%k=8)nl*d3&L~={ z*~5y|n~|5Ce{C2snX!YvKlk>Fb)>>J$ zD@BXzvSoE)xUSimC~LElrKG?q>tcJ$de2wc5NMOqm>?~E|5VDle%7*kH>CXCL*00; zPB!@(b@Rb%x~2YzZY{6XiaizD&ThT^{Qu|MW^)#DS%cknf153|kFC@1&l5AfHjgKp zFE78c+pRC}zc01D`6nM>OcxXDnUv?YC(!YszJ&@ z>Ol%ZDnd#^YO*v%AyrwLvXHuv!jQ_4(vaGa;*jc)@{szF0+9-l5|J8_B9SUBO_@lY zmZngoQlwO*R-{;@TBKa0UZh~8Vx(lGW~6AOYD-f#Qn#fk9H|^B9jP5D9;qHFAE_T% z0AvM_B|z2ySp;MikYzyD!O|=QvJ%KrAZvjv2C^E+avtbmZ23Z+Pvoy%sAd7>n4zfJR`XCF0tdQNWo%Qy2{LlBV88TyJX2^_DM{A6_{QjI_ k#^}#M`ngEvJHRZ|&^Wfrl^GwM810UUcV))9t*3;59}7mUG5`Po literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Minsk b/pytz/zoneinfo/Europe/Minsk new file mode 100644 index 0000000000000000000000000000000000000000..ba9971c6313838b0bd33ca5c8703d22a4b7d6bf1 GIT binary patch literal 1328 zcma)*OGs2v9Ebn&(s4|iMK<0X%{0?|l=*5Zt*LPo9|M+Ci>R1|NJR_FmJx>#X%W3! zB^4n?QbP1tWI~G;VUtbJqL^Go1QK;O5foA9yTgc(3x9vk{mwm?I|G;R7u|oPzfS(k zGJV1#t$ML988^lQk4KHz^r3-7{7aYj^Rz zzm`AGpUX`c$xv`r{7RzW*)7w5?~++Ka>gt=H)yUt)n^tT+iR{l&}No&Z#GMtE6lak zhFRwKm}NHxd&+<04^({isrB!^#wuUT#;P98sp`?Bs<|3h8-}LT#*-7Ow(q9ebnunb zofwn)miyAM=d3gqUXZ4`qtf)}xC9D@RbaMPw){S zdaerg=c%1TRkADmQ-%6+q_ymW3WvT+n`=_Fm%f$uZ||kU@lZNuo=WGZYtl6_BHi%^ zDsuj`*z7Kc)8Vvdq$blnKlUuo(k5HPc*#fh7mHJ*vR2$8xn91vzu4wYUjso~UixWz zZ!;FWRTPOtB^-`Qq_;~#nxSwnH?8_mZ`$;Uj?Ko>;U=Bv;s)gC=PVM|i~YL4I{ThX zS3qol7y+>YVg|$xh#?S5Ag1Ww5^RAO1F^=UHV0x4#2|=85R)J_L5zY}1u+X^7sN1# zWf0RKwn2=usI7yT2eA)gAjCq5i4YqhMnbHFms3C0qvwW!S{*lST6 zOt2VYGQnnu(GaU4W<%_T7!I+VU^>Khg7FaR3FbrWx2PLHXn{rD1VS4KjUcoFrkdf% zaJrl>M`mi=S@YxYWG`)W1q|z-bwPABbU}1AbV2mFE{NBv#)|Y+mqOPe^)$V=6)t$I Uq+1tcNhMjlCF0Q?s;T$<0~v-awg3PC literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Monaco b/pytz/zoneinfo/Europe/Monaco new file mode 100644 index 0000000000000000000000000000000000000000..664f6161ab6c74de956253c7ba8f82eac3b8d327 GIT binary patch literal 2927 zcmc)LdrXye9LMoQzADCc*ViKZ;+#xjy?TBOoqMnpg1QSt{?2*i&Y2p%dVGVf-Vmm@ zl@GPHzvw%R16KMj!3FTp!D>vW{J7 zQGOz5j6QM6^XL7iFji~h7IP<@u!Us~4nakSbJtXo%1 zkT!31RBh*{ikgum{`nCS;OQXkG6t%L;{TBLVLwS=yRRk4>$C*j*ee|_ZQY#w9vM49bxrrEuzsoP(a0nf9ulFtwd$ZETyBZD znIPT23zr^e1EuE?A9<|iH;JtHL3)*5kf`}5C3;4^#N=<4*qrk!uBb-EC)cTj;mcKG zr&TH`u2?1AE>XRMOQrY4@v6_CGo|kyw|e5MZ0T2-E6H_z<;evDB&94w`WJ-BfcbsY zQ-fUM&JR`t!>>xJ`?eb7IxcBp->9_fSJYsy18Q(%gL>xjIyIzvvr0d;PcoJ+QJGb1 zWazYMDr?CbGHldh8D2P1Mm%09p7b<%HYig@M)r`Aw_+r_{UDWnE!-$+`>ULqYieA{4V7EksPb~ps_}Dwl;=}+sR=o!BtLY8nwVTI1-?6EQYVo~-@hZ1 zZx_jwhFS8$MUPC~I7SMOPFF83OqOYtBh*WiL&aKQ(aEtO_YvS|ToIv-`Wfyqj*H z=03hH9@On{G>hdQwT*ImqoYOBIi!oTb<-Pj4&c2b$l>_+oR#5mj7lBB7asG;%_q0{ zNLrA* zAc;XTgQNz@4U!xrJ4kwLO@5FBAsIqagyaZG5|Sk(O-P=QL?M|%QibFSNfweVBwe;9 zUr54`j3FsQa)u-g$r_S2ByULKkjx>eLvn{C56K>qK3kJNB!RXjgGdUI93n|XvWTP+ z$s>|TB$NEnNhKG#M3RYQ6GNUo7&BiTmMjpQ3iIFfNB^fl8{+KrU{uRWTKFnLZ%9tD_b*J$ZR3gh0GT+VaSXjQ-;hLGHJ-HA=8G;8!~ao z%pp^U%$=>7JY@E4&GaGjhfE+cgUA#jbBIhLGK3loCEE347S(t?m6A;;r}hJUUwbou|j8Z1ia9M1PU`)_Oy`~BM1Zr@g; z{#xT?!eO<@;T}4@G4%ZG(vPQlA|C=hpBEiE*WDiIeZJFoUKNJV$1Wz)<980G<2C(# z1s(l;arfY*P_p$_x_DDT#iilGz>7qYZ=|*8Oa5Ts-MHc6k-Egh$H#{!4fLAem1Cyl z%mEWRyvI!5ztv3HvD!>s-(aS-EHtIDu$exq*pvnRrabSfsjw?_#ixJ{zbWdP(RsgX z#WaviK%$qOttn?FIdE%a)-F;op+1snDwjR^f8wO0x?vrM2yvNL2xzEfm=`ssy z)|mz0Hk;_AP91$&Zx(%Bs~6ubH%mrhI(D&6$M1yn(t~BX_O#N8Z8>^bchD?PzSVVG zzMJ~8M><*e$~4$lbz|uR)A;_OX>zAc)6>gl#p{En`PvcF^7w*I9o=PImdkCqZIA7> zJvkmB+n1ZQ{dqpylRX&iK1Qk1Fn>mMhvkubJNMd7%coSNN{v-2ny@A))zHc_I7Jow zIgeCX#hH0Dk@frid_)H9ExQS(;SLz5aS@$$!{yngV+Z#(4kleF%e=T z#7Kyh5HlfmLJWmi3NaO8E5ulcwGeY5_CgGXSnN2ENKcoOi1&|UPN)3=A97+|CG9Yz83V~DtDFspsq!>swka8gPKnj9X1Sttp z6Qn4IQWc~uhf)`$Fi2&P(jc{2ZkOBR@_21;j@R}{bI#87XYIT(xn4VaFxp*$Dvj~Q z5}o8G(Mf0$o!liliBY1H&?GtuO`?;hL??-5&n3E&%v_@T{rMK6`>*iSzsgg73AJ*b F|0gT@fExe+ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Nicosia b/pytz/zoneinfo/Europe/Nicosia new file mode 100644 index 0000000000000000000000000000000000000000..f7f10ab7665e94ca44fd8cd98a362cd4b304eff1 GIT binary patch literal 2002 zcmdVaZAeuI9LMqNOjy@ye{0UQ>qF(rhpu|nY}s_Jnc9QbPV-i-GEb#fYtAi8r(5m5 z$Yg}XzY-#9P-GGju7RsTPxL@E2zOwMF+w`6v5iOxDx!vL=X;=6dll@>&gI_E<)ZKY z-(P6e#&DkJUr&tl3vZr?^XB{bW1l8}H+J}I+dH(^ihWjRkGpWq7~flHPS|zFdZp86 zO6yW9Zo{ZKvC1|k1t;6D=3h4AQ!kmXP3kogqK}#h54()l@9s1w|JZ1}aiziZo$Is` zPwudj4u!4c?s_|A+d^wfQ@K5LO{O)iBEwEC8fU%fkF}@!MywgJ!**IstdaKEYo`A; zY-Id&-^{%FgE4bp(De6yV`TN5GP67P897_`nt{4jBe$mC&I|6b@{84;m9@nxNNTZX z=e5i1(TL3P_2`_TbyE0Oo6bF7B5&WS)}p>zEj~L}-|3pK^A0BJyWv!w-&rW{mBnaD zolh1_|3gblMx`v~do54BE#)J>%cAH@vS{$SEWUeGmh_*HiW?U-xVu{_Pae^w&COzT z@6cr{cj^00^;-2-lZGnFb$LRiuJC8*iYEcBjxUqypC{@EkJDw<=|{TyrdQS+j+2^! z`?5CjP-=Sy#jL$4>$cz1_4CfihMF5%mvTVri~BYF^0(TMq}uT3er+6W(T&$Tbkk5s zKRmu#o33q^kG?F{=DsTVxG_aP=_-)T%Zj8WoFH3rlVxk^Q)!L!NLx<4wmtY&+9y2G zcI&EijQpaXo$8a%2hZxZ1DADs|5y4&N3TY9NA#tr7kfpI`A=USPs&1WF*6V~#^Xtx z;u-t=lV2)=Ax~*(6(1q~Dk{qT2))2<|Lr{7H~-F!BX^G6I&$yG%_Db@+&*&uNCQX* zNDD|0NE1jGNE@zBA4nreCrB$uFGw>;H%L23KS)DJM@UOZPe@ZpS4dk(U#?DLNM}fE zNN-4UNOwqkNPkF!NQX#^NRLR9NS8>PNT04wqe!Q&POC_-NV7<{NV`bCNW)0SNXtmi zNYhByNZUx?NaIN7u1@Pn@2*bsNcTwlNdL$NAUl9;0kQ|kCLp_jYy+|n$VMPL;p%J! zvKOw-W+1zPYzML*$c7+0f@}%0C&;ECyMk;BvM4YD_`&gLMygKQ77Kgb3l zJA`ZzvPZ}!A-jZZ6S7apMj<Z91c0qO^C*L2;4Y=QCdH(?jq|NOB literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Oslo b/pytz/zoneinfo/Europe/Oslo new file mode 100644 index 0000000000000000000000000000000000000000..6326961453f404a4a886362ee8b684b56fd5b4f1 GIT binary patch literal 2225 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 XpJMN8bVg!Ka!g!wMtmH`CIXf=i literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Podgorica b/pytz/zoneinfo/Europe/Podgorica new file mode 100644 index 0000000000000000000000000000000000000000..5f0389f03919e0b56de9cf4bf89b591a0e8e9c2c GIT binary patch literal 1931 zcmciCdrXye9LMqJ0gf0e_BBV4fRKcs9qyMvq*P#xOmk@LILW%&JA8Gc|lUfA0qKa}Qa zn76ty?D`RX{>L7ja&ni3A3Y`!hx#P)lTT%8hf36z_awT$NnTh{Bh!j~5|izf7u}f> z8xbedpAM5amq+97rfd9-Se-HQoX$KQs4w;Zq3#2>HKFUWCT>5gNt=#pa_wPFsk|hq zP5qLVGa%_pKa`BfZpln-k<9Tn$qMh%tSc*J*289LLzmr4*7A@7DZluvzJ51e zD!%$%myZO=ik?YQ+5f9lwf!d5T|@Fl^@yz8`irj0{aR`&2eme8kF3t=)4GXY>Y7N^ zHMc&}wc|~??o6w$zv9z34=&gGZ#T$WJ94z4w@lt%8>Nly8M0wXwlvj+%EpwbvdMd2 zHczsoIVnV&?_86X;CtFKd`eo!F6ld8^vb(K1G;6;3EkS)t=n1;Xj^BS`rCfyw#+BM z^(1f03KkC9qwk1lJHWF3`^|fg*JqwGpJmxLA9LBZ@9~E>(EO2ytJOUGe&$beRb}6K z1v$vbVMY!#a;TAmjT~-AbHI^9jvRFUaSpqqIq=A#M-D!6_>lmR2#^qv7?2>4D3CCa zIFLY)NRUvFSR73-NHj<|NIXbDNJL0TNK8mjNK{BzNL)x@NMuN8NNkQKI3zkp6CM&D z5+D*G5+V{K5+o8O5+)KS5-1WW5-Jia5-bv}qX`#@*U`x#Et}yMDJ+AN8)!h1AvSGG6cvNAcKI60x}H9I3NRoj07?i$XFnQfs6(+9LRV$ zngKyZ1Q`-!OprlAMgPfEo*WX|A}C+%sxH(HY+vJ*{XlOd0$+@R{gzK{|=V< a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Prague b/pytz/zoneinfo/Europe/Prague new file mode 100644 index 0000000000000000000000000000000000000000..9ab78e9156f206440fe847d28e80d2807bc62a8e GIT binary patch literal 2246 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 HFE#8R^6CxM literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Samara b/pytz/zoneinfo/Europe/Samara new file mode 100644 index 0000000000000000000000000000000000000000..fe5060094b501f885ba1e62292467300ef7c52ff GIT binary patch literal 1330 zcmd_pPe_wt9Ki8+)8*V!3#zR-Yh`Y2`DZORR%vaT4s!#^6%+*zltF)>As#ve1zHe9 zghWsnAz7yo4|XzZM9{@{h;AeJL3HU5Bj`{P^?ctoJamZ8JumO`dG>5Phw*)~$IhIN z7=MhldWV;h)Guq#wBet6I^!IAp7!V02kz!KxC>#I{Y}F4-7@F?WaKv%qhZg|)qLZ# zN%1}zm!_#P*>qz>HeWg-zVj*Bay%|u(?MzO^2oMUr?hw-CBJjI6tD$yfv@h|_K&VB zLF2U%eD^XOdiBV+W4@qTXI`kb+jFXYVp?^KO{(yzakcZrtVBky%dYNQ(s}5dM4Lt> z7RgBLM^@sEXI1=tOm;7))t*JS>@BvduE$Z;y|6~@yXI2+?|o5;k#8zFQ7=7xMb&$< zBnMg+RbTI0>9;*lspfe}eO{1(syi}JxGx7kT$I7t%aUGtn9JO}P_kI7tICgU)$gaq zUSqGdTbeAxo{fZm7(a9rpDv^?oSK+UsMjzg<_E z%O}JW?5v!b&SZ_@q@D&3A00Ml^Rr%>!(tAjJeRjt=IlQt@ly}7K+-_+;4~6JGC@)? z)wv+aAlV@4Ao(B(AsHblAvqyQAz2}5A$cK*A(f&a<1aB!d6Ivu|Np;8=B literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/San_Marino b/pytz/zoneinfo/Europe/San_Marino new file mode 100644 index 0000000000000000000000000000000000000000..28ddffe0d93ee1ad7d1f3f67492f7f3b85406e6d GIT binary patch literal 2652 zcmciDeN0t#9LMp)!xcoOFPLHiVv(td$b+buXnI9Qf~DNld=Ht$WgNL1sd+VG{Z(OxEZ)&l($;)pn9$|k|(pj3ao1CLVll9xICTWhnXdmlc z=^Q(|M89vlRxYLPbuP6W@L!H;vM+y9<-c;J#%^7=(tq`IqjT-Go%z2%B)Dfg!St)1e}YUhqWYE;k>jXJ+yyPSGo?>o9h zyMFPeM%V3=nBCP9yJ53*Tdfke@KxzvR3i6Johc7w`y_ryraYK1KzhXVl!w}Pk)9r} z_Po$vd!6o~y_-Ah!v{mOPt9MNu;VxFTX9?ymmSuA^XoLJV2>tGYmtvP;`Y3Ix$_+FPG}zeO`IwheMe+tkv-06rngl_dA`!o@h4^UxnCqJ=rhS`I3$mq+Ad?NcS&~rr<${7wT#`p zRUa=dmM2y()o~M7>G+~qnme#aec7Y+$*8e9A)&WUxR|7qI*pP^-$m+E7kbI$kN(st z&0#WiON30T`9q#AKQDO|4U(VNEYlbLt}}*xEHkIoYeC#PnUztkg`sW@vF$t~@^{PVE(GGH=`vDJhJS7m~Zl{LD-8VuU57 z{W@u>^OKZ?U(~Y31G3;;i@y9pmAukWs|(kCu8XQS>f!}Ew0upuS^@ug1qKA(_#iOo z*4ND+1_gWW{>!prx(Aq}6)u+NPS4)VT%YC5^jQJsm)yMj{{Ps9nlHJzcAJ~$h->D` z*x#)l?YgC|9A*CII3q_IIo8P0Mvgaf#F1l;9ChTlBS#)N_Q=skjz5wBBm=G{1xOB% zBp_Kp(tzXvNrbD(1d<9Q7p^85NH$zeI*@!I2|+g_JdhGDlM^5*NLG-vAbCL&gJcFt z4U!vIlN=;Ft|mQ5eq2q0kPIOyLUM#83CR+YCRdXuBvDAFkW?YLLXzcbvW27z$rq9^ zBx6X*kene&L$ZdX4apmlI3#mO>X6(a$wRW|YSM?~4@n@BK_rDp4v{1xSwzx^Z&nMP8Lyh=8@DRxkr+ZWFJXCl7D0ZkQs0_Q-I6?G6~2mAk%=%12PfFOdwN%%mp$T$ZR0f zfy@UoA;^rlnkhl%#MMj+GAqcmAoGGu3^Fsw)F5*caOYL2h2|1~WX^BY*Imt=b HFE#8R^6CxM literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Sarajevo b/pytz/zoneinfo/Europe/Sarajevo new file mode 100644 index 0000000000000000000000000000000000000000..5f0389f03919e0b56de9cf4bf89b591a0e8e9c2c GIT binary patch literal 1931 zcmciCdrXye9LMqJ0gf0e_BBV4fRKcs9qyMvq*P#xOmk@LILW%&JA8Gc|lUfA0qKa}Qa zn76ty?D`RX{>L7ja&ni3A3Y`!hx#P)lTT%8hf36z_awT$NnTh{Bh!j~5|izf7u}f> z8xbedpAM5amq+97rfd9-Se-HQoX$KQs4w;Zq3#2>HKFUWCT>5gNt=#pa_wPFsk|hq zP5qLVGa%_pKa`BfZpln-k<9Tn$qMh%tSc*J*289LLzmr4*7A@7DZluvzJ51e zD!%$%myZO=ik?YQ+5f9lwf!d5T|@Fl^@yz8`irj0{aR`&2eme8kF3t=)4GXY>Y7N^ zHMc&}wc|~??o6w$zv9z34=&gGZ#T$WJ94z4w@lt%8>Nly8M0wXwlvj+%EpwbvdMd2 zHczsoIVnV&?_86X;CtFKd`eo!F6ld8^vb(K1G;6;3EkS)t=n1;Xj^BS`rCfyw#+BM z^(1f03KkC9qwk1lJHWF3`^|fg*JqwGpJmxLA9LBZ@9~E>(EO2ytJOUGe&$beRb}6K z1v$vbVMY!#a;TAmjT~-AbHI^9jvRFUaSpqqIq=A#M-D!6_>lmR2#^qv7?2>4D3CCa zIFLY)NRUvFSR73-NHj<|NIXbDNJL0TNK8mjNK{BzNL)x@NMuN8NNkQKI3zkp6CM&D z5+D*G5+V{K5+o8O5+)KS5-1WW5-Jia5-bv}qX`#@*U`x#Et}yMDJ+AN8)!h1AvSGG6cvNAcKI60x}H9I3NRoj07?i$XFnQfs6(+9LRV$ zngKyZ1Q`-!OprlAMgPfEo*WX|A}C+%sxH(HY+vJ*{XlOd0$+@R{gzK{|=V< a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Simferopol b/pytz/zoneinfo/Europe/Simferopol new file mode 100644 index 0000000000000000000000000000000000000000..ebb63b4450b0ac035c09d064ab515eb016850ff1 GIT binary patch literal 2113 zcmb`{Z%kEn9LMoq*b1X1VxH$Hhi~H1LiNooqh7+46JO{#)m#gIKj}vt2{eVm#E|TeYOD@IV z|6%y9Mc?}qyfeXszi$6>(UrJx;!MDQ_vGv0q|b)zc721AOC%cY(D*)Zn@x-twRf?;pA0$qVHE}9GsG- z#tX7-?-hM=^{4Vw!=yH+9g*#2quSyFKf3fV^P%0fQ3DTLLD!a@7lou9S(v=&pUG|UC9d}*3!{gF(?K^$( z#E9&f8q?k*XLRrAQQg-wtbGUj)D;!&_P9M!^XASN?~OCc70coe=EfW@mvcenaJfP^AH;3uJGeM{&BguVf6P&LdfbbQ0~rW15@aaISdhUWqj5CD zF+a;o)8X2{t88$L*WZ=lik)b1F zM+T3K9vMC|ek1@$1dtFQF+hTVM8VO70f~d72?P=eBos(2kYFIuK*E8<0|^Kc5hNr? zOpu@;QE@b3LE_?Q0)s>b2@Mh(BsfTPknkY!K>~zC2ni7qBP2*jl#nnXadI?)LL!BP z3W*gGEF@Y;xR7`u0Yf5&gbaxp5;P=gNZ63LIhw#Bk#jVmLt=*n4~ZTUJ|uof0C6sY z?s=YQPqaH`?)1jqINeb`PUnqSuY3N2TYZ}4{=x5IT4*Y0dS)tUT4*X5C;Y{xg?C0? zP5+$o@owbamEyF}yz<#<)58Dl;mv|*p7~5fvkQo3R!w0}aZX-tVOC9ko^w~^`xoFK B{Cxlb literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Skopje b/pytz/zoneinfo/Europe/Skopje new file mode 100644 index 0000000000000000000000000000000000000000..5f0389f03919e0b56de9cf4bf89b591a0e8e9c2c GIT binary patch literal 1931 zcmciCdrXye9LMqJ0gf0e_BBV4fRKcs9qyMvq*P#xOmk@LILW%&JA8Gc|lUfA0qKa}Qa zn76ty?D`RX{>L7ja&ni3A3Y`!hx#P)lTT%8hf36z_awT$NnTh{Bh!j~5|izf7u}f> z8xbedpAM5amq+97rfd9-Se-HQoX$KQs4w;Zq3#2>HKFUWCT>5gNt=#pa_wPFsk|hq zP5qLVGa%_pKa`BfZpln-k<9Tn$qMh%tSc*J*289LLzmr4*7A@7DZluvzJ51e zD!%$%myZO=ik?YQ+5f9lwf!d5T|@Fl^@yz8`irj0{aR`&2eme8kF3t=)4GXY>Y7N^ zHMc&}wc|~??o6w$zv9z34=&gGZ#T$WJ94z4w@lt%8>Nly8M0wXwlvj+%EpwbvdMd2 zHczsoIVnV&?_86X;CtFKd`eo!F6ld8^vb(K1G;6;3EkS)t=n1;Xj^BS`rCfyw#+BM z^(1f03KkC9qwk1lJHWF3`^|fg*JqwGpJmxLA9LBZ@9~E>(EO2ytJOUGe&$beRb}6K z1v$vbVMY!#a;TAmjT~-AbHI^9jvRFUaSpqqIq=A#M-D!6_>lmR2#^qv7?2>4D3CCa zIFLY)NRUvFSR73-NHj<|NIXbDNJL0TNK8mjNK{BzNL)x@NMuN8NNkQKI3zkp6CM&D z5+D*G5+V{K5+o8O5+)KS5-1WW5-Jia5-bv}qX`#@*U`x#Et}yMDJ+AN8)!h1AvSGG6cvNAcKI60x}H9I3NRoj07?i$XFnQfs6(+9LRV$ zngKyZ1Q`-!OprlAMgPfEo*WX|A}C+%sxH(HY+vJ*{XlOd0$+@R{gzK{|=V< a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Sofia b/pytz/zoneinfo/Europe/Sofia new file mode 100644 index 0000000000000000000000000000000000000000..d8032335b20aeb201c8c3851844fac5baa815071 GIT binary patch literal 2104 zcmb`HeN5D49KfFwF+_4-FhT_c0|M>j9p8e`=wKw+DF=~CoQa4 z)m*u0IabXPZDfB?>qXaWqvKk+*2=}AWov3}=3F&a&*yhzZsDJPpFQ_^_Iqx3_s4xc zzD+xu^UbuGZJ)52gLZR{8@;?vzI;1DgKw0{SYM%p4rNH_Z&&+Q9qFmD+kW@P)s~LW ztDY0Or)cqby!&eC-g%$2C&Y|}60Q#g=1-goEcm)Fu<+dBK;nn*nxr!)P4eq6nMJ*a zOv?VThox1v?GI{X(dMzGk)RK|a`q0s}TKZa&u4zuwwMSOT!{w1$)|4oZ zWL#EH*`$<5exVghGIkVhxply!seNY&`aT79fn)}J}0kF~XlxA(Aa zc>G1(*t%V7R;_MJXIG$8weBf9_iXL?}pgdXfZtv$zj)HTDd2s1OhB4_^L_uAL0YV35XXEHz0mEw2nYLv7cpd1>y_D8HhI!cOd>i9CBzqg17|n z3E~vQD+ae1{9DJ`vhqeq*IVqL3#yg7NlE{ zc0u|DX&9tqkd{Gu25B0kYml}%w0(m#&Y|rbq;-(qL7E5Y9;AJc{=skqBWBtaIb&9M zO{?70g~Qp=cY4_>{J?KXYzbG;gew^16j7Wa+OzFnyi-Jb8$RE9QdR9Um3H5zjMLi4 dgJ}E4W%;DjU0sk}l%1PX;I7WgbxwuR{{cw$=C=R< literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Stockholm b/pytz/zoneinfo/Europe/Stockholm new file mode 100644 index 0000000000000000000000000000000000000000..3bc6dbd9d12b44e0a04642a346aac17aac65a34a GIT binary patch literal 1892 zcmciDYfQ~?9LMp0l1ppt8xp!9$>r#(+{*2!79F?#$R)WXMM7vrG-GDg>}zYxVlmdt zhzH?8E^{42v)P%s&Bol#Y?#{`zxTiKgvU<%pI1BepaLKGG21+Zyumy!Lo@LVMmlpuH~d($KT#Bum>jCz=>sSWv>);v;2ZyTp$>cVtvVU&*BIzq;0_^G=fR3=2f)O2^N zWcc0C%%~@l`Tm7u`CgQ)mg_R{*&&(KcvP})T~N=?8kv0TpiU_*m8msbblR*PI=y6x z<_s%QJ3CWngiO|%u7Nu9OT6X=XGre7E;{@30GV_8lg{<}%e(_YlGpT3=2w4|{Mr^- zknfd+8{g=nF=u3P-YqSN+$&4c8nv*~DP0<_y7bi^Eov>(;_H>V?6IxOkIdDQYpZ3& z_B1VR$dQ#rk-BPIvaFt#DrJQsvL+!y)~0`xbwQSt#|3Noho@2z_(d!3T#?H6_jUcr z2HDWktW|q2>Bh$Wx~cN8R`0Agon=j>=s8aZp^w2|{h zP8>ONZ)dNMcB4NNPxKNODMaNP0+qNPki{B#&f|q>to}OaL+i z$P^%RfJ_213&=De^MFi*qnQb0Dv-HACIgubWIB-fKqds45oAh`IYA}`nH6MOkaBWya%{ZIlMs(_N&de8Jt?k* literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Tallinn b/pytz/zoneinfo/Europe/Tallinn new file mode 100644 index 0000000000000000000000000000000000000000..4ba4424121aeac25767ee83ef57ca579df2b4a96 GIT binary patch literal 2175 zcmb`{YfRO39LMqBIdJfBgu{Ky8igbB^*vJYlU-i`B};nmb!LXPc|v`w!<4t)BS%@BCkX|L1Hx z@$>fYI?z_2mYg{Ah7YIDe0WYdxicqt@uh#0X z-}T7Uo0a;TSBms>_m#PXjJK!nT=9K{$2r^J`77?T74z=t#M#Py&PwqduLDs+Km5R1>*)Vvo-dOFB%GM;kY1LJ! zs=TGE9bZaK`j5Ki+OK+Z#OHeR)TDmk=eKn2_4r~sBvk7i-`*iRuV?CA7yp#qGcLX7bi8gp|GR#8 z;1At0Jf$CLnbD8-&&y-$KhTdi2cWvM*U=-)|$b|5m3QnCz7&e(=ka z@9dWL%ZK$-$I7K+tWh7_pDKrr7VE=X%XDX(M|b6?=7Az7}nM!iUpuK0L4d+nlD0 z!6336OS2wiLCA`bB_V4<7KN+|Sr)P`WMRn4%->Qh4OttqI7_oSWO>N?kOd+uM3#uG z5m_X%N@SVHI+2AUD@B%ytd+xJIjq*wEEicXvS4Jz$dZvYBa22>jVv2kH?nXJE9bCu z4r}MIcn+(#G|RU%>qiP;X)1t}0I2~|1f&W`8IU?4g+MBSlme**QVgUTmZls?JuFQ@ zkcuEBL27~&1*r;B7NjmnVUWror9o`~5zE84YqEst4p#l^Z~9d2{G z9alJ$CYC0XCYDYslO}s^y%;}}NfS#G$c1lBAgvJcCj4wmwlZl2m8_afnm63*Of3H= hnEz2szH*tw<`mG@?E1po;#^-|VRn7K&w46y{R6={5l;XB literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Tirane b/pytz/zoneinfo/Europe/Tirane new file mode 100644 index 0000000000000000000000000000000000000000..0b86017d243f1b7bbb41d6b4feefcb2b7edfc7d8 GIT binary patch literal 2084 zcmdVaZ%kEn9LMoPdKbGQeZlZ%fLMs2U4hF#MM1M0pb46CRs4e-6A=^XK*Yd5v6fkD z%zYo+S+1PA98;&{8vSwTtfmepGS|kMI?L6{XpQbx&YZIRz0V^z*Mpw4bY_F#+ z;=SB-W6aQEC#Gk_-E9BGNMr%KB9H)K*nvpltCy*ynWlGLIS znd~o+w4`*I67z(ldxDyND^D|iO4F%><8|7(NA;PWztn$dNT-LdYUa+1n$>bjvulrQ zp!$mBH1|kuaj)bp-6Q$Q`=lVJO$tUjWM*PmXI@_?g?C$Z*6E2%npV5llowDfIL0#O~C@*%tsY_P8t4kX;XyuFs4V9PaGT$Oy?w_j5Z)a;&La9`J z8?P&GWyq?}{?yfjURiS>PO5u;leHaxNKJS^?3zJYx8qlRY3}E;zPev)Q})V+;%=>r z{!}+6t8V<|J*^*U)=how`ttRVZa%zP8_qY$mUoJ^v8z&EsZUX7SH3hYDU#+opS&8F zC@m#-r^6(K8F!c!UIS5Z;!N9bRi{J+h`=|>iTtN>Yp zt62ko&mvsSDv)Kknsp!xK~{n+1z8KS7-Tiba**{P3qn?eED2c?vM5)xDr8x%W?jg_ zkd+}zL)L~Y4p|+tJY;>y0+AIWOGMU)ED~9zt63(pPGq6TN|B`^Yeg1|tQJ`=vR-7t z$cm9ABWp$$jjY<$EE`$3t64a*a%Abq+L6U0t4EfPtRE==QURm{NDYu8AXPxhfYia& z6auM)t0@Ii3#1rGHIQ;3^*{=OR0JsrQWK;oNL7%sAa!vyg+VIgYD$CD1}P3w9i%)+ zeUJhn6+%jc)CegOQYEBJNS%;EA(e79r9x_j6bq>qQZA%kNWqYbAtggWg#Y3uxln<#NQb44FND1-(T|=)a@#_IW=yUTL5)*qf{&-ol4&Msr) z_rX&``$Cr2L9etbi&hDee>5twp zJ~{HTapv_V6ujn3UZhCJnTR+}J%b_tJ7P<&TYW>S>R7q`zEFJ6tLAI;P6}Z8PNbH{)bMb+VkX zb&8l-WS5?*STSq#6Vntq?taf}TSH?@Z z^6G1{W}sfK>TZ-zU-HS-N0!Li3v0!i?Rm29aG7|fCQ&}SZK7B^f10STc8hgc31WTW zZ(_p;O>E4Fk{it*M1$*&Z18u9#v9+s=i3j9O}!nmY43U2+_qnCZagGgcD6`c$dI9T zFS{c&EHunHEU>~O2A5O48e$(@k*<5aG%e;9f6UPhT8O5N%d|N(EpC(+8N3HhTtXYc zi7hI4&n>XU@V=H1ya!K$pWrF=X*1O>EG*;Z(>&HzUzC>3QhSd2sWw|+s|OzccG+yc zf1g01USf0YP@Cs5f2wQIiSA#KX+$OxnMzAFnaFe^6N*eJGO5V4A`^>DEi$>t^db|C zOffRa$TTApjZ8H%*~oMw6OK$dGU>>)tKUgu;*qIGCf`y`KT-gs0!Rsv8X!eLs(_RM zsRL37q!LIekXj(cK&oM>%7N4aDF{*#q$HNACP-0`svu=S>VgyosSHvYq&7%#km?}i zLF$7P$Wm1ZDUqeB5mF?iN=TWIIw6HZDut8^sTEQzq*_S1ka{5nLn?-p%u>}1DVn9K z8d5f-Zb;#f$|0pgYKIgLsUA{3q<%;NkqROuv{W@jifE~-h?EhjBT`7Dl1M3$S|Y_n zs)>{nsV7oUq@qYkk(we!wNzC_%8Jw#DJ)W1q_jwFk>VoNMaqlR7b!4OVWh-JjgcZ- zswyL8wp4XS3XN16DK%1Sq}WKc(JJ>4`_PcPSLm=XN0=kr8CVgKgDYIUY7ZS;uHpB3 zsZm$4wgRrwtpcvTQn`+>(rx9MXa`PQLJOpOq!n;=SGf+PJIM;Tx(82!pHQOW{eL3< h9~D>Ma;o%?&*q;%TIq!JiRqac6VghvGOec^=U=5NntcEO literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Uzhgorod b/pytz/zoneinfo/Europe/Uzhgorod new file mode 100644 index 0000000000000000000000000000000000000000..7032ab9b34f97640d1ef631dc4cc790abeeed606 GIT binary patch literal 2077 zcmcK4e@xVM9LMqR0f%rJy=f63Ka0p8opAh8G)VM3n8Dd8r;$ovA^wOcz!;cDE9Y7x z_byq@l@7~MHe<9={ei6?bB#8_Ys)o9u2w6ZbL_j7bJbXVp5IG1`|+pW&+Z=Ieg5G5 z!`CysaYt*h^{;1+x#7dpYd*Zs9Z&4giSxDc!kWx-qoVUvr^nSDkYU;Qo8OHDa$%6i;H_?@l2nTXAEfhxh=Bvk8WM| zkzekaYS4ruXh&q03*()T-7zU9oSetgLpcza>Lf<)7Dpe@3d^UuaF1``g5Wec%OM*S1ybm$YfPu143V zuF(zN1-jviPa9IIrQw@f^uf#XW#b3G>ZUUu**usmjiZ<3p}t?FX<$;Co6g9Vy%+W2 z(=-ZpL?eh+K?D(K(*kH{w`UlJLJRGuIV&{d;+pE77tR z`mCF-en)RIbFE}Dk(?I5dOvKU51epqdmAN33L1yDpsRn%N=KL*|D}5Sbw|MP!c1B#~Jn(?sTpOca?Z zGF4=*$Yhb(I-2Ps^K~>6MrMpm8JROOX=K*Ow2^ru6Gvu_OdXj!GI?b7$n=rC?k`5#vjwT^UMjTB_kenb%L9&9R1<4DN z7$h@DYLMI@$w9J%qzB0lk{~2QjwVG&j*uiFSwhl;k|`urNUo4%A=yIGh2#rK z7?LqZlQJY{jwWeH){wLzc|#J1WDZFkMspV%6B`rfig!oPtb}VP-j(Qa&g?li;#k(L z7x-5siDi0cs+Vy6yJ=jscTVFdUG&B@F50_vr+Vg_o4O#?``_|Ki}%m;nOl#kloj|2OT57%pYvAg`3s~A_i6wD literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Vaduz b/pytz/zoneinfo/Europe/Vaduz new file mode 100644 index 0000000000000000000000000000000000000000..c4e20dbe0e8c683863e7132be9438f95335d017e GIT binary patch literal 1799 zcmciCYfQ~?9LMp0(xlP8SVE;payi|VTS<;nL%DS%m*kS%5*@UnG}FwiwXdx)!!Xv& zhzH?8E^}Qb%|&fT+buU~~7;pXc@iyP^@bQ?3 z_nraa@3nuwXBy~zPXj++(E%N2b>M@eI_Sn;4Z3t$f=@R{$e|-LxJD(kVuyqkd1T1q z6*4r_E#b*78Rkfmh~P*W-fMtF`ZzW6>lhvJGD1hT_196idg$oJ@9H@5R-@{kXms^m zjoExjV++n`T;5}e_cTgEN|TJ4yH65B4ogyenIv^q$+)089oN20#{VqU374HR@oBCm z*XL_W(*&KgD@{`m2J7U)a80WoFH_Qe)L9TDQzKrh%h@UEK6f-D{JCU&d?nMougSF5 zW|`h`TxK+!lFXK?npImPGfyAWS;fUNyJn}(nZHNp7Om9mu|?|6%+Ps(Gd0ICQggn= zYHmQfF4wi~Ze4eBkrv%9k@dS%w75Q7HmnZSjk^-1WKObp z3Ik@}xTWgb69JsEP4Tp7m`3bG6 ztx~UU|NF7MRw#amm`63fWW{gZ3nKLqJWY);Ek$Kyii6b*drjE=V znLILkWctYbkpz$okQ9&{kR*^SkTj4yY)v9aCblLOBo`zZBpW0hBp)OpBqJmxBqt;( zBr7B>BrhZ}Br{u+8j_o>Ne;;lNe{^nNf5~pNfF5rNfOBtNfXHvNfgP{)})H$YHN~3 zvPIHG@IyvPRNI@=Ht$WgNL1sd+VG{Z(OxEZ)&l($;)pn9$|k|(pj3ao1CLVll9xICTWhnXdmlc z=^Q(|M89vlRxYLPbuP6W@L!H;vM+y9<-c;J#%^7=(tq`IqjT-Go%z2%B)Dfg!St)1e}YUhqWYE;k>jXJ+yyPSGo?>o9h zyMFPeM%V3=nBCP9yJ53*Tdfke@KxzvR3i6Johc7w`y_ryraYK1KzhXVl!w}Pk)9r} z_Po$vd!6o~y_-Ah!v{mOPt9MNu;VxFTX9?ymmSuA^XoLJV2>tGYmtvP;`Y3Ix$_+FPG}zeO`IwheMe+tkv-06rngl_dA`!o@h4^UxnCqJ=rhS`I3$mq+Ad?NcS&~rr<${7wT#`p zRUa=dmM2y()o~M7>G+~qnme#aec7Y+$*8e9A)&WUxR|7qI*pP^-$m+E7kbI$kN(st z&0#WiON30T`9q#AKQDO|4U(VNEYlbLt}}*xEHkIoYeC#PnUztkg`sW@vF$t~@^{PVE(GGH=`vDJhJS7m~Zl{LD-8VuU57 z{W@u>^OKZ?U(~Y31G3;;i@y9pmAukWs|(kCu8XQS>f!}Ew0upuS^@ug1qKA(_#iOo z*4ND+1_gWW{>!prx(Aq}6)u+NPS4)VT%YC5^jQJsm)yMj{{Ps9nlHJzcAJ~$h->D` z*x#)l?YgC|9A*CII3q_IIo8P0Mvgaf#F1l;9ChTlBS#)N_Q=skjz5wBBm=G{1xOB% zBp_Kp(tzXvNrbD(1d<9Q7p^85NH$zeI*@!I2|+g_JdhGDlM^5*NLG-vAbCL&gJcFt z4U!vIlN=;Ft|mQ5eq2q0kPIOyLUM#83CR+YCRdXuBvDAFkW?YLLXzcbvW27z$rq9^ zBx6X*kene&L$ZdX4apmlI3#mO>X6(a$wRW|YSM?~4@n@BK_rDp4v{1xSwzx^Z&nMP8Lyh=8@DRxkr+ZWFJXCl7D0ZkQs0_Q-I6?G6~2mAk%=%12PfFOdwN%%mp$T$ZR0f zfy@UoA;^rlnkhl%#MMj+GAqcmAoGGu3^Fsw)F5*caOYL2h2|1~WX^BY*Imt=b HFE#8R^6CxM literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Vienna b/pytz/zoneinfo/Europe/Vienna new file mode 100644 index 0000000000000000000000000000000000000000..8e4c9a9b5f09d011505a0e0e773f60911d011d2a GIT binary patch literal 2211 zcmciCe@xVM9LMqRahwJ-dz---Kg1$J>f|>h2AQ1)BRLDXj6?zhQHu~RV^G?yVy-oE z?;6uNBo!H}W>N|}VTBxj)2(CuUitF1d>MZsO-=;kPoKOgZ@fM(^;eCb`>nd2$JKr5L!Ed29liO~K213GswN&jB1s3slDucH%6i0$;SXt=5sBA3KAov|4*jW~ zfuD6z&l%0^`a-j|9M77BLUMycl2!j%K zc3pDBD|er**5biBEg4>-_iSILOM8>_-lkMt)>S0;mAcg1m?+EBE~w8tC8e&$U2xW(`!7 z=|k?7y4sVWtFL5hbzG@bpT1Eaxx7%;y!VIJL}F#_zBy7m^qV{yx+HZyV^Uuik#*aC z(Z`m)FAcS$+L*Fi)|Z5}>AFL@Az5|9PrG#ER8TjKbn4^h0{X-oHQM}Hn>_haiM9+@ z$>xnI+Pb|!+A51B*yNU{a^}kx-(T|d9821>;+HYK@ua+a)b**2Pm9)TN{)uOc<+|G4>#GV_USGg` z&0&tg82JBz%rqbJa9%MF_v`;LXLEmD7BUuFGZXl*fhXfFbAQD0(hDZ>RC?a7*;)nzii6jzAB$h}p zZA~8m5kHRD>pEbE3!elgS6XuGd5 lSG!mE$?J4urz2}Fu_n8Va`@2W&&w>x%=Y+mvN00noMfttKmqMvmPFrb1FIed( zpS9-p@3k@xwp#N#Hd>k6tF8HUORcQsIo5r7Db|8Cx3w_#cPrbO-IaYSxhv;;Z(z}w zE0BBbPT>Aa6M?+*Aogb^3 ztgof!<`1$u>H}FlIwEVnJ14cn7o;xuzN$aoFKdU+sCAv4($N2$TEFRewV`9DYFyf( z{B<>Iqj#-p%3GwGZu`{cq-xpxd7|2KD@V3o{#9)obIbPA3DSJ&CwZvv7uhi|DlI$4 zXDW2$fM0c)tYfac9spRHrLx~SGrQWetcQAPj;)_BfaXeul(xqH@2yckM_tD z$I4XaV52%cZ-`D|-v)%D$>Q@>GH$`wNoPe(PK5@!VEDp=;86^9yz0 z;-EY|`mQ>7;zM<4_>_94_q^&m-lxnNQ8OGd&S+<}!xcVfx~HA7v!ah|yND2cxt zr(w*#$bZ|McEe#99x+^okv7kmWf-|WL;iYV-otZVmzA3-k)KBH&Gg8p!teR}_n7IM z>itHozACExMwPzm8*BA_BR7@$fxfX1(=-fo>IgrXdgYn_-zSr(-@?UlKwsQ1{6im2 zmxGnae2@ttGeV|>%n6wkGAm?S$h?q=Av4pz!(eL2+>puH>e(UFL*|D}5Sbw|MP!c1 zB#~Jn(?sTpOca?ZGF4=*$Yhb(+Un^d^F=0%%ov$6GG}Dc$gGiRBlAWk&cVz%m^ue@ zx7CwJW{*tYR?iNLrA*Ac;XTgQNz@jjc`&k{w%}9wa|Vf{+X$DME6DBnin9k|rciNTQHT zA*n)gg(M5fmaR?~k}o7-NXC$qAvr^mhGY#%8qNJMEkmH~n;Y;yvO>kh^i}U0>m^(3RAE z)RokI^ay>_l@z;!x`~k|X0lyL{i@5To2VNaE~b5NW=1}xE2-ZT`BeCO%*;An$p2YN joyq@5r5#YWj_l$h!kSlKoL`#nD=5yZFZ9`WCGI}~40#FG literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Volgograd b/pytz/zoneinfo/Europe/Volgograd new file mode 100644 index 0000000000000000000000000000000000000000..b91e4fbff6b4508668625770fd38880b186bcc57 GIT binary patch literal 1234 zcmdVZPe_wt9Ki8s>E`}KC(EhR{@5Hdt+iBE&6-U&tVyH2c(8)#j}QbsgolC-LAFx` zMG#R$(dc4-gzA*Vh%S+O@*rsNLZ>3)ckz<+=lQaFAp#8Vb6Eg@X3+5 z`eUs$JKU_4xp}U?znEDVpDX5HlmdB~$fZ_CZk5*rXJU2U=~Ue}*F^BMD%a0<#TuqA zl^Z9o+o4An?WQ}UcJt*E_S*A9_PSG9d;Ot=y&)I1Tapd-#`b_64*8`uup|+8L`N2b zIy(F1NZZ?Iu}#kxbbD!9ciecbH;+BlTSo8c*zs$6>)}a>pSda9dhSZ+fpgN;bV0h~ z2c`S_QAsqO)rk*%vVCb-?|9WJJLi)+`7o_}UN-Ap#jxIeTj|tDjqV)_$)5gCI(_Vi z^o8H+{vt0(2&@W;E?E$@R0bB z03A()NQjOmMkGiiN+e7qP9#tyQY2I)RwP&?S|nT~UL;^7VkBfo6EhODqlp>`8;KhU Q9RKUc{pOEgb#(fF0nF4QrT_o{ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Warsaw b/pytz/zoneinfo/Europe/Warsaw new file mode 100644 index 0000000000000000000000000000000000000000..3797b1cb653206febf14619e62e6b82cf4bdcf40 GIT binary patch literal 2679 zcmcK5drZ}39LMqJoC6A^_C*vFK{PUzP(c(GAu~c}f_XXK@P>w{MTVCMP2x9Yu9Ztd%P-Bg53JHD=HI=bS6;PoJ}MUeAH^@9+KbXD`U> zZ|*rE_Ak6S@7p)`@J&18>bJCs$l20xws~t~m2Rupr*D0%`gZ9?-M)Fh*)jK!sVrWR zbF}b#Id);Re7!3|>)uJ1Z`KcxdS_Qoedz&ne8c*J6KiU7PR_YiaB6g{Hq6{Br+e4P znfOTgHn?0Gy+^e1QjuKrpD-7%);O1be9yUjyxeK(P;QzId}w~%U16?l-e7(^m2H}r zzhbV|q?+HerZ8}NMz;x|-V}SPhxrg>{2-mpJ zTkGRBe`A1;j zbbS6?oiHe0{h1?mV#FAo6yIAX-AvFa9Y@HNGwpTijb4(y|GG|V2$AXALuE!ylguo+ zCbP=wBxhEG%r3sHbB28+&&@cdxiOn$Zd#S*1?|&$(W>(=#W%~R%zrL_@ zn&yA8NM3wBO&3;9keBAiXu;}%vS?hYEY6FNC5c^SX~tjja;TBQejT;2`6nrAcTll05kNwK z!~h8b5(Oj-NE}>kAdpBPp+I7R1Otf%5)LFDNI;N?xZ02)F>$p)L85|$1&NER4Ga<) zBs55Dkl-NELBfN?2MG`oAtXc`V&rOrghYu$n2Xd>Z6;)w**)kYKvsjH1C5>zCrNLZ1$B7sFBi-Z=5EfQQLx=47D z_#y#DB8-IC)y5bJva5|U5@saMNT88OBcVoOjRYHsHWF?m-blcah$A6)wJ}G6?rNis zgdK@H5_lx?Na&H+Bf&?akAxqIKQaKw2p~g%i~%wTu67iVVL-+K83<$~kfA`v0vQZs zG?3vy#se7;WJHi5LB<3b6jwVc$gsHDaX|(K85v|~kg-7q2N@k?csxG4CxHP$ty=rM zf%f9P{hjMQFMfERmoGTv!N2Y-Pgu3F%VYN^$lV`zZSLOf{)D>A6Mpye&VMuQ{`~I- g{da`y_Yk{NeG*x$_^hP91N$b#XC)?Jzod|V06(!8vj6}9 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Zagreb b/pytz/zoneinfo/Europe/Zagreb new file mode 100644 index 0000000000000000000000000000000000000000..5f0389f03919e0b56de9cf4bf89b591a0e8e9c2c GIT binary patch literal 1931 zcmciCdrXye9LMqJ0gf0e_BBV4fRKcs9qyMvq*P#xOmk@LILW%&JA8Gc|lUfA0qKa}Qa zn76ty?D`RX{>L7ja&ni3A3Y`!hx#P)lTT%8hf36z_awT$NnTh{Bh!j~5|izf7u}f> z8xbedpAM5amq+97rfd9-Se-HQoX$KQs4w;Zq3#2>HKFUWCT>5gNt=#pa_wPFsk|hq zP5qLVGa%_pKa`BfZpln-k<9Tn$qMh%tSc*J*289LLzmr4*7A@7DZluvzJ51e zD!%$%myZO=ik?YQ+5f9lwf!d5T|@Fl^@yz8`irj0{aR`&2eme8kF3t=)4GXY>Y7N^ zHMc&}wc|~??o6w$zv9z34=&gGZ#T$WJ94z4w@lt%8>Nly8M0wXwlvj+%EpwbvdMd2 zHczsoIVnV&?_86X;CtFKd`eo!F6ld8^vb(K1G;6;3EkS)t=n1;Xj^BS`rCfyw#+BM z^(1f03KkC9qwk1lJHWF3`^|fg*JqwGpJmxLA9LBZ@9~E>(EO2ytJOUGe&$beRb}6K z1v$vbVMY!#a;TAmjT~-AbHI^9jvRFUaSpqqIq=A#M-D!6_>lmR2#^qv7?2>4D3CCa zIFLY)NRUvFSR73-NHj<|NIXbDNJL0TNK8mjNK{BzNL)x@NMuN8NNkQKI3zkp6CM&D z5+D*G5+V{K5+o8O5+)KS5-1WW5-Jia5-bv}qX`#@*U`x#Et}yMDJ+AN8)!h1AvSGG6cvNAcKI60x}H9I3NRoj07?i$XFnQfs6(+9LRV$ zngKyZ1Q`-!OprlAMgPfEo*WX|A}C+%sxH(HY+vJ*{XlOd0$+@R{gzK{|=V< a6=dEgq%dUelC;E(#AJ6#N-`#;1^opcM$9+> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Zaporozhye b/pytz/zoneinfo/Europe/Zaporozhye new file mode 100644 index 0000000000000000000000000000000000000000..2ccf8998b24f3493e68670c5d08c51ad759bf7f6 GIT binary patch literal 2085 zcmcK4e@xVM9LMqR@k7tU=xvLRi=Rmb8o~jhXpqpb zy_-zu%FU8dF=Mu&{eiAuu34k&{>Yjm*H$f>Gxy!fSvgjp=a=2)mRo=M{qB2@FW=)B zY`mVK4cps`t^XWz%@Zz;K67!OIpRC+KQ-hFe>pN0otUbXuio=&_c|ZRaT=>nE@S<~H2Ok`Zg!6|!2reEx z87|m&Fj% zWKH}hvL+F=^z$?1$@z->H#};i^)}f)g8g2Bh z)u#M~+H~Eo%_-H={M}vp#I-!xaQYA3c)=r^j?I&nu`BXq|L@W|7?E)61=+m!vOcx) zLwUMoLff*A$d-yxZFis2tr@CYe?6?*rn`0f`96K-Qb?bDccXTEzC)gSwL&|G8|3+I zS=zO~RCcT@m+p42>@3QZT~&X{3-c`LDNNBG`$y?bzOKE|bJBP9qV7I9EH6gJbcdAb9$0)$7xyFQU2S~v#kWnTI9FfmX$30 zjDe~KzF2J@nj3StT+Rit!{rLy zdIoox@8IItZ7%NT|6`7()1SGKNg%U8rh&`@nFulyM>7?E7;`};gUrU!Ob3|{G9hF} z$dr&dA(KL8g-i>X7cwzqX2{f#xgnE7W`|7A(aaB-ATmQ_ipU(1Ng}gErisiGnJ6+- zWU9zqk;x*nMW*X$=8H_&(aac`GBRgm(#WilX(RJSCXUP;nL09eWb(-Dk?AAzM-t#@ zGJvGO(c}P00+IzJ4M-l4L?D?!Qi0?GNd}S)BppaTkc2pzj36m-G&w<%f@B3r3z8Qk zF-T^R)F8P*l7nOiNe_}ABtb}qkQ6zZ93e?UvV^1w$rF+&BvVMLkX#|jLb8RV3&|If zFeGD0${bD3kfb@9tRZPb@`fZ1$sCe8BzHKIy!crOi3#zuXHNH=n@&&M%$YRzcARFX zfAU*oM`@m^mua3UpJ`sQ@b{YX-5q;1wR1YhyRmy$hEqQC%4h59P3``#ez(e>dFC<6 ZTwF{d^Xp3rN(=mjCHeJ5e&=q9=U;l9^aB6@ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Europe/Zurich b/pytz/zoneinfo/Europe/Zurich new file mode 100644 index 0000000000000000000000000000000000000000..0cf15c17eeaefb7ca6e7af02896d1fa957c3e09d GIT binary patch literal 1892 zcmciDYe?019LMqBnI3Dh$Zd!?Uvsgq7 ziSIy)D9K1<4Ci`a^}sIFF1T_sD2rAxP-<6X(89)$_Iv+(B5aTQ%fHvD(}Ny--=BiT zo2$~zf1XhLC%ilj_T}@7*F0OywV^t5eKcVDuNIi7_}_KP%lFh1^1XT6veFwRYphx3N4M(y`(?7=p9Woc(I<=U7HM{8spj-9)Wrvv>XPFz`es$UE1M+_9pp@w`laI+ehalH`oynl>|nc=c$6(Pnw z{u!b}LeAFFo-T5}$O-ds z#>gon=j>=t8aZp^w2|{hP8>ONa_-NMcB4NNPxKNODMaNP0+qNPki{B#&f|q>to}OaL+i$P^%RfJ_213&=De^MFi*qn!z4Dv-HACIgubWIB-fKqds4 z5oAh`IYA}`nH6MOka%zg CSha-! literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Factory b/pytz/zoneinfo/Factory new file mode 100644 index 0000000000000000000000000000000000000000..a65f97edd26d012ce00cf0e2cc5bbce807844eec GIT binary patch literal 255 zcmWHE%1kq2zyORu5fFv}5Ze&K@ySn4%uy)G%uQ9O%Fjzx$So}{QAkQvC{8WW)h$j1 gie@G&J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/GB-Eire b/pytz/zoneinfo/GB-Eire new file mode 100644 index 0000000000000000000000000000000000000000..fe63ff7e7f1e9b47c45c62a7768e3924f8572c40 GIT binary patch literal 3661 zcmbW(dvwor9LMqR%&_J1Ax7r%(OjC={5F?_C4|PdTz>J3G{PiHv$Tw~<8*f%=UqoF zAs?4mE_2(Ebs-wU+?tqNqA>SMGG?pK^V@Nbb99`;?{{_{Kfm98&hdx$^W_~dGBL`z z<5AJR!w-+k_J`M1W;9)DX6y^lGk1E-toa+wmosOX*%@_>d2gMblX}z49X?afo3O>q zk6&xP>R6%|G#RWHHp|nQ&BJx(nPRiZ*=rUR)Y6NKF6t$lll0Q9dvw;qc)iS|ndKjN z^omb*nU%@0W>v~clie%AaF8pHF6*)S0|0VtH!T$QY zwR`pVE6U6dpXccHGeY!+aT)r@@uhmBFHLXiJ>UG)cA(B{w?S|A?K7JT1I^FDP37l| z=VjaO2D1Il_OfGzBl&}UYNs5NU87%=-6_FpcS)4mGqOzY9U5kSi8-nZ8Z^!=5O{#Ox63Zf2s?sChNj8XZ689Yn$J;v+H*1bE|Hc z^Ixpc7bcA`7iUk@mxjcc%jpUFN{>YSS3)O!wNVxGcgIkD&ADKT8wTj&qr1)ZvXlD8 z`cQoTtl&`E)?9OkE+cov!GatSc7P(}5~U2W~0TK^Noo11syA z%DX(e%EvcN)#WvGwK0c{njT@Q_g-&mq$%@Y7*3ZXi}VdIM%B|hqO?Q!`rAPJ$g#h z%5_w;=8s9UtF0s~sG5Wo1WWUxOY&%Tv4n5kE00Ypl!&i$q{Y~8#q&{ycuqEUA_pB% zQ7PG~Wpu7;)#o$Sy8bNHCTg5&Q<|>YhD?*ThlZ#pN>ZiWcU@HbgFfl7AVH#Y+sTvf zcan}X>d8}yq0;HyCsgNd0n%kyhT!IY z>Y24j#cuyW;-*ef@k{2&v!h3=UQ^zY-u)*_pQPc^_wgk0#&(zIYR5~z@G$9j%_F{A z-IVXw8uI+rN7R7Tf62gtAoYT&t_EeFRWGJrQ3=!X)!>8zHDuyxd8y+XHFVH+8P;&R z8Xlb`iIs9>M17GFr!wT_(i9oFB~4yACzN$SO8YFyQ8GH%x<_Q2|6?C@2L*0J&Zet9 zoyhq_PAGClkyDDCQ{DXa-NYBjht!ZR3qmaIoZhBcD1J)Ip4?$N6t8M%8_%9oOI-@Bc~lX@5qTq z&OCDJk#mond{=w+k<;&L&p(m?Bm+nakQ^XMK(c_O!PVvgNd%G!Bo#<5Tx~L3Z8nf} zxY~Rm330UZL5J@4DLnMhv7Lha}c|;P4WD-dwl1n6+NH&plBKdT+2}LrBq!h_1 zl2jzCNLrD+B8f#Zi=-CGEs|U$yGVMG{JPo%BN=wJDMoUPBpJyvl4c~&NTQKUyV_Lq zAlFE;k!&OBM)Hj$+|_0rNx7@dIg)fF>qy#>yd#N6GLNJl$vu*MB>PDEk^CbQ0GR>E z6mYe30GR}?b`~Jh0GS8KL_lT&G8K@yfJ_EtHXzdhnGeW>KxPCoC0y;CKqiH&ofXKm zK;{K9F_4*oObujiAd>@`9mw=R<_9uCkQstZ5oC@alf>1|5@ebn^8}eF$V@?|3Nlxa z$%4!lWV#^p1(`6&j6tRhGG~xU<7#IOGHqP#yg?=oGINlrgUlUd@*uMZnLg$G?)B;K zck9VF{qN!XWp@GDcW!^5Ph(j> ix38evXApBJ$nGPL{f+RrmJzKZJS`%_<03u03i=lXY*fnt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/GMT b/pytz/zoneinfo/GMT new file mode 100644 index 0000000000000000000000000000000000000000..2ee14295f108ab15ee013cd912e7688407fa3cde GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5Ss!g3%07 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Hongkong b/pytz/zoneinfo/Hongkong new file mode 100644 index 0000000000000000000000000000000000000000..8e5c5813666a4d023bc9f7f7bd0e53ca1a61dd85 GIT binary patch literal 1175 zcmc)IO>E3T9Eb7Q*JhWJHgVxVyk!z8jf<%SZAD7A)q_o%R45M8rRWK#O+_RUA`%G+ ziG$OxhzJMc;;1h|yw+N@-ny%$>ZM&>T5F!agM*Ven9b~Gvd8^C@utM~rRt9pa=&mn zYux2sawyT1>mF*fJ?Z6gE4IJ=e%-dV2Rp8rhbL;~QT1ihd-}ROURh;Ri|0!!Ut!bJ z!jgV6%RU``E6?nteSW(~`p(TX{TDat7Y8QH%ah&uRYStO-g`m6SrRh?&7G2&US_hZ zIwU*3&JNB#B7><#cBrsR-q~XNzP~|+PmS0QU9Ea#-#zkMBF}a#i{dGaojL+Dr^Pw#!Kek$b8>lwl`%pZH&_S8#^~krk08ku{M; zkyVjpk#&)Uk(H69J>A;K;+}4GWO-zLqyVG>qy(e}qzI%6qzt4Eq!6SMq!dqA3sQ`y zs|G0tsRthruG#RO8d8WZ|vml6BhrphQ~z#oBr; zppUxRr0w)lZI9lR$F+Wa5^0dwrj$NCeqB43wdk|zv)Wk}lX%5`eLnBDB#J|t7`q_J zS^FgU;*h-TE!3{N+vQdJD(P-KsIPAnNKf51eRC!)Z+DjIyS+(yADFMb!Ki##^jrH@ zCp0y)Ncs!zY5zb*21X+~*wQT@vil;pZx47)n6%(W}+36Y$;X;z|HaKIw>Qsov-bGni!;b@$au(r$cV_0 z$e75Wu69&pSXVnPGO(*185tTG8yOrK9T^@O9|-`700{w!0SN+$0tv&_#(@OlY9m2H zL1ICIL83vzLE=FILLx#!LSjOKLZU*#LgGRKbG4Bnp&_v$!6DHh;UV!M0U{A1AtEs% zK_XEiVIpxNfx6mAkx-FXkzkQ%9Z$~q<@HVF^4qUfZ;acnm%^OsZo7FCpH2Q|o9kr# N{tMXT+N77~{sm<$MphXAD+89|CdNU-NW5P<9g(IET4G#Pes0bQYM%mn}sfGc|d literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Chagos b/pytz/zoneinfo/Indian/Chagos new file mode 100644 index 0000000000000000000000000000000000000000..864d3e29a2b0c9d4d3f35b8d71fb2f3038354f94 GIT binary patch literal 187 zcmWHE%1kq2zyQoZ5fBCeCLji}IXdgU&oOv*cLO6(#Q6zG$}NC_g@GX?fq})xH-y2{ cKLjKQ1R*4t`X2~DCWG`5XF3ATpfM~yz9CSf7#O&KX6l+*85?i`0Ap(qTmS$7 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Comoro b/pytz/zoneinfo/Indian/Comoro new file mode 100644 index 0000000000000000000000000000000000000000..297c6db63c0689a0ad0d71c9110baee20c9bbb05 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOI-_yNe#m;e&hGGJiw@eN^cbqoP<8A3=f=sytP MHH-^rs;)5?0Ay7a4FCWD literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Kerguelen b/pytz/zoneinfo/Indian/Kerguelen new file mode 100644 index 0000000000000000000000000000000000000000..1f42bbc1ffcba50b2fcb07f959ac5ff30e4dc0c3 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIc_B;HGnu^;1M IR9#ap0K4=P1poj5 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Mahe b/pytz/zoneinfo/Indian/Mahe new file mode 100644 index 0000000000000000000000000000000000000000..d048242cac78343ef9bb795d8e65bb9feb434855 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIXY6FwE#KBe?X!Z4h$?lz99_3&LJQ!LkI~5{RaZP MhH(K+)ivP)058iFiU0rr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Maldives b/pytz/zoneinfo/Indian/Maldives new file mode 100644 index 0000000000000000000000000000000000000000..65e7eeee8db784070548f3ded2ab7b1ba800d65c GIT binary patch literal 178 zcmWHE%1kq2zyM4@5fBCeMj!^UIo|3Yo&n^zya0*11u(Gq`i3z0hJ}E*3?bMJVg^cq tFbIGQ0kL`h13}of`4S)+Y$#9$Vk(ei0h`U?12P-Qd?SbdH{tHZuK*+#g`U0fV zEr5}Qfx*Iofz!t~guyp77(|4CWPl)q1e^W?0mwFxK9G%I8fYts2H6azNwS>_=n!2K FE&xayB~AbU literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Mayotte b/pytz/zoneinfo/Indian/Mayotte new file mode 100644 index 0000000000000000000000000000000000000000..8401a37aa0ba974b3ea7f748a32d58c65bdd5149 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVOI-AOYlPWq?Gr3>a8^d_x#q9Ya7|h7b}A`VRzn M4dVius%y*z0M}C!4*&oF literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Indian/Reunion b/pytz/zoneinfo/Indian/Reunion new file mode 100644 index 0000000000000000000000000000000000000000..9b3830ec31a1f7b12d0b3f8e8e7a521f3a7ceef5 GIT binary patch literal 157 zcmWHE%1kq2zyM4@5fBCeMj!^UIVPU5YyfghK!OYw4h$?lz99@jt|4H42nh!L2Lil? LaRE)$HQ@pPihdFo literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Iran b/pytz/zoneinfo/Iran new file mode 100644 index 0000000000000000000000000000000000000000..16149ed6bf5bc85657f6a684a70341d719df4f58 GIT binary patch literal 1638 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Jamaica b/pytz/zoneinfo/Jamaica new file mode 100644 index 0000000000000000000000000000000000000000..09e3eb93996d4498012f7fd8dfebfad416ebf102 GIT binary patch literal 481 zcmZvYy-vbV7(h#5D6~kGKXEcTm661OT>=E0?1EDlAlF!y;$O2|_ID3UKc)0*^a0o~O2tu%1&I*(QVG!U3Vh~&4 zKM literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Libya b/pytz/zoneinfo/Libya new file mode 100644 index 0000000000000000000000000000000000000000..479f5b4575cfce66f38f9c8f990f0a3d5e13cd00 GIT binary patch literal 1350 zcmd6mOGs2<97q2?k~EVsqA9g9UqzWVK8lJcOk0Fwrjz;1YrYsuyS>ab^~2f)EeeUK zAu3uJL{x?g5sK)s5F$4bpcadTYe>w+9wqc3Ml$%`unuOc?Rzc5_)xmz7ZT%uLJ;v68Za1Ifwj zjFc?{fsBIBMrQ6>Gb_8vD)e2Dot~Gf$lI@qvj&x?=(+5g?^7iicctWOwKG1+(hhT8w|zBHeCA}!ah%7K>KKktC(cK!&U?$HtM!ZO?hTjVAo~;Y z$5Y?9>nAfGPXGM3lSpJGFDNcPC{!fMA>o{5?$kNo?UAi{#oRoSr>|)||M1d(X?XFN zmyZbm6M=0V0wxCAItWY@{3~H#;;^j)!9;=y1rrM<7)&&na4_*;0>VUu2?-MuCMZl) zn6NN$VFJTMh6xQ58xR~OI!t(&_<#U05!%)vVq&zdg9M@k!UW<30tF%kLIq;Q1Perq z2^WYL6EG%XOvsp+ZR?;hQQOvGW8ww^$3zZ<4#W-w4@3`y55x})02l#g2*4O@>p=jc vu&sxI83$${n2}(Hf*A`i82n$2CPMFMwTnfix--+V)3VcDsczRAP7%KWFWN_~ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/MET b/pytz/zoneinfo/MET new file mode 100644 index 0000000000000000000000000000000000000000..71963d533e444362250dec5465ec58517ab6c09d GIT binary patch literal 2102 zcmdVaUrd#C9LMoP#7buLMT0{EViKZtFV%Kpu{nX^A*^?N^8ZC!O&zq4nrXXm+jE}qXj zvTj>*k?$Ypa`z7xXP3LUpVmL!zp;Pf)cFIGF%1kJ)pKu32YdEubXuFn&aSc(FZnh8 zLeM^Wro>J@nPZ2%?dOLy>%FIye(bnq9En-xfrB=?SC+N?37gXrwd*!C+T7}hWtWHS z`aqfGWaQes>1mdm5LE8P63zcMM++uWb;Ac&=*Hn+6&U^h zpR}UruoYK~Sjn1atu%AM%8ELzY^vK9rT1yk=}oryj}9$49<-aktW)_=gDOUr=$4(! zwX{D&%bK&byl1i9TA83=Q@X9lIjc}`$|@5+QdRcXR(0+>TN(e3tsEb<+s?dbt70!( z_1N1A@9njkBhTyh)>gZt_bIKuYq!?4Y*y_}Es9iE=}v!*)&>@6?WF?MrBqto7c+GC z#rd}G^~ou$^cy4<48etWoZwzY?T zvqzGB){&p0j`QDGXVN8go_ycB&Q0pk*M{t|@eys`|E_k#2K0E>pt|>V%NKW9{D0x+ z^JUD5b02Jy`4awq9}d+}77)UfcT{w_< zAOS%lf`kN#2@(_}Do9w6xFCT+B7=kmiH)ZV4iX(t7ak-&NPv(CAt6FygaiqR5)vjP zPDr4TNFkv@Vub_?iI%4e7ZNWdU`WJ}kRdTcf`&v52^$hOBydRNkkBEqLxP7y&(nnu viJzwnAQC|&gh&jLARG2Un{xpGmY)pj literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/MST7MDT b/pytz/zoneinfo/MST7MDT new file mode 100644 index 0000000000000000000000000000000000000000..726a7e57176567044d585800c37cbc917b441d22 GIT binary patch literal 2294 zcmdtidrZ}39LMo5NFgUKPZtaU&9o#45Kt0MW>nA#=>*{s&7cX4}0QGc-|jv;l>pCYwQs<{zIKioT*il zA9!WzNU@5%nJ%(3O+|H2N%W(WYTEi#9n(0|TvRooFD@B3v3Vmp_L)Kxr;h2ky$6(M z^c8){7Xv2#>`_TL)@c&o8<3>8`jvX2Q!ed!QeC#CSuPJYsVi3cB)R-{HKRCFuFSkn zrOYkUGvhoeH9AA5{x;vFeHEwE!_&>I<3H)y2hN+T22ScZp;_wcC-&*NDKk^sP~gs>gI;#vSU0f=~70*eq3)_NNqmAFqnX&x-fNFY3n624%^9kGW}Z zw=CWMv$=WKHYsWS*xb^!OW#_#-`v);RhKS!)|8d5)@8pBD_>5#_)hOpFL-xXH(4)sVw(_yu`Z=KxdKV=%byY>A!2h9U5LEV(F z!!-LUbn}IfY01dZEhp9_Kq^Y*;VOd`| zsW!A8mW|2h)TYW_*)%n7LPZC4XykLVIc105Jap7-84Kyh`UcG7XXLxzTo4H+D|(ec6XI6FRIfE*)4hKP(286+}FWSCAnPGq1? zJ5pq*$XJoVa*P%kF2{J00dtHP88XM1kwJ5e8W}dnxRHS)BS(hrv|~pGkBlA}J~DnJ z07wLo5Fjx?g1`|4Bn%vJKmy^kkw8M>w6Q>f!4VB497sHnfFKb;LW0Bu2?`PwBrHf= zkia03K|w_ff`mi~2@?`0Bv4KpDI`=*8!IGOP8%&G zTpaO20)|8k2^kVIBxp#~kgy?fLjvctkwZe~w6Q~i=d{s7!p9LmB!CNx0EJtLK&^m2w zk>EOQbdm5nZG4dcBN0YIjKmlTG7@F{--Ov?YrWW3JKMi7w;(q!+n=AGo1dHK`5U$l BL=yl2 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Mexico/BajaNorte b/pytz/zoneinfo/Mexico/BajaNorte new file mode 100644 index 0000000000000000000000000000000000000000..fffdc24bfc4c076584787843a5a6b457a23c5bf2 GIT binary patch literal 2342 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Mideast/Riyadh89 b/pytz/zoneinfo/Mideast/Riyadh89 new file mode 100644 index 0000000000000000000000000000000000000000..a50ca48a91b9f37ae573a09c21bc208d8b0bbe60 GIT binary patch literal 8539 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 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/NZ-CHAT b/pytz/zoneinfo/NZ-CHAT new file mode 100644 index 0000000000000000000000000000000000000000..6329e4fce0e5e7cd61329685a3e80adaa2107fb9 GIT binary patch literal 2018 zcmdVaT};(=9LMqhF>~Yaq~;isp{Du3!{I?dFd~#^kzwW4y2 z)wE?-)GTL?TBL2(MS*P9x~QzythMZ$ZE?}iT&*V!`@R2NcGXqu&(3+BogMDJ?@y$q zBUb4B87;w9;%#8-G;k^XrxV{$^zavXpV8PFH`Mq&ZJ4)itB% zlo?Od+!s!1UhRbD?>VMx^Al`A$49m>^#{8y6wsn6t88)dcUpXQp)HwsS4+pHS=NU~ zls&XSIj`U$7O&JMH?B6qO%nvKt0}RK<=0yRr9ERkp6x%C&0_NeCK z&#IklQQfb7R)3~k4X5L_`khRzIniK^gPy_%vu*9Jvuf&2wwq#;cC)f{ORZURWs)L` z#%$f(bBa!T$)cA}>DKQbxAor~(}wrjt!3mH-S%3aT3;Tv+nHkz02-w z%GSpEsBOwi)?G_VZF9WOh8}#Y#vVFa zVhsef)vv7f-E- zIz(DTdPJH;x4YD`BZgY^`LAD3kA7q1&9YVGU*&}3=kX=Hy3E3xP zqmZ3KwhGxRWV3wTZXw%+>=&|O$c`afhU^)#X~?eO|8d)bZt$8TxdnwQii-X1%L$i- UibMH%e326_3Kh7|%iQPSUysKGR{#J2 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Navajo b/pytz/zoneinfo/Navajo new file mode 100644 index 0000000000000000000000000000000000000000..f8908febf220f27b3efa68bcc119633c8efee299 GIT binary patch literal 2427 zcmd7TeN5F=9LMp)g90~@Q;8vb6-07=JX* ziZRO|P|{j6@nOxzhPsApE1ScuX)UzpvTXFQNdotF-Y4uI`@g<-KVHAx`}gOKYqe)> zhPdW}%{M$;r+IjnU3+u%8~q`w`^7lj^V*MUca2Z)X`U*2^DpS$w!P}3)^I&E?~nSS zs%UXJ)vHGrw2MC@-TF$XS6mr=T8{nT7UO5j<-~_M!gn-V`rnEZVrQ%jXz_`_XC`FO zh8PuGHB(P18CO$t$8<>AunKu8Q-{gpDs2Bj=@{9quDj5q!_OTP5yzYKwD)^N|R~3k;!u#cn>;!RB!U7pRH($*RbI6#$cop;8d>#8$n2H+; z)w53gq-GzysBi8$rRI2N$y;_DP;*!M<-Bzti(50ll(#K=SIm$4K*lF(5$`*%6C4{w z!te>5c+n+pAK0Ul&eW^qt`~I5;Zl{_SgX@sS)|fyn`OqP8ERp{TDhonRAt6LAn(Zd zOf3#clv%NtMb`J>GJEWt$T|6oyz}#Zv82zT@9OUqOWS_dckkLRa_c_P_cZTP_ZIi* z`>MC8ywsO0D|NEdUNNx}XXZFd$h)Pj-xK%E@lq-r}e^W32v_d%>TJ(eOEmg%8 z9$nHgM?JKpNSAs8)rz=e?OOSba*apovdojJ?As*ip8d6O4^ES-e1l?j?}&VOc%P_f z9+Hm?w2I2=BXUjGdhw|9w61DtQI91b(vR1ARCPqVt|=%|HJ7})Ha=O^o^oqXNTl-Y z&(Z6?`&F&)D3?#1o+h63X3M7zjEK6jSXtjTBsOGD$c=SJ#HOh8a&vKq*z6nA-mF8) zJN$*-65X!03>?#2N4@IVt{(l|S+{CvY|`6~=BUQX8ohmIoDu$$7L${i-BZIe^(Idl0#*YMmBLYYWIAVYVfg=h?7&zj91cD>vwq2Y)P5*(|E4iX-#i4PJWjtC(kLSlpj z35gOCCL~TsppZx*p+aJX1Ph545-zKW7ZNazh#?{4h#3+zj;JAFp%{_#pwbng}8xL?ntx7?C(4fkYySgc6A*5=^U!CK67oi6;_JtBEKQ zQjVA+LFI@l5>}45B7xN?B<@Jyk;o&V4-A<61O@-|diAUS zUeow?VVY-pZ%S`^KUsSFja=?DoxisEHu@sKVg3~?Ha{mh7p7#Sq$N4i(^Jw@(j0#Q DJ6nx# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/PRC b/pytz/zoneinfo/PRC new file mode 100644 index 0000000000000000000000000000000000000000..af6d6fbbd298f4698b748004b6d3c2c847dd6ad6 GIT binary patch literal 405 zcmWHE%1kq2zyQoZ5fBCeK_CXPc{co;HTy&iW5bDG>IEmS@->{g9rZzOml=b6W_^J| zT}FeVXJUa;oL7UgrgMRcdpd)vQ2Ylqbx#JhPmUin*tHonE-8OtVnl-s424fYw$x2v zWMN<^Xkg&*@eN^cb^+qx5Re2AgplCK|3Cn8D2N6*7EA*j45C4f2GJmggUkgv9t1!h y0MQ^%fM}3MKs3lRAR6Q$5DoGa2!K2WqCuVm(?Ab`XpkqtG`Sw-0{U6kf(rm2v0J79 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/PST8PDT b/pytz/zoneinfo/PST8PDT new file mode 100644 index 0000000000000000000000000000000000000000..6242ac04c09fd4e4952cd16503e954dcbdacec2e GIT binary patch literal 2294 zcmdtieN5F=9LMnsqQq039#A5%lbXa8u7HA9u?H1*!9*~wBxWYY!ypY6xs*V+C5^A4_S zsLS*GA)oF}HG?yM-#S=5TU{P|N?*BHr^e6J z>c2iNRud-!I`W2Bc@AXisAm&ZbZdg1wCy&Dsm?HySI5hgC2=M;=O>BXv&_V)&m`{X z`#S!YW0Ek^V-mj^P)Yq==IVEP)HO%m((1)7b?t7^*R?gP>l?P~8>-f*mv*$IQ(K&x#Js(YHMLp3JCB(lZ;s zRkQMc*0-*BSItiTQfGL>Dq~{QWXA7OnZutO?+=^QoWA2GYp7ka!+VXdccaX0f5hbM zT`IZtFX+7HSu!usqUTpkk^GEGU66NC7R36sKW(z|Ur5ypuUt@zJ{s4BXFpMkkENK~ zPra$`=)7$1e0h($tLZzlq~nMzE$cJOYMz&(xyCFn+9Jz;8`6R7=TulLG`)ZMT2nw4KSO6ksSv+C`YQnr4FDc|Rl)r+glJs~9(X@w@Z=8^=*(@kamS5kRy zkzPCfSGD%TG+i|@q}Cmt(Dx0WQ0qHJ^!*WU6V+Q6a-Z#^tmFLq>)S4H+9UICP`q!SFbCe82#a5h6oG#)u3O86`4IryVCU zP^TR!GE`)&$Y7DtBEv<-iwqbUF*0Oi%*ddTQ6s}f#*GXd896d^ryV;ocx3d*@R9K& z0YD;vgaC;F5(Fd)NEnbfAc1h&NFbqb+E^gLK%#+!1BnL`5F{chNNAikHb`)g=pf-i;)4VTi4YPZBt}S(kSHNxLgIu3%4s8ogvx1Sg#^oKqlJVE zi5C(uBw|R&keDGsL!yR+4T&2PIH!#q5;~`i9TGgJjUEy{Bz{N$kq9CoL}G{p5s4xa zMkJ0%AdyHSp>*0Zs+IS)XMIwrX6p1MkR3xfMSdq9Qfkh&Vgw|O_vVkE{$kdY|k|0c}ww$^@I?X1#yzC2$}R%vdoFV~k7|2MIyR0IG3 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Apia b/pytz/zoneinfo/Pacific/Apia new file mode 100644 index 0000000000000000000000000000000000000000..efe6d5a1de7f1e3e9841dc7392a87c18cb4e3236 GIT binary patch literal 1079 zcmbu-Pi)I!9LMozTi0cy5<6`!oDiGNZ0NX5GBU}!jsDu%uzlBA*ZH@xTKyX%A;bYA z*>NHcocuVD9b_URZssJ2>>CL;#LfT5^KK*#oaSkszJ6)iOFwU~qd&FM{B?rv6E0`1 zyF8a(D*SFtAyGqLsVtu4lF@Z2x{ z9Pi(I6uED3IqTfzxzxH7fAV$|*#_B%FR>A_6S7rKw->S*vKz7;vLCV`vLmu3vS&`W zDY7fFEwV4NF|sqVHL^FdIkG#lJ+eR20MY@{0@4H0L{8TQ(gxB8(g@NC(hAZG(hSlK z(hkxO(h$-S(h|}W(iGBFPS+OF7t$Eg8PXck8`2!o9nv2D?l0i_3(n$Yj6X_%|C^yP dB`(k9)infK8LbPi3a_ZDsf^Z!tKCCw$uB2YDtZ6_ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Auckland b/pytz/zoneinfo/Pacific/Auckland new file mode 100644 index 0000000000000000000000000000000000000000..a40767df93d3da9502281672a7b4663f6f815199 GIT binary patch literal 2434 zcmc)LdrXye9LMnoxis#18ACGEFfUvV7Zst1Pys=?WFjFMeUpTPhES5wMYCCegnyaa0VZZnDPg~{RKF^->`t86U=lt<`pS;4d zk~r%>mzQ~mhwF9oa1LziXm{;hys@CY=8SXS{4>%~(C>UNtY7vgv^qQ8Tcs-^xfOAoz!(RKLf$J)Jl$ko%dTaT^JC-obyV_wJqQbAG4zHvXx8Lr2uV_M`@MHECc`kKXud zosLf4p<`-Fb!_N!I<6p7$BmR|P(p+To!ub8lQSf^f2D-Dg-b~D0=el2Kbf#`hTPn9 zPC`q4W#XHIGAVsnCO_RSx5RjBSlMSfCGaP`)!`;nN6ph|{-rxKC#EdTIEl z%@VOIOd{XeBvJLA;%Hbc(W}l%OnJ7%F8oO1^2>B)_%4|hzes2MG)R0cakd2OuTS$kYkmgmUaq7Ipt6eIJKUy;-aVde%vMoY4{MQG0YQ<7WluXmM<=wb<%yVF&d zr1(kR)LvaW@tov)y{-9I2j!k0pVxx#+hy4?rxtd2D$ z{H5~BzhqP)^l{`BB4P9sD%evp6(P~YQny-uXv7Qil z{6LyM(HgH$?pPt~HwA0$v#Iiw^AEM$MqTUnboaQfw`J`aa5H;&tIP7Vtd<_m`v={8 zIGdyWnp3zW&&nyx<|Q?ccis3muDt(W+zsYWJY3t&!+GpgbIt9{YC+bAED%{CvP5K! z$Rd$dBFjY9X=@gWtQ1))vQ}iV$ZC=0BI`vKjI0=0GO}i5(a5TiWh3iG7H(@+jx61L zSBtgVn#CilN0yJQA1MG*0i*;-4Ui%rRY1ys)WOyi0;zNq+m$Jkdh%aLyCq}4JjK^H>7Y#<&e@LwX-$FL#l_A52+tg zK%|0536UBiMMSEIlo6>TQb?qdNGXw8BE>|iX=}=f)DtNvQcKoDkEh^>WmZ`sWeh*q}E8Wk!mC5M(S;A z3XW79DLGPer07W1k+LIoM+%Qr-Zb9*TDO;n=XJd;t7(YOX=3kT$KKnHy*ZoM2iTc6 s=awGJBg@YGzk~lz@hu;I4x(b?_$`RcPISz6#6)J#a>P1fqG$U24ct};!vFvP literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Chatham b/pytz/zoneinfo/Pacific/Chatham new file mode 100644 index 0000000000000000000000000000000000000000..6329e4fce0e5e7cd61329685a3e80adaa2107fb9 GIT binary patch literal 2018 zcmdVaT};(=9LMqhF>~Yaq~;isp{Du3!{I?dFd~#^kzwW4y2 z)wE?-)GTL?TBL2(MS*P9x~QzythMZ$ZE?}iT&*V!`@R2NcGXqu&(3+BogMDJ?@y$q zBUb4B87;w9;%#8-G;k^XrxV{$^zavXpV8PFH`Mq&ZJ4)itB% zlo?Od+!s!1UhRbD?>VMx^Al`A$49m>^#{8y6wsn6t88)dcUpXQp)HwsS4+pHS=NU~ zls&XSIj`U$7O&JMH?B6qO%nvKt0}RK<=0yRr9ERkp6x%C&0_NeCK z&#IklQQfb7R)3~k4X5L_`khRzIniK^gPy_%vu*9Jvuf&2wwq#;cC)f{ORZURWs)L` z#%$f(bBa!T$)cA}>DKQbxAor~(}wrjt!3mH-S%3aT3;Tv+nHkz02-w z%GSpEsBOwi)?G_VZF9WOh8}#Y#vVFa zVhsef)vv7f-E- zIz(DTdPJH;x4YD`BZgY^`LAD3kA7q1&9YVGU*&}3=kX=Hy3E3xP zqmZ3KwhGxRWV3wTZXw%+>=&|O$c`afhU^)#X~?eO|8d)bZt$8TxdnwQii-X1%L$i- UibMH%e326_3Kh7|%iQPSUysKGR{#J2 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Chuuk b/pytz/zoneinfo/Pacific/Chuuk new file mode 100644 index 0000000000000000000000000000000000000000..0ef473871d5569e7db3b4a5a49de10c314f6449c GIT binary patch literal 144 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 Q|F@6$|MLTWqm(G|ANCV3ga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Efate b/pytz/zoneinfo/Pacific/Efate new file mode 100644 index 0000000000000000000000000000000000000000..c46154a8056cecd7310434e01bb646c72b253716 GIT binary patch literal 464 zcmWHE%1kq2zyQoZ5fBCeQ6L7fc_)26v_oZXJ-mm3Bd9(Vhdcv%dw%HO)I9 zUwtD$A$zxjV)U*6CGWWo%GPrNRJ7|IRHf?z)VLEJ)P5%fsK0i0(0EdFL9;Q?LF=W* z1?@y*2PQ@=kbzJG{`3)8sr-g4e}9)2Kfp^gM0>}LB0dgARmHgkS{?r$fqD0b0|OVxZe2rTE&$ASBNhMv literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Fakaofo b/pytz/zoneinfo/Pacific/Fakaofo new file mode 100644 index 0000000000000000000000000000000000000000..22902f98fee25197b56855ec9fadd5a87255dc90 GIT binary patch literal 171 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 ZRsanF8^hw`8v-?ofq@HXrmmq87XXt35jg+= literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Galapagos b/pytz/zoneinfo/Pacific/Galapagos new file mode 100644 index 0000000000000000000000000000000000000000..7504cc66f5006ace130bd71e12cac7bff2dca37b GIT binary patch literal 197 zcmWHE%1kq2zyQoZ5fBCeCLji}dABX`X^@jR62Qpx|Nk1G!2ka{H!!gL|G#!3r*rb!J=utkfux literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Gambier b/pytz/zoneinfo/Pacific/Gambier new file mode 100644 index 0000000000000000000000000000000000000000..fc49c03f6e043bf58534f6f4191717e6be1983d7 GIT binary patch literal 159 zcmWHE%1kq2zyM4@5fBCeMj!^UIj018urU7r-&n)I03-_-SbTg#7~CC!1PFwXVA6je Mz;7BC$XrV<0QR&STL1t6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Guadalcanal b/pytz/zoneinfo/Pacific/Guadalcanal new file mode 100644 index 0000000000000000000000000000000000000000..3a4ec12e56d7663327bf083dbf819ddd86eb7b81 GIT binary patch literal 158 zcmWHE%1kq2zyM4@5fBCeMj!^UIi~m<_W(Ilzkoz%ZD3&W@eN@Jb_xM;8A3=f=sytP NHH-^rs;;3S7XWgx6{P?G literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Guam b/pytz/zoneinfo/Pacific/Guam new file mode 100644 index 0000000000000000000000000000000000000000..a05292f4bacfb1b9468afd759ca08abe0e36f9ef GIT binary patch literal 199 zcmWHE%1kq2zyM4@5fBCeMj!^UIjx-I5`dhZ1wamnWN{A;VQ|g>5+D$Q-6R&E6bOR= zGZ2H=y#Ikf*9RmCHl2z2|9>+R5Vw5`hy>XJCOLe3Ll{u(14(m%Y}Yk3 G-~s@L^C5Qt literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Honolulu b/pytz/zoneinfo/Pacific/Honolulu new file mode 100644 index 0000000000000000000000000000000000000000..1b4684b9b47fac79b03841013853d50a5a53abd7 GIT binary patch literal 250 zcmWHE%1kq2zyQoZ5fBCeRv-qkId-!;d+b&$j5ytCd*V`}r^VIYVh=_JMh2$;|8pW3 z82!g3%07 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Kiritimati b/pytz/zoneinfo/Pacific/Kiritimati new file mode 100644 index 0000000000000000000000000000000000000000..7131453c55407adc34e83b416603dad85950af1f GIT binary patch literal 204 zcmWHE%1kq2zyQoZ5fBCeCLji}S%pGBG3c|^Dljtr|DOdE`2W8+0Z1_%dBDKnV!AG=S^?+Qb6338(>R6N`^; Q2(oPq3|t_)bq!6p0OD^WM*si- literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Kosrae b/pytz/zoneinfo/Pacific/Kosrae new file mode 100644 index 0000000000000000000000000000000000000000..61b7561589cb7897117aa8a4b1f8c8d606a34884 GIT binary patch literal 204 zcmWHE%1kq2zyQoZ5fBCeCLji}S^u|52bguIJ1_z{vo-(;h7|`uB#7 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Majuro b/pytz/zoneinfo/Pacific/Majuro new file mode 100644 index 0000000000000000000000000000000000000000..eab93a2af9905e0b3865af9f85f93daf2b90ee39 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCeMj!^US^l?42LL&VAHV`PYpaCcYGM5ExE{l(E2;6K21}>mAx`swv074=gc>n+a literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Marquesas b/pytz/zoneinfo/Pacific/Marquesas new file mode 100644 index 0000000000000000000000000000000000000000..cd2d5b073afffce74f34a5f984c3e5b7c95086f9 GIT binary patch literal 162 zcmWHE%1kq2zyM4@5fBCeMj!^UIj02pcrgC|Uu(g@@c(~R1_O(aZwQ00V^9c46+;LK TCjAEj{HAe%%(b*KHsAsPO8gu9 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Midway b/pytz/zoneinfo/Pacific/Midway new file mode 100644 index 0000000000000000000000000000000000000000..8889a26fa7c87074fcf89c15b5bb5ac3c7cd3246 GIT binary patch literal 268 zcmWHE%1kq2zyK^j5fBCe7+c_3Y1f8lZ%Y+^T?*YGrEOrq$iT$>|9@%#1H=FS#R-fo zU^WMsP{!9WZHA=vF>1I;7$PFOH qV0SPvG6OA-+yQb3&^bUh&^b_tfJFp+e1Xov;UoqIE}#ny4Y>d}`bgve literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Nauru b/pytz/zoneinfo/Pacific/Nauru new file mode 100644 index 0000000000000000000000000000000000000000..1d8179bcb50d105c5c6ccff136832eae9310f911 GIT binary patch literal 240 zcmWHE%1kq2zyK^j5fBCe7@KGDb8VK>TlRZga0)08>}EN^$i&FZz%Zu*v$D-JNQ`1pn}_yvV9cm;=mq`@GB1iStN0mwcO4YCtNgX{$vM2_8DK*#7B8gT&t DxL7Z> literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Niue b/pytz/zoneinfo/Pacific/Niue new file mode 100644 index 0000000000000000000000000000000000000000..b9f18a544ab4cffee02a84dfdcec9872675b377c GIT binary patch literal 200 zcmWHE%1kq2zyQoZ5fBCeCLji}S?)NSCJ2|Ke-w-6r N7#O&KHX9mp0RSK#D_;Nr literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Norfolk b/pytz/zoneinfo/Pacific/Norfolk new file mode 100644 index 0000000000000000000000000000000000000000..2e989c25561771e870d4b45ab405fe7105b2cfb2 GIT binary patch literal 182 zcmWHE%1kq2zyM4@5fBCeMj!^UIqo?AXaI8NHUK#c3wJQE`1yt~__>9ExC|lK4PpjL zfiMVw3<0ru{sTdsnRo|?1{(^LnOgx;0yLWiY&M4v$ZRC@85p>LR_PiVS{WN~0RZqn B9?}2+ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Noumea b/pytz/zoneinfo/Pacific/Noumea new file mode 100644 index 0000000000000000000000000000000000000000..ae9e138fa566f2053c96d6c9689474068d3d03d4 GIT binary patch literal 300 zcmWHE%1kq2zyPd35fBCeb|40^c_)26Qo{FaR{($5?gIkH<^%|uzjrWN;Qhf^!li(T z5eS)C7#Qa8fb^_5zzAf|+Q7hx%=YmOVeoSf1`#13Rg8=vk|BfyH~a?zkUK#7KyCri eAoqZ1kefg>$Xy^B4 z!2o2Z1~71fNnS81=;Is05bOvf{DMOmoPanOh!G$JyX9;^6(9@(Ad5k4(f>dYdg4h3 lhz26^LLqK>4kQ0Jk9}`dtgh2qL2gK(14+M2)W^aH3 Zbs``cpfM~yz9CSf7#O&KX6jmU0RUJc5K;gD literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Pitcairn b/pytz/zoneinfo/Pacific/Pitcairn new file mode 100644 index 0000000000000000000000000000000000000000..51f01c6410da8f9b518d07c1f040d830d0f1200e GIT binary patch literal 177 zcmWHE%1kq2zyM4@5fBCeMj!^UIZR!gI2ix`@2Fs4`2WAZfq^B!FN7f=I0U4KAq2ZY z%s?p+1_6*EAU4l`AgD9f`vMXK8_M+me;W_TRG`@`V6!=Ve1T>ona{w$1+>b73jpHE BADRFF literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Pohnpei b/pytz/zoneinfo/Pacific/Pohnpei new file mode 100644 index 0000000000000000000000000000000000000000..f175ea587502fb875d165ea4ac3ad4b657b58b99 GIT binary patch literal 144 zcmWHE%1kq2zyORu5fFv}5Sx{OVb%r)h5&!R5FjrEyGACU6bOR=NE3+7`5y@C%oNrD a1*U-Xg3Mv@@eP5Q#lXM?GF8{mkP86B{t?Fj literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Ponape b/pytz/zoneinfo/Pacific/Ponape new file mode 100644 index 0000000000000000000000000000000000000000..f175ea587502fb875d165ea4ac3ad4b657b58b99 GIT binary patch literal 144 zcmWHE%1kq2zyORu5fFv}5Sx{OVb%r)h5&!R5FjrEyGACU6bOR=NE3+7`5y@C%oNrD a1*U-Xg3Mv@@eP5Q#lXM?GF8{mkP86B{t?Fj literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Port_Moresby b/pytz/zoneinfo/Pacific/Port_Moresby new file mode 100644 index 0000000000000000000000000000000000000000..8d4d12ccb09468721bb4473d729f55ba725b93d5 GIT binary patch literal 163 zcmWHE%1kq2zyORu5fFv}5SxX8p=SXDLx6h-kQ0JkA2U!2gh7A_h(T=L|3DD7Es6s~ o7rk9Ffe|Rv`2(b+^8?gWP9NV8h5%m>0X7~a$pvKU8X9l`06WDRX8-^I literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Rarotonga b/pytz/zoneinfo/Pacific/Rarotonga new file mode 100644 index 0000000000000000000000000000000000000000..581299788a6129d4565a8dbbb0fdd53f20e2116e GIT binary patch literal 548 zcmZ{hu}T9$6h(KF1to<<4Pn?#%otrFR>nrf!eS96(aJ51l_E$Cb{3KpLOOpy+;Z(K z()t6bf;N7FSjEmSaC~Pv(Y)c!8QwH=&%`H}7wgWS%F2YMd}+?P{2*AF-Fa4X-M*f$ zJg7qJTo+7N6}NVEaeSYs>RGBrH;JE#Qva!y1Rr5qy4z05!>M$kT}~>GpQ+w6$zuOC zt=3CwsWaBg`EM0AUUc~Nu4=0TU3(jW=qKp$!;n6Ar36X1H=Wy2gC`)3&ah? z55y6~6T}t77sQ#Rc!RjJ6n}0uGie#q*+iXa^sGkNMdS3rAsTL!4sdKN%Q7T4 z!2o2Z1~71fNnS81=;Is05bOvf{DMOmoPanOh!G$JyX9;^6(9@(Ad5k4(f>dYdg4h3 lhz2b2mz^L2qD3w P|3HA>G%k?2h6Y>!m{1*E literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Tarawa b/pytz/zoneinfo/Pacific/Tarawa new file mode 100644 index 0000000000000000000000000000000000000000..065dcd819473ff70bb1171eb97be0d2efac50f75 GIT binary patch literal 144 zcmWHE%1kq2zyORu5fFv}5Sx{OVZ{Lk26s=N5FjrEyGACU6bOR=NE3+7`5y@C%!JMW b1s0irWPs+d`1ppv%wk~R0-367Xv75o%jgl& literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Tongatapu b/pytz/zoneinfo/Pacific/Tongatapu new file mode 100644 index 0000000000000000000000000000000000000000..01ab6b87ef92e1a1ba7191614e73d4fab354b1c6 GIT binary patch literal 313 zcmWHE%1kq2zyPd35fBCeb|40^IZqZlO)&rMe!=2$?FB0qjsUBo9S+uyUj^6%&2nI5 zVrF4vVPs%fTL99t?E;8A@_>;AnH}OE!Vuyg90HVL1S$oA5bXA|0i{3~1UP^g#OD1E z1a)TYJ3utZEg(sddq6bEO&}WNE-(#r8;AzE4@AS<$jZdZ1azbaNDSyyi1UCX(5XOs ZfX;@peSASqg*zASUIs3psIH+g7XX;rJ(vIh literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Pacific/Truk b/pytz/zoneinfo/Pacific/Truk new file mode 100644 index 0000000000000000000000000000000000000000..0ef473871d5569e7db3b4a5a49de10c314f6449c GIT binary patch literal 144 zcmWHE%1kq2zyORu5fFv}5Sx{Op=SXDgR@6y2#^_P2!jAf4~Wh29|-EqI931! a)w{MTVCMP2x9Yu9Ztd%P-Bg53JHD=HI=bS6;PoJ}MUeAH^@9+KbXD`U> zZ|*rE_Ak6S@7p)`@J&18>bJCs$l20xws~t~m2Rupr*D0%`gZ9?-M)Fh*)jK!sVrWR zbF}b#Id);Re7!3|>)uJ1Z`KcxdS_Qoedz&ne8c*J6KiU7PR_YiaB6g{Hq6{Br+e4P znfOTgHn?0Gy+^e1QjuKrpD-7%);O1be9yUjyxeK(P;QzId}w~%U16?l-e7(^m2H}r zzhbV|q?+HerZ8}NMz;x|-V}SPhxrg>{2-mpJ zTkGRBe`A1;j zbbS6?oiHe0{h1?mV#FAo6yIAX-AvFa9Y@HNGwpTijb4(y|GG|V2$AXALuE!ylguo+ zCbP=wBxhEG%r3sHbB28+&&@cdxiOn$Zd#S*1?|&$(W>(=#W%~R%zrL_@ zn&yA8NM3wBO&3;9keBAiXu;}%vS?hYEY6FNC5c^SX~tjja;TBQejT;2`6nrAcTll05kNwK z!~h8b5(Oj-NE}>kAdpBPp+I7R1Otf%5)LFDNI;N?xZ02)F>$p)L85|$1&NER4Ga<) zBs55Dkl-NELBfN?2MG`oAtXc`V&rOrghYu$n2Xd>Z6;)w**)kYKvsjH1C5>zCrNLZ1$B7sFBi-Z=5EfQQLx=47D z_#y#DB8-IC)y5bJva5|U5@saMNT88OBcVoOjRYHsHWF?m-blcah$A6)wJ}G6?rNis zgdK@H5_lx?Na&H+Bf&?akAxqIKQaKw2p~g%i~%wTu67iVVL-+K83<$~kfA`v0vQZs zG?3vy#se7;WJHi5LB<3b6jwVc$gsHDaX|(K85v|~kg-7q2N@k?csxG4CxHP$ty=rM zf%f9P{hjMQFMfERmoGTv!N2Y-Pgu3F%VYN^$lV`zZSLOf{)D>A6Mpye&VMuQ{`~I- g{da`y_Yk{NeG*x$_^hP91N$b#XC)?Jzod|V06(!8vj6}9 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Portugal b/pytz/zoneinfo/Portugal new file mode 100644 index 0000000000000000000000000000000000000000..168accf060c3837af1bd64361bd0dc157dec0ae9 GIT binary patch literal 3439 zcmeI!X>d(v9LMo{8z~}qPzho=q-tqOB(^A3ZWB$DSdxoa(pVz4h~ru&lqMxrC1W0H zsjZHPWl~~`t@d4r*s4T@l-jqWp{S<%e9ug0bo!z?<7LmCo6mJ8yz~41ojnJ~2iX4c zlu_UC<|$BbKKsnPHdibN8>TP#<50@Ng?IHuIg|8nl3n`Z%uS{d>(rM_yQQbM%h#7C z4%ah$JE`O36=v27UvrJoNniVgySeVmq2_wMj=sS)MbGYBLf;$^ zu5T%SSl{w|tG@MqroR2~W^>1umFCXHvHGsBr<%Lxo93RR1at487;|5AM{|E$cl|(1 zfAe6gIp(40Rr;a)OL~sIv7Yll(~n&4XCB=cX&$|^v@ka%tT6XNx_NANQ}fuqus(UN z^uoLYyY%Cuz0BjQ1{R)(Of5XIY>9r-`NTY#7Fu{JAinU_=acl)J@%X5hi){_1fA4= zXs}m1TXlnWu5^ZW?&)kT|K?=v!qy&I!TMC=V)|&~(#&|HaAJ4kC)bC@<$giNmB@z1 z&+UDTs{x+Iwc5qTb)N>>jWX4=8_&vUH*fu}-8z3)yM5%McIUg}+TG0E+P(SfwEI)j zHFMlo+Jhmf+Asar7)4Qr@z62DcoaC%_|`q<7IyS>?(Oqv~lxR@*m2 z`fT4Js;|ltH5M)wHPfW1HU2Z9CAdWG-u*?LaHsHX9W37TYcA?muP5H}tRm{UJ7m2_ zO=bP7b!CGyUb5kVlJf2BC(x1i zn$=h&ng=9_=EcdPrOzzcvY@XBdNxM3+TjrI{unJ=FOQXNwzZP)O>QUKE~qZwkN1`B zQiDYM5O?W_^AR7^y)J_t#UjK#M|SYNBs$!?CPLlzh|s*l;-f1|MOap*2+!RmBc`W` zj;of)PKk-4bJ`@?rTbJFnJ_>`wMdZ8@D8%8cSqUHuYv6L*k49h4iV93E6N^^>WiM6 z9?D*4JVbA!f{4k!BR)#AG4@`*9JhA4_#|(e96xWboRGChemXWoCQnb6ui0O7 zEAf&qclCQOzF+F^z5Z|ie#uhStF*_fe?5QxSZ86%33~~&mHzwZ>YBYQ-`Fbt^;3Q0 z_2Tb@M>uWWgQNJtTm8wQJ~;SBJ$AdDx1G=G;iL0E?A>$quzAStS*qcdx>l&vYW_uBKwJKD6*r-mLhwKY^tT&Rb*R{eML4F z*;!<3k-bGW7uj88dy)M`HW=AqWQ#4;9wVDfvg4L&%aJ{|RGW_Mx~1B7WZ#jEM|K|BdSvgB&9_v$k8D4(|40Ln4j?T+ zdVn+m=>pOQqz_0VkWL`2Kzd=Rnt^l!X$R5|q#;O0kd`1lL7IYe1!)V?7o;&rXOPw) zy+N8|sk+1eA=<-3e|TsR4;?~Ug!Bk$64E84O-P@RMj@TDRINgKg)|H47Sb-HUr57{ zjv*~WdWJL&=^D~Dq;E*$kj^2kvsAr9nul}`X&=%*q=85WkrpC7M4E_n5osgRN2HNR zCy`cKs$L?^v{cC zWAk_OZ^OnL2M&t&*-3HmdwYA{@B8}t`ku$vJ2coJzs70ru$gMRIlB&mVL9v{SK&aO zK5APvk=`abu1u(t<}Hcl4XRk#tBxfX&FNQ_obB$b^LUTGSP^qMJR(C{`)JlsU(F;b+Sb_#WRz13viKjnF0+q}f; zvIa(*zRc!dz`(a1RmWoIInjhXioYe5Hk@Ld`(~5?_ zOSyh1EOseS%(G2UYE~;y_LEOwWME`wVrF1u0YV0b@(z$;brT>YBMSpVK?8{0vjD^f ziF*f!FnGI!fCS+n1iSm#feJtv1bBfM#OC=A1et9q6(AbqRuBzxFNg-Y8AOBJ4WdDA z2hkw+gJ_T+Ks3l7AVWcZ0ns4;fM}4PKs4B2OpHt{%q)ydtUw6#7zaoK=sk!xz$7D3 f4Cp-|8|XbC8|Xb2A77yNuy~PyfeR?CYsm!wMOto6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Singapore b/pytz/zoneinfo/Singapore new file mode 100644 index 0000000000000000000000000000000000000000..a6f2db8f3a887fa0f19283b52c2f801329bb4f53 GIT binary patch literal 402 zcmWHE%1kq2zyKUT5fBCe7+bupxpncbbiWA)xSk}O+Wa)(^u&0MOCGr&zVGtw5S#dw zgOQ1ug_VVkoq-`S7Njw$fPsa9Azguy6GVd8nH3s51**45C5K2GJm=gJ_WRK{Ut_y7O^ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Turkey b/pytz/zoneinfo/Turkey new file mode 100644 index 0000000000000000000000000000000000000000..864099556bc9875b7e9258af6c3b221d84c68eae GIT binary patch literal 2721 zcmbu=eN0tl0LSrj?*%TGp*>oNB#Na7Dk`8T7>I?)RInpn%@p#ah?qpj*NHE2r_N=$ zd|WhjR3jyF>ZqmJ)KV*#7MeYsa;6 zFiz#T^_Kh&!LRx*vrhNF96aMIwp!gAjn)g<*4LM}8D~!v>E}*aM%%9S)-PA~8o!q8 zv)aqTjNjwZEvCM;{@Lpe}`C{s8eP@RU zBW$k~DVmMQ*4}!Dx(uUZ{RaJk)!huSW`W*$_NK-M3x;YBeUwLl2Ftb?Kv3e z>K)M-v$k4~Ial2nd*r0my(UWUv2LXnw|s%tv%Exmq-c`%X#QxeSLQIScT%Dj9~-0f ziHy(^Lel~X?On~p^FFihsXxqqhcBA_cb_wp>b@`sR39)0u71xPw6NApF4Q>WQOZ_KdMyDc%(+eXjbb*%kF?gcYv=AZVc_+w^nPSDQXlo}izdQ|51`bOkk`az8G91>%i zo5a}fw~BEM+eQBIgR)?Kn;gIMZTVzHh0xcnk`tbKSr(Shk`srOOMiZzoD@A?PEP78 zCtppLQ=&$TDW^Njr`r?7)IC?^w3Y}_RNF}u@BUdlQ}vseUfnE==`G^f6+g)t*&m6S z#m8ky+-5N=t3j5Ae<){nmvZ)x8)eyz`EpKErF^cv*`bbv? zzR^10`TgzRj4AMIxw#Yh$FKPd)r-H-&!5pWmpXsHsaOAhU+@U^13sLc>cjiPH`STE zr|ArG*^vwHs4hKn@sZ1q1OSNu5&|R!NDv%V6p%0=aXpVNLU z5>zCrNLU?JT#>*!s>mXtMPiEt7l|$sUL?LqfRP9zAx2`11R04k5@tsgXC%-_q#aeL zkytybU?b5+!i~fm2{;mQB;-iUk)R_{N5YQ89SJ-Vc}Ep`B=(Lf_(=4T@FVd@1^^iW zWC)NkKn4LB1!NeIaX`3Kj0!R=$haT_ zgNzI^G|1REs=+}<$59OrGCs%vAtQtg5i&-|AR(jV^0@Ei2?@RRxIJOsyL~+2zWaI9 zDmfQeZIfChwL9U?HmOxo+tkU~rY?7WfBQH2YMcINpZ+;e>ODd&*nm{FEU94dz_fwM Pg9axRq$E3ULn8hH9ONz6 literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/UCT b/pytz/zoneinfo/UCT new file mode 100644 index 0000000000000000000000000000000000000000..a88c4b665b3ec94711c735fc7593f460668958cd GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5Ss-YX!W5+Jvm7%3#iuo4W$@Qu=R=2lX+ zIh>7-b8NLqJJYRnExKi`P0TUedKt^qt(h!c>unar?R*dGubS&G&$H+GoZayk+wbdL z*Y;Gt^RE+Oe&OZxnU{Oo$bmxt*!*8Q#+sMQKgKH5)ai}xz*{S%(_iimdTF5y?n!rt zY%SBF&87aZx-=c`N%gz(BDCw34gSd32^~2!?vDELyuR!5h(G%4>oUea7=aq*rcD9 z>p53bRr1&Zec#6}m2xs%-+%1765Yje?(Pva&o@WT-~7E;Q1F*bU3pHV&H7fRXPyx0 zQY&KD^o`D(=nz@MAL{IjFRPq^V>iRe7yS=6B|+#T9$xlKOa6 zklrE-^M6xIT`Oc!a-1l-won#N{wf~$EJ{8&{-r3f==Ri_5!${USh)f*q_)nD|e>Yc~+ zBk!(LHI4gp?cowtSJJB2bf>8L+FY?!(t)(u9> z$1j}~jeBp(Cx!>b`j%0-VPL;#s{TPY??0}d%(wU3I=A`Hf zBZtDfO;z3tW^wSC|Nz2mDcwX^q4z3a43^{(HopYJbHLBUQ)=>cLasnZ>0TYhP}t}brJ)Cz88X$?R{>k$Lo}O9^+H%bv%{ze9F8| z1D93i;#p;GjuT{F&a~eD9#@q4176N+=H;FlFlU+nas=+$@2Nxvhm6i@hKGy~?Etwj zLXH_CFh*pM$S9FvBI85`ij351hKh{UY6gpp78x!wUSz;;9V@3vzj2am>GHztx z$jFhQBV$JfkBr`GhHo|FM*@IE00{vS10)DY6p%0=aX}O(dLF6Hg?dRufSqq*fDCB&bMK zk+33hMFNXN76~m9TO_zhbdm5{O?;66TTO(K5L-=*ksu>cM#7B583{BJX`BvqNN8|a z`0XB7WW*hO9Osi;q`I@mew&=>V4F~yc*odm&$Rahn`#qmlWk$|sjI6g_Ww)wKhfqN cF`e%yqFzkiv#S^9=I6@n>b$(%yj&UeH}EZKga7~l literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/US/Aleutian b/pytz/zoneinfo/US/Aleutian new file mode 100644 index 0000000000000000000000000000000000000000..391ec98ec0f31cd595ed05a9b91a41c4cdb25d31 GIT binary patch literal 2353 zcmciCUrd%&0LSr%zb~K|6%ZndLdHwdwv5!Hz6D=S$_GwO zxKVG9$_M+-x)1GrPd?l_=tghaCu2%`-Prs_`ABMm8<*6h7ls$Q@qt@({K}-I@xQuy z(NEbbVLVGO{yIi2`8--DzJFUS?JSYY_D`y$npBy*{SWbI?mW4?Y(hL1Gc8kAoE0hl zaGe@4C{m|>(JOxL6)VRs>a@%6sPv)FbjC=xTGe|@i-CHT+48B(>X0hCu}0^hF$-_Z~dY`^WRlkE{(@oYkxjSsvQ;abbZR zvqE5r$QqGFBCAA}iL4V@sMV|#S*q2n68Wq-;ptkisFALrRC#&T5K>RL^S4 zht$t%3W!t?DIrorq=-lrkuoB6L<)&i5-BB8OQe`cHLa$cNIk8lph!inrld$sk)k41 zMaqiQ6)7xIS){Z`ZIR+4)wP=PBK5VJ0wWc+ni3;5Mv9D787VVTXQa?LSLvYOz>v^; zJ)ZEe`}jD{CqL5Zx~+Uov;V2JDYvP$`Nh^cz|^{&s2A|4+C7E;j## cxpqfT^h`nA)5^0mvNA+kd1hutW`>CP3w~*NkN^Mx literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/US/Arizona b/pytz/zoneinfo/US/Arizona new file mode 100644 index 0000000000000000000000000000000000000000..67589026c21c6bcb83587d25342c93f10570bc24 GIT binary patch literal 327 zcmZvYAq&Dl7>2*w299}QO_2Qxi(odoO(?YL!=cxMNs}%Y0#a~T!Sz17cKZ3}Cpw>NgF9qmu+9aR--XCrsnSyZ4tJ6R>Wa>`9!VX^F9kZxMSt1yQB&M?k}ke9UhVblr}rL-QeVC7(g!Pxwhz|`BTjI<%{*PHLt7kymbA; zyysO#)(Bmh6t9kFgzFR0J=DojzWUUVFjEy3CZ~J)m@|Gp^5bn{sy#%ie>rZ>Rvnk0 zN()U*QK6jMU8!nwDzsU)N1b0#pfAi?sp^um^~KS1)z5Kr^e+!3sb9NI(3kFe$^6zb zMqh4{Xf9t$lq+YV&DA5(@_TU?Q{RjS>h>fb8Ah5skPE@a&zTA<|f^!|2fsT zPmT5n{6=}q_tQ;VZB|V;d??M#o9d>DMY?&}M&p^Es$1+>Xj-mWD6N*Jn49ON$Svs! zrgc(+v>6s^yrM(p)?V$*ZJpXl+YUX|?M<#qy9T$bb{E>}_LWzZ_kqj$j?a%NpH1Iu z-xa&nooOxQuGuS8hr#EiCuW(s*K3RTb)IefTnBWgW@AmK@?71yI?{B> zdrSM5Jf*s3P1OOpeO0%NVLEWpy(%a%O@gO1QQf14%KZbYRfu12=@I<3>gnMvq3zF@ z&?=Yoy0X{wE~=0Rj;=RhIahV~&ezO?3(ECF?<&(LIbT1VIbS^z_koTWm#q4B%hZv5 z2dK!pZ4%Y>Srb*VRH8lOOmyxHiKz)PkG;28KVI5T#m-FE{k8_GxRE1t|F>^Z1H!`f zz|@OskhianA6%;9ue#}kknJkrl#dMcIb?=@Au`Oh)eO%*E+fj9n30)<@^z&7T`(kvGhnq^;;IAiEolwub z9W9gg*PCb4y2x`ml_ojCQ`CYzW^zcaJfFPMOz}D(DRFa6imOJag=VX?^8I>R+c|1l z-X@)XX@Z)bwMfr65~F5jr0N&8`>TvmL-edAEtI(Z_g91KKGV?sx*z`gSN~6+sIT9# z(M{^>*DV)!UP}|_o#xK>R@dH-=o>E)gW@I9J`qFg(?6coX8(+9-{b#z4cdQV;bDHV z53k$S+Zol+wH#TA$XY~JBeEWm6^X1#WK|;T5?PtZ+C)~Tqg|iK3U#z=6j`OnIz?70 zvR0ARimX>;#Ug7KS+&TzMOH4dc9GSKtY2gWJK8mjtYSyIj**p&tYu_1BkLJi(a4%c zRyDG&k(G_CZDe&L>l<0&j&_YBtK8A9b7Z9>Yu(YVc4WOHD;`<%$f`%yJ+ktVweM(G zKeGOj1RxneQh?+DNdl4uBn?O&kVGJvKvIF^0!apv4I~{%J{)aAkc=QHL2`m51<4AM z79=l7Vvx)rsX=msBnQb3k{%>KNP-+~hL98?IYN?zPL_B*_NEwndBxy+2khCFrV@Mp5Ifm3BxnoEkl0Am>A^BrSAd*3b6gt`* zB1uHDh@=t8Ba%oYlMJaua>LnS!PHxl4m5*NT!igBe_PBjbs~1HNIs8w@80a&|DB9?1E@aDpIb2*WAjXwMPkByqH7338e^+VccCQIInQIaQEz1vy!e zvjsU_8o1rSSHtT*3kNL-T4+stj^p6b+3J3}aZ1x9(^>6(E literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/US/East-Indiana b/pytz/zoneinfo/US/East-Indiana new file mode 100644 index 0000000000000000000000000000000000000000..aa3dfc43730ed25bde9c967039951f5c2fc15cc9 GIT binary patch literal 1649 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 SOrDgSl9ZjAnw*-P68c?+}V_Y7EM-7G&C- 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 DJ6nx# literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/US/Pacific b/pytz/zoneinfo/US/Pacific new file mode 100644 index 0000000000000000000000000000000000000000..3b7ce1dceebf9fa9db859068da1fa7eba6df1cfa GIT binary patch literal 2819 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 lhz2JUUwbou|j8Z1ia9M1PU`)_Oy`~BM1Zr@g; z{#xT?!eO<@;T}4@G4%ZG(vPQlA|C=hpBEiE*WDiIeZJFoUKNJV$1Wz)<980G<2C(# z1s(l;arfY*P_p$_x_DDT#iilGz>7qYZ=|*8Oa5Ts-MHc6k-Egh$H#{!4fLAem1Cyl z%mEWRyvI!5ztv3HvD!>s-(aS-EHtIDu$exq*pvnRrabSfsjw?_#ixJ{zbWdP(RsgX z#WaviK%$qOttn?FIdE%a)-F;op+1snDwjR^f8wO0x?vrM2yvNL2xzEfm=`ssy z)|mz0Hk;_AP91$&Zx(%Bs~6ubH%mrhI(D&6$M1yn(t~BX_O#N8Z8>^bchD?PzSVVG zzMJ~8M><*e$~4$lbz|uR)A;_OX>zAc)6>gl#p{En`PvcF^7w*I9o=PImdkCqZIA7> zJvkmB+n1ZQ{dqpylRX&iK1Qk1Fn>mMhvkubJNMd7%coSNN{v-2ny@A))zHc_I7Jow zIgeCX#hH0Dk@frid_)H9ExQS(;SLz5aS@$$!{yngV+Z#(4kleF%e=T z#7Kyh5HlfmLJWmi3NaO8E5ulcwGeY5_CgGXSnN2ENKcoOi1&|UPN)3=A97+|CG9Yz83V~DtDFspsq!>swka8gPKnj9X1Sttp z6Qn4IQWc~uhf)`$Fi2&P(jc{2ZkOBR@_21;j@R}{bI#87XYIT(xn4VaFxp*$Dvj~Q z5}o8G(Mf0$o!liliBY1H&?GtuO`?;hL??-5&n3E&%v_@T{rMK6`>*iSzsgg73AJ*b F|0gT@fExe+ literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/WET b/pytz/zoneinfo/WET new file mode 100644 index 0000000000000000000000000000000000000000..444a1933d72525ab3045980eab2fbf79266cf158 GIT binary patch literal 1873 zcmd7SYfO~|9LMoPjFl|ukH|&2RYYK&;BXBHyo3jafr=afFGLD*NunTP;3d{#&J}aN zHkNb7#Kl;1ioU>l0qC;JXc}v4tWhyHU1gU!H+6IwThI4->nmT?b9VN5cDD2G|NRBF zw>D*Z?s*A|B_4Ro9&PKi$96W@8R_ag5S~VM`r@nYlPmlj8@5rxuX7GEZ^(L{k(A6ln1 z$K$lNDM{=4^X>VP5EVDZ+WO>QJ$pS4{Ff79+YpIAfP6*VRvvpq#)YI^9rn&YMB z8%Nc$*s0d(UcEdY(B6-BsO`%Rd*yJE+DEJG)s{rPb|}X>DhsW%DcWAoNU$#dU-m}0 z$GX!a)qU%l^@J^`=bO*1_vW1Tog20NGZQ*+?2-b<#lcKoUVRK~h0-L6SkTLDE6;K@vhT zLQ+CTSl^j~E| Bn416q literal 0 HcmV?d00001 diff --git a/pytz/zoneinfo/Zulu b/pytz/zoneinfo/Zulu new file mode 100644 index 0000000000000000000000000000000000000000..5583f5b0c6e6949372648a7d75502e4d01b44931 GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5Ss +# This file is in the public domain, so clarified as of +# 2009-05-17 by Arthur David Olson. +# ISO 3166 alpha-2 country codes +# +# From Paul Eggert (2006-09-27): +# +# This file contains a table with the following columns: +# 1. ISO 3166-1 alpha-2 country code, current as of +# ISO 3166-1 Newsletter VI-1 (2007-09-21). See: +# +# ISO 3166 Maintenance agency (ISO 3166/MA) +# . +# 2. The usual English name for the country, +# chosen so that alphabetic sorting of subsets produces helpful lists. +# This is not the same as the English name in the ISO 3166 tables. +# +# Columns are separated by a single tab. +# The table is sorted by country code. +# +# Lines beginning with `#' are comments. +# +# From Arthur David Olson (2011-08-17): +# Resynchronized today with the ISO 3166 site (adding SS for South Sudan). +# +#country- +#code country name +AD Andorra +AE United Arab Emirates +AF Afghanistan +AG Antigua & Barbuda +AI Anguilla +AL Albania +AM Armenia +AO Angola +AQ Antarctica +AR Argentina +AS Samoa (American) +AT Austria +AU Australia +AW Aruba +AX Aaland Islands +AZ Azerbaijan +BA Bosnia & Herzegovina +BB Barbados +BD Bangladesh +BE Belgium +BF Burkina Faso +BG Bulgaria +BH Bahrain +BI Burundi +BJ Benin +BL St Barthelemy +BM Bermuda +BN Brunei +BO Bolivia +BQ Bonaire Sint Eustatius & Saba +BR Brazil +BS Bahamas +BT Bhutan +BV Bouvet Island +BW Botswana +BY Belarus +BZ Belize +CA Canada +CC Cocos (Keeling) Islands +CD Congo (Dem. Rep.) +CF Central African Rep. +CG Congo (Rep.) +CH Switzerland +CI Cote d'Ivoire +CK Cook Islands +CL Chile +CM Cameroon +CN China +CO Colombia +CR Costa Rica +CU Cuba +CV Cape Verde +CW Curacao +CX Christmas Island +CY Cyprus +CZ Czech Republic +DE Germany +DJ Djibouti +DK Denmark +DM Dominica +DO Dominican Republic +DZ Algeria +EC Ecuador +EE Estonia +EG Egypt +EH Western Sahara +ER Eritrea +ES Spain +ET Ethiopia +FI Finland +FJ Fiji +FK Falkland Islands +FM Micronesia +FO Faroe Islands +FR France +GA Gabon +GB Britain (UK) +GD Grenada +GE Georgia +GF French Guiana +GG Guernsey +GH Ghana +GI Gibraltar +GL Greenland +GM Gambia +GN Guinea +GP Guadeloupe +GQ Equatorial Guinea +GR Greece +GS South Georgia & the South Sandwich Islands +GT Guatemala +GU Guam +GW Guinea-Bissau +GY Guyana +HK Hong Kong +HM Heard Island & McDonald Islands +HN Honduras +HR Croatia +HT Haiti +HU Hungary +ID Indonesia +IE Ireland +IL Israel +IM Isle of Man +IN India +IO British Indian Ocean Territory +IQ Iraq +IR Iran +IS Iceland +IT Italy +JE Jersey +JM Jamaica +JO Jordan +JP Japan +KE Kenya +KG Kyrgyzstan +KH Cambodia +KI Kiribati +KM Comoros +KN St Kitts & Nevis +KP Korea (North) +KR Korea (South) +KW Kuwait +KY Cayman Islands +KZ Kazakhstan +LA Laos +LB Lebanon +LC St Lucia +LI Liechtenstein +LK Sri Lanka +LR Liberia +LS Lesotho +LT Lithuania +LU Luxembourg +LV Latvia +LY Libya +MA Morocco +MC Monaco +MD Moldova +ME Montenegro +MF St Martin (French part) +MG Madagascar +MH Marshall Islands +MK Macedonia +ML Mali +MM Myanmar (Burma) +MN Mongolia +MO Macau +MP Northern Mariana Islands +MQ Martinique +MR Mauritania +MS Montserrat +MT Malta +MU Mauritius +MV Maldives +MW Malawi +MX Mexico +MY Malaysia +MZ Mozambique +NA Namibia +NC New Caledonia +NE Niger +NF Norfolk Island +NG Nigeria +NI Nicaragua +NL Netherlands +NO Norway +NP Nepal +NR Nauru +NU Niue +NZ New Zealand +OM Oman +PA Panama +PE Peru +PF French Polynesia +PG Papua New Guinea +PH Philippines +PK Pakistan +PL Poland +PM St Pierre & Miquelon +PN Pitcairn +PR Puerto Rico +PS Palestine +PT Portugal +PW Palau +PY Paraguay +QA Qatar +RE Reunion +RO Romania +RS Serbia +RU Russia +RW Rwanda +SA Saudi Arabia +SB Solomon Islands +SC Seychelles +SD Sudan +SE Sweden +SG Singapore +SH St Helena +SI Slovenia +SJ Svalbard & Jan Mayen +SK Slovakia +SL Sierra Leone +SM San Marino +SN Senegal +SO Somalia +SR Suriname +SS South Sudan +ST Sao Tome & Principe +SV El Salvador +SX Sint Maarten +SY Syria +SZ Swaziland +TC Turks & Caicos Is +TD Chad +TF French Southern & Antarctic Lands +TG Togo +TH Thailand +TJ Tajikistan +TK Tokelau +TL East Timor +TM Turkmenistan +TN Tunisia +TO Tonga +TR Turkey +TT Trinidad & Tobago +TV Tuvalu +TW Taiwan +TZ Tanzania +UA Ukraine +UG Uganda +UM US minor outlying islands +US United States +UY Uruguay +UZ Uzbekistan +VA Vatican City +VC St Vincent +VE Venezuela +VG Virgin Islands (UK) +VI Virgin Islands (US) +VN Vietnam +VU Vanuatu +WF Wallis & Futuna +WS Samoa (western) +YE Yemen +YT Mayotte +ZA South Africa +ZM Zambia +ZW Zimbabwe diff --git a/pytz/zoneinfo/localtime b/pytz/zoneinfo/localtime new file mode 100644 index 0000000000000000000000000000000000000000..2ee14295f108ab15ee013cd912e7688407fa3cde GIT binary patch literal 118 mcmWHE%1kq2zyORu5fFv}5Ss0stYrjZLKTDXReO=(hY6&_8=4Lyomn)i0TXL?s}c+qA4eD1Km`+c9})T|e~dH(eZ zv|r)jb;drt4=r96E(88$fA$GSD$7alf^Sm=_O;okfpK9)v{r`&GN89RnmQ> zDe*1UEADvDtf(%~pVx_5S&^kzRSh*?6c5s+YacRS=0)k%3!auWnFH0@Y29UALT6Pr zDooZ#+@`+jb5%ApGOE1QAt|rfr#1y%Hk&HfsjrV8FyEB!)fGF+&F0x_^p+*_&DQL> zdRzYMW_wbO-jP1qd>b=DS9+((&XC@ES5%tpx;9+x4vv@I2YadS-Z8ST{UzC_Zs@AX z$IVaizv-V-D$V}3oArU%5_8bANFNHDWe({X`mk@g{IVrO|5{xrzkT+Ws;(F(M+(!G zF80dNtS8j5ycqdCv4c9E)?7{ukJdE_QRa^xq55P*h&k2bqCVZ|f;oNVCw-=-%ADQ5 zUe{KZnRA<~)cMkVViuOE3$xeB#p&}@U3QUN8a-8APRf-lk3Fld#-z%%4pa1>A#rlO z$w+oy4AH7l{1Iu~ zWt(dJ?%i^0=n{47s<|e}%v4SF+tTdNr#g5`rrcJZuR}hYVM0H8Q8zElFt<;AQs0r4 zVD22*QHLc)nijp9>ANDEnwIS%)!j{M%{>j8s(UU5Nvor^s`Za&rOnnoDtz@1a_^$m zs%?(P-1p`j)h^|jX+O49-ygffJTUMB{b1NK6VY*^j__@l$e;aoF&m~A67AWgQUxxma1!Jrs+1}y6T>gXdW8+tBQ^2WFGETp?Wk9Ha%M%);(*^ zn_f4**1ao#G<|+4)^VlhhYwx(l33C>K~IM1N!$< z1L{glLeyxTP&LaW2KUv8YsZ^`we9tw1%>j|{&?k`HckewZ>N$*d1XjZpn5tkMutwV zQNvm{m*kXPD)~m8JQKS@J#!+&j0msPBX(RcBYh=0bxD-h`y`}6h#J!|XHMK0}h3vH+gs|DL>C?Du$howX0|@ATVOT0`?bGJnVfA~T3g zAu@-^BqFnjOd~Rn$V4JD>9kXc%%#&#CNi7IbRzSKOeiv=$dn>;icBgptH`t>^NLI? zGPB6kB6I7slZ(u*(@rlkzsLk5GmK0zGRMdyBeRT5GcwP}L?bheOf@psPCMDiY&-3A zBlC?+xYN!!GUdpeBa@EIIx_9Zydx9uv@?%PJu>&mOg}RJNCJ=yASpm{fFuFQ z0+I$K4@e@AOdzRn+FT&XK(c|P1IY)H5F{f=N|2l&NkOuLqy@>%ku@`ElxydgupY>I#!AxT2Agro_{6Ot$-Q%;*IBv($GEF@bKwMkJ3&B9TlYsYG(= zw8=!W>9pxY@`)rA$taRiB&SGHk*p$VMe>Ry7RfAt!PJ03%X8>{vAm;#b5+G**avC7#0dgWBX9996Am;*dG9YJz)1D5< z`QWrC1ad|=?J0qr6Ua${oE6Avft(k}iGiFM$f<#x8_3CloE=VkdLZYA)1Dy68RE33 z2y%`fCkb+vAg2j(o**X*a;7v0sOLw+zAjlpvvG&`Yz1^d`MR)1!?b +# This file is in the public domain, so clarified as of +# 2009-05-17 by Arthur David Olson. +# +# TZ zone descriptions +# +# From Paul Eggert (1996-08-05): +# +# This file contains a table with the following columns: +# 1. ISO 3166 2-character country code. See the file `iso3166.tab'. +# 2. Latitude and longitude of the zone's principal location +# in ISO 6709 sign-degrees-minutes-seconds format, +# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, +# first latitude (+ is north), then longitude (+ is east). +# 3. Zone name used in value of TZ environment variable. +# 4. Comments; present if and only if the country has multiple rows. +# +# Columns are separated by a single tab. +# The table is sorted first by country, then an order within the country that +# (1) makes some geographical sense, and +# (2) puts the most populous zones first, where that does not contradict (1). +# +# Lines beginning with `#' are comments. +# +#country- +#code coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AG +1703-06148 America/Antigua +AI +1812-06304 America/Anguilla +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AO -0848+01314 Africa/Luanda +AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island +AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole +AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island +AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island +AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay +AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills +AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AQ -7824+10654 Antarctica/Vostok Vostok Station, Lake Vostok +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie +AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I +AQ -5430+15857 Antarctica/Macquarie Macquarie Island Station, Macquarie Island +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta (SA, LP, NQ, RN) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS -1416-17042 Pacific/Pago_Pago +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -4253+14719 Australia/Hobart Tasmania - most locations +AU -3956+14352 Australia/Currie Tasmania - King Island +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales - most locations +AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna +AU -2728+15302 Australia/Brisbane Queensland - most locations +AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia - most locations +AU -3143+12852 Australia/Eucla Western Australia - Eucla area +AW +1230-06958 America/Aruba +AX +6006+01957 Europe/Mariehamn +AZ +4023+04951 Asia/Baku +BA +4352+01825 Europe/Sarajevo +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BF +1222-00131 Africa/Ouagadougou +BG +4241+02319 Europe/Sofia +BH +2623+05035 Asia/Bahrain +BI -0323+02922 Africa/Bujumbura +BJ +0629+00237 Africa/Porto-Novo +BL +1753-06251 America/St_Barthelemy +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BQ +120903-0681636 America/Kralendijk +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Amapa, E Para +BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0226-05452 America/Santarem W Para +BR -0846-06354 America/Porto_Velho Rondonia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus E Amazonas +BR -0640-06952 America/Eirunepe W Amazonas +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BW -2439+02555 Africa/Gaborone +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland Time, including SE Labrador +CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), PEI +CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971 +CA +4606-06447 America/Moncton Atlantic Time - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic Time - Labrador - most locations +CA +5125-05707 America/Blanc-Sablon Atlantic Standard Time - Quebec - Lower North Shore +CA +4531-07334 America/Montreal Eastern Time - Quebec - most locations +CA +4339-07923 America/Toronto Eastern Time - Ontario - most locations +CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973 +CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario +CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations +CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut +CA +744144-0944945 America/Resolute Central Standard Time - Resolute, Nunavut +CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut +CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut +CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario +CA +4843-09434 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario +CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations +CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest +CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan +CA +690650-1050310 America/Cambridge_Bay Mountain Time - west Nunavut +CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories +CA +682059-1334300 America/Inuvik Mountain Time - west Northwest Territories +CA +4906-11631 America/Creston Mountain Standard Time - Creston, British Columbia +CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia +CA +4916-12307 America/Vancouver Pacific Time - west British Columbia +CA +6043-13503 America/Whitehorse Pacific Time - south Yukon +CA +6404-13925 America/Dawson Pacific Time - north Yukon +CC -1210+09655 Indian/Cocos +CD -0418+01518 Africa/Kinshasa west Dem. Rep. of Congo +CD -1140+02728 Africa/Lubumbashi east Dem. Rep. of Congo +CF +0422+01835 Africa/Bangui +CG -0416+01517 Africa/Brazzaville +CH +4723+00832 Europe/Zurich +CI +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago most locations +CL -2709-10926 Pacific/Easter Easter Island & Sala y Gomez +CM +0403+00942 Africa/Douala +CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc. +CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin +CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. +CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang +CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CW +1211-06900 America/Curacao +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia +CZ +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin most locations +DE +4742+00841 Europe/Busingen Busingen +DJ +1136+04309 Africa/Djibouti +DK +5540+01235 Europe/Copenhagen +DM +1518-06124 America/Dominica +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil mainland +EC -0054-08936 Pacific/Galapagos Galapagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ER +1520+03853 Africa/Asmara +ES +4024-00341 Europe/Madrid mainland +ES +3553-00519 Africa/Ceuta Ceuta & Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +ET +0902+03842 Africa/Addis_Ababa +FI +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Chuuk Chuuk (Truk) and Yap +FM +0658+15813 Pacific/Pohnpei Pohnpei (Ponape) +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faroe +FR +4852+00220 Europe/Paris +GA +0023+00927 Africa/Libreville +GB +513030-0000731 Europe/London +GD +1203-06145 America/Grenada +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GG +4927-00232 Europe/Guernsey +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Godthab most locations +GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund +GL +7029-02158 America/Scoresbysund Scoresbysund / Ittoqqortoormiit +GL +7634-06847 America/Thule Thule / Pituffik +GM +1328-01639 Africa/Banjul +GN +0931-01343 Africa/Conakry +GP +1614-06132 America/Guadeloupe +GQ +0345+00847 Africa/Malabo +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HR +4548+01558 Europe/Zagreb +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java & Sumatra +ID -0002+10920 Asia/Pontianak west & central Borneo +ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor +ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas) +IE +5320-00615 Europe/Dublin +IL +3146+03514 Asia/Jerusalem +IM +5409-00428 Europe/Isle_of_Man +IN +2232+08822 Asia/Kolkata +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT +4154+01229 Europe/Rome +JE +4912-00207 Europe/Jersey +JM +1800-07648 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KH +1133+10455 Asia/Phnom_Penh +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KM -1141+04316 Indian/Comoro +KN +1718-06243 America/St_Kitts +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KW +2920+04759 Asia/Kuwait +KY +1918-08123 America/Cayman +KZ +4315+07657 Asia/Almaty most locations +KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda) +KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe) +KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau) +KZ +5113+05121 Asia/Oral West Kazakhstan +LA +1758+10236 Asia/Vientiane +LB +3353+03530 Asia/Beirut +LC +1401-06100 America/St_Lucia +LI +4709+00931 Europe/Vaduz +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LS -2928+02730 Africa/Maseru +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +ME +4226+01916 Europe/Podgorica +MF +1804-06305 America/Marigot +MG -1855+04731 Indian/Antananarivo +MH +0709+17112 Pacific/Majuro most locations +MH +0905+16720 Pacific/Kwajalein Kwajalein +MK +4159+02126 Europe/Skopje +ML +1239-00800 Africa/Bamako +MM +1647+09610 Asia/Rangoon +MN +4755+10653 Asia/Ulaanbaatar most locations +MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MO +2214+11335 Asia/Macau +MP +1512+14545 Pacific/Saipan +MQ +1436-06105 America/Martinique +MR +1806-01557 Africa/Nouakchott +MS +1643-06213 America/Montserrat +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MW -1547+03500 Africa/Blantyre +MX +1924-09909 America/Mexico_City Central Time - most locations +MX +2105-08646 America/Cancun Central Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatan +MX +2540-10019 America/Monterrey Mexican Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas away from US border +MX +2550-09730 America/Matamoros US Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas near US border +MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mexican Mountain Time - Chihuahua away from US border +MX +2934-10425 America/Ojinaga US Mountain Time - Chihuahua near US border +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana US Pacific Time - Baja California near US border +MX +3018-11452 America/Santa_Isabel Mexican Pacific Time - Baja California away from US border +MX +2048-10515 America/Bahia_Banderas Mexican Central Time - Bahia de Banderas +MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia +MY +0133+11020 Asia/Kuching Sabah & Sarawak +MZ -2558+03235 Africa/Maputo +NA -2234+01706 Africa/Windhoek +NC -2216+16627 Pacific/Noumea +NE +1331+00207 Africa/Niamey +NF -2903+16758 Pacific/Norfolk +NG +0627+00324 Africa/Lagos +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Kathmandu +NR -0031+16655 Pacific/Nauru +NU -1901-16955 Pacific/Niue +NZ -3652+17446 Pacific/Auckland most locations +NZ -4357-17633 Pacific/Chatham Chatham Islands +OM +2336+05835 Asia/Muscat +PA +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza Gaza Strip +PS +313200+0350542 Asia/Hebron West Bank +PT +3843-00908 Europe/Lisbon mainland +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA +2517+05132 Asia/Qatar +RE -2052+05528 Indian/Reunion +RO +4426+02606 Europe/Bucharest +RS +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad +RU +5545+03735 Europe/Moscow Moscow+00 - west Russia +RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+00 - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals +RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia +RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk +RU +5345+08707 Asia/Novokuznetsk Moscow+03 - Novokuznetsk +RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River +RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal +RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River +RU +623923+1353314 Asia/Khandyga Moscow+06 - Tomponsky, Ust-Maysky +RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River +RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island +RU +643337+1431336 Asia/Ust-Nera Moscow+07 - Oymyakonsky +RU +5934+15048 Asia/Magadan Moscow+08 - Magadan +RU +5301+15839 Asia/Kamchatka Moscow+08 - Kamchatka +RU +6445+17729 Asia/Anadyr Moscow+08 - Bering Sea +RW -0157+03004 Africa/Kigali +SA +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SH -1555-00542 Atlantic/St_Helena +SI +4603+01431 Europe/Ljubljana +SJ +7800+01600 Arctic/Longyearbyen +SK +4809+01707 Europe/Bratislava +SL +0830-01315 Africa/Freetown +SM +4355+01228 Europe/San_Marino +SN +1440-01726 Africa/Dakar +SO +0204+04522 Africa/Mogadishu +SR +0550-05510 America/Paramaribo +SS +0451+03136 Africa/Juba +ST +0020+00644 Africa/Sao_Tome +SV +1342-08912 America/El_Salvador +SX +180305-0630250 America/Lower_Princes +SY +3330+03618 Asia/Damascus +SZ -2618+03106 Africa/Mbabane +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen +TG +0608+00113 Africa/Lome +TH +1345+10031 Asia/Bangkok +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110-17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +TZ -0648+03917 Africa/Dar_es_Salaam +UA +5026+03031 Europe/Kiev most locations +UA +4837+02218 Europe/Uzhgorod Ruthenia +UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk / Zaporizhia, E Luhansk +UA +4457+03406 Europe/Simferopol central Crimea +UG +0019+03225 Africa/Kampala +UM +1645-16931 Pacific/Johnston Johnston Atoll +UM +2813-17722 Pacific/Midway Midway Islands +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern Time +US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations +US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisville area +US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County +US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations +US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties +US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County +US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +382931-0871643 America/Indiana/Petersburg Eastern Time - Indiana - Pike County +US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County +US +415100-0873900 America/Chicago Central Time +US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County +US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County +US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties +US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County +US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) +US +471551-1014640 America/North_Dakota/Beulah Central Time - North Dakota - Mercer County +US +394421-1045903 America/Denver Mountain Time +US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon +US +364708-1084111 America/Shiprock Mountain Time - Navajo +US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona +US +340308-1181434 America/Los_Angeles Pacific Time +US +611305-1495401 America/Anchorage Alaska Time +US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle +US +571035-1351807 America/Sitka Alaska Time - southeast Alaska panhandle +US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck +US +643004-1652423 America/Nome Alaska Time - west Alaska +US +515248-1763929 America/Adak Aleutian Islands +US +550737-1313435 America/Metlakatla Metlakatla Time - Annette Island +US +211825-1575130 Pacific/Honolulu Hawaii +UY -3453-05611 America/Montevideo +UZ +3940+06648 Asia/Samarkand west Uzbekistan +UZ +4120+06918 Asia/Tashkent east Uzbekistan +VA +415408+0122711 Europe/Vatican +VC +1309-06114 America/St_Vincent +VE +1030-06656 America/Caracas +VG +1827-06437 America/Tortola +VI +1821-06456 America/St_Thomas +VN +1045+10640 Asia/Ho_Chi_Minh +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +YE +1245+04512 Asia/Aden +YT -1247+04514 Indian/Mayotte +ZA -2615+02800 Africa/Johannesburg +ZM -1525+02817 Africa/Lusaka +ZW -1750+03103 Africa/Harare diff --git a/requests/__init__.py b/requests/__init__.py new file mode 100644 index 0000000..1ea4aff --- /dev/null +++ b/requests/__init__.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +requests HTTP library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('http://python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post("http://httpbin.org/post", data=payload) + >>> print r.text + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2013 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. + +""" + +__title__ = 'requests' +__version__ = '1.2.0' +__build__ = 0x010200 +__author__ = 'Kenneth Reitz' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2013 Kenneth Reitz' + + +from . import utils +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/requests/adapters.py b/requests/adapters.py new file mode 100644 index 0000000..5666e66 --- /dev/null +++ b/requests/adapters.py @@ -0,0 +1,261 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import socket + +from .models import Response +from .packages.urllib3.poolmanager import PoolManager, ProxyManager +from .packages.urllib3.response import HTTPResponse +from .compat import urlparse, basestring, urldefrag, unquote +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed, get_auth_from_url) +from .structures import CaseInsensitiveDict +from .packages.urllib3.exceptions import MaxRetryError +from .packages.urllib3.exceptions import TimeoutError +from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import HTTPError as _HTTPError +from .cookies import extract_cookies_to_jar +from .exceptions import ConnectionError, Timeout, SSLError +from .auth import _basic_auth_str + +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self): + raise NotImplementedError + + def close(self): + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """Built-In HTTP Adapter for Urllib3.""" + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE): + self.max_retries = DEFAULT_RETRIES + self.config = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + + self.init_poolmanager(pool_connections, pool_maxsize) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize) + + def init_poolmanager(self, connections, maxsize): + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize) + + def cert_verify(self, conn, url, verify, cert): + if url.startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = DEFAULT_CA_BUNDLE_PATH + + if not cert_loc: + raise Exception("Could not find a suitable SSL CA certificate bundle.") + + conn.cert_reqs = 'CERT_REQUIRED' + conn.ca_certs = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + + def build_response(self, req, resp): + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a connection for the given URL.""" + proxies = proxies or {} + proxy = proxies.get(urlparse(url).scheme) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, urlparse(url).scheme) + conn = ProxyManager(self.poolmanager.connection_from_url(proxy)) + else: + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Dispose of any internal state. + + Currently, this just closes the PoolManager, which closes pooled + connections. + """ + self.poolmanager.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a proxy, the full URL has to be + used. Otherwise, we should only use the path portion of the URL.""" + proxies = proxies or {} + proxy = proxies.get(urlparse(request.url).scheme) + + if proxy: + url, _ = urldefrag(request.url) + else: + url = request.path_url + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. Currently this adds a + Proxy-Authorization header.""" + proxies = kwargs.get('proxies', {}) + + if proxies is None: + proxies = {} + + proxy = proxies.get(urlparse(request.url).scheme) + username, password = get_auth_from_url(proxy) + + if username and password: + # Proxy auth usernames and passwords will be urlencoded, we need + # to decode them. + username = unquote(username) + password = unquote(password) + request.headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object.""" + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=timeout) + low_conn.putrequest(request.method, url, skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + r = low_conn.getresponse() + resp = HTTPResponse.from_httplib(r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + + except socket.error as sockerr: + raise ConnectionError(sockerr) + + except MaxRetryError as e: + raise ConnectionError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + raise SSLError(e) + elif isinstance(e, TimeoutError): + raise Timeout(e) + else: + raise + + r = self.build_response(request, resp) + + if not stream: + r.content + + return r diff --git a/requests/api.py b/requests/api.py new file mode 100644 index 0000000..baf43dd --- /dev/null +++ b/requests/api.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. + +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) Float describing the timeout of the request. + :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + session = sessions.Session() + return session.request(method=method, url=url, **kwargs) + + +def get(url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, **kwargs) + + +def options(url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('post', url, data=data, **kwargs) + + +def put(url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('delete', url, **kwargs) diff --git a/requests/auth.py b/requests/auth.py new file mode 100644 index 0000000..0da8bcd --- /dev/null +++ b/requests/auth.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import time +import hashlib +import logging + +from base64 import b64encode + +from .compat import urlparse, str +from .utils import parse_dict_header + + +log = logging.getLogger(__name__) + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + def __init__(self, username, password): + self.username = username + self.password = password + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + def __init__(self, username, password): + self.username = username + self.password = password + self.last_nonce = '' + self.nonce_count = 0 + self.chal = {} + + def build_digest_header(self, method, url): + + realm = self.chal['realm'] + nonce = self.chal['nonce'] + qop = self.chal.get('qop') + algorithm = self.chal.get('algorithm') + opaque = self.chal.get('opaque') + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + # XXX MD5-sess + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + path = p_parsed.path + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + if qop == 'auth': + if nonce == self.last_nonce: + self.nonce_count += 1 + else: + self.nonce_count = 1 + + ncvalue = '%08x' % self.nonce_count + s = str(self.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, hash_utf8(A2)) + respdig = KD(hash_utf8(A1), noncebit) + elif qop is None: + respdig = KD(hash_utf8(A1), "%s:%s" % (nonce, hash_utf8(A2))) + else: + # XXX handle auth-int. + return None + + self.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_401(self, r, **kwargs): + """Takes the given response and tries digest-auth, if needed.""" + + num_401_calls = getattr(self, 'num_401_calls', 1) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and num_401_calls < 2: + + setattr(self, 'num_401_calls', num_401_calls + 1) + self.chal = parse_dict_header(s_auth.replace('Digest ', '')) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.raw.release_conn() + + r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url) + _r = r.connection.send(r.request, **kwargs) + _r.history.append(r) + + return _r + + setattr(self, 'num_401_calls', 1) + return r + + def __call__(self, r): + # If we have a saved nonce, skip the 401 + if self.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + r.register_hook('response', self.handle_401) + return r diff --git a/requests/cacert.pem b/requests/cacert.pem new file mode 100644 index 0000000..504fdcc --- /dev/null +++ b/requests/cacert.pem @@ -0,0 +1,3290 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- diff --git a/requests/certs.py b/requests/certs.py new file mode 100644 index 0000000..bc00826 --- /dev/null +++ b/requests/certs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certs.py +~~~~~~~~ + +This module returns the preferred default CA certificate bundle. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" + +import os.path + + +def where(): + """Return the preferred certificate bundle.""" + # vendored bundle inside Requests + return os.path.join(os.path.dirname(__file__), 'cacert.pem') + +if __name__ == '__main__': + print(where()) diff --git a/requests/compat.py b/requests/compat.py new file mode 100644 index 0000000..bcf94b0 --- /dev/null +++ b/requests/compat.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- + +""" +pythoncompat +""" + +from .packages import charade as chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +#: Python 3.0.x +is_py30 = (is_py3 and _ver[1] == 0) + +#: Python 3.1.x +is_py31 = (is_py3 and _ver[1] == 1) + +#: Python 3.2.x +is_py32 = (is_py3 and _ver[1] == 2) + +#: Python 3.3.x +is_py33 = (is_py3 and _ver[1] == 3) + +#: Python 3.4.x +is_py34 = (is_py3 and _ver[1] == 4) + +#: Python 2.7.x +is_py27 = (is_py2 and _ver[1] == 7) + +#: Python 2.6.x +is_py26 = (is_py2 and _ver[1] == 6) + +#: Python 2.5.x +is_py25 = (is_py2 and _ver[1] == 5) + +#: Python 2.4.x +is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. + + +# --------- +# Platforms +# --------- + + +# Syntax sugar. +_ver = sys.version.lower() + +is_pypy = ('pypy' in _ver) +is_jython = ('jython' in _ver) +is_ironpython = ('iron' in _ver) + +# Assume CPython, if nothing else. +is_cpython = not any((is_pypy, is_jython, is_ironpython)) + +# Windows-based system. +is_windows = 'win32' in str(sys.platform).lower() + +# Standard Linux 2+ system. +is_linux = ('linux' in str(sys.platform).lower()) +is_osx = ('darwin' in str(sys.platform).lower()) +is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. +is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. + +try: + import simplejson as json +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import quote, unquote, quote_plus, unquote_plus, urlencode + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from .packages.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) diff --git a/requests/cookies.py b/requests/cookies.py new file mode 100644 index 0000000..1235711 --- /dev/null +++ b/requests/cookies.py @@ -0,0 +1,385 @@ +# -*- coding: utf-8 -*- + +""" +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import collections +from .compat import cookielib, urlparse, Morsel + +try: + import threading + # grr, pyflakes: this fixes "redefinition of unused 'threading'" + threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + return self._r.url + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """Produce an appropriate Cookie header string to be sent with `request`, or None.""" + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name == name: + if domain is None or domain == cookie.domain: + if path is None or path == cookie.path: + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific.""" + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Don't use the dict interface internally; it's just for compatibility with + with external client code. All `requests` code should work out of the box + with externally provided instances of CookieJar, e.g., LWPCookieJar and + FileCookieJar. + + Caution: dictionary operations that are normally O(1) may be O(n). + + Unlike a regular CookieJar, this class is pickleable. + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. Caution: operation is O(n), not O(1).""" + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains.""" + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the jar. + See values() and items().""" + keys = [] + for cookie in iter(self): + keys.append(cookie.name) + return keys + + def values(self): + """Dict-like values() that returns a list of values of cookies from the jar. + See keys() and items().""" + values = [] + for cookie in iter(self): + values.append(cookie.value) + return values + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the jar. + See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) + and get a vanilla python dict of key value pairs.""" + items = [] + for cookie in iter(self): + items.append((cookie.name, cookie.value)) + return items + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise.""" + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain old + Python dict of name-value pairs of cookies that meet the requirements.""" + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and (path is None + or cookie.path == path): + dictionary[cookie.name] = cookie.value + return dictionary + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws exception + if there are more than one cookie with name. In that case, use the more + explicit get() method instead. Caution: operation is O(n), not O(1).""" + + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws exception + if there is already a cookie of that name in the jar. In that case, use the more + explicit set() method instead.""" + + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().""" + remove_cookie_by_name(self, name) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(cookie) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. Takes as args name + and optional domain and path. Returns a cookie.value. If there are conflicting cookies, + _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown + if there are conflicting cookies.""" + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """__get_item__ and get call _find_no_duplicates -- never used in Requests internally. + Takes as args name and optional domain and path. Returns a cookie.value. + Throws KeyError if cookie is not found and CookieConflictError if there are + multiple cookies that match name and optionally domain and path.""" + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + c = create_cookie( + name=morsel.key, + value=morsel.value, + version=morsel['version'] or 0, + port=None, + port_specified=False, + domain=morsel['domain'], + domain_specified=bool(morsel['domain']), + domain_initial_dot=morsel['domain'].startswith('.'), + path=morsel['path'], + path_specified=bool(morsel['path']), + secure=bool(morsel['secure']), + expires=morsel['max-age'] or morsel['expires'], + discard=False, + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False,) + return c + + +def cookiejar_from_dict(cookie_dict, cookiejar=None): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + for name in cookie_dict: + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + return cookiejar diff --git a/requests/exceptions.py b/requests/exceptions.py new file mode 100644 index 0000000..c0588f6 --- /dev/null +++ b/requests/exceptions.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. + +""" + + +class RequestException(RuntimeError): + """There was an ambiguous exception that occurred while handling your + request.""" + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + def __init__(self, *args, **kwargs): + """ Initializes HTTPError with optional `response` object. """ + self.response = kwargs.pop('response', None) + super(HTTPError, self).__init__(*args, **kwargs) + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """ The URL provided was somehow invalid. """ diff --git a/requests/hooks.py b/requests/hooks.py new file mode 100644 index 0000000..5dfaf6b --- /dev/null +++ b/requests/hooks.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. + +""" + + +HOOKS = ['response'] + + +def default_hooks(): + hooks = {} + for event in HOOKS: + hooks[event] = [] + return hooks + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + + hooks = hooks or dict() + + if key in hooks: + hooks = hooks.get(key) + + if hasattr(hooks, '__call__'): + hooks = [hooks] + + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + + return hook_data diff --git a/requests/models.py b/requests/models.py new file mode 100644 index 0000000..1052877 --- /dev/null +++ b/requests/models.py @@ -0,0 +1,676 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import logging +import datetime + +from io import BytesIO +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header +from .packages.urllib3.filepost import encode_multipart_formdata +from .exceptions import HTTPError, RequestException, MissingSchema, InvalidURL +from .utils import ( + stream_untransfer, guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len) +from .compat import ( + cookielib, urlparse, urlunparse, urlsplit, urlencode, str, bytes, StringIO, + is_py2, chardet, json, builtin_str, basestring) + +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + +log = logging.getLogger(__name__) + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but abritrary + if parameters are supplied as a dict. + + """ + if (not files) or isinstance(data, str): + return None + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, list): + for v in val: + new_fields.append((field, builtin_str(v))) + else: + new_fields.append((field, builtin_str(val))) + + for (k, v) in files: + # support for explicit filename + ft = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + else: + fn, fp, ft = v + else: + fn = guess_filename(v) or k + fp = v + if isinstance(fp, str): + fp = StringIO(fp) + if isinstance(fp, bytes): + fp = BytesIO(fp) + + if ft: + new_v = (fn, fp.read(), ft) + else: + new_v = (fn, fp.read()) + new_fields.append((k, new_v)) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + + + """ + def __init__(self, + method=None, + url=None, + headers=None, + files=None, + data=dict(), + params=dict(), + auth=None, + cookies=None, + hooks=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.params = params + self.auth = auth + self.cookies = cookies + self.hooks = hooks + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + + p.prepare_method(self.method) + p.prepare_url(self.url, self.params) + p.prepare_headers(self.headers) + p.prepare_cookies(self.cookies) + p.prepare_body(self.data, self.files) + p.prepare_auth(self.auth, self.url) + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + p.prepare_hooks(self.hooks) + + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + + def __repr__(self): + return '' % (self.method) + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = self.method.upper() + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + try: + url = unicode(url) + except NameError: + # We're on Python 3. + url = str(url) + except UnicodeDecodeError: + pass + + # Support for unicode domain names and paths. + scheme, netloc, path, _params, query, fragment = urlparse(url) + + if not scheme: + raise MissingSchema("Invalid URL %r: No schema supplied" % url) + + if not netloc: + raise InvalidURL("Invalid URL %t: No netloc supplied" % url) + + try: + netloc = netloc.encode('idna').decode('utf-8') + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(_params, str): + _params = _params.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, _params, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + if headers: + headers = dict((name.encode('ascii'), value) for name, value in headers.items()) + self.headers = CaseInsensitiveDict(headers) + else: + self.headers = CaseInsensitiveDict() + + def prepare_body(self, data, files): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + length = None + is_stream = False + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, basestring), + not isinstance(data, list), + not isinstance(data, dict) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError): + length = False + + if is_stream: + body = data + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if (content_type) and (not 'content-type' in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + if hasattr(body, 'seek') and hasattr(body, 'tell'): + body.seek(0, 2) + self.headers['Content-Length'] = str(body.tell()) + body.seek(0, 0) + elif body is not None: + l = super_len(body) + if l: + self.headers['Content-Length'] = str(l) + elif self.method not in ('GET', 'HEAD'): + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data.""" + + if isinstance(cookies, cookielib.CookieJar): + cookies = cookies + else: + cookies = cookiejar_from_dict(cookies) + + if 'cookie' not in self.headers: + cookie_header = get_cookie_header(cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + def __init__(self): + super(Response, self).__init__() + + self._content = False + self._content_consumed = False + + #: Integer Code of responded HTTP Status. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Requires that ``stream=True` on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta) + self.elapsed = datetime.timedelta(0) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __nonzero__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + try: + self.raise_for_status() + except RequestException: + return False + return True + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the lovely Charade library + (Thanks, Ian!).""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + """ + if self._content_consumed: + # simulate reading small chunks of the content + return iter_slices(self._content, chunk_size) + + def generate(): + while 1: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + self._content_consumed = True + + gen = stream_untransfer(generate(), self) + + if decode_unicode: + gen = stream_decode_response_unicode(gen, self) + + return gen + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, + decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + try: + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + except AttributeError: + self._content = None + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + if Response.encoding is None and chardet module is available, encoding + will be guessed. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + """Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + """ + + if not self.encoding and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + return json.loads(self.content.decode(encoding), **kwargs) + return json.loads(self.text or self.content, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers['link'] + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + + if 400 <= self.status_code < 500: + http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) + + elif 500 <= self.status_code < 600: + http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + return self.raw.release_conn() diff --git a/requests/packages/__init__.py b/requests/packages/__init__.py new file mode 100644 index 0000000..d62c4b7 --- /dev/null +++ b/requests/packages/__init__.py @@ -0,0 +1,3 @@ +from __future__ import absolute_import + +from . import urllib3 diff --git a/requests/packages/charade/__init__.py b/requests/packages/charade/__init__.py new file mode 100644 index 0000000..67c4281 --- /dev/null +++ b/requests/packages/charade/__init__.py @@ -0,0 +1,32 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +__version__ = "1.0.3" +from sys import version_info + + +def detect(aBuf): + if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or + (version_info >= (3, 0) and not isinstance(aBuf, bytes))): + raise ValueError('Expected a bytes object, not a unicode object') + + from . import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/requests/packages/charade/big5freq.py b/requests/packages/charade/big5freq.py new file mode 100644 index 0000000..65bffc0 --- /dev/null +++ b/requests/packages/charade/big5freq.py @@ -0,0 +1,925 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +Big5CharToFreqOrder = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 +#Everything below is of no interest for detection purpose +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 +13968,13969,13970,13971,13972) #13973 + +# flake8: noqa diff --git a/requests/packages/charade/big5prober.py b/requests/packages/charade/big5prober.py new file mode 100644 index 0000000..becce81 --- /dev/null +++ b/requests/packages/charade/big5prober.py @@ -0,0 +1,42 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import Big5SMModel + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(Big5SMModel) + self._mDistributionAnalyzer = Big5DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "Big5" diff --git a/requests/packages/charade/chardistribution.py b/requests/packages/charade/chardistribution.py new file mode 100644 index 0000000..4e64a00 --- /dev/null +++ b/requests/packages/charade/chardistribution.py @@ -0,0 +1,231 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) +from .compat import wrap_ord + +ENOUGH_DATA_THRESHOLD = 1024 +SURE_YES = 0.99 +SURE_NO = 0.01 +MINIMUM_DATA_THRESHOLD = 3 + + +class CharDistributionAnalysis: + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._mCharToFreqOrder = None + self._mTableSize = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self._mTypicalDistributionRatio = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + self._mTotalChars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._mFreqChars = 0 + + def feed(self, aBuf, aCharLen): + """feed a character with known length""" + if aCharLen == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(aBuf) + else: + order = -1 + if order >= 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) + * self._mTypicalDistributionRatio)) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aBuf): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = wrap_ord(aBuf[0]) + if char >= 0xA0: + return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + else: + return -1 diff --git a/requests/packages/charade/charsetgroupprober.py b/requests/packages/charade/charsetgroupprober.py new file mode 100644 index 0000000..85e7a1c --- /dev/null +++ b/requests/packages/charade/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: + return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + continue + st = prober.feed(aBuf) + if not st: + continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: + return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/requests/packages/charade/charsetprober.py b/requests/packages/charade/charsetprober.py new file mode 100644 index 0000000..9758171 --- /dev/null +++ b/requests/packages/charade/charsetprober.py @@ -0,0 +1,62 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import re + + +class CharSetProber: + def __init__(self): + pass + + def reset(self): + self._mState = constants.eDetecting + + def get_charset_name(self): + return None + + def feed(self, aBuf): + pass + + def get_state(self): + return self._mState + + def get_confidence(self): + return 0.0 + + def filter_high_bit_only(self, aBuf): + aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) + return aBuf + + def filter_without_english_letters(self, aBuf): + aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) + return aBuf + + def filter_with_english_letters(self, aBuf): + # TODO + return aBuf diff --git a/requests/packages/charade/codingstatemachine.py b/requests/packages/charade/codingstatemachine.py new file mode 100644 index 0000000..8dd8c91 --- /dev/null +++ b/requests/packages/charade/codingstatemachine.py @@ -0,0 +1,61 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart +from .compat import wrap_ord + + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + # PY3K: aBuf is a byte stream, so c is an int, not a byte + byteCls = self._mModel['classTable'][wrap_ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + curr_state = (self._mCurrentState * self._mModel['classFactor'] + + byteCls) + self._mCurrentState = self._mModel['stateTable'][curr_state] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/requests/packages/charade/compat.py b/requests/packages/charade/compat.py new file mode 100644 index 0000000..d9e30ad --- /dev/null +++ b/requests/packages/charade/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Ian Cordasco - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + base_str = (str, unicode) +else: + base_str = (bytes, str) + + +def wrap_ord(a): + if sys.version_info < (3, 0) and isinstance(a, base_str): + return ord(a) + else: + return a diff --git a/requests/packages/charade/constants.py b/requests/packages/charade/constants.py new file mode 100644 index 0000000..e4d148b --- /dev/null +++ b/requests/packages/charade/constants.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 diff --git a/requests/packages/charade/cp949prober.py b/requests/packages/charade/cp949prober.py new file mode 100644 index 0000000..ff4272f --- /dev/null +++ b/requests/packages/charade/cp949prober.py @@ -0,0 +1,44 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import CP949SMModel + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(CP949SMModel) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "CP949" diff --git a/requests/packages/charade/escprober.py b/requests/packages/charade/escprober.py new file mode 100644 index 0000000..80a844f --- /dev/null +++ b/requests/packages/charade/escprober.py @@ -0,0 +1,86 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, + ISO2022KRSMModel) +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .compat import wrap_ord + + +class EscCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = [ + CodingStateMachine(HZSMModel), + CodingStateMachine(ISO2022CNSMModel), + CodingStateMachine(ISO2022JPSMModel), + CodingStateMachine(ISO2022KRSMModel) + ] + self.reset() + + def reset(self): + CharSetProber.reset(self) + for codingSM in self._mCodingSM: + if not codingSM: + continue + codingSM.active = True + codingSM.reset() + self._mActiveSM = len(self._mCodingSM) + self._mDetectedCharset = None + + def get_charset_name(self): + return self._mDetectedCharset + + def get_confidence(self): + if self._mDetectedCharset: + return 0.99 + else: + return 0.00 + + def feed(self, aBuf): + for c in aBuf: + # PY3K: aBuf is a byte array, so c is an int, not a byte + for codingSM in self._mCodingSM: + if not codingSM: + continue + if not codingSM.active: + continue + codingState = codingSM.next_state(wrap_ord(c)) + if codingState == constants.eError: + codingSM.active = False + self._mActiveSM -= 1 + if self._mActiveSM <= 0: + self._mState = constants.eNotMe + return self.get_state() + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 + return self.get_state() + + return self.get_state() diff --git a/requests/packages/charade/escsm.py b/requests/packages/charade/escsm.py new file mode 100644 index 0000000..bd302b4 --- /dev/null +++ b/requests/packages/charade/escsm.py @@ -0,0 +1,242 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +HZ_cls = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} + +# flake8: noqa diff --git a/requests/packages/charade/eucjpprober.py b/requests/packages/charade/eucjpprober.py new file mode 100644 index 0000000..8e64fdc --- /dev/null +++ b/requests/packages/charade/eucjpprober.py @@ -0,0 +1,90 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJPSMModel + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/requests/packages/charade/euckrfreq.py b/requests/packages/charade/euckrfreq.py new file mode 100644 index 0000000..a179e4c --- /dev/null +++ b/requests/packages/charade/euckrfreq.py @@ -0,0 +1,596 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKRCharToFreqOrder = ( \ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +#Everything below is of no interest for detection purpose +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741) + +# flake8: noqa diff --git a/requests/packages/charade/euckrprober.py b/requests/packages/charade/euckrprober.py new file mode 100644 index 0000000..5982a46 --- /dev/null +++ b/requests/packages/charade/euckrprober.py @@ -0,0 +1,42 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKRSMModel + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCKRSMModel) + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-KR" diff --git a/requests/packages/charade/euctwfreq.py b/requests/packages/charade/euctwfreq.py new file mode 100644 index 0000000..576e750 --- /dev/null +++ b/requests/packages/charade/euctwfreq.py @@ -0,0 +1,428 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 8102 + +EUCTWCharToFreqOrder = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +#Everything below is of no interest for detection purpose +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 + +# flake8: noqa diff --git a/requests/packages/charade/euctwprober.py b/requests/packages/charade/euctwprober.py new file mode 100644 index 0000000..fe652fe --- /dev/null +++ b/requests/packages/charade/euctwprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/requests/packages/charade/gb2312freq.py b/requests/packages/charade/gb2312freq.py new file mode 100644 index 0000000..1238f51 --- /dev/null +++ b/requests/packages/charade/gb2312freq.py @@ -0,0 +1,472 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312CharToFreqOrder = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 +#Everything below is of no interest for detection purpose +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + +# flake8: noqa diff --git a/requests/packages/charade/gb2312prober.py b/requests/packages/charade/gb2312prober.py new file mode 100644 index 0000000..0325a2d --- /dev/null +++ b/requests/packages/charade/gb2312prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312SMModel + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(GB2312SMModel) + self._mDistributionAnalyzer = GB2312DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "GB2312" diff --git a/requests/packages/charade/hebrewprober.py b/requests/packages/charade/hebrewprober.py new file mode 100644 index 0000000..ba225c5 --- /dev/null +++ b/requests/packages/charade/hebrewprober.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe, eDetecting +from .compat import wrap_ord + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = 0xea +NORMAL_KAF = 0xeb +FINAL_MEM = 0xed +NORMAL_MEM = 0xee +FINAL_NUN = 0xef +NORMAL_NUN = 0xf0 +FINAL_PE = 0xf3 +NORMAL_PE = 0xf4 +FINAL_TSADI = 0xf5 +NORMAL_TSADI = 0xf6 + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score +# distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score +# distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, + FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.get_state() == eNotMe: + # Both model probers say it's not them. No reason to continue. + return eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a + # 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if ((self._mBeforePrev == ' ') and + (self.is_final(self._mPrev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return + # eNotMe (handled above) + return eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._mLogicalProber.get_confidence() + - self._mVisualProber.get_confidence()) + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == eNotMe) and \ + (self._mVisualProber.get_state() == eNotMe): + return eNotMe + return eDetecting diff --git a/requests/packages/charade/jisfreq.py b/requests/packages/charade/jisfreq.py new file mode 100644 index 0000000..064345b --- /dev/null +++ b/requests/packages/charade/jisfreq.py @@ -0,0 +1,569 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JISCharToFreqOrder = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +#Everything below is of no interest for detection purpose +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 + +# flake8: noqa diff --git a/requests/packages/charade/jpcntx.py b/requests/packages/charade/jpcntx.py new file mode 100644 index 0000000..f7f69ba --- /dev/null +++ b/requests/packages/charade/jpcntx.py @@ -0,0 +1,219 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .compat import wrap_ord + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + # category counters, each interger counts sequence in its category + self._mRelSample = [0] * NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._mNeedToSkipCharNum = 0 + self._mLastCharOrder = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + + def feed(self, aBuf, aLen): + if self._mDone: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i + 2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aBuf): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): + charLen = 2 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + charLen = 2 + elif first_char == 0x8F: + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, charLen + + return -1, charLen + +# flake8: noqa diff --git a/requests/packages/charade/langbulgarianmodel.py b/requests/packages/charade/langbulgarianmodel.py new file mode 100644 index 0000000..e5788fc --- /dev/null +++ b/requests/packages/charade/langbulgarianmodel.py @@ -0,0 +1,229 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'charToOrderMap': Latin5_BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +Win1251BulgarianModel = { + 'charToOrderMap': win1251BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + + +# flake8: noqa diff --git a/requests/packages/charade/langcyrillicmodel.py b/requests/packages/charade/langcyrillicmodel.py new file mode 100644 index 0000000..a86f54b --- /dev/null +++ b/requests/packages/charade/langcyrillicmodel.py @@ -0,0 +1,329 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM866" +} + +Ibm855Model = { + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM855" +} + +# flake8: noqa diff --git a/requests/packages/charade/langgreekmodel.py b/requests/packages/charade/langgreekmodel.py new file mode 100644 index 0000000..ddb5837 --- /dev/null +++ b/requests/packages/charade/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "windows-1253" +} + +# flake8: noqa diff --git a/requests/packages/charade/langhebrewmodel.py b/requests/packages/charade/langhebrewmodel.py new file mode 100644 index 0000000..75f2bc7 --- /dev/null +++ b/requests/packages/charade/langhebrewmodel.py @@ -0,0 +1,201 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': False, + 'charsetName': "windows-1255" +} + +# flake8: noqa diff --git a/requests/packages/charade/langhungarianmodel.py b/requests/packages/charade/langhungarianmodel.py new file mode 100644 index 0000000..49d2f0f --- /dev/null +++ b/requests/packages/charade/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "windows-1250" +} + +# flake8: noqa diff --git a/requests/packages/charade/langthaimodel.py b/requests/packages/charade/langthaimodel.py new file mode 100644 index 0000000..0508b1b --- /dev/null +++ b/requests/packages/charade/langthaimodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': False, + 'charsetName': "TIS-620" +} + +# flake8: noqa diff --git a/requests/packages/charade/latin1prober.py b/requests/packages/charade/latin1prober.py new file mode 100644 index 0000000..ad695f5 --- /dev/null +++ b/requests/packages/charade/latin1prober.py @@ -0,0 +1,139 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe +from .compat import wrap_ord + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( + # UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[wrap_ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + + charClass] + if freq == 0: + self._mState = eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == eNotMe: + return 0.01 + + total = sum(self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._mFreqCounter[3] / total) + - (self._mFreqCounter[1] * 20.0 / total)) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.5 + return confidence diff --git a/requests/packages/charade/mbcharsetprober.py b/requests/packages/charade/mbcharsetprober.py new file mode 100644 index 0000000..bb42f2f --- /dev/null +++ b/requests/packages/charade/mbcharsetprober.py @@ -0,0 +1,86 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber + + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = [0, 0] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = [0, 0] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mDistributionAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/requests/packages/charade/mbcsgroupprober.py b/requests/packages/charade/mbcsgroupprober.py new file mode 100644 index 0000000..03c9dcf --- /dev/null +++ b/requests/packages/charade/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/requests/packages/charade/mbcssm.py b/requests/packages/charade/mbcssm.py new file mode 100644 index 0000000..3f93cfb --- /dev/null +++ b/requests/packages/charade/mbcssm.py @@ -0,0 +1,575 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +# BIG5 + +BIG5_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 +) + +Big5CharLenTable = (0, 1, 1, 2, 0) + +Big5SMModel = {'classTable': BIG5_cls, + 'classFactor': 5, + 'stateTable': BIG5_st, + 'charLenTable': Big5CharLenTable, + 'name': 'Big5'} + +# CP949 + +CP949_cls = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_st = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart + eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe + eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 + eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 +) + +CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949SMModel = {'classTable': CP949_cls, + 'classFactor': 10, + 'stateTable': CP949_st, + 'charLenTable': CP949CharLenTable, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_cls = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_st = ( + 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 + eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f + 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 +) + +EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) + +EUCJPSMModel = {'classTable': EUCJP_cls, + 'classFactor': 6, + 'stateTable': EUCJP_st, + 'charLenTable': EUCJPCharLenTable, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_st = ( + eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 + eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f +) + +EUCKRCharLenTable = (0, 1, 2, 0) + +EUCKRSMModel = {'classTable': EUCKR_cls, + 'classFactor': 4, + 'stateTable': EUCKR_st, + 'charLenTable': EUCKRCharLenTable, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_cls = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_st = ( + eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 + eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f + 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 + eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) + +EUCTWSMModel = {'classTable': EUCTW_cls, + 'classFactor': 7, + 'stateTable': EUCTW_st, + 'charLenTable': EUCTWCharLenTable, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_st = ( + eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 + 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f + eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validing +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) + +GB2312SMModel = {'classTable': GB2312_cls, + 'classFactor': 7, + 'stateTable': GB2312_st, + 'charLenTable': GB2312CharLenTable, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 4,4,4,4,4,4,4,4, # f0 - f7 + 4,4,4,4,4,0,0,0 # f8 - ff +) + + +SJIS_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 +) + +SJISCharLenTable = (0, 1, 1, 2, 0, 0) + +SJISSMModel = {'classTable': SJIS_cls, + 'classFactor': 6, + 'stateTable': SJIS_st, + 'charLenTable': SJISCharLenTable, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_st = ( + 5, 7, 7,eError, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 + 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,eError,#20-27 + 5, 8, 6, 6,eError, 6, 6, 6,#28-2f + 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 +) + +UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) + +UCS2BESMModel = {'classTable': UCS2BE_cls, + 'classFactor': 6, + 'stateTable': UCS2BE_st, + 'charLenTable': UCS2BECharLenTable, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_st = ( + 6, 6, 7, 6, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 + 5, 5, 5,eError, 5,eError, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,eError,#20-27 + 5, 5, 5,eError,eError,eError, 5, 5,#28-2f + 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 +) + +UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) + +UCS2LESMModel = {'classTable': UCS2LE_cls, + 'classFactor': 6, + 'stateTable': UCS2LE_st, + 'charLenTable': UCS2LECharLenTable, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_st = ( + eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + eError,eError,eError,eError,eError,eError,eError,eError,#10-17 + eError,eError,eError,eError,eError,eError,eError,eError,#18-1f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f + eError,eError, 5, 5, 5, 5,eError,eError,#30-37 + eError,eError,eError,eError,eError,eError,eError,eError,#38-3f + eError,eError,eError, 5, 5, 5,eError,eError,#40-47 + eError,eError,eError,eError,eError,eError,eError,eError,#48-4f + eError,eError, 7, 7, 7, 7,eError,eError,#50-57 + eError,eError,eError,eError,eError,eError,eError,eError,#58-5f + eError,eError,eError,eError, 7, 7,eError,eError,#60-67 + eError,eError,eError,eError,eError,eError,eError,eError,#68-6f + eError,eError, 9, 9, 9, 9,eError,eError,#70-77 + eError,eError,eError,eError,eError,eError,eError,eError,#78-7f + eError,eError,eError,eError,eError, 9,eError,eError,#80-87 + eError,eError,eError,eError,eError,eError,eError,eError,#88-8f + eError,eError, 12, 12, 12, 12,eError,eError,#90-97 + eError,eError,eError,eError,eError,eError,eError,eError,#98-9f + eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 + eError,eError,eError,eError,eError,eError,eError,eError,#a8-af + eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 + eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf + eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 + eError,eError,eError,eError,eError,eError,eError,eError #c8-cf +) + +UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8SMModel = {'classTable': UTF8_cls, + 'classFactor': 16, + 'stateTable': UTF8_st, + 'charLenTable': UTF8CharLenTable, + 'name': 'UTF-8'} + +# flake8: noqa diff --git a/requests/packages/charade/sbcharsetprober.py b/requests/packages/charade/sbcharsetprober.py new file mode 100644 index 0000000..37291bd --- /dev/null +++ b/requests/packages/charade/sbcharsetprober.py @@ -0,0 +1,120 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber +from .compat import wrap_ord + +SAMPLE_SIZE = 64 +SB_ENOUGH_REL_THRESHOLD = 1024 +POSITIVE_SHORTCUT_THRESHOLD = 0.95 +NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +SYMBOL_CAT_ORDER = 250 +NUMBER_OF_SEQ_CAT = 4 +POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 +#NEGATIVE_CAT = 0 + + +class SingleByteCharSetProber(CharSetProber): + def __init__(self, model, reversed=False, nameProber=None): + CharSetProber.__init__(self) + self._mModel = model + # TRUE if we need to reverse every pair in the model lookup + self._mReversed = reversed + # Optional auxiliary prober for name decision + self._mNameProber = nameProber + self.reset() + + def reset(self): + CharSetProber.reset(self) + # char order of last character + self._mLastOrder = 255 + self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT + self._mTotalSeqs = 0 + self._mTotalChar = 0 + # characters that fall in our sampling range + self._mFreqChar = 0 + + def get_charset_name(self): + if self._mNameProber: + return self._mNameProber.get_charset_name() + else: + return self._mModel['charsetName'] + + def feed(self, aBuf): + if not self._mModel['keepEnglishLetter']: + aBuf = self.filter_without_english_letters(aBuf) + aLen = len(aBuf) + if not aLen: + return self.get_state() + for c in aBuf: + order = self._mModel['charToOrderMap'][wrap_ord(c)] + if order < SYMBOL_CAT_ORDER: + self._mTotalChar += 1 + if order < SAMPLE_SIZE: + self._mFreqChar += 1 + if self._mLastOrder < SAMPLE_SIZE: + self._mTotalSeqs += 1 + if not self._mReversed: + i = (self._mLastOrder * SAMPLE_SIZE) + order + model = self._mModel['precedenceMatrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * SAMPLE_SIZE) + self._mLastOrder + model = self._mModel['precedenceMatrix'][i] + self._mSeqCounters[model] += 1 + self._mLastOrder = order + + if self.get_state() == constants.eDetecting: + if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a' + 'winner\n' % + (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative' + 'shortcut threshhold %s\n' % + (self._mModel['charsetName'], cf, + NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: + r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs + / self._mModel['mTypicalPositiveRatio']) + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/requests/packages/charade/sbcsgroupprober.py b/requests/packages/charade/sbcsgroupprober.py new file mode 100644 index 0000000..1b6196c --- /dev/null +++ b/requests/packages/charade/sbcsgroupprober.py @@ -0,0 +1,69 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, + visualHebrewProber]) + + self.reset() diff --git a/requests/packages/charade/sjisprober.py b/requests/packages/charade/sjisprober.py new file mode 100644 index 0000000..b173614 --- /dev/null +++ b/requests/packages/charade/sjisprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJISSMModel +from . import constants + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(SJISSMModel) + self._mDistributionAnalyzer = SJISDistributionAnalysis() + self._mContextAnalyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "SHIFT_JIS" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], + charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 + - charLen], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/requests/packages/charade/universaldetector.py b/requests/packages/charade/universaldetector.py new file mode 100644 index 0000000..6307155 --- /dev/null +++ b/requests/packages/charade/universaldetector.py @@ -0,0 +1,172 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +import codecs +from .latin1prober import Latin1Prober # windows-1252 +from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets +from .sbcsgroupprober import SBCSGroupProber # single-byte character sets +from .escprober import EscCharSetProber # ISO-2122, etc. +import re + +MINIMUM_THRESHOLD = 0.20 +ePureAscii = 0 +eEscAscii = 1 +eHighbyte = 2 + + +class UniversalDetector: + def __init__(self): + self._highBitDetector = re.compile(b'[\x80-\xFF]') + self._escDetector = re.compile(b'(\033|~{)') + self._mEscCharSetProber = None + self._mCharSetProbers = [] + self.reset() + + def reset(self): + self.result = {'encoding': None, 'confidence': 0.0} + self.done = False + self._mStart = True + self._mGotData = False + self._mInputState = ePureAscii + self._mLastChar = b'' + if self._mEscCharSetProber: + self._mEscCharSetProber.reset() + for prober in self._mCharSetProbers: + prober.reset() + + def feed(self, aBuf): + if self.done: + return + + aLen = len(aBuf) + if not aLen: + return + + if not self._mGotData: + # If the data starts with BOM, we know it is UTF + if aBuf[:3] == codecs.BOM: + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8", 'confidence': 1.0} + elif aBuf[:4] == codecs.BOM_UTF32_LE: + # FF FE 00 00 UTF-32, little-endian BOM + self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} + elif aBuf[:4] == codecs.BOM_UTF32_BE: + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} + elif aBuf[:4] == b'\xFE\xFF\x00\x00': + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0 + } + elif aBuf[:4] == b'\x00\x00\xFF\xFE': + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0 + } + elif aBuf[:2] == codecs.BOM_LE: + # FF FE UTF-16, little endian BOM + self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} + elif aBuf[:2] == codecs.BOM_BE: + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + + self._mGotData = True + if self.result['encoding'] and (self.result['confidence'] > 0.0): + self.done = True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif ((self._mInputState == ePureAscii) and + self._escDetector.search(self._mLastChar + aBuf)): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1:] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = { + 'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence() + } + self.done = True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), + Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = True + break + + def close(self): + if self.done: + return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: + continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: + continue + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), + prober.get_confidence())) diff --git a/requests/packages/charade/utf8prober.py b/requests/packages/charade/utf8prober.py new file mode 100644 index 0000000..1c0bb5d --- /dev/null +++ b/requests/packages/charade/utf8prober.py @@ -0,0 +1,76 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == constants.eError: + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/requests/packages/urllib3/__init__.py b/requests/packages/urllib3/__init__.py new file mode 100644 index 0000000..55de87e --- /dev/null +++ b/requests/packages/urllib3/__init__.py @@ -0,0 +1,58 @@ +# urllib3/__init__.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = 'dev' + + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util import make_headers, get_host + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added an stderr logging handler to logger: %s' % __name__) + return handler + +# ... Clean up. +del NullHandler diff --git a/requests/packages/urllib3/_collections.py b/requests/packages/urllib3/_collections.py new file mode 100644 index 0000000..a052b1d --- /dev/null +++ b/requests/packages/urllib3/_collections.py @@ -0,0 +1,94 @@ +# urllib3/_collections.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from collections import MutableMapping +from threading import Lock + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict + + +__all__ = ['RecentlyUsedContainer'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self._lock = Lock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self._lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self._lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self._lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self._lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self._lock: + # Copy pointers to all values, then wipe the mapping + # under Python 2, this copies the list of values twice :-| + values = list(self._container.values()) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self._lock: + return self._container.keys() diff --git a/requests/packages/urllib3/connectionpool.py b/requests/packages/urllib3/connectionpool.py new file mode 100644 index 0000000..f93e2df --- /dev/null +++ b/requests/packages/urllib3/connectionpool.py @@ -0,0 +1,595 @@ +# urllib3/connectionpool.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import logging +import socket +import errno + +from socket import error as SocketError, timeout as SocketTimeout +from .util import resolve_cert_reqs, resolve_ssl_version, assert_fingerprint + +try: # Python 3 + from http.client import HTTPConnection, HTTPException + from http.client import HTTP_PORT, HTTPS_PORT +except ImportError: + from httplib import HTTPConnection, HTTPException + from httplib import HTTP_PORT, HTTPS_PORT + +try: # Python 3 + from queue import LifoQueue, Empty, Full +except ImportError: + from Queue import LifoQueue, Empty, Full + + +try: # Compiled with SSL? + HTTPSConnection = object + BaseSSLError = None + ssl = None + + try: # Python 3 + from http.client import HTTPSConnection + except ImportError: + from httplib import HTTPSConnection + + import ssl + BaseSSLError = ssl.SSLError + +except (ImportError, AttributeError): # Platform-specific: No SSL. + pass + + +from .request import RequestMethods +from .response import HTTPResponse +from .util import get_host, is_connection_dropped, ssl_wrap_socket +from .exceptions import ( + ClosedPoolError, + EmptyPoolError, + HostChangedError, + MaxRetryError, + SSLError, + TimeoutError, +) + +from .packages.ssl_match_hostname import match_hostname, CertificateError +from .packages import six + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + +port_by_scheme = { + 'http': HTTP_PORT, + 'https': HTTPS_PORT, +} + + +## Connection objects (extension of httplib) + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ssl_version = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None): + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def connect(self): + # Add certificate verification + sock = socket.create_connection((self.host, self.port), self.timeout) + + resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) + resolved_ssl_version = resolve_ssl_version(self.ssl_version) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=resolved_cert_reqs, + ca_certs=self.ca_certs, + server_hostname=self.host, + ssl_version=resolved_ssl_version) + + if resolved_cert_reqs != ssl.CERT_NONE: + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + else: + match_hostname(self.sock.getpeercert(), + self.assert_hostname or self.host) + +## Pool objects + +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + self.host = host + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + :param timeout: + Socket timeout for each individual connection, can be a float. None + disables timeout. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to false, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + scheme = 'http' + + def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1, + block=False, headers=None): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + self.timeout = timeout + self.pool = self.QueueCls(maxsize) + self.block = block + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPConnection`. + """ + self.num_connections += 1 + log.info("Starting new HTTP connection (%d): %s" % + (self.num_connections, self.host)) + return HTTPConnection(host=self.host, + port=self.port, + strict=self.strict) + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.info("Resetting dropped connection: %s" % self.host) + conn.close() + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except Full: + # This should never happen if self.block == True + log.warning("HttpConnectionPool is full, discarding connection: %s" + % self.host) + + # Connection never got put back into the pool, close it. + conn.close() + + def _make_request(self, conn, method, url, timeout=_Default, + **httplib_request_kw): + """ + Perform a request on a given httplib connection object taken from our + pool. + """ + self.num_requests += 1 + + if timeout is _Default: + timeout = self.timeout + + conn.timeout = timeout # This only does anything in Py26+ + conn.request(method, url, **httplib_request_kw) + + # Set timeout + sock = getattr(conn, 'sock', False) # AppEngine doesn't have sock attr. + if sock: + sock.settimeout(timeout) + + try: # Python 2.7+, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 2.6 and older + httplib_response = conn.getresponse() + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, + httplib_response.status, + httplib_response.length)) + return httplib_response + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + if self.port and not port: + # Use explicit default port for comparison when none is given. + port = port_by_scheme.get(scheme) + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Number of retries to allow before raising a MaxRetryError exception. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307). Each redirect counts as a retry. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one request. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param \**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if retries < 0: + raise MaxRetryError(self, url) + + if timeout is _Default: + timeout = self.timeout + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + host = "%s://%s" % (self.scheme, self.host) + if self.port: + host = "%s:%d" % (host, self.port) + + raise HostChangedError(self, url, retries - 1) + + conn = None + + try: + # Request a connection from the queue + conn = self._get_conn(timeout=pool_timeout) + + # Make the request on the httplib connection object + httplib_response = self._make_request(conn, method, url, + timeout=timeout, + body=body, headers=headers) + + # If we're going to release the connection in ``finally:``, then + # the request doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = not release_conn and conn + + # Import httplib's response into our own wrapper object + response = HTTPResponse.from_httplib(httplib_response, + pool=self, + connection=response_conn, + **response_kw) + + # else: + # The connection will be put back into the pool when + # ``response.release_conn()`` is called (implicitly by + # ``response.read()``) + + except Empty as e: + # Timed out by queue + raise TimeoutError(self, "Request timed out. (pool_timeout=%s)" % + pool_timeout) + + except SocketTimeout as e: + # Timed out by socket + raise TimeoutError(self, "Request timed out. (timeout=%s)" % + timeout) + + except BaseSSLError as e: + # SSL certificate error + raise SSLError(e) + + except CertificateError as e: + # Name mismatch + raise SSLError(e) + + except (HTTPException, SocketError) as e: + # Connection broken, discard. It will be replaced next _get_conn(). + conn = None + # This is necessary so we can access e below + err = e + + if retries == 0: + raise MaxRetryError(self, url, e) + + finally: + if release_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warn("Retrying (%d attempts remain) after connection " + "broken by '%r': %s" % (retries, err, url)) + return self.urlopen(method, url, body, headers, retries - 1, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + log.info("Redirecting %s -> %s" % (url, redirect_location)) + return self.urlopen(method, redirect_location, body, headers, + retries - 1, redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`httplib.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and + ``ssl_version`` are only used if :mod:`ssl` is available and are fed into + :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket + into an SSL socket. + """ + + scheme = 'https' + + def __init__(self, host, port=None, + strict=False, timeout=None, maxsize=1, + block=False, headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None): + + HTTPConnectionPool.__init__(self, host, port, + strict, timeout, maxsize, + block, headers) + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.info("Starting new HTTPS connection (%d): %s" + % (self.num_connections, self.host)) + + if not ssl: # Platform-specific: Python compiled without +ssl + if not HTTPSConnection or HTTPSConnection is object: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + return HTTPSConnection(host=self.host, + port=self.port, + strict=self.strict) + + connection = VerifiedHTTPSConnection(host=self.host, + port=self.port, + strict=self.strict) + connection.set_cert(key_file=self.key_file, cert_file=self.cert_file, + cert_reqs=self.cert_reqs, ca_certs=self.ca_certs, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + + connection.ssl_version = self.ssl_version + + return connection + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example: :: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) diff --git a/requests/packages/urllib3/contrib/__init__.py b/requests/packages/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/requests/packages/urllib3/contrib/ntlmpool.py b/requests/packages/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..bb41fd1 --- /dev/null +++ b/requests/packages/urllib3/contrib/ntlmpool.py @@ -0,0 +1,120 @@ +# urllib3/contrib/ntlmpool.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" + +try: + from http.client import HTTPSConnection +except ImportError: + from httplib import HTTPSConnection +from logging import getLogger +from ntlm import ntlm + +from urllib3 import HTTPSConnectionPool + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' % + (self.num_connections, self.host, self.authurl)) + + headers = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s' % headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s' % (res.status, res.reason)) + log.debug('Response headers: %s' % reshdr) + log.debug('Response data: %s [...]' % res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s' % headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s' % (res.status, res.reason)) + log.debug('Response headers: %s' % dict(res.getheaders())) + log.debug('Response data: %s [...]' % res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/requests/packages/urllib3/contrib/pyopenssl.py b/requests/packages/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..5c4c6d8 --- /dev/null +++ b/requests/packages/urllib3/contrib/pyopenssl.py @@ -0,0 +1,167 @@ +'''SSL with SNI-support for Python 2. + +This needs the following packages installed: + +* pyOpenSSL (tested with 0.13) +* ndg-httpsclient (tested with 0.3.2) +* pyasn1 (tested with 0.1.6) + +To activate it call :func:`~urllib3.contrib.pyopenssl.inject_into_urllib3`. +This can be done in a ``sitecustomize`` module, or at any other time before +your application begins using ``urllib3``, like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. +''' + +from ndg.httpsclient.ssl_peer_verification import (ServerSSLCertVerification, + SUBJ_ALT_NAME_SUPPORT) +from ndg.httpsclient.subj_alt_name import SubjectAltName +import OpenSSL.SSL +from pyasn1.codec.der import decoder as der_decoder +from socket import _fileobject +import ssl + +from .. import connectionpool +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI only *really* works if we can read the subjectAltName of certificates. +HAS_SNI = SUBJ_ALT_NAME_SUPPORT + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} +_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER + + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} + + +orig_util_HAS_SNI = util.HAS_SNI +orig_connectionpool_ssl_wrap_socket = connectionpool.ssl_wrap_socket + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + connectionpool.ssl_wrap_socket = ssl_wrap_socket + util.HAS_SNI = HAS_SNI + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + connectionpool.ssl_wrap_socket = orig_connectionpool_ssl_wrap_socket + util.HAS_SNI = orig_util_HAS_SNI + + +### Note: This is a slightly bug-fixed version of same from ndg-httpsclient. +def get_subj_alt_name(peer_cert): + # Search through extensions + dns_name = [] + if not SUBJ_ALT_NAME_SUPPORT: + return dns_name + + general_names = SubjectAltName() + for i in range(peer_cert.get_extension_count()): + ext = peer_cert.get_extension(i) + ext_name = ext.get_short_name() + if ext_name != 'subjectAltName': + continue + + # PyOpenSSL returns extension data in ASN.1 encoded form + ext_dat = ext.get_data() + decoded_dat = der_decoder.decode(ext_dat, + asn1Spec=general_names) + + for name in decoded_dat: + if not isinstance(name, SubjectAltName): + continue + for entry in range(len(name)): + component = name.getComponentByPosition(entry) + if component.getName() != 'dNSName': + continue + dns_name.append(str(component.getComponent())) + + return dns_name + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class.''' + + def __init__(self, connection, socket): + self.connection = connection + self.socket = socket + + def makefile(self, mode, bufsize=-1): + return _fileobject(self.connection, mode, bufsize) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def sendall(self, data): + return self.connection.sendall(data) + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + if not x509: + raise ssl.SSLError('') + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': [ + ('DNS', value) + for value in get_subj_alt_name(x509) + ] + } + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version]) + if certfile: + ctx.use_certificate_file(certfile) + if keyfile: + ctx.use_privatekey_file(keyfile) + if cert_reqs != ssl.CERT_NONE: + ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback) + if ca_certs: + try: + ctx.load_verify_locations(ca_certs, None) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e) + + cnx = OpenSSL.SSL.Connection(ctx, sock) + cnx.set_tlsext_host_name(server_hostname) + cnx.set_connect_state() + try: + cnx.do_handshake() + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake', e) + + return WrappedSocket(cnx, sock) diff --git a/requests/packages/urllib3/exceptions.py b/requests/packages/urllib3/exceptions.py new file mode 100644 index 0000000..c5eb962 --- /dev/null +++ b/requests/packages/urllib3/exceptions.py @@ -0,0 +1,87 @@ +# urllib3/exceptions.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +## Base Exceptions + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +## Leaf Exceptions + +class MaxRetryError(PoolError): + "Raised when the maximum number of retries is exceeded." + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s" % url + if reason: + message += " (Caused by %s: %s)" % (type(reason), reason) + else: + message += " (Caused by redirect)" + + PoolError.__init__(self, pool, message) + self.url = url + + +class HostChangedError(PoolError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + PoolError.__init__(self, pool, message) + + self.url = url + self.retries = retries + + +class TimeoutError(PoolError): + "Raised when a socket timeout occurs." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationParseError(ValueError, HTTPError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location diff --git a/requests/packages/urllib3/filepost.py b/requests/packages/urllib3/filepost.py new file mode 100644 index 0000000..8d900bd --- /dev/null +++ b/requests/packages/urllib3/filepost.py @@ -0,0 +1,98 @@ +# urllib3/filepost.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import codecs +import mimetypes + +from uuid import uuid4 +from io import BytesIO + +from .packages import six +from .packages.six import b + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarassingly-simple replacement for mimetools.choose_boundary. + """ + return uuid4().hex + + +def get_content_type(filename): + return mimetypes.guess_type(filename)[0] or 'application/octet-stream' + + +def iter_fields(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, value) or (key, value, MIME type) + field tuples. The key is treated as the field name, and the value as + the body of the form-data bytes. If the value is a tuple of two + elements, then the first element is treated as the filename of the + form-data section and a suitable MIME type is guessed based on the + filename. If the value is a tuple of three elements, then the third + element is treated as an explicit MIME type of the form-data section. + + Field names and filenames must be unicode. + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for fieldname, value in iter_fields(fields): + body.write(b('--%s\r\n' % (boundary))) + + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = get_content_type(filename) + writer(body).write('Content-Disposition: form-data; name="%s"; ' + 'filename="%s"\r\n' % (fieldname, filename)) + body.write(b('Content-Type: %s\r\n\r\n' % + (content_type,))) + else: + data = value + writer(body).write('Content-Disposition: form-data; name="%s"\r\n' + % (fieldname)) + body.write(b'\r\n') + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = b('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/requests/packages/urllib3/packages/__init__.py b/requests/packages/urllib3/packages/__init__.py new file mode 100644 index 0000000..37e8351 --- /dev/null +++ b/requests/packages/urllib3/packages/__init__.py @@ -0,0 +1,4 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + diff --git a/requests/packages/urllib3/packages/ordered_dict.py b/requests/packages/urllib3/packages/ordered_dict.py new file mode 100644 index 0000000..7f8ee15 --- /dev/null +++ b/requests/packages/urllib3/packages/ordered_dict.py @@ -0,0 +1,260 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ + +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/requests/packages/urllib3/packages/six.py b/requests/packages/urllib3/packages/six.py new file mode 100644 index 0000000..27d8011 --- /dev/null +++ b/requests/packages/urllib3/packages/six.py @@ -0,0 +1,385 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +#Copyright (c) 2010-2011 Benjamin Peterson + +#Permission is hereby granted, free of charge, to any person obtaining a copy of +#this software and associated documentation files (the "Software"), to deal in +#the Software without restriction, including without limitation the rights to +#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +#the Software, and to permit persons to whom the Software is furnished to do so, +#subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in all +#copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.2.0" # Revision 41c74fef2ded + + +# True if we are running on Python 3. +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) + # This is a bit ugly, but it avoids running this again. + delattr(tp, self.name) + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + + +class _MovedItems(types.ModuleType): + """Lazy loading of moved objects""" + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) +del attr + +moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_code = "__code__" + _func_defaults = "__defaults__" + + _iterkeys = "keys" + _itervalues = "values" + _iteritems = "items" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_code = "func_code" + _func_defaults = "func_defaults" + + _iterkeys = "iterkeys" + _itervalues = "itervalues" + _iteritems = "iteritems" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +if PY3: + def get_unbound_function(unbound): + return unbound + + Iterator = object + + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) +else: + def get_unbound_function(unbound): + return unbound.im_func + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) + + +def iterkeys(d): + """Return an iterator over the keys of a dictionary.""" + return iter(getattr(d, _iterkeys)()) + +def itervalues(d): + """Return an iterator over the values of a dictionary.""" + return iter(getattr(d, _itervalues)()) + +def iteritems(d): + """Return an iterator over the (key, value) pairs of a dictionary.""" + return iter(getattr(d, _iteritems)()) + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + def u(s): + return unicode(s, "unicode_escape") + int2byte = chr + import StringIO + StringIO = BytesIO = StringIO.StringIO +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +if PY3: + import builtins + exec_ = getattr(builtins, "exec") + + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + + print_ = getattr(builtins, "print") + del builtins + +else: + def exec_(code, globs=None, locs=None): + """Execute code in a namespace.""" + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + + def print_(*args, **kwargs): + """The new-style print function.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +_add_doc(reraise, """Reraise an exception.""") + + +def with_metaclass(meta, base=object): + """Create a base class with a metaclass.""" + return meta("NewBase", (base,), {}) diff --git a/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..9560b04 --- /dev/null +++ b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,61 @@ +"""The match_hostname() function from Python 3.2, essential when using SSL.""" + +import re + +__version__ = '3.2.2' + +class CertificateError(ValueError): + pass + +def _dnsname_to_pat(dn): + pats = [] + for frag in dn.split(r'.'): + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/requests/packages/urllib3/poolmanager.py b/requests/packages/urllib3/poolmanager.py new file mode 100644 index 0000000..64a7b5d --- /dev/null +++ b/requests/packages/urllib3/poolmanager.py @@ -0,0 +1,191 @@ +# urllib3/poolmanager.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import connection_from_url, port_by_scheme +from .request import RequestMethods +from .util import parse_url + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version') + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example: :: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + def _new_pool(self, scheme, host, port): + """ + Create a new :class:`ConnectionPool` based on host, port and scheme. + + This method is used to actually create the connection pools handed out + by :meth:`connection_from_url` and companion methods. It is intended + to be overridden for customization. + """ + pool_cls = pool_classes_by_scheme[scheme] + kwargs = self.connection_pool_kw + if scheme == 'http': + kwargs = self.connection_pool_kw.copy() + for kw in SSL_KEYWORDS: + kwargs.pop(kw, None) + + return pool_cls(host, port, **kwargs) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http'): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. + """ + scheme = scheme or 'http' + port = port or port_by_scheme.get(scheme, 80) + + pool_key = (scheme, host, port) + + # If the scheme, host, or port doesn't match existing open connections, + # open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + pool = self._new_pool(scheme, host, port) + self.pools[pool_key] = pool + return pool + + def connection_from_url(self, url): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url` but + doesn't pass any additional parameters to the + :class:`urllib3.connectionpool.ConnectionPool` constructor. + + Additional parameters are taken from the :class:`.PoolManager` + constructor. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + if response.status == 303: + method = 'GET' + + log.info("Redirecting %s -> %s" % (url, redirect_location)) + kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(RequestMethods): + """ + Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method + will make requests to any url through the defined proxy. The ProxyManager + class will automatically set the 'Host' header if it is not provided. + """ + + def __init__(self, proxy_pool): + self.proxy_pool = proxy_pool + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + host = parse_url(url).host + if host: + headers_['Host'] = host + + if headers: + headers_.update(headers) + + return headers_ + + def urlopen(self, method, url, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + kw['assert_same_host'] = False + kw['headers'] = self._set_proxy_headers(url, headers=kw.get('headers')) + return self.proxy_pool.urlopen(method, url, **kw) + + +def proxy_from_url(url, **pool_kw): + proxy_pool = connection_from_url(url, **pool_kw) + return ProxyManager(proxy_pool) diff --git a/requests/packages/urllib3/request.py b/requests/packages/urllib3/request.py new file mode 100644 index 0000000..2b4704e --- /dev/null +++ b/requests/packages/urllib3/request.py @@ -0,0 +1,142 @@ +# urllib3/request.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +try: + from urllib.parse import urlencode +except ImportError: + from urllib import urlencode + +from .filepost import encode_multipart_formdata + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are encoded + in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-orm-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE']) + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplemented("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the option + to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if fields: + url += '?' + urlencode(fields) + return self.urlopen(method, url, **urlopen_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the + payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request signing, + such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example: :: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will be + overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if encode_multipart: + body, content_type = encode_multipart_formdata(fields or {}, + boundary=multipart_boundary) + else: + body, content_type = (urlencode(fields or {}), + 'application/x-www-form-urlencoded') + + if headers is None: + headers = self.headers + + headers_ = {'Content-Type': content_type} + headers_.update(headers) + + return self.urlopen(method, url, body=body, headers=headers_, + **urlopen_kw) diff --git a/requests/packages/urllib3/response.py b/requests/packages/urllib3/response.py new file mode 100644 index 0000000..0761dc0 --- /dev/null +++ b/requests/packages/urllib3/response.py @@ -0,0 +1,214 @@ +# urllib3/response.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import gzip +import logging +import zlib + +from io import BytesIO + +from .exceptions import DecodeError +from .packages.six import string_types as basestring + + +log = logging.getLogger(__name__) + + +def decode_gzip(data): + gzipper = gzip.GzipFile(fileobj=BytesIO(data)) + return gzipper.read() + + +def decode_deflate(data): + try: + return zlib.decompress(data) + except zlib.error: + return zlib.decompress(data, -zlib.MAX_WBITS) + + +class HTTPResponse(object): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + """ + + CONTENT_DECODERS = { + 'gzip': decode_gzip, + 'deflate': decode_deflate, + } + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None): + self.headers = headers or {} + self.status = status + self.version = version + self.reason = reason + self.strict = strict + + self._decode_content = decode_content + self._body = body if body and isinstance(body, basestring) else None + self._fp = None + self._original_response = original_response + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in [301, 302, 303, 307]: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, decoding and caching + is skipped because we can't decode partial content nor does it make + sense to cache partial content as the full response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. (Overridden if ``amt`` is set.) + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + # Note: content-encoding value should be case-insensitive, per RFC 2616 + # Section 3.5 + content_encoding = self.headers.get('content-encoding', '').lower() + decoder = self.CONTENT_DECODERS.get(content_encoding) + if decode_content is None: + decode_content = self._decode_content + + if self._fp is None: + return + + try: + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + else: + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do not + # properly close the connection in all cases. There is no harm + # in redundantly calling close. + self._fp.close() + return data + + try: + if decode_content and decoder: + data = decoder(data) + except (IOError, zlib.error): + raise DecodeError("Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding) + + if cache_content: + self._body = data + + return data + + finally: + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + + # Normalize headers between different versions of Python + headers = {} + for k, v in r.getheaders(): + # Python 3: Header keys are returned capitalised + k = k.lower() + + has_value = headers.get(k) + if has_value: # Python 3: Repeating header keys are unmerged. + v = ', '.join([has_value, v]) + + headers[k] = v + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + return ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) diff --git a/requests/packages/urllib3/util.py b/requests/packages/urllib3/util.py new file mode 100644 index 0000000..681cb6c --- /dev/null +++ b/requests/packages/urllib3/util.py @@ -0,0 +1,378 @@ +# urllib3/util.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +from base64 import b64encode +from collections import namedtuple +from socket import error as SocketError +from hashlib import md5, sha1 +from binascii import hexlify, unhexlify + +try: + from select import poll, POLLIN +except ImportError: # `poll` doesn't exist on OSX and other platforms + poll = False + try: + from select import select + except ImportError: # `select` doesn't exist on AppEngine. + select = False + +try: # Test for SSL features + SSLContext = None + HAS_SNI = False + + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import SSLContext # Modern SSL? + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +from .packages import six +from .exceptions import LocationParseError, SSLError + + +class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. + """ + slots = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example: :: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx+1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example: :: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this imeplementations does silly things to be optimal + # on CPython. + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + auth, url = url.split('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url[1:].split(']', 1) + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if not port.isdigit(): + raise LocationParseError("Failed to parse: %s" % url) + + port = int(port) + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`.parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + Example: :: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = 'gzip,deflate' + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(six.b(basic_auth)).decode('utf-8') + + return headers + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if not sock: # Platform-specific: AppEngine + return False + + if not poll: + if not select: # Platform-specific: AppEngine + return False + + try: + return select([sock], [], [], 0.0)[0] + except SocketError: + return True + + # This version is better on platforms that support it. + p = poll() + p.register(sock, POLLIN) + for (fno, ev) in p.poll(0.0): + if fno == sock.fileno(): + # Either data is buffered (bad), or the connection is dropped. + return True + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + # Maps the length of a digest to a possible hash function producing + # this digest. + hashfunc_map = { + 16: md5, + 20: sha1 + } + + fingerprint = fingerprint.replace(':', '').lower() + + digest_length, rest = divmod(len(fingerprint), 2) + + if rest or digest_length not in hashfunc_map: + raise SSLError('Fingerprint is of invalid length.') + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + hashfunc = hashfunc_map[digest_length] + + cert_digest = hashfunc(cert).digest() + + if not cert_digest == fingerprint_bytes: + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(hexlify(fingerprint_bytes), + hexlify(cert_digest))) + + +if SSLContext is not None: # Python 3.2+ + def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + """ + All arguments except `server_hostname` have the same meaning as for + :func:`ssl.wrap_socket` + + :param server_hostname: + Hostname of the expected certificate + """ + context = SSLContext(ssl_version) + context.verify_mode = cert_reqs + if ca_certs: + try: + context.load_verify_locations(ca_certs) + # Py32 raises IOError + # Py33 raises FileNotFoundError + except Exception as e: # Reraise as SSLError + raise SSLError(e) + if certfile: + # FIXME: This block needs a test. + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + return context.wrap_socket(sock) + +else: # Python 3.1 and earlier + def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + return wrap_socket(sock, keyfile=keyfile, certfile=certfile, + ca_certs=ca_certs, cert_reqs=cert_reqs, + ssl_version=ssl_version) diff --git a/requests/sessions.py b/requests/sessions.py new file mode 100644 index 0000000..eb6b1eb --- /dev/null +++ b/requests/sessions.py @@ -0,0 +1,505 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). + +""" +import os +from datetime import datetime + +from .compat import cookielib +from .cookies import cookiejar_from_dict, extract_cookies_to_jar +from .models import Request, PreparedRequest +from .hooks import default_hooks, dispatch_hook +from .utils import from_key_val_list, default_headers +from .exceptions import TooManyRedirects, InvalidSchema + +from .compat import urlparse, urljoin +from .adapters import HTTPAdapter + +from .utils import requote_uri, get_environ_proxies, get_netrc_auth + +from .status_codes import codes +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_moved, # 307 +) +DEFAULT_REDIRECT_LIMIT = 30 + + +def merge_kwargs(local_kwarg, default_kwarg): + """Merges kwarg dictionaries. + + If a local key in the dictionary is set to None, it will be removed. + """ + + if default_kwarg is None: + return local_kwarg + + if isinstance(local_kwarg, str): + return local_kwarg + + if local_kwarg is None: + return default_kwarg + + # Bypass if not a dictionary (e.g. timeout) + if not hasattr(default_kwarg, 'items'): + return local_kwarg + + default_kwarg = from_key_val_list(default_kwarg) + local_kwarg = from_key_val_list(local_kwarg) + + # Update new values in a case-insensitive way + def get_original_key(original_keys, new_key): + """ + Finds the key from original_keys that case-insensitive matches new_key. + """ + for original_key in original_keys: + if key.lower() == original_key.lower(): + return original_key + return new_key + + kwargs = default_kwarg.copy() + original_keys = kwargs.keys() + for key, value in local_kwarg.items(): + kwargs[get_original_key(original_keys, key)] = value + + # Remove keys that are set to None. + for (k, v) in local_kwarg.items(): + if v is None: + del kwargs[k] + + return kwargs + + +class SessionRedirectMixin(object): + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None): + """Receives a Response. Returns a generator of Responses.""" + + i = 0 + prepared_request = PreparedRequest() + prepared_request.body = req.body + prepared_request.headers = req.headers.copy() + prepared_request.hooks = req.hooks + prepared_request.method = req.method + prepared_request.url = req.url + + # ((resp.status_code is codes.see_other)) + while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)): + + resp.content # Consume socket so it can be released + + if i >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) + + # Release the connection back into the pool. + resp.close() + + url = resp.headers['location'] + method = prepared_request.method + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (parsed_rurl.scheme, url) + + # Facilitate non-RFC2616-compliant 'location' headers + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + if not urlparse(url).netloc: + # Compliant with RFC3986, we percent encode the url. + url = urljoin(resp.url, requote_uri(url)) + + prepared_request.url = url + + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 + if (resp.status_code == codes.see_other and + prepared_request.method != 'HEAD'): + method = 'GET' + + # Do what the browsers do, despite standards... + if (resp.status_code in (codes.moved, codes.found) and + prepared_request.method == 'POST'): + method = 'GET' + + prepared_request.method = method + + # https://github.com/kennethreitz/requests/issues/1084 + if resp.status_code not in (codes.temporary, codes.resume): + if 'Content-Length' in prepared_request.headers: + del prepared_request.headers['Content-Length'] + + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + prepared_request.prepare_cookies(self.cookies) + + resp = self.send( + prepared_request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + i += 1 + yield resp + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistience, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + 200 + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', + 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', + 'trust_env', 'max_redirects'] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol to the URL of the proxy (e.g. + #: {'http': 'foo.bar:3128'}) to be used on each + #: :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL certificate default. + self.cert = None + + #: Maximum number of redirects to follow. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Should we trust the environment? + self.trust_env = True + + # Set up a CookieJar to be used by default + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = {} + self.mount('http://', HTTPAdapter()) + self.mount('https://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def request(self, method, url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary or bytes to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of 'filename': file-like-objects + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) Float describing the timeout of the + request. + :param allow_redirects: (optional) Boolean. Set to True by default. + :param proxies: (optional) Dictionary mapping protocol to the URL of + the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) if ``True``, the SSL cert will be verified. + A CA_BUNDLE path can also be provided. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + """ + + cookies = cookies or {} + proxies = proxies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = self.cookies.copy() + merged_cookies.update(cookies) + cookies = merged_cookies + + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + env_proxies = get_environ_proxies(url) or {} + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Set environment's basic authentication. + if not auth: + auth = get_netrc_auth(url) + + # Look for configuration. + if not verify and verify is not False: + verify = os.environ.get('REQUESTS_CA_BUNDLE') + + # Curl compatibility. + if not verify and verify is not False: + verify = os.environ.get('CURL_CA_BUNDLE') + + # Merge all the kwargs. + params = merge_kwargs(params, self.params) + headers = merge_kwargs(headers, self.headers) + auth = merge_kwargs(auth, self.auth) + proxies = merge_kwargs(proxies, self.proxies) + hooks = merge_kwargs(hooks, self.hooks) + stream = merge_kwargs(stream, self.stream) + verify = merge_kwargs(verify, self.verify) + cert = merge_kwargs(cert, self.cert) + + # Create the Request. + req = Request() + req.method = method.upper() + req.url = url + req.headers = headers + req.files = files + req.data = data + req.params = params + req.auth = auth + req.cookies = cookies + req.hooks = hooks + + # Prepare the Request. + prep = req.prepare() + + # Send the request. + send_kwargs = { + 'stream': stream, + 'timeout': timeout, + 'verify': verify, + 'cert': cert, + 'proxies': proxies, + 'allow_redirects': allow_redirects, + } + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('POST', url, data=data, **kwargs) + + def put(self, url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest.""" + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if getattr(request, 'prepare', None): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of + # hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + timeout = kwargs.get('timeout') + verify = kwargs.get('verify') + cert = kwargs.get('cert') + proxies = kwargs.get('proxies') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = datetime.utcnow() + # Send the request + r = adapter.send(request, **kwargs) + # Total elapsed time of the request (approximately) + r.elapsed = datetime.utcnow() - start + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, stream=stream, + timeout=timeout, verify=verify, cert=cert, + proxies=proxies) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = tuple(history) + + return r + + def get_adapter(self, url): + """Returns the appropriate connnection adapter for the given URL.""" + for (prefix, adapter) in self.adapters.items(): + + if url.startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for _, v in self.adapters.items(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix.""" + self.adapters[prefix] = adapter + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """Returns a :class:`Session` for context-management.""" + + return Session() diff --git a/requests/status_codes.py b/requests/status_codes.py new file mode 100644 index 0000000..08edab4 --- /dev/null +++ b/requests/status_codes.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('resume_incomplete', 'resume'), + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), +} + +codes = LookupDict(name='status_codes') + +for (code, titles) in list(_codes.items()): + for title in titles: + setattr(codes, title, code) + if not title.startswith('\\'): + setattr(codes, title.upper(), code) diff --git a/requests/structures.py b/requests/structures.py new file mode 100644 index 0000000..05f5ac1 --- /dev/null +++ b/requests/structures.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. + +""" + +import os +from itertools import islice + + +class IteratorProxy(object): + """docstring for IteratorProxy""" + def __init__(self, i): + self.i = i + # self.i = chain.from_iterable(i) + + def __iter__(self): + return self.i + + def __len__(self): + if hasattr(self.i, '__len__'): + return len(self.i) + if hasattr(self.i, 'len'): + return self.i.len + if hasattr(self.i, 'fileno'): + return os.fstat(self.i.fileno()).st_size + + def read(self, n): + return "".join(islice(self.i, None, n)) + + +class CaseInsensitiveDict(dict): + """Case-insensitive Dictionary + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header.""" + + @property + def lower_keys(self): + if not hasattr(self, '_lower_keys') or not self._lower_keys: + self._lower_keys = dict((k.lower(), k) for k in list(self.keys())) + return self._lower_keys + + def _clear_lower_keys(self): + if hasattr(self, '_lower_keys'): + self._lower_keys.clear() + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + self._clear_lower_keys() + + def __delitem__(self, key): + dict.__delitem__(self, self.lower_keys.get(key.lower(), key)) + self._lower_keys.clear() + + def __contains__(self, key): + return key.lower() in self.lower_keys + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + if key in self: + return dict.__getitem__(self, self.lower_keys[key.lower()]) + + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/requests/utils.py b/requests/utils.py new file mode 100644 index 0000000..a2d434e --- /dev/null +++ b/requests/utils.py @@ -0,0 +1,591 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. + +""" + +import cgi +import codecs +import os +import platform +import re +import sys +import zlib +from netrc import netrc, NetrcParseError + +from . import __version__ +from . import certs +from .compat import parse_http_list as _parse_list_header +from .compat import quote, urlparse, bytes, str, OrderedDict, urlunparse +from .cookies import RequestsCookieJar, cookiejar_from_dict + +_hush_pyflakes = (RequestsCookieJar,) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + if hasattr(o, '__len__'): + return len(o) + if hasattr(o, 'len'): + return o.len + if hasattr(o, 'fileno'): + return os.fstat(o.fileno()).st_size + + +def get_netrc_auth(url): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) + netrc_path = None + + for loc in locations: + if os.path.exists(loc) and not netrc_path: + netrc_path = loc + + # Abort early if there isn't one. + if netrc_path is None: + return netrc_path + + ri = urlparse(url) + + # Strip port numbers from netloc + host = ri.netloc.split(':')[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth + pass + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if name and name[0] != '<' and name[-1] != '>': + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, dict): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + """ + + cj2 = cookiejar_from_dict(cookie_dict) + cj.update(cj2) + return cj + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + + charset_re = re.compile(r']', flags=re.I) + + return charset_re.findall(content) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode('', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + + 2. every encodings from ```` + + 3. fall back and replace all unicode characters + + """ + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +def stream_decompress(iterator, mode='gzip'): + """Stream decodes an iterator over compressed data + + :param iterator: An iterator over compressed data + :param mode: 'gzip' or 'deflate' + :return: An iterator over decompressed data + """ + + if mode not in ['gzip', 'deflate']: + raise ValueError('stream_decompress mode must be gzip or deflate') + + zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS + dec = zlib.decompressobj(zlib_mode) + try: + for chunk in iterator: + rv = dec.decompress(chunk) + if rv: + yield rv + except zlib.error: + # If there was an error decompressing, just return the raw chunk + yield chunk + # Continue to return the rest of the raw data + for chunk in iterator: + yield chunk + else: + # Make sure everything has been returned from the decompression object + buf = dec.decompress(bytes()) + rv = buf + dec.flush() + if rv: + yield rv + + +def stream_untransfer(gen, resp): + ce = resp.headers.get('content-encoding', '').lower() + if 'gzip' in ce: + gen = stream_decompress(gen, mode='gzip') + elif 'deflate' in ce: + gen = stream_decompress(gen, mode='deflate') + + return gen + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + c = chr(int(h, 16)) + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + """ + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, unreserved, + # or '%') + return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") + + +def get_environ_proxies(url): + """Return a dict of environment proxies.""" + + proxy_keys = [ + 'all', + 'http', + 'https', + 'ftp', + 'socks' + ] + + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy = get_proxy('no_proxy') + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = no_proxy.split(',') + netloc = urlparse(url).netloc + + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return {} + + # If we get here, we either didn't have no_proxy set or we're not going + # anywhere that no_proxy applies to. + proxies = [(key, get_proxy(key + '_proxy')) for key in proxy_keys] + return dict([(key, val) for (key, val) in proxies if val]) + + +def default_user_agent(): + """Return a string representing the default user agent.""" + _implementation = platform.python_implementation() + + if _implementation == 'CPython': + _implementation_version = platform.python_version() + elif _implementation == 'PyPy': + _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) + elif _implementation == 'Jython': + _implementation_version = platform.python_version() # Complete Guess + elif _implementation == 'IronPython': + _implementation_version = platform.python_version() # Complete Guess + else: + _implementation_version = 'Unknown' + + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + + return " ".join(['python-requests/%s' % __version__, + '%s/%s' % (_implementation, _implementation_version), + '%s/%s' % (p_system, p_release)]) + + +def default_headers(): + return { + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')), + 'Accept': '*/*' + } + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + """ + + links = [] + + replace_chars = " '\"" + + for val in value.split(","): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, '' + + link = {} + + link["url"] = url.strip("<> '\"") + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + '''Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument.''' + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password.""" + if url: + parsed = urlparse(url) + return (parsed.username, parsed.password) + else: + return ('', '') diff --git a/tvsp2xmltv/__init__.py b/tvsp2xmltv/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/tvsp2xmltv/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/tvsp2xmltv/defaults.py b/tvsp2xmltv/defaults.py new file mode 100644 index 0000000..a8b5482 --- /dev/null +++ b/tvsp2xmltv/defaults.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +import operator + +#destination_file = '/var/lib/epgsources/tvspielfilm2xmltv.xmltv' +destination_file = 'tvspielfilm2xmltv.xml' +grab_today = True + +sart_map = { + 'SE':'serie', + 'SP':'movie', + 'RE':'news', + 'AND': 'and', + 'U':'undefined'} + +channel_map = { + 'ARD':'ard.de', + 'ZDF':'zdf.de', + 'RTL':'rtl.de', + 'SAT1':'sat1.de', + 'PRO7':'prosieben.de', + 'K1':'kabel1.de', + 'RTL2':'rtl2.de', + 'VOX':'vox.de', + '3SAT':'3sat.de', + 'ARTE':'arte.de', + 'TELE5':'tele5.de', + 'DVIER':'das-vierte.de', + 'CC':'comedy-central.de', + 'DMAX':'dmax.de', + 'SIXX':'sixx.de', + 'RTL-N':'rtl-nitro.de', + 'SAT1G':'sat1-gold.de', + 'SUPER':'superrtl.de', + 'KIKA':'kika.de', + 'NICK':'nickelodeon.de', + 'RIC':'ric.de', + 'WDR':'wdr.de', + 'N3':'ndr.de', + 'BR':'bayern3.de', + 'SWR':'swr.de', + 'HR':'hessen3.de', + 'MDR':'mdr.de', + 'RBB':'rbb.de', + 'PHOEN':'phoenix.de', + 'BRALP':'br-alpha.de', + 'TAG24':'tagesschau24.de', + 'FES':'einsfestival.de', + 'MUX':'einsplus.de', + '2NEO':'zdfneo.de', + '2KULT':'zdfkultur.de', + 'ZINFO':'zdfinfo.de', + 'ANIXE':'anixe.de', + 'SKLAR':'sonnenklartv.de', + 'BIBEL':'bibeltv.de', + 'TIMM':'timm.de', + 'CNN':'cnn.de', + 'N24':'n24.de', + 'NTV':'ntv.de', + 'SPORT':'sport1.de', + 'S1PLU':'sport1plus.de', + 'EURO':'eurosport.de', + 'EURO2':'eurosport-2.de', + 'ESPN':'espn-classic-sport.com', + 'NASN':'espn-america.com', + 'SPO-D':'sportdigitaltv.de', + 'DMC':'deluxe-music.de', + 'IMT':'imusic1.de', + 'MTV':'mtv.de', + 'VIVA':'viva.de', + 'VH1':'vh1-classic.uk', + 'ATV':'atv.at', + 'ATV2':'atv2.at', + 'ORF1':'orf1.at', + 'ORF2':'orf2.at', + 'ORF3':'orf3.at', + 'ORFSP':'orf-sport.at', + 'PULS4':'puls4.at', + 'SERVU':'servustv.at', + 'SF1':'sf1.ch', + 'STTV':'star-tv.ch', + 'SF2':'sf2.ch', + '3PLUS':'3plus.ch', + 'CIN':'sky-cinema.de', + 'CIN1':'sky-cinema-1.de', + 'CIN24':'sky-cinema-24.de', + 'SKY-H':'sky-cinema-hits.de', + 'SKY-A':'sky-action.de', + 'SKY-C':'sky-comedy.de', + 'SKY-E':'sky-emotion.de', + 'SKY-N':'sky-nostalgie.de', + 'MGM':'mgm.de', + 'DCM':'disney-cinemagic.de', + 'SKY3D':'sky-3d.de', + 'SKYAT':'sky-atlantic-hd.de', + 'N-GHD':'national-geographic.de', + 'HDDIS':'discovery-channel.de', + 'HISHD':'history-hd.de', + 'SNHD':'sky-sport-news-hd.de', + 'BULI':'sky-fussball-bundesliga.de', + 'SPO1':'sky-sport-1.de', + 'SPO2':'sky-sport-2.de', + 'SPO-A':'sky-sport-austria.at', + 'HDSPO':'sky-sport-1-hd.de', + 'SHD2':'sky-sport-2-hd.de', + 'SHDE':'sky-sport-extra-hd.de', + '13TH':'13th-street.de', + 'CLASS':'classica.de', + 'DISNE':'disney-channel.de', + 'DXD':'disney-xd.de', + 'DJUN':'disney-junior.de', + 'FOX':'fox-channel.de', + 'GOLD':'goldstar-tv.de', + 'HEIMA':'heimatkanal.de', + 'MOVTV':'motorvision-tv.de', + 'JUNIO':'junior.de', + 'N-GW':'national-geographic-wild.de', + 'PASS':'rtl-passion.de', + 'RTL-C':'rtl-crime.de', + 'SCIFI':'sci-fi.de', + 'SP-GE':'spiegel-geschichte.de', + 'SKY-K':'sky-krimi.de', + 'TNT-S':'tnt-serie.de', + 'AXN':'axntv.de', + 'AMAX':'animax.de', + 'BIO':'the-biography-channel.de', + 'BOOM':'boomerang-tv.de', + 'C-NET':'cartoon-network.de', + 'HISTO':'history-channel.de', + 'K1CLA':'kabel-eins-classics.de', + 'KINOW':'kinowelt-tv.de', + 'NICKT':'nicktoons.de', + 'ROM':'romance-tv.de', + 'RTL-L':'rtl-living.de', + 'SAT1E':'sat1-emotions.de', + 'TNT-F':'tnt-film.de', + 'SKY-S':'sky-select.de', + 'APLAN':'animal-planet.de', + 'GUSTO':'bongusto.de', + 'E!':'e-entertainment-television.de', + 'GLITZ':'glitz.de', + 'PLANE':'planet.de', + 'PBOY':'playboy.de', + 'PRO7F':'prosieben-fun.de', + 'SILVE':'silverline-tv.de', + 'SPTVW':'spiegel-tv-wissen.de' +} + +def get_channel_key(value): + for name, val in channel_map.items(): + if val == value: + return name + + +def write_controlfile(path): + sorted_x = sorted(channel_map.values(), key=operator.itemgetter(1)) + try: + f = open(path, "w") + f.write('file;00:00;0;0\n') # Write a string to a file + f.write('14\n') # Write a string to a file + for val in sorted_x: + f.write(val) + f.write('\n') + + finally: + f.close() + \ No newline at end of file diff --git a/tvsp2xmltv/logger.py b/tvsp2xmltv/logger.py new file mode 100644 index 0000000..5f062bd --- /dev/null +++ b/tvsp2xmltv/logger.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +''' +Created on 26.04.2013 + +@author: Chris +''' +import sys +import logging, logging.handlers + +ERROR = logging.ERROR +WARNING = logging.WARNING +MESSAGE = logging.INFO +DEBUG = logging.DEBUG + +# Configure logger +logger = logging.getLogger('tvsp2xmltv') +logger.setLevel(logging.DEBUG) +try: + sh = logging.handlers.SysLogHandler(address='/dev/log') + sh.setFormatter(logging.Formatter('%(name)s: %(levelname)s %(message)s')) + logger.addHandler(sh) +except: + pass + +console = logging.StreamHandler(sys.stdout) +console.setFormatter(logging.Formatter('%(asctime)s %(levelname)s::%(message)s', '%H:%M:%S')) +logger.addHandler(console) + +def log(message, level=MESSAGE): + #print(message) + if level == MESSAGE: + logger.info(message) + if level == DEBUG: + logger.debug(message) + if level == WARNING: + logger.warning(message) + if level == ERROR: + logger.error(message) + + + \ No newline at end of file diff --git a/tvsp2xmltv/model.py b/tvsp2xmltv/model.py new file mode 100644 index 0000000..65e95bf --- /dev/null +++ b/tvsp2xmltv/model.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +from . import defaults +import pytz +import datetime +from xml.etree.ElementTree import Element, ElementTree, SubElement +from datetime import date + +# Create Timezone according to our source +tz_ger = pytz.timezone('Europe/Berlin') + +class Programme(object): + def __init__(self, json): + + # Create Timezone according to our source + + details = json['details'] + + self.sendungs_id = details['sendungs_id'] + self.sender_id = details['sender_id'] + self.sendername = details['sendername'] + self.sendungstag = details['sendungstag'] + self.starttime = details['starttime'] + self.endtime = details['endtime'] + self.jahr = details['jahr'] + + self.title_de = details['titel'] + self.title_orig = details['originaltitel'] + self.vorspann = details['vorspann'] + self.land = details['land'] + self.genre = details['genre'] + self.text = details['text'] + + self.regisseur = details['regisseur'] # Kommagetrennt + self.darsteller = details['darsteller'] # Semikolongetrennte Liste + self.moderator = details['moderator'] # Kommagetrennt + self.studio_gaeste = details['studio_gaeste'] # Kommagetrennt + + self.untertitel = details['untertitel'] + self.folgentitel = details['folgentitel'] + self.staffel_nr = details['staffel_nr'] + self.folge = details['folge'] + + self.sart_id = details['sart_id'] # SendungsArt SE, RE, ... ? + self.wiederhol_hinweis = details['wiederhol_hinweis'] # Wiederholungshinweis + + self.sz_neu = details['sz_neu'] == 'J' + + # self.parse_json(json) + + + def to_string(self): + print(self.folgentitel) + print(self.title_de) + + def get_absolute_starttime(self): + d = datetime.datetime.strptime(self.sendungstag + ' ' + self.starttime, '%Y-%m-%d %H:%M') + new_d = tz_ger.localize(d) + return new_d + + def get_absolute_endtime(self): + d = datetime.datetime.strptime(self.sendungstag + ' ' + self.endtime, '%Y-%m-%d %H:%M') + new_d = tz_ger.localize(d) + return new_d + + def __format_date_for_xmltv(self, date): + return date.strftime("%Y%m%d%H%M%S %z") + + + def get_xml(self): + """Erstellt das XML-Element für die Sendung + """ + start = self.get_absolute_starttime() + stop = self.get_absolute_endtime() + + # Tagesgrenze überschritten... + if stop < start: + stop = stop + datetime.timedelta(days=1) + + programme = Element('programme', + { + 'start': self.__format_date_for_xmltv(start), + 'stop': self.__format_date_for_xmltv(stop), + 'channel': defaults.channel_map[self.sender_id] + }) + + tmp = SubElement(programme, "title", {'lang': 'de'}) + tmp.text = self.title_de + + if self.title_orig: + tmp = SubElement(programme, "title") + tmp.text = self.title_orig + + # Folgentitel oder Untertitel + if self.folgentitel: + tmp = SubElement(programme, 'sub-title') + tmp.text = self.folgentitel + elif self.untertitel: + tmp = SubElement(programme, 'sub-title') + tmp.text = self.untertitel + + if self.text: + tmp = SubElement(programme, "desc", {'lang': 'de'}) + tmp.text = self.text + + if self.darsteller or self.regisseur or self.moderator: + programme.append(self.__generate_credits()) + + if self.jahr: + tmp = SubElement(programme, 'date') + tmp.text = self.jahr + + if self.land: + tmp = SubElement(programme, 'country') + tmp.text = self.land + + try: + if self.folge: + tmp = SubElement(programme, 'episode-num', {'system':'xmltv_ns'}) + tmp.text = self.__generate_xmltv_ns() + except ValueError: + pass + + tmp = SubElement(programme, 'category', {'lang': 'de'}) + tmp.text = self.genre + + if defaults.sart_map.get(self.sart_id) != None: + tmp = SubElement(programme, 'category') + tmp.text = defaults.sart_map[self.sart_id] + + tmp = SubElement(programme, 'category') + tmp.text = self.sendungs_id + + if self.sz_neu: + SubElement(programme, 'new') + + # print(tostring(programme)) + return programme + + + def __generate_xmltv_ns(self): + # ToDo: folgen mit 111;112 behandeln (Doppelfolgen?) Prüfen ob nur Zahlen im String sind + if self.folge: + ep = int(self.folge) - 1 + else: + ep = "" + + if self.staffel_nr: + st = int(self.staffel_nr) - 1 + else: + st = "" + + ns = "{0}.{1}.".format(st, ep) + return ns + + def __generate_credits(self): + credits_element = Element("credits") + if self.regisseur: + tmp = SubElement(credits_element, "director") + tmp.text = self.regisseur + + if self.darsteller: + td = self.darsteller.split(';') + for d in td: + try: + x = d.split('(') + if len(x) >= 1: + tmp = SubElement(credits_element, "actor", {'role':x[1].strip(' )')}) + tmp.text = x[0].strip() + # keine Rolle angegeben + else: + tmp = SubElement(credits_element, "actor") + tmp.text = d.strip() + except IndexError: + pass + + if self.moderator: + tmp = SubElement(credits_element, 'presenter') + tmp.text = self.moderator + + #if self.studio_gaeste: + # td = self.studio_gaeste.split(',') + # for d in td: + # tmp = SubElement(credits_element, "guest") + # tmp.text = d.strip() + + return credits_element + + + +class Channel(object): + + def __init__(self, chanid, name): + self.channel_id = chanid + self.display_name = name + + + def get_xml(self): + chan = Element('channel', {'id': self.channel_id}) + tmp = SubElement(chan, 'display-name', {'lang':'de'}) + tmp.text = self.display_name + return chan + + +class XmltvRoot(object): + def __init__(self): + self.root = Element('tv', {'generator-info-name':'tvspielfilm2xmltv grabber'}) + + def append_element(self, xml): + self.root.append(xml.get_xml()) + + def get_xml(self): + return self.root + + def write_xml(self, filename): + file = open(filename, 'wb') + + # Create an ElementTree object from the root element + ElementTree(self.root).write(file, encoding="UTF-8", xml_declaration=True) + + file.close() diff --git a/tvsp2xmltv/tvsGrabber.py b/tvsp2xmltv/tvsGrabber.py new file mode 100644 index 0000000..a7bc68a --- /dev/null +++ b/tvsp2xmltv/tvsGrabber.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +import requests +import datetime + +from . import model +from . import defaults +from . import logger + +class TvsGrabber(object): + + def __init__(self): + self.channel_list = [] + self.grab_days = 1 + self.xmltv_doc = model.XmltvRoot() + + + def _get_update(self): + """liefert Infos mit Sender, Senderlogos + + """ + + url = "http://tvsapi.cellmp.de/getUpdate.php" + r = requests.get(url) + return r.json() + + + def _get_detail(self, prog_id): + """Holt die Sendungsdetails für die id ab + + """ + + payload = {'id': prog_id} + url = "http://tvsapi.cellmp.de/getDetails.php" + r = requests.get(url, params=payload) + return r.json() + + + def _get_category(self, date, sender=[]): + """Holt verfügbare Sendungen + + date: das Datum für welche wir die Daten wollen + sender: Eine Liste mit Sender ID's als string + wird der Parameter weggelassen werden alle verfügbaren Sender Daten abgeholt + + """ + + # Build channel array for request + sender_len = len(sender) + channel = '[' + for i in range(sender_len): + channel = channel + '"' + sender[i] + '"' + if i < sender_len - 1: + channel = channel + ',' + + channel = channel + ']' + + logger.log('Grabbing Channel "'+channel+'" for date '+date.isoformat()) + + payload = {'name': 'day', 'channel': channel, 'date': date.isoformat()} + url = "http://tvsapi.cellmp.de/getCategory_1_3.php" + r = requests.get(url, params=payload) + #print(r.url) + return r.json() + + def start_grab(self): + + #for name, channel_id in defaults.channel_map.items(): + for chan_id in self.channel_list: + tvsp_id = defaults.get_channel_key(chan_id) + chan = model.Channel(chan_id, tvsp_id) + self.xmltv_doc.append_element(chan) + + #for name, channel_id in defaults.channel_map.items(): + for chan_id in self.channel_list: + tvsp_id = defaults.get_channel_key(chan_id) + + date = datetime.date.today() + if not defaults.grab_today: + date = date + datetime.timedelta(days=1) + + for i in range(self.grab_days): + day = date + datetime.timedelta(days=i) + self.__grab_day(day, tvsp_id) + + #print("Finished") + + def add_channel(self, channel): + self.channel_list.append(channel) + + + def save(self): + self.xmltv_doc.write_xml(defaults.destination_file) + + def __grab_day(self, date, channel): + data = self._get_category(date, [channel]) + for s in data: + progData = self._get_detail(s['sendungs_id']) + prog = model.Programme(progData) + self.xmltv_doc.append_element(prog) + diff --git a/tvspielfilm2xmltv.py b/tvspielfilm2xmltv.py new file mode 100644 index 0000000..a08ea1b --- /dev/null +++ b/tvspielfilm2xmltv.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# encoding: utf-8 +''' +setup -- shortdesc + +setup is a description + +It defines classes_and_methods + +@author: user_name + +@copyright: 2013 organization_name. All rights reserved. + +@license: license + +@contact: user_email +@deffield updated: Updated +''' + +import sys +import os, os.path + +# Root path +base_path = '/home/chris/tvspielfilm2xmltv' #FIXME: dirty workaround when starting via hardlink +#base_path = os.path.dirname(os.path.abspath(__file__)) +print(base_path) +# Insert local directories into path +sys.path.append(os.path.join(base_path)) + +from argparse import ArgumentParser +from argparse import RawDescriptionHelpFormatter +from tvsp2xmltv import logger +from tvsp2xmltv import defaults +from tvsp2xmltv import tvsGrabber + +__all__ = [] +__version__ = 0.2 +__date__ = '2013-04-23' +__updated__ = '2013-04-28' + +DEBUG = 0 +TESTRUN = 0 +PROFILE = 0 + +class CLIError(Exception): + '''Generic exception to raise and log different fatal errors.''' + def __init__(self, msg): + super(CLIError).__init__(type(self)) + self.msg = "E: %s" % msg + def __str__(self): + return self.msg + def __unicode__(self): + return self.msg + +def main(argv=None): # IGNORE:C0111 + '''Command line options.''' + if argv is None: + argv = sys.argv + else: + sys.argv.extend(argv) + + program_name = os.path.basename(sys.argv[0]) + program_version = "v%s" % __version__ + program_build_date = str(__updated__) + program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date) + program_shortdesc = __import__('__main__').__doc__.split("\n")[1] + program_license = '''%s + + Created by user_name on %s. + Copyright 2013 organization_name. All rights reserved. + + Licensed under the Apache License 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + Distributed on an "AS IS" basis without warranties + or conditions of any kind, either express or implied. + +USAGE +''' % (program_shortdesc, str(__date__)) + + try: + # Setup argument parser + parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter) + parser.add_argument("-c", "--controlfile", dest="cfile", action="store", help="create the controlfile [default: %(default)s]") + parser.add_argument('-V', '--version', action='version', version=program_version_message) + parser.add_argument(dest="option", help="options from xmltv2vdr call [default: %(default)s]", metavar="option", nargs='*') + + # Process arguments + args = parser.parse_args() + + argvline = "" + for a in sys.argv: + argvline += a + argvline += " " + + logger.log('Called with following arguments: "'+argvline+'"') + + option = args.option + cfile = args.cfile + + if cfile: + print('Writing Controlfile [' + cfile + ']') + defaults.write_controlfile(cfile) + return 0 + + if option: + logger.log('Prepare grabbing...') + grabber = tvsGrabber.TvsGrabber() + grabber.grab_days = int(option[0]) + + opt_len = len(option) + for i in range(3, opt_len): + #5 ‘‘ 0 ard.de zdf.de + grabber.add_channel(option[i]) + + logger.log('Start grabbing...') + grabber.start_grab() + logger.log('Saving xml...') + grabber.save() + logger.log('End of grabbing...') + + + return 0 + except KeyboardInterrupt: + ### handle keyboard interrupt ### + return 0 + except Exception as e: + if DEBUG or TESTRUN: + raise(e) + logger.log(program_name + ": " + repr(e) + "\n", logger.ERROR) + return 2 + +if __name__ == "__main__": + if DEBUG: + #sys.argv.append("-h") + #sys.argv.append("1 'pin' 0 ard.de zdf.de") + pass + if TESTRUN: + import doctest + doctest.testmod() + if PROFILE: + import cProfile + import pstats + profile_filename = 'setup_profile.txt' + cProfile.run('main()', profile_filename) + statsfile = open("profile_stats.txt", "wb") + p = pstats.Stats(profile_filename, stream=statsfile) + stats = p.strip_dirs().sort_stats('cumulative') + stats.print_stats() + statsfile.close() + sys.exit(0) + sys.exit(main()) \ No newline at end of file