From 53c2691c395418ebac8a95ba69e791b9924a393d Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Tue, 8 Jan 2019 20:43:01 +0100 Subject: [PATCH 01/17] Bug 1442540 - Empirical ARM64 policy values for wasm tiering. r=luke These values were computed by measuring compilations of a set of programs on ARM64 reference hardware using --no-threads and then applying sane multipliers to estimate Ion values where we don't yet have them (because we don't have Ion on ARM64). See the bug for a table of raw data. See comments in the code for more information about what the values mean. --HG-- extra : rebase_source : 918e9fbc9a9f2a0119967fdc96162c9e2f309a84 extra : amend_source : 0d1a703cddb4225e8a32b1bebfa0ad5efe14a0a9 --- js/src/wasm/WasmCompile.cpp | 41 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/js/src/wasm/WasmCompile.cpp b/js/src/wasm/WasmCompile.cpp index 420c8204df24..e57cc203edd6 100644 --- a/js/src/wasm/WasmCompile.cpp +++ b/js/src/wasm/WasmCompile.cpp @@ -162,7 +162,10 @@ static SystemClass ClassifySystem() { } // Code sizes in machine code bytes per bytecode byte, again empirical except -// where marked as "Guess". +// where marked. +// +// The Ion estimate for ARM64 is the measured Baseline value scaled by a +// plausible factor for optimized code. static const double x64Tox86Inflation = 1.25; @@ -170,15 +173,14 @@ static const double x64IonBytesPerBytecode = 2.45; static const double x86IonBytesPerBytecode = x64IonBytesPerBytecode * x64Tox86Inflation; static const double arm32IonBytesPerBytecode = 3.3; -static const double arm64IonBytesPerBytecode = 3.0; // Guess +static const double arm64IonBytesPerBytecode = 3.0 / 1.4; // Estimate static const double x64BaselineBytesPerBytecode = x64IonBytesPerBytecode * 1.43; static const double x86BaselineBytesPerBytecode = x64BaselineBytesPerBytecode * x64Tox86Inflation; static const double arm32BaselineBytesPerBytecode = arm32IonBytesPerBytecode * 1.39; -static const double arm64BaselineBytesPerBytecode = - arm64IonBytesPerBytecode * 1.39; // Guess +static const double arm64BaselineBytesPerBytecode = 3.0; static double OptimizedBytesPerBytecode(SystemClass cls) { switch (cls) { @@ -239,25 +241,32 @@ static const double tierCutoffMs = 250; // Compilation rate values are empirical except when noted, the reference // systems are: // -// Late-2013 MacBook Pro (2.6GHz quad hyperthreaded Haswell) -// Late-2015 Nexus 5X (1.4GHz quad Cortex-A53 + 1.8GHz dual Cortex-A57) +// Late-2013 MacBook Pro (2.6GHz 4 x hyperthreaded Haswell, Mac OS X) +// Late-2015 Nexus 5X (1.4GHz 4 x Cortex-A53 + 1.8GHz 2 x Cortex-A57, Android) +// Ca-2016 SoftIron Overdrive 1000 (1.7GHz 4 x Cortex-A57, Fedora) +// +// The rates are always per core. +// +// The estimate for ARM64 is the Baseline compilation rate on the SoftIron +// (because we have no Ion yet), divided by 5 to estimate Ion compile rate and +// then divided by 2 to make it more reasonable for consumer ARM64 systems. -static const double x64BytecodesPerMs = 2100; -static const double x86BytecodesPerMs = 1500; -static const double arm32BytecodesPerMs = 450; -static const double arm64BytecodesPerMs = 650; // Guess +static const double x64IonBytecodesPerMs = 2100; +static const double x86IonBytecodesPerMs = 1500; +static const double arm32IonBytecodesPerMs = 450; +static const double arm64IonBytecodesPerMs = 750; // Estimate // Tiering cutoff values: if code section sizes are below these values (when // divided by the effective number of cores) we do not tier, because we guess // that parallel Ion compilation will be fast enough. -static const double x64DesktopTierCutoff = x64BytecodesPerMs * tierCutoffMs; -static const double x86DesktopTierCutoff = x86BytecodesPerMs * tierCutoffMs; +static const double x64DesktopTierCutoff = x64IonBytecodesPerMs * tierCutoffMs; +static const double x86DesktopTierCutoff = x86IonBytecodesPerMs * tierCutoffMs; static const double x86MobileTierCutoff = x86DesktopTierCutoff / 2; // Guess -static const double arm32MobileTierCutoff = arm32BytecodesPerMs * tierCutoffMs; -static const double arm64MobileTierCutoff = arm64BytecodesPerMs * tierCutoffMs; +static const double arm32MobileTierCutoff = arm32IonBytecodesPerMs * tierCutoffMs; +static const double arm64MobileTierCutoff = arm64IonBytecodesPerMs * tierCutoffMs; -static double CodesizeCutoff(SystemClass cls, uint32_t codeSize) { +static double CodesizeCutoff(SystemClass cls) { switch (cls) { case SystemClass::DesktopX86: case SystemClass::DesktopUnknown32: @@ -335,7 +344,7 @@ static bool TieringBeneficial(uint32_t codeSize) { // Ion compilation on available cores must take long enough to be worth the // bother. - double cutoffSize = CodesizeCutoff(cls, codeSize); + double cutoffSize = CodesizeCutoff(cls); double effectiveCores = EffectiveCores(cls, cores); if ((codeSize / effectiveCores) < cutoffSize) { From cec3346d8e630f80538f758a0289bc60e9b09d2c Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Tue, 8 Jan 2019 17:48:00 +0100 Subject: [PATCH 02/17] Bug 1518331 - corner case optimization. r=luke --HG-- extra : rebase_source : f62844950c10496e373bf2db9fdead2b554909ad --- js/src/jit/x86/Lowering-x86.cpp | 41 +++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/js/src/jit/x86/Lowering-x86.cpp b/js/src/jit/x86/Lowering-x86.cpp index c7662581459e..11fa135a7012 100644 --- a/js/src/jit/x86/Lowering-x86.cpp +++ b/js/src/jit/x86/Lowering-x86.cpp @@ -256,6 +256,33 @@ void LIRGenerator::visitWasmUnsignedToFloat32(MWasmUnsignedToFloat32* ins) { define(lir, ins); } +// If the base is a constant, and it is zero or its offset is zero, then +// code generation will fold the values into the access. Allocate the +// pointer to a register only if that can't happen. + +static bool OptimizableConstantAccess(MDefinition* base, + const wasm::MemoryAccessDesc& access) { + MOZ_ASSERT(base->isConstant()); + MOZ_ASSERT(base->type() == MIRType::Int32); + + if (!(base->toConstant()->isInt32(0) || access.offset() == 0)) { + return false; + } + if (access.type() == Scalar::Int64) { + // For int64 accesses on 32-bit systems we will need to add another offset + // of 4 to access the high part of the value; make sure this does not + // overflow the value. + int32_t v; + if (base->toConstant()->isInt32(0)) { + v = access.offset(); + } else { + v = base->toConstant()->toInt32(); + } + return v <= int32_t(INT32_MAX - INT64HIGH_OFFSET); + } + return true; +} + void LIRGenerator::visitWasmLoad(MWasmLoad* ins) { MDefinition* base = ins->base(); MOZ_ASSERT(base->type() == MIRType::Int32); @@ -273,13 +300,8 @@ void LIRGenerator::visitWasmLoad(MWasmLoad* ins) { return; } - // If the base is a constant, and it is zero or its offset is zero, then - // code generation will fold the values into the access. Allocate the - // pointer to a register only if that can't happen. - LAllocation baseAlloc; - if (!base->isConstant() || - !(base->toConstant()->isInt32(0) || ins->access().offset() == 0)) { + if (!base->isConstant() || !OptimizableConstantAccess(base, ins->access())) { baseAlloc = ins->type() == MIRType::Int64 ? useRegister(base) : useRegisterAtStart(base); } @@ -326,13 +348,8 @@ void LIRGenerator::visitWasmStore(MWasmStore* ins) { return; } - // If the base is a constant, and it is zero or its offset is zero, then - // code generation will fold the values into the access. Allocate the - // pointer to a register only if that can't happen. - LAllocation baseAlloc; - if (!base->isConstant() || - !(base->toConstant()->isInt32(0) || ins->access().offset() == 0)) { + if (!base->isConstant() || !OptimizableConstantAccess(base, ins->access())) { baseAlloc = useRegisterAtStart(base); } From 6ed5a2f3898de03e1c1818cd0b680b699f19a222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Tue, 8 Jan 2019 07:50:02 -0800 Subject: [PATCH 03/17] Bug 1518495: Correct parameter order for JSContext::onOutOfMemory. r=sfink --- js/src/vm/JSContext.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/vm/JSContext.h b/js/src/vm/JSContext.h index 8cf70031c275..7be7d3fc2203 100644 --- a/js/src/vm/JSContext.h +++ b/js/src/vm/JSContext.h @@ -164,8 +164,8 @@ struct JSContext : public JS::RootingContext, return thing->compartment() == compartment(); } - void* onOutOfMemory(js::AllocFunction allocFunc, size_t nbytes, - arena_id_t arena, void* reallocPtr = nullptr) { + void* onOutOfMemory(js::AllocFunction allocFunc, arena_id_t arena, + size_t nbytes, void* reallocPtr = nullptr) { if (helperThread()) { addPendingOutOfMemory(); return nullptr; From d4de202543fbd3a715cc1085007ba45c1400de29 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Tue, 8 Jan 2019 23:05:40 +0100 Subject: [PATCH 04/17] Bug 1517308 - Add a search field in about:url-classifier - part 1 - nsIUrlClassifier.getFeatureNames(), r=dimi --- .../UrlClassifierFeatureFactory.cpp | 31 ++++++++++++++++ .../UrlClassifierFeatureFactory.h | 2 ++ .../UrlClassifierFeatureFlash.cpp | 9 +++++ .../UrlClassifierFeatureFlash.h | 2 ++ .../UrlClassifierFeatureLoginReputation.cpp | 36 ++++--------------- .../UrlClassifierFeatureLoginReputation.h | 15 ++------ ...UrlClassifierFeatureTrackingAnnotation.cpp | 4 +++ .../UrlClassifierFeatureTrackingAnnotation.h | 2 ++ ...UrlClassifierFeatureTrackingProtection.cpp | 4 +++ .../UrlClassifierFeatureTrackingProtection.h | 2 ++ netwerk/url-classifier/nsIURIClassifier.idl | 5 +++ .../nsUrlClassifierDBService.cpp | 6 ++++ 12 files changed, 75 insertions(+), 43 deletions(-) diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp index d4a2f322b0d2..495a8fa8dfeb 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp @@ -102,6 +102,37 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { return nullptr; } +/* static */ void UrlClassifierFeatureFactory::GetFeatureNames( + nsTArray& aArray) { + if (!XRE_IsParentProcess()) { + return; + } + + // Tracking Protection + nsAutoCString name; + name.Assign(UrlClassifierFeatureTrackingProtection::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Tracking Annotation + name.Assign(UrlClassifierFeatureTrackingAnnotation::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Login reputation + name.Assign(UrlClassifierFeatureLoginReputation::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Flash features + nsTArray features; + UrlClassifierFeatureFlash::GetFeatureNames(features); + aArray.AppendElements(features); +} + /* static */ already_AddRefed UrlClassifierFeatureFactory::CreateFeatureWithTables( const nsACString& aName, const nsTArray& aBlacklistTables, diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.h b/netwerk/url-classifier/UrlClassifierFeatureFactory.h index 62e9d463982d..7e2c2356b748 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.h +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.h @@ -29,6 +29,8 @@ class UrlClassifierFeatureFactory final { static already_AddRefed GetFeatureByName( const nsACString& aFeatureName); + static void GetFeatureNames(nsTArray& aArray); + static already_AddRefed CreateFeatureWithTables( const nsACString& aName, const nsTArray& aBlacklistTables, const nsTArray& aWhitelistTables); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFlash.cpp b/netwerk/url-classifier/UrlClassifierFeatureFlash.cpp index 0410670305b2..64feb7d6b332 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFlash.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFlash.cpp @@ -55,6 +55,15 @@ UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId) "nsIHttpChannel::FlashPluginLastValue is out-of-sync!"); } +/* static */ void UrlClassifierFeatureFlash::GetFeatureNames( + nsTArray& aArray) { + uint32_t numFeatures = + (sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0])); + for (uint32_t i = 0; i < numFeatures; ++i) { + aArray.AppendElement(nsDependentCString(sFlashFeaturesMap[i].mName)); + } +} + /* static */ void UrlClassifierFeatureFlash::MaybeInitialize() { MOZ_ASSERT(XRE_IsParentProcess()); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFlash.h b/netwerk/url-classifier/UrlClassifierFeatureFlash.h index 7c5592fe0303..a4fc48f7616a 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFlash.h +++ b/netwerk/url-classifier/UrlClassifierFeatureFlash.h @@ -14,6 +14,8 @@ namespace net { class UrlClassifierFeatureFlash final : public UrlClassifierFeatureBase { public: + static void GetFeatureNames(nsTArray& aNames); + static void MaybeShutdown(); static void MaybeCreate( diff --git a/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.cpp b/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.cpp index 9ce198671cce..4de790d9d304 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.cpp @@ -33,6 +33,12 @@ UrlClassifierFeatureLoginReputation::UrlClassifierFeatureLoginReputation() EmptyCString()) // skip host pref {} +/* static */ const char* UrlClassifierFeatureLoginReputation::Name() { + return StaticPrefs::browser_safebrowsing_passwords_enabled() + ? LOGIN_REPUTATION_FEATURE_NAME + : ""; +} + /* static */ void UrlClassifierFeatureLoginReputation::MaybeShutdown() { UC_LOG(("UrlClassifierFeatureLoginReputation: MaybeShutdown")); @@ -76,36 +82,6 @@ UrlClassifierFeatureLoginReputation::ProcessChannel(nsIChannel* aChannel, return NS_OK; } -NS_IMETHODIMP -UrlClassifierFeatureLoginReputation::GetTables( - nsIUrlClassifierFeature::listType aListType, nsTArray& aTables) { - MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist, - "UrlClassifierFeatureLoginReputation is meant to be used just to " - "whitelist URLs"); - return UrlClassifierFeatureBase::GetTables(aListType, aTables); -} - -NS_IMETHODIMP -UrlClassifierFeatureLoginReputation::HasTable( - const nsACString& aTable, nsIUrlClassifierFeature::listType aListType, - bool* aResult) { - MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist, - "UrlClassifierFeatureLoginReputation is meant to be used just to " - "whitelist URLs"); - return UrlClassifierFeatureBase::HasTable(aTable, aListType, aResult); -} - -NS_IMETHODIMP -UrlClassifierFeatureLoginReputation::HasHostInPreferences( - const nsACString& aHost, nsIUrlClassifierFeature::listType aListType, - nsACString& aPrefTableName, bool* aResult) { - MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist, - "UrlClassifierFeatureLoginReputation is meant to be used just to " - "whitelist URLs"); - return UrlClassifierFeatureBase::HasHostInPreferences( - aHost, aListType, aPrefTableName, aResult); -} - NS_IMETHODIMP UrlClassifierFeatureLoginReputation::GetURIByListType( nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, diff --git a/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.h b/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.h index 65712f95e08f..bb145a853fd3 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.h +++ b/netwerk/url-classifier/UrlClassifierFeatureLoginReputation.h @@ -17,6 +17,8 @@ namespace net { class UrlClassifierFeatureLoginReputation final : public UrlClassifierFeatureBase { public: + static const char* Name(); + static void MaybeShutdown(); static nsIUrlClassifierFeature* MaybeGetOrCreate(); @@ -24,19 +26,6 @@ class UrlClassifierFeatureLoginReputation final static already_AddRefed GetIfNameMatches( const nsACString& aName); - NS_IMETHOD - GetTables(nsIUrlClassifierFeature::listType aListType, - nsTArray& aResult) override; - - NS_IMETHOD - HasTable(const nsACString& aTable, - nsIUrlClassifierFeature::listType aListType, bool* aResult) override; - - NS_IMETHOD - HasHostInPreferences(const nsACString& aHost, - nsIUrlClassifierFeature::listType aListType, - nsACString& aPrefTableName, bool* aResult) override; - NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, bool* aShouldContinue) override; diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp index ced3632bc7b3..dc61a13313cf 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp @@ -120,6 +120,10 @@ UrlClassifierFeatureTrackingAnnotation::UrlClassifierFeatureTrackingAnnotation() NS_LITERAL_CSTRING(TABLE_ANNOTATION_WHITELIST_PREF), NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_ANNOTATION_SKIP_URLS)) {} +/* static */ const char* UrlClassifierFeatureTrackingAnnotation::Name() { + return TRACKING_ANNOTATION_FEATURE_NAME; +} + /* static */ void UrlClassifierFeatureTrackingAnnotation::MaybeInitialize() { MOZ_ASSERT(XRE_IsParentProcess()); UC_LOG(("UrlClassifierFeatureTrackingAnnotation: MaybeInitialize")); diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.h b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.h index 651e2c5efcb9..1fd3b9b2c92d 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.h +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.h @@ -17,6 +17,8 @@ namespace net { class UrlClassifierFeatureTrackingAnnotation final : public UrlClassifierFeatureBase { public: + static const char* Name(); + static void MaybeShutdown(); static already_AddRefed MaybeCreate( diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp index 8fd519f8a387..691d5f1c94dd 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp @@ -42,6 +42,10 @@ UrlClassifierFeatureTrackingProtection::UrlClassifierFeatureTrackingProtection() NS_LITERAL_CSTRING(TABLE_TRACKING_BLACKLIST_PREF), NS_LITERAL_CSTRING(TABLE_TRACKING_WHITELIST_PREF), EmptyCString()) {} +/* static */ const char* UrlClassifierFeatureTrackingProtection::Name() { + return TRACKING_PROTECTION_FEATURE_NAME; +} + /* static */ void UrlClassifierFeatureTrackingProtection::MaybeInitialize() { MOZ_ASSERT(XRE_IsParentProcess()); UC_LOG(("UrlClassifierFeatureTrackingProtection: MaybeInitialize")); diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.h b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.h index fb6857b82eb8..75b86250aadb 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.h +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.h @@ -17,6 +17,8 @@ namespace net { class UrlClassifierFeatureTrackingProtection final : public UrlClassifierFeatureBase { public: + static const char* Name(); + static void MaybeShutdown(); static already_AddRefed MaybeCreate( diff --git a/netwerk/url-classifier/nsIURIClassifier.idl b/netwerk/url-classifier/nsIURIClassifier.idl index 66e37c71358b..da316831a9ea 100644 --- a/netwerk/url-classifier/nsIURIClassifier.idl +++ b/netwerk/url-classifier/nsIURIClassifier.idl @@ -95,6 +95,11 @@ interface nsIURIClassifier : nsISupports */ nsIUrlClassifierFeature getFeatureByName(in ACString aFeatureName); + /** + * Returns all the feature names. + */ + Array getFeatureNames(); + /** * Create a new feature with a list of tables. This method is just for * testing! Don't use it elsewhere. diff --git a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp index e6a3c6517077..0b6a6fa06755 100644 --- a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp +++ b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp @@ -2699,6 +2699,12 @@ nsUrlClassifierDBService::GetFeatureByName(const nsACString& aFeatureName, return NS_OK; } +NS_IMETHODIMP +nsUrlClassifierDBService::GetFeatureNames(nsTArray& aArray) { + mozilla::net::UrlClassifierFeatureFactory::GetFeatureNames(aArray); + return NS_OK; +} + NS_IMETHODIMP nsUrlClassifierDBService::CreateFeatureWithTables( const nsACString& aName, const nsTArray& aBlacklistTables, From 9c2e4cc2056baea19fed450637d0e8c2402711c7 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Tue, 8 Jan 2019 23:05:41 +0100 Subject: [PATCH 05/17] Bug 1517308 - Add a search field in about:url-classifier - part 2 - about page, r=dimi, r=flod --- toolkit/content/aboutUrlClassifier.js | 150 ++++++++++++++++++ toolkit/content/aboutUrlClassifier.xhtml | 43 +++++ .../en-US/toolkit/about/url-classifier.ftl | 10 ++ 3 files changed, 203 insertions(+) diff --git a/toolkit/content/aboutUrlClassifier.js b/toolkit/content/aboutUrlClassifier.js index 6d16133770a8..254a44d30d5d 100644 --- a/toolkit/content/aboutUrlClassifier.js +++ b/toolkit/content/aboutUrlClassifier.js @@ -11,6 +11,7 @@ const JSLOG_PREF = "browser.safebrowsing.debug"; function unLoad() { window.removeEventListener("unload", unLoad); + Search.uninit(); Provider.uninit(); Cache.uninit(); Debug.uninit(); @@ -20,11 +21,160 @@ function onLoad() { window.removeEventListener("load", onLoad); window.addEventListener("unload", unLoad); + Search.init(); Provider.init(); Cache.init(); Debug.init(); } +/* + * Search + */ +var Search = { + init() { + let classifier = Cc["@mozilla.org/url-classifier/dbservice;1"] + .getService(Ci.nsIURIClassifier); + let featureNames = classifier.getFeatureNames(); + + let fragment = document.createDocumentFragment(); + featureNames.forEach(featureName => { + let div = document.createElement("div"); + fragment.appendChild(div); + + let checkbox = document.createElement("input"); + checkbox.id = "feature_" + featureName; + checkbox.type = "checkbox"; + checkbox.checked = true; + div.appendChild(checkbox); + + let label = document.createElement("label"); + label.for = checkbox.id; + div.appendChild(label); + + let text = document.createTextNode(featureName); + label.appendChild(text); + }); + + let list = document.getElementById("search-features"); + list.appendChild(fragment); + + let btn = document.getElementById("search-button"); + btn.addEventListener("click", this.search); + + this.hideError(); + this.hideResults(); + }, + + uninit() { + let list = document.getElementById("search-features"); + while (list.firstChild) { + list.firstChild.remove(); + } + + let btn = document.getElementById("search-button"); + btn.removeEventListener("click", this.search); + }, + + search() { + Search.hideError(); + Search.hideResults(); + + let input = document.getElementById("search-input").value; + + let uri; + try { + uri = Services.io.newURI(input); + if (!uri) { + Search.reportError("url-classifier-search-error-invalid-url"); + return; + } + } catch (ex) { + Search.reportError("url-classifier-search-error-invalid-url"); + return; + } + + let classifier = Cc["@mozilla.org/url-classifier/dbservice;1"] + .getService(Ci.nsIURIClassifier); + + let featureNames = classifier.getFeatureNames(); + let features = []; + featureNames.forEach(featureName => { + if (document.getElementById("feature_" + featureName).checked) { + let feature = classifier.getFeatureByName(featureName); + if (feature) { + features.push(feature); + } + } + }); + + if (!features.length) { + Search.reportError("url-classifier-search-error-no-features"); + return; + } + + let listType = document.getElementById("search-listtype").value == 0 + ? Ci.nsIUrlClassifierFeature.blacklist + : Ci.nsIUrlClassifierFeature.whitelist; + classifier.asyncClassifyLocalWithFeatures(uri, features, listType, + list => Search.showResults(list)); + + Search.hideError(); + }, + + hideError() { + let errorMessage = document.getElementById("search-error-message"); + errorMessage.style.display = "none"; + }, + + reportError(msg) { + let errorMessage = document.getElementById("search-error-message"); + document.l10n.setAttributes(errorMessage, msg); + errorMessage.style.display = ""; + }, + + hideResults() { + let resultTitle = document.getElementById("result-title"); + resultTitle.style.display = "none"; + + let resultTable = document.getElementById("result-table"); + resultTable.style.display = "none"; + }, + + showResults(results) { + let fragment = document.createDocumentFragment(); + results.forEach(result => { + let tr = document.createElement("tr"); + fragment.appendChild(tr); + + let th = document.createElement("th"); + tr.appendChild(th); + th.appendChild(document.createTextNode(result.feature.name)); + + let td = document.createElement("td"); + tr.appendChild(td); + + let featureName = document.createElement("div"); + document.l10n.setAttributes(featureName, "url-classifier-search-result-uri", {uri: result.uri.spec}); + td.appendChild(featureName); + + let list = document.createElement("div"); + document.l10n.setAttributes(list, "url-classifier-search-result-list", {list: result.list}); + td.appendChild(list); + }); + + let resultTable = document.getElementById("result-table"); + while (resultTable.firstChild) { + resultTable.firstChild.remove(); + } + + resultTable.appendChild(fragment); + resultTable.style.display = ""; + + let resultTitle = document.getElementById("result-title"); + resultTitle.style.display = ""; + }, +}; + /* * Provider */ diff --git a/toolkit/content/aboutUrlClassifier.xhtml b/toolkit/content/aboutUrlClassifier.xhtml index 455d39dc6cf7..2650eb5263f0 100644 --- a/toolkit/content/aboutUrlClassifier.xhtml +++ b/toolkit/content/aboutUrlClassifier.xhtml @@ -18,6 +18,49 @@

+

diff --git a/toolkit/locales/en-US/toolkit/about/url-classifier.ftl b/toolkit/locales/en-US/toolkit/about/url-classifier.ftl index beb535854a09..8a441248632e 100644 --- a/toolkit/locales/en-US/toolkit/about/url-classifier.ftl +++ b/toolkit/locales/en-US/toolkit/about/url-classifier.ftl @@ -3,6 +3,16 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. url-classifier-title = URL Classifier Information +url-classifier-search-title = Search +url-classifier-search-result-title = Results +url-classifier-search-result-uri = URI: { $uri } +url-classifier-search-result-list = Table list: { $list } +url-classifier-search-input = URL +url-classifier-search-error-invalid-url = Invalid URL +url-classifier-search-error-no-features = No features selected +url-classifier-search-btn = Start searching +url-classifier-search-features = Features +url-classifier-search-listType = List type url-classifier-provider-title = Provider url-classifier-provider = Provider url-classifier-provider-last-update-time = Last update time From f10ced4f9d8a9d96141d0e016a1e4e27933d25aa Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Tue, 8 Jan 2019 23:05:41 +0100 Subject: [PATCH 06/17] Bug 1513298 - Fingerprinting url-classifier feature, r=dimi --- modules/libpref/init/StaticPrefList.h | 7 + .../url-classifier/UrlClassifierCommon.cpp | 6 +- netwerk/url-classifier/UrlClassifierCommon.h | 2 +- .../UrlClassifierFeatureFactory.cpp | 22 ++- .../UrlClassifierFeatureFingerprinting.cpp | 177 ++++++++++++++++++ .../UrlClassifierFeatureFingerprinting.h | 46 +++++ ...UrlClassifierFeatureTrackingAnnotation.cpp | 2 +- ...UrlClassifierFeatureTrackingProtection.cpp | 2 +- netwerk/url-classifier/moz.build | 1 + .../antitracking/AntiTrackingCommon.cpp | 4 +- .../antitracking/AntiTrackingCommon.h | 1 + .../tests/mochitest/mochitest.ini | 1 + .../tests/mochitest/test_fingerprinting.html | 103 ++++++++++ 13 files changed, 366 insertions(+), 8 deletions(-) create mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp create mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h create mode 100644 toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html diff --git a/modules/libpref/init/StaticPrefList.h b/modules/libpref/init/StaticPrefList.h index 2424fa3fb25c..359b201efd58 100644 --- a/modules/libpref/init/StaticPrefList.h +++ b/modules/libpref/init/StaticPrefList.h @@ -1784,6 +1784,13 @@ VARCACHE_PREF( bool, true ) +// Block 3rd party fingerprinting resources. +VARCACHE_PREF( + "privacy.trackingprotection.fingerprinting.enabled", + privacy_trackingprotection_fingerprinting_enabled, + bool, true +) + // Lower the priority of network loads for resources on the tracking protection // list. Note that this requires the // privacy.trackingprotection.annotate_channels pref to be on in order to have diff --git a/netwerk/url-classifier/UrlClassifierCommon.cpp b/netwerk/url-classifier/UrlClassifierCommon.cpp index 45a70ae60620..cda18856d19c 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.cpp +++ b/netwerk/url-classifier/UrlClassifierCommon.cpp @@ -87,13 +87,13 @@ LazyLogModule UrlClassifierCommon::sLog("nsChannelClassifier"); pwin->NotifyContentBlockingState(aBlockedReason, aChannel, true, uri); } -/* static */ bool -UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( +/* static */ bool UrlClassifierCommon::ShouldEnableClassifier( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose) { MOZ_ASSERT(aChannel); MOZ_ASSERT(aBlockingPurpose == AntiTrackingCommon::eTrackingProtection || - aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations); + aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations || + aBlockingPurpose == AntiTrackingCommon::eFingerprinting); nsCOMPtr channel = do_QueryInterface(aChannel); if (!channel) { diff --git a/netwerk/url-classifier/UrlClassifierCommon.h b/netwerk/url-classifier/UrlClassifierCommon.h index 43eba415f195..3861ed7cc830 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.h +++ b/netwerk/url-classifier/UrlClassifierCommon.h @@ -33,7 +33,7 @@ class UrlClassifierCommon final { static void NotifyChannelBlocked(nsIChannel* aChannel, unsigned aBlockedReason); - static bool ShouldEnableTrackingProtectionOrAnnotation( + static bool ShouldEnableClassifier( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp index 495a8fa8dfeb..d6d5a6da6c39 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp @@ -7,6 +7,7 @@ #include "mozilla/net/UrlClassifierFeatureFactory.h" // List of Features +#include "UrlClassifierFeatureFingerprinting.h" #include "UrlClassifierFeatureFlash.h" #include "UrlClassifierFeatureLoginReputation.h" #include "UrlClassifierFeatureTrackingProtection.h" @@ -24,6 +25,7 @@ namespace net { return; } + UrlClassifierFeatureFingerprinting::MaybeShutdown(); UrlClassifierFeatureFlash::MaybeShutdown(); UrlClassifierFeatureLoginReputation::MaybeShutdown(); UrlClassifierFeatureTrackingAnnotation::MaybeShutdown(); @@ -43,6 +45,12 @@ namespace net { // feature order, and this could produce different results with a different // feature ordering. + // Fingerprinting + feature = UrlClassifierFeatureFingerprinting::MaybeCreate(aChannel); + if (feature) { + aFeatures.AppendElement(feature); + } + // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::MaybeCreate(aChannel); if (feature) { @@ -75,6 +83,12 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { nsCOMPtr feature; + // Fingerprinting + feature = UrlClassifierFeatureFingerprinting::GetIfNameMatches(aName); + if (feature) { + return feature.forget(); + } + // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::GetIfNameMatches(aName); if (feature) { @@ -108,8 +122,14 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { return; } - // Tracking Protection + // Fingerprinting nsAutoCString name; + name.Assign(UrlClassifierFeatureFingerprinting::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Tracking Protection name.Assign(UrlClassifierFeatureTrackingProtection::Name()); if (!name.IsEmpty()) { aArray.AppendElement(name); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp new file mode 100644 index 000000000000..16c87bb84c14 --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "UrlClassifierFeatureFingerprinting.h" + +#include "mozilla/AntiTrackingCommon.h" +#include "mozilla/net/UrlClassifierCommon.h" +#include "mozilla/StaticPrefs.h" +#include "nsContentUtils.h" +#include "nsNetUtil.h" + +namespace mozilla { +namespace net { + +namespace { + +#define FINGERPRINTING_FEATURE_NAME "fingerprinting" + +#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST \ + "urlclassifier.features.fingerprinting.blacklistTables" +#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES \ + "urlclassifier.features.fingerprinting.blacklistHosts" +#define URLCLASSIFIER_FINGERPRINTING_WHITELIST \ + "urlclassifier.features.fingerprinting.whitelistTables" +#define URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES \ + "urlclassifier.features.fingerprinting.whitelistHosts" +#define TABLE_FINGERPRINTING_BLACKLIST_PREF "fingerprinting-blacklist-pref" +#define TABLE_FINGERPRINTING_WHITELIST_PREF "fingerprinting-whitelist-pref" + +StaticRefPtr gFeatureFingerprinting; + +} // namespace + +UrlClassifierFeatureFingerprinting::UrlClassifierFeatureFingerprinting() + : UrlClassifierFeatureBase( + NS_LITERAL_CSTRING(FINGERPRINTING_FEATURE_NAME), + NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_BLACKLIST), + NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_WHITELIST), + NS_LITERAL_CSTRING( + URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES), + NS_LITERAL_CSTRING( + URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES), + NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_BLACKLIST_PREF), + NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_WHITELIST_PREF), + EmptyCString()) {} + +/* static */ const char* UrlClassifierFeatureFingerprinting::Name() { + return FINGERPRINTING_FEATURE_NAME; +} + +/* static */ void UrlClassifierFeatureFingerprinting::MaybeInitialize() { + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeInitialize")); + + if (!gFeatureFingerprinting) { + gFeatureFingerprinting = new UrlClassifierFeatureFingerprinting(); + gFeatureFingerprinting->InitializePreferences(); + } +} + +/* static */ void UrlClassifierFeatureFingerprinting::MaybeShutdown() { + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeShutdown")); + + if (gFeatureFingerprinting) { + gFeatureFingerprinting->ShutdownPreferences(); + gFeatureFingerprinting = nullptr; + } +} + +/* static */ already_AddRefed +UrlClassifierFeatureFingerprinting::MaybeCreate(nsIChannel* aChannel) { + MOZ_ASSERT(aChannel); + + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeCreate for channel %p", + aChannel)); + + if (!StaticPrefs::privacy_trackingprotection_fingerprinting_enabled()) { + return nullptr; + } + + nsCOMPtr chanURI; + nsresult rv = aChannel->GetURI(getter_AddRefs(chanURI)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + bool isThirdParty = + nsContentUtils::IsThirdPartyWindowOrChannel(nullptr, aChannel, chanURI); + if (!isThirdParty) { + if (UC_LOG_ENABLED()) { + nsCString spec = chanURI->GetSpecOrDefault(); + spec.Truncate( + std::min(spec.Length(), UrlClassifierCommon::sMaxSpecLength)); + UC_LOG( + ("UrlClassifierFeatureFingerprinting: Skipping fingerprinting checks " + "for first party or top-level load channel[%p] " + "with uri %s", + aChannel, spec.get())); + } + + return nullptr; + } + + if (!UrlClassifierCommon::ShouldEnableClassifier( + aChannel, AntiTrackingCommon::eFingerprinting)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureFingerprinting); + + RefPtr self = gFeatureFingerprinting; + return self.forget(); +} + +/* static */ already_AddRefed +UrlClassifierFeatureFingerprinting::GetIfNameMatches(const nsACString& aName) { + if (!aName.EqualsLiteral(FINGERPRINTING_FEATURE_NAME)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureFingerprinting); + + RefPtr self = gFeatureFingerprinting; + return self.forget(); +} + +NS_IMETHODIMP +UrlClassifierFeatureFingerprinting::ProcessChannel(nsIChannel* aChannel, + const nsACString& aList, + bool* aShouldContinue) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aShouldContinue); + + // This is a blocking feature. + *aShouldContinue = false; + + UrlClassifierCommon::SetBlockedContent(aChannel, NS_ERROR_TRACKING_URI, aList, + EmptyCString(), EmptyCString()); + + UC_LOG( + ("UrlClassifierFeatureFingerprinting::ProcessChannel, cancelling " + "channel[%p]", + aChannel)); + nsCOMPtr httpChannel = do_QueryInterface(aChannel); + + // FIXME: the way we cancel the channel depends on what the UI wants to show. + // This needs to change, at some point. + if (httpChannel) { + Unused << httpChannel->CancelForTrackingProtection(); + } else { + Unused << aChannel->Cancel(NS_ERROR_TRACKING_URI); + } + + return NS_OK; +} + +NS_IMETHODIMP +UrlClassifierFeatureFingerprinting::GetURIByListType( + nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aURI); + + if (aListType == nsIUrlClassifierFeature::blacklist) { + return aChannel->GetURI(aURI); + } + + MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist); + return UrlClassifierCommon::CreatePairwiseWhiteListURI(aChannel, aURI); +} + +} // namespace net +} // namespace mozilla diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h new file mode 100644 index 000000000000..4f5cb7fafc8d --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_net_UrlClassifierFeatureFingerprinting_h +#define mozilla_net_UrlClassifierFeatureFingerprinting_h + +#include "UrlClassifierFeatureBase.h" + +class nsIChannel; + +namespace mozilla { +namespace net { + +class UrlClassifierFeatureFingerprinting final + : public UrlClassifierFeatureBase { + public: + static const char* Name(); + + static void MaybeShutdown(); + + static already_AddRefed MaybeCreate( + nsIChannel* aChannel); + + static already_AddRefed GetIfNameMatches( + const nsACString& aName); + + NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, + bool* aShouldContinue) override; + + NS_IMETHOD GetURIByListType(nsIChannel* aChannel, + nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) override; + + private: + UrlClassifierFeatureFingerprinting(); + + static void MaybeInitialize(); +}; + +} // namespace net +} // namespace mozilla + +#endif // mozilla_net_UrlClassifierFeatureFingerprinting_h diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp index dc61a13313cf..105abde45896 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp @@ -154,7 +154,7 @@ UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( + if (!UrlClassifierCommon::ShouldEnableClassifier( aChannel, AntiTrackingCommon::eTrackingAnnotations)) { return nullptr; } diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp index 691d5f1c94dd..5528618df366 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp @@ -101,7 +101,7 @@ UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( + if (!UrlClassifierCommon::ShouldEnableClassifier( aChannel, AntiTrackingCommon::eTrackingProtection)) { return nullptr; } diff --git a/netwerk/url-classifier/moz.build b/netwerk/url-classifier/moz.build index 8a68b6d6e880..497d35f5d790 100644 --- a/netwerk/url-classifier/moz.build +++ b/netwerk/url-classifier/moz.build @@ -24,6 +24,7 @@ UNIFIED_SOURCES += [ 'UrlClassifierFeatureBase.cpp', 'UrlClassifierFeatureCustomTables.cpp', 'UrlClassifierFeatureFactory.cpp', + 'UrlClassifierFeatureFingerprinting.cpp', 'UrlClassifierFeatureFlash.cpp', 'UrlClassifierFeatureLoginReputation.cpp', 'UrlClassifierFeatureResult.cpp', diff --git a/toolkit/components/antitracking/AntiTrackingCommon.cpp b/toolkit/components/antitracking/AntiTrackingCommon.cpp index 60d881fd9e8b..86b9a26b683d 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.cpp +++ b/toolkit/components/antitracking/AntiTrackingCommon.cpp @@ -1372,7 +1372,9 @@ nsresult AntiTrackingCommon::IsOnContentBlockingAllowList( if ((aPurpose == eStorageChecks && !StaticPrefs::browser_contentblocking_allowlist_storage_enabled()) || (aPurpose == eTrackingAnnotations && - !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled())) { + !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled()) || + (aPurpose == eFingerprinting && + !StaticPrefs::privacy_trackingprotection_fingerprinting_enabled())) { LOG( ("Attempting to check the content blocking allow list aborted because " "the third-party cookies UI has been disabled.")); diff --git a/toolkit/components/antitracking/AntiTrackingCommon.h b/toolkit/components/antitracking/AntiTrackingCommon.h index 6395e6d8f5ed..fdbb342e09e2 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.h +++ b/toolkit/components/antitracking/AntiTrackingCommon.h @@ -120,6 +120,7 @@ class AntiTrackingCommon final { eStorageChecks, eTrackingProtection, eTrackingAnnotations, + eFingerprinting, }; // Check whether a top window URI is on the content blocking allow list. diff --git a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini index 5ed704111b46..03ce3790a785 100644 --- a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini +++ b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini @@ -45,3 +45,4 @@ skip-if = (verify && debug && (os == 'win' || os == 'mac')) [test_cachemiss.html] skip-if = verify [test_annotation_vs_TP.html] +[test_fingerprinting.html] diff --git a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html new file mode 100644 index 000000000000..f15605ee5da8 --- /dev/null +++ b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html @@ -0,0 +1,103 @@ + + + + Test the fingerprinting classifier + + + + + + + + From ac423248946130e301b0f0663c2ae4c204e4083f Mon Sep 17 00:00:00 2001 From: Noemi Erli Date: Wed, 9 Jan 2019 12:15:44 +0200 Subject: [PATCH 07/17] Backed out changeset 76f3be6b25e1 (bug 1513298) for ES lint failure in test_fingerprinting.html CLOSED TREE --- modules/libpref/init/StaticPrefList.h | 7 - .../url-classifier/UrlClassifierCommon.cpp | 6 +- netwerk/url-classifier/UrlClassifierCommon.h | 2 +- .../UrlClassifierFeatureFactory.cpp | 22 +-- .../UrlClassifierFeatureFingerprinting.cpp | 177 ------------------ .../UrlClassifierFeatureFingerprinting.h | 46 ----- ...UrlClassifierFeatureTrackingAnnotation.cpp | 2 +- ...UrlClassifierFeatureTrackingProtection.cpp | 2 +- netwerk/url-classifier/moz.build | 1 - .../antitracking/AntiTrackingCommon.cpp | 4 +- .../antitracking/AntiTrackingCommon.h | 1 - .../tests/mochitest/mochitest.ini | 1 - .../tests/mochitest/test_fingerprinting.html | 103 ---------- 13 files changed, 8 insertions(+), 366 deletions(-) delete mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp delete mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h delete mode 100644 toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html diff --git a/modules/libpref/init/StaticPrefList.h b/modules/libpref/init/StaticPrefList.h index 359b201efd58..2424fa3fb25c 100644 --- a/modules/libpref/init/StaticPrefList.h +++ b/modules/libpref/init/StaticPrefList.h @@ -1784,13 +1784,6 @@ VARCACHE_PREF( bool, true ) -// Block 3rd party fingerprinting resources. -VARCACHE_PREF( - "privacy.trackingprotection.fingerprinting.enabled", - privacy_trackingprotection_fingerprinting_enabled, - bool, true -) - // Lower the priority of network loads for resources on the tracking protection // list. Note that this requires the // privacy.trackingprotection.annotate_channels pref to be on in order to have diff --git a/netwerk/url-classifier/UrlClassifierCommon.cpp b/netwerk/url-classifier/UrlClassifierCommon.cpp index cda18856d19c..45a70ae60620 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.cpp +++ b/netwerk/url-classifier/UrlClassifierCommon.cpp @@ -87,13 +87,13 @@ LazyLogModule UrlClassifierCommon::sLog("nsChannelClassifier"); pwin->NotifyContentBlockingState(aBlockedReason, aChannel, true, uri); } -/* static */ bool UrlClassifierCommon::ShouldEnableClassifier( +/* static */ bool +UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose) { MOZ_ASSERT(aChannel); MOZ_ASSERT(aBlockingPurpose == AntiTrackingCommon::eTrackingProtection || - aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations || - aBlockingPurpose == AntiTrackingCommon::eFingerprinting); + aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations); nsCOMPtr channel = do_QueryInterface(aChannel); if (!channel) { diff --git a/netwerk/url-classifier/UrlClassifierCommon.h b/netwerk/url-classifier/UrlClassifierCommon.h index 3861ed7cc830..43eba415f195 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.h +++ b/netwerk/url-classifier/UrlClassifierCommon.h @@ -33,7 +33,7 @@ class UrlClassifierCommon final { static void NotifyChannelBlocked(nsIChannel* aChannel, unsigned aBlockedReason); - static bool ShouldEnableClassifier( + static bool ShouldEnableTrackingProtectionOrAnnotation( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp index d6d5a6da6c39..495a8fa8dfeb 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp @@ -7,7 +7,6 @@ #include "mozilla/net/UrlClassifierFeatureFactory.h" // List of Features -#include "UrlClassifierFeatureFingerprinting.h" #include "UrlClassifierFeatureFlash.h" #include "UrlClassifierFeatureLoginReputation.h" #include "UrlClassifierFeatureTrackingProtection.h" @@ -25,7 +24,6 @@ namespace net { return; } - UrlClassifierFeatureFingerprinting::MaybeShutdown(); UrlClassifierFeatureFlash::MaybeShutdown(); UrlClassifierFeatureLoginReputation::MaybeShutdown(); UrlClassifierFeatureTrackingAnnotation::MaybeShutdown(); @@ -45,12 +43,6 @@ namespace net { // feature order, and this could produce different results with a different // feature ordering. - // Fingerprinting - feature = UrlClassifierFeatureFingerprinting::MaybeCreate(aChannel); - if (feature) { - aFeatures.AppendElement(feature); - } - // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::MaybeCreate(aChannel); if (feature) { @@ -83,12 +75,6 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { nsCOMPtr feature; - // Fingerprinting - feature = UrlClassifierFeatureFingerprinting::GetIfNameMatches(aName); - if (feature) { - return feature.forget(); - } - // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::GetIfNameMatches(aName); if (feature) { @@ -122,14 +108,8 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { return; } - // Fingerprinting - nsAutoCString name; - name.Assign(UrlClassifierFeatureFingerprinting::Name()); - if (!name.IsEmpty()) { - aArray.AppendElement(name); - } - // Tracking Protection + nsAutoCString name; name.Assign(UrlClassifierFeatureTrackingProtection::Name()); if (!name.IsEmpty()) { aArray.AppendElement(name); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp deleted file mode 100644 index 16c87bb84c14..000000000000 --- a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "UrlClassifierFeatureFingerprinting.h" - -#include "mozilla/AntiTrackingCommon.h" -#include "mozilla/net/UrlClassifierCommon.h" -#include "mozilla/StaticPrefs.h" -#include "nsContentUtils.h" -#include "nsNetUtil.h" - -namespace mozilla { -namespace net { - -namespace { - -#define FINGERPRINTING_FEATURE_NAME "fingerprinting" - -#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST \ - "urlclassifier.features.fingerprinting.blacklistTables" -#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES \ - "urlclassifier.features.fingerprinting.blacklistHosts" -#define URLCLASSIFIER_FINGERPRINTING_WHITELIST \ - "urlclassifier.features.fingerprinting.whitelistTables" -#define URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES \ - "urlclassifier.features.fingerprinting.whitelistHosts" -#define TABLE_FINGERPRINTING_BLACKLIST_PREF "fingerprinting-blacklist-pref" -#define TABLE_FINGERPRINTING_WHITELIST_PREF "fingerprinting-whitelist-pref" - -StaticRefPtr gFeatureFingerprinting; - -} // namespace - -UrlClassifierFeatureFingerprinting::UrlClassifierFeatureFingerprinting() - : UrlClassifierFeatureBase( - NS_LITERAL_CSTRING(FINGERPRINTING_FEATURE_NAME), - NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_BLACKLIST), - NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_WHITELIST), - NS_LITERAL_CSTRING( - URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES), - NS_LITERAL_CSTRING( - URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES), - NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_BLACKLIST_PREF), - NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_WHITELIST_PREF), - EmptyCString()) {} - -/* static */ const char* UrlClassifierFeatureFingerprinting::Name() { - return FINGERPRINTING_FEATURE_NAME; -} - -/* static */ void UrlClassifierFeatureFingerprinting::MaybeInitialize() { - UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeInitialize")); - - if (!gFeatureFingerprinting) { - gFeatureFingerprinting = new UrlClassifierFeatureFingerprinting(); - gFeatureFingerprinting->InitializePreferences(); - } -} - -/* static */ void UrlClassifierFeatureFingerprinting::MaybeShutdown() { - UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeShutdown")); - - if (gFeatureFingerprinting) { - gFeatureFingerprinting->ShutdownPreferences(); - gFeatureFingerprinting = nullptr; - } -} - -/* static */ already_AddRefed -UrlClassifierFeatureFingerprinting::MaybeCreate(nsIChannel* aChannel) { - MOZ_ASSERT(aChannel); - - UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeCreate for channel %p", - aChannel)); - - if (!StaticPrefs::privacy_trackingprotection_fingerprinting_enabled()) { - return nullptr; - } - - nsCOMPtr chanURI; - nsresult rv = aChannel->GetURI(getter_AddRefs(chanURI)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return nullptr; - } - - bool isThirdParty = - nsContentUtils::IsThirdPartyWindowOrChannel(nullptr, aChannel, chanURI); - if (!isThirdParty) { - if (UC_LOG_ENABLED()) { - nsCString spec = chanURI->GetSpecOrDefault(); - spec.Truncate( - std::min(spec.Length(), UrlClassifierCommon::sMaxSpecLength)); - UC_LOG( - ("UrlClassifierFeatureFingerprinting: Skipping fingerprinting checks " - "for first party or top-level load channel[%p] " - "with uri %s", - aChannel, spec.get())); - } - - return nullptr; - } - - if (!UrlClassifierCommon::ShouldEnableClassifier( - aChannel, AntiTrackingCommon::eFingerprinting)) { - return nullptr; - } - - MaybeInitialize(); - MOZ_ASSERT(gFeatureFingerprinting); - - RefPtr self = gFeatureFingerprinting; - return self.forget(); -} - -/* static */ already_AddRefed -UrlClassifierFeatureFingerprinting::GetIfNameMatches(const nsACString& aName) { - if (!aName.EqualsLiteral(FINGERPRINTING_FEATURE_NAME)) { - return nullptr; - } - - MaybeInitialize(); - MOZ_ASSERT(gFeatureFingerprinting); - - RefPtr self = gFeatureFingerprinting; - return self.forget(); -} - -NS_IMETHODIMP -UrlClassifierFeatureFingerprinting::ProcessChannel(nsIChannel* aChannel, - const nsACString& aList, - bool* aShouldContinue) { - NS_ENSURE_ARG_POINTER(aChannel); - NS_ENSURE_ARG_POINTER(aShouldContinue); - - // This is a blocking feature. - *aShouldContinue = false; - - UrlClassifierCommon::SetBlockedContent(aChannel, NS_ERROR_TRACKING_URI, aList, - EmptyCString(), EmptyCString()); - - UC_LOG( - ("UrlClassifierFeatureFingerprinting::ProcessChannel, cancelling " - "channel[%p]", - aChannel)); - nsCOMPtr httpChannel = do_QueryInterface(aChannel); - - // FIXME: the way we cancel the channel depends on what the UI wants to show. - // This needs to change, at some point. - if (httpChannel) { - Unused << httpChannel->CancelForTrackingProtection(); - } else { - Unused << aChannel->Cancel(NS_ERROR_TRACKING_URI); - } - - return NS_OK; -} - -NS_IMETHODIMP -UrlClassifierFeatureFingerprinting::GetURIByListType( - nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, - nsIURI** aURI) { - NS_ENSURE_ARG_POINTER(aChannel); - NS_ENSURE_ARG_POINTER(aURI); - - if (aListType == nsIUrlClassifierFeature::blacklist) { - return aChannel->GetURI(aURI); - } - - MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist); - return UrlClassifierCommon::CreatePairwiseWhiteListURI(aChannel, aURI); -} - -} // namespace net -} // namespace mozilla diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h deleted file mode 100644 index 4f5cb7fafc8d..000000000000 --- a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_net_UrlClassifierFeatureFingerprinting_h -#define mozilla_net_UrlClassifierFeatureFingerprinting_h - -#include "UrlClassifierFeatureBase.h" - -class nsIChannel; - -namespace mozilla { -namespace net { - -class UrlClassifierFeatureFingerprinting final - : public UrlClassifierFeatureBase { - public: - static const char* Name(); - - static void MaybeShutdown(); - - static already_AddRefed MaybeCreate( - nsIChannel* aChannel); - - static already_AddRefed GetIfNameMatches( - const nsACString& aName); - - NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, - bool* aShouldContinue) override; - - NS_IMETHOD GetURIByListType(nsIChannel* aChannel, - nsIUrlClassifierFeature::listType aListType, - nsIURI** aURI) override; - - private: - UrlClassifierFeatureFingerprinting(); - - static void MaybeInitialize(); -}; - -} // namespace net -} // namespace mozilla - -#endif // mozilla_net_UrlClassifierFeatureFingerprinting_h diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp index 105abde45896..dc61a13313cf 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp @@ -154,7 +154,7 @@ UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableClassifier( + if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( aChannel, AntiTrackingCommon::eTrackingAnnotations)) { return nullptr; } diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp index 5528618df366..691d5f1c94dd 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp @@ -101,7 +101,7 @@ UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableClassifier( + if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( aChannel, AntiTrackingCommon::eTrackingProtection)) { return nullptr; } diff --git a/netwerk/url-classifier/moz.build b/netwerk/url-classifier/moz.build index 497d35f5d790..8a68b6d6e880 100644 --- a/netwerk/url-classifier/moz.build +++ b/netwerk/url-classifier/moz.build @@ -24,7 +24,6 @@ UNIFIED_SOURCES += [ 'UrlClassifierFeatureBase.cpp', 'UrlClassifierFeatureCustomTables.cpp', 'UrlClassifierFeatureFactory.cpp', - 'UrlClassifierFeatureFingerprinting.cpp', 'UrlClassifierFeatureFlash.cpp', 'UrlClassifierFeatureLoginReputation.cpp', 'UrlClassifierFeatureResult.cpp', diff --git a/toolkit/components/antitracking/AntiTrackingCommon.cpp b/toolkit/components/antitracking/AntiTrackingCommon.cpp index 86b9a26b683d..60d881fd9e8b 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.cpp +++ b/toolkit/components/antitracking/AntiTrackingCommon.cpp @@ -1372,9 +1372,7 @@ nsresult AntiTrackingCommon::IsOnContentBlockingAllowList( if ((aPurpose == eStorageChecks && !StaticPrefs::browser_contentblocking_allowlist_storage_enabled()) || (aPurpose == eTrackingAnnotations && - !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled()) || - (aPurpose == eFingerprinting && - !StaticPrefs::privacy_trackingprotection_fingerprinting_enabled())) { + !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled())) { LOG( ("Attempting to check the content blocking allow list aborted because " "the third-party cookies UI has been disabled.")); diff --git a/toolkit/components/antitracking/AntiTrackingCommon.h b/toolkit/components/antitracking/AntiTrackingCommon.h index fdbb342e09e2..6395e6d8f5ed 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.h +++ b/toolkit/components/antitracking/AntiTrackingCommon.h @@ -120,7 +120,6 @@ class AntiTrackingCommon final { eStorageChecks, eTrackingProtection, eTrackingAnnotations, - eFingerprinting, }; // Check whether a top window URI is on the content blocking allow list. diff --git a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini index 03ce3790a785..5ed704111b46 100644 --- a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini +++ b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini @@ -45,4 +45,3 @@ skip-if = (verify && debug && (os == 'win' || os == 'mac')) [test_cachemiss.html] skip-if = verify [test_annotation_vs_TP.html] -[test_fingerprinting.html] diff --git a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html deleted file mode 100644 index f15605ee5da8..000000000000 --- a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - Test the fingerprinting classifier - - - - - - - - From 12266f8fb577417196270ca7fec07f413eddf966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Fri, 4 Jan 2019 04:46:00 -0800 Subject: [PATCH 08/17] Bug 1517222: Update tzdata in ICU data files to 2018i. r=Waldo --- config/external/icu/data/icudt63l.dat | Bin 11966496 -> 11968928 bytes intl/tzdata/GIT-INFO | 6 +- intl/tzdata/VERSION | 2 +- intl/tzdata/source/be/metaZones.res | Bin 41296 -> 41488 bytes intl/tzdata/source/be/timezoneTypes.res | Bin 20032 -> 20064 bytes intl/tzdata/source/be/windowsZones.res | Bin 22432 -> 22496 bytes intl/tzdata/source/be/zoneinfo64.res | Bin 152112 -> 154256 bytes intl/tzdata/source/ee/metaZones.res | Bin 41296 -> 41488 bytes intl/tzdata/source/ee/timezoneTypes.res | Bin 20032 -> 20064 bytes intl/tzdata/source/ee/windowsZones.res | Bin 22432 -> 22496 bytes intl/tzdata/source/ee/zoneinfo64.res | Bin 152112 -> 154256 bytes intl/tzdata/source/le/metaZones.res | Bin 41296 -> 41488 bytes intl/tzdata/source/le/timezoneTypes.res | Bin 20032 -> 20064 bytes intl/tzdata/source/le/windowsZones.res | Bin 22432 -> 22496 bytes intl/tzdata/source/le/zoneinfo64.res | Bin 152112 -> 154256 bytes intl/tzdata/source/metaZones.txt | 45 +- intl/tzdata/source/timezoneTypes.txt | 1 + intl/tzdata/source/windowsZones.txt | 10 +- intl/tzdata/source/zoneinfo64.txt | 1793 +++++++++-------- js/src/builtin/intl/TimeZoneDataGenerated.h | 2 +- .../DateTimeFormat/timeZone_backward_links.js | 2 +- .../Intl/DateTimeFormat/timeZone_backzone.js | 2 +- .../DateTimeFormat/timeZone_backzone_links.js | 2 +- .../timeZone_notbackward_links.js | 2 +- 24 files changed, 948 insertions(+), 919 deletions(-) diff --git a/config/external/icu/data/icudt63l.dat b/config/external/icu/data/icudt63l.dat index f75eed4ecfa83fbcce582461532a11132205e067..d1ed67aa9d9765441e20c83d9683b8588097ee13 100644 GIT binary patch delta 36514 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 BUupmV delta 34710 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∋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 Yx}4MakWgRF?|8WX<=BeJFw?sHFM -Date: Wed Nov 7 19:23:35 2018 -0500 +Date: Wed Jan 2 17:39:20 2019 -0500 - ICU-20260 Fix CR/LF issue + ICU time zone data updates for tzdata 2018i (including 2018h changes) diff --git a/intl/tzdata/VERSION b/intl/tzdata/VERSION index df68c8c7f944..63f58006ee93 100644 --- a/intl/tzdata/VERSION +++ b/intl/tzdata/VERSION @@ -1 +1 @@ -2018g +2018i diff --git a/intl/tzdata/source/be/metaZones.res b/intl/tzdata/source/be/metaZones.res index 1411a0b09ed331903ff9fb62a4d39054c1b9087d..48803afe575aa2da8fbca0f227db76b8f2bb0bd3 100644 GIT binary patch delta 11070 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

MNe^sV1qq zr={-l@P2C1gY*XiwN4LJV(j@7XPsa}LHlPKu0OQhHhG6{YHn zkyfWCtxiw6@$_W14D)1zOpa2U(mbV2l&aH|u`64hs*D4hpfa4Qj7N>h$r2x5luS(d zafQjXb5=b#b@zaJTXKQfD8sTy03a*8r9z$#dy{Ogpi zSGqyz>!`dS=PI*R`L?67|IP(ko6K%HdqEwl%t1BjL#1+<_~pzTfn#tI_-bTM>mwE$ z$2W5kOI1Iks-BUmOPJRd@E-&~6}MIuwN@3iR*Fg}wRUiT3w(`hYbjoB49c-dQ*D(} zDITv>n^~Y`YwMI#iYJp=DQ%;)ty1}B$ap)Y?Ui;^+DU0=rCpTXtyGFH>w75eX=qlf z?X4X5Deb59L8Wp+WZ^)igOmp@PD?7c;)I!U$Nw<*VV zr8`ksvk5i-<%!cdD1i6v&gg3v%&MWXTRsD=Nr#e zZ;sdD4STD-t-Kw)y}bjyqr6kR^SsY{H+Xk=-}j#Mp7&|KVqetP!uJbbf8S`|bl+m% zYrdVn4}72dF8WRWGJne7+TX?B)8EfO$Un|M-LLy!^l$Y4!T*u}YyYKyIp7Gy0xbgV zvw>cL!GUpsS%D>i)qyty?*u*yoC2s_^f_yThM^zX@NCWX%z0BoS#IX&>nw84{TonHgCUc_p$v@?PY# z$hpY1XhGB)EswU0-VyB+eK00-eiI0T2`6ZjO4!)Ne0dcrU;zS-RgHVG!fG8jg#IunT?a#cnNrc?8eD%JPc7tG-!@^B^^>6 zC%y3&&{FrT2xsr4M{?s`fdt2U!F@n-;}5_<7z_`?qd;QgBsNZB4dgaHAINKb5iA9A8ea}Ca4h2_Hcn#WBsTsEyb7sF4BxI>L!g!zzi6>zSP>#ejJ@8w9bDiE2SPIX> z3ivI&2rmPmH2|gBy?|_d*;xb%;tMCI{ga0&WNltSz2W&uslLcUhQgCtNlYTlOh(i)8f$S#9 zZj$UKo9S&=`m>}k*$GHtlJq6J!#&Uo`oaV7OBev8E=k&xq%S!PM!+bj2TpR5^d(7O zlJq4TU^>izSuh*sz+9LI3t%CqIJt-p*-et&5Vtc7*39yY-1uo*br zNltfiJG>3MVGrzueefQ<4(F-z<+|F^ErG8UjxTHc?QnHIXDj&;XD2# ZYQ*+d%o*YT3megrmwITmhu87H{{hTsR-XU> delta 10981 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

  • ;=5K$;;G4e^fT91NG`AC84s}P^H6ASvwp?!WcEKr#}%UE5B(< zXXq>MiOKtrl=oD2p9f8974Kw{s8#+;o^?o*3D!FWJ9k<28?Odf4qS%gk1`M*8#g zg$sR>wA3Os+pKi4QkAgOQhXkT70UiNDpw+LsWqxk@=_{!DUz3xSteHivD$Ad}_DLt(8h|;f=s-&hQsS=kHz#E!6rRL8n{RJh_DH5FK zQfVuY+_a64s4PtLR;HccZCQ{GqT(2axUxwixqX^MrfYyiraP#)&dQ&!XSxS{*|RtF z1xX-JpRQ9XNtAK!<>Mon9;^)NEldw(EQj-TO^;A>qm_e&*6mo|P@Zq25+5ocO$DT-0Ax%7r1!%?H9k!LD>%kjb|$&$ALz^Ds063a zs<~g9wQ9QJS51zp^X2Ce$Livi1=aEz%Va62SGZbUUGedvT%g(yB)nP@F1}SDyUJV} zXa}9tny$)+H@I5fVDaHATYVYy&-rAvYRR;0Gze63tA{Du2yBv6nI8)(fz>K;)hcn- zk~q2KG^I0?sw7s=Qe#P`?9~YK#71RRH_?%s-2;nYv2tFjocR)0OLAr5N?5JtC8=Ut z3(qRs2Bn*nzNmDw(w9*=Ya48b^FP1Ul5cr}oyuVs{oSxv**`($Fmhk5a$kLzKDn<} zxvwVo)jz29r|6%Bb1myLMx|z@))viX3h7V`nPMRC89TU@lV532X;^7gX(h^~GSomu zYC!tbK&G9V@1$&teGEz^e%A<6WGexSYpnL)~Nu+nQ$IbbLZSN)On z9QUx{rVIT}v6GN2_Q!14sn~gx_!XsgfvelzSPv@aH7eIN zD%UmJ@RJL^3OnFU*x9l+TSHE3_P{<2@`U@99zf;bgK${cB&XtYROvCL$CaK?`n^*5 zs)+wdrKgmhQF>PXL=cBxltGGuaV?Tlqf+(xskN$cq0(ZdQa7@$RB5?VyHY30!_>OL zuWVsaKIFAgH5sR0rTP?BtrV6l;-{&$lQ^SYm3C8e6jW`?CrPVSMOAy5n(N10o$?=~ zRMl7QwQ8J|LX$&=!3bp>tyC3Q?N~LgS2`Y*H4{O7wrZ!Txfx1lDxIZN6<}?nVV(6& z>qpkZ)}QjsdF2~VJyc@MPH@k3FK{n*uXI1>e%bxD`(yVp_bHFrQ|1YHQl9pnKAwS| z5uRH-jh_2FD?NYpyyAJ^bI|jH*XXVAR(db;)_HIAPW9g9UG9C>`#0|g-b3CWeR)2g zFYW8<>+S338|1smH`O=ar~97pJ@0$n_o43y|Bn*0-|nyUxAR|;^uCj)mKW`-BIF>%-H-P2oqv>%v>Z?}ZP9PlSJs6h+*Tsz}Gk zrIBkQVI$y!R;Xm*roPnR=w?-{$025fC2uh$F+z^3ENJ1L;WsKIs1<)Qk z!iCTUE`sjR6E22J;qoj^9SnqPU^kjM9#+phH|^#5MLLP}VVG z8>6&i#5cAcHUOm^dkMC{EASfp9o~kWunRtbJwU8u`+!)-h;@uu$NmLWaqK7@gKyzK zly;0@$4)U=mEBWD>X1nGUzX?QjQVVGhiL1<(W(ePR(j06IJf#63aW z6U0677_0(nKk+0y4QpW?JPYe#18jnqU<+)OFuVePgV*@qS;N*XQEQn0%W7Clyk4i( J&RxrY{s+0pM#}&I diff --git a/intl/tzdata/source/be/timezoneTypes.res b/intl/tzdata/source/be/timezoneTypes.res index 1bfa57ece5c277baa92e273c4fe6e725423acb3c..eee67cfff8eb47122c87b9a4ca1cc952f2fb758a 100644 GIT binary patch delta 1733 zcmYjSeN0vN8UB5LopaBI_j~j#xxP)u|CQiiTKfks16L zmlA3mqsow4V-Oj!&VVu$YmFm7)H-$4YHMvJ)GD!RnNeqz`c=2PbXoR3dEV#E^T+$~ z*V|PGuhzlpSY$H*fCC_U0eJDfp9w!rcra0yA52>j^cZ};ttH)wSCdDqgEH-*jsv;I zHRGCZsQ!ZQ{Xnty2VZI+0e?{-)1RAgxB7o!r09-zIf3K^7y8n*xIRfAsg2eTXx;j+ zja^!&?@Rw<<0a#zfG?3-{2l&gqcafoeHW-q^!U&}MDOwa)~M3!eV-Vw85{hQ;(ERR zU8BIq^}lNY?L&Q@`ryCVtrE~~YKMFe6Zz)<{13Ej{d@loZH<1w_pX-ie_e0a!oE~v zhW|Sw#i07u#A-WygN+}w9r`=^a&3h+QGeu1SG)Z*aneV=Hv*}~Z;bPSOyBavN&XA| z3&s!s8KtjLyWyv8JsA#)Zw=N5n}Z(*PXsRnuLl1Sd>j%XGxTyOH8eGp6#p@v#2;}YV_}duC{h;rW8_bfgOQVwi;=#_LmS$L zZP_F3N%rgZLVKmX&fa9#+KqOL{a3r&?y+y!_Z{FQIiB;1GtHUpEOy>v&%W) z9COY%UpY6NA6@Fc=ni#Xb${i);pV$*+;`j>x87}WJKb}!+}H~D8@Jzm8Vy9<=;-J# zqqCy9(N)pkMYl$GN86%Z(F@VO=tGZqgT0~NYhH$z<1O*t_R72(ufaR$b$MTUH@$%v zjSY&W#9oc1p<4xb0B^?&a4GFTm&hQJ&2-cYi*XU%f-6W^D6tby#SEA5=ZMHt@|dv1 zQGSuPqw}m3e=g>L1?a5oB4b$|T`eYx04*RrB7+stJ8&snFFd+gtY!J)yy)F_C38qT z3~#d;FdNpR0NM=qU|sZqIMiGR@i8OqLxMVucCv(w69Avg+;*!jfGt^x(fqz!B0 zu!gSizTzkpi2hX7@5q5vwJ9mjhFdoCVc=O$>C^@91q*&0`;T% z7n{lsqxoX6oJF^1&)N0u+G~PzowQC8!45`F+_!N0D=UI`!xukIF zmM>xpSPmT=r@cIrY+_ef3m(IZc^O|%Gsq26MHP4HM4CoV^5b$lua~Q603`9NvPaa) zB7B{+!sp~7uc4PfP~D_6c@savTR|2#U>UB&Ha^7>IYOrJ8@L7B1JA$!90U;*(12m+ z!W1|bPEdbV@s9yi(^R?oy{cB3YPOoMa#g;1Qx&TX@|tqh%W9NLRg>i{c~=g|pA=D= zN>U*p0cDk7IG;c!@UeI@e*_ot5u{lCh3>>NNDY35@8LSKLzI)_e6DEVE4kpe@z-=C zuBK0LBT}@M7qaR&?xqcRJS`{fe5oKXlUIrT^e9}(d+;hSgYOWB=wev{`srG}hxL<{ zVlV2Wd&wT0j82m0VkSSw7z6S!Pf>qUpUHi|W?!>?=z**w_r)^2Pi()aC0LQ*rl$Xke*>Eu-EIH? delta 1691 zcmX|Cdu)~U8UEdG-{l-Cf%Bd3JKyb~BGHx+AdE05wN_-66+}`xf`}CfLM2@#h+Pk2 z*C8QLT7p0dbmeN(F({XCOV@Gf5IR8C5H1};B?!oEl>j4HcNWdwC(rx5dH#4Wf4x`g zU~3($P9{D90B``r1puC@`iZbT?ZI^Y@y_h`V!QUlE-Bc!Yk9IA3Gdgoz2c=7k;klsGVPxBLv*rv$-HEEx@IhomS}%4 zvZ853W=C@)lhf{Jk)-MCmiEsy+%(@bMrj}EL-gmh7xb-KoBp!-xwhXp9r@mjn2{(? z=WUUFkPX5gHlTh?Q`!c7yjt-y z)~GbJt6GzBFP*Rc-(R7P)xU|u-sow6=j-&s%N zdfbl>jE{~_jK3eRh%b*f#P`Hc#yjJ8;y>7?9oR$c*X+s3(aG2BS$3&iZvWA)vDevK z?Va{P`c2-?1M#DCHPV%t<<#&M+s($#*6>)0|mOnN#6ZIW^8kr`b8;eC1qq z?j>NNS0YRdO5`LaB#INIiBA)?iH(W9iMB*X;@iacE^tlPb6;{txv#rL?)&b1x5{1V z*1LapTikZ{ynD^<_K4TpOL{}Rm%Re-ZEvnu;iZ;)8@wj(p!cPB-n;2N@~Pj~f7bt{ z|Egc;zw7_buk@?^dViv>!6(6rU~|wM90@vt zZ-a-S2>XUFgu}wT@Qv`Dur#a;Yr>6TbNKi0LU<#5lw`?R^4a7dbOS$3;Z?W@SI~Xv z9O+F87(<<~442ZyxRS&L5i4;HW_Uh-jEHQNyG0+-%un&X=nR{W&x(9dgigo2j{^7a28yKBYCPfyv=f8 z0bGxwXffP`bh|D&d6~xN8OYI=w#n1LZW7Pw&FVvLBit2f{;gqWZV`4;#U@ zqe2mtLrIBP1UuM6^aO>d9$rDkXezuY{{g!(z!TwhBIF42BAP`BogkOU`KXypCnk!_ zWn<7hS&7O~6IvvTYMp#5bz5$undB57NkiIS%%X!yBP@ZrVgesV^T`!hMb@jY=utXV zWWq_J7z`AJcmObD8<|2+@UdheS)lfVp?o2`%&OG|K8a0a<7gjxj^~mpcAjm+19=Hw zz{_YhxlWc+#p851ZQ+MxHD4`f45Lwy!7s`Vu}sd!*T@doLpu0UdIrSQRhq{)@g2Mo zjN<|>#7nS?+t^dGmyG0BYVYRTsXwWm0IFZ9a`mZNqH@)*)dV$JO;hiw67`|Hq~a=2 z{Z*D4D!b%Od0#$~J&Gz_Jp&}5tP%|1gUB%cA|AoJ;S~NHDN|q2m3R!P!B6phTt`-m za&nj#h_!q=NBlZIPv_xk`T#c|MVIlJDYgW+)3tagEhmTg6y5{J@+z@~Hp7{`1J4Fy zc#UYHg|ZafqI3Crc8$yw^{9*1lTElEI!by(9zV_ieImDWU;RyeDI0*x&awvdK&~R) zVk+Jy7UOB`06$E|io2qP+{U}<7TUyG#Zk73y;;Xf*$i-vo9sS5z}nGW+R56;V=)i6 sihZ)Ku`&HdUMc|5wQ2orS~vfsy&3@qJ{ZrA_~|E;=I_%?HU1p`1>fk>EC2ui diff --git a/intl/tzdata/source/be/windowsZones.res b/intl/tzdata/source/be/windowsZones.res index 29f313aff2443e94ee4cb69d3e27129ed93ec301..e6bb5af0fc01e64711e03214f04cd8f192edfff0 100644 GIT binary patch delta 1162 zcmYk+du&s66bJBgdV9y(ty_25?ba37dpi^cA|_jS4P=#+X6$v_ZidA_WYOu+;oLyX zG&&@rr~#TBd8I*zkw<{6kP-tvcn#y45aJ^!x(xY)YJ6nTnW&jF^SjkQZ1QQ&ef_@Y zo|}6Il6*VK@rt{CA);AC%1I)9EQ?;lK1OYxsr{r%GWWY>RrT94yShwT?{lX{t37sC zH*KaZ)J{)BpB(r5Q|9ttRT(KSzd!B z(*@<85wcU5ySbO2b^hi`d&i}?p{?RgQYdWeVyBkS64W<+w(V7=RcW2Mu3l>@4NJVC zg1?rt4VAn`ZZ*^`8Y(vQ$=pA*p`7b{kyNbOs|-?tozBZ;+Y5*0T*5T4jxwlC`FzsS zxS1zpxN)&^ZcacZ8iRaDRyHjzTtD598dpW#m%m@{lINRlC`m0T(dLe#rFlX9J@RH( zDSXHCj|?}rvmpzt%A%i3uaz2PW{>4XN>0mT*1S+e>7MC0?asI}*($eN_hl>luzh&? zJ}Ip}kYklTF{ zuvh&;y{cc9dt0h_NoqsOZ0>)-qVjF91Kxl=@D?0|qmYENa2_ter*I8Ehnp}8ci=}D zgWq8SrY!Q?p#<)Mg|HIB@DQ}a;}-S%pF*((`rsunRj?JICIZdfAaDQN}CJ>0gdUzB%VG}Is#UDl=KyctgxCCFq QP51%tl40Q6a^k<=zmeiQ;s5{u delta 1118 zcmYk+du&r>7{~GVZF`C>9b?C}bQjlix)=vY7DqE8#Es5D8QaR~TB3`JQA0$-z|ANw zCJq%Z5Q&6G$CfIfvC+(AWvL;kVFo5~ON>D?K%5hAAyE=9FwVQXOev-2Ddm1wso?Y+^#bQK7#|6Vjvc3kdk z>#TlBxmCioRr}4nnOD6tce|cPn5S8k5wLIwanulHm{Tq%0T<0`dh6|J>ePmjL)n~O&AScC%k^)X5LA{bzV>V{_|b&yR_f; zv{_SrQA$&`-Xis>yR=XCr{a3IOs3MhLTWm?^as-4ac@cQwd?b}QPwEl^in-2b?JwK zPt2qhrG4GL?z!BeW1*FDB;Bho$db&;KzK($FL>4X!uU9NQXa`H*DDHdWvd*8qw^izDNs$ z4%~se(Tk_>EM5c!LvF4_?MA$l@^QgheMTI$^zs_c01OVbKYTPFQF09WLS$e#766 zvc0H4rjH$g_EvP`aXg8gAkZejCcq}ZCcq}Z9>X}!;456fkN63{;167ORMbES5zv8X iE$R`+TD0O8haIht5*!`GL5$!iPVwzn7XON&YqqO3_$gfg diff --git a/intl/tzdata/source/be/zoneinfo64.res b/intl/tzdata/source/be/zoneinfo64.res index 287383991a146572445a7c9678394b692d3ed22e..44724781df00e340b14a904f44609d3ea516a66a 100644 GIT binary patch delta 15895 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 diff --git a/intl/tzdata/source/ee/metaZones.res b/intl/tzdata/source/ee/metaZones.res index d9637db379667562f8d9ac38c863679d7653c5f3..c66e0471a7cb00264d8656e815cd17869730be00 100644 GIT binary patch delta 11070 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 aN7RVzt(Y^y{}(o*B`?)$wTIX7zyAek_E)+9 delta 10981 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
  • ;=5K$;;G4e^fT91NG`AC84s}P^H6ASvwp?!WcEKr#}%UE5B(< zXXq>MiOKtrl=oD2p9f8974Kw{s8#+;o^?o*3D!FWJ9k<28?Odf4qS%gk1`M*8#g zg$sR>wA3Os+pKi4QkAgOQhXkT70UiNDpw+LsWqxk@=_{!DUz3xSteHivD$Ad}_DLt(8h|;f=s-&hQsS=kHz#E!6rRL8n{RJh_DH5FK zQfVuY+_a64s4PtLR;HccZCQ{GqT(2axUxwixqX^MrfYyiraP#)&dQ&!XSxS{*|RtF z1xX-JpRQ9XNtAK!<>Mon9;^)NEldw(EQj-TO^;A>qm_e&*6mo|P@Zq25+5ocO$DT-0Ax%7r1!%?H9k!LD>%kjb|$&$ALz^Ds063a zs<~g9wQ9QJS51zp^X2Ce$Livi1=aEz%Va62SGZbUUGedvT%g(yB)nP@F1}SDyUJV} zXa}9tny$)+H@I5fVDaHATYVYy&-rAvYRR;0Gze63tA{Du2yBv6nI8)(fz>K;)hcn- zk~q2KG^I0?sw7s=Qe#P`?9~YK#71RRH_?%s-2;nYv2tFjocR)0OLAr5N?5JtC8=Ut z3(qRs2Bn*nzNmDw(w9*=Ya48b^FP1Ul5cr}oyuVs{oSxv**`($Fmhk5a$kLzKDn<} zxvwVo)jz29r|6%Bb1myLMx|z@))viX3h7V`nPMRC89TU@lV532X;^7gX(h^~GSomu zYC!tbK&G9V@1$&teGEz^e%A<6WGexSYpnL)~Nu+nQ$IbbLZSN)On z9QUx{rVIT}v6GN2_Q!14sn~gx_!XsgfvelzSPv@aH7eIN zD%UmJ@RJL^3OnFU*x9l+TSHE3_P{<2@`U@99zf;bgK${cB&XtYROvCL$CaK?`n^*5 zs)+wdrKgmhQF>PXL=cBxltGGuaV?Tlqf+(xskN$cq0(ZdQa7@$RB5?VyHY30!_>OL zuWVsaKIFAgH5sR0rTP?BtrV6l;-{&$lQ^SYm3C8e6jW`?CrPVSMOAy5n(N10o$?=~ zRMl7QwQ8J|LX$&=!3bp>tyC3Q?N~LgS2`Y*H4{O7wrZ!Txfx1lDxIZN6<}?nVV(6& z>qpkZ)}QjsdF2~VJyc@MPH@k3FK{n*uXI1>e%bxD`(yVp_bHFrQ|1YHQl9pnKAwS| z5uRH-jh_2FD?NYpyyAJ^bI|jH*XXVAR(db;)_HIAPW9g9UG9C>`#0|g-b3CWeR)2g zFYW8<>+S338|1smH`O=ar~97pJ@0$n_o43y|Bn*0-|nyUxAR|;^uCj)mKW`-BIF>%-H-P2oqv>%v>Z?}ZP9PlSJs6h+*Tsz}Gk zrIBkQVI$y!R;Xm*roPnR=w?-{$025fC2uh$F+z^3ENJ1L;WsKIs1<)Qk z!iCTUE`sjR6E22J;qoj^9SnqPU^kjM9#+phH|^#5MLLP}VVG z8>6&i#5cAcHUOm^dkMC{EASfp9o~kWunRtbJwU8u`+!)-h;@uu$NmLWaqK7@gKyzK zly;0@$4)U=mEBWD>X1nGUzX?QjQVVGhiL1<(W(ePR(j06IJf#63aW z6U0677_0(nKk+0y4QpW?JPYe#18jnqU<+)OFuVePgV*@qS;N*XQEQn0%W7Clyk4i( J&RxrY{s+0pM#}&I diff --git a/intl/tzdata/source/ee/timezoneTypes.res b/intl/tzdata/source/ee/timezoneTypes.res index 9001738e66b843ef1620e03909f554ae6788fa21..0468354364c2784691308b9e4542a1c45d83e4f4 100644 GIT binary patch delta 1733 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 diff --git a/intl/tzdata/source/ee/windowsZones.res b/intl/tzdata/source/ee/windowsZones.res index b41ac058a71f60f849e326cc766e16a715892131..2a6500de33326ef1457f1aef6002f16df79b142c 100644 GIT binary patch delta 1162 zcmYk+du&s66bJBgdV9y(ty_25?ba37dpi^cA|_jS4P=#+X6$v_ZidA_WYOu+;oLyX zG&&@rr~#TBd8I*zkw<{6kP-tvcn#y45aJ^!x(xY)YJ6nTnW&jF^SjkQZ1QQ&ef_@Y zo|}6Il6*VK@rt{CA);AC%1I)9EQ?;lK1OYxsr{r%GWWY>RrT94yShwT?{lX{t37sC zH*KaZ)J{)BpB(r5Q|9ttRT(KSzd!B z(*@<85wcU5ySbO2b^hi`d&i}?p{?RgQYdWeVyBkS64W<+w(V7=RcW2Mu3l>@4NJVC zg1?rt4VAn`ZZ*^`8Y(vQ$=pA*p`7b{kyNbOs|-?tozBZ;+Y5*0T*5T4jxwlC`FzsS zxS1zpxN)&^ZcacZ8iRaDRyHjzTtD598dpW#m%m@{lINRlC`m0T(dLe#rFlX9J@RH( zDSXHCj|?}rvmpzt%A%i3uaz2PW{>4XN>0mT*1S+e>7MC0?asI}*($eN_hl>luzh&? zJ}Ip}kYklTF{ zuvh&;y{cc9dt0h_NoqsOZ0>)-qVjF91Kxl=@D?0|qmYENa2_ter*I8Ehnp}8ci=}D zgWq8SrY!Q?p#<)Mg|HIB@DQ}a;}-S%pF*((`rsunRj?JICIZdfAaDQN}CJ>0gdUzB%VG}Is#UDl=KyctgxCCFq QP51%tl40Q6a^k<=zmeiQ;s5{u delta 1118 zcmYk+du&r>7{~GVZF`C>9b?C}bQjlix)=vY7DqE8#Es5D8QaR~TB3`JQA0$-z|ANw zCJq%Z5Q&6G$CfIfvC+(AWvL;kVFo5~ON>D?K%5hAAyE=9FwVQXOev-2Ddm1wso?Y+^#bQK7#|6Vjvc3kdk z>#TlBxmCioRr}4nnOD6tce|cPn5S8k5wLIwanulHm{Tq%0T<0`dh6|J>ePmjL)n~O&AScC%k^)X5LA{bzV>V{_|b&yR_f; zv{_SrQA$&`-Xis>yR=XCr{a3IOs3MhLTWm?^as-4ac@cQwd?b}QPwEl^in-2b?JwK zPt2qhrG4GL?z!BeW1*FDB;Bho$db&;KzK($FL>4X!uU9NQXa`H*DDHdWvd*8qw^izDNs$ z4%~se(Tk_>EM5c!LvF4_?MA$l@^QgheMTI$^zs_c01OVbKYTPFQF09WLS$e#766 zvc0H4rjH$g_EvP`aXg8gAkZejCcq}ZCcq}Z9>X}!;456fkN63{;167ORMbES5zv8X iE$R`+TD0O8haIht5*!`GL5$!iPVwzn7XON&YqqO3_$gfg diff --git a/intl/tzdata/source/ee/zoneinfo64.res b/intl/tzdata/source/ee/zoneinfo64.res index 62b4ad086f884579012fb3c0b9b0190a8c990c4b..98764bf1510562cfe39a43f770d97164fafd8159 100644 GIT binary patch delta 15895 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 diff --git a/intl/tzdata/source/le/metaZones.res b/intl/tzdata/source/le/metaZones.res index df0feef74047b9d4a07e2fc0e3824ed2b020ca12..a4b3491223c4f07ac3bdbb8d99d02c40fbe00e7f 100644 GIT binary patch delta 10828 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 Mbfke+xPgEE8x7bnl>h($ delta 10689 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 WtJxgt8BhZIGL^v8n*5f+fBy@E%oQL2 diff --git a/intl/tzdata/source/le/timezoneTypes.res b/intl/tzdata/source/le/timezoneTypes.res index de11dd4e2ed0b176328d724adbda40abea47b6a6..895ed2174c0d381a3d660a3b353f7c07a1001582 100644 GIT binary patch delta 1674 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 h*oy6F!EUTAo{sTg9IO6~S delta 1111 zcmYk+Ye#w+6@V2p%Mcp zi3-;`+i4POuIh+>UYMlf2i#MV6@GR$M`4(JE;(Z&YFTv?4-oVGeC7PI@(Lwaj?Z;*^e+HS~Eo?AJ^Yp1n5 z-Mf?we8}sf{d~*oCmT=j)zC$5^DR#frhneyj|L~p{;#Nmr~22KH(R3D`Qz&i^@g#F z&&SVV%^#%4oEs=IZAzoKwuGDVRk@ez0{Ju}ax#!i3#zk(x(rsqTBv~r*aW+v30mPO zd=H%v1`W=^FVM?RD^nZ)Li!){06f)A?T8wkQy*a`cf3EJTY_z6zI zdFX~e;66Npzd^DKH5O7J-7Xr{EQD;xfv;g2%z(Kt9~Qw92*9_n64pR11Ys-eh6B(H zham(fpcBHN!CANfJK*BDP K@Oy+m8y^67EhfDH diff --git a/intl/tzdata/source/le/zoneinfo64.res b/intl/tzdata/source/le/zoneinfo64.res index b76aebe966a84e862771c75369efb5942cc6fbf3..43265a861357b60287fdcba799b6687704c8fc4c 100644 GIT binary patch delta 15709 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 delta 14008 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 diff --git a/intl/tzdata/source/metaZones.txt b/intl/tzdata/source/metaZones.txt index 833db95816de..9b6f84adeb82 100644 --- a/intl/tzdata/source/metaZones.txt +++ b/intl/tzdata/source/metaZones.txt @@ -813,12 +813,7 @@ metaZones:table(nofallback){ { "Europe_Western", "1985-12-31 23:00", - "2018-10-26 23:00", - } - { - "Europe_Central", - "2018-10-26 23:00", - "9999-12-31 23:59", + "2018-10-28 02:00", } } "Africa:Ceuta"{ @@ -867,12 +862,7 @@ metaZones:table(nofallback){ { "Europe_Western", "1976-04-14 01:00", - "2018-10-26 23:00", - } - { - "Europe_Central", - "2018-10-26 23:00", - "9999-12-31 23:59", + "2018-10-28 02:00", } } "Africa:Freetown"{ @@ -1045,6 +1035,11 @@ metaZones:table(nofallback){ { "Africa_Western", "2018-01-01 01:00", + "2019-01-01 01:00", + } + { + "GMT", + "2019-01-01 01:00", "9999-12-31 23:59", } } @@ -2086,6 +2081,16 @@ metaZones:table(nofallback){ { "Alaska", "2015-11-01 10:00", + "2018-11-04 10:00", + } + { + "America_Pacific", + "2018-11-04 10:00", + "2019-03-10 11:00", + } + { + "Alaska", + "2019-03-10 11:00", "9999-12-31 23:59", } } @@ -3162,6 +3167,13 @@ metaZones:table(nofallback){ "9999-12-31 23:59", } } + "Asia:Qostanay"{ + { + "Kazakhstan_Eastern", + "2004-10-30 21:00", + "9999-12-31 23:59", + } + } "Asia:Qyzylorda"{ { "Kizilorda", @@ -3176,6 +3188,11 @@ metaZones:table(nofallback){ { "Kazakhstan_Eastern", "2004-10-30 21:00", + "2018-12-20 18:00", + } + { + "Kazakhstan_Western", + "2018-12-20 18:00", "9999-12-31 23:59", } } @@ -4226,11 +4243,11 @@ metaZones:table(nofallback){ { "Kwajalein", "1970-01-01 00:00", - "1993-08-20 12:00", + "1993-08-21 12:00", } { "Marshall_Islands", - "1993-08-20 12:00", + "1993-08-21 12:00", "9999-12-31 23:59", } } diff --git a/intl/tzdata/source/timezoneTypes.txt b/intl/tzdata/source/timezoneTypes.txt index 92be78c5db3d..4bcf72720562 100644 --- a/intl/tzdata/source/timezoneTypes.txt +++ b/intl/tzdata/source/timezoneTypes.txt @@ -416,6 +416,7 @@ timezoneTypes:table(nofallback){ "Asia:Pontianak"{"idpnk"} "Asia:Pyongyang"{"kpfnj"} "Asia:Qatar"{"qadoh"} + "Asia:Qostanay"{"kzksn"} "Asia:Qyzylorda"{"kzkzo"} "Asia:Rangoon"{"mmrgn"} "Asia:Riyadh"{"saruh"} diff --git a/intl/tzdata/source/windowsZones.txt b/intl/tzdata/source/windowsZones.txt index 67d20d4811fc..e29b769c9fb8 100644 --- a/intl/tzdata/source/windowsZones.txt +++ b/intl/tzdata/source/windowsZones.txt @@ -17,8 +17,8 @@ windowsZones:table(nofallback){ "Alaskan Standard Time"{ 001{"America/Anchorage"} US{ - "America/Anchorage America/Juneau America/Metlakatla America/Nome Ame" - "rica/Sitka America/Yakutat" + "America/Anchorage America/Juneau America/Nome America/Sitka America/" + "Yakutat" } } "Aleutian Standard Time"{ @@ -130,7 +130,7 @@ windowsZones:table(nofallback){ CN{"Asia/Urumqi"} IO{"Indian/Chagos"} KG{"Asia/Bishkek"} - KZ{"Asia/Almaty Asia/Qyzylorda"} + KZ{"Asia/Almaty Asia/Qostanay"} ZZ{"Etc/GMT-6"} } "Central Brazilian Standard Time"{ @@ -468,7 +468,7 @@ windowsZones:table(nofallback){ "Pacific Standard Time"{ 001{"America/Los_Angeles"} CA{"America/Vancouver America/Dawson America/Whitehorse"} - US{"America/Los_Angeles"} + US{"America/Los_Angeles America/Metlakatla"} ZZ{"PST8PDT"} } "Pakistan Standard Time"{ @@ -779,7 +779,7 @@ windowsZones:table(nofallback){ "West Asia Standard Time"{ 001{"Asia/Tashkent"} AQ{"Antarctica/Mawson"} - KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe Asia/Atyrau"} + KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe Asia/Atyrau Asia/Qyzylorda"} MV{"Indian/Maldives"} TF{"Indian/Kerguelen"} TJ{"Asia/Dushanbe"} diff --git a/intl/tzdata/source/zoneinfo64.txt b/intl/tzdata/source/zoneinfo64.txt index 4444b8db6bc2..426680158e8e 100644 --- a/intl/tzdata/source/zoneinfo64.txt +++ b/intl/tzdata/source/zoneinfo64.txt @@ -3,9 +3,9 @@ // License & terms of use: http://www.unicode.org/copyright.html#License //--------------------------------------------------------- // Build tool: tz2icu -// Build date: Tue Oct 30 03:17:32 2018 +// Build date: Wed Jan 2 12:36:16 2019 // tz database: ftp://ftp.iana.org/tz/ -// tz version: 2018g +// tz version: 2018i // ICU version: 63.1 //--------------------------------------------------------- // >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << @@ -13,10 +13,10 @@ //--------------------------------------------------------- zoneinfo64:table(nofallback) { - TZVersion { "2018g" } + TZVersion { "2018i" } Zones:array { - /* ACT */ :int { 354 } //Z#0 - /* AET */ :int { 366 } //Z#1 + /* ACT */ :int { 355 } //Z#0 + /* AET */ :int { 367 } //Z#1 /* AGT */ :int { 64 } //Z#2 /* ART */ :int { 18 } //Z#3 /* AST */ :int { 60 } //Z#4 @@ -24,7 +24,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1830383032 } typeOffsets:intvector { -968, 0, 0, 0 } typeMap:bin { "01" } - links:intvector { 5, 11, 13, 21, 22, 27, 38, 51, 52, 55, 346 } + links:intvector { 5, 11, 13, 21, 22, 27, 38, 51, 52, 55, 347 } } //Z#5 /* Africa/Accra */ :table { trans:intvector { -1640995148, -1556841600, -1546388400, -1525305600, -1514852400, -1493769600, -1483316400, -1462233600, -1451780400, -1430611200, -1420158000, -1399075200, -1388622000, -1367539200, -1357086000, -1336003200, -1325550000, -1304380800, -1293927600, -1272844800, -1262391600, -1241308800, -1230855600, -1209772800, -1199319600, -1178150400, -1167697200, -1146614400, -1136161200, -1115078400, -1104625200, -1083542400, -1073089200, -1051920000, -1041466800, -1020384000, -1009930800, -988848000, -978394800, -957312000, -946858800, -925689600, -915236400, -894153600, -883700400, -862617600, -852164400 } @@ -56,12 +56,12 @@ zoneinfo64:table(nofallback) { trans:intvector { -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600, 799020000, 812322000, 830469600, 843771600, 861919200, 875221200, 893368800, 906670800, 925423200, 938725200, 956872800, 970174800, 988322400, 1001624400, 1019772000, 1033074000, 1051221600, 1064523600, 1083276000, 1096578000, 1114725600, 1128027600, 1146175200, 1158872400, 1177624800, 1189112400, 1209074400, 1219957200, 1240524000, 1250802000, 1272578400, 1281474000, 1284069600, 1285880400, 1400191200, 1403816400, 1406844000, 1411678800 } typeOffsets:intvector { 7509, 0, 7200, 0, 7200, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 3, 18, 400 } + links:intvector { 3, 18, 401 } } //Z#18 /* Africa/Casablanca */ :table { - trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540594800 } + trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1557021600, 1560045600, 1587261600, 1590285600, 1618106400, 1621130400, 1648346400, 1651975200, 1679191200, 1682215200, 1710036000, 1713060000, 1740276000, 1743904800, 1771120800, 1774144800, 1801965600, 1804989600, 1832205600, 1835229600, 1863050400, 1866074400, 1893290400, 1896919200, 1924135200, 1927159200, 1954980000, 1958004000, 1985220000, 1988848800, 2016064800, 2019088800, 2046304800, 2049933600, 2077149600, 2080173600, 2107994400, 2111018400, 2138234400, 2141863200 } typeOffsets:intvector { -1820, 0, 0, 0, 0, 3600, 3600, 0 } - typeMap:bin { "01020102010201020102010201020102010301020102010201020102010201020102010201020102010201020102010201020102010203" } + typeMap:bin { "0102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020301030103010301030103010301030103010301030103010301030103010301030103010301030103" } } //Z#19 /* Africa/Ceuta */ :table { transPre32:intvector { -1, 2117514496 } @@ -78,9 +78,9 @@ zoneinfo64:table(nofallback) { /* Africa/Djibouti */ :int { 48 } //Z#24 /* Africa/Douala */ :int { 36 } //Z#25 /* Africa/El_Aaiun */ :table { - trans:intvector { -1136070432, 198291600, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540594800 } + trans:intvector { -1136070432, 198291600, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1557021600, 1560045600, 1587261600, 1590285600, 1618106400, 1621130400, 1648346400, 1651975200, 1679191200, 1682215200, 1710036000, 1713060000, 1740276000, 1743904800, 1771120800, 1774144800, 1801965600, 1804989600, 1832205600, 1835229600, 1863050400, 1866074400, 1893290400, 1896919200, 1924135200, 1927159200, 1954980000, 1958004000, 1985220000, 1988848800, 2016064800, 2019088800, 2046304800, 2049933600, 2077149600, 2080173600, 2107994400, 2111018400, 2138234400, 2141863200 } typeOffsets:intvector { -3168, 0, -3600, 0, 0, 0, 0, 3600, 3600, 0 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030402040204020402040204020402040204020402040204020402040204020402040204020402040204" } } //Z#26 /* Africa/Freetown */ :int { 5 } //Z#27 /* Africa/Gaborone */ :int { 43 } //Z#28 @@ -121,7 +121,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -2109291020 } typeOffsets:intvector { 7820, 0, 7200, 0 } typeMap:bin { "01" } - links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 377 } + links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 378 } } //Z#43 /* Africa/Maseru */ :int { 30 } //Z#44 /* Africa/Mbabane */ :int { 30 } //Z#45 @@ -135,7 +135,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1309746436, -1262314800, -946780200, -315629100 } typeOffsets:intvector { 8836, 0, 9000, 0, 9900, 0, 10800, 0 } typeMap:bin { "03010203" } - links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 395, 514, 518, 523 } + links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 396, 515, 519, 524 } } //Z#48 /* Africa/Ndjamena */ :table { trans:intvector { -1830387612, 308703600, 321314400 } @@ -148,16 +148,16 @@ zoneinfo64:table(nofallback) { /* Africa/Porto-Novo */ :int { 36 } //Z#53 /* Africa/Sao_Tome */ :table { transPre32:intvector { -1, 1581055280 } - trans:intvector { -1830384000, 1514768400 } + trans:intvector { -1830384000, 1514768400, 1546304400 } typeOffsets:intvector { 1616, 0, -2205, 0, 0, 0, 3600, 0 } - typeMap:bin { "010203" } + typeMap:bin { "01020302" } } //Z#54 /* Africa/Timbuktu */ :int { 5 } //Z#55 /* Africa/Tripoli */ :table { trans:intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000, 1352505600, 1364515200, 1382659200 } typeOffsets:intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 } typeMap:bin { "0102010201020103010201020102010201020102010201020103010203010203" } - links:intvector { 56, 531 } + links:intvector { 56, 532 } } //Z#56 /* Africa/Tunis */ :table { transPre32:intvector { -1, 1497764852 } @@ -179,7 +179,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -36000 } finalYear:int { 2008 } - links:intvector { 59, 80, 615 } + links:intvector { 59, 80, 616 } } //Z#59 /* America/Anchorage */ :table { transPre32:intvector { -1, 1069743569, -1, 2106016072 } @@ -189,7 +189,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - links:intvector { 4, 60, 614 } + links:intvector { 4, 60, 615 } } //Z#60 /* America/Anguilla */ :int { 186 } //Z#61 /* America/Antigua */ :int { 186 } //Z#62 @@ -389,7 +389,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 98, 380, 617 } + links:intvector { 98, 381, 618 } } //Z#98 /* America/Chihuahua */ :table { trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 } @@ -455,7 +455,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 109, 204, 543, 623 } + links:intvector { 109, 204, 544, 624 } } //Z#109 /* America/Detroit */ :table { trans:intvector { -2051202469, -1724083200, -880218000, -765396000, -684349200, -671047200, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -464,7 +464,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 110, 622 } + links:intvector { 110, 623 } } //Z#110 /* America/Dominica */ :int { 186 } //Z#111 /* America/Edmonton */ :table { @@ -474,7 +474,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 112, 387 } + links:intvector { 112, 388 } } //Z#112 /* America/Eirunepe */ :table { trans:intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800, 1214283600, 1384056000 } @@ -558,7 +558,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - links:intvector { 128, 383 } + links:intvector { 128, 384 } } //Z#128 /* America/Havana */ :table { transPre32:intvector { -1, 1770465464 } @@ -568,7 +568,7 @@ zoneinfo64:table(nofallback) { finalRule { "Cuba" } finalRaw:int { -18000 } finalYear:int { 2014 } - links:intvector { 129, 394 } + links:intvector { 129, 395 } } //Z#129 /* America/Hermosillo */ :table { trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } @@ -583,7 +583,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 117, 131, 139, 511, 618 } + links:intvector { 117, 131, 139, 512, 619 } } //Z#131 /* America/Indiana/Knox */ :table { transPre32:intvector { -1, 1577320096 } @@ -593,7 +593,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 132, 147, 621 } + links:intvector { 132, 147, 622 } } //Z#132 /* America/Indiana/Marengo */ :table { transPre32:intvector { -1, 1577320096 } @@ -670,7 +670,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1827687170, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } typeOffsets:intvector { -18430, 0, -18000, 0, -18000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - links:intvector { 142, 528 } + links:intvector { 142, 529 } } //Z#142 /* America/Jujuy */ :int { 68 } //Z#143 /* America/Juneau */ :table { @@ -722,7 +722,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 151, 548, 624, 625 } + links:intvector { 151, 549, 625, 626 } } //Z#151 /* America/Louisville */ :int { 145 } //Z#152 /* America/Lower_Princes */ :int { 105 } //Z#153 @@ -741,7 +741,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } typeOffsets:intvector { -14404, 0, -14400, 0, -14400, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 156, 376 } + links:intvector { 156, 377 } } //Z#156 /* America/Marigot */ :int { 186 } //Z#157 /* America/Martinique */ :table { @@ -764,7 +764,7 @@ zoneinfo64:table(nofallback) { finalRule { "Mexico" } finalRaw:int { -25200 } finalYear:int { 2003 } - links:intvector { 160, 537 } + links:intvector { 160, 538 } } //Z#160 /* America/Mendoza */ :int { 70 } //Z#161 /* America/Menominee */ :table { @@ -786,12 +786,12 @@ zoneinfo64:table(nofallback) { } //Z#163 /* America/Metlakatla */ :table { transPre32:intvector { -1, 1069743569, -1, 2106011674 } - trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 1446372000, 1457866800, 1478426400 } + trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 1446372000, 1457866800, 1478426400, 1489316400, 1509876000, 1520766000, 1541325600, 1552215600, 1572775200 } typeOffsets:intvector { 54822, 0, -32400, 0, -32400, 3600, -31578, 0, -28800, 0, -28800, 3600 } - typeMap:bin { "03040504050405040504050405040504050405040504050405040504050405040504010201" } + typeMap:bin { "03040504050405040504050405040504050405040504050405040504050405040504010201020102040201" } finalRule { "US" } finalRaw:int { -32400 } - finalYear:int { 2017 } + finalYear:int { 2020 } } //Z#164 /* America/Mexico_City */ :table { trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } @@ -800,7 +800,7 @@ zoneinfo64:table(nofallback) { finalRule { "Mexico" } finalRaw:int { -21600 } finalYear:int { 2003 } - links:intvector { 165, 538 } + links:intvector { 165, 539 } } //Z#165 /* America/Miquelon */ :table { trans:intvector { -1850328920, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 } @@ -850,7 +850,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 173, 619 } + links:intvector { 173, 620 } } //Z#173 /* America/Nipigon */ :table { transPre32:intvector { -1, 1928233280 } @@ -874,7 +874,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } typeOffsets:intvector { -7780, 0, -7200, 0, -7200, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 176, 374 } + links:intvector { 176, 375 } } //Z#176 /* America/North_Dakota/Beulah */ :table { transPre32:intvector { -1, 1577323696 } @@ -936,7 +936,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } typeOffsets:intvector { -26898, 0, -25200, 0, -25200, 3600 } typeMap:bin { "0102010201020102010201" } - links:intvector { 184, 545, 616 } + links:intvector { 184, 546, 617 } } //Z#184 /* America/Port-au-Prince */ :table { transPre32:intvector { -1, 1770463056 } @@ -964,7 +964,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -873057600, -765399600 } typeOffsets:intvector { -15865, 0, -14400, 0, -14400, 3600 } typeMap:bin { "010201" } - links:intvector { 189, 547 } + links:intvector { 189, 548 } } //Z#189 /* America/Punta_Arenas */ :table { transPre32:intvector { -1, 1770462716 } @@ -998,7 +998,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -2030202084, -1632063600, -1615132800, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } typeOffsets:intvector { -25116, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 194, 385, 390 } + links:intvector { 194, 386, 391 } } //Z#194 /* America/Resolute */ :table { trans:intvector { -704937600, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -1012,7 +1012,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 1214283600, 1384056000 } typeOffsets:intvector { -16272, 0, -18000, 0, -18000, 3600, -14400, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010301" } - links:intvector { 187, 196, 373 } + links:intvector { 187, 196, 374 } } //Z#196 /* America/Rosario */ :int { 67 } //Z#197 /* America/Santa_Isabel */ :int { 216 } //Z#198 @@ -1028,7 +1028,7 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -14400 } finalYear:int { 2020 } - links:intvector { 200, 392 } + links:intvector { 200, 393 } } //Z#200 /* America/Santo_Domingo */ :table { transPre32:intvector { -1, 1770462472 } @@ -1044,7 +1044,7 @@ zoneinfo64:table(nofallback) { finalRule { "Brazil" } finalRaw:int { -10800 } finalYear:int { 2039 } - links:intvector { 202, 371, 375 } + links:intvector { 202, 372, 376 } } //Z#202 /* America/Scoresbysund */ :table { trans:intvector { -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1072,7 +1072,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -12600 } finalYear:int { 2013 } - links:intvector { 207, 379, 388 } + links:intvector { 207, 380, 389 } } //Z#207 /* America/St_Kitts */ :int { 186 } //Z#208 /* America/St_Lucia */ :int { 186 } //Z#209 @@ -1112,7 +1112,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2011 } - links:intvector { 115, 198, 216, 536 } + links:intvector { 115, 198, 216, 537 } } //Z#216 /* America/Toronto */ :table { transPre32:intvector { -1, 1928231148 } @@ -1122,7 +1122,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 170, 217, 386 } + links:intvector { 170, 217, 387 } } //Z#217 /* America/Tortola */ :int { 186 } //Z#218 /* America/Vancouver */ :table { @@ -1133,7 +1133,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 219, 389 } + links:intvector { 219, 390 } } //Z#219 /* America/Virgin */ :int { 186 } //Z#220 /* America/Whitehorse */ :table { @@ -1144,7 +1144,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 221, 391 } + links:intvector { 221, 392 } } //Z#221 /* America/Winnipeg */ :table { transPre32:intvector { -1, 1692709012 } @@ -1154,7 +1154,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 222, 384 } + links:intvector { 222, 385 } } //Z#222 /* America/Yakutat */ :table { transPre32:intvector { -1, 1069743569, -1, 2106013631 } @@ -1199,7 +1199,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 0, 0, 18000, 0, 21600, 0 } typeMap:bin { "0201" } } //Z#229 - /* Antarctica/McMurdo */ :int { 551 } //Z#230 + /* Antarctica/McMurdo */ :int { 552 } //Z#230 /* Antarctica/Palmer */ :table { trans:intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1480820400 } typeOffsets:intvector { 0, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } @@ -1210,7 +1210,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 0, 0, -10800, 0 } typeMap:bin { "01" } } //Z#232 - /* Antarctica/South_Pole */ :int { 551 } //Z#233 + /* Antarctica/South_Pole */ :int { 552 } //Z#233 /* Antarctica/Syowa */ :table { trans:intvector { -407808000 } typeOffsets:intvector { 0, 0, 10800, 0 } @@ -1229,8 +1229,8 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 0, 0, 21600, 0 } typeMap:bin { "01" } } //Z#236 - /* Arctic/Longyearbyen */ :int { 473 } //Z#237 - /* Asia/Aden */ :int { 308 } //Z#238 + /* Arctic/Longyearbyen */ :int { 474 } //Z#237 + /* Asia/Aden */ :int { 309 } //Z#238 /* Asia/Almaty */ :table { trans:intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400 } typeOffsets:intvector { 18468, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } @@ -1287,7 +1287,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1570084924 } typeOffsets:intvector { 24124, 0, 25200, 0 } typeMap:bin { "01" } - links:intvector { 250, 302, 330 } + links:intvector { 250, 302, 331 } } //Z#250 /* Asia/Barnaul */ :table { trans:intvector { -1579844100, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 801590400, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1459022400 } @@ -1324,8 +1324,8 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 27480, 0, 25200, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "010205040504050405040504050405040504050405040504050405040504050405040504050405040504050405040203020302" } } //Z#257 - /* Asia/Chongqing */ :int { 313 } //Z#258 - /* Asia/Chungking */ :int { 313 } //Z#259 + /* Asia/Chongqing */ :int { 314 } //Z#258 + /* Asia/Chungking */ :int { 314 } //Z#259 /* Asia/Colombo */ :table { transPre32:intvector { -1, 1454807332 } trans:intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 } @@ -1346,7 +1346,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -891582800, -872058600, -862637400, -576138600, 1245430800, 1262278800 } typeOffsets:intvector { 21700, 0, 19800, 0, 21200, 0, 21600, 0, 21600, 3600, 23400, 0 } typeMap:bin { "02050105030403" } - links:intvector { 261, 263, 372 } + links:intvector { 261, 263, 373 } } //Z#263 /* Asia/Dili */ :table { trans:intvector { -1830414140, -879152400, 199897200, 969120000 } @@ -1381,7 +1381,7 @@ zoneinfo64:table(nofallback) { finalRaw:int { 7200 } finalYear:int { 2017 } } //Z#268 - /* Asia/Harbin */ :int { 313 } //Z#269 + /* Asia/Harbin */ :int { 314 } //Z#269 /* Asia/Hebron */ :table { transPre32:intvector { -1, 2109557273 } trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600, 1458946800, 1477692000 } @@ -1395,13 +1395,13 @@ zoneinfo64:table(nofallback) { trans:intvector { -2004073600, -1851577590, -852105600, -782643600, -767869200, -718095600, -457776000, -315648000, 171820800 } typeOffsets:intvector { 25600, 0, 25200, 0, 25590, 0, 28800, 0, 32400, 0 } typeMap:bin { "020103040103010301" } - links:intvector { 271, 309, 629 } + links:intvector { 271, 310, 630 } } //Z#271 /* Asia/Hong_Kong */ :table { - trans:intvector { -2056693002, -907389000, -891667800, -884246400, -766746000, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -542352600, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } - typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 3600, 32400, 0 } - typeMap:bin { "010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 272, 510 } + trans:intvector { -2056690800, -900909000, -891579600, -884248200, -766659600, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -541661400, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } + typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 3600, 30600, 0, 32400, 0 } + typeMap:bin { "010203040102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 272, 511 } } //Z#272 /* Asia/Hovd */ :table { trans:intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800, 1427482800, 1443196800, 1458932400, 1474646400 } @@ -1413,7 +1413,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 25025, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } } //Z#274 - /* Asia/Istanbul */ :int { 457 } //Z#275 + /* Asia/Istanbul */ :int { 458 } //Z#275 /* Asia/Jakarta */ :table { trans:intvector { -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 } typeOffsets:intvector { 25632, 0, 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } @@ -1432,7 +1432,7 @@ zoneinfo64:table(nofallback) { finalRule { "Zion" } finalRaw:int { 7200 } finalYear:int { 2014 } - links:intvector { 278, 320, 526 } + links:intvector { 278, 321, 527 } } //Z#278 /* Asia/Kabul */ :table { transPre32:intvector { -1, 1770429088 } @@ -1449,9 +1449,9 @@ zoneinfo64:table(nofallback) { trans:intvector { -1988166492, -862637400, -764145000, -576135000, 1018119600, 1033840800, 1212260400, 1225476000, 1239735600, 1257012000 } typeOffsets:intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } typeMap:bin { "03040301020102010201" } - links:intvector { 281, 544 } + links:intvector { 281, 545 } } //Z#281 - /* Asia/Kashgar */ :int { 328 } //Z#282 + /* Asia/Kashgar */ :int { 329 } //Z#282 /* Asia/Kathmandu */ :table { trans:intvector { -1577943676, 504901800 } typeOffsets:intvector { 20476, 0, 19800, 0, 20700, 0 } @@ -1469,7 +1469,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -2019705670, -891581400, -872058600, -862637400, -764145000 } typeOffsets:intvector { 21208, 0, 19270, 0, 19800, 0, 19800, 3600, 21200, 0 } typeMap:bin { "04010203020302" } - links:intvector { 255, 286, 512 } + links:intvector { 255, 286, 513 } } //Z#286 /* Asia/Krasnoyarsk */ :table { trans:intvector { -1577513486, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288465200, 1301166000, 1414260000 } @@ -1487,7 +1487,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } typeMap:bin { "010203020302030203020302030203020402" } } //Z#289 - /* Asia/Kuwait */ :int { 308 } //Z#290 + /* Asia/Kuwait */ :int { 309 } //Z#290 /* Asia/Macao */ :int { 292 } //Z#291 /* Asia/Macau */ :table { trans:intvector { -2056692850, -884509200, -873280800, -855918000, -841744800, -828529200, -765363600, -747046800, -733827600, -716461200, -697021200, -683715600, -667990800, -654771600, -636627600, -623322000, -605178000, -591872400, -573642000, -559818000, -541674000, -528368400, -510224400, -498128400, -478774800, -466678800, -446720400, -435229200, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132820200, -117088200, -101370600, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } @@ -1504,7 +1504,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1172908656, -880272000, -766054800 } typeOffsets:intvector { 28656, 0, 28800, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 294, 325 } + links:intvector { 294, 326 } } //Z#294 /* Asia/Manila */ :table { transPre32:intvector { -1, 350346256, -1, 2065645456 } @@ -1520,7 +1520,7 @@ zoneinfo64:table(nofallback) { finalRule { "EUAsia" } finalRaw:int { 7200 } finalYear:int { 2000 } - links:intvector { 297, 472 } + links:intvector { 297, 473 } } //Z#297 /* Asia/Novokuznetsk */ :table { trans:intvector { -1441259328, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288468800, 1301169600 } @@ -1559,146 +1559,152 @@ zoneinfo64:table(nofallback) { typeMap:bin { "0201" } links:intvector { 248, 305 } } //Z#305 - /* Asia/Qyzylorda */ :table { - trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695768400, 701812800, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } - typeOffsets:intvector { 15712, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010304050403040304030403040304030403040304030203050403040304030403040304030403040304030403040304030405" } + /* Asia/Qostanay */ :table { + trans:intvector { -1441167268, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } + typeOffsets:intvector { 15268, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "010304050403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030405" } } //Z#306 - /* Asia/Rangoon */ :int { 333 } //Z#307 + /* Asia/Qyzylorda */ :table { + trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695768400, 701812800, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1545328800 } + typeOffsets:intvector { 15712, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "01030405040304030403040304030403040304030403020305040304030403040304030403040304030403040304030403040503" } + } //Z#307 + /* Asia/Rangoon */ :int { 334 } //Z#308 /* Asia/Riyadh */ :table { trans:intvector { -719636812 } typeOffsets:intvector { 11212, 0, 10800, 0 } typeMap:bin { "01" } - links:intvector { 238, 290, 308 } - } //Z#308 - /* Asia/Saigon */ :int { 271 } //Z#309 + links:intvector { 238, 290, 309 } + } //Z#309 + /* Asia/Saigon */ :int { 271 } //Z#310 /* Asia/Sakhalin */ :table { trans:intvector { -2031039048, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200, 1459008000 } typeOffsets:intvector { 34248, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } typeMap:bin { "010405040504050405040504050405040504050405040302040504050405040504050403020302030203020302030203020302030203020302030203020302040204" } - } //Z#310 + } //Z#311 /* Asia/Samarkand */ :table { trans:intvector { -1441168073, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686091600 } typeOffsets:intvector { 16073, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010203040302030203020302030203020302030203020302" } - } //Z#311 + } //Z#312 /* Asia/Seoul */ :table { trans:intvector { -1948782472, -1830414600, -498128400, -462702600, -451733400, -429784200, -418296600, -399544200, -387451800, -368094600, -356002200, -336645000, -324552600, -305195400, -293103000, -264933000, 547578000, 560883600, 579027600, 592333200 } typeOffsets:intvector { 30472, 0, 30600, 0, 30600, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "0103010201020102010201020102010304030403" } - links:intvector { 312, 596 } - } //Z#312 + links:intvector { 313, 597 } + } //Z#313 /* Asia/Shanghai */ :table { transPre32:intvector { -1, 2117485353 } trans:intvector { -933667200, -922093200, -908870400, -888829200, -881049600, -767869200, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -650019600, 515527200, 527014800, 545162400, 558464400, 577216800, 589914000, 608666400, 621968400, 640116000, 653418000, 671565600, 684867600 } typeOffsets:intvector { 29143, 0, 28800, 0, 28800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201" } - links:intvector { 258, 259, 269, 313, 382, 546 } - } //Z#313 + links:intvector { 258, 259, 269, 314, 383, 547 } + } //Z#314 /* Asia/Singapore */ :table { trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "01020304060405" } - links:intvector { 314, 598 } - } //Z#314 + links:intvector { 315, 599 } + } //Z#315 /* Asia/Srednekolymsk */ :table { trans:intvector { -1441188892, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#315 + } //Z#316 /* Asia/Taipei */ :table { transPre32:intvector { -1, 1959718936 } trans:intvector { -1017820800, -766224000, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 299606400, 307551600 } typeOffsets:intvector { 29160, 0, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 316, 595 } - } //Z#316 + links:intvector { 317, 596 } + } //Z#317 /* Asia/Tashkent */ :table { trans:intvector { -1441168631, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600 } typeOffsets:intvector { 16631, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#317 + } //Z#318 /* Asia/Tbilisi */ :table { trans:intvector { -1441162751, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 } typeOffsets:intvector { 10751, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102030403040304030403040304030403040304020103" } - } //Z#318 + } //Z#319 /* Asia/Tehran */ :table { - trans:intvector { -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742589000, 1758483000, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800 } + trans:intvector { -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742589000, 1758483000, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800, 2121193800, 2137087800 } + transPost32:intvector { 0, -2142151096, 0, -2126257096, 0, -2110615096, 0, -2094721096, 0, -2079079096, 0, -2063185096, 0, -2047543096, 0, -2031649096, 0, -2015920696, 0, -2000026696, 0, -1984384696, 0, -1968490696, 0, -1952848696, 0, -1936954696, 0, -1921312696, 0, -1905418696, 0, -1889690296, 0, -1873796296, 0, -1858154296, 0, -1842260296, 0, -1826618296, 0, -1810724296, 0, -1795082296, 0, -1779188296, 0, -1763459896, 0, -1747565896, 0, -1731923896, 0, -1716029896, 0, -1700387896, 0, -1684493896, 0, -1668851896, 0, -1652957896, 0, -1637229496, 0, -1621335496, 0, -1605693496, 0, -1589799496, 0, -1574157496, 0, -1558263496, 0, -1542621496, 0, -1526727496, 0, -1510999096, 0, -1495105096, 0, -1479463096, 0, -1463569096, 0, -1447927096, 0, -1432033096, 0, -1416391096, 0, -1400497096, 0, -1384855096, 0, -1368961096, 0, -1353232696, 0, -1337338696, 0, -1321696696, 0, -1305802696, 0, -1290160696, 0, -1274266696, 0, -1258624696, 0, -1242730696, 0, -1227002296, 0, -1211108296, 0, -1195466296, 0, -1179572296, 0, -1163930296, 0, -1148036296, 0, -1132394296, 0, -1116500296, 0, -1100771896, 0, -1084877896, 0, -1069235896, 0, -1053341896, 0, -1037699896, 0, -1021805896, 0, -1006163896, 0, -990269896, 0, -974541496, 0, -958647496, 0, -943005496, 0, -927111496, 0, -911469496, 0, -895575496, 0, -879933496, 0, -864039496, 0, -848311096, 0, -832417096, 0, -816775096, 0, -800881096, 0, -785239096, 0, -769345096, 0, -753703096, 0, -737809096, 0, -722080696, 0, -706186696, 0, -690544696, 0, -674650696, 0, -659008696, 0, -643114696, 0, -627472696, 0, -611578696, 0, -595850296, 0, -579956296, 0, -564314296, 0, -548420296 } typeOffsets:intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "01030403010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + typeMap:bin { "010304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } finalRule { "Iran" } finalRaw:int { 12600 } - finalYear:int { 2037 } - links:intvector { 319, 525 } - } //Z#319 - /* Asia/Tel_Aviv */ :int { 278 } //Z#320 - /* Asia/Thimbu */ :int { 322 } //Z#321 + finalYear:int { 2089 } + links:intvector { 320, 526 } + } //Z#320 + /* Asia/Tel_Aviv */ :int { 278 } //Z#321 + /* Asia/Thimbu */ :int { 323 } //Z#322 /* Asia/Thimphu */ :table { trans:intvector { -706341516, 560025000 } typeOffsets:intvector { 21516, 0, 19800, 0, 21600, 0 } typeMap:bin { "0102" } - links:intvector { 321, 322 } - } //Z#322 + links:intvector { 322, 323 } + } //Z#323 /* Asia/Tokyo */ :table { transPre32:intvector { -1, 1707254896 } trans:intvector { -683802000, -672310800, -654771600, -640861200, -620298000, -609411600, -588848400, -577962000 } typeOffsets:intvector { 33539, 0, 32400, 0, 32400, 3600 } typeMap:bin { "010201020102010201" } - links:intvector { 323, 527, 529 } - } //Z#323 + links:intvector { 324, 528, 530 } + } //Z#324 /* Asia/Tomsk */ :table { trans:intvector { -1578807591, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1020193200, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1464465600 } typeOffsets:intvector { 20391, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304020102010201020102010201020102010201030103" } - } //Z#324 - /* Asia/Ujung_Pandang */ :int { 294 } //Z#325 + } //Z#325 + /* Asia/Ujung_Pandang */ :int { 294 } //Z#326 /* Asia/Ulaanbaatar */ :table { trans:intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200, 1427479200, 1443193200, 1458928800, 1474642800 } typeOffsets:intvector { 25652, 0, 25200, 0, 28800, 0, 28800, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - links:intvector { 326, 327 } - } //Z#326 - /* Asia/Ulan_Bator */ :int { 326 } //Z#327 + links:intvector { 327, 328 } + } //Z#327 + /* Asia/Ulan_Bator */ :int { 327 } //Z#328 /* Asia/Urumqi */ :table { trans:intvector { -1325483420 } typeOffsets:intvector { 21020, 0, 21600, 0 } typeMap:bin { "01" } - links:intvector { 282, 328 } - } //Z#328 + links:intvector { 282, 329 } + } //Z#329 /* Asia/Ust-Nera */ :table { trans:intvector { -1579426374, -1247558400, 354898800, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1315828800, 1414249200 } typeOffsets:intvector { 34374, 0, 28800, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "010206050605060506050605060506050605060506050403050605060506050605060506050605060506050605060506050605060506050605060506050605070503" } - } //Z#329 - /* Asia/Vientiane */ :int { 250 } //Z#330 + } //Z#330 + /* Asia/Vientiane */ :int { 250 } //Z#331 /* Asia/Vladivostok */ :table { trans:intvector { -1487321251, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701798400, 717523200, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } typeOffsets:intvector { 31651, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#331 + } //Z#332 /* Asia/Yakutsk */ :table { trans:intvector { -1579423138, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } typeOffsets:intvector { 31138, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#332 + } //Z#333 /* Asia/Yangon */ :table { trans:intvector { -1577946287, -873268200, -778410000 } typeOffsets:intvector { 23087, 0, 23400, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 307, 333 } - } //Z#333 + links:intvector { 308, 334 } + } //Z#334 /* Asia/Yekaterinburg */ :table { trans:intvector { -1688270553, -1592610305, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1111870800, 1130619600, 1143320400, 1162069200, 1174770000, 1193518800, 1206824400, 1224968400, 1238274000, 1256418000, 1269723600, 1288472400, 1301173200, 1414267200 } typeOffsets:intvector { 14553, 0, 13505, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010204050405040504050405040504050405040504050403020405040504050405040504050405040504050405040504050405040504050405040504050405040604" } - } //Z#334 + } //Z#335 /* Asia/Yerevan */ :table { trans:intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288476000, 1301176800, 1319925600 } typeOffsets:intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102010203040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 335, 539 } - } //Z#335 + links:intvector { 336, 540 } + } //Z#336 /* Atlantic/Azores */ :table { transPre32:intvector { -1, 1581063056 } trans:intvector { -1830376800, -1689548400, -1677794400, -1667430000, -1647730800, -1635807600, -1616194800, -1604358000, -1584658800, -1572735600, -1553036400, -1541199600, -1521500400, -1442444400, -1426806000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922662000, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, 228272400, 243997200, 260326800, 276051600, 291776400, 307504800, 323226000, 338954400, 354679200, 370404000, 386128800, 401853600, 417582000, 433303200, 449028000, 465357600, 481082400, 496807200, 512532000, 528256800, 543981600, 559706400, 575431200, 591156000, 606880800, 622605600, 638330400, 654660000, 670384800, 686109600, 701834400, 717559200, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1707,7 +1713,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -3600 } finalYear:int { 1997 } - } //Z#336 + } //Z#337 /* Atlantic/Bermuda */ :table { trans:intvector { -1262281242, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -15558, 0, -14400, 0, -14400, 3600 } @@ -1715,7 +1721,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#337 + } //Z#338 /* Atlantic/Canary */ :table { trans:intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 } @@ -1723,13 +1729,13 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#338 + } //Z#339 /* Atlantic/Cape_Verde */ :table { trans:intvector { -1830376800, -862610400, -764118000, 186120000 } typeOffsets:intvector { -5644, 0, -7200, 0, -7200, 3600, -3600, 0 } typeMap:bin { "01020103" } - } //Z#339 - /* Atlantic/Faeroe */ :int { 341 } //Z#340 + } //Z#340 + /* Atlantic/Faeroe */ :int { 342 } //Z#341 /* Atlantic/Faroe */ :table { trans:intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -1624, 0, 0, 0, 0, 3600 } @@ -1737,9 +1743,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 340, 341 } - } //Z#341 - /* Atlantic/Jan_Mayen */ :int { 473 } //Z#342 + links:intvector { 341, 342 } + } //Z#342 + /* Atlantic/Jan_Mayen */ :int { 474 } //Z#343 /* Atlantic/Madeira */ :table { trans:intvector { -1830380400, -1689552000, -1677798000, -1667433600, -1647734400, -1635811200, -1616198400, -1604361600, -1584662400, -1572739200, -1553040000, -1541203200, -1521504000, -1442448000, -1426809600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922665600, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } @@ -1747,25 +1753,25 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#343 + } //Z#344 /* Atlantic/Reykjavik */ :table { trans:intvector { -1956609120, -1668211200, -1647212400, -1636675200, -1613430000, -1605139200, -1581894000, -1539561600, -1531350000, -968025600, -952293600, -942008400, -920239200, -909957600, -888789600, -877903200, -857944800, -846453600, -826495200, -815004000, -795045600, -783554400, -762991200, -752104800, -731541600, -717631200, -700092000, -686181600, -668642400, -654732000, -636588000, -623282400, -605743200, -591832800, -573688800, -559778400, -542239200, -528328800, -510789600, -496879200, -479340000, -465429600, -447890400, -433980000, -415836000, -401925600, -384386400, -370476000, -352936800, -339026400, -321487200, -307576800, -290037600, -276127200, -258588000, -244677600, -226533600, -212623200, -195084000, -181173600, -163634400, -149724000, -132184800, -118274400, -100735200, -86824800, -68680800, -54770400 } typeOffsets:intvector { -5280, 0, -3600, 0, -3600, 3600, 0, 0 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 344, 513 } - } //Z#344 + links:intvector { 345, 514 } + } //Z#345 /* Atlantic/South_Georgia */ :table { transPre32:intvector { -1, 1770454464 } typeOffsets:intvector { -8768, 0, -7200, 0 } typeMap:bin { "01" } - } //Z#345 - /* Atlantic/St_Helena */ :int { 5 } //Z#346 + } //Z#346 + /* Atlantic/St_Helena */ :int { 5 } //Z#347 /* Atlantic/Stanley */ :table { trans:intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400, 1019365200, 1030860000, 1050814800, 1062914400, 1082264400, 1094364000, 1113714000, 1125813600, 1145163600, 1157263200, 1176613200, 1188712800, 1208667600, 1220767200, 1240117200, 1252216800, 1271566800, 1283666400 } typeOffsets:intvector { -13884, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010304030403020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#347 - /* Australia/ACT */ :int { 366 } //Z#348 + } //Z#348 + /* Australia/ACT */ :int { 367 } //Z#349 /* Australia/Adelaide */ :table { transPre32:intvector { -1, 1930857236, -1, 2064778096 } trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1774,15 +1780,15 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 349, 365 } - } //Z#349 + links:intvector { 350, 366 } + } //Z#350 /* Australia/Brisbane */ :table { transPre32:intvector { -1, 1928175368 } trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } typeOffsets:intvector { 36728, 0, 36000, 0, 36000, 3600 } typeMap:bin { "0102010201020102010201020102010201" } - links:intvector { 350, 364 } - } //Z#350 + links:intvector { 351, 365 } + } //Z#351 /* Australia/Broken_Hill */ :table { transPre32:intvector { -1, 1930856548, -1, 1980016096, -1, 2064778096 } trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1791,9 +1797,9 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 351, 370 } - } //Z#351 - /* Australia/Canberra */ :int { 366 } //Z#352 + links:intvector { 352, 371 } + } //Z#352 + /* Australia/Canberra */ :int { 367 } //Z#353 /* Australia/Currie */ :table { transPre32:intvector { -1, 1949172768 } trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } @@ -1802,20 +1808,20 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2009 } - } //Z#353 + } //Z#354 /* Australia/Darwin */ :table { transPre32:intvector { -1, 1930859096, -1, 2064778096 } trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400 } typeOffsets:intvector { 31400, 0, 32400, 0, 34200, 0, 34200, 3600 } typeMap:bin { "01020302030203020302" } - links:intvector { 0, 354, 362 } - } //Z#354 + links:intvector { 0, 355, 363 } + } //Z#355 /* Australia/Eucla */ :table { transPre32:intvector { -1, 1957038768 } trans:intvector { -1672562640, -1665387900, -883637100, -876123900, -860395500, -844674300, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 } typeOffsets:intvector { 30928, 0, 31500, 0, 31500, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - } //Z#355 + } //Z#356 /* Australia/Hobart */ :table { transPre32:intvector { -1, 1949171940 } trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } @@ -1824,15 +1830,15 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 356, 367 } - } //Z#356 - /* Australia/LHI */ :int { 359 } //Z#357 + links:intvector { 357, 368 } + } //Z#357 + /* Australia/LHI */ :int { 360 } //Z#358 /* Australia/Lindeman */ :table { transPre32:intvector { -1, 1928176340 } trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200 } typeOffsets:intvector { 35756, 0, 36000, 0, 36000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#358 + } //Z#359 /* Australia/Lord_Howe */ :table { transPre32:intvector { -1, 1930852316 } trans:intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 } @@ -1841,8 +1847,8 @@ zoneinfo64:table(nofallback) { finalRule { "LH" } finalRaw:int { 37800 } finalYear:int { 2009 } - links:intvector { 357, 359 } - } //Z#359 + links:intvector { 358, 360 } + } //Z#360 /* Australia/Melbourne */ :table { transPre32:intvector { -1, 1930855704 } trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1851,19 +1857,19 @@ zoneinfo64:table(nofallback) { finalRule { "AV" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 360, 368 } - } //Z#360 - /* Australia/NSW */ :int { 366 } //Z#361 - /* Australia/North */ :int { 354 } //Z#362 + links:intvector { 361, 369 } + } //Z#361 + /* Australia/NSW */ :int { 367 } //Z#362 + /* Australia/North */ :int { 355 } //Z#363 /* Australia/Perth */ :table { transPre32:intvector { -1, 1957041892 } trans:intvector { -1672559940, -1665385200, -883634400, -876121200, -860392800, -844671600, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 } typeOffsets:intvector { 27804, 0, 28800, 0, 28800, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - links:intvector { 363, 369 } - } //Z#363 - /* Australia/Queensland */ :int { 350 } //Z#364 - /* Australia/South */ :int { 349 } //Z#365 + links:intvector { 364, 370 } + } //Z#364 + /* Australia/Queensland */ :int { 351 } //Z#365 + /* Australia/South */ :int { 350 } //Z#366 /* Australia/Sydney */ :table { transPre32:intvector { -1, 1930854204 } trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1872,19 +1878,19 @@ zoneinfo64:table(nofallback) { finalRule { "AN" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 1, 348, 352, 361, 366 } - } //Z#366 - /* Australia/Tasmania */ :int { 356 } //Z#367 - /* Australia/Victoria */ :int { 360 } //Z#368 - /* Australia/West */ :int { 363 } //Z#369 - /* Australia/Yancowinna */ :int { 351 } //Z#370 - /* BET */ :int { 202 } //Z#371 - /* BST */ :int { 263 } //Z#372 - /* Brazil/Acre */ :int { 196 } //Z#373 - /* Brazil/DeNoronha */ :int { 176 } //Z#374 - /* Brazil/East */ :int { 202 } //Z#375 - /* Brazil/West */ :int { 156 } //Z#376 - /* CAT */ :int { 43 } //Z#377 + links:intvector { 1, 349, 353, 362, 367 } + } //Z#367 + /* Australia/Tasmania */ :int { 357 } //Z#368 + /* Australia/Victoria */ :int { 361 } //Z#369 + /* Australia/West */ :int { 364 } //Z#370 + /* Australia/Yancowinna */ :int { 352 } //Z#371 + /* BET */ :int { 202 } //Z#372 + /* BST */ :int { 263 } //Z#373 + /* Brazil/Acre */ :int { 196 } //Z#374 + /* Brazil/DeNoronha */ :int { 176 } //Z#375 + /* Brazil/East */ :int { 202 } //Z#376 + /* Brazil/West */ :int { 156 } //Z#377 + /* CAT */ :int { 43 } //Z#378 /* CET */ :table { trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 3600, 0, 3600, 3600 } @@ -1892,9 +1898,9 @@ zoneinfo64:table(nofallback) { finalRule { "C-Eur" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#378 - /* CNT */ :int { 207 } //Z#379 - /* CST */ :int { 98 } //Z#380 + } //Z#379 + /* CNT */ :int { 207 } //Z#380 + /* CST */ :int { 98 } //Z#381 /* CST6CDT */ :table { trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } typeOffsets:intvector { -21600, 0, -21600, 3600 } @@ -1902,22 +1908,22 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#381 - /* CTT */ :int { 313 } //Z#382 - /* Canada/Atlantic */ :int { 128 } //Z#383 - /* Canada/Central */ :int { 222 } //Z#384 - /* Canada/East-Saskatchewan */ :int { 194 } //Z#385 - /* Canada/Eastern */ :int { 217 } //Z#386 - /* Canada/Mountain */ :int { 112 } //Z#387 - /* Canada/Newfoundland */ :int { 207 } //Z#388 - /* Canada/Pacific */ :int { 219 } //Z#389 - /* Canada/Saskatchewan */ :int { 194 } //Z#390 - /* Canada/Yukon */ :int { 221 } //Z#391 - /* Chile/Continental */ :int { 200 } //Z#392 - /* Chile/EasterIsland */ :int { 555 } //Z#393 - /* Cuba */ :int { 129 } //Z#394 - /* EAT */ :int { 48 } //Z#395 - /* ECT */ :int { 474 } //Z#396 + } //Z#382 + /* CTT */ :int { 314 } //Z#383 + /* Canada/Atlantic */ :int { 128 } //Z#384 + /* Canada/Central */ :int { 222 } //Z#385 + /* Canada/East-Saskatchewan */ :int { 194 } //Z#386 + /* Canada/Eastern */ :int { 217 } //Z#387 + /* Canada/Mountain */ :int { 112 } //Z#388 + /* Canada/Newfoundland */ :int { 207 } //Z#389 + /* Canada/Pacific */ :int { 219 } //Z#390 + /* Canada/Saskatchewan */ :int { 194 } //Z#391 + /* Canada/Yukon */ :int { 221 } //Z#392 + /* Chile/Continental */ :int { 200 } //Z#393 + /* Chile/EasterIsland */ :int { 556 } //Z#394 + /* Cuba */ :int { 129 } //Z#395 + /* EAT */ :int { 48 } //Z#396 + /* ECT */ :int { 475 } //Z#397 /* EET */ :table { trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 7200, 0, 7200, 3600 } @@ -1925,10 +1931,10 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - } //Z#397 + } //Z#398 /* EST */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#398 + } //Z#399 /* EST5EDT */ :table { trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -880218000, -765396000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } typeOffsets:intvector { -18000, 0, -18000, 3600 } @@ -1936,108 +1942,108 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#399 - /* Egypt */ :int { 18 } //Z#400 - /* Eire */ :int { 452 } //Z#401 + } //Z#400 + /* Egypt */ :int { 18 } //Z#401 + /* Eire */ :int { 453 } //Z#402 /* Etc/GMT */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 402, 403, 416, 431, 432, 504, 505, 506, 507, 508 } - } //Z#402 - /* Etc/GMT+0 */ :int { 402 } //Z#403 + links:intvector { 403, 404, 417, 432, 433, 505, 506, 507, 508, 509 } + } //Z#403 + /* Etc/GMT+0 */ :int { 403 } //Z#404 /* Etc/GMT+1 */ :table { typeOffsets:intvector { -3600, 0 } - } //Z#404 + } //Z#405 /* Etc/GMT+10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#405 + } //Z#406 /* Etc/GMT+11 */ :table { typeOffsets:intvector { -39600, 0 } - } //Z#406 + } //Z#407 /* Etc/GMT+12 */ :table { typeOffsets:intvector { -43200, 0 } - } //Z#407 + } //Z#408 /* Etc/GMT+2 */ :table { typeOffsets:intvector { -7200, 0 } - } //Z#408 + } //Z#409 /* Etc/GMT+3 */ :table { typeOffsets:intvector { -10800, 0 } - } //Z#409 + } //Z#410 /* Etc/GMT+4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#410 + } //Z#411 /* Etc/GMT+5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#411 + } //Z#412 /* Etc/GMT+6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#412 + } //Z#413 /* Etc/GMT+7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#413 + } //Z#414 /* Etc/GMT+8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#414 + } //Z#415 /* Etc/GMT+9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#415 - /* Etc/GMT-0 */ :int { 402 } //Z#416 + } //Z#416 + /* Etc/GMT-0 */ :int { 403 } //Z#417 /* Etc/GMT-1 */ :table { typeOffsets:intvector { 3600, 0 } - } //Z#417 + } //Z#418 /* Etc/GMT-10 */ :table { typeOffsets:intvector { 36000, 0 } - } //Z#418 + } //Z#419 /* Etc/GMT-11 */ :table { typeOffsets:intvector { 39600, 0 } - } //Z#419 + } //Z#420 /* Etc/GMT-12 */ :table { typeOffsets:intvector { 43200, 0 } - } //Z#420 + } //Z#421 /* Etc/GMT-13 */ :table { typeOffsets:intvector { 46800, 0 } - } //Z#421 + } //Z#422 /* Etc/GMT-14 */ :table { typeOffsets:intvector { 50400, 0 } - } //Z#422 + } //Z#423 /* Etc/GMT-2 */ :table { typeOffsets:intvector { 7200, 0 } - } //Z#423 + } //Z#424 /* Etc/GMT-3 */ :table { typeOffsets:intvector { 10800, 0 } - } //Z#424 + } //Z#425 /* Etc/GMT-4 */ :table { typeOffsets:intvector { 14400, 0 } - } //Z#425 + } //Z#426 /* Etc/GMT-5 */ :table { typeOffsets:intvector { 18000, 0 } - } //Z#426 + } //Z#427 /* Etc/GMT-6 */ :table { typeOffsets:intvector { 21600, 0 } - } //Z#427 + } //Z#428 /* Etc/GMT-7 */ :table { typeOffsets:intvector { 25200, 0 } - } //Z#428 + } //Z#429 /* Etc/GMT-8 */ :table { typeOffsets:intvector { 28800, 0 } - } //Z#429 + } //Z#430 /* Etc/GMT-9 */ :table { typeOffsets:intvector { 32400, 0 } - } //Z#430 - /* Etc/GMT0 */ :int { 402 } //Z#431 - /* Etc/Greenwich */ :int { 402 } //Z#432 + } //Z#431 + /* Etc/GMT0 */ :int { 403 } //Z#432 + /* Etc/Greenwich */ :int { 403 } //Z#433 /* Etc/UCT */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 433, 613 } - } //Z#433 + links:intvector { 434, 614 } + } //Z#434 /* Etc/UTC */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 434, 435, 437, 627, 628, 632 } - } //Z#434 - /* Etc/Universal */ :int { 434 } //Z#435 + links:intvector { 435, 436, 438, 628, 629, 633 } + } //Z#435 + /* Etc/Universal */ :int { 435 } //Z#436 /* Etc/Unknown */ :table { typeOffsets:intvector { 0, 0 } - } //Z#436 - /* Etc/Zulu */ :int { 434 } //Z#437 + } //Z#437 + /* Etc/Zulu */ :int { 435 } //Z#438 /* Europe/Amsterdam */ :table { trans:intvector { -1693700372, -1680484772, -1663453172, -1650147572, -1633213172, -1617488372, -1601158772, -1586038772, -1569709172, -1554589172, -1538259572, -1523139572, -1507501172, -1490566772, -1470176372, -1459117172, -1443997172, -1427667572, -1406672372, -1396217972, -1376950772, -1364768372, -1345414772, -1333318772, -1313792372, -1301264372, -1282256372, -1269814772, -1250720372, -1238365172, -1219184372, -1206915572, -1186957172, -1175465972, -1156025972, -1143411572, -1124489972, -1111961972, -1092953972, -1080512372, -1061331572, -1049062772, -1029190772, -1025745572, -1017613200, -998259600, -986163600, -966723600, -954109200, -935022000, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 1172, 0, 1172, 3600, 1200, 0, 1200, 3600, 3600, 0, 3600, 3600 } @@ -2045,7 +2051,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#438 + } //Z#439 /* Europe/Andorra */ :table { transPre32:intvector { -1, 2117514132 } trans:intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2054,12 +2060,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#439 + } //Z#440 /* Europe/Astrakhan */ :table { trans:intvector { -1441249932, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11532, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403040302010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#440 + } //Z#441 /* Europe/Athens */ :table { trans:intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5692, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -2067,8 +2073,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - } //Z#441 - /* Europe/Belfast */ :int { 464 } //Z#442 + } //Z#442 + /* Europe/Belfast */ :int { 465 } //Z#443 /* Europe/Belgrade */ :table { transPre32:intvector { -1, 1581051976 } trans:intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2077,8 +2083,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 443, 463, 475, 481, 484, 498 } - } //Z#443 + links:intvector { 444, 464, 476, 482, 485, 499 } + } //Z#444 /* Europe/Berlin */ :table { transPre32:intvector { -1, 1872912888 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717631200, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2087,8 +2093,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#444 - /* Europe/Bratislava */ :int { 476 } //Z#445 + } //Z#445 + /* Europe/Bratislava */ :int { 477 } //Z#446 /* Europe/Brussels */ :table { transPre32:intvector { -1, 1844014246 } trans:intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2097,7 +2103,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#446 + } //Z#447 /* Europe/Bucharest */ :table { trans:intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } typeOffsets:intvector { 6264, 0, 7200, 0, 7200, 3600 } @@ -2105,7 +2111,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#447 + } //Z#448 /* Europe/Budapest */ :table { transPre32:intvector { -1, 1794028316 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1633212000, -1618700400, -1600466400, -1581202800, -906771600, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762660000, -749689200, -733359600, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -621990000, -605660400, -492656400, -481168800, -461120400, -449632800, -428547600, -418269600, -397094400, -386809200, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2114,8 +2120,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#448 - /* Europe/Busingen */ :int { 500 } //Z#449 + } //Z#449 + /* Europe/Busingen */ :int { 501 } //Z#450 /* Europe/Chisinau */ :table { transPre32:intvector { -1, 1454819576 } trans:intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 641944800, 654652800, 670377600, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859680000, 877824000 } @@ -2124,8 +2130,8 @@ zoneinfo64:table(nofallback) { finalRule { "Moldova" } finalRaw:int { 7200 } finalYear:int { 1998 } - links:intvector { 450, 489 } - } //Z#450 + links:intvector { 451, 490 } + } //Z#451 /* Europe/Copenhagen */ :table { transPre32:intvector { -1, 1896673076 } trans:intvector { -1692496800, -1680490800, -935110800, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -769388400, -747010800, -736383600, -715215600, -706748400, -683161200, -675298800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2134,7 +2140,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#451 + } //Z#452 /* Europe/Dublin */ :table { transPre32:intvector { -1, 1473317596 } trans:intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733356000, -719445600, -699487200, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } @@ -2143,8 +2149,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 401, 452 } - } //Z#452 + links:intvector { 402, 453 } + } //Z#453 /* Europe/Gibraltar */ :table { transPre32:intvector { -1, 1473317380 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2153,8 +2159,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#453 - /* Europe/Guernsey */ :int { 464 } //Z#454 + } //Z#454 + /* Europe/Guernsey */ :int { 465 } //Z#455 /* Europe/Helsinki */ :table { trans:intvector { -1535938789, -875671200, -859773600, 354672000, 370396800, 386121600, 401846400, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5989, 0, 7200, 0, 7200, 3600 } @@ -2162,23 +2168,23 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - links:intvector { 455, 468 } - } //Z#455 - /* Europe/Isle_of_Man */ :int { 464 } //Z#456 + links:intvector { 456, 469 } + } //Z#456 + /* Europe/Isle_of_Man */ :int { 465 } //Z#457 /* Europe/Istanbul */ :table { transPre32:intvector { -1, 1454819544 } trans:intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931140000, -922762800, -917834400, -892436400, -875844000, -857358000, -781063200, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -621828000, -606970800, -590032800, -575434800, -235620000, -228279600, -177732000, -165726000, 10533600, 23835600, 41983200, 55285200, 74037600, 87339600, 107910000, 121219200, 133920000, 152676000, 165362400, 183502800, 202428000, 215557200, 228866400, 245797200, 260316000, 277246800, 308779200, 323827200, 340228800, 354672000, 371678400, 386121600, 403128000, 428446800, 433886400, 482792400, 496702800, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764118000, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301274000, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396227600, 1414285200, 1427590800, 1446944400, 1459040400, 1473195600 } typeOffsets:intvector { 6952, 0, 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030504050405040504050403020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } - links:intvector { 275, 457, 612 } - } //Z#457 - /* Europe/Jersey */ :int { 464 } //Z#458 + links:intvector { 275, 458, 613 } + } //Z#458 + /* Europe/Jersey */ :int { 465 } //Z#459 /* Europe/Kaliningrad */ :table { transPre32:intvector { -1, 1872911176 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -788922000, -778730400, -762663600, -757389600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1414278000 } typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "01020102010201020102010201030403050605060506050605060506050605060504030403040304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#459 + } //Z#460 /* Europe/Kiev */ :table { trans:intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 646783200, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 7324, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2186,12 +2192,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - } //Z#460 + } //Z#461 /* Europe/Kirov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 11928, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "010304030403040304030403040304030403020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#461 + } //Z#462 /* Europe/Lisbon */ :table { trans:intvector { -1830384000, -1689555600, -1677801600, -1667437200, -1647738000, -1635814800, -1616202000, -1604365200, -1584666000, -1572742800, -1553043600, -1541206800, -1521507600, -1442451600, -1426813200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922669200, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, 212544000, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -2205, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2199,9 +2205,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 462, 594 } - } //Z#462 - /* Europe/Ljubljana */ :int { 443 } //Z#463 + links:intvector { 463, 595 } + } //Z#463 + /* Europe/Ljubljana */ :int { 444 } //Z#464 /* Europe/London */ :table { transPre32:intvector { -1, 442304971 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } @@ -2210,8 +2216,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 442, 454, 456, 458, 464, 502, 503 } - } //Z#464 + links:intvector { 443, 455, 457, 459, 465, 503, 504 } + } //Z#465 /* Europe/Luxembourg */ :table { trans:intvector { -2069713476, -1692496800, -1680483600, -1662343200, -1650157200, -1632006000, -1618700400, -1612659600, -1604278800, -1585519200, -1574038800, -1552258800, -1539997200, -1520550000, -1507510800, -1490572800, -1473642000, -1459119600, -1444006800, -1427673600, -1411866000, -1396224000, -1379293200, -1364774400, -1348448400, -1333324800, -1316394000, -1301270400, -1284339600, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -935186400, -857257200, -844556400, -828226800, -812502000, -797986800, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 1476, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } @@ -2219,7 +2225,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#465 + } //Z#466 /* Europe/Madrid */ :table { transPre32:intvector { -1, 2117514496 } trans:intvector { -1631926800, -1616889600, -1601168400, -1585353600, -1442451600, -1427673600, -1379293200, -1364774400, -1348448400, -1333324800, -1316390400, -1301270400, -1284339600, -1269820800, -1026954000, -1017619200, -1001898000, -999482400, -986090400, -954115200, -940208400, -873079200, -862621200, -842839200, -828320400, -811389600, -796870800, -779940000, -765421200, -748490400, -733971600, -652327200, -639018000, 135122400, 150246000, 166572000, 181695600, 196812000, 212540400, 228866400, 243990000, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2228,7 +2234,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#466 + } //Z#467 /* Europe/Malta */ :table { transPre32:intvector { -1, 1891488612 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812588400, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2237,14 +2243,14 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#467 - /* Europe/Mariehamn */ :int { 455 } //Z#468 + } //Z#468 + /* Europe/Mariehamn */ :int { 456 } //Z#469 /* Europe/Minsk */ :table { transPre32:intvector { -1, 1454819880 } trans:intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000 } typeOffsets:intvector { 6616, 0, 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "0304060201020102060706070607060706070607060706070607060504050405040504050405040504050405040504050405040504050405040504050405040504050406" } - } //Z#469 + } //Z#470 /* Europe/Monaco */ :table { transPre32:intvector { -1, 1808287124 } trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -904438800, -891136800, -877827600, -857257200, -844556400, -828226800, -812502000, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2253,14 +2259,14 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#470 + } //Z#471 /* Europe/Moscow */ :table { trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593820800, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400, 0 } typeMap:bin { "0304030504050706070807060106070607060706070607060706070607060706070602010607060706070607060706070607060706070607060706070607060706070607060706070607060906" } - links:intvector { 471, 630 } - } //Z#471 - /* Europe/Nicosia */ :int { 297 } //Z#472 + links:intvector { 472, 631 } + } //Z#472 + /* Europe/Nicosia */ :int { 297 } //Z#473 /* Europe/Oslo */ :table { transPre32:intvector { -1, 1928209516 } trans:intvector { -1691884800, -1680573600, -927511200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -340844400, -324514800, -308790000, -293065200, -277340400, -261615600, -245890800, -230166000, -214441200, -198716400, -182991600, -166662000, -147913200, -135212400, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2269,8 +2275,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 237, 342, 473 } - } //Z#473 + links:intvector { 237, 343, 474 } + } //Z#474 /* Europe/Paris */ :table { trans:intvector { -1855958901, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 561, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2278,9 +2284,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 396, 474 } - } //Z#474 - /* Europe/Podgorica */ :int { 443 } //Z#475 + links:intvector { 397, 475 } + } //Z#475 + /* Europe/Podgorica */ :int { 444 } //Z#476 /* Europe/Prague */ :table { transPre32:intvector { -1, 1825565432 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -746578800, -733359600, -728517600, -721260000, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2289,8 +2295,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 445, 476 } - } //Z#476 + links:intvector { 446, 477 } + } //Z#477 /* Europe/Riga */ :table { trans:intvector { -1632008194, -1618702594, -1601681794, -1597275394, -1377308194, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 985482000, 1004230800 } typeOffsets:intvector { 5794, 0, 3600, 0, 3600, 3600, 5794, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2298,7 +2304,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2002 } - } //Z#477 + } //Z#478 /* Europe/Rome */ :table { transPre32:intvector { -1, 1891402096 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 107910000, 118191600, 138754800, 149641200, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2307,27 +2313,27 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 478, 480, 493 } - } //Z#478 + links:intvector { 479, 481, 494 } + } //Z#479 /* Europe/Samara */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701820000, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288479600, 1301180400 } typeOffsets:intvector { 12020, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "02040504050405040504050405040504050403020302010204050405040504050405040504050405040504050405040504050405040504050405040504030204" } - } //Z#479 - /* Europe/San_Marino */ :int { 478 } //Z#480 - /* Europe/Sarajevo */ :int { 443 } //Z#481 + } //Z#480 + /* Europe/San_Marino */ :int { 479 } //Z#481 + /* Europe/Sarajevo */ :int { 444 } //Z#482 /* Europe/Saratov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1480806000 } typeOffsets:intvector { 11058, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#482 + } //Z#483 /* Europe/Simferopol */ :table { transPre32:intvector { -1, 1454818312 } trans:intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 767739600, 780436800, 796165200, 811886400, 828219600, 846374400, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396137600, 1414274400 } typeOffsets:intvector { 8184, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600, 14400, 0 } typeMap:bin { "050306020102010206070607060706070607060706070607060706030403040304070607060706040304030403040304030403040304030403040304030403040304030403040304030806" } - } //Z#483 - /* Europe/Skopje */ :int { 443 } //Z#484 + } //Z#484 + /* Europe/Skopje */ :int { 444 } //Z#485 /* Europe/Sofia */ :table { transPre32:intvector { -1, 1454820900, -1, 1925440280 } trans:intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } @@ -2336,7 +2342,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#485 + } //Z#486 /* Europe/Stockholm */ :table { transPre32:intvector { -1, 1423286164, -1, 2085974882 } trans:intvector { -1692496800, -1680483600, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2345,7 +2351,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#486 + } //Z#487 /* Europe/Tallinn */ :table { trans:intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909277200, 922582800, 941331600, 1017536400, 1035680400 } typeOffsets:intvector { 5940, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2353,7 +2359,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2003 } - } //Z#487 + } //Z#488 /* Europe/Tirane */ :table { trans:intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 4760, 0, 3600, 0, 3600, 3600 } @@ -2361,13 +2367,13 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#488 - /* Europe/Tiraspol */ :int { 450 } //Z#489 + } //Z#489 + /* Europe/Tiraspol */ :int { 451 } //Z#490 /* Europe/Ulyanovsk */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11616, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "030506050605060506050605060506050605040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050305" } - } //Z#490 + } //Z#491 /* Europe/Uzhgorod */ :table { transPre32:intvector { -1, 1794027544 } trans:intvector { -938905200, -857257200, -844556400, -828226800, -812502000, -794714400, -773456400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 670384800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } @@ -2376,9 +2382,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - } //Z#491 - /* Europe/Vaduz */ :int { 500 } //Z#492 - /* Europe/Vatican */ :int { 478 } //Z#493 + } //Z#492 + /* Europe/Vaduz */ :int { 501 } //Z#493 + /* Europe/Vatican */ :int { 479 } //Z#494 /* Europe/Vienna */ :table { transPre32:intvector { -1, 1872912175 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -748479600, -733359600, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2387,7 +2393,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#494 + } //Z#495 /* Europe/Vilnius */ :table { transPre32:intvector { -1, 1454820420 } trans:intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891133200, 909277200, 922582800, 941331600, 1048986000, 1067130000 } @@ -2396,12 +2402,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2004 } - } //Z#495 + } //Z#496 /* Europe/Volgograd */ :table { trans:intvector { -1577761060, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1540681200 } typeOffsets:intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#496 + } //Z#497 /* Europe/Warsaw */ :table { trans:intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5040, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -2409,9 +2415,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 497, 593 } - } //Z#497 - /* Europe/Zagreb */ :int { 443 } //Z#498 + links:intvector { 498, 594 } + } //Z#498 + /* Europe/Zagreb */ :int { 444 } //Z#499 /* Europe/Zaporozhye */ :table { transPre32:intvector { -1, 1454818056 } trans:intvector { -1441160400, -1247536800, -894769200, -857257200, -844556400, -828226800, -826419600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } @@ -2420,7 +2426,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - } //Z#499 + } //Z#500 /* Europe/Zurich */ :table { transPre32:intvector { -1, 619768448, -1, 1909720710 } trans:intvector { -904435200, -891129600, -872985600, -859680000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2429,75 +2435,75 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 449, 492, 500 } - } //Z#500 + links:intvector { 450, 493, 501 } + } //Z#501 /* Factory */ :table { typeOffsets:intvector { 0, 0 } - } //Z#501 - /* GB */ :int { 464 } //Z#502 - /* GB-Eire */ :int { 464 } //Z#503 - /* GMT */ :int { 402 } //Z#504 - /* GMT+0 */ :int { 402 } //Z#505 - /* GMT-0 */ :int { 402 } //Z#506 - /* GMT0 */ :int { 402 } //Z#507 - /* Greenwich */ :int { 402 } //Z#508 + } //Z#502 + /* GB */ :int { 465 } //Z#503 + /* GB-Eire */ :int { 465 } //Z#504 + /* GMT */ :int { 403 } //Z#505 + /* GMT+0 */ :int { 403 } //Z#506 + /* GMT-0 */ :int { 403 } //Z#507 + /* GMT0 */ :int { 403 } //Z#508 + /* Greenwich */ :int { 403 } //Z#509 /* HST */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#509 - /* Hongkong */ :int { 272 } //Z#510 - /* IET */ :int { 131 } //Z#511 - /* IST */ :int { 286 } //Z#512 - /* Iceland */ :int { 344 } //Z#513 - /* Indian/Antananarivo */ :int { 48 } //Z#514 + } //Z#510 + /* Hongkong */ :int { 272 } //Z#511 + /* IET */ :int { 131 } //Z#512 + /* IST */ :int { 286 } //Z#513 + /* Iceland */ :int { 345 } //Z#514 + /* Indian/Antananarivo */ :int { 48 } //Z#515 /* Indian/Chagos */ :table { trans:intvector { -1988167780, 820436400 } typeOffsets:intvector { 17380, 0, 18000, 0, 21600, 0 } typeMap:bin { "0102" } - } //Z#515 + } //Z#516 /* Indian/Christmas */ :table { transPre32:intvector { -1, 1930865124 } typeOffsets:intvector { 25372, 0, 25200, 0 } typeMap:bin { "01" } - } //Z#516 + } //Z#517 /* Indian/Cocos */ :table { transPre32:intvector { -1, 2085955236 } typeOffsets:intvector { 23260, 0, 23400, 0 } typeMap:bin { "01" } - } //Z#517 - /* Indian/Comoro */ :int { 48 } //Z#518 + } //Z#518 + /* Indian/Comoro */ :int { 48 } //Z#519 /* Indian/Kerguelen */ :table { trans:intvector { -631152000 } typeOffsets:intvector { 0, 0, 18000, 0 } typeMap:bin { "01" } - } //Z#519 + } //Z#520 /* Indian/Mahe */ :table { trans:intvector { -2006653308 } typeOffsets:intvector { 13308, 0, 14400, 0 } typeMap:bin { "01" } - } //Z#520 + } //Z#521 /* Indian/Maldives */ :table { trans:intvector { -315636840 } typeOffsets:intvector { 17640, 0, 18000, 0 } typeMap:bin { "01" } - } //Z#521 + } //Z#522 /* Indian/Mauritius */ :table { trans:intvector { -1988164200, 403041600, 417034800, 1224972000, 1238274000 } typeOffsets:intvector { 13800, 0, 14400, 0, 14400, 3600 } typeMap:bin { "0102010201" } - } //Z#522 - /* Indian/Mayotte */ :int { 48 } //Z#523 + } //Z#523 + /* Indian/Mayotte */ :int { 48 } //Z#524 /* Indian/Reunion */ :table { trans:intvector { -1848886912 } typeOffsets:intvector { 13312, 0, 14400, 0 } typeMap:bin { "01" } - } //Z#524 - /* Iran */ :int { 319 } //Z#525 - /* Israel */ :int { 278 } //Z#526 - /* JST */ :int { 323 } //Z#527 - /* Jamaica */ :int { 142 } //Z#528 - /* Japan */ :int { 323 } //Z#529 - /* Kwajalein */ :int { 569 } //Z#530 - /* Libya */ :int { 56 } //Z#531 + } //Z#525 + /* Iran */ :int { 320 } //Z#526 + /* Israel */ :int { 278 } //Z#527 + /* JST */ :int { 324 } //Z#528 + /* Jamaica */ :int { 142 } //Z#529 + /* Japan */ :int { 324 } //Z#530 + /* Kwajalein */ :int { 570 } //Z#531 + /* Libya */ :int { 56 } //Z#532 /* MET */ :table { trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 3600, 0, 3600, 3600 } @@ -2505,11 +2511,11 @@ zoneinfo64:table(nofallback) { finalRule { "C-Eur" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#532 - /* MIT */ :int { 550 } //Z#533 + } //Z#533 + /* MIT */ :int { 551 } //Z#534 /* MST */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#534 + } //Z#535 /* MST7MDT */ :table { trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } typeOffsets:intvector { -25200, 0, -25200, 3600 } @@ -2517,20 +2523,20 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -25200 } finalYear:int { 2008 } - } //Z#535 - /* Mexico/BajaNorte */ :int { 216 } //Z#536 - /* Mexico/BajaSur */ :int { 160 } //Z#537 - /* Mexico/General */ :int { 165 } //Z#538 - /* NET */ :int { 335 } //Z#539 - /* NST */ :int { 551 } //Z#540 - /* NZ */ :int { 551 } //Z#541 - /* NZ-CHAT */ :int { 553 } //Z#542 - /* Navajo */ :int { 109 } //Z#543 - /* PLT */ :int { 281 } //Z#544 - /* PNT */ :int { 184 } //Z#545 - /* PRC */ :int { 313 } //Z#546 - /* PRT */ :int { 189 } //Z#547 - /* PST */ :int { 151 } //Z#548 + } //Z#536 + /* Mexico/BajaNorte */ :int { 216 } //Z#537 + /* Mexico/BajaSur */ :int { 160 } //Z#538 + /* Mexico/General */ :int { 165 } //Z#539 + /* NET */ :int { 336 } //Z#540 + /* NST */ :int { 552 } //Z#541 + /* NZ */ :int { 552 } //Z#542 + /* NZ-CHAT */ :int { 554 } //Z#543 + /* Navajo */ :int { 109 } //Z#544 + /* PLT */ :int { 281 } //Z#545 + /* PNT */ :int { 184 } //Z#546 + /* PRC */ :int { 314 } //Z#547 + /* PRT */ :int { 189 } //Z#548 + /* PST */ :int { 151 } //Z#549 /* PST8PDT */ :table { trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } typeOffsets:intvector { -28800, 0, -28800, 3600 } @@ -2538,7 +2544,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2008 } - } //Z#549 + } //Z#550 /* Pacific/Apia */ :table { transPre32:intvector { -1, 1849542912 } trans:intvector { -1861878784, -631110600, 1285498800, 1301752800, 1316872800, 1325239200, 1333202400, 1348927200 } @@ -2547,8 +2553,8 @@ zoneinfo64:table(nofallback) { finalRule { "WS" } finalRaw:int { 46800 } finalYear:int { 2013 } - links:intvector { 533, 550 } - } //Z#550 + links:intvector { 534, 551 } + } //Z#551 /* Pacific/Auckland */ :table { transPre32:intvector { -1, 1102531752 } trans:intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2557,14 +2563,14 @@ zoneinfo64:table(nofallback) { finalRule { "NZ" } finalRaw:int { 43200 } finalYear:int { 2009 } - links:intvector { 230, 233, 540, 541, 551 } - } //Z#551 + links:intvector { 230, 233, 541, 542, 552 } + } //Z#552 /* Pacific/Bougainville */ :table { transPre32:intvector { -1, 1454789160, -1, 1928176784 } trans:intvector { -868010400, -768906000, 1419696000 } typeOffsets:intvector { 37336, 0, 32400, 0, 35312, 0, 36000, 0, 39600, 0 } typeMap:bin { "0203010304" } - } //Z#552 + } //Z#553 /* Pacific/Chatham */ :table { transPre32:intvector { -1, 1102529668 } trans:intvector { -757426500, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2573,14 +2579,15 @@ zoneinfo64:table(nofallback) { finalRule { "Chatham" } finalRaw:int { 45900 } finalYear:int { 2009 } - links:intvector { 542, 553 } - } //Z#553 - /* Pacific/Chuuk */ :table { - transPre32:intvector { -1, 2117478068 } - typeOffsets:intvector { 36428, 0, 36000, 0 } - typeMap:bin { "01" } - links:intvector { 554, 589, 592 } + links:intvector { 543, 554 } } //Z#554 + /* Pacific/Chuuk */ :table { + transPre32:intvector { -1, 350338868, -1, 2117478068 } + trans:intvector { -1743674400, -1606813200, -907408800, -770634000 } + typeOffsets:intvector { -49972, 0, 32400, 0, 36000, 0, 36428, 0 } + typeMap:bin { "030201020102" } + links:intvector { 555, 590, 593 } + } //Z#555 /* Pacific/Easter */ :table { trans:intvector { -1178124152, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200 } typeOffsets:intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } @@ -2588,25 +2595,25 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -21600 } finalYear:int { 2020 } - links:intvector { 393, 555 } - } //Z#555 + links:intvector { 394, 556 } + } //Z#556 /* Pacific/Efate */ :table { trans:intvector { -1829387596, 433256400, 448977600, 467298000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } typeOffsets:intvector { 40396, 0, 39600, 0, 39600, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#556 + } //Z#557 /* Pacific/Enderbury */ :table { transPre32:intvector { -1, 2117555556 } trans:intvector { 307627200, 788871600 } typeOffsets:intvector { -41060, 0, -43200, 0, -39600, 0, 46800, 0 } typeMap:bin { "010203" } - } //Z#557 + } //Z#558 /* Pacific/Fakaofo */ :table { transPre32:intvector { -1, 2117555592 } trans:intvector { 1325242800 } typeOffsets:intvector { -41096, 0, -39600, 0, 46800, 0 } typeMap:bin { "0102" } - } //Z#558 + } //Z#559 /* Pacific/Fiji */ :table { trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000 } typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 } @@ -2614,170 +2621,172 @@ zoneinfo64:table(nofallback) { finalRule { "Fiji" } finalRaw:int { 43200 } finalYear:int { 2016 } - } //Z#559 + } //Z#560 /* Pacific/Funafuti */ :table { transPre32:intvector { -1, 2117471484 } typeOffsets:intvector { 43012, 0, 43200, 0 } typeMap:bin { "01" } - } //Z#560 + } //Z#561 /* Pacific/Galapagos */ :table { trans:intvector { -1230746496, 504939600, 722930400, 728888400 } typeOffsets:intvector { -21504, 0, -21600, 0, -21600, 3600, -18000, 0 } typeMap:bin { "03010201" } - } //Z#561 + } //Z#562 /* Pacific/Gambier */ :table { trans:intvector { -1806678012 } typeOffsets:intvector { -32388, 0, -32400, 0 } typeMap:bin { "01" } - } //Z#562 + } //Z#563 /* Pacific/Guadalcanal */ :table { trans:intvector { -1806748788 } typeOffsets:intvector { 38388, 0, 39600, 0 } typeMap:bin { "01" } - links:intvector { 563, 597 } - } //Z#563 + links:intvector { 564, 598 } + } //Z#564 /* Pacific/Guam */ :table { transPre32:intvector { -1, 350340556, -1, 2117479756 } - typeOffsets:intvector { -51660, 0, 34740, 0, 36000, 0 } - typeMap:bin { "0102" } - links:intvector { 564, 584 } - } //Z#564 + trans:intvector { -885549600, -802256400, -331891200, -281610000, -73728000, -29415540, -16704000, -10659600, 9907200, 21394800, 41356800, 52844400, 124819200, 130863600, 201888000, 209487660, 230659200, 241542000 } + typeOffsets:intvector { -51660, 0, 32400, 0, 34740, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "0203010304030403040304030403040304030403" } + links:intvector { 565, 585 } + } //Z#565 /* Pacific/Honolulu */ :table { transPre32:intvector { -1, 1960865982 } trans:intvector { -1157283000, -1155436200, -880198200, -765376200, -712150200 } typeOffsets:intvector { -37886, 0, -37800, 0, -37800, 3600, -36000, 0 } typeMap:bin { "010201020103" } - links:intvector { 565, 566, 620 } - } //Z#565 - /* Pacific/Johnston */ :int { 565 } //Z#566 + links:intvector { 566, 567, 621 } + } //Z#566 + /* Pacific/Johnston */ :int { 566 } //Z#567 /* Pacific/Kiritimati */ :table { transPre32:intvector { -1, 2117552256 } trans:intvector { 307622400, 788868000 } typeOffsets:intvector { -37760, 0, -38400, 0, -36000, 0, 50400, 0 } typeMap:bin { "010203" } - } //Z#567 - /* Pacific/Kosrae */ :table { - transPre32:intvector { -1, 2117475380 } - trans:intvector { -7988400, 915105600 } - typeOffsets:intvector { 39116, 0, 39600, 0, 43200, 0 } - typeMap:bin { "010201" } } //Z#568 + /* Pacific/Kosrae */ :table { + transPre32:intvector { -1, 350336180, -1, 2117475380 } + trans:intvector { -1743678000, -1606813200, -1041418800, -907408800, -770634000, -7988400, 915105600 } + typeOffsets:intvector { -47284, 0, 32400, 0, 36000, 0, 39116, 0, 39600, 0, 43200, 0 } + typeMap:bin { "030401040201040504" } + } //Z#569 /* Pacific/Kwajalein */ :table { transPre32:intvector { -1, 2117474336 } - trans:intvector { -7988400, 745848000 } - typeOffsets:intvector { 40160, 0, -43200, 0, 39600, 0, 43200, 0 } - typeMap:bin { "020103" } - links:intvector { 530, 569 } - } //Z#569 + trans:intvector { -1041418800, -907408800, -817462800, -7988400, 745934400 } + typeOffsets:intvector { 40160, 0, -43200, 0, 32400, 0, 36000, 0, 39600, 0, 43200, 0 } + typeMap:bin { "040302040105" } + links:intvector { 531, 570 } + } //Z#570 /* Pacific/Majuro */ :table { transPre32:intvector { -1, 2117473408 } - trans:intvector { -7988400 } - typeOffsets:intvector { 41088, 0, 39600, 0, 43200, 0 } - typeMap:bin { "0102" } - } //Z#570 + trans:intvector { -1743678000, -1606813200, -1041418800, -907408800, -818067600, -7988400 } + typeOffsets:intvector { 41088, 0, 32400, 0, 36000, 0, 39600, 0, 43200, 0 } + typeMap:bin { "03010302010304" } + } //Z#571 /* Pacific/Marquesas */ :table { trans:intvector { -1806676920 } typeOffsets:intvector { -33480, 0, -34200, 0 } typeMap:bin { "01" } - } //Z#571 - /* Pacific/Midway */ :int { 577 } //Z#572 + } //Z#572 + /* Pacific/Midway */ :int { 578 } //Z#573 /* Pacific/Nauru */ :table { - trans:intvector { -1545131260, -877347000, -800960400, 294323400 } + trans:intvector { -1545131260, -862918200, -767350800, 287418600 } typeOffsets:intvector { 40060, 0, 32400, 0, 41400, 0, 43200, 0 } typeMap:bin { "02010203" } - } //Z#573 + } //Z#574 /* Pacific/Niue */ :table { transPre32:intvector { -1, 2117555276 } trans:intvector { -599575200, 276089400 } typeOffsets:intvector { -40780, 0, -41400, 0, -40800, 0, -39600, 0 } typeMap:bin { "020103" } - } //Z#574 + } //Z#575 /* Pacific/Norfolk */ :table { transPre32:intvector { -1, 2117474184 } trans:intvector { -599656320, 152029800, 162912600, 1443882600 } typeOffsets:intvector { 40312, 0, 39600, 0, 40320, 0, 41400, 0, 41400, 3600 } typeMap:bin { "0203040301" } - } //Z#575 + } //Z#576 /* Pacific/Noumea */ :table { trans:intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } typeOffsets:intvector { 39948, 0, 39600, 0, 39600, 3600 } typeMap:bin { "01020102010201" } - } //Z#576 + } //Z#577 /* Pacific/Pago_Pago */ :table { transPre32:intvector { -1, 1849542664 } trans:intvector { -1861879032 } typeOffsets:intvector { 45432, 0, -40968, 0, -39600, 0 } typeMap:bin { "0102" } - links:intvector { 572, 577, 585, 626 } - } //Z#577 - /* Pacific/Palau */ :table { - transPre32:intvector { -1, 2117482220 } - typeOffsets:intvector { 32276, 0, 32400, 0 } - typeMap:bin { "01" } + links:intvector { 573, 578, 586, 627 } } //Z#578 + /* Pacific/Palau */ :table { + transPre32:intvector { -1, 350343020, -1, 2117482220 } + typeOffsets:intvector { -54124, 0, 32276, 0, 32400, 0 } + typeMap:bin { "0102" } + } //Z#579 /* Pacific/Pitcairn */ :table { transPre32:intvector { -1, 2117545716 } trans:intvector { 893665800 } typeOffsets:intvector { -31220, 0, -30600, 0, -28800, 0 } typeMap:bin { "0102" } - } //Z#579 - /* Pacific/Pohnpei */ :table { - transPre32:intvector { -1, 2117476524 } - typeOffsets:intvector { 37972, 0, 39600, 0 } - typeMap:bin { "01" } - links:intvector { 580, 581 } } //Z#580 - /* Pacific/Ponape */ :int { 580 } //Z#581 + /* Pacific/Pohnpei */ :table { + transPre32:intvector { -1, 350337324, -1, 2117476524 } + trans:intvector { -1743678000, -1606813200, -1041418800, -907408800, -770634000 } + typeOffsets:intvector { -48428, 0, 32400, 0, 36000, 0, 37972, 0, 39600, 0 } + typeMap:bin { "03040104020104" } + links:intvector { 581, 582 } + } //Z#581 + /* Pacific/Ponape */ :int { 581 } //Z#582 /* Pacific/Port_Moresby */ :table { transPre32:intvector { -1, 1454791176, -1, 1928176784 } typeOffsets:intvector { 35320, 0, 35312, 0, 36000, 0 } typeMap:bin { "0102" } - } //Z#582 + } //Z#583 /* Pacific/Rarotonga */ :table { transPre32:intvector { -1, 2117552840 } trans:intvector { 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } typeOffsets:intvector { -38344, 0, -37800, 0, -36000, 0, -36000, 1800 } typeMap:bin { "010302030203020302030203020302030203020302030203020302" } - } //Z#583 - /* Pacific/Saipan */ :int { 564 } //Z#584 - /* Pacific/Samoa */ :int { 577 } //Z#585 + } //Z#584 + /* Pacific/Saipan */ :int { 565 } //Z#585 + /* Pacific/Samoa */ :int { 578 } //Z#586 /* Pacific/Tahiti */ :table { trans:intvector { -1806674504 } typeOffsets:intvector { -35896, 0, -36000, 0 } typeMap:bin { "01" } - } //Z#586 + } //Z#587 /* Pacific/Tarawa */ :table { transPre32:intvector { -1, 2117472972 } typeOffsets:intvector { 41524, 0, 43200, 0 } typeMap:bin { "01" } - } //Z#587 + } //Z#588 /* Pacific/Tongatapu */ :table { transPre32:intvector { -1, 2117470136 } trans:intvector { -915193200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400, 1478350800, 1484398800 } typeOffsets:intvector { 44360, 0, 44400, 0, 46800, 0, 46800, 3600 } typeMap:bin { "01020302030203020302" } - } //Z#588 - /* Pacific/Truk */ :int { 554 } //Z#589 + } //Z#589 + /* Pacific/Truk */ :int { 555 } //Z#590 /* Pacific/Wake */ :table { transPre32:intvector { -1, 2117474508 } typeOffsets:intvector { 39988, 0, 43200, 0 } typeMap:bin { "01" } - } //Z#590 + } //Z#591 /* Pacific/Wallis */ :table { transPre32:intvector { -1, 2117470376 } typeOffsets:intvector { 44120, 0, 43200, 0 } typeMap:bin { "01" } - } //Z#591 - /* Pacific/Yap */ :int { 554 } //Z#592 - /* Poland */ :int { 497 } //Z#593 - /* Portugal */ :int { 462 } //Z#594 - /* ROC */ :int { 316 } //Z#595 - /* ROK */ :int { 312 } //Z#596 - /* SST */ :int { 563 } //Z#597 - /* Singapore */ :int { 314 } //Z#598 + } //Z#592 + /* Pacific/Yap */ :int { 555 } //Z#593 + /* Poland */ :int { 498 } //Z#594 + /* Portugal */ :int { 463 } //Z#595 + /* ROC */ :int { 317 } //Z#596 + /* ROK */ :int { 313 } //Z#597 + /* SST */ :int { 564 } //Z#598 + /* Singapore */ :int { 315 } //Z#599 /* SystemV/AST4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#599 + } //Z#600 /* SystemV/AST4ADT */ :table { transPre32:intvector { -1, 2096195296, -1, 2111916496, -1, 2127644896, -1, 2143366096 } trans:intvector { -2135872800, -2120151600, -2104423200, -2088702000, -2072973600, -2056647600, -2040919200, -2025198000, -2009469600, -1993748400, -1978020000, -1962298800, -1946570400, -1930849200, -1915120800, -1898794800, -1883671200, -1867345200, -1851616800, -1835895600, -1820167200, -1804446000, -1788717600, -1772996400, -1757268000, -1741546800, -1725818400, -1709492400, -1693764000, -1678042800, -1662314400, -1646593200, -1630864800, -1615143600, -1599415200, -1583694000, -1567965600, -1551639600, -1536516000, -1520190000, -1504461600, -1488740400, -1473012000, -1457290800, -1441562400, -1425841200, -1410112800, -1394391600, -1378663200, -1362337200, -1347213600, -1330887600, -1315159200, -1299438000, -1283709600, -1267988400, -1252260000, -1236538800, -1220810400, -1205089200, -1189360800, -1173034800, -1157306400, -1141585200, -1125856800, -1110135600, -1094407200, -1078686000, -1062957600, -1047236400, -1031508000, -1015182000, -1000058400, -983732400, -968004000, -952282800, -936554400, -920833200, -905104800, -889383600, -873655200, -857934000, -842205600, -825879600, -810151200, -794430000, -778701600, -762980400, -747252000, -731530800, -715802400, -700081200, -684352800, -668026800, -652903200, -636577200, -620848800, -605127600, -589399200, -573678000, -557949600, -542228400, -526500000, -510778800, -495050400, -478724400, -463600800, -447274800, -431546400, -415825200, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 126684000, 154501200, 162367200, 183531600, 199260000, 215586000 } @@ -2786,10 +2795,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -14400 } finalYear:int { 1977 } - } //Z#600 + } //Z#601 /* SystemV/CST6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#601 + } //Z#602 /* SystemV/CST6CDT */ :table { transPre32:intvector { -1, 2096202496, -1, 2111923696, -1, 2127652096, -1, 2143373296 } trans:intvector { -2135865600, -2120144400, -2104416000, -2088694800, -2072966400, -2056640400, -2040912000, -2025190800, -2009462400, -1993741200, -1978012800, -1962291600, -1946563200, -1930842000, -1915113600, -1898787600, -1883664000, -1867338000, -1851609600, -1835888400, -1820160000, -1804438800, -1788710400, -1772989200, -1757260800, -1741539600, -1725811200, -1709485200, -1693756800, -1678035600, -1662307200, -1646586000, -1630857600, -1615136400, -1599408000, -1583686800, -1567958400, -1551632400, -1536508800, -1520182800, -1504454400, -1488733200, -1473004800, -1457283600, -1441555200, -1425834000, -1410105600, -1394384400, -1378656000, -1362330000, -1347206400, -1330880400, -1315152000, -1299430800, -1283702400, -1267981200, -1252252800, -1236531600, -1220803200, -1205082000, -1189353600, -1173027600, -1157299200, -1141578000, -1125849600, -1110128400, -1094400000, -1078678800, -1062950400, -1047229200, -1031500800, -1015174800, -1000051200, -983725200, -967996800, -952275600, -936547200, -920826000, -905097600, -889376400, -873648000, -857926800, -842198400, -825872400, -810144000, -794422800, -778694400, -762973200, -747244800, -731523600, -715795200, -700074000, -684345600, -668019600, -652896000, -636570000, -620841600, -605120400, -589392000, -573670800, -557942400, -542221200, -526492800, -510771600, -495043200, -478717200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 154508400, 162374400, 183538800, 199267200, 215593200 } @@ -2798,10 +2807,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -21600 } finalYear:int { 1977 } - } //Z#602 + } //Z#603 /* SystemV/EST5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#603 + } //Z#604 /* SystemV/EST5EDT */ :table { transPre32:intvector { -1, 2096198896, -1, 2111920096, -1, 2127648496, -1, 2143369696 } trans:intvector { -2135869200, -2120148000, -2104419600, -2088698400, -2072970000, -2056644000, -2040915600, -2025194400, -2009466000, -1993744800, -1978016400, -1962295200, -1946566800, -1930845600, -1915117200, -1898791200, -1883667600, -1867341600, -1851613200, -1835892000, -1820163600, -1804442400, -1788714000, -1772992800, -1757264400, -1741543200, -1725814800, -1709488800, -1693760400, -1678039200, -1662310800, -1646589600, -1630861200, -1615140000, -1599411600, -1583690400, -1567962000, -1551636000, -1536512400, -1520186400, -1504458000, -1488736800, -1473008400, -1457287200, -1441558800, -1425837600, -1410109200, -1394388000, -1378659600, -1362333600, -1347210000, -1330884000, -1315155600, -1299434400, -1283706000, -1267984800, -1252256400, -1236535200, -1220806800, -1205085600, -1189357200, -1173031200, -1157302800, -1141581600, -1125853200, -1110132000, -1094403600, -1078682400, -1062954000, -1047232800, -1031504400, -1015178400, -1000054800, -983728800, -968000400, -952279200, -936550800, -920829600, -905101200, -889380000, -873651600, -857930400, -842202000, -825876000, -810147600, -794426400, -778698000, -762976800, -747248400, -731527200, -715798800, -700077600, -684349200, -668023200, -652899600, -636573600, -620845200, -605124000, -589395600, -573674400, -557946000, -542224800, -526496400, -510775200, -495046800, -478720800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 154504800, 162370800, 183535200, 199263600, 215589600 } @@ -2810,13 +2819,13 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -18000 } finalYear:int { 1977 } - } //Z#604 + } //Z#605 /* SystemV/HST10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#605 + } //Z#606 /* SystemV/MST7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#606 + } //Z#607 /* SystemV/MST7MDT */ :table { transPre32:intvector { -1, 2096206096, -1, 2111927296, -1, 2127655696, -1, 2143376896 } trans:intvector { -2135862000, -2120140800, -2104412400, -2088691200, -2072962800, -2056636800, -2040908400, -2025187200, -2009458800, -1993737600, -1978009200, -1962288000, -1946559600, -1930838400, -1915110000, -1898784000, -1883660400, -1867334400, -1851606000, -1835884800, -1820156400, -1804435200, -1788706800, -1772985600, -1757257200, -1741536000, -1725807600, -1709481600, -1693753200, -1678032000, -1662303600, -1646582400, -1630854000, -1615132800, -1599404400, -1583683200, -1567954800, -1551628800, -1536505200, -1520179200, -1504450800, -1488729600, -1473001200, -1457280000, -1441551600, -1425830400, -1410102000, -1394380800, -1378652400, -1362326400, -1347202800, -1330876800, -1315148400, -1299427200, -1283698800, -1267977600, -1252249200, -1236528000, -1220799600, -1205078400, -1189350000, -1173024000, -1157295600, -1141574400, -1125846000, -1110124800, -1094396400, -1078675200, -1062946800, -1047225600, -1031497200, -1015171200, -1000047600, -983721600, -967993200, -952272000, -936543600, -920822400, -905094000, -889372800, -873644400, -857923200, -842194800, -825868800, -810140400, -794419200, -778690800, -762969600, -747241200, -731520000, -715791600, -700070400, -684342000, -668016000, -652892400, -636566400, -620838000, -605116800, -589388400, -573667200, -557938800, -542217600, -526489200, -510768000, -495039600, -478713600, -463590000, -447264000, -431535600, -415814400, -400086000, -384364800, -368636400, -352915200, -337186800, -321465600, -305737200, -289411200, -273682800, -257961600, -242233200, -226512000, -210783600, -195062400, -179334000, -163612800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 154512000, 162378000, 183542400, 199270800, 215596800 } @@ -2825,10 +2834,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -25200 } finalYear:int { 1977 } - } //Z#607 + } //Z#608 /* SystemV/PST8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#608 + } //Z#609 /* SystemV/PST8PDT */ :table { transPre32:intvector { -1, 2096209696, -1, 2111930896, -1, 2127659296, -1, 2143380496 } trans:intvector { -2135858400, -2120137200, -2104408800, -2088687600, -2072959200, -2056633200, -2040904800, -2025183600, -2009455200, -1993734000, -1978005600, -1962284400, -1946556000, -1930834800, -1915106400, -1898780400, -1883656800, -1867330800, -1851602400, -1835881200, -1820152800, -1804431600, -1788703200, -1772982000, -1757253600, -1741532400, -1725804000, -1709478000, -1693749600, -1678028400, -1662300000, -1646578800, -1630850400, -1615129200, -1599400800, -1583679600, -1567951200, -1551625200, -1536501600, -1520175600, -1504447200, -1488726000, -1472997600, -1457276400, -1441548000, -1425826800, -1410098400, -1394377200, -1378648800, -1362322800, -1347199200, -1330873200, -1315144800, -1299423600, -1283695200, -1267974000, -1252245600, -1236524400, -1220796000, -1205074800, -1189346400, -1173020400, -1157292000, -1141570800, -1125842400, -1110121200, -1094392800, -1078671600, -1062943200, -1047222000, -1031493600, -1015167600, -1000044000, -983718000, -967989600, -952268400, -936540000, -920818800, -905090400, -889369200, -873640800, -857919600, -842191200, -825865200, -810136800, -794415600, -778687200, -762966000, -747237600, -731516400, -715788000, -700066800, -684338400, -668012400, -652888800, -636562800, -620834400, -605113200, -589384800, -573663600, -557935200, -542214000, -526485600, -510764400, -495036000, -478710000, -463586400, -447260400, -431532000, -415810800, -400082400, -384361200, -368632800, -352911600, -337183200, -321462000, -305733600, -289407600, -273679200, -257958000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 154515600, 162381600, 183546000, 199274400, 215600400 } @@ -2837,10 +2846,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -28800 } finalYear:int { 1977 } - } //Z#609 + } //Z#610 /* SystemV/YST9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#610 + } //Z#611 /* SystemV/YST9YDT */ :table { transPre32:intvector { -1, 2096213296, -1, 2111934496, -1, 2127662896, -1, 2143384096 } trans:intvector { -2135854800, -2120133600, -2104405200, -2088684000, -2072955600, -2056629600, -2040901200, -2025180000, -2009451600, -1993730400, -1978002000, -1962280800, -1946552400, -1930831200, -1915102800, -1898776800, -1883653200, -1867327200, -1851598800, -1835877600, -1820149200, -1804428000, -1788699600, -1772978400, -1757250000, -1741528800, -1725800400, -1709474400, -1693746000, -1678024800, -1662296400, -1646575200, -1630846800, -1615125600, -1599397200, -1583676000, -1567947600, -1551621600, -1536498000, -1520172000, -1504443600, -1488722400, -1472994000, -1457272800, -1441544400, -1425823200, -1410094800, -1394373600, -1378645200, -1362319200, -1347195600, -1330869600, -1315141200, -1299420000, -1283691600, -1267970400, -1252242000, -1236520800, -1220792400, -1205071200, -1189342800, -1173016800, -1157288400, -1141567200, -1125838800, -1110117600, -1094389200, -1078668000, -1062939600, -1047218400, -1031490000, -1015164000, -1000040400, -983714400, -967986000, -952264800, -936536400, -920815200, -905086800, -889365600, -873637200, -857916000, -842187600, -825861600, -810133200, -794412000, -778683600, -762962400, -747234000, -731512800, -715784400, -700063200, -684334800, -668008800, -652885200, -636559200, -620830800, -605109600, -589381200, -573660000, -557931600, -542210400, -526482000, -510760800, -495032400, -478706400, -463582800, -447256800, -431528400, -415807200, -400078800, -384357600, -368629200, -352908000, -337179600, -321458400, -305730000, -289404000, -273675600, -257954400, -242226000, -226504800, -210776400, -195055200, -179326800, -163605600, -147877200, -131551200, -116427600, -100101600, -84373200, -68652000, -52923600, -37202400, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 154519200, 162385200, 183549600, 199278000, 215604000 } @@ -2849,26 +2858,26 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -32400 } finalYear:int { 1977 } - } //Z#611 - /* Turkey */ :int { 457 } //Z#612 - /* UCT */ :int { 433 } //Z#613 - /* US/Alaska */ :int { 60 } //Z#614 - /* US/Aleutian */ :int { 59 } //Z#615 - /* US/Arizona */ :int { 184 } //Z#616 - /* US/Central */ :int { 98 } //Z#617 - /* US/East-Indiana */ :int { 131 } //Z#618 - /* US/Eastern */ :int { 173 } //Z#619 - /* US/Hawaii */ :int { 565 } //Z#620 - /* US/Indiana-Starke */ :int { 132 } //Z#621 - /* US/Michigan */ :int { 110 } //Z#622 - /* US/Mountain */ :int { 109 } //Z#623 - /* US/Pacific */ :int { 151 } //Z#624 - /* US/Pacific-New */ :int { 151 } //Z#625 - /* US/Samoa */ :int { 577 } //Z#626 - /* UTC */ :int { 434 } //Z#627 - /* Universal */ :int { 434 } //Z#628 - /* VST */ :int { 271 } //Z#629 - /* W-SU */ :int { 471 } //Z#630 + } //Z#612 + /* Turkey */ :int { 458 } //Z#613 + /* UCT */ :int { 434 } //Z#614 + /* US/Alaska */ :int { 60 } //Z#615 + /* US/Aleutian */ :int { 59 } //Z#616 + /* US/Arizona */ :int { 184 } //Z#617 + /* US/Central */ :int { 98 } //Z#618 + /* US/East-Indiana */ :int { 131 } //Z#619 + /* US/Eastern */ :int { 173 } //Z#620 + /* US/Hawaii */ :int { 566 } //Z#621 + /* US/Indiana-Starke */ :int { 132 } //Z#622 + /* US/Michigan */ :int { 110 } //Z#623 + /* US/Mountain */ :int { 109 } //Z#624 + /* US/Pacific */ :int { 151 } //Z#625 + /* US/Pacific-New */ :int { 151 } //Z#626 + /* US/Samoa */ :int { 578 } //Z#627 + /* UTC */ :int { 435 } //Z#628 + /* Universal */ :int { 435 } //Z#629 + /* VST */ :int { 271 } //Z#630 + /* W-SU */ :int { 472 } //Z#631 /* WET */ :table { trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 0, 0, 0, 3600 } @@ -2876,8 +2885,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#631 - /* Zulu */ :int { 434 } //Z#632 + } //Z#632 + /* Zulu */ :int { 435 } //Z#633 } Names { "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 @@ -2978,93 +2987,94 @@ zoneinfo64:table(nofallback) { ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 295 ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 299 ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 303 - ,"Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon" // 307 - ,"Asia/Riyadh","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand" // 311 - ,"Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk" // 315 - ,"Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran" // 319 - ,"Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu","Asia/Tokyo" // 323 - ,"Asia/Tomsk","Asia/Ujung_Pandang","Asia/Ulaanbaatar" // 326 - ,"Asia/Ulan_Bator","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane" // 330 - ,"Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 334 - ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 337 - ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 340 - ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 343 - ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 346 - ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 349 - ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 352 - ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 355 - ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 358 - ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 361 - ,"Australia/North","Australia/Perth","Australia/Queensland" // 364 - ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 367 - ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 370 - ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 375 - ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 382 - ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 385 - ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 388 - ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 391 - ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 395 - ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 402 - ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 406 - ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 411 - ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 416 - ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 420 - ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 424 - ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 429 - ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 434 - ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 438 - ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 441 - ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 444 - ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 447 - ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 450 - ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 453 - ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 456 - ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 459 - ,"Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana" // 463 - ,"Europe/London","Europe/Luxembourg","Europe/Madrid" // 466 - ,"Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 470 - ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 474 - ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 478 - ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 481 - ,"Europe/Saratov","Europe/Simferopol","Europe/Skopje" // 484 - ,"Europe/Sofia","Europe/Stockholm","Europe/Tallinn" // 487 - ,"Europe/Tirane","Europe/Tiraspol","Europe/Ulyanovsk" // 490 - ,"Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican" // 493 - ,"Europe/Vienna","Europe/Vilnius","Europe/Volgograd" // 496 - ,"Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye" // 499 - ,"Europe/Zurich","Factory","GB","GB-Eire","GMT","GMT+0" // 505 - ,"GMT-0","GMT0","Greenwich","HST","Hongkong","IET" // 511 - ,"IST","Iceland","Indian/Antananarivo","Indian/Chagos" // 515 - ,"Indian/Christmas","Indian/Cocos","Indian/Comoro" // 518 - ,"Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 521 - ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 524 - ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 530 - ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 536 - ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 541 - ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 549 - ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 552 - ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 555 - ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 558 - ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 561 - ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 564 - ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati" // 567 - ,"Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro" // 570 - ,"Pacific/Marquesas","Pacific/Midway","Pacific/Nauru" // 573 - ,"Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 576 - ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 579 - ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 582 - ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 585 - ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 588 - ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 592 - ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 598 - ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 602 - ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 606 - ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 609 - ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 614 - ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 618 - ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 622 - ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 626 - ,"UTC","Universal","VST","W-SU","WET","Zulu" // 632 + ,"Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda" // 307 + ,"Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin" // 311 + ,"Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore" // 315 + ,"Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent" // 318 + ,"Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu" // 322 + ,"Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ujung_Pandang" // 326 + ,"Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi" // 329 + ,"Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 332 + ,"Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 335 + ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 338 + ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 341 + ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 344 + ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 347 + ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 350 + ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 353 + ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 356 + ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 359 + ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 362 + ,"Australia/North","Australia/Perth","Australia/Queensland" // 365 + ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 368 + ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 371 + ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 376 + ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 383 + ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 386 + ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 389 + ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 392 + ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 396 + ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 403 + ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 407 + ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 412 + ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 417 + ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 421 + ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 425 + ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 430 + ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 435 + ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 439 + ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 442 + ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 445 + ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 448 + ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 451 + ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 454 + ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 457 + ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 460 + ,"Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana" // 464 + ,"Europe/London","Europe/Luxembourg","Europe/Madrid" // 467 + ,"Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 471 + ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 475 + ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 479 + ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 482 + ,"Europe/Saratov","Europe/Simferopol","Europe/Skopje" // 485 + ,"Europe/Sofia","Europe/Stockholm","Europe/Tallinn" // 488 + ,"Europe/Tirane","Europe/Tiraspol","Europe/Ulyanovsk" // 491 + ,"Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican" // 494 + ,"Europe/Vienna","Europe/Vilnius","Europe/Volgograd" // 497 + ,"Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye" // 500 + ,"Europe/Zurich","Factory","GB","GB-Eire","GMT","GMT+0" // 506 + ,"GMT-0","GMT0","Greenwich","HST","Hongkong","IET" // 512 + ,"IST","Iceland","Indian/Antananarivo","Indian/Chagos" // 516 + ,"Indian/Christmas","Indian/Cocos","Indian/Comoro" // 519 + ,"Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 522 + ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 525 + ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 531 + ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 537 + ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 542 + ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 550 + ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 553 + ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 556 + ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 559 + ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 562 + ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 565 + ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati" // 568 + ,"Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro" // 571 + ,"Pacific/Marquesas","Pacific/Midway","Pacific/Nauru" // 574 + ,"Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 577 + ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 580 + ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 583 + ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 586 + ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 589 + ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 593 + ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 599 + ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 603 + ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 607 + ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 610 + ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 615 + ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 619 + ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 623 + ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 627 + ,"UTC","Universal","VST","W-SU","WET","Zulu" // 633 } Rules { AN:intvector { @@ -3113,7 +3123,7 @@ zoneinfo64:table(nofallback) { 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 } //_#14 Iran:intvector { - 2, 21, 0, 0, 0, 8, 21, 0, 0, 0, 3600 + 2, 20, 0, 86400, 0, 8, 20, 0, 86400, 0, 3600 } //_#15 Jordan:intvector { 2, -31, -5, 86400, 0, 9, -31, -6, 0, 1, 3600 @@ -3468,332 +3478,333 @@ zoneinfo64:table(nofallback) { "ID", //Z#303 Asia/Pontianak "KP", //Z#304 Asia/Pyongyang "QA", //Z#305 Asia/Qatar - "KZ", //Z#306 Asia/Qyzylorda - "MM", //Z#307 Asia/Rangoon - "SA", //Z#308 Asia/Riyadh - "VN", //Z#309 Asia/Saigon - "RU", //Z#310 Asia/Sakhalin - "UZ", //Z#311 Asia/Samarkand - "KR", //Z#312 Asia/Seoul - "CN", //Z#313 Asia/Shanghai - "SG", //Z#314 Asia/Singapore - "RU", //Z#315 Asia/Srednekolymsk - "TW", //Z#316 Asia/Taipei - "UZ", //Z#317 Asia/Tashkent - "GE", //Z#318 Asia/Tbilisi - "IR", //Z#319 Asia/Tehran - "IL", //Z#320 Asia/Tel_Aviv - "BT", //Z#321 Asia/Thimbu - "BT", //Z#322 Asia/Thimphu - "JP", //Z#323 Asia/Tokyo - "RU", //Z#324 Asia/Tomsk - "ID", //Z#325 Asia/Ujung_Pandang - "MN", //Z#326 Asia/Ulaanbaatar - "MN", //Z#327 Asia/Ulan_Bator - "CN", //Z#328 Asia/Urumqi - "RU", //Z#329 Asia/Ust-Nera - "LA", //Z#330 Asia/Vientiane - "RU", //Z#331 Asia/Vladivostok - "RU", //Z#332 Asia/Yakutsk - "MM", //Z#333 Asia/Yangon - "RU", //Z#334 Asia/Yekaterinburg - "AM", //Z#335 Asia/Yerevan - "PT", //Z#336 Atlantic/Azores - "BM", //Z#337 Atlantic/Bermuda - "ES", //Z#338 Atlantic/Canary - "CV", //Z#339 Atlantic/Cape_Verde - "FO", //Z#340 Atlantic/Faeroe - "FO", //Z#341 Atlantic/Faroe - "NO", //Z#342 Atlantic/Jan_Mayen - "PT", //Z#343 Atlantic/Madeira - "IS", //Z#344 Atlantic/Reykjavik - "GS", //Z#345 Atlantic/South_Georgia - "SH", //Z#346 Atlantic/St_Helena - "FK", //Z#347 Atlantic/Stanley - "AU", //Z#348 Australia/ACT - "AU", //Z#349 Australia/Adelaide - "AU", //Z#350 Australia/Brisbane - "AU", //Z#351 Australia/Broken_Hill - "AU", //Z#352 Australia/Canberra - "AU", //Z#353 Australia/Currie - "AU", //Z#354 Australia/Darwin - "AU", //Z#355 Australia/Eucla - "AU", //Z#356 Australia/Hobart - "AU", //Z#357 Australia/LHI - "AU", //Z#358 Australia/Lindeman - "AU", //Z#359 Australia/Lord_Howe - "AU", //Z#360 Australia/Melbourne - "AU", //Z#361 Australia/NSW - "AU", //Z#362 Australia/North - "AU", //Z#363 Australia/Perth - "AU", //Z#364 Australia/Queensland - "AU", //Z#365 Australia/South - "AU", //Z#366 Australia/Sydney - "AU", //Z#367 Australia/Tasmania - "AU", //Z#368 Australia/Victoria - "AU", //Z#369 Australia/West - "AU", //Z#370 Australia/Yancowinna - "BR", //Z#371 BET - "BD", //Z#372 BST - "BR", //Z#373 Brazil/Acre - "BR", //Z#374 Brazil/DeNoronha - "BR", //Z#375 Brazil/East - "BR", //Z#376 Brazil/West - "MZ", //Z#377 CAT - "001",//Z#378 CET - "CA", //Z#379 CNT - "US", //Z#380 CST - "001",//Z#381 CST6CDT - "CN", //Z#382 CTT - "CA", //Z#383 Canada/Atlantic - "CA", //Z#384 Canada/Central - "CA", //Z#385 Canada/East-Saskatchewan - "CA", //Z#386 Canada/Eastern - "CA", //Z#387 Canada/Mountain - "CA", //Z#388 Canada/Newfoundland - "CA", //Z#389 Canada/Pacific - "CA", //Z#390 Canada/Saskatchewan - "CA", //Z#391 Canada/Yukon - "CL", //Z#392 Chile/Continental - "CL", //Z#393 Chile/EasterIsland - "CU", //Z#394 Cuba - "KE", //Z#395 EAT - "FR", //Z#396 ECT - "001",//Z#397 EET - "001",//Z#398 EST - "001",//Z#399 EST5EDT - "EG", //Z#400 Egypt - "IE", //Z#401 Eire - "001",//Z#402 Etc/GMT - "001",//Z#403 Etc/GMT+0 - "001",//Z#404 Etc/GMT+1 - "001",//Z#405 Etc/GMT+10 - "001",//Z#406 Etc/GMT+11 - "001",//Z#407 Etc/GMT+12 - "001",//Z#408 Etc/GMT+2 - "001",//Z#409 Etc/GMT+3 - "001",//Z#410 Etc/GMT+4 - "001",//Z#411 Etc/GMT+5 - "001",//Z#412 Etc/GMT+6 - "001",//Z#413 Etc/GMT+7 - "001",//Z#414 Etc/GMT+8 - "001",//Z#415 Etc/GMT+9 - "001",//Z#416 Etc/GMT-0 - "001",//Z#417 Etc/GMT-1 - "001",//Z#418 Etc/GMT-10 - "001",//Z#419 Etc/GMT-11 - "001",//Z#420 Etc/GMT-12 - "001",//Z#421 Etc/GMT-13 - "001",//Z#422 Etc/GMT-14 - "001",//Z#423 Etc/GMT-2 - "001",//Z#424 Etc/GMT-3 - "001",//Z#425 Etc/GMT-4 - "001",//Z#426 Etc/GMT-5 - "001",//Z#427 Etc/GMT-6 - "001",//Z#428 Etc/GMT-7 - "001",//Z#429 Etc/GMT-8 - "001",//Z#430 Etc/GMT-9 - "001",//Z#431 Etc/GMT0 - "001",//Z#432 Etc/Greenwich - "001",//Z#433 Etc/UCT - "001",//Z#434 Etc/UTC - "001",//Z#435 Etc/Universal - "001",//Z#436 Etc/Unknown - "001",//Z#437 Etc/Zulu - "NL", //Z#438 Europe/Amsterdam - "AD", //Z#439 Europe/Andorra - "RU", //Z#440 Europe/Astrakhan - "GR", //Z#441 Europe/Athens - "GB", //Z#442 Europe/Belfast - "RS", //Z#443 Europe/Belgrade - "DE", //Z#444 Europe/Berlin - "SK", //Z#445 Europe/Bratislava - "BE", //Z#446 Europe/Brussels - "RO", //Z#447 Europe/Bucharest - "HU", //Z#448 Europe/Budapest - "DE", //Z#449 Europe/Busingen - "MD", //Z#450 Europe/Chisinau - "DK", //Z#451 Europe/Copenhagen - "IE", //Z#452 Europe/Dublin - "GI", //Z#453 Europe/Gibraltar - "GG", //Z#454 Europe/Guernsey - "FI", //Z#455 Europe/Helsinki - "IM", //Z#456 Europe/Isle_of_Man - "TR", //Z#457 Europe/Istanbul - "JE", //Z#458 Europe/Jersey - "RU", //Z#459 Europe/Kaliningrad - "UA", //Z#460 Europe/Kiev - "RU", //Z#461 Europe/Kirov - "PT", //Z#462 Europe/Lisbon - "SI", //Z#463 Europe/Ljubljana - "GB", //Z#464 Europe/London - "LU", //Z#465 Europe/Luxembourg - "ES", //Z#466 Europe/Madrid - "MT", //Z#467 Europe/Malta - "AX", //Z#468 Europe/Mariehamn - "BY", //Z#469 Europe/Minsk - "MC", //Z#470 Europe/Monaco - "RU", //Z#471 Europe/Moscow - "CY", //Z#472 Europe/Nicosia - "NO", //Z#473 Europe/Oslo - "FR", //Z#474 Europe/Paris - "ME", //Z#475 Europe/Podgorica - "CZ", //Z#476 Europe/Prague - "LV", //Z#477 Europe/Riga - "IT", //Z#478 Europe/Rome - "RU", //Z#479 Europe/Samara - "SM", //Z#480 Europe/San_Marino - "BA", //Z#481 Europe/Sarajevo - "RU", //Z#482 Europe/Saratov - "UA", //Z#483 Europe/Simferopol - "MK", //Z#484 Europe/Skopje - "BG", //Z#485 Europe/Sofia - "SE", //Z#486 Europe/Stockholm - "EE", //Z#487 Europe/Tallinn - "AL", //Z#488 Europe/Tirane - "MD", //Z#489 Europe/Tiraspol - "RU", //Z#490 Europe/Ulyanovsk - "UA", //Z#491 Europe/Uzhgorod - "LI", //Z#492 Europe/Vaduz - "VA", //Z#493 Europe/Vatican - "AT", //Z#494 Europe/Vienna - "LT", //Z#495 Europe/Vilnius - "RU", //Z#496 Europe/Volgograd - "PL", //Z#497 Europe/Warsaw - "HR", //Z#498 Europe/Zagreb - "UA", //Z#499 Europe/Zaporozhye - "CH", //Z#500 Europe/Zurich - "001",//Z#501 Factory - "GB", //Z#502 GB - "GB", //Z#503 GB-Eire - "001",//Z#504 GMT - "001",//Z#505 GMT+0 - "001",//Z#506 GMT-0 - "001",//Z#507 GMT0 - "001",//Z#508 Greenwich - "001",//Z#509 HST - "HK", //Z#510 Hongkong - "US", //Z#511 IET - "IN", //Z#512 IST - "IS", //Z#513 Iceland - "MG", //Z#514 Indian/Antananarivo - "IO", //Z#515 Indian/Chagos - "CX", //Z#516 Indian/Christmas - "CC", //Z#517 Indian/Cocos - "KM", //Z#518 Indian/Comoro - "TF", //Z#519 Indian/Kerguelen - "SC", //Z#520 Indian/Mahe - "MV", //Z#521 Indian/Maldives - "MU", //Z#522 Indian/Mauritius - "YT", //Z#523 Indian/Mayotte - "RE", //Z#524 Indian/Reunion - "IR", //Z#525 Iran - "IL", //Z#526 Israel - "JP", //Z#527 JST - "JM", //Z#528 Jamaica - "JP", //Z#529 Japan - "MH", //Z#530 Kwajalein - "LY", //Z#531 Libya - "001",//Z#532 MET - "WS", //Z#533 MIT - "001",//Z#534 MST - "001",//Z#535 MST7MDT - "MX", //Z#536 Mexico/BajaNorte - "MX", //Z#537 Mexico/BajaSur - "MX", //Z#538 Mexico/General - "AM", //Z#539 NET - "NZ", //Z#540 NST - "NZ", //Z#541 NZ - "NZ", //Z#542 NZ-CHAT - "US", //Z#543 Navajo - "PK", //Z#544 PLT - "US", //Z#545 PNT - "CN", //Z#546 PRC - "PR", //Z#547 PRT - "US", //Z#548 PST - "001",//Z#549 PST8PDT - "WS", //Z#550 Pacific/Apia - "NZ", //Z#551 Pacific/Auckland - "PG", //Z#552 Pacific/Bougainville - "NZ", //Z#553 Pacific/Chatham - "FM", //Z#554 Pacific/Chuuk - "CL", //Z#555 Pacific/Easter - "VU", //Z#556 Pacific/Efate - "KI", //Z#557 Pacific/Enderbury - "TK", //Z#558 Pacific/Fakaofo - "FJ", //Z#559 Pacific/Fiji - "TV", //Z#560 Pacific/Funafuti - "EC", //Z#561 Pacific/Galapagos - "PF", //Z#562 Pacific/Gambier - "SB", //Z#563 Pacific/Guadalcanal - "GU", //Z#564 Pacific/Guam - "US", //Z#565 Pacific/Honolulu - "UM", //Z#566 Pacific/Johnston - "KI", //Z#567 Pacific/Kiritimati - "FM", //Z#568 Pacific/Kosrae - "MH", //Z#569 Pacific/Kwajalein - "MH", //Z#570 Pacific/Majuro - "PF", //Z#571 Pacific/Marquesas - "UM", //Z#572 Pacific/Midway - "NR", //Z#573 Pacific/Nauru - "NU", //Z#574 Pacific/Niue - "NF", //Z#575 Pacific/Norfolk - "NC", //Z#576 Pacific/Noumea - "AS", //Z#577 Pacific/Pago_Pago - "PW", //Z#578 Pacific/Palau - "PN", //Z#579 Pacific/Pitcairn - "FM", //Z#580 Pacific/Pohnpei - "FM", //Z#581 Pacific/Ponape - "PG", //Z#582 Pacific/Port_Moresby - "CK", //Z#583 Pacific/Rarotonga - "MP", //Z#584 Pacific/Saipan - "AS", //Z#585 Pacific/Samoa - "PF", //Z#586 Pacific/Tahiti - "KI", //Z#587 Pacific/Tarawa - "TO", //Z#588 Pacific/Tongatapu - "FM", //Z#589 Pacific/Truk - "UM", //Z#590 Pacific/Wake - "WF", //Z#591 Pacific/Wallis - "FM", //Z#592 Pacific/Yap - "PL", //Z#593 Poland - "PT", //Z#594 Portugal - "TW", //Z#595 ROC - "KR", //Z#596 ROK - "SB", //Z#597 SST - "SG", //Z#598 Singapore - "001",//Z#599 SystemV/AST4 - "001",//Z#600 SystemV/AST4ADT - "001",//Z#601 SystemV/CST6 - "001",//Z#602 SystemV/CST6CDT - "001",//Z#603 SystemV/EST5 - "001",//Z#604 SystemV/EST5EDT - "001",//Z#605 SystemV/HST10 - "001",//Z#606 SystemV/MST7 - "001",//Z#607 SystemV/MST7MDT - "001",//Z#608 SystemV/PST8 - "001",//Z#609 SystemV/PST8PDT - "001",//Z#610 SystemV/YST9 - "001",//Z#611 SystemV/YST9YDT - "TR", //Z#612 Turkey - "001",//Z#613 UCT - "US", //Z#614 US/Alaska - "US", //Z#615 US/Aleutian - "US", //Z#616 US/Arizona - "US", //Z#617 US/Central - "US", //Z#618 US/East-Indiana - "US", //Z#619 US/Eastern - "US", //Z#620 US/Hawaii - "US", //Z#621 US/Indiana-Starke - "US", //Z#622 US/Michigan - "US", //Z#623 US/Mountain - "US", //Z#624 US/Pacific - "US", //Z#625 US/Pacific-New - "AS", //Z#626 US/Samoa - "001",//Z#627 UTC - "001",//Z#628 Universal - "VN", //Z#629 VST - "RU", //Z#630 W-SU - "001",//Z#631 WET - "001",//Z#632 Zulu + "KZ", //Z#306 Asia/Qostanay + "KZ", //Z#307 Asia/Qyzylorda + "MM", //Z#308 Asia/Rangoon + "SA", //Z#309 Asia/Riyadh + "VN", //Z#310 Asia/Saigon + "RU", //Z#311 Asia/Sakhalin + "UZ", //Z#312 Asia/Samarkand + "KR", //Z#313 Asia/Seoul + "CN", //Z#314 Asia/Shanghai + "SG", //Z#315 Asia/Singapore + "RU", //Z#316 Asia/Srednekolymsk + "TW", //Z#317 Asia/Taipei + "UZ", //Z#318 Asia/Tashkent + "GE", //Z#319 Asia/Tbilisi + "IR", //Z#320 Asia/Tehran + "IL", //Z#321 Asia/Tel_Aviv + "BT", //Z#322 Asia/Thimbu + "BT", //Z#323 Asia/Thimphu + "JP", //Z#324 Asia/Tokyo + "RU", //Z#325 Asia/Tomsk + "ID", //Z#326 Asia/Ujung_Pandang + "MN", //Z#327 Asia/Ulaanbaatar + "MN", //Z#328 Asia/Ulan_Bator + "CN", //Z#329 Asia/Urumqi + "RU", //Z#330 Asia/Ust-Nera + "LA", //Z#331 Asia/Vientiane + "RU", //Z#332 Asia/Vladivostok + "RU", //Z#333 Asia/Yakutsk + "MM", //Z#334 Asia/Yangon + "RU", //Z#335 Asia/Yekaterinburg + "AM", //Z#336 Asia/Yerevan + "PT", //Z#337 Atlantic/Azores + "BM", //Z#338 Atlantic/Bermuda + "ES", //Z#339 Atlantic/Canary + "CV", //Z#340 Atlantic/Cape_Verde + "FO", //Z#341 Atlantic/Faeroe + "FO", //Z#342 Atlantic/Faroe + "NO", //Z#343 Atlantic/Jan_Mayen + "PT", //Z#344 Atlantic/Madeira + "IS", //Z#345 Atlantic/Reykjavik + "GS", //Z#346 Atlantic/South_Georgia + "SH", //Z#347 Atlantic/St_Helena + "FK", //Z#348 Atlantic/Stanley + "AU", //Z#349 Australia/ACT + "AU", //Z#350 Australia/Adelaide + "AU", //Z#351 Australia/Brisbane + "AU", //Z#352 Australia/Broken_Hill + "AU", //Z#353 Australia/Canberra + "AU", //Z#354 Australia/Currie + "AU", //Z#355 Australia/Darwin + "AU", //Z#356 Australia/Eucla + "AU", //Z#357 Australia/Hobart + "AU", //Z#358 Australia/LHI + "AU", //Z#359 Australia/Lindeman + "AU", //Z#360 Australia/Lord_Howe + "AU", //Z#361 Australia/Melbourne + "AU", //Z#362 Australia/NSW + "AU", //Z#363 Australia/North + "AU", //Z#364 Australia/Perth + "AU", //Z#365 Australia/Queensland + "AU", //Z#366 Australia/South + "AU", //Z#367 Australia/Sydney + "AU", //Z#368 Australia/Tasmania + "AU", //Z#369 Australia/Victoria + "AU", //Z#370 Australia/West + "AU", //Z#371 Australia/Yancowinna + "BR", //Z#372 BET + "BD", //Z#373 BST + "BR", //Z#374 Brazil/Acre + "BR", //Z#375 Brazil/DeNoronha + "BR", //Z#376 Brazil/East + "BR", //Z#377 Brazil/West + "MZ", //Z#378 CAT + "001",//Z#379 CET + "CA", //Z#380 CNT + "US", //Z#381 CST + "001",//Z#382 CST6CDT + "CN", //Z#383 CTT + "CA", //Z#384 Canada/Atlantic + "CA", //Z#385 Canada/Central + "CA", //Z#386 Canada/East-Saskatchewan + "CA", //Z#387 Canada/Eastern + "CA", //Z#388 Canada/Mountain + "CA", //Z#389 Canada/Newfoundland + "CA", //Z#390 Canada/Pacific + "CA", //Z#391 Canada/Saskatchewan + "CA", //Z#392 Canada/Yukon + "CL", //Z#393 Chile/Continental + "CL", //Z#394 Chile/EasterIsland + "CU", //Z#395 Cuba + "KE", //Z#396 EAT + "FR", //Z#397 ECT + "001",//Z#398 EET + "001",//Z#399 EST + "001",//Z#400 EST5EDT + "EG", //Z#401 Egypt + "IE", //Z#402 Eire + "001",//Z#403 Etc/GMT + "001",//Z#404 Etc/GMT+0 + "001",//Z#405 Etc/GMT+1 + "001",//Z#406 Etc/GMT+10 + "001",//Z#407 Etc/GMT+11 + "001",//Z#408 Etc/GMT+12 + "001",//Z#409 Etc/GMT+2 + "001",//Z#410 Etc/GMT+3 + "001",//Z#411 Etc/GMT+4 + "001",//Z#412 Etc/GMT+5 + "001",//Z#413 Etc/GMT+6 + "001",//Z#414 Etc/GMT+7 + "001",//Z#415 Etc/GMT+8 + "001",//Z#416 Etc/GMT+9 + "001",//Z#417 Etc/GMT-0 + "001",//Z#418 Etc/GMT-1 + "001",//Z#419 Etc/GMT-10 + "001",//Z#420 Etc/GMT-11 + "001",//Z#421 Etc/GMT-12 + "001",//Z#422 Etc/GMT-13 + "001",//Z#423 Etc/GMT-14 + "001",//Z#424 Etc/GMT-2 + "001",//Z#425 Etc/GMT-3 + "001",//Z#426 Etc/GMT-4 + "001",//Z#427 Etc/GMT-5 + "001",//Z#428 Etc/GMT-6 + "001",//Z#429 Etc/GMT-7 + "001",//Z#430 Etc/GMT-8 + "001",//Z#431 Etc/GMT-9 + "001",//Z#432 Etc/GMT0 + "001",//Z#433 Etc/Greenwich + "001",//Z#434 Etc/UCT + "001",//Z#435 Etc/UTC + "001",//Z#436 Etc/Universal + "001",//Z#437 Etc/Unknown + "001",//Z#438 Etc/Zulu + "NL", //Z#439 Europe/Amsterdam + "AD", //Z#440 Europe/Andorra + "RU", //Z#441 Europe/Astrakhan + "GR", //Z#442 Europe/Athens + "GB", //Z#443 Europe/Belfast + "RS", //Z#444 Europe/Belgrade + "DE", //Z#445 Europe/Berlin + "SK", //Z#446 Europe/Bratislava + "BE", //Z#447 Europe/Brussels + "RO", //Z#448 Europe/Bucharest + "HU", //Z#449 Europe/Budapest + "DE", //Z#450 Europe/Busingen + "MD", //Z#451 Europe/Chisinau + "DK", //Z#452 Europe/Copenhagen + "IE", //Z#453 Europe/Dublin + "GI", //Z#454 Europe/Gibraltar + "GG", //Z#455 Europe/Guernsey + "FI", //Z#456 Europe/Helsinki + "IM", //Z#457 Europe/Isle_of_Man + "TR", //Z#458 Europe/Istanbul + "JE", //Z#459 Europe/Jersey + "RU", //Z#460 Europe/Kaliningrad + "UA", //Z#461 Europe/Kiev + "RU", //Z#462 Europe/Kirov + "PT", //Z#463 Europe/Lisbon + "SI", //Z#464 Europe/Ljubljana + "GB", //Z#465 Europe/London + "LU", //Z#466 Europe/Luxembourg + "ES", //Z#467 Europe/Madrid + "MT", //Z#468 Europe/Malta + "AX", //Z#469 Europe/Mariehamn + "BY", //Z#470 Europe/Minsk + "MC", //Z#471 Europe/Monaco + "RU", //Z#472 Europe/Moscow + "CY", //Z#473 Europe/Nicosia + "NO", //Z#474 Europe/Oslo + "FR", //Z#475 Europe/Paris + "ME", //Z#476 Europe/Podgorica + "CZ", //Z#477 Europe/Prague + "LV", //Z#478 Europe/Riga + "IT", //Z#479 Europe/Rome + "RU", //Z#480 Europe/Samara + "SM", //Z#481 Europe/San_Marino + "BA", //Z#482 Europe/Sarajevo + "RU", //Z#483 Europe/Saratov + "UA", //Z#484 Europe/Simferopol + "MK", //Z#485 Europe/Skopje + "BG", //Z#486 Europe/Sofia + "SE", //Z#487 Europe/Stockholm + "EE", //Z#488 Europe/Tallinn + "AL", //Z#489 Europe/Tirane + "MD", //Z#490 Europe/Tiraspol + "RU", //Z#491 Europe/Ulyanovsk + "UA", //Z#492 Europe/Uzhgorod + "LI", //Z#493 Europe/Vaduz + "VA", //Z#494 Europe/Vatican + "AT", //Z#495 Europe/Vienna + "LT", //Z#496 Europe/Vilnius + "RU", //Z#497 Europe/Volgograd + "PL", //Z#498 Europe/Warsaw + "HR", //Z#499 Europe/Zagreb + "UA", //Z#500 Europe/Zaporozhye + "CH", //Z#501 Europe/Zurich + "001",//Z#502 Factory + "GB", //Z#503 GB + "GB", //Z#504 GB-Eire + "001",//Z#505 GMT + "001",//Z#506 GMT+0 + "001",//Z#507 GMT-0 + "001",//Z#508 GMT0 + "001",//Z#509 Greenwich + "001",//Z#510 HST + "HK", //Z#511 Hongkong + "US", //Z#512 IET + "IN", //Z#513 IST + "IS", //Z#514 Iceland + "MG", //Z#515 Indian/Antananarivo + "IO", //Z#516 Indian/Chagos + "CX", //Z#517 Indian/Christmas + "CC", //Z#518 Indian/Cocos + "KM", //Z#519 Indian/Comoro + "TF", //Z#520 Indian/Kerguelen + "SC", //Z#521 Indian/Mahe + "MV", //Z#522 Indian/Maldives + "MU", //Z#523 Indian/Mauritius + "YT", //Z#524 Indian/Mayotte + "RE", //Z#525 Indian/Reunion + "IR", //Z#526 Iran + "IL", //Z#527 Israel + "JP", //Z#528 JST + "JM", //Z#529 Jamaica + "JP", //Z#530 Japan + "MH", //Z#531 Kwajalein + "LY", //Z#532 Libya + "001",//Z#533 MET + "WS", //Z#534 MIT + "001",//Z#535 MST + "001",//Z#536 MST7MDT + "MX", //Z#537 Mexico/BajaNorte + "MX", //Z#538 Mexico/BajaSur + "MX", //Z#539 Mexico/General + "AM", //Z#540 NET + "NZ", //Z#541 NST + "NZ", //Z#542 NZ + "NZ", //Z#543 NZ-CHAT + "US", //Z#544 Navajo + "PK", //Z#545 PLT + "US", //Z#546 PNT + "CN", //Z#547 PRC + "PR", //Z#548 PRT + "US", //Z#549 PST + "001",//Z#550 PST8PDT + "WS", //Z#551 Pacific/Apia + "NZ", //Z#552 Pacific/Auckland + "PG", //Z#553 Pacific/Bougainville + "NZ", //Z#554 Pacific/Chatham + "FM", //Z#555 Pacific/Chuuk + "CL", //Z#556 Pacific/Easter + "VU", //Z#557 Pacific/Efate + "KI", //Z#558 Pacific/Enderbury + "TK", //Z#559 Pacific/Fakaofo + "FJ", //Z#560 Pacific/Fiji + "TV", //Z#561 Pacific/Funafuti + "EC", //Z#562 Pacific/Galapagos + "PF", //Z#563 Pacific/Gambier + "SB", //Z#564 Pacific/Guadalcanal + "GU", //Z#565 Pacific/Guam + "US", //Z#566 Pacific/Honolulu + "UM", //Z#567 Pacific/Johnston + "KI", //Z#568 Pacific/Kiritimati + "FM", //Z#569 Pacific/Kosrae + "MH", //Z#570 Pacific/Kwajalein + "MH", //Z#571 Pacific/Majuro + "PF", //Z#572 Pacific/Marquesas + "UM", //Z#573 Pacific/Midway + "NR", //Z#574 Pacific/Nauru + "NU", //Z#575 Pacific/Niue + "NF", //Z#576 Pacific/Norfolk + "NC", //Z#577 Pacific/Noumea + "AS", //Z#578 Pacific/Pago_Pago + "PW", //Z#579 Pacific/Palau + "PN", //Z#580 Pacific/Pitcairn + "FM", //Z#581 Pacific/Pohnpei + "FM", //Z#582 Pacific/Ponape + "PG", //Z#583 Pacific/Port_Moresby + "CK", //Z#584 Pacific/Rarotonga + "MP", //Z#585 Pacific/Saipan + "AS", //Z#586 Pacific/Samoa + "PF", //Z#587 Pacific/Tahiti + "KI", //Z#588 Pacific/Tarawa + "TO", //Z#589 Pacific/Tongatapu + "FM", //Z#590 Pacific/Truk + "UM", //Z#591 Pacific/Wake + "WF", //Z#592 Pacific/Wallis + "FM", //Z#593 Pacific/Yap + "PL", //Z#594 Poland + "PT", //Z#595 Portugal + "TW", //Z#596 ROC + "KR", //Z#597 ROK + "SB", //Z#598 SST + "SG", //Z#599 Singapore + "001",//Z#600 SystemV/AST4 + "001",//Z#601 SystemV/AST4ADT + "001",//Z#602 SystemV/CST6 + "001",//Z#603 SystemV/CST6CDT + "001",//Z#604 SystemV/EST5 + "001",//Z#605 SystemV/EST5EDT + "001",//Z#606 SystemV/HST10 + "001",//Z#607 SystemV/MST7 + "001",//Z#608 SystemV/MST7MDT + "001",//Z#609 SystemV/PST8 + "001",//Z#610 SystemV/PST8PDT + "001",//Z#611 SystemV/YST9 + "001",//Z#612 SystemV/YST9YDT + "TR", //Z#613 Turkey + "001",//Z#614 UCT + "US", //Z#615 US/Alaska + "US", //Z#616 US/Aleutian + "US", //Z#617 US/Arizona + "US", //Z#618 US/Central + "US", //Z#619 US/East-Indiana + "US", //Z#620 US/Eastern + "US", //Z#621 US/Hawaii + "US", //Z#622 US/Indiana-Starke + "US", //Z#623 US/Michigan + "US", //Z#624 US/Mountain + "US", //Z#625 US/Pacific + "US", //Z#626 US/Pacific-New + "AS", //Z#627 US/Samoa + "001",//Z#628 UTC + "001",//Z#629 Universal + "VN", //Z#630 VST + "RU", //Z#631 W-SU + "001",//Z#632 WET + "001",//Z#633 Zulu } } diff --git a/js/src/builtin/intl/TimeZoneDataGenerated.h b/js/src/builtin/intl/TimeZoneDataGenerated.h index 1d4c1021f4b6..be54d52709eb 100644 --- a/js/src/builtin/intl/TimeZoneDataGenerated.h +++ b/js/src/builtin/intl/TimeZoneDataGenerated.h @@ -1,5 +1,5 @@ // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2018g +// tzdata version = 2018i #ifndef builtin_intl_TimeZoneDataGenerated_h #define builtin_intl_TimeZoneDataGenerated_h diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js index 55fb01927361..3c857b61bd0c 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2018g +// tzdata version = 2018i const tzMapper = [ x => x, diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js index 620fdfeb615a..22dd79bdda78 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2018g +// tzdata version = 2018i const tzMapper = [ x => x, diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js index 0ab93b80dae0..8e3072f43033 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2018g +// tzdata version = 2018i const tzMapper = [ x => x, diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js index 2cdea050af07..bb97ae464bc5 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2018g +// tzdata version = 2018i const tzMapper = [ x => x, From a739d36dde384a125642a1dc295fe282daed561b Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Wed, 9 Jan 2019 10:13:40 +0000 Subject: [PATCH 09/17] Bug 1518401 - Exclude caret position within ligated emoji sequence where the second component was a BMP symbol + VS16. r=m_kato --- layout/generic/nsTextFrame.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index d8e174cb195f..232759550675 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -7814,7 +7814,10 @@ static bool IsAcceptableCaretPosition(const gfxSkipCharsIterator& aIter, (NS_IS_LOW_SURROGATE(ch) && offs > 0 && NS_IS_HIGH_SURROGATE(frag->CharAt(offs - 1))) || (!aTextRun->IsLigatureGroupStart(index) && - unicode::GetEmojiPresentation(ch) == unicode::EmojiDefault)) { + (unicode::GetEmojiPresentation(ch) == unicode::EmojiDefault || + (unicode::GetEmojiPresentation(ch) == unicode::TextDefault && + offs + 1 < frag->GetLength() && + frag->CharAt(offs + 1) == gfxFontUtils::kUnicodeVS16)))) { return false; } From 0c34bd1c34dd1dd46743b5cef37584c636bb8a62 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 9 Jan 2019 12:16:04 +0100 Subject: [PATCH 10/17] Bug 1513298 - Fingerprinting url-classifier feature, r=dimi --- modules/libpref/init/StaticPrefList.h | 7 + .../url-classifier/UrlClassifierCommon.cpp | 6 +- netwerk/url-classifier/UrlClassifierCommon.h | 2 +- .../UrlClassifierFeatureFactory.cpp | 22 ++- .../UrlClassifierFeatureFingerprinting.cpp | 177 ++++++++++++++++++ .../UrlClassifierFeatureFingerprinting.h | 46 +++++ ...UrlClassifierFeatureTrackingAnnotation.cpp | 2 +- ...UrlClassifierFeatureTrackingProtection.cpp | 2 +- netwerk/url-classifier/moz.build | 1 + .../antitracking/AntiTrackingCommon.cpp | 4 +- .../antitracking/AntiTrackingCommon.h | 1 + .../tests/mochitest/mochitest.ini | 1 + .../tests/mochitest/test_fingerprinting.html | 105 +++++++++++ 13 files changed, 368 insertions(+), 8 deletions(-) create mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp create mode 100644 netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h create mode 100644 toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html diff --git a/modules/libpref/init/StaticPrefList.h b/modules/libpref/init/StaticPrefList.h index 2424fa3fb25c..359b201efd58 100644 --- a/modules/libpref/init/StaticPrefList.h +++ b/modules/libpref/init/StaticPrefList.h @@ -1784,6 +1784,13 @@ VARCACHE_PREF( bool, true ) +// Block 3rd party fingerprinting resources. +VARCACHE_PREF( + "privacy.trackingprotection.fingerprinting.enabled", + privacy_trackingprotection_fingerprinting_enabled, + bool, true +) + // Lower the priority of network loads for resources on the tracking protection // list. Note that this requires the // privacy.trackingprotection.annotate_channels pref to be on in order to have diff --git a/netwerk/url-classifier/UrlClassifierCommon.cpp b/netwerk/url-classifier/UrlClassifierCommon.cpp index 45a70ae60620..cda18856d19c 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.cpp +++ b/netwerk/url-classifier/UrlClassifierCommon.cpp @@ -87,13 +87,13 @@ LazyLogModule UrlClassifierCommon::sLog("nsChannelClassifier"); pwin->NotifyContentBlockingState(aBlockedReason, aChannel, true, uri); } -/* static */ bool -UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( +/* static */ bool UrlClassifierCommon::ShouldEnableClassifier( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose) { MOZ_ASSERT(aChannel); MOZ_ASSERT(aBlockingPurpose == AntiTrackingCommon::eTrackingProtection || - aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations); + aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations || + aBlockingPurpose == AntiTrackingCommon::eFingerprinting); nsCOMPtr channel = do_QueryInterface(aChannel); if (!channel) { diff --git a/netwerk/url-classifier/UrlClassifierCommon.h b/netwerk/url-classifier/UrlClassifierCommon.h index 43eba415f195..3861ed7cc830 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.h +++ b/netwerk/url-classifier/UrlClassifierCommon.h @@ -33,7 +33,7 @@ class UrlClassifierCommon final { static void NotifyChannelBlocked(nsIChannel* aChannel, unsigned aBlockedReason); - static bool ShouldEnableTrackingProtectionOrAnnotation( + static bool ShouldEnableClassifier( nsIChannel* aChannel, AntiTrackingCommon::ContentBlockingAllowListPurpose aBlockingPurpose); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp index 495a8fa8dfeb..d6d5a6da6c39 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp @@ -7,6 +7,7 @@ #include "mozilla/net/UrlClassifierFeatureFactory.h" // List of Features +#include "UrlClassifierFeatureFingerprinting.h" #include "UrlClassifierFeatureFlash.h" #include "UrlClassifierFeatureLoginReputation.h" #include "UrlClassifierFeatureTrackingProtection.h" @@ -24,6 +25,7 @@ namespace net { return; } + UrlClassifierFeatureFingerprinting::MaybeShutdown(); UrlClassifierFeatureFlash::MaybeShutdown(); UrlClassifierFeatureLoginReputation::MaybeShutdown(); UrlClassifierFeatureTrackingAnnotation::MaybeShutdown(); @@ -43,6 +45,12 @@ namespace net { // feature order, and this could produce different results with a different // feature ordering. + // Fingerprinting + feature = UrlClassifierFeatureFingerprinting::MaybeCreate(aChannel); + if (feature) { + aFeatures.AppendElement(feature); + } + // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::MaybeCreate(aChannel); if (feature) { @@ -75,6 +83,12 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { nsCOMPtr feature; + // Fingerprinting + feature = UrlClassifierFeatureFingerprinting::GetIfNameMatches(aName); + if (feature) { + return feature.forget(); + } + // Tracking Protection feature = UrlClassifierFeatureTrackingProtection::GetIfNameMatches(aName); if (feature) { @@ -108,8 +122,14 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { return; } - // Tracking Protection + // Fingerprinting nsAutoCString name; + name.Assign(UrlClassifierFeatureFingerprinting::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Tracking Protection name.Assign(UrlClassifierFeatureTrackingProtection::Name()); if (!name.IsEmpty()) { aArray.AppendElement(name); diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp new file mode 100644 index 000000000000..16c87bb84c14 --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.cpp @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "UrlClassifierFeatureFingerprinting.h" + +#include "mozilla/AntiTrackingCommon.h" +#include "mozilla/net/UrlClassifierCommon.h" +#include "mozilla/StaticPrefs.h" +#include "nsContentUtils.h" +#include "nsNetUtil.h" + +namespace mozilla { +namespace net { + +namespace { + +#define FINGERPRINTING_FEATURE_NAME "fingerprinting" + +#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST \ + "urlclassifier.features.fingerprinting.blacklistTables" +#define URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES \ + "urlclassifier.features.fingerprinting.blacklistHosts" +#define URLCLASSIFIER_FINGERPRINTING_WHITELIST \ + "urlclassifier.features.fingerprinting.whitelistTables" +#define URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES \ + "urlclassifier.features.fingerprinting.whitelistHosts" +#define TABLE_FINGERPRINTING_BLACKLIST_PREF "fingerprinting-blacklist-pref" +#define TABLE_FINGERPRINTING_WHITELIST_PREF "fingerprinting-whitelist-pref" + +StaticRefPtr gFeatureFingerprinting; + +} // namespace + +UrlClassifierFeatureFingerprinting::UrlClassifierFeatureFingerprinting() + : UrlClassifierFeatureBase( + NS_LITERAL_CSTRING(FINGERPRINTING_FEATURE_NAME), + NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_BLACKLIST), + NS_LITERAL_CSTRING(URLCLASSIFIER_FINGERPRINTING_WHITELIST), + NS_LITERAL_CSTRING( + URLCLASSIFIER_FINGERPRINTING_BLACKLIST_TEST_ENTRIES), + NS_LITERAL_CSTRING( + URLCLASSIFIER_FINGERPRINTING_WHITELIST_TEST_ENTRIES), + NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_BLACKLIST_PREF), + NS_LITERAL_CSTRING(TABLE_FINGERPRINTING_WHITELIST_PREF), + EmptyCString()) {} + +/* static */ const char* UrlClassifierFeatureFingerprinting::Name() { + return FINGERPRINTING_FEATURE_NAME; +} + +/* static */ void UrlClassifierFeatureFingerprinting::MaybeInitialize() { + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeInitialize")); + + if (!gFeatureFingerprinting) { + gFeatureFingerprinting = new UrlClassifierFeatureFingerprinting(); + gFeatureFingerprinting->InitializePreferences(); + } +} + +/* static */ void UrlClassifierFeatureFingerprinting::MaybeShutdown() { + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeShutdown")); + + if (gFeatureFingerprinting) { + gFeatureFingerprinting->ShutdownPreferences(); + gFeatureFingerprinting = nullptr; + } +} + +/* static */ already_AddRefed +UrlClassifierFeatureFingerprinting::MaybeCreate(nsIChannel* aChannel) { + MOZ_ASSERT(aChannel); + + UC_LOG(("UrlClassifierFeatureFingerprinting: MaybeCreate for channel %p", + aChannel)); + + if (!StaticPrefs::privacy_trackingprotection_fingerprinting_enabled()) { + return nullptr; + } + + nsCOMPtr chanURI; + nsresult rv = aChannel->GetURI(getter_AddRefs(chanURI)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + bool isThirdParty = + nsContentUtils::IsThirdPartyWindowOrChannel(nullptr, aChannel, chanURI); + if (!isThirdParty) { + if (UC_LOG_ENABLED()) { + nsCString spec = chanURI->GetSpecOrDefault(); + spec.Truncate( + std::min(spec.Length(), UrlClassifierCommon::sMaxSpecLength)); + UC_LOG( + ("UrlClassifierFeatureFingerprinting: Skipping fingerprinting checks " + "for first party or top-level load channel[%p] " + "with uri %s", + aChannel, spec.get())); + } + + return nullptr; + } + + if (!UrlClassifierCommon::ShouldEnableClassifier( + aChannel, AntiTrackingCommon::eFingerprinting)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureFingerprinting); + + RefPtr self = gFeatureFingerprinting; + return self.forget(); +} + +/* static */ already_AddRefed +UrlClassifierFeatureFingerprinting::GetIfNameMatches(const nsACString& aName) { + if (!aName.EqualsLiteral(FINGERPRINTING_FEATURE_NAME)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureFingerprinting); + + RefPtr self = gFeatureFingerprinting; + return self.forget(); +} + +NS_IMETHODIMP +UrlClassifierFeatureFingerprinting::ProcessChannel(nsIChannel* aChannel, + const nsACString& aList, + bool* aShouldContinue) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aShouldContinue); + + // This is a blocking feature. + *aShouldContinue = false; + + UrlClassifierCommon::SetBlockedContent(aChannel, NS_ERROR_TRACKING_URI, aList, + EmptyCString(), EmptyCString()); + + UC_LOG( + ("UrlClassifierFeatureFingerprinting::ProcessChannel, cancelling " + "channel[%p]", + aChannel)); + nsCOMPtr httpChannel = do_QueryInterface(aChannel); + + // FIXME: the way we cancel the channel depends on what the UI wants to show. + // This needs to change, at some point. + if (httpChannel) { + Unused << httpChannel->CancelForTrackingProtection(); + } else { + Unused << aChannel->Cancel(NS_ERROR_TRACKING_URI); + } + + return NS_OK; +} + +NS_IMETHODIMP +UrlClassifierFeatureFingerprinting::GetURIByListType( + nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aURI); + + if (aListType == nsIUrlClassifierFeature::blacklist) { + return aChannel->GetURI(aURI); + } + + MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist); + return UrlClassifierCommon::CreatePairwiseWhiteListURI(aChannel, aURI); +} + +} // namespace net +} // namespace mozilla diff --git a/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h new file mode 100644 index 000000000000..4f5cb7fafc8d --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureFingerprinting.h @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_net_UrlClassifierFeatureFingerprinting_h +#define mozilla_net_UrlClassifierFeatureFingerprinting_h + +#include "UrlClassifierFeatureBase.h" + +class nsIChannel; + +namespace mozilla { +namespace net { + +class UrlClassifierFeatureFingerprinting final + : public UrlClassifierFeatureBase { + public: + static const char* Name(); + + static void MaybeShutdown(); + + static already_AddRefed MaybeCreate( + nsIChannel* aChannel); + + static already_AddRefed GetIfNameMatches( + const nsACString& aName); + + NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, + bool* aShouldContinue) override; + + NS_IMETHOD GetURIByListType(nsIChannel* aChannel, + nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) override; + + private: + UrlClassifierFeatureFingerprinting(); + + static void MaybeInitialize(); +}; + +} // namespace net +} // namespace mozilla + +#endif // mozilla_net_UrlClassifierFeatureFingerprinting_h diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp index dc61a13313cf..105abde45896 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingAnnotation.cpp @@ -154,7 +154,7 @@ UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( + if (!UrlClassifierCommon::ShouldEnableClassifier( aChannel, AntiTrackingCommon::eTrackingAnnotations)) { return nullptr; } diff --git a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp index 691d5f1c94dd..5528618df366 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureTrackingProtection.cpp @@ -101,7 +101,7 @@ UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) { return nullptr; } - if (!UrlClassifierCommon::ShouldEnableTrackingProtectionOrAnnotation( + if (!UrlClassifierCommon::ShouldEnableClassifier( aChannel, AntiTrackingCommon::eTrackingProtection)) { return nullptr; } diff --git a/netwerk/url-classifier/moz.build b/netwerk/url-classifier/moz.build index 8a68b6d6e880..497d35f5d790 100644 --- a/netwerk/url-classifier/moz.build +++ b/netwerk/url-classifier/moz.build @@ -24,6 +24,7 @@ UNIFIED_SOURCES += [ 'UrlClassifierFeatureBase.cpp', 'UrlClassifierFeatureCustomTables.cpp', 'UrlClassifierFeatureFactory.cpp', + 'UrlClassifierFeatureFingerprinting.cpp', 'UrlClassifierFeatureFlash.cpp', 'UrlClassifierFeatureLoginReputation.cpp', 'UrlClassifierFeatureResult.cpp', diff --git a/toolkit/components/antitracking/AntiTrackingCommon.cpp b/toolkit/components/antitracking/AntiTrackingCommon.cpp index 60d881fd9e8b..86b9a26b683d 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.cpp +++ b/toolkit/components/antitracking/AntiTrackingCommon.cpp @@ -1372,7 +1372,9 @@ nsresult AntiTrackingCommon::IsOnContentBlockingAllowList( if ((aPurpose == eStorageChecks && !StaticPrefs::browser_contentblocking_allowlist_storage_enabled()) || (aPurpose == eTrackingAnnotations && - !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled())) { + !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled()) || + (aPurpose == eFingerprinting && + !StaticPrefs::privacy_trackingprotection_fingerprinting_enabled())) { LOG( ("Attempting to check the content blocking allow list aborted because " "the third-party cookies UI has been disabled.")); diff --git a/toolkit/components/antitracking/AntiTrackingCommon.h b/toolkit/components/antitracking/AntiTrackingCommon.h index 6395e6d8f5ed..fdbb342e09e2 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.h +++ b/toolkit/components/antitracking/AntiTrackingCommon.h @@ -120,6 +120,7 @@ class AntiTrackingCommon final { eStorageChecks, eTrackingProtection, eTrackingAnnotations, + eFingerprinting, }; // Check whether a top window URI is on the content blocking allow list. diff --git a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini index 5ed704111b46..03ce3790a785 100644 --- a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini +++ b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini @@ -45,3 +45,4 @@ skip-if = (verify && debug && (os == 'win' || os == 'mac')) [test_cachemiss.html] skip-if = verify [test_annotation_vs_TP.html] +[test_fingerprinting.html] diff --git a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html new file mode 100644 index 000000000000..101e9cd83232 --- /dev/null +++ b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html @@ -0,0 +1,105 @@ + + + + Test the fingerprinting classifier + + + + + + + + From 10799b6b0395779a62b466eba15fde6f2ea83ca4 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 9 Jan 2019 12:16:04 +0100 Subject: [PATCH 11/17] Bug 1513300 - Implement Cryptomining URL-Classifier, r=dimi --- modules/libpref/init/StaticPrefList.h | 7 + .../url-classifier/UrlClassifierCommon.cpp | 3 +- .../UrlClassifierFeatureCryptomining.cpp | 175 ++++++++++++++++++ .../UrlClassifierFeatureCryptomining.h | 45 +++++ .../UrlClassifierFeatureFactory.cpp | 22 ++- netwerk/url-classifier/moz.build | 1 + .../antitracking/AntiTrackingCommon.cpp | 4 +- .../antitracking/AntiTrackingCommon.h | 1 + .../tests/mochitest/mochitest.ini | 1 + .../tests/mochitest/test_cryptomining.html | 106 +++++++++++ .../tests/mochitest/test_fingerprinting.html | 1 + 11 files changed, 363 insertions(+), 3 deletions(-) create mode 100644 netwerk/url-classifier/UrlClassifierFeatureCryptomining.cpp create mode 100644 netwerk/url-classifier/UrlClassifierFeatureCryptomining.h create mode 100644 toolkit/components/url-classifier/tests/mochitest/test_cryptomining.html diff --git a/modules/libpref/init/StaticPrefList.h b/modules/libpref/init/StaticPrefList.h index 359b201efd58..8a6b80231699 100644 --- a/modules/libpref/init/StaticPrefList.h +++ b/modules/libpref/init/StaticPrefList.h @@ -1791,6 +1791,13 @@ VARCACHE_PREF( bool, true ) +// Block 3rd party cryptomining resources. +VARCACHE_PREF( + "privacy.trackingprotection.cryptomining.enabled", + privacy_trackingprotection_cryptomining_enabled, + bool, true +) + // Lower the priority of network loads for resources on the tracking protection // list. Note that this requires the // privacy.trackingprotection.annotate_channels pref to be on in order to have diff --git a/netwerk/url-classifier/UrlClassifierCommon.cpp b/netwerk/url-classifier/UrlClassifierCommon.cpp index cda18856d19c..b62c0df49082 100644 --- a/netwerk/url-classifier/UrlClassifierCommon.cpp +++ b/netwerk/url-classifier/UrlClassifierCommon.cpp @@ -93,7 +93,8 @@ LazyLogModule UrlClassifierCommon::sLog("nsChannelClassifier"); MOZ_ASSERT(aChannel); MOZ_ASSERT(aBlockingPurpose == AntiTrackingCommon::eTrackingProtection || aBlockingPurpose == AntiTrackingCommon::eTrackingAnnotations || - aBlockingPurpose == AntiTrackingCommon::eFingerprinting); + aBlockingPurpose == AntiTrackingCommon::eFingerprinting || + aBlockingPurpose == AntiTrackingCommon::eCryptomining); nsCOMPtr channel = do_QueryInterface(aChannel); if (!channel) { diff --git a/netwerk/url-classifier/UrlClassifierFeatureCryptomining.cpp b/netwerk/url-classifier/UrlClassifierFeatureCryptomining.cpp new file mode 100644 index 000000000000..407b32779ade --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureCryptomining.cpp @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "UrlClassifierFeatureCryptomining.h" + +#include "mozilla/AntiTrackingCommon.h" +#include "mozilla/net/UrlClassifierCommon.h" +#include "mozilla/StaticPrefs.h" +#include "nsContentUtils.h" +#include "nsNetUtil.h" + +namespace mozilla { +namespace net { + +namespace { + +#define CRYPTOMINING_FEATURE_NAME "cryptomining" + +#define URLCLASSIFIER_CRYPTOMINING_BLACKLIST \ + "urlclassifier.features.cryptomining.blacklistTables" +#define URLCLASSIFIER_CRYPTOMINING_BLACKLIST_TEST_ENTRIES \ + "urlclassifier.features.cryptomining.blacklistHosts" +#define URLCLASSIFIER_CRYPTOMINING_WHITELIST \ + "urlclassifier.features.cryptomining.whitelistTables" +#define URLCLASSIFIER_CRYPTOMINING_WHITELIST_TEST_ENTRIES \ + "urlclassifier.features.cryptomining.whitelistHosts" +#define TABLE_CRYPTOMINING_BLACKLIST_PREF "cryptomining-blacklist-pref" +#define TABLE_CRYPTOMINING_WHITELIST_PREF "cryptomining-whitelist-pref" + +StaticRefPtr gFeatureCryptomining; + +} // namespace + +UrlClassifierFeatureCryptomining::UrlClassifierFeatureCryptomining() + : UrlClassifierFeatureBase( + NS_LITERAL_CSTRING(CRYPTOMINING_FEATURE_NAME), + NS_LITERAL_CSTRING(URLCLASSIFIER_CRYPTOMINING_BLACKLIST), + NS_LITERAL_CSTRING(URLCLASSIFIER_CRYPTOMINING_WHITELIST), + NS_LITERAL_CSTRING(URLCLASSIFIER_CRYPTOMINING_BLACKLIST_TEST_ENTRIES), + NS_LITERAL_CSTRING(URLCLASSIFIER_CRYPTOMINING_WHITELIST_TEST_ENTRIES), + NS_LITERAL_CSTRING(TABLE_CRYPTOMINING_BLACKLIST_PREF), + NS_LITERAL_CSTRING(TABLE_CRYPTOMINING_WHITELIST_PREF), + EmptyCString()) {} + +/* static */ const char* UrlClassifierFeatureCryptomining::Name() { + return CRYPTOMINING_FEATURE_NAME; +} + +/* static */ void UrlClassifierFeatureCryptomining::MaybeInitialize() { + UC_LOG(("UrlClassifierFeatureCryptomining: MaybeInitialize")); + + if (!gFeatureCryptomining) { + gFeatureCryptomining = new UrlClassifierFeatureCryptomining(); + gFeatureCryptomining->InitializePreferences(); + } +} + +/* static */ void UrlClassifierFeatureCryptomining::MaybeShutdown() { + UC_LOG(("UrlClassifierFeatureCryptomining: MaybeShutdown")); + + if (gFeatureCryptomining) { + gFeatureCryptomining->ShutdownPreferences(); + gFeatureCryptomining = nullptr; + } +} + +/* static */ already_AddRefed +UrlClassifierFeatureCryptomining::MaybeCreate(nsIChannel* aChannel) { + MOZ_ASSERT(aChannel); + + UC_LOG(("UrlClassifierFeatureCryptomining: MaybeCreate for channel %p", + aChannel)); + + if (!StaticPrefs::privacy_trackingprotection_cryptomining_enabled()) { + return nullptr; + } + + nsCOMPtr chanURI; + nsresult rv = aChannel->GetURI(getter_AddRefs(chanURI)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + bool isThirdParty = + nsContentUtils::IsThirdPartyWindowOrChannel(nullptr, aChannel, chanURI); + if (!isThirdParty) { + if (UC_LOG_ENABLED()) { + nsCString spec = chanURI->GetSpecOrDefault(); + spec.Truncate( + std::min(spec.Length(), UrlClassifierCommon::sMaxSpecLength)); + UC_LOG( + ("UrlClassifierFeatureCryptomining: Skipping cryptomining checks " + "for first party or top-level load channel[%p] " + "with uri %s", + aChannel, spec.get())); + } + + return nullptr; + } + + if (!UrlClassifierCommon::ShouldEnableClassifier( + aChannel, AntiTrackingCommon::eCryptomining)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureCryptomining); + + RefPtr self = gFeatureCryptomining; + return self.forget(); +} + +/* static */ already_AddRefed +UrlClassifierFeatureCryptomining::GetIfNameMatches(const nsACString& aName) { + if (!aName.EqualsLiteral(CRYPTOMINING_FEATURE_NAME)) { + return nullptr; + } + + MaybeInitialize(); + MOZ_ASSERT(gFeatureCryptomining); + + RefPtr self = gFeatureCryptomining; + return self.forget(); +} + +NS_IMETHODIMP +UrlClassifierFeatureCryptomining::ProcessChannel(nsIChannel* aChannel, + const nsACString& aList, + bool* aShouldContinue) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aShouldContinue); + + // This is a blocking feature. + *aShouldContinue = false; + + UrlClassifierCommon::SetBlockedContent(aChannel, NS_ERROR_TRACKING_URI, aList, + EmptyCString(), EmptyCString()); + + UC_LOG( + ("UrlClassifierFeatureCryptomining::ProcessChannel, cancelling " + "channel[%p]", + aChannel)); + nsCOMPtr httpChannel = do_QueryInterface(aChannel); + + // FIXME: the way we cancel the channel depends on what the UI wants to show. + // This needs to change, at some point. + if (httpChannel) { + Unused << httpChannel->CancelForTrackingProtection(); + } else { + Unused << aChannel->Cancel(NS_ERROR_TRACKING_URI); + } + + return NS_OK; +} + +NS_IMETHODIMP +UrlClassifierFeatureCryptomining::GetURIByListType( + nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) { + NS_ENSURE_ARG_POINTER(aChannel); + NS_ENSURE_ARG_POINTER(aURI); + + if (aListType == nsIUrlClassifierFeature::blacklist) { + return aChannel->GetURI(aURI); + } + + MOZ_ASSERT(aListType == nsIUrlClassifierFeature::whitelist); + return UrlClassifierCommon::CreatePairwiseWhiteListURI(aChannel, aURI); +} + +} // namespace net +} // namespace mozilla diff --git a/netwerk/url-classifier/UrlClassifierFeatureCryptomining.h b/netwerk/url-classifier/UrlClassifierFeatureCryptomining.h new file mode 100644 index 000000000000..dadf73a65d7b --- /dev/null +++ b/netwerk/url-classifier/UrlClassifierFeatureCryptomining.h @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_net_UrlClassifierFeatureCryptomining_h +#define mozilla_net_UrlClassifierFeatureCryptomining_h + +#include "UrlClassifierFeatureBase.h" + +class nsIChannel; + +namespace mozilla { +namespace net { + +class UrlClassifierFeatureCryptomining final : public UrlClassifierFeatureBase { + public: + static const char* Name(); + + static void MaybeShutdown(); + + static already_AddRefed MaybeCreate( + nsIChannel* aChannel); + + static already_AddRefed GetIfNameMatches( + const nsACString& aName); + + NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, + bool* aShouldContinue) override; + + NS_IMETHOD GetURIByListType(nsIChannel* aChannel, + nsIUrlClassifierFeature::listType aListType, + nsIURI** aURI) override; + + private: + UrlClassifierFeatureCryptomining(); + + static void MaybeInitialize(); +}; + +} // namespace net +} // namespace mozilla + +#endif // mozilla_net_UrlClassifierFeatureCryptomining_h diff --git a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp index d6d5a6da6c39..4a1c10a6de79 100644 --- a/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp +++ b/netwerk/url-classifier/UrlClassifierFeatureFactory.cpp @@ -7,6 +7,7 @@ #include "mozilla/net/UrlClassifierFeatureFactory.h" // List of Features +#include "UrlClassifierFeatureCryptomining.h" #include "UrlClassifierFeatureFingerprinting.h" #include "UrlClassifierFeatureFlash.h" #include "UrlClassifierFeatureLoginReputation.h" @@ -25,6 +26,7 @@ namespace net { return; } + UrlClassifierFeatureCryptomining::MaybeShutdown(); UrlClassifierFeatureFingerprinting::MaybeShutdown(); UrlClassifierFeatureFlash::MaybeShutdown(); UrlClassifierFeatureLoginReputation::MaybeShutdown(); @@ -45,6 +47,12 @@ namespace net { // feature order, and this could produce different results with a different // feature ordering. + // Cryptomining + feature = UrlClassifierFeatureCryptomining::MaybeCreate(aChannel); + if (feature) { + aFeatures.AppendElement(feature); + } + // Fingerprinting feature = UrlClassifierFeatureFingerprinting::MaybeCreate(aChannel); if (feature) { @@ -83,6 +91,12 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { nsCOMPtr feature; + // Cryptomining + feature = UrlClassifierFeatureCryptomining::GetIfNameMatches(aName); + if (feature) { + return feature.forget(); + } + // Fingerprinting feature = UrlClassifierFeatureFingerprinting::GetIfNameMatches(aName); if (feature) { @@ -122,8 +136,14 @@ UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) { return; } - // Fingerprinting + // Cryptomining nsAutoCString name; + name.Assign(UrlClassifierFeatureCryptomining::Name()); + if (!name.IsEmpty()) { + aArray.AppendElement(name); + } + + // Fingerprinting name.Assign(UrlClassifierFeatureFingerprinting::Name()); if (!name.IsEmpty()) { aArray.AppendElement(name); diff --git a/netwerk/url-classifier/moz.build b/netwerk/url-classifier/moz.build index 497d35f5d790..400bdab1c0cd 100644 --- a/netwerk/url-classifier/moz.build +++ b/netwerk/url-classifier/moz.build @@ -22,6 +22,7 @@ UNIFIED_SOURCES += [ 'nsChannelClassifier.cpp', 'UrlClassifierCommon.cpp', 'UrlClassifierFeatureBase.cpp', + 'UrlClassifierFeatureCryptomining.cpp', 'UrlClassifierFeatureCustomTables.cpp', 'UrlClassifierFeatureFactory.cpp', 'UrlClassifierFeatureFingerprinting.cpp', diff --git a/toolkit/components/antitracking/AntiTrackingCommon.cpp b/toolkit/components/antitracking/AntiTrackingCommon.cpp index 86b9a26b683d..941a3606dc21 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.cpp +++ b/toolkit/components/antitracking/AntiTrackingCommon.cpp @@ -1374,7 +1374,9 @@ nsresult AntiTrackingCommon::IsOnContentBlockingAllowList( (aPurpose == eTrackingAnnotations && !StaticPrefs::browser_contentblocking_allowlist_annotations_enabled()) || (aPurpose == eFingerprinting && - !StaticPrefs::privacy_trackingprotection_fingerprinting_enabled())) { + !StaticPrefs::privacy_trackingprotection_fingerprinting_enabled()) || + (aPurpose == eCryptomining && + !StaticPrefs::privacy_trackingprotection_cryptomining_enabled())) { LOG( ("Attempting to check the content blocking allow list aborted because " "the third-party cookies UI has been disabled.")); diff --git a/toolkit/components/antitracking/AntiTrackingCommon.h b/toolkit/components/antitracking/AntiTrackingCommon.h index fdbb342e09e2..d2759266c5f6 100644 --- a/toolkit/components/antitracking/AntiTrackingCommon.h +++ b/toolkit/components/antitracking/AntiTrackingCommon.h @@ -121,6 +121,7 @@ class AntiTrackingCommon final { eTrackingProtection, eTrackingAnnotations, eFingerprinting, + eCryptomining, }; // Check whether a top window URI is on the content blocking allow list. diff --git a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini index 03ce3790a785..29510111a279 100644 --- a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini +++ b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini @@ -46,3 +46,4 @@ skip-if = (verify && debug && (os == 'win' || os == 'mac')) skip-if = verify [test_annotation_vs_TP.html] [test_fingerprinting.html] +[test_cryptomining.html] diff --git a/toolkit/components/url-classifier/tests/mochitest/test_cryptomining.html b/toolkit/components/url-classifier/tests/mochitest/test_cryptomining.html new file mode 100644 index 000000000000..e1de42f514db --- /dev/null +++ b/toolkit/components/url-classifier/tests/mochitest/test_cryptomining.html @@ -0,0 +1,106 @@ + + + + Test the cryptomining classifier + + + + + + + + diff --git a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html index 101e9cd83232..af1b9c620683 100644 --- a/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html +++ b/toolkit/components/url-classifier/tests/mochitest/test_fingerprinting.html @@ -37,6 +37,7 @@ async function runTest(test) { [ "urlclassifier.features.fingerprinting.whitelistTables", "" ], [ "privacy.trackingprotection.enabled", false ], [ "privacy.trackingprotection.annotate_channels", false ], + [ "privacy.trackingprotection.cryptomining.enabled", false ], [ "privacy.trackingprotection.fingerprinting.enabled", true ], ]}); From 77a4fab0130887204fbf1edab92088a9fed4e2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Qu=C3=A8ze?= Date: Wed, 9 Jan 2019 12:43:41 +0100 Subject: [PATCH 12/17] Bug 1498195 - remove the code of the old about:performance, r=felipe. --- .../content/aboutPerformance.js | 932 ++---------------- .../content/aboutPerformance.xhtml | 138 +-- 2 files changed, 109 insertions(+), 961 deletions(-) diff --git a/toolkit/components/aboutperformance/content/aboutPerformance.js b/toolkit/components/aboutperformance/content/aboutPerformance.js index 963145104902..36bada40605c 100644 --- a/toolkit/components/aboutperformance/content/aboutPerformance.js +++ b/toolkit/components/aboutperformance/content/aboutPerformance.js @@ -6,9 +6,7 @@ "use strict"; -const { PerformanceStats } = ChromeUtils.import("resource://gre/modules/PerformanceStats.jsm", {}); const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm", {}); -const { ObjectUtils } = ChromeUtils.import("resource://gre/modules/ObjectUtils.jsm", {}); const { AddonManager } = ChromeUtils.import("resource://gre/modules/AddonManager.jsm", {}); const { ExtensionParent } = ChromeUtils.import("resource://gre/modules/ExtensionParent.jsm", {}); @@ -18,15 +16,6 @@ const {WebExtensionPolicy} = Cu.getGlobalForObject(Services); // mousemove event. const TIME_BEFORE_SORTING_AGAIN = 5000; -// about:performance observes notifications on this topic. -// if a notification is sent, this causes the page to be updated immediately, -// regardless of whether the page is on pause. -const TEST_DRIVER_TOPIC = "test-about:performance-test-driver"; - -// about:performance posts notifications on this topic whenever the page -// is updated. -const UPDATE_COMPLETE_TOPIC = "about:performance-update-complete"; - // How often we should add a sample to our buffer. const BUFFER_SAMPLING_RATE_MS = 1000; @@ -41,43 +30,6 @@ const BRAND_BUNDLE = Services.strings.createBundle( "chrome://branding/locale/brand.properties"); const BRAND_NAME = BRAND_BUNDLE.GetStringFromName("brandShortName"); -// The maximal number of items to display before showing a "Show All" -// button. -const MAX_NUMBER_OF_ITEMS_TO_DISPLAY = 3; - -// If the frequency of alerts is below this value, -// we consider that the feature has no impact. -const MAX_FREQUENCY_FOR_NO_IMPACT = .05; -// If the frequency of alerts is above `MAX_FREQUENCY_FOR_NO_IMPACT` -// and below this value, we consider that the feature impacts the -// user rarely. -const MAX_FREQUENCY_FOR_RARE = .1; -// If the frequency of alerts is above `MAX_FREQUENCY_FOR_FREQUENT` -// and below this value, we consider that the feature impacts the -// user frequently. Anything above is consider permanent. -const MAX_FREQUENCY_FOR_FREQUENT = .5; - -// If the number of high-impact alerts among all alerts is above -// this value, we consider that the feature has a major impact -// on user experience. -const MIN_PROPORTION_FOR_MAJOR_IMPACT = .05; -// Otherwise and if the number of medium-impact alerts among all -// alerts is above this value, we consider that the feature has -// a noticeable impact on user experience. -const MIN_PROPORTION_FOR_NOTICEABLE_IMPACT = .1; - -// The current mode. Either `MODE_GLOBAL` to display a summary of results -// since we opened about:performance or `MODE_RECENT` to display the latest -// BUFFER_DURATION_MS ms. -const MODE_GLOBAL = "global"; -const MODE_RECENT = "recent"; - -// Decide if we show the old style about:performance or if we can show data -// based on the new performance counters. -function performanceCountersEnabled() { - return Services.prefs.getBoolPref("dom.performance.enable_scheduler_timing", false); -} - function extensionCountersEnabled() { return Services.prefs.getBoolPref("extensions.webextensions.enablePerformanceCounters", false); } @@ -166,220 +118,16 @@ function wait(ms = 0) { } } -/** - * The performance of a webpage between two instants. - * - * Clients should call `promiseInit()` before using the methods of this object. - * - * @param {PerformanceDiff} The underlying performance data. - * @param {"webpages"} The kind of delta represented by this object. - * @param {Map} ageMap A map containing the oldest known - * appearance of each groupId, used to determine how long we have been monitoring - * this item. - * @param {Map} alertMap A map containing the alerts that each - * item has already triggered in the past. - */ -function Delta(diff, kind, snapshotDate, ageMap, alertMap) { - if (kind != "webpages") { - throw new TypeError(`Unknown kind: ${kind}`); - } - - /** - * We only understand "webpages" right now. - */ - this.kind = kind; - - /** - * The underlying PerformanceDiff. - * @type {PerformanceDiff} - */ - this.diff = diff; - - /** - * A key unique to the item (webpage), shared by successive - * instances of `Delta`. - * @type{string} - */ - this.key = kind + diff.key; - - // Find the oldest occurrence of this item. - let creationDate = snapshotDate; - for (let groupId of diff.groupIds) { - let date = ageMap.get(groupId); - if (date && date <= creationDate) { - creationDate = date; - } - } - - /** - * The timestamp at which the data was measured. - */ - this.creationDate = creationDate; - - /** - * Number of milliseconds since the start of the measure. - */ - this.age = snapshotDate - creationDate; - - /** - * A UX-friendly, human-readable name for this item. - */ - this.readableName = null; - - /** - * A complete name, possibly useful for power users or debugging. - */ - this.fullName = null; - - - // `true` once initialization is complete. - this._initialized = false; - // `true` if this item should be displayed - this._show = false; - - /** - * All the alerts that this item has caused since about:performance - * was opened. - */ - this.alerts = (alertMap.get(this.key) || []).slice(); - switch (this.slowness) { - case 0: break; - case 1: this.alerts[0] = (this.alerts[0] || 0) + 1; break; - case 2: this.alerts[1] = (this.alerts[1] || 0) + 1; break; - default: throw new Error(); - } -} -Delta.prototype = { - /** - * `true` if this item should be displayed, `false` otherwise. - */ - get show() { - this._ensureInitialized(); - return this._show; - }, - - /** - * Estimate the slowness of this item. - * - * @return 0 if the item has good performance. - * @return 1 if the item has average performance. - * @return 2 if the item has poor performance. - */ - get slowness() { - if (Delta.compare(this, Delta.MAX_DELTA_FOR_GOOD_RECENT_PERFORMANCE) <= 0) { - return 0; - } - if (Delta.compare(this, Delta.MAX_DELTA_FOR_AVERAGE_RECENT_PERFORMANCE) <= 0) { - return 1; - } - return 2; - }, - _ensureInitialized() { - if (!this._initialized) { - throw new Error(); - } - }, - - /** - * Initialize, asynchronously. - */ - promiseInit() { - if (this.kind == "webpages") { - return this._initWebpage(); - } - throw new TypeError(); - }, - _initWebpage() { - this._initialized = true; - let found = tabFinder.getAny(this.diff.windowIds); - if (!found || found.tab.linkedBrowser.contentTitle == null) { - // Either this is not a real page or the page isn't restored yet. - return; - } - - this.readableName = found.tab.linkedBrowser.contentTitle; - this.fullName = this.diff.names.join(", "); - this._show = true; - }, - toString() { - return `[Delta] ${this.diff.key} => ${this.readableName}, ${this.fullName}`; - }, -}; - -Delta.compare = function(a, b) { - return ( - (a.diff.jank.longestDuration - b.diff.jank.longestDuration) || - (a.diff.jank.totalUserTime - b.diff.jank.totalUserTime) || - (a.diff.jank.totalSystemTime - b.diff.jank.totalSystemTime) || - (a.diff.cpow.totalCPOWTime - b.diff.cpow.totalCPOWTime) || - (a.diff.ticks.ticks - b.diff.ticks.ticks) || - 0 - ); -}; - -Delta.revCompare = function(a, b) { - return -Delta.compare(a, b); -}; - -/** - * The highest value considered "good performance". - */ -Delta.MAX_DELTA_FOR_GOOD_RECENT_PERFORMANCE = { - diff: { - cpow: { - totalCPOWTime: 0, - }, - jank: { - longestDuration: 3, - totalUserTime: Number.POSITIVE_INFINITY, - totalSystemTime: Number.POSITIVE_INFINITY, - }, - ticks: { - ticks: Number.POSITIVE_INFINITY, - }, - }, -}; - -/** - * The highest value considered "average performance". - */ -Delta.MAX_DELTA_FOR_AVERAGE_RECENT_PERFORMANCE = { - diff: { - cpow: { - totalCPOWTime: Number.POSITIVE_INFINITY, - }, - jank: { - longestDuration: 7, - totalUserTime: Number.POSITIVE_INFINITY, - totalSystemTime: Number.POSITIVE_INFINITY, - }, - ticks: { - ticks: Number.POSITIVE_INFINITY, - }, - }, -}; - /** * Utilities for dealing with state */ var State = { - _monitor: PerformanceStats.getMonitor([ - "jank", "cpow", "ticks", - ]), - /** * Indexed by the number of minutes since the snapshot was taken. * * @type {Array} */ _buffer: [], - /** - * The first snapshot since opening the page. - * - * @type ApplicationSnapshot - */ - _oldest: null, - /** * The latest snapshot. * @@ -387,36 +135,7 @@ var State = { */ _latest: null, - /** - * The performance alerts for each group. - * - * This map is cleaned up during each update to avoid leaking references - * to groups that have been gc-ed. - * - * @type{Map} A map in which the keys are provided - * by property `key` of instances of `Delta` and the values are arrays - * [number of moderate-impact alerts, number of high-impact alerts] - */ - _alerts: new Map(), - - /** - * The date at which each group was first seen. - * - * This map is cleaned up during each update to avoid leaking references - * to groups that have been gc-ed. - * - * @type{Map, - * deltas: Set, - * duration: number of milliseconds - * }} - */ - async _promiseDeltaSince(oldest) { - let current = this._latest; - if (!oldest) { - throw new TypeError(); - } - if (!current) { - throw new TypeError(); - } - - tabFinder.update(); - // We rebuild the maps during each iteration to make sure that - // we do not maintain references to groups that has been removed - // (e.g. pages that have been closed). - let oldFirstSeen = this._firstSeen; - let cleanedUpFirstSeen = new Map(); - - let oldAlerts = this._alerts; - let cleanedUpAlerts = new Map(); - - let result = { - webpages: [], - deltas: new Set(), - duration: current.date - oldest.date, - }; - - for (let kind of ["webpages"]) { - for (let [key, value] of current[kind]) { - let item = ObjectUtils.strict(new Delta(value.subtract(oldest[kind].get(key)), kind, current.date, oldFirstSeen, oldAlerts)); - await item.promiseInit(); - - if (!item.show) { - continue; - } - result[kind].push(item); - result.deltas.add(item.key); - - for (let groupId of item.diff.groupIds) { - cleanedUpFirstSeen.set(groupId, item.creationDate); - } - cleanedUpAlerts.set(item.key, item.alerts); - } - } - - this._firstSeen = cleanedUpFirstSeen; - this._alerts = cleanedUpAlerts; - return result; - }, - // We can only know asynchronously if an origin is matched by the tracking // protection list, so we cache the result for faster future lookups. _trackingState: new Map(), @@ -736,292 +381,6 @@ var State = { }; var View = { - /** - * A cache for all the per-item DOM elements that are reused across refreshes. - * - * Reusing the same elements means that elements that were hidden (respectively - * visible) in an iteration remain hidden (resp visible) in the next iteration. - */ - DOMCache: { - _map: new Map(), - /** - * @param {string} deltaKey The key for the item that we are displaying. - * @return {null} If the `deltaKey` doesn't have a component cached yet. - * Otherwise, the value stored with `set`. - */ - get(deltaKey) { - return this._map.get(deltaKey); - }, - set(deltaKey, value) { - this._map.set(deltaKey, value); - }, - /** - * Remove all the elements whose key does not appear in `set`. - * - * @param {Set} set a set of deltaKey. - */ - trimTo(set) { - let remove = []; - for (let key of this._map.keys()) { - if (!set.has(key)) { - remove.push(key); - } - } - for (let key of remove) { - this._map.delete(key); - } - }, - }, - /** - * Display the items in a category. - * - * @param {Array} subset The items to display. They will - * be displayed in the order of `subset`. - * @param {string} id The id of the DOM element that will contain the items. - * @param {string} nature The nature of the subset. One of "webpages" or "system". - * @param {string} currentMode The current display mode. One of MODE_GLOBAL or MODE_RECENT. - */ - updateCategory(subset, id, nature, currentMode) { - subset = subset.slice().sort(Delta.revCompare); - - - // Grab everything from the DOM before cleaning up - this._setupStructure(id); - - // An array of `cachedElements` that need to be added - let toAdd = []; - for (let delta of subset) { - if (!(delta instanceof Delta)) { - throw new TypeError(); - } - let cachedElements = this._grabOrCreateElements(delta, nature); - toAdd.push(cachedElements); - cachedElements.eltTitle.textContent = delta.readableName; - cachedElements.eltName.textContent = `Full name: ${delta.fullName}.`; - cachedElements.eltLoaded.textContent = `Measure start: ${Math.round(delta.age / 1000)} seconds ago.`; - - let processes = delta.diff.processes.map(proc => `${proc.processId} (${proc.isChildProcess ? "child" : "parent"})`); - cachedElements.eltProcess.textContent = `Processes: ${processes.join(", ")}`; - - let eltImpact = cachedElements.eltImpact; - if (currentMode == MODE_RECENT) { - cachedElements.eltRoot.setAttribute("impact", delta.diff.jank.longestDuration + 1); - if (Delta.compare(delta, Delta.MAX_DELTA_FOR_GOOD_RECENT_PERFORMANCE) <= 0) { - eltImpact.textContent = ` currently performs well.`; - } else if (Delta.compare(delta, Delta.MAX_DELTA_FOR_AVERAGE_RECENT_PERFORMANCE)) { - eltImpact.textContent = ` may currently be slowing down ${BRAND_NAME}.`; - } else { - eltImpact.textContent = ` is currently considerably slowing down ${BRAND_NAME}.`; - } - - cachedElements.eltFPS.textContent = `Impact on framerate: ${delta.diff.jank.longestDuration + 1}/${delta.diff.jank.durations.length}`; - cachedElements.eltCPU.textContent = `CPU usage: ${Math.ceil(delta.diff.jank.totalCPUTime / delta.diff.deltaT / 10)}%.`; - cachedElements.eltSystem.textContent = `System usage: ${Math.ceil(delta.diff.jank.totalSystemTime / delta.diff.deltaT / 10)}%.`; - cachedElements.eltCPOW.textContent = `Blocking process calls: ${Math.ceil(delta.diff.cpow.totalCPOWTime / delta.diff.deltaT / 10)}%.`; - } else { - if (delta.alerts.length == 0) { - eltImpact.textContent = " has performed well so far."; - cachedElements.eltFPS.textContent = `Impact on framerate: no impact.`; - cachedElements.eltRoot.setAttribute("impact", 0); - } else { - let impact = 0; - let sum = /* medium impact */ delta.alerts[0] + /* high impact */ delta.alerts[1]; - let frequency = sum * 1000 / delta.diff.deltaT; - - let describeFrequency; - if (frequency <= MAX_FREQUENCY_FOR_NO_IMPACT) { - describeFrequency = `has no impact on the performance of ${BRAND_NAME}.`; - } else { - let describeImpact; - if (frequency <= MAX_FREQUENCY_FOR_RARE) { - describeFrequency = `rarely slows down ${BRAND_NAME}.`; - impact += 1; - } else if (frequency <= MAX_FREQUENCY_FOR_FREQUENT) { - describeFrequency = `has slown down ${BRAND_NAME} frequently.`; - impact += 2.5; - } else { - describeFrequency = `seems to have slown down ${BRAND_NAME} very often.`; - impact += 5; - } - // At this stage, `sum != 0` - if (delta.alerts[1] / sum > MIN_PROPORTION_FOR_MAJOR_IMPACT) { - describeImpact = "When this happens, the slowdown is generally important."; - impact *= 2; - } else { - describeImpact = "When this happens, the slowdown is generally noticeable."; - } - - eltImpact.textContent = ` ${describeFrequency} ${describeImpact}`; - cachedElements.eltFPS.textContent = `Impact on framerate: ${delta.alerts[1] || 0} high-impacts, ${delta.alerts[0] || 0} medium-impact.`; - } - cachedElements.eltRoot.setAttribute("impact", Math.round(impact)); - } - - cachedElements.eltCPU.textContent = `CPU usage: ${Math.ceil(delta.diff.jank.totalCPUTime / delta.diff.deltaT / 10)}% (total ${delta.diff.jank.totalUserTime}ms).`; - cachedElements.eltSystem.textContent = `System usage: ${Math.ceil(delta.diff.jank.totalSystemTime / delta.diff.deltaT / 10)}% (total ${delta.diff.jank.totalSystemTime}ms).`; - cachedElements.eltCPOW.textContent = `Blocking process calls: ${Math.ceil(delta.diff.cpow.totalCPOWTime / delta.diff.deltaT / 10)}% (total ${delta.diff.cpow.totalCPOWTime}ms).`; - } - } - this._insertElements(toAdd, id); - }, - - _insertElements(elements, id) { - let eltContainer = document.getElementById(id); - eltContainer.classList.remove("measuring"); - eltContainer.eltVisibleContent.innerHTML = ""; - eltContainer.eltHiddenContent.innerHTML = ""; - eltContainer.appendChild(eltContainer.eltShowMore); - - for (let i = 0; i < elements.length && i < MAX_NUMBER_OF_ITEMS_TO_DISPLAY; ++i) { - let cachedElements = elements[i]; - eltContainer.eltVisibleContent.appendChild(cachedElements.eltRoot); - } - for (let i = MAX_NUMBER_OF_ITEMS_TO_DISPLAY; i < elements.length; ++i) { - let cachedElements = elements[i]; - eltContainer.eltHiddenContent.appendChild(cachedElements.eltRoot); - } - if (elements.length <= MAX_NUMBER_OF_ITEMS_TO_DISPLAY) { - eltContainer.eltShowMore.classList.add("hidden"); - } else { - eltContainer.eltShowMore.classList.remove("hidden"); - } - if (elements.length == 0) { - eltContainer.textContent = "Nothing"; - } - }, - _setupStructure(id) { - let eltContainer = document.getElementById(id); - if (!eltContainer.eltVisibleContent) { - eltContainer.eltVisibleContent = document.createElement("ul"); - eltContainer.eltVisibleContent.classList.add("visible_items"); - eltContainer.appendChild(eltContainer.eltVisibleContent); - } - if (!eltContainer.eltHiddenContent) { - eltContainer.eltHiddenContent = document.createElement("ul"); - eltContainer.eltHiddenContent.classList.add("hidden"); - eltContainer.eltHiddenContent.classList.add("hidden_additional_items"); - eltContainer.appendChild(eltContainer.eltHiddenContent); - } - if (!eltContainer.eltShowMore) { - eltContainer.eltShowMore = document.createElement("button"); - eltContainer.eltShowMore.textContent = "Show all"; - eltContainer.eltShowMore.classList.add("show_all_items"); - eltContainer.appendChild(eltContainer.eltShowMore); - eltContainer.eltShowMore.addEventListener("click", function() { - if (eltContainer.eltHiddenContent.classList.contains("hidden")) { - eltContainer.eltHiddenContent.classList.remove("hidden"); - eltContainer.eltShowMore.textContent = "Hide"; - } else { - eltContainer.eltHiddenContent.classList.add("hidden"); - eltContainer.eltShowMore.textContent = "Show all"; - } - }); - } - return eltContainer; - }, - - _grabOrCreateElements(delta, nature) { - let cachedElements = this.DOMCache.get(delta.key); - if (cachedElements) { - if (cachedElements.eltRoot.parentElement) { - cachedElements.eltRoot.parentElement.removeChild(cachedElements.eltRoot); - } - } else { - this.DOMCache.set(delta.key, cachedElements = {}); - - let eltDelta = document.createElement("li"); - eltDelta.classList.add("delta"); - cachedElements.eltRoot = eltDelta; - - let eltSpan = document.createElement("span"); - eltDelta.appendChild(eltSpan); - - let eltSummary = document.createElement("span"); - eltSummary.classList.add("summary"); - eltSpan.appendChild(eltSummary); - - let eltTitle = document.createElement("span"); - eltTitle.classList.add("title"); - eltSummary.appendChild(eltTitle); - cachedElements.eltTitle = eltTitle; - - let eltImpact = document.createElement("span"); - eltImpact.classList.add("impact"); - eltSummary.appendChild(eltImpact); - cachedElements.eltImpact = eltImpact; - - let eltShowMore = document.createElement("a"); - eltShowMore.classList.add("more"); - eltSpan.appendChild(eltShowMore); - eltShowMore.textContent = "more"; - eltShowMore.href = ""; - eltShowMore.addEventListener("click", () => { - if (eltDetails.classList.contains("hidden")) { - eltDetails.classList.remove("hidden"); - eltShowMore.textContent = "less"; - } else { - eltDetails.classList.add("hidden"); - eltShowMore.textContent = "more"; - } - }); - - // Add buttons - if (nature == "webpages") { - eltSpan.appendChild(document.createElement("br")); - - let eltCloseTab = document.createElement("button"); - eltCloseTab.textContent = "Close tab"; - eltSpan.appendChild(eltCloseTab); - let windowIds = delta.diff.windowIds; - eltCloseTab.addEventListener("click", () => { - let found = tabFinder.getAny(windowIds); - if (!found) { - // Cannot find the tab. Maybe it is closed already? - return; - } - let {tabbrowser, tab} = found; - tabbrowser.removeTab(tab); - }); - - let eltReloadTab = document.createElement("button"); - eltReloadTab.textContent = "Reload tab"; - eltSpan.appendChild(eltReloadTab); - eltReloadTab.addEventListener("click", () => { - let found = tabFinder.getAny(windowIds); - if (!found) { - // Cannot find the tab. Maybe it is closed already? - return; - } - let {tabbrowser, tab} = found; - tabbrowser.reloadTab(tab); - }); - } - - // Prepare details - let eltDetails = document.createElement("ul"); - eltDetails.classList.add("details"); - eltDetails.classList.add("hidden"); - eltSpan.appendChild(eltDetails); - - for (let [name, className] of [ - ["eltName", "name"], - ["eltFPS", "fps"], - ["eltCPU", "cpu"], - ["eltSystem", "system"], - ["eltCPOW", "cpow"], - ["eltLoaded", "loaded"], - ["eltProcess", "process"], - ]) { - let elt = document.createElement("li"); - elt.classList.add(className); - eltDetails.appendChild(elt); - cachedElements[name] = elt; - } - } - - return cachedElements; - }, - _fragment: document.createDocumentFragment(), async commit() { let tbody = document.getElementById("dispatch-tbody"); @@ -1133,8 +492,6 @@ var Control = { } }, init() { - this._initAutorefresh(); - this._initDisplayMode(); let tbody = document.getElementById("dispatch-tbody"); tbody.addEventListener("click", event => { this._updateLastMouseEvent(); @@ -1218,129 +575,107 @@ var Control = { this._lastMouseEvent = Date.now(); }, async update() { - if (this._autoRefreshInterval || !State._buffer[0]) { - // Update the state only if we are not on pause. - await State.update(); - if (document.hidden) - return; - } + await State.update(); + + if (document.hidden) + return; + await wait(0); await this._updateDisplay(); - - // Inform watchers - Services.obs.notifyObservers(null, UPDATE_COMPLETE_TOPIC, this._displayMode); }, // The force parameter can force a full update even when the mouse has been // moved recently. async _updateDisplay(force = false) { - if (!performanceCountersEnabled()) { - let mode = this._displayMode; - let state = await (mode == MODE_GLOBAL ? - State.promiseDeltaSinceStartOfTime() : - State.promiseDeltaSinceStartOfBuffer()); - - for (let category of ["webpages"]) { - await wait(0); - await View.updateCategory(state[category], category, category, mode); - } - await wait(0); - - // Make sure that we do not keep obsolete stuff around. - View.DOMCache.trimTo(state.deltas); - - await wait(0); - } else { - // If the mouse has been moved recently, update the data displayed - // without moving any item to avoid the risk of users clicking an action - // button for the wrong item. - // Memory use is unlikely to change dramatically within a few seconds, so - // it's probably fine to not update the Memory column in this case. - if (!force && Date.now() - this._lastMouseEvent < TIME_BEFORE_SORTING_AGAIN) { - let energyImpactPerId = new Map(); - for (let {id, dispatchesSincePrevious, - durationSincePrevious} of State.getCounters()) { - let energyImpact = this._computeEnergyImpact(dispatchesSincePrevious, - durationSincePrevious); - energyImpactPerId.set(id, energyImpact); - } - - let row = document.getElementById("dispatch-tbody").firstChild; - while (row) { - if (row.windowId && energyImpactPerId.has(row.windowId)) { - // We update the value in the Energy Impact column, but don't - // update the children, as if the child count changes there's a - // risk of making other rows move up or down. - const kEnergyImpactColumn = 2; - let elt = row.childNodes[kEnergyImpactColumn]; - View.displayEnergyImpact(elt, energyImpactPerId.get(row.windowId)); - } - row = row.nextSibling; - } - return; + // If the mouse has been moved recently, update the data displayed + // without moving any item to avoid the risk of users clicking an action + // button for the wrong item. + // Memory use is unlikely to change dramatically within a few seconds, so + // it's probably fine to not update the Memory column in this case. + if (!force && Date.now() - this._lastMouseEvent < TIME_BEFORE_SORTING_AGAIN) { + let energyImpactPerId = new Map(); + for (let {id, dispatchesSincePrevious, + durationSincePrevious} of State.getCounters()) { + let energyImpact = this._computeEnergyImpact(dispatchesSincePrevious, + durationSincePrevious); + energyImpactPerId.set(id, energyImpact); } - let selectedId = -1; - // Reset the selectedRow field and the _openItems set each time we redraw - // to avoid keeping forever references to closed window ids. - if (this.selectedRow) { - selectedId = this.selectedRow.windowId; - this.selectedRow = null; + let row = document.getElementById("dispatch-tbody").firstChild; + while (row) { + if (row.windowId && energyImpactPerId.has(row.windowId)) { + // We update the value in the Energy Impact column, but don't + // update the children, as if the child count changes there's a + // risk of making other rows move up or down. + const kEnergyImpactColumn = 2; + let elt = row.childNodes[kEnergyImpactColumn]; + View.displayEnergyImpact(elt, energyImpactPerId.get(row.windowId)); + } + row = row.nextSibling; } - let openItems = this._openItems; - this._openItems = new Set(); - - let counters = this._sortCounters(State.getCounters()); - for (let {id, name, image, type, totalDispatches, dispatchesSincePrevious, - memory, totalDuration, durationSincePrevious, children} of counters) { - let row = - View.appendRow(name, - this._computeEnergyImpact(dispatchesSincePrevious, - durationSincePrevious), - memory, - {totalDispatches, totalDuration: Math.ceil(totalDuration / 1000), - dispatchesSincePrevious, - durationSincePrevious: Math.ceil(durationSincePrevious / 1000)}, - type, image); - row.windowId = id; - if (id == selectedId) { - row.setAttribute("selected", "true"); - this.selectedRow = row; - } - - if (!children.length) - continue; - - // Show the twisty image. - let elt = row.firstChild; - let img = document.createElement("span"); - img.className = "twisty"; - let open = openItems.has(id); - if (open) { - img.classList.add("open"); - this._openItems.add(id); - } - - // If there's an l10n id on our
  • node, any image we add will be - // removed during localization, so move the l10n id to a - let l10nAttrs = document.l10n.getAttributes(elt); - if (l10nAttrs.id) { - let span = document.createElement("span"); - document.l10n.setAttributes(span, l10nAttrs.id, l10nAttrs.args); - elt.removeAttribute("data-l10n-id"); - elt.removeAttribute("data-l10n-args"); - elt.insertBefore(span, elt.firstChild); - } - - elt.insertBefore(img, elt.firstChild); - - row._children = children; - if (open) - this._showChildren(row); - } - - await View.commit(); + return; } + + let selectedId = -1; + // Reset the selectedRow field and the _openItems set each time we redraw + // to avoid keeping forever references to closed window ids. + if (this.selectedRow) { + selectedId = this.selectedRow.windowId; + this.selectedRow = null; + } + let openItems = this._openItems; + this._openItems = new Set(); + + let counters = this._sortCounters(State.getCounters()); + for (let {id, name, image, type, totalDispatches, dispatchesSincePrevious, + memory, totalDuration, durationSincePrevious, children} of counters) { + let row = + View.appendRow(name, + this._computeEnergyImpact(dispatchesSincePrevious, + durationSincePrevious), + memory, + {totalDispatches, totalDuration: Math.ceil(totalDuration / 1000), + dispatchesSincePrevious, + durationSincePrevious: Math.ceil(durationSincePrevious / 1000)}, + type, image); + row.windowId = id; + if (id == selectedId) { + row.setAttribute("selected", "true"); + this.selectedRow = row; + } + + if (!children.length) + continue; + + // Show the twisty image. + let elt = row.firstChild; + let img = document.createElement("span"); + img.className = "twisty"; + let open = openItems.has(id); + if (open) { + img.classList.add("open"); + this._openItems.add(id); + } + + // If there's an l10n id on our node, any image we add will be + // removed during localization, so move the l10n id to a + let l10nAttrs = document.l10n.getAttributes(elt); + if (l10nAttrs.id) { + let span = document.createElement("span"); + document.l10n.setAttributes(span, l10nAttrs.id, l10nAttrs.args); + elt.removeAttribute("data-l10n-id"); + elt.removeAttribute("data-l10n-args"); + elt.insertBefore(span, elt.firstChild); + } + + elt.insertBefore(img, elt.firstChild); + + row._children = children; + if (open) + this._showChildren(row); + } + + await View.commit(); }, _showChildren(row) { let children = row._children; @@ -1399,92 +734,19 @@ var Control = { return String.prototype.localeCompare.call(a.name, b.name); }); }, - _setOptions(options) { - dump(`about:performance _setOptions ${JSON.stringify(options)}\n`); - let eltRefresh = document.getElementById("check-autorefresh"); - if ((options.autoRefresh > 0) != eltRefresh.checked) { - eltRefresh.click(); - } - let eltCheckRecent = document.getElementById("check-display-recent"); - if (!!options.displayRecent != eltCheckRecent.checked) { - eltCheckRecent.click(); - } - }, - _initAutorefresh() { - let onRefreshChange = (shouldUpdateNow = false) => { - if (eltRefresh.checked == !!this._autoRefreshInterval) { - // Nothing to change. - return; - } - if (eltRefresh.checked) { - this._autoRefreshInterval = window.setInterval(() => Control.update(), UPDATE_INTERVAL_MS); - if (shouldUpdateNow) { - Control.update(); - } - } else { - window.clearInterval(this._autoRefreshInterval); - this._autoRefreshInterval = null; - } - }; - - let eltRefresh = document.getElementById("check-autorefresh"); - eltRefresh.addEventListener("change", () => onRefreshChange(true)); - - onRefreshChange(false); - }, - _autoRefreshInterval: null, - _initDisplayMode() { - let onModeChange = (shouldUpdateNow) => { - if (eltCheckRecent.checked) { - this._displayMode = MODE_RECENT; - } else { - this._displayMode = MODE_GLOBAL; - } - if (shouldUpdateNow) { - Control.update(); - } - }; - - let eltCheckRecent = document.getElementById("check-display-recent"); - let eltLabelRecent = document.getElementById("label-display-recent"); - eltCheckRecent.addEventListener("click", () => onModeChange(true)); - eltLabelRecent.textContent = `Display only the latest ${Math.round(BUFFER_DURATION_MS / 1000)}s`; - - onModeChange(false); - }, - // The display mode. One of `MODE_GLOBAL` or `MODE_RECENT`. - _displayMode: MODE_GLOBAL, }; var go = async function() { Control.init(); - if (performanceCountersEnabled()) { - let opt = document.querySelector(".options"); - opt.style.display = "none"; - opt.nextElementSibling.style.display = "none"; - - let addons = await AddonManager.getAddonsByTypes(["extension"]); - for (let addon of addons) { - if (addon.isSystem) { - gSystemAddonIds.add(addon.id); - } + let addons = await AddonManager.getAddonsByTypes(["extension"]); + for (let addon of addons) { + if (addon.isSystem) { + gSystemAddonIds.add(addon.id); } - } else { - document.getElementById("dispatch-table").parentNode.style.display = "none"; } - // Setup a hook to allow tests to configure and control this page - let testUpdate = function(subject, topic, value) { - let options = JSON.parse(value); - Control._setOptions(options); - Control.update(); - }; - Services.obs.addObserver(testUpdate, TEST_DRIVER_TOPIC); - window.addEventListener("unload", () => Services.obs.removeObserver(testUpdate, TEST_DRIVER_TOPIC)); - - await Control.update(); - await wait(BUFFER_SAMPLING_RATE_MS * 1.1); await Control.update(); + window.setInterval(() => Control.update(), UPDATE_INTERVAL_MS); }; diff --git a/toolkit/components/aboutperformance/content/aboutPerformance.xhtml b/toolkit/components/aboutperformance/content/aboutPerformance.xhtml index 285fdf868144..aa478f5e0ed6 100644 --- a/toolkit/components/aboutperformance/content/aboutPerformance.xhtml +++ b/toolkit/components/aboutperformance/content/aboutPerformance.xhtml @@ -17,98 +17,11 @@ @import url("chrome://global/skin/in-content/common.css"); html { - --aboutSupport-table-background: #ebebeb; background-color: var(--in-content-page-background); } body { - margin: 40px 48px; - } - .hidden { - display: none; - } - .summary .title { - font-weight: bold; - } - a { - text-decoration: none; - } - a.more { - margin-left: 2ch; - } - ul.hidden_additional_items { - padding-top: 0; - margin-top: 0; - } - ul.visible_items { - padding-bottom: 0; - margin-bottom: 0; - } - li.delta { - margin-top: .5em; - } - h2 { - font-size: 1.46em; - font-weight: 300; - line-height: 1.3em; - margin: 16px 0; - -moz-user-select: none; - } - button.show_all_items { - margin-top: .5cm; - margin-left: 1cm; - } - body { - margin-left: 1cm; overflow-x: hidden; } - div.measuring { - background: url(chrome://global/skin/media/throbber.png) no-repeat center; - min-width: 36px; - min-height: 36px; - } - li.delta { - border-left-width: 5px; - border-left-style: solid; - padding-left: 1em; - list-style: none; - } - li.delta[impact="0"] { - border-left-color: rgb(0, 255, 0); - } - li.delta[impact="1"] { - border-left-color: rgb(24, 231, 0); - } - li.delta[impact="2"] { - border-left-color: rgb(48, 207, 0); - } - li.delta[impact="3"] { - border-left-color: rgb(72, 183, 0); - } - li.delta[impact="4"] { - border-left-color: rgb(96, 159, 0); - } - li.delta[impact="5"] { - border-left-color: rgb(120, 135, 0); - } - li.delta[impact="6"] { - border-left-color: rgb(144, 111, 0); - } - li.delta[impact="7"] { - border-left-color: rgb(168, 87, 0); - } - li.delta[impact="8"] { - border-left-color: rgb(192, 63, 0); - } - li.delta[impact="9"] { - border-left-color: rgb(216, 39, 0); - } - li.delta[impact="10"] { - border-left-color: rgb(240, 15, 0); - } - li.delta[impact="11"] { - border-left-color: rgb(255, 0, 0); - } - #dispatch-table { -moz-user-select: none; font-size: 1em; @@ -304,47 +217,20 @@ #dispatch-tbody > tr:hover { background-color: var(--in-content-item-hover); } - - .options { - width: 100%; - } - .options > .toggle-container-with-text { - display: inline-flex; - } - .options > .toggle-container-with-text:not(:first-child) { - margin-inline-start: 2ch; - } -
    -
    - - -
    -
    - - -
    -
    -
    -

    Performance of Web pages

    -
    -
    -
    -
    - - - - - - - -
    - - - -
    -
    + + + + + + + +
    + + + +
    From 698dfa2ef94b2b432c6285d1c4d9abd957e4f793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Qu=C3=A8ze?= Date: Wed, 9 Jan 2019 12:43:42 +0100 Subject: [PATCH 13/17] Bug 1498195 - adapt the browser_aboutperformance.js test to cover the new about:performance, r=felipe. --- .../content/aboutPerformance.js | 3 + .../tests/browser/browser.ini | 2 - .../tests/browser/browser_aboutperformance.js | 348 +++--------------- .../tests/browser/browser_compartments.html | 1 + .../browser/browser_compartments_frame.html | 1 + .../browser/browser_compartments_script.js | 17 - .../aboutperformance/tests/browser/head.js | 50 --- 7 files changed, 57 insertions(+), 365 deletions(-) delete mode 100644 toolkit/components/aboutperformance/tests/browser/head.js diff --git a/toolkit/components/aboutperformance/content/aboutPerformance.js b/toolkit/components/aboutperformance/content/aboutPerformance.js index 36bada40605c..e402d662c422 100644 --- a/toolkit/components/aboutperformance/content/aboutPerformance.js +++ b/toolkit/components/aboutperformance/content/aboutPerformance.js @@ -303,6 +303,9 @@ var State = { type = "browser"; } else if (/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/.test(host)) { let addon = WebExtensionPolicy.getByHostname(host); + if (!addon) { + continue; + } name = `${addon.name} (${addon.id})`; image = "chrome://mozapps/skin/extensions/extensionGeneric-16.svg"; type = gSystemAddonIds.has(addon.id) ? "system-addon" : "addon"; diff --git a/toolkit/components/aboutperformance/tests/browser/browser.ini b/toolkit/components/aboutperformance/tests/browser/browser.ini index 4b8cad12ff6e..c36144fc2aba 100644 --- a/toolkit/components/aboutperformance/tests/browser/browser.ini +++ b/toolkit/components/aboutperformance/tests/browser/browser.ini @@ -1,9 +1,7 @@ [DEFAULT] -head = head.js support-files = browser_compartments.html browser_compartments_frame.html browser_compartments_script.js [browser_aboutperformance.js] -skip-if = true diff --git a/toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js b/toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js index d61d9b530ea0..f01c79e0841d 100644 --- a/toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js +++ b/toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js @@ -1,308 +1,64 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ -/* eslint-env mozilla/frame-script */ -/* eslint-disable mozilla/no-arbitrary-setTimeout */ - "use strict"; -ChromeUtils.import("resource://testing-common/ContentTask.jsm", this); - const URL = "http://example.com/browser/toolkit/components/aboutperformance/tests/browser/browser_compartments.html?test=" + Math.random(); -// This function is injected as source as a frameScript -function frameScript() { - "use strict"; - - addMessageListener("aboutperformance-test:done", () => { - content.postMessage("stop", "*"); - sendAsyncMessage("aboutperformance-test:done", null); - }); - addMessageListener("aboutperformance-test:setTitle", ({data: title}) => { - content.document.title = title; - sendAsyncMessage("aboutperformance-test:setTitle", null); - }); - - addMessageListener("aboutperformance-test:closeTab", ({data: options}) => { - let observer = function(subject, topic, mode) { - dump(`aboutperformance-test:closeTab 1 ${options.url}\n`); - Services.obs.removeObserver(observer, "about:performance-update-complete"); - - let exn; - let found = false; - try { - for (let eltContent of content.document.querySelectorAll("li.delta")) { - let eltName = eltContent.querySelector("li.name"); - if (!eltName.textContent.includes(options.url)) { - continue; - } - - found = true; - let [eltCloseTab, eltReloadTab] = eltContent.querySelectorAll("button"); - let button; - if (options.mode == "reload") { - button = eltReloadTab; - } else if (options.mode == "close") { - button = eltCloseTab; - } else { - throw new TypeError(options.mode); - } - dump(`aboutperformance-test:closeTab clicking on ${button.textContent}\n`); - button.click(); - return; - } - } catch (ex) { - dump(`aboutperformance-test:closeTab: error ${ex}\n`); - exn = ex; - } finally { - if (exn) { - sendAsyncMessage("aboutperformance-test:closeTab", { error: {message: exn.message, lineNumber: exn.lineNumber, fileName: exn.fileName}, found}); - } else { - sendAsyncMessage("aboutperformance-test:closeTab", { ok: true, found }); - } - } - }; - Services.obs.addObserver(observer, "about:performance-update-complete"); - Services.obs.notifyObservers(null, "test-about:performance-test-driver", JSON.stringify(options)); - }); - - addMessageListener("aboutperformance-test:checkSanity", ({data: options}) => { - let exn = null; - try { - let reFullname = /Full name: (.+)/; - let reFps = /Impact on framerate: ((\d+) high-impacts, (\d+) medium-impact|(\d+)\/10)?/; - let reCPU = /CPU usage: (\d+)%/; - let reCpow = /Blocking process calls: (\d+)%( \((\d+) alerts\))?/; - - let getContentOfSelector = function(eltContainer, selector, re) { - let elt = eltContainer.querySelector(selector); - if (!elt) { - throw new Error(`No item ${selector}`); - } - - if (!re) { - return undefined; - } - - let match = elt.textContent.match(re); - if (!match) { - throw new Error(`Item ${selector} doesn't match regexp ${re}: ${elt.textContent}`); - } - return match; - }; - - // Additional sanity check - let deltas = content.document.querySelectorAll(".delta"); - if (!deltas.length) { - throw new Error("No deltas found to check!"); - } - - for (let eltContent of deltas) { - // Do we have an attribute "impact"? Is it a number between 0 and 10? - let impact = eltContent.getAttribute("impact"); - let value = Number.parseInt(impact); - if (isNaN(value) || value < 0 || value > 10) { - throw new Error(`Incorrect value ${value}`); - } - - // Do we have a button "more"? - getContentOfSelector(eltContent, "a.more"); - - // Do we have details? - getContentOfSelector(eltContent, "ul.details"); - - // Do we have a full name? Does it make sense? - getContentOfSelector(eltContent, "li.name", reFullname); - - let eltDetails = eltContent.querySelector("ul.details"); - - // Do we have an impact on framerate? Does it make sense? - if (!eltDetails.querySelector("li.fps").textContent.includes("no impact")) { - let [, jankStr,, alertsStr] = getContentOfSelector(eltDetails, "li.fps", reFps); - let jank = Number.parseInt(jankStr); - if (jank < 0 || jank > 10 || isNaN(jank)) { - throw new Error(`Invalid jank ${jankStr}`); - } - if (alertsStr) { - let alerts = Number.parseInt(alertsStr); - if (alerts < 0 || isNaN(alerts)) { - throw new Error(`Invalid alerts ${alertsStr}`); - } - } - } - - // Do we have a CPU usage? Does it make sense? - let [, cpuStr] = getContentOfSelector(eltDetails, "li.cpu", reCPU); - let cpu = Number.parseInt(cpuStr); - if (cpu < 0 || isNaN(cpu)) { // Note that cpu can be > 100%. - throw new Error(`Invalid CPU ${cpuStr}`); - } - - // Do we have CPOW? Does it make sense? - let [, cpowStr,, alertsStr2] = getContentOfSelector(eltDetails, "li.cpow", reCpow); - let cpow = Number.parseInt(cpowStr); - if (cpow < 0 || isNaN(cpow)) { - throw new Error(`Invalid cpow ${cpowStr}`); - } - if (alertsStr2) { - let alerts = Number.parseInt(alertsStr2); - if (alerts < 0 || isNaN(alerts)) { - throw new Error(`Invalid alerts ${alertsStr2}`); - } - } - } - } catch (ex) { - dump(`aboutperformance-test:checkSanity: error ${ex}\n`); - exn = ex; - } - if (exn) { - sendAsyncMessage("aboutperformance-test:checkSanity", { error: {message: exn.message, lineNumber: exn.lineNumber, fileName: exn.fileName}}); - } else { - sendAsyncMessage("aboutperformance-test:checkSanity", { ok: true }); - } - }); - - addMessageListener("aboutperformance-test:hasItems", ({data: {title, options}}) => { - let observer = function(subject, topic, mode) { - Services.obs.removeObserver(observer, "about:performance-update-complete"); - let hasTitleInWebpages = false; - - try { - let eltWeb = content.document.getElementById("webpages"); - if (!eltWeb) { - dump(`aboutperformance-test:hasItems: the page is not ready yet webpages:${eltWeb}\n`); - return; - } - - let webTitles = Array.from(eltWeb.querySelectorAll("span.title"), elt => elt.textContent); - - hasTitleInWebpages = webTitles.includes(title); - } catch (ex) { - Cu.reportError("Error in content: " + ex); - Cu.reportError(ex.stack); - } finally { - sendAsyncMessage("aboutperformance-test:hasItems", {hasTitleInWebpages, mode}); - } - }; - Services.obs.addObserver(observer, "about:performance-update-complete"); - Services.obs.notifyObservers(null, "test-about:performance-test-driver", JSON.stringify(options)); - }); -} - -var gTabAboutPerformance = null; -var gTabContent = null; - add_task(async function init() { info("Setting up about:performance"); - gTabAboutPerformance = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:performance"); - await ContentTask.spawn(gTabAboutPerformance.linkedBrowser, null, frameScript); + let tabAboutPerformance = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:performance"); + + await BrowserTestUtils.browserLoaded(tabAboutPerformance.linkedBrowser); info(`Setting up ${URL}`); - gTabContent = BrowserTestUtils.addTab(gBrowser, URL); - await ContentTask.spawn(gTabContent.linkedBrowser, null, frameScript); -}); - -var promiseExpectContent = async function(options) { - let title = "Testing about:performance " + Math.random(); - for (let i = 0; i < 30; ++i) { - await new Promise(resolve => setTimeout(resolve, 100)); - await promiseContentResponse(gTabContent.linkedBrowser, "aboutperformance-test:setTitle", title); - let {hasTitleInWebpages, mode} = (await promiseContentResponse(gTabAboutPerformance.linkedBrowser, "aboutperformance-test:hasItems", {title, options})); - - info(`aboutperformance-test:hasItems ${hasTitleInWebpages}, ${mode}, ${options.displayRecent}`); - if (!hasTitleInWebpages) { - info(`Title not found in webpages`); - continue; - } - if ((mode == "recent") != options.displayRecent) { - info(`Wrong mode`); - continue; - } - - let { ok, error } = await promiseContentResponse(gTabAboutPerformance.linkedBrowser, "aboutperformance-test:checkSanity", {options}); - if (ok) { - info("aboutperformance-test:checkSanity: success"); - } - if (error) { - Assert.ok(false, `aboutperformance-test:checkSanity error: ${JSON.stringify(error)}`); - } - return true; - } - return false; -}; - -// Test that we can find the title of a webpage in about:performance -add_task(async function test_find_title() { - for (let displayRecent of [true, false]) { - info(`Testing with autoRefresh, in ${displayRecent ? "recent" : "global"} mode`); - let found = await promiseExpectContent({autoRefresh: 100, displayRecent}); - Assert.ok(found, `The page title appears when about:performance is set to auto-refresh`); - } -}); - -// Test that we can close/reload tabs using the corresponding buttons -add_task(async function test_close_tab() { - let tabs = new Map(); - let closeObserver = function({type, originalTarget: tab}) { - dump(`closeObserver: ${tab}, ${tab.constructor.name}, ${tab.tagName}, ${type}\n`); - let cb = tabs.get(tab); - if (cb) { - cb(type); - } - }; - let promiseTabClosed = function(tab) { - return new Promise(resolve => tabs.set(tab, resolve)); - }; - window.gBrowser.tabContainer.addEventListener("TabClose", closeObserver); - let promiseTabReloaded = function(tab) { - return new Promise(resolve => - tab.linkedBrowser.contentDocument.addEventListener("readystatechange", resolve) - ); - }; - for (let displayRecent of [true, false]) { - for (let mode of ["close", "reload"]) { - let URL = `about:about?display-recent=${displayRecent}&mode=${mode}&salt=${Math.random()}`; - info(`Setting up ${URL}`); - let tab = BrowserTestUtils.addTab(gBrowser, URL); - await ContentTask.spawn(tab.linkedBrowser, null, frameScript); - let promiseClosed = promiseTabClosed(tab); - let promiseReloaded = promiseTabReloaded(tab); - - info(`Requesting close`); - do { - await new Promise(resolve => setTimeout(resolve, 100)); - await promiseContentResponse(tab.linkedBrowser, "aboutperformance-test:setTitle", URL); - - let {ok, found, error} = await promiseContentResponse(gTabAboutPerformance.linkedBrowser, "aboutperformance-test:closeTab", {url: URL, autoRefresh: true, mode, displayRecent}); - Assert.ok(ok, `Message aboutperformance-test:closeTab was handled correctly ${JSON.stringify(error)}`); - info(`URL ${URL} ${found ? "found" : "hasn't been found yet"}`); - if (found) { - break; - } - } while (true); - - if (mode == "close") { - info(`Waiting for close`); - await promiseClosed; - } else { - info(`Waiting for reload`); - await promiseReloaded; - BrowserTestUtils.removeTab(tab); - } - } - } -}); - -add_task(async function cleanup() { - // Cleanup - info("Cleaning up"); - await promiseContentResponse(gTabAboutPerformance.linkedBrowser, "aboutperformance-test:done", null); - - info("Closing tabs"); - for (let tab of gBrowser.tabs) { - BrowserTestUtils.removeTab(tab); - } - - info("Done"); - gBrowser.selectedTab = null; + let tabContent = BrowserTestUtils.addTab(gBrowser, URL); + await BrowserTestUtils.browserLoaded(tabContent.linkedBrowser); + + let doc = tabAboutPerformance.linkedBrowser.contentDocument; + let tbody = doc.getElementById("dispatch-tbody"); + + // Wait until the table has first been populated. + await TestUtils.waitForCondition(() => tbody.childElementCount); + + // And wait for another update using a mutation observer, to give our newly created test tab some time + // to burn some CPU. + await new Promise(resolve => { + let observer = new doc.ownerGlobal.MutationObserver(() => { + observer.disconnect(); + resolve(); + }); + observer.observe(tbody, {childList: true}); + }); + + // Find the row for our test tab. + let row = tbody.firstChild; + while (row && row.firstChild.textContent != "Main frame for test browser_aboutperformance.js") + row = row.nextSibling; + Assert.ok(row, "found a table row for our test tab"); + Assert.equal(row.windowId, tabContent.linkedBrowser.outerWindowID, "the correct window id is set"); + + // Ensure it is reported as a medium or high energy impact. + let l10nId = row.children[2].getAttribute("data-l10n-id"); + Assert.ok(["energy-impact-medium", "energy-impact-high"].includes(l10nId), + "our test tab is medium or high energy impact"); + + // Verify selecting a row works. + await BrowserTestUtils.synthesizeMouseAtCenter(row, {}, tabAboutPerformance.linkedBrowser); + Assert.equal(row.getAttribute("selected"), "true", "doing a single click selects the row"); + + // Verify selecting a tab with a double click. + Assert.equal(gBrowser.selectedTab, tabAboutPerformance, "the about:performance tab is selected"); + await BrowserTestUtils.synthesizeMouseAtCenter(row, {clickCount: 2}, tabAboutPerformance.linkedBrowser); + Assert.equal(gBrowser.selectedTab, tabContent, "after a double click the test tab is selected"); + + // Verify we can close a tab using the X button. + // Switch back to about:performance... + await BrowserTestUtils.switchTab(gBrowser, tabAboutPerformance); + // ... and click the X button at the end of the row. + let tabClosing = BrowserTestUtils.waitForTabClosing(tabContent); + await BrowserTestUtils.synthesizeMouseAtCenter(row.children[4], {}, tabAboutPerformance.linkedBrowser); + await tabClosing; + + BrowserTestUtils.removeTab(tabAboutPerformance); }); diff --git a/toolkit/components/aboutperformance/tests/browser/browser_compartments.html b/toolkit/components/aboutperformance/tests/browser/browser_compartments.html index a74a5745af02..379422d7acc3 100644 --- a/toolkit/components/aboutperformance/tests/browser/browser_compartments.html +++ b/toolkit/components/aboutperformance/tests/browser/browser_compartments.html @@ -1,6 +1,7 @@ + Main frame for test browser_aboutperformance.js diff --git a/toolkit/components/aboutperformance/tests/browser/browser_compartments_frame.html b/toolkit/components/aboutperformance/tests/browser/browser_compartments_frame.html index 69edfe871bab..44a073d3bb82 100644 --- a/toolkit/components/aboutperformance/tests/browser/browser_compartments_frame.html +++ b/toolkit/components/aboutperformance/tests/browser/browser_compartments_frame.html @@ -1,6 +1,7 @@ + Subframe for test browser_compartments.html (do not change this title) diff --git a/toolkit/components/aboutperformance/tests/browser/browser_compartments_script.js b/toolkit/components/aboutperformance/tests/browser/browser_compartments_script.js index 8227994a6728..c91b4fb086a1 100644 --- a/toolkit/components/aboutperformance/tests/browser/browser_compartments_script.js +++ b/toolkit/components/aboutperformance/tests/browser/browser_compartments_script.js @@ -1,23 +1,6 @@ -var carryOn = true; - -window.addEventListener("message", e => { - console.log("frame content", "message", e); - if ("title" in e.data) { - document.title = e.data.title; - } - if ("stop" in e.data) { - carryOn = false; - } -}); - // Use some CPU. var interval = window.setInterval(() => { - if (!carryOn) { - window.clearInterval(interval); - return; - } - // Compute an arbitrary value, print it out to make sure that the JS // engine doesn't discard all our computation. var date = Date.now(); diff --git a/toolkit/components/aboutperformance/tests/browser/head.js b/toolkit/components/aboutperformance/tests/browser/head.js deleted file mode 100644 index e9311c1ac70f..000000000000 --- a/toolkit/components/aboutperformance/tests/browser/head.js +++ /dev/null @@ -1,50 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -ChromeUtils.import("resource://gre/modules/Services.jsm", this); - -function promiseContentResponse(browser, name, message) { - let mm = browser.messageManager; - let promise = new Promise(resolve => { - function removeListener() { - mm.removeMessageListener(name, listener); - } - - function listener(msg) { - removeListener(); - resolve(msg.data); - } - - mm.addMessageListener(name, listener); - registerCleanupFunction(removeListener); - }); - mm.sendAsyncMessage(name, message); - return promise; -} -function promiseContentResponseOrNull(browser, name, message) { - if (!browser.messageManager) { - return null; - } - return promiseContentResponse(browser, name, message); -} - -/** - * `true` if we are running an OS in which the OS performance - * clock has a low precision and might unpredictably - * never be updated during the execution of the test. - */ -function hasLowPrecision() { - let [sysName, sysVersion] = [Services.sysinfo.getPropertyAsAString("name"), Services.sysinfo.getPropertyAsDouble("version")]; - info(`Running ${sysName} version ${sysVersion}`); - - if (sysName == "Windows_NT" && sysVersion < 6) { - info("Running old Windows, need to deactivate tests due to bad precision."); - return true; - } - if (sysName == "Linux" && sysVersion <= 2.6) { - info("Running old Linux, need to deactivate tests due to bad precision."); - return true; - } - info("This platform has good precision."); - return false; -} From 4886287a53f6ab1d314b4c6611f7072aa1647465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Qu=C3=A8ze?= Date: Wed, 9 Jan 2019 12:43:43 +0100 Subject: [PATCH 14/17] Bug 1498195 - cleanup CSS selectors that dealt with about:performance containing multiple tables, r=felipe. --- .../content/aboutPerformance.xhtml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/toolkit/components/aboutperformance/content/aboutPerformance.xhtml b/toolkit/components/aboutperformance/content/aboutPerformance.xhtml index aa478f5e0ed6..92b2b1959852 100644 --- a/toolkit/components/aboutperformance/content/aboutPerformance.xhtml +++ b/toolkit/components/aboutperformance/content/aboutPerformance.xhtml @@ -48,24 +48,24 @@ border-bottom: 1px solid var(--in-content-border-color); min-width: 40em; } - #dispatch-thead, #dispatch-tbody tr { + tr { display: table; table-layout: fixed; width: 100%; } - #dispatch-table td:nth-child(2) { + td:nth-child(2) { width: 8em; } - #dispatch-table td:nth-child(3) { + td:nth-child(3) { width: 9em; } - #dispatch-table td:nth-child(4) { + td:nth-child(4) { width: 5em; } #dispatch-tbody td:nth-child(4) { text-align: end; } - #dispatch-table td:nth-child(5) { + td:nth-child(5) { width: 20px; } @@ -132,12 +132,12 @@ transform: scale(1.2); } - #dispatch-table > thead > tr > td { + #dispatch-thead > tr > td { border: none; background-color: var(--in-content-box-background-hover); padding: 5px 10px; } - #dispatch-table > thead > tr > td:not(:first-child) { + #dispatch-thead > tr > td:not(:first-child) { border-inline-start-width: 1px; border-inline-start-style: solid; border-image: linear-gradient(transparent 0%, transparent 20%, #c1c1c1 20%, #c1c1c1 80%, transparent 80%, transparent 100%) 1 1; From 4e824013111a05a30dba2ee672fdac179918a6ae Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Wed, 11 Apr 2018 12:52:47 -0700 Subject: [PATCH 15/17] Bug 1515863, r=valentin,ckerschb Differential Revision: https://phabricator.services.mozilla.com/D15728 --HG-- extra : rebase_source : 2e1c705dd97d458080387896fd7a1f0e88523e06 --- caps/nsJSPrincipals.cpp | 85 ++++++++++++++----- dom/cache/DBSchema.cpp | 5 +- dom/security/nsCSPService.cpp | 12 +++ dom/serviceworkers/ServiceWorkerRegistrar.cpp | 6 +- .../test/gtest/TestReadWrite.cpp | 8 +- .../remoteworkers/RemoteWorkerTypes.ipdlh | 7 -- dom/workers/sharedworkers/SharedWorker.cpp | 28 ------ ipc/glue/BackgroundUtils.cpp | 70 ++++++++++++++- ipc/glue/BackgroundUtils.h | 9 ++ ipc/glue/PBackgroundSharedTypes.ipdlh | 9 ++ 10 files changed, 177 insertions(+), 62 deletions(-) diff --git a/caps/nsJSPrincipals.cpp b/caps/nsJSPrincipals.cpp index b87b00d15e3a..85ec59c52a21 100644 --- a/caps/nsJSPrincipals.cpp +++ b/caps/nsJSPrincipals.cpp @@ -120,9 +120,10 @@ JS_PUBLIC_API void JSPrincipals::dump() { return ReadKnownPrincipalType(aCx, aReader, tag, aOutPrincipals); } -static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, - OriginAttributes& aAttrs, nsACString& aSpec, - nsACString& aOriginNoSuffix) { +static bool ReadPrincipalInfo( + JSStructuredCloneReader* aReader, OriginAttributes& aAttrs, + nsACString& aSpec, nsACString& aOriginNoSuffix, + nsTArray* aPolicies = nullptr) { uint32_t suffixLength, specLength; if (!JS_ReadUint32Pair(aReader, &suffixLength, &specLength)) { return false; @@ -149,12 +150,14 @@ static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, return false; } - uint32_t originNoSuffixLength, dummy; - if (!JS_ReadUint32Pair(aReader, &originNoSuffixLength, &dummy)) { + uint32_t originNoSuffixLength, policyCount; + if (!JS_ReadUint32Pair(aReader, &originNoSuffixLength, &policyCount)) { return false; } - MOZ_ASSERT(dummy == 0); + if (!aPolicies) { + MOZ_ASSERT(policyCount == 0); + } if (!aOriginNoSuffix.SetLength(originNoSuffixLength, fallible)) { return false; @@ -165,6 +168,29 @@ static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, return false; } + for (uint32_t i = 0; i < policyCount; i++) { + uint32_t policyLength, reportAndMeta; + if (!JS_ReadUint32Pair(aReader, &policyLength, &reportAndMeta)) { + return false; + } + bool reportOnly = reportAndMeta & 1; + bool deliveredViaMetaTag = reportAndMeta & 2; + + nsAutoCString policyStr; + if (!policyStr.SetLength(policyLength, fallible)) { + return false; + } + + if (!JS_ReadBytes(aReader, policyStr.BeginWriting(), policyLength)) { + return false; + } + + if (aPolicies) { + aPolicies->AppendElement(ContentSecurityPolicy( + NS_ConvertUTF8toUTF16(policyStr), reportOnly, deliveredViaMetaTag)); + } + } + return true; } @@ -206,7 +232,8 @@ static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, uint32_t aTag, OriginAttributes attrs; nsAutoCString spec; nsAutoCString originNoSuffix; - if (!ReadPrincipalInfo(aReader, attrs, spec, originNoSuffix)) { + nsTArray policies; + if (!ReadPrincipalInfo(aReader, attrs, spec, originNoSuffix, &policies)) { return false; } @@ -218,7 +245,8 @@ static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, uint32_t aTag, MOZ_DIAGNOSTIC_ASSERT(!originNoSuffix.IsEmpty()); - aInfo = ContentPrincipalInfo(attrs, originNoSuffix, spec); + aInfo = + ContentPrincipalInfo(attrs, originNoSuffix, spec, std::move(policies)); } else { #ifdef FUZZING return false; @@ -259,19 +287,37 @@ static bool ReadPrincipalInfo(JSStructuredCloneReader* aReader, uint32_t aTag, return true; } -static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, - const OriginAttributes& aAttrs, - const nsCString& aSpec, - const nsCString& aOriginNoSuffix) { +static bool WritePrincipalInfo( + JSStructuredCloneWriter* aWriter, const OriginAttributes& aAttrs, + const nsCString& aSpec, const nsCString& aOriginNoSuffix, + const nsTArray* aPolicies = nullptr) { nsAutoCString suffix; aAttrs.CreateSuffix(suffix); + size_t policyCount = aPolicies ? aPolicies->Length() : 0; - return JS_WriteUint32Pair(aWriter, suffix.Length(), aSpec.Length()) && - JS_WriteBytes(aWriter, suffix.get(), suffix.Length()) && - JS_WriteBytes(aWriter, aSpec.get(), aSpec.Length()) && - JS_WriteUint32Pair(aWriter, aOriginNoSuffix.Length(), 0) && - JS_WriteBytes(aWriter, aOriginNoSuffix.get(), - aOriginNoSuffix.Length()); + if (!(JS_WriteUint32Pair(aWriter, suffix.Length(), aSpec.Length()) && + JS_WriteBytes(aWriter, suffix.get(), suffix.Length()) && + JS_WriteBytes(aWriter, aSpec.get(), aSpec.Length()) && + JS_WriteUint32Pair(aWriter, aOriginNoSuffix.Length(), policyCount) && + JS_WriteBytes(aWriter, aOriginNoSuffix.get(), + aOriginNoSuffix.Length()))) { + return false; + } + + for (uint32_t i = 0; i < policyCount; i++) { + nsCString policy; + CopyUTF16toUTF8((*aPolicies)[i].policy(), policy); + uint32_t reportAndMeta = + ((*aPolicies)[i].reportOnlyFlag() ? 1 : 0) | + ((*aPolicies)[i].deliveredViaMetaTagFlag() ? 2 : 0); + if (!(JS_WriteUint32Pair(aWriter, policy.Length(), reportAndMeta) && + JS_WriteBytes(aWriter, PromiseFlatCString(policy).get(), + policy.Length()))) { + return false; + } + } + + return true; } static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, @@ -304,7 +350,8 @@ static bool WritePrincipalInfo(JSStructuredCloneWriter* aWriter, const ContentPrincipalInfo& cInfo = aInfo; return JS_WriteUint32Pair(aWriter, SCTAG_DOM_CONTENT_PRINCIPAL, 0) && WritePrincipalInfo(aWriter, cInfo.attrs(), cInfo.spec(), - cInfo.originNoSuffix()); + cInfo.originNoSuffix(), + &(cInfo.securityPolicies())); } bool nsJSPrincipals::write(JSContext* aCx, JSStructuredCloneWriter* aWriter) { diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index 69bd80280600..964e362c3695 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -2490,8 +2490,11 @@ nsresult ReadResponse(mozIStorageConnection* aConn, EntryId aEntryId, nsCString origin; url->Origin(origin); + // CSP is recovered from the headers, no need to initialise it here. + nsTArray policies; aSavedResponseOut->mValue.principalInfo() = - mozilla::ipc::ContentPrincipalInfo(attrs, origin, specNoSuffix); + mozilla::ipc::ContentPrincipalInfo(attrs, origin, specNoSuffix, + std::move(policies)); } bool nullPadding = false; diff --git a/dom/security/nsCSPService.cpp b/dom/security/nsCSPService.cpp index 776b9d7632b6..995840898034 100644 --- a/dom/security/nsCSPService.cpp +++ b/dom/security/nsCSPService.cpp @@ -21,6 +21,7 @@ #include "nsIScriptError.h" #include "nsContentUtils.h" #include "nsContentPolicyUtils.h" +#include "nsNetUtil.h" using namespace mozilla; @@ -250,6 +251,17 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIAsyncVerifyRedirectCallback *callback) { net::nsAsyncRedirectAutoCallback autoCallback(callback); + if (XRE_IsE10sParentProcess()) { + nsCOMPtr parentChannel; + NS_QueryNotificationCallbacks(oldChannel, parentChannel); + if (parentChannel) { + // This is an IPC'd channel. Don't check it here, because we won't have + // access to the request context; we'll check them in the content + // process instead. Bug 1509738 covers fixing this. + return NS_OK; + } + } + nsCOMPtr newUri; nsresult rv = newChannel->GetURI(getter_AddRefs(newUri)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/serviceworkers/ServiceWorkerRegistrar.cpp b/dom/serviceworkers/ServiceWorkerRegistrar.cpp index 0da447ff3756..b3c051d16a16 100644 --- a/dom/serviceworkers/ServiceWorkerRegistrar.cpp +++ b/dom/serviceworkers/ServiceWorkerRegistrar.cpp @@ -111,8 +111,10 @@ nsresult CreatePrincipalInfo(nsILineInputStream* aStream, return rv; } - aEntry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, origin, aEntry->scope()); + // CSP will be applied during the script load. + nsTArray policies; + aEntry->principal() = mozilla::ipc::ContentPrincipalInfo( + attrs, origin, aEntry->scope(), std::move(policies)); return NS_OK; } diff --git a/dom/serviceworkers/test/gtest/TestReadWrite.cpp b/dom/serviceworkers/test/gtest/TestReadWrite.cpp index 6b4121340494..113b049451d3 100644 --- a/dom/serviceworkers/test/gtest/TestReadWrite.cpp +++ b/dom/serviceworkers/test/gtest/TestReadWrite.cpp @@ -271,8 +271,10 @@ TEST(ServiceWorkerRegistrar, TestWriteData) { nsAutoCString spec; spec.AppendPrintf("spec write %d", i); + + nsTArray policies; reg.principal() = mozilla::ipc::ContentPrincipalInfo( - mozilla::OriginAttributes(i, i % 2), spec, spec); + mozilla::OriginAttributes(i, i % 2), spec, spec, std::move(policies)); swr->TestRegisterServiceWorker(reg); } @@ -858,8 +860,10 @@ TEST(ServiceWorkerRegistrar, TestDedupeWrite) { nsAutoCString spec; spec.AppendPrintf("spec write dedupe/%d", i); + + nsTArray policies; reg.principal() = mozilla::ipc::ContentPrincipalInfo( - mozilla::OriginAttributes(0, false), spec, spec); + mozilla::OriginAttributes(0, false), spec, spec, std::move(policies)); swr->TestRegisterServiceWorker(reg); } diff --git a/dom/workers/remoteworkers/RemoteWorkerTypes.ipdlh b/dom/workers/remoteworkers/RemoteWorkerTypes.ipdlh index e8224d4d9b87..666761550188 100644 --- a/dom/workers/remoteworkers/RemoteWorkerTypes.ipdlh +++ b/dom/workers/remoteworkers/RemoteWorkerTypes.ipdlh @@ -11,13 +11,6 @@ using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; namespace mozilla { namespace dom { -struct ContentSecurityPolicy -{ - nsString policy; - bool reportOnlyFlag; - bool deliveredViaMetaTagFlag; -}; - struct RemoteWorkerData { // This should only be used for devtools. diff --git a/dom/workers/sharedworkers/SharedWorker.cpp b/dom/workers/sharedworkers/SharedWorker.cpp index d2dd3c0858dc..698c98323974 100644 --- a/dom/workers/sharedworkers/SharedWorker.cpp +++ b/dom/workers/sharedworkers/SharedWorker.cpp @@ -38,34 +38,6 @@ using namespace mozilla::ipc; namespace { -nsresult PopulateContentSecurityPolicies( - nsIContentSecurityPolicy* aCSP, - nsTArray& aPolicies) { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(aCSP); - MOZ_ASSERT(aPolicies.IsEmpty()); - - uint32_t count = 0; - nsresult rv = aCSP->GetPolicyCount(&count); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - for (uint32_t i = 0; i < count; ++i) { - const nsCSPPolicy* policy = aCSP->GetPolicy(i); - MOZ_ASSERT(policy); - - nsAutoString policyString; - policy->toString(policyString); - - aPolicies.AppendElement( - ContentSecurityPolicy(policyString, policy->getReportOnlyFlag(), - policy->getDeliveredViaMetaTagFlag())); - } - - return NS_OK; -} - nsresult PopulateContentSecurityPolicyArray( nsIPrincipal* aPrincipal, nsTArray& policies, nsTArray& preloadPolicies) { diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 2ca2e38157c1..cfacf829dc19 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -8,7 +8,6 @@ #include "MainThreadUtils.h" #include "mozilla/Assertions.h" -#include "mozilla/BasePrincipal.h" #include "mozilla/ContentPrincipal.h" #include "mozilla/NullPrincipal.h" #include "mozilla/ipc/PBackgroundSharedTypes.h" @@ -24,6 +23,8 @@ #include "nsTArray.h" #include "mozilla/nsRedirectHistoryEntry.h" #include "URIUtils.h" +#include "mozilla/dom/nsCSPUtils.h" +#include "mozilla/dom/nsCSPContext.h" namespace mozilla { namespace net { @@ -103,6 +104,29 @@ already_AddRefed PrincipalInfoToPrincipal( MOZ_CRASH("Origin must be available when deserialized"); } + if (info.securityPolicies().Length() > 0) { + nsCOMPtr csp = + do_CreateInstance(NS_CSPCONTEXT_CONTRACTID, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + rv = csp->SetRequestContext(nullptr, principal); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + + for (auto policy : info.securityPolicies()) { + rv = csp->AppendPolicy(policy.policy(), policy.reportOnlyFlag(), + policy.deliveredViaMetaTagFlag()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return nullptr; + } + } + + principal->SetCsp(csp); + } + return principal.forget(); } @@ -140,6 +164,34 @@ already_AddRefed PrincipalInfoToPrincipal( MOZ_CRASH("Should never get here!"); } +nsresult PopulateContentSecurityPolicies( + nsIContentSecurityPolicy* aCSP, + nsTArray& aPolicies) { + MOZ_ASSERT(aCSP); + MOZ_ASSERT(aPolicies.IsEmpty()); + MOZ_ASSERT(NS_IsMainThread()); + + uint32_t count = 0; + nsresult rv = aCSP->GetPolicyCount(&count); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + for (uint32_t i = 0; i < count; ++i) { + const nsCSPPolicy* policy = aCSP->GetPolicy(i); + MOZ_ASSERT(policy); + + nsAutoString policyString; + policy->toString(policyString); + + aPolicies.AppendElement( + ContentSecurityPolicy(policyString, policy->getReportOnlyFlag(), + policy->getDeliveredViaMetaTagFlag())); + } + + return NS_OK; +} + nsresult PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, PrincipalInfo* aPrincipalInfo) { MOZ_ASSERT(NS_IsMainThread()); @@ -231,8 +283,20 @@ nsresult PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, return rv; } - *aPrincipalInfo = ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), - originNoSuffix, spec); + nsCOMPtr csp; + rv = aPrincipal->GetCsp(getter_AddRefs(csp)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + nsTArray policies; + if (csp) { + PopulateContentSecurityPolicies(csp, policies); + } + + *aPrincipalInfo = + ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), originNoSuffix, + spec, std::move(policies)); return NS_OK; } diff --git a/ipc/glue/BackgroundUtils.h b/ipc/glue/BackgroundUtils.h index 4a177f8d8760..2bd3a551d53c 100644 --- a/ipc/glue/BackgroundUtils.h +++ b/ipc/glue/BackgroundUtils.h @@ -55,6 +55,7 @@ class RedirectHistoryEntryInfo; namespace ipc { +class ContentSecurityPolicy; class PrincipalInfo; /** @@ -65,6 +66,14 @@ class PrincipalInfo; already_AddRefed PrincipalInfoToPrincipal( const PrincipalInfo& aPrincipalInfo, nsresult* aOptionalResult = nullptr); +/** + * Populate an array of ContentSecurityPolicy objects from a CSP object. + * + * MUST be called on the main thread only. + */ +nsresult PopulateContentSecurityPolicies( + nsIContentSecurityPolicy* aCSP, nsTArray& aPolicies); + /** * Convert an nsIPrincipal to a PrincipalInfo. * diff --git a/ipc/glue/PBackgroundSharedTypes.ipdlh b/ipc/glue/PBackgroundSharedTypes.ipdlh index 20e2616cd61e..358ac38450ba 100644 --- a/ipc/glue/PBackgroundSharedTypes.ipdlh +++ b/ipc/glue/PBackgroundSharedTypes.ipdlh @@ -8,6 +8,13 @@ using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; namespace mozilla { namespace ipc { +struct ContentSecurityPolicy +{ + nsString policy; + bool reportOnlyFlag; + bool deliveredViaMetaTagFlag; +}; + struct ContentPrincipalInfo { OriginAttributes attrs; @@ -22,6 +29,8 @@ struct ContentPrincipalInfo nsCString originNoSuffix; nsCString spec; + + ContentSecurityPolicy[] securityPolicies; }; struct SystemPrincipalInfo From ceecd61c1605a5e769d918f92352cb74dc8298a1 Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Fri, 21 Dec 2018 11:56:47 +0000 Subject: [PATCH 16/17] Bug 1515863, r=ckerschb Differential Revision: https://phabricator.services.mozilla.com/D15221 --HG-- extra : rebase_source : 64431f64e9af7a961ffcd47c7b8e01dbecc71b07 --- browser/base/content/utilityOverlay.js | 2 +- caps/BasePrincipal.cpp | 16 ++++++++++ caps/BasePrincipal.h | 8 +++-- caps/ContentPrincipal.cpp | 12 ++++++++ caps/ContentPrincipal.h | 2 ++ caps/nsIScriptSecurityManager.idl | 8 +++++ caps/nsScriptSecurityManager.cpp | 29 +++++++++++++++++++ dom/security/test/csp/browser.ini | 3 ++ .../csp/browser_test_uir_optional_clicks.js | 14 +++++++++ dom/security/test/csp/file_csp_meta_uir.html | 13 +++++++++ 10 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 dom/security/test/csp/browser_test_uir_optional_clicks.js create mode 100644 dom/security/test/csp/file_csp_meta_uir.html diff --git a/browser/base/content/utilityOverlay.js b/browser/base/content/utilityOverlay.js index 6b8d69d22d61..3260f890ef37 100644 --- a/browser/base/content/utilityOverlay.js +++ b/browser/base/content/utilityOverlay.js @@ -339,7 +339,7 @@ function openLinkIn(url, where, params) { userContextId: aUserContextId, privateBrowsingId: aIsPrivate || (w && PrivateBrowsingUtils.isWindowPrivate(w)), }; - return Services.scriptSecurityManager.createCodebasePrincipal(principal.URI, attrs); + return Services.scriptSecurityManager.principalWithOA(principal, attrs); } return principal; } diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index cc487e295a48..4b1894590817 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -494,6 +494,22 @@ void BasePrincipal::FinishInit(const nsACString& aOriginNoSuffix, mOriginNoSuffix = NS_Atomize(aOriginNoSuffix); } +void BasePrincipal::FinishInit(BasePrincipal* aOther, + const OriginAttributes& aOriginAttributes) { + mInitialized = true; + mOriginAttributes = aOriginAttributes; + + // First compute the origin suffix since it's infallible. + nsAutoCString originSuffix; + mOriginAttributes.CreateSuffix(originSuffix); + mOriginSuffix = NS_Atomize(originSuffix); + + mOriginNoSuffix = aOther->mOriginNoSuffix; + mHasExplicitDomain = aOther->mHasExplicitDomain; + mCSP = aOther->mCSP; + mPreloadCSP = aOther->mPreloadCSP; +} + bool SiteIdentifier::Equals(const SiteIdentifier& aOther) const { MOZ_ASSERT(IsInitialized()); MOZ_ASSERT(aOther.IsInitialized()); diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 4d05672c97cf..faba5c889be2 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -241,11 +241,13 @@ class BasePrincipal : public nsJSPrincipals { void SetHasExplicitDomain() { mHasExplicitDomain = true; } - // This function should be called as the last step of the initialization of - // the principal objects. It's typically called as the last step from the - // Init() method of the child classes. + // Either of these functions should be called as the last step of the + // initialization of the principal objects. It's typically called as the + // last step from the Init() method of the child classes. void FinishInit(const nsACString& aOriginNoSuffix, const OriginAttributes& aOriginAttributes); + void FinishInit(BasePrincipal* aOther, + const OriginAttributes& aOriginAttributes); nsCOMPtr mCSP; nsCOMPtr mPreloadCSP; diff --git a/caps/ContentPrincipal.cpp b/caps/ContentPrincipal.cpp index f2031ff5c88b..6c8d6767d100 100644 --- a/caps/ContentPrincipal.cpp +++ b/caps/ContentPrincipal.cpp @@ -81,6 +81,18 @@ nsresult ContentPrincipal::Init(nsIURI* aCodebase, return NS_OK; } +nsresult ContentPrincipal::Init(ContentPrincipal* aOther, + const OriginAttributes& aOriginAttributes) { + NS_ENSURE_ARG(aOther); + + mCodebase = aOther->mCodebase; + FinishInit(aOther, aOriginAttributes); + + mDomain = aOther->mDomain; + mAddon = aOther->mAddon; + return NS_OK; +} + nsresult ContentPrincipal::GetScriptLocation(nsACString& aStr) { return mCodebase->GetSpec(aStr); } diff --git a/caps/ContentPrincipal.h b/caps/ContentPrincipal.h index 732d48b4f193..2b9add92acb9 100644 --- a/caps/ContentPrincipal.h +++ b/caps/ContentPrincipal.h @@ -38,6 +38,8 @@ class ContentPrincipal final : public BasePrincipal { // Init() must be called before the principal is in a usable state. nsresult Init(nsIURI* aCodebase, const OriginAttributes& aOriginAttributes, const nsACString& aOriginNoSuffix); + nsresult Init(ContentPrincipal* aOther, + const OriginAttributes& aOriginAttributes); virtual nsresult GetScriptLocation(nsACString& aStr) override; diff --git a/caps/nsIScriptSecurityManager.idl b/caps/nsIScriptSecurityManager.idl index 9b707a54a783..116fcd782b15 100644 --- a/caps/nsIScriptSecurityManager.idl +++ b/caps/nsIScriptSecurityManager.idl @@ -154,6 +154,14 @@ interface nsIScriptSecurityManager : nsISupports nsIPrincipal getDocShellCodebasePrincipal(in nsIURI uri, in nsIDocShell docShell); + /** + * If this is a codebase principal, return a copy with different + * origin attributes. + */ + [implicit_jscontext] + nsIPrincipal principalWithOA(in nsIPrincipal principal, + in jsval originAttributes); + /** * Returns a principal whose origin is composed of |uri| and |originAttributes|. * See nsIPrincipal.idl for a description of origin attributes, and diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 13a68edee504..d8239f823c31 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -1257,6 +1257,35 @@ nsScriptSecurityManager::GetDocShellCodebasePrincipal( return *aPrincipal ? NS_OK : NS_ERROR_FAILURE; } +NS_IMETHODIMP +nsScriptSecurityManager::PrincipalWithOA( + nsIPrincipal* aPrincipal, JS::Handle aOriginAttributes, + JSContext* aCx, nsIPrincipal** aReturnPrincipal) { + if (!aPrincipal) { + return NS_OK; + } + if (aPrincipal->GetIsCodebasePrincipal()) { + OriginAttributes attrs; + if (!aOriginAttributes.isObject() || !attrs.Init(aCx, aOriginAttributes)) { + return NS_ERROR_INVALID_ARG; + } + RefPtr copy = new ContentPrincipal(); + ContentPrincipal* contentPrincipal = + static_cast(aPrincipal); + nsresult rv = copy->Init(contentPrincipal, attrs); + NS_ENSURE_SUCCESS(rv, rv); + copy.forget(aReturnPrincipal); + } else { + // We do this for null principals, system principals (both fine) + // ... and expanded principals, where we should probably do something + // cleverer, but I also don't think we care too much. + nsCOMPtr prin = aPrincipal; + prin.forget(aReturnPrincipal); + } + + return *aReturnPrincipal ? NS_OK : NS_ERROR_FAILURE; +} + NS_IMETHODIMP nsScriptSecurityManager::CanCreateWrapper(JSContext* cx, const nsIID& aIID, nsISupports* aObj, diff --git a/dom/security/test/csp/browser.ini b/dom/security/test/csp/browser.ini index 0846e87fe35f..9742d421d944 100644 --- a/dom/security/test/csp/browser.ini +++ b/dom/security/test/csp/browser.ini @@ -10,4 +10,7 @@ support-files = !/dom/security/test/csp/file_web_manifest_remote.html [browser_test_web_manifest.js] [browser_test_web_manifest_mixed_content.js] +[browser_test_uir_optional_clicks.js] +support-files = + file_csp_meta_uir.html [browser_manifest-src-override-default-src.js] diff --git a/dom/security/test/csp/browser_test_uir_optional_clicks.js b/dom/security/test/csp/browser_test_uir_optional_clicks.js new file mode 100644 index 000000000000..f29fc505d193 --- /dev/null +++ b/dom/security/test/csp/browser_test_uir_optional_clicks.js @@ -0,0 +1,14 @@ +"use strict" + +const TEST_PATH_HTTP = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://example.com"); +const TEST_PATH_HTTPS = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://example.com"); + +add_task(async function() { + await BrowserTestUtils.withNewTab(TEST_PATH_HTTPS + "file_csp_meta_uir.html", async function(browser) { + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, null, true); + BrowserTestUtils.synthesizeMouse("#mylink", 2, 2, {accelKey: true}, browser); + let tab = await newTabPromise; + is(tab.linkedBrowser.currentURI.scheme, "https", "Should have opened https page."); + BrowserTestUtils.removeTab(tab); + }); +}); diff --git a/dom/security/test/csp/file_csp_meta_uir.html b/dom/security/test/csp/file_csp_meta_uir.html new file mode 100644 index 000000000000..dba103097565 --- /dev/null +++ b/dom/security/test/csp/file_csp_meta_uir.html @@ -0,0 +1,13 @@ + + + + + Hello World + + + + + + From 7de2c5899ed03d92c553135a9c990013dfb5480f Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Tue, 8 Jan 2019 16:59:21 +0100 Subject: [PATCH 17/17] Bug 1515863, r=ckerschb Differential Revision: https://phabricator.services.mozilla.com/D15957 --HG-- extra : rebase_source : 748d4849050c3f2042f45f083cc7c99137963721 --- caps/BasePrincipal.cpp | 17 +++- docshell/test/browser/browser.ini | 2 + .../browser/browser_data_load_inherit_csp.js | 82 +++++++++++++++++++ .../browser/file_data_load_inherit_csp.html | 11 +++ dom/security/nsCSPContext.cpp | 16 ++++ dom/security/nsCSPContext.h | 4 + 6 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 docshell/test/browser/browser_data_load_inherit_csp.js create mode 100644 docshell/test/browser/file_data_load_inherit_csp.html diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index 4b1894590817..8a3a334acb1d 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -23,6 +23,7 @@ #include "mozilla/dom/BlobURLProtocolHandler.h" #include "mozilla/dom/ChromeUtils.h" #include "mozilla/dom/CSPDictionariesBinding.h" +#include "mozilla/dom/nsCSPContext.h" #include "mozilla/dom/ToJSValue.h" namespace mozilla { @@ -506,8 +507,20 @@ void BasePrincipal::FinishInit(BasePrincipal* aOther, mOriginNoSuffix = aOther->mOriginNoSuffix; mHasExplicitDomain = aOther->mHasExplicitDomain; - mCSP = aOther->mCSP; - mPreloadCSP = aOther->mPreloadCSP; + + if (aOther->mPreloadCSP) { + mPreloadCSP = do_CreateInstance("@mozilla.org/cspcontext;1"); + nsCSPContext* preloadCSP = static_cast(mPreloadCSP.get()); + preloadCSP->InitFromOther( + static_cast(aOther->mPreloadCSP.get()), nullptr, this); + } + + if (aOther->mCSP) { + mCSP = do_CreateInstance("@mozilla.org/cspcontext;1"); + nsCSPContext* csp = static_cast(mCSP.get()); + csp->InitFromOther(static_cast(aOther->mCSP.get()), nullptr, + this); + } } bool SiteIdentifier::Equals(const SiteIdentifier& aOther) const { diff --git a/docshell/test/browser/browser.ini b/docshell/test/browser/browser.ini index 3e0082e03c3e..5ea003836254 100644 --- a/docshell/test/browser/browser.ini +++ b/docshell/test/browser/browser.ini @@ -54,6 +54,7 @@ support-files = browser_timelineMarkers-frame-05.js head.js frame-head.js + file_data_load_inherit_csp.html file_click_link_within_view_source.html onload_message.html onpageshow_message.html @@ -92,6 +93,7 @@ skip-if = verify [browser_bug852909.js] skip-if = (verify && debug && (os == 'win')) [browser_bug92473.js] +[browser_data_load_inherit_csp.js] [browser_dataURI_unique_opaque_origin.js] [browser_uriFixupIntegration.js] [browser_uriFixupAlternateRedirects.js] diff --git a/docshell/test/browser/browser_data_load_inherit_csp.js b/docshell/test/browser/browser_data_load_inherit_csp.js new file mode 100644 index 000000000000..afa9e8c425a1 --- /dev/null +++ b/docshell/test/browser/browser_data_load_inherit_csp.js @@ -0,0 +1,82 @@ +"use strict"; + +const TEST_PATH = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://example.com"); +const HTML_URI = TEST_PATH + "file_data_load_inherit_csp.html"; +const DATA_URI = "data:text/html;html,foo"; + +function setDataHrefOnLink(aBrowser, aDataURI) { + return ContentTask.spawn(aBrowser, aDataURI, function(uri) { + let link = content.document.getElementById("testlink"); + link.href = uri; + }); +}; + +function verifyCSP(aTestName, aBrowser, aDataURI) { + return ContentTask.spawn(aBrowser, {aTestName, aDataURI}, async function ({aTestName, aDataURI}) { + let channel = content.docShell.currentDocumentChannel; + is(channel.URI.spec, aDataURI, "testing CSP for " + aTestName); + let principal = channel.loadInfo.triggeringPrincipal; + let cspJSON = principal.cspJSON; + let cspOBJ = JSON.parse(cspJSON); + let policies = cspOBJ["csp-policies"]; + is(policies.length, 1, "should be one policy"); + let policy = policies[0]; + is(policy['script-src'], "'unsafe-inline'", "script-src directive matches"); + }); +}; + +add_task(async function setup() { + // allow top level data: URI navigations, otherwise clicking data: link fails + await SpecialPowers.pushPrefEnv({ + "set": [["security.data_uri.block_toplevel_data_uri_navigations", false]], + }); +}); + +add_task(async function test_data_csp_inheritance_regular_click() { + await BrowserTestUtils.withNewTab(HTML_URI, async function(browser) { + let loadPromise = BrowserTestUtils.browserLoaded(browser, false, DATA_URI); + // set the data href + simulate click + await setDataHrefOnLink(gBrowser.selectedBrowser, DATA_URI); + BrowserTestUtils.synthesizeMouseAtCenter("#testlink", {}, + gBrowser.selectedBrowser); + await loadPromise; + await verifyCSP("click()", gBrowser.selectedBrowser, DATA_URI); + }); +}); + +add_task(async function test_data_csp_inheritance_ctrl_click() { + await BrowserTestUtils.withNewTab(HTML_URI, async function(browser) { + let loadPromise = BrowserTestUtils.waitForNewTab(gBrowser, DATA_URI); + // set the data href + simulate ctrl+click + await setDataHrefOnLink(gBrowser.selectedBrowser, DATA_URI); + BrowserTestUtils.synthesizeMouseAtCenter("#testlink", + { ctrlKey: true, metaKey: true }, + gBrowser.selectedBrowser); + let tab = await loadPromise; + gBrowser.selectTabAtIndex(2); + await verifyCSP("ctrl-click()", gBrowser.selectedBrowser, DATA_URI); + await BrowserTestUtils.removeTab(tab); + }); +}); + +add_task(async function test_data_csp_inheritance_right_click_open_link_in_new_tab() { + await BrowserTestUtils.withNewTab(HTML_URI, async function(browser) { + let loadPromise = BrowserTestUtils.waitForNewTab(gBrowser, DATA_URI); + // set the data href + simulate right-click open link in tab + await setDataHrefOnLink(gBrowser.selectedBrowser, DATA_URI); + BrowserTestUtils.waitForEvent(document, "popupshown", false, event => { + // These are operations that must be executed synchronously with the event. + document.getElementById("context-openlinkintab").doCommand(); + event.target.hidePopup(); + return true; + }); + BrowserTestUtils.synthesizeMouseAtCenter("#testlink", + { type: "contextmenu", button: 2 }, + gBrowser.selectedBrowser); + + let tab = await loadPromise; + gBrowser.selectTabAtIndex(2); + await verifyCSP("right-click-open-in-new-tab()", gBrowser.selectedBrowser, DATA_URI); + await BrowserTestUtils.removeTab(tab); + }); +}); diff --git a/docshell/test/browser/file_data_load_inherit_csp.html b/docshell/test/browser/file_data_load_inherit_csp.html new file mode 100644 index 000000000000..1efe738e4cee --- /dev/null +++ b/docshell/test/browser/file_data_load_inherit_csp.html @@ -0,0 +1,11 @@ + + + + + Bug 1358009 - Inherit CSP into data URI + + + + testlink + + diff --git a/dom/security/nsCSPContext.cpp b/dom/security/nsCSPContext.cpp index 595fc376df18..5ba531cb8566 100644 --- a/dom/security/nsCSPContext.cpp +++ b/dom/security/nsCSPContext.cpp @@ -261,6 +261,22 @@ nsCSPContext::~nsCSPContext() { } } +nsresult nsCSPContext::InitFromOther(nsCSPContext* aOtherContext, + Document* aDoc, nsIPrincipal* aPrincipal) { + NS_ENSURE_ARG(aOtherContext); + + nsresult rv = SetRequestContext(aDoc, aPrincipal); + NS_ENSURE_SUCCESS(rv, rv); + + for (auto policy : aOtherContext->mPolicies) { + nsAutoString policyStr; + policy->toString(policyStr); + AppendPolicy(policyStr, policy->getReportOnlyFlag(), + policy->getDeliveredViaMetaTagFlag()); + } + return NS_OK; +} + NS_IMETHODIMP nsCSPContext::GetPolicyString(uint32_t aIndex, nsAString& outStr) { outStr.Truncate(); diff --git a/dom/security/nsCSPContext.h b/dom/security/nsCSPContext.h index 15f5dbab94e9..b7ea829b21b6 100644 --- a/dom/security/nsCSPContext.h +++ b/dom/security/nsCSPContext.h @@ -51,6 +51,10 @@ class nsCSPContext : public nsIContentSecurityPolicy { public: nsCSPContext(); + nsresult InitFromOther(nsCSPContext* otherContext, + mozilla::dom::Document* aDoc, + nsIPrincipal* aPrincipal); + /** * SetRequestContext() needs to be called before the innerWindowID * is initialized on the document. Use this function to call back to