From b21732dac3026b5e0f85b685d5dd955dc4642333 Mon Sep 17 00:00:00 2001 From: Tom Tung Date: Thu, 25 Aug 2016 10:19:31 +0800 Subject: [PATCH 001/169] Bug 1298329 - Part 1: Implement persist/persisted in QuotaManager and expose them to QuotaManagerService; r=janv --- dom/indexedDB/ActorsParent.cpp | 2 + dom/quota/ActorsChild.cpp | 5 + dom/quota/ActorsParent.cpp | 562 +++++++++++++++++++++++---- dom/quota/PQuota.ipdl | 12 + dom/quota/PQuotaRequest.ipdl | 11 + dom/quota/QuotaManager.h | 22 +- dom/quota/QuotaManagerService.cpp | 106 +++-- dom/quota/nsIQuotaManagerService.idl | 18 + 8 files changed, 641 insertions(+), 97 deletions(-) diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp index 3aee7bcc5039..d30f58e8d456 100644 --- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -18796,10 +18796,12 @@ Maintenance::DirectoryWork() MOZ_ASSERT(origin.IsEmpty()); int64_t dummyTimeStamp; + bool dummyPersisted; nsCString dummySuffix; if (NS_WARN_IF(NS_FAILED( quotaManager->GetDirectoryMetadata2(originDir, &dummyTimeStamp, + &dummyPersisted, dummySuffix, group, origin)))) { diff --git a/dom/quota/ActorsChild.cpp b/dom/quota/ActorsChild.cpp index b22878967dde..ab900dc39e6e 100644 --- a/dom/quota/ActorsChild.cpp +++ b/dom/quota/ActorsChild.cpp @@ -272,6 +272,7 @@ QuotaRequestChild::Recv__delete__(const RequestResponse& aResponse) case RequestResponse::TClearDataResponse: case RequestResponse::TClearAllResponse: case RequestResponse::TResetAllResponse: + case RequestResponse::TPersistResponse: HandleResponse(); break; @@ -279,6 +280,10 @@ QuotaRequestChild::Recv__delete__(const RequestResponse& aResponse) HandleResponse(aResponse.get_InitOriginResponse().created()); break; + case RequestResponse::TPersistedResponse: + HandleResponse(aResponse.get_PersistedResponse().persisted()); + break; + default: MOZ_CRASH("Unknown response type!"); } diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 03cb5435b625..22a3559d39bb 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -1255,6 +1255,63 @@ private: GetResponse(RequestResponse& aResponse) override; }; +class PersistRequestBase + : public QuotaRequestBase +{ + const PrincipalInfo mPrincipalInfo; + +protected: + nsCString mSuffix; + nsCString mGroup; + +public: + bool + Init(Quota* aQuota) override; + +protected: + explicit PersistRequestBase(const PrincipalInfo& aPrincipalInfo); + +private: + nsresult + DoInitOnMainThread() override; +}; + +class PersistedOp final + : public PersistRequestBase +{ + bool mPersisted; + +public: + explicit PersistedOp(const RequestParams& aParams); + +private: + ~PersistedOp() + { } + + nsresult + DoDirectoryWork(QuotaManager* aQuotaManager) override; + + void + GetResponse(RequestResponse& aResponse) override; +}; + +class PersistOp final + : public PersistRequestBase +{ +public: + explicit PersistOp(const RequestParams& aParams); + +private: + ~PersistOp() + { } + + nsresult + DoDirectoryWork(QuotaManager* aQuotaManager) override; + + void + GetResponse(RequestResponse& aResponse) override; +}; + /******************************************************************************* * Helper Functions ******************************************************************************/ @@ -1852,6 +1909,52 @@ EnsureDirectory(nsIFile* aDirectory, bool* aCreated) return NS_OK; } +nsresult +EnsureOriginDirectory(nsIFile* aDirectory, bool* aCreated) +{ + AssertIsOnIOThread(); + + nsresult rv; + +#ifndef RELEASE_OR_BETA + bool exists; + rv = aDirectory->Exists(&exists); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!exists) { + nsString leafName; + nsresult rv = aDirectory->GetLeafName(leafName); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!leafName.EqualsLiteral(kChromeOrigin)) { + nsCString spec; + OriginAttributes attrs; + OriginParser::ResultType result = + OriginParser::ParseOrigin(NS_ConvertUTF16toUTF8(leafName), + spec, + &attrs); + if (NS_WARN_IF(result != OriginParser::ValidOrigin)) { + QM_WARNING("Preventing creation of a new origin directory which is not " + "supported by our origin parser or is obsolete!"); + + return NS_ERROR_FAILURE; + } + } + } +#endif + + rv = EnsureDirectory(aDirectory, aCreated); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + return NS_OK; +} + enum FileFlag { kTruncateFileFlag, kUpdateFileFlag, @@ -2077,6 +2180,7 @@ CreateDirectoryMetadata(nsIFile* aDirectory, int64_t aTimestamp, nsresult CreateDirectoryMetadata2(nsIFile* aDirectory, int64_t aTimestamp, + bool aPersisted, const nsACString& aSuffix, const nsACString& aGroup, const nsACString& aOrigin) @@ -2108,8 +2212,7 @@ CreateDirectoryMetadata2(nsIFile* aDirectory, return rv; } - // Reserved for navigator.persist() - rv = stream->WriteBoolean(false); + rv = stream->WriteBoolean(aPersisted); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -2168,6 +2271,43 @@ CreateDirectoryMetadata2(nsIFile* aDirectory, return NS_OK; } +nsresult +CreateDirectoryMetadataFiles(nsIFile* aDirectory, + bool aPersisted, + const nsACString& aSuffix, + const nsACString& aGroup, + const nsACString& aOrigin, + int64_t* aTimestamp) +{ + AssertIsOnIOThread(); + + int64_t timestamp = PR_Now(); + + nsresult rv = CreateDirectoryMetadata(aDirectory, + timestamp, + aSuffix, + aGroup, + aOrigin); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = CreateDirectoryMetadata2(aDirectory, + timestamp, + aPersisted, + aSuffix, + aGroup, + aOrigin); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (aTimestamp) { + *aTimestamp = timestamp; + } + return NS_OK; +} + nsresult GetBinaryInputStream(nsIFile* aDirectory, const nsAString& aFilename, @@ -3512,6 +3652,8 @@ QuotaManager::UpdateOriginAccessTime(PersistenceType aPersistenceType, void QuotaManager::RemoveQuota() { + AssertIsOnIOThread(); + MutexAutoLock lock(mQuotaMutex); for (auto iter = mGroupInfoPairs.Iter(); !iter.Done(); iter.Next()) { @@ -3637,6 +3779,40 @@ QuotaManager::GetQuotaObject(PersistenceType aPersistenceType, return GetQuotaObject(aPersistenceType, aGroup, aOrigin, file); } +Nullable +QuotaManager::OriginPersisted(const nsACString& aGroup, + const nsACString& aOrigin) +{ + AssertIsOnIOThread(); + + MutexAutoLock lock(mQuotaMutex); + + RefPtr originInfo = LockedGetOriginInfo(PERSISTENCE_TYPE_DEFAULT, + aGroup, + aOrigin); + if (originInfo) { + return Nullable(originInfo->LockedPersisted()); + } + + return Nullable(); +} + +void +QuotaManager::PersistOrigin(const nsACString& aGroup, + const nsACString& aOrigin) +{ + AssertIsOnIOThread(); + + MutexAutoLock lock(mQuotaMutex); + + RefPtr originInfo = LockedGetOriginInfo(PERSISTENCE_TYPE_DEFAULT, + aGroup, + aOrigin); + if (originInfo && !originInfo->LockedPersisted()) { + originInfo->LockedPersist(); + } +} + void QuotaManager::AbortOperationsForProcess(ContentParentId aContentParentId) { @@ -3691,6 +3867,7 @@ QuotaManager::RestoreDirectoryMetadata2(nsIFile* aDirectory, bool aPersistent) nsresult QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp, + bool* aPersisted, nsACString& aSuffix, nsACString& aGroup, nsACString& aOrigin) @@ -3698,6 +3875,7 @@ QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(aDirectory); MOZ_ASSERT(aTimestamp); + MOZ_ASSERT(aPersisted); MOZ_ASSERT(mStorageInitialized); nsCOMPtr binaryStream; @@ -3750,6 +3928,7 @@ QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, } *aTimestamp = timestamp; + *aPersisted = persisted; aSuffix = suffix; aGroup = group; aOrigin = origin; @@ -3760,12 +3939,14 @@ nsresult QuotaManager::GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, bool aPersistent, int64_t* aTimestamp, + bool* aPersisted, nsACString& aSuffix, nsACString& aGroup, nsACString& aOrigin) { nsresult rv = GetDirectoryMetadata2(aDirectory, aTimestamp, + aPersisted, aSuffix, aGroup, aOrigin); @@ -3777,6 +3958,7 @@ QuotaManager::GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, rv = GetDirectoryMetadata2(aDirectory, aTimestamp, + aPersisted, aSuffix, aGroup, aOrigin); @@ -3789,11 +3971,13 @@ QuotaManager::GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, } nsresult -QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp) +QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, + int64_t* aTimestamp, + bool* aPersisted) { AssertIsOnIOThread(); MOZ_ASSERT(aDirectory); - MOZ_ASSERT(aTimestamp); + MOZ_ASSERT(aTimestamp || aPersisted); MOZ_ASSERT(mStorageInitialized); nsCOMPtr binaryStream; @@ -3810,23 +3994,37 @@ QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp) return rv; } - *aTimestamp = timestamp; + bool persisted; + if (aPersisted) { + rv = binaryStream->ReadBoolean(&persisted); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + } + + if (aTimestamp) { + *aTimestamp = timestamp; + } + if (aPersisted) { + *aPersisted = persisted; + } return NS_OK; } nsresult QuotaManager::GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, bool aPersistent, - int64_t* aTimestamp) + int64_t* aTimestamp, + bool* aPersisted) { - nsresult rv = GetDirectoryMetadata2(aDirectory, aTimestamp); + nsresult rv = GetDirectoryMetadata2(aDirectory, aTimestamp, aPersisted); if (NS_WARN_IF(NS_FAILED(rv))) { rv = RestoreDirectoryMetadata2(aDirectory, aPersistent); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - rv = GetDirectoryMetadata2(aDirectory, aTimestamp); + rv = GetDirectoryMetadata2(aDirectory, aTimestamp, aPersisted); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -3899,12 +4097,14 @@ QuotaManager::InitializeRepository(PersistenceType aPersistenceType) } int64_t timestamp; + bool persisted; nsCString suffix; nsCString group; nsCString origin; rv = GetDirectoryMetadata2WithRestore(childDirectory, /* aPersistent */ false, ×tamp, + &persisted, suffix, group, origin); @@ -3912,8 +4112,8 @@ QuotaManager::InitializeRepository(PersistenceType aPersistenceType) return rv; } - rv = InitializeOrigin(aPersistenceType, group, origin, timestamp, - /* aPersisted */ false, childDirectory); + rv = InitializeOrigin(aPersistenceType, group, origin, timestamp, persisted, + childDirectory); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -4820,66 +5020,29 @@ QuotaManager::EnsureOriginIsInitializedInternal( CheckTemporaryStorageLimits(); } - int64_t timestamp; - -#ifndef RELEASE_OR_BETA - bool exists; - rv = directory->Exists(&exists); + bool created; + rv = EnsureOriginDirectory(directory, &created); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - if (!exists) { - nsString leafName; - nsresult rv = directory->GetLeafName(leafName); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - if (!leafName.EqualsLiteral(kChromeOrigin)) { - nsCString spec; - OriginAttributes attrs; - OriginParser::ResultType result = - OriginParser::ParseOrigin(NS_ConvertUTF16toUTF8(leafName), - spec, - &attrs); - if (NS_WARN_IF(result != OriginParser::ValidOrigin)) { - QM_WARNING("Preventing creation of a new origin directory which is not " - "supported by our origin parser or is obsolete!"); - - return NS_ERROR_FAILURE; - } - } - } -#endif - - bool created; - rv = EnsureDirectory(directory, &created); - NS_ENSURE_SUCCESS(rv, rv); - + int64_t timestamp; if (aPersistenceType == PERSISTENCE_TYPE_PERSISTENT) { if (created) { - timestamp = PR_Now(); - - rv = CreateDirectoryMetadata(directory, - timestamp, - aSuffix, - aGroup, - aOrigin); + rv = CreateDirectoryMetadataFiles(directory, + /* aPersisted */ true, + aSuffix, + aGroup, + aOrigin, + ×tamp); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - - rv = CreateDirectoryMetadata2(directory, - timestamp, - aSuffix, - aGroup, - aOrigin); - NS_ENSURE_SUCCESS(rv, rv); } else { rv = GetDirectoryMetadata2WithRestore(directory, /* aPersistent */ true, - ×tamp); + ×tamp, + /* aPersisted */ nullptr); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -4893,24 +5056,16 @@ QuotaManager::EnsureOriginIsInitializedInternal( mInitializedOrigins.AppendElement(aOrigin); } else if (created) { - timestamp = PR_Now(); - - rv = CreateDirectoryMetadata(directory, - timestamp, - aSuffix, - aGroup, - aOrigin); + rv = CreateDirectoryMetadataFiles(directory, + /* aPersisted */ false, + aSuffix, + aGroup, + aOrigin, + ×tamp); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - rv = CreateDirectoryMetadata2(directory, - timestamp, - aSuffix, - aGroup, - aOrigin); - NS_ENSURE_SUCCESS(rv, rv); - rv = InitializeOrigin(aPersistenceType, aGroup, aOrigin, timestamp, /* aPersisted */ false, directory); NS_ENSURE_SUCCESS(rv, rv); @@ -5228,6 +5383,25 @@ QuotaManager::LockedRemoveQuotaForOrigin(PersistenceType aPersistenceType, } } +already_AddRefed +QuotaManager::LockedGetOriginInfo(PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin) +{ + mQuotaMutex.AssertCurrentThreadOwns(); + MOZ_ASSERT(aPersistenceType != PERSISTENCE_TYPE_PERSISTENT); + + GroupInfoPair* pair; + if (mGroupInfoPairs.Get(aGroup, &pair)) { + RefPtr groupInfo = pair->LockedGetGroupInfo(aPersistenceType); + if (groupInfo) { + return groupInfo->LockedGetOriginInfo(aOrigin); + } + } + + return nullptr; +} + void QuotaManager::CheckTemporaryStorageLimits() { @@ -6135,6 +6309,14 @@ Quota::AllocPQuotaRequestParent(const RequestParams& aParams) actor = new ResetOrClearOp(/* aClear */ false); break; + case RequestParams::TPersistedParams: + actor = new PersistedOp(aParams); + break; + + case RequestParams::TPersistParams: + actor = new PersistOp(aParams); + break; + default: MOZ_CRASH("Should never get here!"); } @@ -6817,9 +6999,11 @@ ClearRequestBase::DeleteFiles(QuotaManager* aQuotaManager, nsCString suffix; nsCString group; nsCString origin; + bool persisted; rv = aQuotaManager->GetDirectoryMetadata2WithRestore(file, persistent, ×tamp, + &persisted, suffix, group, origin); @@ -6981,6 +7165,235 @@ ClearDataOp::GetResponse(RequestResponse& aResponse) aResponse = ClearDataResponse(); } +PersistRequestBase::PersistRequestBase(const PrincipalInfo& aPrincipalInfo) + : QuotaRequestBase(/* aExclusive */ false) + , mPrincipalInfo(aPrincipalInfo) +{ + AssertIsOnOwningThread(); +} + +bool +PersistRequestBase::Init(Quota* aQuota) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aQuota); + + if (NS_WARN_IF(!QuotaRequestBase::Init(aQuota))) { + return false; + } + + mPersistenceType.SetValue(PERSISTENCE_TYPE_DEFAULT); + + mNeedsMainThreadInit = true; + + return true; +} + +nsresult +PersistRequestBase::DoInitOnMainThread() +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(GetState() == State_Initializing); + MOZ_ASSERT(mNeedsMainThreadInit); + + nsresult rv; + nsCOMPtr principal = + PrincipalInfoToPrincipal(mPrincipalInfo, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + // Figure out which origin we're dealing with. + nsCString origin; + rv = QuotaManager::GetInfoFromPrincipal(principal, &mSuffix, &mGroup, + &origin); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + mOriginScope.SetFromOrigin(origin); + + return NS_OK; +} + +PersistedOp::PersistedOp(const RequestParams& aParams) + : PersistRequestBase(aParams.get_PersistedParams().principalInfo()) + , mPersisted(false) +{ + MOZ_ASSERT(aParams.type() == RequestParams::TPersistedParams); +} + +nsresult +PersistedOp::DoDirectoryWork(QuotaManager* aQuotaManager) +{ + AssertIsOnIOThread(); + MOZ_ASSERT(!mPersistenceType.IsNull()); + MOZ_ASSERT(mPersistenceType.Value() == PERSISTENCE_TYPE_DEFAULT); + MOZ_ASSERT(mOriginScope.IsOrigin()); + + PROFILER_LABEL("Quota", "PersistedOp::DoDirectoryWork", + js::ProfileEntry::Category::OTHER); + + Nullable persisted = + aQuotaManager->OriginPersisted(mGroup, mOriginScope.GetOrigin()); + + if (!persisted.IsNull()) { + mPersisted = persisted.Value(); + return NS_OK; + } + + // If we get here, it means the origin hasn't been initialized yet. + // Try to get the persisted flag from directory metadata on disk. + + nsCOMPtr directory; + nsresult rv = aQuotaManager->GetDirectoryForOrigin(mPersistenceType.Value(), + mOriginScope.GetOrigin(), + getter_AddRefs(directory)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + bool exists; + rv = directory->Exists(&exists); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (exists) { + // Get the persisted flag. + bool persisted; + rv = + aQuotaManager->GetDirectoryMetadata2WithRestore(directory, + /* aPersistent */ false, + /* aTimestamp */ nullptr, + &persisted); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + mPersisted = persisted; + } else { + // The directory has not been created yet. + mPersisted = false; + } + + return NS_OK; +} + +void +PersistedOp::GetResponse(RequestResponse& aResponse) +{ + AssertIsOnOwningThread(); + + PersistedResponse persistedResponse; + persistedResponse.persisted() = mPersisted; + + aResponse = persistedResponse; +} + +PersistOp::PersistOp(const RequestParams& aParams) + : PersistRequestBase(aParams.get_PersistParams().principalInfo()) +{ + MOZ_ASSERT(aParams.type() == RequestParams::TPersistParams); +} + +nsresult +PersistOp::DoDirectoryWork(QuotaManager* aQuotaManager) +{ + AssertIsOnIOThread(); + MOZ_ASSERT(!mPersistenceType.IsNull()); + MOZ_ASSERT(mPersistenceType.Value() == PERSISTENCE_TYPE_DEFAULT); + MOZ_ASSERT(mOriginScope.IsOrigin()); + + PROFILER_LABEL("Quota", "PersistOp::DoDirectoryWork", + js::ProfileEntry::Category::OTHER); + + // Update directory metadata on disk first. + nsCOMPtr directory; + nsresult rv = aQuotaManager->GetDirectoryForOrigin(mPersistenceType.Value(), + mOriginScope.GetOrigin(), + getter_AddRefs(directory)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + bool created; + rv = EnsureOriginDirectory(directory, &created); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (created) { + rv = CreateDirectoryMetadataFiles(directory, + /* aPersisted */ true, + mSuffix, + mGroup, + mOriginScope.GetOrigin(), + /* aTimestamp */ nullptr); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + } else { + // Get the persisted flag (restore the metadata file if necessary). + bool persisted; + rv = + aQuotaManager->GetDirectoryMetadata2WithRestore(directory, + /* aPersistent */ false, + /* aTimestamp */ nullptr, + &persisted); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!persisted) { + nsCOMPtr file; + nsresult rv = directory->Clone(getter_AddRefs(file)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = file->Append(NS_LITERAL_STRING(METADATA_V2_FILE_NAME)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + nsCOMPtr stream; + rv = GetBinaryOutputStream(file, kUpdateFileFlag, getter_AddRefs(stream)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + MOZ_ASSERT(stream); + + // Update origin access time while we are here. + rv = stream->Write64(PR_Now()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + // Set the persisted flag to true. + rv = stream->WriteBoolean(true); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + } + } + + // Directory metadata has been successfully created/updated, try to update + // OriginInfo too (it's ok if OriginInfo doesn't exist yet). + aQuotaManager->PersistOrigin(mGroup, mOriginScope.GetOrigin()); + + return NS_OK; +} + +void +PersistOp::GetResponse(RequestResponse& aResponse) +{ + AssertIsOnOwningThread(); + + aResponse = PersistResponse(); +} + nsresult StorageDirectoryHelper::GetDirectoryMetadata(nsIFile* aDirectory, int64_t& aTimestamp, @@ -8125,6 +8538,7 @@ UpgradeStorageFrom0_0To1_0Helper::ProcessOriginDirectory( rv = CreateDirectoryMetadata2(aOriginProps.mDirectory, aOriginProps.mTimestamp, + /* aPersisted */ false, aOriginProps.mSuffix, aOriginProps.mGroup, aOriginProps.mOrigin); @@ -8407,6 +8821,7 @@ UpgradeStorageFrom1_0To2_0Helper::MaybeStripObsoleteOriginAttributes( rv = CreateDirectoryMetadata2(aOriginProps.mDirectory, aOriginProps.mTimestamp, + /* aPersisted */ false, aOriginProps.mSuffix, aOriginProps.mGroup, aOriginProps.mOrigin); @@ -8478,6 +8893,7 @@ UpgradeStorageFrom1_0To2_0Helper::ProcessOriginDirectory( if (aOriginProps.mNeedsRestore2) { rv = CreateDirectoryMetadata2(aOriginProps.mDirectory, aOriginProps.mTimestamp, + /* aPersisted */ false, aOriginProps.mSuffix, aOriginProps.mGroup, aOriginProps.mOrigin); @@ -8520,8 +8936,10 @@ RestoreDirectoryMetadata2Helper::ProcessOriginDirectory( { AssertIsOnIOThread(); + // We don't have any approach to restore aPersisted, so reset it to false. nsresult rv = CreateDirectoryMetadata2(aOriginProps.mDirectory, aOriginProps.mTimestamp, + /* aPersisted */ false, aOriginProps.mSuffix, aOriginProps.mGroup, aOriginProps.mOrigin); diff --git a/dom/quota/PQuota.ipdl b/dom/quota/PQuota.ipdl index 0574f4b039b7..88333e5bee6b 100644 --- a/dom/quota/PQuota.ipdl +++ b/dom/quota/PQuota.ipdl @@ -59,6 +59,16 @@ struct ResetAllParams { }; +struct PersistedParams +{ + PrincipalInfo principalInfo; +}; + +struct PersistParams +{ + PrincipalInfo principalInfo; +}; + union RequestParams { InitParams; @@ -67,6 +77,8 @@ union RequestParams ClearDataParams; ClearAllParams; ResetAllParams; + PersistedParams; + PersistParams; }; protocol PQuota diff --git a/dom/quota/PQuotaRequest.ipdl b/dom/quota/PQuotaRequest.ipdl index d560fe184cc1..4b162a559992 100644 --- a/dom/quota/PQuotaRequest.ipdl +++ b/dom/quota/PQuotaRequest.ipdl @@ -33,6 +33,15 @@ struct ResetAllResponse { }; +struct PersistedResponse +{ + bool persisted; +}; + +struct PersistResponse +{ +}; + union RequestResponse { nsresult; @@ -42,6 +51,8 @@ union RequestResponse ClearDataResponse; ClearAllResponse; ResetAllResponse; + PersistedResponse; + PersistResponse; }; protocol PQuotaRequest diff --git a/dom/quota/QuotaManager.h b/dom/quota/QuotaManager.h index 8984a23c8453..176ec5c3fe33 100644 --- a/dom/quota/QuotaManager.h +++ b/dom/quota/QuotaManager.h @@ -185,6 +185,14 @@ public: const nsACString& aOrigin, const nsAString& aPath); + Nullable + OriginPersisted(const nsACString& aGroup, + const nsACString& aOrigin); + + void + PersistOrigin(const nsACString& aGroup, + const nsACString& aOrigin); + // Called when a process is being shot down. Aborts any running operations // for the given process. void @@ -201,6 +209,7 @@ public: nsresult GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp, + bool* aPersisted, nsACString& aSuffix, nsACString& aGroup, nsACString& aOrigin); @@ -209,17 +218,21 @@ public: GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, bool aPersistent, int64_t* aTimestamp, + bool* aPersisted, nsACString& aSuffix, nsACString& aGroup, nsACString& aOrigin); nsresult - GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp); + GetDirectoryMetadata2(nsIFile* aDirectory, + int64_t* aTimestamp, + bool* aPersisted); nsresult GetDirectoryMetadata2WithRestore(nsIFile* aDirectory, bool aPersistent, - int64_t* aTimestamp); + int64_t* aTimestamp, + bool* aPersisted); // This is the main entry point into the QuotaManager API. // Any storage API implementation (quota client) that participates in @@ -438,6 +451,11 @@ private: const nsACString& aGroup, const nsACString& aOrigin); + already_AddRefed + LockedGetOriginInfo(PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin); + nsresult MaybeUpgradeIndexedDBDirectory(); diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index c71970c15882..659d87a9e102 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -60,6 +60,25 @@ TestingPrefChangedCallback(const char* aPrefName, gTestingMode = Preferences::GetBool(aPrefName); } +nsresult +CheckedPrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, + PrincipalInfo& aPrincipalInfo) +{ + MOZ_ASSERT(aPrincipal); + + nsresult rv = PrincipalToPrincipalInfo(aPrincipal, &aPrincipalInfo); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (aPrincipalInfo.type() != PrincipalInfo::TContentPrincipalInfo && + aPrincipalInfo.type() != PrincipalInfo::TSystemPrincipalInfo) { + return NS_ERROR_UNEXPECTED; + } + + return NS_OK; +} + class AbortOperationsRunnable final : public Runnable { @@ -540,18 +559,12 @@ QuotaManagerService::InitStoragesForPrincipal( InitOriginParams params; - PrincipalInfo& principalInfo = params.principalInfo(); - - nsresult rv = PrincipalToPrincipalInfo(aPrincipal, &principalInfo); + nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, + params.principalInfo()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - if (principalInfo.type() != PrincipalInfo::TContentPrincipalInfo && - principalInfo.type() != PrincipalInfo::TSystemPrincipalInfo) { - return NS_ERROR_UNEXPECTED; - } - Nullable persistenceType; rv = NullablePersistenceTypeFromText(aPersistenceType, &persistenceType); if (NS_WARN_IF(NS_FAILED(rv)) || persistenceType.IsNull()) { @@ -585,17 +598,12 @@ QuotaManagerService::GetUsageForPrincipal(nsIPrincipal* aPrincipal, UsageParams params; - PrincipalInfo& principalInfo = params.principalInfo(); - nsresult rv = PrincipalToPrincipalInfo(aPrincipal, &principalInfo); + nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, + params.principalInfo()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - if (principalInfo.type() != PrincipalInfo::TContentPrincipalInfo && - principalInfo.type() != PrincipalInfo::TSystemPrincipalInfo) { - return NS_ERROR_UNEXPECTED; - } - params.getGroupUsage() = aGetGroupUsage; nsAutoPtr info(new UsageRequestInfo(request, params)); @@ -655,18 +663,12 @@ QuotaManagerService::ClearStoragesForPrincipal(nsIPrincipal* aPrincipal, ClearOriginParams params; - PrincipalInfo& principalInfo = params.principalInfo(); - - nsresult rv = PrincipalToPrincipalInfo(aPrincipal, &principalInfo); + nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, + params.principalInfo()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - if (principalInfo.type() != PrincipalInfo::TContentPrincipalInfo && - principalInfo.type() != PrincipalInfo::TSystemPrincipalInfo) { - return NS_ERROR_UNEXPECTED; - } - Nullable persistenceType; rv = NullablePersistenceTypeFromText(aPersistenceType, &persistenceType); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -717,6 +719,64 @@ QuotaManagerService::Reset(nsIQuotaRequest** _retval) return NS_OK; } +NS_IMETHODIMP +QuotaManagerService::Persisted(nsIPrincipal* aPrincipal, + nsIQuotaRequest** _retval) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aPrincipal); + MOZ_ASSERT(_retval); + + RefPtr request = new Request(aPrincipal); + + PersistedParams params; + + nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, + params.principalInfo()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + nsAutoPtr info(new RequestInfo(request, params)); + + rv = InitiateRequest(info); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + request.forget(_retval); + return NS_OK; +} + +NS_IMETHODIMP +QuotaManagerService::Persist(nsIPrincipal* aPrincipal, + nsIQuotaRequest** _retval) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aPrincipal); + MOZ_ASSERT(_retval); + + RefPtr request = new Request(aPrincipal); + + PersistParams params; + + nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, + params.principalInfo()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + nsAutoPtr info(new RequestInfo(request, params)); + + rv = InitiateRequest(info); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + request.forget(_retval); + return NS_OK; +} + NS_IMETHODIMP QuotaManagerService::Observe(nsISupports* aSubject, const char* aTopic, diff --git a/dom/quota/nsIQuotaManagerService.idl b/dom/quota/nsIQuotaManagerService.idl index b529d345567c..99a44476c6ec 100644 --- a/dom/quota/nsIQuotaManagerService.idl +++ b/dom/quota/nsIQuotaManagerService.idl @@ -100,4 +100,22 @@ interface nsIQuotaManagerService : nsISupports */ [must_use] nsIQuotaRequest reset(); + + /** + * Check if given origin is persisted. + * + * @param aPrincipal + * A principal for the origin which we want to check. + */ + [must_use] nsIQuotaRequest + persisted(in nsIPrincipal aPrincipal); + + /** + * Persist given origin. + * + * @param aPrincipal + * A principal for the origin which we want to persist. + */ + [must_use] nsIQuotaRequest + persist(in nsIPrincipal aPrincipal); }; From 1f030ffe5676f756d0b1ddd3040787ffd59bce97 Mon Sep 17 00:00:00 2001 From: Tom Tung Date: Mon, 20 Mar 2017 14:55:12 +0800 Subject: [PATCH 002/169] Bug 1298329 - Part 2: Add a test to verify persist()/persisted(); r=janv --- dom/quota/test/unit/head.js | 24 +++++ dom/quota/test/unit/test_persist.js | 150 ++++++++++++++++++++++++++++ dom/quota/test/unit/xpcshell.ini | 1 + 3 files changed, 175 insertions(+) create mode 100644 dom/quota/test/unit/test_persist.js diff --git a/dom/quota/test/unit/head.js b/dom/quota/test/unit/head.js index 72114d4d6245..e3606c47dece 100644 --- a/dom/quota/test/unit/head.js +++ b/dom/quota/test/unit/head.js @@ -6,6 +6,7 @@ const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; const NS_OK = Cr.NS_OK; +const NS_ERROR_FAILURE = Cr.NS_ERROR_FAILURE; const NS_ERROR_UNEXPECTED = Cr.NS_ERROR_UNEXPECTED; function is(a, b, msg) @@ -146,6 +147,20 @@ function reset(callback) return request; } +function persist(principal, callback) { + let request = SpecialPowers._getQuotaManager().persist(principal); + request.callback = callback; + + return request; +} + +function persisted(principal, callback) { + let request = SpecialPowers._getQuotaManager().persisted(principal); + request.callback = callback; + + return request; +} + function installPackage(packageName) { let directoryService = Cc["@mozilla.org/file/directory_service;1"] @@ -237,6 +252,15 @@ function compareBuffers(buffer1, buffer2) return true; } +function getPersistedFromMetadata(readBuffer) +{ + const persistedPosition = 8; // Persisted state is stored in the 9th byte + let view = + readBuffer instanceof Uint8Array ? readBuffer : new Uint8Array(readBuffer); + + return !!view[persistedPosition]; +} + function grabUsageAndContinueHandler(request) { testGenerator.next(request.usage); diff --git a/dom/quota/test/unit/test_persist.js b/dom/quota/test/unit/test_persist.js new file mode 100644 index 000000000000..c2943930677d --- /dev/null +++ b/dom/quota/test/unit/test_persist.js @@ -0,0 +1,150 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function* testSteps() +{ + const origins = [ + { + url: "http://default.test.persist", + path: "storage/default/http+++default.test.persist", + persistence: "default" + }, + + { + url: "ftp://ftp.invalid.origin", + path: "storage/default/ftp+++ftp.invalid.origin", + persistence: "default" + }, + ]; + + const metadataFileName = ".metadata-v2"; + + let principal = getPrincipal(origins[0].url); + + info("Persisting an uninitialized origin"); + + // Origin directory doesn't exist yet, so only check the result for + // persisted(). + let request = persisted(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persisted() succeeded"); + ok(!request.result, "The origin is not persisted"); + + info("Verifying persist() does update the metadata"); + + request = persist(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persist() succeeded"); + + let originDir = getRelativeFile(origins[0].path); + let exists = originDir.exists(); + ok(exists, "Origin directory does exist"); + + info("Reading out contents of metadata file"); + + let metadataFile = originDir.clone(); + metadataFile.append(metadataFileName); + + File.createFromNsIFile(metadataFile).then(grabArgAndContinueHandler); + let file = yield undefined; + + let fileReader = new FileReader(); + fileReader.onload = continueToNextStepSync; + fileReader.readAsArrayBuffer(file); + yield undefined; + + let originPersisted = getPersistedFromMetadata(fileReader.result); + ok(originPersisted, "The origin is persisted"); + + info("Verifying persisted()"); + + request = persisted(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persisted() succeeded"); + ok(request.result === originPersisted, "Persisted() concurs with metadata"); + + info("Clearing the origin"); + + // Clear the origin since we'll test the same directory again under different + // circumstances. + clearOrigin(principal, origins[0].persistence, continueToNextStepSync); + yield undefined; + + info("Persisting an already initialized origin"); + + initOrigin(principal, origins[0].persistence, continueToNextStepSync); + yield undefined; + + info("Reading out contents of metadata file"); + + fileReader = new FileReader(); + fileReader.onload = continueToNextStepSync; + fileReader.readAsArrayBuffer(file); + yield undefined; + + originPersisted = getPersistedFromMetadata(fileReader.result); + ok(!originPersisted, "The origin isn't persisted after clearing"); + + info("Verifying persisted()"); + + request = persisted(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persisted() succeeded"); + ok(request.result === originPersisted, "Persisted() concurs with metadata"); + + info("Verifying persist() does update the metadata"); + + request = persist(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persist() succeeded"); + + info("Reading out contents of metadata file"); + + fileReader = new FileReader(); + fileReader.onload = continueToNextStepSync; + fileReader.readAsArrayBuffer(file); + yield undefined; + + originPersisted = getPersistedFromMetadata(fileReader.result); + ok(originPersisted, "The origin is persisted"); + + info("Verifying persisted()"); + + request = persisted(principal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persisted() succeeded"); + ok(request.result === originPersisted, "Persisted() concurs with metadata"); + + info("Persisting an invalid origin"); + + let invalidPrincipal = getPrincipal(origins[1].url); + + request = persist(invalidPrincipal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_ERROR_FAILURE, + "Persist() failed because of the invalid origin"); + + originDir = getRelativeFile(origins[1].path); + exists = originDir.exists(); + ok(!exists, "Directory for invalid origin doesn't exist"); + + request = persisted(invalidPrincipal, continueToNextStepSync); + yield undefined; + + ok(request.resultCode === NS_OK, "Persisted() succeeded"); + ok(!request.result, + "The origin isn't persisted since the operation failed"); + + finishTest(); +} diff --git a/dom/quota/test/unit/xpcshell.ini b/dom/quota/test/unit/xpcshell.ini index c75bcc596282..1ad1b8ff0edb 100644 --- a/dom/quota/test/unit/xpcshell.ini +++ b/dom/quota/test/unit/xpcshell.ini @@ -22,6 +22,7 @@ support-files = [test_morgueCleanup.js] [test_obsoleteOriginAttributesUpgrade.js] [test_originAttributesUpgrade.js] +[test_persist.js] [test_removeAppsUpgrade.js] [test_storagePersistentUpgrade.js] [test_tempMetadataCleanup.js] From f1fe2e00d1ca5472377f75773a175811c2a0cd34 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Mon, 20 Mar 2017 09:44:02 +0000 Subject: [PATCH 003/169] Bug 1348596 - Back out incorrectly-landed (and unreviewed) change to ContinueTextRunAcrossFrames that was mistakenly pushed. r=dbaron --- layout/generic/nsTextFrame.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index cf08c3ee4516..aad044f0edbd 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -1785,23 +1785,6 @@ GetSpacingFlags(nsIFrame* aFrame, const nsStyleText* aStyleText = nullptr) return nonStandardSpacing ? gfxTextRunFactory::TEXT_ENABLE_SPACING : 0; } -static bool -IsBaselineAligned(const nsStyleCoord& aCoord) -{ - switch (aCoord.GetUnit()) { - case eStyleUnit_Enumerated: - return aCoord.GetIntValue() == NS_STYLE_VERTICAL_ALIGN_BASELINE; - case eStyleUnit_Coord: - return aCoord.GetCoordValue() == 0; - case eStyleUnit_Percent: - return aCoord.GetPercentValue() == 0; - case eStyleUnit_Calc: - return aCoord.GetCalcValue()->IsDefinitelyZero(); - default: - return false; - } -} - bool BuildTextRunsScanner::ContinueTextRunAcrossFrames(nsTextFrame* aFrame1, nsTextFrame* aFrame2) { @@ -1831,10 +1814,6 @@ BuildTextRunsScanner::ContinueTextRunAcrossFrames(nsTextFrame* aFrame1, nsTextFr if (textStyle1->NewlineIsSignificant(aFrame1) && HasTerminalNewline(aFrame1)) return false; - if (!IsBaselineAligned(sc1->StyleDisplay()->mVerticalAlign)) { - return false; - } - if (aFrame1->GetContent() == aFrame2->GetContent() && aFrame1->GetNextInFlow() != aFrame2) { // aFrame2 must be a non-fluid continuation of aFrame1. This can happen @@ -1851,10 +1830,6 @@ BuildTextRunsScanner::ContinueTextRunAcrossFrames(nsTextFrame* aFrame1, nsTextFr if (sc1 == sc2) return true; - if (!IsBaselineAligned(sc1->StyleDisplay()->mVerticalAlign)) { - return false; - } - const nsStyleFont* fontStyle1 = sc1->StyleFont(); const nsStyleFont* fontStyle2 = sc2->StyleFont(); nscoord letterSpacing1 = LetterSpacing(aFrame1); From de9d1c9ddee7969409db001bc0729b20093e6716 Mon Sep 17 00:00:00 2001 From: Joel Maher Date: Mon, 20 Mar 2017 05:51:09 -0400 Subject: [PATCH 004/169] Bug 1318389 - Intermittent browser/modules/test/browser_CaptivePortalWatcher.js, requestLongerTimeout. This test does a lot of window and tab manipulation causing it to take a long time on debug. r=nhnt11 MozReview-Commit-ID: E8tfNzQfO96 --- .../test/captivePortal/browser_CaptivePortalWatcher.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js b/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js index e9c0fad6dad0..77c4799c7623 100644 --- a/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js +++ b/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js @@ -1,5 +1,9 @@ "use strict"; +// Bug 1318389 - This test does a lot of window and tab manipulation, +// causing it to take a long time on debug. +requestLongerTimeout(2); + add_task(setupPrefsAndRecentWindowBehavior); // Each of the test cases below is run twice: once for login-success and once From 82b94e513535433b952d6a9d8f4f18124fecc94e Mon Sep 17 00:00:00 2001 From: Joel Maher Date: Mon, 20 Mar 2017 06:45:23 -0400 Subject: [PATCH 005/169] Bug 1318389 - fix eslint issue. a=me --- .../content/test/captivePortal/browser_CaptivePortalWatcher.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js b/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js index 77c4799c7623..c37f3cb8d254 100644 --- a/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js +++ b/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js @@ -1,6 +1,6 @@ "use strict"; -// Bug 1318389 - This test does a lot of window and tab manipulation, +// Bug 1318389 - This test does a lot of window and tab manipulation, // causing it to take a long time on debug. requestLongerTimeout(2); From 1a2aee5585bf164a6b440caea1159cc29f236a55 Mon Sep 17 00:00:00 2001 From: "Dragana Damjanovic dd.mozilla@gmail.com" Date: Sun, 19 Mar 2017 09:38:00 +0100 Subject: [PATCH 006/169] Bug 1348675 - Remove the separate prefs for the pipelining on the android version of firefox. r=mcmanus --- mobile/android/app/mobile.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js index e59ebeaaa027..d78f3501a8b5 100644 --- a/mobile/android/app/mobile.js +++ b/mobile/android/app/mobile.js @@ -99,10 +99,6 @@ pref("network.protocol-handler.warn-external.mailto", false); pref("network.protocol-handler.warn-external.vnd.youtube", false); /* http prefs */ -pref("network.http.pipelining", true); -pref("network.http.pipelining.ssl", true); -pref("network.http.proxy.pipelining", true); -pref("network.http.pipelining.maxrequests" , 6); pref("network.http.keep-alive.timeout", 109); pref("network.http.max-connections", 20); pref("network.http.max-persistent-connections-per-server", 6); From 9e03cc7af8bac094359cd5355268034fe2f24774 Mon Sep 17 00:00:00 2001 From: Stone Shih Date: Fri, 3 Mar 2017 16:52:56 +0800 Subject: [PATCH 007/169] Bug 1296492 Part1: Refine PE mochitest helpers to ignore the checks of synthesized pointer id. r=smaug MozReview-Commit-ID: 5blUsJMnDfg --- .../pointerevents/mochitest_support_external.js | 3 ++- .../pointerevents/mochitest_support_internal.js | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dom/events/test/pointerevents/mochitest_support_external.js b/dom/events/test/pointerevents/mochitest_support_external.js index 9aa61627f07d..4d97f2443c84 100644 --- a/dom/events/test/pointerevents/mochitest_support_external.js +++ b/dom/events/test/pointerevents/mochitest_support_external.js @@ -203,7 +203,7 @@ function sendTouchEvent(int_win, elemId, touchEventType, params) { } // Helper function to run Point Event test in a new tab. -function runTestInNewWindow(aFile) { +function runTestInNewWindow(aFile, aSuppressPointerIdCheck = false) { var testURL = location.href.substring(0, location.href.lastIndexOf('/') + 1) + aFile; var testWindow = window.open(testURL, "_blank"); var testDone = false; @@ -212,6 +212,7 @@ function runTestInNewWindow(aFile) { // to the test case after DOM elements are constructed and before the load // event is fired. testWindow.addEventListener("DOMContentLoaded", function() { + testWindow.suppressPointerIdCheck = aSuppressPointerIdCheck; var e = testWindow.document.createElement('script'); e.type = 'text/javascript'; e.src = "mochitest_support_internal.js"; diff --git a/dom/events/test/pointerevents/mochitest_support_internal.js b/dom/events/test/pointerevents/mochitest_support_internal.js index 733649d99b37..e91b1794d5df 100644 --- a/dom/events/test/pointerevents/mochitest_support_internal.js +++ b/dom/events/test/pointerevents/mochitest_support_internal.js @@ -69,12 +69,13 @@ function addListeners(elem) { }[event.pointerType]; // Compare the pointerId. - resultCallback({ - name: "Mismatched event.pointerId recieved.", - status: event.pointerId, - PASS: pointerId - }); - + if (!suppressPointerIdCheck) { + resultCallback({ + name: "Mismatched event.pointerId recieved.", + status: event.pointerId, + PASS: pointerId + }); + } }); }); } From 44253bfcb02478fae1f6baadc2a61a823b44cd9d Mon Sep 17 00:00:00 2001 From: Stone Shih Date: Mon, 23 Jan 2017 18:58:59 +0800 Subject: [PATCH 008/169] Bug 1296492 Part2: Synthesize native touch events to trigger pointerevent_multiple_primary_pointers_boundary_events-manual.html. r=smaug MozReview-Commit-ID: JZSzh7pHd8T --- dom/events/test/pointerevents/mochitest.ini | 6 ++- ...imary_pointers_boundary_events-manual.html | 40 ++++++++++++++++--- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/dom/events/test/pointerevents/mochitest.ini b/dom/events/test/pointerevents/mochitest.ini index d6b7416d1569..63d13d542059 100644 --- a/dom/events/test/pointerevents/mochitest.ini +++ b/dom/events/test/pointerevents/mochitest.ini @@ -34,8 +34,10 @@ support-files = [test_pointerevent_lostpointercapture_is_first-manual.html] support-files = pointerevent_lostpointercapture_is_first-manual.html [test_pointerevent_multiple_primary_pointers_boundary_events-manual.html] - support-files = pointerevent_multiple_primary_pointers_boundary_events-manual.html - disabled = should be investigated + support-files = + pointerevent_multiple_primary_pointers_boundary_events-manual.html + ../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js + ../../../../gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js [test_pointerevent_pointercancel_touch-manual.html] support-files = pointerevent_pointercancel_touch-manual.html [test_pointerevent_pointerenter_does_not_bubble-manual.html] diff --git a/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html b/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html index 59506d0fb6bf..78a495a34769 100644 --- a/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html +++ b/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html @@ -10,19 +10,47 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1000870 + + From 9ebde3021572b9951e5cdc92f08b3d84e98f96f4 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 20 Mar 2017 00:28:46 -0700 Subject: [PATCH 009/169] servo: Merge #16016 - Add separate specified value for keyword font sizes (from Manishearth:graft-font-size); r=upsuper In Gecko, these keywords compute to different values depending on the font. See https://bugzilla.mozilla.org/show_bug.cgi?id=1341775 Source-Repo: https://github.com/servo/servo Source-Revision: 50fd39f068fe5a4a018bb4e7a602f50f10590524 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : bce6512a67ff1bb441554ece8b0e3cf9db07e80e --- servo/components/script/dom/element.rs | 5 +- .../components/script/dom/htmlfontelement.rs | 30 ++-- .../style/properties/longhand/font.mako.rs | 163 +++++++++++++++--- .../style/values/specified/length.rs | 42 ----- servo/ports/geckolib/glue.rs | 4 +- 5 files changed, 162 insertions(+), 82 deletions(-) diff --git a/servo/components/script/dom/element.rs b/servo/components/script/dom/element.rs index 3a73bbce97ed..f9e23bd50e08 100644 --- a/servo/components/script/dom/element.rs +++ b/servo/components/script/dom/element.rs @@ -478,7 +478,10 @@ impl LayoutElementHelpers for LayoutJS { if let Some(font_size) = font_size { hints.push(from_declaration( shared_lock, - PropertyDeclaration::FontSize(font_size::SpecifiedValue(font_size.into())))) + PropertyDeclaration::FontSize( + font_size::SpecifiedValue::from_html_size(font_size as u8) + ) + )) } let cellspacing = if let Some(this) = self.downcast::() { diff --git a/servo/components/script/dom/htmlfontelement.rs b/servo/components/script/dom/htmlfontelement.rs index 8644544cdfe5..4e6b96a9c7e7 100644 --- a/servo/components/script/dom/htmlfontelement.rs +++ b/servo/components/script/dom/htmlfontelement.rs @@ -18,7 +18,6 @@ use html5ever_atoms::LocalName; use servo_atoms::Atom; use style::attr::AttrValue; use style::str::{HTML_SPACE_CHARACTERS, read_numbers}; -use style::values::specified; #[dom_struct] pub struct HTMLFontElement { @@ -62,8 +61,7 @@ impl HTMLFontElementMethods for HTMLFontElement { // https://html.spec.whatwg.org/multipage/#dom-font-size fn SetSize(&self, value: DOMString) { let element = self.upcast::(); - let length = parse_length(&value); - element.set_attribute(&local_name!("size"), AttrValue::Length(value.into(), length)); + element.set_attribute(&local_name!("size"), parse_size(&value)); } } @@ -76,10 +74,7 @@ impl VirtualMethods for HTMLFontElement { match name { &local_name!("face") => AttrValue::from_atomic(value.into()), &local_name!("color") => AttrValue::from_legacy_color(value.into()), - &local_name!("size") => { - let length = parse_length(&value); - AttrValue::Length(value.into(), length) - }, + &local_name!("size") => parse_size(&value), _ => self.super_type().unwrap().parse_plain_attribute(name, value), } } @@ -88,7 +83,7 @@ impl VirtualMethods for HTMLFontElement { pub trait HTMLFontElementLayoutHelpers { fn get_color(&self) -> Option; fn get_face(&self) -> Option; - fn get_size(&self) -> Option; + fn get_size(&self) -> Option; } impl HTMLFontElementLayoutHelpers for LayoutJS { @@ -113,18 +108,21 @@ impl HTMLFontElementLayoutHelpers for LayoutJS { } #[allow(unsafe_code)] - fn get_size(&self) -> Option { - unsafe { + fn get_size(&self) -> Option { + let size = unsafe { (*self.upcast::().unsafe_get()) .get_attr_for_layout(&ns!(), &local_name!("size")) - .and_then(AttrValue::as_length) - .cloned() + }; + match size { + Some(&AttrValue::UInt(_, s)) => Some(s), + _ => None, } } } /// https://html.spec.whatwg.org/multipage/#rules-for-parsing-a-legacy-font-size -fn parse_length(mut input: &str) -> Option { +fn parse_size(mut input: &str) -> AttrValue { + let original_input = input; // Steps 1 & 2 are not relevant // Step 3 @@ -138,7 +136,7 @@ fn parse_length(mut input: &str) -> Option { let mut input_chars = input.chars().peekable(); let parse_mode = match input_chars.peek() { // Step 4 - None => return None, + None => return AttrValue::String(original_input.into()), // Step 5 Some(&'+') => { @@ -155,7 +153,7 @@ fn parse_length(mut input: &str) -> Option { // Steps 6, 7, 8 let mut value = match read_numbers(input_chars) { (Some(v), _) if v >= 0 => v, - _ => return None, + _ => return AttrValue::String(original_input.into()), }; // Step 9 @@ -166,5 +164,5 @@ fn parse_length(mut input: &str) -> Option { } // Steps 10, 11, 12 - Some(specified::Length::from_font_size_int(value as u8)) + AttrValue::UInt(original_input.into(), value as u32) } diff --git a/servo/components/style/properties/longhand/font.mako.rs b/servo/components/style/properties/longhand/font.mako.rs index a62da4290650..49b3557c8cb1 100644 --- a/servo/components/style/properties/longhand/font.mako.rs +++ b/servo/components/style/properties/longhand/font.mako.rs @@ -400,24 +400,129 @@ ${helpers.single_keyword("font-variant-caps", impl ToCss for SpecifiedValue { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - self.0.to_css(dest) + match *self { + SpecifiedValue::Length(ref lop) => lop.to_css(dest), + SpecifiedValue::Keyword(kw) => kw.to_css(dest), + SpecifiedValue::Smaller => dest.write_str("smaller"), + SpecifiedValue::Larger => dest.write_str("larger"), + } } } impl HasViewportPercentage for SpecifiedValue { fn has_viewport_percentage(&self) -> bool { - return self.0.has_viewport_percentage() + match *self { + SpecifiedValue::Length(ref lop) => lop.has_viewport_percentage(), + _ => false + } } } #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] - pub struct SpecifiedValue(pub specified::LengthOrPercentage); + pub enum SpecifiedValue { + Length(specified::LengthOrPercentage), + Keyword(KeywordSize), + Smaller, + Larger, + } + pub mod computed_value { use app_units::Au; pub type T = Au; } + /// CSS font keywords + #[derive(Debug, Copy, Clone, PartialEq)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + pub enum KeywordSize { + XXSmall = 0, + XSmall = 1, + Small = 2, + Medium = 3, + Large = 4, + XLarge = 5, + XXLarge = 6, + // This is not a real font keyword and will not parse + // HTML font-size 7 corresponds to this value + XXXLarge = 7, + } + + pub use self::KeywordSize::*; + + impl KeywordSize { + pub fn parse(input: &mut Parser) -> Result { + Ok(match_ignore_ascii_case! {&*input.expect_ident()?, + "xx-small" => XXSmall, + "x-small" => XSmall, + "small" => Small, + "medium" => Medium, + "large" => Large, + "x-large" => XLarge, + "xx-large" => XXLarge, + _ => return Err(()) + }) + } + } + + impl ToCss for KeywordSize { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + dest.write_str(match *self { + XXSmall => "xx-small", + XSmall => "x-small", + Small => "small", + Medium => "medium", + Large => "large", + XLarge => "x-large", + XXLarge => "xx-large", + XXXLarge => unreachable!("We should never serialize \ + specified values set via + HTML presentation attributes"), + }) + } + } + + impl ToComputedValue for KeywordSize { + type ComputedValue = Au; + #[inline] + fn to_computed_value(&self, _: &Context) -> computed_value::T { + // https://drafts.csswg.org/css-fonts-3/#font-size-prop + use values::FONT_MEDIUM_PX; + match *self { + XXSmall => Au::from_px(FONT_MEDIUM_PX) * 3 / 5, + XSmall => Au::from_px(FONT_MEDIUM_PX) * 3 / 4, + Small => Au::from_px(FONT_MEDIUM_PX) * 8 / 9, + Medium => Au::from_px(FONT_MEDIUM_PX), + Large => Au::from_px(FONT_MEDIUM_PX) * 6 / 5, + XLarge => Au::from_px(FONT_MEDIUM_PX) * 3 / 2, + XXLarge => Au::from_px(FONT_MEDIUM_PX) * 2, + XXXLarge => Au::from_px(FONT_MEDIUM_PX) * 3, + } + } + + #[inline] + fn from_computed_value(_: &computed_value::T) -> Self { + unreachable!() + } + } + + impl SpecifiedValue { + /// https://html.spec.whatwg.org/multipage/#rules-for-parsing-a-legacy-font-size + pub fn from_html_size(size: u8) -> Self { + SpecifiedValue::Keyword(match size { + // If value is less than 1, let it be 1. + 0 | 1 => XSmall, + 2 => Small, + 3 => Medium, + 4 => Large, + 5 => XLarge, + 6 => XXLarge, + // If value is greater than 7, let it be 7. + _ => XXXLarge, + }) + } + } + #[inline] #[allow(missing_docs)] pub fn get_initial_value() -> computed_value::T { @@ -426,7 +531,7 @@ ${helpers.single_keyword("font-variant-caps", #[inline] pub fn get_initial_specified_value() -> SpecifiedValue { - SpecifiedValue(specified::LengthOrPercentage::Length(NoCalcLength::medium())) + SpecifiedValue::Keyword(Medium) } impl ToComputedValue for SpecifiedValue { @@ -434,45 +539,61 @@ ${helpers.single_keyword("font-variant-caps", #[inline] fn to_computed_value(&self, context: &Context) -> computed_value::T { - match self.0 { - LengthOrPercentage::Length(NoCalcLength::FontRelative(value)) => { + use values::specified::length::FontRelativeLength; + match *self { + SpecifiedValue::Length(LengthOrPercentage::Length( + NoCalcLength::FontRelative(value))) => { value.to_computed_value(context, /* use inherited */ true) } - LengthOrPercentage::Length(NoCalcLength::ServoCharacterWidth(value)) => { + SpecifiedValue::Length(LengthOrPercentage::Length( + NoCalcLength::ServoCharacterWidth(value))) => { value.to_computed_value(context.inherited_style().get_font().clone_font_size()) } - LengthOrPercentage::Length(ref l) => { + SpecifiedValue::Length(LengthOrPercentage::Length(ref l)) => { l.to_computed_value(context) } - LengthOrPercentage::Percentage(Percentage(value)) => { + SpecifiedValue::Length(LengthOrPercentage::Percentage(Percentage(value))) => { context.inherited_style().get_font().clone_font_size().scale_by(value) } - LengthOrPercentage::Calc(ref calc) => { + SpecifiedValue::Length(LengthOrPercentage::Calc(ref calc)) => { let calc = calc.to_computed_value(context); calc.length() + context.inherited_style().get_font().clone_font_size() .scale_by(calc.percentage()) } + SpecifiedValue::Keyword(ref key) => { + key.to_computed_value(context) + } + SpecifiedValue::Smaller => { + FontRelativeLength::Em(0.85).to_computed_value(context, + /* use_inherited */ true) + } + SpecifiedValue::Larger => { + FontRelativeLength::Em(1.2).to_computed_value(context, + /* use_inherited */ true) + } } } #[inline] fn from_computed_value(computed: &computed_value::T) -> Self { - SpecifiedValue(LengthOrPercentage::Length( + SpecifiedValue::Length(LengthOrPercentage::Length( ToComputedValue::from_computed_value(computed) )) } } /// | | | - pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { - use values::specified::{Length, LengthOrPercentage}; - - input.try(specified::LengthOrPercentage::parse_non_negative) - .or_else(|()| { - let ident = try!(input.expect_ident()); - NoCalcLength::from_str(&ident as &str) - .ok_or(()) - .map(specified::LengthOrPercentage::Length) - }).map(SpecifiedValue) + pub fn parse(_: &ParserContext, input: &mut Parser) -> Result { + if let Ok(lop) = input.try(specified::LengthOrPercentage::parse_non_negative) { + Ok(SpecifiedValue::Length(lop)) + } else if let Ok(kw) = input.try(KeywordSize::parse) { + Ok(SpecifiedValue::Keyword(kw)) + } else { + match_ignore_ascii_case! {&*input.expect_ident()?, + "smaller" => Ok(SpecifiedValue::Smaller), + "larger" => Ok(SpecifiedValue::Larger), + _ => Err(()) + } + } } diff --git a/servo/components/style/values/specified/length.rs b/servo/components/style/values/specified/length.rs index d530680660a1..bffae92c4ff4 100644 --- a/servo/components/style/values/specified/length.rs +++ b/servo/components/style/values/specified/length.rs @@ -276,38 +276,6 @@ impl Mul for NoCalcLength { } impl NoCalcLength { - /// https://drafts.csswg.org/css-fonts-3/#font-size-prop - pub fn from_str(s: &str) -> Option { - Some(match_ignore_ascii_case! { s, - "xx-small" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 3 / 5), - "x-small" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 3 / 4), - "small" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 8 / 9), - "medium" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX)), - "large" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 6 / 5), - "x-large" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 3 / 2), - "xx-large" => NoCalcLength::Absolute(Au::from_px(FONT_MEDIUM_PX) * 2), - - // https://github.com/servo/servo/issues/3423#issuecomment-56321664 - "smaller" => NoCalcLength::FontRelative(FontRelativeLength::Em(0.85)), - "larger" => NoCalcLength::FontRelative(FontRelativeLength::Em(1.2)), - _ => return None - }) - } - - /// https://drafts.csswg.org/css-fonts-3/#font-size-prop - pub fn from_font_size_int(i: u8) -> Self { - let au = match i { - 0 | 1 => Au::from_px(FONT_MEDIUM_PX) * 3 / 4, - 2 => Au::from_px(FONT_MEDIUM_PX) * 8 / 9, - 3 => Au::from_px(FONT_MEDIUM_PX), - 4 => Au::from_px(FONT_MEDIUM_PX) * 6 / 5, - 5 => Au::from_px(FONT_MEDIUM_PX) * 3 / 2, - 6 => Au::from_px(FONT_MEDIUM_PX) * 2, - _ => Au::from_px(FONT_MEDIUM_PX) * 3, - }; - NoCalcLength::Absolute(au) - } - /// Parse a given absolute or relative dimension. pub fn parse_dimension(value: CSSFloat, unit: &str) -> Result { match_ignore_ascii_case! { unit, @@ -444,21 +412,11 @@ impl Length { Length::NoCalc(NoCalcLength::zero()) } - /// https://drafts.csswg.org/css-fonts-3/#font-size-prop - pub fn from_str(s: &str) -> Option { - NoCalcLength::from_str(s).map(Length::NoCalc) - } - /// Parse a given absolute or relative dimension. pub fn parse_dimension(value: CSSFloat, unit: &str) -> Result { NoCalcLength::parse_dimension(value, unit).map(Length::NoCalc) } - /// https://drafts.csswg.org/css-fonts-3/#font-size-prop - pub fn from_font_size_int(i: u8) -> Self { - Length::NoCalc(NoCalcLength::from_font_size_int(i)) - } - #[inline] fn parse_internal(input: &mut Parser, context: AllowedNumericType) -> Result { match try!(input.next()) { diff --git a/servo/ports/geckolib/glue.rs b/servo/ports/geckolib/glue.rs index 177a6c076e8f..253e724a3635 100644 --- a/servo/ports/geckolib/glue.rs +++ b/servo/ports/geckolib/glue.rs @@ -1111,7 +1111,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetKeywordValue(declarations: value: i32) { use style::properties::{PropertyDeclaration, LonghandId}; use style::properties::longhands; - use style::values::specified::{BorderStyle, NoCalcLength}; + use style::values::specified::BorderStyle; let declarations = Locked::::as_arc(&declarations); let long = get_longhand_from_id!(property); @@ -1127,7 +1127,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetKeywordValue(declarations: Clear => longhands::clear::SpecifiedValue::from_gecko_keyword(value), FontSize => { // We rely on Gecko passing in font-size values (0...7) here. - longhands::font_size::SpecifiedValue(NoCalcLength::from_font_size_int(value as u8).into()) + longhands::font_size::SpecifiedValue::from_html_size(value as u8) }, ListStyleType => longhands::list_style_type::SpecifiedValue::from_gecko_keyword(value), WhiteSpace => longhands::white_space::SpecifiedValue::from_gecko_keyword(value), From c6fa23934dff3dbfc2a4d77c6ad631b465e2ab37 Mon Sep 17 00:00:00 2001 From: Henry Chang Date: Sun, 19 Mar 2017 15:52:25 +0800 Subject: [PATCH 010/169] Bug 1348626 - Retry when isPinged() failed to avoid false alarm. r=francois MozReview-Commit-ID: BOdJZReICxZ --HG-- extra : rebase_source : 16e0b0b1a65d0bc1249ff0583947acd39defb5d9 --- .../tests/mochitest/test_classify_ping.html | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/toolkit/components/url-classifier/tests/mochitest/test_classify_ping.html b/toolkit/components/url-classifier/tests/mochitest/test_classify_ping.html index 4919ff9ceeee..63318dbae89b 100644 --- a/toolkit/components/url-classifier/tests/mochitest/test_classify_ping.html +++ b/toolkit/components/url-classifier/tests/mochitest/test_classify_ping.html @@ -21,6 +21,7 @@ const host_track = "http://trackertest.org/"; const path_ping = "tests/toolkit/components/url-classifier/tests/mochitest/ping.sjs"; const TP_ENABLE_PREF = "privacy.trackingprotection.enabled"; + const RETRY_TIMEOUT_MS = 200; var testData = [ { url: "trackertest.org/", @@ -37,9 +38,8 @@ ping(id, host_nottrack); return new Promise(function(resolve, reject) { - setTimeout(function() { - isPinged(id, expectPing, msg, resolve); - }, timeout); + // Retry at most 30 seconds. + isPingedWithRetry(id, expectPing, msg, resolve, 30 * 1000 / RETRY_TIMEOUT_MS); }); } @@ -85,19 +85,30 @@ document.body.removeChild(elm); } - function isPinged(id, expected, msg, callback) { + function isPingedWithRetry(id, expected, msg, callback, retryCnt) { var url = "http://mochi.test:8888/" + path_ping; var xhr = new XMLHttpRequest(); xhr.open('GET', url + "?id=" + id); xhr.onload = function() { var isPinged = xhr.response === "ping"; - is(expected, isPinged, msg); - - callback(); + let success = isPinged === expected; + if (success || 0 === retryCnt) { + is(expected, isPinged, msg); + callback(); + return; + } + // Retry on failure. + setTimeout(() => { + isPingedWithRetry(id, expected, msg, callback, retryCnt - 1); + }, RETRY_TIMEOUT_MS); }; xhr.send(); } + function isPinged(id, expected, msg, callback) { + isPingedWithRetry(id, expected, msg, callback, 0); + } + function cleanup() { SpecialPowers.clearUserPref(TP_ENABLE_PREF); } From 106b6939c6d4c4843ce81beef2bbdd1b4117a3d2 Mon Sep 17 00:00:00 2001 From: John Lin Date: Fri, 17 Mar 2017 14:21:27 +0800 Subject: [PATCH 011/169] Bug 1346235 - part 1: translate native error to Java exception. r=jchen MozReview-Commit-ID: BcpfJLSzTvk --HG-- extra : rebase_source : 53d6e9efa064b4a5ab32676d349a5c0cadb78ea7 --- .../java/org/mozilla/gecko/mozglue/SharedMemory.java | 7 ++++++- mozglue/android/SharedMemNatives.cpp | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemory.java b/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemory.java index bc43a275545e..00b80f4a127b 100644 --- a/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemory.java +++ b/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemory.java @@ -133,7 +133,12 @@ public class SharedMemory implements Parcelable { } if (!mIsMapped) { - mHandle = map(getFD(), mSize); + try { + mHandle = map(getFD(), mSize); + } catch (NullPointerException e) { + Log.e(LOGTAG, "SharedMemory#" + mId + " error.", e); + throw e; + } if (mHandle != 0) { mIsMapped = true; } diff --git a/mozglue/android/SharedMemNatives.cpp b/mozglue/android/SharedMemNatives.cpp index d186d6e21e9e..04ceac6a57f2 100644 --- a/mozglue/android/SharedMemNatives.cpp +++ b/mozglue/android/SharedMemNatives.cpp @@ -3,7 +3,9 @@ * 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 #include +#include #include #include @@ -52,6 +54,12 @@ jlong JNICALL Java_org_mozilla_gecko_mozglue_SharedMemory_map(JNIEnv *env, jobject jobj, jint fd, jint length) { void* address = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (address == MAP_FAILED) { + char msg[128]; + snprintf(msg, sizeof(msg), "mmap failed. errno=%d", errno); + env->ThrowNew(env->FindClass("java/lang/NullPointerException"), msg); + return 0; + } return jlong(address); } @@ -62,4 +70,4 @@ Java_org_mozilla_gecko_mozglue_SharedMemory_unmap(JNIEnv *env, jobject jobj, jlo munmap((void*)address, (size_t)size); } -} \ No newline at end of file +} From bbbc27bc084726737b2e5eab40fb2c6d296723e3 Mon Sep 17 00:00:00 2001 From: John Lin Date: Fri, 17 Mar 2017 15:04:26 +0800 Subject: [PATCH 012/169] Bug 1346235 - part 2: translate memory error to I/O failure. r=jchen MozReview-Commit-ID: F2ca0q2JQp --HG-- extra : rebase_source : 9c23a461dbd2ebe3c61ee08e066af51d3b6fe249 --- .../org/mozilla/gecko/mozglue/SharedMemBuffer.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemBuffer.java b/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemBuffer.java index cf22685c2cde..d9455dc5df89 100644 --- a/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemBuffer.java +++ b/mobile/android/base/java/org/mozilla/gecko/mozglue/SharedMemBuffer.java @@ -54,7 +54,11 @@ public final class SharedMemBuffer implements Sample.Buffer { if (!src.isDirect()) { throw new IOException("SharedMemBuffer only support reading from direct byte buffer."); } - nativeReadFromDirectBuffer(src, mSharedMem.getPointer(), offset, size); + try { + nativeReadFromDirectBuffer(src, mSharedMem.getPointer(), offset, size); + } catch (NullPointerException e) { + throw new IOException(e); + } } private native static void nativeReadFromDirectBuffer(ByteBuffer src, long dest, int offset, int size); @@ -64,7 +68,11 @@ public final class SharedMemBuffer implements Sample.Buffer { if (!dest.isDirect()) { throw new IOException("SharedMemBuffer only support writing to direct byte buffer."); } - nativeWriteToDirectBuffer(mSharedMem.getPointer(), dest, offset, size); + try { + nativeWriteToDirectBuffer(mSharedMem.getPointer(), dest, offset, size); + } catch (NullPointerException e) { + throw new IOException(e); + } } private native static void nativeWriteToDirectBuffer(long src, ByteBuffer dest, int offset, int size); From f737b4804b67ee1b71ba8d67b40dbad4713d6968 Mon Sep 17 00:00:00 2001 From: John Lin Date: Fri, 17 Mar 2017 15:17:16 +0800 Subject: [PATCH 013/169] Bug 1346235 - part 3: forward shared memory allocation error to peer process. r=jchen MozReview-Commit-ID: KDIMylv9tVt --HG-- extra : rebase_source : fa4326ce1ca97a46ed9f3cb639a17dfa9950fe4e --- .../base/java/org/mozilla/gecko/media/Codec.java | 11 ++++++++--- .../base/java/org/mozilla/gecko/media/SamplePool.java | 10 ++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java index 877cbc7ab69e..58deb8ebfb7b 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java @@ -196,8 +196,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; return; } - Sample output = obtainOutputSample(index, info); try { + Sample output = obtainOutputSample(index, info); mSentIndices.add(index); mSentOutputs.add(output); mCallbacks.onOutput(output); @@ -471,8 +471,13 @@ import java.util.concurrent.ConcurrentLinkedQueue; } @Override - public synchronized Sample dequeueInput(int size) { - return mInputProcessor.onAllocate(size); + public synchronized Sample dequeueInput(int size) throws RemoteException { + try { + return mInputProcessor.onAllocate(size); + } catch (Exception e) { + // Translate allocation error to remote exception. + throw new RemoteException(e.getMessage()); + } } @Override diff --git a/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java b/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java index f484c7f2a909..f802166f29e5 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java @@ -32,7 +32,7 @@ final class SamplePool { mDefaultBufferSize = size; } - private synchronized Sample obtain(int size) { + private synchronized Sample obtain(int size) { if (!mRecycledSamples.isEmpty()) { return mRecycledSamples.remove(0); } @@ -48,13 +48,11 @@ final class SamplePool { SharedMemory shm = null; try { shm = new SharedMemory(mNextId++, Math.max(size, mDefaultBufferSize)); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); + } catch (NoSuchMethodException | IOException e) { + throw new UnsupportedOperationException(e); } - return shm != null ? Sample.create(shm) : Sample.create(); + return Sample.create(shm); } private synchronized void recycle(Sample recycled) { From d65535053dadd02412c3ec1cb46bc66bdb1a76ac Mon Sep 17 00:00:00 2001 From: John Lin Date: Fri, 17 Mar 2017 15:06:39 +0800 Subject: [PATCH 014/169] Bug 1346235 - part 4: recycle unpopulated input samples. r=jchen MozReview-Commit-ID: Lr0aSQ0OfRg --HG-- extra : rebase_source : 71f37d29c5d3a08e63171956fa5a02e716bcec0a --- .../java/org/mozilla/gecko/media/Codec.java | 22 +++++++--- .../org/mozilla/gecko/media/CodecProxy.java | 44 +++++++++++-------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java index 58deb8ebfb7b..fa9b8ecaa3b2 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java @@ -66,18 +66,26 @@ import java.util.concurrent.ConcurrentLinkedQueue; private synchronized void onSample(Sample sample) { if (sample == null) { - Log.w(LOGTAG, "WARN: null input sample"); + // Ignore empty input. + mSamplePool.recycleInput(mDequeuedSamples.remove()); + Log.w(LOGTAG, "WARN: empty input sample"); return; } - if (!sample.isEOS()) { - Sample temp = sample; - sample = mDequeuedSamples.remove(); - sample.info = temp.info; - sample.cryptoInfo = temp.cryptoInfo; - temp.dispose(); + if (sample.isEOS()) { + queueSample(sample); + return; } + Sample dequeued = mDequeuedSamples.remove(); + dequeued.info = sample.info; + dequeued.cryptoInfo = sample.cryptoInfo; + queueSample(dequeued); + + sample.dispose(); + } + + private void queueSample(Sample sample) { if (!mInputSamples.offer(sample)) { reportError(Error.FATAL, new Exception("FAIL: input sample queue is full")); return; diff --git a/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java b/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java index b3d95015725d..765689325d17 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java @@ -170,34 +170,40 @@ public final class CodecProxy { Log.e(LOGTAG, "cannot send input to an ended codec"); return false; } + + boolean eos = info.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM; + mCallbacks.setEndOfInput(eos); + + if (eos) { + return sendInput(Sample.EOS); + } + + try { + return sendInput(mRemote.dequeueInput(info.size).set(bytes, info, cryptoInfo)); + } catch (RemoteException e) { + Log.e(LOGTAG, "fail to dequeue input buffer", e); + return false; + } catch (IOException e) { + Log.e(LOGTAG, "fail to copy input data.", e); + // Balance dequeue/queue. + return sendInput(null); + } + } + + private boolean sendInput(Sample sample) { try { - Sample sample = processInput(bytes, info, cryptoInfo); - if (sample == null) { - return false; - } mRemote.queueInput(sample); - sample.dispose(); + if (sample != null) { + sample.dispose(); + } } catch (Exception e) { - Log.e(LOGTAG, "fail to input sample: size=" + info.size + - ", pts=" + info.presentationTimeUs + - ", flags=" + Integer.toHexString(info.flags), e); + Log.e(LOGTAG, "fail to queue input:" + sample, e); return false; } return true; } - private Sample processInput(ByteBuffer bytes, BufferInfo info, CryptoInfo cryptoInfo) - throws RemoteException, IOException { - if (info.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM) { - mCallbacks.setEndOfInput(true); - return Sample.EOS; - } else { - mCallbacks.setEndOfInput(false); - return mRemote.dequeueInput(info.size).set(bytes, info, cryptoInfo); - } - } - @WrapForJNI public synchronized boolean flush() { if (mRemote == null) { From 390a075c262c4ff1e050339b2635d36f6933638d Mon Sep 17 00:00:00 2001 From: Frederik Braun Date: Mon, 30 Jan 2017 14:09:37 +0100 Subject: [PATCH 015/169] Bug 1073952: inherit CSP into iframe sandbox srcdoc r=ckerschb,Tomcat MozReview-Commit-ID: 3fhWCGwgG4A --HG-- extra : rebase_source : 7e84fafe0ef69b7f6695de825fc254ee0e4209ba --- caps/BasePrincipal.cpp | 15 +++++++++++++++ caps/BasePrincipal.h | 1 + caps/nsIPrincipal.idl | 5 +++-- caps/nsNullPrincipal.cpp | 14 ++++++++++++++ caps/nsNullPrincipal.h | 1 + caps/nsScriptSecurityManager.cpp | 26 +++++++++++++++++++++++++- caps/nsSystemPrincipal.cpp | 11 ++++++++++- caps/nsSystemPrincipal.h | 1 + 8 files changed, 70 insertions(+), 4 deletions(-) diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index b00ce460c26b..466e4994cd0b 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -442,6 +442,21 @@ BasePrincipal::GetCsp(nsIContentSecurityPolicy** aCsp) return NS_OK; } +NS_IMETHODIMP +BasePrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) +{ + // Never destroy an existing CSP on the principal. + // This method should only be called in rare cases. + + MOZ_ASSERT(!mCSP, "do not destroy an existing CSP"); + if (mCSP) { + return NS_ERROR_ALREADY_INITIALIZED; + } + + mCSP = aCsp; + return NS_OK; +} + NS_IMETHODIMP BasePrincipal::EnsureCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 7391e8b468bf..537b1a8e51e9 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -222,6 +222,7 @@ public: NS_IMETHOD SubsumesConsideringDomainIgnoringFPD(nsIPrincipal* other, bool* _retval) final; NS_IMETHOD CheckMayLoad(nsIURI* uri, bool report, bool allowIfInheritsPrincipal) final; NS_IMETHOD GetCsp(nsIContentSecurityPolicy** aCsp) override; + NS_IMETHOD SetCsp(nsIContentSecurityPolicy* aCsp) override; NS_IMETHOD EnsureCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override; NS_IMETHOD GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) override; NS_IMETHOD EnsurePreloadCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override; diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index 16aceafeff7d..870792527813 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -151,10 +151,11 @@ interface nsIPrincipal : nsISerializable /** * A Content Security Policy associated with this principal. - * * Use this function to query the associated CSP with this principal. + * Please *only* use this function to *set* a CSP when you know exactly what you are doing. + * Most likely you want to call ensureCSP instead of setCSP. */ - [noscript] readonly attribute nsIContentSecurityPolicy csp; + [noscript] attribute nsIContentSecurityPolicy csp; /* * Use this function to query a CSP associated with this principal. diff --git a/caps/nsNullPrincipal.cpp b/caps/nsNullPrincipal.cpp index 8ab0bd27c91a..fe846ac25b0c 100644 --- a/caps/nsNullPrincipal.cpp +++ b/caps/nsNullPrincipal.cpp @@ -108,6 +108,20 @@ nsNullPrincipal::GetHashValue(uint32_t *aResult) return NS_OK; } +NS_IMETHODIMP +nsNullPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) { + // Never destroy an existing CSP on the principal. + // This method should only be called in rare cases. + + MOZ_ASSERT(!mCSP, "do not destroy an existing CSP"); + if (mCSP) { + return NS_ERROR_ALREADY_INITIALIZED; + } + + mCSP = aCsp; + return NS_OK; +} + NS_IMETHODIMP nsNullPrincipal::GetURI(nsIURI** aURI) { diff --git a/caps/nsNullPrincipal.h b/caps/nsNullPrincipal.h index ad3345d74741..653029258f4b 100644 --- a/caps/nsNullPrincipal.h +++ b/caps/nsNullPrincipal.h @@ -45,6 +45,7 @@ public: NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; NS_IMETHOD GetHashValue(uint32_t* aHashValue) override; + NS_IMETHOD SetCsp(nsIContentSecurityPolicy* aCsp) override; NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 2135af2da087..d6176f9e32b6 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -294,6 +294,30 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, if (!aIgnoreSandboxing && loadInfo->GetLoadingSandboxed()) { MOZ_ALWAYS_TRUE(NS_SUCCEEDED(loadInfo->GetSandboxedLoadingPrincipal(aPrincipal))); MOZ_ASSERT(*aPrincipal); + // if the new NullPrincipal (above) loads an iframe[srcdoc], we + // need to inherit an existing CSP to avoid bypasses (bug 1073952). + // We continue inheriting for nested frames with e.g., data: URLs. + if (loadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_SUBDOCUMENT) { + nsCOMPtr uri; + aChannel->GetURI(getter_AddRefs(uri)); + nsAutoCString URISpec; + uri->GetSpec(URISpec); + bool isData = (NS_SUCCEEDED(uri->SchemeIs("data", &isData)) && isData); + if (URISpec.EqualsLiteral("about:srcdoc") || isData) { + nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); + if (!principalToInherit) { + principalToInherit = loadInfo->TriggeringPrincipal(); + } + nsCOMPtr originalCsp; + principalToInherit->GetCsp(getter_AddRefs(originalCsp)); + // if the principalToInherit had a CSP, + // add it to the newly created NullPrincipal. + if (originalCsp) { + nsresult rv = (*aPrincipal)->SetCsp(originalCsp); + NS_ENSURE_SUCCESS(rv, rv); + } + } + } return NS_OK; } @@ -325,7 +349,7 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, nsCOMPtr uri; nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri)); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); if (!principalToInherit) { principalToInherit = loadInfo->TriggeringPrincipal(); diff --git a/caps/nsSystemPrincipal.cpp b/caps/nsSystemPrincipal.cpp index 94cbeecc29a5..b1c33553ac8d 100644 --- a/caps/nsSystemPrincipal.cpp +++ b/caps/nsSystemPrincipal.cpp @@ -57,7 +57,7 @@ nsSystemPrincipal::GetHashValue(uint32_t *result) return NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsSystemPrincipal::GetURI(nsIURI** aURI) { *aURI = nullptr; @@ -78,6 +78,15 @@ nsSystemPrincipal::GetCsp(nsIContentSecurityPolicy** aCsp) return NS_OK; } +NS_IMETHODIMP +nsSystemPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) +{ + // Never destroy an existing CSP on the principal. + // This method should only be called in rare cases. + + return NS_ERROR_FAILURE; +} + NS_IMETHODIMP nsSystemPrincipal::EnsureCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) diff --git a/caps/nsSystemPrincipal.h b/caps/nsSystemPrincipal.h index 2dd6a0f58ef1..0e67ce45e490 100644 --- a/caps/nsSystemPrincipal.h +++ b/caps/nsSystemPrincipal.h @@ -37,6 +37,7 @@ public: NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; NS_IMETHOD GetCsp(nsIContentSecurityPolicy** aCsp) override; + NS_IMETHOD SetCsp(nsIContentSecurityPolicy* aCsp) override; NS_IMETHOD EnsureCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override; NS_IMETHOD GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) override; NS_IMETHOD EnsurePreloadCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override; From 56207a1b8b410c71ab236363ec16b22eae7e078a Mon Sep 17 00:00:00 2001 From: Frederik Braun Date: Mon, 30 Jan 2017 14:12:15 +0100 Subject: [PATCH 016/169] Bug 1073952: tests for iframe sandbox srcdoc and data URIs with CSP r=ckerschb,Tomcat MozReview-Commit-ID: 5Q8XIJPrRPk --HG-- extra : rebase_source : 391431d3585173d096ab58747a854542dfd3adca --- .../test/csp/file_iframe_sandbox_srcdoc.html | 11 ++ .../file_iframe_sandbox_srcdoc.html^headers^ | 1 + dom/security/test/csp/file_iframe_srcdoc.sjs | 79 ++++++++++ dom/security/test/csp/mochitest.ini | 5 + .../test/csp/test_iframe_sandbox_srcdoc.html | 62 ++++++++ dom/security/test/csp/test_iframe_srcdoc.html | 140 ++++++++++++++++++ 6 files changed, 298 insertions(+) create mode 100644 dom/security/test/csp/file_iframe_sandbox_srcdoc.html create mode 100644 dom/security/test/csp/file_iframe_sandbox_srcdoc.html^headers^ create mode 100644 dom/security/test/csp/file_iframe_srcdoc.sjs create mode 100644 dom/security/test/csp/test_iframe_sandbox_srcdoc.html create mode 100644 dom/security/test/csp/test_iframe_srcdoc.html diff --git a/dom/security/test/csp/file_iframe_sandbox_srcdoc.html b/dom/security/test/csp/file_iframe_sandbox_srcdoc.html new file mode 100644 index 000000000000..bc700ed68fb3 --- /dev/null +++ b/dom/security/test/csp/file_iframe_sandbox_srcdoc.html @@ -0,0 +1,11 @@ + + + + + Bug 1073952 - CSP should restrict scripts in srcdoc iframe even if sandboxed + + + + + diff --git a/dom/security/test/csp/file_iframe_sandbox_srcdoc.html^headers^ b/dom/security/test/csp/file_iframe_sandbox_srcdoc.html^headers^ new file mode 100644 index 000000000000..cf869e07d402 --- /dev/null +++ b/dom/security/test/csp/file_iframe_sandbox_srcdoc.html^headers^ @@ -0,0 +1 @@ +content-security-policy: default-src *; diff --git a/dom/security/test/csp/file_iframe_srcdoc.sjs b/dom/security/test/csp/file_iframe_srcdoc.sjs new file mode 100644 index 000000000000..6de8a029ef1b --- /dev/null +++ b/dom/security/test/csp/file_iframe_srcdoc.sjs @@ -0,0 +1,79 @@ +// Custom *.sjs file specifically for the needs of +// https://bugzilla.mozilla.org/show_bug.cgi?id=1073952 + +"use strict"; +Components.utils.importGlobalProperties(["URLSearchParams"]); + +const SCRIPT = ` + `; + +const SIMPLE_IFRAME_SRCDOC = ` + + + + + + + `; + +const INNER_SRCDOC_IFRAME = ` + `; + +const NESTED_IFRAME_SRCDOC = ` + + + + + + + `; + + +const INNER_DATAURI_IFRAME = ` + `; + +const NESTED_IFRAME_SRCDOC_DATAURI = ` + + + + + + + `; + +function handleRequest(request, response) { + const query = new URLSearchParams(request.queryString); + + response.setHeader("Cache-Control", "no-cache", false); + if (typeof query.get("csp") === "string") { + response.setHeader("Content-Security-Policy", query.get("csp"), false); + } + response.setHeader("Content-Type", "text/html", false); + + if (query.get("action") === "simple_iframe_srcdoc") { + response.write(SIMPLE_IFRAME_SRCDOC); + return; + } + + if (query.get("action") === "nested_iframe_srcdoc") { + response.write(NESTED_IFRAME_SRCDOC); + return; + } + + if (query.get("action") === "nested_iframe_srcdoc_datauri") { + response.write(NESTED_IFRAME_SRCDOC_DATAURI); + return; + } + + // we should never get here, but just in case + // return something unexpected + response.write("do'h"); +} diff --git a/dom/security/test/csp/mochitest.ini b/dom/security/test/csp/mochitest.ini index 58ac777ea5d7..4d3e02b67cd8 100644 --- a/dom/security/test/csp/mochitest.ini +++ b/dom/security/test/csp/mochitest.ini @@ -205,6 +205,9 @@ support-files = file_upgrade_insecure_navigation.sjs file_punycode_host_src.sjs file_punycode_host_src.js + file_iframe_srcdoc.sjs + file_iframe_sandbox_srcdoc.html + file_iframe_sandbox_srcdoc.html^headers^ [test_base-uri.html] [test_blob_data_schemes.html] @@ -293,3 +296,5 @@ tags = mcb [test_strict_dynamic_default_src.html] [test_upgrade_insecure_navigation.html] [test_punycode_host_src.html] +[test_iframe_sandbox_srcdoc.html] +[test_iframe_srcdoc.html] diff --git a/dom/security/test/csp/test_iframe_sandbox_srcdoc.html b/dom/security/test/csp/test_iframe_sandbox_srcdoc.html new file mode 100644 index 000000000000..53beafcacd9c --- /dev/null +++ b/dom/security/test/csp/test_iframe_sandbox_srcdoc.html @@ -0,0 +1,62 @@ + + + + + Bug 1073952 - CSP should restrict scripts in srcdoc iframe even if sandboxed + + + + +

Bug 1073952

+ + + + diff --git a/dom/security/test/csp/test_iframe_srcdoc.html b/dom/security/test/csp/test_iframe_srcdoc.html new file mode 100644 index 000000000000..95b924a5e387 --- /dev/null +++ b/dom/security/test/csp/test_iframe_srcdoc.html @@ -0,0 +1,140 @@ + + + + Bug 1073952 - Test CSP enforcement within iframe srcdoc + + + + + + + + + + From 622080220c2b15ff323e9b1e0b1f79807f09d0ba Mon Sep 17 00:00:00 2001 From: Frederik Braun Date: Mon, 30 Jan 2017 14:13:13 +0100 Subject: [PATCH 017/169] Bug 1073952: proper indentation for nsScriptSecurityManager::GetChannelResultPrincipal r=Tomcat MozReview-Commit-ID: 84qywpARPwI --HG-- extra : rebase_source : fd0bc97039e95d93ba0eb7688ef3e1571ef1bba3 --- caps/nsScriptSecurityManager.cpp | 126 +++++++++++++++---------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index d6176f9e32b6..a3874ab22ce0 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -269,28 +269,28 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, nsIPrincipal** aPrincipal, bool aIgnoreSandboxing) { - NS_PRECONDITION(aChannel, "Must have channel!"); - // Check whether we have an nsILoadInfo that says what we should do. - nsCOMPtr loadInfo = aChannel->GetLoadInfo(); - if (loadInfo && loadInfo->GetForceInheritPrincipalOverruleOwner()) { - nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); - if (!principalToInherit) { - principalToInherit = loadInfo->TriggeringPrincipal(); - } - principalToInherit.forget(aPrincipal); + NS_PRECONDITION(aChannel, "Must have channel!"); + // Check whether we have an nsILoadInfo that says what we should do. + nsCOMPtr loadInfo = aChannel->GetLoadInfo(); + if (loadInfo && loadInfo->GetForceInheritPrincipalOverruleOwner()) { + nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); + if (!principalToInherit) { + principalToInherit = loadInfo->TriggeringPrincipal(); + } + principalToInherit.forget(aPrincipal); + return NS_OK; + } + + nsCOMPtr owner; + aChannel->GetOwner(getter_AddRefs(owner)); + if (owner) { + CallQueryInterface(owner, aPrincipal); + if (*aPrincipal) { return NS_OK; } + } - nsCOMPtr owner; - aChannel->GetOwner(getter_AddRefs(owner)); - if (owner) { - CallQueryInterface(owner, aPrincipal); - if (*aPrincipal) { - return NS_OK; - } - } - - if (loadInfo) { + if (loadInfo) { if (!aIgnoreSandboxing && loadInfo->GetLoadingSandboxed()) { MOZ_ALWAYS_TRUE(NS_SUCCEEDED(loadInfo->GetSandboxedLoadingPrincipal(aPrincipal))); MOZ_ASSERT(*aPrincipal); @@ -321,51 +321,51 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, return NS_OK; } - bool forceInherit = loadInfo->GetForceInheritPrincipal(); - if (aIgnoreSandboxing && !forceInherit) { - // Check if SEC_FORCE_INHERIT_PRINCIPAL was dropped because of - // sandboxing: - if (loadInfo->GetLoadingSandboxed() && - loadInfo->GetForceInheritPrincipalDropped()) { - forceInherit = true; - } - } - if (forceInherit) { - nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); - if (!principalToInherit) { - principalToInherit = loadInfo->TriggeringPrincipal(); - } - principalToInherit.forget(aPrincipal); - return NS_OK; - } - - nsSecurityFlags securityFlags = loadInfo->GetSecurityMode(); - // The data: inheritance flags should only apply to the initial load, - // not to loads that it might have redirected to. - if (loadInfo->RedirectChain().IsEmpty() && - (securityFlags == nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_INHERITS || - securityFlags == nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS || - securityFlags == nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS)) { - - nsCOMPtr uri; - nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri)); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); - if (!principalToInherit) { - principalToInherit = loadInfo->TriggeringPrincipal(); - } - bool inheritForAboutBlank = loadInfo->GetAboutBlankInherits(); - - if (nsContentUtils::ChannelShouldInheritPrincipal(principalToInherit, - uri, - inheritForAboutBlank, - false)) { - principalToInherit.forget(aPrincipal); - return NS_OK; - } - } + bool forceInherit = loadInfo->GetForceInheritPrincipal(); + if (aIgnoreSandboxing && !forceInherit) { + // Check if SEC_FORCE_INHERIT_PRINCIPAL was dropped because of + // sandboxing: + if (loadInfo->GetLoadingSandboxed() && + loadInfo->GetForceInheritPrincipalDropped()) { + forceInherit = true; + } } - return GetChannelURIPrincipal(aChannel, aPrincipal); + if (forceInherit) { + nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); + if (!principalToInherit) { + principalToInherit = loadInfo->TriggeringPrincipal(); + } + principalToInherit.forget(aPrincipal); + return NS_OK; + } + + nsSecurityFlags securityFlags = loadInfo->GetSecurityMode(); + // The data: inheritance flags should only apply to the initial load, + // not to loads that it might have redirected to. + if (loadInfo->RedirectChain().IsEmpty() && + (securityFlags == nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_INHERITS || + securityFlags == nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS || + securityFlags == nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS)) { + + nsCOMPtr uri; + nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri)); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); + if (!principalToInherit) { + principalToInherit = loadInfo->TriggeringPrincipal(); + } + bool inheritForAboutBlank = loadInfo->GetAboutBlankInherits(); + + if (nsContentUtils::ChannelShouldInheritPrincipal(principalToInherit, + uri, + inheritForAboutBlank, + false)) { + principalToInherit.forget(aPrincipal); + return NS_OK; + } + } + } + return GetChannelURIPrincipal(aChannel, aPrincipal); } /* The principal of the URI that this channel is loading. This is never From 52bf3b2ff0d24c77df6852ba2510c7067ba77789 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Mon, 20 Mar 2017 14:00:33 +0100 Subject: [PATCH 018/169] Bug 1328140 - Improve handling of IC failures, add megamorphic IC stubs. r=h4writer --HG-- extra : rebase_source : b45b90eef388edf3da4e98dee5e8696eae766663 --- js/src/jit-test/tests/asm.js/testZOOB.js | 5 + js/src/jit/BaselineCacheIRCompiler.cpp | 136 ++++++++++++++++- js/src/jit/BaselineCacheIRCompiler.h | 2 +- js/src/jit/BaselineDebugModeOSR.cpp | 3 +- js/src/jit/BaselineIC.cpp | 132 ++++++++-------- js/src/jit/BaselineIC.h | 9 -- js/src/jit/BaselineInspector.cpp | 84 ++++++++++- js/src/jit/BaselineInspector.h | 3 + js/src/jit/CacheIR.cpp | 184 +++++++++++++++++------ js/src/jit/CacheIR.h | 51 +++++-- js/src/jit/CacheIRCompiler.cpp | 59 +++++++- js/src/jit/CacheIRCompiler.h | 1 + js/src/jit/ICState.h | 127 ++++++++++++++++ js/src/jit/IonBuilder.cpp | 18 +++ js/src/jit/IonCacheIRCompiler.cpp | 152 +++++++++++++++++-- js/src/jit/IonIC.cpp | 100 ++++++------ js/src/jit/IonIC.h | 34 ++--- js/src/jit/SharedIC.cpp | 101 +++---------- js/src/jit/SharedIC.h | 54 ++----- js/src/jit/SharedICList.h | 1 - js/src/jit/VMFunctions.cpp | 179 ++++++++++++++++++++++ js/src/jit/VMFunctions.h | 14 ++ js/src/vm/TypeInference-inl.h | 2 +- 23 files changed, 1093 insertions(+), 358 deletions(-) create mode 100644 js/src/jit/ICState.h diff --git a/js/src/jit-test/tests/asm.js/testZOOB.js b/js/src/jit-test/tests/asm.js/testZOOB.js index ae59611d6e68..3ab740fb427a 100644 --- a/js/src/jit-test/tests/asm.js/testZOOB.js +++ b/js/src/jit-test/tests/asm.js/testZOOB.js @@ -5,6 +5,11 @@ load(libdir + "asserts.js"); if (!isAsmJSCompilationAvailable()) quit(); +// This test runs a lot of code and is very slow with --ion-eager. Use a minimum +// Ion warmup trigger of 2 to avoid timeouts. +if (getJitCompilerOptions()["ion.warmup.trigger"] < 5) + setJitCompilerOption("ion.warmup.trigger", 5); + var ab = new ArrayBuffer(BUF_MIN); // Compute a set of interesting indices. diff --git a/js/src/jit/BaselineCacheIRCompiler.cpp b/js/src/jit/BaselineCacheIRCompiler.cpp index 2663fcb38061..6e41d489b48b 100644 --- a/js/src/jit/BaselineCacheIRCompiler.cpp +++ b/js/src/jit/BaselineCacheIRCompiler.cpp @@ -381,6 +381,126 @@ BaselineCacheIRCompiler::emitLoadDynamicSlotResult() return true; } +bool +BaselineCacheIRCompiler::emitMegamorphicLoadSlotResult() +{ + AutoOutputRegister output(*this); + + Register obj = allocator.useRegister(masm, reader.objOperandId()); + Address nameAddr = stubAddress(reader.stubOffset()); + bool handleMissing = reader.readBool(); + + AutoScratchRegisterMaybeOutput scratch1(allocator, masm, output); + AutoScratchRegister scratch2(allocator, masm); + AutoScratchRegister scratch3(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + masm.Push(UndefinedValue()); + masm.moveStackPtrTo(scratch3.get()); + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + volatileRegs.takeUnchecked(scratch3); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.loadPtr(nameAddr, scratch2); + masm.passABIArg(scratch2); + masm.passABIArg(scratch3); + if (handleMissing) + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataProperty))); + else + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataProperty))); + masm.mov(ReturnReg, scratch2); + masm.PopRegsInMask(volatileRegs); + + masm.loadTypedOrValue(Address(masm.getStackPointer(), 0), output); + masm.adjustStack(sizeof(Value)); + + masm.branchIfFalseBool(scratch2, failure->label()); + return true; +} + +bool +BaselineCacheIRCompiler::emitMegamorphicStoreSlot() +{ + Register obj = allocator.useRegister(masm, reader.objOperandId()); + Address nameAddr = stubAddress(reader.stubOffset()); + ValueOperand val = allocator.useValueRegister(masm, reader.valOperandId()); + + AutoScratchRegister scratch1(allocator, masm); + AutoScratchRegister scratch2(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + masm.Push(val); + masm.moveStackPtrTo(val.scratchReg()); + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + volatileRegs.takeUnchecked(val); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.loadPtr(nameAddr, scratch2); + masm.passABIArg(scratch2); + masm.passABIArg(val.scratchReg()); + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, SetNativeDataProperty)); + masm.mov(ReturnReg, scratch1); + masm.PopRegsInMask(volatileRegs); + + masm.loadValue(Address(masm.getStackPointer(), 0), val); + masm.adjustStack(sizeof(Value)); + + masm.branchIfFalseBool(scratch1, failure->label()); + return true; +} + +bool +BaselineCacheIRCompiler::emitGuardHasGetterSetter() +{ + Register obj = allocator.useRegister(masm, reader.objOperandId()); + Address shapeAddr = stubAddress(reader.stubOffset()); + + AutoScratchRegister scratch1(allocator, masm); + AutoScratchRegister scratch2(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.loadPtr(shapeAddr, scratch2); + masm.passABIArg(scratch2); + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, ObjectHasGetterSetter)); + masm.mov(ReturnReg, scratch1); + masm.PopRegsInMask(volatileRegs); + + masm.branchIfFalseBool(scratch1, failure->label()); + return true; +} + bool BaselineCacheIRCompiler::emitCallScriptedGetterResult() { @@ -1737,12 +1857,14 @@ static const size_t MaxOptimizedCacheIRStubs = 16; ICStub* jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind kind, ICStubEngine engine, JSScript* outerScript, - ICFallbackStub* stub) + ICFallbackStub* stub, bool* attached) { // We shouldn't GC or report OOM (or any other exception) here. AutoAssertNoPendingException aanpe(cx); JS::AutoCheckCannotGC nogc; + MOZ_ASSERT(!*attached); + if (writer.failed()) return nullptr; @@ -1810,6 +1932,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, // for some reason and the IR generator doesn't check for exactly the same // conditions. for (ICStubConstIterator iter = stub->beginChainConst(); !iter.atEnd(); iter++) { + bool updated = false; switch (stubKind) { case CacheIRStubKind::Regular: { if (!iter->isCacheIR_Regular()) @@ -1817,7 +1940,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, auto otherStub = iter->toCacheIR_Regular(); if (otherStub->stubInfo() != stubInfo) continue; - if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart())) + if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart(), &updated)) continue; break; } @@ -1827,7 +1950,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, auto otherStub = iter->toCacheIR_Monitored(); if (otherStub->stubInfo() != stubInfo) continue; - if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart())) + if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart(), &updated)) continue; break; } @@ -1837,7 +1960,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, auto otherStub = iter->toCacheIR_Updated(); if (otherStub->stubInfo() != stubInfo) continue; - if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart())) + if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart(), &updated)) continue; break; } @@ -1846,6 +1969,8 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, // We found a stub that's exactly the same as the stub we're about to // attach. Just return nullptr, the caller should do nothing in this // case. + if (updated) + *attached = true; return nullptr; } @@ -1864,6 +1989,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, auto newStub = new(newStubMem) ICCacheIR_Regular(code, stubInfo); writer.copyStubData(newStub->stubDataStart()); stub->addNewStub(newStub); + *attached = true; return newStub; } case CacheIRStubKind::Monitored: { @@ -1872,6 +1998,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, auto newStub = new(newStubMem) ICCacheIR_Monitored(code, monitorStub, stubInfo); writer.copyStubData(newStub->stubDataStart()); stub->addNewStub(newStub); + *attached = true; return newStub; } case CacheIRStubKind::Updated: { @@ -1882,6 +2009,7 @@ jit::AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, } writer.copyStubData(newStub->stubDataStart()); stub->addNewStub(newStub); + *attached = true; return newStub; } } diff --git a/js/src/jit/BaselineCacheIRCompiler.h b/js/src/jit/BaselineCacheIRCompiler.h index d55c32d631c2..8ad48da7221e 100644 --- a/js/src/jit/BaselineCacheIRCompiler.h +++ b/js/src/jit/BaselineCacheIRCompiler.h @@ -19,7 +19,7 @@ class ICStub; ICStub* AttachBaselineCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind kind, ICStubEngine engine, JSScript* outerScript, - ICFallbackStub* stub); + ICFallbackStub* stub, bool* attached); } // namespace jit } // namespace js diff --git a/js/src/jit/BaselineDebugModeOSR.cpp b/js/src/jit/BaselineDebugModeOSR.cpp index 17871f16e46f..dc4c56dbd27c 100644 --- a/js/src/jit/BaselineDebugModeOSR.cpp +++ b/js/src/jit/BaselineDebugModeOSR.cpp @@ -699,8 +699,7 @@ RecompileBaselineScriptForDebugMode(JSContext* cx, JSScript* script, _(Call_ClassHook) \ _(Call_ScriptedApplyArray) \ _(Call_ScriptedApplyArguments) \ - _(Call_ScriptedFunCall) \ - _(GetProp_Generic) + _(Call_ScriptedFunCall) static bool CloneOldBaselineStub(JSContext* cx, DebugModeOSREntryVector& entries, size_t entryIndex) diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 7e0270a4eac1..42b7e8649afb 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -803,30 +803,29 @@ DoGetElemFallback(JSContext* cx, BaselineFrame* frame, ICGetElem_Fallback* stub_ } bool attached = false; - if (stub->numOptimizedStubs() >= ICGetElem_Fallback::MAX_OPTIMIZED_STUBS) { - // TODO: Discard all stubs in this IC and replace with inert megamorphic stub. - // But for now we just bail. - stub->noteUnoptimizableAccess(); - attached = true; - } - bool isTemporarilyUnoptimizable = false; - if (!attached && !JitOptions.disableCacheIR) { + + if (stub->state().maybeTransition()) + stub->discardStubs(cx); + + if (stub->state().canAttachStub()) { ICStubEngine engine = ICStubEngine::Baseline; - GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem, + GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem, stub->state().mode(), &isTemporarilyUnoptimizable, lhs, rhs, CanAttachGetter::Yes); if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - engine, info.outerScript(cx), stub); + engine, info.outerScript(cx), stub, + &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; if (gen.shouldNotePreliminaryObjectStub()) newStub->toCacheIR_Monitored()->notePreliminaryObject(); else if (gen.shouldUnlinkPreliminaryObjectStubs()) StripPreliminaryObjectStubs(cx, stub); } } + if (!attached && !isTemporarilyUnoptimizable) + stub->state().trackNotAttached(); } if (!isOptimizedArgs) { @@ -957,19 +956,20 @@ DoSetElemFallback(JSContext* cx, BaselineFrame* frame, ICSetElem_Fallback* stub_ } bool isTemporarilyUnoptimizable = false; - bool attached = false; - if (stub->numOptimizedStubs() < ICSetElem_Fallback::MAX_OPTIMIZED_STUBS && - !JitOptions.disableCacheIR) - { - SetPropIRGenerator gen(cx, script, pc, CacheKind::SetElem, &isTemporarilyUnoptimizable, - objv, index, rhs); + + if (stub->state().maybeTransition()) + stub->discardStubs(cx); + + if (stub->state().canAttachStub()) { + SetPropIRGenerator gen(cx, script, pc, CacheKind::SetElem, stub->state().mode(), + &isTemporarilyUnoptimizable, objv, index, rhs); if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ICStubEngine::Baseline, frame->script(), stub); + ICStubEngine::Baseline, frame->script(), + stub, &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; SetUpdateStubData(newStub->toCacheIR_Updated(), gen.typeCheckInfo()); @@ -1019,27 +1019,23 @@ DoSetElemFallback(JSContext* cx, BaselineFrame* frame, ICSetElem_Fallback* stub_ if (attached) return true; - if (stub->numOptimizedStubs() >= ICSetElem_Fallback::MAX_OPTIMIZED_STUBS) { - // TODO: Discard all stubs in this IC and replace with inert megamorphic stub. - // But for now we just bail. - return true; - } - - if (!JitOptions.disableCacheIR) { - SetPropIRGenerator gen(cx, script, pc, CacheKind::SetElem, &isTemporarilyUnoptimizable, - objv, index, rhs); + if (stub->state().canAttachStub()) { + SetPropIRGenerator gen(cx, script, pc, CacheKind::SetElem, stub->state().mode(), + &isTemporarilyUnoptimizable, objv, index, rhs); if (gen.tryAttachAddSlotStub(oldGroup, oldShape)) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ICStubEngine::Baseline, frame->script(), stub); + ICStubEngine::Baseline, frame->script(), + stub, &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; SetUpdateStubData(newStub->toCacheIR_Updated(), gen.typeCheckInfo()); return true; } } else { gen.trackNotAttached(); } + if (!attached && !isTemporarilyUnoptimizable) + stub->state().trackNotAttached(); } return true; @@ -1208,26 +1204,26 @@ DoInFallback(JSContext* cx, BaselineFrame* frame, ICIn_Fallback* stub_, return false; } - bool attached = false; - - if (stub->numOptimizedStubs() >= ICIn_Fallback::MAX_OPTIMIZED_STUBS) - attached = true; - - RootedScript script(cx, frame->script()); RootedObject obj(cx, &objValue.toObject()); - jsbytecode* pc = stub->icEntry()->pc(script); - if (!attached && !JitOptions.disableCacheIR) { + if (stub->state().maybeTransition()) + stub->discardStubs(cx); + + if (stub->state().canAttachStub()) { + RootedScript script(cx, frame->script()); + jsbytecode* pc = stub->icEntry()->pc(script); + ICStubEngine engine = ICStubEngine::Baseline; - InIRGenerator gen(cx, script, pc, key, obj); + InIRGenerator gen(cx, script, pc, stub->state().mode(), key, obj); + bool attached = false; if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - engine, script, stub); - if (newStub) { + engine, script, stub, &attached); + if (newStub) JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; - } } + if (!attached) + stub->state().trackNotAttached(); } bool cond = false; @@ -1282,23 +1278,21 @@ DoGetNameFallback(JSContext* cx, BaselineFrame* frame, ICGetName_Fallback* stub_ RootedPropertyName name(cx, script->getName(pc)); bool attached = false; - // Attach new stub. - if (stub->numOptimizedStubs() >= ICGetName_Fallback::MAX_OPTIMIZED_STUBS) { - // TODO: Discard all stubs in this IC and replace with generic stub. - attached = true; - } + if (stub->state().maybeTransition()) + stub->discardStubs(cx); - if (!attached && !JitOptions.disableCacheIR) { + if (stub->state().canAttachStub()) { ICStubEngine engine = ICStubEngine::Baseline; - GetNameIRGenerator gen(cx, script, pc, envChain, name); + GetNameIRGenerator gen(cx, script, pc, stub->state().mode(), envChain, name); if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - engine, info.outerScript(cx), stub); - if (newStub) { + engine, info.outerScript(cx), stub, + &attached); + if (newStub) JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; - } } + if (!attached) + stub->state().trackNotAttached(); } static_assert(JSOP_GETGNAME_LENGTH == JSOP_GETNAME_LENGTH, @@ -1518,18 +1512,19 @@ DoSetPropFallback(JSContext* cx, BaselineFrame* frame, ICSetProp_Fallback* stub_ bool isTemporarilyUnoptimizable = false; bool attached = false; - if (stub->numOptimizedStubs() < ICSetProp_Fallback::MAX_OPTIMIZED_STUBS && - !JitOptions.disableCacheIR) - { + if (stub->state().maybeTransition()) + stub->discardStubs(cx); + + if (stub->state().canAttachStub()) { RootedValue idVal(cx, StringValue(name)); - SetPropIRGenerator gen(cx, script, pc, CacheKind::SetProp, &isTemporarilyUnoptimizable, - lhs, idVal, rhs); + SetPropIRGenerator gen(cx, script, pc, CacheKind::SetProp, stub->state().mode(), + &isTemporarilyUnoptimizable, lhs, idVal, rhs); if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ICStubEngine::Baseline, frame->script(), stub); + ICStubEngine::Baseline, frame->script(), + stub, &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; SetUpdateStubData(newStub->toCacheIR_Updated(), gen.typeCheckInfo()); @@ -1583,24 +1578,23 @@ DoSetPropFallback(JSContext* cx, BaselineFrame* frame, ICSetProp_Fallback* stub_ if (stub.invalid()) return true; - if (!attached && - stub->numOptimizedStubs() < ICSetProp_Fallback::MAX_OPTIMIZED_STUBS && - !JitOptions.disableCacheIR) - { + if (!attached && stub->state().canAttachStub()) { RootedValue idVal(cx, StringValue(name)); - SetPropIRGenerator gen(cx, script, pc, CacheKind::SetProp, &isTemporarilyUnoptimizable, - lhs, idVal, rhs); + SetPropIRGenerator gen(cx, script, pc, CacheKind::SetProp, stub->state().mode(), + &isTemporarilyUnoptimizable, lhs, idVal, rhs); if (gen.tryAttachAddSlotStub(oldGroup, oldShape)) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ICStubEngine::Baseline, frame->script(), stub); + ICStubEngine::Baseline, frame->script(), + stub, &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; SetUpdateStubData(newStub->toCacheIR_Updated(), gen.typeCheckInfo()); } } else { gen.trackNotAttached(); } + if (!attached && !isTemporarilyUnoptimizable) + stub->state().trackNotAttached(); } if (!attached && !isTemporarilyUnoptimizable) diff --git a/js/src/jit/BaselineIC.h b/js/src/jit/BaselineIC.h index efd59985f3e6..e200aaf65594 100644 --- a/js/src/jit/BaselineIC.h +++ b/js/src/jit/BaselineIC.h @@ -376,8 +376,6 @@ class ICGetElem_Fallback : public ICMonitoredFallbackStub static const uint16_t EXTRA_UNOPTIMIZABLE_ACCESS = 0x4; public: - static const uint32_t MAX_OPTIMIZED_STUBS = 16; - void noteNonNativeAccess() { extra_ |= EXTRA_NON_NATIVE; } @@ -435,8 +433,6 @@ class ICSetElem_Fallback : public ICFallbackStub static const size_t HasTypedArrayOOBFlag = 0x2; public: - static const uint32_t MAX_OPTIMIZED_STUBS = 8; - void noteHasDenseAdd() { extra_ |= HasDenseAddFlag; } bool hasDenseAdd() const { return extra_ & HasDenseAddFlag; } @@ -470,8 +466,6 @@ class ICIn_Fallback : public ICFallbackStub { } public: - static const uint32_t MAX_OPTIMIZED_STUBS = 8; - class Compiler : public ICStubCompiler { protected: MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm); @@ -500,7 +494,6 @@ class ICGetName_Fallback : public ICMonitoredFallbackStub { } public: - static const uint32_t MAX_OPTIMIZED_STUBS = 8; static const size_t UNOPTIMIZABLE_ACCESS_BIT = 0; void noteUnoptimizableAccess() { @@ -634,8 +627,6 @@ class ICSetProp_Fallback : public ICFallbackStub { } public: - static const uint32_t MAX_OPTIMIZED_STUBS = 8; - static const size_t UNOPTIMIZABLE_ACCESS_BIT = 0; void noteUnoptimizableAccess() { extra_ |= (1u << UNOPTIMIZABLE_ACCESS_BIT); diff --git a/js/src/jit/BaselineInspector.cpp b/js/src/jit/BaselineInspector.cpp index 7485585db3fa..8161dd68dca5 100644 --- a/js/src/jit/BaselineInspector.cpp +++ b/js/src/jit/BaselineInspector.cpp @@ -1018,6 +1018,87 @@ BaselineInspector::commonGetPropFunction(jsbytecode* pc, bool innerized, return true; } +static JSFunction* +GetMegamorphicGetterSetterFunction(ICStub* stub, const CacheIRStubInfo* stubInfo, bool isGetter) +{ + // We match: + // + // GuardIsObject objId + // GuardHasGetterSetter objId propShape + // + // propShape has the getter/setter we're interested in. + + CacheIRReader reader(stubInfo); + + ObjOperandId objId = ObjOperandId(0); + if (!reader.matchOp(CacheOp::GuardIsObject, objId)) + return nullptr; + + if (!reader.matchOp(CacheOp::GuardHasGetterSetter, objId)) + return nullptr; + Shape* propShape = stubInfo->getStubField(stub, reader.stubOffset()); + + JSObject* obj = isGetter ? propShape->getterObject() : propShape->setterObject(); + return &obj->as(); +} + +bool +BaselineInspector::megamorphicGetterSetterFunction(jsbytecode* pc, bool isGetter, + JSFunction** getterOrSetter) +{ + if (!hasBaselineScript()) + return false; + + *getterOrSetter = nullptr; + const ICEntry& entry = icEntryFromPC(pc); + + for (ICStub* stub = entry.firstStub(); stub; stub = stub->next()) { + if (stub->isCacheIR_Monitored()) { + MOZ_ASSERT(isGetter); + JSFunction* getter = + GetMegamorphicGetterSetterFunction(stub, + stub->toCacheIR_Monitored()->stubInfo(), + isGetter); + if (!getter || (*getterOrSetter && *getterOrSetter != getter)) + return false; + *getterOrSetter = getter; + continue; + } + if (stub->isCacheIR_Updated()) { + MOZ_ASSERT(!isGetter); + JSFunction* setter = + GetMegamorphicGetterSetterFunction(stub, + stub->toCacheIR_Updated()->stubInfo(), + isGetter); + if (!setter || (*getterOrSetter && *getterOrSetter != setter)) + return false; + *getterOrSetter = setter; + continue; + } + if (stub->isGetProp_Fallback()) { + if (stub->toGetProp_Fallback()->hadUnoptimizableAccess()) + return false; + if (stub->toGetProp_Fallback()->state().mode() != ICState::Mode::Megamorphic) + return false; + continue; + } + if (stub->isSetProp_Fallback()) { + if (stub->toSetProp_Fallback()->hadUnoptimizableAccess()) + return false; + if (stub->toSetProp_Fallback()->state().mode() != ICState::Mode::Megamorphic) + return false; + continue; + } + + return false; + } + + if (!*getterOrSetter) + return false; + + return true; +} + static bool AddCacheIRSetPropFunction(ICCacheIR_Updated* stub, JSObject** holder, Shape** holderShape, JSFunction** commonSetter, bool* isOwnProperty, @@ -1187,9 +1268,6 @@ BaselineInspector::expectedPropertyAccessInputType(jsbytecode* pc) return MIRType::Value; continue; - case ICStub::GetProp_Generic: - return MIRType::Value; - case ICStub::CacheIR_Monitored: stubType = GetCacheIRExpectedInputType(stub->toCacheIR_Monitored()); if (stubType == MIRType::Value) diff --git a/js/src/jit/BaselineInspector.h b/js/src/jit/BaselineInspector.h index a1bc6153f3e4..04c1c598ecff 100644 --- a/js/src/jit/BaselineInspector.h +++ b/js/src/jit/BaselineInspector.h @@ -137,6 +137,9 @@ class BaselineInspector bool* isOwnProperty, ReceiverVector& receivers, ObjectGroupVector& convertUnboxedGroups); + MOZ_MUST_USE bool megamorphicGetterSetterFunction(jsbytecode* pc, bool isGetter, + JSFunction** getterOrSetter); + MOZ_MUST_USE bool commonSetPropFunction(jsbytecode* pc, JSObject** holder, Shape** holderShape, JSFunction** commonSetter, bool* isOwnProperty, ReceiverVector& receivers, diff --git a/js/src/jit/CacheIR.cpp b/js/src/jit/CacheIR.cpp index be13fe23f669..aef1ff2c6f2d 100644 --- a/js/src/jit/CacheIR.cpp +++ b/js/src/jit/CacheIR.cpp @@ -31,19 +31,21 @@ const char* js::jit::CacheKindNames[] = { }; -IRGenerator::IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind) +IRGenerator::IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind, + ICState::Mode mode) : writer(cx), cx_(cx), script_(script), pc_(pc), - cacheKind_(cacheKind) + cacheKind_(cacheKind), + mode_(mode) {} GetPropIRGenerator::GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, - CacheKind cacheKind, bool* isTemporarilyUnoptimizable, - HandleValue val, HandleValue idVal, - CanAttachGetter canAttachGetter) - : IRGenerator(cx, script, pc, cacheKind), + CacheKind cacheKind, ICState::Mode mode, + bool* isTemporarilyUnoptimizable, HandleValue val, + HandleValue idVal, CanAttachGetter canAttachGetter) + : IRGenerator(cx, script, pc, cacheKind, mode), val_(val), idVal_(idVal), isTemporarilyUnoptimizable_(isTemporarilyUnoptimizable), @@ -505,22 +507,49 @@ EmitCallGetterResultNoGuards(CacheIRWriter& writer, JSObject* obj, JSObject* hol static void EmitCallGetterResult(CacheIRWriter& writer, JSObject* obj, JSObject* holder, - Shape* shape, ObjOperandId objId) + Shape* shape, ObjOperandId objId, ICState::Mode mode) { - Maybe expandoId; - TestMatchingReceiver(writer, obj, shape, objId, &expandoId); + // Use the megamorphic guard if we're in megamorphic mode, except if |obj| + // is a Window as GuardHasGetterSetter doesn't support this yet (Window may + // require outerizing). + if (mode == ICState::Mode::Specialized || IsWindow(obj)) { + Maybe expandoId; + TestMatchingReceiver(writer, obj, shape, objId, &expandoId); - if (obj != holder) { - GeneratePrototypeGuards(writer, obj, holder, objId); + if (obj != holder) { + GeneratePrototypeGuards(writer, obj, holder, objId); - // Guard on the holder's shape. - ObjOperandId holderId = writer.loadObject(holder); - writer.guardShape(holderId, holder->as().lastProperty()); + // Guard on the holder's shape. + ObjOperandId holderId = writer.loadObject(holder); + writer.guardShape(holderId, holder->as().lastProperty()); + } + } else { + writer.guardHasGetterSetter(objId, shape); } EmitCallGetterResultNoGuards(writer, obj, holder, shape, objId); } +void +GetPropIRGenerator::attachMegamorphicNativeSlot(ObjOperandId objId, jsid id, bool handleMissing) +{ + MOZ_ASSERT(mode_ == ICState::Mode::Megamorphic); + + // The stub handles the missing-properties case only if we're seeing one + // now, to make sure Ion ICs correctly monitor the undefined type. + + if (cacheKind_ == CacheKind::GetProp) { + writer.megamorphicLoadSlotResult(objId, JSID_TO_ATOM(id)->asPropertyName(), + handleMissing); + } else { + MOZ_ASSERT(cacheKind_ == CacheKind::GetElem); + writer.megamorphicLoadSlotByValueResult(objId, getElemKeyValueId(), handleMissing); + } + writer.typeMonitorResult(); + + trackAttached("MegamorphicNativeSlot"); +} + bool GetPropIRGenerator::tryAttachNative(HandleObject obj, ObjOperandId objId, HandleId id) { @@ -536,6 +565,11 @@ GetPropIRGenerator::tryAttachNative(HandleObject obj, ObjOperandId objId, Handle case CanAttachNone: return false; case CanAttachReadSlot: + if (mode_ == ICState::Mode::Megamorphic) { + attachMegamorphicNativeSlot(objId, id, holder == nullptr); + return true; + } + maybeEmitIdGuard(id); if (holder) { EnsureTrackPropertyTypes(cx_, holder, id); @@ -554,7 +588,7 @@ GetPropIRGenerator::tryAttachNative(HandleObject obj, ObjOperandId objId, Handle return true; case CanAttachCallGetter: maybeEmitIdGuard(id); - EmitCallGetterResult(writer, obj, holder, shape, objId); + EmitCallGetterResult(writer, obj, holder, shape, objId, mode_); trackAttached("NativeGetter"); return true; @@ -572,6 +606,11 @@ GetPropIRGenerator::tryAttachWindowProxy(HandleObject obj, ObjOperandId objId, H if (!IsWindowProxy(obj)) return false; + // If we're megamorphic prefer a generic proxy stub that handles a lot more + // cases. + if (mode_ == ICState::Mode::Megamorphic) + return false; + // This must be a WindowProxy for the current Window/global. Else it would // be a cross-compartment wrapper and IsWindowProxy returns false for // those. @@ -617,7 +656,7 @@ GetPropIRGenerator::tryAttachWindowProxy(HandleObject obj, ObjOperandId objId, H maybeEmitIdGuard(id); writer.guardClass(objId, GuardClassKind::WindowProxy); ObjOperandId windowObjId = writer.loadObject(windowObj); - EmitCallGetterResult(writer, windowObj, holder, shape, windowObjId); + EmitCallGetterResult(writer, windowObj, holder, shape, windowObjId, mode_); trackAttached("WindowProxyGetter"); return true; @@ -636,6 +675,11 @@ GetPropIRGenerator::tryAttachCrossCompartmentWrapper(HandleObject obj, ObjOperan if (!IsWrapper(obj) || Wrapper::wrapperHandler(obj) != &CrossCompartmentWrapper::singleton) return false; + // If we're megamorphic prefer a generic proxy stub that handles a lot more + // cases. + if (mode_ == ICState::Mode::Megamorphic) + return false; + RootedObject unwrapped(cx_, Wrapper::wrappedObject(obj)); MOZ_ASSERT(unwrapped == UnwrapOneChecked(obj)); @@ -700,23 +744,26 @@ GetPropIRGenerator::tryAttachCrossCompartmentWrapper(HandleObject obj, ObjOperan } bool -GetPropIRGenerator::tryAttachGenericProxy(HandleObject obj, ObjOperandId objId, HandleId id) +GetPropIRGenerator::tryAttachGenericProxy(HandleObject obj, ObjOperandId objId, HandleId id, + bool handleDOMProxies) { MOZ_ASSERT(obj->is()); writer.guardIsProxy(objId); - // Ensure that the incoming object is not a DOM proxy, so that we can get to - // the specialized stubs - writer.guardNotDOMProxy(objId); + if (!handleDOMProxies) { + // Ensure that the incoming object is not a DOM proxy, so that we can get to + // the specialized stubs + writer.guardNotDOMProxy(objId); + } - if (cacheKind_ == CacheKind::GetProp) { + if (cacheKind_ == CacheKind::GetProp || mode_ == ICState::Mode::Specialized) { + maybeEmitIdGuard(id); writer.callProxyGetResult(objId, id); } else { - // We could call maybeEmitIdGuard here and then emit CallProxyGetResult, - // but for GetElem we prefer to attach a stub that can handle any Value - // so we don't attach a new stub for every id. + // Attach a stub that handles every id. MOZ_ASSERT(cacheKind_ == CacheKind::GetElem); + MOZ_ASSERT(mode_ == ICState::Mode::Megamorphic); writer.callProxyGetByValueResult(objId, getElemKeyValueId()); } @@ -898,9 +945,16 @@ GetPropIRGenerator::tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId o bool GetPropIRGenerator::tryAttachProxy(HandleObject obj, ObjOperandId objId, HandleId id) { - switch (GetProxyStubType(cx_, obj, id)) { - case ProxyStubType::None: + ProxyStubType type = GetProxyStubType(cx_, obj, id); + if (type == ProxyStubType::None) return false; + + if (mode_ == ICState::Mode::Megamorphic) + return tryAttachGenericProxy(obj, objId, id, /* handleDOMProxies = */ true); + + switch (type) { + case ProxyStubType::None: + break; case ProxyStubType::DOMExpando: if (tryAttachDOMProxyExpando(obj, objId, id)) return true; @@ -912,9 +966,15 @@ GetPropIRGenerator::tryAttachProxy(HandleObject obj, ObjOperandId objId, HandleI case ProxyStubType::DOMShadowed: return tryAttachDOMProxyShadowed(obj, objId, id); case ProxyStubType::DOMUnshadowed: - return tryAttachDOMProxyUnshadowed(obj, objId, id); + if (tryAttachDOMProxyUnshadowed(obj, objId, id)) + return true; + if (*isTemporarilyUnoptimizable_) { + // Scripted getter without JIT code. Just wait. + return false; + } + return tryAttachGenericProxy(obj, objId, id, /* handleDOMProxies = */ true); case ProxyStubType::Generic: - return tryAttachGenericProxy(obj, objId, id); + return tryAttachGenericProxy(obj, objId, id, /* handleDOMProxies = */ false); } MOZ_CRASH("Unexpected ProxyStubType"); @@ -1530,8 +1590,9 @@ SetPropIRGenerator::maybeEmitIdGuard(jsid id) } GetNameIRGenerator::GetNameIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, - HandleObject env, HandlePropertyName name) - : IRGenerator(cx, script, pc, CacheKind::GetName), + ICState::Mode mode, HandleObject env, + HandlePropertyName name) + : IRGenerator(cx, script, pc, CacheKind::GetName, mode), env_(env), name_(name) {} @@ -1751,8 +1812,8 @@ GetNameIRGenerator::tryAttachEnvironmentName(ObjOperandId objId, HandleId id) } InIRGenerator::InIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, - HandleValue key, HandleObject obj) - : IRGenerator(cx, script, pc, CacheKind::In), + ICState::Mode mode, HandleValue key, HandleObject obj) + : IRGenerator(cx, script, pc, CacheKind::In, mode), key_(key), obj_(obj) { } @@ -1955,10 +2016,11 @@ IRGenerator::maybeGuardInt32Index(const Value& index, ValOperandId indexId, } SetPropIRGenerator::SetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, - CacheKind cacheKind, bool* isTemporarilyUnoptimizable, + CacheKind cacheKind, ICState::Mode mode, + bool* isTemporarilyUnoptimizable, HandleValue lhsVal, HandleValue idVal, HandleValue rhsVal, bool needsTypeBarrier, bool maybeHasExtraIndexedProps) - : IRGenerator(cx, script, pc, cacheKind), + : IRGenerator(cx, script, pc, cacheKind, mode), lhsVal_(lhsVal), idVal_(idVal), rhsVal_(rhsVal), @@ -2093,6 +2155,16 @@ SetPropIRGenerator::tryAttachNativeSetSlot(HandleObject obj, ObjOperandId objId, return false; } + if (mode_ == ICState::Mode::Megamorphic && + cacheKind_ == CacheKind::SetProp && + !IsPreliminaryObject(obj)) + { + writer.megamorphicStoreSlot(objId, JSID_TO_ATOM(id)->asPropertyName(), rhsId); + writer.returnFromIC(); + trackAttached("MegamorphicNativeSlot"); + return true; + } + maybeEmitIdGuard(id); // If we need a property type barrier (always in Baseline, sometimes in @@ -2333,15 +2405,22 @@ SetPropIRGenerator::tryAttachSetter(HandleObject obj, ObjOperandId objId, Handle maybeEmitIdGuard(id); - Maybe expandoId; - TestMatchingReceiver(writer, obj, propShape, objId, &expandoId); + // Use the megamorphic guard if we're in megamorphic mode, except if |obj| + // is a Window as GuardHasGetterSetter doesn't support this yet (Window may + // require outerizing). + if (mode_ == ICState::Mode::Specialized || IsWindow(obj)) { + Maybe expandoId; + TestMatchingReceiver(writer, obj, propShape, objId, &expandoId); - if (obj != holder) { - GeneratePrototypeGuards(writer, obj, holder, objId); + if (obj != holder) { + GeneratePrototypeGuards(writer, obj, holder, objId); - // Guard on the holder's shape. - ObjOperandId holderId = writer.loadObject(holder); - writer.guardShape(holderId, holder->as().lastProperty()); + // Guard on the holder's shape. + ObjOperandId holderId = writer.loadObject(holder); + writer.guardShape(holderId, holder->as().lastProperty()); + } + } else { + writer.guardHasGetterSetter(objId, propShape); } EmitCallSetterNoGuards(writer, obj, holder, propShape, objId, rhsId); @@ -2654,13 +2733,13 @@ SetPropIRGenerator::tryAttachGenericProxy(HandleObject obj, ObjOperandId objId, writer.guardNotDOMProxy(objId); } - if (cacheKind_ == CacheKind::SetProp) { + if (cacheKind_ == CacheKind::SetProp || mode_ == ICState::Mode::Specialized) { + maybeEmitIdGuard(id); writer.callProxySet(objId, id, rhsId, IsStrictSetPC(pc_)); } else { - // We could call maybeEmitIdGuard here and then emit CallProxySet, but - // for SetElem we prefer to attach a stub that can handle any Value - // so we don't attach a new stub for every id. + // Attach a stub that handles every id. MOZ_ASSERT(cacheKind_ == CacheKind::SetElem); + MOZ_ASSERT(mode_ == ICState::Mode::Megamorphic); writer.callProxySetByValue(objId, setElemKeyValueId(), rhsId, IsStrictSetPC(pc_)); } @@ -2732,15 +2811,26 @@ SetPropIRGenerator::tryAttachProxy(HandleObject obj, ObjOperandId objId, HandleI // Don't attach a proxy stub for ops like JSOP_INITELEM. MOZ_ASSERT(IsPropertySetOp(JSOp(*pc_))); - switch (GetProxyStubType(cx_, obj, id)) { - case ProxyStubType::None: + ProxyStubType type = GetProxyStubType(cx_, obj, id); + if (type == ProxyStubType::None) return false; + + if (mode_ == ICState::Mode::Megamorphic) + return tryAttachGenericProxy(obj, objId, id, rhsId, /* handleDOMProxies = */ true); + + switch (type) { + case ProxyStubType::None: + break; case ProxyStubType::DOMExpando: case ProxyStubType::DOMShadowed: return tryAttachDOMProxyShadowed(obj, objId, id, rhsId); case ProxyStubType::DOMUnshadowed: if (tryAttachDOMProxyUnshadowed(obj, objId, id, rhsId)) return true; + if (*isTemporarilyUnoptimizable_) { + // Scripted setter without JIT code. Just wait. + return false; + } return tryAttachGenericProxy(obj, objId, id, rhsId, /* handleDOMProxies = */ true); case ProxyStubType::Generic: return tryAttachGenericProxy(obj, objId, id, rhsId, /* handleDOMProxies = */ false); diff --git a/js/src/jit/CacheIR.h b/js/src/jit/CacheIR.h index 9a89b1fa6588..da0a9a3e6e65 100644 --- a/js/src/jit/CacheIR.h +++ b/js/src/jit/CacheIR.h @@ -13,6 +13,7 @@ #include "gc/Rooting.h" #include "jit/CompactBuffer.h" +#include "jit/ICState.h" #include "jit/SharedIC.h" namespace js { @@ -174,11 +175,16 @@ extern const char* CacheKindNames[]; _(GuardNoUnboxedExpando) \ _(GuardAndLoadUnboxedExpando) \ _(GuardAndGetIndexFromString) \ + _(GuardHasGetterSetter) \ _(LoadObject) \ _(LoadProto) \ _(LoadEnclosingEnvironment) \ _(LoadWrapperTarget) \ \ + _(MegamorphicLoadSlotResult) \ + _(MegamorphicLoadSlotByValueResult) \ + _(MegamorphicStoreSlot) \ + \ /* See CacheIR.cpp 'DOM proxies' comment. */ \ _(LoadDOMExpandoValue) \ _(LoadDOMExpandoValueGuardGeneration) \ @@ -417,7 +423,7 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter return stubDataSize_; } void copyStubData(uint8_t* dest) const; - bool stubDataEqualsMaybeUpdate(uint8_t* stubData) const; + bool stubDataEqualsMaybeUpdate(uint8_t* stubData, bool* updated) const; bool operandIsDead(uint32_t operandId, uint32_t currentInstruction) const { if (operandId >= operandLastUsed_.length()) @@ -535,6 +541,11 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter return res; } + void guardHasGetterSetter(ObjOperandId obj, Shape* shape) { + writeOpWithOperandId(CacheOp::GuardHasGetterSetter, obj); + addStubField(uintptr_t(shape), StubField::Type::Shape); + } + void loadFrameCalleeResult() { writeOp(CacheOp::LoadFrameCalleeResult); } @@ -748,6 +759,22 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter buffer_.writeByte(uint32_t(strict)); } + void megamorphicLoadSlotResult(ObjOperandId obj, PropertyName* name, bool handleMissing) { + writeOpWithOperandId(CacheOp::MegamorphicLoadSlotResult, obj); + addStubField(uintptr_t(name), StubField::Type::String); + buffer_.writeByte(uint32_t(handleMissing)); + } + void megamorphicLoadSlotByValueResult(ObjOperandId obj, ValOperandId id, bool handleMissing) { + writeOpWithOperandId(CacheOp::MegamorphicLoadSlotByValueResult, obj); + writeOperandId(id); + buffer_.writeByte(uint32_t(handleMissing)); + } + void megamorphicStoreSlot(ObjOperandId obj, PropertyName* name, ValOperandId rhs) { + writeOpWithOperandId(CacheOp::MegamorphicStoreSlot, obj); + addStubField(uintptr_t(name), StubField::Type::String); + writeOperandId(rhs); + } + void loadBooleanResult(bool val) { writeOp(CacheOp::LoadBooleanResult); buffer_.writeByte(uint32_t(val)); @@ -945,6 +972,7 @@ class MOZ_RAII IRGenerator HandleScript script_; jsbytecode* pc_; CacheKind cacheKind_; + ICState::Mode mode_; IRGenerator(const IRGenerator&) = delete; IRGenerator& operator=(const IRGenerator&) = delete; @@ -957,7 +985,8 @@ class MOZ_RAII IRGenerator friend class CacheIRSpewer; public: - explicit IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind); + explicit IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind, + ICState::Mode mode); const CacheIRWriter& writerRef() const { return writer; } CacheKind cacheKind() const { return cacheKind_; } @@ -986,7 +1015,8 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator bool tryAttachCrossCompartmentWrapper(HandleObject obj, ObjOperandId objId, HandleId id); bool tryAttachFunction(HandleObject obj, ObjOperandId objId, HandleId id); - bool tryAttachGenericProxy(HandleObject obj, ObjOperandId objId, HandleId id); + bool tryAttachGenericProxy(HandleObject obj, ObjOperandId objId, HandleId id, + bool handleDOMProxies); bool tryAttachDOMProxyExpando(HandleObject obj, ObjOperandId objId, HandleId id); bool tryAttachDOMProxyShadowed(HandleObject obj, ObjOperandId objId, HandleId id); bool tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId objId, HandleId id); @@ -1012,6 +1042,8 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator bool tryAttachProxyElement(HandleObject obj, ObjOperandId objId); + void attachMegamorphicNativeSlot(ObjOperandId objId, jsid id, bool handleMissing); + ValOperandId getElemKeyValueId() const { MOZ_ASSERT(cacheKind_ == CacheKind::GetElem); return ValOperandId(1); @@ -1030,8 +1062,8 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator public: GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind, - bool* isTemporarilyUnoptimizable, HandleValue val,HandleValue idVal, - CanAttachGetter canAttachGetter); + ICState::Mode mode, bool* isTemporarilyUnoptimizable, HandleValue val, + HandleValue idVal, CanAttachGetter canAttachGetter); bool tryAttachStub(); bool tryAttachIdempotentStub(); @@ -1055,7 +1087,7 @@ class MOZ_RAII GetNameIRGenerator : public IRGenerator bool tryAttachEnvironmentName(ObjOperandId objId, HandleId id); public: - GetNameIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, + GetNameIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, ICState::Mode mode, HandleObject env, HandlePropertyName name); bool tryAttachStub(); @@ -1159,8 +1191,8 @@ class MOZ_RAII SetPropIRGenerator : public IRGenerator public: SetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind, - bool* isTemporarilyUnoptimizable, HandleValue lhsVal, HandleValue idVal, - HandleValue rhsVal, bool needsTypeBarrier = true, + ICState::Mode mode, bool* isTemporarilyUnoptimizable, HandleValue lhsVal, + HandleValue idVal, HandleValue rhsVal, bool needsTypeBarrier = true, bool maybeHasExtraIndexedProps = true); bool tryAttachStub(); @@ -1202,7 +1234,8 @@ class MOZ_RAII InIRGenerator : public IRGenerator void trackNotAttached(); public: - InIRGenerator(JSContext* cx, HandleScript, jsbytecode* pc, HandleValue key, HandleObject obj); + InIRGenerator(JSContext* cx, HandleScript, jsbytecode* pc, ICState::Mode mode, HandleValue key, + HandleObject obj); bool tryAttachStub(); }; diff --git a/js/src/jit/CacheIRCompiler.cpp b/js/src/jit/CacheIRCompiler.cpp index b41b475e7f75..cdab525cc8db 100644 --- a/js/src/jit/CacheIRCompiler.cpp +++ b/js/src/jit/CacheIRCompiler.cpp @@ -961,10 +961,11 @@ template void jit::TraceCacheIRStub(JSTracer* trc, IonICStub* stub, const CacheIRStubInfo* stubInfo); bool -CacheIRWriter::stubDataEqualsMaybeUpdate(uint8_t* stubData) const +CacheIRWriter::stubDataEqualsMaybeUpdate(uint8_t* stubData, bool* updated) const { MOZ_ASSERT(!failed()); + *updated = false; const uintptr_t* stubDataWords = reinterpret_cast(stubData); // If DOMExpandoGeneration fields are different but all other stub fields @@ -990,8 +991,10 @@ CacheIRWriter::stubDataEqualsMaybeUpdate(uint8_t* stubData) const stubDataWords += sizeof(uint64_t) / sizeof(uintptr_t); } - if (expandoGenerationIsDifferent) + if (expandoGenerationIsDifferent) { copyStubData(stubData); + *updated = true; + } return true; } @@ -2202,3 +2205,55 @@ CacheIRCompiler::emitWrapResult() masm.bind(&done); return true; } + +bool +CacheIRCompiler::emitMegamorphicLoadSlotByValueResult() +{ + AutoOutputRegister output(*this); + + Register obj = allocator.useRegister(masm, reader.objOperandId()); + ValueOperand idVal = allocator.useValueRegister(masm, reader.valOperandId()); + bool handleMissing = reader.readBool(); + + AutoScratchRegisterMaybeOutput scratch(allocator, masm, output); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + // idVal will be in vp[0], result will be stored in vp[1]. + masm.reserveStack(sizeof(Value)); + masm.Push(idVal); + masm.moveStackPtrTo(idVal.scratchReg()); + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch); + volatileRegs.takeUnchecked(idVal); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch); + masm.loadJSContext(scratch); + masm.passABIArg(scratch); + masm.passABIArg(obj); + masm.passABIArg(idVal.scratchReg()); + if (handleMissing) + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataPropertyByValue))); + else + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataPropertyByValue))); + masm.mov(ReturnReg, scratch); + masm.PopRegsInMask(volatileRegs); + + masm.Pop(idVal); + + Label ok; + uint32_t framePushed = masm.framePushed(); + masm.branchIfTrueBool(scratch, &ok); + masm.adjustStack(sizeof(Value)); + masm.jump(failure->label()); + + masm.bind(&ok); + masm.setFramePushed(framePushed); + masm.loadTypedOrValue(Address(masm.getStackPointer(), 0), output); + masm.adjustStack(sizeof(Value)); + return true; +} diff --git a/js/src/jit/CacheIRCompiler.h b/js/src/jit/CacheIRCompiler.h index 0c96f75337f2..f0e415772545 100644 --- a/js/src/jit/CacheIRCompiler.h +++ b/js/src/jit/CacheIRCompiler.h @@ -51,6 +51,7 @@ namespace jit { _(LoadDenseElementHoleExistsResult) \ _(LoadUnboxedArrayElementResult) \ _(LoadTypedElementResult) \ + _(MegamorphicLoadSlotByValueResult) \ _(WrapResult) // Represents a Value on the Baseline frame's expression stack. Slot 0 is the diff --git a/js/src/jit/ICState.h b/js/src/jit/ICState.h new file mode 100644 index 000000000000..01b52f8f7000 --- /dev/null +++ b/js/src/jit/ICState.h @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * 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 jit_ICState_h +#define jit_ICState_h + +#include "jit/JitOptions.h" + +namespace js { +namespace jit { + +// ICState stores information about a Baseline or Ion IC. +class ICState +{ + public: + // When we attach the maximum number of stubs, we discard all stubs and + // transition the IC to Megamorphic to attach stubs that are more generic + // (handle more cases). If we again attach the maximum number of stubs, we + // transition to Generic and (depending on the IC) will either attach a + // single stub that handles everything or stop attaching new stubs. + // + // We also transition to Generic when we repeatedly fail to attach a stub, + // to avoid wasting time trying. + enum class Mode : uint8_t { Specialized = 0, Megamorphic, Generic }; + + private: + Mode mode_; + + // Number of optimized stubs currently attached to this IC. + uint8_t numOptimizedStubs_; + + // Number of times we failed to attach a stub. + uint8_t numFailures_; + + // This is only used for shared Baseline ICs and stored here to save space. + bool invalid_ : 1; + + static const size_t MaxOptimizedStubs = 6; + + void transition(Mode mode) { + MOZ_ASSERT(mode > mode_); + mode_ = mode; + numFailures_ = 0; + } + + MOZ_ALWAYS_INLINE size_t maxFailures() const { + // Allow more failures if we attached stubs. + static_assert(MaxOptimizedStubs == 6, + "numFailures_/maxFailures should fit in uint8_t"); + size_t res = 5 + size_t(40) * numOptimizedStubs_; + MOZ_ASSERT(res <= UINT8_MAX, "numFailures_ should not overflow"); + return res; + } + + public: + ICState() + : invalid_(false) + { + reset(); + } + + Mode mode() const { return mode_; } + size_t numOptimizedStubs() const { return numOptimizedStubs_; } + + MOZ_ALWAYS_INLINE bool canAttachStub() const { + MOZ_ASSERT(numOptimizedStubs_ <= MaxOptimizedStubs); + if (mode_ == Mode::Generic || JitOptions.disableCacheIR) + return false; + return true; + } + + bool invalid() const { return invalid_; } + void setInvalid() { invalid_ = true; } + + // If this returns true, we transitioned to a new mode and the caller + // should discard all stubs. + MOZ_MUST_USE MOZ_ALWAYS_INLINE bool maybeTransition() { + MOZ_ASSERT(numOptimizedStubs_ <= MaxOptimizedStubs); + if (mode_ == Mode::Generic) + return false; + if (numOptimizedStubs_ < MaxOptimizedStubs && numFailures_ < maxFailures()) + return false; + if (numFailures_ == maxFailures() || mode_ == Mode::Megamorphic) { + transition(Mode::Generic); + return true; + } + MOZ_ASSERT(mode_ == Mode::Specialized); + transition(Mode::Megamorphic); + return true; + } + void reset() { + mode_ = Mode::Specialized; + numOptimizedStubs_ = 0; + numFailures_ = 0; + } + void trackAttached() { + // We'd like to assert numOptimizedStubs_ < MaxOptimizedStubs, but + // since this code is also used for non-CacheIR Baseline stubs, assert + // < 16 for now. Note that we do have the stronger assert in other + // methods, because they are only used by CacheIR ICs. + MOZ_ASSERT(numOptimizedStubs_ < 16); + numOptimizedStubs_++; + numFailures_ = 0; + } + void trackNotAttached() { + // Note: we can't assert numFailures_ < maxFailures() because + // maxFailures() depends on numOptimizedStubs_ and it's possible a + // GC discarded stubs before we got here. + numFailures_++; + MOZ_ASSERT(numFailures_ > 0, "numFailures_ should not overflow"); + } + void trackUnlinkedStub() { + MOZ_ASSERT(numOptimizedStubs_ > 0); + numOptimizedStubs_--; + } + void trackUnlinkedAllStubs() { + numOptimizedStubs_ = 0; + } +}; + +} // namespace jit +} // namespace js + +#endif /* jit_ICState_h */ diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index 0180c79377b5..2569f4a6e28b 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -10797,6 +10797,15 @@ IonBuilder::getPropTryCommonGetter(bool* emitted, MDefinition* obj, PropertyName if (!obj) return abort(AbortReason::Alloc); } + } else if (inspector->megamorphicGetterSetterFunction(pc, /* isGetter = */ true, + &commonGetter)) + { + // Try to use TI to guard on this getter. + if (!testCommonGetterSetter(objTypes, name, /* isGetter = */ true, + commonGetter, &guard)) + { + return Ok(); + } } else { // The Baseline IC didn't have any information we can use. return Ok(); @@ -11349,6 +11358,15 @@ IonBuilder::setPropTryCommonSetter(bool* emitted, MDefinition* obj, if (!obj) return abort(AbortReason::Alloc); } + } else if (inspector->megamorphicGetterSetterFunction(pc, /* isGetter = */ false, + &commonSetter)) + { + // Try to use TI to guard on this setter. + if (!testCommonGetterSetter(objTypes, name, /* isGetter = */ false, + commonSetter, &guard)) + { + return Ok(); + } } else { // The Baseline IC didn't have any information we can use. return Ok(); diff --git a/js/src/jit/IonCacheIRCompiler.cpp b/js/src/jit/IonCacheIRCompiler.cpp index 0ec9b84ff600..6eea32c39b57 100644 --- a/js/src/jit/IonCacheIRCompiler.cpp +++ b/js/src/jit/IonCacheIRCompiler.cpp @@ -654,6 +654,126 @@ IonCacheIRCompiler::emitLoadDynamicSlotResult() return true; } +bool +IonCacheIRCompiler::emitMegamorphicLoadSlotResult() +{ + AutoOutputRegister output(*this); + + Register obj = allocator.useRegister(masm, reader.objOperandId()); + PropertyName* name = stringStubField(reader.stubOffset())->asAtom().asPropertyName(); + bool handleMissing = reader.readBool(); + + AutoScratchRegisterMaybeOutput scratch1(allocator, masm, output); + AutoScratchRegister scratch2(allocator, masm); + AutoScratchRegister scratch3(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + masm.Push(UndefinedValue()); + masm.moveStackPtrTo(scratch3.get()); + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + volatileRegs.takeUnchecked(scratch3); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.movePtr(ImmGCPtr(name), scratch2); + masm.passABIArg(scratch2); + masm.passABIArg(scratch3); + if (handleMissing) + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataProperty))); + else + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, (GetNativeDataProperty))); + masm.mov(ReturnReg, scratch2); + masm.PopRegsInMask(volatileRegs); + + masm.loadTypedOrValue(Address(masm.getStackPointer(), 0), output); + masm.adjustStack(sizeof(Value)); + + masm.branchIfFalseBool(scratch2, failure->label()); + return true; +} + +bool +IonCacheIRCompiler::emitMegamorphicStoreSlot() +{ + Register obj = allocator.useRegister(masm, reader.objOperandId()); + PropertyName* name = stringStubField(reader.stubOffset())->asAtom().asPropertyName(); + ValueOperand val = allocator.useValueRegister(masm, reader.valOperandId()); + + AutoScratchRegister scratch1(allocator, masm); + AutoScratchRegister scratch2(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + masm.Push(val); + masm.moveStackPtrTo(val.scratchReg()); + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + volatileRegs.takeUnchecked(val); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.movePtr(ImmGCPtr(name), scratch2); + masm.passABIArg(scratch2); + masm.passABIArg(val.scratchReg()); + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, SetNativeDataProperty)); + masm.mov(ReturnReg, scratch1); + masm.PopRegsInMask(volatileRegs); + + masm.loadValue(Address(masm.getStackPointer(), 0), val); + masm.adjustStack(sizeof(Value)); + + masm.branchIfFalseBool(scratch1, failure->label()); + return true; +} + +bool +IonCacheIRCompiler::emitGuardHasGetterSetter() +{ + Register obj = allocator.useRegister(masm, reader.objOperandId()); + Shape* shape = shapeStubField(reader.stubOffset()); + + AutoScratchRegister scratch1(allocator, masm); + AutoScratchRegister scratch2(allocator, masm); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs()); + volatileRegs.takeUnchecked(scratch1); + volatileRegs.takeUnchecked(scratch2); + masm.PushRegsInMask(volatileRegs); + + masm.setupUnalignedABICall(scratch1); + masm.loadJSContext(scratch1); + masm.passABIArg(scratch1); + masm.passABIArg(obj); + masm.movePtr(ImmGCPtr(shape), scratch2); + masm.passABIArg(scratch2); + masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, ObjectHasGetterSetter)); + masm.mov(ReturnReg, scratch1); + masm.PopRegsInMask(volatileRegs); + + masm.branchIfFalseBool(scratch1, failure->label()); + return true; +} + bool IonCacheIRCompiler::emitCallScriptedGetterResult() { @@ -1766,21 +1886,24 @@ IonCacheIRCompiler::emitLoadDOMExpandoValueGuardGeneration() return true; } -bool +void IonIC::attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind kind, - IonScript* ionScript, const PropertyTypeCheckInfo* typeCheckInfo) + IonScript* ionScript, bool* attached, + const PropertyTypeCheckInfo* typeCheckInfo) { // We shouldn't GC or report OOM (or any other exception) here. AutoAssertNoPendingException aanpe(cx); JS::AutoCheckCannotGC nogc; + MOZ_ASSERT(!*attached); + // SetProp/SetElem stubs must have non-null typeCheckInfo. MOZ_ASSERT(!!typeCheckInfo == (kind == CacheKind::SetProp || kind == CacheKind::SetElem)); // Do nothing if the IR generator failed or triggered a GC that invalidated // the script. if (writer.failed() || ionScript->invalidated()) - return false; + return; JitZone* jitZone = cx->zone()->jitZone(); uint32_t stubDataOffset = sizeof(IonICStub); @@ -1800,11 +1923,11 @@ IonIC::attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind k stubInfo = CacheIRStubInfo::New(kind, ICStubEngine::IonIC, makesGCCalls, stubDataOffset, writer); if (!stubInfo) - return false; + return; CacheIRStubKey key(stubInfo); if (!jitZone->putIonCacheIRStubInfo(lookup, key)) - return false; + return; } MOZ_ASSERT(stubInfo); @@ -1815,9 +1938,16 @@ IonIC::attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind k for (IonICStub* stub = firstStub_; stub; stub = stub->next()) { if (stub->stubInfo() != stubInfo) continue; - if (!writer.stubDataEqualsMaybeUpdate(stub->stubDataStart())) + bool updated = false; + if (!writer.stubDataEqualsMaybeUpdate(stub->stubDataStart(), &updated)) continue; - return true; + if (updated || (typeCheckInfo && typeCheckInfo->needsTypeBarrier())) { + // We updated a stub or have a stub that requires property type + // checks. In this case the stub will likely handle more cases in + // the future and we shouldn't deoptimize. + *attached = true; + } + return; } size_t bytesNeeded = stubInfo->stubDataOffset() + stubInfo->stubDataSize(); @@ -1830,7 +1960,7 @@ IonIC::attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind k ICStubSpace* stubSpace = cx->zone()->jitZone()->optimizedStubSpace(); void* newStubMem = stubSpace->alloc(bytesNeeded); if (!newStubMem) - return false; + return; IonICStub* newStub = new(newStubMem) IonICStub(fallbackLabel_.raw(), stubInfo); writer.copyStubData(newStub->stubDataStart()); @@ -1838,12 +1968,12 @@ IonIC::attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind k JitContext jctx(cx, nullptr); IonCacheIRCompiler compiler(cx, writer, this, ionScript, newStub, typeCheckInfo); if (!compiler.init()) - return false; + return; JitCode* code = compiler.compile(); if (!code) - return false; + return; attachStub(newStub, code); - return true; + *attached = true; } diff --git a/js/src/jit/IonIC.cpp b/js/src/jit/IonIC.cpp index 1fe486058686..15bdbc73aae1 100644 --- a/js/src/jit/IonIC.cpp +++ b/js/src/jit/IonIC.cpp @@ -53,7 +53,7 @@ IonIC::scratchRegisterForEntryJump() } void -IonIC::reset(Zone* zone) +IonIC::discardStubs(Zone* zone) { if (firstStub_ && zone->needsIncrementalBarrier()) { // We are removing edges from IonIC to gcthings. Perform one final trace @@ -72,7 +72,14 @@ IonIC::reset(Zone* zone) firstStub_ = nullptr; codeRaw_ = fallbackLabel_.raw(); - numStubs_ = 0; + state_.trackUnlinkedAllStubs(); +} + +void +IonIC::reset(Zone* zone) +{ + discardStubs(zone); + state_.reset(); } void @@ -107,29 +114,6 @@ IonIC::togglePreBarriers(bool enabled, ReprotectCode reprotect) MOZ_ASSERT(nextCodeRaw == fallbackLabel_.raw()); } -void -IonGetPropertyIC::maybeDisable(Zone* zone, bool attached) -{ - if (attached) { - failedUpdates_ = 0; - return; - } - - if (!canAttachStub() && kind() == CacheKind::GetProp) { - // Don't disable the cache (and discard stubs) if we have a GETPROP and - // attached the maximum number of stubs. This can happen when JS code - // uses an AST-like data structure and accesses a field of a "base - // class", like node.nodeType. This should be temporary until we handle - // this case better, see bug 1107515. - return; - } - - if (++failedUpdates_ > MAX_FAILED_UPDATES) { - JitSpew(JitSpew_IonIC, "Disable inline cache"); - disable(zone); - } -} - /* static */ bool IonGetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonGetPropertyIC* ic, HandleValue val, HandleValue idVal, MutableHandleValue res) @@ -142,24 +126,26 @@ IonGetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonGetProperty if (ic->idempotent()) adi.disable(); + if (ic->state().maybeTransition()) + ic->discardStubs(cx->zone()); + bool attached = false; - if (!JitOptions.disableCacheIR && !ic->disabled()) { - if (ic->canAttachStub()) { - // IonBuilder calls PropertyReadNeedsTypeBarrier to determine if it - // needs a type barrier. Unfortunately, PropertyReadNeedsTypeBarrier - // does not account for getters, so we should only attach a getter - // stub if we inserted a type barrier. - CanAttachGetter canAttachGetter = - ic->monitoredResult() ? CanAttachGetter::Yes : CanAttachGetter::No; - jsbytecode* pc = ic->idempotent() ? nullptr : ic->pc(); - bool isTemporarilyUnoptimizable; - GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), &isTemporarilyUnoptimizable, - val, idVal, canAttachGetter); - if (ic->idempotent() ? gen.tryAttachIdempotentStub() : gen.tryAttachStub()) { - attached = ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), ionScript); - } - } - ic->maybeDisable(cx->zone(), attached); + if (ic->state().canAttachStub()) { + // IonBuilder calls PropertyReadNeedsTypeBarrier to determine if it + // needs a type barrier. Unfortunately, PropertyReadNeedsTypeBarrier + // does not account for getters, so we should only attach a getter + // stub if we inserted a type barrier. + CanAttachGetter canAttachGetter = + ic->monitoredResult() ? CanAttachGetter::Yes : CanAttachGetter::No; + jsbytecode* pc = ic->idempotent() ? nullptr : ic->pc(); + bool isTemporarilyUnoptimizable = false; + GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), ic->state().mode(), + &isTemporarilyUnoptimizable, val, idVal, canAttachGetter); + if (ic->idempotent() ? gen.tryAttachIdempotentStub() : gen.tryAttachStub()) + ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), ionScript, &attached); + + if (!attached && !isTemporarilyUnoptimizable) + ic->state().trackNotAttached(); } if (!attached && ic->idempotent()) { @@ -210,7 +196,12 @@ IonSetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonSetProperty IonScript* ionScript = outerScript->ionScript(); bool attached = false; - if (!JitOptions.disableCacheIR && ic->canAttachStub()) { + bool isTemporarilyUnoptimizable = false; + + if (ic->state().maybeTransition()) + ic->discardStubs(cx->zone()); + + if (ic->state().canAttachStub()) { oldShape = obj->maybeShape(); oldGroup = JSObject::getGroup(cx, obj); if (!oldGroup) @@ -225,11 +216,12 @@ IonSetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonSetProperty RootedScript script(cx, ic->script()); jsbytecode* pc = ic->pc(); bool isTemporarilyUnoptimizable; - SetPropIRGenerator gen(cx, script, pc, ic->kind(), &isTemporarilyUnoptimizable, + SetPropIRGenerator gen(cx, script, pc, ic->kind(), ic->state().mode(), + &isTemporarilyUnoptimizable, objv, idVal, rhs, ic->needsTypeBarrier(), ic->guardHoles()); if (gen.tryAttachStub()) { - attached = ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ionScript, gen.typeCheckInfo()); + ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), ionScript, &attached, + gen.typeCheckInfo()); } } @@ -257,19 +249,22 @@ IonSetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonSetProperty } } - if (!attached && !JitOptions.disableCacheIR && ic->canAttachStub()) { + if (!attached && ic->state().canAttachStub()) { RootedValue objv(cx, ObjectValue(*obj)); RootedScript script(cx, ic->script()); jsbytecode* pc = ic->pc(); - bool isTemporarilyUnoptimizable; - SetPropIRGenerator gen(cx, script, pc, ic->kind(), &isTemporarilyUnoptimizable, + SetPropIRGenerator gen(cx, script, pc, ic->kind(), ic->state().mode(), + &isTemporarilyUnoptimizable, objv, idVal, rhs, ic->needsTypeBarrier(), ic->guardHoles()); if (gen.tryAttachAddSlotStub(oldGroup, oldShape)) { - attached = ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), - ionScript, gen.typeCheckInfo()); + ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), ionScript, &attached, + gen.typeCheckInfo()); } else { gen.trackNotAttached(); } + + if (!attached && !isTemporarilyUnoptimizable) + ic->state().trackNotAttached(); } return true; @@ -284,7 +279,6 @@ IonICStub::stubDataStart() void IonIC::attachStub(IonICStub* newStub, JitCode* code) { - MOZ_ASSERT(canAttachStub()); MOZ_ASSERT(newStub); MOZ_ASSERT(code); @@ -298,5 +292,5 @@ IonIC::attachStub(IonICStub* newStub, JitCode* code) codeRaw_ = code->raw(); } - numStubs_++; + state_.trackAttached(); } diff --git a/js/src/jit/IonIC.h b/js/src/jit/IonIC.h index 07420f7beaed..d3ca3e768d22 100644 --- a/js/src/jit/IonIC.h +++ b/js/src/jit/IonIC.h @@ -79,9 +79,8 @@ class IonIC jsbytecode* pc_; CacheKind kind_; - uint8_t numStubs_; bool idempotent_ : 1; - bool disabled_ : 1; + ICState state_; protected: explicit IonIC(CacheKind kind) @@ -92,9 +91,8 @@ class IonIC script_(nullptr), pc_(nullptr), kind_(kind), - numStubs_(0), idempotent_(false), - disabled_(false) + state_() {} void attachStub(IonICStub* newStub, JitCode* code); @@ -112,20 +110,16 @@ class IonIC CodeLocationLabel rejoinLabel() const { return rejoinLabel_; } - static const size_t MAX_STUBS = 16; - - bool canAttachStub() const { return numStubs_ < MAX_STUBS; } - - void disable(Zone* zone) { - reset(zone); - disabled_ = true; - } - - bool disabled() const { return disabled_; } - // Discard all stubs. + void discardStubs(Zone* zone); + + // Discard all stubs and reset the ICState. void reset(Zone* zone); + ICState& state() { + return state_; + } + void togglePreBarriers(bool enabled, ReprotectCode reprotect); CacheKind kind() const { return kind_; } @@ -154,8 +148,8 @@ class IonIC void trace(JSTracer* trc); - bool attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind kind, - IonScript* ionScript, + void attachCacheIRStub(JSContext* cx, const CacheIRWriter& writer, CacheKind kind, + IonScript* ionScript, bool* attached, const PropertyTypeCheckInfo* typeCheckInfo = nullptr); }; @@ -168,9 +162,6 @@ class IonGetPropertyIC : public IonIC TypedOrValueRegister output_; Register maybeTemp_; // Might be InvalidReg. - static const size_t MAX_FAILED_UPDATES = 16; - uint16_t failedUpdates_; - bool monitoredResult_ : 1; bool allowDoubleResult_ : 1; @@ -184,7 +175,6 @@ class IonGetPropertyIC : public IonIC id_(id), output_(output), maybeTemp_(maybeTemp), - failedUpdates_(0), monitoredResult_(monitoredResult), allowDoubleResult_(allowDoubleResult) { } @@ -197,8 +187,6 @@ class IonGetPropertyIC : public IonIC LiveRegisterSet liveRegs() const { return liveRegs_; } bool allowDoubleResult() const { return allowDoubleResult_; } - void maybeDisable(Zone* zone, bool attached); - static MOZ_MUST_USE bool update(JSContext* cx, HandleScript outerScript, IonGetPropertyIC* ic, HandleValue val, HandleValue idVal, MutableHandleValue res); }; diff --git a/js/src/jit/SharedIC.cpp b/js/src/jit/SharedIC.cpp index 3f1b437ff6c8..6d85b2ed4d82 100644 --- a/js/src/jit/SharedIC.cpp +++ b/js/src/jit/SharedIC.cpp @@ -175,7 +175,6 @@ ICStub::NonCacheIRStubMakesGCCalls(Kind kind) case Call_ScriptedFunCall: case Call_StringSplit: case WarmUpCounter_Fallback: - case GetProp_Generic: case RetSub_Fallback: // These two fallback stubs don't actually make non-tail calls, // but the fallback code for the bailout path needs to pop the stub frame @@ -355,8 +354,7 @@ ICFallbackStub::unlinkStub(Zone* zone, ICStub* prev, ICStub* stub) } } - MOZ_ASSERT(numOptimizedStubs_ > 0); - numOptimizedStubs_--; + state_.trackUnlinkedStub(); if (zone->needsIncrementalBarrier()) { // We are removing edges from ICStub to gcthings. Perform one final trace @@ -392,6 +390,13 @@ ICFallbackStub::unlinkStubsWithKind(JSContext* cx, ICStub::Kind kind) } } +void +ICFallbackStub::discardStubs(JSContext* cx) +{ + for (ICStubIterator iter = beginChain(); !iter.atEnd(); iter++) + iter.unlink(cx); +} + void ICTypeMonitor_Fallback::resetMonitorStubChain(Zone* zone) { @@ -1993,52 +1998,36 @@ DoGetPropFallback(JSContext* cx, BaselineFrame* frame, ICGetProp_Fallback* stub_ op == JSOP_LENGTH || op == JSOP_GETBOUNDNAME); - // Grab our old shape before it goes away. - RootedShape oldShape(cx); - if (val.isObject()) - oldShape = val.toObject().maybeShape(); + RootedPropertyName name(cx, script->getName(pc)); - bool attached = false; // There are some reasons we can fail to attach a stub that are temporary. // We want to avoid calling noteUnoptimizableAccess() if the reason we // failed to attach a stub is one of those temporary reasons, since we might // end up attaching a stub for the exact same access later. bool isTemporarilyUnoptimizable = false; - RootedPropertyName name(cx, script->getName(pc)); + if (stub->state().maybeTransition()) + stub->discardStubs(cx); - // After the Genericstub was added, we should never reach the Fallbackstub again. - MOZ_ASSERT(!stub->hasStub(ICStub::GetProp_Generic)); - - if (stub->numOptimizedStubs() >= ICGetProp_Fallback::MAX_OPTIMIZED_STUBS && !stub.invalid()) { - // Discard all stubs in this IC and replace with generic getprop stub. - for (ICStubIterator iter = stub->beginChain(); !iter.atEnd(); iter++) - iter.unlink(cx); - ICGetProp_Generic::Compiler compiler(cx, stub->fallbackMonitorStub()->firstMonitorStub()); - ICStub* newStub = compiler.getStub(compiler.getStubSpace(script)); - if (!newStub) - return false; - stub->addNewStub(newStub); - attached = true; - } - - if (!attached && !JitOptions.disableCacheIR) { + bool attached = false; + if (stub->state().canAttachStub()) { RootedValue idVal(cx, StringValue(name)); - GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, &isTemporarilyUnoptimizable, - val, idVal, CanAttachGetter::Yes); + GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, stub->state().mode(), + &isTemporarilyUnoptimizable, val, idVal, CanAttachGetter::Yes); if (gen.tryAttachStub()) { ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(), ICStubEngine::Baseline, script, - stub); + stub, &attached); if (newStub) { JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub"); - attached = true; if (gen.shouldNotePreliminaryObjectStub()) newStub->toCacheIR_Monitored()->notePreliminaryObject(); else if (gen.shouldUnlinkPreliminaryObjectStubs()) StripPreliminaryObjectStubs(cx, stub); } } + if (!attached && !isTemporarilyUnoptimizable) + stub->state().trackNotAttached(); } if (!ComputeGetPropResult(cx, frame, op, name, val, res)) @@ -2122,60 +2111,6 @@ ICGetProp_Fallback::Compiler::postGenerateStubCode(MacroAssembler& masm, Handle< } } -/* static */ ICGetProp_Generic* -ICGetProp_Generic::Clone(JSContext* cx, ICStubSpace* space, ICStub* firstMonitorStub, - ICGetProp_Generic& other) -{ - return New(cx, space, other.jitCode(), firstMonitorStub); -} - -static bool -DoGetPropGeneric(JSContext* cx, BaselineFrame* frame, ICGetProp_Generic* stub, - MutableHandleValue val, MutableHandleValue res) -{ - ICFallbackStub* fallback = stub->getChainFallback(); - JSScript* script = frame->script(); - jsbytecode* pc = fallback->icEntry()->pc(script); - JSOp op = JSOp(*pc); - RootedPropertyName name(cx, script->getName(pc)); - return ComputeGetPropResult(cx, frame, op, name, val, res); -} - -typedef bool (*DoGetPropGenericFn)(JSContext*, BaselineFrame*, ICGetProp_Generic*, - MutableHandleValue, MutableHandleValue); -static const VMFunction DoGetPropGenericInfo = - FunctionInfo(DoGetPropGeneric, "DoGetPropGeneric"); - -bool -ICGetProp_Generic::Compiler::generateStubCode(MacroAssembler& masm) -{ - AllocatableGeneralRegisterSet regs(availableGeneralRegs(1)); - - Register scratch = regs.takeAnyExcluding(ICTailCallReg); - - // Sync for the decompiler. - if (engine_ == Engine::Baseline) - EmitStowICValues(masm, 1); - - enterStubFrame(masm, scratch); - - // Push arguments. - masm.Push(R0); - masm.Push(ICStubReg); - PushStubPayload(masm, R0.scratchReg()); - - if (!callVM(DoGetPropGenericInfo, masm)) - return false; - - leaveStubFrame(masm); - - if (engine_ == Engine::Baseline) - EmitUnstowICValues(masm, 1, /* discard = */ true); - - EmitEnterTypeMonitorIC(masm); - return true; -} - void CheckForTypedObjectWithDetachedStorage(JSContext* cx, MacroAssembler& masm, Label* failure) { diff --git a/js/src/jit/SharedIC.h b/js/src/jit/SharedIC.h index 9ca6e386f20b..d384233acfca 100644 --- a/js/src/jit/SharedIC.h +++ b/js/src/jit/SharedIC.h @@ -13,6 +13,7 @@ #include "jit/BaselineICList.h" #include "jit/BaselineJIT.h" +#include "jit/ICState.h" #include "jit/MacroAssembler.h" #include "jit/SharedICList.h" #include "jit/SharedICRegisters.h" @@ -735,8 +736,7 @@ class ICFallbackStub : public ICStub ICEntry* icEntry_; // The number of stubs kept in the IC entry. - uint32_t numOptimizedStubs_ : 31; - uint32_t invalid_ : 1; + ICState state_; // A pointer to the location stub pointer that needs to be // changed to add a new "last" stub immediately before the fallback @@ -748,15 +748,13 @@ class ICFallbackStub : public ICStub ICFallbackStub(Kind kind, JitCode* stubCode) : ICStub(kind, ICStub::Fallback, stubCode), icEntry_(nullptr), - numOptimizedStubs_(0), - invalid_(false), + state_(), lastStubPtrAddr_(nullptr) {} ICFallbackStub(Kind kind, Trait trait, JitCode* stubCode) : ICStub(kind, trait, stubCode), icEntry_(nullptr), - numOptimizedStubs_(0), - invalid_(false), + state_(), lastStubPtrAddr_(nullptr) { MOZ_ASSERT(trait == ICStub::Fallback || @@ -769,15 +767,19 @@ class ICFallbackStub : public ICStub } inline size_t numOptimizedStubs() const { - return (size_t) numOptimizedStubs_; + return state_.numOptimizedStubs(); } void setInvalid() { - invalid_ = 1; + state_.setInvalid(); } bool invalid() const { - return invalid_; + return state_.invalid(); + } + + ICState& state() { + return state_; } // The icEntry and lastStubPtrAddr_ fields can't be initialized when the stub is @@ -799,7 +801,7 @@ class ICFallbackStub : public ICStub stub->setNext(this); *lastStubPtrAddr_ = stub; lastStubPtrAddr_ = stub->addressOfNext(); - numOptimizedStubs_++; + state_.trackAttached(); } ICStubConstIterator beginChainConst() const { @@ -827,6 +829,8 @@ class ICFallbackStub : public ICStub return count; } + void discardStubs(JSContext* cx); + void unlinkStub(Zone* zone, ICStub* prev, ICStub* stub); void unlinkStubsWithKind(JSContext* cx, ICStub::Kind kind); }; @@ -2324,7 +2328,6 @@ class ICGetProp_Fallback : public ICMonitoredFallbackStub { } public: - static const uint32_t MAX_OPTIMIZED_STUBS = 16; static const size_t UNOPTIMIZABLE_ACCESS_BIT = 0; static const size_t ACCESSED_GETTER_BIT = 1; @@ -2367,35 +2370,6 @@ class ICGetProp_Fallback : public ICMonitoredFallbackStub }; }; -// Stub for sites, which are too polymorphic (i.e. MAX_OPTIMIZED_STUBS was reached) -class ICGetProp_Generic : public ICMonitoredStub -{ - friend class ICStubSpace; - - protected: - explicit ICGetProp_Generic(JitCode* stubCode, ICStub* firstMonitorStub) - : ICMonitoredStub(ICStub::GetProp_Generic, stubCode, firstMonitorStub) {} - - public: - static ICGetProp_Generic* Clone(JSContext* cx, ICStubSpace* space, ICStub* firstMonitorStub, - ICGetProp_Generic& other); - - class Compiler : public ICStubCompiler { - protected: - MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm); - ICStub* firstMonitorStub_; - public: - explicit Compiler(JSContext* cx, ICStub* firstMonitorStub) - : ICStubCompiler(cx, ICStub::GetProp_Generic, ICStubEngine::Baseline), - firstMonitorStub_(firstMonitorStub) - {} - - ICStub* getStub(ICStubSpace* space) { - return newStub(space, getStubCode(), firstMonitorStub_); - } - }; -}; - static inline uint32_t SimpleTypeDescrKey(SimpleTypeDescr* descr) { diff --git a/js/src/jit/SharedICList.h b/js/src/jit/SharedICList.h index aac54ce39cb9..b86274d70799 100644 --- a/js/src/jit/SharedICList.h +++ b/js/src/jit/SharedICList.h @@ -36,7 +36,6 @@ namespace jit { _(Compare_Int32WithBoolean) \ \ _(GetProp_Fallback) \ - _(GetProp_Generic) \ \ _(CacheIR_Regular) \ _(CacheIR_Monitored) \ diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index b9531fa13a9a..87b9d86a2509 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -1527,5 +1527,184 @@ CheckIsCallable(JSContext* cx, HandleValue v, CheckIsCallableKind kind) return true; } +template +static MOZ_ALWAYS_INLINE bool +GetNativeDataProperty(JSContext* cx, NativeObject* obj, jsid id, Value* vp) +{ + // Fast path used by megamorphic IC stubs. Unlike our other property + // lookup paths, this is optimized to be as fast as possible for simple + // data property lookups. + + JS::AutoCheckCannotGC nogc; + + MOZ_ASSERT(JSID_IS_ATOM(id) || JSID_IS_SYMBOL(id)); + + while (true) { + if (Shape* shape = obj->lastProperty()->search(cx, id)) { + if (!shape->hasSlot() || !shape->hasDefaultGetter()) + return false; + + *vp = obj->getSlot(shape->slot()); + return true; + } + + // Property not found. Watch out for Class hooks. + if (MOZ_UNLIKELY(!obj->is())) { + if (ClassMayResolveId(cx->names(), obj->getClass(), id, obj) || + obj->getClass()->getGetProperty()) + { + return false; + } + } + + JSObject* proto = obj->staticPrototype(); + if (!proto) { + if (HandleMissing) { + vp->setUndefined(); + return true; + } + return false; + } + + if (!proto->isNative()) + return false; + obj = &proto->as(); + } +} + +template +bool +GetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* vp) +{ + if (MOZ_UNLIKELY(!obj->isNative())) + return false; + return GetNativeDataProperty(cx, &obj->as(), NameToId(name), vp); +} + +template bool +GetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* vp); + +template bool +GetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* vp); + +template +bool +GetNativeDataPropertyByValue(JSContext* cx, JSObject* obj, Value* vp) +{ + JS::AutoCheckCannotGC nogc; + + if (MOZ_UNLIKELY(!obj->isNative())) + return false; + + // vp[0] contains the id, result will be stored in vp[1]. + Value idVal = vp[0]; + + jsid id; + if (MOZ_LIKELY(idVal.isString())) { + JSString* s = idVal.toString(); + JSAtom* atom; + if (s->isAtom()) { + atom = &s->asAtom(); + } else { + atom = AtomizeString(cx, s); + if (!atom) + return false; + } + id = AtomToId(atom); + } else if (idVal.isSymbol()) { + id = SYMBOL_TO_JSID(idVal.toSymbol()); + } else { + if (!ValueToIdPure(idVal, &id)) + return false; + } + + // Watch out for ids that may be stored in dense elements. + static_assert(NativeObject::MAX_DENSE_ELEMENTS_COUNT < JSID_INT_MAX, + "All dense elements must have integer jsids"); + if (MOZ_UNLIKELY(JSID_IS_INT(id))) + return false; + + Value* res = vp + 1; + return GetNativeDataProperty(cx, &obj->as(), id, res); +} + +template bool +GetNativeDataPropertyByValue(JSContext* cx, JSObject* obj, Value* vp); + +template bool +GetNativeDataPropertyByValue(JSContext* cx, JSObject* obj, Value* vp); + +bool +SetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* val) +{ + JS::AutoCheckCannotGC nogc; + + if (MOZ_UNLIKELY(!obj->isNative())) + return false; + + NativeObject* nobj = &obj->as(); + Shape* shape = nobj->lastProperty()->search(cx, NameToId(name)); + if (!shape || + !shape->hasSlot() || + !shape->hasDefaultSetter() || + !shape->writable() || + nobj->watched()) + { + return false; + } + + if (!HasTypePropertyId(nobj, NameToId(name), *val)) + return false; + + nobj->setSlot(shape->slot(), *val); + return true; +} + +bool +ObjectHasGetterSetter(JSContext* cx, JSObject* objArg, Shape* propShape) +{ + JS::AutoCheckCannotGC nogc; + + MOZ_ASSERT(propShape->hasGetterObject() || propShape->hasSetterObject()); + + // Window objects may require outerizing (passing the WindowProxy to the + // getter/setter), so we don't support them here. + if (MOZ_UNLIKELY(!objArg->isNative() || IsWindow(objArg))) + return false; + + NativeObject* nobj = &objArg->as(); + jsid id = propShape->propid(); + + while (true) { + if (Shape* shape = nobj->lastProperty()->search(cx, id)) { + if (shape == propShape) + return true; + if (shape->getterOrUndefined() == propShape->getterOrUndefined() && + shape->setterOrUndefined() == propShape->setterOrUndefined()) + { + return true; + } + return false; + } + + // Property not found. Watch out for Class hooks. + if (!nobj->is()) { + if (ClassMayResolveId(cx->names(), nobj->getClass(), id, nobj) || + nobj->getClass()->getGetProperty()) + { + return false; + } + } + + JSObject* proto = nobj->staticPrototype(); + if (!proto) + return false; + + if (!proto->isNative()) + return false; + nobj = &proto->as(); + } +} + } // namespace jit } // namespace js diff --git a/js/src/jit/VMFunctions.h b/js/src/jit/VMFunctions.h index a5fad9054fdb..62fcdb9677d2 100644 --- a/js/src/jit/VMFunctions.h +++ b/js/src/jit/VMFunctions.h @@ -843,6 +843,20 @@ EqualStringsHelper(JSString* str1, JSString* str2); MOZ_MUST_USE bool CheckIsCallable(JSContext* cx, HandleValue v, CheckIsCallableKind kind); +template +bool +GetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* vp); + +template +bool +GetNativeDataPropertyByValue(JSContext* cx, JSObject* obj, Value* vp); + +bool +SetNativeDataProperty(JSContext* cx, JSObject* obj, PropertyName* name, Value* val); + +bool +ObjectHasGetterSetter(JSContext* cx, JSObject* obj, Shape* propShape); + } // namespace jit } // namespace js diff --git a/js/src/vm/TypeInference-inl.h b/js/src/vm/TypeInference-inl.h index 445cddf5d152..a8ae436156aa 100644 --- a/js/src/vm/TypeInference-inl.h +++ b/js/src/vm/TypeInference-inl.h @@ -414,7 +414,7 @@ HasTypePropertyId(JSObject* obj, jsid id, TypeSet::Type type) return true; if (HeapTypeSet* types = obj->group()->maybeGetProperty(IdToTypeId(id))) - return types->hasType(type); + return types->hasType(type) && !types->nonConstantProperty(); return false; } From c9ee99780dea5f3c2792bfe55d7a42b36fa1b022 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Mon, 20 Mar 2017 09:42:39 -0400 Subject: [PATCH 019/169] Bug 1347667 - unlink accessible's parent before accessible's shutdown when document shutdowns, r=yzen --- accessible/base/nsAccCache.h | 17 ----------------- accessible/generic/DocAccessible.cpp | 12 +++++++++++- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/accessible/base/nsAccCache.h b/accessible/base/nsAccCache.h index 4e97dbf2c4f4..cb39accdee11 100644 --- a/accessible/base/nsAccCache.h +++ b/accessible/base/nsAccCache.h @@ -25,21 +25,4 @@ UnbindCacheEntriesFromDocument( } } -/** - * Clear the cache and shutdown the accessibles. - */ -template -static void -ClearCache(nsRefPtrHashtable, T>& aCache) -{ - for (auto iter = aCache.Iter(); !iter.Done(); iter.Next()) { - T* accessible = iter.Data(); - MOZ_ASSERT(accessible); - if (accessible && !accessible->IsDefunct()) { - accessible->Shutdown(); - } - iter.Remove(); - } -} - #endif diff --git a/accessible/generic/DocAccessible.cpp b/accessible/generic/DocAccessible.cpp index e80cd9bb2452..2862bac83cc1 100644 --- a/accessible/generic/DocAccessible.cpp +++ b/accessible/generic/DocAccessible.cpp @@ -483,7 +483,17 @@ DocAccessible::Shutdown() mDependentIDsHash.Clear(); mNodeToAccessibleMap.Clear(); - ClearCache(mAccessibleCache); + + for (auto iter = mAccessibleCache.Iter(); !iter.Done(); iter.Next()) { + Accessible* accessible = iter.Data(); + MOZ_ASSERT(accessible); + if (accessible && !accessible->IsDefunct()) { + // Unlink parent to avoid its cleaning overhead in shutdown. + accessible->mParent = nullptr; + accessible->Shutdown(); + } + iter.Remove(); + } HyperTextAccessibleWrap::Shutdown(); From 38c6ab4035809959f86c372b281903234fc9f231 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Mon, 20 Mar 2017 14:51:54 +0100 Subject: [PATCH 020/169] Bug 1340163 - Introducing originNoSuffix as attribute in ContentPrincipalInfo, r=smaug --- caps/nsJSPrincipals.cpp | 12 +++++++++--- dom/cache/DBSchema.cpp | 6 +++--- dom/workers/ServiceWorkerRegistrar.cpp | 10 +++++----- dom/workers/test/gtest/TestReadWrite.cpp | 6 ++++-- ipc/glue/BackgroundUtils.cpp | 24 +++++++++++++++++++++++- ipc/glue/PBackgroundSharedTypes.ipdlh | 12 ++++++++++++ 6 files changed, 56 insertions(+), 14 deletions(-) diff --git a/caps/nsJSPrincipals.cpp b/caps/nsJSPrincipals.cpp index ca998bc99597..6a69d5b12b60 100644 --- a/caps/nsJSPrincipals.cpp +++ b/caps/nsJSPrincipals.cpp @@ -135,7 +135,10 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, } nsAutoCString suffix; - suffix.SetLength(suffixLength); + if (!suffix.SetLength(suffixLength, fallible)) { + return false; + } + if (!JS_ReadBytes(aReader, suffix.BeginWriting(), suffixLength)) { return false; } @@ -144,7 +147,10 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, return false; } - aSpec.SetLength(specLength); + if (!aSpec.SetLength(specLength, fallible)) { + return false; + } + if (!JS_ReadBytes(aReader, aSpec.BeginWriting(), specLength)) { return false; } @@ -195,7 +201,7 @@ ReadPrincipalInfo(JSStructuredCloneReader* aReader, return false; } - aInfo = ContentPrincipalInfo(attrs, spec); + aInfo = ContentPrincipalInfo(attrs, void_t(), spec); } else { MOZ_CRASH("unexpected principal structured clone tag"); } diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index 8b24dd13eb19..8a5d5df0b35a 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -1975,15 +1975,15 @@ ReadResponse(mozIStorageConnection* aConn, EntryId aEntryId, aSavedResponseOut->mValue.principalInfo() = void_t(); if (!serializedInfo.IsEmpty()) { - nsAutoCString originNoSuffix; + nsAutoCString specNoSuffix; OriginAttributes attrs; - if (!attrs.PopulateFromOrigin(serializedInfo, originNoSuffix)) { + if (!attrs.PopulateFromOrigin(serializedInfo, specNoSuffix)) { NS_WARNING("Something went wrong parsing a serialized principal!"); return NS_ERROR_FAILURE; } aSavedResponseOut->mValue.principalInfo() = - mozilla::ipc::ContentPrincipalInfo(attrs, originNoSuffix); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), specNoSuffix); } rv = state->GetBlobAsUTF8String(6, aSavedResponseOut->mValue.channelInfo().securityInfo()); diff --git a/dom/workers/ServiceWorkerRegistrar.cpp b/dom/workers/ServiceWorkerRegistrar.cpp index fd44329de034..c1fce972814d 100644 --- a/dom/workers/ServiceWorkerRegistrar.cpp +++ b/dom/workers/ServiceWorkerRegistrar.cpp @@ -354,7 +354,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -395,7 +395,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -428,7 +428,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -458,7 +458,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -488,7 +488,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); // scriptSpec is no more used in latest version. GET_LINE(unused); diff --git a/dom/workers/test/gtest/TestReadWrite.cpp b/dom/workers/test/gtest/TestReadWrite.cpp index e53a72af72a7..39baa63bda24 100644 --- a/dom/workers/test/gtest/TestReadWrite.cpp +++ b/dom/workers/test/gtest/TestReadWrite.cpp @@ -243,7 +243,8 @@ TEST(ServiceWorkerRegistrar, TestWriteData) nsAutoCString spec; spec.AppendPrintf("spec write %d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), + mozilla::void_t(), spec); swr->TestRegisterServiceWorker(reg); } @@ -597,7 +598,8 @@ TEST(ServiceWorkerRegistrar, TestDedupeWrite) nsAutoCString spec; spec.AppendPrintf("spec write dedupe/%d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), + mozilla::void_t(), spec); swr->TestRegisterServiceWorker(reg); } diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 341b9ecba22a..4540ee6b9fa2 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -94,6 +94,18 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo, return nullptr; } + // When the principal is serialized, the origin is extract from it. This + // can fail, and in case, here we will havea Tvoid_t. If we have a string, + // it must match with what the_new_principal.getOrigin returns. + if (info.originNoSuffix().type() == ContentPrincipalInfoOriginNoSuffix::TnsCString) { + nsAutoCString originNoSuffix; + rv = principal->GetOrigin(originNoSuffix); + if (NS_WARN_IF(NS_FAILED(rv)) || + !info.originNoSuffix().get_nsCString().Equals(originNoSuffix)) { + MOZ_CRASH("If the origin was in the contentPrincipalInfo, it must be available when deserialized"); + } + } + return principal.forget(); } @@ -222,8 +234,18 @@ PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, return rv; } + ContentPrincipalInfoOriginNoSuffix infoOriginNoSuffix; + + nsCString originNoSuffix; + rv = aPrincipal->GetOriginNoSuffix(originNoSuffix); + if (NS_WARN_IF(NS_FAILED(rv))) { + infoOriginNoSuffix = void_t(); + } else { + infoOriginNoSuffix = originNoSuffix; + } + *aPrincipalInfo = ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), - spec); + infoOriginNoSuffix, spec); return NS_OK; } diff --git a/ipc/glue/PBackgroundSharedTypes.ipdlh b/ipc/glue/PBackgroundSharedTypes.ipdlh index d29737f07bdc..2e5e835a3139 100644 --- a/ipc/glue/PBackgroundSharedTypes.ipdlh +++ b/ipc/glue/PBackgroundSharedTypes.ipdlh @@ -8,9 +8,21 @@ using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; namespace mozilla { namespace ipc { +union ContentPrincipalInfoOriginNoSuffix +{ + nsCString; + void_t; +}; + struct ContentPrincipalInfo { OriginAttributes attrs; + + // nsIPrincipal.originNoSuffix can fail. In case this happens, this value + // will be set to void_t. So far, this is used only for dom/media. + // It will be removed in bug 1347817. + ContentPrincipalInfoOriginNoSuffix originNoSuffix; + nsCString spec; }; From c2dd88696c62aac78e94b1933a8ca15f99d7aec5 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Mon, 20 Mar 2017 14:51:56 +0100 Subject: [PATCH 021/169] Bug 1340163 - Use of contentPrincipalInfo.origin in Media, r=jib --- dom/media/systemservices/MediaParent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dom/media/systemservices/MediaParent.cpp b/dom/media/systemservices/MediaParent.cpp index 322ab954b779..c7798dd73dc6 100644 --- a/dom/media/systemservices/MediaParent.cpp +++ b/dom/media/systemservices/MediaParent.cpp @@ -107,7 +107,7 @@ class OriginKeyStore : public nsISupports private: void PrincipalInfoToString(const ipc::PrincipalInfo& aPrincipalInfo, - nsAutoCString aString) + nsACString& aString) { switch (aPrincipalInfo.type()) { case ipc::PrincipalInfo::TSystemPrincipalInfo: @@ -124,11 +124,11 @@ class OriginKeyStore : public nsISupports case ipc::PrincipalInfo::TContentPrincipalInfo: { const ipc::ContentPrincipalInfo& info = aPrincipalInfo.get_ContentPrincipalInfo(); - aString.Assign(info.spec()); + aString.Assign(info.originNoSuffix()); nsAutoCString suffix; info.attrs().CreateSuffix(suffix); - suffix.Append(suffix); + aString.Append(suffix); return; } From 8d948fcc67445ba3ec5793b3c9c02e734c58173c Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Wed, 15 Mar 2017 08:08:47 -0400 Subject: [PATCH 022/169] Bug 1074192 - Hold the mutex in imgFrame when creating a DrawableFrameRef. r=tnikkel --- image/imgFrame.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image/imgFrame.h b/image/imgFrame.h index 34d19447620a..77ff3507b177 100644 --- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -478,6 +478,9 @@ public: explicit DrawableFrameRef(imgFrame* aFrame) : mFrame(aFrame) { + MOZ_ASSERT(aFrame); + MonitorAutoLock lock(aFrame->mMonitor); + // Paletted images won't have a surface so there is no strong reference // to hold on to. Since Draw() and GetSourceSurface() calls will not work // in that case, we should be using RawAccessFrameRef exclusively instead. From 079d19514cb7402765cf5366d96434b82aa8c75b Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 15:37:23 +0100 Subject: [PATCH 023/169] Backed out changeset 591c42f40cbe (bug 1340163) --- dom/media/systemservices/MediaParent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dom/media/systemservices/MediaParent.cpp b/dom/media/systemservices/MediaParent.cpp index c7798dd73dc6..322ab954b779 100644 --- a/dom/media/systemservices/MediaParent.cpp +++ b/dom/media/systemservices/MediaParent.cpp @@ -107,7 +107,7 @@ class OriginKeyStore : public nsISupports private: void PrincipalInfoToString(const ipc::PrincipalInfo& aPrincipalInfo, - nsACString& aString) + nsAutoCString aString) { switch (aPrincipalInfo.type()) { case ipc::PrincipalInfo::TSystemPrincipalInfo: @@ -124,11 +124,11 @@ class OriginKeyStore : public nsISupports case ipc::PrincipalInfo::TContentPrincipalInfo: { const ipc::ContentPrincipalInfo& info = aPrincipalInfo.get_ContentPrincipalInfo(); - aString.Assign(info.originNoSuffix()); + aString.Assign(info.spec()); nsAutoCString suffix; info.attrs().CreateSuffix(suffix); - aString.Append(suffix); + suffix.Append(suffix); return; } From a472d9b04f2443bd1f1702a1441253e33606d1a5 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 15:38:19 +0100 Subject: [PATCH 024/169] Backed out changeset 54a1f0cb64d9 (bug 1340163) for crashing e.g. in browser/components/originattributes/test/browser/browser_cacheAPI.js. r=backout --- caps/nsJSPrincipals.cpp | 12 +++--------- dom/cache/DBSchema.cpp | 6 +++--- dom/workers/ServiceWorkerRegistrar.cpp | 10 +++++----- dom/workers/test/gtest/TestReadWrite.cpp | 6 ++---- ipc/glue/BackgroundUtils.cpp | 24 +----------------------- ipc/glue/PBackgroundSharedTypes.ipdlh | 12 ------------ 6 files changed, 14 insertions(+), 56 deletions(-) diff --git a/caps/nsJSPrincipals.cpp b/caps/nsJSPrincipals.cpp index 6a69d5b12b60..ca998bc99597 100644 --- a/caps/nsJSPrincipals.cpp +++ b/caps/nsJSPrincipals.cpp @@ -135,10 +135,7 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, } nsAutoCString suffix; - if (!suffix.SetLength(suffixLength, fallible)) { - return false; - } - + suffix.SetLength(suffixLength); if (!JS_ReadBytes(aReader, suffix.BeginWriting(), suffixLength)) { return false; } @@ -147,10 +144,7 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, return false; } - if (!aSpec.SetLength(specLength, fallible)) { - return false; - } - + aSpec.SetLength(specLength); if (!JS_ReadBytes(aReader, aSpec.BeginWriting(), specLength)) { return false; } @@ -201,7 +195,7 @@ ReadPrincipalInfo(JSStructuredCloneReader* aReader, return false; } - aInfo = ContentPrincipalInfo(attrs, void_t(), spec); + aInfo = ContentPrincipalInfo(attrs, spec); } else { MOZ_CRASH("unexpected principal structured clone tag"); } diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index 8a5d5df0b35a..8b24dd13eb19 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -1975,15 +1975,15 @@ ReadResponse(mozIStorageConnection* aConn, EntryId aEntryId, aSavedResponseOut->mValue.principalInfo() = void_t(); if (!serializedInfo.IsEmpty()) { - nsAutoCString specNoSuffix; + nsAutoCString originNoSuffix; OriginAttributes attrs; - if (!attrs.PopulateFromOrigin(serializedInfo, specNoSuffix)) { + if (!attrs.PopulateFromOrigin(serializedInfo, originNoSuffix)) { NS_WARNING("Something went wrong parsing a serialized principal!"); return NS_ERROR_FAILURE; } aSavedResponseOut->mValue.principalInfo() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), specNoSuffix); + mozilla::ipc::ContentPrincipalInfo(attrs, originNoSuffix); } rv = state->GetBlobAsUTF8String(6, aSavedResponseOut->mValue.channelInfo().securityInfo()); diff --git a/dom/workers/ServiceWorkerRegistrar.cpp b/dom/workers/ServiceWorkerRegistrar.cpp index c1fce972814d..fd44329de034 100644 --- a/dom/workers/ServiceWorkerRegistrar.cpp +++ b/dom/workers/ServiceWorkerRegistrar.cpp @@ -354,7 +354,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -395,7 +395,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -428,7 +428,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -458,7 +458,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -488,7 +488,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); // scriptSpec is no more used in latest version. GET_LINE(unused); diff --git a/dom/workers/test/gtest/TestReadWrite.cpp b/dom/workers/test/gtest/TestReadWrite.cpp index 39baa63bda24..e53a72af72a7 100644 --- a/dom/workers/test/gtest/TestReadWrite.cpp +++ b/dom/workers/test/gtest/TestReadWrite.cpp @@ -243,8 +243,7 @@ TEST(ServiceWorkerRegistrar, TestWriteData) nsAutoCString spec; spec.AppendPrintf("spec write %d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), - mozilla::void_t(), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), spec); swr->TestRegisterServiceWorker(reg); } @@ -598,8 +597,7 @@ TEST(ServiceWorkerRegistrar, TestDedupeWrite) nsAutoCString spec; spec.AppendPrintf("spec write dedupe/%d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), - mozilla::void_t(), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), spec); swr->TestRegisterServiceWorker(reg); } diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 4540ee6b9fa2..341b9ecba22a 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -94,18 +94,6 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo, return nullptr; } - // When the principal is serialized, the origin is extract from it. This - // can fail, and in case, here we will havea Tvoid_t. If we have a string, - // it must match with what the_new_principal.getOrigin returns. - if (info.originNoSuffix().type() == ContentPrincipalInfoOriginNoSuffix::TnsCString) { - nsAutoCString originNoSuffix; - rv = principal->GetOrigin(originNoSuffix); - if (NS_WARN_IF(NS_FAILED(rv)) || - !info.originNoSuffix().get_nsCString().Equals(originNoSuffix)) { - MOZ_CRASH("If the origin was in the contentPrincipalInfo, it must be available when deserialized"); - } - } - return principal.forget(); } @@ -234,18 +222,8 @@ PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, return rv; } - ContentPrincipalInfoOriginNoSuffix infoOriginNoSuffix; - - nsCString originNoSuffix; - rv = aPrincipal->GetOriginNoSuffix(originNoSuffix); - if (NS_WARN_IF(NS_FAILED(rv))) { - infoOriginNoSuffix = void_t(); - } else { - infoOriginNoSuffix = originNoSuffix; - } - *aPrincipalInfo = ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), - infoOriginNoSuffix, spec); + spec); return NS_OK; } diff --git a/ipc/glue/PBackgroundSharedTypes.ipdlh b/ipc/glue/PBackgroundSharedTypes.ipdlh index 2e5e835a3139..d29737f07bdc 100644 --- a/ipc/glue/PBackgroundSharedTypes.ipdlh +++ b/ipc/glue/PBackgroundSharedTypes.ipdlh @@ -8,21 +8,9 @@ using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; namespace mozilla { namespace ipc { -union ContentPrincipalInfoOriginNoSuffix -{ - nsCString; - void_t; -}; - struct ContentPrincipalInfo { OriginAttributes attrs; - - // nsIPrincipal.originNoSuffix can fail. In case this happens, this value - // will be set to void_t. So far, this is used only for dom/media. - // It will be removed in bug 1347817. - ContentPrincipalInfoOriginNoSuffix originNoSuffix; - nsCString spec; }; From a1b8a7905da36ac4099d4b128f5b109a8a958ae9 Mon Sep 17 00:00:00 2001 From: Catalin Badea Date: Fri, 3 Mar 2017 01:51:06 +0000 Subject: [PATCH 025/169] Bug 1342255 - Fix crash in respondWith resolved callback. Don't reset interception if the sw throws after .respondWith(). r=asuth --- dom/workers/ServiceWorkerEvents.cpp | 2 +- dom/workers/ServiceWorkerPrivate.cpp | 3 +- testing/web-platform/meta/MANIFEST.json | 27 +++++++++++-- ...event-throws-after-respond-with.https.html | 34 ++++++++++++++++ .../resources/respond-then-throw-worker.js | 40 +++++++++++++++++++ 5 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 testing/web-platform/tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html create mode 100644 testing/web-platform/tests/service-workers/service-worker/resources/respond-then-throw-worker.js diff --git a/dom/workers/ServiceWorkerEvents.cpp b/dom/workers/ServiceWorkerEvents.cpp index 321764025900..6095a116d9b6 100644 --- a/dom/workers/ServiceWorkerEvents.cpp +++ b/dom/workers/ServiceWorkerEvents.cpp @@ -658,7 +658,7 @@ RespondWithHandler::ResolvedCallback(JSContext* aCx, JS::Handle aValu nsCOMPtr responseBody; rv = mInterceptedChannel->GetResponseBody(getter_AddRefs(responseBody)); - if (NS_WARN_IF(NS_FAILED(rv))) { + if (NS_WARN_IF(NS_FAILED(rv)) || !responseBody) { return; } diff --git a/dom/workers/ServiceWorkerPrivate.cpp b/dom/workers/ServiceWorkerPrivate.cpp index eb091d26c5b2..7a6827ac7660 100644 --- a/dom/workers/ServiceWorkerPrivate.cpp +++ b/dom/workers/ServiceWorkerPrivate.cpp @@ -1580,7 +1580,8 @@ private: nsresult rv2 = DispatchExtendableEventOnWorkerScope(aCx, aWorkerPrivate->GlobalScope(), event, nullptr); - if (NS_WARN_IF(NS_FAILED(rv2)) || !event->WaitToRespond()) { + if ((NS_WARN_IF(NS_FAILED(rv2)) && rv2 != NS_ERROR_XPC_JS_THREW_EXCEPTION) || + !event->WaitToRespond()) { nsCOMPtr runnable; MOZ_ASSERT(!aWorkerPrivate->UsesSystemPrincipal(), "We don't support system-principal serviceworkers"); diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json index bffa481a8fe0..95847c6b47b9 100644 --- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -61206,6 +61206,11 @@ {} ] ], + "service-workers/service-worker/resources/respond-then-throw-worker.js": [ + [ + {} + ] + ], "service-workers/service-worker/resources/service-worker-csp-worker.py": [ [ {} @@ -119858,6 +119863,12 @@ {} ] ], + "service-workers/service-worker/fetch-event-throws-after-respond-with.https.html": [ + [ + "/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html", + {} + ] + ], "service-workers/service-worker/fetch-event-within-sw.https.html": [ [ "/service-workers/service-worker/fetch-event-within-sw.https.html", @@ -130992,7 +131003,7 @@ "support" ], "./lint.whitelist": [ - "2bf4ed33e508857e92d2fcf5efac381a60e91bc6", + "e055247bfc62fbe467bbc2812f5f9d0791225748", "support" ], "./manifest": [ @@ -141124,7 +141135,7 @@ "testharness" ], "beacon/headers/header-referrer.js": [ - "1836174ce84714c39333a4cf863ec994ed70ff93", + "8185d2b31fbf67a573444d3c8f828f96422526f5", "support" ], "beacon/resources/inspect-header.py": [ @@ -178440,7 +178451,7 @@ "testharness" ], "html/semantics/forms/textfieldselection/selection-start-end.html": [ - "755fb11ec3d9440d3883ec3e2820a9e77fc144ae", + "e38a79075e27780327f49e7ae9cadd2558165eac", "testharness" ], "html/semantics/forms/textfieldselection/selection-value-interactions.html": [ @@ -181984,7 +181995,7 @@ "support" ], "infrastructure/reftest-wait.html": [ - "2ce5c2dc6d3f9f96cbd8dd527802cc9835df56cf", + "1a291b68cdf6edcfc28a2ff22e294e8e8ebc0c42", "reftest" ], "innerText/getter-tests.js": [ @@ -201975,6 +201986,10 @@ "2feaa5022ee31fb980f97075d932b0d87d6efe75", "testharness" ], + "service-workers/service-worker/fetch-event-throws-after-respond-with.https.html": [ + "41a64740d1d56a839f0888837a56c2b74cab0c77", + "testharness" + ], "service-workers/service-worker/fetch-event-within-sw-manual.https.html": [ "6bdea01ca619a894d07364a0485f717b46afe585", "manual" @@ -202739,6 +202754,10 @@ "ee7888f2e145700cf2590b6d6de9bab39088a979", "support" ], + "service-workers/service-worker/resources/respond-then-throw-worker.js": [ + "d57215bcad8a3966175930642dfd34281b11aeff", + "support" + ], "service-workers/service-worker/resources/service-worker-csp-worker.py": [ "f7c6bb3ba222dc35a09ef806a7c6d145339f9eb2", "support" diff --git a/testing/web-platform/tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html b/testing/web-platform/tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html new file mode 100644 index 000000000000..969a3c9d08fb --- /dev/null +++ b/testing/web-platform/tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html @@ -0,0 +1,34 @@ + + + + + + + diff --git a/testing/web-platform/tests/service-workers/service-worker/resources/respond-then-throw-worker.js b/testing/web-platform/tests/service-workers/service-worker/resources/respond-then-throw-worker.js new file mode 100644 index 000000000000..adb48de69e72 --- /dev/null +++ b/testing/web-platform/tests/service-workers/service-worker/resources/respond-then-throw-worker.js @@ -0,0 +1,40 @@ +var syncport = null; + +self.addEventListener('message', function(e) { + if ('port' in e.data) { + if (syncport) { + syncport(e.data.port); + } else { + syncport = e.data.port; + } + } +}); + +function sync() { + return new Promise(function(resolve) { + if (syncport) { + resolve(syncport); + } else { + syncport = resolve; + } + }).then(function(port) { + port.postMessage('SYNC'); + return new Promise(function(resolve) { + port.onmessage = function(e) { + if (e.data === 'ACK') { + resolve(); + } + } + }); + }); +} + + +self.addEventListener('fetch', function(event) { + // In Firefox the result would depend on a race between fetch handling + // and exception handling code. On the assumption that this might be a common + // design error, we explicitly allow the exception to be handled first. + event.respondWith(sync().then(() => new Response('intercepted'))); + + throw("error"); + }); From 50f7937e84cb4b850486b759295270b0f9ded46c Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Mon, 20 Mar 2017 16:03:45 +0100 Subject: [PATCH 026/169] Bug 1340163 - Introducing originNoSuffix as attribute in ContentPrincipalInfo, r=smaug --- caps/nsJSPrincipals.cpp | 12 +++++++++--- dom/cache/DBSchema.cpp | 6 +++--- dom/workers/ServiceWorkerRegistrar.cpp | 10 +++++----- dom/workers/test/gtest/TestReadWrite.cpp | 6 ++++-- ipc/glue/BackgroundUtils.cpp | 24 +++++++++++++++++++++++- ipc/glue/PBackgroundSharedTypes.ipdlh | 12 ++++++++++++ 6 files changed, 56 insertions(+), 14 deletions(-) diff --git a/caps/nsJSPrincipals.cpp b/caps/nsJSPrincipals.cpp index ca998bc99597..6a69d5b12b60 100644 --- a/caps/nsJSPrincipals.cpp +++ b/caps/nsJSPrincipals.cpp @@ -135,7 +135,10 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, } nsAutoCString suffix; - suffix.SetLength(suffixLength); + if (!suffix.SetLength(suffixLength, fallible)) { + return false; + } + if (!JS_ReadBytes(aReader, suffix.BeginWriting(), suffixLength)) { return false; } @@ -144,7 +147,10 @@ ReadSuffixAndSpec(JSStructuredCloneReader* aReader, return false; } - aSpec.SetLength(specLength); + if (!aSpec.SetLength(specLength, fallible)) { + return false; + } + if (!JS_ReadBytes(aReader, aSpec.BeginWriting(), specLength)) { return false; } @@ -195,7 +201,7 @@ ReadPrincipalInfo(JSStructuredCloneReader* aReader, return false; } - aInfo = ContentPrincipalInfo(attrs, spec); + aInfo = ContentPrincipalInfo(attrs, void_t(), spec); } else { MOZ_CRASH("unexpected principal structured clone tag"); } diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index 8b24dd13eb19..8a5d5df0b35a 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -1975,15 +1975,15 @@ ReadResponse(mozIStorageConnection* aConn, EntryId aEntryId, aSavedResponseOut->mValue.principalInfo() = void_t(); if (!serializedInfo.IsEmpty()) { - nsAutoCString originNoSuffix; + nsAutoCString specNoSuffix; OriginAttributes attrs; - if (!attrs.PopulateFromOrigin(serializedInfo, originNoSuffix)) { + if (!attrs.PopulateFromOrigin(serializedInfo, specNoSuffix)) { NS_WARNING("Something went wrong parsing a serialized principal!"); return NS_ERROR_FAILURE; } aSavedResponseOut->mValue.principalInfo() = - mozilla::ipc::ContentPrincipalInfo(attrs, originNoSuffix); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), specNoSuffix); } rv = state->GetBlobAsUTF8String(6, aSavedResponseOut->mValue.channelInfo().securityInfo()); diff --git a/dom/workers/ServiceWorkerRegistrar.cpp b/dom/workers/ServiceWorkerRegistrar.cpp index fd44329de034..c1fce972814d 100644 --- a/dom/workers/ServiceWorkerRegistrar.cpp +++ b/dom/workers/ServiceWorkerRegistrar.cpp @@ -354,7 +354,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -395,7 +395,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -428,7 +428,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -458,7 +458,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); GET_LINE(entry->currentWorkerURL()); @@ -488,7 +488,7 @@ ServiceWorkerRegistrar::ReadData() GET_LINE(entry->scope()); entry->principal() = - mozilla::ipc::ContentPrincipalInfo(attrs, entry->scope()); + mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), entry->scope()); // scriptSpec is no more used in latest version. GET_LINE(unused); diff --git a/dom/workers/test/gtest/TestReadWrite.cpp b/dom/workers/test/gtest/TestReadWrite.cpp index e53a72af72a7..39baa63bda24 100644 --- a/dom/workers/test/gtest/TestReadWrite.cpp +++ b/dom/workers/test/gtest/TestReadWrite.cpp @@ -243,7 +243,8 @@ TEST(ServiceWorkerRegistrar, TestWriteData) nsAutoCString spec; spec.AppendPrintf("spec write %d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(i, i % 2), + mozilla::void_t(), spec); swr->TestRegisterServiceWorker(reg); } @@ -597,7 +598,8 @@ TEST(ServiceWorkerRegistrar, TestDedupeWrite) nsAutoCString spec; spec.AppendPrintf("spec write dedupe/%d", i); reg.principal() = - mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), spec); + mozilla::ipc::ContentPrincipalInfo(mozilla::OriginAttributes(0, false), + mozilla::void_t(), spec); swr->TestRegisterServiceWorker(reg); } diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 341b9ecba22a..8d6014e4749f 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -94,6 +94,18 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo, return nullptr; } + // When the principal is serialized, the origin is extract from it. This + // can fail, and in case, here we will havea Tvoid_t. If we have a string, + // it must match with what the_new_principal.getOrigin returns. + if (info.originNoSuffix().type() == ContentPrincipalInfoOriginNoSuffix::TnsCString) { + nsAutoCString originNoSuffix; + rv = principal->GetOriginNoSuffix(originNoSuffix); + if (NS_WARN_IF(NS_FAILED(rv)) || + !info.originNoSuffix().get_nsCString().Equals(originNoSuffix)) { + MOZ_CRASH("If the origin was in the contentPrincipalInfo, it must be available when deserialized"); + } + } + return principal.forget(); } @@ -222,8 +234,18 @@ PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal, return rv; } + ContentPrincipalInfoOriginNoSuffix infoOriginNoSuffix; + + nsCString originNoSuffix; + rv = aPrincipal->GetOriginNoSuffix(originNoSuffix); + if (NS_WARN_IF(NS_FAILED(rv))) { + infoOriginNoSuffix = void_t(); + } else { + infoOriginNoSuffix = originNoSuffix; + } + *aPrincipalInfo = ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), - spec); + infoOriginNoSuffix, spec); return NS_OK; } diff --git a/ipc/glue/PBackgroundSharedTypes.ipdlh b/ipc/glue/PBackgroundSharedTypes.ipdlh index d29737f07bdc..2e5e835a3139 100644 --- a/ipc/glue/PBackgroundSharedTypes.ipdlh +++ b/ipc/glue/PBackgroundSharedTypes.ipdlh @@ -8,9 +8,21 @@ using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; namespace mozilla { namespace ipc { +union ContentPrincipalInfoOriginNoSuffix +{ + nsCString; + void_t; +}; + struct ContentPrincipalInfo { OriginAttributes attrs; + + // nsIPrincipal.originNoSuffix can fail. In case this happens, this value + // will be set to void_t. So far, this is used only for dom/media. + // It will be removed in bug 1347817. + ContentPrincipalInfoOriginNoSuffix originNoSuffix; + nsCString spec; }; From 9a66b9489006fc7354f6cbd3ae93d52cff745fdc Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Mon, 20 Mar 2017 16:04:06 +0100 Subject: [PATCH 027/169] Bug 1340163 - Use of contentPrincipalInfo.origin in Media, r=jib --- dom/media/systemservices/MediaParent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dom/media/systemservices/MediaParent.cpp b/dom/media/systemservices/MediaParent.cpp index 322ab954b779..c7798dd73dc6 100644 --- a/dom/media/systemservices/MediaParent.cpp +++ b/dom/media/systemservices/MediaParent.cpp @@ -107,7 +107,7 @@ class OriginKeyStore : public nsISupports private: void PrincipalInfoToString(const ipc::PrincipalInfo& aPrincipalInfo, - nsAutoCString aString) + nsACString& aString) { switch (aPrincipalInfo.type()) { case ipc::PrincipalInfo::TSystemPrincipalInfo: @@ -124,11 +124,11 @@ class OriginKeyStore : public nsISupports case ipc::PrincipalInfo::TContentPrincipalInfo: { const ipc::ContentPrincipalInfo& info = aPrincipalInfo.get_ContentPrincipalInfo(); - aString.Assign(info.spec()); + aString.Assign(info.originNoSuffix()); nsAutoCString suffix; info.attrs().CreateSuffix(suffix); - suffix.Append(suffix); + aString.Append(suffix); return; } From 6069c3ac7231236e4d9707a0428659a85b160585 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 18 Mar 2017 14:20:41 -0700 Subject: [PATCH 028/169] Bug 1348523: Store a weak reference to the blocked parser, and use when unblocking. r=hsivonen Users in nightlies are hitting the assertion in UnblockParser that ensures the parser is blocked. The only way that should be able to happen is if the initial parser is destroyed and a new one is created before we try to unblock. In theory, that shouldn't happen for the initial parser when it's blocked this early, so my best guess is that an add-on is ending the document load and then re-opening the document. MozReview-Commit-ID: iQkE2aWDTZ --HG-- extra : rebase_source : a5f225cf45dc3552059b347f441120fea6476ccd extra : amend_source : ed393f79c7626c65af33638da140f235a2d97743 --- dom/base/nsDocument.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 9df11a64b3b3..183bf348bf8d 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -10564,14 +10564,12 @@ public: NS_DECL_CYCLE_COLLECTION_CLASS(UnblockParsingPromiseHandler) explicit UnblockParsingPromiseHandler(nsIDocument* aDocument, Promise* aPromise) - : mDocument(aDocument) - , mPromise(aPromise) + : mPromise(aPromise) { - nsCOMPtr parser = mDocument->CreatorParserOrNull(); + nsCOMPtr parser = aDocument->CreatorParserOrNull(); if (parser) { parser->BlockParser(); - } else { - mDocument = nullptr; + mParser = do_GetWeakReference(parser); } } @@ -10599,21 +10597,19 @@ protected: private: void MaybeUnblockParser() { - if (mDocument) { - nsCOMPtr parser = mDocument->CreatorParserOrNull(); - if (parser) { - parser->UnblockParser(); - parser->ContinueInterruptedParsingAsync(); - } - mDocument = nullptr; + nsCOMPtr parser = do_QueryReferent(mParser); + if (parser) { + parser->UnblockParser(); + parser->ContinueInterruptedParsingAsync(); + mParser = nullptr; } } - RefPtr mDocument; + nsWeakPtr mParser; RefPtr mPromise; }; -NS_IMPL_CYCLE_COLLECTION(UnblockParsingPromiseHandler, mDocument, mPromise) +NS_IMPL_CYCLE_COLLECTION(UnblockParsingPromiseHandler, mPromise) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(UnblockParsingPromiseHandler) NS_INTERFACE_MAP_ENTRY(nsISupports) From b8d7a98bebc6a4527609cd756058d4918190519b Mon Sep 17 00:00:00 2001 From: Paul Adenot Date: Mon, 20 Mar 2017 16:25:19 +0100 Subject: [PATCH 029/169] Bug 1341666 - Allow running a `close` message during an MSG shutdown. r=jesup MozReview-Commit-ID: Hqg0porLEXT --- dom/media/MediaStreamGraph.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dom/media/MediaStreamGraph.cpp b/dom/media/MediaStreamGraph.cpp index 8d2d725d2f84..3c46bd873a47 100644 --- a/dom/media/MediaStreamGraph.cpp +++ b/dom/media/MediaStreamGraph.cpp @@ -4009,7 +4009,8 @@ MediaStreamGraph::ApplyAudioContextOperation(MediaStream* aDestinationStream, } void RunDuringShutdown() override { - MOZ_ASSERT(false, "We should be reviving the graph?"); + MOZ_ASSERT(mAudioContextOperation == AudioContextOperation::Close, + "We should be reviving the graph?"); } private: From 3fe3b37a3f98e4d16a22768afb9ecd72cee8cef8 Mon Sep 17 00:00:00 2001 From: Paul Adenot Date: Fri, 17 Mar 2017 18:21:35 +0100 Subject: [PATCH 030/169] Bug 1348344 - Add a way to disable the aggregate audio device on OSX, and log the resampler internal state. r=achronop,kinetik MozReview-Commit-ID: C23SsRNfq2A --HG-- extra : histedit_source : 654a54d4a2367595cd7acff6e473d191c4787754 --- media/libcubeb/src/cubeb_audiounit.cpp | 4 +- media/libcubeb/src/cubeb_resampler.cpp | 14 ++ media/libcubeb/src/cubeb_resampler_internal.h | 11 ++ media/libcubeb/temp-patch-debug-drift.patch | 150 ++++++++++++++++++ media/libcubeb/update.sh | 3 + 5 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 media/libcubeb/temp-patch-debug-drift.patch diff --git a/media/libcubeb/src/cubeb_audiounit.cpp b/media/libcubeb/src/cubeb_audiounit.cpp index 37752d696543..6cbea65db990 100644 --- a/media/libcubeb/src/cubeb_audiounit.cpp +++ b/media/libcubeb/src/cubeb_audiounit.cpp @@ -2307,7 +2307,8 @@ audiounit_setup_stream(cubeb_stream * stm) AudioDeviceID in_dev = stm->input_device; AudioDeviceID out_dev = stm->output_device; - if (has_input(stm) && has_output(stm)) { + if (has_input(stm) && has_output(stm) && + !getenv("CUBEB_AUDIOUNIT_DISABLE_AGGREGATE_DEVICE")) { r = audiounit_create_aggregate_device(stm); if (r != CUBEB_OK) { stm->aggregate_device_id = 0; @@ -2318,6 +2319,7 @@ audiounit_setup_stream(cubeb_stream * stm) // it after a couple of weeks. return r; } else { + LOG("(%p) Using aggregate device", stm); in_dev = out_dev = stm->aggregate_device_id; } } diff --git a/media/libcubeb/src/cubeb_resampler.cpp b/media/libcubeb/src/cubeb_resampler.cpp index 65dd0a86a097..f4ea8a9f5f0c 100644 --- a/media/libcubeb/src/cubeb_resampler.cpp +++ b/media/libcubeb/src/cubeb_resampler.cpp @@ -18,6 +18,7 @@ #include "cubeb-speex-resampler.h" #include "cubeb_resampler_internal.h" #include "cubeb_utils.h" +#include "cubeb_log.h" int to_speex_quality(cubeb_resampler_quality q) @@ -75,6 +76,9 @@ long passthrough_resampler::fill(void * input_buffer, long * input_frames_cou *input_frames_count = output_frames; } + ALOGV("passthrough: after callback, internal input buffer length: %zu", + internal_input_buffer.length()); + return rv; } @@ -236,6 +240,16 @@ cubeb_resampler_speex resampled_input, out_unprocessed, output_frames_before_processing); + size_t input_processor_buffer_sizes[2]; + size_t output_processor_buffer_sizes[2]; + input_processor->internal_buffer_sizes(input_processor_buffer_sizes); + output_processor->internal_buffer_sizes(output_processor_buffer_sizes); + ALOGV("duplex resampler: after callback, resampling buffer state:" + "input_processor(input: %zu, output: %zu) " + "output_processor(input: %zu, output: %zu) ", + input_processor_buffer_sizes[0], input_processor_buffer_sizes[1], + output_processor_buffer_sizes[0], output_processor_buffer_sizes[1]); + if (got < 0) { return got; } diff --git a/media/libcubeb/src/cubeb_resampler_internal.h b/media/libcubeb/src/cubeb_resampler_internal.h index bb5da0572360..e03b3e62ede7 100644 --- a/media/libcubeb/src/cubeb_resampler_internal.h +++ b/media/libcubeb/src/cubeb_resampler_internal.h @@ -179,6 +179,12 @@ public: speex_resampler_destroy(speex_resampler); } + void internal_buffer_sizes(size_t buf_sizes[2]) + { + buf_sizes[0] = resampling_in_buffer.length(); + buf_sizes[1] = resampling_out_buffer.length(); + } + /** Sometimes, it is necessary to add latency on one way of a two-way * resampler so that the stream are synchronized. This must be called only on * a fresh resampler, otherwise, silent samples will be inserted in the @@ -366,6 +372,11 @@ public: length += frames; delay_input_buffer.push_silence(frames_to_samples(frames)); } + void internal_buffer_sizes(size_t buf_sizes[2]) + { + buf_sizes[0] = delay_input_buffer.length(); + buf_sizes[1] = delay_output_buffer.length(); + } /** Push some frames into the delay line. * @parameter buffer the frames to push. * @parameter frame_count the number of frames in #buffer. */ diff --git a/media/libcubeb/temp-patch-debug-drift.patch b/media/libcubeb/temp-patch-debug-drift.patch new file mode 100644 index 000000000000..e2dfa92cb4ad --- /dev/null +++ b/media/libcubeb/temp-patch-debug-drift.patch @@ -0,0 +1,150 @@ +diff --git a/media/libcubeb/src/cubeb_audiounit.cpp b/media/libcubeb/src/cubeb_audiounit.cpp +--- a/media/libcubeb/src/cubeb_audiounit.cpp ++++ b/media/libcubeb/src/cubeb_audiounit.cpp +@@ -2302,27 +2302,29 @@ static int + audiounit_setup_stream(cubeb_stream * stm) + { + stm->mutex.assert_current_thread_owns(); + + int r = 0; + + AudioDeviceID in_dev = stm->input_device; + AudioDeviceID out_dev = stm->output_device; +- if (has_input(stm) && has_output(stm)) { ++ if (has_input(stm) && has_output(stm) && ++ !getenv("CUBEB_AUDIOUNIT_DISABLE_AGGREGATE_DEVICE")) { + r = audiounit_create_aggregate_device(stm); + if (r != CUBEB_OK) { + stm->aggregate_device_id = 0; + LOG("(%p) Create aggregate devices failed.", stm); + // !!!NOTE: It is not necessary to return here. If it does not + // return it will fallback to the old implementation. The intention + // is to investigate how often it fails. I plan to remove + // it after a couple of weeks. + return r; + } else { ++ LOG("(%p) Using aggregate device", stm); + in_dev = out_dev = stm->aggregate_device_id; + } + } + + if (has_input(stm)) { + r = audiounit_create_unit(&stm->input_unit, + INPUT, + in_dev); +diff --git a/media/libcubeb/src/cubeb_resampler.cpp b/media/libcubeb/src/cubeb_resampler.cpp +--- a/media/libcubeb/src/cubeb_resampler.cpp ++++ b/media/libcubeb/src/cubeb_resampler.cpp +@@ -13,16 +13,17 @@ + #include + #include + #include + #include + #include "cubeb_resampler.h" + #include "cubeb-speex-resampler.h" + #include "cubeb_resampler_internal.h" + #include "cubeb_utils.h" ++#include "cubeb_log.h" + + int + to_speex_quality(cubeb_resampler_quality q) + { + switch(q) { + case CUBEB_RESAMPLER_QUALITY_VOIP: + return SPEEX_RESAMPLER_QUALITY_VOIP; + case CUBEB_RESAMPLER_QUALITY_DEFAULT: +@@ -70,16 +71,19 @@ long passthrough_resampler::fill(void + long rv = data_callback(stream, user_ptr, internal_input_buffer.data(), + output_buffer, output_frames); + + if (input_buffer) { + internal_input_buffer.pop(nullptr, frames_to_samples(output_frames)); + *input_frames_count = output_frames; + } + ++ ALOGV("passthrough: after callback, internal input buffer length: %zu", ++ internal_input_buffer.length()); ++ + return rv; + } + + template + cubeb_resampler_speex + ::cubeb_resampler_speex(InputProcessor * input_processor, + OutputProcessor * output_processor, + cubeb_stream * s, +@@ -231,16 +235,26 @@ cubeb_resampler_speexinternal_buffer_sizes(input_processor_buffer_sizes); ++ output_processor->internal_buffer_sizes(output_processor_buffer_sizes); ++ ALOGV("duplex resampler: after callback, resampling buffer state:" ++ "input_processor(input: %zu, output: %zu) " ++ "output_processor(input: %zu, output: %zu) ", ++ input_processor_buffer_sizes[0], input_processor_buffer_sizes[1], ++ output_processor_buffer_sizes[0], output_processor_buffer_sizes[1]); ++ + if (got < 0) { + return got; + } + + output_processor->written(got); + + /* Process the output. If not enough frames have been returned from the + * callback, drain the processors. */ +diff --git a/media/libcubeb/src/cubeb_resampler_internal.h b/media/libcubeb/src/cubeb_resampler_internal.h +--- a/media/libcubeb/src/cubeb_resampler_internal.h ++++ b/media/libcubeb/src/cubeb_resampler_internal.h +@@ -174,16 +174,22 @@ public: + } + + /** Destructor, deallocate the resampler */ + virtual ~cubeb_resampler_speex_one_way() + { + speex_resampler_destroy(speex_resampler); + } + ++ void internal_buffer_sizes(size_t buf_sizes[2]) ++ { ++ buf_sizes[0] = resampling_in_buffer.length(); ++ buf_sizes[1] = resampling_out_buffer.length(); ++ } ++ + /** Sometimes, it is necessary to add latency on one way of a two-way + * resampler so that the stream are synchronized. This must be called only on + * a fresh resampler, otherwise, silent samples will be inserted in the + * stream. + * @param frames the number of frames of latency to add. */ + void add_latency(size_t frames) + { + additional_latency += frames; +@@ -361,16 +367,21 @@ public: + } + /* Add some latency to the delay line. + * @param frames the number of frames of latency to add. */ + void add_latency(size_t frames) + { + length += frames; + delay_input_buffer.push_silence(frames_to_samples(frames)); + } ++ void internal_buffer_sizes(size_t buf_sizes[2]) ++ { ++ buf_sizes[0] = delay_input_buffer.length(); ++ buf_sizes[1] = delay_output_buffer.length(); ++ } + /** Push some frames into the delay line. + * @parameter buffer the frames to push. + * @parameter frame_count the number of frames in #buffer. */ + void input(T * buffer, uint32_t frame_count) + { + delay_input_buffer.push(buffer, frames_to_samples(frame_count)); + } + /** Pop some frames from the internal buffer, into a internal output buffer. diff --git a/media/libcubeb/update.sh b/media/libcubeb/update.sh index 0f80d147d562..791cadae117d 100755 --- a/media/libcubeb/update.sh +++ b/media/libcubeb/update.sh @@ -66,3 +66,6 @@ if [ -n "$rev" ]; then else echo "Remember to update README_MOZILLA with the version details." fi + +echo "Applying a patch on top of $rev" +patch -p3 < temp-patch-debug-drift.patch From 2fd53c58799b195f8d7ffad6d1df10fd1d7d9edc Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Tue, 14 Mar 2017 11:17:19 +0100 Subject: [PATCH 031/169] Bug 1346810: Make variadic nodes instanciation fallible in WasmIonCompile; r=lth MozReview-Commit-ID: DtdhNJFnjkL --HG-- extra : rebase_source : dcad28425c1d0b80c86f01ceef12f6718b05c1e8 --- js/src/wasm/WasmIonCompile.cpp | 86 +++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 27 deletions(-) diff --git a/js/src/wasm/WasmIonCompile.cpp b/js/src/wasm/WasmIonCompile.cpp index 393d10763cf4..a0d99f977c73 100644 --- a/js/src/wasm/WasmIonCompile.cpp +++ b/js/src/wasm/WasmIonCompile.cpp @@ -768,27 +768,33 @@ class FunctionCompiler load = MWasmLoad::New(alloc(), memoryBase, base, *access, ToMIRType(result)); } - curBlock_->add(load); + if (load) + curBlock_->add(load); + return load; } - void store(MDefinition* base, MemoryAccessDesc* access, MDefinition* v) + MOZ_MUST_USE bool store(MDefinition* base, MemoryAccessDesc* access, MDefinition* v) { if (inDeadCode()) - return; + return true; MWasmLoadTls* memoryBase = maybeLoadMemoryBase(); MInstruction* store = nullptr; if (access->isPlainAsmJS()) { MOZ_ASSERT(access->offset() == 0); MWasmLoadTls* boundsCheckLimit = maybeLoadBoundsCheckLimit(); - store = MAsmJSStoreHeap::New(alloc(), memoryBase, base, boundsCheckLimit, access->type(), v); + store = MAsmJSStoreHeap::New(alloc(), memoryBase, base, boundsCheckLimit, + access->type(), v); } else { checkOffsetAndBounds(access, &base); store = MWasmStore::New(alloc(), memoryBase, base, *access, v); } - curBlock_->add(store); + if (store) + curBlock_->add(store); + + return !!store; } MDefinition* atomicCompareExchangeHeap(MDefinition* base, MemoryAccessDesc* access, @@ -799,8 +805,10 @@ class FunctionCompiler checkOffsetAndBounds(access, &base); MWasmLoadTls* memoryBase = maybeLoadMemoryBase(); - auto* cas = MAsmJSCompareExchangeHeap::New(alloc(), memoryBase, base, *access, oldv, newv, tlsPointer_); - curBlock_->add(cas); + auto* cas = MAsmJSCompareExchangeHeap::New(alloc(), memoryBase, base, *access, oldv, newv, + tlsPointer_); + if (cas) + curBlock_->add(cas); return cas; } @@ -813,21 +821,23 @@ class FunctionCompiler checkOffsetAndBounds(access, &base); MWasmLoadTls* memoryBase = maybeLoadMemoryBase(); auto* cas = MAsmJSAtomicExchangeHeap::New(alloc(), memoryBase, base, *access, value, tlsPointer_); - curBlock_->add(cas); + if (cas) + curBlock_->add(cas); return cas; } MDefinition* atomicBinopHeap(js::jit::AtomicOp op, - MDefinition* base, MemoryAccessDesc* access, - MDefinition* v) + MDefinition* base, MemoryAccessDesc* access, MDefinition* v) { if (inDeadCode()) return nullptr; checkOffsetAndBounds(access, &base); MWasmLoadTls* memoryBase = maybeLoadMemoryBase(); - auto* binop = MAsmJSAtomicBinopHeap::New(alloc(), op, memoryBase, base, *access, v, tlsPointer_); - curBlock_->add(binop); + auto* binop = MAsmJSAtomicBinopHeap::New(alloc(), op, memoryBase, base, *access, v, + tlsPointer_); + if (binop) + curBlock_->add(binop); return binop; } @@ -2455,7 +2465,11 @@ EmitLoad(FunctionCompiler& f, ValType type, Scalar::Type viewType) return false; MemoryAccessDesc access(viewType, addr.align, addr.offset, f.trapIfNotAsmJS()); - f.iter().setResult(f.load(addr.base, &access, type)); + auto* ins = f.load(addr.base, &access, type); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2469,8 +2483,7 @@ EmitStore(FunctionCompiler& f, ValType resultType, Scalar::Type viewType) MemoryAccessDesc access(viewType, addr.align, addr.offset, f.trapIfNotAsmJS()); - f.store(addr.base, &access, value); - return true; + return f.store(addr.base, &access, value); } static bool @@ -2483,8 +2496,7 @@ EmitTeeStore(FunctionCompiler& f, ValType resultType, Scalar::Type viewType) MemoryAccessDesc access(viewType, addr.align, addr.offset, f.trapIfNotAsmJS()); - f.store(addr.base, &access, value); - return true; + return f.store(addr.base, &access, value); } static bool @@ -2504,8 +2516,7 @@ EmitTeeStoreWithCoercion(FunctionCompiler& f, ValType resultType, Scalar::Type v MemoryAccessDesc access(viewType, addr.align, addr.offset, f.trapIfNotAsmJS()); - f.store(addr.base, &access, value); - return true; + return f.store(addr.base, &access, value); } static bool @@ -2599,7 +2610,11 @@ EmitAtomicsLoad(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset()), 0, MembarBeforeLoad, MembarAfterLoad); - f.iter().setResult(f.load(addr.base, &access, ValType::I32)); + auto* ins = f.load(addr.base, &access, ValType::I32); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2615,7 +2630,9 @@ EmitAtomicsStore(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset()), 0, MembarBeforeStore, MembarAfterStore); - f.store(addr.base, &access, value); + if (!f.store(addr.base, &access, value)) + return false; + f.iter().setResult(value); return true; } @@ -2632,7 +2649,11 @@ EmitAtomicsBinOp(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); - f.iter().setResult(f.atomicBinopHeap(op, addr.base, &access, value)); + auto* ins = f.atomicBinopHeap(op, addr.base, &access, value); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2648,7 +2669,11 @@ EmitAtomicsCompareExchange(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); - f.iter().setResult(f.atomicCompareExchangeHeap(addr.base, &access, oldValue, newValue)); + auto* ins = f.atomicCompareExchangeHeap(addr.base, &access, oldValue, newValue); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2663,7 +2688,11 @@ EmitAtomicsExchange(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); - f.iter().setResult(f.atomicExchangeHeap(addr.base, &access, value)); + auto* ins = f.atomicExchangeHeap(addr.base, &access, value); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2886,7 +2915,11 @@ EmitSimdLoad(FunctionCompiler& f, ValType resultType, unsigned numElems) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset()), numElems); - f.iter().setResult(f.load(addr.base, &access, resultType)); + auto* ins = f.load(addr.base, &access, resultType); + if (!ins) + return false; + + f.iter().setResult(ins); return true; } @@ -2906,8 +2939,7 @@ EmitSimdStore(FunctionCompiler& f, ValType resultType, unsigned numElems) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset()), numElems); - f.store(addr.base, &access, value); - return true; + return f.store(addr.base, &access, value); } static bool From 9eb0317e9e4f6616ec20615cbfcf9b2e97ef0478 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Tue, 14 Mar 2017 11:19:22 +0100 Subject: [PATCH 032/169] Bug 1346810: Report OOM to the JSContext for several ErrorNotes related allocations; r=tcampbell MozReview-Commit-ID: HP3OwjB4urG --HG-- extra : rebase_source : 1bee617566cc00e0169f94af4b835e8775064408 --- js/src/frontend/Parser.cpp | 8 ++++++-- js/src/jsapi.cpp | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 4b5c8f416858..38d3031bc1c5 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -1010,8 +1010,10 @@ Parser::reportMissingClosing(unsigned errorNumber, unsigned noteNu uint32_t openedPos) { auto notes = MakeUnique(); - if (!notes) + if (!notes) { + ReportOutOfMemory(pc->sc()->context); return; + } uint32_t line, column; tokenStream.srcCoords.lineNumAndColumnIndex(openedPos, &line, &column); @@ -1048,8 +1050,10 @@ Parser::reportRedeclaration(HandlePropertyName name, DeclarationKi } auto notes = MakeUnique(); - if (!notes) + if (!notes) { + ReportOutOfMemory(pc->sc()->context); return; + } uint32_t line, column; tokenStream.srcCoords.lineNumAndColumnIndex(prevPos, &line, &column); diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index ee7a38064f62..7b8278820e79 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -6341,8 +6341,10 @@ CreateErrorNoteVA(JSContext* cx, ErrorArgumentsType argumentsType, va_list ap) { auto note = MakeUnique(); - if (!note) + if (!note) { + ReportOutOfMemory(cx); return nullptr; + } note->errorNumber = errorNumber; note->filename = filename; @@ -6424,8 +6426,10 @@ UniquePtr JSErrorNotes::copy(JSContext* cx) { auto copiedNotes = MakeUnique(); - if (!copiedNotes) + if (!copiedNotes) { + ReportOutOfMemory(cx); return nullptr; + } for (auto&& note : *this) { js::UniquePtr copied(CopyErrorNote(cx, note.get())); From 1f762da8a6b6814b9c0506f99e3d9894320ee39d Mon Sep 17 00:00:00 2001 From: Joel Maher Date: Mon, 20 Mar 2017 11:48:46 -0400 Subject: [PATCH 033/169] Bug 1139795 - disable /html/dom/dynamic-markup-insertion/opening-the-input-stream/010.html due to bad timing. r=jgraham MozReview-Commit-ID: 49YuAQjjYoH --- .../opening-the-input-stream/010.html.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/web-platform/meta/html/dom/dynamic-markup-insertion/opening-the-input-stream/010.html.ini b/testing/web-platform/meta/html/dom/dynamic-markup-insertion/opening-the-input-stream/010.html.ini index 5c0676447c85..305a9b61b15d 100644 --- a/testing/web-platform/meta/html/dom/dynamic-markup-insertion/opening-the-input-stream/010.html.ini +++ b/testing/web-platform/meta/html/dom/dynamic-markup-insertion/opening-the-input-stream/010.html.ini @@ -1,5 +1,5 @@ [010.html] type: testharness [Salvagability of document.opened document] - expected: FAIL + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1139795 From 8d71596a025825f875e51ea5505865b8ef81b510 Mon Sep 17 00:00:00 2001 From: Joel Maher Date: Mon, 20 Mar 2017 11:48:52 -0400 Subject: [PATCH 034/169] Bug 1332646 - Intermittent browser/base/content/test/popupNotifications/browser_popupNotification_5.js. disable for now. r=gbrown MozReview-Commit-ID: JJmkqsGzCzL --- browser/base/content/test/popupNotifications/browser.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/base/content/test/popupNotifications/browser.ini b/browser/base/content/test/popupNotifications/browser.ini index 18810ea5c2e0..c84ed3f3ea43 100644 --- a/browser/base/content/test/popupNotifications/browser.ini +++ b/browser/base/content/test/popupNotifications/browser.ini @@ -13,7 +13,7 @@ skip-if = (os == "linux" && (debug || asan)) [browser_popupNotification_4.js] skip-if = (os == "linux" && (debug || asan)) [browser_popupNotification_5.js] -skip-if = (os == "linux" && (debug || asan)) +skip-if = true # bug 1332646 [browser_popupNotification_checkbox.js] skip-if = (os == "linux" && (debug || asan)) [browser_popupNotification_keyboard.js] From 7ad583bf136f91c32fef5a02b28886bd989fa11e Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Mon, 20 Mar 2017 16:50:48 +0100 Subject: [PATCH 035/169] Backed out changeset b5a2225f267d (bug 1296492) --- dom/events/test/pointerevents/mochitest.ini | 6 +-- ...imary_pointers_boundary_events-manual.html | 40 +++---------------- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/dom/events/test/pointerevents/mochitest.ini b/dom/events/test/pointerevents/mochitest.ini index 63d13d542059..d6b7416d1569 100644 --- a/dom/events/test/pointerevents/mochitest.ini +++ b/dom/events/test/pointerevents/mochitest.ini @@ -34,10 +34,8 @@ support-files = [test_pointerevent_lostpointercapture_is_first-manual.html] support-files = pointerevent_lostpointercapture_is_first-manual.html [test_pointerevent_multiple_primary_pointers_boundary_events-manual.html] - support-files = - pointerevent_multiple_primary_pointers_boundary_events-manual.html - ../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js - ../../../../gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js + support-files = pointerevent_multiple_primary_pointers_boundary_events-manual.html + disabled = should be investigated [test_pointerevent_pointercancel_touch-manual.html] support-files = pointerevent_pointercancel_touch-manual.html [test_pointerevent_pointerenter_does_not_bubble-manual.html] diff --git a/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html b/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html index 78a495a34769..59506d0fb6bf 100644 --- a/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html +++ b/dom/events/test/pointerevents/test_pointerevent_multiple_primary_pointers_boundary_events-manual.html @@ -10,47 +10,19 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1000870 - - From 6f1ef358c89880a770bfa357e93dcac43beef347 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Mon, 20 Mar 2017 16:51:17 +0100 Subject: [PATCH 036/169] Backed out changeset 801cde6d6c3c (bug 1296492) for test failures in pointerevent_multiple_primary_pointers_boundary_events-manual.html --- .../pointerevents/mochitest_support_external.js | 3 +-- .../pointerevents/mochitest_support_internal.js | 13 ++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/dom/events/test/pointerevents/mochitest_support_external.js b/dom/events/test/pointerevents/mochitest_support_external.js index 4d97f2443c84..9aa61627f07d 100644 --- a/dom/events/test/pointerevents/mochitest_support_external.js +++ b/dom/events/test/pointerevents/mochitest_support_external.js @@ -203,7 +203,7 @@ function sendTouchEvent(int_win, elemId, touchEventType, params) { } // Helper function to run Point Event test in a new tab. -function runTestInNewWindow(aFile, aSuppressPointerIdCheck = false) { +function runTestInNewWindow(aFile) { var testURL = location.href.substring(0, location.href.lastIndexOf('/') + 1) + aFile; var testWindow = window.open(testURL, "_blank"); var testDone = false; @@ -212,7 +212,6 @@ function runTestInNewWindow(aFile, aSuppressPointerIdCheck = false) { // to the test case after DOM elements are constructed and before the load // event is fired. testWindow.addEventListener("DOMContentLoaded", function() { - testWindow.suppressPointerIdCheck = aSuppressPointerIdCheck; var e = testWindow.document.createElement('script'); e.type = 'text/javascript'; e.src = "mochitest_support_internal.js"; diff --git a/dom/events/test/pointerevents/mochitest_support_internal.js b/dom/events/test/pointerevents/mochitest_support_internal.js index e91b1794d5df..733649d99b37 100644 --- a/dom/events/test/pointerevents/mochitest_support_internal.js +++ b/dom/events/test/pointerevents/mochitest_support_internal.js @@ -69,13 +69,12 @@ function addListeners(elem) { }[event.pointerType]; // Compare the pointerId. - if (!suppressPointerIdCheck) { - resultCallback({ - name: "Mismatched event.pointerId recieved.", - status: event.pointerId, - PASS: pointerId - }); - } + resultCallback({ + name: "Mismatched event.pointerId recieved.", + status: event.pointerId, + PASS: pointerId + }); + }); }); } From de73211a6f7cbd6b361f609e240700a5a1692b20 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 20 Mar 2017 10:18:27 -0600 Subject: [PATCH 037/169] Bug 1298364 - Actually skip browser_webconsole_netlogging.js; r=jmaher I accidentally disabled the wrong test in an earlier push. This change corrects that, enabling browser_console_netlogging.js and skipping browser_webconsole_netlogging.js. --- devtools/client/webconsole/test/browser.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/client/webconsole/test/browser.ini b/devtools/client/webconsole/test/browser.ini index 5de0c42eedd3..61b135cbdb29 100644 --- a/devtools/client/webconsole/test/browser.ini +++ b/devtools/client/webconsole/test/browser.ini @@ -181,7 +181,6 @@ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 [browser_console_native_getters.js] [browser_console_navigation_marker.js] [browser_console_netlogging.js] -skip-if = true # Bug 1298364 [browser_console_nsiconsolemessage.js] [browser_console_optimized_out_vars.js] [browser_console_private_browsing.js] @@ -338,6 +337,7 @@ skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout) [browser_webconsole_message_node_id.js] [browser_webconsole_multiline_input.js] [browser_webconsole_netlogging.js] +skip-if = true # Bug 1298364 [browser_webconsole_netlogging_basic.js] [browser_webconsole_netlogging_panel.js] [browser_webconsole_netlogging_reset_filter.js] From 62d135a45fa0e5cd9d96ebe8c8bc32c1c33663ee Mon Sep 17 00:00:00 2001 From: Bob Clary Date: Mon, 20 Mar 2017 09:26:18 -0700 Subject: [PATCH 038/169] Bug 1347954 - Disable dom/media/test/test_video_to_canvas.html, r=gbrown. --- dom/media/test/mochitest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dom/media/test/mochitest.ini b/dom/media/test/mochitest.ini index 9562d7252660..91fe6fd9a543 100644 --- a/dom/media/test/mochitest.ini +++ b/dom/media/test/mochitest.ini @@ -1096,7 +1096,7 @@ tags = webvtt [test_unseekable.html] skip-if = toolkit == 'android' # android(bug 1232305) [test_video_to_canvas.html] -skip-if = android_version == '15' || android_version == '17' || (android_version == '19' && debug) || android_version == '22' # bug 1320418, android(bug 1232305) +skip-if = toolkit == 'android' # android(bug 1232305), bugs 1320418,1347953,1347954,1348140,1348386 [test_video_in_audio_element.html] skip-if = android_version == '15' || android_version == '17' # bug 1320417, 1326326, android(bug 1232323, bug 1232305) [test_videoDocumentTitle.html] From 9b62f73f51b7402ef9bc0eb03cfcc0e0745f7f0b Mon Sep 17 00:00:00 2001 From: Bob Clary Date: Mon, 20 Mar 2017 09:26:18 -0700 Subject: [PATCH 039/169] Bug 1346630 - disable test_peerConnection_captureStream_canvas_webgl.html on Mw android 4.2/17, r=dminor. --- testing/mochitest/manifests/autophone-webrtc.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/testing/mochitest/manifests/autophone-webrtc.ini b/testing/mochitest/manifests/autophone-webrtc.ini index 0e7b13602539..e5bdefd5f1de 100644 --- a/testing/mochitest/manifests/autophone-webrtc.ini +++ b/testing/mochitest/manifests/autophone-webrtc.ini @@ -79,6 +79,7 @@ skip-if = true # Bug 1149374 skip-if = true # Bug 1264340 [../tests/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html] [../tests/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html] +skip-if = android_version == '17' # bug 1346630 [../tests/dom/media/tests/mochitest/test_peerConnection_certificates.html] skip-if = true # Bug 1180968 [../tests/dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html] From 4f59a803b8eaec924309e540c7f4e7e78794c154 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Mon, 20 Mar 2017 17:33:22 +0100 Subject: [PATCH 040/169] Bug 1346810: Fix dead code mode on a CLOSED TREE; r=bustage MozReview-Commit-ID: 8xQhgp1AhSi --HG-- extra : rebase_source : 301dbc89f9db43264cb77b5c1a4d8ddb419882f1 --- js/src/wasm/WasmIonCompile.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/js/src/wasm/WasmIonCompile.cpp b/js/src/wasm/WasmIonCompile.cpp index a0d99f977c73..f49e2ddbf5ea 100644 --- a/js/src/wasm/WasmIonCompile.cpp +++ b/js/src/wasm/WasmIonCompile.cpp @@ -2466,7 +2466,7 @@ EmitLoad(FunctionCompiler& f, ValType type, Scalar::Type viewType) MemoryAccessDesc access(viewType, addr.align, addr.offset, f.trapIfNotAsmJS()); auto* ins = f.load(addr.base, &access, type); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); @@ -2611,7 +2611,7 @@ EmitAtomicsLoad(FunctionCompiler& f) MembarBeforeLoad, MembarAfterLoad); auto* ins = f.load(addr.base, &access, ValType::I32); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); @@ -2650,7 +2650,7 @@ EmitAtomicsBinOp(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); auto* ins = f.atomicBinopHeap(op, addr.base, &access, value); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); @@ -2670,7 +2670,7 @@ EmitAtomicsCompareExchange(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); auto* ins = f.atomicCompareExchangeHeap(addr.base, &access, oldValue, newValue); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); @@ -2689,7 +2689,7 @@ EmitAtomicsExchange(FunctionCompiler& f) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset())); auto* ins = f.atomicExchangeHeap(addr.base, &access, value); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); @@ -2916,7 +2916,7 @@ EmitSimdLoad(FunctionCompiler& f, ValType resultType, unsigned numElems) MemoryAccessDesc access(viewType, addr.align, addr.offset, Some(f.trapOffset()), numElems); auto* ins = f.load(addr.base, &access, resultType); - if (!ins) + if (!f.inDeadCode() && !ins) return false; f.iter().setResult(ins); From c17f4e418b09492ad866443bdfe2db93dcf8fd45 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Mon, 20 Mar 2017 18:28:52 +0100 Subject: [PATCH 041/169] Bug 1340163 - Fix a test failure related to ContentPrincipalInfo.origin usage, r=me CLOSED TREE --- dom/media/tests/mochitest/test_enumerateDevices.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dom/media/tests/mochitest/test_enumerateDevices.html b/dom/media/tests/mochitest/test_enumerateDevices.html index 9e6d25cfd6dc..dd4db59d763f 100644 --- a/dom/media/tests/mochitest/test_enumerateDevices.html +++ b/dom/media/tests/mochitest/test_enumerateDevices.html @@ -117,8 +117,7 @@ runTest(async () => { "Same origin deviceId for " + device.label + " must match"); } for (let device of differentOriginDevices) { - // TODO: s/todo/ok/ once bug 1340163 is fixed. - todo(!devices.find(d => d.deviceId == device.deviceId), + ok(!devices.find(d => d.deviceId == device.deviceId), "Different origin deviceId for " + device.label + " must be different"); } From b7c9ae474ceb56fc233a6ca349d26133cac6f562 Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Mon, 20 Mar 2017 18:49:04 +0100 Subject: [PATCH 042/169] Bug 1342722 - Firefox cache used all available inodes on the system, r=honzab When overlimit eviction is too slow the new content might be stored much faster than the old one is deleted. In such case the cache can grow far beyond the cache size limit. This patch implements a hard limit (105% of cache size limit) when we stop caching any new content. --- netwerk/cache2/CacheFileIOManager.cpp | 35 +++++++++++++++++++++++++-- netwerk/cache2/CacheFileIOManager.h | 4 +++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/netwerk/cache2/CacheFileIOManager.cpp b/netwerk/cache2/CacheFileIOManager.cpp index b3528f99b462..9bc7f7fd75d3 100644 --- a/netwerk/cache2/CacheFileIOManager.cpp +++ b/netwerk/cache2/CacheFileIOManager.cpp @@ -1090,6 +1090,7 @@ CacheFileIOManager::CacheFileIOManager() , mTreeCreated(false) , mTreeCreationFailed(false) , mOverLimitEvicting(false) + , mCacheSizeOnHardLimit(false) , mRemovingTrashDirs(false) { LOG(("CacheFileIOManager::CacheFileIOManager [this=%p]", this)); @@ -1991,8 +1992,15 @@ CacheFileIOManager::WriteInternal(CacheFileHandle *aHandle, int64_t aOffset, return NS_ERROR_NOT_AVAILABLE; } - // Check whether this write would cause critical low disk space. + // When this operation would increase cache size, check whether the cache size + // reached the hard limit and whether it would cause critical low disk space. if (aHandle->mFileSize < aOffset + aCount) { + if (mOverLimitEvicting && mCacheSizeOnHardLimit) { + LOG(("CacheFileIOManager::WriteInternal() - failing because cache size " + "reached hard limit!")); + return NS_ERROR_FILE_DISK_FULL; + } + int64_t freeSpace = -1; rv = mCacheDirectory->GetDiskSpaceAvailable(&freeSpace); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -2523,8 +2531,15 @@ CacheFileIOManager::TruncateSeekSetEOFInternal(CacheFileHandle *aHandle, return NS_ERROR_NOT_AVAILABLE; } - // Check whether this operation would cause critical low disk space. + // When this operation would increase cache size, check whether the cache size + // reached the hard limit and whether it would cause critical low disk space. if (aHandle->mFileSize < aEOFPos) { + if (mOverLimitEvicting && mCacheSizeOnHardLimit) { + LOG(("CacheFileIOManager::TruncateSeekSetEOFInternal() - failing because " + "cache size reached hard limit!")); + return NS_ERROR_FILE_DISK_FULL; + } + int64_t freeSpace = -1; rv = mCacheDirectory->GetDiskSpaceAvailable(&freeSpace); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -2789,6 +2804,20 @@ CacheFileIOManager::OverLimitEvictionInternal() if (cacheUsage > cacheLimit) { LOG(("CacheFileIOManager::OverLimitEvictionInternal() - Cache size over " "limit. [cacheSize=%u, limit=%u]", cacheUsage, cacheLimit)); + + // We allow cache size to go over the specified limit. Eviction should + // keep the size within the limit in a long run, but in case the eviction + // is too slow, the cache could go way over the limit. To prevent this we + // set flag mCacheSizeOnHardLimit when the size reaches 105% of the limit + // and WriteInternal() and TruncateSeekSetEOFInternal() fail to cache + // additional data. + if ((cacheUsage - cacheLimit) > (cacheLimit / 20)) { + LOG(("CacheFileIOManager::OverLimitEvictionInternal() - Cache size " + "reached hard limit.")); + mCacheSizeOnHardLimit = true; + } else { + mCacheSizeOnHardLimit = false; + } } else if (freeSpace != 1 && freeSpace < freeSpaceLimit) { LOG(("CacheFileIOManager::OverLimitEvictionInternal() - Free space under " "limit. [freeSpace=%" PRId64 ", freeSpaceLimit=%u]", freeSpace, @@ -2798,6 +2827,8 @@ CacheFileIOManager::OverLimitEvictionInternal() "free space in limits. [cacheSize=%ukB, cacheSizeLimit=%ukB, " "freeSpace=%" PRId64 ", freeSpaceLimit=%u]", cacheUsage, cacheLimit, freeSpace, freeSpaceLimit)); + + mCacheSizeOnHardLimit = false; return NS_OK; } diff --git a/netwerk/cache2/CacheFileIOManager.h b/netwerk/cache2/CacheFileIOManager.h index 5ac812da5d4b..268f22cc8deb 100644 --- a/netwerk/cache2/CacheFileIOManager.h +++ b/netwerk/cache2/CacheFileIOManager.h @@ -474,6 +474,10 @@ private: nsTArray > mScheduledMetadataWrites; nsCOMPtr mMetadataWritesTimer; bool mOverLimitEvicting; + // When overlimit eviction is too slow and cache size reaches 105% of the + // limit, this flag is set and no other content is cached to prevent + // uncontrolled cache growing. + bool mCacheSizeOnHardLimit; bool mRemovingTrashDirs; nsCOMPtr mTrashTimer; nsCOMPtr mTrashDir; From 9762f3355292bb78eedb947139ef4b212c1f3d9d Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Mon, 20 Mar 2017 13:44:14 -0400 Subject: [PATCH 043/169] Bug 1347238 - Add a check for rootNode in getAllGrids. r=pbro --- devtools/server/actors/layout.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/devtools/server/actors/layout.js b/devtools/server/actors/layout.js index 2b32f5d0a174..2edbd70b59a2 100644 --- a/devtools/server/actors/layout.js +++ b/devtools/server/actors/layout.js @@ -125,11 +125,16 @@ var LayoutActor = ActorClassWithSpec(layoutSpec, { * @return {Array} An array of GridActor objects. */ getAllGrids: function (rootNode, traverseFrames) { + let grids = []; + + if (!rootNode) { + return grids; + } + if (!traverseFrames) { return this.getGrids(rootNode.rawNode); } - let grids = []; for (let {document} of this.tabActor.windows) { grids = [...grids, ...this.getGrids(document.documentElement)]; } From d7a064779db06c972437f30db406ce3c662e28ba Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Wed, 15 Mar 2017 16:43:21 -0700 Subject: [PATCH 044/169] Bug 1348155 - Annotate allocation API, r=jonco --HG-- extra : rebase_source : 8968be9fb56115c24aa460ed42ace262cce572a7 --- js/src/devtools/rootAnalysis/annotations.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/src/devtools/rootAnalysis/annotations.js b/js/src/devtools/rootAnalysis/annotations.js index 16e4ebdcd4fa..c369ee81a1d1 100644 --- a/js/src/devtools/rootAnalysis/annotations.js +++ b/js/src/devtools/rootAnalysis/annotations.js @@ -10,10 +10,6 @@ var GCSuppressionTypes = []; var ignoreIndirectCalls = { "mallocSizeOf" : true, "aMallocSizeOf" : true, - "_malloc_message" : true, - "je_malloc_message" : true, - "chunk_dalloc" : true, - "chunk_alloc" : true, "__conv" : true, "__convf" : true, "prerrortable.c:callback_newtable" : true, @@ -175,6 +171,12 @@ var ignoreFunctions = { // Bug 1056410 - devirtualization prevents the standard nsISupports::Release heuristic from working "uint32 nsXPConnect::Release()" : true, + // Allocation API + "malloc": true, + "calloc": true, + "realloc": true, + "free": true, + // FIXME! "NS_LogInit": true, "NS_LogTerm": true, From f7f866f2f8d784bbe4a937317e026009120cffab Mon Sep 17 00:00:00 2001 From: Ganesh Chaitanya Kale Date: Mon, 20 Mar 2017 22:20:50 +0530 Subject: [PATCH 045/169] Bug 1342370 - Remove focus ring from common.css as its already in global.css. r=dao --HG-- extra : rebase_source : d853cd4455b3fedb1610e016bf58dbae0df5bce6 --- toolkit/themes/linux/global/in-content/common.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/toolkit/themes/linux/global/in-content/common.css b/toolkit/themes/linux/global/in-content/common.css index a4f89d209d0f..898e74df910b 100644 --- a/toolkit/themes/linux/global/in-content/common.css +++ b/toolkit/themes/linux/global/in-content/common.css @@ -90,10 +90,6 @@ xul|*.numberbox-input-box { border-width: 0; } -xul|*.text-link:-moz-focusring { - border: 1px dotted -moz-DialogText; -} - xul|menulist:-moz-focusring > xul|*.menulist-label-box, xul|radio[focused="true"] > xul|*.radio-label-box, html|input[type="checkbox"]:-moz-focusring + html|label:before { From 218f799b87cfea9dd83f3e5a14ad962c8f51d42b Mon Sep 17 00:00:00 2001 From: Ben Hearsum Date: Mon, 20 Mar 2017 14:29:06 -0400 Subject: [PATCH 046/169] bug 1348922: make release automation update websense bypass rule. r=rail --- testing/mozharness/configs/releases/updates_firefox_release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/mozharness/configs/releases/updates_firefox_release.py b/testing/mozharness/configs/releases/updates_firefox_release.py index b9a21e6216c9..a4cd73498581 100644 --- a/testing/mozharness/configs/releases/updates_firefox_release.py +++ b/testing/mozharness/configs/releases/updates_firefox_release.py @@ -40,7 +40,7 @@ config = { "mar_channel_ids": [], "channel_names": ["release", "release-localtest", "release-cdntest"], "rules_to_update": ["firefox-release-cdntest", "firefox-release-localtest"], - "publish_rules": ["firefox-release"], + "publish_rules": ["firefox-release", "firefox-release-nowebsense-bypass"], }, }, "balrog_use_dummy_suffix": False, From 2be5900b6bd881cf6b3ec9ad4b75e4eea47a87af Mon Sep 17 00:00:00 2001 From: Michael Layzell Date: Mon, 20 Mar 2017 14:40:25 -0400 Subject: [PATCH 047/169] Bug 1347224 - Part 1: Expose fallible methods on the rust ns[C]String bindings, r=froydnj This patch adds a series of fallible methods for the rust ns[C]String bindings, as well as the `set_length` method, which is the same as the `SetLength` method in C++. `set_length` is marked as unsafe. The decision was made to make the fallible methods seperate from the infallible methods, and to use seperate Rust->C++ bindings for each of them, rather than only binding the fallible bindings, and unwrapping them in rust-land. This is to try to match the C++ API as closely as possible, and to ensure that the behavior matches. MozReview-Commit-ID: FkSomkFUFGD --- xpcom/rust/nsstring/src/lib.rs | 309 ++++++++++++++++++++++++------- xpcom/string/nsReadableUtils.cpp | 10 + xpcom/string/nsSubstring.cpp | 38 +++- 3 files changed, 289 insertions(+), 68 deletions(-) diff --git a/xpcom/rust/nsstring/src/lib.rs b/xpcom/rust/nsstring/src/lib.rs index 9f368a563bc6..7062c17cf362 100644 --- a/xpcom/rust/nsstring/src/lib.rs +++ b/xpcom/rust/nsstring/src/lib.rs @@ -117,6 +117,7 @@ use std::ops::{Deref, DerefMut}; use std::marker::PhantomData; +use std::borrow; use std::slice; use std::ptr; use std::mem; @@ -150,11 +151,20 @@ const F_CLASS_FIXED: u32 = 1 << 16; // indicates that |this| is of type nsTFixed macro_rules! define_string_types { { char_t = $char_t: ty; + AString = $AString: ident; String = $String: ident; FixedString = $FixedString: ident; + StringLike = $StringLike: ident; + StringAdapter = $StringAdapter: ident; + StringRepr = $StringRepr: ident; + + drop = $drop: ident; + assign = $assign: ident, $fallible_assign: ident; + append = $append: ident, $fallible_append: ident; + set_length = $set_length: ident, $fallible_set_length: ident; } => { /// The representation of a ns[C]String type in C++. This type is /// used internally by our definition of ns[C]String to ensure layout @@ -208,6 +218,72 @@ macro_rules! define_string_types { _prohibit_constructor: [u8; 0], } + impl $AString { + /// Assign the value of `other` into self, overwriting any value + /// currently stored. Performs an optimized assignment when possible + /// if `other` is a `nsA[C]String`. + pub fn assign(&mut self, other: &T) { + unsafe { $assign(self, other.adapt().as_ptr()) }; + } + + /// Assign the value of `other` into self, overwriting any value + /// currently stored. Performs an optimized assignment when possible + /// if `other` is a `nsA[C]String`. + /// + /// Returns Ok(()) on success, and Err(()) if the allocation failed. + pub fn fallible_assign(&mut self, other: &T) -> Result<(), ()> { + if unsafe { $fallible_assign(self, other.adapt().as_ptr()) } { + Ok(()) + } else { + Err(()) + } + } + + /// Append the value of `other` into self. + pub fn append(&mut self, other: &T) { + unsafe { $append(self, other.adapt().as_ptr()) }; + } + + /// Append the value of `other` into self. + /// + /// Returns Ok(()) on success, and Err(()) if the allocation failed. + pub fn fallible_append(&mut self, other: &T) -> Result<(), ()> { + if unsafe { $fallible_append(self, other.adapt().as_ptr()) } { + Ok(()) + } else { + Err(()) + } + } + + /// Set the length of the string to the passed-in length, and expand + /// the backing capacity to match. This method is unsafe as it can + /// expose uninitialized memory when len is greater than the current + /// length of the string. + pub unsafe fn set_length(&mut self, len: u32) { + $set_length(self, len); + } + + /// Set the length of the string to the passed-in length, and expand + /// the backing capacity to match. This method is unsafe as it can + /// expose uninitialized memory when len is greater than the current + /// length of the string. + /// + /// Returns Ok(()) on success, and Err(()) if the allocation failed. + pub unsafe fn fallible_set_length(&mut self, len: u32) -> Result<(), ()> { + if $fallible_set_length(self, len) { + Ok(()) + } else { + Err(()) + } + } + + pub fn truncate(&mut self) { + unsafe { + self.set_length(0); + } + } + } + impl Deref for $AString { type Target = [$char_t]; fn deref(&self) -> &[$char_t] { @@ -277,6 +353,14 @@ macro_rules! define_string_types { } } + impl<'a> Drop for $String<'a> { + fn drop(&mut self) { + unsafe { + $drop(&mut **self); + } + } + } + impl<'a> Deref for $String<'a> { type Target = $AString; fn deref(&self) -> &$AString { @@ -511,6 +595,93 @@ macro_rules! define_string_types { $AString::eq(self, *other) } } + + /// An adapter type to allow for passing both types which coerce to + /// &[$char_type], and &$AString to a function, while still performing + /// optimized operations when passed the $AString. + pub enum $StringAdapter<'a> { + Borrowed($String<'a>), + Abstract(&'a $AString), + } + + impl<'a> $StringAdapter<'a> { + fn as_ptr(&self) -> *const $AString { + &**self + } + } + + impl<'a> Deref for $StringAdapter<'a> { + type Target = $AString; + + fn deref(&self) -> &$AString { + match *self { + $StringAdapter::Borrowed(ref s) => s, + $StringAdapter::Abstract(ref s) => s, + } + } + } + + /// This trait is implemented on types which are `ns[C]String`-like, in + /// that they can at very low cost be converted to a borrowed + /// `&nsA[C]String`. Unfortunately, the intermediate type + /// `ns[C]StringAdapter` is required as well due to types like `&[u8]` + /// needing to be (cheaply) wrapped in a `nsCString` on the stack to + /// create the `&nsACString`. + /// + /// This trait is used to DWIM when calling the methods on + /// `nsA[C]String`. + pub trait $StringLike { + fn adapt(&self) -> $StringAdapter; + } + + impl<'a, T: $StringLike + ?Sized> $StringLike for &'a T { + fn adapt(&self) -> $StringAdapter { + ::adapt(*self) + } + } + + impl<'a, T> $StringLike for borrow::Cow<'a, T> + where T: $StringLike + borrow::ToOwned + ?Sized { + fn adapt(&self) -> $StringAdapter { + ::adapt(self.as_ref()) + } + } + + impl $StringLike for $AString { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Abstract(self) + } + } + + impl<'a> $StringLike for $String<'a> { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Abstract(self) + } + } + + impl<'a> $StringLike for $FixedString<'a> { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Abstract(self) + } + } + + impl $StringLike for [$char_t] { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Borrowed($String::from(self)) + } + } + + impl $StringLike for Vec<$char_t> { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Borrowed($String::from(&self[..])) + } + } + + impl $StringLike for Box<[$char_t]> { + fn adapt(&self) -> $StringAdapter { + $StringAdapter::Borrowed($String::from(&self[..])) + } + } } } @@ -525,53 +696,45 @@ define_string_types! { String = nsCString; FixedString = nsFixedCString; + StringLike = nsCStringLike; + StringAdapter = nsCStringAdapter; + StringRepr = nsCStringRepr; + + drop = Gecko_FinalizeCString; + assign = Gecko_AssignCString, Gecko_FallibleAssignCString; + append = Gecko_AppendCString, Gecko_FallibleAppendCString; + set_length = Gecko_SetLengthCString, Gecko_FallibleSetLengthCString; } impl nsACString { - pub fn assign + ?Sized>(&mut self, other: &T) { - let s = nsCString::from(other.as_ref()); - unsafe { - Gecko_AssignCString(self, &*s); - } - } - - pub fn assign_utf16 + ?Sized>(&mut self, other: &T) { - self.assign(&[]); + pub fn assign_utf16(&mut self, other: &T) { + self.truncate(); self.append_utf16(other); } - pub fn append + ?Sized>(&mut self, other: &T) { - let s = nsCString::from(other.as_ref()); + pub fn fallible_assign_utf16(&mut self, other: &T) -> Result<(), ()> { + self.truncate(); + self.fallible_append_utf16(other) + } + + pub fn append_utf16(&mut self, other: &T) { unsafe { - Gecko_AppendCString(self, &*s); + Gecko_AppendUTF16toCString(self, other.adapt().as_ptr()); } } - pub fn append_utf16 + ?Sized>(&mut self, other: &T) { - let s = nsString::from(other.as_ref()); - unsafe { - Gecko_AppendUTF16toCString(self, &*s); + pub fn fallible_append_utf16(&mut self, other: &T) -> Result<(), ()> { + if unsafe { Gecko_FallibleAppendUTF16toCString(self, other.adapt().as_ptr()) } { + Ok(()) + } else { + Err(()) } } pub unsafe fn as_str_unchecked(&self) -> &str { str::from_utf8_unchecked(self) } - - pub fn truncate(&mut self) { - unsafe { - Gecko_TruncateCString(self); - } - } -} - -impl<'a> Drop for nsCString<'a> { - fn drop(&mut self) { - unsafe { - Gecko_FinalizeCString(&mut **self); - } - } } impl<'a> From<&'a str> for nsCString<'a> { @@ -618,6 +781,24 @@ impl cmp::PartialEq for nsACString { } } +impl nsCStringLike for str { + fn adapt(&self) -> nsCStringAdapter { + nsCStringAdapter::Borrowed(nsCString::from(self)) + } +} + +impl nsCStringLike for String { + fn adapt(&self) -> nsCStringAdapter { + nsCStringAdapter::Borrowed(nsCString::from(&self[..])) + } +} + +impl nsCStringLike for Box { + fn adapt(&self) -> nsCStringAdapter { + nsCStringAdapter::Borrowed(nsCString::from(&self[..])) + } +} + #[macro_export] macro_rules! ns_auto_cstring { ($name:ident) => { @@ -637,47 +818,39 @@ define_string_types! { String = nsString; FixedString = nsFixedString; + StringLike = nsStringLike; + StringAdapter = nsStringAdapter; + StringRepr = nsStringRepr; + + drop = Gecko_FinalizeString; + assign = Gecko_AssignString, Gecko_FallibleAssignString; + append = Gecko_AppendString, Gecko_FallibleAppendString; + set_length = Gecko_SetLengthString, Gecko_FallibleSetLengthString; } impl nsAString { - pub fn assign + ?Sized>(&mut self, other: &T) { - let s = nsString::from(other.as_ref()); - unsafe { - Gecko_AssignString(self, &*s); - } - } - - pub fn assign_utf8 + ?Sized>(&mut self, other: &T) { - self.assign(&[]); + pub fn assign_utf8(&mut self, other: &T) { + self.truncate(); self.append_utf8(other); } - pub fn append + ?Sized>(&mut self, other: &T) { - let s = nsString::from(other.as_ref()); + pub fn fallible_assign_utf8(&mut self, other: &T) -> Result<(), ()> { + self.truncate(); + self.fallible_append_utf8(other) + } + + pub fn append_utf8(&mut self, other: &T) { unsafe { - Gecko_AppendString(self, &*s); + Gecko_AppendUTF8toString(self, other.adapt().as_ptr()); } } - pub fn append_utf8 + ?Sized>(&mut self, other: &T) { - let s = nsCString::from(other.as_ref()); - unsafe { - Gecko_AppendUTF8toString(self, &*s); - } - } - - pub fn truncate(&mut self) { - unsafe { - Gecko_TruncateString(self); - } - } -} - -impl<'a> Drop for nsString<'a> { - fn drop(&mut self) { - unsafe { - Gecko_FinalizeString(&mut **self); + pub fn fallible_append_utf8(&mut self, other: &T) -> Result<(), ()> { + if unsafe { Gecko_FallibleAppendUTF8toString(self, other.adapt().as_ptr()) } { + Ok(()) + } else { + Err(()) } } } @@ -730,26 +903,34 @@ macro_rules! ns_auto_string { #[allow(non_snake_case)] unsafe fn Gecko_IncrementStringAdoptCount(_: *mut c_void) {} -// NOTE: These bindings currently only expose infallible operations. Perhaps -// consider allowing for fallible methods? extern "C" { #[cfg(debug_assertions)] fn Gecko_IncrementStringAdoptCount(data: *mut c_void); // Gecko implementation in nsSubstring.cpp fn Gecko_FinalizeCString(this: *mut nsACString); + fn Gecko_AssignCString(this: *mut nsACString, other: *const nsACString); fn Gecko_AppendCString(this: *mut nsACString, other: *const nsACString); - fn Gecko_TruncateCString(this: *mut nsACString); + fn Gecko_SetLengthCString(this: *mut nsACString, length: u32); + fn Gecko_FallibleAssignCString(this: *mut nsACString, other: *const nsACString) -> bool; + fn Gecko_FallibleAppendCString(this: *mut nsACString, other: *const nsACString) -> bool; + fn Gecko_FallibleSetLengthCString(this: *mut nsACString, length: u32) -> bool; fn Gecko_FinalizeString(this: *mut nsAString); + fn Gecko_AssignString(this: *mut nsAString, other: *const nsAString); fn Gecko_AppendString(this: *mut nsAString, other: *const nsAString); - fn Gecko_TruncateString(this: *mut nsAString); + fn Gecko_SetLengthString(this: *mut nsAString, length: u32); + fn Gecko_FallibleAssignString(this: *mut nsAString, other: *const nsAString) -> bool; + fn Gecko_FallibleAppendString(this: *mut nsAString, other: *const nsAString) -> bool; + fn Gecko_FallibleSetLengthString(this: *mut nsAString, length: u32) -> bool; // Gecko implementation in nsReadableUtils.cpp fn Gecko_AppendUTF16toCString(this: *mut nsACString, other: *const nsAString); fn Gecko_AppendUTF8toString(this: *mut nsAString, other: *const nsACString); + fn Gecko_FallibleAppendUTF16toCString(this: *mut nsACString, other: *const nsAString) -> bool; + fn Gecko_FallibleAppendUTF8toString(this: *mut nsAString, other: *const nsACString) -> bool; } ////////////////////////////////////// diff --git a/xpcom/string/nsReadableUtils.cpp b/xpcom/string/nsReadableUtils.cpp index 524b1d7fed41..3c6af1cd8f31 100644 --- a/xpcom/string/nsReadableUtils.cpp +++ b/xpcom/string/nsReadableUtils.cpp @@ -1380,4 +1380,14 @@ void Gecko_AppendUTF8toString(nsAString* aThis, const nsACString* aOther) AppendUTF8toUTF16(*aOther, *aThis); } +bool Gecko_FallibleAppendUTF16toCString(nsACString* aThis, const nsAString* aOther) +{ + return AppendUTF16toUTF8(*aOther, *aThis, mozilla::fallible); +} + +bool Gecko_FallibleAppendUTF8toString(nsAString* aThis, const nsACString* aOther) +{ + return AppendUTF8toUTF16(*aOther, *aThis, mozilla::fallible); +} + } diff --git a/xpcom/string/nsSubstring.cpp b/xpcom/string/nsSubstring.cpp index d5fdf14f887a..34a5e4813e94 100644 --- a/xpcom/string/nsSubstring.cpp +++ b/xpcom/string/nsSubstring.cpp @@ -370,9 +370,24 @@ void Gecko_AppendCString(nsACString* aThis, const nsACString* aOther) aThis->Append(*aOther); } -void Gecko_TruncateCString(nsACString* aThis) +void Gecko_SetLengthCString(nsACString* aThis, uint32_t aLength) { - aThis->Truncate(); + aThis->SetLength(aLength); +} + +bool Gecko_FallibleAssignCString(nsACString* aThis, const nsACString* aOther) +{ + return aThis->Assign(*aOther, mozilla::fallible); +} + +bool Gecko_FallibleAppendCString(nsACString* aThis, const nsACString* aOther) +{ + return aThis->Append(*aOther, mozilla::fallible); +} + +bool Gecko_FallibleSetLengthCString(nsACString* aThis, uint32_t aLength) +{ + return aThis->SetLength(aLength, mozilla::fallible); } void Gecko_FinalizeString(nsAString* aThis) @@ -390,9 +405,24 @@ void Gecko_AppendString(nsAString* aThis, const nsAString* aOther) aThis->Append(*aOther); } -void Gecko_TruncateString(nsAString* aThis) +void Gecko_SetLengthString(nsAString* aThis, uint32_t aLength) { - aThis->Truncate(); + aThis->SetLength(aLength); +} + +bool Gecko_FallibleAssignString(nsAString* aThis, const nsAString* aOther) +{ + return aThis->Assign(*aOther, mozilla::fallible); +} + +bool Gecko_FallibleAppendString(nsAString* aThis, const nsAString* aOther) +{ + return aThis->Append(*aOther, mozilla::fallible); +} + +bool Gecko_FallibleSetLengthString(nsAString* aThis, uint32_t aLength) +{ + return aThis->SetLength(aLength, mozilla::fallible); } } // extern "C" From a09ec7fe7715c1e85580c345dbb5ca866efa424c Mon Sep 17 00:00:00 2001 From: Michael Layzell Date: Mon, 20 Mar 2017 14:40:31 -0400 Subject: [PATCH 048/169] Bug 1347224 - Part 2: Re-add Gecko_Truncate[C]String temporarially to avoid stylo breakage, r=froydnj MozReview-Commit-ID: 1EhKt434D3k --- xpcom/string/nsSubstring.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/xpcom/string/nsSubstring.cpp b/xpcom/string/nsSubstring.cpp index 34a5e4813e94..bcb943dc21c2 100644 --- a/xpcom/string/nsSubstring.cpp +++ b/xpcom/string/nsSubstring.cpp @@ -425,4 +425,18 @@ bool Gecko_FallibleSetLengthString(nsAString* aThis, uint32_t aLength) return aThis->SetLength(aLength, mozilla::fallible); } +// NOTE: These two methods, Gecko_TruncateString and Gecko_TruncateCString are +// not used by the nsstring bindings, but until the version in servo +// (nsstring_vendor) is udpated, they still need to be included in the binary to +// not break the tree. These will be removed in bug 1348398. +void Gecko_TruncateString(nsAString* aThis) +{ + aThis->Truncate(); +} + +void Gecko_TruncateCString(nsACString* aThis) +{ + aThis->Truncate(); +} + } // extern "C" From b4e127c04411552758f623bec5b5c376a2b6a596 Mon Sep 17 00:00:00 2001 From: Stone Shih Date: Wed, 15 Mar 2017 13:11:36 +0800 Subject: [PATCH 049/169] Bug 1346166 - Test full screen api by pointer events. r=smaug MozReview-Commit-ID: BBg7olhtMA --- dom/events/test/pointerevents/mochitest.ini | 21 ++++---- ..._trigger_fullscreen_by_pointer_events.html | 53 +++++++++++++++++++ 2 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 dom/events/test/pointerevents/test_trigger_fullscreen_by_pointer_events.html diff --git a/dom/events/test/pointerevents/mochitest.ini b/dom/events/test/pointerevents/mochitest.ini index d6b7416d1569..0084d7a6087d 100644 --- a/dom/events/test/pointerevents/mochitest.ini +++ b/dom/events/test/pointerevents/mochitest.ini @@ -6,6 +6,16 @@ support-files = pointerevent_styles.css pointerevent_support.js +[test_bug1285128.html] +[test_bug1293174_implicit_pointer_capture_for_touch_1.html] + support-files = bug1293174_implicit_pointer_capture_for_touch_1.html +[test_bug1293174_implicit_pointer_capture_for_touch_2.html] + support-files = bug1293174_implicit_pointer_capture_for_touch_2.html +[test_bug1303704.html] +[test_bug1315862.html] +[test_bug1323158.html] +[test_empty_file.html] + disabled = disabled # Bug 1150091 - Issue with support-files [test_pointerevent_attributes_hoverable_pointers-manual.html] support-files = pointerevent_attributes_hoverable_pointers-manual.html @@ -118,14 +128,5 @@ support-files = pointerevent_touch-action-pan-left-css_touch-manual.html pointerevent_touch-action-pan-right-css_touch-manual.html pointerevent_touch-action-pan-up-css_touch-manual.html -[test_bug1285128.html] -[test_bug1293174_implicit_pointer_capture_for_touch_1.html] - support-files = bug1293174_implicit_pointer_capture_for_touch_1.html -[test_bug1293174_implicit_pointer_capture_for_touch_2.html] - support-files = bug1293174_implicit_pointer_capture_for_touch_2.html -[test_bug1303704.html] -[test_bug1323158.html] +[test_trigger_fullscreen_by_pointer_events.html] [test_trigger_popup_by_pointer_events.html] -[test_empty_file.html] - disabled = disabled # Bug 1150091 - Issue with support-files -[test_bug1315862.html] diff --git a/dom/events/test/pointerevents/test_trigger_fullscreen_by_pointer_events.html b/dom/events/test/pointerevents/test_trigger_fullscreen_by_pointer_events.html new file mode 100644 index 000000000000..13913cd35dca --- /dev/null +++ b/dom/events/test/pointerevents/test_trigger_fullscreen_by_pointer_events.html @@ -0,0 +1,53 @@ + + + + + Test for triggering Fullscreen by pointer events + + + + + +
+ + + From 6d420690b1591c47f47392198520e32c64196059 Mon Sep 17 00:00:00 2001 From: "Dragana Damjanovic dd.mozilla@gmail.com" Date: Mon, 20 Mar 2017 05:26:00 -0400 Subject: [PATCH 050/169] Bug 1344171 - Improve connection management. r=mcmanus --- netwerk/protocol/http/nsHttpConnectionMgr.cpp | 199 ++++++++++++------ netwerk/protocol/http/nsHttpConnectionMgr.h | 17 +- 2 files changed, 153 insertions(+), 63 deletions(-) diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp index 4aaf5fb35a9d..9752347bd4a6 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp +++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp @@ -668,6 +668,29 @@ nsHttpConnectionMgr::CloseIdleConnection(nsHttpConnection *conn) return NS_OK; } +nsresult +nsHttpConnectionMgr::RemoveIdleConnection(nsHttpConnection *conn) +{ + MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); + + LOG(("nsHttpConnectionMgr::RemoveIdleConnection %p conn=%p", + this, conn)); + + if (!conn->ConnectionInfo()) { + return NS_ERROR_UNEXPECTED; + } + + nsConnectionEntry *ent = LookupConnectionEntry(conn->ConnectionInfo(), + conn, nullptr); + + if (!ent || !ent->mIdleConns.RemoveElement(conn)) { + return NS_ERROR_UNEXPECTED; + } + + mNumIdleConns--; + return NS_OK; +} + // This function lets a connection, after completing the NPN phase, // report whether or not it is using spdy through the usingSpdy // argument. It would not be necessary if NPN were driven out of @@ -909,14 +932,10 @@ nsHttpConnectionMgr::DispatchPendingQ(nsTArraymActiveConn); RefPtr halfOpen = do_QueryReferent(pendingTransInfo->mHalfOpen); + LOG(("nsHttpConnectionMgr::ProcessPendingQForEntry " + "[trans=%p, halfOpen=%p]\n", + pendingTransInfo->mTransaction.get(), halfOpen.get())); if (halfOpen) { - // The half open socket was made for this transaction, in - // that case ent->mHalfOpens[j]->Transaction() == trans or - // the half open socket was opened speculatively and this - // transaction took it (in this case it must be: - // ent->mHalfOpens[j]->Transaction().IsNullTransaction()) - MOZ_ASSERT(halfOpen->Transaction()->IsNullTransaction() || - halfOpen->Transaction() == pendingTransInfo->mTransaction); alreadyHalfOpenOrWaitingForTLS = true; } else { // If we have not found the halfOpen socket, remove the pointer. @@ -926,6 +945,9 @@ nsHttpConnectionMgr::DispatchPendingQ(nsTArraymHalfOpen); RefPtr activeConn = do_QueryReferent(pendingTransInfo->mActiveConn); + LOG(("nsHttpConnectionMgr::ProcessPendingQForEntry " + "[trans=%p, activeConn=%p]\n", + pendingTransInfo->mTransaction.get(), activeConn.get())); // Check if this transaction claimed a connection that is still // performing tls handshake with a NullHttpTransaction or it is between // finishing tls and reclaiming (When nullTrans finishes tls handshake, @@ -1147,34 +1169,17 @@ nsHttpConnectionMgr::MakeNewConnection(nsConnectionEntry *ent, uint32_t halfOpenLength = ent->mHalfOpens.Length(); for (uint32_t i = 0; i < halfOpenLength; i++) { - if (ent->mHalfOpens[i]->IsSpeculative()) { - // We've found a speculative connection in the half - // open list. Remove the speculative bit from it and that - // connection can later be used for this transaction - // (or another one in the pending queue) - we don't - // need to open a new connection here. + if (ent->mHalfOpens[i]->Claim()) { + // We've found a speculative connection or a connection that + // is free to be used in the half open list. + // A free to be used connection is a connection that was + // open for a concrete transaction, but that trunsaction + // ended up using another connection. LOG(("nsHttpConnectionMgr::MakeNewConnection [ci = %s]\n" - "Found a speculative half open connection\n", + "Found a speculative or a free-to-use half open connection\n", ent->mConnInfo->HashKey().get())); - - uint32_t flags; - ent->mHalfOpens[i]->SetSpeculative(false); pendingTransInfo->mHalfOpen = do_GetWeakReference(static_cast(ent->mHalfOpens[i])); - nsISocketTransport *transport = ent->mHalfOpens[i]->SocketTransport(); - if (transport && NS_SUCCEEDED(transport->GetConnectionFlags(&flags))) { - flags &= ~nsISocketTransport::DISABLE_RFC1918; - transport->SetConnectionFlags(flags); - } - - Telemetry::AutoCounter usedSpeculativeConn; - ++usedSpeculativeConn; - - if (ent->mHalfOpens[i]->IsFromPredictor()) { - Telemetry::AutoCounter totalPreconnectsUsed; - ++totalPreconnectsUsed; - } - // return OK because we have essentially opened a new connection // by converting a speculative half-open to general use return NS_OK; @@ -1768,13 +1773,12 @@ nsHttpConnectionMgr::ReleaseClaimedSockets(nsConnectionEntry *ent, if (pendingTransInfo->mHalfOpen) { RefPtr halfOpen = do_QueryReferent(pendingTransInfo->mHalfOpen); + LOG(("nsHttpConnectionMgr::ReleaseClaimedSockets " + "[trans=%p halfOpen=%p]", + pendingTransInfo->mTransaction.get(), + halfOpen.get())); if (halfOpen) { - if (halfOpen->Transaction() && - halfOpen->Transaction()->IsNullTransaction()) { - LOG(("nsHttpConnectionMgr::ReleaseClaimedSockets - mark halfOpne %p " - "speculative again.", halfOpen.get())); - halfOpen->SetSpeculative(true); - } + halfOpen->Unclaim(); } pendingTransInfo->mHalfOpen = nullptr; } else if (pendingTransInfo->mActiveConn) { @@ -1800,21 +1804,16 @@ nsHttpConnectionMgr::CreateTransport(nsConnectionEntry *ent, PendingTransactionInfo *pendingTransInfo) { MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); + MOZ_ASSERT((speculative && !pendingTransInfo) || + (!speculative && pendingTransInfo)); + + RefPtr sock = new nsHalfOpenSocket(ent, trans, caps, + speculative, + isFromPredictor); - RefPtr sock = new nsHalfOpenSocket(ent, trans, caps); if (speculative) { - sock->SetSpeculative(true); sock->SetAllow1918(allow1918); - Telemetry::AutoCounter totalSpeculativeConn; - ++totalSpeculativeConn; - - if (isFromPredictor) { - sock->SetIsFromPredictor(true); - Telemetry::AutoCounter totalPreconnectsCreated; - ++totalPreconnectsCreated; - } } - // The socket stream holds the reference to the half open // socket - so if the stream fails to init the half open // will go away. @@ -1824,6 +1823,8 @@ nsHttpConnectionMgr::CreateTransport(nsConnectionEntry *ent, if (pendingTransInfo) { pendingTransInfo->mHalfOpen = do_GetWeakReference(static_cast(sock)); + bool claimed = sock->Claim(); + MOZ_ASSERT(claimed); } ent->mHalfOpens.AppendElement(sock); @@ -2157,8 +2158,6 @@ nsHttpConnectionMgr::OnMsgCancelTransaction(int32_t reason, ARefBase *param) RefPtr half = do_QueryReferent(pendingTransInfo->mHalfOpen); if (half) { - MOZ_ASSERT(trans == half->Transaction() || - half->Transaction()->IsNullTransaction()); half->Abandon(); } pendingTransInfo->mHalfOpen = nullptr; @@ -2904,21 +2903,35 @@ NS_INTERFACE_MAP_END nsHttpConnectionMgr:: nsHalfOpenSocket::nsHalfOpenSocket(nsConnectionEntry *ent, nsAHttpTransaction *trans, - uint32_t caps) + uint32_t caps, + bool speculative, + bool isFromPredictor) : mEnt(ent) , mTransaction(trans) , mDispatchedMTransaction(false) , mCaps(caps) - , mSpeculative(false) - , mIsFromPredictor(false) + , mSpeculative(speculative) + , mIsFromPredictor(isFromPredictor) , mAllow1918(true) , mHasConnected(false) , mPrimaryConnectedOK(false) , mBackupConnectedOK(false) + , mFreeToUse(true) + , mPrimaryStreamStatus(NS_OK) { MOZ_ASSERT(ent && trans, "constructor with null arguments"); LOG(("Creating nsHalfOpenSocket [this=%p trans=%p ent=%s key=%s]\n", this, trans, ent->mConnInfo->Origin(), ent->mConnInfo->HashKey().get())); + + if (speculative) { + Telemetry::AutoCounter totalSpeculativeConn; + ++totalSpeculativeConn; + + if (isFromPredictor) { + Telemetry::AutoCounter totalPreconnectsCreated; + ++totalPreconnectsCreated; + } + } } nsHttpConnectionMgr::nsHalfOpenSocket::~nsHalfOpenSocket() @@ -3095,8 +3108,6 @@ nsresult nsHttpConnectionMgr::nsHalfOpenSocket::SetupBackupStreams() { MOZ_ASSERT(mTransaction); - MOZ_ASSERT(!mTransaction->IsNullTransaction(), - "null transactions dont have backup streams"); mBackupSynStarted = TimeStamp::Now(); nsresult rv = SetupStreams(getter_AddRefs(mBackupTransport), @@ -3120,7 +3131,7 @@ nsHttpConnectionMgr::nsHalfOpenSocket::SetupBackupTimer() { uint16_t timeout = gHttpHandler->GetIdleSynTimeout(); MOZ_ASSERT(!mSynTimer, "timer already initd"); - if (timeout && !mTransaction->IsDone() && !mTransaction->IsNullTransaction()) { + if (timeout && !mSpeculative) { // Setup the timer that will establish a backup socket // if we do not get a writable event on the main one. // We do this because a lost SYN takes a very long time @@ -3215,8 +3226,6 @@ nsHttpConnectionMgr::nsHalfOpenSocket::Notify(nsITimer *timer) { MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); MOZ_ASSERT(timer == mSynTimer, "wrong timer"); - MOZ_ASSERT(mTransaction && !mTransaction->IsNullTransaction(), - "null transactions dont have backup streams"); DebugOnly rv = SetupBackupStreams(); MOZ_ASSERT(NS_SUCCEEDED(rv)); @@ -3271,8 +3280,6 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) mStreamIn = nullptr; mSocketTransport = nullptr; } else if (out == mBackupStreamOut) { - MOZ_ASSERT(!mTransaction->IsNullTransaction(), - "null transactions dont have backup streams"); TimeDuration rtt = TimeStamp::Now() - mBackupSynStarted; rv = conn->Init(mEnt->mConnInfo, gHttpHandler->ConnMgr()->mMaxRequestDelay, @@ -3367,6 +3374,35 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) LOG(("nsHalfOpenSocket::OnOutputStreamReady no transaction match " "returning conn %p to pool\n", conn.get())); gHttpHandler->ConnMgr()->OnMsgReclaimConnection(0, conn); + + // We expect that there is at least one tranasction in the pending + // queue that can take this connection, but it can happened that + // all transactions are blocked or they have took other idle + // connections. In that case the connection has been added to the + // idle queue. + // If the connection is in the idle queue but it is using ssl, make + // a nulltransaction for it to finish ssl handshake! + if (mEnt->mConnInfo->FirstHopSSL() && + !mEnt->mConnInfo->UsingConnect()) { + int32_t idx = mEnt->mIdleConns.IndexOf(conn); + if (idx != -1) { + DebugOnly rv = gHttpHandler->ConnMgr()->RemoveIdleConnection(conn); + MOZ_ASSERT(NS_SUCCEEDED(rv)); + conn->EndIdleMonitoring(); + RefPtr trans; + if (mTransaction->IsNullTransaction() && + !mDispatchedMTransaction) { + mDispatchedMTransaction = true; + trans = mTransaction; + } else { + trans = new NullHttpTransaction(mEnt->mConnInfo, + callbacks, mCaps); + } + gHttpHandler->ConnMgr()->AddActiveConn(conn, mEnt); + rv = gHttpHandler->ConnMgr()-> + DispatchAbstractTransaction(mEnt, trans, mCaps, conn, 0); + } + } } } @@ -3412,6 +3448,8 @@ nsHttpConnectionMgr::nsHalfOpenSocket::OnTransportStatus(nsITransport *trans, return NS_OK; } + mPrimaryStreamStatus = status; + // if we are doing spdy coalescing and haven't recorded the ip address // for this entry before then make the hash key if our dns lookup // just completed. We can't do coalescing if using a proxy because the @@ -3497,6 +3535,47 @@ nsHttpConnectionMgr::nsHalfOpenSocket::GetInterface(const nsIID &iid, return NS_ERROR_NO_INTERFACE; } +bool +nsHttpConnectionMgr::nsHalfOpenSocket::Claim() +{ + if (mSpeculative) { + mSpeculative = false; + uint32_t flags; + if (mSocketTransport && NS_SUCCEEDED(mSocketTransport->GetConnectionFlags(&flags))) { + flags &= ~nsISocketTransport::DISABLE_RFC1918; + mSocketTransport->SetConnectionFlags(flags); + } + + Telemetry::AutoCounter usedSpeculativeConn; + ++usedSpeculativeConn; + + if (mIsFromPredictor) { + Telemetry::AutoCounter totalPreconnectsUsed; + ++totalPreconnectsUsed; + } + + if ((mPrimaryStreamStatus == NS_NET_STATUS_CONNECTING_TO) && + mEnt && !mBackupTransport && !mSynTimer) { + SetupBackupTimer(); + } + } + + if (mFreeToUse) { + mFreeToUse = false; + return true; + } + return false; +} + +void +nsHttpConnectionMgr::nsHalfOpenSocket::Unclaim() +{ + MOZ_ASSERT(!mSpeculative && !mFreeToUse); + // We will keep the backup-timer running. Most probably this halfOpen will + // be used by a transaction from which this transaction took the halfOpen. + // (this is happening because of the transaction priority.) + mFreeToUse = true; +} already_AddRefed ConnectionHandle::TakeHttpConnection() diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.h b/netwerk/protocol/http/nsHttpConnectionMgr.h index abec89a36219..f956b310c5d6 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.h +++ b/netwerk/protocol/http/nsHttpConnectionMgr.h @@ -184,6 +184,7 @@ public: // the idle connection list. It is called when the idle connection detects // that the network peer has closed the transport. MOZ_MUST_USE nsresult CloseIdleConnection(nsHttpConnection *); + MOZ_MUST_USE nsresult RemoveIdleConnection(nsHttpConnection *); // The connection manager needs to know when a normal HTTP connection has been // upgraded to SPDY because the dispatch and idle semantics are a little @@ -297,7 +298,9 @@ private: nsHalfOpenSocket(nsConnectionEntry *ent, nsAHttpTransaction *trans, - uint32_t caps); + uint32_t caps, + bool speculative, + bool isFromPredictor); MOZ_MUST_USE nsresult SetupStreams(nsISocketTransport **, nsIAsyncInputStream **, @@ -315,10 +318,8 @@ private: nsAHttpTransaction *Transaction() { return mTransaction; } bool IsSpeculative() { return mSpeculative; } - void SetSpeculative(bool val) { mSpeculative = val; } bool IsFromPredictor() { return mIsFromPredictor; } - void SetIsFromPredictor(bool val) { mIsFromPredictor = val; } bool Allow1918() { return mAllow1918; } void SetAllow1918(bool val) { mAllow1918 = val; } @@ -326,6 +327,9 @@ private: bool HasConnected() { return mHasConnected; } void PrintDiagnostics(nsCString &log); + + bool Claim(); + void Unclaim(); private: nsConnectionEntry *mEnt; RefPtr mTransaction; @@ -366,6 +370,13 @@ private: bool mPrimaryConnectedOK; bool mBackupConnectedOK; + + // A nsHalfOpenSocket can be made for a concrete non-null transaction, + // but the transaction can be dispatch to another connection. In that + // case we can free this transaction to be claimed by other + // transactions. + bool mFreeToUse; + nsresult mPrimaryStreamStatus; }; friend class nsHalfOpenSocket; From ebd9e78f82cea85dce3ffdbd495faddc27775481 Mon Sep 17 00:00:00 2001 From: Saghan Date: Thu, 16 Mar 2017 15:58:31 -0700 Subject: [PATCH 051/169] Bug 1337025 - Add event listener to command event which will be triggered when x button is clicked and repopulate the list. r=jaws --- toolkit/modules/SelectParentHelper.jsm | 1 + 1 file changed, 1 insertion(+) diff --git a/toolkit/modules/SelectParentHelper.jsm b/toolkit/modules/SelectParentHelper.jsm index 6b570a3610ae..40d301cf1af0 100644 --- a/toolkit/modules/SelectParentHelper.jsm +++ b/toolkit/modules/SelectParentHelper.jsm @@ -333,6 +333,7 @@ function populateChildren(menulist, options, selectedIndex, zoom, searchbox.addEventListener("input", onSearchInput); searchbox.addEventListener("focus", onSearchFocus); searchbox.addEventListener("blur", onSearchBlur); + searchbox.addEventListener("command", onSearchInput); // Handle special keys for exiting search searchbox.addEventListener("keydown", function(event) { From b17d737c5b445562f727422e6173149425239b96 Mon Sep 17 00:00:00 2001 From: Zibi Braniecki Date: Mon, 20 Mar 2017 15:14:58 -0400 Subject: [PATCH 052/169] Bug 1348797 - Add null-check to validTagChars test in LocaleService::NegotiateLanguages. r=jfkthame --HG-- extra : amend_source : f6dde0867a6cf10b5b2f50c3cfcf3f383d708d28 --- intl/locale/LocaleService.cpp | 2 +- .../tests/unit/test_localeService_negotiateLanguages.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/intl/locale/LocaleService.cpp b/intl/locale/LocaleService.cpp index 6374fada5227..a35c71d6bbf6 100644 --- a/intl/locale/LocaleService.cpp +++ b/intl/locale/LocaleService.cpp @@ -463,7 +463,7 @@ LocaleService::NegotiateLanguages(const char** aRequested, // Check that the given string contains only ASCII characters valid in tags // (i.e. alphanumerics, plus '-' and '_'), and is non-empty. auto validTagChars = [](const char* s) { - if (!*s) { + if (!s || !*s) { return false; } while (*s) { diff --git a/intl/locale/tests/unit/test_localeService_negotiateLanguages.js b/intl/locale/tests/unit/test_localeService_negotiateLanguages.js index 29af067708d1..8a5b33f7d6fc 100644 --- a/intl/locale/tests/unit/test_localeService_negotiateLanguages.js +++ b/intl/locale/tests/unit/test_localeService_negotiateLanguages.js @@ -86,6 +86,11 @@ const data = { ], "should not crash on invalid input": [ [null, ["fr-FR"], []], + [[null], [], []], + [[undefined], [], []], + [[undefined], [null], []], + [[undefined], [undefined], []], + [[null], [null], null, null, []], [undefined, ["fr-FR"], []], [2, ["fr-FR"], []], ["fr-FR", ["fr-FR"], []], From 2d4fb783dafeeadc2fff624ce19c2e040aa8b0f6 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 20:29:03 +0100 Subject: [PATCH 053/169] Backed out changeset 1f0db7810a84 (bug 1344171) for bustage (unused variable 'claimed'). r=backout --- netwerk/protocol/http/nsHttpConnectionMgr.cpp | 199 ++++++------------ netwerk/protocol/http/nsHttpConnectionMgr.h | 17 +- 2 files changed, 63 insertions(+), 153 deletions(-) diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp index 9752347bd4a6..4aaf5fb35a9d 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp +++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp @@ -668,29 +668,6 @@ nsHttpConnectionMgr::CloseIdleConnection(nsHttpConnection *conn) return NS_OK; } -nsresult -nsHttpConnectionMgr::RemoveIdleConnection(nsHttpConnection *conn) -{ - MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); - - LOG(("nsHttpConnectionMgr::RemoveIdleConnection %p conn=%p", - this, conn)); - - if (!conn->ConnectionInfo()) { - return NS_ERROR_UNEXPECTED; - } - - nsConnectionEntry *ent = LookupConnectionEntry(conn->ConnectionInfo(), - conn, nullptr); - - if (!ent || !ent->mIdleConns.RemoveElement(conn)) { - return NS_ERROR_UNEXPECTED; - } - - mNumIdleConns--; - return NS_OK; -} - // This function lets a connection, after completing the NPN phase, // report whether or not it is using spdy through the usingSpdy // argument. It would not be necessary if NPN were driven out of @@ -932,10 +909,14 @@ nsHttpConnectionMgr::DispatchPendingQ(nsTArraymActiveConn); RefPtr halfOpen = do_QueryReferent(pendingTransInfo->mHalfOpen); - LOG(("nsHttpConnectionMgr::ProcessPendingQForEntry " - "[trans=%p, halfOpen=%p]\n", - pendingTransInfo->mTransaction.get(), halfOpen.get())); if (halfOpen) { + // The half open socket was made for this transaction, in + // that case ent->mHalfOpens[j]->Transaction() == trans or + // the half open socket was opened speculatively and this + // transaction took it (in this case it must be: + // ent->mHalfOpens[j]->Transaction().IsNullTransaction()) + MOZ_ASSERT(halfOpen->Transaction()->IsNullTransaction() || + halfOpen->Transaction() == pendingTransInfo->mTransaction); alreadyHalfOpenOrWaitingForTLS = true; } else { // If we have not found the halfOpen socket, remove the pointer. @@ -945,9 +926,6 @@ nsHttpConnectionMgr::DispatchPendingQ(nsTArraymHalfOpen); RefPtr activeConn = do_QueryReferent(pendingTransInfo->mActiveConn); - LOG(("nsHttpConnectionMgr::ProcessPendingQForEntry " - "[trans=%p, activeConn=%p]\n", - pendingTransInfo->mTransaction.get(), activeConn.get())); // Check if this transaction claimed a connection that is still // performing tls handshake with a NullHttpTransaction or it is between // finishing tls and reclaiming (When nullTrans finishes tls handshake, @@ -1169,17 +1147,34 @@ nsHttpConnectionMgr::MakeNewConnection(nsConnectionEntry *ent, uint32_t halfOpenLength = ent->mHalfOpens.Length(); for (uint32_t i = 0; i < halfOpenLength; i++) { - if (ent->mHalfOpens[i]->Claim()) { - // We've found a speculative connection or a connection that - // is free to be used in the half open list. - // A free to be used connection is a connection that was - // open for a concrete transaction, but that trunsaction - // ended up using another connection. + if (ent->mHalfOpens[i]->IsSpeculative()) { + // We've found a speculative connection in the half + // open list. Remove the speculative bit from it and that + // connection can later be used for this transaction + // (or another one in the pending queue) - we don't + // need to open a new connection here. LOG(("nsHttpConnectionMgr::MakeNewConnection [ci = %s]\n" - "Found a speculative or a free-to-use half open connection\n", + "Found a speculative half open connection\n", ent->mConnInfo->HashKey().get())); + + uint32_t flags; + ent->mHalfOpens[i]->SetSpeculative(false); pendingTransInfo->mHalfOpen = do_GetWeakReference(static_cast(ent->mHalfOpens[i])); + nsISocketTransport *transport = ent->mHalfOpens[i]->SocketTransport(); + if (transport && NS_SUCCEEDED(transport->GetConnectionFlags(&flags))) { + flags &= ~nsISocketTransport::DISABLE_RFC1918; + transport->SetConnectionFlags(flags); + } + + Telemetry::AutoCounter usedSpeculativeConn; + ++usedSpeculativeConn; + + if (ent->mHalfOpens[i]->IsFromPredictor()) { + Telemetry::AutoCounter totalPreconnectsUsed; + ++totalPreconnectsUsed; + } + // return OK because we have essentially opened a new connection // by converting a speculative half-open to general use return NS_OK; @@ -1773,12 +1768,13 @@ nsHttpConnectionMgr::ReleaseClaimedSockets(nsConnectionEntry *ent, if (pendingTransInfo->mHalfOpen) { RefPtr halfOpen = do_QueryReferent(pendingTransInfo->mHalfOpen); - LOG(("nsHttpConnectionMgr::ReleaseClaimedSockets " - "[trans=%p halfOpen=%p]", - pendingTransInfo->mTransaction.get(), - halfOpen.get())); if (halfOpen) { - halfOpen->Unclaim(); + if (halfOpen->Transaction() && + halfOpen->Transaction()->IsNullTransaction()) { + LOG(("nsHttpConnectionMgr::ReleaseClaimedSockets - mark halfOpne %p " + "speculative again.", halfOpen.get())); + halfOpen->SetSpeculative(true); + } } pendingTransInfo->mHalfOpen = nullptr; } else if (pendingTransInfo->mActiveConn) { @@ -1804,16 +1800,21 @@ nsHttpConnectionMgr::CreateTransport(nsConnectionEntry *ent, PendingTransactionInfo *pendingTransInfo) { MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); - MOZ_ASSERT((speculative && !pendingTransInfo) || - (!speculative && pendingTransInfo)); - - RefPtr sock = new nsHalfOpenSocket(ent, trans, caps, - speculative, - isFromPredictor); + RefPtr sock = new nsHalfOpenSocket(ent, trans, caps); if (speculative) { + sock->SetSpeculative(true); sock->SetAllow1918(allow1918); + Telemetry::AutoCounter totalSpeculativeConn; + ++totalSpeculativeConn; + + if (isFromPredictor) { + sock->SetIsFromPredictor(true); + Telemetry::AutoCounter totalPreconnectsCreated; + ++totalPreconnectsCreated; + } } + // The socket stream holds the reference to the half open // socket - so if the stream fails to init the half open // will go away. @@ -1823,8 +1824,6 @@ nsHttpConnectionMgr::CreateTransport(nsConnectionEntry *ent, if (pendingTransInfo) { pendingTransInfo->mHalfOpen = do_GetWeakReference(static_cast(sock)); - bool claimed = sock->Claim(); - MOZ_ASSERT(claimed); } ent->mHalfOpens.AppendElement(sock); @@ -2158,6 +2157,8 @@ nsHttpConnectionMgr::OnMsgCancelTransaction(int32_t reason, ARefBase *param) RefPtr half = do_QueryReferent(pendingTransInfo->mHalfOpen); if (half) { + MOZ_ASSERT(trans == half->Transaction() || + half->Transaction()->IsNullTransaction()); half->Abandon(); } pendingTransInfo->mHalfOpen = nullptr; @@ -2903,35 +2904,21 @@ NS_INTERFACE_MAP_END nsHttpConnectionMgr:: nsHalfOpenSocket::nsHalfOpenSocket(nsConnectionEntry *ent, nsAHttpTransaction *trans, - uint32_t caps, - bool speculative, - bool isFromPredictor) + uint32_t caps) : mEnt(ent) , mTransaction(trans) , mDispatchedMTransaction(false) , mCaps(caps) - , mSpeculative(speculative) - , mIsFromPredictor(isFromPredictor) + , mSpeculative(false) + , mIsFromPredictor(false) , mAllow1918(true) , mHasConnected(false) , mPrimaryConnectedOK(false) , mBackupConnectedOK(false) - , mFreeToUse(true) - , mPrimaryStreamStatus(NS_OK) { MOZ_ASSERT(ent && trans, "constructor with null arguments"); LOG(("Creating nsHalfOpenSocket [this=%p trans=%p ent=%s key=%s]\n", this, trans, ent->mConnInfo->Origin(), ent->mConnInfo->HashKey().get())); - - if (speculative) { - Telemetry::AutoCounter totalSpeculativeConn; - ++totalSpeculativeConn; - - if (isFromPredictor) { - Telemetry::AutoCounter totalPreconnectsCreated; - ++totalPreconnectsCreated; - } - } } nsHttpConnectionMgr::nsHalfOpenSocket::~nsHalfOpenSocket() @@ -3108,6 +3095,8 @@ nsresult nsHttpConnectionMgr::nsHalfOpenSocket::SetupBackupStreams() { MOZ_ASSERT(mTransaction); + MOZ_ASSERT(!mTransaction->IsNullTransaction(), + "null transactions dont have backup streams"); mBackupSynStarted = TimeStamp::Now(); nsresult rv = SetupStreams(getter_AddRefs(mBackupTransport), @@ -3131,7 +3120,7 @@ nsHttpConnectionMgr::nsHalfOpenSocket::SetupBackupTimer() { uint16_t timeout = gHttpHandler->GetIdleSynTimeout(); MOZ_ASSERT(!mSynTimer, "timer already initd"); - if (timeout && !mSpeculative) { + if (timeout && !mTransaction->IsDone() && !mTransaction->IsNullTransaction()) { // Setup the timer that will establish a backup socket // if we do not get a writable event on the main one. // We do this because a lost SYN takes a very long time @@ -3226,6 +3215,8 @@ nsHttpConnectionMgr::nsHalfOpenSocket::Notify(nsITimer *timer) { MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); MOZ_ASSERT(timer == mSynTimer, "wrong timer"); + MOZ_ASSERT(mTransaction && !mTransaction->IsNullTransaction(), + "null transactions dont have backup streams"); DebugOnly rv = SetupBackupStreams(); MOZ_ASSERT(NS_SUCCEEDED(rv)); @@ -3280,6 +3271,8 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) mStreamIn = nullptr; mSocketTransport = nullptr; } else if (out == mBackupStreamOut) { + MOZ_ASSERT(!mTransaction->IsNullTransaction(), + "null transactions dont have backup streams"); TimeDuration rtt = TimeStamp::Now() - mBackupSynStarted; rv = conn->Init(mEnt->mConnInfo, gHttpHandler->ConnMgr()->mMaxRequestDelay, @@ -3374,35 +3367,6 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) LOG(("nsHalfOpenSocket::OnOutputStreamReady no transaction match " "returning conn %p to pool\n", conn.get())); gHttpHandler->ConnMgr()->OnMsgReclaimConnection(0, conn); - - // We expect that there is at least one tranasction in the pending - // queue that can take this connection, but it can happened that - // all transactions are blocked or they have took other idle - // connections. In that case the connection has been added to the - // idle queue. - // If the connection is in the idle queue but it is using ssl, make - // a nulltransaction for it to finish ssl handshake! - if (mEnt->mConnInfo->FirstHopSSL() && - !mEnt->mConnInfo->UsingConnect()) { - int32_t idx = mEnt->mIdleConns.IndexOf(conn); - if (idx != -1) { - DebugOnly rv = gHttpHandler->ConnMgr()->RemoveIdleConnection(conn); - MOZ_ASSERT(NS_SUCCEEDED(rv)); - conn->EndIdleMonitoring(); - RefPtr trans; - if (mTransaction->IsNullTransaction() && - !mDispatchedMTransaction) { - mDispatchedMTransaction = true; - trans = mTransaction; - } else { - trans = new NullHttpTransaction(mEnt->mConnInfo, - callbacks, mCaps); - } - gHttpHandler->ConnMgr()->AddActiveConn(conn, mEnt); - rv = gHttpHandler->ConnMgr()-> - DispatchAbstractTransaction(mEnt, trans, mCaps, conn, 0); - } - } } } @@ -3448,8 +3412,6 @@ nsHttpConnectionMgr::nsHalfOpenSocket::OnTransportStatus(nsITransport *trans, return NS_OK; } - mPrimaryStreamStatus = status; - // if we are doing spdy coalescing and haven't recorded the ip address // for this entry before then make the hash key if our dns lookup // just completed. We can't do coalescing if using a proxy because the @@ -3535,47 +3497,6 @@ nsHttpConnectionMgr::nsHalfOpenSocket::GetInterface(const nsIID &iid, return NS_ERROR_NO_INTERFACE; } -bool -nsHttpConnectionMgr::nsHalfOpenSocket::Claim() -{ - if (mSpeculative) { - mSpeculative = false; - uint32_t flags; - if (mSocketTransport && NS_SUCCEEDED(mSocketTransport->GetConnectionFlags(&flags))) { - flags &= ~nsISocketTransport::DISABLE_RFC1918; - mSocketTransport->SetConnectionFlags(flags); - } - - Telemetry::AutoCounter usedSpeculativeConn; - ++usedSpeculativeConn; - - if (mIsFromPredictor) { - Telemetry::AutoCounter totalPreconnectsUsed; - ++totalPreconnectsUsed; - } - - if ((mPrimaryStreamStatus == NS_NET_STATUS_CONNECTING_TO) && - mEnt && !mBackupTransport && !mSynTimer) { - SetupBackupTimer(); - } - } - - if (mFreeToUse) { - mFreeToUse = false; - return true; - } - return false; -} - -void -nsHttpConnectionMgr::nsHalfOpenSocket::Unclaim() -{ - MOZ_ASSERT(!mSpeculative && !mFreeToUse); - // We will keep the backup-timer running. Most probably this halfOpen will - // be used by a transaction from which this transaction took the halfOpen. - // (this is happening because of the transaction priority.) - mFreeToUse = true; -} already_AddRefed ConnectionHandle::TakeHttpConnection() diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.h b/netwerk/protocol/http/nsHttpConnectionMgr.h index f956b310c5d6..abec89a36219 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.h +++ b/netwerk/protocol/http/nsHttpConnectionMgr.h @@ -184,7 +184,6 @@ public: // the idle connection list. It is called when the idle connection detects // that the network peer has closed the transport. MOZ_MUST_USE nsresult CloseIdleConnection(nsHttpConnection *); - MOZ_MUST_USE nsresult RemoveIdleConnection(nsHttpConnection *); // The connection manager needs to know when a normal HTTP connection has been // upgraded to SPDY because the dispatch and idle semantics are a little @@ -298,9 +297,7 @@ private: nsHalfOpenSocket(nsConnectionEntry *ent, nsAHttpTransaction *trans, - uint32_t caps, - bool speculative, - bool isFromPredictor); + uint32_t caps); MOZ_MUST_USE nsresult SetupStreams(nsISocketTransport **, nsIAsyncInputStream **, @@ -318,8 +315,10 @@ private: nsAHttpTransaction *Transaction() { return mTransaction; } bool IsSpeculative() { return mSpeculative; } + void SetSpeculative(bool val) { mSpeculative = val; } bool IsFromPredictor() { return mIsFromPredictor; } + void SetIsFromPredictor(bool val) { mIsFromPredictor = val; } bool Allow1918() { return mAllow1918; } void SetAllow1918(bool val) { mAllow1918 = val; } @@ -327,9 +326,6 @@ private: bool HasConnected() { return mHasConnected; } void PrintDiagnostics(nsCString &log); - - bool Claim(); - void Unclaim(); private: nsConnectionEntry *mEnt; RefPtr mTransaction; @@ -370,13 +366,6 @@ private: bool mPrimaryConnectedOK; bool mBackupConnectedOK; - - // A nsHalfOpenSocket can be made for a concrete non-null transaction, - // but the transaction can be dispatch to another connection. In that - // case we can free this transaction to be claimed by other - // transactions. - bool mFreeToUse; - nsresult mPrimaryStreamStatus; }; friend class nsHalfOpenSocket; From 863a41136f219267f16c929de0d5bad7e891e68a Mon Sep 17 00:00:00 2001 From: Dylan Roeh Date: Mon, 20 Mar 2017 14:32:44 -0500 Subject: [PATCH 054/169] Bug 1338055 - Store a reference to the instance EventDispatcher in PromptService. r=jchen --- .../org/mozilla/gecko/prompts/PromptService.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/prompts/PromptService.java b/mobile/android/base/java/org/mozilla/gecko/prompts/PromptService.java index 9d0982d63232..827713194303 100644 --- a/mobile/android/base/java/org/mozilla/gecko/prompts/PromptService.java +++ b/mobile/android/base/java/org/mozilla/gecko/prompts/PromptService.java @@ -19,17 +19,17 @@ import android.util.Log; public class PromptService implements BundleEventListener { private static final String LOGTAG = "GeckoPromptService"; - private final Context mContext; + private final GeckoApp mGeckoApp; - public PromptService(Context context) { - GeckoApp.getEventDispatcher().registerUiThreadListener(this, + public PromptService(GeckoApp geckoApp) { + mGeckoApp = geckoApp; + mGeckoApp.getAppEventDispatcher().registerUiThreadListener(this, "Prompt:Show", "Prompt:ShowTop"); - mContext = context; } public void destroy() { - GeckoApp.getEventDispatcher().unregisterUiThreadListener(this, + mGeckoApp.getAppEventDispatcher().unregisterUiThreadListener(this, "Prompt:Show", "Prompt:ShowTop"); } @@ -39,7 +39,7 @@ public class PromptService implements BundleEventListener { public void handleMessage(final String event, final GeckoBundle message, final EventCallback callback) { Prompt p; - p = new Prompt(mContext, new Prompt.PromptCallback() { + p = new Prompt(mGeckoApp, new Prompt.PromptCallback() { @Override public void onPromptFinished(final GeckoBundle result) { callback.sendSuccess(result); From 49113725c494719aa5321684215db6da8457b04a Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Sun, 19 Mar 2017 06:29:17 +0000 Subject: [PATCH 055/169] Bug 1341191 - Fix messaging priv escalation of feed reader, simplify messaging from parent to child. Reduce race conditions on page. r=Gijs --- browser/base/content/browser-feeds.js | 395 ++++++++++++++++++--- browser/components/feeds/FeedConverter.js | 3 +- browser/components/feeds/FeedWriter.js | 410 +++++++--------------- toolkit/components/feeds/FeedProcessor.js | 11 +- 4 files changed, 480 insertions(+), 339 deletions(-) diff --git a/browser/base/content/browser-feeds.js b/browser/base/content/browser-feeds.js index 10c0c14bb9e2..6f134236f262 100644 --- a/browser/base/content/browser-feeds.js +++ b/browser/base/content/browser-feeds.js @@ -3,11 +3,136 @@ * 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/. */ +XPCOMUtils.defineLazyModuleGetter(this, "DeferredTask", + "resource://gre/modules/DeferredTask.jsm"); + +const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed"; +const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed"; +const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed"; + +const PREF_SHOW_FIRST_RUN_UI = "browser.feeds.showFirstRunUI"; + +const PREF_SELECTED_APP = "browser.feeds.handlers.application"; +const PREF_SELECTED_WEB = "browser.feeds.handlers.webservice"; +const PREF_SELECTED_ACTION = "browser.feeds.handler"; +const PREF_SELECTED_READER = "browser.feeds.handler.default"; + +const PREF_VIDEO_SELECTED_APP = "browser.videoFeeds.handlers.application"; +const PREF_VIDEO_SELECTED_WEB = "browser.videoFeeds.handlers.webservice"; +const PREF_VIDEO_SELECTED_ACTION = "browser.videoFeeds.handler"; +const PREF_VIDEO_SELECTED_READER = "browser.videoFeeds.handler.default"; + +const PREF_AUDIO_SELECTED_APP = "browser.audioFeeds.handlers.application"; +const PREF_AUDIO_SELECTED_WEB = "browser.audioFeeds.handlers.webservice"; +const PREF_AUDIO_SELECTED_ACTION = "browser.audioFeeds.handler"; +const PREF_AUDIO_SELECTED_READER = "browser.audioFeeds.handler.default"; + +const PREF_UPDATE_DELAY = 2000; + +const SETTABLE_PREFS = new Set([ + PREF_VIDEO_SELECTED_ACTION, + PREF_AUDIO_SELECTED_ACTION, + PREF_SELECTED_ACTION, + PREF_VIDEO_SELECTED_READER, + PREF_AUDIO_SELECTED_READER, + PREF_SELECTED_READER, + PREF_VIDEO_SELECTED_WEB, + PREF_AUDIO_SELECTED_WEB, + PREF_SELECTED_WEB +]); + +const EXECUTABLE_PREFS = new Set([ + PREF_SELECTED_APP, + PREF_VIDEO_SELECTED_APP, + PREF_AUDIO_SELECTED_APP +]); + +const VALID_ACTIONS = new Set(["ask", "reader", "bookmarks"]); +const VALID_READERS = new Set(["web", "client", "default", "bookmarks"]); + +XPCOMUtils.defineLazyPreferenceGetter(this, "SHOULD_LOG", + "feeds.log", false); + +function LOG(str) { + if (SHOULD_LOG) + dump("*** Feeds: " + str + "\n"); +} + +function getPrefActionForType(t) { + switch (t) { + case Ci.nsIFeed.TYPE_VIDEO: + return PREF_VIDEO_SELECTED_ACTION; + + case Ci.nsIFeed.TYPE_AUDIO: + return PREF_AUDIO_SELECTED_ACTION; + + default: + return PREF_SELECTED_ACTION; + } +} + +function getPrefReaderForType(t) { + switch (t) { + case Ci.nsIFeed.TYPE_VIDEO: + return PREF_VIDEO_SELECTED_READER; + + case Ci.nsIFeed.TYPE_AUDIO: + return PREF_AUDIO_SELECTED_READER; + + default: + return PREF_SELECTED_READER; + } +} + +function getPrefWebForType(t) { + switch (t) { + case Ci.nsIFeed.TYPE_VIDEO: + return PREF_VIDEO_SELECTED_WEB; + + case Ci.nsIFeed.TYPE_AUDIO: + return PREF_AUDIO_SELECTED_WEB; + + default: + return PREF_SELECTED_WEB; + } +} + +function getPrefAppForType(t) { + switch (t) { + case Ci.nsIFeed.TYPE_VIDEO: + return PREF_VIDEO_SELECTED_APP; + + case Ci.nsIFeed.TYPE_AUDIO: + return PREF_AUDIO_SELECTED_APP; + + default: + return PREF_SELECTED_APP; + } +} + +/** + * Maps a feed type to a maybe-feed mimetype. + */ +function getMimeTypeForFeedType(aFeedType) { + switch (aFeedType) { + case Ci.nsIFeed.TYPE_VIDEO: + return TYPE_MAYBE_VIDEO_FEED; + + case Ci.nsIFeed.TYPE_AUDIO: + return TYPE_MAYBE_AUDIO_FEED; + + default: + return TYPE_MAYBE_FEED; + } +} + /** * The Feed Handler object manages discovery of RSS/ATOM feeds in web pages * and shows UI when they are discovered. */ var FeedHandler = { + _prefChangeCallback: null, + /** Called when the user clicks on the Subscribe to This Page... menu item, * or when the user clicks the feed button when the page contains multiple * feeds. @@ -195,7 +320,8 @@ var FeedHandler = { return file.leafName; }, - chooseClientApp(aTitle, aPrefName, aBrowser) { + _chooseClientApp(aTitle, aTypeName, aBrowser) { + const prefName = getPrefAppForType(aTypeName); let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init(window, aTitle, Ci.nsIFilePicker.modeOpen); @@ -222,7 +348,7 @@ var FeedHandler = { } if (fp.file.leafName != appName) { - Services.prefs.setComplexValue(aPrefName, Ci.nsILocalFile, selectedApp); + Services.prefs.setComplexValue(prefName, Ci.nsILocalFile, selectedApp); aBrowser.messageManager.sendAsyncMessage("FeedWriter:SetApplicationLauncherMenuItem", { name: this._getFileDisplayName(selectedApp), type: "SelectedAppMenuItem" }); @@ -277,70 +403,243 @@ var FeedHandler = { } }, + // nsISupports + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, + Ci.nsISupportsWeakReference]), + + init() { window.messageManager.addMessageListener("FeedWriter:ChooseClientApp", this); - window.messageManager.addMessageListener("FeedWriter:RequestClientAppName", this); - window.messageManager.addMessageListener("FeedWriter:SetFeedCharPref", this); - window.messageManager.addMessageListener("FeedWriter:SetFeedComplexString", this); + window.messageManager.addMessageListener("FeedWriter:GetSubscriptionUI", this); + window.messageManager.addMessageListener("FeedWriter:SetFeedPrefsAndSubscribe", this); window.messageManager.addMessageListener("FeedWriter:ShownFirstRun", this); Services.ppmm.addMessageListener("FeedConverter:ExecuteClientApp", this); + + const prefs = Services.prefs; + prefs.addObserver(PREF_SELECTED_ACTION, this, true); + prefs.addObserver(PREF_SELECTED_READER, this, true); + prefs.addObserver(PREF_SELECTED_WEB, this, true); + prefs.addObserver(PREF_VIDEO_SELECTED_ACTION, this, true); + prefs.addObserver(PREF_VIDEO_SELECTED_READER, this, true); + prefs.addObserver(PREF_VIDEO_SELECTED_WEB, this, true); + prefs.addObserver(PREF_AUDIO_SELECTED_ACTION, this, true); + prefs.addObserver(PREF_AUDIO_SELECTED_READER, this, true); + prefs.addObserver(PREF_AUDIO_SELECTED_WEB, this, true); }, uninit() { Services.ppmm.removeMessageListener("FeedConverter:ExecuteClientApp", this); + + this._prefChangeCallback = null; + }, + + // nsIObserver + observe(subject, topic, data) { + if (topic == "nsPref:changed") { + LOG(`Pref changed ${data}`) + if (this._prefChangeCallback) { + this._prefChangeCallback.disarm(); + } + // Multiple prefs are set at the same time, debounce to reduce noise + // This can happen in one feed and we want to message all feed pages + this._prefChangeCallback = new DeferredTask(() => { + this._prefChanged(data); + }, PREF_UPDATE_DELAY); + this._prefChangeCallback.arm(); + } + }, + + _prefChanged(prefName) { + // Don't observe for PREF_*SELECTED_APP as user likely just picked one + // That is also handled by SetApplicationLauncherMenuItem call + // Rather than the others which happen on subscription + switch (prefName) { + case PREF_SELECTED_READER: + case PREF_SELECTED_WEB: + case PREF_VIDEO_SELECTED_READER: + case PREF_VIDEO_SELECTED_WEB: + case PREF_AUDIO_SELECTED_READER: + case PREF_AUDIO_SELECTED_WEB: + case PREF_SELECTED_ACTION: + case PREF_VIDEO_SELECTED_ACTION: + case PREF_AUDIO_SELECTED_ACTION: + const response = { + default: this._getReaderForType(Ci.nsIFeed.TYPE_FEED), + [Ci.nsIFeed.TYPE_AUDIO]: this._getReaderForType(Ci.nsIFeed.TYPE_AUDIO), + [Ci.nsIFeed.TYPE_VIDEO]: this._getReaderForType(Ci.nsIFeed.TYPE_VIDEO) + }; + Services.mm.broadcastAsyncMessage("FeedWriter:PreferenceUpdated", + response); + break; + } + }, + + _initSubscriptionUIResponse(feedType) { + const wccr = Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"]. + getService(Ci.nsIWebContentConverterService); + const handlersRaw = wccr.getContentHandlers(getMimeTypeForFeedType(feedType)); + const handlers = []; + for (let handler of handlersRaw) { + LOG(`Handler found: ${handler}`); + handlers.push({ + name: handler.name, + uri: handler.uri + }); + } + let showFirstRunUI = true; + // eslint-disable-next-line mozilla/use-default-preference-values + try { + showFirstRunUI = Services.prefs.getBoolPref(PREF_SHOW_FIRST_RUN_UI); + } catch (ex) { } + const response = { handlers, showFirstRunUI }; + let selectedClientApp; + const feedTypePref = getPrefAppForType(feedType); + try { + selectedClientApp = Services.prefs.getComplexValue(feedTypePref, Ci.nsILocalFile); + } catch (ex) { + // Just do nothing, then we won't bother populating + } + + let defaultClientApp = null; + try { + // This can sometimes not exist + defaultClientApp = Cc["@mozilla.org/browser/shell-service;1"] + .getService(Ci.nsIShellService) + .defaultFeedReader; + } catch (ex) { + // Just do nothing, then we don't bother populating + } + + if (selectedClientApp && selectedClientApp.exists()) { + if (defaultClientApp && selectedClientApp.path != defaultClientApp.path) { + // Only set the default menu item if it differs from the selected one + response.defaultMenuItem = this._getFileDisplayName(defaultClientApp); + } + response.selectedMenuItem = this._getFileDisplayName(selectedClientApp); + } + response.reader = this._getReaderForType(feedType); + return response; + }, + + _setPref(aPrefName, aPrefValue, aIsComplex = false) { + LOG(`FeedWriter._setPref ${aPrefName}`); + // Ensure we have a pref that is settable + if (aPrefName && SETTABLE_PREFS.has(aPrefName)) { + if (aIsComplex) { + const supportsString = Cc["@mozilla.org/supports-string;1"]. + createInstance(Ci.nsISupportsString); + supportsString.data = aPrefValue; + Services.prefs.setComplexValue(aPrefName, Ci.nsISupportsString, supportsString); + } else { + Services.prefs.setCharPref(aPrefName, aPrefValue); + } + } else { + LOG(`FeedWriter._setPref ${aPrefName} not allowed`); + } + }, + + _getReaderForType(feedType) { + let prefs = Services.prefs; + let handler = "bookmarks"; + let url; + // eslint-disable-next-line mozilla/use-default-preference-values + try { + handler = prefs.getCharPref(getPrefReaderForType(feedType)); + } catch (ex) { } + + if (handler === "web") { + try { + url = prefs.getComplexValue(getPrefWebForType(feedType), Ci.nsISupportsString).data; + } catch (ex) { + LOG("FeedWriter._setSelectedHandler: invalid or no handler in prefs"); + url = null; + } + } + const alwaysUse = this._getAlwaysUseState(feedType); + const action = prefs.getCharPref(getPrefActionForType(feedType)); + return { handler, url, alwaysUse, action }; + }, + + _getAlwaysUseState(feedType) { + try { + return Services.prefs.getCharPref(getPrefActionForType(feedType)) != "ask"; + } catch (ex) { } + return false; }, receiveMessage(msg) { + let handler; switch (msg.name) { - case "FeedWriter:ChooseClientApp": - this.chooseClientApp(msg.data.title, msg.data.prefName, msg.target); + case "FeedWriter:GetSubscriptionUI": + const response = this._initSubscriptionUIResponse(msg.data.feedType); + msg.target.messageManager + .sendAsyncMessage("FeedWriter:GetSubscriptionUIResponse", + response); break; - case "FeedWriter:RequestClientAppName": - let selectedClientApp; - try { - selectedClientApp = Services.prefs.getComplexValue(msg.data.feedTypePref, Ci.nsILocalFile); - } catch (ex) { - // Just do nothing, then we won't bother populating - } - - let defaultClientApp = null; - try { - // This can sometimes not exist - defaultClientApp = Cc["@mozilla.org/browser/shell-service;1"] - .getService(Ci.nsIShellService) - .defaultFeedReader; - } catch (ex) { - // Just do nothing, then we don't bother populating - } - - if (selectedClientApp && selectedClientApp.exists()) { - if (defaultClientApp && selectedClientApp.path != defaultClientApp.path) { - // Only set the default menu item if it differs from the selected one - msg.target.messageManager - .sendAsyncMessage("FeedWriter:SetApplicationLauncherMenuItem", - { name: this._getFileDisplayName(defaultClientApp), - type: "DefaultAppMenuItem" }); - } - msg.target.messageManager - .sendAsyncMessage("FeedWriter:SetApplicationLauncherMenuItem", - { name: this._getFileDisplayName(selectedClientApp), - type: "SelectedAppMenuItem" }); - } + case "FeedWriter:ChooseClientApp": + this._chooseClientApp(msg.data.title, msg.data.feedType, msg.target); break; case "FeedWriter:ShownFirstRun": - Services.prefs.setBoolPref("browser.feeds.showFirstRunUI", false); + Services.prefs.setBoolPref(PREF_SHOW_FIRST_RUN_UI, false); break; - case "FeedWriter:SetFeedCharPref": - Services.prefs.setCharPref(msg.data.pref, msg.data.value); - break; - case "FeedWriter:SetFeedComplexString": { - Services.prefs.setStringPref(msg.data.pref, msg.data.value); - break; - } + case "FeedWriter:SetFeedPrefsAndSubscribe": + const settings = msg.data; + if (!settings.action || !VALID_ACTIONS.has(settings.action)) { + LOG(`Invalid action ${settings.action}`); + return; + } + if (!settings.reader || !VALID_READERS.has(settings.reader)) { + LOG(`Invalid reader ${settings.reader}`); + return; + } + const actionPref = getPrefActionForType(settings.feedType); + this._setPref(actionPref, settings.action); + const readerPref = getPrefReaderForType(settings.feedType); + this._setPref(readerPref, settings.reader); + handler = null; + + switch (settings.reader) { + case "web": + // This is a web set URI by content using window.registerContentHandler() + // Lets make sure we know about it before setting it + const webPref = getPrefWebForType(settings.feedType); + let wccr = Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"]. + getService(Ci.nsIWebContentConverterService); + // If the user provided an invalid web URL this function won't give us a reference + handler = wccr.getWebContentHandlerByURI(getMimeTypeForFeedType(settings.feedType), settings.uri); + if (handler) { + this._setPref(webPref, settings.uri, true); + if (settings.useAsDefault) { + wccr.setAutoHandler(getMimeTypeForFeedType(settings.feedType), handler); + } + msg.target.messageManager + .sendAsyncMessage("FeedWriter:SetFeedPrefsAndSubscribeResponse", + { redirect: handler.getHandlerURI(settings.feedLocation) }); + } else { + LOG(`No handler found for web ${settings.feedType} ${settings.uri}`); + } + break; + default: + const feedService = Cc["@mozilla.org/browser/feeds/result-service;1"]. + getService(Ci.nsIFeedResultService); + + feedService.addToClientReader(settings.feedLocation, + settings.feedTitle, + settings.feedSubtitle, + settings.feedType, + settings.reader); + } + break; case "FeedConverter:ExecuteClientApp": - this.executeClientApp(msg.data.spec, msg.data.title, - msg.data.subtitle, msg.data.feedHandler); + // Always check feedHandler is from a set array of executable prefs + if (EXECUTABLE_PREFS.has(msg.data.feedHandler)) { + this.executeClientApp(msg.data.spec, msg.data.title, + msg.data.subtitle, msg.data.feedHandler); + } else { + LOG(`FeedConverter:ExecuteClientApp - Will not exec ${msg.data.feedHandler}`); + } break; } }, diff --git a/browser/components/feeds/FeedConverter.js b/browser/components/feeds/FeedConverter.js index fa8719c71e6e..86b7f6c91b67 100644 --- a/browser/components/feeds/FeedConverter.js +++ b/browser/components/feeds/FeedConverter.js @@ -223,8 +223,7 @@ FeedConverter.prototype = { try { let title = feed.title ? feed.title.plainText() : ""; let desc = feed.subtitle ? feed.subtitle.plainText() : ""; - let feedReader = safeGetCharPref(getPrefActionForType(feed.type), "bookmarks"); - feedService.addToClientReader(result.uri.spec, title, desc, feed.type, feedReader); + feedService.addToClientReader(result.uri.spec, title, desc, feed.type, handler); return; } catch (ex) { /* fallback to preview mode */ } } diff --git a/browser/components/feeds/FeedWriter.js b/browser/components/feeds/FeedWriter.js index 0bcebb03b814..c58a9b40df93 100644 --- a/browser/components/feeds/FeedWriter.js +++ b/browser/components/feeds/FeedWriter.js @@ -44,83 +44,11 @@ function makeURI(aURLSpec, aCharset) { const XML_NS = "http://www.w3.org/XML/1998/namespace"; const HTML_NS = "http://www.w3.org/1999/xhtml"; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed"; -const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed"; -const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed"; const URI_BUNDLE = "chrome://browser/locale/feeds/subscribe.properties"; -const PREF_SELECTED_APP = "browser.feeds.handlers.application"; -const PREF_SELECTED_WEB = "browser.feeds.handlers.webservice"; -const PREF_SELECTED_ACTION = "browser.feeds.handler"; -const PREF_SELECTED_READER = "browser.feeds.handler.default"; - -const PREF_VIDEO_SELECTED_APP = "browser.videoFeeds.handlers.application"; -const PREF_VIDEO_SELECTED_WEB = "browser.videoFeeds.handlers.webservice"; -const PREF_VIDEO_SELECTED_ACTION = "browser.videoFeeds.handler"; -const PREF_VIDEO_SELECTED_READER = "browser.videoFeeds.handler.default"; - -const PREF_AUDIO_SELECTED_APP = "browser.audioFeeds.handlers.application"; -const PREF_AUDIO_SELECTED_WEB = "browser.audioFeeds.handlers.webservice"; -const PREF_AUDIO_SELECTED_ACTION = "browser.audioFeeds.handler"; -const PREF_AUDIO_SELECTED_READER = "browser.audioFeeds.handler.default"; - -const PREF_SHOW_FIRST_RUN_UI = "browser.feeds.showFirstRunUI"; - const TITLE_ID = "feedTitleText"; const SUBTITLE_ID = "feedSubtitleText"; -function getPrefAppForType(t) { - switch (t) { - case Ci.nsIFeed.TYPE_VIDEO: - return PREF_VIDEO_SELECTED_APP; - - case Ci.nsIFeed.TYPE_AUDIO: - return PREF_AUDIO_SELECTED_APP; - - default: - return PREF_SELECTED_APP; - } -} - -function getPrefWebForType(t) { - switch (t) { - case Ci.nsIFeed.TYPE_VIDEO: - return PREF_VIDEO_SELECTED_WEB; - - case Ci.nsIFeed.TYPE_AUDIO: - return PREF_AUDIO_SELECTED_WEB; - - default: - return PREF_SELECTED_WEB; - } -} - -function getPrefActionForType(t) { - switch (t) { - case Ci.nsIFeed.TYPE_VIDEO: - return PREF_VIDEO_SELECTED_ACTION; - - case Ci.nsIFeed.TYPE_AUDIO: - return PREF_AUDIO_SELECTED_ACTION; - - default: - return PREF_SELECTED_ACTION; - } -} - -function getPrefReaderForType(t) { - switch (t) { - case Ci.nsIFeed.TYPE_VIDEO: - return PREF_VIDEO_SELECTED_READER; - - case Ci.nsIFeed.TYPE_AUDIO: - return PREF_AUDIO_SELECTED_READER; - - default: - return PREF_SELECTED_READER; - } -} - /** * Converts a number of bytes to the appropriate unit that results in a * number that needs fewer than 4 digits @@ -153,9 +81,6 @@ function FeedWriter() { } FeedWriter.prototype = { - _mimeSvc : Cc["@mozilla.org/mime;1"]. - getService(Ci.nsIMIMEService), - _getPropertyAsBag(container, property) { return container.fields.getProperty(property). QueryInterface(Ci.nsIPropertyBag2); @@ -226,18 +151,21 @@ FeedWriter.prototype = { return this._bundle.GetStringFromName(key); }, - _setCheckboxCheckedState(aCheckbox, aValue) { - // see checkbox.xml, xbl bindings are not applied within the sandbox! TODO - let change = (aValue != (aCheckbox.getAttribute("checked") == "true")); - if (aValue) - aCheckbox.setAttribute("checked", "true"); - else - aCheckbox.removeAttribute("checked"); + _setCheckboxCheckedState(aValue) { + let checkbox = this._document.getElementById("alwaysUse"); + if (checkbox) { + // see checkbox.xml, xbl bindings are not applied within the sandbox! TODO + let change = (aValue != (checkbox.getAttribute("checked") == "true")); + if (aValue) + checkbox.setAttribute("checked", "true"); + else + checkbox.removeAttribute("checked"); - if (change) { - let event = this._document.createEvent("Events"); - event.initEvent("CheckboxStateChange", true, true); - aCheckbox.dispatchEvent(event); + if (change) { + let event = this._document.createEvent("Events"); + event.initEvent("CheckboxStateChange", true, true); + checkbox.dispatchEvent(event); + } } }, @@ -290,22 +218,6 @@ FeedWriter.prototype = { return Ci.nsIFeed.TYPE_FEED; }, - /** - * Maps a feed type to a maybe-feed mimetype. - */ - _getMimeTypeForFeedType() { - switch (this._getFeedType()) { - case Ci.nsIFeed.TYPE_VIDEO: - return TYPE_MAYBE_VIDEO_FEED; - - case Ci.nsIFeed.TYPE_AUDIO: - return TYPE_MAYBE_AUDIO_FEED; - - default: - return TYPE_MAYBE_FEED; - } - }, - /** * Writes the feed title into the preview document. * @param container @@ -491,17 +403,11 @@ FeedWriter.prototype = { if (enc.hasKey("type")) { type_text = enc.get("type"); - try { - let handlerInfoWrapper = this._mimeSvc.getFromTypeAndExtension(enc.get("type"), null); - - if (handlerInfoWrapper) - type_text = handlerInfoWrapper.description; - - if (type_text && type_text.length > 0) - mozicon = "moz-icon://goat?size=16&contentType=" + enc.get("type"); - - } catch (ex) { } + if (enc.hasKey("typeDesc")) + type_text = enc.get("typeDesc"); + if (type_text && type_text.length > 0) + mozicon = "moz-icon://goat?size=16&contentType=" + enc.get("type"); } if (enc.hasKey("length") && /^[0-9]+$/.test(enc.get("length"))) { @@ -596,19 +502,7 @@ FeedWriter.prototype = { this._subscribeCallback = aCallback; this._mm.sendAsyncMessage("FeedWriter:ChooseClientApp", { title: this._getString("chooseApplicationDialogTitle"), - prefName: getPrefAppForType(this._getFeedType()) }); - }, - - _setAlwaysUseCheckedState(feedType) { - let checkbox = this._document.getElementById("alwaysUse"); - if (checkbox) { - let alwaysUse = false; - try { - if (Services.prefs.getCharPref(getPrefActionForType(feedType)) != "ask") - alwaysUse = true; - } catch (ex) { } - this._setCheckboxCheckedState(checkbox, alwaysUse); - } + feedType: this._getFeedType() }); }, _setSubscribeUsingLabel() { @@ -671,13 +565,13 @@ FeedWriter.prototype = { } break; case "change": + LOG("Change fired"); if (event.target.selectedOptions[0].id == "chooseApplicationMenuItem") { - this._chooseClientApp((aResult) => { - if (!aResult) { - // Select the (per-prefs) selected handler if no application - // was selected - this._setSelectedHandler(this._getFeedType()); - } + this._chooseClientApp(() => { + // Select the (per-prefs) selected handler if no application + // was selected + LOG("Selected handler after callback"); + this._setAlwaysUseLabel(); }); } else { this._setAlwaysUseLabel(); @@ -687,28 +581,18 @@ FeedWriter.prototype = { }, _getWebHandlerElementsForURL(aURL) { - let menu = this._document.getElementById("handlersMenuList"); - return menu.querySelectorAll('[webhandlerurl="' + aURL + '"]'); + return this._handlersList.querySelectorAll('[webhandlerurl="' + aURL + '"]'); }, - _setSelectedHandler(feedType) { - let prefs = Services.prefs; - let handler = prefs.getCharPref(getPrefReaderForType(feedType), "bookmarks"); - + _setSelectedHandlerResponse(handler, url) { + LOG(`Selecting handler response ${handler} ${url}`); switch (handler) { case "web": { if (this._handlersList) { - let url; - try { - url = prefs.getStringPref(getPrefWebForType(feedType)); - } catch (ex) { - LOG("FeedWriter._setSelectedHandler: invalid or no handler in prefs"); - return; - } let handlers = this._getWebHandlerElementsForURL(url); if (handlers.length == 0) { - LOG("FeedWriter._setSelectedHandler: selected web handler isn't in the menulist") + LOG(`Selected web handler isn't in the menulist ${url}`); return; } @@ -729,10 +613,10 @@ FeedWriter.prototype = { } }, - _initSubscriptionUI() { - let handlersList = this._document.getElementById("handlersMenuList"); - if (!handlersList) + _initSubscriptionUI(setupMessage) { + if (!this._handlersList) return; + LOG("UI init"); let feedType = this._getFeedType(); @@ -763,7 +647,7 @@ FeedWriter.prototype = { menuItem.style.display = "none"; this._selectedAppMenuItem = menuItem; - handlersList.appendChild(this._selectedAppMenuItem); + this._handlersList.appendChild(this._selectedAppMenuItem); // Create the menuitem for the default reader, but don't show/populate it until // we get confirmation of what it is from the parent @@ -774,10 +658,7 @@ FeedWriter.prototype = { menuItem.style.display = "none"; this._defaultHandlerMenuItem = menuItem; - handlersList.appendChild(this._defaultHandlerMenuItem); - - this._mm.sendAsyncMessage("FeedWriter:RequestClientAppName", - { feedTypePref: getPrefAppForType(feedType) }); + this._handlersList.appendChild(this._defaultHandlerMenuItem); // "Choose Application..." menuitem menuItem = liveBookmarksMenuItem.cloneNode(false); @@ -785,18 +666,14 @@ FeedWriter.prototype = { menuItem.setAttribute("id", "chooseApplicationMenuItem"); menuItem.textContent = this._getString("chooseApplicationMenuItem"); - handlersList.appendChild(menuItem); + this._handlersList.appendChild(menuItem); // separator let chooseAppSep = liveBookmarksMenuItem.nextElementSibling.cloneNode(false); chooseAppSep.textContent = liveBookmarksMenuItem.nextElementSibling.textContent; - handlersList.appendChild(chooseAppSep); + this._handlersList.appendChild(chooseAppSep); - // List of web handlers - let wccr = Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"]. - getService(Ci.nsIWebContentConverterService); - let handlers = wccr.getContentHandlers(this._getMimeTypeForFeedType(feedType)); - for (let handler of handlers) { + for (let handler of setupMessage.handlers) { if (!handler.uri) { LOG("Handler with name " + handler.name + " has no URI!? Skipping..."); continue; @@ -807,29 +684,37 @@ FeedWriter.prototype = { menuItem.textContent = handler.name; menuItem.setAttribute("handlerType", "web"); menuItem.setAttribute("webhandlerurl", handler.uri); - handlersList.appendChild(menuItem); + this._handlersList.appendChild(menuItem); } - this._setSelectedHandler(feedType); + this._setSelectedHandlerResponse(setupMessage.reader.handler, setupMessage.reader.url); + + if (setupMessage.defaultMenuItem) { + LOG(`Setting default menu item ${setupMessage.defaultMenuItem}`); + this._setApplicationLauncherMenuItem(this._defaultHandlerMenuItem, setupMessage.defaultMenuItem); + } + if (setupMessage.selectedMenuItem) { + LOG(`Setting selected menu item ${setupMessage.selectedMenuItem}`); + this._setApplicationLauncherMenuItem(this._selectedAppMenuItem, setupMessage.selectedMenuItem); + } // "Subscribe using..." this._setSubscribeUsingLabel(); // "Always use..." checkbox initial state - this._setAlwaysUseCheckedState(feedType); + this._setCheckboxCheckedState(setupMessage.reader.alwaysUse); this._setAlwaysUseLabel(); // We update the "Always use.." checkbox label whenever the selected item // in the list is changed - handlersList.addEventListener("change", this); + this._handlersList.addEventListener("change", this); // Set up the "Subscribe Now" button this._document.getElementById("subscribeButton") .addEventListener("click", this); // first-run ui - let showFirstRunUI = Services.prefs.getBoolPref(PREF_SHOW_FIRST_RUN_UI, true); - if (showFirstRunUI) { + if (setupMessage.showFirstRunUI) { let textfeedinfo1, textfeedinfo2; switch (feedType) { case Ci.nsIFeed.TYPE_VIDEO: @@ -915,53 +800,74 @@ FeedWriter.prototype = { LOG("Subscribe Preview: feed uri = " + this._window.location.href); - // Set up the subscription UI - this._initSubscriptionUI(); - let prefs = Services.prefs; - prefs.addObserver(PREF_SELECTED_ACTION, this, false); - prefs.addObserver(PREF_SELECTED_READER, this, false); - prefs.addObserver(PREF_SELECTED_WEB, this, false); - prefs.addObserver(PREF_SELECTED_APP, this, false); - prefs.addObserver(PREF_VIDEO_SELECTED_ACTION, this, false); - prefs.addObserver(PREF_VIDEO_SELECTED_READER, this, false); - prefs.addObserver(PREF_VIDEO_SELECTED_WEB, this, false); - prefs.addObserver(PREF_VIDEO_SELECTED_APP, this, false); - - prefs.addObserver(PREF_AUDIO_SELECTED_ACTION, this, false); - prefs.addObserver(PREF_AUDIO_SELECTED_READER, this, false); - prefs.addObserver(PREF_AUDIO_SELECTED_WEB, this, false); - prefs.addObserver(PREF_AUDIO_SELECTED_APP, this, false); + this._mm.addMessageListener("FeedWriter:PreferenceUpdated", this); this._mm.addMessageListener("FeedWriter:SetApplicationLauncherMenuItem", this); + this._mm.addMessageListener("FeedWriter:GetSubscriptionUIResponse", this); + this._mm.addMessageListener("FeedWriter:SetFeedPrefsAndSubscribeResponse", this); + + const feedType = this._getFeedType(); + this._mm.sendAsyncMessage("FeedWriter:GetSubscriptionUI", + { feedType }); }, receiveMessage(msg) { + if (!this._window) { + // this._window is null unless this.init was called with a trusted + // window object. + return; + } + LOG(`received message from parent ${msg.name}`); switch (msg.name) { - case "FeedWriter:SetApplicationLauncherMenuItem": - let menuItem = null; - - if (msg.data.type == "DefaultAppMenuItem") { - menuItem = this._defaultHandlerMenuItem; - } else { - // Most likely SelectedAppMenuItem - menuItem = this._selectedAppMenuItem; + case "FeedWriter:PreferenceUpdated": + // This is called when browser-feeds.js spots a pref change + // This will happen when + // - about:preferences#applications changes + // - another feed reader page changes the preference + // - when this page itself changes the select and there isn't a redirect + // bookmarks and launching an external app means the page stays open after subscribe + const feedType = this._getFeedType(); + LOG(`Got prefChange! ${JSON.stringify(msg.data)} current type: ${feedType}`); + let feedTypePref = msg.data.default; + if (feedType in msg.data) { + feedTypePref = msg.data[feedType]; } - - menuItem.textContent = msg.data.name; - menuItem.style.display = ""; - menuItem.selected = true; - + LOG(`Got pref ${JSON.stringify(feedTypePref)}`); + this._setCheckboxCheckedState(feedTypePref.alwaysUse); + this._setSelectedHandlerResponse(feedTypePref.handler, feedTypePref.url); + this._setAlwaysUseLabel(); + break; + case "FeedWriter:SetFeedPrefsAndSubscribeResponse": + LOG(`FeedWriter:SetFeedPrefsAndSubscribeResponse - Redirecting ${msg.data.redirect}`); + this._window.location.href = msg.data.redirect; + break; + case "FeedWriter:GetSubscriptionUIResponse": + // Set up the subscription UI + this._initSubscriptionUI(msg.data); + break; + case "FeedWriter:SetApplicationLauncherMenuItem": + LOG(`FeedWriter:SetApplicationLauncherMenuItem - picked ${msg.data.name}`); + this._setApplicationLauncherMenuItem(this._selectedAppMenuItem, msg.data.name); // Potentially a bit racy, but I don't think we can get into a state where this callback is set and // we're not coming back from ChooseClientApp in browser-feeds.js if (this._subscribeCallback) { this._subscribeCallback(); this._subscribeCallback = null; } - break; } }, + _setApplicationLauncherMenuItem(menuItem, aName) { + /* unselect all handlers */ + [...this._handlersList.children].forEach((option) => { + option.removeAttribute("selected"); + }); + menuItem.textContent = aName; + menuItem.style.display = ""; + menuItem.selected = true; + }, + writeContent() { if (!this._window) return; @@ -983,24 +889,11 @@ FeedWriter.prototype = { close() { this._document.getElementById("subscribeButton") .removeEventListener("click", this); - this._document.getElementById("handlersMenuList") + this._handlersList .removeEventListener("change", this); this._document = null; this._window = null; - let prefs = Services.prefs; - prefs.removeObserver(PREF_SELECTED_ACTION, this); - prefs.removeObserver(PREF_SELECTED_READER, this); - prefs.removeObserver(PREF_SELECTED_WEB, this); - prefs.removeObserver(PREF_SELECTED_APP, this); - prefs.removeObserver(PREF_VIDEO_SELECTED_ACTION, this); - prefs.removeObserver(PREF_VIDEO_SELECTED_READER, this); - prefs.removeObserver(PREF_VIDEO_SELECTED_WEB, this); - prefs.removeObserver(PREF_VIDEO_SELECTED_APP, this); - - prefs.removeObserver(PREF_AUDIO_SELECTED_ACTION, this); - prefs.removeObserver(PREF_AUDIO_SELECTED_READER, this); - prefs.removeObserver(PREF_AUDIO_SELECTED_WEB, this); - prefs.removeObserver(PREF_AUDIO_SELECTED_APP, this); + this._handlersList = null; this._removeFeedFromCache(); this.__bundle = null; @@ -1020,20 +913,6 @@ FeedWriter.prototype = { } }, - setFeedCharPref(aPrefName, aPrefValue) { - this._mm.sendAsyncMessage("FeedWriter:SetFeedCharPref", - { pref: aPrefName, - value: aPrefValue }); - }, - - setFeedComplexString(aPrefName, aPrefValue) { - // This sends the string data across to the parent, which will use it in an nsISupportsString - // for a complex value pref. - this._mm.sendAsyncMessage("FeedWriter:SetFeedComplexString", - { pref: aPrefName, - value: aPrefValue }); - }, - subscribe() { let feedType = this._getFeedType(); @@ -1041,26 +920,21 @@ FeedWriter.prototype = { let defaultHandler = "reader"; let useAsDefault = this._document.getElementById("alwaysUse").getAttribute("checked"); - let menuList = this._document.getElementById("handlersMenuList"); - let selectedItem = menuList.selectedOptions[0]; + let selectedItem = this._handlersList.selectedOptions[0]; let subscribeCallback = () => { + let feedReader = null; + let settings = { + feedType, + useAsDefault, + // Pull the title and subtitle out of the document + feedTitle: this._document.getElementById(TITLE_ID).textContent, + feedSubtitle: this._document.getElementById(SUBTITLE_ID).textContent, + feedLocation: this._window.location.href + }; if (selectedItem.hasAttribute("webhandlerurl")) { - let webURI = selectedItem.getAttribute("webhandlerurl"); - this.setFeedCharPref(getPrefReaderForType(feedType), "web"); - this.setFeedComplexString(getPrefWebForType(feedType), webURI); - - let wccr = Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"]. - getService(Ci.nsIWebContentConverterService); - let handler = wccr.getWebContentHandlerByURI(this._getMimeTypeForFeedType(feedType), webURI); - if (handler) { - if (useAsDefault) { - wccr.setAutoHandler(this._getMimeTypeForFeedType(feedType), handler); - } - - this._window.location.href = handler.getHandlerURI(this._window.location.href); - } + feedReader = "web"; + settings.uri = selectedItem.getAttribute("webhandlerurl"); } else { - let feedReader = null; switch (selectedItem.id) { case "selectedAppMenuItem": feedReader = "client"; @@ -1073,27 +947,20 @@ FeedWriter.prototype = { feedReader = "bookmarks"; break; } - - this.setFeedCharPref(getPrefReaderForType(feedType), feedReader); - - let feedService = Cc["@mozilla.org/browser/feeds/result-service;1"]. - getService(Ci.nsIFeedResultService); - - // Pull the title and subtitle out of the document - let feedTitle = this._document.getElementById(TITLE_ID).textContent; - let feedSubtitle = this._document.getElementById(SUBTITLE_ID).textContent; - feedService.addToClientReader(this._window.location.href, feedTitle, feedSubtitle, feedType, feedReader); } + settings.reader = feedReader; // If "Always use..." is checked, we should set PREF_*SELECTED_ACTION // to either "reader" (If a web reader or if an application is selected), // or to "bookmarks" (if the live bookmarks option is selected). // Otherwise, we should set it to "ask" - if (useAsDefault) { - this.setFeedCharPref(getPrefActionForType(feedType), defaultHandler); - } else { - this.setFeedCharPref(getPrefActionForType(feedType), "ask"); + if (!useAsDefault) { + defaultHandler = "ask"; } + settings.action = defaultHandler; + LOG(`FeedWriter:SetFeedPrefsAndSubscribe - ${JSON.stringify(settings)}`); + this._mm.sendAsyncMessage("FeedWriter:SetFeedPrefsAndSubscribe", + settings); } // Show the file picker before subscribing if the @@ -1111,37 +978,6 @@ FeedWriter.prototype = { } }, - // nsIObserver - observe(subject, topic, data) { - if (!this._window) { - // this._window is null unless this.init was called with a trusted - // window object. - return; - } - - let feedType = this._getFeedType(); - - if (topic == "nsPref:changed") { - switch (data) { - case PREF_SELECTED_READER: - case PREF_SELECTED_WEB: - case PREF_SELECTED_APP: - case PREF_VIDEO_SELECTED_READER: - case PREF_VIDEO_SELECTED_WEB: - case PREF_VIDEO_SELECTED_APP: - case PREF_AUDIO_SELECTED_READER: - case PREF_AUDIO_SELECTED_WEB: - case PREF_AUDIO_SELECTED_APP: - this._setSelectedHandler(feedType); - break; - case PREF_SELECTED_ACTION: - case PREF_VIDEO_SELECTED_ACTION: - case PREF_AUDIO_SELECTED_ACTION: - this._setAlwaysUseCheckedState(feedType); - } - } - }, - get _mm() { let mm = this._window.QueryInterface(Ci.nsIInterfaceRequestor). getInterface(Ci.nsIDocShell). diff --git a/toolkit/components/feeds/FeedProcessor.js b/toolkit/components/feeds/FeedProcessor.js index 320575fa8554..1ba3e8a779f6 100644 --- a/toolkit/components/feeds/FeedProcessor.js +++ b/toolkit/components/feeds/FeedProcessor.js @@ -42,7 +42,7 @@ const ARRAY_CONTRACTID = "@mozilla.org/array;1"; const SAX_CONTRACTID = "@mozilla.org/saxparser/xmlreader;1"; const PARSERUTILS_CONTRACTID = "@mozilla.org/parserutils;1"; - +const gMimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService); var gIoService = null; const XMLNS = "http://www.w3.org/XML/1998/namespace"; @@ -484,8 +484,15 @@ Entry.prototype = { if (previous_enc != undefined) { previous_enc.QueryInterface(Ci.nsIWritablePropertyBag2); - if (!bagHasKey(previous_enc, "type") && bagHasKey(new_enc, "type")) + if (!bagHasKey(previous_enc, "type") && bagHasKey(new_enc, "type")) { previous_enc.setPropertyAsAString("type", new_enc.getPropertyAsAString("type")); + try { + let handlerInfoWrapper = gMimeService.getFromTypeAndExtension(new_enc.getPropertyAsAString("type"), null); + if (handlerInfoWrapper && handlerInfoWrapper.description) { + previous_enc.setPropertyAsAString("typeDesc", handlerInfoWrapper.description); + } + } catch (ext) {} + } if (!bagHasKey(previous_enc, "length") && bagHasKey(new_enc, "length")) previous_enc.setPropertyAsAString("length", new_enc.getPropertyAsAString("length")); From 4e61315b534afcf1d0be8ebdd220c0d7bc0c3053 Mon Sep 17 00:00:00 2001 From: Timothy Guan-tin Chien Date: Mon, 20 Mar 2017 15:57:45 -0400 Subject: [PATCH 056/169] Bug 1273537. r=gijs --- browser/base/content/browser.js | 5 +++++ browser/base/content/test/urlbar/browser_bug304198.js | 3 +++ browser/base/content/test/urlbar/browser_canonizeURL.js | 2 ++ 3 files changed, 10 insertions(+) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 5ceca60efb10..f4957e963376 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -2572,8 +2572,13 @@ function URLBarSetURI(aURI) { valid = !isBlankPageURL(uri.spec); } + let isDifferentValidValue = valid && value != gURLBar.value; gURLBar.value = value; gURLBar.valueIsTyped = !valid; + if (isDifferentValidValue) { + gURLBar.selectionStart = gURLBar.selectionEnd = 0; + } + SetPageProxyState(valid ? "valid" : "invalid"); } diff --git a/browser/base/content/test/urlbar/browser_bug304198.js b/browser/base/content/test/urlbar/browser_bug304198.js index 0876e8889a11..86e3911e60af 100644 --- a/browser/base/content/test/urlbar/browser_bug304198.js +++ b/browser/base/content/test/urlbar/browser_bug304198.js @@ -48,6 +48,9 @@ add_task(function* () { resolve(); }, {once: true}); gURLBar.focus(); + if (gURLBar.selectionStart == gURLBar.selectionEnd) { + gURLBar.selectionStart = gURLBar.selectionEnd = gURLBar.textValue.length; + } EventUtils.synthesizeKey("VK_BACK_SPACE", {}); }); } diff --git a/browser/base/content/test/urlbar/browser_canonizeURL.js b/browser/base/content/test/urlbar/browser_canonizeURL.js index a422dcc9eb82..59ab54ca0b9a 100644 --- a/browser/base/content/test/urlbar/browser_canonizeURL.js +++ b/browser/base/content/test/urlbar/browser_canonizeURL.js @@ -29,6 +29,8 @@ add_task(function*() { let promiseLoad = waitForDocLoadAndStopIt(expectedURL); gURLBar.focus(); if (Object.keys(options).length > 0) { + gURLBar.selectionStart = gURLBar.selectionEnd = + gURLBar.inputField.value.length; gURLBar.inputField.value = inputValue.slice(0, -1); EventUtils.synthesizeKey(inputValue.slice(-1), {}); } else { From 19c596cba2c119eb4856923189cdd124c8b7c2e5 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Mon, 20 Mar 2017 13:11:45 -0700 Subject: [PATCH 057/169] Bug 1341191 - ESlint followup a=bustage MozReview-Commit-ID: 4lDdvZoklM --HG-- extra : rebase_source : 33a02db3d33f853f0680083a07fdeec55ce794a0 --- browser/base/content/browser-feeds.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/browser/base/content/browser-feeds.js b/browser/base/content/browser-feeds.js index 6f134236f262..3e95db0f130d 100644 --- a/browser/base/content/browser-feeds.js +++ b/browser/base/content/browser-feeds.js @@ -528,10 +528,7 @@ var FeedHandler = { // Ensure we have a pref that is settable if (aPrefName && SETTABLE_PREFS.has(aPrefName)) { if (aIsComplex) { - const supportsString = Cc["@mozilla.org/supports-string;1"]. - createInstance(Ci.nsISupportsString); - supportsString.data = aPrefValue; - Services.prefs.setComplexValue(aPrefName, Ci.nsISupportsString, supportsString); + Services.prefs.setStringPref(aPrefName, aPrefValue); } else { Services.prefs.setCharPref(aPrefName, aPrefValue); } @@ -551,7 +548,7 @@ var FeedHandler = { if (handler === "web") { try { - url = prefs.getComplexValue(getPrefWebForType(feedType), Ci.nsISupportsString).data; + url = prefs.getStringPref(getPrefWebForType(feedType)); } catch (ex) { LOG("FeedWriter._setSelectedHandler: invalid or no handler in prefs"); url = null; From 7c764b25b0275622ef68c9cc368460c67bf97a61 Mon Sep 17 00:00:00 2001 From: Gregory Moore Date: Sat, 18 Mar 2017 17:12:35 -0700 Subject: [PATCH 058/169] Bug 1343775 - Relieve overscroll after low-velocity pan so page doesn't get stuck in overscroll. r=botond MozReview-Commit-ID: JmdDWMkk8uK --HG-- extra : rebase_source : 6d687df086288bd4ae4d27cdcd7a2ed2ccdd45de extra : amend_source : bed3f2586a6705bef24001fbfc3552cab6ab5360 --- gfx/layers/apz/src/AsyncPanZoomController.cpp | 3 +++ gfx/layers/apz/test/gtest/TestBasic.cpp | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp index 690ceeb91174..11c691ea53bb 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -1273,6 +1273,9 @@ nsEventStatus AsyncPanZoomController::OnTouchEnd(const MultiTouchInput& aEvent) flingVelocity.Length().value, gfxPrefs::APZFlingMinVelocityThreshold()); if (flingVelocity.Length() < gfxPrefs::APZFlingMinVelocityThreshold()) { + // Relieve overscroll now if needed, since we will not transition to a fling + // animation and then an overscroll animation, and relieve it then. + GetCurrentTouchBlock()->GetOverscrollHandoffChain()->SnapBackOverscrolledApzc(this); return nsEventStatus_eConsumeNoDefault; } diff --git a/gfx/layers/apz/test/gtest/TestBasic.cpp b/gfx/layers/apz/test/gtest/TestBasic.cpp index 251b6f92d45a..cb110f6b3b42 100644 --- a/gfx/layers/apz/test/gtest/TestBasic.cpp +++ b/gfx/layers/apz/test/gtest/TestBasic.cpp @@ -314,6 +314,23 @@ TEST_F(APZCBasicTester, OverScroll_Bug1152051b) { SampleAnimationUntilRecoveredFromOverscroll(expectedScrollOffset); } +// Tests that the page doesn't get stuck in an +// overscroll animation after a low-velocity pan. +TEST_F(APZCBasicTester, OverScrollAfterLowVelocityPan_Bug1343775) { + SCOPED_GFX_PREF(APZOverscrollEnabled, bool, true); + + // Pan into overscroll with a velocity less than the + // apz.fling_min_velocity_threshold preference. + Pan(apzc, 10, 30); + + EXPECT_TRUE(apzc->IsOverscrolled()); + + apzc->AdvanceAnimationsUntilEnd(); + + // Check that we recovered from overscroll. + EXPECT_FALSE(apzc->IsOverscrolled()); +} + TEST_F(APZCBasicTester, OverScrollAbort) { SCOPED_GFX_PREF(APZOverscrollEnabled, bool, true); From 6c40f8a40b19ecd124b0b1e5485c45637e716bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 19 Mar 2017 12:00:50 +0100 Subject: [PATCH 059/169] Bug 1296516: Tidy RestyleManager::ContentStateChanged. r=heycam MozReview-Commit-ID: 7iWc6JvljhT --- layout/base/GeckoRestyleManager.cpp | 5 ++--- layout/base/GeckoRestyleManager.h | 4 ++-- layout/base/RestyleManager.h | 4 ++-- layout/base/RestyleManagerInlines.h | 2 +- layout/base/ServoRestyleManager.cpp | 6 ++---- layout/base/ServoRestyleManager.h | 3 +-- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/layout/base/GeckoRestyleManager.cpp b/layout/base/GeckoRestyleManager.cpp index f20b84c88486..40f83f612284 100644 --- a/layout/base/GeckoRestyleManager.cpp +++ b/layout/base/GeckoRestyleManager.cpp @@ -200,14 +200,14 @@ ElementForStyleContext(nsIContent* aParentContent, // Forwarded nsIDocumentObserver method, to handle restyling (and // passing the notification to the frame). -nsresult +void GeckoRestyleManager::ContentStateChanged(nsIContent* aContent, EventStates aStateMask) { // XXXbz it would be good if this function only took Elements, but // we'd have to make ESM guarantee that usefully. if (!aContent->IsElement()) { - return NS_OK; + return; } Element* aElement = aContent->AsElement(); @@ -217,7 +217,6 @@ GeckoRestyleManager::ContentStateChanged(nsIContent* aContent, ContentStateChangedInternal(aElement, aStateMask, &changeHint, &restyleHint); PostRestyleEvent(aElement, restyleHint, changeHint); - return NS_OK; } // Forwarded nsIMutationObserver method, to handle restyling. diff --git a/layout/base/GeckoRestyleManager.h b/layout/base/GeckoRestyleManager.h index cf599a4d2076..b228d119b0c4 100644 --- a/layout/base/GeckoRestyleManager.h +++ b/layout/base/GeckoRestyleManager.h @@ -54,8 +54,8 @@ protected: public: // Forwarded nsIDocumentObserver method, to handle restyling (and // passing the notification to the frame). - nsresult ContentStateChanged(nsIContent* aContent, - EventStates aStateMask); + void ContentStateChanged(nsIContent* aContent, + EventStates aStateMask); // Forwarded nsIMutationObserver method, to handle restyling. void AttributeWillChange(Element* aElement, diff --git a/layout/base/RestyleManager.h b/layout/base/RestyleManager.h index f973323cc279..39e06efd2435 100644 --- a/layout/base/RestyleManager.h +++ b/layout/base/RestyleManager.h @@ -174,8 +174,8 @@ public: inline void PostRebuildAllStyleDataEvent(nsChangeHint aExtraHint, nsRestyleHint aRestyleHint); inline void ProcessPendingRestyles(); - inline nsresult ContentStateChanged(nsIContent* aContent, - EventStates aStateMask); + inline void ContentStateChanged(nsIContent* aContent, + EventStates aStateMask); inline void AttributeWillChange(dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, diff --git a/layout/base/RestyleManagerInlines.h b/layout/base/RestyleManagerInlines.h index 921739fa893f..0c6aabe824c1 100644 --- a/layout/base/RestyleManagerInlines.h +++ b/layout/base/RestyleManagerInlines.h @@ -44,7 +44,7 @@ RestyleManager::ProcessPendingRestyles() MOZ_STYLO_FORWARD(ProcessPendingRestyles, ()); } -nsresult +void RestyleManager::ContentStateChanged(nsIContent* aContent, EventStates aStateMask) { diff --git a/layout/base/ServoRestyleManager.cpp b/layout/base/ServoRestyleManager.cpp index f3dd2a11c0f4..1addf4cf08f7 100644 --- a/layout/base/ServoRestyleManager.cpp +++ b/layout/base/ServoRestyleManager.cpp @@ -462,12 +462,12 @@ ServoRestyleManager::ContentRemoved(nsINode* aContainer, NS_WARNING("stylo: ServoRestyleManager::ContentRemoved not implemented"); } -nsresult +void ServoRestyleManager::ContentStateChanged(nsIContent* aContent, EventStates aChangedBits) { if (!aContent->IsElement()) { - return NS_OK; + return; } Element* aElement = aContent->AsElement(); @@ -502,8 +502,6 @@ ServoRestyleManager::ContentStateChanged(nsIContent* aContent, snapshot->AddState(previousState); PostRestyleEvent(aElement, restyleHint, changeHint); } - - return NS_OK; } void diff --git a/layout/base/ServoRestyleManager.h b/layout/base/ServoRestyleManager.h index c82075394944..e34db1040194 100644 --- a/layout/base/ServoRestyleManager.h +++ b/layout/base/ServoRestyleManager.h @@ -63,8 +63,7 @@ public: nsIContent* aChild); void RestyleForAppend(nsIContent* aContainer, nsIContent* aFirstNewContent); - nsresult ContentStateChanged(nsIContent* aContent, - EventStates aStateMask); + void ContentStateChanged(nsIContent* aContent, EventStates aStateMask); void AttributeWillChange(dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, From a079d79f658db01a895003e017279501f746dd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 19 Mar 2017 12:11:34 +0100 Subject: [PATCH 060/169] Bug 1296516: Indentation nits in nsFrameManager. r=heycam MozReview-Commit-ID: L98VVegeATX --- layout/base/nsFrameManager.h | 51 ++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/layout/base/nsFrameManager.h b/layout/base/nsFrameManager.h index 1086e331b28a..15003dc5e9be 100644 --- a/layout/base/nsFrameManager.h +++ b/layout/base/nsFrameManager.h @@ -33,11 +33,12 @@ namespace mozilla { * Node in a linked list, containing the style for an element that * does not have a frame but whose parent does have a frame. */ -struct UndisplayedNode { +struct UndisplayedNode +{ UndisplayedNode(nsIContent* aContent, nsStyleContext* aStyle) - : mContent(aContent), - mStyle(aStyle), - mNext(nullptr) + : mContent(aContent) + , mStyle(aStyle) + , mNext(nullptr) { MOZ_COUNT_CTOR(mozilla::UndisplayedNode); } @@ -56,9 +57,9 @@ struct UndisplayedNode { } } - nsCOMPtr mContent; - RefPtr mStyle; - UndisplayedNode* mNext; + nsCOMPtr mContent; + RefPtr mStyle; + UndisplayedNode* mNext; }; } // namespace mozilla @@ -99,7 +100,7 @@ public: void RegisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame); void UnregisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame); - void ClearPlaceholderFrameMap(); + void ClearPlaceholderFrameMap(); // Mapping undisplayed content nsStyleContext* GetUndisplayedContent(const nsIContent* aContent) @@ -156,8 +157,7 @@ public: /** * Register aContent having a display:contents style context. */ - void SetDisplayContents(nsIContent* aContent, - nsStyleContext* aStyleContext); + void SetDisplayContents(nsIContent* aContent, nsStyleContext* aStyleContext); /** * Change the registered style context for aContent to aStyleContext. */ @@ -172,28 +172,26 @@ public: * If found, then also unregister any display:contents and display:none * style contexts for its descendants. */ - void ClearDisplayContentsIn(nsIContent* aContent, - nsIContent* aParentContent); + void ClearDisplayContentsIn(nsIContent* aContent, nsIContent* aParentContent); void ClearAllDisplayContentsIn(nsIContent* aParentContent); // Functions for manipulating the frame model void AppendFrames(nsContainerFrame* aParentFrame, - ChildListID aListID, - nsFrameList& aFrameList); + ChildListID aListID, + nsFrameList& aFrameList); void InsertFrames(nsContainerFrame* aParentFrame, - ChildListID aListID, - nsIFrame* aPrevFrame, - nsFrameList& aFrameList); + ChildListID aListID, + nsIFrame* aPrevFrame, + nsFrameList& aFrameList); - void RemoveFrame(ChildListID aListID, - nsIFrame* aOldFrame); + void RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame); /* * Notification that a frame is about to be destroyed. This allows any * outstanding references to the frame to be cleaned up. */ - void NotifyDestroyingFrame(nsIFrame* aFrame); + void NotifyDestroyingFrame(nsIFrame* aFrame); /* * Capture/restore frame state for the frame subtree rooted at aFrame. @@ -204,20 +202,17 @@ public: * of aFrame. */ - void CaptureFrameState(nsIFrame* aFrame, - nsILayoutHistoryState* aState); + void CaptureFrameState(nsIFrame* aFrame, nsILayoutHistoryState* aState); - void RestoreFrameState(nsIFrame* aFrame, - nsILayoutHistoryState* aState); + void RestoreFrameState(nsIFrame* aFrame, nsILayoutHistoryState* aState); /* * Add/restore state for one frame */ - void CaptureFrameStateFor(nsIFrame* aFrame, - nsILayoutHistoryState* aState); + void CaptureFrameStateFor(nsIFrame* aFrame, nsILayoutHistoryState* aState); + + void RestoreFrameStateFor(nsIFrame* aFrame, nsILayoutHistoryState* aState); - void RestoreFrameStateFor(nsIFrame* aFrame, - nsILayoutHistoryState* aState); protected: static nsStyleContext* GetStyleContextInMap(UndisplayedMap* aMap, const nsIContent* aContent); From c8a5bc51650c9067fb83bfbf2ca11696a316b131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 19 Mar 2017 20:19:06 +0100 Subject: [PATCH 061/169] Bug 1296516: Convert UndisplayedMap to a typed hashtable. r=heycam MozReview-Commit-ID: g54ekayP2y --- layout/base/GeckoRestyleManager.cpp | 4 +- layout/base/nsFrameManager.cpp | 341 ++++++++++++---------------- layout/base/nsFrameManager.h | 19 +- 3 files changed, 152 insertions(+), 212 deletions(-) diff --git a/layout/base/GeckoRestyleManager.cpp b/layout/base/GeckoRestyleManager.cpp index 40f83f612284..3b161914df97 100644 --- a/layout/base/GeckoRestyleManager.cpp +++ b/layout/base/GeckoRestyleManager.cpp @@ -1514,7 +1514,7 @@ ElementRestyler::ConditionallyRestyleUndisplayedNodes( } for (UndisplayedNode* undisplayed = aUndisplayed; undisplayed; - undisplayed = undisplayed->mNext) { + undisplayed = undisplayed->getNext()) { if (!undisplayed->mContent->IsElement()) { continue; @@ -3173,7 +3173,7 @@ ElementRestyler::RestyleUndisplayedNodes(nsRestyleHint aChildRestyleHint, if (undisplayed) { pusher.PushAncestorAndStyleScope(undisplayedParent); } - for (; undisplayed; undisplayed = undisplayed->mNext) { + for (; undisplayed; undisplayed = undisplayed->getNext()) { NS_ASSERTION(undisplayedParent || undisplayed->mContent == mPresContext->Document()->GetRootElement(), diff --git a/layout/base/nsFrameManager.cpp b/layout/base/nsFrameManager.cpp index 79c43f99ae7a..210924d7dedb 100644 --- a/layout/base/nsFrameManager.cpp +++ b/layout/base/nsFrameManager.cpp @@ -38,13 +38,8 @@ #include "nsIStatefulFrame.h" #include "nsContainerFrame.h" - #ifdef DEBUG - //#define DEBUG_UNDISPLAYED_MAP - //#define DEBUG_DISPLAY_CONTENTS_MAP - #else - #undef DEBUG_UNDISPLAYED_MAP - #undef DEBUG_DISPLAY_CONTENTS_MAP - #endif +// #define DEBUG_UNDISPLAYED_MAP +// #define DEBUG_DISPLAY_CONTENTS_MAP using namespace mozilla; using namespace mozilla::dom; @@ -87,40 +82,49 @@ nsFrameManagerBase::nsFrameManagerBase() //---------------------------------------------------------------------- -// XXXldb This seems too complicated for what I think it's doing, and it -// should also be using PLDHashTable rather than plhash to use less memory. +/** + * The undisplayed map is a class that maps a parent content node to the + * undisplayed content children, and their style contexts. + * + * The linked list of nodes holds strong references to the style contexts and + * the content. + */ +class nsFrameManagerBase::UndisplayedMap : + private nsClassHashtable, + LinkedList> +{ + typedef nsClassHashtable, LinkedList> base_type; -class nsFrameManagerBase::UndisplayedMap { public: - explicit UndisplayedMap(uint32_t aNumBuckets = 16); - ~UndisplayedMap(void); + UndisplayedMap(); + ~UndisplayedMap(); UndisplayedNode* GetFirstNode(nsIContent* aParentContent); - nsresult AddNodeFor(nsIContent* aParentContent, - nsIContent* aChild, nsStyleContext* aStyle); + void AddNodeFor(nsIContent* aParentContent, + nsIContent* aChild, + nsStyleContext* aStyle); - void RemoveNodeFor(nsIContent* aParentContent, - UndisplayedNode* aNode); + void RemoveNodeFor(nsIContent* aParentContent, UndisplayedNode* aNode); void RemoveNodesFor(nsIContent* aParentContent); - UndisplayedNode* UnlinkNodesFor(nsIContent* aParentContent); + + nsAutoPtr> + UnlinkNodesFor(nsIContent* aParentContent); // Removes all entries from the hash table - void Clear(void); + void Clear(); protected: + LinkedList* GetListFor(nsIContent** aParentContent); + LinkedList* GetOrCreateListFor(nsIContent** aParentContent); + void AppendNodeFor(UndisplayedNode* aNode, nsIContent* aParentContent); /** - * Gets the entry for the provided parent content. If the content - * is a element, |**aParentContent| is set to - * the parent of the children element. + * Get the applicable parent for the map lookup. This is almost always the + * provided argument, except if it's a element, in which case + * it's the parent of the children element. */ - PLHashEntry** GetEntryFor(nsIContent** aParentContent); - void AppendNodeFor(UndisplayedNode* aNode, - nsIContent* aParentContent); - - PLHashTable* mTable; - PLHashEntry** mLastLookup; + nsIContent* GetApplicableParent(nsIContent* aParent); }; //---------------------------------------------------------------------- @@ -145,7 +149,7 @@ nsFrameManager::Destroy() mRootFrame->Destroy(); mRootFrame = nullptr; } - + delete mUndisplayedMap; mUndisplayedMap = nullptr; delete mDisplayContentsMap; @@ -234,7 +238,7 @@ nsFrameManager::GetUndisplayedNodeInMapFor(UndisplayedMap* aMap, } nsIContent* parent = ParentForUndisplayedMap(aContent); for (UndisplayedNode* node = aMap->GetFirstNode(parent); - node; node = node->mNext) { + node; node = node->getNext()) { if (node->mContent == aContent) return node; } @@ -261,16 +265,16 @@ nsFrameManager::SetStyleContextInMap(UndisplayedMap* aMap, nsIContent* aContent, nsStyleContext* aStyleContext) { - NS_PRECONDITION(!aStyleContext->GetPseudo(), - "Should only have actual elements here"); + MOZ_ASSERT(!aStyleContext->GetPseudo(), + "Should only have actual elements here"); #if defined(DEBUG_UNDISPLAYED_MAP) || defined(DEBUG_DISPLAY_BOX_CONTENTS_MAP) static int i = 0; printf("SetStyleContextInMap(%d): p=%p \n", i++, (void *)aContent); #endif - NS_ASSERTION(!GetStyleContextInMap(aMap, aContent), - "Already have an entry for aContent"); + MOZ_ASSERT(!GetStyleContextInMap(aMap, aContent), + "Already have an entry for aContent"); nsIContent* parent = ParentForUndisplayedMap(aContent); #ifdef DEBUG @@ -306,7 +310,7 @@ nsFrameManager::ChangeStyleContextInMap(UndisplayedMap* aMap, #endif for (UndisplayedNode* node = aMap->GetFirstNode(aContent->GetParent()); - node; node = node->mNext) { + node; node = node->getNext()) { if (node->mContent == aContent) { node->mStyle = aStyleContext; return; @@ -324,26 +328,26 @@ nsFrameManager::ClearUndisplayedContentIn(nsIContent* aContent, static int i = 0; printf("ClearUndisplayedContent(%d): content=%p parent=%p --> ", i++, (void *)aContent, (void*)aParentContent); #endif - - if (mUndisplayedMap) { - UndisplayedNode* node = mUndisplayedMap->GetFirstNode(aParentContent); - while (node) { - if (node->mContent == aContent) { - mUndisplayedMap->RemoveNodeFor(aParentContent, node); + + if (!mUndisplayedMap) { + return; + } + + for (UndisplayedNode* node = mUndisplayedMap->GetFirstNode(aParentContent); + node; node = node->getNext()) { + if (node->mContent == aContent) { + mUndisplayedMap->RemoveNodeFor(aParentContent, node); #ifdef DEBUG_UNDISPLAYED_MAP - printf( "REMOVED!\n"); + printf( "REMOVED!\n"); #endif -#ifdef DEBUG - // make sure that there are no more entries for the same content - nsStyleContext *context = GetUndisplayedContent(aContent); - NS_ASSERTION(context == nullptr, "Found more undisplayed content data after removal"); -#endif - return; - } - node = node->mNext; + // make sure that there are no more entries for the same content + MOZ_ASSERT(!GetUndisplayedContent(aContent), + "Found more undisplayed content data after removal"); + return; } } + #ifdef DEBUG_UNDISPLAYED_MAP printf( "not found.\n"); #endif @@ -399,26 +403,25 @@ nsFrameManager::ClearDisplayContentsIn(nsIContent* aContent, static int i = 0; printf("ClearDisplayContents(%d): content=%p parent=%p --> ", i++, (void *)aContent, (void*)aParentContent); #endif - - if (mDisplayContentsMap) { - UndisplayedNode* node = mDisplayContentsMap->GetFirstNode(aParentContent); - while (node) { - if (node->mContent == aContent) { - mDisplayContentsMap->RemoveNodeFor(aParentContent, node); + + if (!mDisplayContentsMap) { + return; + } + + for (UndisplayedNode* node = mDisplayContentsMap->GetFirstNode(aParentContent); + node; node = node->getNext()) { + if (node->mContent == aContent) { + mDisplayContentsMap->RemoveNodeFor(aParentContent, node); #ifdef DEBUG_DISPLAY_CONTENTS_MAP - printf( "REMOVED!\n"); + printf( "REMOVED!\n"); #endif -#ifdef DEBUG - // make sure that there are no more entries for the same content - nsStyleContext* context = GetDisplayContentsStyleFor(aContent); - NS_ASSERTION(context == nullptr, "Found more entries for aContent after removal"); -#endif - ClearAllDisplayContentsIn(aContent); - ClearAllUndisplayedContentIn(aContent); - return; - } - node = node->mNext; + // make sure that there are no more entries for the same content + MOZ_ASSERT(!GetDisplayContentsStyleFor(aContent), + "Found more entries for aContent after removal"); + ClearAllDisplayContentsIn(aContent); + ClearAllUndisplayedContentIn(aContent); + return; } } #ifdef DEBUG_DISPLAY_CONTENTS_MAP @@ -435,14 +438,14 @@ nsFrameManager::ClearAllDisplayContentsIn(nsIContent* aParentContent) #endif if (mDisplayContentsMap) { - UndisplayedNode* cur = mDisplayContentsMap->UnlinkNodesFor(aParentContent); - while (cur) { - UndisplayedNode* next = cur->mNext; - cur->mNext = nullptr; - ClearAllDisplayContentsIn(cur->mContent); - ClearAllUndisplayedContentIn(cur->mContent); - delete cur; - cur = next; + nsAutoPtr> list = + mDisplayContentsMap->UnlinkNodesFor(aParentContent); + if (list) { + while (UndisplayedNode* node = list->popFirst()) { + ClearAllDisplayContentsIn(node->mContent); + ClearAllUndisplayedContentIn(node->mContent); + delete node; + } } } @@ -673,180 +676,132 @@ nsFrameManager::RestoreFrameState(nsIFrame* aFrame, //---------------------------------------------------------------------- -static PLHashNumber -HashKey(void* key) -{ - return NS_PTR_TO_INT32(key); -} - -static int -CompareKeys(void* key1, void* key2) -{ - return key1 == key2; -} - -//---------------------------------------------------------------------- - -nsFrameManagerBase::UndisplayedMap::UndisplayedMap(uint32_t aNumBuckets) +nsFrameManagerBase::UndisplayedMap::UndisplayedMap() { MOZ_COUNT_CTOR(nsFrameManagerBase::UndisplayedMap); - mTable = PL_NewHashTable(aNumBuckets, (PLHashFunction)HashKey, - (PLHashComparator)CompareKeys, - (PLHashComparator)nullptr, - nullptr, nullptr); - mLastLookup = nullptr; } nsFrameManagerBase::UndisplayedMap::~UndisplayedMap(void) { MOZ_COUNT_DTOR(nsFrameManagerBase::UndisplayedMap); Clear(); - PL_HashTableDestroy(mTable); } -PLHashEntry** -nsFrameManagerBase::UndisplayedMap::GetEntryFor(nsIContent** aParentContent) +void +nsFrameManagerBase::UndisplayedMap::Clear() { - nsIContent* parentContent = *aParentContent; - - if (mLastLookup && (parentContent == (*mLastLookup)->key)) { - return mLastLookup; + for (auto iter = Iter(); !iter.Done(); iter.Next()) { + auto* list = iter.UserData(); + while (auto* node = list->popFirst()) { + delete node; + } + iter.Remove(); } +} + +nsIContent* +nsFrameManagerBase::UndisplayedMap::GetApplicableParent(nsIContent* aParent) +{ // In the case of XBL default content, elements do not get a // frame causing a mismatch between the content tree and the frame tree. // |GetEntryFor| is sometimes called with the content tree parent (which may // be a element) but the parent in the frame tree would be the // insertion parent (parent of the element). Here the children // elements are normalized to the insertion parent to correct for the mismatch. - if (parentContent && nsContentUtils::IsContentInsertionPoint(parentContent)) { - parentContent = parentContent->GetParent(); - // Change the caller's pointer for the parent content to be the insertion parent. - *aParentContent = parentContent; + if (aParent && nsContentUtils::IsContentInsertionPoint(aParent)) { + return aParent->GetParent(); } - PLHashNumber hashCode = NS_PTR_TO_INT32(parentContent); - PLHashEntry** entry = PL_HashTableRawLookup(mTable, hashCode, parentContent); - if (*entry && !ServoStyleSet::IsInServoTraversal()) { - mLastLookup = entry; - } - return entry; + return aParent; } -UndisplayedNode* -nsFrameManagerBase::UndisplayedMap::GetFirstNode(nsIContent* aParentContent) +LinkedList* +nsFrameManagerBase::UndisplayedMap::GetListFor(nsIContent** aParent) { - PLHashEntry** entry = GetEntryFor(&aParentContent); - if (*entry) { - return (UndisplayedNode*)((*entry)->value); + *aParent = GetApplicableParent(*aParent); + + LinkedList* list; + if (Get(*aParent, &list)) { + return list; } + return nullptr; } +LinkedList* +nsFrameManagerBase::UndisplayedMap::GetOrCreateListFor(nsIContent** aParent) +{ + *aParent = GetApplicableParent(*aParent); + return LookupOrAdd(*aParent); +} + + +UndisplayedNode* +nsFrameManagerBase::UndisplayedMap::GetFirstNode(nsIContent* aParentContent) +{ + auto* list = GetListFor(&aParentContent); + return list ? list->getFirst() : nullptr; +} + + void nsFrameManagerBase::UndisplayedMap::AppendNodeFor(UndisplayedNode* aNode, nsIContent* aParentContent) { - PLHashEntry** entry = GetEntryFor(&aParentContent); - if (*entry) { - UndisplayedNode* node = (UndisplayedNode*)((*entry)->value); - while (node->mNext) { - if (node->mContent == aNode->mContent) { - // We actually need to check this in optimized builds because - // there are some callers that do this. See bug 118014, bug - // 136704, etc. - NS_NOTREACHED("node in map twice"); - delete aNode; - return; - } - node = node->mNext; - } - node->mNext = aNode; - } - else { - PLHashNumber hashCode = NS_PTR_TO_INT32(aParentContent); - PL_HashTableRawAdd(mTable, entry, hashCode, aParentContent, aNode); - mLastLookup = nullptr; // hashtable may have shifted bucket out from under us + LinkedList* list = GetOrCreateListFor(&aParentContent); + +#ifdef DEBUG + for (UndisplayedNode* node = list->getFirst(); node; node = node->getNext()) { + // NOTE: In the original code there was a work around for this case, I want + // to check it still happens before hacking around it the same way. + MOZ_ASSERT(node->mContent != aNode->mContent, + "Duplicated content in undisplayed list!"); } +#endif + + list->insertBack(aNode); } -nsresult +void nsFrameManagerBase::UndisplayedMap::AddNodeFor(nsIContent* aParentContent, - nsIContent* aChild, + nsIContent* aChild, nsStyleContext* aStyle) { UndisplayedNode* node = new UndisplayedNode(aChild, aStyle); - AppendNodeFor(node, aParentContent); - return NS_OK; } void nsFrameManagerBase::UndisplayedMap::RemoveNodeFor(nsIContent* aParentContent, UndisplayedNode* aNode) { - PLHashEntry** entry = GetEntryFor(&aParentContent); - NS_ASSERTION(*entry, "content not in map"); - if (*entry) { - if ((UndisplayedNode*)((*entry)->value) == aNode) { // first node - if (aNode->mNext) { - (*entry)->value = aNode->mNext; - aNode->mNext = nullptr; - } - else { - PL_HashTableRawRemove(mTable, entry, *entry); - mLastLookup = nullptr; // hashtable may have shifted bucket out from under us - } - } - else { - UndisplayedNode* node = (UndisplayedNode*)((*entry)->value); - while (node->mNext) { - if (node->mNext == aNode) { - node->mNext = aNode->mNext; - aNode->mNext = nullptr; - break; - } - node = node->mNext; - } - } - } +#ifdef DEBUG + auto list = GetListFor(&aParentContent); + MOZ_ASSERT(list, "content not in map"); + aNode->removeFrom(*list); +#else + aNode->remove(); +#endif delete aNode; } -UndisplayedNode* +nsAutoPtr> nsFrameManagerBase::UndisplayedMap::UnlinkNodesFor(nsIContent* aParentContent) { - PLHashEntry** entry = GetEntryFor(&aParentContent); - NS_ASSERTION(entry, "content not in map"); - if (*entry) { - UndisplayedNode* node = (UndisplayedNode*)((*entry)->value); - NS_ASSERTION(node, "null node for non-null entry in UndisplayedMap"); - PL_HashTableRawRemove(mTable, entry, *entry); - mLastLookup = nullptr; // hashtable may have shifted bucket out from under us - return node; - } - return nullptr; + nsAutoPtr> list; + RemoveAndForget(GetApplicableParent(aParentContent), list); + return list; } void nsFrameManagerBase::UndisplayedMap::RemoveNodesFor(nsIContent* aParentContent) { - delete UnlinkNodesFor(aParentContent); -} - -static int -RemoveUndisplayedEntry(PLHashEntry* he, int i, void* arg) -{ - UndisplayedNode* node = (UndisplayedNode*)(he->value); - delete node; - // Remove and free this entry and continue enumerating - return HT_ENUMERATE_REMOVE | HT_ENUMERATE_NEXT; -} - -void -nsFrameManagerBase::UndisplayedMap::Clear(void) -{ - mLastLookup = nullptr; - PL_HashTableEnumerateEntries(mTable, RemoveUndisplayedEntry, 0); + nsAutoPtr> list = UnlinkNodesFor(aParentContent); + if (list) { + while (auto* node = list->popFirst()) { + delete node; + } + } } diff --git a/layout/base/nsFrameManager.h b/layout/base/nsFrameManager.h index 15003dc5e9be..0d9184734640 100644 --- a/layout/base/nsFrameManager.h +++ b/layout/base/nsFrameManager.h @@ -33,33 +33,19 @@ namespace mozilla { * Node in a linked list, containing the style for an element that * does not have a frame but whose parent does have a frame. */ -struct UndisplayedNode +struct UndisplayedNode : public LinkedListElement { UndisplayedNode(nsIContent* aContent, nsStyleContext* aStyle) : mContent(aContent) , mStyle(aStyle) - , mNext(nullptr) { MOZ_COUNT_CTOR(mozilla::UndisplayedNode); } - ~UndisplayedNode() - { - MOZ_COUNT_DTOR(mozilla::UndisplayedNode); - - // Delete mNext iteratively to avoid blowing up the stack (bug 460461). - UndisplayedNode* cur = mNext; - while (cur) { - UndisplayedNode* next = cur->mNext; - cur->mNext = nullptr; - delete cur; - cur = next; - } - } + ~UndisplayedNode() { MOZ_COUNT_DTOR(mozilla::UndisplayedNode); } nsCOMPtr mContent; RefPtr mStyle; - UndisplayedNode* mNext; }; } // namespace mozilla @@ -76,7 +62,6 @@ struct UndisplayedNode * else you'll break the validity of the reinterpret_cast in nsIPresShell's * FrameManager() method. */ - class nsFrameManager : public nsFrameManagerBase { typedef mozilla::layout::FrameChildListID ChildListID; From 401a3ef429b5eefbde0533b14b6fe2aa53aeb133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 20 Mar 2017 02:56:43 +0100 Subject: [PATCH 062/169] Bug 1296516: Cleanup infallible or unchecked nsCSSFrameConstructor methods. r=heycam MozReview-Commit-ID: IoMOQyAhadv --- layout/base/PresShell.cpp | 12 +- layout/base/PresShell.h | 2 +- layout/base/nsCSSFrameConstructor.cpp | 289 +++++++++++--------------- layout/base/nsCSSFrameConstructor.h | 129 ++++++------ layout/base/nsIPresShell.h | 2 +- 5 files changed, 195 insertions(+), 239 deletions(-) diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index 5b1fd8ce68c7..3e96f4d6a2af 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -4526,14 +4526,14 @@ PresShell::NotifyCounterStylesAreDirty() mFrameConstructor->EndUpdate(); } -nsresult -PresShell::ReconstructFrames(void) +void +PresShell::ReconstructFrames() { NS_PRECONDITION(!mFrameConstructor->GetRootFrame() || mDidInitialize, "Must not have root frame before initial reflow"); if (!mDidInitialize || mIsDestroying) { // Nothing to do here - return NS_OK; + return; } nsCOMPtr kungFuDeathGrip(this); @@ -4543,16 +4543,14 @@ PresShell::ReconstructFrames(void) mDocument->FlushPendingNotifications(FlushType::ContentAndNotify); if (mIsDestroying) { - return NS_OK; + return; } nsAutoCauseReflowNotifier crNotifier(this); mFrameConstructor->BeginUpdate(); - nsresult rv = mFrameConstructor->ReconstructDocElementHierarchy(); + mFrameConstructor->ReconstructDocElementHierarchy(); VERIFY_STYLE_TREE; mFrameConstructor->EndUpdate(); - - return rv; } void diff --git a/layout/base/PresShell.h b/layout/base/PresShell.h index 67248e23724b..6b83c4a7976a 100644 --- a/layout/base/PresShell.h +++ b/layout/base/PresShell.h @@ -188,7 +188,7 @@ public: virtual void NotifyCounterStylesAreDirty() override; - virtual nsresult ReconstructFrames(void) override; + virtual void ReconstructFrames(void) override; virtual void Freeze() override; virtual void Thaw() override; virtual void FireOrClearDelayedEvents(bool aFireEvents) override; diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 60aea641c4f8..53cc8e85c77b 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -3215,7 +3215,7 @@ nsCSSFrameConstructor::ConstructSelectFrame(nsFrameConstructorState& aState, * But the select tag should really be fixed to use GFX scrollbars that can * be create with BuildScrollFrame. */ -nsresult +void nsCSSFrameConstructor::InitializeSelectFrame(nsFrameConstructorState& aState, nsContainerFrame* scrollFrame, nsContainerFrame* scrolledFrame, @@ -3261,7 +3261,6 @@ nsCSSFrameConstructor::InitializeSelectFrame(nsFrameConstructorState& aState, // Set the scrolled frame's initial child lists scrolledFrame->SetInitialChildList(kPrincipalList, childItems); - return NS_OK; } nsIFrame* @@ -6264,16 +6263,16 @@ IsRootBoxFrame(nsIFrame *aFrame) return (aFrame->GetType() == nsGkAtoms::rootFrame); } -nsresult +void nsCSSFrameConstructor::ReconstructDocElementHierarchy() { Element* rootElement = mDocument->GetRootElement(); if (!rootElement) { /* nothing to do */ - return NS_OK; + return; } - return RecreateFramesForContent(rootElement, false, REMOVE_FOR_RECONSTRUCTION, - nullptr); + RecreateFramesForContent(rootElement, false, REMOVE_FOR_RECONSTRUCTION, + nullptr); } nsContainerFrame* @@ -6523,7 +6522,7 @@ GetInsertNextSibling(nsIFrame* aParentFrame, nsIFrame* aPrevSibling) * appending flowed frames to a parent's principal child list. It handles the * case where the parent is the trailing inline of an {ib} split. */ -nsresult +void nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState& aState, nsContainerFrame* aParentFrame, nsFrameItems& aFrameList, @@ -6606,15 +6605,13 @@ nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState& aStat // Recurse so we create new ib siblings as needed for aParentFrame's parent return AppendFramesToParent(aState, aParentFrame->GetParent(), ibSiblings, - aParentFrame, true); + aParentFrame, true); } - - return NS_OK; + return; } // Insert the frames after our aPrevSibling InsertFrames(aParentFrame, kPrincipalList, aPrevSibling, aFrameList); - return NS_OK; } #define UNSET_DISPLAY static_cast(255) @@ -7383,7 +7380,7 @@ nsCSSFrameConstructor::MaybeRecreateForFrameset(nsIFrame* aParentFrame, return false; } -nsresult +void nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, nsIContent* aFirstNewContent, bool aAllowLazyConstruction, @@ -7429,8 +7426,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (tag == nsGkAtoms::treechildren || tag == nsGkAtoms::treeitem || tag == nsGkAtoms::treerow) - return NS_OK; - + return; } #endif // MOZ_XUL @@ -7443,10 +7439,10 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, //XXXsmaug This is super unefficient! nsIContent* bindingParent = aContainer->GetBindingParent(); LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(bindingParent, false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(bindingParent, false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // The frame constructor uses this codepath both for bonafide newly-added @@ -7466,7 +7462,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } if (aAllowLazyConstruction && @@ -7474,7 +7470,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } // We couldn't construct lazily. Make Servo eagerly traverse the subtree. @@ -7489,13 +7485,13 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, nsContainerFrame*& parentFrame = insertion.mParentFrame; LAYOUT_PHASE_TEMP_REENTER(); if (!parentFrame) { - return NS_OK; + return; } LAYOUT_PHASE_TEMP_EXIT(); if (MaybeRecreateForFrameset(parentFrame, aFirstNewContent, nullptr)) { LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } LAYOUT_PHASE_TEMP_REENTER(); @@ -7503,15 +7499,15 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, // Nothing to do here; we shouldn't be constructing kids of leaves // Clear lazy bits so we don't try to construct again. ClearLazyBits(aFirstNewContent, nullptr); - return NS_OK; + return; } if (parentFrame->IsFrameOfType(nsIFrame::eMathML)) { LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(parentFrame->GetContent(), false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(parentFrame->GetContent(), false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // If the frame we are manipulating is a ib-split frame (that is, one @@ -7618,7 +7614,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (WipeContainingBlock(state, containingBlock, parentFrame, items, true, prevSibling)) { LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } LAYOUT_PHASE_TEMP_REENTER(); @@ -7704,8 +7700,6 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, aFirstNewContent, nullptr); } #endif - - return NS_OK; } #ifdef MOZ_XUL @@ -7748,17 +7742,17 @@ bool NotifyListBoxBody(nsPresContext* aPresContext, } #endif // MOZ_XUL -nsresult +void nsCSSFrameConstructor::ContentInserted(nsIContent* aContainer, nsIContent* aChild, nsILayoutHistoryState* aFrameState, bool aAllowLazyConstruction) { - return ContentRangeInserted(aContainer, - aChild, - aChild->GetNextSibling(), - aFrameState, - aAllowLazyConstruction); + ContentRangeInserted(aContainer, + aChild, + aChild->GetNextSibling(), + aFrameState, + aAllowLazyConstruction); } // ContentRangeInserted handles creating frames for a range of nodes that @@ -7779,7 +7773,7 @@ nsCSSFrameConstructor::ContentInserted(nsIContent* aContainer, // in the caption list, while skipping any nodes in the range being inserted // (because when we treat the caption frames the other nodes have had their // frames constructed but not yet inserted into the frame tree). -nsresult +void nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, nsIContent* aStartChild, nsIContent* aEndChild, @@ -7837,7 +7831,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, // The insert case in NotifyListBoxBody // doesn't use "old next sibling". aStartChild, nullptr, nullptr, CONTENT_INSERTED)) { - return NS_OK; + return; } } else { // We don't handle a range insert to a listbox parent, issue single @@ -7846,7 +7840,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, IssueSingleInsertNofications(aContainer, aStartChild, aEndChild, aAllowLazyConstruction); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } } #endif // MOZ_XUL @@ -7861,7 +7855,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (aStartChild != docElement) { // Not the root element; just bail out - return NS_OK; + return; } NS_PRECONDITION(nullptr == mRootElementFrame, @@ -7898,7 +7892,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, } #endif - return NS_OK; + return; } if (aContainer->HasFlag(NODE_IS_IN_SHADOW_TREE) && @@ -7911,10 +7905,10 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, //XXXsmaug This is super unefficient! nsIContent* bindingParent = aContainer->GetBindingParent(); LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(bindingParent, false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(bindingParent, false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // The frame constructor uses this codepath both for bonafide newly-added @@ -7940,7 +7934,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } // Otherwise, we've got parent content. Find its frame. @@ -7952,7 +7946,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } } @@ -7977,7 +7971,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, } if (!insertion.mParentFrame) { - return NS_OK; + return; } bool isAppend, isRangeInsertSafe; @@ -7991,7 +7985,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, IssueSingleInsertNofications(aContainer, aStartChild, aEndChild, aAllowLazyConstruction); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } nsIContent* container = insertion.mParentFrame->GetContent(); @@ -8000,7 +7994,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, LAYOUT_PHASE_TEMP_EXIT(); if (MaybeRecreateForFrameset(insertion.mParentFrame, aStartChild, aEndChild)) { LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } LAYOUT_PHASE_TEMP_REENTER(); @@ -8017,10 +8011,10 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, // and if so, proceed. But we'd have to extend nsFieldSetFrame // to locate this legend in the inserted frames and extract it. LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // We should only get here with details when doing a single insertion because @@ -8032,26 +8026,25 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, // expensive to recreate the entire details frame, but it's the simplest way // to handle the insertion. LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = - RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // Don't construct kids of leaves if (insertion.mParentFrame->IsLeaf()) { // Clear lazy bits so we don't try to construct again. ClearLazyBits(aStartChild, aEndChild); - return NS_OK; + return; } if (insertion.mParentFrame->IsFrameOfType(nsIFrame::eMathML)) { LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(insertion.mParentFrame->GetContent(), false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } Maybe matchContext; @@ -8132,7 +8125,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, IssueSingleInsertNofications(aContainer, aStartChild, aEndChild, aAllowLazyConstruction); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } container = insertion.mParentFrame->GetContent(); @@ -8200,7 +8193,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (WipeContainingBlock(state, containingBlock, insertion.mParentFrame, items, isAppend, prevSibling)) { LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } LAYOUT_PHASE_TEMP_REENTER(); @@ -8371,11 +8364,9 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, aStartChild, aEndChild); } #endif - - return NS_OK; } -nsresult +void nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, nsIContent* aChild, nsIContent* aOldNextSibling, @@ -8415,7 +8406,6 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, } #endif - nsresult rv = NS_OK; nsIFrame* childFrame = aChild->GetPrimaryFrame(); if (!childFrame || childFrame->GetContent() != aChild) { // XXXbz the GetContent() != aChild check is needed due to bug 135040. @@ -8442,7 +8432,7 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, // XXX Perhaps even only those that belong to the aChild sub-tree? RecreateFramesForContent(ancestor, false, aFlags, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } } @@ -8450,11 +8440,10 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, for (nsIContent* c = iter.GetNextChild(); c; c = iter.GetNextChild()) { if (c->GetPrimaryFrame() || GetDisplayContentsStyleFor(c)) { LAYOUT_PHASE_TEMP_EXIT(); - rv = ContentRemoved(aChild, c, nullptr, aFlags, aDidReconstruct, aDestroyedFramesFor); + ContentRemoved(aChild, c, nullptr, aFlags, aDidReconstruct, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - NS_ENSURE_SUCCESS(rv, rv); if (aFlags != REMOVE_DESTROY_FRAMES && *aDidReconstruct) { - return rv; + return; } } } @@ -8468,7 +8457,7 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, if (aFlags == REMOVE_DESTROY_FRAMES) { CaptureStateForFramesOf(aChild, mTempFrameTreeState); } - return NS_OK; + return; } #endif // MOZ_XUL @@ -8506,10 +8495,9 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, nsIContent* bindingParent = aContainer->GetBindingParent(); *aDidReconstruct = true; LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(bindingParent, false, - aFlags, aDestroyedFramesFor); + RecreateFramesForContent(bindingParent, false, aFlags, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } if (aFlags == REMOVE_DESTROY_FRAMES) { @@ -8522,14 +8510,14 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, // See whether we need to remove more than just childFrame LAYOUT_PHASE_TEMP_EXIT(); nsIContent* container; - if (MaybeRecreateContainerForFrameRemoval(childFrame, aFlags, &rv, &container)) { + if (MaybeRecreateContainerForFrameRemoval(childFrame, aFlags, &container)) { LAYOUT_PHASE_TEMP_REENTER(); MOZ_ASSERT(container); *aDidReconstruct = true; if (aDestroyedFramesFor) { *aDestroyedFramesFor = container; } - return rv; + return; } LAYOUT_PHASE_TEMP_REENTER(); @@ -8542,10 +8530,10 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, // Just reframe the parent, since framesets are weird like that. *aDidReconstruct = true; LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(parentFrame->GetContent(), false, - aFlags, aDestroyedFramesFor); + RecreateFramesForContent(parentFrame->GetContent(), false, + aFlags, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // If we're a child of MathML, then we should reframe the MathML content. @@ -8556,10 +8544,10 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, if (possibleMathMLAncestor->IsFrameOfType(nsIFrame::eMathML)) { *aDidReconstruct = true; LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(possibleMathMLAncestor->GetContent(), - false, aFlags, aDestroyedFramesFor); + RecreateFramesForContent(possibleMathMLAncestor->GetContent(), + false, aFlags, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // Undo XUL wrapping if it's no longer needed. @@ -8573,10 +8561,10 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, !AnyKidsNeedBlockParent(childFrame->GetNextSibling())) { *aDidReconstruct = true; LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(grandparentFrame->GetContent(), true, - aFlags, aDestroyedFramesFor); + RecreateFramesForContent(grandparentFrame->GetContent(), true, + aFlags, aDestroyedFramesFor); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } #ifdef ACCESSIBILITY @@ -8620,7 +8608,7 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, // XXXbz the GetContent() != aChild check is needed due to bug 135040. // Remove it once that's fixed. ClearUndisplayedContentIn(aChild, aContainer); - return NS_OK; + return; } parentFrame = childFrame->GetParent(); parentType = parentFrame->GetType(); @@ -8708,8 +8696,6 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, } #endif } - - return rv; } /** @@ -8771,12 +8757,11 @@ nsCSSFrameConstructor::EnsureFrameForTextNode(nsGenericDOMDataNode* aContent) return aContent->GetPrimaryFrame(); } -nsresult +void nsCSSFrameConstructor::CharacterDataChanged(nsIContent* aContent, CharacterDataChangeInfo* aInfo) { AUTO_LAYOUT_PHASE_ENTRY_POINT(mPresShell->GetPresContext(), FrameC); - nsresult rv = NS_OK; if ((aContent->HasFlag(NS_CREATE_FRAME_IF_NON_WHITESPACE) && !aContent->TextIsOnlyWhitespace()) || @@ -8788,10 +8773,10 @@ nsCSSFrameConstructor::CharacterDataChanged(nsIContent* aContent, "Bit should never be set on generated content"); #endif LAYOUT_PHASE_TEMP_EXIT(); - nsresult rv = RecreateFramesForContent(aContent, false, - REMOVE_FOR_RECONSTRUCTION, nullptr); + RecreateFramesForContent(aContent, false, + REMOVE_FOR_RECONSTRUCTION, nullptr); LAYOUT_PHASE_TEMP_REENTER(); - return rv; + return; } // Find the child frame @@ -8839,8 +8824,6 @@ nsCSSFrameConstructor::CharacterDataChanged(nsIContent* aContent, RecoverLetterFrames(block); } } - - return rv; } void @@ -9507,12 +9490,10 @@ FindPreviousNonWhitespaceSibling(nsIFrame* aFrame) bool nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, RemoveFlags aFlags, - nsresult* aResult, nsIContent** aDestroyedFramesFor) { NS_PRECONDITION(aFrame, "Must have a frame"); NS_PRECONDITION(aFrame->GetParent(), "Frame shouldn't be root"); - NS_PRECONDITION(aResult, "Null out param?"); NS_PRECONDITION(aFrame == aFrame->FirstContinuation(), "aFrame not the result of GetPrimaryFrame()?"); @@ -9530,7 +9511,7 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, } #endif - *aResult = ReframeContainingBlock(aFrame, aFlags, aDestroyedFramesFor); + ReframeContainingBlock(aFrame, aFlags, aDestroyedFramesFor); return true; } @@ -9539,8 +9520,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, aFrame->GetParent()->GetType() == nsGkAtoms::fieldSetFrame) { // When we remove the legend for a fieldset, we should reframe // the fieldset to ensure another legend is used, if there is one - *aResult = RecreateFramesForContent(aFrame->GetParent()->GetContent(), false, - aFlags, aDestroyedFramesFor); + RecreateFramesForContent(aFrame->GetParent()->GetContent(), false, + aFlags, aDestroyedFramesFor); return true; } @@ -9553,9 +9534,9 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, // When removing a summary, we should reframe the parent details frame to // ensure that another summary is used or the default summary is // generated. - *aResult = RecreateFramesForContent(aFrame->GetParent()->GetContent(), - false, REMOVE_FOR_RECONSTRUCTION, - aDestroyedFramesFor); + RecreateFramesForContent(aFrame->GetParent()->GetContent(), + false, REMOVE_FOR_RECONSTRUCTION, + aDestroyedFramesFor); return true; } } @@ -9587,8 +9568,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, parent->GetChildList(nsIFrame::kCaptionList).FirstChild() == inFlowFrame)) { // We're the first or last frame in the pseudo. Need to reframe. // Good enough to recreate frames for |parent|'s content - *aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags, - aDestroyedFramesFor); + RecreateFramesForContent(parent->GetContent(), true, aFlags, + aDestroyedFramesFor); return true; } } @@ -9617,8 +9598,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, #endif // Good enough to recreate frames for aFrame's parent's content; even if // aFrame's parent is a pseudo, that'll be the right content node. - *aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags, - aDestroyedFramesFor); + RecreateFramesForContent(parent->GetContent(), true, aFlags, + aDestroyedFramesFor); return true; } } @@ -9634,8 +9615,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, // frames may be constructed or destroyed accordingly. // 2. The type of the first child of a ruby frame determines // whether a pseudo ruby base container should exist. - *aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags, - aDestroyedFramesFor); + RecreateFramesForContent(parent->GetContent(), true, aFlags, + aDestroyedFramesFor); return true; } @@ -9658,8 +9639,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, } #endif // DEBUG // Recreate frames for the flex container (the removed frame's parent) - *aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags, - aDestroyedFramesFor); + RecreateFramesForContent(parent->GetContent(), true, aFlags, + aDestroyedFramesFor); return true; } @@ -9677,8 +9658,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, } #endif // DEBUG // Recreate frames for the flex container (the removed frame's grandparent) - *aResult = RecreateFramesForContent(parent->GetParent()->GetContent(), true, - aFlags, aDestroyedFramesFor); + RecreateFramesForContent(parent->GetParent()->GetContent(), true, + aFlags, aDestroyedFramesFor); return true; } @@ -9686,7 +9667,7 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, if (aFrame->GetType() == nsGkAtoms::popupSetFrame) { nsIRootBox* rootBox = nsIRootBox::GetRootBox(mPresShell); if (rootBox && rootBox->GetPopupSetFrame() == aFrame) { - *aResult = ReconstructDocElementHierarchy(); + ReconstructDocElementHierarchy(); return true; } } @@ -9698,8 +9679,8 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, !inFlowFrame->GetNextSibling() && ((parent->GetPrevContinuation() && !parent->GetPrevInFlow()) || (parent->GetNextContinuation() && !parent->GetNextInFlow()))) { - *aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags, - aDestroyedFramesFor); + RecreateFramesForContent(parent->GetContent(), true, aFlags, + aDestroyedFramesFor); return true; } @@ -9735,11 +9716,11 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, } #endif - *aResult = ReframeContainingBlock(parent, aFlags, aDestroyedFramesFor); + ReframeContainingBlock(parent, aFlags, aDestroyedFramesFor); return true; } -nsresult +void nsCSSFrameConstructor::RecreateFramesForContent(nsIContent* aContent, bool aAsyncInsert, RemoveFlags aFlags, @@ -9752,7 +9733,9 @@ nsCSSFrameConstructor::RecreateFramesForContent(nsIContent* aContent, // anyway). // Rebuilding the frame tree can have bad effects, especially if it's the // frame tree for chrome (see bug 157322). - NS_ENSURE_TRUE(aContent->GetComposedDoc(), NS_ERROR_FAILURE); + if (NS_WARN_IF(!aContent->GetComposedDoc())) { + return; + } // Is the frame ib-split? If so, we need to reframe the containing // block *here*, rather than trying to remove and re-insert the @@ -9816,15 +9799,14 @@ nsCSSFrameConstructor::RecreateFramesForContent(nsIContent* aContent, } } - nsresult rv = NS_OK; nsIContent* container; - if (frame && MaybeRecreateContainerForFrameRemoval(frame, aFlags, &rv, + if (frame && MaybeRecreateContainerForFrameRemoval(frame, aFlags, &container)) { MOZ_ASSERT(container); if (aDestroyedFramesFor) { *aDestroyedFramesFor = container; } - return rv; + return; } nsINode* containerNode = aContent->GetParentNode(); @@ -9844,11 +9826,8 @@ nsCSSFrameConstructor::RecreateFramesForContent(nsIContent* aContent, nullptr : aContent->GetNextSibling(); const bool reconstruct = aFlags != REMOVE_DESTROY_FRAMES; RemoveFlags flags = reconstruct ? REMOVE_FOR_RECONSTRUCTION : aFlags; - rv = ContentRemoved(container, aContent, nextSibling, flags, - &didReconstruct, aDestroyedFramesFor); - if (NS_FAILED(rv)) { - return rv; - } + ContentRemoved(container, aContent, nextSibling, flags, + &didReconstruct, aDestroyedFramesFor); if (reconstruct && !didReconstruct) { // Now, recreate the frames associated with this content object. If // ContentRemoved triggered reconstruction, then we don't need to do this @@ -9858,12 +9837,10 @@ nsCSSFrameConstructor::RecreateFramesForContent(nsIContent* aContent, RestyleManager()->PostRestyleEvent( aContent->AsElement(), nsRestyleHint(0), nsChangeHint_ReconstructFrame); } else { - rv = ContentInserted(container, aContent, mTempFrameTreeState, false); + ContentInserted(container, aContent, mTempFrameTreeState, false); } } } - - return rv; } void @@ -11271,7 +11248,7 @@ nsCSSFrameConstructor::AppendFirstLineFrames( // Special routine to handle inserting a new frame into a block // frame's child list. Takes care of placing the new frame into the // right place when first-line style is present. -nsresult +void nsCSSFrameConstructor::InsertFirstLineFrames( nsFrameConstructorState& aState, nsIContent* aContent, @@ -11280,7 +11257,6 @@ nsCSSFrameConstructor::InsertFirstLineFrames( nsIFrame* aPrevSibling, nsFrameItems& aFrameItems) { - nsresult rv = NS_OK; // XXXbz If you make this method actually do something, check to // make sure that the caller is passing what you expect. In // particular, which content is aContent? And audit the rest of @@ -11410,7 +11386,6 @@ nsCSSFrameConstructor::InsertFirstLineFrames( } #endif - return rv; } //---------------------------------------------------------------------- @@ -11737,7 +11712,7 @@ FindFirstLetterFrame(nsIFrame* aFrame, nsIFrame::ChildListID aListID) return nullptr; } -nsresult +void nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( nsIPresShell* aPresShell, nsIFrame* aBlockFrame) @@ -11749,7 +11724,7 @@ nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( floatFrame = ::FindFirstLetterFrame(aBlockFrame, nsIFrame::kPushedFloatsList); if (!floatFrame) { - return NS_OK; + return; } } @@ -11757,19 +11732,19 @@ nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( // destroyed when we destroy the letter frame). nsIFrame* textFrame = floatFrame->PrincipalChildList().FirstChild(); if (!textFrame) { - return NS_OK; + return; } // Discover the placeholder frame for the letter frame nsPlaceholderFrame* placeholderFrame = GetPlaceholderFrameFor(floatFrame); if (!placeholderFrame) { // Somethings really wrong - return NS_OK; + return; } nsContainerFrame* parentFrame = placeholderFrame->GetParent(); if (!parentFrame) { // Somethings really wrong - return NS_OK; + return; } // Create a new text frame with the right style context that maps @@ -11778,7 +11753,7 @@ nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( nsStyleContext* parentSC = parentFrame->StyleContext(); nsIContent* textContent = textFrame->GetContent(); if (!textContent) { - return NS_OK; + return; } RefPtr newSC = aPresShell->StyleSet()-> ResolveStyleForText(textContent, parentSC); @@ -11823,11 +11798,9 @@ nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( if (offsetsNeedFixing) { prevSibling->RemoveStateBits(TEXT_OFFSETS_NEED_FIXING); } - - return NS_OK; } -nsresult +void nsCSSFrameConstructor::RemoveFirstLetterFrames(nsIPresShell* aPresShell, nsContainerFrame* aFrame, nsContainerFrame* aBlockFrame, @@ -11900,11 +11873,9 @@ nsCSSFrameConstructor::RemoveFirstLetterFrames(nsIPresShell* aPresShell, prevSibling = kid; kid = kid->GetNextSibling(); } - - return NS_OK; } -nsresult +void nsCSSFrameConstructor::RemoveLetterFrames(nsIPresShell* aPresShell, nsContainerFrame* aBlockFrame) { @@ -11913,20 +11884,16 @@ nsCSSFrameConstructor::RemoveLetterFrames(nsIPresShell* aPresShell, nsContainerFrame* continuation = aBlockFrame; bool stopLooking = false; - nsresult rv; do { - rv = RemoveFloatingFirstLetterFrames(aPresShell, continuation); - if (NS_SUCCEEDED(rv)) { - rv = RemoveFirstLetterFrames(aPresShell, - continuation, aBlockFrame, &stopLooking); - } + RemoveFloatingFirstLetterFrames(aPresShell, continuation); + RemoveFirstLetterFrames(aPresShell, continuation, aBlockFrame, + &stopLooking); if (stopLooking) { break; } continuation = static_cast(continuation->GetNextContinuation()); } while (continuation); - return rv; } // Fixup the letter frame situation for the given block @@ -11969,7 +11936,7 @@ nsCSSFrameConstructor::RecoverLetterFrames(nsContainerFrame* aBlockFrame) // listbox Widget Routines -nsresult +void nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, nsIFrame* aPrevFrame, nsIContent* aChild, @@ -11977,8 +11944,6 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, bool aIsAppend) { #ifdef MOZ_XUL - nsresult rv = NS_OK; - // Construct a new frame if (nullptr != aParentFrame) { nsFrameItems frameItems; @@ -12002,7 +11967,7 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, if (StyleDisplay::None == display->mDisplay) { *aNewFrame = nullptr; - return NS_OK; + return; } BeginUpdate(); @@ -12021,9 +11986,9 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, if (newFrame) { // Notify the parent frame if (aIsAppend) - rv = ((nsListBoxBodyFrame*)aParentFrame)->ListBoxAppendFrames(frameItems); + ((nsListBoxBodyFrame*)aParentFrame)->ListBoxAppendFrames(frameItems); else - rv = ((nsListBoxBodyFrame*)aParentFrame)->ListBoxInsertFrames(aPrevFrame, frameItems); + ((nsListBoxBodyFrame*)aParentFrame)->ListBoxInsertFrames(aPrevFrame, frameItems); } EndUpdate(); @@ -12038,10 +12003,6 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, } #endif } - - return rv; -#else - return NS_ERROR_FAILURE; #endif } @@ -12815,7 +12776,7 @@ nsCSSFrameConstructor::WipeContainingBlock(nsFrameConstructorState& aState, return true; } -nsresult +void nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame, RemoveFlags aFlags, nsIContent** aDestroyedFramesFor) @@ -12838,7 +12799,7 @@ nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame, // don't ReframeContainingBlock, this will result in a crash // if we remove a tree that's in reflow - see bug 121368 for testcase NS_ERROR("Atemptted to nsCSSFrameConstructor::ReframeContainingBlock during a Reflow!!!"); - return NS_OK; + return; } // Get the first "normal" ancestor of the target frame. @@ -12870,7 +12831,7 @@ nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame, true, aFlags, nullptr); } -nsresult +void nsCSSFrameConstructor::GenerateChildFrames(nsContainerFrame* aFrame) { { @@ -12905,8 +12866,6 @@ nsCSSFrameConstructor::GenerateChildFrames(nsContainerFrame* aFrame) // call XBL constructors after the frames are created mPresShell->GetDocument()->BindingManager()->ProcessAttachedQueue(); - - return NS_OK; } ////////////////////////////////////////////////////////// diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index 3a6394f002af..9f71e06b0725 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -48,7 +48,7 @@ class FlattenedChildIterator; } // namespace dom } // namespace mozilla -class nsCSSFrameConstructor : public nsFrameManager +class nsCSSFrameConstructor final : public nsFrameManager { public: typedef mozilla::CSSPseudoElementType CSSPseudoElementType; @@ -60,7 +60,7 @@ public: nsCSSFrameConstructor(nsIDocument* aDocument, nsIPresShell* aPresShell); ~nsCSSFrameConstructor(void) { - NS_ASSERTION(mUpdateCount == 0, "Dying in the middle of our own update?"); + MOZ_ASSERT(mUpdateCount == 0, "Dying in the middle of our own update?"); } // get the alternate text for a content node @@ -78,7 +78,7 @@ public: nsIFrame* ConstructRootFrame(); - nsresult ReconstructDocElementHierarchy(); + void ReconstructDocElementHierarchy(); // Create frames for content nodes that are marked as needing frames. This // should be called before ProcessPendingRestyles. @@ -208,17 +208,17 @@ public: // much easier way than nsFrameConstructorState, and thus, we're allowed to // provide a TreeMatchContext to avoid calling InitAncestors repeatedly deep // in the DOM. - nsresult ContentAppended(nsIContent* aContainer, - nsIContent* aFirstNewContent, - bool aAllowLazyConstruction, - TreeMatchContext* aProvidedTreeMatchContext = nullptr); + void ContentAppended(nsIContent* aContainer, + nsIContent* aFirstNewContent, + bool aAllowLazyConstruction, + TreeMatchContext* aProvidedTreeMatchContext = nullptr); // If aAllowLazyConstruction is true then frame construction of the new child // can be done lazily. - nsresult ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - nsILayoutHistoryState* aFrameState, - bool aAllowLazyConstruction); + void ContentInserted(nsIContent* aContainer, + nsIContent* aChild, + nsILayoutHistoryState* aFrameState, + bool aAllowLazyConstruction); // Like ContentInserted but handles inserting the children of aContainer in // the range [aStartChild, aEndChild). aStartChild must be non-null. @@ -231,12 +231,12 @@ public: // // See ContentAppended to see why we allow passing an already initialized // TreeMatchContext. - nsresult ContentRangeInserted(nsIContent* aContainer, - nsIContent* aStartChild, - nsIContent* aEndChild, - nsILayoutHistoryState* aFrameState, - bool aAllowLazyConstruction, - TreeMatchContext* aProvidedTreeMatchContext = nullptr); + void ContentRangeInserted(nsIContent* aContainer, + nsIContent* aStartChild, + nsIContent* aEndChild, + nsILayoutHistoryState* aFrameState, + bool aAllowLazyConstruction, + TreeMatchContext* aProvidedTreeMatchContext = nullptr); enum RemoveFlags { REMOVE_CONTENT, REMOVE_FOR_RECONSTRUCTION, REMOVE_DESTROY_FRAMES }; @@ -256,15 +256,15 @@ public: * only when aFlags == REMOVE_DESTROY_FRAMES, otherwise it will only be * captured if we reconstructed frames for an ancestor. */ - nsresult ContentRemoved(nsIContent* aContainer, - nsIContent* aChild, - nsIContent* aOldNextSibling, - RemoveFlags aFlags, - bool* aDidReconstruct, - nsIContent** aDestroyedFramesFor = nullptr); + void ContentRemoved(nsIContent* aContainer, + nsIContent* aChild, + nsIContent* aOldNextSibling, + RemoveFlags aFlags, + bool* aDidReconstruct, + nsIContent** aDestroyedFramesFor = nullptr); - nsresult CharacterDataChanged(nsIContent* aContent, - CharacterDataChangeInfo* aInfo); + void CharacterDataChanged(nsIContent* aContent, + CharacterDataChangeInfo* aInfo); // If aContent is a text node that has been optimized away due to being // whitespace next to a block boundary (or for some other reason), stop @@ -273,8 +273,8 @@ public: // Returns the frame for aContent if there is one. nsIFrame* EnsureFrameForTextNode(nsGenericDOMDataNode* aContent); - // generate the child frames and process bindings - nsresult GenerateChildFrames(nsContainerFrame* aFrame); + // Generate the child frames and process bindings + void GenerateChildFrames(nsContainerFrame* aFrame); // Should be called when a frame is going to be destroyed and // WillDestroyFrameTree hasn't been called yet. @@ -316,11 +316,11 @@ public: */ InsertionPoint GetInsertionPoint(nsIContent* aContainer, nsIContent* aChild); - nsresult CreateListBoxContent(nsContainerFrame* aParentFrame, - nsIFrame* aPrevFrame, - nsIContent* aChild, - nsIFrame** aResult, - bool aIsAppend); + void CreateListBoxContent(nsContainerFrame* aParentFrame, + nsIFrame* aPrevFrame, + nsIContent* aChild, + nsIFrame** aResult, + bool aIsAppend); // GetInitialContainingBlock() is deprecated in favor of GetRootElementFrame(); // nsIFrame* GetInitialContainingBlock() { return mRootElementFrame; } @@ -432,14 +432,14 @@ private: * @param [out] aNewContent the content node we create * @param [out] aNewFrame the new frame we create */ - nsresult CreateAttributeContent(nsIContent* aParentContent, - nsIFrame* aParentFrame, - int32_t aAttrNamespace, - nsIAtom* aAttrName, - nsStyleContext* aStyleContext, - nsCOMArray& aGeneratedContent, - nsIContent** aNewContent, - nsIFrame** aNewFrame); + void CreateAttributeContent(nsIContent* aParentContent, + nsIFrame* aParentFrame, + int32_t aAttrNamespace, + nsIAtom* aAttrName, + nsStyleContext* aStyleContext, + nsCOMArray& aGeneratedContent, + nsIContent** aNewContent, + nsIFrame** aNewFrame); /** * Create a text node containing the given string. If aText is non-null @@ -477,11 +477,11 @@ private: // aParentFrame. aPrevSibling must be the frame after which aFrameList is to // be placed on aParentFrame's principal child list. It may be null if // aFrameList is being added at the beginning of the child list. - nsresult AppendFramesToParent(nsFrameConstructorState& aState, - nsContainerFrame* aParentFrame, - nsFrameItems& aFrameList, - nsIFrame* aPrevSibling, - bool aIsRecursiveCall = false); + void AppendFramesToParent(nsFrameConstructorState& aState, + nsContainerFrame* aParentFrame, + nsFrameItems& aFrameList, + nsIFrame* aPrevSibling, + bool aIsRecursiveCall = false); // BEGIN TABLE SECTION /** @@ -1703,7 +1703,7 @@ private: // InitializeSelectFrame puts scrollFrame in aFrameItems if aBuildCombobox is false // aBuildCombobox indicates if we are building a combobox that has a dropdown // popup widget or not. - nsresult + void InitializeSelectFrame(nsFrameConstructorState& aState, nsContainerFrame* aScrollFrame, nsContainerFrame* aScrolledFrame, @@ -1732,7 +1732,7 @@ private: * @param aDestroyedFramesFor if non-null, it will contain the content that * was actually reframed - it may be different than aContent. */ - nsresult + void RecreateFramesForContent(nsIContent* aContent, bool aAsyncInsert, RemoveFlags aFlags, @@ -1750,7 +1750,6 @@ private: // content that was reframed. bool MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, RemoveFlags aFlags, - nsresult* aResult, nsIContent** aDestroyedFramesFor); nsIFrame* CreateContinuingOuterTableFrame(nsIPresShell* aPresShell, @@ -1875,9 +1874,9 @@ private: bool aIsAppend, nsIFrame* aPrevSibling); - nsresult ReframeContainingBlock(nsIFrame* aFrame, - RemoveFlags aFlags, - nsIContent** aReframeContent); + void ReframeContainingBlock(nsIFrame* aFrame, + RemoveFlags aFlags, + nsIContent** aReframeContent); //---------------------------------------- @@ -1931,18 +1930,18 @@ private: void RecoverLetterFrames(nsContainerFrame* aBlockFrame); // - nsresult RemoveLetterFrames(nsIPresShell* aPresShell, - nsContainerFrame* aBlockFrame); + void RemoveLetterFrames(nsIPresShell* aPresShell, + nsContainerFrame* aBlockFrame); // Recursive helper for RemoveLetterFrames - nsresult RemoveFirstLetterFrames(nsIPresShell* aPresShell, - nsContainerFrame* aFrame, - nsContainerFrame* aBlockFrame, - bool* aStopLooking); + void RemoveFirstLetterFrames(nsIPresShell* aPresShell, + nsContainerFrame* aFrame, + nsContainerFrame* aBlockFrame, + bool* aStopLooking); // Special remove method for those pesky floating first-letter frames - nsresult RemoveFloatingFirstLetterFrames(nsIPresShell* aPresShell, - nsIFrame* aBlockFrame); + void RemoveFloatingFirstLetterFrames(nsIPresShell* aPresShell, + nsIFrame* aBlockFrame); // Capture state for the frame tree rooted at the frame associated with the // content object, aContent @@ -1973,12 +1972,12 @@ private: nsContainerFrame* aBlockFrame, nsFrameItems& aFrameItems); - nsresult InsertFirstLineFrames(nsFrameConstructorState& aState, - nsIContent* aContent, - nsIFrame* aBlockFrame, - nsContainerFrame** aParentFrame, - nsIFrame* aPrevSibling, - nsFrameItems& aFrameItems); + void InsertFirstLineFrames(nsFrameConstructorState& aState, + nsIContent* aContent, + nsIFrame* aBlockFrame, + nsContainerFrame** aParentFrame, + nsIFrame* aPrevSibling, + nsFrameItems& aFrameItems); /** * Find the right frame to use for aContent when looking for sibling diff --git a/layout/base/nsIPresShell.h b/layout/base/nsIPresShell.h index 087c04547919..daaad818e3de 100644 --- a/layout/base/nsIPresShell.h +++ b/layout/base/nsIPresShell.h @@ -1022,7 +1022,7 @@ public: /** * Reconstruct frames for all elements in the document */ - virtual nsresult ReconstructFrames() = 0; + virtual void ReconstructFrames() = 0; /** * Notify that a content node's state has changed From e9c6b8a43733252fb6395a38bb16ba784c730a74 Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 20 Mar 2017 14:28:40 -0700 Subject: [PATCH 063/169] Bug 943686 - Add imageLoader.cpp to unified sources. r=tn MozReview-Commit-ID: G9sFOtbFYjP --- image/imgLoader.cpp | 4 ++-- image/moz.build | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/image/imgLoader.cpp b/image/imgLoader.cpp index 9a7f2a7e9a40..191eab4fab37 100644 --- a/image/imgLoader.cpp +++ b/image/imgLoader.cpp @@ -128,7 +128,7 @@ public: } RefPtr req = entry->GetRequest(); - RefPtr image = req->GetImage(); + RefPtr image = req->GetImage(); if (!image) { continue; } @@ -401,7 +401,7 @@ private: nsTArray* aArray, bool aIsUsed) { - RefPtr image = aRequest->GetImage(); + RefPtr image = aRequest->GetImage(); if (!image) { return; } diff --git a/image/moz.build b/image/moz.build index 7e7e0fe70042..256cee96e3b3 100644 --- a/image/moz.build +++ b/image/moz.build @@ -66,6 +66,7 @@ UNIFIED_SOURCES += [ 'ImageOps.cpp', 'ImageWrapper.cpp', 'imgFrame.cpp', + 'imgLoader.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -83,7 +84,6 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ - 'imgLoader.cpp', 'imgRequest.cpp', 'imgRequestProxy.cpp', 'ProgressTracker.cpp', From bbf39fe24c9ec7c58d1ddbc8c82570ce7aecd945 Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 20 Mar 2017 14:28:41 -0700 Subject: [PATCH 064/169] Bug 943686 - Add imgRequest.cpp to unified sources. r=tn MozReview-Commit-ID: B87v26HNtBn --- image/imgRequest.cpp | 28 +++++++++++++++------------- image/moz.build | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/image/imgRequest.cpp b/image/imgRequest.cpp index feb9f685e197..9b003c7308b5 100644 --- a/image/imgRequest.cpp +++ b/image/imgRequest.cpp @@ -509,11 +509,11 @@ imgRequest::HasConsumers() const return progressTracker && progressTracker->ObserverCount() > 0; } -already_AddRefed +already_AddRefed imgRequest::GetImage() const { MutexAutoLock lock(mMutex); - RefPtr image = mImage; + RefPtr image = mImage; return image.forget(); } @@ -905,7 +905,7 @@ imgRequest::CheckListenerChain() struct NewPartResult final { - explicit NewPartResult(Image* aExistingImage) + explicit NewPartResult(image::Image* aExistingImage) : mImage(aExistingImage) , mIsFirstPart(!aExistingImage) , mSucceeded(false) @@ -914,7 +914,7 @@ struct NewPartResult final nsAutoCString mContentType; nsAutoCString mContentDisposition; - RefPtr mImage; + RefPtr mImage; const bool mIsFirstPart; bool mSucceeded; bool mShouldResetCacheEntry; @@ -922,7 +922,7 @@ struct NewPartResult final static NewPartResult PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, - ImageURL* aURI, bool aIsMultipart, Image* aExistingImage, + ImageURL* aURI, bool aIsMultipart, image::Image* aExistingImage, ProgressTracker* aProgressTracker, uint32_t aInnerWindowId) { NewPartResult result(aExistingImage); @@ -967,17 +967,18 @@ PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, if (aIsMultipart) { // Create the ProgressTracker and image for this part. RefPtr progressTracker = new ProgressTracker(); - RefPtr partImage = - ImageFactory::CreateImage(aRequest, progressTracker, result.mContentType, - aURI, /* aIsMultipart = */ true, - aInnerWindowId); + RefPtr partImage = + image::ImageFactory::CreateImage(aRequest, progressTracker, + result.mContentType, + aURI, /* aIsMultipart = */ true, + aInnerWindowId); if (result.mIsFirstPart) { // First part for a multipart channel. Create the MultipartImage wrapper. MOZ_ASSERT(aProgressTracker, "Shouldn't have given away tracker yet"); aProgressTracker->SetIsMultipart(); result.mImage = - ImageFactory::CreateMultipartImage(partImage, aProgressTracker); + image::ImageFactory::CreateMultipartImage(partImage, aProgressTracker); } else { // Transition to the new part. auto multipartImage = static_cast(aExistingImage); @@ -992,9 +993,10 @@ PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, // Create an image using our progress tracker. result.mImage = - ImageFactory::CreateImage(aRequest, aProgressTracker, result.mContentType, - aURI, /* aIsMultipart = */ false, - aInnerWindowId); + image::ImageFactory::CreateImage(aRequest, aProgressTracker, + result.mContentType, + aURI, /* aIsMultipart = */ false, + aInnerWindowId); } MOZ_ASSERT(result.mImage); diff --git a/image/moz.build b/image/moz.build index 256cee96e3b3..2a97011f2a03 100644 --- a/image/moz.build +++ b/image/moz.build @@ -67,6 +67,7 @@ UNIFIED_SOURCES += [ 'ImageWrapper.cpp', 'imgFrame.cpp', 'imgLoader.cpp', + 'imgRequest.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -84,7 +85,6 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ - 'imgRequest.cpp', 'imgRequestProxy.cpp', 'ProgressTracker.cpp', 'RasterImage.cpp', From 3d92dbeb7c18189ccd394866a7b77796dc5d7f5d Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 20 Mar 2017 14:28:42 -0700 Subject: [PATCH 065/169] Bug 943686 - Add imgRequestProxy.cpp to unified sources. r=tn MozReview-Commit-ID: ITT9T22WyYG --- image/imgRequestProxy.cpp | 2 +- image/moz.build | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/image/imgRequestProxy.cpp b/image/imgRequestProxy.cpp index a00db9f49e12..900fb5b7695e 100644 --- a/image/imgRequestProxy.cpp +++ b/image/imgRequestProxy.cpp @@ -617,7 +617,7 @@ imgRequestProxy* NewStaticProxy(imgRequestProxy* aThis) { nsCOMPtr currentPrincipal; aThis->GetImagePrincipal(getter_AddRefs(currentPrincipal)); - RefPtr image = aThis->GetImage(); + RefPtr image = aThis->GetImage(); return new imgRequestProxyStatic(image, currentPrincipal); } diff --git a/image/moz.build b/image/moz.build index 2a97011f2a03..f7b0edd0fb84 100644 --- a/image/moz.build +++ b/image/moz.build @@ -68,6 +68,7 @@ UNIFIED_SOURCES += [ 'imgFrame.cpp', 'imgLoader.cpp', 'imgRequest.cpp', + 'imgRequestProxy.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -85,7 +86,6 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ - 'imgRequestProxy.cpp', 'ProgressTracker.cpp', 'RasterImage.cpp', ] From e91f0e210466a717d439be9764e49d94ed5e61d8 Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 20 Mar 2017 14:28:43 -0700 Subject: [PATCH 066/169] Bug 943686 - Add ProgressTracker.cpp to unified sources. r=tn MozReview-Commit-ID: Ipo4Tb1bnHG --- image/moz.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image/moz.build b/image/moz.build index f7b0edd0fb84..54c7f88bbae2 100644 --- a/image/moz.build +++ b/image/moz.build @@ -72,6 +72,7 @@ UNIFIED_SOURCES += [ 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', + 'ProgressTracker.cpp', 'ScriptedNotificationObserver.cpp', 'ShutdownTracker.cpp', 'SourceBuffer.cpp', @@ -86,7 +87,6 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ - 'ProgressTracker.cpp', 'RasterImage.cpp', ] From 56cf706a4f1b6790db729a8f0300a19b5933a195 Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 20 Mar 2017 14:28:44 -0700 Subject: [PATCH 067/169] Bug 943686 - Add RasterImage.cpp to unified sources. r=tn MozReview-Commit-ID: cRFkjJi4dP --- image/moz.build | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/image/moz.build b/image/moz.build index 54c7f88bbae2..c3a3a610fd8e 100644 --- a/image/moz.build +++ b/image/moz.build @@ -73,6 +73,7 @@ UNIFIED_SOURCES += [ 'MultipartImage.cpp', 'OrientedImage.cpp', 'ProgressTracker.cpp', + 'RasterImage.cpp', 'ScriptedNotificationObserver.cpp', 'ShutdownTracker.cpp', 'SourceBuffer.cpp', @@ -85,11 +86,6 @@ UNIFIED_SOURCES += [ if CONFIG['MOZ_ENABLE_SKIA']: UNIFIED_SOURCES += [ 'Downscaler.cpp'] -# These files can't be unified because of ImageLogging.h #include order issues. -SOURCES += [ - 'RasterImage.cpp', -] - include('/ipc/chromium/chromium-config.mozbuild') FINAL_LIBRARY = 'xul' From c01548085a12a68e289280ea7b0389dbea75c267 Mon Sep 17 00:00:00 2001 From: Felipe Gomes Date: Mon, 20 Mar 2017 18:41:10 -0300 Subject: [PATCH 068/169] Bug 1344345 - Revert e10s addons rule to only activate on mpc=true and webextensions. r=mconley MozReview-Commit-ID: 738BO2QqvzC --- browser/extensions/e10srollout/bootstrap.js | 7 +++++-- browser/extensions/e10srollout/install.rdf.in | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/browser/extensions/e10srollout/bootstrap.js b/browser/extensions/e10srollout/bootstrap.js index 2d6e1a32927f..13f2bd5b7ffe 100644 --- a/browser/extensions/e10srollout/bootstrap.js +++ b/browser/extensions/e10srollout/bootstrap.js @@ -19,7 +19,7 @@ const TEST_THRESHOLD = { const ADDON_ROLLOUT_POLICY = { "beta" : "51alladdons", // Any WebExtension or addon except with mpc = false - "release" : "51set1", + "release" : "50allmpc", "esr" : "esrA", // WebExtensions and Addons with mpc=true }; @@ -73,7 +73,10 @@ function defineCohort() { Preferences.set(PREF_E10S_ADDON_BLOCKLIST, // bug 1185672 - Tab Mix Plus - "{dc572301-7619-498c-a57d-39143191b318};"); + "{dc572301-7619-498c-a57d-39143191b318};" + // bug 1344345 - Mega + + "firefox@mega.co.nz" + ); } else { Preferences.reset(PREF_E10S_ADDON_POLICY); } diff --git a/browser/extensions/e10srollout/install.rdf.in b/browser/extensions/e10srollout/install.rdf.in index d76caf9c00e6..ac4f80dc7ac6 100644 --- a/browser/extensions/e10srollout/install.rdf.in +++ b/browser/extensions/e10srollout/install.rdf.in @@ -10,7 +10,7 @@ e10srollout@mozilla.org - 1.11 + 1.12 2 true true From 469aa374a96b48ec837a9149597ec4d1ea2a855c Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 22:59:41 +0100 Subject: [PATCH 069/169] Backed out changeset 538a6a953f5d (bug 943686) --- image/moz.build | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/image/moz.build b/image/moz.build index c3a3a610fd8e..54c7f88bbae2 100644 --- a/image/moz.build +++ b/image/moz.build @@ -73,7 +73,6 @@ UNIFIED_SOURCES += [ 'MultipartImage.cpp', 'OrientedImage.cpp', 'ProgressTracker.cpp', - 'RasterImage.cpp', 'ScriptedNotificationObserver.cpp', 'ShutdownTracker.cpp', 'SourceBuffer.cpp', @@ -86,6 +85,11 @@ UNIFIED_SOURCES += [ if CONFIG['MOZ_ENABLE_SKIA']: UNIFIED_SOURCES += [ 'Downscaler.cpp'] +# These files can't be unified because of ImageLogging.h #include order issues. +SOURCES += [ + 'RasterImage.cpp', +] + include('/ipc/chromium/chromium-config.mozbuild') FINAL_LIBRARY = 'xul' From d0cb7ddce958ee4e200ee9bb6afe13b2de205926 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 22:59:50 +0100 Subject: [PATCH 070/169] Backed out changeset 2828bb6eabef (bug 943686) --- image/moz.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image/moz.build b/image/moz.build index 54c7f88bbae2..f7b0edd0fb84 100644 --- a/image/moz.build +++ b/image/moz.build @@ -72,7 +72,6 @@ UNIFIED_SOURCES += [ 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', - 'ProgressTracker.cpp', 'ScriptedNotificationObserver.cpp', 'ShutdownTracker.cpp', 'SourceBuffer.cpp', @@ -87,6 +86,7 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ + 'ProgressTracker.cpp', 'RasterImage.cpp', ] From c3ffd943f4f2f1f73fddcf3df416d6ce71ae184f Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 22:59:58 +0100 Subject: [PATCH 071/169] Backed out changeset 46d1aeb34ad2 (bug 943686) --- image/imgRequestProxy.cpp | 2 +- image/moz.build | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/image/imgRequestProxy.cpp b/image/imgRequestProxy.cpp index 900fb5b7695e..a00db9f49e12 100644 --- a/image/imgRequestProxy.cpp +++ b/image/imgRequestProxy.cpp @@ -617,7 +617,7 @@ imgRequestProxy* NewStaticProxy(imgRequestProxy* aThis) { nsCOMPtr currentPrincipal; aThis->GetImagePrincipal(getter_AddRefs(currentPrincipal)); - RefPtr image = aThis->GetImage(); + RefPtr image = aThis->GetImage(); return new imgRequestProxyStatic(image, currentPrincipal); } diff --git a/image/moz.build b/image/moz.build index f7b0edd0fb84..2a97011f2a03 100644 --- a/image/moz.build +++ b/image/moz.build @@ -68,7 +68,6 @@ UNIFIED_SOURCES += [ 'imgFrame.cpp', 'imgLoader.cpp', 'imgRequest.cpp', - 'imgRequestProxy.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -86,6 +85,7 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ + 'imgRequestProxy.cpp', 'ProgressTracker.cpp', 'RasterImage.cpp', ] From 3d552e75e6f3a43d775055e99e032582338c0fdb Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 23:00:06 +0100 Subject: [PATCH 072/169] Backed out changeset 726f50ce3a40 (bug 943686) --- image/imgRequest.cpp | 28 +++++++++++++--------------- image/moz.build | 2 +- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/image/imgRequest.cpp b/image/imgRequest.cpp index 9b003c7308b5..feb9f685e197 100644 --- a/image/imgRequest.cpp +++ b/image/imgRequest.cpp @@ -509,11 +509,11 @@ imgRequest::HasConsumers() const return progressTracker && progressTracker->ObserverCount() > 0; } -already_AddRefed +already_AddRefed imgRequest::GetImage() const { MutexAutoLock lock(mMutex); - RefPtr image = mImage; + RefPtr image = mImage; return image.forget(); } @@ -905,7 +905,7 @@ imgRequest::CheckListenerChain() struct NewPartResult final { - explicit NewPartResult(image::Image* aExistingImage) + explicit NewPartResult(Image* aExistingImage) : mImage(aExistingImage) , mIsFirstPart(!aExistingImage) , mSucceeded(false) @@ -914,7 +914,7 @@ struct NewPartResult final nsAutoCString mContentType; nsAutoCString mContentDisposition; - RefPtr mImage; + RefPtr mImage; const bool mIsFirstPart; bool mSucceeded; bool mShouldResetCacheEntry; @@ -922,7 +922,7 @@ struct NewPartResult final static NewPartResult PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, - ImageURL* aURI, bool aIsMultipart, image::Image* aExistingImage, + ImageURL* aURI, bool aIsMultipart, Image* aExistingImage, ProgressTracker* aProgressTracker, uint32_t aInnerWindowId) { NewPartResult result(aExistingImage); @@ -967,18 +967,17 @@ PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, if (aIsMultipart) { // Create the ProgressTracker and image for this part. RefPtr progressTracker = new ProgressTracker(); - RefPtr partImage = - image::ImageFactory::CreateImage(aRequest, progressTracker, - result.mContentType, - aURI, /* aIsMultipart = */ true, - aInnerWindowId); + RefPtr partImage = + ImageFactory::CreateImage(aRequest, progressTracker, result.mContentType, + aURI, /* aIsMultipart = */ true, + aInnerWindowId); if (result.mIsFirstPart) { // First part for a multipart channel. Create the MultipartImage wrapper. MOZ_ASSERT(aProgressTracker, "Shouldn't have given away tracker yet"); aProgressTracker->SetIsMultipart(); result.mImage = - image::ImageFactory::CreateMultipartImage(partImage, aProgressTracker); + ImageFactory::CreateMultipartImage(partImage, aProgressTracker); } else { // Transition to the new part. auto multipartImage = static_cast(aExistingImage); @@ -993,10 +992,9 @@ PrepareForNewPart(nsIRequest* aRequest, nsIInputStream* aInStr, uint32_t aCount, // Create an image using our progress tracker. result.mImage = - image::ImageFactory::CreateImage(aRequest, aProgressTracker, - result.mContentType, - aURI, /* aIsMultipart = */ false, - aInnerWindowId); + ImageFactory::CreateImage(aRequest, aProgressTracker, result.mContentType, + aURI, /* aIsMultipart = */ false, + aInnerWindowId); } MOZ_ASSERT(result.mImage); diff --git a/image/moz.build b/image/moz.build index 2a97011f2a03..256cee96e3b3 100644 --- a/image/moz.build +++ b/image/moz.build @@ -67,7 +67,6 @@ UNIFIED_SOURCES += [ 'ImageWrapper.cpp', 'imgFrame.cpp', 'imgLoader.cpp', - 'imgRequest.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -85,6 +84,7 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ + 'imgRequest.cpp', 'imgRequestProxy.cpp', 'ProgressTracker.cpp', 'RasterImage.cpp', From 1e30641e505e6581739821653081b90efc822294 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 23:00:43 +0100 Subject: [PATCH 073/169] Backed out changeset 8c34803d1392 (bug 943686) for Windows bustage. r=backout --- image/imgLoader.cpp | 4 ++-- image/moz.build | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/image/imgLoader.cpp b/image/imgLoader.cpp index 191eab4fab37..9a7f2a7e9a40 100644 --- a/image/imgLoader.cpp +++ b/image/imgLoader.cpp @@ -128,7 +128,7 @@ public: } RefPtr req = entry->GetRequest(); - RefPtr image = req->GetImage(); + RefPtr image = req->GetImage(); if (!image) { continue; } @@ -401,7 +401,7 @@ private: nsTArray* aArray, bool aIsUsed) { - RefPtr image = aRequest->GetImage(); + RefPtr image = aRequest->GetImage(); if (!image) { return; } diff --git a/image/moz.build b/image/moz.build index 256cee96e3b3..7e7e0fe70042 100644 --- a/image/moz.build +++ b/image/moz.build @@ -66,7 +66,6 @@ UNIFIED_SOURCES += [ 'ImageOps.cpp', 'ImageWrapper.cpp', 'imgFrame.cpp', - 'imgLoader.cpp', 'imgTools.cpp', 'MultipartImage.cpp', 'OrientedImage.cpp', @@ -84,6 +83,7 @@ if CONFIG['MOZ_ENABLE_SKIA']: # These files can't be unified because of ImageLogging.h #include order issues. SOURCES += [ + 'imgLoader.cpp', 'imgRequest.cpp', 'imgRequestProxy.cpp', 'ProgressTracker.cpp', From ef98a8485d8e2ff272f4c83f4e4d22e9575578bd Mon Sep 17 00:00:00 2001 From: Gerald Squelart Date: Tue, 14 Mar 2017 09:33:16 +1100 Subject: [PATCH 074/169] Bug 1346648 - Better pointer checks. r=cpearce MozReview-Commit-ID: BjYCYS4h5qN --HG-- extra : rebase_source : e1b079c4e7e29fcb2121ad3cfbc2c183798928b7 --- .../0.1/ClearKeyDecryptionManager.cpp | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.cpp b/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.cpp index 0ba9a2e8ebc8..4e811b539c98 100644 --- a/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.cpp +++ b/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.cpp @@ -23,6 +23,8 @@ #include #include +#include "mozilla/CheckedInt.h" + using namespace cdm; bool AllZero(const std::vector& aBytes) @@ -211,19 +213,28 @@ ClearKeyDecryptor::Decrypt(uint8_t* aBuffer, uint32_t aBufferSize, if (aMetadata.NumSubsamples()) { // Take all encrypted parts of subsamples and stitch them into one // continuous encrypted buffer. - uint8_t* data = aBuffer; + static_assert(sizeof(uintptr_t) == sizeof(uint8_t*), + "We need uintptr_t to be exactly the same size as a pointer"); + mozilla::CheckedInt data = reinterpret_cast(aBuffer); + const uintptr_t endBuffer = + reinterpret_cast(aBuffer + aBufferSize); uint8_t* iter = &tmp[0]; for (size_t i = 0; i < aMetadata.NumSubsamples(); i++) { data += aMetadata.mClearBytes[i]; - uint32_t cipherBytes = aMetadata.mCipherBytes[i]; - if (data + cipherBytes > aBuffer + aBufferSize) { + if (!data.isValid() || data.value() > endBuffer) { + // Trying to read past the end of the buffer! + return Status::kDecryptError; + } + const uint32_t& cipherBytes = aMetadata.mCipherBytes[i]; + mozilla::CheckedInt dataAfterCipher = data + cipherBytes; + if (!dataAfterCipher.isValid() || dataAfterCipher.value() > endBuffer) { // Trying to read past the end of the buffer! return Status::kDecryptError; } - memcpy(iter, data, cipherBytes); + memcpy(iter, reinterpret_cast(data.value()), cipherBytes); - data += cipherBytes; + data = dataAfterCipher; iter += cipherBytes; } From ba45d4be817b5e8dee572c7fe3fbc1eef9af2a7c Mon Sep 17 00:00:00 2001 From: Nicholas Hurley Date: Mon, 20 Mar 2017 18:01:31 -0400 Subject: [PATCH 075/169] Bug 1343505. r=mcmanus MozReview-Commit-ID: 7OPJQfzW4FU --HG-- extra : rebase_source : e05aa6cc88883533171f620a153fedccf5c80efa --- netwerk/protocol/http/Http2Session.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/netwerk/protocol/http/Http2Session.cpp b/netwerk/protocol/http/Http2Session.cpp index dea16852a732..14a6e90f6c67 100644 --- a/netwerk/protocol/http/Http2Session.cpp +++ b/netwerk/protocol/http/Http2Session.cpp @@ -2771,7 +2771,11 @@ Http2Session::WriteSegmentsAgain(nsAHttpSegmentWriter *writer, LOG3(("Http2Session::WriteSegments %p stream 0x%X mPaddingLength=%d", this, mInputFrameID, mPaddingLength)); - if (1U + mPaddingLength == mInputFrameDataSize) { + if (1U + mPaddingLength > mInputFrameDataSize) { + LOG3(("Http2Session::WriteSegments %p stream 0x%X padding too large for " + "frame", this, mInputFrameID)); + RETURN_SESSION_ERROR(this, PROTOCOL_ERROR); + } else if (1U + mPaddingLength == mInputFrameDataSize) { // This frame consists entirely of padding, we can just discard it LOG3(("Http2Session::WriteSegments %p stream 0x%X frame with only padding", this, mInputFrameID)); From dc40c14389b09cc58132d08e5987609c6d273eae Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Fri, 10 Feb 2017 17:20:08 +0100 Subject: [PATCH 076/169] Bug 1336830 - Pop state immediately after running a template. r=erahm --- dom/xslt/crashtests/1336830.html | 27 +++++++++++++++++++ dom/xslt/crashtests/crashtests.list | 1 + dom/xslt/xslt/txInstructions.cpp | 18 +++++-------- dom/xslt/xslt/txInstructions.h | 8 +----- dom/xslt/xslt/txStylesheetCompileHandlers.cpp | 9 ++----- 5 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 dom/xslt/crashtests/1336830.html diff --git a/dom/xslt/crashtests/1336830.html b/dom/xslt/crashtests/1336830.html new file mode 100644 index 000000000000..907f58956394 --- /dev/null +++ b/dom/xslt/crashtests/1336830.html @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/dom/xslt/crashtests/crashtests.list b/dom/xslt/crashtests/crashtests.list index 5958655d6473..2c54819ec5e9 100644 --- a/dom/xslt/crashtests/crashtests.list +++ b/dom/xslt/crashtests/crashtests.list @@ -18,3 +18,4 @@ load 667315.xml load 1089049.html load 1205163.xml load 1243337.xml +load 1336830.html diff --git a/dom/xslt/xslt/txInstructions.cpp b/dom/xslt/xslt/txInstructions.cpp index 38253e0cb332..bf6f50183711 100644 --- a/dom/xslt/xslt/txInstructions.cpp +++ b/dom/xslt/xslt/txInstructions.cpp @@ -37,16 +37,7 @@ txApplyDefaultElementTemplate::execute(txExecutionState& aEs) } nsresult -txApplyImportsEnd::execute(txExecutionState& aEs) -{ - aEs.popTemplateRule(); - aEs.popParamMap(); - - return NS_OK; -} - -nsresult -txApplyImportsStart::execute(txExecutionState& aEs) +txApplyImports::execute(txExecutionState& aEs) { txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); // The frame is set to null when there is no current template rule, or @@ -68,7 +59,12 @@ txApplyImportsStart::execute(txExecutionState& aEs) aEs.pushTemplateRule(frame, mode, rule->mParams); - return aEs.runTemplate(templ); + rv = aEs.runTemplate(templ); + + aEs.popTemplateRule(); + aEs.popParamMap(); + + return rv; } txApplyTemplates::txApplyTemplates(const txExpandedName& aMode) diff --git a/dom/xslt/xslt/txInstructions.h b/dom/xslt/xslt/txInstructions.h index 55138a600a54..d363400e868c 100644 --- a/dom/xslt/xslt/txInstructions.h +++ b/dom/xslt/xslt/txInstructions.h @@ -47,13 +47,7 @@ public: TX_DECL_TXINSTRUCTION }; -class txApplyImportsEnd : public txInstruction -{ -public: - TX_DECL_TXINSTRUCTION -}; - -class txApplyImportsStart : public txInstruction +class txApplyImports : public txInstruction { public: TX_DECL_TXINSTRUCTION diff --git a/dom/xslt/xslt/txStylesheetCompileHandlers.cpp b/dom/xslt/xslt/txStylesheetCompileHandlers.cpp index f447df7cfc46..4d451e3c303f 100644 --- a/dom/xslt/xslt/txStylesheetCompileHandlers.cpp +++ b/dom/xslt/xslt/txStylesheetCompileHandlers.cpp @@ -1312,8 +1312,7 @@ txFnText(const nsAString& aStr, txStylesheetCompilerState& aState) /* xsl:apply-imports - txApplyImportsStart - txApplyImportsEnd + txApplyImports */ static nsresult txFnStartApplyImports(int32_t aNamespaceID, @@ -1325,11 +1324,7 @@ txFnStartApplyImports(int32_t aNamespaceID, { nsresult rv = NS_OK; - nsAutoPtr instr(new txApplyImportsStart); - rv = aState.addInstruction(Move(instr)); - NS_ENSURE_SUCCESS(rv, rv); - - instr = new txApplyImportsEnd; + nsAutoPtr instr(new txApplyImports); rv = aState.addInstruction(Move(instr)); NS_ENSURE_SUCCESS(rv, rv); From 0b448653c6499f45c211b9cd49f51459e651b58e Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Thu, 23 Feb 2017 12:01:58 +0100 Subject: [PATCH 077/169] Bug 1336828 - Propagate errors from matching. r=erahm --- dom/xslt/crashtests/1336828.html | 22 ++++ dom/xslt/crashtests/1336832.html | 28 ++++ dom/xslt/crashtests/1338277.html | 21 +++ dom/xslt/crashtests/crashtests.list | 3 + dom/xslt/xpath/XPathExpression.cpp | 8 +- dom/xslt/xpath/txExpr.h | 38 +++++- dom/xslt/xpath/txForwardContext.cpp | 5 +- dom/xslt/xpath/txIXPathContext.h | 5 +- dom/xslt/xpath/txLocationStep.cpp | 133 ++++++++++--------- dom/xslt/xpath/txNameTest.cpp | 28 ++-- dom/xslt/xpath/txNodeSetContext.cpp | 5 +- dom/xslt/xpath/txNodeTypeTest.cpp | 41 ++++-- dom/xslt/xpath/txPathExpr.cpp | 4 +- dom/xslt/xpath/txPredicatedNodeTest.cpp | 19 ++- dom/xslt/xpath/txSingleNodeContext.h | 5 +- dom/xslt/xpath/txUnionNodeTest.cpp | 16 ++- dom/xslt/xpath/txXPathOptimizer.cpp | 2 +- dom/xslt/xslt/txExecutionState.cpp | 13 +- dom/xslt/xslt/txInstructions.cpp | 20 ++- dom/xslt/xslt/txKeyFunctionCall.cpp | 6 +- dom/xslt/xslt/txMozillaXSLTProcessor.cpp | 6 +- dom/xslt/xslt/txStylesheet.cpp | 61 ++++++--- dom/xslt/xslt/txStylesheet.h | 22 ++-- dom/xslt/xslt/txXSLTNumber.cpp | 106 ++++++++++----- dom/xslt/xslt/txXSLTNumber.h | 7 +- dom/xslt/xslt/txXSLTPatterns.cpp | 156 +++++++++++++++++------ dom/xslt/xslt/txXSLTPatterns.h | 8 +- 27 files changed, 555 insertions(+), 233 deletions(-) create mode 100644 dom/xslt/crashtests/1336828.html create mode 100644 dom/xslt/crashtests/1336832.html create mode 100644 dom/xslt/crashtests/1338277.html diff --git a/dom/xslt/crashtests/1336828.html b/dom/xslt/crashtests/1336828.html new file mode 100644 index 000000000000..3f25e23e034e --- /dev/null +++ b/dom/xslt/crashtests/1336828.html @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/dom/xslt/crashtests/1336832.html b/dom/xslt/crashtests/1336832.html new file mode 100644 index 000000000000..0fb9033d1a34 --- /dev/null +++ b/dom/xslt/crashtests/1336832.html @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/dom/xslt/crashtests/1338277.html b/dom/xslt/crashtests/1338277.html new file mode 100644 index 000000000000..d928819c7572 --- /dev/null +++ b/dom/xslt/crashtests/1338277.html @@ -0,0 +1,21 @@ + + + diff --git a/dom/xslt/crashtests/crashtests.list b/dom/xslt/crashtests/crashtests.list index 2c54819ec5e9..0c97c7e4f970 100644 --- a/dom/xslt/crashtests/crashtests.list +++ b/dom/xslt/crashtests/crashtests.list @@ -18,4 +18,7 @@ load 667315.xml load 1089049.html load 1205163.xml load 1243337.xml +load 1336828.html load 1336830.html +load 1336832.html +load 1338277.html diff --git a/dom/xslt/xpath/XPathExpression.cpp b/dom/xslt/xpath/XPathExpression.cpp index 2f92a120fbac..88bbc1b84fe0 100644 --- a/dom/xslt/xpath/XPathExpression.cpp +++ b/dom/xslt/xpath/XPathExpression.cpp @@ -206,10 +206,12 @@ EvalContextImpl::getVariable(int32_t aNamespace, return NS_ERROR_INVALID_ARG; } -bool -EvalContextImpl::isStripSpaceAllowed(const txXPathNode& aNode) +nsresult +EvalContextImpl::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { - return false; + aAllowed = false; + + return NS_OK; } void* diff --git a/dom/xslt/xpath/txExpr.h b/dom/xslt/xpath/txExpr.h index 562fca7a3293..4b0b8bcbc3a6 100644 --- a/dom/xslt/xpath/txExpr.h +++ b/dom/xslt/xpath/txExpr.h @@ -28,6 +28,7 @@ class txIMatchContext; class txIEvalContext; class txNodeSet; class txXPathNode; +class txXPathTreeWalker; /** * A Base Class for all XSL Expressions @@ -394,8 +395,9 @@ public: * standalone. The NodeTest node() is different to the * Pattern "node()" (document node isn't matched) */ - virtual bool matches(const txXPathNode& aNode, - txIMatchContext* aContext) = 0; + virtual nsresult matches(const txXPathNode& aNode, + txIMatchContext* aContext, + bool& aMatched) = 0; virtual double getDefaultPriority() = 0; /** @@ -424,7 +426,9 @@ public: #define TX_DECL_NODE_TEST \ TX_DECL_TOSTRING \ - bool matches(const txXPathNode& aNode, txIMatchContext* aContext) override; \ + nsresult matches(const txXPathNode& aNode, \ + txIMatchContext* aContext, \ + bool& aMatched) override; \ double getDefaultPriority() override; \ bool isSensitiveTo(Expr::ContextSensitivity aContext) override; @@ -630,10 +634,30 @@ public: } private: - void fromDescendants(const txXPathNode& aNode, txIMatchContext* aCs, - txNodeSet* aNodes); - void fromDescendantsRev(const txXPathNode& aNode, txIMatchContext* aCs, - txNodeSet* aNodes); + /** + * Append the current position of aWalker to aNodes if it matches mNodeTest, + * using aContext as the context for matching. + */ + nsresult appendIfMatching(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes); + + /** + * Append the descendants of the current position of aWalker to aNodes if + * they match mNodeTest, using aContext as the context for matching. + */ + nsresult appendMatchingDescendants(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes); + + /** + * Append the descendants of the current position of aWalker to aNodes in + * reverse order if they match mNodeTest, using aContext as the context for + * matching. + */ + nsresult appendMatchingDescendantsRev(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes); nsAutoPtr mNodeTest; LocationStepType mAxisIdentifier; diff --git a/dom/xslt/xpath/txForwardContext.cpp b/dom/xslt/xpath/txForwardContext.cpp index e2367a3aeb71..73bd6a626938 100644 --- a/dom/xslt/xpath/txForwardContext.cpp +++ b/dom/xslt/xpath/txForwardContext.cpp @@ -30,10 +30,11 @@ nsresult txForwardContext::getVariable(int32_t aNamespace, nsIAtom* aLName, return mInner->getVariable(aNamespace, aLName, aResult); } -bool txForwardContext::isStripSpaceAllowed(const txXPathNode& aNode) +nsresult +txForwardContext::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode); + return mInner->isStripSpaceAllowed(aNode, aAllowed); } void* txForwardContext::getPrivateContext() diff --git a/dom/xslt/xpath/txIXPathContext.h b/dom/xslt/xpath/txIXPathContext.h index ed5f81a53265..66b1905d363c 100644 --- a/dom/xslt/xpath/txIXPathContext.h +++ b/dom/xslt/xpath/txIXPathContext.h @@ -88,7 +88,8 @@ public: * Is whitespace stripping allowed for the given node? * See http://www.w3.org/TR/xslt#strip */ - virtual bool isStripSpaceAllowed(const txXPathNode& aNode) = 0; + virtual nsresult isStripSpaceAllowed(const txXPathNode& aNode, + bool& aAllowed) = 0; /** * Returns a pointer to the private context @@ -106,7 +107,7 @@ public: #define TX_DECL_MATCH_CONTEXT \ nsresult getVariable(int32_t aNamespace, nsIAtom* aLName, \ txAExprResult*& aResult); \ - bool isStripSpaceAllowed(const txXPathNode& aNode); \ + nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed); \ void* getPrivateContext(); \ txResultRecycler* recycler(); \ void receiveError(const nsAString& aMsg, nsresult aRes) diff --git a/dom/xslt/xpath/txLocationStep.cpp b/dom/xslt/xpath/txLocationStep.cpp index f945b750fe44..6351359290aa 100644 --- a/dom/xslt/xpath/txLocationStep.cpp +++ b/dom/xslt/xpath/txLocationStep.cpp @@ -49,9 +49,8 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) nodes->setReverse(); do { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } while (walker.moveToParent()); break; @@ -63,29 +62,29 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } do { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } while (walker.moveToNextAttribute()); break; } case DESCENDANT_OR_SELF_AXIS: { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); MOZ_FALLTHROUGH; } case DESCENDANT_AXIS: { - fromDescendants(walker.getCurrentPosition(), aContext, nodes); + rv = appendMatchingDescendants(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); break; } case FOLLOWING_AXIS: { if (txXPathNodeUtils::isAttribute(walker.getCurrentPosition())) { walker.moveToParent(); - fromDescendants(walker.getCurrentPosition(), aContext, nodes); + rv = appendMatchingDescendants(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } bool cont = true; while (!walker.moveToNextSibling()) { @@ -95,11 +94,11 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } } while (cont) { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); - fromDescendants(walker.getCurrentPosition(), aContext, nodes); + rv = appendMatchingDescendants(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); while (!walker.moveToNextSibling()) { if (!walker.moveToParent()) { @@ -113,9 +112,8 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) case FOLLOWING_SIBLING_AXIS: { while (walker.moveToNextSibling()) { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } break; } @@ -127,9 +125,9 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) break; case PARENT_AXIS : { - if (walker.moveToParent() && - mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); + if (walker.moveToParent()) { + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } break; } @@ -145,11 +143,11 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } } while (cont) { - fromDescendantsRev(walker.getCurrentPosition(), aContext, nodes); + rv = appendMatchingDescendantsRev(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); while (!walker.moveToPreviousSibling()) { if (!walker.moveToParent()) { @@ -165,17 +163,15 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) nodes->setReverse(); while (walker.moveToPreviousSibling()) { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } break; } case SELF_AXIS: { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); break; } default: // Children Axis @@ -185,9 +181,8 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } do { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { - nodes->append(walker.getCurrentPosition()); - } + rv = appendIfMatching(walker, aContext, nodes); + NS_ENSURE_SUCCESS(rv, rv); } while (walker.moveToNextSibling()); break; } @@ -206,42 +201,62 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) return NS_OK; } -void LocationStep::fromDescendants(const txXPathNode& aNode, - txIMatchContext* aCs, - txNodeSet* aNodes) +nsresult +LocationStep::appendIfMatching(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes) { - txXPathTreeWalker walker(aNode); - if (!walker.moveToFirstChild()) { - return; - } + bool matched; + const txXPathNode& child = aWalker.getCurrentPosition(); + nsresult rv = mNodeTest->matches(child, aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); - do { - const txXPathNode& child = walker.getCurrentPosition(); - if (mNodeTest->matches(child, aCs)) { - aNodes->append(child); - } - fromDescendants(child, aCs, aNodes); - } while (walker.moveToNextSibling()); + if (matched) { + aNodes->append(child); + } + return NS_OK; } -void LocationStep::fromDescendantsRev(const txXPathNode& aNode, - txIMatchContext* aCs, - txNodeSet* aNodes) +nsresult +LocationStep::appendMatchingDescendants(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes) { - txXPathTreeWalker walker(aNode); - if (!walker.moveToLastChild()) { - return; + txXPathTreeWalker walker(aWalker); + if (!walker.moveToFirstChild()) { + return NS_OK; } do { - const txXPathNode& child = walker.getCurrentPosition(); - fromDescendantsRev(child, aCs, aNodes); + nsresult rv = appendIfMatching(walker, aContext, aNodes); + NS_ENSURE_SUCCESS(rv, rv); - if (mNodeTest->matches(child, aCs)) { - aNodes->append(child); - } + rv = appendMatchingDescendants(walker, aContext, aNodes); + NS_ENSURE_SUCCESS(rv, rv); + } while (walker.moveToNextSibling()); + return NS_OK; +} + +nsresult +LocationStep::appendMatchingDescendantsRev(const txXPathTreeWalker& aWalker, + txIMatchContext* aContext, + txNodeSet* aNodes) +{ + txXPathTreeWalker walker(aWalker); + if (!walker.moveToLastChild()) { + return NS_OK; + } + + do { + nsresult rv = appendMatchingDescendantsRev(walker, aContext, aNodes); + NS_ENSURE_SUCCESS(rv, rv); + + rv = appendIfMatching(walker, aContext, aNodes); + NS_ENSURE_SUCCESS(rv, rv); } while (walker.moveToPreviousSibling()); + + return NS_OK; } Expr::ExprType diff --git a/dom/xslt/xpath/txNameTest.cpp b/dom/xslt/xpath/txNameTest.cpp index bad0432825ea..d2bb87c72716 100644 --- a/dom/xslt/xpath/txNameTest.cpp +++ b/dom/xslt/xpath/txNameTest.cpp @@ -23,7 +23,9 @@ txNameTest::txNameTest(nsIAtom* aPrefix, nsIAtom* aLocalName, int32_t aNSID, "Go fix txNameTest::matches"); } -bool txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { if ((mNodeType == txXPathNodeType::ELEMENT_NODE && !txXPathNodeUtils::isElement(aNode)) || @@ -31,26 +33,34 @@ bool txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext) !txXPathNodeUtils::isAttribute(aNode)) || (mNodeType == txXPathNodeType::DOCUMENT_NODE && !txXPathNodeUtils::isRoot(aNode))) { - return false; + aMatched = false; + return NS_OK; } // Totally wild? - if (mLocalName == nsGkAtoms::_asterisk && !mPrefix) - return true; + if (mLocalName == nsGkAtoms::_asterisk && !mPrefix) { + aMatched = true; + return NS_OK; + } // Compare namespaces if (mNamespace != txXPathNodeUtils::getNamespaceID(aNode) && !(mNamespace == kNameSpaceID_None && txXPathNodeUtils::isHTMLElementInHTMLDocument(aNode)) - ) - return false; + ) { + aMatched = false; + return NS_OK; + } // Name wild? - if (mLocalName == nsGkAtoms::_asterisk) - return true; + if (mLocalName == nsGkAtoms::_asterisk) { + aMatched = true; + return NS_OK; + } // Compare local-names - return txXPathNodeUtils::localNameEquals(aNode, mLocalName); + aMatched = txXPathNodeUtils::localNameEquals(aNode, mLocalName); + return NS_OK; } /* diff --git a/dom/xslt/xpath/txNodeSetContext.cpp b/dom/xslt/xpath/txNodeSetContext.cpp index 7d98391fdea0..578e1d82f13c 100644 --- a/dom/xslt/xpath/txNodeSetContext.cpp +++ b/dom/xslt/xpath/txNodeSetContext.cpp @@ -29,10 +29,11 @@ nsresult txNodeSetContext::getVariable(int32_t aNamespace, nsIAtom* aLName, return mInner->getVariable(aNamespace, aLName, aResult); } -bool txNodeSetContext::isStripSpaceAllowed(const txXPathNode& aNode) +nsresult +txNodeSetContext::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode); + return mInner->isStripSpaceAllowed(aNode, aAllowed); } void* txNodeSetContext::getPrivateContext() diff --git a/dom/xslt/xpath/txNodeTypeTest.cpp b/dom/xslt/xpath/txNodeTypeTest.cpp index 650a1ae5fefc..57319c2a4963 100644 --- a/dom/xslt/xpath/txNodeTypeTest.cpp +++ b/dom/xslt/xpath/txNodeTypeTest.cpp @@ -8,32 +8,51 @@ #include "txIXPathContext.h" #include "txXPathTreeWalker.h" -bool txNodeTypeTest::matches(const txXPathNode& aNode, - txIMatchContext* aContext) +nsresult +txNodeTypeTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { switch (mNodeType) { case COMMENT_TYPE: { - return txXPathNodeUtils::isComment(aNode); + aMatched = txXPathNodeUtils::isComment(aNode); + return NS_OK; } case TEXT_TYPE: { - return txXPathNodeUtils::isText(aNode) && - !aContext->isStripSpaceAllowed(aNode); + aMatched = txXPathNodeUtils::isText(aNode); + if (aMatched) { + bool allowed; + nsresult rv = aContext->isStripSpaceAllowed(aNode, allowed); + NS_ENSURE_SUCCESS(rv, rv); + + aMatched = !allowed; + } + return NS_OK; } case PI_TYPE: { - return txXPathNodeUtils::isProcessingInstruction(aNode) && - (!mNodeName || - txXPathNodeUtils::localNameEquals(aNode, mNodeName)); + aMatched = txXPathNodeUtils::isProcessingInstruction(aNode) && + (!mNodeName || + txXPathNodeUtils::localNameEquals(aNode, mNodeName)); + return NS_OK; } case NODE_TYPE: { - return !txXPathNodeUtils::isText(aNode) || - !aContext->isStripSpaceAllowed(aNode); + if (txXPathNodeUtils::isText(aNode)) { + bool allowed; + nsresult rv = aContext->isStripSpaceAllowed(aNode, allowed); + NS_ENSURE_SUCCESS(rv, rv); + + aMatched = !allowed; + } else { + aMatched = true; + } + return NS_OK; } } - return true; + + NS_NOTREACHED("Didn't deal with all values of the NodeType enum!"); } txNodeTest::NodeTestType diff --git a/dom/xslt/xpath/txPathExpr.cpp b/dom/xslt/xpath/txPathExpr.cpp index bcff47e9f788..d36d615fc71c 100644 --- a/dom/xslt/xpath/txPathExpr.cpp +++ b/dom/xslt/xpath/txPathExpr.cpp @@ -160,7 +160,9 @@ PathExpr::evalDescendants(Expr* aStep, const txXPathNode& aNode, resNodes->addAndTransfer(newSet); - bool filterWS = aContext->isStripSpaceAllowed(aNode); + bool filterWS; + rv = aContext->isStripSpaceAllowed(aNode, filterWS); + NS_ENSURE_SUCCESS(rv, rv); txXPathTreeWalker walker(aNode); if (!walker.moveToFirstChild()) { diff --git a/dom/xslt/xpath/txPredicatedNodeTest.cpp b/dom/xslt/xpath/txPredicatedNodeTest.cpp index 4726f48f280b..598f05f78299 100644 --- a/dom/xslt/xpath/txPredicatedNodeTest.cpp +++ b/dom/xslt/xpath/txPredicatedNodeTest.cpp @@ -16,20 +16,25 @@ txPredicatedNodeTest::txPredicatedNodeTest(txNodeTest* aNodeTest, "predicate must not be context-nodeset-sensitive"); } -bool +nsresult txPredicatedNodeTest::matches(const txXPathNode& aNode, - txIMatchContext* aContext) + txIMatchContext* aContext, + bool& aMatched) { - if (!mNodeTest->matches(aNode, aContext)) { - return false; + nsresult rv = mNodeTest->matches(aNode, aContext, aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (!aMatched) { + return NS_OK; } txSingleNodeContext context(aNode, aContext); RefPtr res; - nsresult rv = mPredicate->evaluate(&context, getter_AddRefs(res)); - NS_ENSURE_SUCCESS(rv, false); + rv = mPredicate->evaluate(&context, getter_AddRefs(res)); + NS_ENSURE_SUCCESS(rv, rv); - return res->booleanValue(); + aMatched = res->booleanValue(); + return NS_OK; } double diff --git a/dom/xslt/xpath/txSingleNodeContext.h b/dom/xslt/xpath/txSingleNodeContext.h index e66083d80ac2..dd470294c645 100644 --- a/dom/xslt/xpath/txSingleNodeContext.h +++ b/dom/xslt/xpath/txSingleNodeContext.h @@ -27,10 +27,11 @@ public: return mInner->getVariable(aNamespace, aLName, aResult); } - bool isStripSpaceAllowed(const txXPathNode& aNode) override + nsresult isStripSpaceAllowed(const txXPathNode& aNode, + bool& aAllowed) override { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode); + return mInner->isStripSpaceAllowed(aNode, aAllowed); } void* getPrivateContext() override diff --git a/dom/xslt/xpath/txUnionNodeTest.cpp b/dom/xslt/xpath/txUnionNodeTest.cpp index 421ea680c0a4..b8ac34f87d4f 100644 --- a/dom/xslt/xpath/txUnionNodeTest.cpp +++ b/dom/xslt/xpath/txUnionNodeTest.cpp @@ -10,18 +10,22 @@ #include "txExprResult.h" #include "txSingleNodeContext.h" -bool -txUnionNodeTest::matches(const txXPathNode& aNode, - txIMatchContext* aContext) +nsresult +txUnionNodeTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { uint32_t i, len = mNodeTests.Length(); for (i = 0; i < len; ++i) { - if (mNodeTests[i]->matches(aNode, aContext)) { - return true; + nsresult rv = mNodeTests[i]->matches(aNode, aContext, aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (aMatched) { + return NS_OK; } } - return false; + aMatched = false; + return NS_OK; } double diff --git a/dom/xslt/xpath/txXPathOptimizer.cpp b/dom/xslt/xpath/txXPathOptimizer.cpp index 756dd253d7f4..070302692b24 100644 --- a/dom/xslt/xpath/txXPathOptimizer.cpp +++ b/dom/xslt/xpath/txXPathOptimizer.cpp @@ -26,7 +26,7 @@ public: { MOZ_CRASH("shouldn't depend on this context"); } - bool isStripSpaceAllowed(const txXPathNode& aNode) + nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { MOZ_CRASH("shouldn't depend on this context"); } diff --git a/dom/xslt/xslt/txExecutionState.cpp b/dom/xslt/xslt/txExecutionState.cpp index ed57c79351dd..de439f78953b 100644 --- a/dom/xslt/xslt/txExecutionState.cpp +++ b/dom/xslt/xslt/txExecutionState.cpp @@ -138,8 +138,11 @@ txExecutionState::init(const txXPathNode& aNode, // might use us. txStylesheet::ImportFrame* frame = 0; txExpandedName nullName; - txInstruction* templ = mStylesheet->findTemplate(aNode, nullName, - this, nullptr, &frame); + txInstruction* templ; + rv = mStylesheet->findTemplate(aNode, nullName, this, nullptr, &templ, + &frame); + NS_ENSURE_SUCCESS(rv, rv); + pushTemplateRule(frame, nullName, nullptr); return runTemplate(templ); @@ -292,10 +295,10 @@ txExecutionState::getVariable(int32_t aNamespace, nsIAtom* aLName, return NS_OK; } -bool -txExecutionState::isStripSpaceAllowed(const txXPathNode& aNode) +nsresult +txExecutionState::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { - return mStylesheet->isStripSpaceAllowed(aNode, this); + return mStylesheet->isStripSpaceAllowed(aNode, this, aAllowed); } void* diff --git a/dom/xslt/xslt/txInstructions.cpp b/dom/xslt/xslt/txInstructions.cpp index bf6f50183711..e891b2f3b0bb 100644 --- a/dom/xslt/xslt/txInstructions.cpp +++ b/dom/xslt/xslt/txInstructions.cpp @@ -27,9 +27,11 @@ txApplyDefaultElementTemplate::execute(txExecutionState& aEs) txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); txStylesheet::ImportFrame* frame = 0; - txInstruction* templ = + txInstruction* templ; + nsresult rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, nullptr, &frame); + mode, &aEs, nullptr, &templ, &frame); + NS_ENSURE_SUCCESS(rv, rv); aEs.pushTemplateRule(frame, mode, aEs.mTemplateParams); @@ -53,9 +55,11 @@ txApplyImports::execute(txExecutionState& aEs) txStylesheet::ImportFrame* frame = 0; txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); - txInstruction* templ = - aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, rule->mFrame, &frame); + txInstruction* templ; + rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), + mode, &aEs, rule->mFrame, &templ, + &frame); + NS_ENSURE_SUCCESS(rv, rv); aEs.pushTemplateRule(frame, mode, rule->mParams); @@ -76,9 +80,11 @@ nsresult txApplyTemplates::execute(txExecutionState& aEs) { txStylesheet::ImportFrame* frame = 0; - txInstruction* templ = + txInstruction* templ; + nsresult rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mMode, &aEs, nullptr, &frame); + mMode, &aEs, nullptr, &templ, &frame); + NS_ENSURE_SUCCESS(rv, rv); aEs.pushTemplateRule(frame, mMode, aEs.mTemplateParams); diff --git a/dom/xslt/xslt/txKeyFunctionCall.cpp b/dom/xslt/xslt/txKeyFunctionCall.cpp index ae76275ffddf..d10229f24694 100644 --- a/dom/xslt/xslt/txKeyFunctionCall.cpp +++ b/dom/xslt/xslt/txKeyFunctionCall.cpp @@ -338,7 +338,11 @@ nsresult txXSLKey::testNode(const txXPathNode& aNode, nsAutoString val; uint32_t currKey, numKeys = mKeys.Length(); for (currKey = 0; currKey < numKeys; ++currKey) { - if (mKeys[currKey].matchPattern->matches(aNode, &aEs)) { + bool matched; + nsresult rv = mKeys[currKey].matchPattern->matches(aNode, &aEs, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { txSingleNodeContext *evalContext = new txSingleNodeContext(aNode, &aEs); NS_ENSURE_TRUE(evalContext, NS_ERROR_OUT_OF_MEMORY); diff --git a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp index 35c4b08b3d0b..9424d1110593 100644 --- a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp +++ b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp @@ -441,9 +441,11 @@ public: aResult = nullptr; return NS_ERROR_INVALID_ARG; } - bool isStripSpaceAllowed(const txXPathNode& aNode) + nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) { - return false; + aAllowed = false; + + return NS_OK; } void* getPrivateContext() { diff --git a/dom/xslt/xslt/txStylesheet.cpp b/dom/xslt/xslt/txStylesheet.cpp index b680da01f94a..37052c00f5fc 100644 --- a/dom/xslt/xslt/txStylesheet.cpp +++ b/dom/xslt/xslt/txStylesheet.cpp @@ -88,17 +88,18 @@ txStylesheet::~txStylesheet() } } -txInstruction* +nsresult txStylesheet::findTemplate(const txXPathNode& aNode, const txExpandedName& aMode, txIMatchContext* aContext, ImportFrame* aImportedBy, + txInstruction** aTemplate, ImportFrame** aImportFrame) { NS_ASSERTION(aImportFrame, "missing ImportFrame pointer"); + *aTemplate = nullptr; *aImportFrame = nullptr; - txInstruction* matchTemplate = nullptr; ImportFrame* endFrame = nullptr; txListIterator frameIter(&mImportFrames); @@ -115,7 +116,7 @@ txStylesheet::findTemplate(const txXPathNode& aNode, #endif ImportFrame* frame; - while (!matchTemplate && + while (!*aTemplate && (frame = static_cast(frameIter.next())) && frame != endFrame) { @@ -126,10 +127,14 @@ txStylesheet::findTemplate(const txXPathNode& aNode, if (templates) { // Find template with highest priority uint32_t i, len = templates->Length(); - for (i = 0; i < len && !matchTemplate; ++i) { + for (i = 0; i < len && !*aTemplate; ++i) { MatchableTemplate& templ = (*templates)[i]; - if (templ.mMatch->matches(aNode, aContext)) { - matchTemplate = templ.mFirstInstruction; + bool matched; + nsresult rv = templ.mMatch->matches(aNode, aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { + *aTemplate = templ.mFirstInstruction; *aImportFrame = frame; #if defined(TX_TO_STRING) match = templ.mMatch; @@ -145,7 +150,7 @@ txStylesheet::findTemplate(const txXPathNode& aNode, aMode.mLocalName->ToString(mode); } txXPathNodeUtils::getNodeName(aNode, nodeName); - if (matchTemplate) { + if (*aTemplate) { nsAutoString matchAttr; #ifdef TX_TO_STRING match->toString(matchAttr); @@ -164,23 +169,23 @@ txStylesheet::findTemplate(const txXPathNode& aNode, } } - if (!matchTemplate) { + if (!*aTemplate) { // Test for these first since a node can be both a text node // and a root (if it is orphaned) if (txXPathNodeUtils::isAttribute(aNode) || txXPathNodeUtils::isText(aNode)) { - matchTemplate = mCharactersTemplate; + *aTemplate = mCharactersTemplate; } else if (txXPathNodeUtils::isElement(aNode) || txXPathNodeUtils::isRoot(aNode)) { - matchTemplate = mContainerTemplate; + *aTemplate = mContainerTemplate; } else { - matchTemplate = mEmptyTemplate; + *aTemplate = mEmptyTemplate; } } - return matchTemplate; + return NS_OK; } txDecimalFormat* @@ -219,37 +224,53 @@ txStylesheet::getKeyMap() return mKeys; } -bool -txStylesheet::isStripSpaceAllowed(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txStylesheet::isStripSpaceAllowed(const txXPathNode& aNode, + txIMatchContext* aContext, bool& aAllowed) { int32_t frameCount = mStripSpaceTests.Length(); if (frameCount == 0) { - return false; + aAllowed = false; + + return NS_OK; } txXPathTreeWalker walker(aNode); if (txXPathNodeUtils::isText(walker.getCurrentPosition()) && (!txXPathNodeUtils::isWhitespace(aNode) || !walker.moveToParent())) { - return false; + aAllowed = false; + + return NS_OK; } const txXPathNode& node = walker.getCurrentPosition(); if (!txXPathNodeUtils::isElement(node)) { - return false; + aAllowed = false; + + return NS_OK; } // check Whitespace stipping handling list against given Node int32_t i; for (i = 0; i < frameCount; ++i) { txStripSpaceTest* sst = mStripSpaceTests[i]; - if (sst->matches(node, aContext)) { - return sst->stripsSpace() && !XMLUtils::getXMLSpacePreserve(node); + bool matched; + nsresult rv = sst->matches(node, aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { + aAllowed = sst->stripsSpace() && + !XMLUtils::getXMLSpacePreserve(node); + + return NS_OK; } } - return false; + aAllowed = false; + + return NS_OK; } nsresult diff --git a/dom/xslt/xslt/txStylesheet.h b/dom/xslt/xslt/txStylesheet.h index 978527a13e4d..370f4d6fa78f 100644 --- a/dom/xslt/xslt/txStylesheet.h +++ b/dom/xslt/xslt/txStylesheet.h @@ -35,19 +35,21 @@ public: NS_INLINE_DECL_REFCOUNTING(txStylesheet) - txInstruction* findTemplate(const txXPathNode& aNode, - const txExpandedName& aMode, - txIMatchContext* aContext, - ImportFrame* aImportedBy, - ImportFrame** aImportFrame); + nsresult findTemplate(const txXPathNode& aNode, + const txExpandedName& aMode, + txIMatchContext* aContext, + ImportFrame* aImportedBy, + txInstruction** aTemplate, + ImportFrame** aImportFrame); txDecimalFormat* getDecimalFormat(const txExpandedName& aName); txInstruction* getAttributeSet(const txExpandedName& aName); txInstruction* getNamedTemplate(const txExpandedName& aName); txOutputFormat* getOutputFormat(); GlobalVariable* getGlobalVariable(const txExpandedName& aName); const txOwningExpandedNameMap& getKeyMap(); - bool isStripSpaceAllowed(const txXPathNode& aNode, - txIMatchContext* aContext); + nsresult isStripSpaceAllowed(const txXPathNode& aNode, + txIMatchContext* aContext, + bool& aAllowed); /** * Called by the stylesheet compiler once all stylesheets has been read. @@ -166,8 +168,10 @@ public: { } - bool matches(const txXPathNode& aNode, txIMatchContext* aContext) { - return mNameTest.matches(aNode, aContext); + nsresult matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) + { + return mNameTest.matches(aNode, aContext, aMatched); } bool stripsSpace() { diff --git a/dom/xslt/xslt/txXSLTNumber.cpp b/dom/xslt/xslt/txXSLTNumber.cpp index 237a46ec539d..96e21dfe01d1 100644 --- a/dom/xslt/xslt/txXSLTNumber.cpp +++ b/dom/xslt/xslt/txXSLTNumber.cpp @@ -108,13 +108,12 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, // Otherwise use count/from/level txPattern* countPattern = aCountPattern; - bool ownsCountPattern = false; + nsAutoPtr newCountPattern; const txXPathNode& currNode = aContext->getContextNode(); // Parse count- and from-attributes if (!aCountPattern) { - ownsCountPattern = true; txNodeTest* nodeTest; uint16_t nodeType = txXPathNodeUtils::getNodeType(currNode); switch (nodeType) { @@ -160,7 +159,7 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, } } MOZ_ASSERT(nodeTest); - countPattern = new txStepPattern(nodeTest, false); + countPattern = newCountPattern = new txStepPattern(nodeTest, false); } @@ -170,14 +169,28 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, if (aLevel == eLevelSingle) { txXPathTreeWalker walker(currNode); do { - if (aFromPattern && !walker.isOnNode(currNode) && - aFromPattern->matches(walker.getCurrentPosition(), aContext)) { - break; + if (aFromPattern && !walker.isOnNode(currNode)) { + bool matched; + rv = aFromPattern->matches(walker.getCurrentPosition(), + aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { + break; + } } - if (countPattern->matches(walker.getCurrentPosition(), aContext)) { - aValues.add(NS_INT32_TO_PTR(getSiblingCount(walker, countPattern, - aContext))); + bool matched; + rv = countPattern->matches(walker.getCurrentPosition(), aContext, + matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { + int32_t count; + rv = getSiblingCount(walker, countPattern, aContext, &count); + NS_ENSURE_SUCCESS(rv, rv); + + aValues.add(NS_INT32_TO_PTR(count)); break; } @@ -189,7 +202,12 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, if (aFromPattern && aValues.getLength()) { bool hasParent; while ((hasParent = walker.moveToParent())) { - if (aFromPattern->matches(walker.getCurrentPosition(), aContext)) { + bool matched; + rv = aFromPattern->matches(walker.getCurrentPosition(), + aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { break; } } @@ -205,16 +223,28 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, txXPathTreeWalker walker(currNode); bool matchedFrom = false; do { - if (aFromPattern && !walker.isOnNode(currNode) && - aFromPattern->matches(walker.getCurrentPosition(), aContext)) { - //... we find one that matches from - matchedFrom = true; - break; + if (aFromPattern && !walker.isOnNode(currNode)) { + rv = aFromPattern->matches(walker.getCurrentPosition(), + aContext, matchedFrom); + NS_ENSURE_SUCCESS(rv, rv); + + if (matchedFrom) { + //... we find one that matches from + break; + } } - if (countPattern->matches(walker.getCurrentPosition(), aContext)) { - aValues.add(NS_INT32_TO_PTR(getSiblingCount(walker, countPattern, - aContext))); + bool matched; + rv = countPattern->matches(walker.getCurrentPosition(), aContext, + matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { + int32_t count; + rv = getSiblingCount(walker, countPattern, aContext, &count); + NS_ENSURE_SUCCESS(rv, rv); + + aValues.add(NS_INT32_TO_PTR(count)); } } while (walker.moveToParent()); @@ -232,13 +262,22 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, txXPathTreeWalker walker(currNode); do { - if (aFromPattern && !walker.isOnNode(currNode) && - aFromPattern->matches(walker.getCurrentPosition(), aContext)) { - matchedFrom = true; - break; + if (aFromPattern && !walker.isOnNode(currNode)) { + rv = aFromPattern->matches(walker.getCurrentPosition(), + aContext, matchedFrom); + NS_ENSURE_SUCCESS(rv, rv); + + if (matchedFrom) { + break; + } } - if (countPattern->matches(walker.getCurrentPosition(), aContext)) { + bool matched; + rv = countPattern->matches(walker.getCurrentPosition(), aContext, + matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { ++value; } @@ -256,10 +295,6 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, } } - if (ownsCountPattern) { - delete countPattern; - } - return NS_OK; } @@ -388,18 +423,27 @@ txXSLTNumber::getCounters(Expr* aGroupSize, Expr* aGroupSeparator, return NS_OK; } -int32_t +nsresult txXSLTNumber::getSiblingCount(txXPathTreeWalker& aWalker, txPattern* aCountPattern, - txIMatchContext* aContext) + txIMatchContext* aContext, + int32_t* aCount) { int32_t value = 1; while (aWalker.moveToPreviousSibling()) { - if (aCountPattern->matches(aWalker.getCurrentPosition(), aContext)) { + bool matched; + nsresult rv = aCountPattern->matches(aWalker.getCurrentPosition(), + aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { ++value; } } - return value; + + *aCount = value; + + return NS_OK; } bool diff --git a/dom/xslt/xslt/txXSLTNumber.h b/dom/xslt/xslt/txXSLTNumber.h index e6cdd421009c..73326d3ab513 100644 --- a/dom/xslt/xslt/txXSLTNumber.h +++ b/dom/xslt/xslt/txXSLTNumber.h @@ -46,9 +46,10 @@ private: * position. * */ - static int32_t getSiblingCount(txXPathTreeWalker& aWalker, - txPattern* aCountPattern, - txIMatchContext* aContext); + static nsresult getSiblingCount(txXPathTreeWalker& aWalker, + txPattern* aCountPattern, + txIMatchContext* aContext, + int32_t* aCount); static bool getPrevInDocumentOrder(txXPathTreeWalker& aWalker); diff --git a/dom/xslt/xslt/txXSLTPatterns.cpp b/dom/xslt/xslt/txXSLTPatterns.cpp index c8fe71f72369..e5775dd3ef3b 100644 --- a/dom/xslt/xslt/txXSLTPatterns.cpp +++ b/dom/xslt/xslt/txXSLTPatterns.cpp @@ -32,15 +32,25 @@ double txUnionPattern::getDefaultPriority() * This should be called on the simple patterns for xsl:template, * but is fine for xsl:key and xsl:number */ -bool txUnionPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txUnionPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { uint32_t i, len = mLocPathPatterns.Length(); for (i = 0; i < len; ++i) { - if (mLocPathPatterns[i]->matches(aNode, aContext)) { - return true; + nsresult rv = mLocPathPatterns[i]->matches(aNode, aContext, aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (aMatched) { + aMatched = true; + + return NS_OK; } } - return false; + + aMatched = false; + + return NS_OK; } txPattern::Type @@ -103,7 +113,9 @@ nsresult txLocPathPattern::addStep(txPattern* aPattern, bool isChild) return NS_OK; } -bool txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { NS_ASSERTION(mSteps.Length() > 1, "Internal error"); @@ -121,18 +133,39 @@ bool txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aConte uint32_t pos = mSteps.Length(); Step* step = &mSteps[--pos]; - if (!step->pattern->matches(aNode, aContext)) - return false; + nsresult rv = step->pattern->matches(aNode, aContext, aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (!aMatched) { + return NS_OK; + } txXPathTreeWalker walker(aNode); bool hasParent = walker.moveToParent(); while (step->isChild) { - if (!pos) - return true; // all steps matched + if (!pos) { + aMatched = true; + + return NS_OK; // all steps matched + } + + if (!hasParent) { + // no more ancestors + aMatched = false; + + return NS_OK; + } + step = &mSteps[--pos]; - if (!hasParent || !step->pattern->matches(walker.getCurrentPosition(), aContext)) - return false; // no more ancestors or no match + rv = step->pattern->matches(walker.getCurrentPosition(), aContext, + aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (!aMatched) { + // no match + return NS_OK; + } hasParent = walker.moveToParent(); } @@ -142,12 +175,19 @@ bool txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aConte uint32_t blockPos = pos; while (pos) { - if (!hasParent) - return false; // There are more steps in the current block - // than ancestors of the tested node + if (!hasParent) { + aMatched = false; // There are more steps in the current block + // than ancestors of the tested node + return NS_OK; + } step = &mSteps[--pos]; - if (!step->pattern->matches(walker.getCurrentPosition(), aContext)) { + bool matched; + rv = step->pattern->matches(walker.getCurrentPosition(), aContext, + matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (!matched) { // Didn't match. We restart at beginning of block using a new // start node pos = blockPos; @@ -164,7 +204,9 @@ bool txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aConte } } - return true; + aMatched = true; + + return NS_OK; } // txLocPathPattern::matches double txLocPathPattern::getDefaultPriority() @@ -218,9 +260,13 @@ txLocPathPattern::toString(nsAString& aDest) * a txPattern matching the document node, or '/' */ -bool txRootPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txRootPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { - return txXPathNodeUtils::isRoot(aNode); + aMatched = txXPathNodeUtils::isRoot(aNode); + + return NS_OK; } double txRootPattern::getDefaultPriority() @@ -264,10 +310,14 @@ txIdPattern::txIdPattern(const nsSubstring& aString) } } -bool txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { if (!txXPathNodeUtils::isElement(aNode)) { - return false; + aMatched = false; + + return NS_OK; } // Get a ID attribute, if there is @@ -275,7 +325,9 @@ bool txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) NS_ASSERTION(content, "a Element without nsIContent"); nsIAtom* id = content->GetID(); - return id && mIds.IndexOf(id) > -1; + aMatched = id && mIds.IndexOf(id) > -1; + + return NS_OK; } double txIdPattern::getDefaultPriority() @@ -320,18 +372,22 @@ txIdPattern::toString(nsAString& aDest) * argument. */ -bool txKeyPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txKeyPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { txExecutionState* es = (txExecutionState*)aContext->getPrivateContext(); nsAutoPtr contextDoc(txXPathNodeUtils::getOwnerDocument(aNode)); - NS_ENSURE_TRUE(contextDoc, false); + NS_ENSURE_TRUE(contextDoc, NS_ERROR_FAILURE); RefPtr nodes; nsresult rv = es->getKeyNodes(mName, *contextDoc, mValue, true, getter_AddRefs(nodes)); - NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_SUCCESS(rv, rv); - return nodes->contains(aNode); + aMatched = nodes->contains(aNode); + + return NS_OK; } double txKeyPattern::getDefaultPriority() @@ -373,21 +429,32 @@ txKeyPattern::toString(nsAString& aDest) * a txPattern to hold the NodeTest and the Predicates of a StepPattern */ -bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) +nsresult +txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, + bool& aMatched) { NS_ASSERTION(mNodeTest, "Internal error"); - if (!mNodeTest->matches(aNode, aContext)) - return false; + nsresult rv = mNodeTest->matches(aNode, aContext, aMatched); + NS_ENSURE_SUCCESS(rv, rv); + + if (!aMatched) { + return NS_OK; + } txXPathTreeWalker walker(aNode); if ((!mIsAttr && txXPathNodeUtils::isAttribute(walker.getCurrentPosition())) || !walker.moveToParent()) { - return false; + aMatched = false; + + return NS_OK; } + if (isEmpty()) { - return true; + aMatched = true; + + return NS_OK; } /* @@ -410,13 +477,17 @@ bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) // Create the context node set for evaluating the predicates RefPtr nodes; - nsresult rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes)); - NS_ENSURE_SUCCESS(rv, false); + rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes)); + NS_ENSURE_SUCCESS(rv, rv); bool hasNext = mIsAttr ? walker.moveToFirstAttribute() : walker.moveToFirstChild(); while (hasNext) { - if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + bool matched; + rv = mNodeTest->matches(walker.getCurrentPosition(), aContext, matched); + NS_ENSURE_SUCCESS(rv, rv); + + if (matched) { nodes->append(walker.getCurrentPosition()); } hasNext = mIsAttr ? walker.moveToNextAttribute() : @@ -426,7 +497,7 @@ bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) Expr* predicate = mPredicates[0]; RefPtr newNodes; rv = aContext->recycler()->getNodeSet(getter_AddRefs(newNodes)); - NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_SUCCESS(rv, rv); uint32_t i, predLen = mPredicates.Length(); for (i = 1; i < predLen; ++i) { @@ -437,7 +508,7 @@ bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) predContext.next(); RefPtr exprResult; rv = predicate->evaluate(&predContext, getter_AddRefs(exprResult)); - NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_SUCCESS(rv, rv); switch(exprResult->getResultType()) { case txAExprResult::NUMBER: @@ -464,20 +535,25 @@ bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) nodes->clear(); nodes->append(*newNodes); if (!contextIsInPredicate) { - return false; + aMatched = false; + + return NS_OK; } predicate = mPredicates[i]; } txForwardContext evalContext(aContext, aNode, nodes); RefPtr exprResult; rv = predicate->evaluate(&evalContext, getter_AddRefs(exprResult)); - NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_SUCCESS(rv, rv); - if (exprResult->getResultType() == txAExprResult::NUMBER) + if (exprResult->getResultType() == txAExprResult::NUMBER) { // handle default, [position() == numberValue()] - return ((double)evalContext.position() == exprResult->numberValue()); + aMatched = ((double)evalContext.position() == exprResult->numberValue()); + } else { + aMatched = exprResult->booleanValue(); + } - return exprResult->booleanValue(); + return NS_OK; } // matches double txStepPattern::getDefaultPriority() diff --git a/dom/xslt/xslt/txXSLTPatterns.h b/dom/xslt/xslt/txXSLTPatterns.h index d93d54fe0eec..e7bab74f05c0 100644 --- a/dom/xslt/xslt/txXSLTPatterns.h +++ b/dom/xslt/xslt/txXSLTPatterns.h @@ -26,8 +26,9 @@ public: /* * Determines whether this Pattern matches the given node. */ - virtual bool matches(const txXPathNode& aNode, - txIMatchContext* aContext) = 0; + virtual nsresult matches(const txXPathNode& aNode, + txIMatchContext* aContext, + bool& aMatched) = 0; /* * Returns the default priority of this Pattern. @@ -86,7 +87,8 @@ public: }; #define TX_DECL_PATTERN_BASE \ - bool matches(const txXPathNode& aNode, txIMatchContext* aContext) override; \ + nsresult matches(const txXPathNode& aNode, txIMatchContext* aContext, \ + bool& aMatched) override; \ double getDefaultPriority() override; \ virtual Expr* getSubExprAt(uint32_t aPos) override; \ virtual void setSubExprAt(uint32_t aPos, Expr* aExpr) override; \ From 6e179d85f55d49625adcef4940b3467cd2806a3a Mon Sep 17 00:00:00 2001 From: Lucjan Suski Date: Mon, 20 Mar 2017 13:25:20 -0700 Subject: [PATCH 078/169] servo: Merge #16051 - Make ImageData::new return Fallible instead of unwrapping a result (from methyl:master); r=jdm Instead of unwrapping `new_with_jsobject` result, `ImageData::new` will just pass the error along. It required tweaking `canvasrenderingcontext2d` as it no longer needs to assume the result is `Ok`. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #16043 - [ ] There are tests for these changes OR - [x] These changes do not require tests because this is small and purely refactoring change Source-Repo: https://github.com/servo/servo Source-Revision: 22d40e3680ef9c237d56736012ec73c2e31abfc5 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 7d97eb2df2dafb0200224371a0ae332b7ffb72f8 --- .../script/dom/canvasrenderingcontext2d.rs | 12 ++++++------ servo/components/script/dom/imagedata.rs | 8 ++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/servo/components/script/dom/canvasrenderingcontext2d.rs b/servo/components/script/dom/canvasrenderingcontext2d.rs index 28ba1acfc44c..07338d8b731e 100644 --- a/servo/components/script/dom/canvasrenderingcontext2d.rs +++ b/servo/components/script/dom/canvasrenderingcontext2d.rs @@ -998,15 +998,15 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { let sw = cmp::max(1, sw.abs().to_u32().unwrap()); let sh = cmp::max(1, sh.abs().to_u32().unwrap()); - Ok(ImageData::new(&self.global(), sw, sh, None)) + ImageData::new(&self.global(), sw, sh, None) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible> { - Ok(ImageData::new(&self.global(), - imagedata.Width(), - imagedata.Height(), - None)) + ImageData::new(&self.global(), + imagedata.Width(), + imagedata.Height(), + None) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata @@ -1059,7 +1059,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize]; } - Ok(ImageData::new(&self.global(), sw, sh, Some(data))) + ImageData::new(&self.global(), sw, sh, Some(data)) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata diff --git a/servo/components/script/dom/imagedata.rs b/servo/components/script/dom/imagedata.rs index d3adb0f3f763..220ead847e8e 100644 --- a/servo/components/script/dom/imagedata.rs +++ b/servo/components/script/dom/imagedata.rs @@ -28,7 +28,11 @@ pub struct ImageData { impl ImageData { #[allow(unsafe_code)] - pub fn new(global: &GlobalScope, width: u32, height: u32, mut data: Option>) -> Root { + pub fn new(global: &GlobalScope, + width: u32, + height: u32, + mut data: Option>) + -> Fallible> { let len = width * height * 4; unsafe { let cx = global.get_cx(); @@ -41,7 +45,7 @@ impl ImageData { None => CreateWith::Length(len), }; Uint8ClampedArray::create(cx, data, js_object.handle_mut()).unwrap(); - Self::new_with_jsobject(global, width, Some(height), Some(js_object.get())).unwrap() + Self::new_with_jsobject(global, width, Some(height), Some(js_object.get())) } } From 58ad9a7a5b957025a59f80b9feaa994bc6161ede Mon Sep 17 00:00:00 2001 From: Matthew Wein Date: Mon, 20 Mar 2017 14:36:13 -0400 Subject: [PATCH 079/169] Bug 1348934 - Fix comments in ext-theme.js r=jaws DONTBUILD MozReview-Commit-ID: 15ECUDgVgpJ --HG-- extra : rebase_source : 2f8504a07a60a2208e13e684e99de465dfdaa3fa --- toolkit/components/extensions/ext-theme.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/toolkit/components/extensions/ext-theme.js b/toolkit/components/extensions/ext-theme.js index 6a4e3ad0e81a..4a3adae95588 100644 --- a/toolkit/components/extensions/ext-theme.js +++ b/toolkit/components/extensions/ext-theme.js @@ -118,6 +118,11 @@ class Theme { } } + /** + * Helper method for loading icons found in the extension's manifest. + * + * @param {Object} icons Dictionary mapping icon properties to extension URLs. + */ loadIcons(icons) { if (!Preferences.get("extensions.webextensions.themes.icons.enabled")) { // Return early if icons are disabled. @@ -171,8 +176,8 @@ extensions.on("manifest_theme", (type, directive, extension, manifest) => { extensions.on("shutdown", (type, extension) => { let theme = themeMap.get(extension); - // We won't have a theme if theme's aren't enabled. if (!theme) { + // We won't have a theme if themes are disabled. return; } @@ -193,9 +198,9 @@ extensions.registerSchemaAPI("theme", "addon_parent", context => { let theme = themeMap.get(extension); if (!theme) { - // Themes which use `update` will not a theme defined - // in the manifest. Therefore, we need to initialize the - // theme the first time `update` is called. + // WebExtensions using the Theme API will not have a theme defined + // in the manifest. Therefore, we need to initialize the theme the + // first time browser.theme.update is called. theme = new Theme(extension.baseURI); themeMap.set(extension, theme); } From 14db3ec8b7b9df1c5aae6119fbbb425f0da9cf79 Mon Sep 17 00:00:00 2001 From: Luca Greco Date: Mon, 20 Mar 2017 19:38:36 +0100 Subject: [PATCH 080/169] Bug 1345722 - Split webNavigation onCreatedNavigationTarget tests to prevent them to fail intermittently. r=mixedpuppy MozReview-Commit-ID: 9s8qgBrpAfz --HG-- rename : browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js => browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js extra : rebase_source : af796950caf6fae909b3f17f35a0db2c0d5bb908 --- .../test/browser/browser-common.ini | 1 + ...webNavigation_onCreatedNavigationTarget.js | 123 ------------ ...n_onCreatedNavigationTarget_contextmenu.js | 177 ++++++++++++++++++ 3 files changed, 178 insertions(+), 123 deletions(-) create mode 100644 browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini index a7c17e4bd0ce..72d545fc7b23 100644 --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -129,6 +129,7 @@ support-files = [browser_ext_webNavigation_frameId0.js] [browser_ext_webNavigation_getFrames.js] [browser_ext_webNavigation_onCreatedNavigationTarget.js] +[browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js] [browser_ext_webNavigation_onCreatedNavigationTarget_window_open.js] [browser_ext_webNavigation_urlbar_transitions.js] [browser_ext_windows.js] diff --git a/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js b/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js index b82881469380..4959ebf6cbac 100644 --- a/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js +++ b/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js @@ -52,14 +52,6 @@ async function runTestCase({extension, openNavTarget, expectedWebNavProps}) { is(completedNavMsg.url, url, "Got the expected webNavigation.onCompleted url property"); } -async function clickContextMenuItem({pageElementSelector, contextMenuItemLabel}) { - const contentAreaContextMenu = await openContextMenu(pageElementSelector); - const item = contentAreaContextMenu.getElementsByAttribute("label", contextMenuItemLabel); - is(item.length, 1, `found contextMenu item for "${contextMenuItemLabel}"`); - item[0].click(); - await closeContextMenu(); -} - add_task(function* test_on_created_navigation_target_from_mouse_click() { const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); @@ -127,59 +119,6 @@ add_task(function* test_on_created_navigation_target_from_mouse_click() { yield extension.unload(); }); -add_task(function* test_on_created_navigation_target_from_context_menu() { - const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); - - const extension = ExtensionTestUtils.loadExtension({ - background, - manifest: { - permissions: ["webNavigation"], - }, - }); - - yield extension.startup(); - - const expectedSourceTab = yield extension.awaitMessage("expectedSourceTab"); - - info("Open link in a new tab from the context menu"); - - yield runTestCase({ - extension, - async openNavTarget() { - await clickContextMenuItem({ - pageElementSelector: "#test-create-new-tab-from-context-menu", - contextMenuItemLabel: "Open Link in New Tab", - }); - }, - expectedWebNavProps: { - sourceTabId: expectedSourceTab.sourceTabId, - sourceFrameId: 0, - url: `${OPENED_PAGE}#new-tab-from-context-menu`, - }, - }); - - info("Open link in a new window from the context menu"); - - yield runTestCase({ - extension, - async openNavTarget() { - await clickContextMenuItem({ - pageElementSelector: "#test-create-new-window-from-context-menu", - contextMenuItemLabel: "Open Link in New Window", - }); - }, - expectedWebNavProps: { - sourceTabId: expectedSourceTab.sourceTabId, - sourceFrameId: 0, - url: `${OPENED_PAGE}#new-window-from-context-menu`, - }, - }); - - yield BrowserTestUtils.removeTab(tab); - - yield extension.unload(); -}); - add_task(function* test_on_created_navigation_target_from_mouse_click_subframe() { const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); @@ -256,65 +195,3 @@ add_task(function* test_on_created_navigation_target_from_mouse_click_subframe() yield extension.unload(); }); -add_task(function* test_on_created_navigation_target_from_context_menu_subframe() { - const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); - - const extension = ExtensionTestUtils.loadExtension({ - background, - manifest: { - permissions: ["webNavigation"], - }, - }); - - yield extension.startup(); - - const expectedSourceTab = yield extension.awaitMessage("expectedSourceTab"); - - info("Open a subframe link in a new tab from the context menu"); - - yield runTestCase({ - extension, - async openNavTarget() { - await clickContextMenuItem({ - pageElementSelector: function() { - // This code runs as a framescript in the child process and it returns the - // target link in the subframe. - return this.content.frames[0] // eslint-disable-line mozilla/no-cpows-in-tests - .document.querySelector("#test-create-new-tab-from-context-menu-subframe"); - }, - contextMenuItemLabel: "Open Link in New Tab", - }); - }, - expectedWebNavProps: { - sourceTabId: expectedSourceTab.sourceTabId, - sourceFrameId: expectedSourceTab.sourceTabFrames[1].frameId, - url: `${OPENED_PAGE}#new-tab-from-context-menu-subframe`, - }, - }); - - info("Open a subframe link in a new window from the context menu"); - - yield runTestCase({ - extension, - async openNavTarget() { - await clickContextMenuItem({ - pageElementSelector: function() { - // This code runs as a framescript in the child process and it returns the - // target link in the subframe. - return this.content.frames[0] // eslint-disable-line mozilla/no-cpows-in-tests - .document.querySelector("#test-create-new-window-from-context-menu-subframe"); - }, - contextMenuItemLabel: "Open Link in New Window", - }); - }, - expectedWebNavProps: { - sourceTabId: expectedSourceTab.sourceTabId, - sourceFrameId: expectedSourceTab.sourceTabFrames[1].frameId, - url: `${OPENED_PAGE}#new-window-from-context-menu-subframe`, - }, - }); - - yield BrowserTestUtils.removeTab(tab); - - yield extension.unload(); -}); diff --git a/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js b/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js new file mode 100644 index 000000000000..6dc7896a2950 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js @@ -0,0 +1,177 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +const BASE_URL = "http://mochi.test:8888/browser/browser/components/extensions/test/browser"; +const SOURCE_PAGE = `${BASE_URL}/webNav_createdTargetSource.html`; +const OPENED_PAGE = `${BASE_URL}/webNav_createdTarget.html`; + +async function background() { + const tabs = await browser.tabs.query({active: true, currentWindow: true}); + const sourceTabId = tabs[0].id; + + const sourceTabFrames = await browser.webNavigation.getAllFrames({tabId: sourceTabId}); + + browser.webNavigation.onCreatedNavigationTarget.addListener((msg) => { + browser.test.sendMessage("webNavOnCreated", msg); + }); + + browser.webNavigation.onCompleted.addListener(async (msg) => { + // NOTE: checking the url is currently necessary because of Bug 1252129 + // ( Filter out webNavigation events related to new window initialization phase). + if (msg.tabId !== sourceTabId && msg.url !== "about:blank") { + await browser.tabs.remove(msg.tabId); + browser.test.sendMessage("webNavOnCompleted", msg); + } + }); + + browser.tabs.onCreated.addListener((tab) => { + browser.test.sendMessage("tabsOnCreated", tab.id); + }); + + browser.test.sendMessage("expectedSourceTab", { + sourceTabId, sourceTabFrames, + }); +} + +async function runTestCase({extension, openNavTarget, expectedWebNavProps}) { + await openNavTarget(); + + const webNavMsg = await extension.awaitMessage("webNavOnCreated"); + const createdTabId = await extension.awaitMessage("tabsOnCreated"); + const completedNavMsg = await extension.awaitMessage("webNavOnCompleted"); + + let {sourceTabId, sourceFrameId, url} = expectedWebNavProps; + + is(webNavMsg.tabId, createdTabId, "Got the expected tabId property"); + is(webNavMsg.sourceTabId, sourceTabId, "Got the expected sourceTabId property"); + is(webNavMsg.sourceFrameId, sourceFrameId, "Got the expected sourceFrameId property"); + is(webNavMsg.url, url, "Got the expected url property"); + + is(completedNavMsg.tabId, createdTabId, "Got the expected webNavigation.onCompleted tabId property"); + is(completedNavMsg.url, url, "Got the expected webNavigation.onCompleted url property"); +} + +async function clickContextMenuItem({pageElementSelector, contextMenuItemLabel}) { + const contentAreaContextMenu = await openContextMenu(pageElementSelector); + const item = contentAreaContextMenu.getElementsByAttribute("label", contextMenuItemLabel); + is(item.length, 1, `found contextMenu item for "${contextMenuItemLabel}"`); + item[0].click(); + await closeContextMenu(); +} + +add_task(function* test_on_created_navigation_target_from_context_menu() { + const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); + + const extension = ExtensionTestUtils.loadExtension({ + background, + manifest: { + permissions: ["webNavigation"], + }, + }); + + yield extension.startup(); + + const expectedSourceTab = yield extension.awaitMessage("expectedSourceTab"); + + info("Open link in a new tab from the context menu"); + + yield runTestCase({ + extension, + async openNavTarget() { + await clickContextMenuItem({ + pageElementSelector: "#test-create-new-tab-from-context-menu", + contextMenuItemLabel: "Open Link in New Tab", + }); + }, + expectedWebNavProps: { + sourceTabId: expectedSourceTab.sourceTabId, + sourceFrameId: 0, + url: `${OPENED_PAGE}#new-tab-from-context-menu`, + }, + }); + + info("Open link in a new window from the context menu"); + + yield runTestCase({ + extension, + async openNavTarget() { + await clickContextMenuItem({ + pageElementSelector: "#test-create-new-window-from-context-menu", + contextMenuItemLabel: "Open Link in New Window", + }); + }, + expectedWebNavProps: { + sourceTabId: expectedSourceTab.sourceTabId, + sourceFrameId: 0, + url: `${OPENED_PAGE}#new-window-from-context-menu`, + }, + }); + + yield BrowserTestUtils.removeTab(tab); + + yield extension.unload(); +}); + +add_task(function* test_on_created_navigation_target_from_context_menu_subframe() { + const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, SOURCE_PAGE); + + const extension = ExtensionTestUtils.loadExtension({ + background, + manifest: { + permissions: ["webNavigation"], + }, + }); + + yield extension.startup(); + + const expectedSourceTab = yield extension.awaitMessage("expectedSourceTab"); + + info("Open a subframe link in a new tab from the context menu"); + + yield runTestCase({ + extension, + async openNavTarget() { + await clickContextMenuItem({ + pageElementSelector: function() { + // This code runs as a framescript in the child process and it returns the + // target link in the subframe. + return this.content.frames[0] // eslint-disable-line mozilla/no-cpows-in-tests + .document.querySelector("#test-create-new-tab-from-context-menu-subframe"); + }, + contextMenuItemLabel: "Open Link in New Tab", + }); + }, + expectedWebNavProps: { + sourceTabId: expectedSourceTab.sourceTabId, + sourceFrameId: expectedSourceTab.sourceTabFrames[1].frameId, + url: `${OPENED_PAGE}#new-tab-from-context-menu-subframe`, + }, + }); + + info("Open a subframe link in a new window from the context menu"); + + yield runTestCase({ + extension, + async openNavTarget() { + await clickContextMenuItem({ + pageElementSelector: function() { + // This code runs as a framescript in the child process and it returns the + // target link in the subframe. + return this.content.frames[0] // eslint-disable-line mozilla/no-cpows-in-tests + .document.querySelector("#test-create-new-window-from-context-menu-subframe"); + }, + contextMenuItemLabel: "Open Link in New Window", + }); + }, + expectedWebNavProps: { + sourceTabId: expectedSourceTab.sourceTabId, + sourceFrameId: expectedSourceTab.sourceTabFrames[1].frameId, + url: `${OPENED_PAGE}#new-window-from-context-menu-subframe`, + }, + }); + + yield BrowserTestUtils.removeTab(tab); + + yield extension.unload(); +}); From 7b43e374c00b71165012c685dde26051c9e83a7f Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Mon, 20 Mar 2017 14:43:42 -0700 Subject: [PATCH 081/169] Bug 1348602 - Assert main thread when setting style bits. r=emilio We also assert against the Servo traversal because we don't currently test the parallel traversal on CI (though we will soon). MozReview-Commit-ID: 9GRNizE44Oi --- layout/style/nsStyleContext.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/layout/style/nsStyleContext.h b/layout/style/nsStyleContext.h index ff885f2ee5e9..2d2300217d21 100644 --- a/layout/style/nsStyleContext.h +++ b/layout/style/nsStyleContext.h @@ -688,6 +688,8 @@ private: Servo_GetStyle##name_(mSource.AsServoComputedValues()); \ /* perform any remaining main thread work on the struct */ \ if (needToCompute) { \ + MOZ_ASSERT(NS_IsMainThread()); \ + MOZ_ASSERT(!mozilla::ServoStyleSet::IsInServoTraversal()); \ const_cast(data)->FinishStyle(PresContext()); \ /* the Servo-backed StyleContextSource owns the struct */ \ AddStyleBit(NS_STYLE_INHERIT_BIT(name_)); \ From 644825e65793639826abb5e0b75089d26306d790 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 19 Mar 2017 18:35:17 +0000 Subject: [PATCH 082/169] Bug 1344932 - Separate out the ESLint spidermonkey preprocessor to avoid breaking './mach eslint --fix' on the whole tree.' r=jryans This doesn't allow --fix to run on the whole tree in one go, but does allow it to be run on individual directories. This is due to an ESLint issue, where once the processor is loaded, it applies to the rest of the files. MozReview-Commit-ID: Fqg5yK22Dhu --HG-- rename : tools/lint/eslint/eslint-plugin-mozilla/.eslintrc.js => tools/lint/eslint/.eslintrc.js rename : tools/lint/eslint/eslint-plugin-mozilla/lib/processors/self-hosted.js => tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js extra : rebase_source : 9913f929985016f4a22ff78641051dc025df14f2 --- js/src/builtin/.eslintrc.js | 4 + .../linters/eslint-plugin-spidermonkey-js.rst | 15 + tools/lint/docs/linters/eslint.rst | 7 + tools/lint/eslint.lint | 19 +- .../{eslint-plugin-mozilla => }/.eslintrc.js | 0 .../eslint/eslint-plugin-mozilla/lib/index.js | 3 +- .../eslint/eslint-plugin-mozilla/package.json | 2 +- .../eslint-plugin-spidermonkey-js/LICENSE | 363 ++++++++++++++++++ .../lib/index.js | 17 + .../lib/processors/self-hosted.js | 0 .../package.json | 28 ++ 11 files changed, 453 insertions(+), 5 deletions(-) create mode 100644 tools/lint/docs/linters/eslint-plugin-spidermonkey-js.rst rename tools/lint/eslint/{eslint-plugin-mozilla => }/.eslintrc.js (100%) create mode 100644 tools/lint/eslint/eslint-plugin-spidermonkey-js/LICENSE create mode 100644 tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/index.js rename tools/lint/eslint/{eslint-plugin-mozilla => eslint-plugin-spidermonkey-js}/lib/processors/self-hosted.js (100%) create mode 100644 tools/lint/eslint/eslint-plugin-spidermonkey-js/package.json diff --git a/js/src/builtin/.eslintrc.js b/js/src/builtin/.eslintrc.js index 26d8b2205a2d..83bb7ce846ec 100644 --- a/js/src/builtin/.eslintrc.js +++ b/js/src/builtin/.eslintrc.js @@ -5,6 +5,10 @@ module.exports = { "../../../toolkit/.eslintrc.js" ], + "plugins": [ + "spidermonkey-js" + ], + "rules": { // We should fix those at some point, but we use this to detect NaNs. "no-self-compare": "off", diff --git a/tools/lint/docs/linters/eslint-plugin-spidermonkey-js.rst b/tools/lint/docs/linters/eslint-plugin-spidermonkey-js.rst new file mode 100644 index 000000000000..738ea592198d --- /dev/null +++ b/tools/lint/docs/linters/eslint-plugin-spidermonkey-js.rst @@ -0,0 +1,15 @@ +============================== +Mozilla ESLint SpiderMonkey JS +============================== + +This plugin only creates one item at the moment - a processor for the SpiderMonkey +JS code. + +Processors +========== + +The processor is used to pre-process all *.js files and deals with the macros +that SpiderMonkey uses. + +Note: Currently the ESLint option --fix is disabled when the preprocessor is +enabled. diff --git a/tools/lint/docs/linters/eslint.rst b/tools/lint/docs/linters/eslint.rst index 31f7f81212a1..d1cd130381f3 100644 --- a/tools/lint/docs/linters/eslint.rst +++ b/tools/lint/docs/linters/eslint.rst @@ -34,6 +34,12 @@ ESLint Plugin Mozilla In addition to default ESLint rules, there are several Mozilla-specific rules that are defined in the :doc:`Mozilla ESLint Plugin `. +ESLint Plugin SpiderMonkey JS +----------------------------- + +In addition to default ESLint rules, there is an extra processor for SpiderMonkey +code :doc:`Mozilla ESLint SpiderMonkey JS `. + .. _ESLint: http://eslint.org/ .. _ESLint's documentation: http://eslint.org/docs/user-guide/configuring @@ -43,3 +49,4 @@ the :doc:`Mozilla ESLint Plugin `. :hidden: eslint-plugin-mozilla + eslint-plugin-spidermonkey-js diff --git a/tools/lint/eslint.lint b/tools/lint/eslint.lint index 2ea91d746c73..084a2c720374 100644 --- a/tools/lint/eslint.lint +++ b/tools/lint/eslint.lint @@ -84,7 +84,7 @@ def eslint_setup(): if not call_process("eslint", cmd): return 1 - # Install in-tree ESLint plugin + # Install in-tree ESLint plugin mozilla. cmd = [npm_path, "install", os.path.join(module_path, "eslint-plugin-mozilla")] print("Installing eslint-plugin-mozilla using \"%s\"..." % (" ".join(cmd))) @@ -93,6 +93,15 @@ def eslint_setup(): eslint_path = os.path.join(module_path, "node_modules", ".bin", "eslint") + # Install in-tree ESLint plugin spidermonkey. + cmd = [npm_path, "install", + os.path.join(module_path, "eslint-plugin-spidermonkey-js")] + print("Installing eslint-plugin-spidermonkey-js using \"%s\"..." % (" ".join(cmd))) + if not call_process("eslint-plugin-spidermonkey-js", cmd): + return 1 + + eslint_path = os.path.join(module_path, "node_modules", ".bin", "eslint") + print("\nESLint and approved plugins installed successfully!") print("\nNOTE: Your local eslint binary is at %s\n" % eslint_path) @@ -120,12 +129,18 @@ def expected_eslint_modules(): with open(expected_modules_path, "r") as f: expected_modules = json.load(f)["dependencies"] - # Also read the in-tree ESLint plugin version + # Also read the in-tree ESLint plugin mozilla version mozilla_json_path = os.path.join(get_eslint_module_path(), "eslint-plugin-mozilla", "package.json") with open(mozilla_json_path, "r") as f: expected_modules["eslint-plugin-mozilla"] = json.load(f)["version"] + # Also read the in-tree ESLint plugin spidermonkey version + mozilla_json_path = os.path.join(get_eslint_module_path(), + "eslint-plugin-spidermonkey-js", "package.json") + with open(mozilla_json_path, "r") as f: + expected_modules["eslint-plugin-spidermonkey-js"] = json.load(f)["version"] + return expected_modules diff --git a/tools/lint/eslint/eslint-plugin-mozilla/.eslintrc.js b/tools/lint/eslint/.eslintrc.js similarity index 100% rename from tools/lint/eslint/eslint-plugin-mozilla/.eslintrc.js rename to tools/lint/eslint/.eslintrc.js diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/index.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/index.js index f29a51b9603c..99c88a02fbb7 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/lib/index.js +++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/index.js @@ -20,8 +20,7 @@ module.exports = { "simpletest": require("../lib/environments/simpletest.js") }, processors: { - ".xml": require("../lib/processors/xbl-bindings"), - ".js": require("../lib/processors/self-hosted") + ".xml": require("../lib/processors/xbl-bindings") }, rules: { "avoid-removeChild": require("../lib/rules/avoid-removeChild"), diff --git a/tools/lint/eslint/eslint-plugin-mozilla/package.json b/tools/lint/eslint/eslint-plugin-mozilla/package.json index b57d5b6fdfb6..99dcae8214eb 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/package.json +++ b/tools/lint/eslint/eslint-plugin-mozilla/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-mozilla", - "version": "0.2.30", + "version": "0.2.31", "description": "A collection of rules that help enforce JavaScript coding standard in the Mozilla project.", "keywords": [ "eslint", diff --git a/tools/lint/eslint/eslint-plugin-spidermonkey-js/LICENSE b/tools/lint/eslint/eslint-plugin-spidermonkey-js/LICENSE new file mode 100644 index 000000000000..e87a115e462e --- /dev/null +++ b/tools/lint/eslint/eslint-plugin-spidermonkey-js/LICENSE @@ -0,0 +1,363 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + 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/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/index.js b/tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/index.js new file mode 100644 index 000000000000..1561677e6c9a --- /dev/null +++ b/tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/index.js @@ -0,0 +1,17 @@ +/** + * @fileoverview A processor to help parse the spidermonkey js code. + * 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/. + */ + +"use strict"; + +//------------------------------------------------------------------------------ +// Plugin Definition +//------------------------------------------------------------------------------ +module.exports = { + processors: { + ".js": require("../lib/processors/self-hosted") + } +}; diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/processors/self-hosted.js b/tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js similarity index 100% rename from tools/lint/eslint/eslint-plugin-mozilla/lib/processors/self-hosted.js rename to tools/lint/eslint/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js diff --git a/tools/lint/eslint/eslint-plugin-spidermonkey-js/package.json b/tools/lint/eslint/eslint-plugin-spidermonkey-js/package.json new file mode 100644 index 000000000000..68545709ee76 --- /dev/null +++ b/tools/lint/eslint/eslint-plugin-spidermonkey-js/package.json @@ -0,0 +1,28 @@ +{ + "name": "eslint-plugin-spidermonkey-js", + "version": "0.1.0", + "description": "A collection of rules that help enforce JavaScript coding standard in the Mozilla SpiderMonkey project.", + "keywords": [ + "eslint", + "eslintplugin", + "eslint-plugin", + "mozilla", + "spidermonkey" + ], + "bugs": { + "url": "https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&component=Lint" + }, + "homepage": "http://gecko.readthedocs.io/en/latest/tools/lint/linters/eslint-plugin-spidermonkey-js.html", + "repository": { + "type": "hg", + "url": "https://hg.mozilla.org/mozilla-central/" + }, + "author": "Mozilla", + "main": "lib/index.js", + "dependencies": { + }, + "engines": { + "node": ">=6.9.1" + }, + "license": "MPL-2.0" +} From 10c7be4d149d674415e80567b4d3a8198234e58e Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Mon, 20 Mar 2017 19:13:42 +1100 Subject: [PATCH 083/169] Bug 1348743 - avoid running a bookmark validation on every sync. r=tcsc MozReview-Commit-ID: 49sWR56kfrj --HG-- extra : rebase_source : e68d0050fb3b6b48e5c61abed98827dbbf449923 --- services/sync/modules/doctor.js | 2 +- services/sync/tests/unit/test_doctor.js | 47 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/services/sync/modules/doctor.js b/services/sync/modules/doctor.js index 252a7187a21d..0412dbfa0ac5 100644 --- a/services/sync/modules/doctor.js +++ b/services/sync/modules/doctor.js @@ -106,7 +106,7 @@ this.Doctor = { // Update the time now, even if we decline to actually perform a // validation. We don't want to check the rest of these more frequently // than once a day. - Svc.Prefs.set("validation.lastTime", Math.floor(nowSeconds)); + Svc.Prefs.set(prefPrefix + "validation.lastTime", Math.floor(nowSeconds)); // Validation only occurs a certain percentage of the time. let validationProbability = Svc.Prefs.get(prefPrefix + "validation.percentageChance", 0) / 100.0; diff --git a/services/sync/tests/unit/test_doctor.js b/services/sync/tests/unit/test_doctor.js index f8432d203466..2a5ecdc9628c 100644 --- a/services/sync/tests/unit/test_doctor.js +++ b/services/sync/tests/unit/test_doctor.js @@ -2,6 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const { Doctor, REPAIR_ADVANCE_PERIOD } = Cu.import("resource://services-sync/doctor.js", {}); +Cu.import("resource://gre/modules/Services.jsm"); initTestLogging("Trace"); @@ -10,6 +11,52 @@ function mockDoctor(mocks) { return Object.assign({}, Doctor, mocks); } +add_task(async function test_validation_interval() { + let now = 1000; + let doctor = mockDoctor({ + _now() { + // note that the function being mocked actually returns seconds. + return now; + }, + }); + + let engine = { + name: "test-engine", + getValidator() { + return { + validate(engine) { + return {}; + } + } + }, + } + + // setup prefs which enable test-engine validation. + Services.prefs.setBoolPref("services.sync.engine.test-engine.validation.enabled", true); + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.percentageChance", 100); + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.maxRecords", 1); + // And say we should validate every 10 seconds. + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.interval", 10); + + deepEqual(doctor._getEnginesToValidate([engine]), { + "test-engine": { + engine, + maxRecords: 1, + } + }); + // We haven't advanced the timestamp, so we should not validate again. + deepEqual(doctor._getEnginesToValidate([engine]), {}); + // Advance our clock by 11 seconds. + now += 11; + // We should validate again. + deepEqual(doctor._getEnginesToValidate([engine]), { + "test-engine": { + engine, + maxRecords: 1, + } + }); +}); + add_task(async function test_repairs_start() { let repairStarted = false; let problems = { From 1a61788cb83dc767fad45cf975611e0a8bf3d5a7 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Mon, 20 Mar 2017 16:32:06 -0700 Subject: [PATCH 084/169] Backed out changeset a2ec162fa051 (bug 1348743) for eslint failures a=backout MozReview-Commit-ID: 2rfgqYueacf --- services/sync/modules/doctor.js | 2 +- services/sync/tests/unit/test_doctor.js | 47 ------------------------- 2 files changed, 1 insertion(+), 48 deletions(-) diff --git a/services/sync/modules/doctor.js b/services/sync/modules/doctor.js index 0412dbfa0ac5..252a7187a21d 100644 --- a/services/sync/modules/doctor.js +++ b/services/sync/modules/doctor.js @@ -106,7 +106,7 @@ this.Doctor = { // Update the time now, even if we decline to actually perform a // validation. We don't want to check the rest of these more frequently // than once a day. - Svc.Prefs.set(prefPrefix + "validation.lastTime", Math.floor(nowSeconds)); + Svc.Prefs.set("validation.lastTime", Math.floor(nowSeconds)); // Validation only occurs a certain percentage of the time. let validationProbability = Svc.Prefs.get(prefPrefix + "validation.percentageChance", 0) / 100.0; diff --git a/services/sync/tests/unit/test_doctor.js b/services/sync/tests/unit/test_doctor.js index 2a5ecdc9628c..f8432d203466 100644 --- a/services/sync/tests/unit/test_doctor.js +++ b/services/sync/tests/unit/test_doctor.js @@ -2,7 +2,6 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const { Doctor, REPAIR_ADVANCE_PERIOD } = Cu.import("resource://services-sync/doctor.js", {}); -Cu.import("resource://gre/modules/Services.jsm"); initTestLogging("Trace"); @@ -11,52 +10,6 @@ function mockDoctor(mocks) { return Object.assign({}, Doctor, mocks); } -add_task(async function test_validation_interval() { - let now = 1000; - let doctor = mockDoctor({ - _now() { - // note that the function being mocked actually returns seconds. - return now; - }, - }); - - let engine = { - name: "test-engine", - getValidator() { - return { - validate(engine) { - return {}; - } - } - }, - } - - // setup prefs which enable test-engine validation. - Services.prefs.setBoolPref("services.sync.engine.test-engine.validation.enabled", true); - Services.prefs.setIntPref("services.sync.engine.test-engine.validation.percentageChance", 100); - Services.prefs.setIntPref("services.sync.engine.test-engine.validation.maxRecords", 1); - // And say we should validate every 10 seconds. - Services.prefs.setIntPref("services.sync.engine.test-engine.validation.interval", 10); - - deepEqual(doctor._getEnginesToValidate([engine]), { - "test-engine": { - engine, - maxRecords: 1, - } - }); - // We haven't advanced the timestamp, so we should not validate again. - deepEqual(doctor._getEnginesToValidate([engine]), {}); - // Advance our clock by 11 seconds. - now += 11; - // We should validate again. - deepEqual(doctor._getEnginesToValidate([engine]), { - "test-engine": { - engine, - maxRecords: 1, - } - }); -}); - add_task(async function test_repairs_start() { let repairStarted = false; let problems = { From 856c3763e6115c176e81954357c440e463050cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 20 Mar 2017 15:17:48 -0700 Subject: [PATCH 085/169] servo: Merge #16047 - Stylo: Update bindings for ServoType (from canaltinova:eventstate-bindings); r=emilio This is needed for https://bugzilla.mozilla.org/show_bug.cgi?id=1348873 --- - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix [Bug 1348873](https://bugzilla.mozilla.org/show_bug.cgi?id=1348873) Source-Repo: https://github.com/servo/servo Source-Revision: 315e2dd1611928126e49ad610ccd5a447a4a65cc --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 65279e175fc32fceaefa121b774086bb8acacf0f --- .../style/gecko_bindings/bindings.rs | 2 +- .../style/gecko_bindings/structs_debug.rs | 730 +++++++++++------- .../style/gecko_bindings/structs_release.rs | 371 +++++++-- 3 files changed, 738 insertions(+), 365 deletions(-) diff --git a/servo/components/style/gecko_bindings/bindings.rs b/servo/components/style/gecko_bindings/bindings.rs index d2b914fea546..a5addcee8d3c 100644 --- a/servo/components/style/gecko_bindings/bindings.rs +++ b/servo/components/style/gecko_bindings/bindings.rs @@ -443,7 +443,7 @@ extern "C" { -> RawGeckoNodeBorrowedOrNull; } extern "C" { - pub fn Gecko_ElementState(element: RawGeckoElementBorrowed) -> u16; + pub fn Gecko_ElementState(element: RawGeckoElementBorrowed) -> u64; } extern "C" { pub fn Gecko_IsLink(element: RawGeckoElementBorrowed) -> bool; diff --git a/servo/components/style/gecko_bindings/structs_debug.rs b/servo/components/style/gecko_bindings/structs_debug.rs index 86623596cd04..9004ab634437 100644 --- a/servo/components/style/gecko_bindings/structs_debug.rs +++ b/servo/components/style/gecko_bindings/structs_debug.rs @@ -2239,7 +2239,7 @@ pub mod root { #[test] fn bindgen_test_layout_FastElementCreationOptions() { assert_eq!(::std::mem::size_of::() - , 32usize , concat ! ( + , 56usize , concat ! ( "Size of: " , stringify ! ( FastElementCreationOptions ) )); assert_eq! (::std::mem::align_of::() @@ -3034,6 +3034,9 @@ pub mod root { OriginAttributesDictionary ) , "::" , stringify ! ( mUserContextId ) )); } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct Promise([u8; 0]); pub mod workers { #[allow(unused_imports)] use self::super::super::super::super::root; @@ -3416,11 +3419,12 @@ pub mod root { pub struct ElementCreationOptions { pub _base: root::mozilla::dom::DictionaryBase, pub mIs: [u64; 3usize], + pub mPseudo: [u64; 3usize], } #[test] fn bindgen_test_layout_ElementCreationOptions() { assert_eq!(::std::mem::size_of::() , - 32usize , concat ! ( + 56usize , concat ! ( "Size of: " , stringify ! ( ElementCreationOptions ) )); assert_eq! (::std::mem::align_of::() , @@ -3433,6 +3437,13 @@ pub mod root { "Alignment of field: " , stringify ! ( ElementCreationOptions ) , "::" , stringify ! ( mIs ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ElementCreationOptions ) ) . + mPseudo as * const _ as usize } , 32usize , concat + ! ( + "Alignment of field: " , stringify ! ( + ElementCreationOptions ) , "::" , stringify ! ( + mPseudo ) )); } #[repr(C)] #[derive(Debug)] @@ -3706,9 +3717,6 @@ pub mod root { pub struct ProcessingInstruction([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct Promise([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct StyleSheetList([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -3800,9 +3808,6 @@ pub mod root { pub struct ShadowRoot([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct CustomElementData([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct Selection([u8; 0]); #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] @@ -3867,6 +3872,9 @@ pub mod root { )); } #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct CustomElementData([u8; 0]); + #[repr(C)] #[derive(Debug)] pub struct FragmentOrElement { pub _base: root::nsIContent, @@ -5026,7 +5034,7 @@ pub mod root { pub mStates: root::mozilla::EventStates_InternalType, } pub type EventStates_InternalType = u64; - pub type EventStates_ServoType = u16; + pub type EventStates_ServoType = u64; #[test] fn bindgen_test_layout_EventStates() { assert_eq!(::std::mem::size_of::() , 8usize , concat @@ -7540,7 +7548,7 @@ pub mod root { as ServoElementSnapshot_Flags; #[test] fn bindgen_test_layout_ServoElementSnapshot() { - assert_eq!(::std::mem::size_of::() , 24usize + assert_eq!(::std::mem::size_of::() , 32usize , concat ! ( "Size of: " , stringify ! ( ServoElementSnapshot ) )); assert_eq! (::std::mem::align_of::() , @@ -7569,13 +7577,13 @@ pub mod root { assert_eq! (unsafe { & ( * ( 0 as * const ServoElementSnapshot ) ) . mIsHTMLElementInHTMLDocument as * const _ as usize } , - 18usize , concat ! ( + 24usize , concat ! ( "Alignment of field: " , stringify ! ( ServoElementSnapshot ) , "::" , stringify ! ( mIsHTMLElementInHTMLDocument ) )); assert_eq! (unsafe { & ( * ( 0 as * const ServoElementSnapshot ) ) . - mIsInChromeDocument as * const _ as usize } , 19usize + mIsInChromeDocument as * const _ as usize } , 25usize , concat ! ( "Alignment of field: " , stringify ! ( ServoElementSnapshot ) , "::" , stringify ! ( @@ -8350,6 +8358,12 @@ pub mod root { pub type pair_first_type<_T1> = _T1; pub type pair_second_type<_T2> = _T2; #[repr(C)] + pub struct atomic<_Tp> { + pub _base: (), + pub _phantom_0: ::std::marker::PhantomData<_Tp>, + } + pub type atomic___base = [u8; 0usize]; + #[repr(C)] #[derive(Debug, Copy)] pub struct input_iterator_tag { pub _address: u8, @@ -8368,6 +8382,62 @@ pub mod root { fn clone(&self) -> Self { *self } } #[repr(C)] + #[derive(Debug, Copy)] + pub struct forward_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_forward_iterator_tag() { + assert_eq!(::std::mem::size_of::() , 1usize + , concat ! ( + "Size of: " , stringify ! ( forward_iterator_tag ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( forward_iterator_tag ) + )); + } + impl Clone for forward_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct bidirectional_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_bidirectional_iterator_tag() { + assert_eq!(::std::mem::size_of::() , + 1usize , concat ! ( + "Size of: " , stringify ! ( bidirectional_iterator_tag + ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( + bidirectional_iterator_tag ) )); + } + impl Clone for bidirectional_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct random_access_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_random_access_iterator_tag() { + assert_eq!(::std::mem::size_of::() , + 1usize , concat ! ( + "Size of: " , stringify ! ( random_access_iterator_tag + ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( + random_access_iterator_tag ) )); + } + impl Clone for random_access_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct iterator<_Category, _Tp, _Distance, _Pointer, _Reference> { pub _address: u8, @@ -8377,250 +8447,209 @@ pub mod root { pub _phantom_3: ::std::marker::PhantomData<_Pointer>, pub _phantom_4: ::std::marker::PhantomData<_Reference>, } - pub type iterator_iterator_category<_Category> = _Category; pub type iterator_value_type<_Tp> = _Tp; pub type iterator_difference_type<_Distance> = _Distance; pub type iterator_pointer<_Pointer> = _Pointer; pub type iterator_reference<_Reference> = _Reference; + pub type iterator_iterator_category<_Category> = _Category; #[repr(C)] - #[derive(Debug)] - pub struct atomic<_Tp> { - pub _M_i: _Tp, - } - pub mod chrono { - #[allow(unused_imports)] - use self::super::super::super::root; + #[derive(Debug, Copy, Clone)] + pub struct __bit_const_reference<_Cp> { + pub __seg_: root::std::__bit_const_reference___storage_pointer<_Cp>, + pub __mask_: root::std::__bit_const_reference___storage_type<_Cp>, } + pub type __bit_const_reference___storage_type<_Cp> = _Cp; + pub type __bit_const_reference___storage_pointer<_Cp> = _Cp; } - pub mod __gnu_cxx { - #[allow(unused_imports)] - use self::super::super::root; - } - pub type __off_t = ::std::os::raw::c_long; - pub type __off64_t = ::std::os::raw::c_long; + pub type __int64_t = ::std::os::raw::c_longlong; + pub type __darwin_va_list = root::__builtin_va_list; + pub type __darwin_off_t = root::__int64_t; + pub type va_list = root::__darwin_va_list; + pub type fpos_t = root::__darwin_off_t; #[repr(C)] #[derive(Debug, Copy)] - pub struct _IO_FILE { - pub _flags: ::std::os::raw::c_int, - pub _IO_read_ptr: *mut ::std::os::raw::c_char, - pub _IO_read_end: *mut ::std::os::raw::c_char, - pub _IO_read_base: *mut ::std::os::raw::c_char, - pub _IO_write_base: *mut ::std::os::raw::c_char, - pub _IO_write_ptr: *mut ::std::os::raw::c_char, - pub _IO_write_end: *mut ::std::os::raw::c_char, - pub _IO_buf_base: *mut ::std::os::raw::c_char, - pub _IO_buf_end: *mut ::std::os::raw::c_char, - pub _IO_save_base: *mut ::std::os::raw::c_char, - pub _IO_backup_base: *mut ::std::os::raw::c_char, - pub _IO_save_end: *mut ::std::os::raw::c_char, - pub _markers: *mut root::_IO_marker, - pub _chain: *mut root::_IO_FILE, - pub _fileno: ::std::os::raw::c_int, - pub _flags2: ::std::os::raw::c_int, - pub _old_offset: root::__off_t, - pub _cur_column: ::std::os::raw::c_ushort, - pub _vtable_offset: ::std::os::raw::c_char, - pub _shortbuf: [::std::os::raw::c_char; 1usize], - pub _lock: *mut root::_IO_lock_t, - pub _offset: root::__off64_t, - pub __pad1: *mut ::std::os::raw::c_void, - pub __pad2: *mut ::std::os::raw::c_void, - pub __pad3: *mut ::std::os::raw::c_void, - pub __pad4: *mut ::std::os::raw::c_void, - pub __pad5: usize, - pub _mode: ::std::os::raw::c_int, - pub _unused2: [::std::os::raw::c_char; 20usize], + pub struct __sbuf { + pub _base: *mut ::std::os::raw::c_uchar, + pub _size: ::std::os::raw::c_int, } #[test] - fn bindgen_test_layout__IO_FILE() { - assert_eq!(::std::mem::size_of::<_IO_FILE>() , 216usize , concat ! ( - "Size of: " , stringify ! ( _IO_FILE ) )); - assert_eq! (::std::mem::align_of::<_IO_FILE>() , 8usize , concat ! ( - "Alignment of " , stringify ! ( _IO_FILE ) )); + fn bindgen_test_layout___sbuf() { + assert_eq!(::std::mem::size_of::<__sbuf>() , 16usize , concat ! ( + "Size of: " , stringify ! ( __sbuf ) )); + assert_eq! (::std::mem::align_of::<__sbuf>() , 8usize , concat ! ( + "Alignment of " , stringify ! ( __sbuf ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _flags as * const _ as + & ( * ( 0 as * const __sbuf ) ) . _base as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , + "Alignment of field: " , stringify ! ( __sbuf ) , "::" , + stringify ! ( _base ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const __sbuf ) ) . _size as * const _ as + usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( __sbuf ) , "::" , + stringify ! ( _size ) )); + } + impl Clone for __sbuf { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct __sFILEX([u8; 0]); + #[repr(C)] + #[derive(Debug, Copy)] + pub struct __sFILE { + pub _p: *mut ::std::os::raw::c_uchar, + pub _r: ::std::os::raw::c_int, + pub _w: ::std::os::raw::c_int, + pub _flags: ::std::os::raw::c_short, + pub _file: ::std::os::raw::c_short, + pub _bf: root::__sbuf, + pub _lbfsize: ::std::os::raw::c_int, + pub _cookie: *mut ::std::os::raw::c_void, + pub _close: ::std::option::Option ::std::os::raw::c_int>, + pub _read: ::std::option::Option ::std::os::raw::c_int>, + pub _seek: ::std::option::Option ::std::os::raw::c_longlong>, + pub _write: ::std::option::Option ::std::os::raw::c_int>, + pub _ub: root::__sbuf, + pub _extra: *mut root::__sFILEX, + pub _ur: ::std::os::raw::c_int, + pub _ubuf: [::std::os::raw::c_uchar; 3usize], + pub _nbuf: [::std::os::raw::c_uchar; 1usize], + pub _lb: root::__sbuf, + pub _blksize: ::std::os::raw::c_int, + pub _offset: root::fpos_t, + } + #[test] + fn bindgen_test_layout___sFILE() { + assert_eq!(::std::mem::size_of::<__sFILE>() , 152usize , concat ! ( + "Size of: " , stringify ! ( __sFILE ) )); + assert_eq! (::std::mem::align_of::<__sFILE>() , 8usize , concat ! ( + "Alignment of " , stringify ! ( __sFILE ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const __sFILE ) ) . _p as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _p ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const __sFILE ) ) . _r as * const _ as + usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _r ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const __sFILE ) ) . _w as * const _ as + usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _w ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const __sFILE ) ) . _flags as * const _ as + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , stringify ! ( _flags ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_read_ptr as * - const _ as usize } , 8usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_read_ptr ) )); + & ( * ( 0 as * const __sFILE ) ) . _file as * const _ as + usize } , 18usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _file ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_read_end as * - const _ as usize } , 16usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_read_end ) )); + & ( * ( 0 as * const __sFILE ) ) . _bf as * const _ as + usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _bf ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_read_base as * - const _ as usize } , 24usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_read_base ) )); + & ( * ( 0 as * const __sFILE ) ) . _lbfsize as * const _ + as usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _lbfsize ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_write_base as * - const _ as usize } , 32usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_write_base ) )); + & ( * ( 0 as * const __sFILE ) ) . _cookie as * const _ as + usize } , 48usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _cookie ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_write_ptr as * - const _ as usize } , 40usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_write_ptr ) )); + & ( * ( 0 as * const __sFILE ) ) . _close as * const _ as + usize } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _close ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_write_end as * - const _ as usize } , 48usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_write_end ) )); + & ( * ( 0 as * const __sFILE ) ) . _read as * const _ as + usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _read ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_buf_base as * - const _ as usize } , 56usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_buf_base ) )); + & ( * ( 0 as * const __sFILE ) ) . _seek as * const _ as + usize } , 72usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _seek ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_buf_end as * const - _ as usize } , 64usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_buf_end ) )); + & ( * ( 0 as * const __sFILE ) ) . _write as * const _ as + usize } , 80usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _write ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_save_base as * - const _ as usize } , 72usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_save_base ) )); + & ( * ( 0 as * const __sFILE ) ) . _ub as * const _ as + usize } , 88usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _ub ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_backup_base as * - const _ as usize } , 80usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_backup_base ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _IO_save_end as * - const _ as usize } , 88usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _IO_save_end ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _markers as * const _ - as usize } , 96usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _markers ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _chain as * const _ as + & ( * ( 0 as * const __sFILE ) ) . _extra as * const _ as usize } , 104usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _chain ) )); + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _extra ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _fileno as * const _ - as usize } , 112usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _fileno ) )); + & ( * ( 0 as * const __sFILE ) ) . _ur as * const _ as + usize } , 112usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _ur ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _flags2 as * const _ - as usize } , 116usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _flags2 ) )); + & ( * ( 0 as * const __sFILE ) ) . _ubuf as * const _ as + usize } , 116usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _ubuf ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _old_offset as * const - _ as usize } , 120usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _old_offset ) )); + & ( * ( 0 as * const __sFILE ) ) . _nbuf as * const _ as + usize } , 119usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _nbuf ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _cur_column as * const - _ as usize } , 128usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _cur_column ) )); + & ( * ( 0 as * const __sFILE ) ) . _lb as * const _ as + usize } , 120usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _lb ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _vtable_offset as * - const _ as usize } , 130usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _vtable_offset ) )); + & ( * ( 0 as * const __sFILE ) ) . _blksize as * const _ + as usize } , 136usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , + stringify ! ( _blksize ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _shortbuf as * const _ - as usize } , 131usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _shortbuf ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _lock as * const _ as - usize } , 136usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _lock ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _offset as * const _ - as usize } , 144usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , + & ( * ( 0 as * const __sFILE ) ) . _offset as * const _ as + usize } , 144usize , concat ! ( + "Alignment of field: " , stringify ! ( __sFILE ) , "::" , stringify ! ( _offset ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . __pad1 as * const _ as - usize } , 152usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( __pad1 ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . __pad2 as * const _ as - usize } , 160usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( __pad2 ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . __pad3 as * const _ as - usize } , 168usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( __pad3 ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . __pad4 as * const _ as - usize } , 176usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( __pad4 ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . __pad5 as * const _ as - usize } , 184usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( __pad5 ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _mode as * const _ as - usize } , 192usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _mode ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_FILE ) ) . _unused2 as * const _ - as usize } , 196usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_FILE ) , "::" , - stringify ! ( _unused2 ) )); } - impl Clone for _IO_FILE { - fn clone(&self) -> Self { *self } - } - pub type FILE = root::_IO_FILE; - pub type va_list = root::__builtin_va_list; - pub type _IO_lock_t = ::std::os::raw::c_void; - #[repr(C)] - #[derive(Debug, Copy)] - pub struct _IO_marker { - pub _next: *mut root::_IO_marker, - pub _sbuf: *mut root::_IO_FILE, - pub _pos: ::std::os::raw::c_int, - } - #[test] - fn bindgen_test_layout__IO_marker() { - assert_eq!(::std::mem::size_of::<_IO_marker>() , 24usize , concat ! ( - "Size of: " , stringify ! ( _IO_marker ) )); - assert_eq! (::std::mem::align_of::<_IO_marker>() , 8usize , concat ! ( - "Alignment of " , stringify ! ( _IO_marker ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_marker ) ) . _next as * const _ - as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_marker ) , "::" - , stringify ! ( _next ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_marker ) ) . _sbuf as * const _ - as usize } , 8usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_marker ) , "::" - , stringify ! ( _sbuf ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const _IO_marker ) ) . _pos as * const _ as - usize } , 16usize , concat ! ( - "Alignment of field: " , stringify ! ( _IO_marker ) , "::" - , stringify ! ( _pos ) )); - } - impl Clone for _IO_marker { + impl Clone for __sFILE { fn clone(&self) -> Self { *self } } + pub type FILE = root::__sFILE; /** * MozRefCountType is Mozilla's reference count type. * @@ -15635,63 +15664,63 @@ pub mod root { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct nsDOMMutationObserver([u8; 0]); - pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_LISTENERMANAGER; - pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_PROPERTIES; - pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_ANONYMOUS_ROOT; - pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE; - pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_NATIVE_ANONYMOUS_ROOT; - pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_FORCE_XBL_BINDINGS; - pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_MAY_BE_IN_BINDING_MNGR; - pub const NODE_IS_EDITABLE: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_EDITABLE; - pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_NATIVE_ANONYMOUS; - pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_IN_SHADOW_TREE; - pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_EMPTY_SELECTOR; - pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_SLOW_SELECTOR; - pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_EDGE_CHILD_SELECTOR; - pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS; - pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_ALL_SELECTOR_FLAGS; - pub const NODE_NEEDS_FRAME: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_NEEDS_FRAME; - pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_DESCENDANTS_NEED_FRAMES; - pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_ACCESSKEY; - pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_DIRECTION_RTL; - pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_HAS_DIRECTION_LTR; - pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_ALL_DIRECTION_FLAGS; - pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_CHROME_ONLY_ACCESS; - pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS; - pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_1; - pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_2; - pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_1; - pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_118 = - _bindgen_ty_118::NODE_TYPE_SPECIFIC_BITS_OFFSET; + pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_LISTENERMANAGER; + pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_PROPERTIES; + pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_ANONYMOUS_ROOT; + pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE; + pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS_ROOT; + pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_FORCE_XBL_BINDINGS; + pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_MAY_BE_IN_BINDING_MNGR; + pub const NODE_IS_EDITABLE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_EDITABLE; + pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS; + pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_IN_SHADOW_TREE; + pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_EMPTY_SELECTOR; + pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_SLOW_SELECTOR; + pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_EDGE_CHILD_SELECTOR; + pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS; + pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_ALL_SELECTOR_FLAGS; + pub const NODE_NEEDS_FRAME: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_NEEDS_FRAME; + pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_DESCENDANTS_NEED_FRAMES; + pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_ACCESSKEY; + pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_DIRECTION_RTL; + pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_DIRECTION_LTR; + pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_ALL_DIRECTION_FLAGS; + pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_CHROME_ONLY_ACCESS; + pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS; + pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1; + pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_2; + pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1; + pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_TYPE_SPECIFIC_BITS_OFFSET; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] - pub enum _bindgen_ty_118 { + pub enum _bindgen_ty_28 { NODE_HAS_LISTENERMANAGER = 4, NODE_HAS_PROPERTIES = 8, NODE_IS_ANONYMOUS_ROOT = 16, @@ -15719,6 +15748,127 @@ pub mod root { NODE_SHARED_RESTYLE_BIT_2 = 16777216, NODE_TYPE_SPECIFIC_BITS_OFFSET = 23, } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsScanner([u8; 0]); + /*************************************************************** + Notes: + ***************************************************************/ + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsITokenizer { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsITokenizer_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsITokenizer() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsITokenizer ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( nsITokenizer ) )); + } + impl Clone for nsITokenizer { + fn clone(&self) -> Self { *self } + } + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum nsDTDMode { + eDTDMode_unknown = 0, + eDTDMode_quirks = 1, + eDTDMode_almost_standards = 2, + eDTDMode_full_standards = 3, + eDTDMode_autodetect = 4, + eDTDMode_fragment = 5, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIContentSink([u8; 0]); + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct CParserContext([u8; 0]); + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIDTD { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIDTD_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIDTD() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsIDTD ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsIDTD ) )); + } + impl Clone for nsIDTD { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsParserBase { + pub _base: root::nsISupports, + } + #[test] + fn bindgen_test_layout_nsParserBase() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsParserBase ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( nsParserBase ) )); + } + impl Clone for nsParserBase { + fn clone(&self) -> Self { *self } + } + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum eParserCommands { + eViewNormal = 0, + eViewSource = 1, + eViewFragment = 2, + eViewErrors = 3, + } + /** + * This GECKO-INTERNAL interface is on track to being REMOVED (or refactored + * to the point of being near-unrecognizable). + * + * Please DO NOT #include this file in comm-central code, in your XULRunner + * app or binary extensions. + * + * Please DO NOT #include this into new files even inside Gecko. It is more + * likely than not that #including this header is the wrong thing to do. + */ + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIParser { + pub _base: root::nsParserBase, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIParser_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIParser() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsIParser ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsIParser ) )); + } + impl Clone for nsIParser { + fn clone(&self) -> Self { *self } + } pub type nscoord = i32; pub type nsIntPoint = root::mozilla::gfx::IntPoint; /** @@ -16098,9 +16248,6 @@ pub mod root { pub struct nsIBFCacheEntry([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct nsIContentSink([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct nsIDocumentEncoder([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -17511,6 +17658,28 @@ pub mod root { eStyleStruct_Effects = 23, nsStyleStructID_Length = 24, } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIProperties { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIProperties_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIProperties() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( nsIProperties ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( nsIProperties ) )); + } + impl Clone for nsIProperties { + fn clone(&self) -> Self { *self } + } #[repr(u32)] /** * Types of animatable values. @@ -22361,9 +22530,6 @@ pub mod root { #[derive(Debug, Copy, Clone)] pub struct nsIApplicationCache([u8; 0]); #[repr(C)] - #[derive(Debug, Copy, Clone)] - pub struct nsIProperties([u8; 0]); - #[repr(C)] #[derive(Debug)] pub struct imgRequest { pub _base: root::nsIStreamListener, diff --git a/servo/components/style/gecko_bindings/structs_release.rs b/servo/components/style/gecko_bindings/structs_release.rs index 25d56da0e1ef..b844d827744a 100644 --- a/servo/components/style/gecko_bindings/structs_release.rs +++ b/servo/components/style/gecko_bindings/structs_release.rs @@ -2238,7 +2238,7 @@ pub mod root { #[test] fn bindgen_test_layout_FastElementCreationOptions() { assert_eq!(::std::mem::size_of::() - , 32usize , concat ! ( + , 56usize , concat ! ( "Size of: " , stringify ! ( FastElementCreationOptions ) )); assert_eq! (::std::mem::align_of::() @@ -3025,6 +3025,9 @@ pub mod root { OriginAttributesDictionary ) , "::" , stringify ! ( mUserContextId ) )); } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct Promise([u8; 0]); pub mod workers { #[allow(unused_imports)] use self::super::super::super::super::root; @@ -3399,11 +3402,12 @@ pub mod root { pub struct ElementCreationOptions { pub _base: root::mozilla::dom::DictionaryBase, pub mIs: [u64; 3usize], + pub mPseudo: [u64; 3usize], } #[test] fn bindgen_test_layout_ElementCreationOptions() { assert_eq!(::std::mem::size_of::() , - 32usize , concat ! ( + 56usize , concat ! ( "Size of: " , stringify ! ( ElementCreationOptions ) )); assert_eq! (::std::mem::align_of::() , @@ -3416,6 +3420,13 @@ pub mod root { "Alignment of field: " , stringify ! ( ElementCreationOptions ) , "::" , stringify ! ( mIs ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ElementCreationOptions ) ) . + mPseudo as * const _ as usize } , 32usize , concat + ! ( + "Alignment of field: " , stringify ! ( + ElementCreationOptions ) , "::" , stringify ! ( + mPseudo ) )); } #[repr(C)] #[derive(Debug)] @@ -3687,9 +3698,6 @@ pub mod root { pub struct ProcessingInstruction([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct Promise([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct StyleSheetList([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -3781,9 +3789,6 @@ pub mod root { pub struct ShadowRoot([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct CustomElementData([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct Selection([u8; 0]); #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] @@ -3848,6 +3853,9 @@ pub mod root { )); } #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct CustomElementData([u8; 0]); + #[repr(C)] #[derive(Debug)] pub struct FragmentOrElement { pub _base: root::nsIContent, @@ -4896,7 +4904,7 @@ pub mod root { pub mStates: root::mozilla::EventStates_InternalType, } pub type EventStates_InternalType = u64; - pub type EventStates_ServoType = u16; + pub type EventStates_ServoType = u64; #[test] fn bindgen_test_layout_EventStates() { assert_eq!(::std::mem::size_of::() , 8usize , concat @@ -7352,7 +7360,7 @@ pub mod root { as ServoElementSnapshot_Flags; #[test] fn bindgen_test_layout_ServoElementSnapshot() { - assert_eq!(::std::mem::size_of::() , 24usize + assert_eq!(::std::mem::size_of::() , 32usize , concat ! ( "Size of: " , stringify ! ( ServoElementSnapshot ) )); assert_eq! (::std::mem::align_of::() , @@ -7381,13 +7389,13 @@ pub mod root { assert_eq! (unsafe { & ( * ( 0 as * const ServoElementSnapshot ) ) . mIsHTMLElementInHTMLDocument as * const _ as usize } , - 18usize , concat ! ( + 24usize , concat ! ( "Alignment of field: " , stringify ! ( ServoElementSnapshot ) , "::" , stringify ! ( mIsHTMLElementInHTMLDocument ) )); assert_eq! (unsafe { & ( * ( 0 as * const ServoElementSnapshot ) ) . - mIsInChromeDocument as * const _ as usize } , 19usize + mIsInChromeDocument as * const _ as usize } , 25usize , concat ! ( "Alignment of field: " , stringify ! ( ServoElementSnapshot ) , "::" , stringify ! ( @@ -8162,6 +8170,12 @@ pub mod root { pub type pair_first_type<_T1> = _T1; pub type pair_second_type<_T2> = _T2; #[repr(C)] + pub struct atomic<_Tp> { + pub _base: (), + pub _phantom_0: ::std::marker::PhantomData<_Tp>, + } + pub type atomic___base = [u8; 0usize]; + #[repr(C)] #[derive(Debug, Copy)] pub struct input_iterator_tag { pub _address: u8, @@ -8180,6 +8194,62 @@ pub mod root { fn clone(&self) -> Self { *self } } #[repr(C)] + #[derive(Debug, Copy)] + pub struct forward_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_forward_iterator_tag() { + assert_eq!(::std::mem::size_of::() , 1usize + , concat ! ( + "Size of: " , stringify ! ( forward_iterator_tag ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( forward_iterator_tag ) + )); + } + impl Clone for forward_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct bidirectional_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_bidirectional_iterator_tag() { + assert_eq!(::std::mem::size_of::() , + 1usize , concat ! ( + "Size of: " , stringify ! ( bidirectional_iterator_tag + ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( + bidirectional_iterator_tag ) )); + } + impl Clone for bidirectional_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct random_access_iterator_tag { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_random_access_iterator_tag() { + assert_eq!(::std::mem::size_of::() , + 1usize , concat ! ( + "Size of: " , stringify ! ( random_access_iterator_tag + ) )); + assert_eq! (::std::mem::align_of::() , + 1usize , concat ! ( + "Alignment of " , stringify ! ( + random_access_iterator_tag ) )); + } + impl Clone for random_access_iterator_tag { + fn clone(&self) -> Self { *self } + } + #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct iterator<_Category, _Tp, _Distance, _Pointer, _Reference> { pub _address: u8, @@ -8189,22 +8259,22 @@ pub mod root { pub _phantom_3: ::std::marker::PhantomData<_Pointer>, pub _phantom_4: ::std::marker::PhantomData<_Reference>, } - pub type iterator_iterator_category<_Category> = _Category; pub type iterator_value_type<_Tp> = _Tp; pub type iterator_difference_type<_Distance> = _Distance; pub type iterator_pointer<_Pointer> = _Pointer; pub type iterator_reference<_Reference> = _Reference; + pub type iterator_iterator_category<_Category> = _Category; #[repr(C)] - #[derive(Debug)] - pub struct atomic<_Tp> { - pub _M_i: _Tp, + #[derive(Debug, Copy, Clone)] + pub struct __bit_const_reference<_Cp> { + pub __seg_: root::std::__bit_const_reference___storage_pointer<_Cp>, + pub __mask_: root::std::__bit_const_reference___storage_type<_Cp>, } + pub type __bit_const_reference___storage_type<_Cp> = _Cp; + pub type __bit_const_reference___storage_pointer<_Cp> = _Cp; } - pub mod __gnu_cxx { - #[allow(unused_imports)] - use self::super::super::root; - } - pub type va_list = root::__builtin_va_list; + pub type __darwin_va_list = root::__builtin_va_list; + pub type va_list = root::__darwin_va_list; /** * MozRefCountType is Mozilla's reference count type. * @@ -15062,63 +15132,63 @@ pub mod root { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct nsDOMMutationObserver([u8; 0]); - pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_LISTENERMANAGER; - pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_PROPERTIES; - pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_ANONYMOUS_ROOT; - pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE; - pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_NATIVE_ANONYMOUS_ROOT; - pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_FORCE_XBL_BINDINGS; - pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_MAY_BE_IN_BINDING_MNGR; - pub const NODE_IS_EDITABLE: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_EDITABLE; - pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_NATIVE_ANONYMOUS; - pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_IN_SHADOW_TREE; - pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_EMPTY_SELECTOR; - pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_SLOW_SELECTOR; - pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_EDGE_CHILD_SELECTOR; - pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS; - pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_ALL_SELECTOR_FLAGS; - pub const NODE_NEEDS_FRAME: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_NEEDS_FRAME; - pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_DESCENDANTS_NEED_FRAMES; - pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_ACCESSKEY; - pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_DIRECTION_RTL; - pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_HAS_DIRECTION_LTR; - pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_ALL_DIRECTION_FLAGS; - pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_CHROME_ONLY_ACCESS; - pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS; - pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_1; - pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_2; - pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_1; - pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_105 = - _bindgen_ty_105::NODE_TYPE_SPECIFIC_BITS_OFFSET; + pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_LISTENERMANAGER; + pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_PROPERTIES; + pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_ANONYMOUS_ROOT; + pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE; + pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS_ROOT; + pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_FORCE_XBL_BINDINGS; + pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_MAY_BE_IN_BINDING_MNGR; + pub const NODE_IS_EDITABLE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_EDITABLE; + pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS; + pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_IN_SHADOW_TREE; + pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_EMPTY_SELECTOR; + pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_SLOW_SELECTOR; + pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_EDGE_CHILD_SELECTOR; + pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS; + pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_ALL_SELECTOR_FLAGS; + pub const NODE_NEEDS_FRAME: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_NEEDS_FRAME; + pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_DESCENDANTS_NEED_FRAMES; + pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_ACCESSKEY; + pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_DIRECTION_RTL; + pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_HAS_DIRECTION_LTR; + pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_ALL_DIRECTION_FLAGS; + pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_CHROME_ONLY_ACCESS; + pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS; + pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1; + pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_2; + pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1; + pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_28 = + _bindgen_ty_28::NODE_TYPE_SPECIFIC_BITS_OFFSET; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] - pub enum _bindgen_ty_105 { + pub enum _bindgen_ty_28 { NODE_HAS_LISTENERMANAGER = 4, NODE_HAS_PROPERTIES = 8, NODE_IS_ANONYMOUS_ROOT = 16, @@ -15146,6 +15216,127 @@ pub mod root { NODE_SHARED_RESTYLE_BIT_2 = 16777216, NODE_TYPE_SPECIFIC_BITS_OFFSET = 23, } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsScanner([u8; 0]); + /*************************************************************** + Notes: + ***************************************************************/ + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsITokenizer { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsITokenizer_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsITokenizer() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsITokenizer ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( nsITokenizer ) )); + } + impl Clone for nsITokenizer { + fn clone(&self) -> Self { *self } + } + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum nsDTDMode { + eDTDMode_unknown = 0, + eDTDMode_quirks = 1, + eDTDMode_almost_standards = 2, + eDTDMode_full_standards = 3, + eDTDMode_autodetect = 4, + eDTDMode_fragment = 5, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIContentSink([u8; 0]); + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct CParserContext([u8; 0]); + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIDTD { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIDTD_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIDTD() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsIDTD ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsIDTD ) )); + } + impl Clone for nsIDTD { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsParserBase { + pub _base: root::nsISupports, + } + #[test] + fn bindgen_test_layout_nsParserBase() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsParserBase ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( nsParserBase ) )); + } + impl Clone for nsParserBase { + fn clone(&self) -> Self { *self } + } + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum eParserCommands { + eViewNormal = 0, + eViewSource = 1, + eViewFragment = 2, + eViewErrors = 3, + } + /** + * This GECKO-INTERNAL interface is on track to being REMOVED (or refactored + * to the point of being near-unrecognizable). + * + * Please DO NOT #include this file in comm-central code, in your XULRunner + * app or binary extensions. + * + * Please DO NOT #include this into new files even inside Gecko. It is more + * likely than not that #including this header is the wrong thing to do. + */ + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIParser { + pub _base: root::nsParserBase, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIParser_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIParser() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsIParser ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsIParser ) )); + } + impl Clone for nsIParser { + fn clone(&self) -> Self { *self } + } pub type nscoord = i32; pub type nsIntPoint = root::mozilla::gfx::IntPoint; /** @@ -15525,9 +15716,6 @@ pub mod root { pub struct nsIBFCacheEntry([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct nsIContentSink([u8; 0]); - #[repr(C)] - #[derive(Debug, Copy, Clone)] pub struct nsIDocumentEncoder([u8; 0]); #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -16938,6 +17126,28 @@ pub mod root { eStyleStruct_Effects = 23, nsStyleStructID_Length = 24, } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct nsIProperties { + pub _base: root::nsISupports, + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] + pub struct nsIProperties_COMTypeInfo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + } + #[test] + fn bindgen_test_layout_nsIProperties() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( nsIProperties ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( nsIProperties ) )); + } + impl Clone for nsIProperties { + fn clone(&self) -> Self { *self } + } #[repr(u32)] /** * Types of animatable values. @@ -21720,9 +21930,6 @@ pub mod root { #[derive(Debug, Copy, Clone)] pub struct nsIApplicationCache([u8; 0]); #[repr(C)] - #[derive(Debug, Copy, Clone)] - pub struct nsIProperties([u8; 0]); - #[repr(C)] #[derive(Debug)] pub struct imgRequest { pub _base: root::nsIStreamListener, From 8009760a1c0e9403e2b0dac7b19ee0d67c077090 Mon Sep 17 00:00:00 2001 From: Grigory Kruglov Date: Mon, 20 Mar 2017 16:40:13 -0700 Subject: [PATCH 086/169] Bug 1346438 - Specify X-I-U-S header value while uploading meta/global r=nalexander We upload meta/global in three scenarios: - fresh start - when it was modified after a successful sync - when it was modified after an aborted sync Use X-I-U-S header to assert what we believe about meta/global's presence (during freshStart) and last-modified timestamp (in all other cases). We might encounter a concurrent modification condition, manifesting as a 412 error. If we see such an error: - on fresh start, we restart globalSession - on regular upload, we request a re-sync of all stages MozReview-Commit-ID: 3qyb6rUSOeY --HG-- extra : rebase_source : 166be44aceb634b4e9fa3a8e20f7047cfec2af54 --- .../gecko/fxa/sync/FxAccountSyncAdapter.java | 43 +++- .../org/mozilla/gecko/sync/GlobalSession.java | 137 ++++++---- .../mozilla/gecko/sync/InfoCollections.java | 3 + .../org/mozilla/gecko/sync/MetaGlobal.java | 82 +++--- .../sync/delegates/GlobalSessionCallback.java | 1 + .../sync/stage/FetchMetaGlobalStage.java | 3 +- .../DefaultGlobalSessionCallback.java | 5 + .../sync/net/test/TestGlobalSession.java | 50 ++++ .../android/sync/net/test/TestMetaGlobal.java | 2 +- .../helpers/MockGlobalSessionCallback.java | 8 + .../DefaultGlobalSessionCallback.java | 5 + .../stage/test/TestFetchMetaGlobalStage.java | 238 ++++++++++++------ 12 files changed, 404 insertions(+), 173 deletions(-) diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/sync/FxAccountSyncAdapter.java b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/sync/FxAccountSyncAdapter.java index df31f19cd6fc..f28f16390843 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/sync/FxAccountSyncAdapter.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/sync/FxAccountSyncAdapter.java @@ -34,6 +34,7 @@ import org.mozilla.gecko.fxa.login.State.StateLabel; import org.mozilla.gecko.fxa.sync.FxAccountSyncDelegate.Result; import org.mozilla.gecko.sync.BackoffHandler; import org.mozilla.gecko.sync.GlobalSession; +import org.mozilla.gecko.sync.MetaGlobal; import org.mozilla.gecko.sync.PrefsBackoffHandler; import org.mozilla.gecko.sync.SharedPreferencesClientsDataDelegate; import org.mozilla.gecko.sync.SyncConfiguration; @@ -132,6 +133,7 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { // Keeps track of incomplete stages during this sync that need to be re-synced once we're done. private final List stageNamesForFollowUpSync = Collections.synchronizedList(new ArrayList()); + private boolean fullSyncNecessary = false; public SyncDelegate(BlockingQueue latch, SyncResult syncResult, AndroidFxAccount fxAccount, Collection stageNamesToSync) { super(latch, syncResult); @@ -200,6 +202,14 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { syncDelegate.requestFollowUpSync(currentState.getRepositoryName()); } + /** + * Use with caution, as this will request an immediate follow-up sync of all stages. + */ + @Override + public void handleFullSyncNecessary() { + syncDelegate.fullSyncNecessary = true; + } + @Override public void handleSuccess(GlobalSession globalSession) { Logger.info(LOG_TAG, "Global session succeeded."); @@ -454,6 +464,7 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { Collection stageNamesToSync = Utils.getStagesToSyncFromBundle(knownStageNames, extras); final SyncDelegate syncDelegate = new SyncDelegate(latch, syncResult, fxAccount, stageNamesToSync); + Result offeredResult = null; try { // This will be the same chunk of SharedPreferences that we pass through to GlobalSession/SyncConfiguration. @@ -591,7 +602,7 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { } }); - latch.take(); + offeredResult = latch.take(); } catch (Exception e) { Logger.error(LOG_TAG, "Got error syncing.", e); syncDelegate.handleError(e); @@ -599,6 +610,25 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { fxAccount.releaseSharedAccountStateLock(); } + lastSyncRealtimeMillis = SystemClock.elapsedRealtime(); + + // We got to this point without being offered a result, and so it's unwise to proceed with + // trying to sync stages again. Nothing else we can do but log an error. + if (offeredResult == null) { + Logger.error(LOG_TAG, "Did not receive a sync result from the delegate."); + return; + } + + // Full sync (of all of stages) is necessary if we hit "concurrent modification" errors while + // uploading meta/global stage. This is considered both a rare and important event, so it's + // deemed safe and necessary to request an immediate sync, which will ignore any back-offs and + // will happen right away. + if (syncDelegate.fullSyncNecessary) { + Logger.info(LOG_TAG, "Syncing done. Full follow-up sync necessary, requesting immediate sync."); + fxAccount.requestImmediateSync(null, null); + return; + } + // If there are any incomplete stages, request a follow-up sync. Otherwise, we're done. // Incomplete stage is: // - one that hit a 412 error during either upload or download of data, indicating that @@ -611,12 +641,13 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter { ); } - if (stagesToSyncAgain.length > 0) { - Logger.info(LOG_TAG, "Syncing done. Requesting an immediate follow-up sync."); - fxAccount.requestImmediateSync(stagesToSyncAgain, null); - } else { + if (stagesToSyncAgain.length == 0) { Logger.info(LOG_TAG, "Syncing done."); + return; } - lastSyncRealtimeMillis = SystemClock.elapsedRealtime(); + + // If there are any other stages marked as incomplete, request that they're synced again. + Logger.info(LOG_TAG, "Syncing done. Requesting an immediate follow-up sync."); + fxAccount.requestImmediateSync(stagesToSyncAgain, null); } } diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java index a3f4e00cddec..770a59b88795 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java @@ -5,6 +5,7 @@ package org.mozilla.gecko.sync; import android.content.Context; +import android.support.annotation.VisibleForTesting; import org.json.simple.JSONArray; import org.mozilla.gecko.background.common.log.Logger; @@ -409,44 +410,17 @@ public class GlobalSession implements HttpResponseObserver { Runnable doUpload = new Runnable() { @Override public void run() { - config.metaGlobal.upload(new MetaGlobalDelegate() { - @Override - public void handleSuccess(MetaGlobal global, SyncStorageResponse response) { - Logger.info(LOG_TAG, "Successfully uploaded updated meta/global record."); - // Engine changes are stored as diffs, so update enabled engines in config to match uploaded meta/global. - config.enabledEngineNames = config.metaGlobal.getEnabledEngineNames(); - // Clear userSelectedEngines because they are updated in config and meta/global. - config.userSelectedEngines = null; - - synchronized (monitor) { - monitor.notify(); - } - } - - @Override - public void handleMissing(MetaGlobal global, SyncStorageResponse response) { - Logger.warn(LOG_TAG, "Got 404 missing uploading updated meta/global record; shouldn't happen. Ignoring."); - synchronized (monitor) { - monitor.notify(); - } - } - - @Override - public void handleFailure(SyncStorageResponse response) { - Logger.warn(LOG_TAG, "Failed to upload updated meta/global record; ignoring."); - synchronized (monitor) { - monitor.notify(); - } - } - - @Override - public void handleError(Exception e) { - Logger.warn(LOG_TAG, "Got exception trying to upload updated meta/global record; ignoring.", e); - synchronized (monitor) { - monitor.notify(); - } - } - }); + // During regular meta/global upload, set X-I-U-S to the last-modified value of meta/global + // in info/collections, to ensure we catch concurrent modifications by other clients. + Long lastModifiedTimestamp = config.infoCollections.getTimestamp("meta"); + // Theoretically, meta/global's timestamp might be missing from info/collections. + // The safest thing in that case is to assert that meta/global hasn't been modified by other + // clients by setting X-I-U-S to 0. + // See Bug 1346438. + if (lastModifiedTimestamp == null) { + lastModifiedTimestamp = 0L; + } + config.metaGlobal.upload(lastModifiedTimestamp, makeMetaGlobalUploadDelegate(config, callback, monitor)); } }; @@ -462,6 +436,55 @@ public class GlobalSession implements HttpResponseObserver { } } + @VisibleForTesting + public static MetaGlobalDelegate makeMetaGlobalUploadDelegate(final SyncConfiguration config, final GlobalSessionCallback callback, final Object monitor) { + return new MetaGlobalDelegate() { + @Override + public void handleSuccess(MetaGlobal global, SyncStorageResponse response) { + Logger.info(LOG_TAG, "Successfully uploaded updated meta/global record."); + // Engine changes are stored as diffs, so update enabled engines in config to match uploaded meta/global. + config.enabledEngineNames = config.metaGlobal.getEnabledEngineNames(); + // Clear userSelectedEngines because they are updated in config and meta/global. + config.userSelectedEngines = null; + + synchronized (monitor) { + monitor.notify(); + } + } + + @Override + public void handleMissing(MetaGlobal global, SyncStorageResponse response) { + Logger.warn(LOG_TAG, "Got 404 missing uploading updated meta/global record; shouldn't happen. Ignoring."); + synchronized (monitor) { + monitor.notify(); + } + } + + @Override + public void handleFailure(SyncStorageResponse response) { + Logger.warn(LOG_TAG, "Failed to upload updated meta/global record; ignoring."); + + // If we encountered a concurrent modification while uploading meta/global, request that + // sync of all stages happens once we're done. + if (response.getStatusCode() == 412) { + callback.handleFullSyncNecessary(); + } + + synchronized (monitor) { + monitor.notify(); + } + } + + @Override + public void handleError(Exception e) { + Logger.warn(LOG_TAG, "Got exception trying to upload updated meta/global record; ignoring.", e); + synchronized (monitor) { + monitor.notify(); + } + } + }; + } + public void abort(Exception e, String reason) { Logger.warn(LOG_TAG, "Aborting sync: " + reason, e); @@ -709,12 +732,32 @@ public class GlobalSession implements HttpResponseObserver { * Do a fresh start then quietly finish the sync, starting another. */ public void freshStart() { - final GlobalSession globalSession = this; - freshStart(this, new FreshStartDelegate() { + freshStart(this, makeFreshStartDelegate(this)); + } + @VisibleForTesting + public static FreshStartDelegate makeFreshStartDelegate(final GlobalSession globalSession) { + return new FreshStartDelegate() { @Override public void onFreshStartFailed(Exception e) { - globalSession.abort(e, "Fresh start failed."); + if (!(e instanceof HTTPFailureException)) { + globalSession.abort(e, "Fresh start failed."); + return; + } + + if (((HTTPFailureException) e).response.getStatusCode() != 412) { + globalSession.abort(e, "Fresh start failed with non-412 status code."); + return; + } + + // In case of a concurrent modification during a fresh start, restart global session. + try { + // We are not persisting SyncConfiguration at this point; we can't be sure of its state. + globalSession.restart(); + } catch (AlreadySyncingException restartException) { + Logger.warn(LOG_TAG, "Got exception restarting sync after freshStart failure.", restartException); + globalSession.abort(restartException, "Got exception restarting sync after freshStart failure."); + } } @Override @@ -728,7 +771,7 @@ public class GlobalSession implements HttpResponseObserver { globalSession.abort(e, "Got exception after freshStart."); } } - }); + }; } /** @@ -762,11 +805,11 @@ public class GlobalSession implements HttpResponseObserver { Logger.info(LOG_TAG, "Uploading new meta/global with sync ID " + mg.syncID + "."); - // It would be good to set the X-If-Unmodified-Since header to `timestamp` - // for this PUT to ensure at least some level of transactionality. - // Unfortunately, the servers don't support it after a wipe right now - // (bug 693893), so we're going to defer this until bug 692700. - mg.upload(new MetaGlobalDelegate() { + // During a fresh start, set X-I-U-S to 0 to ensure we don't race with other clients. + // Since we are performing a fresh start, we are asserting that meta/global was not uploaded + // by other clients. + // See Bug 1346438. + mg.upload(0L, new MetaGlobalDelegate() { @Override public void handleSuccess(MetaGlobal uploadedGlobal, SyncStorageResponse uploadResponse) { Logger.info(LOG_TAG, "Uploaded new meta/global with sync ID " + uploadedGlobal.syncID + "."); diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/InfoCollections.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/InfoCollections.java index 374fa5cf5d31..314456ef7bb8 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/InfoCollections.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/InfoCollections.java @@ -4,6 +4,8 @@ package org.mozilla.gecko.sync; +import android.support.annotation.Nullable; + import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -67,6 +69,7 @@ public class InfoCollections { * The collection to inspect. * @return the timestamp in milliseconds since epoch. */ + @Nullable public Long getTimestamp(String collection) { if (timestamps == null) { return null; diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/MetaGlobal.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/MetaGlobal.java index a90c0fee82ee..e73fa2e3363d 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/MetaGlobal.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/MetaGlobal.java @@ -22,7 +22,7 @@ import org.mozilla.gecko.sync.net.SyncStorageRecordRequest; import org.mozilla.gecko.sync.net.SyncStorageRequestDelegate; import org.mozilla.gecko.sync.net.SyncStorageResponse; -public class MetaGlobal implements SyncStorageRequestDelegate { +public class MetaGlobal { private static final String LOG_TAG = "MetaGlobal"; protected String metaURL; @@ -54,19 +54,18 @@ public class MetaGlobal implements SyncStorageRequestDelegate { try { this.isUploading = false; SyncStorageRecordRequest r = new SyncStorageRecordRequest(this.metaURL); - r.delegate = this; + r.delegate = new MetaUploadDelegate(this, null); r.get(); } catch (URISyntaxException e) { this.callback.handleError(e); } } - public void upload(MetaGlobalDelegate callback) { + public void upload(long lastModifiedTimestamp, MetaGlobalDelegate callback) { try { this.isUploading = true; SyncStorageRecordRequest r = new SyncStorageRecordRequest(this.metaURL); - - r.delegate = this; + r.delegate = new MetaUploadDelegate(this, lastModifiedTimestamp); this.callback = callback; r.put(this.asCryptoRecord()); } catch (Exception e) { @@ -319,25 +318,6 @@ public class MetaGlobal implements SyncStorageRequestDelegate { return null; } - @Override - public AuthHeaderProvider getAuthHeaderProvider() { - return authHeaderProvider; - } - - @Override - public String ifUnmodifiedSince() { - return null; - } - - @Override - public void handleRequestSuccess(SyncStorageResponse response) { - if (this.isUploading) { - this.handleUploadSuccess(response); - } else { - this.handleDownloadSuccess(response); - } - } - private void handleUploadSuccess(SyncStorageResponse response) { this.callback.handleSuccess(this, response); } @@ -356,17 +336,49 @@ public class MetaGlobal implements SyncStorageRequestDelegate { this.callback.handleFailure(response); } - @Override - public void handleRequestFailure(SyncStorageResponse response) { - if (response.getStatusCode() == 404) { - this.callback.handleMissing(this, response); - return; - } - this.callback.handleFailure(response); - } + private static class MetaUploadDelegate implements SyncStorageRequestDelegate { + private final MetaGlobal metaGlobal; + private final Long ifUnmodifiedSinceTimestamp; - @Override - public void handleRequestError(Exception e) { - this.callback.handleError(e); + /* package-local */ MetaUploadDelegate(final MetaGlobal metaGlobal, final Long ifUnmodifiedSinceTimestamp) { + this.metaGlobal = metaGlobal; + this.ifUnmodifiedSinceTimestamp = ifUnmodifiedSinceTimestamp; + } + + @Override + public AuthHeaderProvider getAuthHeaderProvider() { + return metaGlobal.authHeaderProvider; + } + + @Override + public String ifUnmodifiedSince() { + if (ifUnmodifiedSinceTimestamp == null) { + return null; + } + return Utils.millisecondsToDecimalSecondsString(ifUnmodifiedSinceTimestamp); + } + + @Override + public void handleRequestSuccess(SyncStorageResponse response) { + if (metaGlobal.isUploading) { + metaGlobal.handleUploadSuccess(response); + } else { + metaGlobal.handleDownloadSuccess(response); + } + } + + @Override + public void handleRequestFailure(SyncStorageResponse response) { + if (response.getStatusCode() == 404) { + metaGlobal.callback.handleMissing(metaGlobal, response); + return; + } + metaGlobal.callback.handleFailure(response); + } + + @Override + public void handleRequestError(Exception e) { + metaGlobal.callback.handleError(e); + } } } diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/delegates/GlobalSessionCallback.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/delegates/GlobalSessionCallback.java index 2c569fc735b0..de13cb043168 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/delegates/GlobalSessionCallback.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/delegates/GlobalSessionCallback.java @@ -39,6 +39,7 @@ public interface GlobalSessionCallback { void handleSuccess(GlobalSession globalSession); void handleStageCompleted(Stage currentState, GlobalSession globalSession); void handleIncompleteStage(Stage currentState, GlobalSession globalSession); + void handleFullSyncNecessary(); /** * Called when a {@link GlobalSession} wants to know if it should continue diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FetchMetaGlobalStage.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FetchMetaGlobalStage.java index b4407b26bb08..8d51c5165c3c 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FetchMetaGlobalStage.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FetchMetaGlobalStage.java @@ -58,7 +58,7 @@ public class FetchMetaGlobalStage extends AbstractNonRepositorySyncStage { return; } - long lastModified = session.config.persistedMetaGlobal().lastModified(); + final long lastModified = session.config.persistedMetaGlobal().lastModified(); if (!infoCollections.updateNeeded(META_COLLECTION, lastModified)) { // Try to use our local collection keys for this session. Logger.info(LOG_TAG, "Trying to use persisted meta/global for this session."); @@ -72,6 +72,7 @@ public class FetchMetaGlobalStage extends AbstractNonRepositorySyncStage { } // We need an update: fetch or upload meta/global as necessary. + // We assert when we believe meta/global was last modified via X-I-U-S. Logger.info(LOG_TAG, "Fetching fresh meta/global for this session."); MetaGlobal global = new MetaGlobal(session.config.metaURL(), session.getAuthHeaderProvider()); global.fetch(new StageMetaGlobalDelegate(session)); diff --git a/mobile/android/tests/background/junit3/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java b/mobile/android/tests/background/junit3/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java index afe43c8642d6..d11350163624 100644 --- a/mobile/android/tests/background/junit3/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java +++ b/mobile/android/tests/background/junit3/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java @@ -34,6 +34,11 @@ public class DefaultGlobalSessionCallback implements GlobalSessionCallback { } + @Override + public void handleFullSyncNecessary() { + + } + @Override public void handleAborted(GlobalSession globalSession, String reason) { } diff --git a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestGlobalSession.java b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestGlobalSession.java index b4221c3bf13a..e705017419b0 100644 --- a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestGlobalSession.java +++ b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestGlobalSession.java @@ -27,6 +27,8 @@ import org.mozilla.gecko.background.testhelpers.WaitHelper; import org.mozilla.gecko.sync.EngineSettings; import org.mozilla.gecko.sync.ExtendedJSONObject; import org.mozilla.gecko.sync.GlobalSession; +import org.mozilla.gecko.sync.HTTPFailureException; +import org.mozilla.gecko.sync.InfoCollections; import org.mozilla.gecko.sync.MetaGlobal; import org.mozilla.gecko.sync.NonObjectJSONException; import org.mozilla.gecko.sync.SyncConfiguration; @@ -34,6 +36,7 @@ import org.mozilla.gecko.sync.SyncConfigurationException; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.crypto.CryptoException; import org.mozilla.gecko.sync.crypto.KeyBundle; +import org.mozilla.gecko.sync.delegates.MetaGlobalDelegate; import org.mozilla.gecko.sync.net.BaseResource; import org.mozilla.gecko.sync.net.BasicAuthHeaderProvider; import org.mozilla.gecko.sync.net.SyncStorageResponse; @@ -59,6 +62,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; @RunWith(TestRunner.class) public class TestGlobalSession { @@ -391,6 +395,7 @@ public class TestGlobalSession { final GlobalSession session = MockPrefsGlobalSession.getSession(TEST_USERNAME, TEST_PASSWORD, new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY), callback, null, null); session.config.metaGlobal = session.generateNewMetaGlobal(); + session.config.infoCollections = mock(InfoCollections.class); session.enginesToUpdate.clear(); // Set enabledEngines in meta/global, including a "new engine." @@ -433,8 +438,53 @@ public class TestGlobalSession { assertEquals(expected, session.config.metaGlobal.getEnabledEngineNames()); } + @Test + public void testUploadMetaGlobalDelegate412() { + final Object monitor = new Object(); + final MockGlobalSessionCallback callback = new MockGlobalSessionCallback(); + MetaGlobalDelegate metaGlobalDelegate = GlobalSession.makeMetaGlobalUploadDelegate( + mock(SyncConfiguration.class), + callback, + monitor + ); + + metaGlobalDelegate.handleFailure(makeSyncStorageResponse(412)); + + assertTrue(callback.calledFullSyncNecessary); + } + + @Test + public void testUploadMetaGlobalDelegateNon412() { + final Object monitor = new Object(); + final MockGlobalSessionCallback callback = new MockGlobalSessionCallback(); + MetaGlobalDelegate metaGlobalDelegate = GlobalSession.makeMetaGlobalUploadDelegate( + mock(SyncConfiguration.class), + callback, + monitor + ); + + metaGlobalDelegate.handleFailure(makeSyncStorageResponse(400)); + + assertFalse(callback.calledFullSyncNecessary); + } + public void testStageAdvance() { assertEquals(GlobalSession.nextStage(Stage.idle), Stage.checkPreconditions); assertEquals(GlobalSession.nextStage(Stage.completed), Stage.idle); } + + public static HTTPFailureException makeHttpFailureException(int statusCode) { + return new HTTPFailureException(makeSyncStorageResponse(statusCode)); + } + + public static SyncStorageResponse makeSyncStorageResponse(int statusCode) { + // \\( >.<)// + return new SyncStorageResponse( + new BasicHttpResponse( + new BasicStatusLine( + new ProtocolVersion("HTTP", 1, 1), statusCode, null + ) + ) + ); + } } diff --git a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestMetaGlobal.java b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestMetaGlobal.java index ec4c038593be..c4cbeba70a90 100644 --- a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestMetaGlobal.java +++ b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/net/test/TestMetaGlobal.java @@ -296,7 +296,7 @@ public class TestMetaGlobal { WaitHelper.getTestWaiter().performWait(WaitHelper.onThreadRunnable(new Runnable() { @Override public void run() { - global.upload(delegate); + global.upload(0L, delegate); } })); diff --git a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/test/helpers/MockGlobalSessionCallback.java b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/test/helpers/MockGlobalSessionCallback.java index 2d219f582a32..b785277ed6fb 100644 --- a/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/test/helpers/MockGlobalSessionCallback.java +++ b/mobile/android/tests/background/junit4/src/org/mozilla/android/sync/test/helpers/MockGlobalSessionCallback.java @@ -9,6 +9,7 @@ import org.mozilla.gecko.sync.delegates.GlobalSessionCallback; import org.mozilla.gecko.sync.stage.GlobalSyncStage.Stage; import java.net.URI; +import java.util.ArrayList; import static org.junit.Assert.assertEquals; @@ -35,6 +36,8 @@ public class MockGlobalSessionCallback implements GlobalSessionCallback { public boolean calledInformMigrated = false; public URI calledInformUnauthorizedResponseClusterURL = null; public long weaveBackoff = -1; + public boolean calledFullSyncNecessary = false; + public ArrayList incompleteStages = new ArrayList<>(); @Override public void handleSuccess(GlobalSession globalSession) { @@ -59,7 +62,12 @@ public class MockGlobalSessionCallback implements GlobalSessionCallback { @Override public void handleIncompleteStage(Stage currentState, GlobalSession globalSession) { + this.incompleteStages.add(currentState.getRepositoryName()); + } + @Override + public void handleFullSyncNecessary() { + this.calledFullSyncNecessary = true; } @Override diff --git a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java index 379ce8d4d8fd..e25ad85571a0 100644 --- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java +++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/background/testhelpers/DefaultGlobalSessionCallback.java @@ -50,6 +50,11 @@ public class DefaultGlobalSessionCallback implements GlobalSessionCallback { } + @Override + public void handleFullSyncNecessary() { + + } + @Override public boolean shouldBackOffStorage() { return false; diff --git a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/sync/stage/test/TestFetchMetaGlobalStage.java b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/sync/stage/test/TestFetchMetaGlobalStage.java index 93d20a65d3f9..33379db093c1 100644 --- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/sync/stage/test/TestFetchMetaGlobalStage.java +++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/sync/stage/test/TestFetchMetaGlobalStage.java @@ -9,6 +9,7 @@ import org.json.simple.JSONArray; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mozilla.android.sync.net.test.TestGlobalSession; import org.mozilla.android.sync.net.test.TestMetaGlobal; import org.mozilla.android.sync.test.helpers.HTTPServerTestHelper; import org.mozilla.android.sync.test.helpers.MockGlobalSessionCallback; @@ -21,6 +22,7 @@ import org.mozilla.gecko.sync.CollectionKeys; import org.mozilla.gecko.sync.CryptoRecord; import org.mozilla.gecko.sync.ExtendedJSONObject; import org.mozilla.gecko.sync.GlobalSession; +import org.mozilla.gecko.sync.HTTPFailureException; import org.mozilla.gecko.sync.InfoCollections; import org.mozilla.gecko.sync.MetaGlobal; import org.mozilla.gecko.sync.NonObjectJSONException; @@ -28,9 +30,11 @@ import org.mozilla.gecko.sync.SyncConfigurationException; import org.mozilla.gecko.sync.crypto.CryptoException; import org.mozilla.gecko.sync.crypto.KeyBundle; import org.mozilla.gecko.sync.delegates.FreshStartDelegate; +import org.mozilla.gecko.sync.delegates.GlobalSessionCallback; import org.mozilla.gecko.sync.delegates.KeyUploadDelegate; import org.mozilla.gecko.sync.delegates.WipeServerDelegate; import org.mozilla.gecko.sync.net.AuthHeaderProvider; +import org.mozilla.gecko.sync.net.SyncStorageResponse; import org.mozilla.gecko.sync.stage.FetchMetaGlobalStage; import org.mozilla.gecko.sync.stage.GlobalSyncStage.Stage; import org.simpleframework.http.Request; @@ -43,6 +47,11 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import ch.boye.httpclientandroidlib.HttpResponse; +import ch.boye.httpclientandroidlib.ProtocolVersion; +import ch.boye.httpclientandroidlib.message.BasicHttpResponse; +import ch.boye.httpclientandroidlib.message.BasicStatusLine; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -69,14 +78,7 @@ public class TestFetchMetaGlobalStage { private InfoCollections infoCollections; private KeyBundle syncKeyBundle; private MockGlobalSessionCallback callback; - private GlobalSession session; - - private boolean calledRequiresUpgrade = false; - private boolean calledProcessMissingMetaGlobal = false; - private boolean calledFreshStart = false; - private boolean calledWipeServer = false; - private boolean calledUploadKeys = false; - private boolean calledResetAllStages = false; + private LocalMockGlobalSession session; private static void assertSameContents(JSONArray expected, Set actual) { assertEquals(expected.size(), actual.size()); @@ -85,77 +87,96 @@ public class TestFetchMetaGlobalStage { } } + private class LocalMockGlobalSession extends MockGlobalSession { + private boolean calledRequiresUpgrade = false; + private boolean calledProcessMissingMetaGlobal = false; + private boolean calledFreshStart = false; + private boolean calledWipeServer = false; + private boolean calledUploadKeys = false; + private boolean calledResetAllStages = false; + private boolean calledRestart = false; + private boolean calledAbort = false; + + public LocalMockGlobalSession(String username, String password, KeyBundle keyBundle, GlobalSessionCallback callback) throws SyncConfigurationException, IllegalArgumentException, NonObjectJSONException, IOException { + super(username, password, keyBundle, callback); + } + + @Override + protected void prepareStages() { + super.prepareStages(); + withStage(Stage.fetchMetaGlobal, new FetchMetaGlobalStage()); + } + + @Override + public void requiresUpgrade() { + calledRequiresUpgrade = true; + this.abort(null, "Requires upgrade"); + } + + @Override + public void processMissingMetaGlobal(MetaGlobal mg) { + calledProcessMissingMetaGlobal = true; + this.abort(null, "Missing meta/global"); + } + + // Don't really uploadKeys. + @Override + public void uploadKeys(CollectionKeys keys, long lastModified, KeyUploadDelegate keyUploadDelegate) { + calledUploadKeys = true; + keyUploadDelegate.onKeysUploaded(); + } + + // On fresh start completed, just stop. + @Override + public void freshStart() { + calledFreshStart = true; + freshStart(this, new FreshStartDelegate() { + @Override + public void onFreshStartFailed(Exception e) { + WaitHelper.getTestWaiter().performNotify(e); + } + + @Override + public void onFreshStart() { + WaitHelper.getTestWaiter().performNotify(); + } + }); + } + + // Don't really wipeServer. + @Override + protected void wipeServer(final AuthHeaderProvider authHeaderProvider, final WipeServerDelegate wipeDelegate) { + calledWipeServer = true; + wipeDelegate.onWiped(System.currentTimeMillis()); + } + + @Override + protected void restart() throws AlreadySyncingException { + calledRestart = true; + WaitHelper.getTestWaiter().performNotify(); + } + + @Override + public void abort(Exception e, String reason) { + calledAbort = true; + super.abort(e, reason); + } + + // Don't really resetAllStages. + @Override + public void resetAllStages() { + calledResetAllStages = true; + } + } + @Before public void setUp() throws Exception { - calledRequiresUpgrade = false; - calledProcessMissingMetaGlobal = false; - calledFreshStart = false; - calledWipeServer = false; - calledUploadKeys = false; - calledResetAllStages = false; - // Set info collections to not have crypto. infoCollections = new InfoCollections(new ExtendedJSONObject(TEST_INFO_COLLECTIONS_JSON)); syncKeyBundle = new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY); callback = new MockGlobalSessionCallback(); - session = new MockGlobalSession(TEST_USERNAME, TEST_PASSWORD, - syncKeyBundle, callback) { - @Override - protected void prepareStages() { - super.prepareStages(); - withStage(Stage.fetchMetaGlobal, new FetchMetaGlobalStage()); - } - - @Override - public void requiresUpgrade() { - calledRequiresUpgrade = true; - this.abort(null, "Requires upgrade"); - } - - @Override - public void processMissingMetaGlobal(MetaGlobal mg) { - calledProcessMissingMetaGlobal = true; - this.abort(null, "Missing meta/global"); - } - - // Don't really uploadKeys. - @Override - public void uploadKeys(CollectionKeys keys, KeyUploadDelegate keyUploadDelegate) { - calledUploadKeys = true; - keyUploadDelegate.onKeysUploaded(); - } - - // On fresh start completed, just stop. - @Override - public void freshStart() { - calledFreshStart = true; - freshStart(this, new FreshStartDelegate() { - @Override - public void onFreshStartFailed(Exception e) { - WaitHelper.getTestWaiter().performNotify(e); - } - - @Override - public void onFreshStart() { - WaitHelper.getTestWaiter().performNotify(); - } - }); - } - - // Don't really wipeServer. - @Override - protected void wipeServer(final AuthHeaderProvider authHeaderProvider, final WipeServerDelegate wipeDelegate) { - calledWipeServer = true; - wipeDelegate.onWiped(System.currentTimeMillis()); - } - - // Don't really resetAllStages. - @Override - public void resetAllStages() { - calledResetAllStages = true; - } - }; + session = new LocalMockGlobalSession(TEST_USERNAME, TEST_PASSWORD, syncKeyBundle, callback); session.config.setClusterURL(new URI(TEST_CLUSTER_URL)); session.config.infoCollections = infoCollections; } @@ -185,7 +206,7 @@ public class TestFetchMetaGlobalStage { doSession(server); assertEquals(true, callback.calledError); - assertTrue(calledRequiresUpgrade); + assertTrue(session.calledRequiresUpgrade); } @SuppressWarnings("unchecked") @@ -217,8 +238,8 @@ public class TestFetchMetaGlobalStage { doSession(server); assertTrue(callback.calledSuccess); - assertFalse(calledProcessMissingMetaGlobal); - assertFalse(calledResetAllStages); + assertFalse(session.calledProcessMissingMetaGlobal); + assertFalse(session.calledResetAllStages); assertEquals(TEST_SYNC_ID, session.config.metaGlobal.getSyncID()); assertEquals(TEST_STORAGE_VERSION, session.config.metaGlobal.getStorageVersion().longValue()); assertEquals(TEST_SYNC_ID, session.config.syncID); @@ -250,8 +271,8 @@ public class TestFetchMetaGlobalStage { doSession(server); assertEquals(true, callback.calledSuccess); - assertFalse(calledProcessMissingMetaGlobal); - assertTrue(calledResetAllStages); + assertFalse(session.calledProcessMissingMetaGlobal); + assertTrue(session.calledResetAllStages); assertEquals(TEST_SYNC_ID, session.config.metaGlobal.getSyncID()); assertEquals(TEST_STORAGE_VERSION, session.config.metaGlobal.getStorageVersion().longValue()); assertEquals(TEST_SYNC_ID, session.config.syncID); @@ -299,7 +320,7 @@ public class TestFetchMetaGlobalStage { doSession(server); assertEquals(true, callback.calledError); - assertTrue(calledProcessMissingMetaGlobal); + assertTrue(session.calledProcessMissingMetaGlobal); } /** @@ -311,7 +332,7 @@ public class TestFetchMetaGlobalStage { MockServer server = new MockServer(200, TestMetaGlobal.TEST_META_GLOBAL_EMPTY_PAYLOAD_RESPONSE); doSession(server); - assertTrue(calledFreshStart); + assertTrue(session.calledFreshStart); } /** @@ -323,7 +344,7 @@ public class TestFetchMetaGlobalStage { MockServer server = new MockServer(200, TestMetaGlobal.TEST_META_GLOBAL_NO_PAYLOAD_RESPONSE); doSession(server); - assertTrue(calledFreshStart); + assertTrue(session.calledFreshStart); } /** @@ -384,11 +405,62 @@ public class TestFetchMetaGlobalStage { }; doFreshStart(server); - assertTrue(this.calledFreshStart); - assertTrue(this.calledWipeServer); - assertTrue(this.calledUploadKeys); + assertTrue(session.calledFreshStart); + assertTrue(session.calledWipeServer); + assertTrue(session.calledUploadKeys); assertTrue(mgUploaded.get()); assertFalse(mgDownloaded.get()); assertEquals(GlobalSession.STORAGE_VERSION, uploadedMg.getStorageVersion().longValue()); } + + @Test + public void testFreshStartDelegateSuccess() { + final FreshStartDelegate freshStartDelegate = GlobalSession.makeFreshStartDelegate(session); + + WaitHelper.getTestWaiter().performWait(WaitHelper.onThreadRunnable( + new Runnable() { + @Override + public void run() { + freshStartDelegate.onFreshStart(); + } + } + )); + + assertTrue(session.calledRestart); + assertFalse(session.calledAbort); + } + + @Test + public void testFreshStartDelegate412() { + final FreshStartDelegate freshStartDelegate = GlobalSession.makeFreshStartDelegate(session); + + WaitHelper.getTestWaiter().performWait(WaitHelper.onThreadRunnable( + new Runnable() { + @Override + public void run() { + freshStartDelegate.onFreshStartFailed(TestGlobalSession.makeHttpFailureException(412)); + } + } + )); + + assertTrue(session.calledRestart); + assertFalse(session.calledAbort); + } + + @Test + public void testFreshStartDelegateNon412() { + final FreshStartDelegate freshStartDelegate = GlobalSession.makeFreshStartDelegate(session); + + WaitHelper.getTestWaiter().performWait(WaitHelper.onThreadRunnable( + new Runnable() { + @Override + public void run() { + freshStartDelegate.onFreshStartFailed(TestGlobalSession.makeHttpFailureException(400)); + } + } + )); + + assertFalse(session.calledRestart); + assertTrue(session.calledAbort); + } } From e7b03d35b1f657cb79b148bff958541d29992128 Mon Sep 17 00:00:00 2001 From: Grigory Kruglov Date: Fri, 17 Mar 2017 19:09:43 -0700 Subject: [PATCH 087/169] Bug 1346438 - Specify X-I-U-S header value as 0 when uploading crypto/keys r=nalexander MozReview-Commit-ID: GTcZUdvVU8E --HG-- extra : rebase_source : 14318877ae4d52384090e99e7668e1deb19f3408 --- .../java/org/mozilla/gecko/sync/GlobalSession.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java index 770a59b88795..f3546841b5f3 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/GlobalSession.java @@ -567,14 +567,14 @@ public class GlobalSession implements HttpResponseObserver { } /** - * Upload new crypto/keys. + * Upload new crypto/keys with X-If-Unmodified-Since=0 * * @param keys * new keys. * @param keyUploadDelegate * a delegate. */ - public void uploadKeys(final CollectionKeys keys, + public void uploadKeys(final CollectionKeys keys, final long timestamp, final KeyUploadDelegate keyUploadDelegate) { SyncStorageRecordRequest request; try { @@ -588,7 +588,7 @@ public class GlobalSession implements HttpResponseObserver { @Override public String ifUnmodifiedSince() { - return null; + return Utils.millisecondsToDecimalSecondsString(timestamp); } @Override @@ -827,9 +827,10 @@ public class GlobalSession implements HttpResponseObserver { freshStartDelegate.onFreshStartFailed(null); } - // Upload new keys. + // Upload new keys. Assert that no other client uploaded keys yet by setting X-I-U-S to 0. + // See Bug 1346438. Logger.info(LOG_TAG, "Uploading new crypto/keys."); - session.uploadKeys(keys, new KeyUploadDelegate() { + session.uploadKeys(keys, 0L, new KeyUploadDelegate() { @Override public void onKeysUploaded() { Logger.info(LOG_TAG, "Uploaded new crypto/keys."); From dfa642bc63d9bd4a2ab53cdf26edff0bc1acb241 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Mon, 20 Mar 2017 19:13:42 +1100 Subject: [PATCH 088/169] Bug 1348743 - avoid running a bookmark validation on every sync. r=tcsc MozReview-Commit-ID: 49sWR56kfrj --HG-- extra : rebase_source : f13d7ef61b343820347579b76352cd65a322c8eb --- services/sync/modules/doctor.js | 2 +- services/sync/tests/unit/test_doctor.js | 47 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/services/sync/modules/doctor.js b/services/sync/modules/doctor.js index 252a7187a21d..0412dbfa0ac5 100644 --- a/services/sync/modules/doctor.js +++ b/services/sync/modules/doctor.js @@ -106,7 +106,7 @@ this.Doctor = { // Update the time now, even if we decline to actually perform a // validation. We don't want to check the rest of these more frequently // than once a day. - Svc.Prefs.set("validation.lastTime", Math.floor(nowSeconds)); + Svc.Prefs.set(prefPrefix + "validation.lastTime", Math.floor(nowSeconds)); // Validation only occurs a certain percentage of the time. let validationProbability = Svc.Prefs.get(prefPrefix + "validation.percentageChance", 0) / 100.0; diff --git a/services/sync/tests/unit/test_doctor.js b/services/sync/tests/unit/test_doctor.js index f8432d203466..25f9e33cdd8e 100644 --- a/services/sync/tests/unit/test_doctor.js +++ b/services/sync/tests/unit/test_doctor.js @@ -2,6 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const { Doctor, REPAIR_ADVANCE_PERIOD } = Cu.import("resource://services-sync/doctor.js", {}); +Cu.import("resource://gre/modules/Services.jsm"); initTestLogging("Trace"); @@ -10,6 +11,52 @@ function mockDoctor(mocks) { return Object.assign({}, Doctor, mocks); } +add_task(async function test_validation_interval() { + let now = 1000; + let doctor = mockDoctor({ + _now() { + // note that the function being mocked actually returns seconds. + return now; + }, + }); + + let engine = { + name: "test-engine", + getValidator() { + return { + validate(e) { + return {}; + } + } + }, + } + + // setup prefs which enable test-engine validation. + Services.prefs.setBoolPref("services.sync.engine.test-engine.validation.enabled", true); + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.percentageChance", 100); + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.maxRecords", 1); + // And say we should validate every 10 seconds. + Services.prefs.setIntPref("services.sync.engine.test-engine.validation.interval", 10); + + deepEqual(doctor._getEnginesToValidate([engine]), { + "test-engine": { + engine, + maxRecords: 1, + } + }); + // We haven't advanced the timestamp, so we should not validate again. + deepEqual(doctor._getEnginesToValidate([engine]), {}); + // Advance our clock by 11 seconds. + now += 11; + // We should validate again. + deepEqual(doctor._getEnginesToValidate([engine]), { + "test-engine": { + engine, + maxRecords: 1, + } + }); +}); + add_task(async function test_repairs_start() { let repairStarted = false; let problems = { From 0c09d0ce5c8b1a873e1de9056f814d8f8a9d4637 Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Mon, 20 Mar 2017 14:00:08 -0700 Subject: [PATCH 089/169] Bug 1256289 force external links to open in tabs if non-tab browser, r=kmag MozReview-Commit-ID: 3Xn6XvjZ8KG --HG-- extra : rebase_source : 7b2c4cc7b17ccdc009b5f4cd9b956e320bbcc3cb --- toolkit/components/extensions/ExtensionChild.jsm | 5 +++++ toolkit/components/extensions/ext-browser-content.js | 3 +++ 2 files changed, 8 insertions(+) diff --git a/toolkit/components/extensions/ExtensionChild.jsm b/toolkit/components/extensions/ExtensionChild.jsm index 75976bb40c6f..1961f4c2ca07 100644 --- a/toolkit/components/extensions/ExtensionChild.jsm +++ b/toolkit/components/extensions/ExtensionChild.jsm @@ -1024,6 +1024,11 @@ class ContentGlobal { this.global.removeMessageListener("Extension:InitExtensionView", this); this.viewType = data.viewType; + // Force external links to open in tabs. + if (["popup", "sidebar"].includes(this.viewType)) { + this.global.docShell.isAppTab = true; + } + if (data.devtoolsToolboxInfo) { this.devtoolsToolboxInfo = data.devtoolsToolboxInfo; } diff --git a/toolkit/components/extensions/ext-browser-content.js b/toolkit/components/extensions/ext-browser-content.js index 9c91ffa1718a..f7e80425d59a 100644 --- a/toolkit/components/extensions/ext-browser-content.js +++ b/toolkit/components/extensions/ext-browser-content.js @@ -48,6 +48,9 @@ const BrowserListener = { .allowScriptsToClose(); } + // Force external links to open in tabs. + docShell.isAppTab = true; + addEventListener("DOMWindowCreated", this, true); addEventListener("load", this, true); addEventListener("DOMContentLoaded", this, true); From 0760a8e11ee8df1f9578c6294ee384414f9739fb Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 20 Mar 2017 17:00:31 -0700 Subject: [PATCH 090/169] servo: Merge #16053 - Use AtomicRefCell instead of RwLock inside SharedRwLock for stylo (from bholley:shared_lock_atomic_refcell); r=bholley @SimonSapin wrote the original patch in [1], and I tweaked it to conditionally compile. Just waiting for the try run to come back green before landing. [1] https://bugzilla.mozilla.org/show_bug.cgi?id=1348587 Source-Repo: https://github.com/servo/servo Source-Revision: 32ca5f354030f68934e9c4f90cd5503da8ae16cc --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : bd482471ce4d95fba154fc5d0142c93e19882be7 --- servo/components/style/lib.rs | 12 ++- servo/components/style/shared_lock.rs | 128 ++++++++++++++++++-------- 2 files changed, 97 insertions(+), 43 deletions(-) diff --git a/servo/components/style/lib.rs b/servo/components/style/lib.rs index ab564c59bd80..ddb585388025 100644 --- a/servo/components/style/lib.rs +++ b/servo/components/style/lib.rs @@ -172,9 +172,15 @@ longhand_properties_idents!(reexport_computed_values); /// FIXME: Remove this and use Arc::ptr_eq once we require Rust 1.17 #[inline] pub fn arc_ptr_eq(a: &Arc, b: &Arc) -> bool { - let a: &T = &**a; - let b: &T = &**b; - (a as *const T) == (b as *const T) + ptr_eq::(&**a, &**b) +} + +/// Pointer equality +/// +/// FIXME: Remove this and use std::ptr::eq once we require Rust 1.17 +#[inline] +pub fn ptr_eq(a: *const T, b: *const T) -> bool { + a == b } /// Serializes as CSS a comma-separated list of any `T` that supports being diff --git a/servo/components/style/shared_lock.rs b/servo/components/style/shared_lock.rs index 152e2b6ba826..2dec153f3421 100644 --- a/servo/components/style/shared_lock.rs +++ b/servo/components/style/shared_lock.rs @@ -4,19 +4,38 @@ //! Different objects protected by the same lock +#[cfg(feature = "gecko")] +use atomic_refcell::{AtomicRefCell, AtomicRef, AtomicRefMut}; +#[cfg(feature = "servo")] use parking_lot::RwLock; use std::cell::UnsafeCell; use std::fmt; use std::sync::Arc; /// A shared read/write lock that can protect multiple objects. +/// +/// In Gecko builds, we don't need the blocking behavior, just the safety. As +/// such we implement this with an AtomicRefCell instead in Gecko builds, +/// which is ~2x as fast, and panics (rather than deadlocking) when things go +/// wrong (which is much easier to debug on CI). +/// +/// Servo needs the blocking behavior for its unsynchronized animation setup, +/// but that may not be web-compatible and may need to be changed (at which +/// point Servo could use AtomicRefCell too). #[derive(Clone)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SharedRwLock { + #[cfg(feature = "servo")] #[cfg_attr(feature = "servo", ignore_heap_size_of = "Arc")] arc: Arc>, + + #[cfg(feature = "gecko")] + cell: Arc>, } +#[cfg(feature = "gecko")] +struct SomethingZeroSizedButTyped; + impl fmt::Debug for SharedRwLock { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str("SharedRwLock") @@ -24,13 +43,22 @@ impl fmt::Debug for SharedRwLock { } impl SharedRwLock { - /// Create a new shared lock + /// Create a new shared lock (servo). + #[cfg(feature = "servo")] pub fn new() -> Self { SharedRwLock { arc: Arc::new(RwLock::new(())) } } + /// Create a new shared lock (gecko). + #[cfg(feature = "gecko")] + pub fn new() -> Self { + SharedRwLock { + cell: Arc::new(AtomicRefCell::new(SomethingZeroSizedButTyped)) + } + } + /// Wrap the given data to make its access protected by this lock. pub fn wrap(&self, data: T) -> Locked { Locked { @@ -39,19 +67,63 @@ impl SharedRwLock { } } - /// Obtain the lock for reading + /// Obtain the lock for reading (servo). + #[cfg(feature = "servo")] pub fn read(&self) -> SharedRwLockReadGuard { self.arc.raw_read(); - SharedRwLockReadGuard { - shared_lock: self - } + SharedRwLockReadGuard(self) } - /// Obtain the lock for writing + /// Obtain the lock for reading (gecko). + #[cfg(feature = "gecko")] + pub fn read(&self) -> SharedRwLockReadGuard { + SharedRwLockReadGuard(self.cell.borrow()) + } + + /// Obtain the lock for writing (servo). + #[cfg(feature = "servo")] pub fn write(&self) -> SharedRwLockWriteGuard { self.arc.raw_write(); - SharedRwLockWriteGuard { - shared_lock: self + SharedRwLockWriteGuard(self) + } + + /// Obtain the lock for writing (gecko). + #[cfg(feature = "gecko")] + pub fn write(&self) -> SharedRwLockWriteGuard { + SharedRwLockWriteGuard(self.cell.borrow_mut()) + } +} + +/// Proof that a shared lock was obtained for reading (servo). +#[cfg(feature = "servo")] +pub struct SharedRwLockReadGuard<'a>(&'a SharedRwLock); +/// Proof that a shared lock was obtained for writing (gecko). +#[cfg(feature = "gecko")] +pub struct SharedRwLockReadGuard<'a>(AtomicRef<'a, SomethingZeroSizedButTyped>); +#[cfg(feature = "servo")] +impl<'a> Drop for SharedRwLockReadGuard<'a> { + fn drop(&mut self) { + // Unsafe: self.lock is private to this module, only ever set after `raw_read()`, + // and never copied or cloned (see `compile_time_assert` below). + unsafe { + self.0.arc.raw_unlock_read() + } + } +} + +/// Proof that a shared lock was obtained for writing (servo). +#[cfg(feature = "servo")] +pub struct SharedRwLockWriteGuard<'a>(&'a SharedRwLock); +/// Proof that a shared lock was obtained for writing (gecko). +#[cfg(feature = "gecko")] +pub struct SharedRwLockWriteGuard<'a>(AtomicRefMut<'a, SomethingZeroSizedButTyped>); +#[cfg(feature = "servo")] +impl<'a> Drop for SharedRwLockWriteGuard<'a> { + fn drop(&mut self) { + // Unsafe: self.lock is private to this module, only ever set after `raw_write()`, + // and never copied or cloned (see `compile_time_assert` below). + unsafe { + self.0.arc.raw_unlock_write() } } } @@ -75,13 +147,19 @@ impl fmt::Debug for Locked { } impl Locked { + #[cfg(feature = "servo")] fn same_lock_as(&self, lock: &SharedRwLock) -> bool { ::arc_ptr_eq(&self.shared_lock.arc, &lock.arc) } + #[cfg(feature = "gecko")] + fn same_lock_as(&self, derefed_guard: &SomethingZeroSizedButTyped) -> bool { + ::ptr_eq(self.shared_lock.cell.as_ptr(), derefed_guard) + } + /// Access the data for reading. pub fn read_with<'a>(&'a self, guard: &'a SharedRwLockReadGuard) -> &'a T { - assert!(self.same_lock_as(&guard.shared_lock), + assert!(self.same_lock_as(&guard.0), "Locked::read_with called with a guard from an unrelated SharedRwLock"); let ptr = self.data.get(); @@ -98,7 +176,7 @@ impl Locked { /// Access the data for writing. pub fn write_with<'a>(&'a self, guard: &'a mut SharedRwLockWriteGuard) -> &'a mut T { - assert!(self.same_lock_as(&guard.shared_lock), + assert!(self.same_lock_as(&guard.0), "Locked::write_with called with a guard from an unrelated SharedRwLock"); let ptr = self.data.get(); @@ -116,36 +194,6 @@ impl Locked { } } -/// Proof that a shared lock was obtained for reading. -pub struct SharedRwLockReadGuard<'a> { - shared_lock: &'a SharedRwLock, -} - -/// Proof that a shared lock was obtained for writing. -pub struct SharedRwLockWriteGuard<'a> { - shared_lock: &'a SharedRwLock, -} - -impl<'a> Drop for SharedRwLockReadGuard<'a> { - fn drop(&mut self) { - // Unsafe: self.lock is private to this module, only ever set after `raw_read()`, - // and never copied or cloned (see `compile_time_assert` below). - unsafe { - self.shared_lock.arc.raw_unlock_read() - } - } -} - -impl<'a> Drop for SharedRwLockWriteGuard<'a> { - fn drop(&mut self) { - // Unsafe: self.lock is private to this module, only ever set after `raw_write()`, - // and never copied or cloned (see `compile_time_assert` below). - unsafe { - self.shared_lock.arc.raw_unlock_write() - } - } -} - #[allow(dead_code)] mod compile_time_assert { use super::{SharedRwLockReadGuard, SharedRwLockWriteGuard}; From e4ec1eb1d3d3ce7a7858350ec484713d589fa2f2 Mon Sep 17 00:00:00 2001 From: Edouard Oger Date: Wed, 15 Mar 2017 17:12:17 -0400 Subject: [PATCH 091/169] Bug 1343735 - Respect max_record_payload_bytes limit. r=markh MozReview-Commit-ID: 1aDwl1cq2Hh --HG-- extra : rebase_source : a29abc5c1f3b9eefea26fe93b5ee82f4b3d12924 --- services/sync/modules/constants.js | 4 ++ services/sync/modules/engines.js | 15 +++++++ services/sync/modules/engines/tabs.js | 10 ++--- .../sync/tests/unit/test_syncengine_sync.js | 44 +++++++++++++++---- services/sync/tests/unit/test_tab_store.js | 4 +- 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/services/sync/modules/constants.js b/services/sync/modules/constants.js index fcb0f717b3a1..c1dd1481ebff 100644 --- a/services/sync/modules/constants.js +++ b/services/sync/modules/constants.js @@ -78,6 +78,10 @@ APPS_STORE_BATCH_SIZE: 50, // same as MOBILE_BATCH_SIZE // (how many records are fetched at a time from the server when batching is used). DEFAULT_DOWNLOAD_BATCH_SIZE: 1000, + +// Default maximum size for a record payload +DEFAULT_MAX_RECORD_PAYLOAD_BYTES: 262144, // 256KB + // score thresholds for early syncs SINGLE_USER_THRESHOLD: 1000, MULTI_DEVICE_THRESHOLD: 300, diff --git a/services/sync/modules/engines.js b/services/sync/modules/engines.js index 825d92fa3526..9dc71f3cb30c 100644 --- a/services/sync/modules/engines.js +++ b/services/sync/modules/engines.js @@ -931,6 +931,14 @@ SyncEngine.prototype = { Svc.Prefs.set(this.name + ".lastSyncLocal", value.toString()); }, + get maxRecordPayloadBytes() { + let serverConfiguration = this.service.serverConfiguration; + if (serverConfiguration && serverConfiguration.max_record_payload_bytes) { + return serverConfiguration.max_record_payload_bytes; + } + return DEFAULT_MAX_RECORD_PAYLOAD_BYTES; + }, + /* * Returns a changeset for this sync. Engine implementations can override this * method to bypass the tracker for certain or all changed items. @@ -1633,6 +1641,13 @@ SyncEngine.prototype = { this._log.trace("Outgoing: " + out); out.encrypt(this.service.collectionKeys.keyForCollection(this.name)); + let payloadLength = JSON.stringify(out.payload).length; + if (payloadLength > this.maxRecordPayloadBytes) { + if (this.allowSkippedRecord) { + this._modified.delete(id); // Do not attempt to sync that record again + } + throw new Error(`Payload too big: ${payloadLength} bytes`); + } ok = true; } catch (ex) { this._log.warn("Error creating record", ex); diff --git a/services/sync/modules/engines/tabs.js b/services/sync/modules/engines/tabs.js index bf2142d1aa86..0432b2ec4a56 100644 --- a/services/sync/modules/engines/tabs.js +++ b/services/sync/modules/engines/tabs.js @@ -210,13 +210,11 @@ TabStore.prototype = { }); // Figure out how many tabs we can pack into a payload. - // See bug 535326 comment 8 for an explanation of the estimation - // If the server configuration is absent, we use the old max payload size of 28K - let size = JSON.stringify(tabs).length; + // We use byteLength here because the data is not encrypted in ascii yet. + let size = new TextEncoder("utf-8").encode(JSON.stringify(tabs)).byteLength; let origLength = tabs.length; - const MAX_TAB_SIZE = (this.engine.service.serverConfiguration ? - this.engine.service.serverConfiguration.max_record_payload_bytes : - 28672) / 4 * 3 - 1500; + // See bug 535326 comment 8 for an explanation of the estimation + const MAX_TAB_SIZE = this.engine.maxRecordPayloadBytes / 4 * 3 - 1500; if (size > MAX_TAB_SIZE) { // Estimate a little more than the direct fraction to maximize packing let cutoff = Math.ceil(tabs.length * MAX_TAB_SIZE / size); diff --git a/services/sync/tests/unit/test_syncengine_sync.js b/services/sync/tests/unit/test_syncengine_sync.js index 9b5bfc4b273f..c3646f8eef9f 100644 --- a/services/sync/tests/unit/test_syncengine_sync.js +++ b/services/sync/tests/unit/test_syncengine_sync.js @@ -1343,8 +1343,8 @@ add_task(async function test_uploadOutgoing_toEmptyServer() { } }); - -add_task(async function test_uploadOutgoing_huge() { +async function test_uploadOutgoing_max_record_payload_bytes(allowSkippedRecord) { + _("SyncEngine._uploadOutgoing throws when payload is bigger than max_record_payload_bytes"); let collection = new ServerCollection(); collection._wbos.flying = new ServerWBO("flying"); collection._wbos.scotsman = new ServerWBO("scotsman"); @@ -1352,17 +1352,19 @@ add_task(async function test_uploadOutgoing_huge() { let server = sync_httpd_setup({ "/1.1/foo/storage/rotary": collection.handler(), "/1.1/foo/storage/rotary/flying": collection.wbo("flying").handler(), + "/1.1/foo/storage/rotary/scotsman": collection.wbo("scotsman").handler(), }); await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let engine = makeRotaryEngine(); - engine.allowSkippedRecord = true; + engine.allowSkippedRecord = allowSkippedRecord; engine.lastSync = 1; - engine._store.items = { flying: "a".repeat(1024 * 1024) }; + engine._store.items = { flying: "a".repeat(1024 * 1024), scotsman: "abcd" }; engine._tracker.addChangedID("flying", 1000); + engine._tracker.addChangedID("scotsman", 1000); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1370,23 +1372,49 @@ add_task(async function test_uploadOutgoing_huge() { syncID: engine.syncID}}; try { - // Confirm initial environment do_check_eq(engine.lastSyncLocal, 0); do_check_eq(collection.payload("flying"), undefined); + do_check_eq(collection.payload("scotsman"), undefined); engine._syncStartup(); engine._uploadOutgoing(); + + if (!allowSkippedRecord) { + do_throw("should not get here"); + } + engine.trackRemainingChanges(); - // Check we didn't upload to the server - do_check_eq(collection.payload("flying"), undefined); - // And that we won't try to upload it again next time. + // Check we uploaded the other record to the server + do_check_true(collection.payload("scotsman")); + // And that we won't try to upload the huge record next time. do_check_eq(engine._tracker.changedIDs["flying"], undefined); + } catch (e) { + if (allowSkippedRecord) { + do_throw("should not get here"); + } + + engine.trackRemainingChanges(); + + // Check that we will try to upload the huge record next time + do_check_eq(engine._tracker.changedIDs["flying"], 1000); } finally { + // Check we didn't upload the oversized record to the server + do_check_eq(collection.payload("flying"), undefined); await cleanAndGo(engine, server); } +} + + +add_task(async function test_uploadOutgoing_max_record_payload_bytes_disallowSkippedRecords() { + return test_uploadOutgoing_max_record_payload_bytes(false); +}); + + +add_task(async function test_uploadOutgoing_max_record_payload_bytes_allowSkippedRecords() { + return test_uploadOutgoing_max_record_payload_bytes(true); }); diff --git a/services/sync/tests/unit/test_tab_store.js b/services/sync/tests/unit/test_tab_store.js index 20d148fc49f8..ad40fd866ff9 100644 --- a/services/sync/tests/unit/test_tab_store.js +++ b/services/sync/tests/unit/test_tab_store.js @@ -93,7 +93,7 @@ function test_createRecord() { store.shouldSkipWindow = mockShouldSkipWindow; store.getWindowEnumerator = mockGetWindowEnumerator.bind(this, "http://foo.com", 1, 1); - let numtabs = Math.ceil(20000. / 77.); + let numtabs = 2600; // Note: this number is connected to DEFAULT_MAX_RECORD_PAYLOAD_BYTES store.getWindowEnumerator = mockGetWindowEnumerator.bind(this, "http://foo.com", 1, 1); record = store.createRecord("fake-guid"); @@ -104,7 +104,7 @@ function test_createRecord() { store.getWindowEnumerator = mockGetWindowEnumerator.bind(this, "http://foo.com", 1, numtabs); record = store.createRecord("fake-guid"); ok(record instanceof TabSetRecord); - equal(record.tabs.length, 256); + equal(record.tabs.length, 2501); } function run_test() { From 96685b05f7c7ab793a62c50f7ce6815963c8bf2c Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 20 Mar 2017 17:08:15 +0800 Subject: [PATCH 092/169] Bug 1348746 - stylo: Only eagerly style newly appended children from bindings when the pres shell has been initialized. r=bholley MozReview-Commit-ID: 9kxbgiw78AB --HG-- extra : rebase_source : e3b05c4cc79d8b7d3026030d5514b4e18d954a9b --- dom/xbl/nsXBLService.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dom/xbl/nsXBLService.cpp b/dom/xbl/nsXBLService.cpp index 497245b4d5a9..481af11a4f8f 100644 --- a/dom/xbl/nsXBLService.cpp +++ b/dom/xbl/nsXBLService.cpp @@ -416,8 +416,10 @@ public: ~AutoStyleNewChildren() { nsIPresShell* presShell = mElement->OwnerDoc()->GetShell(); - ServoStyleSet* servoSet = presShell ? presShell->StyleSet()->GetAsServo() : nullptr; - if (servoSet) { + if (!presShell || !presShell->DidInitialize()) { + return; + } + if (ServoStyleSet* servoSet = presShell->StyleSet()->GetAsServo()) { // In general the element is always styled by the time we're applying XBL // bindings, because we need to style the element to know what the binding // URI is. However, programmatic consumers of the XBL service (like the From 01cb0c2850681e859c6a307e241fb1d4a5948bee Mon Sep 17 00:00:00 2001 From: Jeremy Chen Date: Tue, 21 Mar 2017 09:15:08 +0800 Subject: [PATCH 093/169] Bug 1348899 - update devtools' property db for CSS3 multicol column-span. r=dholbert This patch is auto generated by 'mach devtools-css-db' after we implemented the style-system support for CSS3 multicol column-span in Bug 1339298. MozReview-Commit-ID: 5Dl8BTHCHu5 --HG-- extra : rebase_source : 2190c5de3a2f0b02b82eebc9db1ceb33f0c768d5 --- devtools/shared/css/generated/properties-db.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/devtools/shared/css/generated/properties-db.js b/devtools/shared/css/generated/properties-db.js index 32e94ea0e41e..311211cca70d 100644 --- a/devtools/shared/css/generated/properties-db.js +++ b/devtools/shared/css/generated/properties-db.js @@ -2865,6 +2865,7 @@ exports.CSS_PROPERTIES = { "column-rule-color", "column-rule-style", "column-rule-width", + "column-span", "column-width", "contain", "content", @@ -9346,6 +9347,10 @@ exports.PREFERENCES = [ "color-adjust", "layout.css.color-adjust.enabled" ], + [ + "column-span", + "layout.css.column-span.enabled" + ], [ "contain", "layout.css.contain.enabled" From 8ea323865aa23ffc09d27c7ce29b2553e9859f7f Mon Sep 17 00:00:00 2001 From: bechen Date: Mon, 20 Mar 2017 16:32:16 +0800 Subject: [PATCH 094/169] Bug 1347829 - If the timestamp "<00:00.005" missing the last ">" character, we still parse it. r=alwu MozReview-Commit-ID: KzW1uTSyDE --HG-- extra : rebase_source : e1543cdc26d4d19d30582827cfd7d8f2961c59cb --- dom/media/webvtt/vtt.jsm | 2 +- .../cue-text-parsing/tests/entities.html.ini | 23 ------------------- .../cue-text-parsing/tests/tags.html.ini | 23 ------------------- .../tests/timestamps.html.ini | 8 ------- 4 files changed, 1 insertion(+), 55 deletions(-) delete mode 100644 testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/entities.html.ini delete mode 100644 testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/tags.html.ini delete mode 100644 testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/timestamps.html.ini diff --git a/dom/media/webvtt/vtt.jsm b/dom/media/webvtt/vtt.jsm index 545fdbe31d73..3b3596bcbaf3 100644 --- a/dom/media/webvtt/vtt.jsm +++ b/dom/media/webvtt/vtt.jsm @@ -404,7 +404,7 @@ Cu.import('resource://gre/modules/Services.jsm'); // Otherwise just ignore the end tag. continue; } - var ts = collectTimeStamp(t.substr(1, t.length - 2)); + var ts = collectTimeStamp(t.substr(1, t.length - 1)); var node; if (ts) { // Timestamps are lead nodes as well. diff --git a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/entities.html.ini b/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/entities.html.ini deleted file mode 100644 index a0919d68df50..000000000000 --- a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/entities.html.ini +++ /dev/null @@ -1,23 +0,0 @@ -[entities.html] - type: testharness - disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1307710 - expected: - if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH - if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT - if not debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT - if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH - if not debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT - if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH - if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH - if not debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH - if debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT - if not debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): CRASH - if not debug and not e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): CRASH - if debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT - if not debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT - if debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): CRASH - if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH diff --git a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/tags.html.ini b/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/tags.html.ini deleted file mode 100644 index 869a22ada9cd..000000000000 --- a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/tags.html.ini +++ /dev/null @@ -1,23 +0,0 @@ -[tags.html] - type: testharness - disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1307710 - expected: - if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH - if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT - if not debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT - if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH - if not debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT - if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH - if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH - if not debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH - if debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT - if not debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): CRASH - if not debug and not e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): CRASH - if debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT - if not debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT - if debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT - if debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): CRASH - if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH diff --git a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/timestamps.html.ini b/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/timestamps.html.ini deleted file mode 100644 index 848b24b48f35..000000000000 --- a/testing/web-platform/meta/webvtt/parsing/cue-text-parsing/tests/timestamps.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[timestamps.html] - type: testharness - [WebVTT cue data parser test timestamps - 47fa4306a695161da88533d456ce94829e53b13d] - expected: FAIL - - [WebVTT cue data parser test timestamps - c1036a4322c1852e02e5a1843a9a81dfca6d7af3] - expected: FAIL - From ff52bccbba0d57f410a3436f273ccc10d52bcb7e Mon Sep 17 00:00:00 2001 From: Elliott Pardee Date: Mon, 20 Mar 2017 20:15:31 -0700 Subject: [PATCH 095/169] servo: Merge #16054 - Making a few lines in layout_wrapper.rs a bit nicer, fixing #15811 (from vypr:master); r=Wafflespeanut Source-Repo: https://github.com/servo/servo Source-Revision: 3b15efd2ba72a69520320da99de9f1a0b4100d53 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : ebe4acd4396b35a4f476c803b2c3ca54dfad9306 --- servo/components/script/layout_wrapper.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/servo/components/script/layout_wrapper.rs b/servo/components/script/layout_wrapper.rs index 36aa7601d0bf..bd21212f23c7 100644 --- a/servo/components/script/layout_wrapper.rs +++ b/servo/components/script/layout_wrapper.rs @@ -933,11 +933,12 @@ impl Iterator for ThreadSafeLayoutNodeChildrenIterator Date: Mon, 6 Mar 2017 17:43:11 +0800 Subject: [PATCH 096/169] Bug 1325054 - Defer any possible connection establishment in BeginConnect until knowing if it's a tracker. r=dragana MozReview-Commit-ID: 59MzYAVlr6i --HG-- extra : rebase_source : feb16165876888aac853a9d4c1bb27b553134715 extra : source : bccd6272229ba5a6f4813cd9d54d52a3e19d9fd2 --- netwerk/protocol/http/nsHttpChannel.cpp | 198 +++++++++++++++++------- netwerk/protocol/http/nsHttpChannel.h | 17 +- 2 files changed, 155 insertions(+), 60 deletions(-) diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp index 43e4e31d2b9a..f6ce07f4d8ac 100644 --- a/netwerk/protocol/http/nsHttpChannel.cpp +++ b/netwerk/protocol/http/nsHttpChannel.cpp @@ -5876,6 +5876,84 @@ nsHttpChannel::AsyncOpen(nsIStreamListener *listener, nsISupports *context) return NS_OK; } +namespace { + +class InitLocalBlockListXpcCallback final : public nsIURIClassifierCallback { +public: + using CallbackType = nsHttpChannel::InitLocalBlockListCallback; + + explicit InitLocalBlockListXpcCallback(const CallbackType& aCallback) + : mCallback(aCallback) + { + } + + NS_DECL_ISUPPORTS + NS_DECL_NSIURICLASSIFIERCALLBACK + +private: + ~InitLocalBlockListXpcCallback() = default; + + CallbackType mCallback; +}; + +NS_IMPL_ISUPPORTS(InitLocalBlockListXpcCallback, nsIURIClassifierCallback) + +/*virtual*/ nsresult +InitLocalBlockListXpcCallback::OnClassifyComplete(nsresult /*aErrorCode*/, + const nsACString& aLists, // Only this matters. + const nsACString& /*aProvider*/, + const nsACString& /*aPrefix*/) +{ + bool localBlockList = !aLists.IsEmpty(); + mCallback(localBlockList); + return NS_OK; +} + +} // end of unnamed namespace/ + +bool +nsHttpChannel::InitLocalBlockList(const InitLocalBlockListCallback& aCallback) +{ + mLocalBlocklist = false; + + if (!(mLoadFlags & LOAD_CLASSIFY_URI)) { + return false; + } + + // Check to see if this principal exists on local blocklists. + nsCOMPtr classifier = do_GetService(NS_URICLASSIFIERSERVICE_CONTRACTID); + RefPtr channelClassifier = new nsChannelClassifier(this); + bool tpEnabled = false; + channelClassifier->ShouldEnableTrackingProtection(&tpEnabled); + if (!classifier || !tpEnabled) { + return false; + } + + // We skip speculative connections by setting mLocalBlocklist only + // when tracking protection is enabled. Though we could do this for + // both phishing and malware, it is not necessary for correctness, + // since no network events will be received while the + // nsChannelClassifier is in progress. See bug 1122691. + nsCOMPtr uri; + nsresult rv = GetURI(getter_AddRefs(uri)); + if (NS_FAILED(rv) || !uri) { + return false; + } + + nsAutoCString tables; + Preferences::GetCString("urlclassifier.trackingTable", &tables); + nsTArray results; + + RefPtr xpcCallback + = new InitLocalBlockListXpcCallback(aCallback); + rv = classifier->AsyncClassifyLocalWithTables(uri, tables, xpcCallback); + if (NS_FAILED(rv)) { + return false; + } + + return true; +} + NS_IMETHODIMP nsHttpChannel::AsyncOpen2(nsIStreamListener *aListener) { @@ -6030,42 +6108,6 @@ nsHttpChannel::BeginConnect() if (mAPIRedirectToURI) { return AsyncCall(&nsHttpChannel::HandleAsyncAPIRedirect); } - // Check to see if this principal exists on local blocklists. - RefPtr channelClassifier = new nsChannelClassifier(this); - if (mLoadFlags & LOAD_CLASSIFY_URI) { - nsCOMPtr classifier = do_GetService(NS_URICLASSIFIERSERVICE_CONTRACTID); - bool tpEnabled = false; - channelClassifier->ShouldEnableTrackingProtection(&tpEnabled); - if (classifier && tpEnabled) { - // We skip speculative connections by setting mLocalBlocklist only - // when tracking protection is enabled. Though we could do this for - // both phishing and malware, it is not necessary for correctness, - // since no network events will be received while the - // nsChannelClassifier is in progress. See bug 1122691. - - // We cannot check the entity whitelist here (IsTrackerWhitelisted()) - // because that method is asynchronous and we need to run - // synchronously here. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=1100024#c2. - nsCOMPtr uri; - rv = GetURI(getter_AddRefs(uri)); - if (NS_SUCCEEDED(rv) && uri) { - nsAutoCString tables; - Preferences::GetCString("urlclassifier.trackingTable", &tables); - nsTArray results; - rv = classifier->ClassifyLocalWithTables(uri, tables, results); - if (NS_SUCCEEDED(rv) && !results.IsEmpty()) { - LOG(("nsHttpChannel::ClassifyLocalWithTables found " - "uri on local tracking blocklist [this=%p]", - this)); - mLocalBlocklist = true; - } else { - LOG(("nsHttpChannel::ClassifyLocalWithTables no result " - "found [this=%p]", this)); - } - } - } - } // If mTimingEnabled flag is not set after OnModifyRequest() then // clear the already recorded AsyncOpen value for consistency. @@ -6078,28 +6120,6 @@ nsHttpChannel::BeginConnect() if (mLoadFlags & VALIDATE_ALWAYS || BYPASS_LOCAL_CACHE(mLoadFlags)) mCaps |= NS_HTTP_REFRESH_DNS; - if (!mLocalBlocklist && !mConnectionInfo->UsingHttpProxy() && - !(mLoadFlags & (LOAD_NO_NETWORK_IO | LOAD_ONLY_FROM_CACHE))) { - // Start a DNS lookup very early in case the real open is queued the DNS can - // happen in parallel. Do not do so in the presence of an HTTP proxy as - // all lookups other than for the proxy itself are done by the proxy. - // Also we don't do a lookup if the LOAD_NO_NETWORK_IO or - // LOAD_ONLY_FROM_CACHE flags are set. - // - // We keep the DNS prefetch object around so that we can retrieve - // timing information from it. There is no guarantee that we actually - // use the DNS prefetch data for the real connection, but as we keep - // this data around for 3 minutes by default, this should almost always - // be correct, and even when it isn't, the timing still represents _a_ - // valid DNS lookup timing for the site, even if it is not _the_ - // timing we used. - LOG(("nsHttpChannel::BeginConnect [this=%p] prefetching%s\n", - this, mCaps & NS_HTTP_REFRESH_DNS ? ", refresh requested" : "")); - mDNSPrefetch = new nsDNSPrefetch(mURI, originAttributes, - this, mTimingEnabled); - mDNSPrefetch->PrefetchHigh(mCaps & NS_HTTP_REFRESH_DNS); - } - // Adjust mCaps according to our request headers: // - If "Connection: close" is set as a request header, then do not bother // trying to establish a keep-alive connection. @@ -6152,6 +6172,65 @@ nsHttpChannel::BeginConnect() return ContinueBeginConnectWithResult(); } + // We are about to do a async lookup to check if the URI is a + // tracker. The result will be delivered along with the callback. + // Chances are the lookup is not needed so InitLocalBlockList() + // will return false and then we can BeginConnectActual() right away. + RefPtr self = this; + bool willCallback = InitLocalBlockList([self](bool aLocalBlockList) -> void { + self->mLocalBlocklist = aLocalBlockList; + nsresult rv = self->BeginConnectActual(); + if (NS_FAILED(rv)) { + // Since this error is thrown asynchronously so that the caller + // of BeginConnect() will not do clean up for us. We have to do + // it on our own. + self->CloseCacheEntry(false); + Unused << self->AsyncAbort(rv); + } + }); + + if (!willCallback) { + // We can do BeginConnectActual immediately if mLocalBlockList is initialized + // synchronously. Note that we don't need to handle the failure because + // BeginConnect() will return synchronously and the caller will be responsible + // for handling it. + return BeginConnectActual(); + } + + return NS_OK; +} + +nsresult +nsHttpChannel::BeginConnectActual() +{ + if (mCanceled) { + return mStatus; + } + + if (!mLocalBlocklist && !mConnectionInfo->UsingHttpProxy() && + !(mLoadFlags & (LOAD_NO_NETWORK_IO | LOAD_ONLY_FROM_CACHE))) { + // Start a DNS lookup very early in case the real open is queued the DNS can + // happen in parallel. Do not do so in the presence of an HTTP proxy as + // all lookups other than for the proxy itself are done by the proxy. + // Also we don't do a lookup if the LOAD_NO_NETWORK_IO or + // LOAD_ONLY_FROM_CACHE flags are set. + // + // We keep the DNS prefetch object around so that we can retrieve + // timing information from it. There is no guarantee that we actually + // use the DNS prefetch data for the real connection, but as we keep + // this data around for 3 minutes by default, this should almost always + // be correct, and even when it isn't, the timing still represents _a_ + // valid DNS lookup timing for the site, even if it is not _the_ + // timing we used. + LOG(("nsHttpChannel::BeginConnect [this=%p] prefetching%s\n", + this, mCaps & NS_HTTP_REFRESH_DNS ? ", refresh requested" : "")); + OriginAttributes originAttributes; + NS_GetOriginAttributes(this, originAttributes); + mDNSPrefetch = new nsDNSPrefetch(mURI, originAttributes, + this, mTimingEnabled); + mDNSPrefetch->PrefetchHigh(mCaps & NS_HTTP_REFRESH_DNS); + } + // mLocalBlocklist is true only if tracking protection is enabled and the // URI is a tracking domain, it makes no guarantees about phishing or // malware, so if LOAD_CLASSIFY_URI is true we must call @@ -6161,7 +6240,7 @@ nsHttpChannel::BeginConnect() // Here we call ContinueBeginConnectWithResult and not // ContinueBeginConnect so that in the case of an error we do not start // channelClassifier. - rv = ContinueBeginConnectWithResult(); + nsresult rv = ContinueBeginConnectWithResult(); if (NS_FAILED(rv)) { return rv; } @@ -6171,6 +6250,7 @@ nsHttpChannel::BeginConnect() // been called, after optionally cancelling the channel once we have a // remote verdict. We call a concrete class instead of an nsI* that might // be overridden. + RefPtr channelClassifier = new nsChannelClassifier(this); LOG(("nsHttpChannel::Starting nsChannelClassifier %p [this=%p]", channelClassifier.get(), this)); channelClassifier->Start(); diff --git a/netwerk/protocol/http/nsHttpChannel.h b/netwerk/protocol/http/nsHttpChannel.h index 2dafba383374..db3a020693aa 100644 --- a/netwerk/protocol/http/nsHttpChannel.h +++ b/netwerk/protocol/http/nsHttpChannel.h @@ -188,6 +188,8 @@ public: public: /* internal necko use only */ + using InitLocalBlockListCallback = std::function; + void InternalSetUploadStream(nsIInputStream *uploadStream) { mUploadStream = uploadStream; } void SetUploadStreamHasHeaders(bool hasHeaders) @@ -293,7 +295,18 @@ private: typedef nsresult (nsHttpChannel::*nsContinueRedirectionFunc)(nsresult result); bool RequestIsConditional(); - MOZ_MUST_USE nsresult BeginConnect(); + + // Connections will only be established in this function. + // (including DNS prefetch and speculative connection.) + nsresult BeginConnectActual(); + + // We might synchronously or asynchronously call BeginConnectActual, + // which includes DNS prefetch and speculative connection, according to + // whether an async tracker lookup is required. If the tracker lookup + // is required, this funciton will just return NS_OK and BeginConnectActual() + // will be called when callback. See Bug 1325054 for more information. + nsresult BeginConnect(); + MOZ_MUST_USE nsresult ContinueBeginConnectWithResult(); void ContinueBeginConnect(); MOZ_MUST_USE nsresult Connect(); @@ -326,6 +339,8 @@ private: MOZ_MUST_USE nsresult ContinueOnStartRequest2(nsresult); MOZ_MUST_USE nsresult ContinueOnStartRequest3(nsresult); + bool InitLocalBlockList(const InitLocalBlockListCallback& aCallback); + // redirection specific methods void HandleAsyncRedirect(); void HandleAsyncAPIRedirect(); From 7e5ea646a59889f7546343f8ec51d057246d6b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 20 Mar 2017 03:43:26 -0700 Subject: [PATCH 097/169] servo: Merge #16035 - stylo: Sequentialize binding generation if logging is enabled (from emilio:parallel-log-no-fun); r=upsuper Otherwise the log is useless, and it's even slower than in parallel mode due to the high lock contention. Source-Repo: https://github.com/servo/servo Source-Revision: 9fdebf0934bd4fa97414756b9690a88ae63a991c --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 3fd4179805755770bf77025d697e7ddb7227d32c --- servo/components/style/build_gecko.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/servo/components/style/build_gecko.rs b/servo/components/style/build_gecko.rs index a217c6fe0332..15a9d06dc023 100644 --- a/servo/components/style/build_gecko.rs +++ b/servo/components/style/build_gecko.rs @@ -772,17 +772,22 @@ mod bindings { pub fn generate() { use self::common::*; - use std::fs; - use std::thread; + use std::{env, fs, thread}; println!("cargo:rerun-if-changed=build_gecko.rs"); fs::create_dir_all(&*OUTDIR_PATH).unwrap(); bindings::setup_logging(); - let threads = vec![ - thread::spawn(|| bindings::generate_structs(BuildType::Debug)), - thread::spawn(|| bindings::generate_structs(BuildType::Release)), - thread::spawn(|| bindings::generate_bindings()), - ]; - for t in threads.into_iter() { - t.join().unwrap(); + if env::var("STYLO_BUILD_LOG").is_ok() { + bindings::generate_structs(BuildType::Debug); + bindings::generate_structs(BuildType::Release); + bindings::generate_bindings(); + } else { + let threads = vec![ + thread::spawn(|| bindings::generate_structs(BuildType::Debug)), + thread::spawn(|| bindings::generate_structs(BuildType::Release)), + thread::spawn(|| bindings::generate_bindings()), + ]; + for t in threads.into_iter() { + t.join().unwrap(); + } } } From 405f2f52de7de5a3d9e2771c0d8a2ee937c4fe81 Mon Sep 17 00:00:00 2001 From: Thomas Nguyen Date: Mon, 20 Mar 2017 14:43:08 +0800 Subject: [PATCH 098/169] Bug 1345569 - Get blocked info from content when clicking report false deceiptive site from xul browser. r=francois MozReview-Commit-ID: GXkbjfOrnHX --HG-- extra : rebase_source : 7130d656b0dfd2f0cbc64227657347efdce54036 --- browser/base/content/browser.js | 29 +++++++++++ browser/base/content/content.js | 50 +++++++++++-------- .../base/content/report-phishing-overlay.xul | 2 +- .../safebrowsing/safebrowsing.properties | 6 +++ browser/locales/jar.mn | 1 + .../url-classifier/SafeBrowsing.jsm | 4 +- 6 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 browser/locales/en-US/chrome/browser/safebrowsing/safebrowsing.properties diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 5ceca60efb10..60434b687b15 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -6680,6 +6680,35 @@ function BrowserOpenSyncTabs() { gSyncUI.openSyncedTabsPanel(); } +function ReportFalseDeceptiveSite() { + let docURI = gBrowser.selectedBrowser.documentURI; + let isPhishingPage = + docURI && docURI.spec.startsWith("about:blocked?e=deceptiveBlocked"); + + if (isPhishingPage) { + let mm = gBrowser.selectedBrowser.messageManager; + let onMessage = (message) => { + mm.removeMessageListener("DeceptiveBlockedDetails:Result", onMessage); + let reportUrl = gSafeBrowsing.getReportURL("PhishMistake", message.data.blockedInfo); + if (reportUrl) { + openUILinkIn(reportUrl, "tab"); + } else { + let promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"]. + getService(Ci.nsIPromptService); + let bundle = + Services.strings.createBundle("chrome://browser/locale/safebrowsing/safebrowsing.properties"); + promptService.alert(window, + bundle.GetStringFromName("errorReportFalseDeceptiveTitle"), + bundle.formatStringFromName("errorReportFalseDeceptiveMessage", + [message.data.blockedInfo.provider], 1)); + } + } + mm.addMessageListener("DeceptiveBlockedDetails:Result", onMessage); + + mm.sendAsyncMessage("DeceptiveBlockedDetails"); + } +} + /** * Format a URL * eg: diff --git a/browser/base/content/content.js b/browser/base/content/content.js index 1be217b95de6..f34d11f9a323 100644 --- a/browser/base/content/content.js +++ b/browser/base/content/content.js @@ -262,6 +262,35 @@ function getSerializedSecurityInfo(docShell) { return serhelper.serializeToString(securityInfo); } +function getSiteBlockedErrorDetails(docShell) { + let blockedInfo = {}; + if (docShell.failedChannel) { + let classifiedChannel = docShell.failedChannel. + QueryInterface(Ci.nsIClassifiedChannel); + if (classifiedChannel) { + let httpChannel = docShell.failedChannel.QueryInterface(Ci.nsIHttpChannel); + + let reportUri = httpChannel.URI.clone(); + + // Remove the query to avoid leaking sensitive data + if (reportUri instanceof Ci.nsIURL) { + reportUri.query = ""; + } + + blockedInfo = { list: classifiedChannel.matchedList, + provider: classifiedChannel.matchedProvider, + uri: reportUri.asciiSpec }; + } + } + return blockedInfo; +} + +addMessageListener("DeceptiveBlockedDetails", (message) => { + sendAsyncMessage("DeceptiveBlockedDetails:Result", { + blockedInfo: getSiteBlockedErrorDetails(docShell), + }); +}); + var AboutNetAndCertErrorListener = { init(chromeGlobal) { addMessageListener("CertErrorDetails", this); @@ -583,32 +612,13 @@ var ClickEventHandler = { let docShell = ownerDoc.defaultView.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocShell); - let blockedInfo = {}; - if (docShell.failedChannel) { - let classifiedChannel = docShell.failedChannel. - QueryInterface(Ci.nsIClassifiedChannel); - if (classifiedChannel) { - let httpChannel = docShell.failedChannel.QueryInterface(Ci.nsIHttpChannel); - - let reportUri = httpChannel.URI.clone(); - - // Remove the query to avoid leaking sensitive data - if (reportUri instanceof Ci.nsIURL) { - reportUri.query = ""; - } - - blockedInfo = { list: classifiedChannel.matchedList, - provider: classifiedChannel.matchedProvider, - uri: reportUri.asciiSpec }; - } - } sendAsyncMessage("Browser:SiteBlockedError", { location: ownerDoc.location.href, reason, elementId: targetElement.getAttribute("id"), isTopFrame: (ownerDoc.defaultView.parent === ownerDoc.defaultView), - blockedInfo + blockedInfo: getSiteBlockedErrorDetails(docShell), }); }, diff --git a/browser/base/content/report-phishing-overlay.xul b/browser/base/content/report-phishing-overlay.xul index 712079f82479..112bf75a0d88 100644 --- a/browser/base/content/report-phishing-overlay.xul +++ b/browser/base/content/report-phishing-overlay.xul @@ -29,7 +29,7 @@ accesskey="&safeb.palm.notdeceptive.accesskey;" insertbefore="aboutSeparator" observes="reportPhishingErrorBroadcaster" - oncommand="openUILinkIn(gSafeBrowsing.getReportURL('PhishMistake'), 'tab');" + oncommand="ReportFalseDeceptiveSite();" onclick="checkForMiddleClick(this, event);"/> diff --git a/browser/locales/en-US/chrome/browser/safebrowsing/safebrowsing.properties b/browser/locales/en-US/chrome/browser/safebrowsing/safebrowsing.properties new file mode 100644 index 000000000000..aa72ddbffd14 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/safebrowsing/safebrowsing.properties @@ -0,0 +1,6 @@ +# 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/. + +errorReportFalseDeceptiveTitle=This isn’t a deceptive site +errorReportFalseDeceptiveMessage=It’s not possible to report this error at this time. diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn index 35fc613f4536..b1edf111714f 100644 --- a/browser/locales/jar.mn +++ b/browser/locales/jar.mn @@ -54,6 +54,7 @@ locale/browser/places/moveBookmarks.dtd (%chrome/browser/places/moveBookmarks.dtd) locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd) locale/browser/safebrowsing/report-phishing.dtd (%chrome/browser/safebrowsing/report-phishing.dtd) + locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties) locale/browser/feeds/subscribe.dtd (%chrome/browser/feeds/subscribe.dtd) locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd) diff --git a/toolkit/components/url-classifier/SafeBrowsing.jsm b/toolkit/components/url-classifier/SafeBrowsing.jsm index 988aab73865f..8e7bd549dc9d 100644 --- a/toolkit/components/url-classifier/SafeBrowsing.jsm +++ b/toolkit/components/url-classifier/SafeBrowsing.jsm @@ -155,7 +155,9 @@ this.SafeBrowsing = { throw err; } - if (!info.list || !info.uri) { + // The "Phish" reports are about submitting new phishing URLs to Google so + // they don't have an associated list URL + if (kind != "Phish" && (!info.list || !info.uri)) { return null; } From f37b8c7128b8b9dc3ab82c0bd8386c5628fffbe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Sat, 18 Mar 2017 08:40:19 +0100 Subject: [PATCH 099/169] Bug 1348495 - Stop setting padding for .button-box on Linux. r=karlt MozReview-Commit-ID: 7nh452uE5qc --HG-- extra : rebase_source : 51d5baea48a10930d2cb066b535a31bd6f4ab460 --- toolkit/themes/linux/global/button.css | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/toolkit/themes/linux/global/button.css b/toolkit/themes/linux/global/button.css index 6ed09c94ca0b..d7c1399bd0ec 100644 --- a/toolkit/themes/linux/global/button.css +++ b/toolkit/themes/linux/global/button.css @@ -20,10 +20,6 @@ button { .button-box { -moz-appearance: button-focus; - padding-top: 1px; - padding-bottom: 2px; - padding-inline-start: 3px; - padding-inline-end: 4px; } .button-icon { @@ -49,15 +45,6 @@ button[checked="true"] { color: ButtonText; } -button:hover:active > .button-box, -button[open="true"] > .button-box, -button[checked="true"] > .button-box { - padding-top: 2px; - padding-bottom: 1px; - padding-inline-start: 4px; - padding-inline-end: 3px; -} - /* .......... disabled state .......... */ button[disabled="true"], @@ -65,13 +52,6 @@ button[disabled="true"]:hover:active { color: GrayText; } -button[disabled="true"] > .button-box { - padding-top: 1px !important; - padding-bottom: 2px !important; - padding-inline-start: 3px !important; - padding-inline-end: 4px !important; -} - /* ::::: menu/menu-button buttons ::::: */ button[type="menu-button"] { From e612827768aa3a2547a5eb1d5341c0d451d6fe46 Mon Sep 17 00:00:00 2001 From: "Panashe M. Fundira" Date: Mon, 20 Mar 2017 04:23:28 -0700 Subject: [PATCH 100/169] servo: Merge #15918 - PropertyDeclaration with CSSWideKeyword is parsed (from munyari:whitespace); r=emilio Addresses #15401 Source-Repo: https://github.com/servo/servo Source-Revision: 4a63581fadd41f9a1901498e47672c59d44b5fb0 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 96b764da3b2d4dcefbb9d76d2b4715117443c0e0 --- .../style/properties/properties.mako.rs | 4 +++- .../unit/style/properties/serialization.rs | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/servo/components/style/properties/properties.mako.rs b/servo/components/style/properties/properties.mako.rs index f9c2cac07b64..b2a84529f1a6 100644 --- a/servo/components/style/properties/properties.mako.rs +++ b/servo/components/style/properties/properties.mako.rs @@ -1175,7 +1175,9 @@ impl PropertyDeclaration { pub fn value_is_unparsed(&self) -> bool { match *self { PropertyDeclaration::WithVariables(..) => true, - PropertyDeclaration::Custom(..) => true, + PropertyDeclaration::Custom(_, ref value) => { + !matches!(value.borrow(), DeclaredValue::CSSWideKeyword(..)) + } _ => false, } } diff --git a/servo/tests/unit/style/properties/serialization.rs b/servo/tests/unit/style/properties/serialization.rs index 962db4f63d57..218691073703 100644 --- a/servo/tests/unit/style/properties/serialization.rs +++ b/servo/tests/unit/style/properties/serialization.rs @@ -1130,4 +1130,25 @@ mod shorthand_serialization { assert_eq!(serialization, block_text); } } + + mod keywords { + pub use super::*; + #[test] + fn css_wide_keywords_should_be_parsed() { + let block_text = "--a:inherit;"; + let block = parse_declaration_block(block_text); + + let serialization = block.to_css_string(); + assert_eq!(serialization, "--a: inherit;"); + } + + #[test] + fn non_keyword_custom_property_should_be_unparsed() { + let block_text = "--main-color: #06c;"; + let block = parse_declaration_block(block_text); + + let serialization = block.to_css_string(); + assert_eq!(serialization, block_text); + } + } } From 765b21da4d89785a23bd990e7fd57fcbbe08331c Mon Sep 17 00:00:00 2001 From: Ravi Shankar Date: Mon, 20 Mar 2017 05:28:12 -0700 Subject: [PATCH 101/169] servo: Merge #16040 - Cleanup tidy (from Wafflespeanut:tidy); r=Manishearth fixes #16039 Source-Repo: https://github.com/servo/servo Source-Revision: e8b364793416465f6b4877414623dac2c52f2e6a --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : c7241dfee8e223852f59d05b75c88fb20775963f --- servo/python/servo/lints/wpt_lint.py | 6 +++-- servo/python/tidy/servo_tidy/tidy.py | 39 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/servo/python/servo/lints/wpt_lint.py b/servo/python/servo/lints/wpt_lint.py index 2160e6d557d4..75c4b72f226b 100644 --- a/servo/python/servo/lints/wpt_lint.py +++ b/servo/python/servo/lints/wpt_lint.py @@ -8,7 +8,7 @@ # except according to those terms. import os -import site +import sys from servo_tidy.tidy import LintRunner, filter_file @@ -28,11 +28,13 @@ class Lint(LintRunner): def run(self): if self.stylo: return + wpt_working_dir = os.path.abspath(os.path.join(WPT_PATH, "web-platform-tests")) for suite in SUITES: files = self._get_wpt_files(suite) - site.addsitedir(wpt_working_dir) + sys.path.insert(0, wpt_working_dir) from tools.lint import lint + sys.path.remove(wpt_working_dir) file_dir = os.path.abspath(os.path.join(WPT_PATH, suite)) returncode = lint.lint(file_dir, files, output_json=False, css_mode=False) if returncode: diff --git a/servo/python/tidy/servo_tidy/tidy.py b/servo/python/tidy/servo_tidy/tidy.py index fff707a736a6..36679cf9b1f1 100644 --- a/servo/python/tidy/servo_tidy/tidy.py +++ b/servo/python/tidy/servo_tidy/tidy.py @@ -111,11 +111,11 @@ def progress_wrapper(iterator): class FileList(object): - def __init__(self, directory, only_changed_files=False, exclude_dirs=[], progress=True, stylo=False): + def __init__(self, directory, only_changed_files=False, exclude_dirs=[], progress=True): self.directory = directory self.excluded = exclude_dirs iterator = self._filter_excluded() if exclude_dirs else self._default_walk() - if only_changed_files and not stylo: + if only_changed_files: try: # Fall back if git doesn't work newiter = self._git_changed_files() @@ -168,10 +168,9 @@ def filter_file(file_name): return True -def filter_files(start_dir, only_changed_files, progress, stylo): +def filter_files(start_dir, only_changed_files, progress): file_iter = FileList(start_dir, only_changed_files=only_changed_files, - exclude_dirs=config["ignore"]["directories"], progress=progress, - stylo=stylo) + exclude_dirs=config["ignore"]["directories"], progress=progress) for file_name in file_iter: base_name = os.path.basename(file_name) if not any(fnmatch.fnmatch(base_name, pattern) for pattern in FILE_PATTERNS_TO_CHECK): @@ -1018,20 +1017,22 @@ class LintRunner(object): dir_name, filename = os.path.split(self.path) sys.path.append(dir_name) module = imp.load_source(filename[:-3], self.path) - if hasattr(module, 'Lint'): - if issubclass(module.Lint, LintRunner): - lint = module.Lint(self.path, self.only_changed_files, - self.exclude_dirs, self.progress, stylo=self.stylo) - for error in lint.run(): - if not hasattr(error, '__iter__'): - yield (self.path, 1, "errors should be a tuple of (path, line, reason)") - return - yield error - else: - yield (self.path, 1, "class 'Lint' should inherit from 'LintRunner'") - else: - yield (self.path, 1, "script should contain a class named 'Lint'") sys.path.remove(dir_name) + if not hasattr(module, 'Lint'): + yield (self.path, 1, "script should contain a class named 'Lint'") + return + + if not issubclass(module.Lint, LintRunner): + yield (self.path, 1, "class 'Lint' should inherit from 'LintRunner'") + return + + lint = module.Lint(self.path, self.only_changed_files, + self.exclude_dirs, self.progress, stylo=self.stylo) + for error in lint.run(): + if type(error) is not tuple or (type(error) is tuple and len(error) != 3): + yield (self.path, 1, "errors should be a tuple of (path, line, reason)") + return + yield error def get_files(self, path, **kwargs): args = ['only_changed_files', 'exclude_dirs', 'progress'] @@ -1071,7 +1072,7 @@ def scan(only_changed_files=False, progress=True, stylo=False): # check directories contain expected files directory_errors = check_directory_files(config['check_ext']) # standard checks - files_to_check = filter_files('.', only_changed_files, progress, stylo) + files_to_check = filter_files('.', only_changed_files and not stylo, progress) checking_functions = (check_flake8, check_lock, check_webidl_spec, check_json, check_yaml) line_checking_functions = (check_license, check_by_line, check_toml, check_shell, check_rust, check_spec, check_modeline) From ef288ed482fbd0bbb4556306798a9042c03362d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 20 Mar 2017 14:27:57 +0100 Subject: [PATCH 102/169] Bug 1341102: Adjust expectations for new passes caused by servo/servo#15918. r=me MozReview-Commit-ID: EY3AMreVcVG --- layout/style/test/stylo-failures.md | 1 - 1 file changed, 1 deletion(-) diff --git a/layout/style/test/stylo-failures.md b/layout/style/test/stylo-failures.md index 604116f8abaa..2f84fe6b7528 100644 --- a/layout/style/test/stylo-failures.md +++ b/layout/style/test/stylo-failures.md @@ -378,7 +378,6 @@ to mochitest command. * background-position invalid 3-value form **issue to be filed** * test_shorthand_property_getters.html `should serialize to 4-value` [2] * test_variables.html `--weird`: name of custom property is not escaped properly servo/servo#15399 [1] - * ... `got "--`: CSS-wide keywords in custom properties servo/servo#15401 [3] * image-layer values should omit some of its parts when they are initial servo/servo#15951 * test_shorthand_property_getters.html `background` [2] * counter-{reset,increment} doesn't serialize none servo/servo#15977 From 4f8d16041f6c50094666e66cc76815cedfca6a88 Mon Sep 17 00:00:00 2001 From: Thom Chiovoloni Date: Tue, 14 Mar 2017 13:01:10 -0400 Subject: [PATCH 103/169] Bug 1342320 - Use PlacesUtils and not PlacesSyncUtils in sync bookmark decline/undecline test r=markh MozReview-Commit-ID: DgbCeKgSxoE --HG-- extra : rebase_source : d7a73f871436a3c557e3ea921439da3e6f55e13c --- .../sync/tests/unit/test_bookmark_decline_undecline.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/services/sync/tests/unit/test_bookmark_decline_undecline.js b/services/sync/tests/unit/test_bookmark_decline_undecline.js index bcce158d8fce..b503eeee54c4 100644 --- a/services/sync/tests/unit/test_bookmark_decline_undecline.js +++ b/services/sync/tests/unit/test_bookmark_decline_undecline.js @@ -70,13 +70,11 @@ add_task(async function test_decline_undecline() { await SyncTestingInfrastructure(server); try { - let bzGuid = "999999999999"; - await PlacesSyncUtils.bookmarks.insert({ - kind: PlacesSyncUtils.bookmarks.KINDS.BOOKMARK, - syncId: bzGuid, - parentSyncId: "menu", + let { guid: bzGuid } = await PlacesUtils.bookmarks.insert({ + parentGuid: PlacesUtils.bookmarks.menuGuid, url: "https://bugzilla.mozilla.org", - + index: PlacesUtils.bookmarks.DEFAULT_INDEX, + title: "bugzilla", }); ok(!getBookmarkWBO(server, bzGuid), "Shouldn't have been uploaded yet"); From bd2ab930f4a9c586b3dcd0615c40a5710dbce6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 20 Mar 2017 06:26:38 -0700 Subject: [PATCH 104/169] servo: Merge #15890 - selectors: Check the bloom filter at most once per complex selector (from emilio:bloom); r=heycam Fixes https://github.com/servo/rust-selectors/issues/107 Source-Repo: https://github.com/servo/servo Source-Revision: 4fa40c77036c0635abb6a567146a101d11521cb0 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 409937020b288d2b6b26e988093a03987720231e --- servo/components/selectors/matching.rs | 157 ++++++++++++------------- 1 file changed, 73 insertions(+), 84 deletions(-) diff --git a/servo/components/selectors/matching.rs b/servo/components/selectors/matching.rs index f567b2bc7cac..e100a6f3357b 100644 --- a/servo/components/selectors/matching.rs +++ b/servo/components/selectors/matching.rs @@ -112,12 +112,56 @@ pub fn matches(selector_list: &[Selector], }) } +fn may_match(mut selector: &ComplexSelector, + bf: &BloomFilter) + -> bool + where E: Element, +{ + // See if the bloom filter can exclude any of the descendant selectors, and + // reject if we can. + loop { + match selector.next { + None => break, + Some((ref cs, Combinator::Descendant)) => selector = &**cs, + Some((ref cs, _)) => { + selector = &**cs; + continue; + } + }; + + for ss in selector.compound_selector.iter() { + match *ss { + SimpleSelector::LocalName(LocalName { ref name, ref lower_name }) => { + if !bf.might_contain(name) && + !bf.might_contain(lower_name) { + return false + } + }, + SimpleSelector::Namespace(ref namespace) => { + if !bf.might_contain(&namespace.url) { + return false + } + }, + SimpleSelector::ID(ref id) => { + if !bf.might_contain(id) { + return false + } + }, + SimpleSelector::Class(ref class) => { + if !bf.might_contain(class) { + return false + } + }, + _ => {}, + } + } + } + + // If we haven't proven otherwise, it may match. + true +} + /// Determines whether the given element matches the given complex selector. -/// -/// NB: If you add support for any new kinds of selectors to this routine, be sure to set -/// `shareable` to false unless you are willing to update the style sharing logic. Otherwise things -/// will almost certainly break as elements will start mistakenly sharing styles. (See -/// `can_share_style_with` in `servo/components/style/matching.rs`.) pub fn matches_complex_selector(selector: &ComplexSelector, element: &E, parent_bf: Option<&BloomFilter>, @@ -126,7 +170,13 @@ pub fn matches_complex_selector(selector: &ComplexSelector, -> bool where E: Element { - match matches_complex_selector_internal(selector, element, parent_bf, relations, flags) { + if let Some(filter) = parent_bf { + if !may_match::(selector, filter) { + return false; + } + } + + match matches_complex_selector_internal(selector, element, relations, flags) { SelectorMatchingResult::Matched => { match selector.next { Some((_, Combinator::NextSibling)) | @@ -190,81 +240,19 @@ enum SelectorMatchingResult { NotMatchedGlobally, } -/// Quickly figures out whether or not the complex selector is worth doing more -/// work on. If the simple selectors don't match, or there's a child selector -/// that does not appear in the bloom parent bloom filter, we can exit early. -fn can_fast_reject(mut selector: &ComplexSelector, - element: &E, - parent_bf: Option<&BloomFilter>, - relations: &mut StyleRelations, - flags: &mut ElementSelectorFlags) - -> Option - where E: Element -{ - if !selector.compound_selector.iter().all(|simple_selector| { - matches_simple_selector(simple_selector, element, parent_bf, relations, flags) }) { - return Some(SelectorMatchingResult::NotMatchedAndRestartFromClosestLaterSibling); - } - - let bf: &BloomFilter = match parent_bf { - None => return None, - Some(ref bf) => bf, - }; - - // See if the bloom filter can exclude any of the descendant selectors, and - // reject if we can. - loop { - match selector.next { - None => break, - Some((ref cs, Combinator::Descendant)) => selector = &**cs, - Some((ref cs, _)) => { - selector = &**cs; - continue; - } - }; - - for ss in selector.compound_selector.iter() { - match *ss { - SimpleSelector::LocalName(LocalName { ref name, ref lower_name }) => { - if !bf.might_contain(name) && - !bf.might_contain(lower_name) { - return Some(SelectorMatchingResult::NotMatchedGlobally); - } - }, - SimpleSelector::Namespace(ref namespace) => { - if !bf.might_contain(&namespace.url) { - return Some(SelectorMatchingResult::NotMatchedGlobally); - } - }, - SimpleSelector::ID(ref id) => { - if !bf.might_contain(id) { - return Some(SelectorMatchingResult::NotMatchedGlobally); - } - }, - SimpleSelector::Class(ref class) => { - if !bf.might_contain(class) { - return Some(SelectorMatchingResult::NotMatchedGlobally); - } - }, - _ => {}, - } - } - } - - // Can't fast reject. - None -} - fn matches_complex_selector_internal(selector: &ComplexSelector, - element: &E, - parent_bf: Option<&BloomFilter>, - relations: &mut StyleRelations, - flags: &mut ElementSelectorFlags) - -> SelectorMatchingResult + element: &E, + relations: &mut StyleRelations, + flags: &mut ElementSelectorFlags) + -> SelectorMatchingResult where E: Element { - if let Some(result) = can_fast_reject(selector, element, parent_bf, relations, flags) { - return result; + let matches_all_simple_selectors = selector.compound_selector.iter().all(|simple| { + matches_simple_selector(simple, element, relations, flags) + }); + + if !matches_all_simple_selectors { + return SelectorMatchingResult::NotMatchedAndRestartFromClosestLaterSibling; } match selector.next { @@ -287,10 +275,9 @@ fn matches_complex_selector_internal(selector: &ComplexSelector, Some(next_element) => next_element, }; let result = matches_complex_selector_internal(&**next_selector, - &element, - parent_bf, - relations, - flags); + &element, + relations, + flags); match (result, combinator) { // Return the status immediately. (SelectorMatchingResult::Matched, _) => return result, @@ -332,7 +319,6 @@ fn matches_complex_selector_internal(selector: &ComplexSelector, fn matches_simple_selector( selector: &SimpleSelector, element: &E, - parent_bf: Option<&BloomFilter>, relations: &mut StyleRelations, flags: &mut ElementSelectorFlags) -> bool @@ -466,7 +452,10 @@ fn matches_simple_selector( } SimpleSelector::Negation(ref negated) => { !negated.iter().all(|s| { - matches_complex_selector(s, element, parent_bf, relations, flags) + match matches_complex_selector_internal(s, element, relations, flags) { + SelectorMatchingResult::Matched => true, + _ => false, + } }) } } From f0c29bc5fc916fe61069f653dad3950a7cbb122f Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Thu, 9 Mar 2017 17:33:50 +0800 Subject: [PATCH 105/169] Bug 1338446 Part 1 - Label dispatching ShortTermURISpecCache by using SystemGroup. r=heycam In ErrorReporter::~ErrorReporter(), we dispatch sSpecCache to clear itself. It's not related to content, so label it by using SystemGroup. Use another runnable pointer to keep sSpecCache alive. MozReview-Commit-ID: JN1qrS2jxFs --HG-- extra : rebase_source : ffdd72816e7864cefeabde85f692e837c5fe1bc5 --- layout/style/ErrorReporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/layout/style/ErrorReporter.cpp b/layout/style/ErrorReporter.cpp index b57814eb7479..4775a68ef324 100644 --- a/layout/style/ErrorReporter.cpp +++ b/layout/style/ErrorReporter.cpp @@ -11,6 +11,7 @@ #include "mozilla/css/Loader.h" #include "mozilla/Preferences.h" #include "mozilla/Services.h" +#include "mozilla/SystemGroup.h" #include "nsCSSScanner.h" #include "nsIConsoleService.h" #include "nsIDocument.h" @@ -153,7 +154,11 @@ ErrorReporter::~ErrorReporter() // balance between performance and memory usage, so we only allow // short-term caching. if (sSpecCache && sSpecCache->IsInUse() && !sSpecCache->IsPending()) { - if (NS_FAILED(NS_DispatchToCurrentThread(sSpecCache))) { + nsCOMPtr runnable(sSpecCache); + nsresult rv = + SystemGroup::Dispatch("ShortTermURISpecCache", TaskCategory::Other, + runnable.forget()); + if (NS_FAILED(rv)) { // Peform the "deferred" cleanup immediately if the dispatch fails. sSpecCache->Run(); } else { From bef3641333b1d07f8933611006c56b11ae4c854a Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Thu, 9 Mar 2017 18:02:01 +0800 Subject: [PATCH 106/169] Bug 1338446 Part 2 - Label FontFaceSet::CheckLoadingFinishedAfterDelay. r=heycam mDocument is always valid because we get mDocument from the argument of FontFaceSet's constructor, and FontFaceSet is always created in nsIDocument's methods. Delay giving checkTask a name until we dispatch it. No need to name it twice. MozReview-Commit-ID: 6nKYRcRqvQ0 --HG-- extra : rebase_source : 5d7be9c1bcf41ce6fae9ba37a4013144c23fa832 --- layout/style/FontFaceSet.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/layout/style/FontFaceSet.cpp b/layout/style/FontFaceSet.cpp index a35556c8587b..b126e88b66f8 100644 --- a/layout/style/FontFaceSet.cpp +++ b/layout/style/FontFaceSet.cpp @@ -104,6 +104,8 @@ FontFaceSet::FontFaceSet(nsPIDOMWindowInner* aWindow, nsIDocument* aDocument) , mHasLoadingFontFacesIsDirty(false) , mDelayedLoadCheck(false) { + MOZ_ASSERT(mDocument, "We should get a valid document from the caller!"); + nsCOMPtr global = do_QueryInterface(aWindow); // If the pref is not set, don't create the Promise (which the page wouldn't @@ -1473,9 +1475,9 @@ FontFaceSet::OnFontFaceStatusChanged(FontFace* aFontFace) if (!mDelayedLoadCheck) { mDelayedLoadCheck = true; nsCOMPtr checkTask = - NewRunnableMethod("FontFaceSet::CheckLoadingFinishedAfterDelay", - this, &FontFaceSet::CheckLoadingFinishedAfterDelay); - NS_DispatchToMainThread(checkTask); + NewRunnableMethod(this, &FontFaceSet::CheckLoadingFinishedAfterDelay); + mDocument->Dispatch("FontFaceSet::CheckLoadingFinishedAfterDelay", + TaskCategory::Other, checkTask.forget()); } } } From f087300185b874eecd04538f7e7eeae5e992c9fa Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Mon, 13 Mar 2017 17:00:57 +0800 Subject: [PATCH 107/169] Bug 1338446 Part 3 - Label SheetLoadData in Loader::PostLoadEvent. r=heycam When constructing a Loader without passing a document, we added a DocGroup parameter so that we could still use it to dispatch events to the DocGroup. Delete NS_ENSURE_TRUE because new() is infallable. Use another runnable pointer for calling dispatching because forget() will nuke the pointer and we need to use evt afterwards. MozReview-Commit-ID: Ce2K6j4pUhA --HG-- extra : rebase_source : 2bacf1f856e0700f36b2fefe4d2424719cad77a7 --- dom/base/nsDocument.cpp | 3 ++- layout/base/nsDocumentViewer.cpp | 4 ++-- layout/base/nsStyleSheetService.cpp | 2 +- layout/style/CSSStyleSheet.cpp | 2 +- layout/style/Loader.cpp | 23 +++++++++++++++++++---- layout/style/Loader.h | 9 ++++++++- layout/style/PreloadedStyleSheet.cpp | 2 +- layout/style/nsLayoutStylesheetCache.cpp | 2 +- 8 files changed, 35 insertions(+), 12 deletions(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 9df11a64b3b3..d21325719650 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -4406,7 +4406,8 @@ nsDocument::LoadAdditionalStyleSheet(additionalSheetType aType, return NS_ERROR_INVALID_ARG; // Loading the sheet sync. - RefPtr loader = new css::Loader(GetStyleBackendType()); + RefPtr loader = + new css::Loader(GetStyleBackendType(), GetDocGroup()); css::SheetParsingMode parsingMode; switch (aType) { diff --git a/layout/base/nsDocumentViewer.cpp b/layout/base/nsDocumentViewer.cpp index 18b2e7daa91d..5b363899116d 100644 --- a/layout/base/nsDocumentViewer.cpp +++ b/layout/base/nsDocumentViewer.cpp @@ -2294,8 +2294,8 @@ nsDocumentViewer::CreateStyleSet(nsIDocument* aDocument) nsAutoString sheets; elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets); if (!sheets.IsEmpty() && baseURI) { - RefPtr cssLoader = - new mozilla::css::Loader(backendType); + RefPtr cssLoader = + new css::Loader(backendType, aDocument->GetDocGroup()); char *str = ToNewCString(sheets); char *newStr = str; diff --git a/layout/base/nsStyleSheetService.cpp b/layout/base/nsStyleSheetService.cpp index d75c330069e0..dc6548ed8ce0 100644 --- a/layout/base/nsStyleSheetService.cpp +++ b/layout/base/nsStyleSheetService.cpp @@ -218,7 +218,7 @@ LoadSheet(nsIURI* aURI, StyleBackendType aType, RefPtr* aResult) { - RefPtr loader = new css::Loader(aType); + RefPtr loader = new css::Loader(aType, nullptr); return loader->LoadSheetSync(aURI, aParsingMode, true, aResult); } diff --git a/layout/style/CSSStyleSheet.cpp b/layout/style/CSSStyleSheet.cpp index afb8e7081e04..84d0f7c9f476 100644 --- a/layout/style/CSSStyleSheet.cpp +++ b/layout/style/CSSStyleSheet.cpp @@ -988,7 +988,7 @@ CSSStyleSheet::ReparseSheet(const nsAString& aInput) loader = mDocument->CSSLoader(); NS_ASSERTION(loader, "Document with no CSS loader!"); } else { - loader = new css::Loader(StyleBackendType::Gecko); + loader = new css::Loader(StyleBackendType::Gecko, nullptr); } mozAutoDocUpdate updateBatch(mDocument, UPDATE_STYLE, true); diff --git a/layout/style/Loader.cpp b/layout/style/Loader.cpp index f6e1f34368a6..10cf9af0acd5 100644 --- a/layout/style/Loader.cpp +++ b/layout/style/Loader.cpp @@ -19,11 +19,12 @@ #include "mozilla/css/Loader.h" #include "mozilla/ArrayUtils.h" +#include "mozilla/dom/DocGroup.h" #include "mozilla/IntegerPrintfMacros.h" #include "mozilla/LoadInfo.h" #include "mozilla/MemoryReporting.h" - #include "mozilla/StyleSheetInlines.h" +#include "mozilla/SystemGroup.h" #include "nsIRunnable.h" #include "nsIUnicharStreamLoader.h" #include "nsSyncLoadService.h" @@ -519,8 +520,9 @@ LoaderReusableStyleSheets::FindReusableStyleSheet(nsIURI* aURL, * Loader Implementation * *************************/ -Loader::Loader(StyleBackendType aType) +Loader::Loader(StyleBackendType aType, DocGroup* aDocGroup) : mDocument(nullptr) + , mDocGroup(aDocGroup) , mDatasToNotifyOn(0) , mCompatMode(eCompatibility_FullStandards) , mStyleBackendType(Some(aType)) @@ -542,6 +544,8 @@ Loader::Loader(nsIDocument* aDocument) , mSyncCallback(false) #endif { + MOZ_ASSERT(mDocument, "We should get a valid document from the caller!"); + // We can just use the preferred set, since there are no sheets in the // document yet (if there are, how did they get there? _we_ load the sheets!) // and hence the selected set makes no sense at this time. @@ -2471,13 +2475,24 @@ Loader::PostLoadEvent(nsIURI* aURI, aObserver, nullptr, mDocument); - NS_ENSURE_TRUE(evt, NS_ERROR_OUT_OF_MEMORY); if (!mPostedEvents.AppendElement(evt)) { return NS_ERROR_OUT_OF_MEMORY; } - nsresult rv = NS_DispatchToCurrentThread(evt); + nsresult rv; + RefPtr runnable(evt); + if (mDocument) { + rv = mDocument->Dispatch("SheetLoadData", TaskCategory::Other, + runnable.forget()); + } else if (mDocGroup) { + rv = mDocGroup->Dispatch("SheetLoadData", TaskCategory::Other, + runnable.forget()); + } else { + rv = SystemGroup::Dispatch("SheetLoadData", TaskCategory::Other, + runnable.forget()); + } + if (NS_FAILED(rv)) { NS_WARNING("failed to dispatch stylesheet load event"); mPostedEvents.RemoveElement(evt); diff --git a/layout/style/Loader.h b/layout/style/Loader.h index 9059e8e6f886..dbeb5e610324 100644 --- a/layout/style/Loader.h +++ b/layout/style/Loader.h @@ -36,6 +36,7 @@ class nsIStyleSheetLinkingElement; namespace mozilla { namespace dom { +class DocGroup; class Element; } // namespace dom } // namespace mozilla @@ -191,7 +192,11 @@ class Loader final { typedef mozilla::net::ReferrerPolicy ReferrerPolicy; public: - explicit Loader(StyleBackendType aType); + // aDocGroup is used for dispatching SheetLoadData in PostLoadEvent(). It + // can be null if you want to use this constructor, and there's no + // document when the Loader is constructed. + Loader(StyleBackendType aType, mozilla::dom::DocGroup* aDocGroup); + explicit Loader(nsIDocument*); private: @@ -574,6 +579,8 @@ private: // DropDocumentReference(). nsIDocument* MOZ_NON_OWNING_REF mDocument; // the document we live for + // For dispatching events via DocGroup::Dispatch() when mDocument is nullptr. + RefPtr mDocGroup; // Number of datas still waiting to be notified on if we're notifying on a // whole bunch at once (e.g. in one of the stop methods). This is used to diff --git a/layout/style/PreloadedStyleSheet.cpp b/layout/style/PreloadedStyleSheet.cpp index e39057fd59ab..276112e7cbd1 100644 --- a/layout/style/PreloadedStyleSheet.cpp +++ b/layout/style/PreloadedStyleSheet.cpp @@ -71,7 +71,7 @@ PreloadedStyleSheet::GetSheet(StyleBackendType aType, StyleSheet** aResult) aType == StyleBackendType::Gecko ? mGecko : mServo; if (!sheet) { - RefPtr loader = new css::Loader(aType); + RefPtr loader = new css::Loader(aType, nullptr); nsresult rv = loader->LoadSheetSync(mURI, mParsingMode, true, &sheet); NS_ENSURE_SUCCESS(rv, rv); MOZ_ASSERT(sheet); diff --git a/layout/style/nsLayoutStylesheetCache.cpp b/layout/style/nsLayoutStylesheetCache.cpp index a28d943410a5..1cfed5e77a7e 100644 --- a/layout/style/nsLayoutStylesheetCache.cpp +++ b/layout/style/nsLayoutStylesheetCache.cpp @@ -773,7 +773,7 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, gCSSLoader_Servo; if (!loader) { - loader = new mozilla::css::Loader(mBackendType); + loader = new Loader(mBackendType, nullptr); if (!loader) { ErrorLoadingSheet(aURI, "no Loader", eCrash); return; From dd4484225fa464b89f5316530bd7dc55cb16135f Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 14 Mar 2017 21:29:55 +0800 Subject: [PATCH 108/169] Bug 1338446 Part 4 - Label StyleImageRequestCleanupTask. r=heycam If nsStyleImageRequest::Resolve() has been called, we cache the DocGroup and use it for dispatching events for the clean up task. Otherwise, it's safe to do clean up task on non-main thread. MozReview-Commit-ID: BXalEkc6dBm --HG-- extra : rebase_source : ccc7c43a385f3149b53763030419561fc64efbfa --- layout/style/nsCSSValue.cpp | 4 +++- layout/style/nsStyleStruct.cpp | 25 ++++++++++++++++++++----- layout/style/nsStyleStruct.h | 3 +++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index 16a5432f93db..bc1b6bc1f181 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -3057,7 +3057,9 @@ css::ImageValue::Initialize(nsIDocument* aDocument) css::ImageValue::~ImageValue() { - MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(NS_IsMainThread() || mRequests.Count() == 0, + "Destructor should run on main thread, or on non-main thread " + "when mRequest is empty!"); for (auto iter = mRequests.Iter(); !iter.Done(); iter.Next()) { nsIDocument* doc = iter.Key(); diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 007df3cdfbbe..5bb6d7564940 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -33,6 +33,7 @@ #include "CounterStyleManager.h" #include "mozilla/dom/AnimationEffectReadOnlyBinding.h" // for PlaybackDirection +#include "mozilla/dom/DocGroup.h" #include "mozilla/dom/ImageTracker.h" #include "mozilla/Likely.h" #include "nsIURI.h" @@ -1890,7 +1891,7 @@ nsStyleGradient::HasCalc() /** * Runnable to release the nsStyleImageRequest's mRequestProxy, - * mImageValue and mImageValue on the main thread, and to perform + * mImageValue and mImageTracker on the main thread, and to perform * any necessary unlocking and untracking of the image. */ class StyleImageRequestCleanupTask : public mozilla::Runnable @@ -1911,7 +1912,8 @@ public: NS_IMETHOD Run() final { - MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(!mRequestProxy || NS_IsMainThread(), + "If mRequestProxy is non-null, we need to run on main thread!"); if (!mRequestProxy) { return NS_OK; @@ -1932,7 +1934,15 @@ public: } protected: - virtual ~StyleImageRequestCleanupTask() { MOZ_ASSERT(NS_IsMainThread()); } + virtual ~StyleImageRequestCleanupTask() + { + MOZ_ASSERT(mImageValue->mRequests.Count() == 0 || NS_IsMainThread(), + "If mImageValue has any mRequests, we need to run on main " + "thread to release ImageValues!"); + MOZ_ASSERT((!mRequestProxy && !mImageTracker) || NS_IsMainThread(), + "mRequestProxy and mImageTracker's destructor need to run " + "on the main thread!"); + } private: Mode mModeFlags; @@ -1986,10 +1996,13 @@ nsStyleImageRequest::~nsStyleImageRequest() mRequestProxy.forget(), mImageValue.forget(), mImageTracker.forget()); - if (NS_IsMainThread()) { + if (NS_IsMainThread() || !IsResolved()) { task->Run(); } else { - NS_DispatchToMainThread(task.forget()); + MOZ_ASSERT(IsResolved() == bool(mDocGroup), + "We forgot to cache mDocGroup in Resolve()?"); + mDocGroup->Dispatch("StyleImageRequestCleanupTask", + TaskCategory::Other, task.forget()); } } @@ -2003,8 +2016,10 @@ nsStyleImageRequest::Resolve(nsPresContext* aPresContext) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(!IsResolved(), "already resolved"); + MOZ_ASSERT(aPresContext); mResolved = true; + mDocGroup = aPresContext->Document()->GetDocGroup(); // For now, just have unique nsCSSValue/ImageValue objects. We should // really store the ImageValue on the Servo specified value, so that we can diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 500e7cdfc111..1f856654b271 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -385,6 +385,9 @@ private: RefPtr mImageValue; RefPtr mImageTracker; + // Cache DocGroup for dispatching events in the destructor. + RefPtr mDocGroup; + Mode mModeFlags; bool mResolved; }; From e27cc69d635d4290f311a6497b0df86e7050306c Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 14 Mar 2017 21:34:57 +0800 Subject: [PATCH 109/169] Bug 1338446 Part 5 - Label runnable in Gecko_DropElementSnapshot by using SystemGroup. r=heycam This runnable is to delete object only, so using system group should be fine. MozReview-Commit-ID: 8uMxMO3yERG --HG-- extra : rebase_source : 75ae4953d4c91fa0ab9a0c598a1989fa122f8f5a --- layout/style/ServoBindings.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/layout/style/ServoBindings.cpp b/layout/style/ServoBindings.cpp index 9461a75110bd..1aa3e1563d67 100644 --- a/layout/style/ServoBindings.cpp +++ b/layout/style/ServoBindings.cpp @@ -41,6 +41,7 @@ #include "mozilla/ServoElementSnapshot.h" #include "mozilla/ServoRestyleManager.h" #include "mozilla/StyleAnimationValue.h" +#include "mozilla/SystemGroup.h" #include "mozilla/DeclarationBlockInlines.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/ElementInlines.h" @@ -344,7 +345,8 @@ Gecko_DropElementSnapshot(ServoElementSnapshotOwned aSnapshot) // descendants of a new display:none root). if (MOZ_UNLIKELY(!NS_IsMainThread())) { nsCOMPtr task = NS_NewRunnableFunction([=]() { delete aSnapshot; }); - NS_DispatchToMainThread(task.forget()); + SystemGroup::Dispatch("Gecko_DropElementSnapshot", TaskCategory::Other, + task.forget()); } else { delete aSnapshot; } From 44a41925d33e4a9ff4fe1a78882caf866358eccd Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 14 Mar 2017 21:57:34 +0800 Subject: [PATCH 110/169] Bug 1338446 Part 6 - Label LoadTimer in nsFontFaceLoader::StartedLoading. r=heycam Delete #include "mozilla/Logging.h" because it has been included. Add FontFaceSet::Document() to get valid document for nsFontFaceLoader. MozReview-Commit-ID: IAXM9UgvjOE --HG-- extra : rebase_source : e5aa8aadea5e2f9f2e5d73cc718318cf97471d3f --- layout/style/FontFaceSet.h | 2 ++ layout/style/nsFontFaceLoader.cpp | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/layout/style/FontFaceSet.h b/layout/style/FontFaceSet.h index d08fbaf8c8cf..a1473dad61db 100644 --- a/layout/style/FontFaceSet.h +++ b/layout/style/FontFaceSet.h @@ -162,6 +162,8 @@ public: return set ? set->GetPresContext() : nullptr; } + nsIDocument* Document() const { return mDocument; } + // -- Web IDL -------------------------------------------------------------- IMPL_EVENT_HANDLER(loading) diff --git a/layout/style/nsFontFaceLoader.cpp b/layout/style/nsFontFaceLoader.cpp index 2f0ccd634e88..d8bdee0dd063 100644 --- a/layout/style/nsFontFaceLoader.cpp +++ b/layout/style/nsFontFaceLoader.cpp @@ -11,8 +11,6 @@ #include "nsFontFaceLoader.h" -#include "mozilla/Logging.h" - #include "nsError.h" #include "nsContentUtils.h" #include "mozilla/Preferences.h" @@ -55,6 +53,8 @@ nsFontFaceLoader::nsFontFaceLoader(gfxUserFontEntry* aUserFontEntry, mFontFaceSet(aFontFaceSet), mChannel(aChannel) { + MOZ_ASSERT(mFontFaceSet, + "We should get a valid FontFaceSet from the caller!"); mStartTime = TimeStamp::Now(); } @@ -87,10 +87,13 @@ nsFontFaceLoader::StartedLoading(nsIStreamLoader* aStreamLoader) if (loadTimeout > 0) { mLoadTimer = do_CreateInstance("@mozilla.org/timer;1"); if (mLoadTimer) { - mLoadTimer->InitWithFuncCallback(LoadTimerCallback, - static_cast(this), - loadTimeout, - nsITimer::TYPE_ONE_SHOT); + mLoadTimer->SetTarget( + mFontFaceSet->Document()->EventTargetFor(TaskCategory::Other)); + mLoadTimer->InitWithNamedFuncCallback(LoadTimerCallback, + static_cast(this), + loadTimeout, + nsITimer::TYPE_ONE_SHOT, + "LoadTimerCallback"); } } else { mUserFontEntry->mFontDataLoadingState = gfxUserFontEntry::LOADING_SLOWLY; From 8a533e93cf5c7337eb0298e69acde95402bc657c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Sat, 18 Mar 2017 19:41:39 +0300 Subject: [PATCH 111/169] Bug 1341642 - Stylo: Add support for -moz-* pseudo-classes for alt text r=manishearth MozReview-Commit-ID: 1t42xaTtUmb --HG-- extra : rebase_source : 58072c6ea9df8a931671450f31e345e872ef6e53 --- dom/events/EventStates.h | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/dom/events/EventStates.h b/dom/events/EventStates.h index b1b9654ef198..ddab2cdf8beb 100644 --- a/dom/events/EventStates.h +++ b/dom/events/EventStates.h @@ -12,7 +12,7 @@ namespace mozilla { -#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 12 +#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 19 /** * EventStates is the class used to represent the event states of nsIContent @@ -223,6 +223,21 @@ private: #define NS_EVENT_STATE_INVALID NS_DEFINE_EVENT_STATE_MACRO(11) // UI friendly version of :valid pseudo-class. #define NS_EVENT_STATE_MOZ_UI_VALID NS_DEFINE_EVENT_STATE_MACRO(12) +// Content could not be rendered (image/object/etc). +#define NS_EVENT_STATE_BROKEN NS_DEFINE_EVENT_STATE_MACRO(13) +// Content disabled by the user (images turned off, say). +#define NS_EVENT_STATE_USERDISABLED NS_DEFINE_EVENT_STATE_MACRO(14) +// Content suppressed by the user (ad blocking, etc). +#define NS_EVENT_STATE_SUPPRESSED NS_DEFINE_EVENT_STATE_MACRO(15) +// Content is still loading such that there is nothing to show the +// user (eg an image which hasn't started coming in yet). +#define NS_EVENT_STATE_LOADING NS_DEFINE_EVENT_STATE_MACRO(16) +// Handler for the content has been blocked. +#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(17) +// Handler for the content has been disabled. +#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(18) +// Handler for the content has crashed +#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(19) /* * Bits below here do not have Servo-related ordering constraints. @@ -232,42 +247,27 @@ private: */ // Drag is hovering over content. -#define NS_EVENT_STATE_DRAGOVER NS_DEFINE_EVENT_STATE_MACRO(13) +#define NS_EVENT_STATE_DRAGOVER NS_DEFINE_EVENT_STATE_MACRO(20) // Content is required. -#define NS_EVENT_STATE_REQUIRED NS_DEFINE_EVENT_STATE_MACRO(14) +#define NS_EVENT_STATE_REQUIRED NS_DEFINE_EVENT_STATE_MACRO(21) // Content is optional (and can be required). -#define NS_EVENT_STATE_OPTIONAL NS_DEFINE_EVENT_STATE_MACRO(15) +#define NS_EVENT_STATE_OPTIONAL NS_DEFINE_EVENT_STATE_MACRO(22) // Link has been visited. -#define NS_EVENT_STATE_VISITED NS_DEFINE_EVENT_STATE_MACRO(16) +#define NS_EVENT_STATE_VISITED NS_DEFINE_EVENT_STATE_MACRO(23) // Link hasn't been visited. -#define NS_EVENT_STATE_UNVISITED NS_DEFINE_EVENT_STATE_MACRO(17) +#define NS_EVENT_STATE_UNVISITED NS_DEFINE_EVENT_STATE_MACRO(24) // Content value is in-range (and can be out-of-range). -#define NS_EVENT_STATE_INRANGE NS_DEFINE_EVENT_STATE_MACRO(18) +#define NS_EVENT_STATE_INRANGE NS_DEFINE_EVENT_STATE_MACRO(25) // Content value is out-of-range. -#define NS_EVENT_STATE_OUTOFRANGE NS_DEFINE_EVENT_STATE_MACRO(19) +#define NS_EVENT_STATE_OUTOFRANGE NS_DEFINE_EVENT_STATE_MACRO(26) // These two are temporary (see bug 302188) // Content is read-only. -#define NS_EVENT_STATE_MOZ_READONLY NS_DEFINE_EVENT_STATE_MACRO(20) +#define NS_EVENT_STATE_MOZ_READONLY NS_DEFINE_EVENT_STATE_MACRO(27) // Content is editable. -#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(21) +#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(28) // Content is the default one (meaning depends of the context). -#define NS_EVENT_STATE_DEFAULT NS_DEFINE_EVENT_STATE_MACRO(22) -// Content could not be rendered (image/object/etc). -#define NS_EVENT_STATE_BROKEN NS_DEFINE_EVENT_STATE_MACRO(23) -// Content disabled by the user (images turned off, say). -#define NS_EVENT_STATE_USERDISABLED NS_DEFINE_EVENT_STATE_MACRO(24) -// Content suppressed by the user (ad blocking, etc). -#define NS_EVENT_STATE_SUPPRESSED NS_DEFINE_EVENT_STATE_MACRO(25) -// Content is still loading such that there is nothing to show the -// user (eg an image which hasn't started coming in yet). -#define NS_EVENT_STATE_LOADING NS_DEFINE_EVENT_STATE_MACRO(26) -#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(27) -// Handler for the content has been blocked. -#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(28) -// Handler for the content has been disabled. -#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(29) -// Handler for the content has crashed -#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(30) +#define NS_EVENT_STATE_DEFAULT NS_DEFINE_EVENT_STATE_MACRO(29) +#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(30) // Content has focus and should show a ring. #define NS_EVENT_STATE_FOCUSRING NS_DEFINE_EVENT_STATE_MACRO(31) // Content is a submit control and the form isn't valid. From 6d7bb2e928c71132991409c63ead2c21288baacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 20 Mar 2017 17:47:59 +0300 Subject: [PATCH 112/169] Bug 1341642 - Add a reftest for :-moz-broken r=emilio MozReview-Commit-ID: FiWwxDq47W1 --HG-- extra : rebase_source : fae032d6a4d060cacb2c8b2069cfa4368dc59b07 --- layout/reftests/image/moz-broken-matching-1-ref.html | 7 +++++++ layout/reftests/image/moz-broken-matching-1.html | 7 +++++++ layout/reftests/image/reftest.list | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 layout/reftests/image/moz-broken-matching-1-ref.html create mode 100644 layout/reftests/image/moz-broken-matching-1.html diff --git a/layout/reftests/image/moz-broken-matching-1-ref.html b/layout/reftests/image/moz-broken-matching-1-ref.html new file mode 100644 index 000000000000..94bb5e4962b7 --- /dev/null +++ b/layout/reftests/image/moz-broken-matching-1-ref.html @@ -0,0 +1,7 @@ + + + diff --git a/layout/reftests/image/moz-broken-matching-1.html b/layout/reftests/image/moz-broken-matching-1.html new file mode 100644 index 000000000000..eb63194e140b --- /dev/null +++ b/layout/reftests/image/moz-broken-matching-1.html @@ -0,0 +1,7 @@ + + + diff --git a/layout/reftests/image/reftest.list b/layout/reftests/image/reftest.list index 588034fb0a4b..e4e4d7b2f266 100644 --- a/layout/reftests/image/reftest.list +++ b/layout/reftests/image/reftest.list @@ -126,3 +126,5 @@ fuzzy(1,1) == image-orientation-background.html?90&flip image-orientation-r == image-resize-percent-height.html image-resize-ref.html == image-resize-percent-width.html image-resize-ref.html + +== moz-broken-matching-1.html moz-broken-matching-1-ref.html From 4f6cfa8bc70f48afaa639be7b4b8f4b9fcd3b634 Mon Sep 17 00:00:00 2001 From: Shawn Huang Date: Mon, 20 Mar 2017 18:34:15 +0800 Subject: [PATCH 113/169] Bug 1348214 - Clear storage per origin when loading storage test cases, r=jgraham MozReview-Commit-ID: ndsajg7Glb --HG-- extra : rebase_source : 847950b2eaf7f9e1cf779ed5d3c707bc745dd11c --- .../wptrunner/executors/executormarionette.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/testing/web-platform/harness/wptrunner/executors/executormarionette.py b/testing/web-platform/harness/wptrunner/executors/executormarionette.py index 128828e60bd8..174f64b671da 100644 --- a/testing/web-platform/harness/wptrunner/executors/executormarionette.py +++ b/testing/web-platform/harness/wptrunner/executors/executormarionette.py @@ -264,6 +264,23 @@ class MarionetteProtocol(Protocol): with self.marionette.using_context(self.marionette.CONTEXT_CHROME): self.marionette.execute_script(script) + def clear_origin(self, url): + self.logger.info("Clearing origin %s" % (url)) + script = """ + let url = '%s'; + let uri = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService) + .newURI(url); + let ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"] + .getService(Ci.nsIScriptSecurityManager); + let principal = ssm.createCodebasePrincipal(uri, {}); + let qms = Components.classes["@mozilla.org/dom/quota-manager-service;1"] + .getService(Components.interfaces.nsIQuotaManagerService); + qms.clearStoragesForPrincipal(principal, "default", true); + """ % url + with self.marionette.using_context(self.marionette.CONTEXT_CHROME): + self.marionette.execute_script(script) + class RemoteMarionetteProtocol(Protocol): def __init__(self, executor, browser): @@ -325,6 +342,11 @@ class ExecuteAsyncScriptRun(object): self.result_flag = threading.Event() def run(self): + index = self.url.rfind("/storage/"); + if index != -1: + # Clear storage + self.protocol.clear_origin(self.url) + timeout = self.timeout try: From 14f92d0eed183e64ef1ac7b8d9737bc59bcceed5 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Mon, 20 Mar 2017 14:05:21 +0100 Subject: [PATCH 114/169] Bug 1301015 - Re-enable some devtools tests on e10s-multi; r=krizsa Some devtools tests had been forced to run in e10s with just 1 content process in bug 1301340 and bug 1303113 because they were failing. Now there seems to have been enough e10s messaging fixes that these tests work again. It seems safe to re-enable multi-content-processes for them now. MozReview-Commit-ID: ENfDdIXvIAI --HG-- extra : rebase_source : 9f29d7f58088b3a99a3512b9f7e73525cb9a6e7e --- devtools/client/aboutdebugging/test/browser_tabs.js | 6 ------ .../test/browser_animation_spacebar_toggles_animations.js | 6 ------ .../test/browser/browser_toolbox_swap_browsers.js | 6 ------ .../browser_webconsole_show_subresource_security_errors.js | 6 ------ devtools/client/webconsole/test/browser_webconsole_split.js | 4 ---- .../tests/browser/browser_animation_getMultipleStates.js | 6 ------ 6 files changed, 34 deletions(-) diff --git a/devtools/client/aboutdebugging/test/browser_tabs.js b/devtools/client/aboutdebugging/test/browser_tabs.js index e82090607fa5..99e76be5d969 100644 --- a/devtools/client/aboutdebugging/test/browser_tabs.js +++ b/devtools/client/aboutdebugging/test/browser_tabs.js @@ -5,12 +5,6 @@ const TAB_URL = "data:text/html,foo"; -add_task(function* setup() { - yield SpecialPowers.pushPrefEnv({ - set: [["dom.ipc.processCount", 1]] - }); -}); - add_task(function* () { let { tab, document } = yield openAboutDebugging("tabs"); diff --git a/devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js b/devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js index 799ecc28db78..593dbe685c21 100644 --- a/devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js +++ b/devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js @@ -4,12 +4,6 @@ "use strict"; -add_task(function* setup() { - yield SpecialPowers.pushPrefEnv({ - set: [["dom.ipc.processCount", 1]] - }); -}); - // Test that the spacebar key press toggles the toggleAll button state // when a node with no animation is selected. // This test doesn't need to test if animations actually pause/resume diff --git a/devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js b/devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js index 8f7afaf010c2..26bc4d1ee714 100644 --- a/devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js +++ b/devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js @@ -30,12 +30,6 @@ let checkToolbox = Task.async(function* (tab, location) { ok(!!gDevTools.getToolbox(target), `Toolbox exists ${location}`); }); -add_task(function* setup() { - yield SpecialPowers.pushPrefEnv({ - set: [["dom.ipc.processCount", 1]] - }); -}); - add_task(function* () { let tab = yield addTab(TEST_URL); diff --git a/devtools/client/webconsole/test/browser_webconsole_show_subresource_security_errors.js b/devtools/client/webconsole/test/browser_webconsole_show_subresource_security_errors.js index 43cb96bdc487..2f2238d1fbbb 100644 --- a/devtools/client/webconsole/test/browser_webconsole_show_subresource_security_errors.js +++ b/devtools/client/webconsole/test/browser_webconsole_show_subresource_security_errors.js @@ -13,12 +13,6 @@ const TEST_DOC = "https://example.com/browser/devtools/client/webconsole/" + "test/test_bug1092055_shouldwarn.html"; const SAMPLE_MSG = "specified a header that could not be parsed successfully."; -add_task(function* setup() { - yield SpecialPowers.pushPrefEnv({ - set: [["dom.ipc.processCount", 1]] - }); -}); - add_task(function* () { let { browser } = yield loadTab(TEST_URI); diff --git a/devtools/client/webconsole/test/browser_webconsole_split.js b/devtools/client/webconsole/test/browser_webconsole_split.js index a855a246922c..bb858d1c192a 100644 --- a/devtools/client/webconsole/test/browser_webconsole_split.js +++ b/devtools/client/webconsole/test/browser_webconsole_split.js @@ -9,10 +9,6 @@ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for splitting"; function test() { waitForExplicitFinish(); - SpecialPowers.pushPrefEnv({"set": [["dom.ipc.processCount", 1]]}, runTest); -} - -function runTest() { // Test is slow on Linux EC2 instances - Bug 962931 requestLongerTimeout(2); diff --git a/devtools/server/tests/browser/browser_animation_getMultipleStates.js b/devtools/server/tests/browser/browser_animation_getMultipleStates.js index 4436695b0124..2e78aceb61f5 100644 --- a/devtools/server/tests/browser/browser_animation_getMultipleStates.js +++ b/devtools/server/tests/browser/browser_animation_getMultipleStates.js @@ -4,12 +4,6 @@ "use strict"; -add_task(function* setup() { - yield SpecialPowers.pushPrefEnv({ - set: [["dom.ipc.processCount", 1]] - }); -}); - // Check that the duration, iterationCount and delay are retrieved correctly for // multiple animations. From 6896b92768175cd5575c50d0adf81dec2071d7ee Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Mon, 20 Mar 2017 08:31:25 -0700 Subject: [PATCH 115/169] servo: Merge #16045 - Bug 1348487 - stylo: Don't allow combinators in :-moz-any (from mbrubeck:any); r=emilio https://bugzilla.mozilla.org/show_bug.cgi?id=1348487 Source-Repo: https://github.com/servo/servo Source-Revision: 17098ddc8ffde03945387f98f52d1856ff1a8cd8 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 274906c936cbfbaa2cbc04414723e62c56fe348a --- servo/components/style/gecko/selector_parser.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servo/components/style/gecko/selector_parser.rs b/servo/components/style/gecko/selector_parser.rs index 8b3b019dc772..25785beee023 100644 --- a/servo/components/style/gecko/selector_parser.rs +++ b/servo/components/style/gecko/selector_parser.rs @@ -341,6 +341,10 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> { let selectors = parser.parse_comma_separated(|input| { ComplexSelector::parse(self, input) })?; + // Selectors inside `:-moz-any` may not include combinators. + if selectors.iter().any(|s| s.next.is_some()) { + return Err(()) + } NonTSPseudoClass::MozAny(selectors) } _ => return Err(()) From 459dc06e8acf9def2625abb2a9b0c271390d350b Mon Sep 17 00:00:00 2001 From: Kirk Steuber Date: Fri, 10 Mar 2017 14:06:49 -0800 Subject: [PATCH 116/169] Bug 1346405 - Update build/pgo/certs/README so instructions are current and applicable cross-platform r=ted MozReview-Commit-ID: LfhNX9WH0zZ --HG-- extra : rebase_source : cf04c0d266fc378b0ae2278426a0a2c908c9930b --- build/pgo/certs/README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/pgo/certs/README b/build/pgo/certs/README index ba2b346f9ad9..a005ec95ebd2 100644 --- a/build/pgo/certs/README +++ b/build/pgo/certs/README @@ -1,9 +1,9 @@ The certificate authority and server certificates here are generated by $topsrcdir/build/pgo/genpgocert.py. You can generate a new CA cert by running: -$objdir/_virtualenv/bin/python $topsrcdir/build/pgo/genpgocert.py --gen-ca +./mach python build/pgo/genpgocert.py --gen-ca You can generate new server certificates by running: -$objdir/_virtualenv/bin/python $topsrcdir/build/pgo/genpgocert.py --gen-server +./mach python build/pgo/genpgocert.py --gen-server -These will place the new files in this directory where you can commit them. +These commands will modify cert8.db and key3.db. The changes to these should be committed. From 7b64f6d5456599fbf20e58e764d5de149a46dbe6 Mon Sep 17 00:00:00 2001 From: Gabriele Svelto Date: Tue, 14 Mar 2017 14:37:26 +0100 Subject: [PATCH 117/169] Bug 1319071 - Make crash minidumps use the same format for filenames on Linux as on other platforms; r=ted This patch forks the breakpad files used for GUID generation and replaces them with copies living together with the rest of the forked sources. Since other files in the breakpad sources rely on the original files being present they haven't been removed but we deliberately define their inclusion definitions in the build system to prevent them from contributing to the build. This ensures that we always use our own version of the GUID generator while not touching the non-forked sources. MozReview-Commit-ID: 5kW74yAPUDW --HG-- rename : toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc => toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.cc rename : toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.h => toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.h extra : rebase_source : 60eb027258833996777469d2a13142077486bee9 --- .../crash_generation_server.cc | 2 +- .../linux/handler/guid_generator.cc | 108 ++++++++++++++++++ .../linux/handler/guid_generator.h | 48 ++++++++ .../linux/handler/minidump_descriptor.cc | 3 +- .../breakpad-client/linux/moz.build | 5 + .../src/common/linux/moz.build | 2 - tools/profiler/moz.build | 1 - 7 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.cc create mode 100644 toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.h diff --git a/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc b/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc index de1bfeb56a03..cb15941746d5 100644 --- a/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc +++ b/toolkit/crashreporter/breakpad-client/linux/crash_generation/crash_generation_server.cc @@ -44,9 +44,9 @@ #include "linux/crash_generation/crash_generation_server.h" #include "linux/crash_generation/client_info.h" #include "linux/handler/exception_handler.h" +#include "linux/handler/guid_generator.h" #include "linux/minidump_writer/minidump_writer.h" #include "common/linux/eintr_wrapper.h" -#include "common/linux/guid_creator.h" #include "common/linux/safe_readlink.h" static const char kCommandQuit = 'x'; diff --git a/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.cc b/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.cc new file mode 100644 index 000000000000..b0ef05bd9d0e --- /dev/null +++ b/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.cc @@ -0,0 +1,108 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "linux/handler/guid_generator.h" + +#include +#include +#include +#include +#include +#include + +// +// GUIDGenerator +// +// This class is used to generate random GUID. +// Currently use random number to generate a GUID since Linux has +// no native GUID generator. This should be OK since we don't expect +// crash to happen very offen. +// +class GUIDGenerator { + public: + static uint16_t BytesToUInt16(const uint8_t bytes[]) { + return ((uint16_t) bytes[1] << 8) | ((uint16_t) bytes[0]); + } + + // The last field in a GUID is 48 bits long so we're converting only 6 bytes + static uint64_t BytesToUInt48(const uint8_t bytes[]) { + return ((uint64_t) bytes[0] << 40) | ((uint64_t) bytes[1] << 32) | + ((uint64_t) bytes[2] << 24) | ((uint64_t) bytes[3] << 16) | + ((uint64_t) bytes[4] << 8) | (uint64_t) bytes[5]; + } + + static void UInt32ToBytes(uint8_t bytes[], uint32_t n) { + bytes[0] = n & 0xff; + bytes[1] = (n >> 8) & 0xff; + bytes[2] = (n >> 16) & 0xff; + bytes[3] = (n >> 24) & 0xff; + } + + static bool CreateGUID(GUID *guid) { + InitOnce(); + guid->data1 = random(); + guid->data2 = (uint16_t)(random()); + guid->data3 = (uint16_t)(random()); + UInt32ToBytes(&guid->data4[0], random()); + UInt32ToBytes(&guid->data4[4], random()); + return true; + } + + private: + static void InitOnce() { + pthread_once(&once_control, &InitOnceImpl); + } + + static void InitOnceImpl() { + srandom(time(NULL)); + } + + static pthread_once_t once_control; +}; + +pthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT; + +bool CreateGUID(GUID *guid) { + return GUIDGenerator::CreateGUID(guid); +} + +// Parse guid to string. +bool GUIDToString(const GUID *guid, char *buf, size_t buf_len) { + // Should allow more space the the max length of GUID. + assert(buf_len > kGUIDStringLength); + int num = snprintf(buf, buf_len, kGUIDFormatString, + guid->data1, guid->data2, guid->data3, + GUIDGenerator::BytesToUInt16(&(guid->data4[0])), + GUIDGenerator::BytesToUInt48(&(guid->data4[2]))); + if (num != kGUIDStringLength) + return false; + + buf[num] = '\0'; + return true; +} diff --git a/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.h b/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.h new file mode 100644 index 000000000000..de97eda1cbdc --- /dev/null +++ b/toolkit/crashreporter/breakpad-client/linux/handler/guid_generator.h @@ -0,0 +1,48 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef LINUX_HANDLER_GUID_GENERATOR_H__ +#define LINUX_HANDLER_GUID_GENERATOR_H__ + +#include "google_breakpad/common/minidump_format.h" + +typedef MDGUID GUID; + +// Format string for parsing GUID. +const char kGUIDFormatString[] = "%08x-%04x-%04x-%04x-%012" PRIx64; +// Length of GUID string. Don't count the ending '\0'. +const size_t kGUIDStringLength = 36; + +// Create a guid. +bool CreateGUID(GUID *guid); + +// Get the string from guid. +bool GUIDToString(const GUID *guid, char *buf, size_t buf_len); + +#endif diff --git a/toolkit/crashreporter/breakpad-client/linux/handler/minidump_descriptor.cc b/toolkit/crashreporter/breakpad-client/linux/handler/minidump_descriptor.cc index 4d4bd162805d..f61db98d5a39 100644 --- a/toolkit/crashreporter/breakpad-client/linux/handler/minidump_descriptor.cc +++ b/toolkit/crashreporter/breakpad-client/linux/handler/minidump_descriptor.cc @@ -29,10 +29,9 @@ #include +#include "linux/handler/guid_generator.h" #include "linux/handler/minidump_descriptor.h" -#include "common/linux/guid_creator.h" - namespace google_breakpad { //static diff --git a/toolkit/crashreporter/breakpad-client/linux/moz.build b/toolkit/crashreporter/breakpad-client/linux/moz.build index 71a4389406d2..73a08eb16e62 100644 --- a/toolkit/crashreporter/breakpad-client/linux/moz.build +++ b/toolkit/crashreporter/breakpad-client/linux/moz.build @@ -10,6 +10,7 @@ UNIFIED_SOURCES += [ 'dump_writer_common/thread_info.cc', 'dump_writer_common/ucontext_reader.cc', 'handler/exception_handler.cc', + 'handler/guid_generator.cc', 'handler/minidump_descriptor.cc', 'log/log.cc', 'microdump_writer/microdump_writer.cc', @@ -18,6 +19,10 @@ UNIFIED_SOURCES += [ 'minidump_writer/minidump_writer.cc', ] +# On Linux we override the guid_creator.h header and use our own instead +if CONFIG['OS_TARGET'] == 'Linux' or CONFIG['OS_TARGET'] == 'Android': + DEFINES['COMMON_LINUX_GUID_CREATOR_H__'] = 1 + if CONFIG['OS_TARGET'] == 'Android': LOCAL_INCLUDES += [ '/toolkit/crashreporter/google-breakpad/src/common/android/include', diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/moz.build b/toolkit/crashreporter/google-breakpad/src/common/linux/moz.build index 7450f6ba3f29..75e1ea2df162 100644 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/moz.build +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/moz.build @@ -6,7 +6,6 @@ UNIFIED_SOURCES += [ 'elfutils.cc', - 'guid_creator.cc', 'linux_libc_support.cc', 'memory_mapped_file.cc', 'safe_readlink.cc', @@ -29,7 +28,6 @@ HOST_SOURCES += [ 'elf_symbols_to_module.cc', 'elfutils.cc', 'file_id.cc', - 'guid_creator.cc', 'linux_libc_support.cc', 'memory_mapped_file.cc', ] diff --git a/tools/profiler/moz.build b/tools/profiler/moz.build index bd58736fd17f..da4daed82837 100644 --- a/tools/profiler/moz.build +++ b/tools/profiler/moz.build @@ -60,7 +60,6 @@ if CONFIG['MOZ_GECKO_PROFILER']: SOURCES += [ '/toolkit/crashreporter/google-breakpad/src/common/linux/elfutils.cc', '/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc', - '/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc', '/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.cc', '/toolkit/crashreporter/google-breakpad/src/common/linux/memory_mapped_file.cc', ] From 9b71d631d4fc63eb2aa4441232b6600aeb000d08 Mon Sep 17 00:00:00 2001 From: Federico Padua Date: Sat, 18 Mar 2017 21:18:27 +0100 Subject: [PATCH 118/169] Bug 1344833 - Enable flake8 rule E128: "continuation line under-indented for visual indent". r=Dexter This patch enables flake8 rule E128: "continuation line under-indented for visual indent" in toolkit/components/telemetry by removing the relative E128 entry from toolkit/components/telemetry/.flake8 and fixing the files for which the E128 error was reported. Precisely 10 errors violating E128 rule were found and solved. MozReview-Commit-ID: 4sNXIxGFJQN --HG-- extra : rebase_source : bc2ef3bf1cc4bbe5b0450458226af07a83c30f30 --- toolkit/components/telemetry/.flake8 | 2 +- .../telemetry/gen-histogram-data.py | 20 +++++++++---------- .../components/telemetry/histogram_tools.py | 8 ++++---- toolkit/components/telemetry/parse_scalars.py | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/toolkit/components/telemetry/.flake8 b/toolkit/components/telemetry/.flake8 index 4559a3d82bd5..cfed80d4d151 100644 --- a/toolkit/components/telemetry/.flake8 +++ b/toolkit/components/telemetry/.flake8 @@ -1,5 +1,5 @@ [flake8] # See http://pep8.readthedocs.io/en/latest/intro.html#configuration -ignore = E121, E123, E126, E129, E133, E226, E241, E242, E704, W503, E402, E128, E501, E202, W602, E127, W601 +ignore = E121, E123, E126, E129, E133, E226, E241, E242, E704, W503, E402, E501, E202, W602, E127, W601 max-line-length = 99 filename = *.py, +.lint diff --git a/toolkit/components/telemetry/gen-histogram-data.py b/toolkit/components/telemetry/gen-histogram-data.py index 1c6813bb2426..151c536f25e3 100644 --- a/toolkit/components/telemetry/gen-histogram-data.py +++ b/toolkit/components/telemetry/gen-histogram-data.py @@ -21,16 +21,16 @@ def print_array_entry(output, histogram, name_index, exp_index, label_index, lab if cpp_guard: print("#if defined(%s)" % cpp_guard, file=output) print(" { %s, %s, %s, %s, %d, %d, %s, %d, %d, %s }," - % (histogram.low(), - histogram.high(), - histogram.n_buckets(), - histogram.nsITelemetry_kind(), - name_index, - exp_index, - histogram.dataset(), - label_index, - label_count, - "true" if histogram.keyed() else "false"), file=output) + % (histogram.low(), + histogram.high(), + histogram.n_buckets(), + histogram.nsITelemetry_kind(), + name_index, + exp_index, + histogram.dataset(), + label_index, + label_count, + "true" if histogram.keyed() else "false"), file=output) if cpp_guard: print("#endif", file=output) diff --git a/toolkit/components/telemetry/histogram_tools.py b/toolkit/components/telemetry/histogram_tools.py index a745af236dbd..ce13627330b7 100644 --- a/toolkit/components/telemetry/histogram_tools.py +++ b/toolkit/components/telemetry/histogram_tools.py @@ -371,14 +371,14 @@ associated with the histogram. Returns None if no guarding is necessary.""" continue if not isinstance(definition[key], key_type): raise ValueError, ('value for key "{0}" in Histogram "{1}" ' - 'should be {2}').format(key, name, nice_type_name(key_type)) + 'should be {2}').format(key, name, nice_type_name(key_type)) for key, key_type in type_checked_list_fields.iteritems(): if key not in definition: continue if not all(isinstance(x, key_type) for x in definition[key]): raise ValueError, ('all values for list "{0}" in Histogram "{1}" ' - 'should be {2}').format(key, name, nice_type_name(key_type)) + 'should be {2}').format(key, name, nice_type_name(key_type)) @staticmethod def check_keys(name, definition, allowed_keys): @@ -393,8 +393,8 @@ associated with the histogram. Returns None if no guarding is necessary.""" if whitelists is not None and self._n_buckets > 100 and type(self._n_buckets) is int: if self._name not in whitelists['n_buckets']: raise KeyError, ('New histogram "%s" is not permitted to have more than 100 buckets. ' - 'Histograms with large numbers of buckets use disproportionately high amounts of resources. ' - 'Contact the Telemetry team (e.g. in #telemetry) if you think an exception ought to be made.' % self._name) + 'Histograms with large numbers of buckets use disproportionately high amounts of resources. ' + 'Contact the Telemetry team (e.g. in #telemetry) if you think an exception ought to be made.' % self._name) @staticmethod def boolean_flag_bucket_parameters(definition): diff --git a/toolkit/components/telemetry/parse_scalars.py b/toolkit/components/telemetry/parse_scalars.py index b6c6d240c0a0..4a3713047fab 100644 --- a/toolkit/components/telemetry/parse_scalars.py +++ b/toolkit/components/telemetry/parse_scalars.py @@ -49,7 +49,7 @@ class ScalarType: for n in [group_name, probe_name]: if len(n) > MAX_NAME_LENGTH: raise ValueError("Name '{}' exceeds maximum name length of {} characters." - .format(n, MAX_NAME_LENGTH)) + .format(n, MAX_NAME_LENGTH)) def check_name(name, error_msg_prefix, allowed_char_regexp): # Check if we only have the allowed characters. @@ -60,8 +60,8 @@ class ScalarType: # Don't allow leading/trailing digits, '.' or '_'. if re.search(r'(^[\d\._])|([\d\._])$', name): raise ValueError(error_msg_prefix + - " name must not have a leading/trailing digit, a dot or underscore. Got: '{}'" - .format(name)) + " name must not have a leading/trailing digit, a dot or underscore. Got: '{}'" + .format(name)) check_name(group_name, 'Group', r'\.') check_name(probe_name, 'Probe', r'_') @@ -115,7 +115,7 @@ class ScalarType: # Checks the type for all the fields. wrong_type_names = ['{} must be {}'.format(f, ALL_FIELDS[f].__name__) - for f in definition.keys() if not isinstance(definition[f], ALL_FIELDS[f])] + for f in definition.keys() if not isinstance(definition[f], ALL_FIELDS[f])] if len(wrong_type_names) > 0: raise TypeError(self._name + ' - ' + ', '.join(wrong_type_names)) @@ -237,7 +237,7 @@ class ScalarType: release_channel_collection = \ self._definition.get('release_channel_collection', 'opt-in') return 'nsITelemetry::' + ('DATASET_RELEASE_CHANNEL_OPTOUT' - if release_channel_collection == 'opt-out' else 'DATASET_RELEASE_CHANNEL_OPTIN') + if release_channel_collection == 'opt-out' else 'DATASET_RELEASE_CHANNEL_OPTIN') @property def cpp_guard(self): From d7e6cc08c3797ce2112f41f2bc24005b08a0c14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Thu, 16 Mar 2017 15:11:05 +0100 Subject: [PATCH 119/169] Bug 1347928 - Remove legacy information-*.png icons. r=jaws MozReview-Commit-ID: 47FAxEjg4KG --HG-- extra : rebase_source : 6b67778d0129752867b4f1d5933e016464a398c9 --- .../migration/content/aboutWelcomeBack.xhtml | 2 +- browser/themes/shared/aboutProviderDirectory.css | 2 +- .../shared/components/notification-box.css | 3 ++- .../test_autofill_default_behavior.js | 10 +++++----- .../places/tests/unit/test_bookmarks_html.js | 2 +- toolkit/themes/osx/global/global.css | 2 +- .../themes/osx/global/icons/information-16.png | Bin 818 -> 0 bytes .../themes/osx/global/icons/information-24.png | Bin 1289 -> 0 bytes .../themes/osx/global/icons/information-32.png | Bin 1773 -> 0 bytes .../themes/osx/global/icons/information-64.png | Bin 3687 -> 0 bytes .../osx/global/icons/information-large.png | Bin 2592 -> 0 bytes toolkit/themes/osx/global/jar.mn | 5 ----- toolkit/themes/shared/non-mac.jar.inc.mn | 3 --- toolkit/themes/windows/global/global.css | 2 +- .../windows/global/icons/information-24.png | Bin 1477 -> 0 bytes .../windows/global/icons/information-32.png | Bin 2080 -> 0 bytes toolkit/themes/windows/global/jar.mn | 1 + 17 files changed, 13 insertions(+), 19 deletions(-) delete mode 100644 toolkit/themes/osx/global/icons/information-16.png delete mode 100644 toolkit/themes/osx/global/icons/information-24.png delete mode 100644 toolkit/themes/osx/global/icons/information-32.png delete mode 100644 toolkit/themes/osx/global/icons/information-64.png delete mode 100644 toolkit/themes/osx/global/icons/information-large.png delete mode 100644 toolkit/themes/windows/global/icons/information-24.png delete mode 100644 toolkit/themes/windows/global/icons/information-32.png diff --git a/browser/components/migration/content/aboutWelcomeBack.xhtml b/browser/components/migration/content/aboutWelcomeBack.xhtml index 058a329755f4..d4e4b120d7ef 100644 --- a/browser/components/migration/content/aboutWelcomeBack.xhtml +++ b/browser/components/migration/content/aboutWelcomeBack.xhtml @@ -20,7 +20,7 @@ &welcomeback2.tabtitle; - + + + + + + + +
+

+
+ + diff --git a/gfx/layers/apz/test/mochitest/mochitest.ini b/gfx/layers/apz/test/mochitest/mochitest.ini index 5f7807fb510e..0696805561e2 100644 --- a/gfx/layers/apz/test/mochitest/mochitest.ini +++ b/gfx/layers/apz/test/mochitest/mochitest.ini @@ -10,6 +10,7 @@ helper_bug1280013.html helper_bug1285070.html helper_bug1299195.html + helper_bug1346632.html helper_click.html helper_div_pan.html helper_drag_click.html diff --git a/gfx/layers/apz/test/mochitest/test_group_mouseevents.html b/gfx/layers/apz/test/mochitest/test_group_mouseevents.html index dcf71f0cc023..afe89d4d4490 100644 --- a/gfx/layers/apz/test/mochitest/test_group_mouseevents.html +++ b/gfx/layers/apz/test/mochitest/test_group_mouseevents.html @@ -17,7 +17,9 @@ var subtests = [ // Sanity test for click but with some mouse movement between the down and up {'file': 'helper_drag_click.html'}, // Test for dragging on a fake-scrollbar element that scrolls the page - {'file': 'helper_drag_scroll.html'} + {'file': 'helper_drag_scroll.html'}, + // Test for dragging the scrollbar with a fixed-pos element overlaying it + {'file': 'helper_bug1346632.html'} ]; if (isApzEnabled()) { From d6adf366f63717393c1043e06a7015878458793f Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Fri, 17 Mar 2017 13:33:56 -0700 Subject: [PATCH 124/169] Bug 1344393 - Add StageParameters for Oculus r=daoshengmu MozReview-Commit-ID: 9OkleewwS2b --HG-- extra : rebase_source : 75bffc843ba9a3d869700334c41ceb910707e5f4 --- gfx/vr/gfxVROculus.cpp | 54 +++++++++++++++++++++++++++++++++++++++ gfx/vr/gfxVROculus.h | 4 ++- gfx/vr/ovr_capi_dynamic.h | 19 +++++++++++--- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/gfx/vr/gfxVROculus.cpp b/gfx/vr/gfxVROculus.cpp index a72b9d736daa..b9d1bd4972c8 100644 --- a/gfx/vr/gfxVROculus.cpp +++ b/gfx/vr/gfxVROculus.cpp @@ -98,6 +98,7 @@ static pfn_ovr_GetFloatArray ovr_GetFloatArray = nullptr; static pfn_ovr_SetFloatArray ovr_SetFloatArray = nullptr; static pfn_ovr_GetString ovr_GetString = nullptr; static pfn_ovr_SetString ovr_SetString = nullptr; +static pfn_ovr_GetBoundaryDimensions ovr_GetBoundaryDimensions = nullptr; #ifdef XP_WIN static pfn_ovr_CreateTextureSwapChainDX ovr_CreateTextureSwapChainDX = nullptr; @@ -286,6 +287,7 @@ InitializeOculusCAPI() REQUIRE_FUNCTION(ovr_SetFloatArray); REQUIRE_FUNCTION(ovr_GetString); REQUIRE_FUNCTION(ovr_SetString); + REQUIRE_FUNCTION(ovr_GetBoundaryDimensions); #ifdef XP_WIN @@ -356,6 +358,7 @@ VRDisplayOculus::VRDisplayOculus(ovrSession aSession) , mVertexBuffer(nullptr) , mInputLayout(nullptr) , mIsPresenting(false) + , mEyeHeight(OVR_DEFAULT_EYE_HEIGHT) { MOZ_COUNT_CTOR_INHERITED(VRDisplayOculus, VRDisplayHost); @@ -373,6 +376,7 @@ VRDisplayOculus::VRDisplayOculus(ovrSession aSession) if (mDesc.AvailableTrackingCaps & ovrTrackingCap_Position) { mDisplayInfo.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_Position; mDisplayInfo.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_LinearAcceleration; + mDisplayInfo.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_StageParameters; } mDisplayInfo.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_External; mDisplayInfo.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_MountDetection; @@ -401,6 +405,8 @@ VRDisplayOculus::VRDisplayOculus(ovrSession aSession) // take the max of both for eye resolution mDisplayInfo.mEyeResolution.width = std::max(texSize[VRDisplayInfo::Eye_Left].w, texSize[VRDisplayInfo::Eye_Right].w); mDisplayInfo.mEyeResolution.height = std::max(texSize[VRDisplayInfo::Eye_Left].h, texSize[VRDisplayInfo::Eye_Right].h); + + UpdateStageParameters(); } VRDisplayOculus::~VRDisplayOculus() { @@ -418,10 +424,49 @@ VRDisplayOculus::Destroy() } } +void +VRDisplayOculus::UpdateStageParameters() +{ + ovrVector3f playArea; + ovrResult res = ovr_GetBoundaryDimensions(mSession, ovrBoundary_PlayArea, &playArea); + if (res == ovrSuccess) { + mDisplayInfo.mStageSize.width = playArea.x; + mDisplayInfo.mStageSize.height = playArea.z; + } else { + // If we fail, fall back to reasonable defaults. + // 1m x 1m space + mDisplayInfo.mStageSize.width = 1.0f; + mDisplayInfo.mStageSize.height = 1.0f; + } + + mEyeHeight = ovr_GetFloat(mSession, OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT); + + mDisplayInfo.mSittingToStandingTransform._11 = 1.0f; + mDisplayInfo.mSittingToStandingTransform._12 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._13 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._14 = 0.0f; + + mDisplayInfo.mSittingToStandingTransform._21 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._22 = 1.0f; + mDisplayInfo.mSittingToStandingTransform._23 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._24 = 0.0f; + + mDisplayInfo.mSittingToStandingTransform._31 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._32 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._33 = 1.0f; + mDisplayInfo.mSittingToStandingTransform._34 = 0.0f; + + mDisplayInfo.mSittingToStandingTransform._41 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._42 = mEyeHeight; + mDisplayInfo.mSittingToStandingTransform._43 = 0.0f; + mDisplayInfo.mSittingToStandingTransform._44 = 1.0f; +} + void VRDisplayOculus::ZeroSensor() { ovr_RecenterTrackingOrigin(mSession); + UpdateStageParameters(); } VRHMDSensorState @@ -440,6 +485,7 @@ VRDisplayOculus::GetSensorState() result = GetSensorState(frameDelta); result.inputFrameID = mInputFrameID; mLastSensorState[result.inputFrameID % kMaxLatencyFrames] = result; + result.position[1] -= mEyeHeight; return result; } @@ -988,6 +1034,11 @@ VRSystemManagerOculus::GetHMDs(nsTArray>& aHMDResult) ovrResult orv = ovr_Create(&session, &luid); if (orv == ovrSuccess) { mSession = session; + orv = ovr_SetTrackingOriginType(session, ovrTrackingOrigin_FloorLevel); + if (orv != ovrSuccess) { + NS_WARNING("ovr_SetTrackingOriginType failed.\n"); + } + mHMDInfo = new VRDisplayOculus(session); } } @@ -1099,6 +1150,9 @@ VRSystemManagerOculus::HandleInput() poseState.linearAcceleration[0] = pose.LinearAcceleration.x; poseState.linearAcceleration[1] = pose.LinearAcceleration.y; poseState.linearAcceleration[2] = pose.LinearAcceleration.z; + + float eyeHeight = ovr_GetFloat(mSession, OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT); + poseState.position[1] -= eyeHeight; } HandlePoseTracking(i, poseState, controller); } diff --git a/gfx/vr/gfxVROculus.h b/gfx/vr/gfxVROculus.h index 7a233925773d..3d99138f5a93 100644 --- a/gfx/vr/gfxVROculus.h +++ b/gfx/vr/gfxVROculus.h @@ -48,6 +48,7 @@ protected: const VRHMDSensorState& aSensorState, const gfx::Rect& aLeftEyeRect, const gfx::Rect& aRightEyeRect) override; + void UpdateStageParameters(); public: explicit VRDisplayOculus(ovrSession aSession); @@ -82,7 +83,8 @@ protected: RefPtr mInputLayout; bool mIsPresenting; - + float mEyeHeight; + bool UpdateConstantBuffers(); struct Vertex diff --git a/gfx/vr/ovr_capi_dynamic.h b/gfx/vr/ovr_capi_dynamic.h index edf2b78a3d94..9a4ae06ba056 100644 --- a/gfx/vr/ovr_capi_dynamic.h +++ b/gfx/vr/ovr_capi_dynamic.h @@ -567,8 +567,15 @@ typedef enum { ovrDebugHudStereo_EnumSize = 0x7fffffff } ovrDebugHudStereoMode; +typedef enum { + // Outer boundary - closely represents user setup walls + ovrBoundary_Outer = 0x0001, + // Play area - safe rectangular area inside outer boundary which can optionally be used to restrict user interactions and motion. + ovrBoundary_PlayArea = 0x0100, +} ovrBoundaryType; + typedef ovrBool(OVR_PFN* pfn_ovr_GetBool)(ovrSession session, const char* propertyName, ovrBool defaultVal); -typedef ovrBool(OVR_PFN* pfn_ovr_SetBool)(ovrSession session, const char* propertyName, ovrBool value); +typedef ovrBool(OVR_PFN* pfn_ovr_SetBool)(ovrSession session, const char* propertyName, ovrBool value); typedef int (OVR_PFN* pfn_ovr_GetInt)(ovrSession session, const char* propertyName, int defaultVal); typedef ovrBool (OVR_PFN* pfn_ovr_SetInt)(ovrSession session, const char* propertyName, int value); typedef float (OVR_PFN* pfn_ovr_GetFloat)(ovrSession session, const char* propertyName, float defaultVal); @@ -581,8 +588,9 @@ typedef const char* (OVR_PFN* pfn_ovr_GetString)(ovrSession session, const char* const char* defaultVal); typedef ovrBool (OVR_PFN* pfn_ovr_SetString)(ovrSession session, const char* propertyName, const char* value); - - +typedef ovrResult (OVR_PFN* pfn_ovr_GetBoundaryDimensions)(ovrSession session, + ovrBoundaryType boundaryType, + ovrVector3f* outDimensions); typedef enum { ovrError_MemoryAllocationFailure = -1000, @@ -714,7 +722,10 @@ typedef ovrResult (OVR_PFN* pfn_ovr_GetMirrorTextureBufferGL)(ovrSession session ovrMirrorTexture mirrorTexture, unsigned int* out_TexId); -#ifdef __cplusplus +#define OVR_KEY_EYE_HEIGHT "EyeHeight" // float meters +#define OVR_DEFAULT_EYE_HEIGHT 1.675f + +#ifdef __cplusplus } #endif From 4e410934afcc4eba93e414dc4200e179b8c3213c Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Wed, 15 Mar 2017 16:40:57 -0700 Subject: [PATCH 125/169] Bug 1346923 - Remove PVRManager::GetDisplays sync IPC r=daoshengmu,kanru - PVRManager::GetDisplays was a sync IPC that was part of an optimization for a use case that has been eliminated by changes to the WebVR spec. - This was an optimization for Navigator.activeVRDisplays that would allow enumeration of displays active in any content process without powering on any additional VR hardware. This will no longer be necessary as the activeVRDisplays has been restricted to returning only the displays active in the current javascript context. MozReview-Commit-ID: F6sOtM9nups --HG-- extra : rebase_source : bd8967fab9677206d998eea922c8d1640551de1c --- gfx/vr/ipc/PVRManager.ipdl | 4 ---- gfx/vr/ipc/VRManagerChild.cpp | 10 ---------- gfx/vr/ipc/VRManagerParent.cpp | 8 -------- gfx/vr/ipc/VRManagerParent.h | 1 - ipc/ipdl/sync-messages.ini | 2 -- 5 files changed, 25 deletions(-) diff --git a/gfx/vr/ipc/PVRManager.ipdl b/gfx/vr/ipc/PVRManager.ipdl index 61e1bff271a6..2920a352560c 100644 --- a/gfx/vr/ipc/PVRManager.ipdl +++ b/gfx/vr/ipc/PVRManager.ipdl @@ -45,10 +45,6 @@ parent: // asynchronously to children via UpdateDisplayInfo. async RefreshDisplays(); - // GetDisplays synchronously returns the VR displays that have already been - // enumerated by RefreshDisplays() but does not enumerate new ones. - sync GetDisplays() returns(VRDisplayInfo[] aDisplayInfo); - // Reset the sensor of the display identified by aDisplayID so that the current // sensor state is the "Zero" position. async ResetSensor(uint32_t aDisplayID); diff --git a/gfx/vr/ipc/VRManagerChild.cpp b/gfx/vr/ipc/VRManagerChild.cpp index 5ee0b9af4207..d33951cb4d77 100644 --- a/gfx/vr/ipc/VRManagerChild.cpp +++ b/gfx/vr/ipc/VRManagerChild.cpp @@ -293,16 +293,6 @@ VRManagerChild::RecvUpdateDisplayInfo(nsTArray&& aDisplayUpdates) bool VRManagerChild::GetVRDisplays(nsTArray>& aDisplays) { - if (!mDisplaysInitialized) { - /** - * If we haven't received any asynchronous callback after requesting - * display enumeration with RefreshDisplays, get the existing displays - * that have already been enumerated by other VRManagerChild instances. - */ - nsTArray displays; - Unused << SendGetDisplays(&displays); - UpdateDisplayInfo(displays); - } aDisplays = mDisplays; return true; } diff --git a/gfx/vr/ipc/VRManagerParent.cpp b/gfx/vr/ipc/VRManagerParent.cpp index e413f24d8b4d..af72b18a7253 100644 --- a/gfx/vr/ipc/VRManagerParent.cpp +++ b/gfx/vr/ipc/VRManagerParent.cpp @@ -241,14 +241,6 @@ VRManagerParent::RecvRefreshDisplays() return IPC_OK(); } -mozilla::ipc::IPCResult -VRManagerParent::RecvGetDisplays(nsTArray *aDisplays) -{ - VRManager* vm = VRManager::Get(); - vm->GetVRDisplayInfo(*aDisplays); - return IPC_OK(); -} - mozilla::ipc::IPCResult VRManagerParent::RecvResetSensor(const uint32_t& aDisplayID) { diff --git a/gfx/vr/ipc/VRManagerParent.h b/gfx/vr/ipc/VRManagerParent.h index 28d12d5a2200..0eaa18669729 100644 --- a/gfx/vr/ipc/VRManagerParent.h +++ b/gfx/vr/ipc/VRManagerParent.h @@ -86,7 +86,6 @@ protected: void OnChannelConnected(int32_t pid) override; virtual mozilla::ipc::IPCResult RecvRefreshDisplays() override; - virtual mozilla::ipc::IPCResult RecvGetDisplays(nsTArray *aDisplays) override; virtual mozilla::ipc::IPCResult RecvResetSensor(const uint32_t& aDisplayID) override; virtual mozilla::ipc::IPCResult RecvGetSensorState(const uint32_t& aDisplayID, VRHMDSensorState* aState) override; virtual mozilla::ipc::IPCResult RecvSetHaveEventListener(const bool& aHaveEventListener) override; diff --git a/ipc/ipdl/sync-messages.ini b/ipc/ipdl/sync-messages.ini index 22682b2489bc..be20e076a070 100644 --- a/ipc/ipdl/sync-messages.ini +++ b/ipc/ipdl/sync-messages.ini @@ -949,8 +949,6 @@ description = description = [PWebRenderBridge::DPGetSnapshot] description = -[PVRManager::GetDisplays] -description = [PVRManager::GetSensorState] description = [PVRManager::SetHaveEventListener] From c6610ae7fd976426cae1ce07488451bf9f5ab35e Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Wed, 15 Mar 2017 14:53:12 -0700 Subject: [PATCH 126/169] Bug 1333472 - Try to fix intermittent failures in browser_windowactivation.js. r=Felipe MozReview-Commit-ID: E1jG1vLznvk --HG-- extra : rebase_source : 31417c4ab76f822462e4e7367ae37bbfe7a4d411 --- .../test/general/browser_windowactivation.js | 66 ++++++++----------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/browser/base/content/test/general/browser_windowactivation.js b/browser/base/content/test/general/browser_windowactivation.js index 73e972a45592..0102c7e958be 100644 --- a/browser/base/content/test/general/browser_windowactivation.js +++ b/browser/base/content/test/general/browser_windowactivation.js @@ -4,39 +4,31 @@ /* eslint-env mozilla/frame-script */ -var testPage = "data:text/html,
"; +var testPage = "data:text/html;charset=utf-8,
"; var colorChangeNotifications = 0; var otherWindow; var browser1, browser2; -function test() { - waitForExplicitFinish(); - waitForFocus(reallyRunTests); -} +add_task(function* reallyRunTests() { -function reallyRunTests() { + let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, testPage); + browser1 = tab1.linkedBrowser; - let tab1 = gBrowser.addTab(); - let tab2 = gBrowser.addTab(); - browser1 = gBrowser.getBrowserForTab(tab1); - browser2 = gBrowser.getBrowserForTab(tab2); + // This can't use openNewForegroundTab because if we focus tab2 now, we + // won't send a focus event during test 6, further down in this file. + let tab2 = gBrowser.addTab(testPage); + browser2 = tab2.linkedBrowser; + yield BrowserTestUtils.browserLoaded(browser2); + + browser1.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true); + browser2.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true); gURLBar.focus(); - var loadCount = 0; - function check() { - // wait for both tabs to load - if (++loadCount != 2) { - return; - } - - browser1.removeEventListener("load", check, true); - browser2.removeEventListener("load", check, true); - - sendGetBackgroundRequest(true); - } + let testFinished = {}; + testFinished.promise = new Promise(resolve => testFinished.resolve = resolve); // The test performs four checks, using -moz-window-inactive on two child tabs. // First, the initial state should be transparent. The second check is done @@ -74,7 +66,7 @@ function reallyRunTests() { break; case 8: is(message.data.color, "rgba(0, 0, 0, 0)", "second window after tab switch"); - finishTest(); + testFinished.resolve(); break; case 9: ok(false, "too many color change notifications"); @@ -97,16 +89,17 @@ function reallyRunTests() { ok(message.data.ok, "Test:DeactivateEvent"); }); - browser1.addEventListener("load", check, true); - browser2.addEventListener("load", check, true); - browser1.contentWindow.location = testPage; - browser2.contentWindow.location = testPage; - - browser1.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true); - browser2.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true); - gBrowser.selectedTab = tab1; -} + + // Start the test. + sendGetBackgroundRequest(true); + + yield testFinished.promise; + + yield BrowserTestUtils.removeTab(tab1); + yield BrowserTestUtils.removeTab(tab2); + otherWindow = null; +}); function sendGetBackgroundRequest(ifChanged) { browser1.messageManager.sendAsyncMessage("Test:GetBackgroundColor", { ifChanged }); @@ -114,19 +107,12 @@ function sendGetBackgroundRequest(ifChanged) { } function runOtherWindowTests() { - otherWindow = window.open("data:text/html,Hi", "", "chrome"); + otherWindow = window.open("data:text/html;charset=utf-8,Hi", "", "chrome"); waitForFocus(function() { sendGetBackgroundRequest(true); }, otherWindow); } -function finishTest() { - gBrowser.removeCurrentTab(); - gBrowser.removeCurrentTab(); - otherWindow = null; - finish(); -} - function childFunction() { let oldColor = null; From d6c9b04db10bfb20002bfcda12945011b51ff9a3 Mon Sep 17 00:00:00 2001 From: David Teller Date: Mon, 20 Mar 2017 16:57:14 +0100 Subject: [PATCH 127/169] Bug 1348883 - Clarifying histogram DOM_SCRIPT_SRC_ENCODING;r=francois MozReview-Commit-ID: KT2zgsuoeAT --HG-- extra : rebase_source : 9757e8d6a6d6beb85392582aa4f75f4ac88498c7 --- toolkit/components/telemetry/Histograms.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index d76c44cfef3f..4d9231a7528a 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -10462,11 +10462,11 @@ }, "DOM_SCRIPT_SRC_ENCODING": { "alert_emails": ["dteller@mozilla.com"], - "expires_in_version": "never", + "expires_in_version": "61", "kind": "count", "keyed": true, "bug_numbers": [1344152], - "description": "Encoding used in a From 72a3987a488f7b523785bc63d6fa3a11904ce11c Mon Sep 17 00:00:00 2001 From: JerryShih Date: Mon, 20 Mar 2017 17:26:06 +0800 Subject: [PATCH 152/169] Bug 1347164 - rewrite mochitest test_specified_value_serialization.html to look more like test_computed_style.html. r=dholbert MozReview-Commit-ID: 4XSBQXtYSth --HG-- extra : rebase_source : e412de66d6cafa3246036df19185b7be270fb026 --- .../test_specified_value_serialization.html | 117 ++++++++++-------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/layout/style/test/test_specified_value_serialization.html b/layout/style/test/test_specified_value_serialization.html index 9cc2f9b2f14a..9a4b65112ae7 100644 --- a/layout/style/test/test_specified_value_serialization.html +++ b/layout/style/test/test_specified_value_serialization.html @@ -1,62 +1,73 @@ - -Test for Bug 721136 - - -Mozilla Bug 721136 + + + Test for miscellaneous specified value issues + + + + +Mozilla Bug +

+ +
-
 
+ + From bd940f844f5ea7f89ee82a54e25791d3800cec96 Mon Sep 17 00:00:00 2001 From: JerryShih Date: Mon, 20 Mar 2017 17:26:06 +0800 Subject: [PATCH 153/169] Bug 1347164 - css-color specified style test. r=dholbert MozReview-Commit-ID: 6RRhz8ftEVO --HG-- extra : rebase_source : f9f2ce3b84384d3b265d4da7b965dce147165688 --- .../test_specified_value_serialization.html | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/layout/style/test/test_specified_value_serialization.html b/layout/style/test/test_specified_value_serialization.html index 9a4b65112ae7..edf84fe8dabf 100644 --- a/layout/style/test/test_specified_value_serialization.html +++ b/layout/style/test/test_specified_value_serialization.html @@ -67,6 +67,38 @@ elt.setAttribute("style", ""); // leave the page in a useful state })(); +(function test_bug_1347164() { + // Test that specified color values are serialized as "rgb()" + // IFF they're fully-opaque (and otherwise as "rgba()"). + var color = [ + ["rgba(0, 0, 0, 1)", "rgb(0, 0, 0)"], + ["rgba(0, 0, 0, 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsla(0, 0%, 0%, 1)", "rgb(0, 0, 0)"], + ["hsla(0, 0%, 0%, 0.5)", "rgba(0, 0, 0, 0.5)"], + // css-color-4 + ["rgba(0 0 0 / 1)", "rgb(0, 0, 0)"], + ["rgba(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["rgb(0 0 0 / 1)", "rgb(0, 0, 0)"], + ["rgb(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsla(0 0% 0% / 1)", "rgb(0, 0, 0)"], + ["hsla(0deg 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsl(0 0% 0% / 1)", "rgb(0, 0, 0)"], + ["hsl(0 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ]; + + var frame_container = document.getElementById("display"); + var p = document.createElement("p"); + frame_container.appendChild(p); + + for (var i = 0; i < color.length; ++i) { + var test = color[i]; + p.style.color = test[0]; + is(p.style.color, test[1], "serialization value of " + test[0]); + } + + p.remove(); +})(); + From e4e7794105a214cf7c5b8d431c5fc64c0d0290fa Mon Sep 17 00:00:00 2001 From: JerryShih Date: Mon, 20 Mar 2017 17:26:06 +0800 Subject: [PATCH 154/169] Bug 1347164 - set expected-fail for css-color-4 test with stylo. r=xidorn Currently, stylo doesn't have css-color-4 implementation. Set expected-fail for these tests. --HG-- extra : rebase_source : 7740e267deed0482a25289704868cadd30e35e0f --- layout/style/test/stylo-failures.md | 7 ++++-- layout/style/test/test_computed_style.html | 17 ++++++++++---- .../test_specified_value_serialization.html | 23 ++++++++++++------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/layout/style/test/stylo-failures.md b/layout/style/test/stylo-failures.md index 7c3be2f260a4..38f65ce361e7 100644 --- a/layout/style/test/stylo-failures.md +++ b/layout/style/test/stylo-failures.md @@ -104,7 +104,8 @@ to mochitest command. * test_bug798843_pref.html: conditional opentype svg support [7] * test_computed_style.html `gradient`: -moz-prefixed radient value [9] * ... `mask`: mask-image isn't set properly bug 1347398 [2] -* ... `rgba`: svg paint should distinguish whether there is fallback bug 1347409 [4] +* ... `fill`: svg paint should distinguish whether there is fallback bug 1347409 [2] +* ... `stroke`: svg paint should distinguish whether there is fallback bug 1347409 [2] * ... `#foo`: local ref url should be preserved bug 1347412 [5] * character not properly escaped servo/servo#15947 * test_parse_url.html [4] @@ -320,6 +321,8 @@ to mochitest command. * new syntax of rgba?() and hsla?() functions servo/rust-cssparser#113 * test_value_storage.html `'color'` [35] * ... `rgb(100, 100.0, 100)` [1] + * test_computed_style.html `css-color-4` [8] + * test_specified_value_serialization.html `css-color-4` [8] * color interpolation hint not supported servo/servo#15166 * test_value_storage.html `'linear-gradient` [50] * two-keyword form of background-repeat/mask-repeat servo/servo#14954 @@ -363,7 +366,7 @@ to mochitest command. * test_value_storage.html `'transform` [104] * ... `"transform` [66] * ... `-webkit-transform` [109] - * test_specified_value_serialization.html [27] + * test_specified_value_serialization.html `bug-721136` [27] * test_units_angle.html [3] * {background,mask}-position lacks comma for serialization servo/servo#15200 * test_value_storage.html `background-position` [81] diff --git a/layout/style/test/test_computed_style.html b/layout/style/test/test_computed_style.html index 69a8c00b7a0d..9ba9403af841 100644 --- a/layout/style/test/test_computed_style.html +++ b/layout/style/test/test_computed_style.html @@ -383,15 +383,17 @@ var noframe_container = document.getElementById("content"); ["rgba(0, 0, 0, 0.5)", "rgba(0, 0, 0, 0.5)"], ["hsla(0, 0%, 0%, 1)", "rgb(0, 0, 0)"], ["hsla(0, 0%, 0%, 0.5)", "rgba(0, 0, 0, 0.5)"], - // css-color-4 + ]; + + var css_color_4 = [ ["rgba(0 0 0 / 1)", "rgb(0, 0, 0)"], - ["rgba(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["rgba(0 0 0 / 0.1)", "rgba(0, 0, 0, 0.1)"], ["rgb(0 0 0 / 1)", "rgb(0, 0, 0)"], - ["rgb(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["rgb(0 0 0 / 0.2)", "rgba(0, 0, 0, 0.2)"], ["hsla(0 0% 0% / 1)", "rgb(0, 0, 0)"], - ["hsla(0deg 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsla(0deg 0% 0% / 0.3)", "rgba(0, 0, 0, 0.3)"], ["hsl(0 0% 0% / 1)", "rgb(0, 0, 0)"], - ["hsl(0 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsl(0 0% 0% / 0.4)", "rgba(0, 0, 0, 0.4)"], ]; var p = document.createElement("p"); @@ -403,6 +405,11 @@ var noframe_container = document.getElementById("content"); p.style.color = test[0]; is(cs.color, test[1], "computed value of " + test[0]); } + for (var i = 0; i < css_color_4.length; ++i) { + var test = css_color_4[i]; + p.style.color = test[0]; + is(cs.color, test[1], "css-color-4 computed value of " + test[0]); + } p.remove(); })(); diff --git a/layout/style/test/test_specified_value_serialization.html b/layout/style/test/test_specified_value_serialization.html index edf84fe8dabf..73bf62edfa51 100644 --- a/layout/style/test/test_specified_value_serialization.html +++ b/layout/style/test/test_specified_value_serialization.html @@ -47,7 +47,7 @@ ].forEach(function(arr) { document.documentElement.style.MozTransform = arr[0]; is(document.documentElement.style.MozTransform, arr[1], - "incorrect serialization"); + "bug-721136 incorrect serialization"); }); var elt = document.documentElement; @@ -56,13 +56,13 @@ "transform: tRANslatEX(5px) TRanslATey(10px) translatez(2px) ROTATEX(30deg) rotateY(30deg) rotatez(5deg) SKEWx(10deg) skewy(10deg) scaleX(2) SCALEY(0.5) scalez(2)"); is(elt.style.getPropertyValue("transform"), "translateX(5px) translateY(10px) translateZ(2px) rotateX(30deg) rotateY(30deg) rotateZ(5deg) skewX(10deg) skewY(10deg) scaleX(2) scaleY(0.5) scaleZ(2)", - "expected case canonicalization of transform functions"); + "bug-721136 expected case canonicalization of transform functions"); elt.setAttribute("style", "font-variant-alternates: SWASH(fOo) stYLIStiC(Bar)"); is(elt.style.getPropertyValue("font-variant-alternates"), "swash(fOo) stylistic(Bar)", - "expected case canonicalization of transform functions"); + "bug-721136 expected case canonicalization of transform functions"); elt.setAttribute("style", ""); // leave the page in a useful state })(); @@ -75,15 +75,17 @@ ["rgba(0, 0, 0, 0.5)", "rgba(0, 0, 0, 0.5)"], ["hsla(0, 0%, 0%, 1)", "rgb(0, 0, 0)"], ["hsla(0, 0%, 0%, 0.5)", "rgba(0, 0, 0, 0.5)"], - // css-color-4 + ]; + + var css_color_4 = [ ["rgba(0 0 0 / 1)", "rgb(0, 0, 0)"], - ["rgba(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["rgba(0 0 0 / 0.1)", "rgba(0, 0, 0, 0.1)"], ["rgb(0 0 0 / 1)", "rgb(0, 0, 0)"], - ["rgb(0 0 0 / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["rgb(0 0 0 / 0.2)", "rgba(0, 0, 0, 0.2)"], ["hsla(0 0% 0% / 1)", "rgb(0, 0, 0)"], - ["hsla(0deg 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsla(0deg 0% 0% / 0.3)", "rgba(0, 0, 0, 0.3)"], ["hsl(0 0% 0% / 1)", "rgb(0, 0, 0)"], - ["hsl(0 0% 0% / 0.5)", "rgba(0, 0, 0, 0.5)"], + ["hsl(0 0% 0% / 0.4)", "rgba(0, 0, 0, 0.4)"], ]; var frame_container = document.getElementById("display"); @@ -95,6 +97,11 @@ p.style.color = test[0]; is(p.style.color, test[1], "serialization value of " + test[0]); } + for (var i = 0; i < css_color_4.length; ++i) { + var test = css_color_4[i]; + p.style.color = test[0]; + is(p.style.color, test[1], "css-color-4 serialization value of " + test[0]); + } p.remove(); })(); From e5d6472d23bb557b980abbdaa5e3a52b4665891a Mon Sep 17 00:00:00 2001 From: ffxbld Date: Mon, 20 Mar 2017 08:25:05 -0700 Subject: [PATCH 155/169] No bug, Automated HSTS preload list update from host bld-linux64-spot-036 - a=hsts-update --- security/manager/ssl/nsSTSPreloadList.errors | 195 +- security/manager/ssl/nsSTSPreloadList.inc | 34436 ++++++++--------- 2 files changed, 17308 insertions(+), 17323 deletions(-) diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors index 6f5e48ae2565..96650512b3da 100644 --- a/security/manager/ssl/nsSTSPreloadList.errors +++ b/security/manager/ssl/nsSTSPreloadList.errors @@ -26,6 +26,7 @@ 1k8b.com: could not connect to host 1password.com: did not receive HSTS header 1xcess.com: did not receive HSTS header +1years.cc: did not receive HSTS header 206rc.net: max-age too low: 2592000 247loan.com: max-age too low: 0 24hourpaint.com: could not connect to host @@ -51,6 +52,7 @@ 3yearloans.com: max-age too low: 0 404.sh: max-age too low: 0 404404.info: could not connect to host +420dongstorm.com: could not connect to host 42ms.org: could not connect to host 4455software.com: did not receive HSTS header 4679.space: could not connect to host @@ -111,12 +113,13 @@ acslimited.co.uk: did not receive HSTS header activateplay.com: did not receive HSTS header activeweb.top: could not connect to host activiti.alfresco.com: did not receive HSTS header -actserv.co.ke: could not connect to host actu-medias.com: did not receive HSTS header actualite-videos.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] acuve.jp: could not connect to host ada.is: max-age too low: 2592000 adajwells.me: could not connect to host +adam-kostecki.de: could not connect to host +adamkostecki.de: could not connect to host adams.net: max-age too low: 0 adamwk.com: did not receive HSTS header addaxpetroleum.com: could not connect to host @@ -149,6 +152,7 @@ aether.pw: could not connect to host aevpn.net: could not connect to host aficotroceni.ro: did not receive HSTS header afp548.tk: could not connect to host +afrodigital.uk: did not receive HSTS header afyou.co.kr: could not connect to host agalaxyfarfaraway.co.uk: could not connect to host agbremen.de: did not receive HSTS header @@ -171,9 +175,11 @@ akboy.pw: could not connect to host akclinics.org: did not receive HSTS header akerek.hu: did not receive HSTS header akombakom.net: did not receive HSTS header +akostecki.de: could not connect to host akselimedia.fi: did not receive HSTS header al-shami.net: could not connect to host aladdin.ie: did not receive HSTS header +alainwolf.ch: could not connect to host alainwolf.net: could not connect to host alanlee.net: could not connect to host alanrickmanflipstable.com: could not connect to host @@ -187,16 +193,14 @@ alenan.org: could not connect to host alessandro.pw: did not receive HSTS header alethearose.com: did not receive HSTS header alexandre.sh: did not receive HSTS header -alexhaydock.co.uk: could not connect to host alexisabarca.com: did not receive HSTS header alexsergeyev.com: could not connect to host -alexwardweb.com: did not receive HSTS header alfa24.pro: could not connect to host alittlebitcheeky.com: did not receive HSTS header aljaspod.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] alkami.com: did not receive HSTS header all-subtitles.com: did not receive HSTS header -all.tf: could not connect to host +all.tf: did not receive HSTS header alldaymonitoring.com: could not connect to host allforyou.at: could not connect to host allinnote.com: could not connect to host @@ -207,6 +211,7 @@ alphabit-secure.com: could not connect to host alphabuild.io: did not receive HSTS header alphalabs.xyz: could not connect to host alt33c3.org: could not connect to host +altesses.eu: could not connect to host altfire.ca: could not connect to host altmv.com: max-age too low: 7776000 amaforums.org: could not connect to host @@ -329,6 +334,7 @@ arzaroth.com: did not receive HSTS header as.se: could not connect to host as9178.net: could not connect to host asasuou.pw: could not connect to host +asbito.de: could not connect to host asc16.com: could not connect to host ascamso.com: could not connect to host asdpress.cn: could not connect to host @@ -342,6 +348,7 @@ asmui.ga: could not connect to host asmui.ml: could not connect to host asrob.eu: did not receive HSTS header ass.org.au: did not receive HSTS header +assdecoeur.org: could not connect to host assekuranzjobs.de: could not connect to host asset-alive.com: did not receive HSTS header asset-alive.net: did not receive HSTS header @@ -353,7 +360,7 @@ atavio.at: could not connect to host atavio.ch: could not connect to host atavio.de: did not receive HSTS header atbeckett.com: did not receive HSTS header -athaliasoft.com: did not receive HSTS header +athaliasoft.com: could not connect to host athenelive.com: could not connect to host athul.xyz: did not receive HSTS header atlas.co: max-age too low: 0 @@ -377,6 +384,7 @@ ausnah.me: could not connect to host ausoptic.com.au: max-age too low: 2592000 auth.mail.ru: did not receive HSTS header authentication.io: could not connect to host +authint.com: could not connect to host authoritynutrition.com: did not receive HSTS header auto-serwis.zgorzelec.pl: did not receive HSTS header auto4trade.nl: could not connect to host @@ -387,8 +395,8 @@ autokovrik-diskont.ru: did not receive HSTS header autotsum.com: could not connect to host autumnwindsagility.com: could not connect to host auverbox.ovh: could not connect to host -auxetek.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] auxiliumincrementum.co.uk: could not connect to host +av.de: did not receive HSTS header avec-ou-sans-ordonnance.fr: could not connect to host avenelequinehospital.com.au: did not receive HSTS header avepol.cz: did not receive HSTS header @@ -426,6 +434,8 @@ bakkerdesignandbuild.com: did not receive HSTS header balcan-underground.net: could not connect to host baldwinkoo.com: could not connect to host balloonphp.com: could not connect to host +balonmano.co: could not connect to host +bananabandy.com: could not connect to host banbanchs.com: could not connect to host bandb.xyz: could not connect to host bandrcrafts.com: could not connect to host @@ -456,6 +466,7 @@ be.search.yahoo.com: did not receive HSTS header beach-inspector.com: did not receive HSTS header beachi.es: could not connect to host beaglewatch.com: could not connect to host +beamitapp.com: could not connect to host beardydave.com: did not receive HSTS header beastowner.com: did not receive HSTS header beavers.io: could not connect to host @@ -465,7 +476,7 @@ bedeta.de: could not connect to host bedreid.dk: did not receive HSTS header bedrijvenadministratie.nl: did not receive HSTS header beholdthehurricane.com: could not connect to host -beier.io: could not connect to host +beier.io: did not receive HSTS header belairsewvac.com: could not connect to host belics.com: did not receive HSTS header belliash.eu.org: did not receive HSTS header @@ -490,6 +501,7 @@ betcafearena.ro: did not receive HSTS header betnet.fr: could not connect to host betplanning.it: did not receive HSTS header bets.de: did not receive HSTS header +betterlifemakers.com: could not connect to host bettween.com: could not connect to host betz.ro: did not receive HSTS header bevapehappy.com: did not receive HSTS header @@ -499,7 +511,6 @@ beyuna.nl: did not receive HSTS header bezorg.ninja: could not connect to host bf.am: max-age too low: 0 bgcparkstad.nl: did not receive HSTS header -bgkoleda.bg: could not connect to host bgmn.net: could not connect to host bhatia.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] bi.search.yahoo.com: did not receive HSTS header @@ -541,6 +552,13 @@ bityes.org: could not connect to host bivsi.com: could not connect to host bizcms.com: did not receive HSTS header bizon.sk: did not receive HSTS header +bkb-skandal.ch: did not receive HSTS header +bl4ckb0x.com: could not connect to host +bl4ckb0x.de: could not connect to host +bl4ckb0x.eu: could not connect to host +bl4ckb0x.info: could not connect to host +bl4ckb0x.net: could not connect to host +bl4ckb0x.org: could not connect to host black-armada.com.pl: could not connect to host black-armada.pl: could not connect to host blackburn.link: could not connect to host @@ -603,6 +621,7 @@ boringsecurity.net: could not connect to host boris.one: did not receive HSTS header borisbesemer.com: could not connect to host botox.bz: did not receive HSTS header +bougeret.fr: could not connect to host bouncourseplanner.net: could not connect to host bouwbedrijfpurmerend.nl: did not receive HSTS header bowlroll.net: max-age too low: 0 @@ -639,6 +658,7 @@ btcdlc.com: could not connect to host buchheld.at: did not receive HSTS header bucket.tk: could not connect to host budgetthostels.nl: did not receive HSTS header +budntod.com: could not connect to host budskap.eu: could not connect to host bugtrack.io: did not receive HSTS header buhler.pro: did not receive HSTS header @@ -646,7 +666,6 @@ buildci.asia: could not connect to host buildify.co.za: could not connect to host buildsaver.co.za: did not receive HSTS header built.by: did not receive HSTS header -bul3seas.eu: could not connect to host bulletpoint.cz: could not connect to host bulmafox.com: could not connect to host bumarkamoda.com: could not connect to host @@ -658,7 +677,6 @@ burtrum.me: could not connect to host burtrum.top: could not connect to host burzmali.com: did not receive HSTS header business.lookout.com: could not connect to host -businessadviceperth.com.au: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] businesshosting.nl: did not receive HSTS header businessloanstoday.com: max-age too low: 0 busold.ws: could not connect to host @@ -680,6 +698,7 @@ bypassed.world: did not receive HSTS header bypro.xyz: could not connect to host bysymphony.com: max-age too low: 0 byte.wtf: did not receive HSTS header +bytema.re: could not connect to host bytepark.de: did not receive HSTS header bytesund.biz: could not connect to host bytesystems.com: could not connect to host @@ -710,11 +729,9 @@ cancelmyprofile.com: did not receive HSTS header candicontrols.com: did not receive HSTS header candratech.com: could not connect to host candylion.rocks: could not connect to host -canfly.org: did not receive HSTS header -cannyfoxx.me: could not connect to host +canfly.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] canyonshoa.com: did not receive HSTS header capecycles.co.za: did not receive HSTS header -capellidipremoli.com: could not connect to host capeyorkfire.com.au: did not receive HSTS header captchatheprize.com: could not connect to host captivatedbytabrett.com: did not receive HSTS header @@ -813,8 +830,6 @@ chinawhale.com: did not receive HSTS header chirgui.eu: could not connect to host chm.vn: did not receive HSTS header chontalpa.pw: could not connect to host -chorkley.co.uk: could not connect to host -chorkley.uk: could not connect to host chotu.net: could not connect to host chris-web.info: could not connect to host chrisandsarahinasia.com: did not receive HSTS header @@ -838,7 +853,6 @@ cigi.site: could not connect to host cim2b.de: could not connect to host cimalando.eu: could not connect to host ciplanutrition.com: did not receive HSTS header -circara.com: did not receive HSTS header ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] citiagent.cz: could not connect to host cityoflaurel.org: did not receive HSTS header @@ -868,7 +882,6 @@ cloudcy.net: could not connect to host clouddesktop.co.nz: could not connect to host cloudey.net: did not receive HSTS header cloudflare.com: did not receive HSTS header -cloudily.com: could not connect to host cloudimag.es: could not connect to host cloudlink.club: could not connect to host cloudns.com.au: could not connect to host @@ -877,7 +890,6 @@ cloudstoragemaus.com: could not connect to host cloudstorm.me: could not connect to host cloudwalk.io: did not receive HSTS header cloverleaf.net: max-age too low: 0 -clsimplex.com: could not connect to host clubmate.rocks: could not connect to host cluster.id: could not connect to host clvrwebdesign.com: did not receive HSTS header @@ -898,6 +910,7 @@ cni-certing.it: max-age too low: 0 co50.com: did not receive HSTS header cobrasystems.nl: max-age too low: 0 cocaine-import.agency: could not connect to host +cockedey.in: could not connect to host cocktailfuture.fr: could not connect to host codabix.com: did not receive HSTS header codabix.de: could not connect to host @@ -911,7 +924,6 @@ codelayer.ca: could not connect to host codelitmus.com: did not receive HSTS header codemonkeyrawks.net: could not connect to host codepoet.de: could not connect to host -codepult.com: could not connect to host codepx.com: did not receive HSTS header codewild.de: could not connect to host codewiththepros.org: could not connect to host @@ -922,6 +934,7 @@ coi-verify.com: could not connect to host coiffeurschnittstelle.ch: did not receive HSTS header coindam.com: could not connect to host coldlostsick.net: could not connect to host +colearnr.com: could not connect to host colinwolff.com: could not connect to host collies.eu: did not receive HSTS header collins.kg: did not receive HSTS header @@ -948,6 +961,7 @@ confirm365.com: could not connect to host conformal.com: could not connect to host connect.ua: did not receive HSTS header connected-verhuurservice.nl: did not receive HSTS header +conrad-kostecki.de: could not connect to host consciousandglamorous.com: could not connect to host console.python.org: did not receive HSTS header console.support: did not receive HSTS header @@ -992,11 +1006,9 @@ crazifyngers.com: could not connect to host crazy-crawler.de: did not receive HSTS header crazycen.com: did not receive HSTS header crazyhotseeds.com: did not receive HSTS header -creativecommonscatpictures.com: could not connect to host creativephysics.ml: could not connect to host creativeplayuk.com: did not receive HSTS header crendontech.com: could not connect to host -crestasantos.com: could not connect to host crestoncottage.com: could not connect to host criticalaim.com: could not connect to host crizk.com: could not connect to host @@ -1074,7 +1086,6 @@ danieliancu.com: could not connect to host danielvoogsgerd.nl: could not connect to host danielworthy.com: did not receive HSTS header danijobs.com: could not connect to host -dannyrohde.de: could not connect to host danrl.de: could not connect to host daolerp.xyz: could not connect to host dargasia.is: could not connect to host @@ -1163,10 +1174,10 @@ desiccantpackets.com: did not receive HSTS header designgears.com: did not receive HSTS header designthinking.or.jp: did not receive HSTS header despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +desserteagleselvenar.tk: could not connect to host destinationbijoux.fr: could not connect to host detector.exposed: could not connect to host detest.org: could not connect to host -detteflies.com: could not connect to host deuxvia.com: could not connect to host devafterdark.com: could not connect to host devcu.com: could not connect to host @@ -1223,7 +1234,6 @@ do-do.tk: could not connect to host do.gd: could not connect to host do.search.yahoo.com: did not receive HSTS header dobet.in: could not connect to host -dobrev.family: could not connect to host docid.io: could not connect to host docket.news: could not connect to host docset.io: could not connect to host @@ -1232,7 +1242,7 @@ doeswindowssuckforeveryoneorjustme.com: could not connect to host dogbox.se: did not receive HSTS header dogespeed.ga: could not connect to host doggieholic.net: could not connect to host -dogoodbehappyllc.com: did not receive HSTS header +dogoodbehappyllc.com: could not connect to host dohosting.ru: could not connect to host dokan.online: did not receive HSTS header dokuboard.com: could not connect to host @@ -1263,7 +1273,6 @@ doyoucheck.com: did not receive HSTS header dpratt.de: did not receive HSTS header dragonisles.net: could not connect to host dragons-of-highlands.cz: could not connect to host -dragonschool.org: did not receive HSTS header dragontrainingmobilezoo.com.au: max-age too low: 0 drakefortreasurer.sexy: could not connect to host draw.uy: could not connect to host @@ -1271,6 +1280,7 @@ drdevil.ru: could not connect to host dreadbyte.com: could not connect to host dreid.org: did not receive HSTS header dreizwosechs.de: could not connect to host +drewgle.net: could not connect to host drhopeson.com: could not connect to host drishti.guru: could not connect to host drkmtrx.xyz: could not connect to host @@ -1285,6 +1295,8 @@ dubrovskiy.net: could not connect to host dubrovskiy.pro: could not connect to host duesee.org: could not connect to host dullsir.com: did not receive HSTS header +dunableguitars.com: could not connect to host +dutchessuganda.com: did not receive HSTS header dutchrank.com: could not connect to host duuu.ch: could not connect to host dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] @@ -1296,6 +1308,7 @@ dzimejl.sk: did not receive HSTS header dzlibs.io: could not connect to host dzndk.org: could not connect to host e-aut.net: did not receive HSTS header +e-biografias.net: did not receive HSTS header e-deca2.org: did not receive HSTS header e-sa.com: did not receive HSTS header e3amn2l.com: could not connect to host @@ -1309,6 +1322,8 @@ eauclairecommerce.com: could not connect to host ebankcbt.com: could not connect to host ebecs.com: did not receive HSTS header ebermannstadt.de: max-age too low: 0 +ebiografia.com: did not receive HSTS header +ebiografias.com.br: did not receive HSTS header ebp2p.com: did not receive HSTS header ebpglobal.com: did not receive HSTS header ecake.in: could not connect to host @@ -1344,6 +1359,7 @@ ehrenamt-skpfcw.de: could not connect to host eicfood.com: could not connect to host eidolonhost.com: did not receive HSTS header ekbanden.nl: could not connect to host +ekostecki.de: could not connect to host elaintehtaat.fi: did not receive HSTS header elan-organics.com: did not receive HSTS header elanguest.pl: could not connect to host @@ -1359,6 +1375,8 @@ elenag.ga: could not connect to host elenoon.ir: did not receive HSTS header elgacien.de: could not connect to host elimdengelen.com: did not receive HSTS header +elisabeth-kostecki.de: could not connect to host +elisabethkostecki.de: could not connect to host elitefishtank.com: could not connect to host elnutricionista.es: could not connect to host eloanpersonal.com: max-age too low: 0 @@ -1432,6 +1450,7 @@ esko.bar: could not connect to host esln.org: did not receive HSTS header esoterikerforum.de: did not receive HSTS header espace-gestion.fr: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +espacemontmorency.com: could not connect to host espra.com: could not connect to host esquonic.com: could not connect to host essexcosmeticdentists.co.uk: did not receive HSTS header @@ -1448,10 +1467,10 @@ etula.me: could not connect to host euanbaines.com: did not receive HSTS header eucl3d.com: did not receive HSTS header eulerpi.io: could not connect to host +euph.eu: could not connect to host eupho.me: could not connect to host euroshop24.net: could not connect to host evafojtova.cz: did not receive HSTS header -evantage.org: could not connect to host evdenevenakliyatankara.pw: did not receive HSTS header everybooks.com: max-age too low: 60 everylab.org: could not connect to host @@ -1509,6 +1528,8 @@ fanyl.cn: could not connect to host farhadexchange.com: did not receive HSTS header fashioncare.cz: did not receive HSTS header fasset.jp: could not connect to host +fastcomcorp.com: could not connect to host +fastcomcorp.net: could not connect to host fastograph.com: could not connect to host fastopen.ml: could not connect to host fatgeekflix.net: could not connect to host @@ -1520,7 +1541,6 @@ fbox.li: could not connect to host fdj.im: could not connect to host feard.space: could not connect to host feastr.de: did not receive HSTS header -fedrtc.org: could not connect to host fedux.com.ar: could not connect to host feezmodo.com: max-age too low: 0 felisslovakia.sk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] @@ -1538,10 +1558,13 @@ ffmradio.de: did not receive HSTS header fhdhelp.de: could not connect to host fhdhilft.de: could not connect to host fics-twosigma.com: did not receive HSTS header +fierman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +fifieldtech.com: could not connect to host fiftyshadesofluca.ml: could not connect to host fig.co: did not receive HSTS header fightr.co: could not connect to host fikt.space: could not connect to host +filemeal.com: did not receive HSTS header filmipop.com: max-age too low: 0 finalgear.com: did not receive HSTS header financieringsportaal.nl: did not receive HSTS header @@ -1589,7 +1612,6 @@ flowlo.me: could not connect to host flukethoughts.com: could not connect to host flushstudios.com: did not receive HSTS header flyaces.com: did not receive HSTS header -flyss.net: could not connect to host fm83.nl: could not connect to host fndout.com: did not receive HSTS header fnvsecurity.com: could not connect to host @@ -1606,7 +1628,7 @@ foreignexchangeresource.com: did not receive HSTS header foreveralone.io: could not connect to host forex-dan.com: did not receive HSTS header forextimes.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] -formazioneopen.it: did not receive HSTS header +formazioneopen.it: could not connect to host formbetter.com: could not connect to host formula.cf: could not connect to host forschbach-janssen.de: could not connect to host @@ -1615,7 +1637,7 @@ fotm.net: did not receive HSTS header fotocerita.net: could not connect to host fotografosexpertos.com: did not receive HSTS header fotopasja.info: could not connect to host -fourchin.net: could not connect to host +fourchin.net: did not receive HSTS header foxdev.io: did not receive HSTS header foxelbox.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] foxley-farm.co.uk: did not receive HSTS header @@ -1626,14 +1648,12 @@ fr33d0m.link: could not connect to host francevpn.xyz: could not connect to host frangor.info: did not receive HSTS header frankwei.xyz: did not receive HSTS header -fransallen.com: did not receive HSTS header franta.biz: did not receive HSTS header franta.email: did not receive HSTS header franzt.de: could not connect to host frasys.io: did not receive HSTS header fredvoyage.fr: did not receive HSTS header freeflow.tv: could not connect to host -freeform4u.de: could not connect to host freematthale.net: did not receive HSTS header freemedforms.com: did not receive HSTS header freesoftwaredriver.com: did not receive HSTS header @@ -1654,7 +1674,6 @@ frontisme.nl: could not connect to host frontmin.com: did not receive HSTS header frost-ci.xyz: could not connect to host fruitusers.com: could not connect to host -frusky.de: did not receive HSTS header frusky.net: could not connect to host fspphoto.com: could not connect to host fstfy.de: could not connect to host @@ -1687,7 +1706,6 @@ gabber.scot: could not connect to host gabi.com.es: could not connect to host gaelleetarnaud.com: did not receive HSTS header gafachi.com: could not connect to host -gaiserik.com: could not connect to host gakkainavi.jp: did not receive HSTS header gakkainavi4.com: could not connect to host gakkainavi4.net: did not receive HSTS header @@ -1766,6 +1784,7 @@ gheorghesarcov.ga: could not connect to host gheorghesarcov.tk: could not connect to host gietvloergarant.nl: did not receive HSTS header gigacloud.org: max-age too low: 0 +gilcloud.com: could not connect to host gilgaz.com: did not receive HSTS header gilly.berlin: did not receive HSTS header gingali.de: did not receive HSTS header @@ -1883,8 +1902,6 @@ gurom.lv: could not connect to host gurusupe.com: could not connect to host guso.gq: could not connect to host guso.ml: could not connect to host -guso.site: could not connect to host -guso.tech: could not connect to host gussi.is: did not receive HSTS header gvt2.com: could not connect to host (error ignored - included regardless) gvt3.com: could not connect to host (error ignored - included regardless) @@ -1924,6 +1941,7 @@ hancc.net: could not connect to host hanfu.la: could not connect to host hang333.pw: did not receive HSTS header hanimalis.fr: could not connect to host +hannover-banditen.de: could not connect to host hansen.hn: could not connect to host hao2taiwan.com: max-age too low: 0 haoyugao.com: could not connect to host @@ -2004,7 +2022,6 @@ hittipps.com: did not receive HSTS header hlyue.com: did not receive HSTS header hmm.nyc: could not connect to host hn.search.yahoo.com: did not receive HSTS header -hobbyspeed.com: could not connect to host hodne.io: could not connect to host hoerbuecher-und-hoerspiele.de: could not connect to host hofiprojekt.cz: did not receive HSTS header @@ -2036,7 +2053,6 @@ houkago-step.com: did not receive HSTS header housemaadiah.org: did not receive HSTS header housingstudents.org.uk: could not connect to host howrandom.org: could not connect to host -howsecureismypassword.net: could not connect to host howtocuremysciatica.com: could not connect to host hr-intranet.com: did not receive HSTS header hsandbox.tech: max-age too low: 2592000 @@ -2056,6 +2072,7 @@ humpi.at: could not connect to host humpteedumptee.in: did not receive HSTS header huntshomeinspections.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] hup.blue: could not connect to host +hupp.se: could not connect to host hurricanelabs.com: did not receive HSTS header huskybutt.dog: could not connect to host hxying.com: could not connect to host @@ -2075,6 +2092,7 @@ iamveto.com: could not connect to host iapws.com: could not connect to host iban.is: could not connect to host ibarf.nl: did not receive HSTS header +icebat.dyndns.org: could not connect to host iceloch.com: could not connect to host icewoman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] icfl.com.br: could not connect to host @@ -2098,7 +2116,7 @@ idedr.com: could not connect to host identitylabs.uk: could not connect to host idgsupply.com: could not connect to host idlekernel.com: could not connect to host -idontexist.me: did not receive HSTS header +idontexist.me: could not connect to host ie.search.yahoo.com: did not receive HSTS header ies-italia.it: did not receive HSTS header ies.id.lv: could not connect to host @@ -2107,7 +2125,6 @@ ifleurs.com: could not connect to host ifx.ee: could not connect to host ignatisd.gr: did not receive HSTS header igule.net: could not connect to host -ihopeit.works: could not connect to host ihrlotto.de: could not connect to host ihrnationalrat.ch: could not connect to host ihsbsd.me: could not connect to host @@ -2116,7 +2133,7 @@ ihuanmeng.com: did not receive HSTS header iispeed.com: did not receive HSTS header ikujii.com: max-age too low: 0 ikwilguidobellen.nl: did not receive HSTS header -ilbuongiorno.it: did not receive HSTS header +ilbuongiorno.it: could not connect to host ilikerainbows.co: could not connect to host ilikerainbows.co.uk: could not connect to host ilmconpm.de: did not receive HSTS header @@ -2178,7 +2195,8 @@ instantdev.io: could not connect to host institutoflordelavida.com: could not connect to host integraelchen.de: could not connect to host intel.li: could not connect to host -interference.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +interchangedesign.com: did not receive HSTS header +interference.io: could not connect to host interlun.com: could not connect to host internect.co.za: did not receive HSTS header internetcasinos.de: could not connect to host @@ -2203,6 +2221,7 @@ iotsms.io: could not connect to host ip6.im: did not receive HSTS header ipmimagazine.com: did not receive HSTS header iprody.com: could not connect to host +ipsec.pl: did not receive HSTS header iptel.by: max-age too low: 0 iptel.ro: could not connect to host ipv6cloud.club: could not connect to host @@ -2236,15 +2255,16 @@ itriskltd.com: could not connect to host itsadog.co.uk: did not receive HSTS header itsagadget.com: did not receive HSTS header itsamurai.ru: max-age too low: 2592000 -itsatrap.nl: could not connect to host itsecurityassurance.pw: could not connect to host itsg-faq.de: could not connect to host itshost.ru: could not connect to host +itspawned.com: could not connect to host ivancacic.com: did not receive HSTS header ivi-fertility.com: max-age too low: 0 ivi.es: max-age too low: 0 ivk.website: could not connect to host ivo.co.za: could not connect to host +iwannarefill.com: could not connect to host izdiwho.com: could not connect to host izolight.ch: could not connect to host izoox.com: did not receive HSTS header @@ -2297,6 +2317,7 @@ jayscoaching.com: did not receive HSTS header jayshao.com: did not receive HSTS header jazzinutrecht.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] jazzncheese.com: could not connect to host +jbbd.fr: could not connect to host jbn.mx: could not connect to host jcch.de: could not connect to host jcor.me: did not receive HSTS header @@ -2307,6 +2328,7 @@ jeff393.com: could not connect to host jenjoit.de: could not connect to host jensenbanden.no: could not connect to host jeremye77.com: could not connect to host +jeroenseegers.com: could not connect to host jesorsenville.com: did not receive HSTS header jessicabenedictus.nl: could not connect to host jesuisformidable.nl: could not connect to host @@ -2344,10 +2366,11 @@ jonas-keidel.de: did not receive HSTS header jonasgroth.se: did not receive HSTS header jonathan.ir: could not connect to host jondarby.com: did not receive HSTS header +jonfor.net: could not connect to host jonn.me: could not connect to host joostbovee.nl: did not receive HSTS header jordanhamilton.me: could not connect to host -joretapo.fr: did not receive HSTS header +joretapo.fr: could not connect to host josahrens.me: could not connect to host joshi.su: could not connect to host joshstroup.me: could not connect to host @@ -2368,7 +2391,7 @@ junaos.xyz: did not receive HSTS header junge-selbsthilfe.info: could not connect to host junqtion.com: could not connect to host jupp0r.de: did not receive HSTS header -justinlemay.com: could not connect to host +justinlemay.com: did not receive HSTS header justlikethat.hosting: did not receive HSTS header justnaw.co.uk: could not connect to host justudin.com: did not receive HSTS header @@ -2419,7 +2442,6 @@ kerksanders.nl: did not receive HSTS header kermadec.net: could not connect to host kernl.us: did not receive HSTS header kevinbowers.me: did not receive HSTS header -kevinmeijer.nl: could not connect to host keymaster.lookout.com: did not receive HSTS header kg-rating.com: could not connect to host kgxtech.com: max-age too low: 2592000 @@ -2431,8 +2453,8 @@ kienlen.org: could not connect to host kimpost.org: could not connect to host kinderly.co.uk: did not receive HSTS header kinderwagen-test24.de: could not connect to host +kindof.ninja: could not connect to host kingmanhall.org: could not connect to host -kini24.ru: could not connect to host kinkdr.com: could not connect to host kinnon.enterprises: could not connect to host kionetworks.com: did not receive HSTS header @@ -2446,18 +2468,17 @@ kissart.net: could not connect to host kissflow.com: did not receive HSTS header kisun.co.jp: could not connect to host kitakemon.com: could not connect to host -kitchenpunx.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +kitchenpunx.com: could not connect to host kitk.at: could not connect to host kitsostech.com: could not connect to host kitsta.com: could not connect to host kiwiirc.com: max-age too low: 5256000 kizil.net: could not connect to host kjaermaxi.me: did not receive HSTS header -kkyy.me: could not connect to host klauwd.com: did not receive HSTS header klaxn.org: could not connect to host kleertjesvoordelig.nl: did not receive HSTS header -kleinblogje.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +kleinblogje.nl: could not connect to host kletterkater.com: did not receive HSTS header klicktojob.de: could not connect to host kmartin.io: did not receive HSTS header @@ -2490,11 +2511,12 @@ krayx.com: could not connect to host kreavis.com: did not receive HSTS header kredite.sale: could not connect to host kriegt.es: did not receive HSTS header +kristikala.nl: could not connect to host krizevackapajdasija.hr: did not receive HSTS header krizevci.info: did not receive HSTS header kroetenfuchs.de: could not connect to host kropkait.pl: could not connect to host -krouzkyliduska.cz: could not connect to host +krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] krunut.com: did not receive HSTS header krypteia.org: could not connect to host kryptomech.com: could not connect to host @@ -2518,7 +2540,6 @@ kyanite.co: could not connect to host kylapps.com: did not receive HSTS header kylinj.com: could not connect to host kyochon.fr: could not connect to host -kyy.me: could not connect to host kz.search.yahoo.com: did not receive HSTS header kzjnet.com: could not connect to host l2guru.ru: could not connect to host @@ -2535,6 +2556,7 @@ lacledeslan.ninja: could not connect to host lacocinadelila.com: did not receive HSTS header ladbroke.net: did not receive HSTS header laf.in.net: could not connect to host +lafr4nc3.xyz: could not connect to host lagalerievirtuelle.fr: did not receive HSTS header lagoza.name: could not connect to host lambdafive.co.uk: could not connect to host @@ -2552,6 +2574,7 @@ latinred.com: could not connect to host latour-managedcare.ch: did not receive HSTS header latus.xyz: could not connect to host lausitzer-widerstand.de: did not receive HSTS header +lavalite.de: could not connect to host lavine.ch: did not receive HSTS header lavito.cz: did not receive HSTS header lavval.com: could not connect to host @@ -2581,16 +2604,13 @@ lenovogaming.com: did not receive HSTS header lentri.com: did not receive HSTS header leob.in: did not receive HSTS header leon-jaekel.com: could not connect to host -leonhooijer.nl: could not connect to host leopold.email: could not connect to host leopotamgroup.com: could not connect to host leovanna.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] lepont.pl: could not connect to host lerner.moscow: did not receive HSTS header les-corsaires.net: could not connect to host -lesdouceursdeliyana.com: could not connect to host lesperlesdunet.fr: could not connect to host -letitfly.me: could not connect to host letras.mus.br: did not receive HSTS header letsmultiplayerplay.com: did not receive HSTS header letustravel.tk: could not connect to host @@ -2617,6 +2637,7 @@ liaoshuma.com: could not connect to host libanco.com: could not connect to host libertyrp.org: could not connect to host library.linode.com: did not receive HSTS header +libreboot.org: did not receive HSTS header librechan.net: could not connect to host libreduca.com: could not connect to host libscode.com: could not connect to host @@ -2692,8 +2713,8 @@ lsky.cn: did not receive HSTS header lsp-sports.de: did not receive HSTS header lt.search.yahoo.com: did not receive HSTS header ltbytes.com: could not connect to host +ltn-tom-morel.fr: could not connect to host lu.search.yahoo.com: did not receive HSTS header -lubot.net: could not connect to host lucaterzini.com: could not connect to host ludwiggrill.de: did not receive HSTS header lufthansaexperts.com: max-age too low: 2592000 @@ -2742,12 +2763,14 @@ mafamane.com: could not connect to host mafiareturns.com: max-age too low: 2592000 magenx.com: did not receive HSTS header mahamed91.pw: could not connect to host +maidofhonorcleaning.net: could not connect to host mail-settings.google.com: did not receive HSTS header (error ignored - included regardless) mail.google.com: did not receive HSTS header (error ignored - included regardless) maildragon.com: could not connect to host mailhost.it: could not connect to host makeitdynamic.com: could not connect to host makerstuff.net: did not receive HSTS header +makeyourank.com: could not connect to host malerversand.de: did not receive HSTS header malfait.nl: could not connect to host maljaars-media.nl: could not connect to host @@ -2778,11 +2801,11 @@ mariannematthew.com: could not connect to host marie-curie.fr: could not connect to host marie-elisabeth.dk: did not receive HSTS header marie-en-provence.com: did not receive HSTS header +marie.club: could not connect to host markaconnor.com: could not connect to host markayapilandirma.com: could not connect to host market.android.com: did not receive HSTS header (error ignored - included regardless) markhaehnel.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] -markprof.ru: could not connect to host markrego.com: could not connect to host marktboten.de: did not receive HSTS header markus-dev.com: did not receive HSTS header @@ -2879,6 +2902,7 @@ mexbt.com: could not connect to host mexicanbusinessweb.mx: did not receive HSTS header mexicansbook.ru: could not connect to host mfcatalin.com: could not connect to host +mfedderke.com: could not connect to host mfiles.pl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] mh-bloemen.co.jp: could not connect to host mhdsyarif.com: did not receive HSTS header @@ -2966,6 +2990,7 @@ moefi.xyz: did not receive HSTS header moelord.org: could not connect to host moen.io: did not receive HSTS header moeyi.xyz: did not receive HSTS header +mofohome.dyndns.org: could not connect to host mogry.net: did not receive HSTS header moho.kr: could not connect to host mona.lu: did not receive HSTS header @@ -2978,6 +3003,7 @@ moneytoday.com: max-age too low: 0 monitman.com: could not connect to host monsieurbureau.com: did not receive HSTS header montenero.pl: could not connect to host +montonicms.com: could not connect to host moon.lc: could not connect to host moov.is: could not connect to host moparisthebest.biz: could not connect to host @@ -3052,6 +3078,7 @@ mycoted.com: did not receive HSTS header mydeos.com: could not connect to host mydigipass.com: did not receive HSTS header mydnaresults.com: did not receive HSTS header +myepass.de: could not connect to host mygate.at: could not connect to host mygdut.com: did not receive HSTS header mygov.scot: did not receive HSTS header @@ -3067,7 +3094,6 @@ myphonebox.de: could not connect to host mypillcard.com: could not connect to host mysecretrewards.com: did not receive HSTS header mystery-science-theater-3000.de: did not receive HSTS header -mythslegendscollection.com: did not receive HSTS header myweb360.de: did not receive HSTS header myzone.com: did not receive HSTS header n0psled.nl: could not connect to host @@ -3159,7 +3185,7 @@ ng-security.com: could not connect to host ngine.ch: did not receive HSTS header nginxnudes.com: could not connect to host nglr.org: could not connect to host -ngt-service.ru: did not receive HSTS header +ngt-service.ru: could not connect to host ni.search.yahoo.com: did not receive HSTS header nibiisclaim.com: could not connect to host nicestresser.fr: could not connect to host @@ -3208,7 +3234,7 @@ nopex.no: could not connect to host nopol.de: could not connect to host norandom.com: could not connect to host norb.at: could not connect to host -nosecretshop.com: did not receive HSTS header +nosecretshop.com: could not connect to host notadd.com: did not receive HSTS header note7forever.com: could not connect to host notenoughtime.de: could not connect to host @@ -3224,7 +3250,6 @@ np.search.yahoo.com: did not receive HSTS header npol.de: could not connect to host nqesh.com: could not connect to host nrechn.de: could not connect to host -nsm.ee: could not connect to host ntbs.pro: could not connect to host ntse.xyz: could not connect to host nu3.at: did not receive HSTS header @@ -3315,6 +3340,7 @@ onlinepollsph.com: could not connect to host onlinespielothek.com: did not receive HSTS header onlinewetten.de: could not connect to host onlyshopstation.com: did not receive HSTS header +onlyzero.net: could not connect to host ononpay.com: did not receive HSTS header onpatient.com: did not receive HSTS header onsitemassageco.com: did not receive HSTS header @@ -3435,7 +3461,6 @@ passwordbox.com: did not receive HSTS header passwordrevelator.net: did not receive HSTS header passwords.google.com: did not receive HSTS header (error ignored - included regardless) pastaf.com: could not connect to host -pastdream.xyz: could not connect to host paste.linode.com: could not connect to host pastebin.linode.com: could not connect to host pastenib.com: could not connect to host @@ -3459,6 +3484,7 @@ pc-nf.de: did not receive HSTS header pcfun.net: could not connect to host pchax.net: could not connect to host pchospital.cc: did not receive HSTS header +pclob.gov: could not connect to host pdamsidoarjo.co.id: could not connect to host pdevio.com: could not connect to host pdf.yt: could not connect to host @@ -3505,7 +3531,6 @@ phongmay24h.com: could not connect to host photoblogverona.com: could not connect to host php-bach.org: could not connect to host phpfashion.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] -phryanjr.com: could not connect to host phus.lu: did not receive HSTS header physicalist.com: could not connect to host pickr.co: could not connect to host @@ -3581,9 +3606,9 @@ poolsandstuff.com: did not receive HSTS header poon.tech: could not connect to host porno-gif.ru: did not receive HSTS header portalplatform.net: did not receive HSTS header +portalzine.de: did not receive HSTS header poshpak.com: max-age too low: 86400 postcodewise.co.uk: did not receive HSTS header -posterspy.com: did not receive HSTS header postscheduler.org: could not connect to host posylka.de: did not receive HSTS header potatoheads.net: could not connect to host @@ -3605,7 +3630,6 @@ prego-shop.de: did not receive HSTS header preissler.co.uk: could not connect to host prelist.org: did not receive HSTS header prescriptiondrugs.com: could not connect to host -president.bg: could not connect to host press-anime-nenkan.com: did not receive HSTS header pressfreedomfoundation.org: did not receive HSTS header pretzlaff.info: did not receive HSTS header @@ -3622,7 +3646,6 @@ pro-zone.com: could not connect to host prodpad.com: did not receive HSTS header professionalboundaries.com: did not receive HSTS header profi-durchgangsmelder.de: did not receive HSTS header -profpay.com: could not connect to host profundr.com: could not connect to host progblog.net: could not connect to host progg.no: could not connect to host @@ -3737,7 +3760,6 @@ rdns.im: did not receive HSTS header re-customer.net: did not receive HSTS header reachr.com: could not connect to host readr.pw: could not connect to host -realloc.me: could not connect to host realmic.net: could not connect to host realmofespionage.com: could not connect to host reaper.rip: could not connect to host @@ -3761,7 +3783,6 @@ reggae-cdmx.com: did not receive HSTS header rei.ki: could not connect to host reic.me: could not connect to host reisyukaku.org: did not receive HSTS header -reithguard-it.de: did not receive HSTS header rejo.in: could not connect to host rejuvemedspa.com: did not receive HSTS header relatethesport.com: could not connect to host @@ -3816,7 +3837,6 @@ ring0.xyz: did not receive HSTS header ringh.am: could not connect to host rippleunion.com: could not connect to host riskmgt.com.au: could not connect to host -riverbanktearooms.co.uk: could not connect to host rivlo.com: could not connect to host rj.gg: could not connect to host rk6.cz: could not connect to host @@ -3907,6 +3927,7 @@ salserototal.com: could not connect to host saltedskies.com: could not connect to host saltra.online: could not connect to host salud.top: did not receive HSTS header +sametovymesic.cz: could not connect to host saml2.com: could not connect to host sampoznay.ru: did not receive HSTS header samraskauskas.com: could not connect to host @@ -3994,6 +4015,7 @@ securityheaders.com: could not connect to host securityinet.biz: did not receive HSTS header securityinet.net: did not receive HSTS header securityinet.org.il: did not receive HSTS header +securitymap.wiki: did not receive HSTS header securiviera.ch: did not receive HSTS header sedrubal.de: could not connect to host seedboxers.net: did not receive HSTS header @@ -4041,7 +4063,6 @@ sfsltd.com: did not receive HSTS header shadoom.com: did not receive HSTS header shadowmorph.info: did not receive HSTS header shadowsocks.net: could not connect to host -shagi29.ru: could not connect to host shakepeers.org: did not receive HSTS header shanesage.com: could not connect to host shaobin.wang: could not connect to host @@ -4105,6 +4126,7 @@ simply-premium.com: did not receive HSTS header sin30.net: could not connect to host sincron.org: could not connect to host sinful.pw: could not connect to host +sinfulforums.net: max-age too low: 600 singul4rity.com: could not connect to host sinosky.org: could not connect to host siriad.com: could not connect to host @@ -4140,7 +4162,6 @@ slope.haus: could not connect to host slovakiana.sk: did not receive HSTS header sluitkampzeist.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] slycurity.de: could not connect to host -smallhadroncollider.com: could not connect to host smart-mirror.de: did not receive HSTS header smart-ov.nl: could not connect to host smartcoin.com.br: could not connect to host @@ -4182,7 +4203,6 @@ socialdevelop.biz: max-age too low: 604800 socialhams.net: did not receive HSTS header socialhead.io: could not connect to host socialspirit.com.br: did not receive HSTS header -societyhilldance.com: did not receive HSTS header sockeye.cc: could not connect to host socomponents.co.uk: did not receive HSTS header sodacore.com: could not connect to host @@ -4199,7 +4219,6 @@ sonic.network: did not receive HSTS header sonicrainboom.rocks: did not receive HSTS header soobi.org: did not receive HSTS header soondy.com: did not receive HSTS header -sortaweird.net: could not connect to host sotor.de: did not receive HSTS header soulema.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] soulfulglamour.uk: could not connect to host @@ -4219,7 +4238,6 @@ spark.team: could not connect to host sparkbase.cn: could not connect to host sparklingsparklers.com: did not receive HSTS header sparsa.army: could not connect to host -spartantheatre.org: max-age too low: 172800 spauted.com: could not connect to host spdysync.com: could not connect to host speculor.net: could not connect to host @@ -4256,6 +4274,7 @@ squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERR sqzryang.com: did not receive HSTS header srevilak.net: did not receive HSTS header srna.sk: could not connect to host +srrdb.com: could not connect to host srrr.ca: could not connect to host ss.wtf: could not connect to host ssl.panoramio.com: did not receive HSTS header @@ -4279,7 +4298,6 @@ starttraffic.com: did not receive HSTS header startuponcloud.com: max-age too low: 2678400 startuppeople.co.uk: did not receive HSTS header stash.ai: did not receive HSTS header -stassi.ch: did not receive HSTS header state-sponsored-actors.net: could not connect to host statementinsertsforless.com: did not receive HSTS header stateofexception.io: could not connect to host @@ -4344,7 +4362,6 @@ studybay.com: did not receive HSTS header studydrive.net: did not receive HSTS header studyhub.cf: did not receive HSTS header stugb.de: did not receive HSTS header -sturbock.me: did not receive HSTS header stw-group.at: could not connect to host stylenda.com: could not connect to host styles.pm: could not connect to host @@ -4483,6 +4500,7 @@ tensei-slime.com: did not receive HSTS header tensionup.com: could not connect to host tentins.com: could not connect to host teos.online: could not connect to host +tepid.org: could not connect to host teriiphotography.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] terra.by: did not receive HSTS header terrax.berlin: could not connect to host @@ -4520,7 +4538,6 @@ thecrochetcottage.net: could not connect to host thediaryofadam.com: did not receive HSTS header theendofzion.com: did not receive HSTS header theescapistswiki.com: could not connect to host -theeyeopener.com: did not receive HSTS header thefarbeyond.com: could not connect to host theflowerbasketonline.com: could not connect to host thefootballanalyst.com: could not connect to host @@ -4558,6 +4575,7 @@ thezonders.com: did not receive HSTS header thierfreund.de: could not connect to host thinkcoding.de: could not connect to host thinkcoding.org: could not connect to host +thinkindifferent.net: could not connect to host thirdpartytrade.com: did not receive HSTS header thirty5.net: did not receive HSTS header thisisacompletetest.ga: could not connect to host @@ -4603,6 +4621,7 @@ tittelbach.at: did not receive HSTS header titties.ml: could not connect to host tjc.wiki: could not connect to host tkappertjedemetamorfose.nl: could not connect to host +tkonstantopoulos.tk: could not connect to host tlo.hosting: could not connect to host tlo.link: did not receive HSTS header tlo.network: could not connect to host @@ -4664,9 +4683,9 @@ transitownplaza.com: could not connect to host translate.googleapis.com: did not receive HSTS header (error ignored - included regardless) transportal.sk: did not receive HSTS header travelinsurance.co.nz: did not receive HSTS header +treasuredinheritanceministry.com: did not receive HSTS header treeby.net: could not connect to host trendberry.ru: could not connect to host -trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] trinityaffirmations.com: max-age too low: 0 trinitycore.org: max-age too low: 2592000 tripdelta.com: did not receive HSTS header @@ -4698,7 +4717,7 @@ turtlementors.com: could not connect to host tuturulianda.com: did not receive HSTS header tuvalie.com: could not connect to host tuxcall.de: could not connect to host -tuxz.net: could not connect to host +tuxz.net: did not receive HSTS header tv.search.yahoo.com: could not connect to host tvtubeflix.com: did not receive HSTS header tvz-materijali.com: could not connect to host @@ -4795,7 +4814,7 @@ usaa.com: did not receive HSTS header usbtypeccompliant.com: could not connect to host uscitizenship.info: did not receive HSTS header uscntalk.com: could not connect to host -uscurrency.gov: could not connect to host +uscurrency.gov: did not receive HSTS header used-in.jp: did not receive HSTS header usercare.com: did not receive HSTS header userify.com: did not receive HSTS header @@ -4849,13 +4868,12 @@ vermontcareergateway.org: could not connect to host versia.ru: did not receive HSTS header veryhax.de: could not connect to host vetmgmt.com: could not connect to host -vfdworld.com: could not connect to host vfree.org: could not connect to host vglimg.com: could not connect to host vhost.co.id: could not connect to host viadeux.com: could not connect to host videnskabsklubben.dk: did not receive HSTS header -videomuz.com: could not connect to host +videomuz.com: did not receive HSTS header videotogel.net: did not receive HSTS header vidid.net: did not receive HSTS header vidz.ga: could not connect to host @@ -4871,7 +4889,6 @@ viktorsvantesson.net: did not receive HSTS header vincentkooijman.at: did not receive HSTS header vincentkooijman.nl: did not receive HSTS header vincentpancol.com: could not connect to host -vinetalk.net: could not connect to host vintageheartcoffee.com: did not receive HSTS header vio.no: did not receive HSTS header viperdns.com: could not connect to host @@ -4996,6 +5013,7 @@ werkenbijkfc.nl: did not receive HSTS header werkplaatsoost.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] werkruimtebottendaal.nl: could not connect to host wesleyharris.ca: did not receive HSTS header +west-wind.net: could not connect to host westendzone.com: max-age too low: 0 westerhoud.nl: did not receive HSTS header wettbuero.de: did not receive HSTS header @@ -5031,10 +5049,10 @@ william.si: did not receive HSTS header willosagiede.com: did not receive HSTS header winaes.com: did not receive HSTS header winclient.cn: could not connect to host -wine-importer.ru: did not receive HSTS header winecodeavocado.com: could not connect to host winged.io: could not connect to host wingumd.net: could not connect to host +winhistory-forum.net: could not connect to host winpack.cf: could not connect to host winpack.eu.org: could not connect to host winsec.nl: could not connect to host @@ -5057,7 +5075,6 @@ wmcuk.net: could not connect to host wmfinanz.com: could not connect to host wnmm.nl: could not connect to host wodice.com: could not connect to host -wofford-ecs.org: could not connect to host wohnungsbau-ludwigsburg.de: did not receive HSTS header woima.fi: max-age too low: 604800 wolfesden.com: could not connect to host @@ -5075,7 +5092,6 @@ workpermit.com.vn: did not receive HSTS header workwithgo.com: could not connect to host worldsbeststory.com: did not receive HSTS header wowapi.org: could not connect to host -wpfast.net: did not receive HSTS header wpfortify.com: did not receive HSTS header wphostingspot.com: did not receive HSTS header wpmetadatastandardsproject.org: could not connect to host @@ -5173,7 +5189,7 @@ xuwei.de: could not connect to host xuyh0120.win: did not receive HSTS header xxbase.com: could not connect to host y-o-w.com: did not receive HSTS header -y-s.pw: did not receive HSTS header +y-s.pw: max-age too low: 2592000 yabrt.cn: could not connect to host yagi2.com: could not connect to host yalook.com: did not receive HSTS header @@ -5201,7 +5217,7 @@ yjsoft.me: did not receive HSTS header yjsw.sh.cn: could not connect to host ynode.co: did not receive HSTS header ynsn.nl: did not receive HSTS header -yokeepo.com: did not receive HSTS header +yokeepo.com: max-age too low: 0 yoloboatrentals.com: did not receive HSTS header yoloprod.fr: could not connect to host yoloseo.com: could not connect to host @@ -5280,5 +5296,4 @@ ztcaoll222.cn: did not receive HSTS header zulu7.com: could not connect to host zvncloud.com: did not receive HSTS header zwollemagazine.nl: did not receive HSTS header -zwy.me: could not connect to host zyf.pw: could not connect to host diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index 8466b52a146d..4891ddb62ea4 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1500822640778000); +const PRTime gPreloadListExpirationTime = INT64_C(1500909494876000); static const char kSTSHostTable[] = { /* "0.me.uk", true */ '0', '.', 'm', 'e', '.', 'u', 'k', '\0', @@ -117,7 +117,6 @@ static const char kSTSHostTable[] = { /* "1ststop.co.uk", true */ '1', 's', 't', 's', 't', 'o', 'p', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "1three1.net", true */ '1', 't', 'h', 'r', 'e', 'e', '1', '.', 'n', 'e', 't', '\0', /* "1whw.co.uk", true */ '1', 'w', 'h', 'w', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "1years.cc", true */ '1', 'y', 'e', 'a', 'r', 's', '.', 'c', 'c', '\0', /* "2-cpu.de", true */ '2', '-', 'c', 'p', 'u', '.', 'd', 'e', '\0', /* "2.wtf", true */ '2', '.', 'w', 't', 'f', '\0', /* "2048-spiel.de", true */ '2', '0', '4', '8', '-', 's', 'p', 'i', 'e', 'l', '.', 'd', 'e', '\0', @@ -191,7 +190,6 @@ static const char kSTSHostTable[] = { /* "41-where.com", true */ '4', '1', '-', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "41844.de", true */ '4', '1', '8', '4', '4', '.', 'd', 'e', '\0', /* "41where.com", true */ '4', '1', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', - /* "420dongstorm.com", true */ '4', '2', '0', 'd', 'o', 'n', 'g', 's', 't', 'o', 'r', 'm', '.', 'c', 'o', 'm', '\0', /* "42day.info", true */ '4', '2', 'd', 'a', 'y', '.', 'i', 'n', 'f', 'o', '\0', /* "439191.com", true */ '4', '3', '9', '1', '9', '1', '.', 'c', 'o', 'm', '\0', /* "441jj.com", true */ '4', '4', '1', 'j', 'j', '.', 'c', 'o', 'm', '\0', @@ -366,6 +364,7 @@ static const char kSTSHostTable[] = { /* "activatemyiphone.com", true */ 'a', 'c', 't', 'i', 'v', 'a', 't', 'e', 'm', 'y', 'i', 'p', 'h', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "active.hu", false */ 'a', 'c', 't', 'i', 'v', 'e', '.', 'h', 'u', '\0', /* "actorsroom.com", true */ 'a', 'c', 't', 'o', 'r', 's', 'r', 'o', 'o', 'm', '.', 'c', 'o', 'm', '\0', + /* "actserv.co.ke", true */ 'a', 'c', 't', 's', 'e', 'r', 'v', '.', 'c', 'o', '.', 'k', 'e', '\0', /* "acuica.co.uk", false */ 'a', 'c', 'u', 'i', 'c', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "acus.gov", true */ 'a', 'c', 'u', 's', '.', 'g', 'o', 'v', '\0', /* "acwcerts.co.uk", true */ 'a', 'c', 'w', 'c', 'e', 'r', 't', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -381,13 +380,11 @@ static const char kSTSHostTable[] = { /* "ad-notam.us", true */ 'a', 'd', '-', 'n', 'o', 't', 'a', 'm', '.', 'u', 's', '\0', /* "ada.gov", true */ 'a', 'd', 'a', '.', 'g', 'o', 'v', '\0', /* "adalis.org", true */ 'a', 'd', 'a', 'l', 'i', 's', '.', 'o', 'r', 'g', '\0', - /* "adam-kostecki.de", true */ 'a', 'd', 'a', 'm', '-', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "adambyers.com", true */ 'a', 'd', 'a', 'm', 'b', 'y', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "adamdixon.co.uk", true */ 'a', 'd', 'a', 'm', 'd', 'i', 'x', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "adamek.online", true */ 'a', 'd', 'a', 'm', 'e', 'k', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0', /* "adamgold.net", true */ 'a', 'd', 'a', 'm', 'g', 'o', 'l', 'd', '.', 'n', 'e', 't', '\0', /* "adamkaminski.com", true */ 'a', 'd', 'a', 'm', 'k', 'a', 'm', 'i', 'n', 's', 'k', 'i', '.', 'c', 'o', 'm', '\0', - /* "adamkostecki.de", true */ 'a', 'd', 'a', 'm', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "adamoutler.com", true */ 'a', 'd', 'a', 'm', 'o', 'u', 't', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "adamradocz.com", true */ 'a', 'd', 'a', 'm', 'r', 'a', 'd', 'o', 'c', 'z', '.', 'c', 'o', 'm', '\0', /* "adamricheimer.com", true */ 'a', 'd', 'a', 'm', 'r', 'i', 'c', 'h', 'e', 'i', 'm', 'e', 'r', '.', 'c', 'o', 'm', '\0', @@ -500,7 +497,6 @@ static const char kSTSHostTable[] = { /* "afri.cc", true */ 'a', 'f', 'r', 'i', '.', 'c', 'c', '\0', /* "africa.dating", true */ 'a', 'f', 'r', 'i', 'c', 'a', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "africatravel.de", true */ 'a', 'f', 'r', 'i', 'c', 'a', 't', 'r', 'a', 'v', 'e', 'l', '.', 'd', 'e', '\0', - /* "afrodigital.uk", true */ 'a', 'f', 'r', 'o', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'u', 'k', '\0', /* "after.im", true */ 'a', 'f', 't', 'e', 'r', '.', 'i', 'm', '\0', /* "afterstack.net", true */ 'a', 'f', 't', 'e', 'r', 's', 't', 'a', 'c', 'k', '.', 'n', 'e', 't', '\0', /* "afuh.de", true */ 'a', 'f', 'u', 'h', '.', 'd', 'e', '\0', @@ -592,7 +588,6 @@ static const char kSTSHostTable[] = { /* "akhilindurti.com", false */ 'a', 'k', 'h', 'i', 'l', 'i', 'n', 'd', 'u', 'r', 't', 'i', '.', 'c', 'o', 'm', '\0', /* "akhras.at", true */ 'a', 'k', 'h', 'r', 'a', 's', '.', 'a', 't', '\0', /* "akkadia.cc", true */ 'a', 'k', 'k', 'a', 'd', 'i', 'a', '.', 'c', 'c', '\0', - /* "akostecki.de", true */ 'a', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "akovana.com", true */ 'a', 'k', 'o', 'v', 'a', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "akoww.de", true */ 'a', 'k', 'o', 'w', 'w', '.', 'd', 'e', '\0', /* "akpwebdesign.com", true */ 'a', 'k', 'p', 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', @@ -610,7 +605,6 @@ static const char kSTSHostTable[] = { /* "al3xpro.com", true */ 'a', 'l', '3', 'x', 'p', 'r', 'o', '.', 'c', 'o', 'm', '\0', /* "aladdinschools.appspot.com", true */ 'a', 'l', 'a', 'd', 'd', 'i', 'n', 's', 'c', 'h', 'o', 'o', 'l', 's', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "alainbaechlerphotography.ch", true */ 'a', 'l', 'a', 'i', 'n', 'b', 'a', 'e', 'c', 'h', 'l', 'e', 'r', 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'c', 'h', '\0', - /* "alainwolf.ch", true */ 'a', 'l', 'a', 'i', 'n', 'w', 'o', 'l', 'f', '.', 'c', 'h', '\0', /* "alair.cn", false */ 'a', 'l', 'a', 'i', 'r', '.', 'c', 'n', '\0', /* "alaninkenya.org", true */ 'a', 'l', 'a', 'n', 'i', 'n', 'k', 'e', 'n', 'y', 'a', '.', 'o', 'r', 'g', '\0', /* "alaricfavier.eu", true */ 'a', 'l', 'a', 'r', 'i', 'c', 'f', 'a', 'v', 'i', 'e', 'r', '.', 'e', 'u', '\0', @@ -643,6 +637,7 @@ static const char kSTSHostTable[] = { /* "alexei.su", true */ 'a', 'l', 'e', 'x', 'e', 'i', '.', 's', 'u', '\0', /* "alexey-shamara.ru", true */ 'a', 'l', 'e', 'x', 'e', 'y', '-', 's', 'h', 'a', 'm', 'a', 'r', 'a', '.', 'r', 'u', '\0', /* "alexgaynor.net", true */ 'a', 'l', 'e', 'x', 'g', 'a', 'y', 'n', 'o', 'r', '.', 'n', 'e', 't', '\0', + /* "alexhaydock.co.uk", true */ 'a', 'l', 'e', 'x', 'h', 'a', 'y', 'd', 'o', 'c', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "alexhd.de", true */ 'a', 'l', 'e', 'x', 'h', 'd', '.', 'd', 'e', '\0', /* "alexismeza.com", true */ 'a', 'l', 'e', 'x', 'i', 's', 'm', 'e', 'z', 'a', '.', 'c', 'o', 'm', '\0', /* "alexismeza.com.mx", true */ 'a', 'l', 'e', 'x', 'i', 's', 'm', 'e', 'z', 'a', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0', @@ -659,6 +654,7 @@ static const char kSTSHostTable[] = { /* "alexsexton.com", true */ 'a', 'l', 'e', 'x', 's', 'e', 'x', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "alextsang.net", true */ 'a', 'l', 'e', 'x', 't', 's', 'a', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "alexvetter.de", true */ 'a', 'l', 'e', 'x', 'v', 'e', 't', 't', 'e', 'r', '.', 'd', 'e', '\0', + /* "alexwardweb.com", true */ 'a', 'l', 'e', 'x', 'w', 'a', 'r', 'd', 'w', 'e', 'b', '.', 'c', 'o', 'm', '\0', /* "alexyang.me", true */ 'a', 'l', 'e', 'x', 'y', 'a', 'n', 'g', '.', 'm', 'e', '\0', /* "alfa-tech.su", true */ 'a', 'l', 'f', 'a', '-', 't', 'e', 'c', 'h', '.', 's', 'u', '\0', /* "alfredxing.com", false */ 'a', 'l', 'f', 'r', 'e', 'd', 'x', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -731,7 +727,6 @@ static const char kSTSHostTable[] = { /* "alterbaum.net", true */ 'a', 'l', 't', 'e', 'r', 'b', 'a', 'u', 'm', '.', 'n', 'e', 't', '\0', /* "alternative.bike", true */ 'a', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', '.', 'b', 'i', 'k', 'e', '\0', /* "alternativet.party", true */ 'a', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', 't', '.', 'p', 'a', 'r', 't', 'y', '\0', - /* "altesses.eu", true */ 'a', 'l', 't', 'e', 's', 's', 'e', 's', '.', 'e', 'u', '\0', /* "altestore.com", true */ 'a', 'l', 't', 'e', 's', 't', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "altkremsmuensterer.at", true */ 'a', 'l', 't', 'k', 'r', 'e', 'm', 's', 'm', 'u', 'e', 'n', 's', 't', 'e', 'r', 'e', 'r', '.', 'a', 't', '\0', /* "altonblom.com", true */ 'a', 'l', 't', 'o', 'n', 'b', 'l', 'o', 'm', '.', 'c', 'o', 'm', '\0', @@ -1160,7 +1155,6 @@ static const char kSTSHostTable[] = { /* "asahikoji.net", true */ 'a', 's', 'a', 'h', 'i', 'k', 'o', 'j', 'i', '.', 'n', 'e', 't', '\0', /* "asandu.eu", true */ 'a', 's', 'a', 'n', 'd', 'u', '.', 'e', 'u', '\0', /* "asato-jewelry.com", true */ 'a', 's', 'a', 't', 'o', '-', 'j', 'e', 'w', 'e', 'l', 'r', 'y', '.', 'c', 'o', 'm', '\0', - /* "asbito.de", true */ 'a', 's', 'b', 'i', 't', 'o', '.', 'd', 'e', '\0', /* "ascension.run", true */ 'a', 's', 'c', 'e', 'n', 's', 'i', 'o', 'n', '.', 'r', 'u', 'n', '\0', /* "ascgathering.com", true */ 'a', 's', 'c', 'g', 'a', 't', 'h', 'e', 'r', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "aschaefer.net", true */ 'a', 's', 'c', 'h', 'a', 'e', 'f', 'e', 'r', '.', 'n', 'e', 't', '\0', @@ -1187,7 +1181,6 @@ static const char kSTSHostTable[] = { /* "asr.li", true */ 'a', 's', 'r', '.', 'l', 'i', '\0', /* "asr.rocks", true */ 'a', 's', 'r', '.', 'r', 'o', 'c', 'k', 's', '\0', /* "asr.solar", true */ 'a', 's', 'r', '.', 's', 'o', 'l', 'a', 'r', '\0', - /* "assdecoeur.org", true */ 'a', 's', 's', 'd', 'e', 'c', 'o', 'e', 'u', 'r', '.', 'o', 'r', 'g', '\0', /* "asseenfromthesidecar.org", true */ 'a', 's', 's', 'e', 'e', 'n', 'f', 'r', 'o', 'm', 't', 'h', 'e', 's', 'i', 'd', 'e', 'c', 'a', 'r', '.', 'o', 'r', 'g', '\0', /* "assemble-together.org", true */ 'a', 's', 's', 'e', 'm', 'b', 'l', 'e', '-', 't', 'o', 'g', 'e', 't', 'h', 'e', 'r', '.', 'o', 'r', 'g', '\0', /* "assindia.nl", true */ 'a', 's', 's', 'i', 'n', 'd', 'i', 'a', '.', 'n', 'l', '\0', @@ -1292,7 +1285,6 @@ static const char kSTSHostTable[] = { /* "australiancattle.dog", true */ 'a', 'u', 's', 't', 'r', 'a', 'l', 'i', 'a', 'n', 'c', 'a', 't', 't', 'l', 'e', '.', 'd', 'o', 'g', '\0', /* "auszeit.bio", true */ 'a', 'u', 's', 'z', 'e', 'i', 't', '.', 'b', 'i', 'o', '\0', /* "auth.adult", true */ 'a', 'u', 't', 'h', '.', 'a', 'd', 'u', 'l', 't', '\0', - /* "authint.com", true */ 'a', 'u', 't', 'h', 'i', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "author24.ru", true */ 'a', 'u', 't', 'h', 'o', 'r', '2', '4', '.', 'r', 'u', '\0', /* "autimatisering.nl", true */ 'a', 'u', 't', 'i', 'm', 'a', 't', 'i', 's', 'e', 'r', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "auto-anleitung.de", true */ 'a', 'u', 't', 'o', '-', 'a', 'n', 'l', 'e', 'i', 't', 'u', 'n', 'g', '.', 'd', 'e', '\0', @@ -1314,7 +1306,7 @@ static const char kSTSHostTable[] = { /* "autoskola.hr", true */ 'a', 'u', 't', 'o', 's', 'k', 'o', 'l', 'a', '.', 'h', 'r', '\0', /* "autoskole.hr", true */ 'a', 'u', 't', 'o', 's', 'k', 'o', 'l', 'e', '.', 'h', 'r', '\0', /* "autoverzekeringafsluiten.com", true */ 'a', 'u', 't', 'o', 'v', 'e', 'r', 'z', 'e', 'k', 'e', 'r', 'i', 'n', 'g', 'a', 'f', 's', 'l', 'u', 'i', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', - /* "av.de", true */ 'a', 'v', '.', 'd', 'e', '\0', + /* "auxetek.se", true */ 'a', 'u', 'x', 'e', 't', 'e', 'k', '.', 's', 'e', '\0', /* "ava-creative.de", true */ 'a', 'v', 'a', '-', 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '.', 'd', 'e', '\0', /* "avaaz.org", true */ 'a', 'v', 'a', 'a', 'z', '.', 'o', 'r', 'g', '\0', /* "avacariu.me", true */ 'a', 'v', 'a', 'c', 'a', 'r', 'i', 'u', '.', 'm', 'e', '\0', @@ -1453,8 +1445,6 @@ static const char kSTSHostTable[] = { /* "ballmerpeak.org", true */ 'b', 'a', 'l', 'l', 'm', 'e', 'r', 'p', 'e', 'a', 'k', '.', 'o', 'r', 'g', '\0', /* "ballotapi.com", true */ 'b', 'a', 'l', 'l', 'o', 't', 'a', 'p', 'i', '.', 'c', 'o', 'm', '\0', /* "ballothero.com", true */ 'b', 'a', 'l', 'l', 'o', 't', 'h', 'e', 'r', 'o', '.', 'c', 'o', 'm', '\0', - /* "balonmano.co", true */ 'b', 'a', 'l', 'o', 'n', 'm', 'a', 'n', 'o', '.', 'c', 'o', '\0', - /* "bananabandy.com", true */ 'b', 'a', 'n', 'a', 'n', 'a', 'b', 'a', 'n', 'd', 'y', '.', 'c', 'o', 'm', '\0', /* "bananium.fr", true */ 'b', 'a', 'n', 'a', 'n', 'i', 'u', 'm', '.', 'f', 'r', '\0', /* "bancacrs.it", true */ 'b', 'a', 'n', 'c', 'a', 'c', 'r', 's', '.', 'i', 't', '\0', /* "bancoctt.pt", true */ 'b', 'a', 'n', 'c', 'o', 'c', 't', 't', '.', 'p', 't', '\0', @@ -1571,7 +1561,6 @@ static const char kSTSHostTable[] = { /* "be-real.life", true */ 'b', 'e', '-', 'r', 'e', 'a', 'l', '.', 'l', 'i', 'f', 'e', '\0', /* "be-webdesign.com", true */ 'b', 'e', '-', 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', /* "be2cloud.de", true */ 'b', 'e', '2', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', - /* "beamitapp.com", true */ 'b', 'e', 'a', 'm', 'i', 't', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "beanjuice.me", true */ 'b', 'e', 'a', 'n', 'j', 'u', 'i', 'c', 'e', '.', 'm', 'e', '\0', /* "beans-one.com", false */ 'b', 'e', 'a', 'n', 's', '-', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "beanworks.ca", true */ 'b', 'e', 'a', 'n', 'w', 'o', 'r', 'k', 's', '.', 'c', 'a', '\0', @@ -1722,7 +1711,6 @@ static const char kSTSHostTable[] = { /* "betterbabyshop.com.au", true */ 'b', 'e', 't', 't', 'e', 'r', 'b', 'a', 'b', 'y', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "bettercrypto.org", true */ 'b', 'e', 't', 't', 'e', 'r', 'c', 'r', 'y', 'p', 't', 'o', '.', 'o', 'r', 'g', '\0', /* "betterhelp.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0', - /* "betterlifemakers.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'l', 'i', 'f', 'e', 'm', 'a', 'k', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "betterscience.org", true */ 'b', 'e', 't', 't', 'e', 'r', 's', 'c', 'i', 'e', 'n', 'c', 'e', '.', 'o', 'r', 'g', '\0', /* "bettertest.it", true */ 'b', 'e', 't', 't', 'e', 'r', 't', 'e', 's', 't', '.', 'i', 't', '\0', /* "bettingbusiness.ru", true */ 'b', 'e', 't', 't', 'i', 'n', 'g', 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '.', 'r', 'u', '\0', @@ -1758,6 +1746,7 @@ static const char kSTSHostTable[] = { /* "bgdaddy.com", true */ 'b', 'g', 'd', 'a', 'd', 'd', 'y', '.', 'c', 'o', 'm', '\0', /* "bgenlisted.com", true */ 'b', 'g', 'e', 'n', 'l', 'i', 's', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "bgeo.io", true */ 'b', 'g', 'e', 'o', '.', 'i', 'o', '\0', + /* "bgkoleda.bg", true */ 'b', 'g', 'k', 'o', 'l', 'e', 'd', 'a', '.', 'b', 'g', '\0', /* "bgneuesheim.de", true */ 'b', 'g', 'n', 'e', 'u', 'e', 's', 'h', 'e', 'i', 'm', '.', 'd', 'e', '\0', /* "bhodisoft.com", true */ 'b', 'h', 'o', 'd', 'i', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0', /* "bhtelecom.ba", true */ 'b', 'h', 't', 'e', 'l', 'e', 'c', 'o', 'm', '.', 'b', 'a', '\0', @@ -1926,13 +1915,6 @@ static const char kSTSHostTable[] = { /* "bjs.gov", true */ 'b', 'j', 's', '.', 'g', 'o', 'v', '\0', /* "bk-bund-berlin.de", true */ 'b', 'k', '-', 'b', 'u', 'n', 'd', '-', 'b', 'e', 'r', 'l', 'i', 'n', '.', 'd', 'e', '\0', /* "bk99.de", false */ 'b', 'k', '9', '9', '.', 'd', 'e', '\0', - /* "bkb-skandal.ch", true */ 'b', 'k', 'b', '-', 's', 'k', 'a', 'n', 'd', 'a', 'l', '.', 'c', 'h', '\0', - /* "bl4ckb0x.com", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'c', 'o', 'm', '\0', - /* "bl4ckb0x.de", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'd', 'e', '\0', - /* "bl4ckb0x.eu", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'e', 'u', '\0', - /* "bl4ckb0x.info", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'i', 'n', 'f', 'o', '\0', - /* "bl4ckb0x.net", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'n', 'e', 't', '\0', - /* "bl4ckb0x.org", true */ 'b', 'l', '4', 'c', 'k', 'b', '0', 'x', '.', 'o', 'r', 'g', '\0', /* "blablacar.co.uk", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "blablacar.com", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "blablacar.com.tr", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'c', 'o', 'm', '.', 't', 'r', '\0', @@ -2118,7 +2100,6 @@ static const char kSTSHostTable[] = { /* "bosun.io", true */ 'b', 'o', 's', 'u', 'n', '.', 'i', 'o', '\0', /* "bottineauneighborhood.org", true */ 'b', 'o', 't', 't', 'i', 'n', 'e', 'a', 'u', 'n', 'e', 'i', 'g', 'h', 'b', 'o', 'r', 'h', 'o', 'o', 'd', '.', 'o', 'r', 'g', '\0', /* "boudah.pl", true */ 'b', 'o', 'u', 'd', 'a', 'h', '.', 'p', 'l', '\0', - /* "bougeret.fr", true */ 'b', 'o', 'u', 'g', 'e', 'r', 'e', 't', '.', 'f', 'r', '\0', /* "bouncyball.eu", false */ 'b', 'o', 'u', 'n', 'c', 'y', 'b', 'a', 'l', 'l', '.', 'e', 'u', '\0', /* "bouncyballs.org", true */ 'b', 'o', 'u', 'n', 'c', 'y', 'b', 'a', 'l', 'l', 's', '.', 'o', 'r', 'g', '\0', /* "bountyfactory.io", true */ 'b', 'o', 'u', 'n', 't', 'y', 'f', 'a', 'c', 't', 'o', 'r', 'y', '.', 'i', 'o', '\0', @@ -2294,7 +2275,6 @@ static const char kSTSHostTable[] = { /* "buderus-family.be", true */ 'b', 'u', 'd', 'e', 'r', 'u', 's', '-', 'f', 'a', 'm', 'i', 'l', 'y', '.', 'b', 'e', '\0', /* "budger.nl", true */ 'b', 'u', 'd', 'g', 'e', 'r', '.', 'n', 'l', '\0', /* "budgetalk.com", true */ 'b', 'u', 'd', 'g', 'e', 't', 'a', 'l', 'k', '.', 'c', 'o', 'm', '\0', - /* "budntod.com", true */ 'b', 'u', 'd', 'n', 't', 'o', 'd', '.', 'c', 'o', 'm', '\0', /* "bueltge.de", true */ 'b', 'u', 'e', 'l', 't', 'g', 'e', '.', 'd', 'e', '\0', /* "buenosairesestetica.com.ar", true */ 'b', 'u', 'e', 'n', 'o', 's', 'a', 'i', 'r', 'e', 's', 'e', 's', 't', 'e', 't', 'i', 'c', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', /* "buergerhaushalt.com", true */ 'b', 'u', 'e', 'r', 'g', 'e', 'r', 'h', 'a', 'u', 's', 'h', 'a', 'l', 't', '.', 'c', 'o', 'm', '\0', @@ -2324,6 +2304,7 @@ static const char kSTSHostTable[] = { /* "buka.jp", true */ 'b', 'u', 'k', 'a', '.', 'j', 'p', '\0', /* "bukatv.cz", true */ 'b', 'u', 'k', 'a', 't', 'v', '.', 'c', 'z', '\0', /* "bukkenfan.jp", true */ 'b', 'u', 'k', 'k', 'e', 'n', 'f', 'a', 'n', '.', 'j', 'p', '\0', + /* "bul3seas.eu", true */ 'b', 'u', 'l', '3', 's', 'e', 'a', 's', '.', 'e', 'u', '\0', /* "bulario.com", true */ 'b', 'u', 'l', 'a', 'r', 'i', 'o', '.', 'c', 'o', 'm', '\0', /* "bulbcompare.com", true */ 'b', 'u', 'l', 'b', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "bulbgenie.com", true */ 'b', 'u', 'l', 'b', 'g', 'e', 'n', 'i', 'e', '.', 'c', 'o', 'm', '\0', @@ -2360,6 +2341,7 @@ static const char kSTSHostTable[] = { /* "business-garden.com", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '-', 'g', 'a', 'r', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "business.facebook.com", false */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '.', 'f', 'a', 'c', 'e', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "business.medbank.com.mt", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '.', 'm', 'e', 'd', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '.', 'm', 't', '\0', + /* "businessadviceperth.com.au", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'p', 'e', 'r', 't', 'h', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "businessamongus.com", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'a', 'm', 'o', 'n', 'g', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "businessesdirectory.eu", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'e', 's', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '.', 'e', 'u', '\0', /* "businessfurs.info", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'f', 'u', 'r', 's', '.', 'i', 'n', 'f', 'o', '\0', @@ -2417,7 +2399,6 @@ static const char kSTSHostTable[] = { /* "bytebucket.org", true */ 'b', 'y', 't', 'e', 'b', 'u', 'c', 'k', 'e', 't', '.', 'o', 'r', 'g', '\0', /* "bytejail.com", true */ 'b', 'y', 't', 'e', 'j', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "bytema.cz", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'c', 'z', '\0', - /* "bytema.re", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'r', 'e', '\0', /* "byteowls.com", true */ 'b', 'y', 't', 'e', 'o', 'w', 'l', 's', '.', 'c', 'o', 'm', '\0', /* "bytesatwork.de", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'd', 'e', '\0', /* "bytesatwork.eu", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'e', 'u', '\0', @@ -2539,6 +2520,7 @@ static const char kSTSHostTable[] = { /* "canihavesome.coffee", true */ 'c', 'a', 'n', 'i', 'h', 'a', 'v', 'e', 's', 'o', 'm', 'e', '.', 'c', 'o', 'f', 'f', 'e', 'e', '\0', /* "canlidoviz.com", true */ 'c', 'a', 'n', 'l', 'i', 'd', 'o', 'v', 'i', 'z', '.', 'c', 'o', 'm', '\0', /* "cannabis-marijuana.com", true */ 'c', 'a', 'n', 'n', 'a', 'b', 'i', 's', '-', 'm', 'a', 'r', 'i', 'j', 'u', 'a', 'n', 'a', '.', 'c', 'o', 'm', '\0', + /* "cannyfoxx.me", true */ 'c', 'a', 'n', 'n', 'y', 'f', 'o', 'x', 'x', '.', 'm', 'e', '\0', /* "canoonic.se", true */ 'c', 'a', 'n', 'o', 'o', 'n', 'i', 'c', '.', 's', 'e', '\0', /* "cantatio.ch", true */ 'c', 'a', 'n', 't', 'a', 't', 'i', 'o', '.', 'c', 'h', '\0', /* "canterberry.cc", true */ 'c', 'a', 'n', 't', 'e', 'r', 'b', 'e', 'r', 'r', 'y', '.', 'c', 'c', '\0', @@ -2551,6 +2533,7 @@ static const char kSTSHostTable[] = { /* "caodecristachines.com.br", true */ 'c', 'a', 'o', 'd', 'e', 'c', 'r', 'i', 's', 't', 'a', 'c', 'h', 'i', 'n', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "caodesantohumberto.com.br", true */ 'c', 'a', 'o', 'd', 'e', 's', 'a', 'n', 't', 'o', 'h', 'u', 'm', 'b', 'e', 'r', 't', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "capacent.is", true */ 'c', 'a', 'p', 'a', 'c', 'e', 'n', 't', '.', 'i', 's', '\0', + /* "capellidipremoli.com", true */ 'c', 'a', 'p', 'e', 'l', 'l', 'i', 'd', 'i', 'p', 'r', 'e', 'm', 'o', 'l', 'i', '.', 'c', 'o', 'm', '\0', /* "caphane.com", true */ 'c', 'a', 'p', 'h', 'a', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "capitalcap.com", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 'c', 'a', 'p', '.', 'c', 'o', 'm', '\0', /* "capitalibre.com", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 'i', 'b', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -2882,6 +2865,8 @@ static const char kSTSHostTable[] = { /* "chonghe.org", true */ 'c', 'h', 'o', 'n', 'g', 'h', 'e', '.', 'o', 'r', 'g', '\0', /* "choosemypc.net", true */ 'c', 'h', 'o', 'o', 's', 'e', 'm', 'y', 'p', 'c', '.', 'n', 'e', 't', '\0', /* "chopperforums.com", true */ 'c', 'h', 'o', 'p', 'p', 'e', 'r', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0', + /* "chorkley.co.uk", true */ 'c', 'h', 'o', 'r', 'k', 'l', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "chorkley.uk", true */ 'c', 'h', 'o', 'r', 'k', 'l', 'e', 'y', '.', 'u', 'k', '\0', /* "chorpinkpoemps.de", true */ 'c', 'h', 'o', 'r', 'p', 'i', 'n', 'k', 'p', 'o', 'e', 'm', 'p', 's', '.', 'd', 'e', '\0', /* "chosenplaintext.org", true */ 'c', 'h', 'o', 's', 'e', 'n', 'p', 'l', 'a', 'i', 'n', 't', 'e', 'x', 't', '.', 'o', 'r', 'g', '\0', /* "chourishi-shigoto.com", true */ 'c', 'h', 'o', 'u', 'r', 'i', 's', 'h', 'i', '-', 's', 'h', 'i', 'g', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0', @@ -2967,6 +2952,7 @@ static const char kSTSHostTable[] = { /* "cipherboy.com", true */ 'c', 'i', 'p', 'h', 'e', 'r', 'b', 'o', 'y', '.', 'c', 'o', 'm', '\0', /* "cipherli.st", true */ 'c', 'i', 'p', 'h', 'e', 'r', 'l', 'i', '.', 's', 't', '\0', /* "ciphrex.com", true */ 'c', 'i', 'p', 'h', 'r', 'e', 'x', '.', 'c', 'o', 'm', '\0', + /* "circara.com", true */ 'c', 'i', 'r', 'c', 'a', 'r', 'a', '.', 'c', 'o', 'm', '\0', /* "cirfi.com", true */ 'c', 'i', 'r', 'f', 'i', '.', 'c', 'o', 'm', '\0', /* "cirope.com", true */ 'c', 'i', 'r', 'o', 'p', 'e', '.', 'c', 'o', 'm', '\0', /* "cirrohost.com", true */ 'c', 'i', 'r', 'r', 'o', 'h', 'o', 's', 't', '.', 'c', 'o', 'm', '\0', @@ -3070,6 +3056,7 @@ static const char kSTSHostTable[] = { /* "cloudcaprice.net", true */ 'c', 'l', 'o', 'u', 'd', 'c', 'a', 'p', 'r', 'i', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "cloudflareonazure.com", true */ 'c', 'l', 'o', 'u', 'd', 'f', 'l', 'a', 'r', 'e', 'o', 'n', 'a', 'z', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "cloudia.org", true */ 'c', 'l', 'o', 'u', 'd', 'i', 'a', '.', 'o', 'r', 'g', '\0', + /* "cloudily.com", true */ 'c', 'l', 'o', 'u', 'd', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "cloudmigrator365.com", true */ 'c', 'l', 'o', 'u', 'd', 'm', 'i', 'g', 'r', 'a', 't', 'o', 'r', '3', '6', '5', '.', 'c', 'o', 'm', '\0', /* "cloudoptimizedsmb.com", true */ 'c', 'l', 'o', 'u', 'd', 'o', 'p', 't', 'i', 'm', 'i', 'z', 'e', 'd', 's', 'm', 'b', '.', 'c', 'o', 'm', '\0', /* "cloudoptimus.com", true */ 'c', 'l', 'o', 'u', 'd', 'o', 'p', 't', 'i', 'm', 'u', 's', '.', 'c', 'o', 'm', '\0', @@ -3088,6 +3075,7 @@ static const char kSTSHostTable[] = { /* "clownish.co.il", true */ 'c', 'l', 'o', 'w', 'n', 'i', 's', 'h', '.', 'c', 'o', '.', 'i', 'l', '\0', /* "cloxy.com", true */ 'c', 'l', 'o', 'x', 'y', '.', 'c', 'o', 'm', '\0', /* "clr3.com", true */ 'c', 'l', 'r', '3', '.', 'c', 'o', 'm', '\0', + /* "clsimplex.com", true */ 'c', 'l', 's', 'i', 'm', 'p', 'l', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "clu-in.org", true */ 'c', 'l', 'u', '-', 'i', 'n', '.', 'o', 'r', 'g', '\0', /* "club-is.ru", true */ 'c', 'l', 'u', 'b', '-', 'i', 's', '.', 'r', 'u', '\0', /* "clubempleos.com", true */ 'c', 'l', 'u', 'b', 'e', 'm', 'p', 'l', 'e', 'o', 's', '.', 'c', 'o', 'm', '\0', @@ -3119,7 +3107,6 @@ static const char kSTSHostTable[] = { /* "cocaine.ninja", true */ 'c', 'o', 'c', 'a', 'i', 'n', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "coccolebenessere.it", true */ 'c', 'o', 'c', 'c', 'o', 'l', 'e', 'b', 'e', 'n', 'e', 's', 's', 'e', 'r', 'e', '.', 'i', 't', '\0', /* "cocinoyo.com", true */ 'c', 'o', 'c', 'i', 'n', 'o', 'y', 'o', '.', 'c', 'o', 'm', '\0', - /* "cockedey.in", true */ 'c', 'o', 'c', 'k', 'e', 'd', 'e', 'y', '.', 'i', 'n', '\0', /* "cocker.cc", false */ 'c', 'o', 'c', 'k', 'e', 'r', '.', 'c', 'c', '\0', /* "cockerspanielamericano.com.br", true */ 'c', 'o', 'c', 'k', 'e', 'r', 's', 'p', 'a', 'n', 'i', 'e', 'l', 'a', 'm', 'e', 'r', 'i', 'c', 'a', 'n', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "cockerspanielingles.com.br", true */ 'c', 'o', 'c', 'k', 'e', 'r', 's', 'p', 'a', 'n', 'i', 'e', 'l', 'i', 'n', 'g', 'l', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -3146,6 +3133,7 @@ static const char kSTSHostTable[] = { /* "codeplay.org", true */ 'c', 'o', 'd', 'e', 'p', 'l', 'a', 'y', '.', 'o', 'r', 'g', '\0', /* "codepoints.net", true */ 'c', 'o', 'd', 'e', 'p', 'o', 'i', 'n', 't', 's', '.', 'n', 'e', 't', '\0', /* "codepref.com", true */ 'c', 'o', 'd', 'e', 'p', 'r', 'e', 'f', '.', 'c', 'o', 'm', '\0', + /* "codepult.com", true */ 'c', 'o', 'd', 'e', 'p', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', /* "codera.co.uk", true */ 'c', 'o', 'd', 'e', 'r', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "codercross.com", true */ 'c', 'o', 'd', 'e', 'r', 'c', 'r', 'o', 's', 's', '.', 'c', 'o', 'm', '\0', /* "codereview.appspot.com", false */ 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', @@ -3184,7 +3172,6 @@ static const char kSTSHostTable[] = { /* "coldfff.com", false */ 'c', 'o', 'l', 'd', 'f', 'f', 'f', '.', 'c', 'o', 'm', '\0', /* "coldhak.ca", true */ 'c', 'o', 'l', 'd', 'h', 'a', 'k', '.', 'c', 'a', '\0', /* "coldwatericecream.com", true */ 'c', 'o', 'l', 'd', 'w', 'a', 't', 'e', 'r', 'i', 'c', 'e', 'c', 'r', 'e', 'a', 'm', '.', 'c', 'o', 'm', '\0', - /* "colearnr.com", true */ 'c', 'o', 'l', 'e', 'a', 'r', 'n', 'r', '.', 'c', 'o', 'm', '\0', /* "colegiocierp.com.br", true */ 'c', 'o', 'l', 'e', 'g', 'i', 'o', 'c', 'i', 'e', 'r', 'p', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "colemak.com", true */ 'c', 'o', 'l', 'e', 'm', 'a', 'k', '.', 'c', 'o', 'm', '\0', /* "colengo.com", true */ 'c', 'o', 'l', 'e', 'n', 'g', 'o', '.', 'c', 'o', 'm', '\0', @@ -3290,7 +3277,6 @@ static const char kSTSHostTable[] = { /* "connext.de", true */ 'c', 'o', 'n', 'n', 'e', 'x', 't', '.', 'd', 'e', '\0', /* "connyduck.at", true */ 'c', 'o', 'n', 'n', 'y', 'd', 'u', 'c', 'k', '.', 'a', 't', '\0', /* "conpins.nl", true */ 'c', 'o', 'n', 'p', 'i', 'n', 's', '.', 'n', 'l', '\0', - /* "conrad-kostecki.de", true */ 'c', 'o', 'n', 'r', 'a', 'd', '-', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "consciousbrand.co", true */ 'c', 'o', 'n', 's', 'c', 'i', 'o', 'u', 's', 'b', 'r', 'a', 'n', 'd', '.', 'c', 'o', '\0', /* "consciousbrand.org.au", true */ 'c', 'o', 'n', 's', 'c', 'i', 'o', 'u', 's', 'b', 'r', 'a', 'n', 'd', '.', 'o', 'r', 'g', '.', 'a', 'u', '\0', /* "consciousbranding.org.au", true */ 'c', 'o', 'n', 's', 'c', 'i', 'o', 'u', 's', 'b', 'r', 'a', 'n', 'd', 'i', 'n', 'g', '.', 'o', 'r', 'g', '.', 'a', 'u', '\0', @@ -3442,6 +3428,7 @@ static const char kSTSHostTable[] = { /* "creative-wave.fr", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '-', 'w', 'a', 'v', 'e', '.', 'f', 'r', '\0', /* "creativeartifice.com", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'a', 'r', 't', 'i', 'f', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "creativecaptiv.es", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'c', 'a', 'p', 't', 'i', 'v', '.', 'e', 's', '\0', + /* "creativecommonscatpictures.com", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'c', 'o', 'm', 'm', 'o', 'n', 's', 'c', 'a', 't', 'p', 'i', 'c', 't', 'u', 'r', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "creativeliquid.com", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'l', 'i', 'q', 'u', 'i', 'd', '.', 'c', 'o', 'm', '\0', /* "creativeweb.biz", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'w', 'e', 'b', '.', 'b', 'i', 'z', '\0', /* "crecket.me", true */ 'c', 'r', 'e', 'c', 'k', 'e', 't', '.', 'm', 'e', '\0', @@ -3458,6 +3445,7 @@ static const char kSTSHostTable[] = { /* "crena.ch", true */ 'c', 'r', 'e', 'n', 'a', '.', 'c', 'h', '\0', /* "crepererum.net", true */ 'c', 'r', 'e', 'p', 'e', 'r', 'e', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0', /* "crescent.gr.jp", true */ 'c', 'r', 'e', 's', 'c', 'e', 'n', 't', '.', 'g', 'r', '.', 'j', 'p', '\0', + /* "crestasantos.com", true */ 'c', 'r', 'e', 's', 't', 'a', 's', 'a', 'n', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "crge.eu", true */ 'c', 'r', 'g', 'e', '.', 'e', 'u', '\0', /* "criena.net", true */ 'c', 'r', 'i', 'e', 'n', 'a', '.', 'n', 'e', 't', '\0', /* "crimewatch.net.za", true */ 'c', 'r', 'i', 'm', 'e', 'w', 'a', 't', 'c', 'h', '.', 'n', 'e', 't', '.', 'z', 'a', '\0', @@ -3745,6 +3733,7 @@ static const char kSTSHostTable[] = { /* "danmaby.com", true */ 'd', 'a', 'n', 'm', 'a', 'b', 'y', '.', 'c', 'o', 'm', '\0', /* "danny.fm", true */ 'd', 'a', 'n', 'n', 'y', '.', 'f', 'm', '\0', /* "dannycrichton.com", true */ 'd', 'a', 'n', 'n', 'y', 'c', 'r', 'i', 'c', 'h', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', + /* "dannyrohde.de", true */ 'd', 'a', 'n', 'n', 'y', 'r', 'o', 'h', 'd', 'e', '.', 'd', 'e', '\0', /* "danonsecurity.com", true */ 'd', 'a', 'n', 'o', 'n', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "danpiel.net", false */ 'd', 'a', 'n', 'p', 'i', 'e', 'l', '.', 'n', 'e', 't', '\0', /* "danscomp.com", true */ 'd', 'a', 'n', 's', 'c', 'o', 'm', 'p', '.', 'c', 'o', 'm', '\0', @@ -4045,7 +4034,6 @@ static const char kSTSHostTable[] = { /* "desmaakvanplanten.be", true */ 'd', 'e', 's', 'm', 'a', 'a', 'k', 'v', 'a', 'n', 'p', 'l', 'a', 'n', 't', 'e', 'n', '.', 'b', 'e', '\0', /* "despertadoronline.com.es", true */ 'd', 'e', 's', 'p', 'e', 'r', 't', 'a', 'd', 'o', 'r', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '.', 'e', 's', '\0', /* "desplats.com.ar", true */ 'd', 'e', 's', 'p', 'l', 'a', 't', 's', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', - /* "desserteagleselvenar.tk", true */ 'd', 'e', 's', 's', 'e', 'r', 't', 'e', 'a', 'g', 'l', 'e', 's', 'e', 'l', 'v', 'e', 'n', 'a', 'r', '.', 't', 'k', '\0', /* "desterman.ru", true */ 'd', 'e', 's', 't', 'e', 'r', 'm', 'a', 'n', '.', 'r', 'u', '\0', /* "destinattorneyjohngreene.com", true */ 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 't', 'o', 'r', 'n', 'e', 'y', 'j', 'o', 'h', 'n', 'g', 'r', 'e', 'e', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "destom.be", true */ 'd', 'e', 's', 't', 'o', 'm', '.', 'b', 'e', '\0', @@ -4054,6 +4042,7 @@ static const char kSTSHostTable[] = { /* "dethemium.com", true */ 'd', 'e', 't', 'h', 'e', 'm', 'i', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "detoxsinutritie.ro", true */ 'd', 'e', 't', 'o', 'x', 's', 'i', 'n', 'u', 't', 'r', 'i', 't', 'i', 'e', '.', 'r', 'o', '\0', /* "detskysad.com", true */ 'd', 'e', 't', 's', 'k', 'y', 's', 'a', 'd', '.', 'c', 'o', 'm', '\0', + /* "detteflies.com", true */ 'd', 'e', 't', 't', 'e', 'f', 'l', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "detutorial.com", false */ 'd', 'e', 't', 'u', 't', 'o', 'r', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "deurenfabriek.nl", true */ 'd', 'e', 'u', 'r', 'e', 'n', 'f', 'a', 'b', 'r', 'i', 'e', 'k', '.', 'n', 'l', '\0', /* "deusu.de", true */ 'd', 'e', 'u', 's', 'u', '.', 'd', 'e', '\0', @@ -4320,6 +4309,7 @@ static const char kSTSHostTable[] = { /* "do67.de", true */ 'd', 'o', '6', '7', '.', 'd', 'e', '\0', /* "do67.net", true */ 'd', 'o', '6', '7', '.', 'n', 'e', 't', '\0', /* "doak.io", true */ 'd', 'o', 'a', 'k', '.', 'i', 'o', '\0', + /* "dobrev.family", true */ 'd', 'o', 'b', 'r', 'e', 'v', '.', 'f', 'a', 'm', 'i', 'l', 'y', '\0', /* "dobrisan.ro", true */ 'd', 'o', 'b', 'r', 'i', 's', 'a', 'n', '.', 'r', 'o', '\0', /* "doc.python.org", true */ 'd', 'o', 'c', '.', 'p', 'y', 't', 'h', 'o', 'n', '.', 'o', 'r', 'g', '\0', /* "doc.to", true */ 'd', 'o', 'c', '.', 't', 'o', '\0', @@ -4452,6 +4442,7 @@ static const char kSTSHostTable[] = { /* "dragon-chem.eu", true */ 'd', 'r', 'a', 'g', 'o', 'n', '-', 'c', 'h', 'e', 'm', '.', 'e', 'u', '\0', /* "dragonfly.co.uk", true */ 'd', 'r', 'a', 'g', 'o', 'n', 'f', 'l', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "dragons.moe", false */ 'd', 'r', 'a', 'g', 'o', 'n', 's', '.', 'm', 'o', 'e', '\0', + /* "dragonschool.org", true */ 'd', 'r', 'a', 'g', 'o', 'n', 's', 'c', 'h', 'o', 'o', 'l', '.', 'o', 'r', 'g', '\0', /* "dragonstower.net", true */ 'd', 'r', 'a', 'g', 'o', 'n', 's', 't', 'o', 'w', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "dragonteam.ninja", true */ 'd', 'r', 'a', 'g', 'o', 'n', 't', 'e', 'a', 'm', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "drahcro.uk", true */ 'd', 'r', 'a', 'h', 'c', 'r', 'o', '.', 'u', 'k', '\0', @@ -4482,7 +4473,6 @@ static const char kSTSHostTable[] = { /* "drevo-door.cz", true */ 'd', 'r', 'e', 'v', 'o', '-', 'd', 'o', 'o', 'r', '.', 'c', 'z', '\0', /* "drew.red", true */ 'd', 'r', 'e', 'w', '.', 'r', 'e', 'd', '\0', /* "dreweryinc.com", true */ 'd', 'r', 'e', 'w', 'e', 'r', 'y', 'i', 'n', 'c', '.', 'c', 'o', 'm', '\0', - /* "drewgle.net", true */ 'd', 'r', 'e', 'w', 'g', 'l', 'e', '.', 'n', 'e', 't', '\0', /* "drewsilcock.co.uk", true */ 'd', 'r', 'e', 'w', 's', 'i', 'l', 'c', 'o', 'c', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "drgn.no", true */ 'd', 'r', 'g', 'n', '.', 'n', 'o', '\0', /* "driesjtuver.nl", true */ 'd', 'r', 'i', 'e', 's', 'j', 't', 'u', 'v', 'e', 'r', '.', 'n', 'l', '\0', @@ -4564,7 +4554,6 @@ static const char kSTSHostTable[] = { /* "dulei.si", true */ 'd', 'u', 'l', 'e', 'i', '.', 's', 'i', '\0', /* "dumbeartech.com", true */ 'd', 'u', 'm', 'b', 'e', 'a', 'r', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "dumino.bg", true */ 'd', 'u', 'm', 'i', 'n', 'o', '.', 'b', 'g', '\0', - /* "dunableguitars.com", false */ 'd', 'u', 'n', 'a', 'b', 'l', 'e', 'g', 'u', 'i', 't', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "duncancmt.com", true */ 'd', 'u', 'n', 'c', 'a', 'n', 'c', 'm', 't', '.', 'c', 'o', 'm', '\0', /* "duncanwinfrey.com", true */ 'd', 'u', 'n', 'c', 'a', 'n', 'w', 'i', 'n', 'f', 'r', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "dune.io", true */ 'd', 'u', 'n', 'e', '.', 'i', 'o', '\0', @@ -4580,7 +4569,6 @@ static const char kSTSHostTable[] = { /* "dustri.org", true */ 'd', 'u', 's', 't', 'r', 'i', '.', 'o', 'r', 'g', '\0', /* "dustygroove.com", true */ 'd', 'u', 's', 't', 'y', 'g', 'r', 'o', 'o', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "dutch1.nl", true */ 'd', 'u', 't', 'c', 'h', '1', '.', 'n', 'l', '\0', - /* "dutchessuganda.com", true */ 'd', 'u', 't', 'c', 'h', 'e', 's', 's', 'u', 'g', 'a', 'n', 'd', 'a', '.', 'c', 'o', 'm', '\0', /* "dutchrank.nl", true */ 'd', 'u', 't', 'c', 'h', 'r', 'a', 'n', 'k', '.', 'n', 'l', '\0', /* "dutchwanderers.nl", true */ 'd', 'u', 't', 'c', 'h', 'w', 'a', 'n', 'd', 'e', 'r', 'e', 'r', 's', '.', 'n', 'l', '\0', /* "dutchweballiance.nl", true */ 'd', 'u', 't', 'c', 'h', 'w', 'e', 'b', 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'n', 'l', '\0', @@ -4611,7 +4599,6 @@ static const char kSTSHostTable[] = { /* "dzndk.com", true */ 'd', 'z', 'n', 'd', 'k', '.', 'c', 'o', 'm', '\0', /* "dzndk.net", true */ 'd', 'z', 'n', 'd', 'k', '.', 'n', 'e', 't', '\0', /* "dzyabchenko.com", true */ 'd', 'z', 'y', 'a', 'b', 'c', 'h', 'e', 'n', 'k', 'o', '.', 'c', 'o', 'm', '\0', - /* "e-biografias.net", true */ 'e', '-', 'b', 'i', 'o', 'g', 'r', 'a', 'f', 'i', 'a', 's', '.', 'n', 'e', 't', '\0', /* "e-isfa.eu", true */ 'e', '-', 'i', 's', 'f', 'a', '.', 'e', 'u', '\0', /* "e-kontakti.fi", true */ 'e', '-', 'k', 'o', 'n', 't', 'a', 'k', 't', 'i', '.', 'f', 'i', '\0', /* "e-learningbs.com", true */ 'e', '-', 'l', 'e', 'a', 'r', 'n', 'i', 'n', 'g', 'b', 's', '.', 'c', 'o', 'm', '\0', @@ -4670,8 +4657,6 @@ static const char kSTSHostTable[] = { /* "ebataw.com", true */ 'e', 'b', 'a', 't', 'a', 'w', '.', 'c', 'o', 'm', '\0', /* "ebaymotorssucks.com", true */ 'e', 'b', 'a', 'y', 'm', 'o', 't', 'o', 'r', 's', 's', 'u', 'c', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "ebcs-solutions.com", true */ 'e', 'b', 'c', 's', '-', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', - /* "ebiografia.com", true */ 'e', 'b', 'i', 'o', 'g', 'r', 'a', 'f', 'i', 'a', '.', 'c', 'o', 'm', '\0', - /* "ebiografias.com.br", true */ 'e', 'b', 'i', 'o', 'g', 'r', 'a', 'f', 'i', 'a', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "ebonyriddle.com", true */ 'e', 'b', 'o', 'n', 'y', 'r', 'i', 'd', 'd', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "ebooki.eu.org", true */ 'e', 'b', 'o', 'o', 'k', 'i', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0', /* "eboyer.com", true */ 'e', 'b', 'o', 'y', 'e', 'r', '.', 'c', 'o', 'm', '\0', @@ -4822,7 +4807,6 @@ static const char kSTSHostTable[] = { /* "ekedc.com", true */ 'e', 'k', 'e', 'd', 'c', '.', 'c', 'o', 'm', '\0', /* "ekodevices.com", true */ 'e', 'k', 'o', 'd', 'e', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "ekokontakt.cz", true */ 'e', 'k', 'o', 'k', 'o', 'n', 't', 'a', 'k', 't', '.', 'c', 'z', '\0', - /* "ekostecki.de", true */ 'e', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "eksik.com", true */ 'e', 'k', 's', 'i', 'k', '.', 'c', 'o', 'm', '\0', /* "eksisozluk.com", true */ 'e', 'k', 's', 'i', 's', 'o', 'z', 'l', 'u', 'k', '.', 'c', 'o', 'm', '\0', /* "ekuatorial.com", true */ 'e', 'k', 'u', 'a', 't', 'o', 'r', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0', @@ -4880,9 +4864,7 @@ static const char kSTSHostTable[] = { /* "eliolita.com", true */ 'e', 'l', 'i', 'o', 'l', 'i', 't', 'a', '.', 'c', 'o', 'm', '\0', /* "eliott.be", false */ 'e', 'l', 'i', 'o', 't', 't', '.', 'b', 'e', '\0', /* "elisa.ee", false */ 'e', 'l', 'i', 's', 'a', '.', 'e', 'e', '\0', - /* "elisabeth-kostecki.de", true */ 'e', 'l', 'i', 's', 'a', 'b', 'e', 't', 'h', '-', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "elisabeth-strunz.de", true */ 'e', 'l', 'i', 's', 'a', 'b', 'e', 't', 'h', '-', 's', 't', 'r', 'u', 'n', 'z', '.', 'd', 'e', '\0', - /* "elisabethkostecki.de", true */ 'e', 'l', 'i', 's', 'a', 'b', 'e', 't', 'h', 'k', 'o', 's', 't', 'e', 'c', 'k', 'i', '.', 'd', 'e', '\0', /* "elite-porno.ru", true */ 'e', 'l', 'i', 't', 'e', '-', 'p', 'o', 'r', 'n', 'o', '.', 'r', 'u', '\0', /* "elite12.de", true */ 'e', 'l', 'i', 't', 'e', '1', '2', '.', 'd', 'e', '\0', /* "elitegameservers.net", true */ 'e', 'l', 'i', 't', 'e', 'g', 'a', 'm', 'e', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'n', 'e', 't', '\0', @@ -5131,7 +5113,6 @@ static const char kSTSHostTable[] = { /* "esono.de", true */ 'e', 's', 'o', 'n', 'o', '.', 'd', 'e', '\0', /* "esoterik.link", true */ 'e', 's', 'o', 't', 'e', 'r', 'i', 'k', '.', 'l', 'i', 'n', 'k', '\0', /* "esp8285.store", true */ 'e', 's', 'p', '8', '2', '8', '5', '.', 's', 't', 'o', 'r', 'e', '\0', - /* "espacemontmorency.com", true */ 'e', 's', 'p', 'a', 'c', 'e', 'm', 'o', 'n', 't', 'm', 'o', 'r', 'e', 'n', 'c', 'y', '.', 'c', 'o', 'm', '\0', /* "espacetheosophie.fr", true */ 'e', 's', 'p', 'a', 'c', 'e', 't', 'h', 'e', 'o', 's', 'o', 'p', 'h', 'i', 'e', '.', 'f', 'r', '\0', /* "espanol.search.yahoo.com", false */ 'e', 's', 'p', 'a', 'n', 'o', 'l', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "espanova.com", true */ 'e', 's', 'p', 'a', 'n', 'o', 'v', 'a', '.', 'c', 'o', 'm', '\0', @@ -5196,7 +5177,6 @@ static const char kSTSHostTable[] = { /* "eugenekay.com", true */ 'e', 'u', 'g', 'e', 'n', 'e', 'k', 'a', 'y', '.', 'c', 'o', 'm', '\0', /* "eulenleben.de", true */ 'e', 'u', 'l', 'e', 'n', 'l', 'e', 'b', 'e', 'n', '.', 'd', 'e', '\0', /* "eupay.de", true */ 'e', 'u', 'p', 'a', 'y', '.', 'd', 'e', '\0', - /* "euph.eu", true */ 'e', 'u', 'p', 'h', '.', 'e', 'u', '\0', /* "eureka.archi", true */ 'e', 'u', 'r', 'e', 'k', 'a', '.', 'a', 'r', 'c', 'h', 'i', '\0', /* "eurekaarchi.com", true */ 'e', 'u', 'r', 'e', 'k', 'a', 'a', 'r', 'c', 'h', 'i', '.', 'c', 'o', 'm', '\0', /* "eurekaarchitecture.com", true */ 'e', 'u', 'r', 'e', 'k', 'a', 'a', 'r', 'c', 'h', 'i', 't', 'e', 'c', 't', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -5234,6 +5214,7 @@ static const char kSTSHostTable[] = { /* "evangelosm.com", true */ 'e', 'v', 'a', 'n', 'g', 'e', 'l', 'o', 's', 'm', '.', 'c', 'o', 'm', '\0', /* "evanhandgraaf.nl", true */ 'e', 'v', 'a', 'n', 'h', 'a', 'n', 'd', 'g', 'r', 'a', 'a', 'f', '.', 'n', 'l', '\0', /* "evankurniawan.com", true */ 'e', 'v', 'a', 'n', 'k', 'u', 'r', 'n', 'i', 'a', 'w', 'a', 'n', '.', 'c', 'o', 'm', '\0', + /* "evantage.org", true */ 'e', 'v', 'a', 'n', 't', 'a', 'g', 'e', '.', 'o', 'r', 'g', '\0', /* "evantageglobal.com", true */ 'e', 'v', 'a', 'n', 't', 'a', 'g', 'e', 'g', 'l', 'o', 'b', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "evapp.org", true */ 'e', 'v', 'a', 'p', 'p', '.', 'o', 'r', 'g', '\0', /* "evasion-energie.com", true */ 'e', 'v', 'a', 's', 'i', 'o', 'n', '-', 'e', 'n', 'e', 'r', 'g', 'i', 'e', '.', 'c', 'o', 'm', '\0', @@ -5456,8 +5437,6 @@ static const char kSTSHostTable[] = { /* "faspirits.com", true */ 'f', 'a', 's', 'p', 'i', 'r', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', /* "fassadenverkleidung24.de", true */ 'f', 'a', 's', 's', 'a', 'd', 'e', 'n', 'v', 'e', 'r', 'k', 'l', 'e', 'i', 'd', 'u', 'n', 'g', '2', '4', '.', 'd', 'e', '\0', /* "fastaim.de", true */ 'f', 'a', 's', 't', 'a', 'i', 'm', '.', 'd', 'e', '\0', - /* "fastcomcorp.com", true */ 'f', 'a', 's', 't', 'c', 'o', 'm', 'c', 'o', 'r', 'p', '.', 'c', 'o', 'm', '\0', - /* "fastcomcorp.net", true */ 'f', 'a', 's', 't', 'c', 'o', 'm', 'c', 'o', 'r', 'p', '.', 'n', 'e', 't', '\0', /* "fastconfirm.com", true */ 'f', 'a', 's', 't', 'c', 'o', 'n', 'f', 'i', 'r', 'm', '.', 'c', 'o', 'm', '\0', /* "fastdigitizing.com", true */ 'f', 'a', 's', 't', 'd', 'i', 'g', 'i', 't', 'i', 'z', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "fastforwardthemes.com", true */ 'f', 'a', 's', 't', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 't', 'h', 'e', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', @@ -5495,6 +5474,7 @@ static const char kSTSHostTable[] = { /* "fedoramagazine.org", true */ 'f', 'e', 'd', 'o', 'r', 'a', 'm', 'a', 'g', 'a', 'z', 'i', 'n', 'e', '.', 'o', 'r', 'g', '\0', /* "fedorapeople.org", true */ 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'e', 'o', 'p', 'l', 'e', '.', 'o', 'r', 'g', '\0', /* "fedramp.gov", false */ 'f', 'e', 'd', 'r', 'a', 'm', 'p', '.', 'g', 'o', 'v', '\0', + /* "fedrtc.org", true */ 'f', 'e', 'd', 'r', 't', 'c', '.', 'o', 'r', 'g', '\0', /* "feedbin.com", false */ 'f', 'e', 'e', 'd', 'b', 'i', 'n', '.', 'c', 'o', 'm', '\0', /* "feedhq.org", true */ 'f', 'e', 'e', 'd', 'h', 'q', '.', 'o', 'r', 'g', '\0', /* "feedkovacs.hu", true */ 'f', 'e', 'e', 'd', 'k', 'o', 'v', 'a', 'c', 's', '.', 'h', 'u', '\0', @@ -5566,9 +5546,7 @@ static const char kSTSHostTable[] = { /* "fiendishmasterplan.com", true */ 'f', 'i', 'e', 'n', 'd', 'i', 's', 'h', 'm', 'a', 's', 't', 'e', 'r', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "fierlafijn.net", true */ 'f', 'i', 'e', 'r', 'l', 'a', 'f', 'i', 'j', 'n', '.', 'n', 'e', 't', '\0', /* "fierman.eu", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'e', 'u', '\0', - /* "fierman.net", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'n', 'e', 't', '\0', /* "fierman.us", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'u', 's', '\0', - /* "fifieldtech.com", true */ 'f', 'i', 'f', 'i', 'e', 'l', 'd', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "fight215.com", true */ 'f', 'i', 'g', 'h', 't', '2', '1', '5', '.', 'c', 'o', 'm', '\0', /* "fight215.org", true */ 'f', 'i', 'g', 'h', 't', '2', '1', '5', '.', 'o', 'r', 'g', '\0', /* "figurasdelinguagem.com.br", true */ 'f', 'i', 'g', 'u', 'r', 'a', 's', 'd', 'e', 'l', 'i', 'n', 'g', 'u', 'a', 'g', 'e', 'm', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -5580,7 +5558,6 @@ static const char kSTSHostTable[] = { /* "file-pdf.it", true */ 'f', 'i', 'l', 'e', '-', 'p', 'd', 'f', '.', 'i', 't', '\0', /* "filebox.moe", true */ 'f', 'i', 'l', 'e', 'b', 'o', 'x', '.', 'm', 'o', 'e', '\0', /* "filedir.com", false */ 'f', 'i', 'l', 'e', 'd', 'i', 'r', '.', 'c', 'o', 'm', '\0', - /* "filemeal.com", true */ 'f', 'i', 'l', 'e', 'm', 'e', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "filesense.com", true */ 'f', 'i', 'l', 'e', 's', 'e', 'n', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "filestar.io", true */ 'f', 'i', 'l', 'e', 's', 't', 'a', 'r', '.', 'i', 'o', '\0', /* "filey.co.uk", true */ 'f', 'i', 'l', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -5740,6 +5717,7 @@ static const char kSTSHostTable[] = { /* "flymns.fr", true */ 'f', 'l', 'y', 'm', 'n', 's', '.', 'f', 'r', '\0', /* "flynn.io", true */ 'f', 'l', 'y', 'n', 'n', '.', 'i', 'o', '\0', /* "flyserver.co.il", true */ 'f', 'l', 'y', 's', 'e', 'r', 'v', 'e', 'r', '.', 'c', 'o', '.', 'i', 'l', '\0', + /* "flyss.net", true */ 'f', 'l', 'y', 's', 's', '.', 'n', 'e', 't', '\0', /* "fm.ie", true */ 'f', 'm', '.', 'i', 'e', '\0', /* "fmarchal.fr", true */ 'f', 'm', 'a', 'r', 'c', 'h', 'a', 'l', '.', 'f', 'r', '\0', /* "fmi.gov", true */ 'f', 'm', 'i', '.', 'g', 'o', 'v', '\0', @@ -5859,6 +5837,7 @@ static const char kSTSHostTable[] = { /* "frankhaala.com", true */ 'f', 'r', 'a', 'n', 'k', 'h', 'a', 'a', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "frankierprofi.de", true */ 'f', 'r', 'a', 'n', 'k', 'i', 'e', 'r', 'p', 'r', 'o', 'f', 'i', '.', 'd', 'e', '\0', /* "frankl.in", true */ 'f', 'r', 'a', 'n', 'k', 'l', '.', 'i', 'n', '\0', + /* "fransallen.com", true */ 'f', 'r', 'a', 'n', 's', 'a', 'l', 'l', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "frantic1048.com", true */ 'f', 'r', 'a', 'n', 't', 'i', 'c', '1', '0', '4', '8', '.', 'c', 'o', 'm', '\0', /* "franzt.ovh", true */ 'f', 'r', 'a', 'n', 'z', 't', '.', 'o', 'v', 'h', '\0', /* "frappant.cc", true */ 'f', 'r', 'a', 'p', 'p', 'a', 'n', 't', '.', 'c', 'c', '\0', @@ -5886,6 +5865,7 @@ static const char kSTSHostTable[] = { /* "freedom.press", true */ 'f', 'r', 'e', 'e', 'd', 'o', 'm', '.', 'p', 'r', 'e', 's', 's', '\0', /* "freedomrealtyoftexas.com", true */ 'f', 'r', 'e', 'e', 'd', 'o', 'm', 'r', 'e', 'a', 'l', 't', 'y', 'o', 'f', 't', 'e', 'x', 'a', 's', '.', 'c', 'o', 'm', '\0', /* "freedomvote.nl", true */ 'f', 'r', 'e', 'e', 'd', 'o', 'm', 'v', 'o', 't', 'e', '.', 'n', 'l', '\0', + /* "freeform4u.de", true */ 'f', 'r', 'e', 'e', 'f', 'o', 'r', 'm', '4', 'u', '.', 'd', 'e', '\0', /* "freejasongoudlock.org", true */ 'f', 'r', 'e', 'e', 'j', 'a', 's', 'o', 'n', 'g', 'o', 'u', 'd', 'l', 'o', 'c', 'k', '.', 'o', 'r', 'g', '\0', /* "freekdevries.nl", true */ 'f', 'r', 'e', 'e', 'k', 'd', 'e', 'v', 'r', 'i', 'e', 's', '.', 'n', 'l', '\0', /* "freelance.boutique", true */ 'f', 'r', 'e', 'e', 'l', 'a', 'n', 'c', 'e', '.', 'b', 'o', 'u', 't', 'i', 'q', 'u', 'e', '\0', @@ -5959,6 +5939,7 @@ static const char kSTSHostTable[] = { /* "fruchthof24.de", true */ 'f', 'r', 'u', 'c', 'h', 't', 'h', 'o', 'f', '2', '4', '.', 'd', 'e', '\0', /* "frugro.be", true */ 'f', 'r', 'u', 'g', 'r', 'o', '.', 'b', 'e', '\0', /* "fruition.co.jp", true */ 'f', 'r', 'u', 'i', 't', 'i', 'o', 'n', '.', 'c', 'o', '.', 'j', 'p', '\0', + /* "frusky.de", true */ 'f', 'r', 'u', 's', 'k', 'y', '.', 'd', 'e', '\0', /* "fs-gamenet.de", true */ 'f', 's', '-', 'g', 'a', 'm', 'e', 'n', 'e', 't', '.', 'd', 'e', '\0', /* "fsapubs.gov", true */ 'f', 's', 'a', 'p', 'u', 'b', 's', '.', 'g', 'o', 'v', '\0', /* "fsbpaintrock.com", true */ 'f', 's', 'b', 'p', 'a', 'i', 'n', 't', 'r', 'o', 'c', 'k', '.', 'c', 'o', 'm', '\0', @@ -6067,6 +6048,7 @@ static const char kSTSHostTable[] = { /* "gaichanh.com", true */ 'g', 'a', 'i', 'c', 'h', 'a', 'n', 'h', '.', 'c', 'o', 'm', '\0', /* "gaichon.com", true */ 'g', 'a', 'i', 'c', 'h', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "gaireg.de", true */ 'g', 'a', 'i', 'r', 'e', 'g', '.', 'd', 'e', '\0', + /* "gaiserik.com", true */ 'g', 'a', 'i', 's', 'e', 'r', 'i', 'k', '.', 'c', 'o', 'm', '\0', /* "gaite.me", true */ 'g', 'a', 'i', 't', 'e', '.', 'm', 'e', '\0', /* "gakkainavi-epsilon.jp", true */ 'g', 'a', 'k', 'k', 'a', 'i', 'n', 'a', 'v', 'i', '-', 'e', 'p', 's', 'i', 'l', 'o', 'n', '.', 'j', 'p', '\0', /* "gakkainavi-epsilon.net", true */ 'g', 'a', 'k', 'k', 'a', 'i', 'n', 'a', 'v', 'i', '-', 'e', 'p', 's', 'i', 'l', 'o', 'n', '.', 'n', 'e', 't', '\0', @@ -6332,7 +6314,6 @@ static const char kSTSHostTable[] = { /* "gigacog.com", true */ 'g', 'i', 'g', 'a', 'c', 'o', 'g', '.', 'c', 'o', 'm', '\0', /* "gigawa.lt", true */ 'g', 'i', 'g', 'a', 'w', 'a', '.', 'l', 't', '\0', /* "gijsbertus.com", true */ 'g', 'i', 'j', 's', 'b', 'e', 'r', 't', 'u', 's', '.', 'c', 'o', 'm', '\0', - /* "gilcloud.com", true */ 'g', 'i', 'l', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', /* "gillet-cros.fr", true */ 'g', 'i', 'l', 'l', 'e', 't', '-', 'c', 'r', 'o', 's', '.', 'f', 'r', '\0', /* "gillmanandsoame.co.uk", true */ 'g', 'i', 'l', 'l', 'm', 'a', 'n', 'a', 'n', 'd', 's', 'o', 'a', 'm', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "gilroywestwood.org", true */ 'g', 'i', 'l', 'r', 'o', 'y', 'w', 'e', 's', 't', 'w', 'o', 'o', 'd', '.', 'o', 'r', 'g', '\0', @@ -6690,6 +6671,8 @@ static const char kSTSHostTable[] = { /* "gus.host", true */ 'g', 'u', 's', '.', 'h', 'o', 's', 't', '\0', /* "gus.moe", true */ 'g', 'u', 's', '.', 'm', 'o', 'e', '\0', /* "guscaplan.me", true */ 'g', 'u', 's', 'c', 'a', 'p', 'l', 'a', 'n', '.', 'm', 'e', '\0', + /* "guso.site", true */ 'g', 'u', 's', 'o', '.', 's', 'i', 't', 'e', '\0', + /* "guso.tech", true */ 'g', 'u', 's', 'o', '.', 't', 'e', 'c', 'h', '\0', /* "guthabenkarten-billiger.de", true */ 'g', 'u', 't', 'h', 'a', 'b', 'e', 'n', 'k', 'a', 'r', 't', 'e', 'n', '-', 'b', 'i', 'l', 'l', 'i', 'g', 'e', 'r', '.', 'd', 'e', '\0', /* "guts.me", true */ 'g', 'u', 't', 's', '.', 'm', 'e', '\0', /* "gutscheingeiz.de", true */ 'g', 'u', 't', 's', 'c', 'h', 'e', 'i', 'n', 'g', 'e', 'i', 'z', '.', 'd', 'e', '\0', @@ -6791,7 +6774,6 @@ static const char kSTSHostTable[] = { /* "handysex.live", true */ 'h', 'a', 'n', 'd', 'y', 's', 'e', 'x', '.', 'l', 'i', 'v', 'e', '\0', /* "hangouts.google.com", true */ 'h', 'a', 'n', 'g', 'o', 'u', 't', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "hannah.link", true */ 'h', 'a', 'n', 'n', 'a', 'h', '.', 'l', 'i', 'n', 'k', '\0', - /* "hannover-banditen.de", true */ 'h', 'a', 'n', 'n', 'o', 'v', 'e', 'r', '-', 'b', 'a', 'n', 'd', 'i', 't', 'e', 'n', '.', 'd', 'e', '\0', /* "hans-natur.de", true */ 'h', 'a', 'n', 's', '-', 'n', 'a', 't', 'u', 'r', '.', 'd', 'e', '\0', /* "hansvaneijsden.com", true */ 'h', 'a', 'n', 's', 'v', 'a', 'n', 'e', 'i', 'j', 's', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "hansvaneijsden.nl", true */ 'h', 'a', 'n', 's', 'v', 'a', 'n', 'e', 'i', 'j', 's', 'd', 'e', 'n', '.', 'n', 'l', '\0', @@ -7107,6 +7089,7 @@ static const char kSTSHostTable[] = { /* "hmsseahawk.com", true */ 'h', 'm', 's', 's', 'e', 'a', 'h', 'a', 'w', 'k', '.', 'c', 'o', 'm', '\0', /* "hobbiesandotherstuff.com", true */ 'h', 'o', 'b', 'b', 'i', 'e', 's', 'a', 'n', 'd', 'o', 't', 'h', 'e', 'r', 's', 't', 'u', 'f', 'f', '.', 'c', 'o', 'm', '\0', /* "hobby-gamerz-community.de", true */ 'h', 'o', 'b', 'b', 'y', '-', 'g', 'a', 'm', 'e', 'r', 'z', '-', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', '.', 'd', 'e', '\0', + /* "hobbyspeed.com", true */ 'h', 'o', 'b', 'b', 'y', 's', 'p', 'e', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "hochhaus.us", true */ 'h', 'o', 'c', 'h', 'h', 'a', 'u', 's', '.', 'u', 's', '\0', /* "hochzeit-dana-laurens.de", true */ 'h', 'o', 'c', 'h', 'z', 'e', 'i', 't', '-', 'd', 'a', 'n', 'a', '-', 'l', 'a', 'u', 'r', 'e', 'n', 's', '.', 'd', 'e', '\0', /* "hoe.re", true */ 'h', 'o', 'e', '.', 'r', 'e', '\0', @@ -7233,6 +7216,7 @@ static const char kSTSHostTable[] = { /* "howbigismybuilding.com", true */ 'h', 'o', 'w', 'b', 'i', 'g', 'i', 's', 'm', 'y', 'b', 'u', 'i', 'l', 'd', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "howfargames.com", true */ 'h', 'o', 'w', 'f', 'a', 'r', 'g', 'a', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "howlongtobeatsteam.com", true */ 'h', 'o', 'w', 'l', 'o', 'n', 'g', 't', 'o', 'b', 'e', 'a', 't', 's', 't', 'e', 'a', 'm', '.', 'c', 'o', 'm', '\0', + /* "howsecureismypassword.net", true */ 'h', 'o', 'w', 's', 'e', 'c', 'u', 'r', 'e', 'i', 's', 'm', 'y', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '.', 'n', 'e', 't', '\0', /* "howsmyssl.com", true */ 'h', 'o', 'w', 's', 'm', 'y', 's', 's', 'l', '.', 'c', 'o', 'm', '\0', /* "howsmytls.com", true */ 'h', 'o', 'w', 's', 'm', 'y', 't', 'l', 's', '.', 'c', 'o', 'm', '\0', /* "howsyourhealth.org", true */ 'h', 'o', 'w', 's', 'y', 'o', 'u', 'r', 'h', 'e', 'a', 'l', 't', 'h', '.', 'o', 'r', 'g', '\0', @@ -7313,7 +7297,6 @@ static const char kSTSHostTable[] = { /* "hunger.im", true */ 'h', 'u', 'n', 'g', 'e', 'r', '.', 'i', 'm', '\0', /* "hunter.io", true */ 'h', 'u', 'n', 't', 'e', 'r', '.', 'i', 'o', '\0', /* "huodongweb.com", true */ 'h', 'u', 'o', 'd', 'o', 'n', 'g', 'w', 'e', 'b', '.', 'c', 'o', 'm', '\0', - /* "hupp.se", true */ 'h', 'u', 'p', 'p', '.', 's', 'e', '\0', /* "hurd.is", true */ 'h', 'u', 'r', 'd', '.', 'i', 's', '\0', /* "huren.nl", true */ 'h', 'u', 'r', 'e', 'n', '.', 'n', 'l', '\0', /* "huroji.com", true */ 'h', 'u', 'r', 'o', 'j', 'i', '.', 'c', 'o', 'm', '\0', @@ -7388,7 +7371,6 @@ static const char kSTSHostTable[] = { /* "ic3.gov", true */ 'i', 'c', '3', '.', 'g', 'o', 'v', '\0', /* "icarlos.net", true */ 'i', 'c', 'a', 'r', 'l', 'o', 's', '.', 'n', 'e', 't', '\0', /* "ice.yt", true */ 'i', 'c', 'e', '.', 'y', 't', '\0', - /* "icebat.dyndns.org", true */ 'i', 'c', 'e', 'b', 'a', 't', '.', 'd', 'y', 'n', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0', /* "iceberg.academy", true */ 'i', 'c', 'e', 'b', 'e', 'r', 'g', '.', 'a', 'c', 'a', 'd', 'e', 'm', 'y', '\0', /* "ich-find-den-g.net", true */ 'i', 'c', 'h', '-', 'f', 'i', 'n', 'd', '-', 'd', 'e', 'n', '-', 'g', '.', 'n', 'e', 't', '\0', /* "ich-tanke.de", true */ 'i', 'c', 'h', '-', 't', 'a', 'n', 'k', 'e', '.', 'd', 'e', '\0', @@ -7475,11 +7457,12 @@ static const char kSTSHostTable[] = { /* "ignace72.eu", true */ 'i', 'g', 'n', 'a', 'c', 'e', '7', '2', '.', 'e', 'u', '\0', /* "ignat.by", true */ 'i', 'g', 'n', 'a', 't', '.', 'b', 'y', '\0', /* "ignitedmindz.in", true */ 'i', 'g', 'n', 'i', 't', 'e', 'd', 'm', 'i', 'n', 'd', 'z', '.', 'i', 'n', '\0', - /* "igotoffer.com", true */ 'i', 'g', 'o', 't', 'o', 'f', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0', + /* "igotoffer.com", false */ 'i', 'g', 'o', 't', 'o', 'f', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "igrivi.com", true */ 'i', 'g', 'r', 'i', 'v', 'i', '.', 'c', 'o', 'm', '\0', /* "igsmgmt.com", true */ 'i', 'g', 's', 'm', 'g', 'm', 't', '.', 'c', 'o', 'm', '\0', /* "ih8sn0w.com", true */ 'i', 'h', '8', 's', 'n', '0', 'w', '.', 'c', 'o', 'm', '\0', /* "ihkk.net", true */ 'i', 'h', 'k', 'k', '.', 'n', 'e', 't', '\0', + /* "ihopeit.works", true */ 'i', 'h', 'o', 'p', 'e', 'i', 't', '.', 'w', 'o', 'r', 'k', 's', '\0', /* "ihostup.net", true */ 'i', 'h', 'o', 's', 't', 'u', 'p', '.', 'n', 'e', 't', '\0', /* "ihrhost.com", true */ 'i', 'h', 'r', 'h', 'o', 's', 't', '.', 'c', 'o', 'm', '\0', /* "iiong.com", true */ 'i', 'i', 'o', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -7721,7 +7704,6 @@ static const char kSTSHostTable[] = { /* "intencje.pl", true */ 'i', 'n', 't', 'e', 'n', 'c', 'j', 'e', '.', 'p', 'l', '\0', /* "interaffairs.com", true */ 'i', 'n', 't', 'e', 'r', 'a', 'f', 'f', 'a', 'i', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "interasistmen.se", true */ 'i', 'n', 't', 'e', 'r', 'a', 's', 'i', 's', 't', 'm', 'e', 'n', '.', 's', 'e', '\0', - /* "interchangedesign.com", true */ 'i', 'n', 't', 'e', 'r', 'c', 'h', 'a', 'n', 'g', 'e', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', /* "interchanges.io", true */ 'i', 'n', 't', 'e', 'r', 'c', 'h', 'a', 'n', 'g', 'e', 's', '.', 'i', 'o', '\0', /* "intercom.com", true */ 'i', 'n', 't', 'e', 'r', 'c', 'o', 'm', '.', 'c', 'o', 'm', '\0', /* "intercom.io", true */ 'i', 'n', 't', 'e', 'r', 'c', 'o', 'm', '.', 'i', 'o', '\0', @@ -7825,7 +7807,6 @@ static const char kSTSHostTable[] = { /* "iprice.vn", true */ 'i', 'p', 'r', 'i', 'c', 'e', '.', 'v', 'n', '\0', /* "ipricethailand.com", true */ 'i', 'p', 'r', 'i', 'c', 'e', 't', 'h', 'a', 'i', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "iprim.ru", true */ 'i', 'p', 'r', 'i', 'm', '.', 'r', 'u', '\0', - /* "ipsec.pl", true */ 'i', 'p', 's', 'e', 'c', '.', 'p', 'l', '\0', /* "ipsilon-project.org", true */ 'i', 'p', 's', 'i', 'l', 'o', 'n', '-', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', /* "ipswitch.com.tw", true */ 'i', 'p', 's', 'w', 'i', 't', 'c', 'h', '.', 'c', 'o', 'm', '.', 't', 'w', '\0', /* "ipty.de", true */ 'i', 'p', 't', 'y', '.', 'd', 'e', '\0', @@ -7961,11 +7942,11 @@ static const char kSTSHostTable[] = { /* "its-v.de", true */ 'i', 't', 's', '-', 'v', '.', 'd', 'e', '\0', /* "its4living.com", true */ 'i', 't', 's', '4', 'l', 'i', 'v', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "itsanicedoor.co.uk", true */ 'i', 't', 's', 'a', 'n', 'i', 'c', 'e', 'd', 'o', 'o', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "itsatrap.nl", false */ 'i', 't', 's', 'a', 't', 'r', 'a', 'p', '.', 'n', 'l', '\0', /* "itsecguy.com", true */ 'i', 't', 's', 'e', 'c', 'g', 'u', 'y', '.', 'c', 'o', 'm', '\0', /* "itsgoingdown.org", true */ 'i', 't', 's', 'g', 'o', 'i', 'n', 'g', 'd', 'o', 'w', 'n', '.', 'o', 'r', 'g', '\0', /* "itskayla.com", false */ 'i', 't', 's', 'k', 'a', 'y', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "itsok.de", true */ 'i', 't', 's', 'o', 'k', '.', 'd', 'e', '\0', - /* "itspawned.com", true */ 'i', 't', 's', 'p', 'a', 'w', 'n', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "itspersonaltraining.nl", true */ 'i', 't', 's', 'p', 'e', 'r', 's', 'o', 'n', 'a', 'l', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "itsryan.com", false */ 'i', 't', 's', 'r', 'y', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "itsstefan.eu", true */ 'i', 't', 's', 's', 't', 'e', 'f', 'a', 'n', '.', 'e', 'u', '\0', @@ -7985,7 +7966,6 @@ static const char kSTSHostTable[] = { /* "ivpn.net", true */ 'i', 'v', 'p', 'n', '.', 'n', 'e', 't', '\0', /* "iwader.co.uk", true */ 'i', 'w', 'a', 'd', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "iwalton.com", true */ 'i', 'w', 'a', 'l', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', - /* "iwannarefill.com", true */ 'i', 'w', 'a', 'n', 'n', 'a', 'r', 'e', 'f', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "iwilcox.me.uk", true */ 'i', 'w', 'i', 'l', 'c', 'o', 'x', '.', 'm', 'e', '.', 'u', 'k', '\0', /* "iwizerunek.pl", true */ 'i', 'w', 'i', 'z', 'e', 'r', 'u', 'n', 'e', 'k', '.', 'p', 'l', '\0', /* "iww.me", true */ 'i', 'w', 'w', '.', 'm', 'e', '\0', @@ -8127,7 +8107,6 @@ static const char kSTSHostTable[] = { /* "jazzanet.com", true */ 'j', 'a', 'z', 'z', 'a', 'n', 'e', 't', '.', 'c', 'o', 'm', '\0', /* "jazzy.pro", true */ 'j', 'a', 'z', 'z', 'y', '.', 'p', 'r', 'o', '\0', /* "jazzysumi.com", true */ 'j', 'a', 'z', 'z', 'y', 's', 'u', 'm', 'i', '.', 'c', 'o', 'm', '\0', - /* "jbbd.fr", true */ 'j', 'b', 'b', 'd', '.', 'f', 'r', '\0', /* "jbfp.dk", true */ 'j', 'b', 'f', 'p', '.', 'd', 'k', '\0', /* "jbradaric.me", true */ 'j', 'b', 'r', 'a', 'd', 'a', 'r', 'i', 'c', '.', 'm', 'e', '\0', /* "jcaicedo.com", true */ 'j', 'c', 'a', 'i', 'c', 'e', 'd', 'o', '.', 'c', 'o', 'm', '\0', @@ -8181,7 +8160,6 @@ static const char kSTSHostTable[] = { /* "jeremyness.com", true */ 'j', 'e', 'r', 'e', 'm', 'y', 'n', 'e', 's', 's', '.', 'c', 'o', 'm', '\0', /* "jerodslay.com", false */ 'j', 'e', 'r', 'o', 'd', 's', 'l', 'a', 'y', '.', 'c', 'o', 'm', '\0', /* "jeroendeneef.com", true */ 'j', 'e', 'r', 'o', 'e', 'n', 'd', 'e', 'n', 'e', 'e', 'f', '.', 'c', 'o', 'm', '\0', - /* "jeroenseegers.com", true */ 'j', 'e', 'r', 'o', 'e', 'n', 's', 'e', 'e', 'g', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "jeroenvanderwal.nl", true */ 'j', 'e', 'r', 'o', 'e', 'n', 'v', 'a', 'n', 'd', 'e', 'r', 'w', 'a', 'l', '.', 'n', 'l', '\0', /* "jerryyu.ca", true */ 'j', 'e', 'r', 'r', 'y', 'y', 'u', '.', 'c', 'a', '\0', /* "jesseerbach.com", true */ 'j', 'e', 's', 's', 'e', 'e', 'r', 'b', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0', @@ -8303,7 +8281,6 @@ static const char kSTSHostTable[] = { /* "jondevin.com", true */ 'j', 'o', 'n', 'd', 'e', 'v', 'i', 'n', '.', 'c', 'o', 'm', '\0', /* "jonesborostatebank.com", false */ 'j', 'o', 'n', 'e', 's', 'b', 'o', 'r', 'o', 's', 't', 'a', 't', 'e', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "jonferwerda.net", true */ 'j', 'o', 'n', 'f', 'e', 'r', 'w', 'e', 'r', 'd', 'a', '.', 'n', 'e', 't', '\0', - /* "jonfor.net", true */ 'j', 'o', 'n', 'f', 'o', 'r', '.', 'n', 'e', 't', '\0', /* "jongbloed.nl", true */ 'j', 'o', 'n', 'g', 'b', 'l', 'o', 'e', 'd', '.', 'n', 'l', '\0', /* "jonirrings.com", true */ 'j', 'o', 'n', 'i', 'r', 'r', 'i', 'n', 'g', 's', '.', 'c', 'o', 'm', '\0', /* "jonkermedia.nl", true */ 'j', 'o', 'n', 'k', 'e', 'r', 'm', 'e', 'd', 'i', 'a', '.', 'n', 'l', '\0', @@ -8639,6 +8616,7 @@ static const char kSTSHostTable[] = { /* "kevincox.ca", true */ 'k', 'e', 'v', 'i', 'n', 'c', 'o', 'x', '.', 'c', 'a', '\0', /* "kevindekoninck.com", false */ 'k', 'e', 'v', 'i', 'n', 'd', 'e', 'k', 'o', 'n', 'i', 'n', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "kevinkla.es", true */ 'k', 'e', 'v', 'i', 'n', 'k', 'l', 'a', '.', 'e', 's', '\0', + /* "kevinmeijer.nl", true */ 'k', 'e', 'v', 'i', 'n', 'm', 'e', 'i', 'j', 'e', 'r', '.', 'n', 'l', '\0', /* "kevinratcliff.com", true */ 'k', 'e', 'v', 'i', 'n', 'r', 'a', 't', 'c', 'l', 'i', 'f', 'f', '.', 'c', 'o', 'm', '\0', /* "keybase.io", true */ 'k', 'e', 'y', 'b', 'a', 's', 'e', '.', 'i', 'o', '\0', /* "keybored.me", true */ 'k', 'e', 'y', 'b', 'o', 'r', 'e', 'd', '.', 'm', 'e', '\0', @@ -8701,7 +8679,6 @@ static const char kSTSHostTable[] = { /* "kinderopvangengeltjes.nl", true */ 'k', 'i', 'n', 'd', 'e', 'r', 'o', 'p', 'v', 'a', 'n', 'g', 'e', 'n', 'g', 'e', 'l', 't', 'j', 'e', 's', '.', 'n', 'l', '\0', /* "kindleworth.com", true */ 'k', 'i', 'n', 'd', 'l', 'e', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "kindlyfire.com", true */ 'k', 'i', 'n', 'd', 'l', 'y', 'f', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0', - /* "kindof.ninja", true */ 'k', 'i', 'n', 'd', 'o', 'f', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "kinepolis-studio.ga", true */ 'k', 'i', 'n', 'e', 'p', 'o', 'l', 'i', 's', '-', 's', 't', 'u', 'd', 'i', 'o', '.', 'g', 'a', '\0', /* "kingant.net", true */ 'k', 'i', 'n', 'g', 'a', 'n', 't', '.', 'n', 'e', 't', '\0', /* "kinganywhere.eu", true */ 'k', 'i', 'n', 'g', 'a', 'n', 'y', 'w', 'h', 'e', 'r', 'e', '.', 'e', 'u', '\0', @@ -8709,6 +8686,7 @@ static const char kSTSHostTable[] = { /* "kingpincages.com", true */ 'k', 'i', 'n', 'g', 'p', 'i', 'n', 'c', 'a', 'g', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "kingqueen.org.uk", true */ 'k', 'i', 'n', 'g', 'q', 'u', 'e', 'e', 'n', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', /* "kingtecservices.com", true */ 'k', 'i', 'n', 'g', 't', 'e', 'c', 's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '\0', + /* "kini24.ru", true */ 'k', 'i', 'n', 'i', '2', '4', '.', 'r', 'u', '\0', /* "kinkenonline.com", true */ 'k', 'i', 'n', 'k', 'e', 'n', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "kinmunity.com", true */ 'k', 'i', 'n', 'm', 'u', 'n', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "kinniyaonlus.com", true */ 'k', 'i', 'n', 'n', 'i', 'y', 'a', 'o', 'n', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0', @@ -8761,6 +8739,7 @@ static const char kSTSHostTable[] = { /* "kki.org", true */ 'k', 'k', 'i', '.', 'o', 'r', 'g', '\0', /* "kkovacs.eu", true */ 'k', 'k', 'o', 'v', 'a', 'c', 's', '.', 'e', 'u', '\0', /* "kksg.com", true */ 'k', 'k', 's', 'g', '.', 'c', 'o', 'm', '\0', + /* "kkyy.me", true */ 'k', 'k', 'y', 'y', '.', 'm', 'e', '\0', /* "kkzxak47.com", true */ 'k', 'k', 'z', 'x', 'a', 'k', '4', '7', '.', 'c', 'o', 'm', '\0', /* "klamathrestoration.gov", true */ 'k', 'l', 'a', 'm', 'a', 't', 'h', 'r', 'e', 's', 't', 'o', 'r', 'a', 't', 'i', 'o', 'n', '.', 'g', 'o', 'v', '\0', /* "klangnok.de", true */ 'k', 'l', 'a', 'n', 'g', 'n', 'o', 'k', '.', 'd', 'e', '\0', @@ -8948,7 +8927,6 @@ static const char kSTSHostTable[] = { /* "kriptosec.com", true */ 'k', 'r', 'i', 'p', 't', 'o', 's', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "krislamoureux.com", true */ 'k', 'r', 'i', 's', 'l', 'a', 'm', 'o', 'u', 'r', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0', /* "krisstarkey.co.uk", true */ 'k', 'r', 'i', 's', 's', 't', 'a', 'r', 'k', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "kristikala.nl", true */ 'k', 'r', 'i', 's', 't', 'i', 'k', 'a', 'l', 'a', '.', 'n', 'l', '\0', /* "kristinbailey.com", true */ 'k', 'r', 'i', 's', 't', 'i', 'n', 'b', 'a', 'i', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "kristjanrang.eu", true */ 'k', 'r', 'i', 's', 't', 'j', 'a', 'n', 'r', 'a', 'n', 'g', '.', 'e', 'u', '\0', /* "kristofferkoch.com", true */ 'k', 'r', 'i', 's', 't', 'o', 'f', 'f', 'e', 'r', 'k', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0', @@ -9044,6 +9022,7 @@ static const char kSTSHostTable[] = { /* "kyosaku.org", true */ 'k', 'y', 'o', 's', 'a', 'k', 'u', '.', 'o', 'r', 'g', '\0', /* "kyoto-tomikawa.jp", true */ 'k', 'y', 'o', 't', 'o', '-', 't', 'o', 'm', 'i', 'k', 'a', 'w', 'a', '.', 'j', 'p', '\0', /* "kyujin-office.net", true */ 'k', 'y', 'u', 'j', 'i', 'n', '-', 'o', 'f', 'f', 'i', 'c', 'e', '.', 'n', 'e', 't', '\0', + /* "kyy.me", true */ 'k', 'y', 'y', '.', 'm', 'e', '\0', /* "kzsdabas.hu", true */ 'k', 'z', 's', 'd', 'a', 'b', 'a', 's', '.', 'h', 'u', '\0', /* "l-lab.org", true */ 'l', '-', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0', /* "l-rickroll-i.pw", true */ 'l', '-', 'r', 'i', 'c', 'k', 'r', 'o', 'l', 'l', '-', 'i', '.', 'p', 'w', '\0', @@ -9078,7 +9057,6 @@ static const char kSTSHostTable[] = { /* "lafka.org", true */ 'l', 'a', 'f', 'k', 'a', '.', 'o', 'r', 'g', '\0', /* "lafkor.de", true */ 'l', 'a', 'f', 'k', 'o', 'r', '.', 'd', 'e', '\0', /* "lafosseobservatoire.be", true */ 'l', 'a', 'f', 'o', 's', 's', 'e', 'o', 'b', 's', 'e', 'r', 'v', 'a', 't', 'o', 'i', 'r', 'e', '.', 'b', 'e', '\0', - /* "lafr4nc3.xyz", true */ 'l', 'a', 'f', 'r', '4', 'n', 'c', '3', '.', 'x', 'y', 'z', '\0', /* "lagarderob.ru", false */ 'l', 'a', 'g', 'a', 'r', 'd', 'e', 'r', 'o', 'b', '.', 'r', 'u', '\0', /* "lagerauftrag.info", true */ 'l', 'a', 'g', 'e', 'r', 'a', 'u', 'f', 't', 'r', 'a', 'g', '.', 'i', 'n', 'f', 'o', '\0', /* "lagier.xyz", true */ 'l', 'a', 'g', 'i', 'e', 'r', '.', 'x', 'y', 'z', '\0', @@ -9189,7 +9167,6 @@ static const char kSTSHostTable[] = { /* "laussat.de", true */ 'l', 'a', 'u', 's', 's', 'a', 't', '.', 'd', 'e', '\0', /* "lauzon-hitter.com", true */ 'l', 'a', 'u', 'z', 'o', 'n', '-', 'h', 'i', 't', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "lavabit.no", true */ 'l', 'a', 'v', 'a', 'b', 'i', 't', '.', 'n', 'o', '\0', - /* "lavalite.de", true */ 'l', 'a', 'v', 'a', 'l', 'i', 't', 'e', '.', 'd', 'e', '\0', /* "laventainnhotel-mailing.com", true */ 'l', 'a', 'v', 'e', 'n', 't', 'a', 'i', 'n', 'n', 'h', 'o', 't', 'e', 'l', '-', 'm', 'a', 'i', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "lavita.de", true */ 'l', 'a', 'v', 'i', 't', 'a', '.', 'd', 'e', '\0', /* "lavoieducoeur.be", true */ 'l', 'a', 'v', 'o', 'i', 'e', 'd', 'u', 'c', 'o', 'e', 'u', 'r', '.', 'b', 'e', '\0', @@ -9299,6 +9276,7 @@ static const char kSTSHostTable[] = { /* "leonardcamacho.me", true */ 'l', 'e', 'o', 'n', 'a', 'r', 'd', 'c', 'a', 'm', 'a', 'c', 'h', 'o', '.', 'm', 'e', '\0', /* "leonax.net", true */ 'l', 'e', 'o', 'n', 'a', 'x', '.', 'n', 'e', 't', '\0', /* "leondenard.com", true */ 'l', 'e', 'o', 'n', 'd', 'e', 'n', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', + /* "leonhooijer.nl", true */ 'l', 'e', 'o', 'n', 'h', 'o', 'o', 'i', 'j', 'e', 'r', '.', 'n', 'l', '\0', /* "leonklingele.de", true */ 'l', 'e', 'o', 'n', 'k', 'l', 'i', 'n', 'g', 'e', 'l', 'e', '.', 'd', 'e', '\0', /* "leonmahler.consulting", true */ 'l', 'e', 'o', 'n', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', /* "leopoldina.net", true */ 'l', 'e', 'o', 'p', 'o', 'l', 'd', 'i', 'n', 'a', '.', 'n', 'e', 't', '\0', @@ -9315,6 +9293,7 @@ static const char kSTSHostTable[] = { /* "lerp.me", true */ 'l', 'e', 'r', 'p', '.', 'm', 'e', '\0', /* "lesbiansslaves.com", true */ 'l', 'e', 's', 'b', 'i', 'a', 'n', 's', 's', 'l', 'a', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "lesbofight.com", true */ 'l', 'e', 's', 'b', 'o', 'f', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '\0', + /* "lesdouceursdeliyana.com", true */ 'l', 'e', 's', 'd', 'o', 'u', 'c', 'e', 'u', 'r', 's', 'd', 'e', 'l', 'i', 'y', 'a', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "leseditionsbraquage.com", true */ 'l', 'e', 's', 'e', 'd', 'i', 't', 'i', 'o', 'n', 's', 'b', 'r', 'a', 'q', 'u', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "lesformations.net", true */ 'l', 'e', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 's', '.', 'n', 'e', 't', '\0', /* "lesharris.com", true */ 'l', 'e', 's', 'h', 'a', 'r', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0', @@ -9328,6 +9307,7 @@ static const char kSTSHostTable[] = { /* "let-go.cc", true */ 'l', 'e', 't', '-', 'g', 'o', '.', 'c', 'c', '\0', /* "letemps.ch", true */ 'l', 'e', 't', 'e', 'm', 'p', 's', '.', 'c', 'h', '\0', /* "leticiagomeztagle.com", true */ 'l', 'e', 't', 'i', 'c', 'i', 'a', 'g', 'o', 'm', 'e', 'z', 't', 'a', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', + /* "letitfly.me", true */ 'l', 'e', 't', 'i', 't', 'f', 'l', 'y', '.', 'm', 'e', '\0', /* "lets.ninja", true */ 'l', 'e', 't', 's', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "letsencrypt-for-cpanel.com", true */ 'l', 'e', 't', 's', 'e', 'n', 'c', 'r', 'y', 'p', 't', '-', 'f', 'o', 'r', '-', 'c', 'p', 'a', 'n', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "letsgame.nl", true */ 'l', 'e', 't', 's', 'g', 'a', 'm', 'e', '.', 'n', 'l', '\0', @@ -9367,7 +9347,6 @@ static const char kSTSHostTable[] = { /* "library-quest.com", true */ 'l', 'i', 'b', 'r', 'a', 'r', 'y', '-', 'q', 'u', 'e', 's', 't', '.', 'c', 'o', 'm', '\0', /* "libraryextension.com", true */ 'l', 'i', 'b', 'r', 'a', 'r', 'y', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "libraryfreedomproject.org", false */ 'l', 'i', 'b', 'r', 'a', 'r', 'y', 'f', 'r', 'e', 'e', 'd', 'o', 'm', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', - /* "libreboot.org", true */ 'l', 'i', 'b', 'r', 'e', 'b', 'o', 'o', 't', '.', 'o', 'r', 'g', '\0', /* "librelamp.com", true */ 'l', 'i', 'b', 'r', 'e', 'l', 'a', 'm', 'p', '.', 'c', 'o', 'm', '\0', /* "librends.org", true */ 'l', 'i', 'b', 'r', 'e', 'n', 'd', 's', '.', 'o', 'r', 'g', '\0', /* "librervac.org", true */ 'l', 'i', 'b', 'r', 'e', 'r', 'v', 'a', 'c', '.', 'o', 'r', 'g', '\0', @@ -9696,7 +9675,7 @@ static const char kSTSHostTable[] = { /* "lsc-dillingen.de", true */ 'l', 's', 'c', '-', 'd', 'i', 'l', 'l', 'i', 'n', 'g', 'e', 'n', '.', 'd', 'e', '\0', /* "ltba.org", true */ 'l', 't', 'b', 'a', '.', 'o', 'r', 'g', '\0', /* "ltecode.com", true */ 'l', 't', 'e', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0', - /* "ltn-tom-morel.fr", true */ 'l', 't', 'n', '-', 't', 'o', 'm', '-', 'm', 'o', 'r', 'e', 'l', '.', 'f', 'r', '\0', + /* "lubot.net", false */ 'l', 'u', 'b', 'o', 't', '.', 'n', 'e', 't', '\0', /* "luc-oberson.ch", true */ 'l', 'u', 'c', '-', 'o', 'b', 'e', 'r', 's', 'o', 'n', '.', 'c', 'h', '\0', /* "lucas-garte.com", true */ 'l', 'u', 'c', 'a', 's', '-', 'g', 'a', 'r', 't', 'e', '.', 'c', 'o', 'm', '\0', /* "lucasantarella.com", true */ 'l', 'u', 'c', 'a', 's', 'a', 'n', 't', 'a', 'r', 'e', 'l', 'l', 'a', '.', 'c', 'o', 'm', '\0', @@ -9849,7 +9828,6 @@ static const char kSTSHostTable[] = { /* "mahefa.co.uk", true */ 'm', 'a', 'h', 'e', 'f', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "mahfouzadedimeji.com", true */ 'm', 'a', 'h', 'f', 'o', 'u', 'z', 'a', 'd', 'e', 'd', 'i', 'm', 'e', 'j', 'i', '.', 'c', 'o', 'm', '\0', /* "mahrer.net", true */ 'm', 'a', 'h', 'r', 'e', 'r', '.', 'n', 'e', 't', '\0', - /* "maidofhonorcleaning.net", true */ 'm', 'a', 'i', 'd', 'o', 'f', 'h', 'o', 'n', 'o', 'r', 'c', 'l', 'e', 'a', 'n', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "mail-rotter.de", true */ 'm', 'a', 'i', 'l', '-', 'r', 'o', 't', 't', 'e', 'r', '.', 'd', 'e', '\0', /* "mail-settings.google.com", true */ 'm', 'a', 'i', 'l', '-', 's', 'e', 't', 't', 'i', 'n', 'g', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "mail.de", true */ 'm', 'a', 'i', 'l', '.', 'd', 'e', '\0', @@ -9883,7 +9861,6 @@ static const char kSTSHostTable[] = { /* "make-pizza.info", true */ 'm', 'a', 'k', 'e', '-', 'p', 'i', 'z', 'z', 'a', '.', 'i', 'n', 'f', 'o', '\0', /* "makedin.net", true */ 'm', 'a', 'k', 'e', 'd', 'i', 'n', '.', 'n', 'e', 't', '\0', /* "makeuplove.nl", true */ 'm', 'a', 'k', 'e', 'u', 'p', 'l', 'o', 'v', 'e', '.', 'n', 'l', '\0', - /* "makeyourank.com", true */ 'm', 'a', 'k', 'e', 'y', 'o', 'u', 'r', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "makeyourlaws.org", true */ 'm', 'a', 'k', 'e', 'y', 'o', 'u', 'r', 'l', 'a', 'w', 's', '.', 'o', 'r', 'g', '\0', /* "makinen.ru", true */ 'm', 'a', 'k', 'i', 'n', 'e', 'n', '.', 'r', 'u', '\0', /* "makkusu.photo", true */ 'm', 'a', 'k', 'k', 'u', 's', 'u', '.', 'p', 'h', 'o', 't', 'o', '\0', @@ -9988,7 +9965,6 @@ static const char kSTSHostTable[] = { /* "marianatherapy.com", true */ 'm', 'a', 'r', 'i', 'a', 'n', 'a', 't', 'h', 'e', 'r', 'a', 'p', 'y', '.', 'c', 'o', 'm', '\0', /* "mariannenan.nl", true */ 'm', 'a', 'r', 'i', 'a', 'n', 'n', 'e', 'n', 'a', 'n', '.', 'n', 'l', '\0', /* "mariaolesen.dk", true */ 'm', 'a', 'r', 'i', 'a', 'o', 'l', 'e', 's', 'e', 'n', '.', 'd', 'k', '\0', - /* "marie.club", true */ 'm', 'a', 'r', 'i', 'e', '.', 'c', 'l', 'u', 'b', '\0', /* "mariehane.com", true */ 'm', 'a', 'r', 'i', 'e', 'h', 'a', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "mariemiramont.fr", true */ 'm', 'a', 'r', 'i', 'e', 'm', 'i', 'r', 'a', 'm', 'o', 'n', 't', '.', 'f', 'r', '\0', /* "marikafranke.de", true */ 'm', 'a', 'r', 'i', 'k', 'a', 'f', 'r', 'a', 'n', 'k', 'e', '.', 'd', 'e', '\0', @@ -10015,6 +9991,7 @@ static const char kSTSHostTable[] = { /* "markoh.co.uk", true */ 'm', 'a', 'r', 'k', 'o', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "markom.rs", true */ 'm', 'a', 'r', 'k', 'o', 'm', '.', 'r', 's', '\0', /* "markorszulak.com", true */ 'm', 'a', 'r', 'k', 'o', 'r', 's', 'z', 'u', 'l', 'a', 'k', '.', 'c', 'o', 'm', '\0', + /* "markprof.ru", true */ 'm', 'a', 'r', 'k', 'p', 'r', 'o', 'f', '.', 'r', 'u', '\0', /* "markri.nl", false */ 'm', 'a', 'r', 'k', 'r', 'i', '.', 'n', 'l', '\0', /* "marksill.com", true */ 'm', 'a', 'r', 'k', 's', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "marksouthall.com", true */ 'm', 'a', 'r', 'k', 's', 'o', 'u', 't', 'h', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0', @@ -10362,7 +10339,6 @@ static const char kSTSHostTable[] = { /* "mexior.nl", true */ 'm', 'e', 'x', 'i', 'o', 'r', '.', 'n', 'l', '\0', /* "meyeraviation.com", true */ 'm', 'e', 'y', 'e', 'r', 'a', 'v', 'i', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "meyercloud.de", true */ 'm', 'e', 'y', 'e', 'r', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', - /* "mfedderke.com", true */ 'm', 'f', 'e', 'd', 'd', 'e', 'r', 'k', 'e', '.', 'c', 'o', 'm', '\0', /* "mfxbe.de", true */ 'm', 'f', 'x', 'b', 'e', '.', 'd', 'e', '\0', /* "mgdigital.fr", true */ 'm', 'g', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'f', 'r', '\0', /* "mghiorzi.com.ar", true */ 'm', 'g', 'h', 'i', 'o', 'r', 'z', 'i', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', @@ -10650,7 +10626,6 @@ static const char kSTSHostTable[] = { /* "moehrke.cc", true */ 'm', 'o', 'e', 'h', 'r', 'k', 'e', '.', 'c', 'c', '\0', /* "moeloli.pw", true */ 'm', 'o', 'e', 'l', 'o', 'l', 'i', '.', 'p', 'w', '\0', /* "moevenpick-cafe.com", true */ 'm', 'o', 'e', 'v', 'e', 'n', 'p', 'i', 'c', 'k', '-', 'c', 'a', 'f', 'e', '.', 'c', 'o', 'm', '\0', - /* "mofohome.dyndns.org", true */ 'm', 'o', 'f', 'o', 'h', 'o', 'm', 'e', '.', 'd', 'y', 'n', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0', /* "moitur.com", true */ 'm', 'o', 'i', 't', 'u', 'r', '.', 'c', 'o', 'm', '\0', /* "mojaknjiznica.com", false */ 'm', 'o', 'j', 'a', 'k', 'n', 'j', 'i', 'z', 'n', 'i', 'c', 'a', '.', 'c', 'o', 'm', '\0', /* "mojapraca.sk", true */ 'm', 'o', 'j', 'a', 'p', 'r', 'a', 'c', 'a', '.', 's', 'k', '\0', @@ -10707,7 +10682,6 @@ static const char kSTSHostTable[] = { /* "montand.com", true */ 'm', 'o', 'n', 't', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "montarfotoaki.com", true */ 'm', 'o', 'n', 't', 'a', 'r', 'f', 'o', 't', 'o', 'a', 'k', 'i', '.', 'c', 'o', 'm', '\0', /* "montazer.net", true */ 'm', 'o', 'n', 't', 'a', 'z', 'e', 'r', '.', 'n', 'e', 't', '\0', - /* "montonicms.com", true */ 'm', 'o', 'n', 't', 'o', 'n', 'i', 'c', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "moo.la", true */ 'm', 'o', 'o', '.', 'l', 'a', '\0', /* "moobo.co.jp", true */ 'm', 'o', 'o', 'b', 'o', '.', 'c', 'o', '.', 'j', 'p', '\0', /* "moobo.xyz", true */ 'm', 'o', 'o', 'b', 'o', '.', 'x', 'y', 'z', '\0', @@ -10932,7 +10906,6 @@ static const char kSTSHostTable[] = { /* "myeberspaecher.com", true */ 'm', 'y', 'e', 'b', 'e', 'r', 's', 'p', 'a', 'e', 'c', 'h', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "myeffect.today", true */ 'm', 'y', 'e', 'f', 'f', 'e', 'c', 't', '.', 't', 'o', 'd', 'a', 'y', '\0', /* "myepass.bg", true */ 'm', 'y', 'e', 'p', 'a', 's', 's', '.', 'b', 'g', '\0', - /* "myepass.de", true */ 'm', 'y', 'e', 'p', 'a', 's', 's', '.', 'd', 'e', '\0', /* "myfappening.org", true */ 'm', 'y', 'f', 'a', 'p', 'p', 'e', 'n', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "myfedloan.org", true */ 'm', 'y', 'f', 'e', 'd', 'l', 'o', 'a', 'n', '.', 'o', 'r', 'g', '\0', /* "myfrenchtattoo.fr", true */ 'm', 'y', 'f', 'r', 'e', 'n', 'c', 'h', 't', 'a', 't', 't', 'o', 'o', '.', 'f', 'r', '\0', @@ -11001,6 +10974,7 @@ static const char kSTSHostTable[] = { /* "mytc.fr", true */ 'm', 'y', 't', 'c', '.', 'f', 'r', '\0', /* "mythengay.ch", true */ 'm', 'y', 't', 'h', 'e', 'n', 'g', 'a', 'y', '.', 'c', 'h', '\0', /* "mythlogic.com", true */ 'm', 'y', 't', 'h', 'l', 'o', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0', + /* "mythslegendscollection.com", true */ 'm', 'y', 't', 'h', 's', 'l', 'e', 'g', 'e', 'n', 'd', 's', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "mytraiteurs.com", true */ 'm', 'y', 't', 'r', 'a', 'i', 't', 'e', 'u', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "mytripcar.co.uk", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "mytripcar.com", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0', @@ -11549,6 +11523,7 @@ static const char kSTSHostTable[] = { /* "nsboutique.com", true */ 'n', 's', 'b', 'o', 'u', 't', 'i', 'q', 'u', 'e', '.', 'c', 'o', 'm', '\0', /* "nscnet.jp", true */ 'n', 's', 'c', 'n', 'e', 't', '.', 'j', 'p', '\0', /* "nshost.ro", true */ 'n', 's', 'h', 'o', 's', 't', '.', 'r', 'o', '\0', + /* "nsm.ee", true */ 'n', 's', 'm', '.', 'e', 'e', '\0', /* "nspeaks.com", true */ 'n', 's', 'p', 'e', 'a', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "nst-maroc.com", true */ 'n', 's', 't', '-', 'm', 'a', 'r', 'o', 'c', '.', 'c', 'o', 'm', '\0', /* "nstd.net", true */ 'n', 's', 't', 'd', '.', 'n', 'e', 't', '\0', @@ -11793,7 +11768,6 @@ static const char kSTSHostTable[] = { /* "onlineschadestaat.nl", true */ 'o', 'n', 'l', 'i', 'n', 'e', 's', 'c', 'h', 'a', 'd', 'e', 's', 't', 'a', 'a', 't', '.', 'n', 'l', '\0', /* "onlinetravelmoney.co.uk", true */ 'o', 'n', 'l', 'i', 'n', 'e', 't', 'r', 'a', 'v', 'e', 'l', 'm', 'o', 'n', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "only-roses.com", true */ 'o', 'n', 'l', 'y', '-', 'r', 'o', 's', 'e', 's', '.', 'c', 'o', 'm', '\0', - /* "onlyzero.net", true */ 'o', 'n', 'l', 'y', 'z', 'e', 'r', 'o', '.', 'n', 'e', 't', '\0', /* "onmaps.de", true */ 'o', 'n', 'm', 'a', 'p', 's', '.', 'd', 'e', '\0', /* "onmarketbookbuilds.com", true */ 'o', 'n', 'm', 'a', 'r', 'k', 'e', 't', 'b', 'o', 'o', 'k', 'b', 'u', 'i', 'l', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "onmuvo.com", true */ 'o', 'n', 'm', 'u', 'v', 'o', '.', 'c', 'o', 'm', '\0', @@ -12091,6 +12065,7 @@ static const char kSTSHostTable[] = { /* "passwords.google.com", true */ 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "pasta-factory.co.il", true */ 'p', 'a', 's', 't', 'a', '-', 'f', 'a', 'c', 't', 'o', 'r', 'y', '.', 'c', 'o', '.', 'i', 'l', '\0', /* "pastaenprosecco.nl", true */ 'p', 'a', 's', 't', 'a', 'e', 'n', 'p', 'r', 'o', 's', 'e', 'c', 'c', 'o', '.', 'n', 'l', '\0', + /* "pastdream.xyz", true */ 'p', 'a', 's', 't', 'd', 'r', 'e', 'a', 'm', '.', 'x', 'y', 'z', '\0', /* "paste.fedoraproject.org", true */ 'p', 'a', 's', 't', 'e', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', /* "pastebin.co.za", true */ 'p', 'a', 's', 't', 'e', 'b', 'i', 'n', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "pasternok.org", true */ 'p', 'a', 's', 't', 'e', 'r', 'n', 'o', 'k', '.', 'o', 'r', 'g', '\0', @@ -12182,7 +12157,6 @@ static const char kSTSHostTable[] = { /* "pcgamingfreaks.at", true */ 'p', 'c', 'g', 'a', 'm', 'i', 'n', 'g', 'f', 'r', 'e', 'a', 'k', 's', '.', 'a', 't', '\0', /* "pciconcursos.com.br", true */ 'p', 'c', 'i', 'c', 'o', 'n', 'c', 'u', 'r', 's', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "pclaeuft.de", true */ 'p', 'c', 'l', 'a', 'e', 'u', 'f', 't', '.', 'd', 'e', '\0', - /* "pclob.gov", true */ 'p', 'c', 'l', 'o', 'b', '.', 'g', 'o', 'v', '\0', /* "pcloud.com", true */ 'p', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', /* "pcnotdienst-oldenburg-rastede.de", true */ 'p', 'c', 'n', 'o', 't', 'd', 'i', 'e', 'n', 's', 't', '-', 'o', 'l', 'd', 'e', 'n', 'b', 'u', 'r', 'g', '-', 'r', 'a', 's', 't', 'e', 'd', 'e', '.', 'd', 'e', '\0', /* "pctonic.net", true */ 'p', 'c', 't', 'o', 'n', 'i', 'c', '.', 'n', 'e', 't', '\0', @@ -12356,7 +12330,7 @@ static const char kSTSHostTable[] = { /* "philipp-trulson.de", true */ 'p', 'h', 'i', 'l', 'i', 'p', 'p', '-', 't', 'r', 'u', 'l', 's', 'o', 'n', '.', 'd', 'e', '\0', /* "philippkeschl.at", true */ 'p', 'h', 'i', 'l', 'i', 'p', 'p', 'k', 'e', 's', 'c', 'h', 'l', '.', 'a', 't', '\0', /* "phillippi.me", true */ 'p', 'h', 'i', 'l', 'l', 'i', 'p', 'p', 'i', '.', 'm', 'e', '\0', - /* "phillmoore.com", false */ 'p', 'h', 'i', 'l', 'l', 'm', 'o', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', + /* "phillmoore.com", true */ 'p', 'h', 'i', 'l', 'l', 'm', 'o', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "philosopherswool.com", true */ 'p', 'h', 'i', 'l', 'o', 's', 'o', 'p', 'h', 'e', 'r', 's', 'w', 'o', 'o', 'l', '.', 'c', 'o', 'm', '\0', /* "philosophyguides.org", true */ 'p', 'h', 'i', 'l', 'o', 's', 'o', 'p', 'h', 'y', 'g', 'u', 'i', 'd', 'e', 's', '.', 'o', 'r', 'g', '\0', /* "philphonic.de", true */ 'p', 'h', 'i', 'l', 'p', 'h', 'o', 'n', 'i', 'c', '.', 'd', 'e', '\0', @@ -12390,6 +12364,7 @@ static const char kSTSHostTable[] = { /* "phpprime.com", true */ 'p', 'h', 'p', 'p', 'r', 'i', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "phpsecure.info", true */ 'p', 'h', 'p', 's', 'e', 'c', 'u', 'r', 'e', '.', 'i', 'n', 'f', 'o', '\0', /* "phra.gs", true */ 'p', 'h', 'r', 'a', '.', 'g', 's', '\0', + /* "phryanjr.com", false */ 'p', 'h', 'r', 'y', 'a', 'n', 'j', 'r', '.', 'c', 'o', 'm', '\0', /* "phryneas.de", true */ 'p', 'h', 'r', 'y', 'n', 'e', 'a', 's', '.', 'd', 'e', '\0', /* "phuket-idc.com", true */ 'p', 'h', 'u', 'k', 'e', 't', '-', 'i', 'd', 'c', '.', 'c', 'o', 'm', '\0', /* "phunehehe.net", true */ 'p', 'h', 'u', 'n', 'e', 'h', 'e', 'h', 'e', '.', 'n', 'e', 't', '\0', @@ -12640,7 +12615,6 @@ static const char kSTSHostTable[] = { /* "port80.hamburg", true */ 'p', 'o', 'r', 't', '8', '0', '.', 'h', 'a', 'm', 'b', 'u', 'r', 'g', '\0', /* "portal.tirol.gv.at", true */ 'p', 'o', 'r', 't', 'a', 'l', '.', 't', 'i', 'r', 'o', 'l', '.', 'g', 'v', '.', 'a', 't', '\0', /* "portaluniversalista.org", true */ 'p', 'o', 'r', 't', 'a', 'l', 'u', 'n', 'i', 'v', 'e', 'r', 's', 'a', 'l', 'i', 's', 't', 'a', '.', 'o', 'r', 'g', '\0', - /* "portalzine.de", true */ 'p', 'o', 'r', 't', 'a', 'l', 'z', 'i', 'n', 'e', '.', 'd', 'e', '\0', /* "portercup.com", true */ 'p', 'o', 'r', 't', 'e', 'r', 'c', 'u', 'p', '.', 'c', 'o', 'm', '\0', /* "portofrotterdam.com", true */ 'p', 'o', 'r', 't', 'o', 'f', 'r', 'o', 't', 't', 'e', 'r', 'd', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "portosonline.pl", true */ 'p', 'o', 'r', 't', 'o', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'p', 'l', '\0', @@ -12657,6 +12631,7 @@ static const char kSTSHostTable[] = { /* "postbox.life", true */ 'p', 'o', 's', 't', 'b', 'o', 'x', '.', 'l', 'i', 'f', 'e', '\0', /* "postcodegarant.nl", true */ 'p', 'o', 's', 't', 'c', 'o', 'd', 'e', 'g', 'a', 'r', 'a', 'n', 't', '.', 'n', 'l', '\0', /* "posteo.de", false */ 'p', 'o', 's', 't', 'e', 'o', '.', 'd', 'e', '\0', + /* "posterspy.com", true */ 'p', 'o', 's', 't', 'e', 'r', 's', 'p', 'y', '.', 'c', 'o', 'm', '\0', /* "postfinance.ch", true */ 'p', 'o', 's', 't', 'f', 'i', 'n', 'a', 'n', 'c', 'e', '.', 'c', 'h', '\0', /* "postmatescode.com", true */ 'p', 'o', 's', 't', 'm', 'a', 't', 'e', 's', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "postn.eu", true */ 'p', 'o', 's', 't', 'n', '.', 'e', 'u', '\0', @@ -12725,6 +12700,7 @@ static const char kSTSHostTable[] = { /* "preparetheword.com", false */ 'p', 'r', 'e', 'p', 'a', 'r', 'e', 't', 'h', 'e', 'w', 'o', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "presbee.com", true */ 'p', 'r', 'e', 's', 'b', 'e', 'e', '.', 'c', 'o', 'm', '\0', /* "prescotonline.co.uk", true */ 'p', 'r', 'e', 's', 'c', 'o', 't', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "president.bg", true */ 'p', 'r', 'e', 's', 'i', 'd', 'e', 'n', 't', '.', 'b', 'g', '\0', /* "presidentials2016.com", true */ 'p', 'r', 'e', 's', 'i', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '2', '0', '1', '6', '.', 'c', 'o', 'm', '\0', /* "prespanok.sk", true */ 'p', 'r', 'e', 's', 'p', 'a', 'n', 'o', 'k', '.', 's', 'k', '\0', /* "presscenter.jp", true */ 'p', 'r', 'e', 's', 's', 'c', 'e', 'n', 't', 'e', 'r', '.', 'j', 'p', '\0', @@ -12791,6 +12767,7 @@ static const char kSTSHostTable[] = { /* "profinetz.de", true */ 'p', 'r', 'o', 'f', 'i', 'n', 'e', 't', 'z', '.', 'd', 'e', '\0', /* "profitopia.de", true */ 'p', 'r', 'o', 'f', 'i', 't', 'o', 'p', 'i', 'a', '.', 'd', 'e', '\0', /* "profivps.com", true */ 'p', 'r', 'o', 'f', 'i', 'v', 'p', 's', '.', 'c', 'o', 'm', '\0', + /* "profpay.com", true */ 'p', 'r', 'o', 'f', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0', /* "profusion.io", true */ 'p', 'r', 'o', 'f', 'u', 's', 'i', 'o', 'n', '.', 'i', 'o', '\0', /* "progarm.org", true */ 'p', 'r', 'o', 'g', 'a', 'r', 'm', '.', 'o', 'r', 'g', '\0', /* "proggersession.de", true */ 'p', 'r', 'o', 'g', 'g', 'e', 'r', 's', 'e', 's', 's', 'i', 'o', 'n', '.', 'd', 'e', '\0', @@ -13207,6 +13184,7 @@ static const char kSTSHostTable[] = { /* "reality.news", true */ 'r', 'e', 'a', 'l', 'i', 't', 'y', '.', 'n', 'e', 'w', 's', '\0', /* "reality0ne.com", true */ 'r', 'e', 'a', 'l', 'i', 't', 'y', '0', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "reallifeforums.com", true */ 'r', 'e', 'a', 'l', 'l', 'i', 'f', 'e', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0', + /* "realloc.me", true */ 'r', 'e', 'a', 'l', 'l', 'o', 'c', '.', 'm', 'e', '\0', /* "reallyreally.io", true */ 'r', 'e', 'a', 'l', 'l', 'y', 'r', 'e', 'a', 'l', 'l', 'y', '.', 'i', 'o', '\0', /* "realmofespionage.xyz", true */ 'r', 'e', 'a', 'l', 'm', 'o', 'f', 'e', 's', 'p', 'i', 'o', 'n', 'a', 'g', 'e', '.', 'x', 'y', 'z', '\0', /* "realwaycome.com", true */ 'r', 'e', 'a', 'l', 'w', 'a', 'y', 'c', 'o', 'm', 'e', '.', 'c', 'o', 'm', '\0', @@ -13306,6 +13284,7 @@ static const char kSTSHostTable[] = { /* "reinout.nu", true */ 'r', 'e', 'i', 'n', 'o', 'u', 't', '.', 'n', 'u', '\0', /* "reinouthoornweg.nl", true */ 'r', 'e', 'i', 'n', 'o', 'u', 't', 'h', 'o', 'o', 'r', 'n', 'w', 'e', 'g', '.', 'n', 'l', '\0', /* "reishunger.de", true */ 'r', 'e', 'i', 's', 'h', 'u', 'n', 'g', 'e', 'r', '.', 'd', 'e', '\0', + /* "reithguard-it.de", true */ 'r', 'e', 'i', 't', 'h', 'g', 'u', 'a', 'r', 'd', '-', 'i', 't', '.', 'd', 'e', '\0', /* "relatic.net", true */ 'r', 'e', 'l', 'a', 't', 'i', 'c', '.', 'n', 'e', 't', '\0', /* "relaxhavefun.com", true */ 'r', 'e', 'l', 'a', 'x', 'h', 'a', 'v', 'e', 'f', 'u', 'n', '.', 'c', 'o', 'm', '\0', /* "relaxpointhyncice.cz", true */ 'r', 'e', 'l', 'a', 'x', 'p', 'o', 'i', 'n', 't', 'h', 'y', 'n', 'c', 'i', 'c', 'e', '.', 'c', 'z', '\0', @@ -13492,6 +13471,7 @@ static const char kSTSHostTable[] = { /* "ristorantefattoamano.eu", true */ 'r', 'i', 's', 't', 'o', 'r', 'a', 'n', 't', 'e', 'f', 'a', 't', 't', 'o', 'a', 'm', 'a', 'n', 'o', '.', 'e', 'u', '\0', /* "rithm.ch", true */ 'r', 'i', 't', 'h', 'm', '.', 'c', 'h', '\0', /* "rivastation.de", true */ 'r', 'i', 'v', 'a', 's', 't', 'a', 't', 'i', 'o', 'n', '.', 'd', 'e', '\0', + /* "riverbanktearooms.co.uk", true */ 'r', 'i', 'v', 'e', 'r', 'b', 'a', 'n', 'k', 't', 'e', 'a', 'r', 'o', 'o', 'm', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "rivermendhealthcenters.com", true */ 'r', 'i', 'v', 'e', 'r', 'm', 'e', 'n', 'd', 'h', 'e', 'a', 'l', 't', 'h', 'c', 'e', 'n', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "riversideauto.net", true */ 'r', 'i', 'v', 'e', 'r', 's', 'i', 'd', 'e', 'a', 'u', 't', 'o', '.', 'n', 'e', 't', '\0', /* "riverweb.gr", true */ 'r', 'i', 'v', 'e', 'r', 'w', 'e', 'b', '.', 'g', 'r', '\0', @@ -13821,7 +13801,6 @@ static const char kSTSHostTable[] = { /* "samel.de", true */ 's', 'a', 'm', 'e', 'l', '.', 'd', 'e', '\0', /* "samenwerkingsportaal.nl", true */ 's', 'a', 'm', 'e', 'n', 'w', 'e', 'r', 'k', 'i', 'n', 'g', 's', 'p', 'o', 'r', 't', 'a', 'a', 'l', '.', 'n', 'l', '\0', /* "samenwerkingsportaal.tk", true */ 's', 'a', 'm', 'e', 'n', 'w', 'e', 'r', 'k', 'i', 'n', 'g', 's', 'p', 'o', 'r', 't', 'a', 'a', 'l', '.', 't', 'k', '\0', - /* "sametovymesic.cz", true */ 's', 'a', 'm', 'e', 't', 'o', 'v', 'y', 'm', 'e', 's', 'i', 'c', '.', 'c', 'z', '\0', /* "samfunnet.no", false */ 's', 'a', 'm', 'f', 'u', 'n', 'n', 'e', 't', '.', 'n', 'o', '\0', /* "samifar.in", true */ 's', 'a', 'm', 'i', 'f', 'a', 'r', '.', 'i', 'n', '\0', /* "samirnassar.com", true */ 's', 'a', 'm', 'i', 'r', 'n', 'a', 's', 's', 'a', 'r', '.', 'c', 'o', 'm', '\0', @@ -14128,7 +14107,6 @@ static const char kSTSHostTable[] = { /* "securitybrief.co.nz", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'b', 'r', 'i', 'e', 'f', '.', 'c', 'o', '.', 'n', 'z', '\0', /* "securitybrief.com.au", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'b', 'r', 'i', 'e', 'f', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "securityheaders.io", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'h', 'e', 'a', 'd', 'e', 'r', 's', '.', 'i', 'o', '\0', - /* "securitymap.wiki", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'm', 'a', 'p', '.', 'w', 'i', 'k', 'i', '\0', /* "securityprimes.in", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'p', 'r', 'i', 'm', 'e', 's', '.', 'i', 'n', '\0', /* "securitysnobs.com", false */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'n', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "securitysoapbox.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'o', 'a', 'p', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', @@ -14301,6 +14279,7 @@ static const char kSTSHostTable[] = { /* "shadowsocks.com.hk", true */ 's', 'h', 'a', 'd', 'o', 'w', 's', 'o', 'c', 'k', 's', '.', 'c', 'o', 'm', '.', 'h', 'k', '\0', /* "shadowsworldonline.co.uk", true */ 's', 'h', 'a', 'd', 'o', 'w', 's', 'w', 'o', 'r', 'l', 'd', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "shag-shag.ru", true */ 's', 'h', 'a', 'g', '-', 's', 'h', 'a', 'g', '.', 'r', 'u', '\0', + /* "shagi29.ru", true */ 's', 'h', 'a', 'g', 'i', '2', '9', '.', 'r', 'u', '\0', /* "shaitan.eu", true */ 's', 'h', 'a', 'i', 't', 'a', 'n', '.', 'e', 'u', '\0', /* "shaken110.com", true */ 's', 'h', 'a', 'k', 'e', 'n', '1', '1', '0', '.', 'c', 'o', 'm', '\0', /* "shakes4u.com", true */ 's', 'h', 'a', 'k', 'e', 's', '4', 'u', '.', 'c', 'o', 'm', '\0', @@ -14527,7 +14506,6 @@ static const char kSTSHostTable[] = { /* "sinatrafamily.com", true */ 's', 'i', 'n', 'a', 't', 'r', 'a', 'f', 'a', 'm', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "sinergy.ch", true */ 's', 'i', 'n', 'e', 'r', 'g', 'y', '.', 'c', 'h', '\0', /* "sinfield.com", true */ 's', 'i', 'n', 'f', 'i', 'e', 'l', 'd', '.', 'c', 'o', 'm', '\0', - /* "sinfulforums.net", true */ 's', 'i', 'n', 'f', 'u', 'l', 'f', 'o', 'r', 'u', 'm', 's', '.', 'n', 'e', 't', '\0', /* "singleuse.link", true */ 's', 'i', 'n', 'g', 'l', 'e', 'u', 's', 'e', '.', 'l', 'i', 'n', 'k', '\0', /* "singlu10.org", false */ 's', 'i', 'n', 'g', 'l', 'u', '1', '0', '.', 'o', 'r', 'g', '\0', /* "sinktank.de", true */ 's', 'i', 'n', 'k', 't', 'a', 'n', 'k', '.', 'd', 'e', '\0', @@ -14586,7 +14564,7 @@ static const char kSTSHostTable[] = { /* "skillseo.com", true */ 's', 'k', 'i', 'l', 'l', 's', 'e', 'o', '.', 'c', 'o', 'm', '\0', /* "skimming.net", true */ 's', 'k', 'i', 'm', 'm', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "skincases.co", true */ 's', 'k', 'i', 'n', 'c', 'a', 's', 'e', 's', '.', 'c', 'o', '\0', - /* "sking.io", true */ 's', 'k', 'i', 'n', 'g', '.', 'i', 'o', '\0', + /* "sking.io", false */ 's', 'k', 'i', 'n', 'g', '.', 'i', 'o', '\0', /* "skingames.co", true */ 's', 'k', 'i', 'n', 'g', 'a', 'm', 'e', 's', '.', 'c', 'o', '\0', /* "skinmarket.co", true */ 's', 'k', 'i', 'n', 'm', 'a', 'r', 'k', 'e', 't', '.', 'c', 'o', '\0', /* "skipfault.com", true */ 's', 'k', 'i', 'p', 'f', 'a', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', @@ -14664,6 +14642,7 @@ static const char kSTSHostTable[] = { /* "smallchat.nl", true */ 's', 'm', 'a', 'l', 'l', 'c', 'h', 'a', 't', '.', 'n', 'l', '\0', /* "smalldata.tech", true */ 's', 'm', 'a', 'l', 'l', 'd', 'a', 't', 'a', '.', 't', 'e', 'c', 'h', '\0', /* "smalldogbreeds.net", true */ 's', 'm', 'a', 'l', 'l', 'd', 'o', 'g', 'b', 'r', 'e', 'e', 'd', 's', '.', 'n', 'e', 't', '\0', + /* "smallhadroncollider.com", true */ 's', 'm', 'a', 'l', 'l', 'h', 'a', 'd', 'r', 'o', 'n', 'c', 'o', 'l', 'l', 'i', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "smallpath.me", true */ 's', 'm', 'a', 'l', 'l', 'p', 'a', 't', 'h', '.', 'm', 'e', '\0', /* "smallplanet.ch", true */ 's', 'm', 'a', 'l', 'l', 'p', 'l', 'a', 'n', 'e', 't', '.', 'c', 'h', '\0', /* "smalltalkconsulting.com", true */ 's', 'm', 'a', 'l', 'l', 't', 'a', 'l', 'k', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -14774,6 +14753,7 @@ static const char kSTSHostTable[] = { /* "socialworkout.net", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 'n', 'e', 't', '\0', /* "socialworkout.org", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 'o', 'r', 'g', '\0', /* "socialworkout.tv", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 't', 'v', '\0', + /* "societyhilldance.com", true */ 's', 'o', 'c', 'i', 'e', 't', 'y', 'h', 'i', 'l', 'l', 'd', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "socioambiental.org", true */ 's', 'o', 'c', 'i', 'o', 'a', 'm', 'b', 'i', 'e', 'n', 't', 'a', 'l', '.', 'o', 'r', 'g', '\0', /* "socketize.com", true */ 's', 'o', 'c', 'k', 'e', 't', 'i', 'z', 'e', '.', 'c', 'o', 'm', '\0', /* "sockeye.io", true */ 's', 'o', 'c', 'k', 'e', 'y', 'e', '.', 'i', 'o', '\0', @@ -14853,6 +14833,7 @@ static const char kSTSHostTable[] = { /* "sorex.photo", true */ 's', 'o', 'r', 'e', 'x', '.', 'p', 'h', 'o', 't', 'o', '\0', /* "sorincocorada.ro", true */ 's', 'o', 'r', 'i', 'n', 'c', 'o', 'c', 'o', 'r', 'a', 'd', 'a', '.', 'r', 'o', '\0', /* "sorn.service.gov.uk", true */ 's', 'o', 'r', 'n', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'g', 'o', 'v', '.', 'u', 'k', '\0', + /* "sortaweird.net", false */ 's', 'o', 'r', 't', 'a', 'w', 'e', 'i', 'r', 'd', '.', 'n', 'e', 't', '\0', /* "soruly.com", true */ 's', 'o', 'r', 'u', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "sorz.org", true */ 's', 'o', 'r', 'z', '.', 'o', 'r', 'g', '\0', /* "sos.sk", false */ 's', 'o', 's', '.', 's', 'k', '\0', @@ -14919,6 +14900,7 @@ static const char kSTSHostTable[] = { /* "sparklebastard.com", true */ 's', 'p', 'a', 'r', 'k', 'l', 'e', 'b', 'a', 's', 't', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "sparta-trade.com", true */ 's', 'p', 'a', 'r', 't', 'a', '-', 't', 'r', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "spartaconsulting.fi", true */ 's', 'p', 'a', 'r', 't', 'a', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'f', 'i', '\0', + /* "spartantheatre.org", true */ 's', 'p', 'a', 'r', 't', 'a', 'n', 't', 'h', 'e', 'a', 't', 'r', 'e', '.', 'o', 'r', 'g', '\0', /* "spassstempel.de", true */ 's', 'p', 'a', 's', 's', 's', 't', 'e', 'm', 'p', 'e', 'l', '.', 'd', 'e', '\0', /* "spatzenwerkstatt.de", true */ 's', 'p', 'a', 't', 'z', 'e', 'n', 'w', 'e', 'r', 'k', 's', 't', 'a', 't', 't', '.', 'd', 'e', '\0', /* "spawn.cz", true */ 's', 'p', 'a', 'w', 'n', '.', 'c', 'z', '\0', @@ -15023,7 +15005,6 @@ static const char kSTSHostTable[] = { /* "srmaximo.com", true */ 's', 'r', 'm', 'a', 'x', 'i', 'm', 'o', '.', 'c', 'o', 'm', '\0', /* "sro.center", true */ 's', 'r', 'o', '.', 'c', 'e', 'n', 't', 'e', 'r', '\0', /* "srpdb.com", true */ 's', 'r', 'p', 'd', 'b', '.', 'c', 'o', 'm', '\0', - /* "srrdb.com", true */ 's', 'r', 'r', 'd', 'b', '.', 'c', 'o', 'm', '\0', /* "srroddy.com", true */ 's', 'r', 'r', 'o', 'd', 'd', 'y', '.', 'c', 'o', 'm', '\0', /* "srv47.de", true */ 's', 'r', 'v', '4', '7', '.', 'd', 'e', '\0', /* "ss-free.net", true */ 's', 's', '-', 'f', 'r', 'e', 'e', '.', 'n', 'e', 't', '\0', @@ -15113,6 +15094,7 @@ static const char kSTSHostTable[] = { /* "startupsort.com", true */ 's', 't', 'a', 'r', 't', 'u', 'p', 's', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0', /* "startupum.ru", true */ 's', 't', 'a', 'r', 't', 'u', 'p', 'u', 'm', '.', 'r', 'u', '\0', /* "starwatches.eu", true */ 's', 't', 'a', 'r', 'w', 'a', 't', 'c', 'h', 'e', 's', '.', 'e', 'u', '\0', + /* "stassi.ch", true */ 's', 't', 'a', 's', 's', 'i', '.', 'c', 'h', '\0', /* "stat.ink", true */ 's', 't', 'a', 't', '.', 'i', 'n', 'k', '\0', /* "statgram.me", true */ 's', 't', 'a', 't', 'g', 'r', 'a', 'm', '.', 'm', 'e', '\0', /* "static-myfxee-808795.c.cdn77.org", true */ 's', 't', 'a', 't', 'i', 'c', '-', 'm', 'y', 'f', 'x', 'e', 'e', '-', '8', '0', '8', '7', '9', '5', '.', 'c', '.', 'c', 'd', 'n', '7', '7', '.', 'o', 'r', 'g', '\0', @@ -15285,6 +15267,7 @@ static const char kSTSHostTable[] = { /* "stuntmen.xyz", true */ 's', 't', 'u', 'n', 't', 'm', 'e', 'n', '.', 'x', 'y', 'z', '\0', /* "stupendous.net", true */ 's', 't', 'u', 'p', 'e', 'n', 'd', 'o', 'u', 's', '.', 'n', 'e', 't', '\0', /* "sturbi.de", true */ 's', 't', 'u', 'r', 'b', 'i', '.', 'd', 'e', '\0', + /* "sturbock.me", true */ 's', 't', 'u', 'r', 'b', 'o', 'c', 'k', '.', 'm', 'e', '\0', /* "stutelage.com", true */ 's', 't', 'u', 't', 'e', 'l', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "stuur.nl", false */ 's', 't', 'u', 'u', 'r', '.', 'n', 'l', '\0', /* "stygium.net", false */ 's', 't', 'y', 'g', 'i', 'u', 'm', '.', 'n', 'e', 't', '\0', @@ -15738,7 +15721,6 @@ static const char kSTSHostTable[] = { /* "tenyx.de", true */ 't', 'e', 'n', 'y', 'x', '.', 'd', 'e', '\0', /* "teodio.cl", true */ 't', 'e', 'o', 'd', 'i', 'o', '.', 'c', 'l', '\0', /* "teoskanta.fi", true */ 't', 'e', 'o', 's', 'k', 'a', 'n', 't', 'a', '.', 'f', 'i', '\0', - /* "tepid.org", true */ 't', 'e', 'p', 'i', 'd', '.', 'o', 'r', 'g', '\0', /* "tepitus.de", true */ 't', 'e', 'p', 'i', 't', 'u', 's', '.', 'd', 'e', '\0', /* "tequilazor.com", true */ 't', 'e', 'q', 'u', 'i', 'l', 'a', 'z', 'o', 'r', '.', 'c', 'o', 'm', '\0', /* "teracloud.at", true */ 't', 'e', 'r', 'a', 'c', 'l', 'o', 'u', 'd', '.', 'a', 't', '\0', @@ -15836,6 +15818,7 @@ static const char kSTSHostTable[] = { /* "thedrop.pw", true */ 't', 'h', 'e', 'd', 'r', 'o', 'p', '.', 'p', 'w', '\0', /* "thedutchmarketers.com", true */ 't', 'h', 'e', 'd', 'u', 't', 'c', 'h', 'm', 'a', 'r', 'k', 'e', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "thedystance.com", true */ 't', 'h', 'e', 'd', 'y', 's', 't', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0', + /* "theeyeopener.com", true */ 't', 'h', 'e', 'e', 'y', 'e', 'o', 'p', 'e', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "theflyingbear.net", true */ 't', 'h', 'e', 'f', 'l', 'y', 'i', 'n', 'g', 'b', 'e', 'a', 'r', '.', 'n', 'e', 't', '\0', /* "thefox.co", true */ 't', 'h', 'e', 'f', 'o', 'x', '.', 'c', 'o', '\0', /* "thefox.com.fr", true */ 't', 'h', 'e', 'f', 'o', 'x', '.', 'c', 'o', 'm', '.', 'f', 'r', '\0', @@ -15952,7 +15935,6 @@ static const char kSTSHostTable[] = { /* "thingies.site", true */ 't', 'h', 'i', 'n', 'g', 'i', 'e', 's', '.', 's', 'i', 't', 'e', '\0', /* "thinkcash.nl", true */ 't', 'h', 'i', 'n', 'k', 'c', 'a', 's', 'h', '.', 'n', 'l', '\0', /* "thinkdo.jp", true */ 't', 'h', 'i', 'n', 'k', 'd', 'o', '.', 'j', 'p', '\0', - /* "thinkindifferent.net", true */ 't', 'h', 'i', 'n', 'k', 'i', 'n', 'd', 'i', 'f', 'f', 'e', 'r', 'e', 'n', 't', '.', 'n', 'e', 't', '\0', /* "thinklikeanentrepreneur.com", true */ 't', 'h', 'i', 'n', 'k', 'l', 'i', 'k', 'e', 'a', 'n', 'e', 'n', 't', 'r', 'e', 'p', 'r', 'e', 'n', 'e', 'u', 'r', '.', 'c', 'o', 'm', '\0', /* "thinkrealty.com", true */ 't', 'h', 'i', 'n', 'k', 'r', 'e', 'a', 'l', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "thinktux.net", true */ 't', 'h', 'i', 'n', 'k', 't', 'u', 'x', '.', 'n', 'e', 't', '\0', @@ -16089,7 +16071,6 @@ static const char kSTSHostTable[] = { /* "tkarstens.de", false */ 't', 'k', 'a', 'r', 's', 't', 'e', 'n', 's', '.', 'd', 'e', '\0', /* "tkat.ch", true */ 't', 'k', 'a', 't', '.', 'c', 'h', '\0', /* "tkn.tokyo", true */ 't', 'k', 'n', '.', 't', 'o', 'k', 'y', 'o', '\0', - /* "tkonstantopoulos.tk", true */ 't', 'k', 'o', 'n', 's', 't', 'a', 'n', 't', 'o', 'p', 'o', 'u', 'l', 'o', 's', '.', 't', 'k', '\0', /* "tlach.cz", true */ 't', 'l', 'a', 'c', 'h', '.', 'c', 'z', '\0', /* "tlcdn.net", true */ 't', 'l', 'c', 'd', 'n', '.', 'n', 'e', 't', '\0', /* "tlo.xyz", true */ 't', 'l', 'o', '.', 'x', 'y', 'z', '\0', @@ -16391,7 +16372,6 @@ static const char kSTSHostTable[] = { /* "travisforte.io", true */ 't', 'r', 'a', 'v', 'i', 's', 'f', 'o', 'r', 't', 'e', '.', 'i', 'o', '\0', /* "travisfranck.com", true */ 't', 'r', 'a', 'v', 'i', 's', 'f', 'r', 'a', 'n', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "travler.net", true */ 't', 'r', 'a', 'v', 'l', 'e', 'r', '.', 'n', 'e', 't', '\0', - /* "treasuredinheritanceministry.com", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'e', 'd', 'i', 'n', 'h', 'e', 'r', 'i', 't', 'a', 'n', 'c', 'e', 'm', 'i', 'n', 'i', 's', 't', 'r', 'y', '.', 'c', 'o', 'm', '\0', /* "treasurydirect.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 'd', 'i', 'r', 'e', 'c', 't', '.', 'g', 'o', 'v', '\0', /* "treasuryhunt.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 'h', 'u', 'n', 't', '.', 'g', 'o', 'v', '\0', /* "treasuryscams.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 's', 'c', 'a', 'm', 's', '.', 'g', 'o', 'v', '\0', @@ -16419,6 +16399,7 @@ static const char kSTSHostTable[] = { /* "tributh.net", true */ 't', 'r', 'i', 'b', 'u', 't', 'h', '.', 'n', 'e', 't', '\0', /* "triddi.com", true */ 't', 'r', 'i', 'd', 'd', 'i', '.', 'c', 'o', 'm', '\0', /* "trident-online.de", true */ 't', 'r', 'i', 'd', 'e', 'n', 't', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', + /* "trik.es", false */ 't', 'r', 'i', 'k', '.', 'e', 's', '\0', /* "trim-a-slab.com", true */ 't', 'r', 'i', 'm', '-', 'a', '-', 's', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0', /* "trimage.org", true */ 't', 'r', 'i', 'm', 'a', 'g', 'e', '.', 'o', 'r', 'g', '\0', /* "trinary.ca", true */ 't', 'r', 'i', 'n', 'a', 'r', 'y', '.', 'c', 'a', '\0', @@ -16972,6 +16953,7 @@ static const char kSTSHostTable[] = { /* "veto.fish", true */ 'v', 'e', 't', 'o', '.', 'f', 'i', 's', 'h', '\0', /* "vetofish.com", true */ 'v', 'e', 't', 'o', 'f', 'i', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "vets.gov", true */ 'v', 'e', 't', 's', '.', 'g', 'o', 'v', '\0', + /* "vfdworld.com", true */ 'v', 'f', 'd', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', 'm', '\0', /* "vgatest.nl", true */ 'v', 'g', 'a', 't', 'e', 's', 't', '.', 'n', 'l', '\0', /* "vgerak.com", true */ 'v', 'g', 'e', 'r', 'a', 'k', '.', 'c', 'o', 'm', '\0', /* "vgropp.de", true */ 'v', 'g', 'r', 'o', 'p', 'p', '.', 'd', 'e', '\0', @@ -17029,6 +17011,7 @@ static const char kSTSHostTable[] = { /* "vincitraining.com", true */ 'v', 'i', 'n', 'c', 'i', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "vineright.com", true */ 'v', 'i', 'n', 'e', 'r', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '\0', /* "vinesauce.info", true */ 'v', 'i', 'n', 'e', 's', 'a', 'u', 'c', 'e', '.', 'i', 'n', 'f', 'o', '\0', + /* "vinetalk.net", true */ 'v', 'i', 'n', 'e', 't', 'a', 'l', 'k', '.', 'n', 'e', 't', '\0', /* "vinicius.sl", true */ 'v', 'i', 'n', 'i', 'c', 'i', 'u', 's', '.', 's', 'l', '\0', /* "vinilosdecorativos.net", true */ 'v', 'i', 'n', 'i', 'l', 'o', 's', 'd', 'e', 'c', 'o', 'r', 'a', 't', 'i', 'v', 'o', 's', '.', 'n', 'e', 't', '\0', /* "vinner.com.au", true */ 'v', 'i', 'n', 'n', 'e', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', @@ -17415,7 +17398,6 @@ static const char kSTSHostTable[] = { /* "weserv.nl", true */ 'w', 'e', 's', 'e', 'r', 'v', '.', 'n', 'l', '\0', /* "wesleycabus.be", true */ 'w', 'e', 's', 'l', 'e', 'y', 'c', 'a', 'b', 'u', 's', '.', 'b', 'e', '\0', /* "wessner.org", true */ 'w', 'e', 's', 's', 'n', 'e', 'r', '.', 'o', 'r', 'g', '\0', - /* "west-wind.net", true */ 'w', 'e', 's', 't', '-', 'w', 'i', 'n', 'd', '.', 'n', 'e', 't', '\0', /* "westcountrystalking.com", true */ 'w', 'e', 's', 't', 'c', 'o', 'u', 'n', 't', 'r', 'y', 's', 't', 'a', 'l', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "westeros.hu", true */ 'w', 'e', 's', 't', 'e', 'r', 'o', 's', '.', 'h', 'u', '\0', /* "westhighlandwhiteterrier.com.br", true */ 'w', 'e', 's', 't', 'h', 'i', 'g', 'h', 'l', 'a', 'n', 'd', 'w', 'h', 'i', 't', 'e', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -17565,10 +17547,10 @@ static const char kSTSHostTable[] = { /* "windscribe.com", true */ 'w', 'i', 'n', 'd', 's', 'c', 'r', 'i', 'b', 'e', '.', 'c', 'o', 'm', '\0', /* "windwoodmedia.com", true */ 'w', 'i', 'n', 'd', 'w', 'o', 'o', 'd', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "windwoodweb.com", true */ 'w', 'i', 'n', 'd', 'w', 'o', 'o', 'd', 'w', 'e', 'b', '.', 'c', 'o', 'm', '\0', + /* "wine-importer.ru", true */ 'w', 'i', 'n', 'e', '-', 'i', 'm', 'p', 'o', 'r', 't', 'e', 'r', '.', 'r', 'u', '\0', /* "winebid.com", true */ 'w', 'i', 'n', 'e', 'b', 'i', 'd', '.', 'c', 'o', 'm', '\0', /* "winghill.com", false */ 'w', 'i', 'n', 'g', 'h', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "wingos.net", true */ 'w', 'i', 'n', 'g', 'o', 's', '.', 'n', 'e', 't', '\0', - /* "winhistory-forum.net", true */ 'w', 'i', 'n', 'h', 'i', 's', 't', 'o', 'r', 'y', '-', 'f', 'o', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0', /* "winmodels.org", true */ 'w', 'i', 'n', 'm', 'o', 'd', 'e', 'l', 's', '.', 'o', 'r', 'g', '\0', /* "winmodels.ru", true */ 'w', 'i', 'n', 'm', 'o', 'd', 'e', 'l', 's', '.', 'r', 'u', '\0', /* "winphonemetro.com", true */ 'w', 'i', 'n', 'p', 'h', 'o', 'n', 'e', 'm', 'e', 't', 'r', 'o', '.', 'c', 'o', 'm', '\0', @@ -17623,6 +17605,7 @@ static const char kSTSHostTable[] = { /* "wodinaz.com", true */ 'w', 'o', 'd', 'i', 'n', 'a', 'z', '.', 'c', 'o', 'm', '\0', /* "wodka-division.de", true */ 'w', 'o', 'd', 'k', 'a', '-', 'd', 'i', 'v', 'i', 's', 'i', 'o', 'n', '.', 'd', 'e', '\0', /* "woelkchen.me", true */ 'w', 'o', 'e', 'l', 'k', 'c', 'h', 'e', 'n', '.', 'm', 'e', '\0', + /* "wofford-ecs.org", true */ 'w', 'o', 'f', 'f', 'o', 'r', 'd', '-', 'e', 'c', 's', '.', 'o', 'r', 'g', '\0', /* "woffs.de", true */ 'w', 'o', 'f', 'f', 's', '.', 'd', 'e', '\0', /* "wohlgemuth.rocks", false */ 'w', 'o', 'h', 'l', 'g', 'e', 'm', 'u', 't', 'h', '.', 'r', 'o', 'c', 'k', 's', '\0', /* "wohnsitz-ausland.com", true */ 'w', 'o', 'h', 'n', 's', 'i', 't', 'z', '-', 'a', 'u', 's', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', @@ -17692,6 +17675,7 @@ static const char kSTSHostTable[] = { /* "wpblog.com.tw", true */ 'w', 'p', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '.', 't', 'w', '\0', /* "wpcarer.pro", true */ 'w', 'p', 'c', 'a', 'r', 'e', 'r', '.', 'p', 'r', 'o', '\0', /* "wpdublin.com", true */ 'w', 'p', 'd', 'u', 'b', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0', + /* "wpfast.net", false */ 'w', 'p', 'f', 'a', 's', 't', '.', 'n', 'e', 't', '\0', /* "wphostingblog.nl", true */ 'w', 'p', 'h', 'o', 's', 't', 'i', 'n', 'g', 'b', 'l', 'o', 'g', '.', 'n', 'l', '\0', /* "wpinfos.de", true */ 'w', 'p', 'i', 'n', 'f', 'o', 's', '.', 'd', 'e', '\0', /* "wpldn.uk", true */ 'w', 'p', 'l', 'd', 'n', '.', 'u', 'k', '\0', @@ -18334,6 +18318,7 @@ static const char kSTSHostTable[] = { /* "zwartendijkstalling.nl", true */ 'z', 'w', 'a', 'r', 't', 'e', 'n', 'd', 'i', 'j', 'k', 's', 't', 'a', 'l', 'l', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "zwerimex.com", true */ 'z', 'w', 'e', 'r', 'i', 'm', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "zwollemag.nl", true */ 'z', 'w', 'o', 'l', 'l', 'e', 'm', 'a', 'g', '.', 'n', 'l', '\0', + /* "zwy.me", false */ 'z', 'w', 'y', '.', 'm', 'e', '\0', /* "zx6rninja.de", true */ 'z', 'x', '6', 'r', 'n', 'i', 'n', 'j', 'a', '.', 'd', 'e', '\0', /* "zybbo.com", true */ 'z', 'y', 'b', 'b', 'o', '.', 'c', 'o', 'm', '\0', /* "zymbit.com", true */ 'z', 'y', 'm', 'b', 'i', 't', '.', 'c', 'o', 'm', '\0', @@ -18460,18229 +18445,18214 @@ static const nsSTSPreload kSTSPreloadList[] = { { 1270, true }, { 1282, true }, { 1293, true }, - { 1303, true }, - { 1312, true }, - { 1318, true }, - { 1332, true }, - { 1347, true }, - { 1355, true }, - { 1364, true }, - { 1372, true }, + { 1302, true }, + { 1308, true }, + { 1322, true }, + { 1337, true }, + { 1345, true }, + { 1354, true }, + { 1362, true }, + { 1373, true }, { 1383, true }, - { 1393, true }, - { 1411, true }, - { 1429, true }, - { 1438, true }, - { 1446, true }, - { 1454, false }, - { 1465, true }, - { 1483, true }, - { 1494, true }, - { 1506, true }, - { 1520, true }, - { 1528, true }, - { 1541, true }, - { 1551, false }, - { 1564, true }, - { 1573, true }, - { 1587, true }, - { 1596, true }, - { 1617, true }, - { 1626, true }, + { 1401, true }, + { 1419, true }, + { 1428, true }, + { 1436, true }, + { 1444, false }, + { 1455, true }, + { 1473, true }, + { 1484, true }, + { 1496, true }, + { 1510, true }, + { 1518, true }, + { 1531, true }, + { 1541, false }, + { 1554, true }, + { 1563, true }, + { 1577, true }, + { 1586, true }, + { 1607, true }, + { 1616, true }, + { 1628, true }, { 1638, true }, - { 1648, true }, - { 1663, true }, - { 1671, true }, - { 1688, true }, - { 1701, true }, - { 1718, false }, - { 1730, true }, - { 1738, true }, - { 1749, true }, - { 1756, true }, - { 1765, true }, - { 1774, true }, - { 1787, true }, - { 1796, true }, - { 1815, true }, - { 1826, true }, - { 1845, true }, - { 1864, true }, - { 1876, true }, - { 1890, true }, - { 1902, false }, - { 1913, true }, - { 1922, false }, - { 1933, true }, - { 1948, true }, - { 1961, true }, - { 1969, true }, - { 1983, true }, - { 1998, true }, - { 2010, true }, - { 2023, true }, - { 2038, true }, + { 1653, true }, + { 1661, true }, + { 1678, true }, + { 1691, true }, + { 1708, false }, + { 1720, true }, + { 1728, true }, + { 1739, true }, + { 1746, true }, + { 1755, true }, + { 1764, true }, + { 1777, true }, + { 1786, true }, + { 1805, true }, + { 1816, true }, + { 1835, true }, + { 1854, true }, + { 1866, true }, + { 1880, true }, + { 1892, false }, + { 1903, true }, + { 1912, false }, + { 1923, true }, + { 1938, true }, + { 1951, true }, + { 1959, true }, + { 1973, true }, + { 1988, true }, + { 2000, true }, + { 2013, true }, + { 2028, true }, + { 2037, true }, { 2047, true }, - { 2057, true }, - { 2071, true }, - { 2085, true }, - { 2094, true }, - { 2108, true }, - { 2116, true }, - { 2123, true }, - { 2134, true }, - { 2147, true }, - { 2156, true }, - { 2168, true }, - { 2185, true }, - { 2196, true }, - { 2207, true }, - { 2217, true }, - { 2228, true }, - { 2239, true }, - { 2252, true }, - { 2260, true }, - { 2271, false }, - { 2284, true }, + { 2061, true }, + { 2075, true }, + { 2084, true }, + { 2098, true }, + { 2106, true }, + { 2113, true }, + { 2124, true }, + { 2137, true }, + { 2146, true }, + { 2158, true }, + { 2169, true }, + { 2180, true }, + { 2190, true }, + { 2201, true }, + { 2212, true }, + { 2225, true }, + { 2233, true }, + { 2244, false }, + { 2257, true }, + { 2265, true }, + { 2277, true }, { 2292, true }, - { 2304, true }, - { 2319, true }, - { 2338, true }, - { 2349, true }, - { 2356, true }, - { 2366, true }, - { 2372, true }, + { 2311, true }, + { 2322, true }, + { 2329, true }, + { 2339, true }, + { 2345, true }, + { 2354, true }, + { 2367, true }, { 2381, true }, - { 2394, true }, - { 2408, true }, - { 2420, true }, - { 2429, true }, + { 2393, true }, + { 2402, true }, + { 2415, true }, + { 2425, true }, + { 2435, false }, { 2442, true }, - { 2452, true }, - { 2462, false }, - { 2469, true }, + { 2453, true }, + { 2465, true }, + { 2473, true }, { 2480, true }, - { 2492, true }, - { 2500, true }, - { 2507, true }, - { 2516, true }, - { 2526, true }, - { 2545, true }, - { 2557, true }, - { 2566, true }, - { 2587, true }, - { 2611, true }, - { 2626, true }, - { 2634, true }, - { 2645, true }, - { 2651, true }, - { 2664, true }, - { 2676, true }, - { 2688, true }, - { 2696, true }, + { 2489, true }, + { 2499, true }, + { 2518, true }, + { 2530, true }, + { 2539, true }, + { 2560, true }, + { 2584, true }, + { 2599, true }, + { 2607, true }, + { 2618, true }, + { 2624, true }, + { 2637, true }, + { 2649, true }, + { 2661, true }, + { 2669, true }, + { 2685, true }, + { 2695, true }, { 2712, true }, - { 2722, true }, - { 2739, true }, - { 2746, true }, - { 2755, true }, - { 2776, true }, - { 2789, false }, - { 2802, true }, - { 2812, true }, - { 2865, true }, - { 2877, true }, - { 2886, true }, - { 2895, true }, - { 2905, true }, - { 2915, true }, + { 2719, true }, + { 2728, true }, + { 2749, true }, + { 2762, false }, + { 2775, true }, + { 2785, true }, + { 2838, true }, + { 2850, true }, + { 2859, true }, + { 2868, true }, + { 2878, true }, + { 2888, true }, + { 2899, true }, + { 2907, true }, + { 2914, true }, { 2926, true }, - { 2934, true }, - { 2941, true }, - { 2953, true }, - { 2962, true }, - { 2984, true }, - { 3000, true }, - { 3024, true }, - { 3034, true }, - { 3045, true }, - { 3064, true }, - { 3075, true }, - { 3089, true }, - { 3103, true }, - { 3113, true }, - { 3124, true }, - { 3133, true }, - { 3146, true }, - { 3161, true }, - { 3176, true }, - { 3184, true }, - { 3201, true }, - { 3216, true }, + { 2935, true }, + { 2957, true }, + { 2973, true }, + { 2997, true }, + { 3007, true }, + { 3018, true }, + { 3037, true }, + { 3048, true }, + { 3062, true }, + { 3076, true }, + { 3086, true }, + { 3097, true }, + { 3106, true }, + { 3119, true }, + { 3134, true }, + { 3149, true }, + { 3157, true }, + { 3174, true }, + { 3189, true }, + { 3204, true }, + { 3219, true }, { 3231, true }, - { 3246, true }, - { 3258, true }, - { 3274, true }, - { 3284, true }, - { 3291, true }, - { 3302, true }, - { 3317, true }, - { 3327, true }, - { 3355, true }, - { 3369, true }, - { 3389, true }, - { 3408, true }, - { 3418, true }, - { 3429, true }, - { 3447, true }, + { 3247, true }, + { 3257, true }, + { 3264, true }, + { 3275, true }, + { 3290, true }, + { 3300, true }, + { 3328, true }, + { 3342, true }, + { 3362, true }, + { 3381, true }, + { 3391, true }, + { 3402, true }, + { 3420, true }, + { 3431, true }, + { 3445, true }, { 3458, true }, - { 3472, true }, - { 3485, true }, - { 3497, true }, - { 3519, true }, - { 3535, true }, - { 3546, false }, - { 3562, false }, - { 3574, true }, - { 3587, true }, - { 3604, true }, - { 3629, true }, - { 3646, false }, - { 3654, true }, - { 3663, true }, - { 3687, true }, - { 3700, true }, - { 3712, true }, - { 3723, true }, - { 3741, true }, - { 3765, true }, - { 3772, true }, - { 3785, true }, - { 3798, true }, - { 3807, true }, - { 3824, true }, - { 3843, true }, - { 3855, true }, - { 3874, true }, - { 3897, true }, - { 3920, true }, - { 3934, true }, - { 3942, true }, - { 3966, true }, - { 3982, true }, - { 3995, true }, - { 4012, true }, - { 4032, true }, - { 4045, true }, - { 4063, true }, - { 4078, true }, - { 4099, true }, - { 4119, true }, - { 4144, true }, - { 4156, true }, - { 4167, true }, - { 4186, true }, - { 4205, true }, - { 4215, false }, - { 4222, true }, - { 4235, true }, - { 4256, true }, - { 4268, true }, - { 4285, true }, - { 4298, true }, - { 4314, true }, - { 4335, true }, - { 4347, true }, - { 4358, true }, - { 4371, false }, - { 4380, true }, - { 4396, false }, - { 4406, true }, - { 4421, true }, - { 4438, true }, + { 3470, true }, + { 3492, true }, + { 3508, true }, + { 3519, false }, + { 3535, false }, + { 3547, true }, + { 3560, true }, + { 3577, true }, + { 3602, true }, + { 3619, false }, + { 3627, true }, + { 3636, true }, + { 3660, true }, + { 3673, true }, + { 3685, true }, + { 3696, true }, + { 3714, true }, + { 3738, true }, + { 3745, true }, + { 3758, true }, + { 3771, true }, + { 3780, true }, + { 3797, true }, + { 3816, true }, + { 3828, true }, + { 3847, true }, + { 3870, true }, + { 3893, true }, + { 3907, true }, + { 3915, true }, + { 3939, true }, + { 3955, true }, + { 3968, true }, + { 3985, true }, + { 4005, true }, + { 4018, true }, + { 4036, true }, + { 4051, true }, + { 4072, true }, + { 4092, true }, + { 4117, true }, + { 4129, true }, + { 4140, true }, + { 4159, true }, + { 4178, true }, + { 4188, false }, + { 4195, true }, + { 4208, true }, + { 4229, true }, + { 4241, true }, + { 4258, true }, + { 4271, true }, + { 4287, true }, + { 4308, true }, + { 4320, true }, + { 4331, true }, + { 4344, false }, + { 4353, true }, + { 4369, false }, + { 4379, true }, + { 4394, true }, + { 4411, true }, + { 4422, true }, + { 4436, true }, { 4449, true }, - { 4463, true }, + { 4465, true }, { 4476, true }, - { 4492, true }, - { 4503, true }, - { 4515, true }, - { 4527, true }, - { 4548, false }, - { 4558, true }, - { 4573, false }, - { 4586, true }, - { 4595, true }, - { 4610, true }, - { 4626, true }, - { 4640, true }, - { 4652, true }, + { 4488, true }, + { 4500, true }, + { 4521, false }, + { 4531, true }, + { 4546, true }, + { 4560, false }, + { 4573, true }, + { 4582, true }, + { 4597, true }, + { 4613, true }, + { 4627, true }, + { 4639, true }, + { 4654, true }, { 4667, true }, - { 4680, true }, - { 4692, true }, - { 4704, true }, - { 4716, true }, - { 4728, true }, - { 4740, true }, - { 4748, true }, - { 4759, true }, + { 4679, true }, + { 4691, true }, + { 4703, true }, + { 4715, true }, + { 4727, true }, + { 4735, true }, + { 4746, true }, + { 4760, true }, { 4776, true }, { 4790, true }, - { 4806, true }, + { 4803, true }, { 4820, true }, - { 4833, true }, + { 4835, true }, { 4850, true }, - { 4866, true }, - { 4881, true }, - { 4896, true }, - { 4914, true }, - { 4923, true }, - { 4936, true }, - { 4951, true }, - { 4972, true }, + { 4868, true }, + { 4877, true }, + { 4890, true }, + { 4905, true }, + { 4926, true }, + { 4935, true }, + { 4945, true }, + { 4970, true }, { 4981, true }, - { 4991, true }, - { 5016, true }, - { 5027, true }, - { 5039, true }, - { 5058, true }, - { 5070, true }, - { 5089, true }, - { 5108, true }, - { 5127, true }, - { 5138, true }, - { 5150, true }, - { 5165, true }, - { 5176, true }, - { 5189, true }, - { 5201, true }, - { 5214, true }, - { 5228, true }, - { 5243, true }, - { 5265, true }, - { 5275, true }, - { 5297, true }, - { 5306, true }, - { 5319, true }, - { 5333, true }, - { 5345, true }, - { 5358, true }, - { 5385, true }, - { 5411, true }, - { 5422, true }, - { 5435, true }, - { 5446, true }, - { 5470, true }, - { 5487, true }, - { 5515, true }, - { 5527, true }, - { 5538, true }, - { 5547, true }, - { 5557, true }, + { 4993, true }, + { 5012, true }, + { 5024, true }, + { 5043, true }, + { 5062, true }, + { 5081, true }, + { 5092, true }, + { 5104, true }, + { 5119, true }, + { 5130, true }, + { 5143, true }, + { 5155, true }, + { 5168, true }, + { 5182, true }, + { 5197, true }, + { 5219, true }, + { 5229, true }, + { 5251, true }, + { 5260, true }, + { 5273, true }, + { 5287, true }, + { 5299, true }, + { 5312, true }, + { 5339, true }, + { 5365, true }, + { 5376, true }, + { 5389, true }, + { 5400, true }, + { 5424, true }, + { 5441, true }, + { 5469, true }, + { 5481, true }, + { 5492, true }, + { 5501, true }, + { 5511, true }, + { 5525, true }, + { 5544, true }, + { 5554, true }, { 5571, true }, - { 5590, true }, - { 5600, true }, - { 5617, true }, - { 5629, true }, - { 5643, true }, - { 5651, false }, - { 5672, true }, - { 5690, true }, - { 5711, true }, - { 5722, true }, - { 5735, true }, - { 5746, true }, - { 5755, true }, - { 5771, true }, - { 5787, true }, - { 5806, true }, + { 5583, true }, + { 5597, true }, + { 5605, false }, + { 5626, true }, + { 5644, true }, + { 5665, true }, + { 5676, true }, + { 5689, true }, + { 5700, true }, + { 5709, true }, + { 5725, true }, + { 5741, true }, + { 5760, true }, + { 5781, true }, + { 5795, true }, + { 5814, true }, { 5827, true }, - { 5841, true }, - { 5860, true }, - { 5873, true }, - { 5884, true }, - { 5904, true }, - { 5922, true }, - { 5940, false }, - { 5959, true }, - { 5973, true }, + { 5838, true }, + { 5858, true }, + { 5876, true }, + { 5894, false }, + { 5913, true }, + { 5927, true }, + { 5948, true }, + { 5968, true }, + { 5984, true }, { 5994, true }, - { 6014, true }, - { 6030, true }, - { 6040, true }, - { 6053, true }, - { 6066, true }, - { 6080, true }, - { 6094, true }, - { 6104, true }, - { 6114, true }, - { 6124, true }, - { 6134, true }, - { 6144, true }, + { 6007, true }, + { 6020, true }, + { 6034, true }, + { 6048, true }, + { 6058, true }, + { 6068, true }, + { 6078, true }, + { 6088, true }, + { 6098, true }, + { 6108, true }, + { 6125, true }, + { 6135, false }, + { 6143, true }, { 6154, true }, - { 6171, true }, - { 6181, false }, - { 6189, true }, + { 6165, true }, + { 6177, true }, + { 6188, true }, { 6200, true }, { 6211, true }, - { 6223, true }, - { 6234, true }, - { 6246, true }, - { 6257, true }, - { 6275, true }, - { 6284, true }, - { 6304, true }, - { 6315, true }, - { 6332, true }, - { 6356, true }, - { 6370, true }, - { 6389, true }, - { 6411, true }, - { 6421, true }, - { 6433, true }, - { 6449, true }, - { 6460, true }, - { 6468, true }, - { 6482, true }, - { 6498, true }, - { 6513, true }, - { 6522, true }, - { 6537, true }, - { 6545, true }, - { 6554, true }, - { 6571, true }, - { 6580, true }, - { 6599, true }, - { 6616, true }, - { 6624, false }, - { 6640, true }, - { 6658, true }, + { 6229, true }, + { 6238, true }, + { 6258, true }, + { 6269, true }, + { 6286, true }, + { 6310, true }, + { 6324, true }, + { 6343, true }, + { 6365, true }, + { 6375, true }, + { 6387, true }, + { 6403, true }, + { 6414, true }, + { 6422, true }, + { 6436, true }, + { 6452, true }, + { 6461, true }, + { 6476, true }, + { 6484, true }, + { 6493, true }, + { 6510, true }, + { 6519, true }, + { 6538, true }, + { 6555, true }, + { 6563, false }, + { 6579, true }, + { 6597, true }, + { 6608, true }, + { 6621, true }, + { 6629, true }, + { 6643, false }, + { 6657, true }, { 6669, true }, - { 6682, true }, - { 6690, true }, - { 6704, false }, - { 6718, true }, + { 6679, false }, + { 6692, true }, + { 6704, true }, + { 6716, true }, { 6730, true }, - { 6740, false }, - { 6753, true }, - { 6765, true }, - { 6777, true }, + { 6743, true }, + { 6755, true }, + { 6771, true }, + { 6781, false }, { 6791, true }, - { 6804, true }, - { 6816, true }, - { 6832, true }, - { 6842, false }, - { 6852, true }, - { 6860, true }, - { 6870, true }, - { 6884, true }, - { 6897, true }, - { 6905, true }, - { 6917, true }, - { 6929, true }, + { 6799, true }, + { 6809, true }, + { 6823, true }, + { 6836, true }, + { 6844, true }, + { 6856, true }, + { 6868, true }, + { 6892, true }, + { 6911, true }, + { 6930, false }, + { 6939, true }, { 6953, true }, - { 6972, true }, - { 6991, false }, - { 7000, true }, - { 7014, true }, - { 7024, true }, - { 7057, true }, - { 7067, true }, - { 7081, true }, - { 7088, true }, - { 7100, true }, - { 7113, true }, - { 7124, true }, - { 7141, true }, - { 7152, true }, - { 7168, true }, - { 7177, true }, - { 7184, true }, - { 7198, true }, - { 7206, true }, - { 7217, true }, - { 7235, true }, - { 7250, true }, - { 7265, true }, - { 7282, true }, - { 7295, true }, - { 7305, true }, + { 6963, true }, + { 6996, true }, + { 7006, true }, + { 7020, true }, + { 7027, true }, + { 7039, true }, + { 7052, true }, + { 7063, true }, + { 7080, true }, + { 7091, true }, + { 7107, true }, + { 7116, true }, + { 7123, true }, + { 7137, true }, + { 7145, true }, + { 7156, true }, + { 7174, true }, + { 7189, true }, + { 7204, true }, + { 7221, true }, + { 7234, true }, + { 7244, true }, + { 7255, true }, + { 7270, true }, + { 7293, true }, + { 7304, true }, { 7316, true }, - { 7331, true }, - { 7354, true }, - { 7365, true }, - { 7377, true }, - { 7388, true }, - { 7408, true }, - { 7419, true }, - { 7430, true }, - { 7441, true }, - { 7452, true }, - { 7463, true }, - { 7476, true }, - { 7494, true }, - { 7506, true }, - { 7523, true }, - { 7532, true }, - { 7546, true }, - { 7557, true }, - { 7568, true }, - { 7585, true }, - { 7601, true }, - { 7612, true }, - { 7620, false }, - { 7646, false }, - { 7657, true }, - { 7675, false }, - { 7692, true }, - { 7702, true }, - { 7713, true }, - { 7726, true }, - { 7738, true }, - { 7747, true }, - { 7764, true }, - { 7771, true }, - { 7795, true }, - { 7811, true }, - { 7831, true }, - { 7856, true }, - { 7881, true }, - { 7906, true }, - { 7918, true }, - { 7928, true }, - { 7940, true }, - { 7949, true }, - { 7961, true }, - { 7988, true }, - { 8016, true }, - { 8029, false }, - { 8038, true }, - { 8054, true }, - { 8070, true }, - { 8082, true }, - { 8096, true }, - { 8116, true }, - { 8131, true }, - { 8152, true }, - { 8163, true }, - { 8173, true }, - { 8184, true }, - { 8196, true }, - { 8208, true }, - { 8217, true }, - { 8229, true }, - { 8248, true }, - { 8261, true }, + { 7327, true }, + { 7347, true }, + { 7358, true }, + { 7369, true }, + { 7380, true }, + { 7391, true }, + { 7402, true }, + { 7415, true }, + { 7433, true }, + { 7445, true }, + { 7462, true }, + { 7471, true }, + { 7485, true }, + { 7496, true }, + { 7507, true }, + { 7524, true }, + { 7540, true }, + { 7551, true }, + { 7559, false }, + { 7585, false }, + { 7596, true }, + { 7614, false }, + { 7631, true }, + { 7641, true }, + { 7652, true }, + { 7664, true }, + { 7673, true }, + { 7690, true }, + { 7697, true }, + { 7721, true }, + { 7737, true }, + { 7757, true }, + { 7782, true }, + { 7807, true }, + { 7832, true }, + { 7844, true }, + { 7854, true }, + { 7866, true }, + { 7875, true }, + { 7887, true }, + { 7914, true }, + { 7942, false }, + { 7951, true }, + { 7967, true }, + { 7983, true }, + { 7995, true }, + { 8009, true }, + { 8029, true }, + { 8044, true }, + { 8065, true }, + { 8076, true }, + { 8086, true }, + { 8097, true }, + { 8109, true }, + { 8121, true }, + { 8130, true }, + { 8142, true }, + { 8161, true }, + { 8174, true }, + { 8185, true }, + { 8194, true }, + { 8212, true }, + { 8226, true }, + { 8240, true }, + { 8256, true }, { 8272, true }, - { 8281, true }, - { 8299, true }, + { 8292, true }, { 8313, true }, { 8327, true }, - { 8343, true }, - { 8359, true }, - { 8379, true }, - { 8400, true }, - { 8414, true }, - { 8427, true }, - { 8442, true }, - { 8452, true }, - { 8470, true }, - { 8485, true }, - { 8495, true }, - { 8510, true }, + { 8340, true }, + { 8355, true }, + { 8365, true }, + { 8383, true }, + { 8398, true }, + { 8416, true }, + { 8426, true }, + { 8441, true }, + { 8459, true }, + { 8473, true }, + { 8487, true }, + { 8501, true }, + { 8513, true }, { 8528, true }, { 8542, true }, - { 8556, true }, - { 8570, true }, - { 8582, true }, - { 8597, true }, - { 8611, true }, - { 8626, true }, - { 8636, true }, - { 8650, true }, - { 8659, true }, - { 8674, true }, - { 8688, true }, - { 8702, true }, - { 8714, true }, - { 8727, false }, + { 8557, true }, + { 8567, true }, + { 8581, true }, + { 8590, true }, + { 8605, true }, + { 8619, true }, + { 8633, true }, + { 8649, true }, + { 8661, true }, + { 8674, false }, + { 8689, true }, + { 8716, true }, + { 8728, true }, { 8742, true }, - { 8769, true }, + { 8752, true }, + { 8767, true }, { 8781, true }, { 8795, true }, - { 8805, true }, - { 8820, true }, - { 8834, true }, - { 8848, true }, - { 8870, true }, - { 8882, true }, - { 8905, true }, - { 8926, true }, - { 8938, true }, - { 8950, true }, + { 8817, true }, + { 8829, true }, + { 8852, true }, + { 8873, true }, + { 8885, true }, + { 8897, true }, + { 8910, true }, + { 8921, true }, + { 8936, true }, + { 8947, false }, { 8963, true }, - { 8974, true }, - { 8989, true }, - { 9000, false }, - { 9016, true }, - { 9034, true }, - { 9045, true }, - { 9057, true }, - { 9070, true }, - { 9090, true }, - { 9103, true }, - { 9116, true }, - { 9140, true }, - { 9158, true }, - { 9175, true }, - { 9199, true }, - { 9223, true }, - { 9242, true }, + { 8981, true }, + { 8992, true }, + { 9004, true }, + { 9017, true }, + { 9037, true }, + { 9050, true }, + { 9063, true }, + { 9087, true }, + { 9105, true }, + { 9122, true }, + { 9146, true }, + { 9170, true }, + { 9189, true }, + { 9205, true }, + { 9219, true }, + { 9228, true }, + { 9241, true }, { 9258, true }, - { 9272, true }, - { 9281, true }, - { 9294, true }, - { 9311, true }, + { 9279, true }, + { 9295, true }, + { 9316, true }, { 9332, true }, - { 9348, true }, - { 9369, true }, + { 9351, true }, + { 9364, true }, { 9385, true }, - { 9404, true }, - { 9417, true }, - { 9438, true }, - { 9458, true }, - { 9478, true }, - { 9494, true }, - { 9507, false }, - { 9520, true }, + { 9405, true }, + { 9425, true }, + { 9441, true }, + { 9454, false }, + { 9467, true }, + { 9479, true }, + { 9489, true }, + { 9502, true }, + { 9516, true }, { 9532, true }, - { 9542, true }, - { 9555, true }, - { 9569, true }, - { 9585, true }, - { 9599, true }, - { 9615, true }, - { 9627, true }, - { 9641, true }, - { 9658, true }, - { 9669, true }, - { 9688, true }, - { 9701, true }, - { 9715, true }, - { 9723, true }, - { 9736, true }, - { 9749, true }, - { 9764, true }, - { 9778, true }, - { 9795, true }, - { 9814, true }, - { 9826, true }, - { 9840, true }, - { 9862, true }, - { 9876, true }, - { 9888, true }, - { 9900, true }, - { 9914, true }, - { 9942, true }, - { 9957, true }, - { 9969, true }, - { 9980, true }, - { 9991, true }, - { 10005, true }, - { 10017, true }, - { 10025, true }, - { 10036, true }, - { 10044, true }, - { 10052, true }, - { 10060, true }, - { 10068, true }, - { 10081, true }, - { 10088, true }, - { 10098, true }, - { 10111, true }, - { 10123, true }, - { 10136, true }, - { 10156, true }, - { 10168, true }, - { 10180, true }, - { 10198, true }, - { 10213, true }, - { 10226, true }, - { 10235, true }, - { 10248, true }, - { 10260, true }, - { 10274, true }, - { 10287, true }, - { 10298, true }, - { 10308, true }, - { 10319, true }, - { 10329, true }, - { 10340, true }, - { 10349, true }, - { 10365, true }, - { 10381, true }, - { 10409, true }, - { 10428, true }, - { 10443, true }, + { 9546, true }, + { 9562, true }, + { 9574, true }, + { 9588, true }, + { 9605, true }, + { 9616, true }, + { 9635, true }, + { 9648, true }, + { 9662, true }, + { 9670, true }, + { 9683, true }, + { 9696, true }, + { 9711, true }, + { 9725, true }, + { 9742, true }, + { 9761, true }, + { 9775, true }, + { 9797, true }, + { 9811, true }, + { 9823, true }, + { 9835, true }, + { 9849, true }, + { 9877, true }, + { 9892, true }, + { 9904, true }, + { 9915, true }, + { 9926, true }, + { 9940, true }, + { 9952, true }, + { 9960, true }, + { 9971, true }, + { 9979, true }, + { 9987, true }, + { 9995, true }, + { 10003, true }, + { 10016, true }, + { 10023, true }, + { 10033, true }, + { 10046, true }, + { 10058, true }, + { 10071, true }, + { 10091, true }, + { 10103, true }, + { 10115, true }, + { 10133, true }, + { 10148, true }, + { 10161, true }, + { 10170, true }, + { 10183, true }, + { 10195, true }, + { 10209, true }, + { 10222, true }, + { 10233, true }, + { 10243, true }, + { 10254, true }, + { 10264, true }, + { 10275, true }, + { 10284, true }, + { 10300, true }, + { 10316, true }, + { 10344, true }, + { 10363, true }, + { 10378, true }, + { 10398, true }, + { 10410, true }, + { 10422, true }, + { 10435, true }, + { 10444, true }, + { 10453, true }, { 10463, true }, - { 10475, true }, - { 10487, true }, - { 10500, true }, - { 10509, true }, - { 10518, true }, + { 10482, true }, + { 10493, true }, + { 10508, true }, { 10528, true }, - { 10547, true }, - { 10558, true }, - { 10573, true }, - { 10593, true }, + { 10546, true }, + { 10556, true }, + { 10583, true }, + { 10600, true }, { 10611, true }, { 10621, true }, - { 10648, true }, - { 10665, true }, - { 10676, true }, - { 10686, true }, - { 10700, true }, - { 10717, true }, - { 10726, true }, - { 10737, true }, - { 10757, true }, - { 10776, true }, - { 10787, true }, - { 10798, true }, - { 10816, false }, - { 10827, true }, - { 10846, true }, - { 10864, true }, - { 10882, true }, + { 10635, true }, + { 10652, true }, + { 10661, true }, + { 10672, true }, + { 10692, true }, + { 10711, true }, + { 10722, true }, + { 10733, true }, + { 10751, false }, + { 10762, true }, + { 10781, true }, + { 10799, true }, + { 10817, true }, + { 10839, true }, + { 10861, true }, + { 10875, true }, + { 10890, true }, { 10904, true }, - { 10926, true }, - { 10940, true }, - { 10955, true }, - { 10969, true }, - { 10983, true }, - { 10998, true }, - { 11019, true }, + { 10918, true }, + { 10933, true }, + { 10954, true }, + { 10964, true }, + { 10979, true }, + { 10990, true }, + { 11011, true }, { 11029, true }, - { 11044, true }, - { 11055, true }, - { 11076, true }, - { 11094, true }, - { 11105, true }, - { 11123, true }, + { 11040, true }, + { 11058, true }, + { 11071, true }, + { 11079, true }, + { 11096, true }, + { 11109, true }, + { 11124, true }, { 11136, true }, - { 11144, true }, - { 11161, true }, - { 11174, true }, - { 11189, true }, - { 11201, true }, - { 11215, true }, - { 11234, true }, - { 11252, true }, - { 11274, true }, - { 11289, true }, - { 11306, true }, - { 11328, true }, - { 11343, true }, - { 11360, true }, - { 11381, true }, - { 11397, true }, + { 11150, true }, + { 11169, true }, + { 11187, true }, + { 11209, true }, + { 11224, true }, + { 11241, true }, + { 11263, true }, + { 11278, true }, + { 11295, true }, + { 11316, true }, + { 11332, true }, + { 11359, true }, + { 11375, true }, + { 11392, true }, + { 11409, true }, { 11424, true }, - { 11440, true }, - { 11457, true }, - { 11474, true }, - { 11489, true }, - { 11504, true }, - { 11518, true }, - { 11532, true }, - { 11549, true }, - { 11561, true }, - { 11579, true }, - { 11596, true }, - { 11610, true }, - { 11627, true }, - { 11645, true }, - { 11660, true }, - { 11672, true }, - { 11688, true }, - { 11702, true }, - { 11715, true }, - { 11732, true }, - { 11752, true }, - { 11772, true }, - { 11787, true }, - { 11798, true }, - { 11809, true }, - { 11820, true }, - { 11836, true }, - { 11851, true }, - { 11862, true }, - { 11879, true }, - { 11895, true }, - { 11906, true }, - { 11917, true }, - { 11929, true }, - { 11942, true }, - { 11961, true }, - { 11972, true }, - { 11985, true }, - { 11999, true }, - { 12017, false }, - { 12030, true }, + { 11439, true }, + { 11453, true }, + { 11467, true }, + { 11484, true }, + { 11496, true }, + { 11514, true }, + { 11531, true }, + { 11545, true }, + { 11562, true }, + { 11580, true }, + { 11595, true }, + { 11607, true }, + { 11623, true }, + { 11637, true }, + { 11650, true }, + { 11667, true }, + { 11687, true }, + { 11707, true }, + { 11722, true }, + { 11733, true }, + { 11744, true }, + { 11755, true }, + { 11771, true }, + { 11786, true }, + { 11797, true }, + { 11814, true }, + { 11830, true }, + { 11841, true }, + { 11852, true }, + { 11864, true }, + { 11877, true }, + { 11896, true }, + { 11907, true }, + { 11920, true }, + { 11934, true }, + { 11952, false }, + { 11965, true }, + { 11987, true }, + { 12004, true }, + { 12021, true }, + { 12041, true }, { 12052, true }, - { 12069, true }, - { 12086, true }, - { 12106, true }, - { 12117, true }, - { 12128, true }, - { 12146, true }, - { 12178, true }, - { 12205, true }, - { 12217, true }, - { 12227, true }, - { 12245, true }, - { 12260, true }, - { 12272, true }, - { 12284, true }, - { 12304, true }, - { 12323, true }, - { 12343, true }, - { 12366, false }, - { 12390, true }, - { 12402, true }, - { 12413, true }, - { 12425, true }, - { 12437, true }, - { 12453, true }, - { 12470, true }, - { 12489, true }, - { 12503, true }, - { 12514, true }, + { 12063, true }, + { 12081, true }, + { 12113, true }, + { 12140, true }, + { 12152, true }, + { 12162, true }, + { 12180, true }, + { 12195, true }, + { 12207, true }, + { 12219, true }, + { 12239, true }, + { 12258, true }, + { 12278, true }, + { 12301, false }, + { 12325, true }, + { 12337, true }, + { 12348, true }, + { 12360, true }, + { 12372, true }, + { 12388, true }, + { 12405, true }, + { 12424, true }, + { 12438, true }, + { 12449, true }, + { 12465, true }, + { 12484, true }, + { 12497, true }, + { 12507, true }, + { 12517, true }, { 12530, true }, - { 12549, true }, - { 12562, true }, - { 12572, true }, - { 12582, true }, - { 12595, true }, - { 12607, false }, + { 12542, false }, + { 12566, true }, + { 12585, true }, + { 12599, true }, + { 12615, true }, { 12631, true }, - { 12650, true }, - { 12664, true }, - { 12680, true }, - { 12696, true }, - { 12708, true }, - { 12719, true }, - { 12735, true }, - { 12752, true }, - { 12766, true }, - { 12781, true }, - { 12796, true }, - { 12807, true }, - { 12825, true }, - { 12841, true }, - { 12855, true }, - { 12870, true }, - { 12880, true }, - { 12893, true }, - { 12910, false }, + { 12643, true }, + { 12654, true }, + { 12670, true }, + { 12687, true }, + { 12701, true }, + { 12716, true }, + { 12731, true }, + { 12742, true }, + { 12760, true }, + { 12776, true }, + { 12790, true }, + { 12805, true }, + { 12815, true }, + { 12828, true }, + { 12845, false }, + { 12852, true }, + { 12865, true }, + { 12878, true }, + { 12894, true }, + { 12905, true }, { 12917, true }, - { 12930, true }, - { 12943, true }, - { 12959, true }, - { 12970, true }, - { 12982, true }, - { 12993, true }, - { 13000, true }, - { 13008, false }, - { 13019, true }, - { 13030, true }, - { 13040, true }, - { 13053, false }, - { 13061, true }, - { 13071, true }, - { 13078, true }, - { 13092, false }, - { 13106, true }, - { 13122, true }, - { 13141, true }, - { 13166, true }, - { 13175, true }, - { 13186, true }, - { 13194, true }, - { 13224, true }, - { 13247, true }, - { 13260, true }, - { 13279, true }, - { 13291, true }, - { 13304, false }, - { 13323, true }, - { 13339, false }, - { 13355, true }, - { 13371, false }, - { 13386, false }, - { 13399, true }, + { 12928, true }, + { 12935, true }, + { 12943, false }, + { 12954, true }, + { 12965, true }, + { 12975, true }, + { 12988, false }, + { 12996, true }, + { 13006, true }, + { 13013, true }, + { 13027, false }, + { 13041, true }, + { 13057, true }, + { 13076, true }, + { 13101, true }, + { 13110, true }, + { 13121, true }, + { 13129, true }, + { 13159, true }, + { 13182, true }, + { 13195, true }, + { 13214, true }, + { 13226, true }, + { 13239, false }, + { 13258, true }, + { 13274, false }, + { 13290, true }, + { 13306, false }, + { 13321, false }, + { 13334, true }, + { 13350, true }, + { 13362, true }, + { 13381, true }, + { 13402, true }, { 13415, true }, - { 13427, true }, - { 13446, true }, - { 13467, true }, - { 13480, true }, - { 13489, true }, - { 13502, true }, - { 13516, true }, - { 13526, true }, - { 13537, true }, - { 13548, true }, - { 13560, true }, - { 13576, true }, - { 13593, false }, - { 13610, true }, - { 13632, true }, - { 13658, true }, - { 13671, true }, - { 13680, true }, - { 13694, true }, - { 13713, true }, - { 13734, true }, - { 13746, true }, - { 13760, true }, + { 13424, true }, + { 13437, true }, + { 13451, true }, + { 13461, true }, + { 13472, true }, + { 13483, true }, + { 13495, true }, + { 13511, true }, + { 13528, false }, + { 13545, true }, + { 13567, true }, + { 13593, true }, + { 13606, true }, + { 13615, true }, + { 13629, true }, + { 13648, true }, + { 13669, true }, + { 13681, true }, + { 13695, true }, + { 13719, true }, + { 13728, true }, + { 13741, true }, + { 13754, true }, + { 13768, true }, { 13784, true }, - { 13793, true }, - { 13806, true }, - { 13819, true }, - { 13833, true }, - { 13849, true }, - { 13866, true }, - { 13877, true }, - { 13886, true }, - { 13899, true }, - { 13912, true }, - { 13924, true }, - { 13945, false }, - { 13963, true }, - { 13986, true }, - { 14013, true }, - { 14032, false }, - { 14045, true }, - { 14057, true }, - { 14077, true }, - { 14088, true }, - { 14105, true }, - { 14117, true }, - { 14131, true }, - { 14139, true }, - { 14156, true }, - { 14168, true }, - { 14181, true }, + { 13801, true }, + { 13812, true }, + { 13821, true }, + { 13834, true }, + { 13847, true }, + { 13859, true }, + { 13880, false }, + { 13898, true }, + { 13921, true }, + { 13948, true }, + { 13967, false }, + { 13980, true }, + { 13992, true }, + { 14012, true }, + { 14023, true }, + { 14040, true }, + { 14052, true }, + { 14066, true }, + { 14074, true }, + { 14091, true }, + { 14103, true }, + { 14116, true }, + { 14132, true }, + { 14144, true }, + { 14162, true }, + { 14174, true }, { 14197, true }, - { 14209, true }, - { 14227, true }, - { 14239, true }, - { 14262, true }, - { 14275, true }, - { 14291, true }, - { 14297, true }, - { 14309, true }, - { 14319, true }, - { 14335, true }, - { 14347, true }, - { 14358, true }, - { 14368, true }, - { 14385, true }, - { 14404, true }, - { 14416, true }, - { 14428, true }, - { 14441, true }, - { 14467, true }, - { 14483, true }, - { 14496, true }, - { 14510, true }, - { 14520, true }, - { 14536, true }, + { 14210, true }, + { 14226, true }, + { 14232, true }, + { 14244, true }, + { 14254, true }, + { 14270, true }, + { 14282, true }, + { 14293, true }, + { 14303, true }, + { 14320, true }, + { 14339, true }, + { 14351, true }, + { 14363, true }, + { 14376, true }, + { 14402, true }, + { 14418, true }, + { 14431, true }, + { 14445, true }, + { 14455, true }, + { 14471, true }, + { 14490, true }, + { 14514, true }, + { 14542, true }, { 14555, true }, - { 14579, true }, - { 14607, true }, - { 14620, true }, - { 14634, true }, - { 14646, true }, - { 14657, true }, - { 14670, true }, - { 14679, true }, - { 14692, true }, - { 14704, true }, - { 14718, true }, - { 14734, true }, - { 14750, true }, - { 14770, true }, - { 14784, true }, - { 14792, true }, - { 14806, true }, - { 14824, true }, + { 14569, true }, + { 14581, true }, + { 14592, true }, + { 14605, true }, + { 14614, true }, + { 14627, true }, + { 14639, true }, + { 14653, true }, + { 14669, true }, + { 14685, true }, + { 14705, true }, + { 14719, true }, + { 14727, true }, + { 14741, true }, + { 14759, true }, + { 14779, true }, + { 14801, true }, + { 14813, true }, + { 14828, true }, { 14844, true }, - { 14866, true }, - { 14878, true }, - { 14893, true }, - { 14909, true }, - { 14923, false }, - { 14936, true }, - { 14951, true }, - { 14964, true }, - { 14982, true }, - { 14996, true }, + { 14858, false }, + { 14871, true }, + { 14886, true }, + { 14899, true }, + { 14917, true }, + { 14931, true }, + { 14940, true }, + { 14952, true }, + { 14970, true }, + { 14990, false }, { 15005, true }, - { 15017, true }, - { 15035, true }, - { 15055, false }, - { 15070, true }, - { 15083, true }, - { 15096, true }, - { 15106, true }, - { 15120, true }, - { 15146, true }, - { 15156, true }, - { 15170, true }, - { 15182, true }, - { 15200, true }, - { 15218, false }, - { 15234, true }, - { 15244, true }, - { 15256, true }, - { 15267, true }, - { 15280, true }, - { 15296, true }, - { 15318, true }, - { 15333, true }, - { 15344, true }, - { 15354, true }, - { 15376, true }, + { 15018, true }, + { 15031, true }, + { 15041, true }, + { 15055, true }, + { 15081, true }, + { 15091, true }, + { 15105, true }, + { 15117, true }, + { 15135, true }, + { 15153, false }, + { 15169, true }, + { 15179, true }, + { 15191, true }, + { 15202, true }, + { 15215, true }, + { 15231, true }, + { 15253, true }, + { 15268, true }, + { 15279, true }, + { 15289, true }, + { 15311, true }, + { 15326, true }, + { 15345, true }, + { 15358, true }, + { 15376, false }, { 15391, true }, - { 15410, true }, - { 15423, true }, - { 15441, false }, - { 15456, true }, - { 15476, true }, - { 15487, true }, - { 15499, true }, - { 15512, true }, - { 15532, true }, - { 15544, false }, - { 15558, true }, - { 15568, true }, - { 15581, true }, - { 15599, true }, - { 15613, true }, - { 15626, true }, - { 15639, true }, - { 15651, true }, - { 15665, true }, - { 15685, true }, - { 15698, true }, - { 15712, true }, - { 15725, true }, + { 15411, true }, + { 15422, true }, + { 15434, true }, + { 15447, true }, + { 15467, true }, + { 15479, false }, + { 15493, true }, + { 15503, true }, + { 15516, true }, + { 15534, true }, + { 15548, true }, + { 15561, true }, + { 15574, true }, + { 15586, true }, + { 15600, true }, + { 15620, true }, + { 15633, true }, + { 15647, true }, + { 15660, true }, + { 15672, true }, + { 15690, true }, + { 15702, true }, + { 15713, true }, + { 15724, true }, { 15737, true }, - { 15755, true }, - { 15767, true }, - { 15778, true }, - { 15789, true }, + { 15750, true }, + { 15765, true }, + { 15776, true }, + { 15787, true }, { 15802, true }, - { 15815, true }, - { 15830, true }, - { 15841, true }, - { 15852, true }, + { 15813, true }, + { 15823, true }, + { 15835, true }, + { 15856, true }, { 15867, true }, - { 15878, true }, - { 15888, true }, - { 15900, true }, - { 15921, true }, - { 15932, true }, - { 15941, true }, - { 15948, true }, + { 15876, true }, + { 15883, true }, + { 15897, true }, + { 15907, true }, + { 15920, true }, + { 15933, true }, + { 15945, true }, { 15962, true }, - { 15972, true }, - { 15985, true }, - { 15998, true }, - { 16010, true }, - { 16027, true }, - { 16038, true }, - { 16052, true }, - { 16062, true }, - { 16080, true }, - { 16090, true }, - { 16104, true }, + { 15973, true }, + { 15987, true }, + { 15997, true }, + { 16015, true }, + { 16029, true }, + { 16046, true }, + { 16060, true }, + { 16070, true }, + { 16086, true }, + { 16097, true }, { 16121, true }, - { 16135, true }, - { 16145, true }, - { 16161, true }, - { 16172, true }, - { 16196, true }, - { 16213, true }, - { 16230, true }, - { 16242, true }, - { 16258, true }, - { 16280, true }, - { 16306, true }, - { 16321, true }, - { 16334, true }, - { 16352, true }, - { 16363, true }, + { 16138, true }, + { 16155, true }, + { 16167, true }, + { 16183, true }, + { 16205, true }, + { 16231, true }, + { 16246, true }, + { 16259, true }, + { 16277, true }, + { 16288, true }, + { 16298, true }, + { 16308, true }, + { 16327, true }, + { 16347, true }, + { 16359, true }, { 16373, true }, - { 16383, true }, - { 16402, true }, - { 16422, true }, - { 16434, true }, - { 16448, true }, - { 16455, true }, - { 16465, true }, - { 16475, true }, - { 16490, true }, - { 16515, true }, - { 16537, true }, - { 16549, true }, - { 16567, true }, - { 16579, true }, - { 16592, true }, - { 16612, true }, - { 16640, true }, - { 16650, true }, - { 16660, true }, - { 16668, true }, - { 16680, true }, - { 16689, false }, - { 16709, true }, + { 16380, true }, + { 16390, true }, + { 16400, true }, + { 16425, true }, + { 16447, true }, + { 16459, true }, + { 16477, true }, + { 16489, true }, + { 16502, true }, + { 16522, true }, + { 16550, true }, + { 16560, true }, + { 16570, true }, + { 16578, true }, + { 16590, true }, + { 16599, false }, + { 16619, true }, + { 16626, true }, + { 16642, true }, + { 16658, true }, + { 16673, true }, + { 16683, true }, + { 16701, true }, { 16716, true }, - { 16732, true }, - { 16748, true }, - { 16763, true }, - { 16773, true }, - { 16791, true }, - { 16806, true }, - { 16833, true }, - { 16850, true }, - { 16868, true }, - { 16876, true }, - { 16890, true }, - { 16901, true }, - { 16910, true }, - { 16937, true }, - { 16945, true }, - { 16955, true }, - { 16971, true }, - { 16983, true }, - { 16998, true }, - { 17010, true }, - { 17025, true }, - { 17040, true }, - { 17052, true }, + { 16743, true }, + { 16760, true }, + { 16778, true }, + { 16786, true }, + { 16800, true }, + { 16811, true }, + { 16820, true }, + { 16847, true }, + { 16855, true }, + { 16865, true }, + { 16881, true }, + { 16893, true }, + { 16908, true }, + { 16920, true }, + { 16935, true }, + { 16950, true }, + { 16962, true }, + { 16985, true }, + { 17006, true }, + { 17026, true }, + { 17043, true }, + { 17061, true }, { 17075, true }, - { 17096, true }, - { 17116, true }, - { 17133, true }, - { 17151, true }, + { 17087, true }, + { 17101, true }, + { 17111, true }, + { 17125, true }, + { 17135, true }, + { 17150, true }, { 17165, true }, - { 17177, true }, - { 17191, true }, + { 17176, true }, + { 17189, true }, { 17201, true }, - { 17215, true }, - { 17225, true }, - { 17240, true }, - { 17255, true }, - { 17266, true }, - { 17279, true }, - { 17291, true }, - { 17304, true }, - { 17316, true }, - { 17324, true }, - { 17337, true }, - { 17355, true }, - { 17376, true }, - { 17397, true }, - { 17418, true }, - { 17432, true }, + { 17214, true }, + { 17226, true }, + { 17234, true }, + { 17247, true }, + { 17265, true }, + { 17286, true }, + { 17307, true }, + { 17328, true }, + { 17342, true }, + { 17358, true }, + { 17370, true }, + { 17382, true }, + { 17394, true }, + { 17406, true }, + { 17419, true }, + { 17429, true }, + { 17438, true }, { 17448, true }, - { 17460, true }, - { 17472, true }, - { 17484, true }, - { 17496, true }, - { 17509, true }, - { 17519, true }, - { 17528, true }, - { 17538, true }, - { 17553, true }, - { 17564, true }, - { 17579, true }, - { 17592, true }, - { 17611, true }, - { 17623, true }, + { 17463, true }, + { 17474, true }, + { 17489, true }, + { 17502, true }, + { 17521, true }, + { 17533, true }, + { 17549, true }, + { 17561, true }, + { 17577, true }, + { 17596, true }, + { 17615, true }, + { 17628, true }, { 17639, true }, - { 17651, true }, - { 17667, true }, - { 17686, true }, - { 17705, true }, - { 17718, true }, - { 17729, true }, - { 17740, true }, - { 17758, true }, - { 17788, true }, + { 17650, true }, + { 17668, true }, + { 17698, true }, + { 17721, true }, + { 17734, false }, + { 17742, true }, + { 17754, true }, + { 17771, true }, + { 17781, true }, + { 17795, true }, { 17811, true }, - { 17824, false }, - { 17832, true }, - { 17844, true }, - { 17861, true }, - { 17871, true }, - { 17885, true }, + { 17822, true }, + { 17851, true }, + { 17867, true }, + { 17883, true }, { 17901, true }, - { 17912, true }, - { 17941, true }, + { 17922, true }, + { 17934, true }, + { 17945, true }, { 17957, true }, - { 17973, true }, - { 17991, true }, - { 18012, true }, - { 18024, true }, - { 18035, true }, - { 18047, true }, - { 18059, true }, - { 18077, true }, - { 18095, true }, - { 18116, true }, - { 18141, true }, - { 18159, true }, - { 18170, true }, - { 18195, true }, - { 18208, true }, - { 18223, true }, - { 18240, true }, - { 18268, true }, - { 18291, true }, - { 18306, true }, - { 18319, true }, - { 18332, true }, - { 18345, true }, - { 18358, true }, - { 18371, true }, - { 18384, true }, - { 18413, true }, - { 18419, true }, - { 18435, true }, - { 18445, true }, - { 18457, true }, - { 18473, true }, - { 18490, true }, + { 17975, true }, + { 17993, true }, + { 18014, true }, + { 18039, true }, + { 18057, true }, + { 18068, true }, + { 18093, true }, + { 18106, true }, + { 18121, true }, + { 18138, true }, + { 18166, true }, + { 18189, true }, + { 18204, true }, + { 18217, true }, + { 18230, true }, + { 18243, true }, + { 18256, true }, + { 18269, true }, + { 18282, true }, + { 18311, true }, + { 18322, true }, + { 18338, true }, + { 18348, true }, + { 18360, true }, + { 18376, true }, + { 18393, true }, + { 18405, true }, + { 18418, true }, + { 18426, true }, + { 18437, true }, + { 18448, true }, + { 18466, true }, + { 18478, true }, + { 18493, true }, { 18502, true }, - { 18515, true }, - { 18523, true }, - { 18534, true }, - { 18545, true }, - { 18563, true }, - { 18575, true }, + { 18520, true }, + { 18529, true }, + { 18543, true }, + { 18565, true }, + { 18579, true }, { 18590, true }, - { 18599, true }, - { 18617, true }, - { 18626, true }, - { 18640, true }, - { 18662, true }, - { 18676, true }, - { 18687, true }, - { 18695, true }, - { 18705, true }, - { 18717, true }, - { 18725, true }, - { 18735, true }, - { 18750, true }, - { 18758, true }, - { 18768, true }, - { 18793, true }, - { 18809, true }, + { 18598, true }, + { 18608, true }, + { 18620, true }, + { 18628, true }, + { 18638, true }, + { 18653, true }, + { 18661, true }, + { 18671, true }, + { 18696, true }, + { 18712, true }, + { 18722, true }, + { 18746, true }, + { 18753, true }, + { 18770, true }, + { 18778, true }, + { 18789, true }, + { 18796, true }, + { 18808, true }, { 18819, true }, - { 18843, true }, - { 18850, true }, - { 18867, true }, - { 18875, true }, - { 18886, true }, - { 18893, true }, - { 18905, true }, - { 18916, true }, - { 18927, true }, - { 18939, true }, - { 18951, false }, - { 18960, true }, - { 18976, true }, - { 18989, true }, - { 18998, true }, - { 19019, true }, - { 19028, true }, - { 19043, true }, - { 19053, true }, - { 19065, true }, - { 19083, false }, - { 19099, true }, - { 19111, true }, - { 19122, true }, - { 19132, true }, - { 19142, true }, - { 19152, true }, - { 19164, true }, - { 19177, true }, - { 19190, true }, - { 19200, true }, - { 19214, true }, - { 19224, true }, - { 19232, true }, - { 19244, true }, - { 19256, true }, - { 19269, true }, - { 19285, true }, - { 19301, true }, - { 19312, false }, + { 18830, true }, + { 18842, true }, + { 18854, false }, + { 18863, true }, + { 18879, true }, + { 18892, true }, + { 18901, true }, + { 18922, true }, + { 18931, true }, + { 18946, true }, + { 18956, true }, + { 18968, true }, + { 18986, false }, + { 19002, true }, + { 19014, true }, + { 19025, true }, + { 19035, true }, + { 19045, true }, + { 19055, true }, + { 19067, true }, + { 19080, true }, + { 19093, true }, + { 19103, true }, + { 19117, true }, + { 19127, true }, + { 19135, true }, + { 19147, true }, + { 19159, true }, + { 19172, true }, + { 19188, true }, + { 19204, true }, + { 19215, false }, + { 19225, true }, + { 19242, true }, + { 19254, true }, + { 19268, true }, + { 19298, true }, + { 19313, false }, { 19322, true }, - { 19339, true }, - { 19351, true }, - { 19365, true }, - { 19395, true }, - { 19410, false }, - { 19419, true }, - { 19433, true }, - { 19447, true }, + { 19336, true }, + { 19350, true }, + { 19361, true }, + { 19373, true }, + { 19386, true }, + { 19410, true }, + { 19423, true }, + { 19435, true }, { 19458, true }, - { 19470, true }, - { 19483, true }, - { 19507, true }, - { 19520, true }, - { 19532, true }, - { 19555, true }, - { 19566, true }, - { 19598, true }, - { 19618, true }, - { 19636, true }, - { 19654, true }, - { 19669, true }, - { 19684, true }, - { 19699, true }, - { 19720, true }, - { 19744, true }, - { 19754, true }, - { 19764, true }, - { 19774, true }, - { 19785, true }, - { 19810, true }, - { 19839, true }, - { 19852, true }, - { 19862, true }, - { 19870, true }, - { 19879, true }, - { 19893, false }, + { 19469, true }, + { 19501, true }, + { 19521, true }, + { 19539, true }, + { 19557, true }, + { 19572, true }, + { 19587, true }, + { 19602, true }, + { 19623, true }, + { 19647, true }, + { 19657, true }, + { 19667, true }, + { 19677, true }, + { 19688, true }, + { 19713, true }, + { 19742, true }, + { 19755, true }, + { 19765, true }, + { 19773, true }, + { 19782, true }, + { 19796, false }, + { 19813, true }, + { 19825, true }, + { 19840, true }, + { 19847, true }, + { 19860, true }, + { 19872, true }, + { 19896, true }, { 19910, true }, - { 19922, true }, - { 19937, true }, - { 19944, true }, + { 19918, true }, + { 19942, true }, { 19957, true }, - { 19969, true }, - { 19993, true }, - { 20007, true }, - { 20015, true }, - { 20039, true }, - { 20054, true }, - { 20063, true }, - { 20076, true }, - { 20088, true }, - { 20099, true }, - { 20109, true }, + { 19966, true }, + { 19979, true }, + { 19991, true }, + { 20002, true }, + { 20012, true }, + { 20027, true }, + { 20044, true }, + { 20057, true }, + { 20073, true }, + { 20083, true }, + { 20096, true }, + { 20110, true }, { 20124, true }, - { 20141, true }, - { 20154, true }, - { 20170, true }, - { 20180, true }, - { 20193, true }, - { 20207, true }, - { 20221, true }, - { 20233, true }, - { 20253, true }, - { 20268, true }, - { 20284, true }, - { 20298, true }, - { 20313, true }, - { 20326, true }, - { 20342, true }, - { 20354, true }, - { 20366, true }, - { 20378, true }, - { 20389, true }, - { 20400, true }, - { 20411, true }, - { 20434, true }, - { 20449, true }, - { 20464, false }, - { 20479, false }, - { 20495, true }, - { 20517, true }, - { 20535, true }, - { 20552, true }, - { 20570, true }, - { 20581, true }, - { 20594, true }, - { 20611, true }, + { 20136, true }, + { 20156, true }, + { 20171, true }, + { 20187, true }, + { 20201, true }, + { 20216, true }, + { 20228, true }, + { 20240, true }, + { 20252, true }, + { 20263, true }, + { 20274, true }, + { 20285, true }, + { 20308, true }, + { 20323, true }, + { 20338, false }, + { 20353, false }, + { 20369, true }, + { 20391, true }, + { 20409, true }, + { 20426, true }, + { 20444, true }, + { 20455, true }, + { 20468, true }, + { 20485, true }, + { 20512, true }, + { 20528, true }, + { 20548, true }, + { 20563, true }, + { 20578, true }, + { 20592, true }, + { 20603, true }, + { 20626, true }, { 20638, true }, - { 20654, true }, - { 20674, true }, - { 20689, true }, - { 20704, true }, - { 20718, true }, - { 20729, true }, - { 20752, true }, - { 20764, true }, - { 20777, true }, - { 20790, true }, - { 20804, true }, - { 20817, true }, - { 20835, true }, + { 20651, true }, + { 20664, true }, + { 20678, true }, + { 20691, true }, + { 20709, true }, + { 20727, true }, + { 20745, true }, + { 20762, true }, + { 20772, true }, + { 20785, true }, + { 20794, true }, + { 20805, false }, + { 20815, true }, + { 20826, true }, + { 20840, true }, { 20853, true }, - { 20871, true }, - { 20888, true }, - { 20898, true }, - { 20911, true }, + { 20862, true }, + { 20872, true }, + { 20885, true }, + { 20899, true }, + { 20910, true }, { 20920, true }, - { 20931, false }, - { 20941, true }, - { 20952, true }, - { 20966, true }, - { 20979, true }, - { 20988, true }, - { 20998, true }, - { 21011, true }, - { 21025, true }, - { 21036, true }, - { 21046, true }, - { 21064, true }, - { 21084, true }, - { 21097, true }, - { 21106, true }, - { 21127, true }, - { 21144, true }, - { 21164, true }, - { 21183, true }, - { 21198, true }, - { 21211, true }, - { 21231, true }, - { 21249, true }, - { 21260, true }, - { 21273, true }, - { 21288, true }, - { 21298, true }, - { 21311, true }, - { 21322, true }, - { 21333, true }, - { 21347, true }, - { 21363, true }, - { 21387, true }, + { 20938, true }, + { 20958, true }, + { 20971, true }, + { 20980, true }, + { 21001, true }, + { 21018, true }, + { 21038, true }, + { 21057, true }, + { 21072, true }, + { 21085, true }, + { 21105, true }, + { 21123, true }, + { 21134, true }, + { 21147, true }, + { 21162, true }, + { 21172, true }, + { 21185, true }, + { 21196, true }, + { 21207, true }, + { 21221, true }, + { 21237, true }, + { 21261, true }, + { 21287, true }, + { 21297, true }, + { 21319, true }, + { 21330, true }, + { 21341, true }, + { 21353, true }, + { 21380, true }, + { 21392, true }, + { 21404, true }, { 21413, true }, - { 21423, true }, - { 21445, true }, - { 21456, true }, - { 21467, true }, - { 21479, true }, - { 21506, true }, - { 21518, true }, - { 21530, true }, - { 21539, true }, - { 21548, true }, - { 21557, true }, - { 21576, true }, - { 21591, true }, - { 21602, true }, - { 21611, true }, - { 21621, true }, - { 21633, true }, - { 21642, true }, - { 21652, true }, - { 21670, true }, - { 21681, true }, - { 21693, true }, - { 21704, true }, - { 21722, true }, - { 21741, true }, + { 21422, true }, + { 21431, true }, + { 21450, true }, + { 21465, true }, + { 21476, true }, + { 21485, true }, + { 21495, true }, + { 21507, true }, + { 21516, true }, + { 21526, true }, + { 21544, true }, + { 21555, true }, + { 21567, true }, + { 21578, true }, + { 21596, true }, + { 21615, true }, + { 21628, true }, + { 21641, true }, + { 21651, true }, + { 21665, true }, + { 21675, true }, + { 21685, true }, + { 21698, true }, + { 21708, false }, + { 21719, true }, + { 21737, true }, + { 21747, true }, { 21754, true }, - { 21767, true }, - { 21777, true }, - { 21791, true }, - { 21801, true }, - { 21811, true }, - { 21824, true }, - { 21834, false }, - { 21845, true }, - { 21863, true }, - { 21873, true }, - { 21880, true }, - { 21892, true }, - { 21913, true }, - { 21929, true }, - { 21942, true }, - { 21955, true }, - { 21972, true }, - { 21984, true }, - { 21998, true }, - { 22011, false }, - { 22025, true }, - { 22038, true }, - { 22049, true }, - { 22060, true }, + { 21766, true }, + { 21787, true }, + { 21803, true }, + { 21816, true }, + { 21829, true }, + { 21846, true }, + { 21858, true }, + { 21871, false }, + { 21885, true }, + { 21898, true }, + { 21909, true }, + { 21920, true }, + { 21932, true }, + { 21946, true }, + { 21964, true }, + { 21976, true }, + { 21993, true }, + { 22006, true }, + { 22017, true }, + { 22026, true }, + { 22044, true }, + { 22061, true }, { 22072, true }, - { 22086, true }, - { 22104, true }, - { 22116, true }, - { 22133, true }, - { 22146, true }, - { 22157, true }, - { 22166, true }, - { 22184, true }, - { 22201, true }, - { 22212, true }, - { 22223, true }, - { 22248, true }, - { 22262, true }, - { 22275, true }, + { 22083, true }, + { 22108, true }, + { 22122, true }, + { 22135, true }, + { 22149, true }, + { 22162, true }, + { 22176, true }, + { 22191, true }, + { 22203, true }, + { 22219, false }, + { 22230, true }, + { 22245, true }, + { 22263, true }, + { 22276, true }, { 22289, true }, - { 22302, true }, - { 22316, true }, - { 22331, true }, - { 22343, true }, - { 22359, false }, - { 22370, true }, - { 22385, true }, - { 22403, true }, - { 22416, true }, - { 22429, true }, - { 22445, true }, + { 22305, true }, + { 22319, true }, + { 22341, true }, + { 22353, true }, + { 22366, true }, + { 22381, true }, + { 22393, true }, + { 22409, true }, + { 22422, true }, + { 22447, true }, { 22459, true }, - { 22481, true }, - { 22493, true }, - { 22506, true }, - { 22521, true }, - { 22533, true }, - { 22549, true }, - { 22562, true }, - { 22587, true }, - { 22599, true }, - { 22609, true }, - { 22637, true }, - { 22652, true }, - { 22668, true }, - { 22679, true }, - { 22690, true }, - { 22700, true }, - { 22713, true }, - { 22723, false }, - { 22737, true }, - { 22746, true }, - { 22758, true }, - { 22772, false }, - { 22791, true }, - { 22818, true }, - { 22839, true }, + { 22469, true }, + { 22497, true }, + { 22512, true }, + { 22528, true }, + { 22539, true }, + { 22550, true }, + { 22560, true }, + { 22573, true }, + { 22583, false }, + { 22597, true }, + { 22606, true }, + { 22618, true }, + { 22632, false }, + { 22651, true }, + { 22678, true }, + { 22699, true }, + { 22715, true }, + { 22726, true }, + { 22744, true }, + { 22759, true }, + { 22770, false }, + { 22785, true }, + { 22795, true }, + { 22806, true }, + { 22820, true }, + { 22842, true }, { 22855, true }, - { 22866, true }, - { 22884, true }, - { 22899, true }, - { 22910, false }, + { 22870, true }, + { 22885, true }, + { 22904, true }, { 22925, true }, { 22935, true }, - { 22946, true }, - { 22960, true }, - { 22982, true }, - { 22995, true }, - { 23010, true }, - { 23025, true }, - { 23044, true }, - { 23065, true }, - { 23075, true }, - { 23089, true }, - { 23102, true }, - { 23117, true }, - { 23138, true }, - { 23158, true }, - { 23179, true }, - { 23197, true }, - { 23209, true }, - { 23227, true }, - { 23248, true }, - { 23268, true }, - { 23286, true }, - { 23300, true }, - { 23319, false }, - { 23333, true }, - { 23343, true }, - { 23354, true }, - { 23364, true }, - { 23379, true }, - { 23392, true }, - { 23407, true }, + { 22949, true }, + { 22962, true }, + { 22977, true }, + { 22998, true }, + { 23018, true }, + { 23039, true }, + { 23057, true }, + { 23069, true }, + { 23087, true }, + { 23108, true }, + { 23128, true }, + { 23146, true }, + { 23160, true }, + { 23179, false }, + { 23193, true }, + { 23203, true }, + { 23214, true }, + { 23224, true }, + { 23239, true }, + { 23252, true }, + { 23267, true }, + { 23281, true }, + { 23294, true }, + { 23307, true }, + { 23321, true }, + { 23338, true }, + { 23348, true }, + { 23361, true }, + { 23378, true }, + { 23387, true }, + { 23401, true }, { 23421, true }, - { 23434, true }, - { 23447, true }, - { 23461, true }, - { 23478, true }, - { 23488, true }, - { 23501, true }, - { 23518, true }, - { 23527, true }, - { 23541, true }, - { 23561, true }, - { 23579, true }, - { 23599, true }, - { 23613, true }, - { 23629, true }, - { 23638, true }, - { 23648, true }, - { 23656, true }, - { 23665, true }, - { 23674, true }, - { 23691, true }, - { 23704, true }, - { 23714, true }, - { 23724, true }, - { 23734, true }, - { 23752, true }, - { 23771, true }, - { 23795, true }, - { 23815, true }, - { 23830, true }, - { 23845, true }, - { 23878, true }, - { 23896, true }, - { 23924, true }, - { 23940, true }, - { 23958, true }, - { 23981, true }, - { 24003, true }, - { 24029, true }, - { 24047, true }, - { 24069, true }, - { 24083, true }, - { 24103, true }, - { 24116, true }, - { 24128, true }, - { 24140, true }, - { 24154, true }, - { 24168, true }, - { 24186, true }, - { 24201, true }, - { 24213, true }, - { 24232, true }, - { 24254, true }, - { 24271, true }, - { 24286, true }, - { 24307, true }, - { 24325, true }, - { 24339, true }, - { 24358, true }, - { 24379, true }, - { 24396, true }, - { 24410, true }, - { 24424, true }, - { 24445, true }, - { 24458, true }, - { 24474, true }, - { 24487, true }, - { 24506, true }, - { 24523, true }, - { 24541, true }, - { 24559, true }, - { 24568, true }, - { 24584, true }, - { 24591, true }, - { 24607, true }, - { 24626, true }, + { 23439, true }, + { 23459, true }, + { 23473, true }, + { 23489, true }, + { 23498, true }, + { 23508, true }, + { 23516, true }, + { 23525, true }, + { 23534, true }, + { 23551, true }, + { 23564, true }, + { 23574, true }, + { 23584, true }, + { 23594, true }, + { 23612, true }, + { 23631, true }, + { 23655, true }, + { 23675, true }, + { 23690, true }, + { 23705, true }, + { 23738, true }, + { 23756, true }, + { 23784, true }, + { 23800, true }, + { 23818, true }, + { 23841, true }, + { 23863, true }, + { 23889, true }, + { 23907, true }, + { 23929, true }, + { 23943, true }, + { 23963, true }, + { 23976, true }, + { 23988, true }, + { 24000, true }, + { 24014, true }, + { 24028, true }, + { 24046, true }, + { 24061, true }, + { 24073, true }, + { 24092, true }, + { 24114, true }, + { 24131, true }, + { 24146, true }, + { 24164, true }, + { 24178, true }, + { 24197, true }, + { 24218, true }, + { 24235, true }, + { 24249, true }, + { 24263, true }, + { 24284, true }, + { 24297, true }, + { 24313, true }, + { 24326, true }, + { 24345, true }, + { 24362, true }, + { 24380, true }, + { 24398, true }, + { 24407, true }, + { 24423, true }, + { 24430, true }, + { 24446, true }, + { 24465, true }, + { 24483, true }, + { 24499, true }, + { 24513, true }, + { 24525, true }, + { 24536, true }, + { 24550, true }, + { 24560, true }, + { 24571, true }, + { 24580, false }, + { 24589, true }, + { 24603, true }, + { 24617, true }, + { 24629, true }, { 24644, true }, - { 24660, true }, - { 24674, true }, - { 24686, true }, - { 24697, true }, - { 24711, true }, - { 24721, true }, - { 24732, true }, - { 24741, false }, - { 24750, true }, - { 24764, true }, - { 24778, true }, - { 24790, true }, - { 24805, true }, - { 24813, true }, - { 24828, true }, - { 24842, true }, - { 24855, true }, - { 24866, true }, - { 24874, true }, - { 24897, true }, - { 24909, true }, - { 24924, true }, - { 24940, true }, - { 24949, true }, - { 24964, true }, - { 24980, true }, - { 24993, true }, - { 25008, true }, - { 25021, true }, - { 25032, true }, - { 25042, true }, - { 25054, true }, - { 25074, true }, - { 25087, true }, - { 25106, true }, - { 25116, true }, - { 25124, true }, - { 25134, true }, - { 25155, true }, - { 25167, true }, - { 25182, true }, + { 24652, true }, + { 24664, true }, + { 24679, true }, + { 24693, true }, + { 24706, true }, + { 24717, true }, + { 24725, true }, + { 24748, true }, + { 24760, true }, + { 24775, true }, + { 24791, true }, + { 24800, true }, + { 24815, true }, + { 24831, true }, + { 24844, true }, + { 24859, true }, + { 24872, true }, + { 24883, true }, + { 24893, true }, + { 24905, true }, + { 24925, true }, + { 24938, true }, + { 24957, true }, + { 24967, true }, + { 24975, true }, + { 24985, true }, + { 25006, true }, + { 25018, true }, + { 25033, true }, + { 25048, true }, + { 25063, true }, + { 25078, true }, + { 25088, true }, + { 25103, true }, + { 25119, true }, + { 25138, true }, + { 25159, true }, + { 25168, true }, { 25197, true }, - { 25212, true }, - { 25227, true }, - { 25237, true }, - { 25252, true }, - { 25268, true }, - { 25287, true }, - { 25308, true }, - { 25317, true }, - { 25346, true }, - { 25359, true }, - { 25379, true }, - { 25394, true }, + { 25210, true }, + { 25230, true }, + { 25245, true }, + { 25256, true }, + { 25269, true }, + { 25284, true }, + { 25303, true }, + { 25318, true }, + { 25333, true }, + { 25343, true }, + { 25353, true }, + { 25368, true }, + { 25390, true }, { 25405, true }, { 25418, true }, - { 25433, true }, - { 25452, true }, - { 25467, true }, - { 25482, true }, - { 25492, true }, - { 25502, true }, - { 25517, true }, + { 25445, true }, + { 25459, true }, + { 25471, true }, + { 25486, true }, + { 25500, true }, + { 25510, true }, + { 25531, true }, { 25539, true }, - { 25554, true }, - { 25567, true }, - { 25594, true }, - { 25608, true }, - { 25620, true }, - { 25635, true }, - { 25649, true }, - { 25659, true }, - { 25680, true }, + { 25556, true }, + { 25578, true }, + { 25596, false }, + { 25615, true }, + { 25629, true }, + { 25641, true }, + { 25656, true }, + { 25673, true }, { 25688, true }, - { 25705, true }, - { 25727, true }, - { 25745, false }, - { 25764, true }, - { 25778, true }, - { 25790, true }, - { 25805, true }, - { 25822, true }, - { 25837, true }, - { 25848, true }, + { 25699, true }, + { 25709, true }, + { 25725, true }, + { 25743, true }, + { 25755, true }, + { 25767, true }, + { 25797, false }, + { 25810, true }, + { 25827, true }, + { 25845, true }, { 25858, true }, - { 25874, true }, - { 25892, true }, - { 25904, true }, - { 25916, true }, - { 25946, false }, - { 25959, true }, - { 25976, true }, - { 25994, true }, - { 26007, true }, - { 26019, true }, - { 26042, true }, - { 26061, true }, + { 25870, true }, + { 25893, true }, + { 25912, true }, + { 25925, true }, + { 25933, true }, + { 25945, false }, + { 25956, true }, + { 25974, true }, + { 25998, true }, + { 26018, true }, + { 26030, true }, + { 26051, true }, + { 26062, true }, { 26074, true }, - { 26082, true }, - { 26094, false }, - { 26105, true }, - { 26123, true }, - { 26147, true }, - { 26167, true }, - { 26179, true }, - { 26200, true }, - { 26211, true }, - { 26223, true }, - { 26240, true }, - { 26258, true }, - { 26271, true }, - { 26281, true }, - { 26295, true }, + { 26091, true }, + { 26109, true }, + { 26122, true }, + { 26132, true }, + { 26146, true }, + { 26163, true }, + { 26174, true }, + { 26183, true }, + { 26195, true }, + { 26206, true }, + { 26216, true }, + { 26230, true }, + { 26243, true }, + { 26257, true }, + { 26275, true }, + { 26294, true }, { 26312, true }, - { 26323, true }, - { 26332, true }, - { 26344, true }, - { 26355, true }, - { 26365, true }, - { 26379, true }, - { 26392, true }, - { 26406, true }, - { 26424, true }, - { 26443, true }, - { 26461, true }, - { 26474, true }, - { 26485, true }, - { 26499, true }, - { 26511, true }, - { 26522, true }, - { 26533, true }, - { 26546, true }, - { 26558, true }, - { 26569, true }, - { 26588, true }, - { 26604, true }, - { 26618, true }, - { 26633, true }, - { 26658, true }, - { 26670, true }, - { 26685, true }, - { 26694, true }, - { 26709, true }, - { 26723, true }, - { 26736, true }, - { 26748, true }, - { 26760, true }, - { 26774, true }, - { 26785, true }, - { 26799, true }, - { 26810, true }, + { 26325, true }, + { 26336, true }, + { 26350, true }, + { 26362, true }, + { 26373, true }, + { 26384, true }, + { 26397, true }, + { 26409, true }, + { 26420, true }, + { 26439, true }, + { 26455, true }, + { 26469, true }, + { 26484, true }, + { 26509, true }, + { 26521, true }, + { 26536, true }, + { 26545, true }, + { 26560, true }, + { 26574, true }, + { 26587, true }, + { 26599, true }, + { 26611, true }, + { 26625, true }, + { 26636, true }, + { 26650, true }, + { 26661, true }, + { 26672, true }, + { 26682, true }, + { 26696, true }, + { 26706, true }, + { 26719, true }, + { 26730, true }, + { 26741, true }, + { 26756, true }, + { 26769, true }, + { 26783, true }, + { 26795, true }, + { 26809, true }, { 26821, true }, - { 26831, true }, - { 26845, true }, - { 26855, true }, - { 26868, true }, - { 26879, true }, - { 26890, true }, - { 26905, true }, - { 26918, true }, - { 26932, true }, - { 26944, true }, - { 26958, true }, - { 26970, true }, - { 26983, true }, - { 27008, true }, - { 27020, true }, - { 27037, true }, - { 27048, true }, - { 27059, true }, - { 27078, true }, - { 27094, true }, - { 27104, true }, - { 27118, true }, - { 27129, true }, + { 26834, true }, + { 26859, true }, + { 26871, true }, + { 26888, true }, + { 26899, true }, + { 26910, true }, + { 26929, true }, + { 26945, true }, + { 26955, true }, + { 26969, true }, + { 26980, true }, + { 26992, true }, + { 27007, true }, + { 27026, true }, + { 27043, true }, + { 27051, true }, + { 27069, false }, + { 27077, true }, + { 27093, true }, + { 27107, true }, + { 27124, true }, { 27141, true }, - { 27156, true }, - { 27175, true }, - { 27192, true }, - { 27200, true }, - { 27218, false }, - { 27226, true }, - { 27241, true }, - { 27254, true }, - { 27266, true }, - { 27278, true }, - { 27292, true }, - { 27305, true }, - { 27318, true }, - { 27334, true }, - { 27348, true }, - { 27365, true }, - { 27382, true }, - { 27395, true }, - { 27408, true }, - { 27421, true }, - { 27434, true }, - { 27447, true }, - { 27460, true }, - { 27473, true }, - { 27486, true }, - { 27499, true }, - { 27512, true }, - { 27525, true }, - { 27538, true }, - { 27551, true }, - { 27564, true }, - { 27581, true }, - { 27600, true }, - { 27615, true }, - { 27632, true }, - { 27645, true }, - { 27656, true }, + { 27154, true }, + { 27167, true }, + { 27180, true }, + { 27193, true }, + { 27206, true }, + { 27219, true }, + { 27232, true }, + { 27245, true }, + { 27258, true }, + { 27271, true }, + { 27284, true }, + { 27297, true }, + { 27310, true }, + { 27323, true }, + { 27340, true }, + { 27359, true }, + { 27374, true }, + { 27391, true }, + { 27404, true }, + { 27415, true }, + { 27427, true }, + { 27449, true }, + { 27461, true }, + { 27484, true }, + { 27508, true }, + { 27526, true }, + { 27539, true }, + { 27558, true }, + { 27574, true }, + { 27595, true }, + { 27606, true }, + { 27622, true }, + { 27635, true }, + { 27650, true }, { 27668, true }, - { 27690, true }, - { 27702, true }, - { 27725, true }, - { 27749, true }, - { 27767, true }, - { 27780, true }, - { 27799, true }, + { 27684, true }, + { 27700, true }, + { 27710, true }, + { 27724, true }, + { 27739, true }, + { 27758, true }, + { 27770, true }, + { 27787, true }, + { 27803, true }, { 27815, true }, - { 27836, true }, - { 27847, true }, - { 27863, true }, + { 27825, true }, + { 27846, true }, + { 27860, true }, { 27876, true }, - { 27891, true }, - { 27909, true }, - { 27925, true }, - { 27941, true }, - { 27951, true }, - { 27965, true }, - { 27980, true }, - { 27999, true }, - { 28011, true }, - { 28028, true }, - { 28044, true }, - { 28056, true }, - { 28066, true }, - { 28087, true }, - { 28101, true }, - { 28117, true }, - { 28139, true }, - { 28151, true }, - { 28162, true }, - { 28173, true }, - { 28188, true }, - { 28203, true }, - { 28215, true }, - { 28234, true }, - { 28247, true }, - { 28261, true }, - { 28283, true }, - { 28302, true }, - { 28322, true }, - { 28336, true }, - { 28344, true }, - { 28357, true }, - { 28371, true }, - { 28382, true }, - { 28395, true }, - { 28410, true }, - { 28426, true }, - { 28441, true }, - { 28453, true }, - { 28467, true }, + { 27898, true }, + { 27910, true }, + { 27921, true }, + { 27932, true }, + { 27947, true }, + { 27962, true }, + { 27974, true }, + { 27993, true }, + { 28006, true }, + { 28020, true }, + { 28042, true }, + { 28061, true }, + { 28081, true }, + { 28095, true }, + { 28103, true }, + { 28116, true }, + { 28130, true }, + { 28141, true }, + { 28154, true }, + { 28169, true }, + { 28185, true }, + { 28200, true }, + { 28212, true }, + { 28226, true }, + { 28238, true }, + { 28250, true }, + { 28267, false }, + { 28283, false }, + { 28303, true }, + { 28316, true }, + { 28328, true }, + { 28341, true }, + { 28358, true }, + { 28374, true }, + { 28399, true }, + { 28412, true }, + { 28425, true }, + { 28436, true }, + { 28445, true }, + { 28454, true }, + { 28463, true }, { 28479, true }, - { 28491, true }, - { 28508, false }, - { 28524, false }, - { 28544, true }, - { 28557, true }, - { 28569, true }, - { 28582, true }, - { 28599, true }, - { 28615, true }, - { 28640, true }, - { 28653, true }, - { 28666, true }, - { 28677, true }, - { 28686, true }, - { 28695, true }, - { 28704, true }, + { 28493, true }, + { 28509, true }, + { 28520, true }, + { 28533, true }, + { 28548, true }, + { 28562, true }, + { 28574, true }, + { 28586, true }, + { 28610, true }, + { 28623, true }, + { 28637, true }, + { 28650, true }, + { 28671, true }, + { 28691, true }, + { 28705, true }, { 28720, true }, - { 28734, true }, + { 28729, true }, + { 28740, true }, { 28750, true }, - { 28761, true }, + { 28760, true }, { 28774, true }, - { 28789, true }, - { 28803, true }, - { 28815, true }, - { 28827, true }, - { 28851, true }, - { 28864, true }, - { 28878, true }, - { 28891, true }, - { 28912, true }, - { 28932, true }, - { 28946, true }, - { 28961, true }, - { 28970, true }, - { 28981, true }, - { 28991, true }, - { 29001, true }, - { 29015, true }, - { 29032, true }, - { 29050, true }, - { 29075, true }, - { 29097, true }, + { 28791, true }, + { 28809, true }, + { 28834, true }, + { 28856, true }, + { 28869, true }, + { 28882, true }, + { 28893, true }, + { 28901, true }, + { 28920, true }, + { 28930, true }, + { 28943, true }, + { 28960, true }, + { 28973, true }, + { 28986, true }, + { 29004, true }, + { 29021, true }, + { 29037, true }, + { 29049, true }, + { 29061, true }, + { 29072, true }, + { 29086, true }, { 29110, true }, - { 29123, true }, - { 29134, true }, - { 29142, true }, - { 29161, true }, - { 29171, true }, - { 29184, true }, - { 29201, true }, - { 29214, true }, - { 29227, true }, - { 29245, true }, - { 29262, true }, - { 29278, true }, - { 29290, true }, - { 29302, true }, + { 29125, true }, + { 29143, true }, + { 29158, true }, + { 29180, true }, + { 29190, true }, + { 29206, true }, + { 29217, true }, + { 29238, true }, + { 29251, true }, + { 29271, true }, + { 29282, true }, + { 29301, true }, { 29313, true }, - { 29327, true }, - { 29351, true }, - { 29366, true }, - { 29384, true }, - { 29399, true }, - { 29421, true }, - { 29431, true }, - { 29447, true }, - { 29458, true }, - { 29479, true }, - { 29492, true }, - { 29512, true }, - { 29523, true }, - { 29542, true }, - { 29554, true }, - { 29562, false }, - { 29574, true }, - { 29589, true }, - { 29606, true }, - { 29618, true }, - { 29637, true }, - { 29651, true }, - { 29679, true }, - { 29694, true }, - { 29709, true }, - { 29724, true }, - { 29739, true }, - { 29751, false }, - { 29760, true }, - { 29774, true }, - { 29786, true }, - { 29794, true }, - { 29809, true }, - { 29821, true }, - { 29833, true }, - { 29853, true }, - { 29869, true }, - { 29881, true }, - { 29899, true }, - { 29911, true }, - { 29925, true }, - { 29945, true }, - { 29957, true }, - { 29971, true }, - { 29979, true }, - { 29996, true }, - { 30005, true }, - { 30031, true }, - { 30041, true }, - { 30053, false }, + { 29321, false }, + { 29333, true }, + { 29348, true }, + { 29365, true }, + { 29377, true }, + { 29396, true }, + { 29410, true }, + { 29438, true }, + { 29453, true }, + { 29468, true }, + { 29483, true }, + { 29498, true }, + { 29510, false }, + { 29519, true }, + { 29533, true }, + { 29545, true }, + { 29553, true }, + { 29568, true }, + { 29580, true }, + { 29592, true }, + { 29612, true }, + { 29628, true }, + { 29640, true }, + { 29658, true }, + { 29670, true }, + { 29684, true }, + { 29704, true }, + { 29716, true }, + { 29730, true }, + { 29738, true }, + { 29755, true }, + { 29764, true }, + { 29790, true }, + { 29800, false }, + { 29814, true }, + { 29830, true }, + { 29847, true }, + { 29859, true }, + { 29877, false }, + { 29899, false }, + { 29924, false }, + { 29948, true }, + { 29960, true }, + { 29970, true }, + { 29983, true }, + { 29993, true }, + { 30003, true }, + { 30013, true }, + { 30023, true }, + { 30033, true }, + { 30043, true }, + { 30053, true }, { 30067, true }, - { 30083, true }, + { 30085, true }, { 30100, true }, - { 30112, true }, - { 30130, false }, - { 30152, false }, - { 30177, false }, - { 30201, true }, - { 30213, true }, - { 30223, true }, - { 30236, true }, - { 30246, true }, - { 30256, true }, - { 30266, true }, - { 30276, true }, - { 30286, true }, - { 30296, true }, + { 30114, true }, + { 30132, true }, + { 30144, true }, + { 30156, true }, + { 30167, true }, + { 30181, true }, + { 30196, true }, + { 30210, true }, + { 30217, true }, + { 30231, false }, + { 30251, true }, + { 30272, true }, + { 30291, true }, { 30306, true }, - { 30320, true }, - { 30338, true }, - { 30353, true }, - { 30367, true }, - { 30385, true }, + { 30318, true }, + { 30343, true }, + { 30360, true }, + { 30371, true }, + { 30386, true }, { 30397, true }, - { 30409, true }, - { 30420, true }, - { 30434, true }, + { 30411, true }, + { 30423, true }, + { 30436, false }, { 30449, true }, - { 30463, true }, - { 30470, true }, - { 30484, false }, - { 30504, true }, - { 30525, true }, - { 30544, true }, - { 30559, true }, + { 30466, true }, + { 30482, true }, + { 30495, true }, + { 30507, true }, + { 30522, true }, + { 30532, true }, + { 30557, true }, { 30571, true }, - { 30596, true }, - { 30613, true }, - { 30624, true }, - { 30639, true }, - { 30650, true }, - { 30664, true }, - { 30676, true }, - { 30689, false }, - { 30702, true }, - { 30719, true }, + { 30587, true }, + { 30601, true }, + { 30618, true }, + { 30637, true }, + { 30647, true }, + { 30667, true }, + { 30679, true }, + { 30695, true }, + { 30723, false }, { 30735, true }, { 30748, true }, - { 30760, true }, - { 30775, true }, - { 30785, true }, - { 30810, true }, - { 30824, true }, - { 30840, true }, - { 30854, true }, - { 30871, true }, - { 30890, true }, + { 30762, true }, + { 30779, true }, + { 30796, true }, + { 30805, true }, + { 30815, true }, + { 30832, true }, + { 30841, true }, + { 30848, true }, + { 30858, true }, + { 30873, true }, + { 30884, false }, { 30900, true }, - { 30920, true }, - { 30932, true }, - { 30948, true }, - { 30976, false }, - { 30988, true }, - { 31001, true }, - { 31015, true }, - { 31032, true }, + { 30917, true }, + { 30931, true }, + { 30941, true }, + { 30951, true }, + { 30971, true }, + { 30982, true }, + { 30997, true }, + { 31016, true }, + { 31034, true }, { 31049, true }, - { 31058, true }, - { 31068, true }, - { 31085, true }, - { 31094, true }, - { 31101, true }, - { 31111, true }, - { 31126, true }, - { 31137, false }, + { 31062, true }, + { 31077, true }, + { 31093, true }, + { 31119, true }, + { 31136, true }, { 31153, true }, - { 31170, true }, - { 31184, true }, - { 31194, true }, - { 31204, true }, - { 31224, true }, - { 31235, true }, - { 31250, true }, - { 31269, true }, - { 31287, true }, - { 31302, true }, - { 31315, true }, - { 31330, true }, - { 31346, true }, - { 31372, true }, - { 31389, true }, - { 31406, true }, - { 31419, true }, - { 31427, true }, - { 31450, true }, - { 31464, true }, - { 31474, true }, - { 31499, true }, - { 31516, false }, - { 31537, false }, - { 31559, false }, - { 31578, false }, - { 31596, true }, - { 31612, true }, - { 31636, true }, - { 31664, true }, - { 31675, true }, - { 31690, true }, - { 31714, true }, - { 31733, true }, - { 31756, true }, - { 31774, true }, - { 31798, true }, - { 31812, true }, - { 31823, true }, - { 31845, true }, - { 31863, true }, - { 31878, true }, - { 31893, true }, - { 31906, true }, - { 31919, true }, - { 31934, true }, - { 31949, true }, - { 31964, true }, - { 31991, true }, - { 32003, true }, + { 31166, true }, + { 31174, true }, + { 31197, true }, + { 31211, true }, + { 31221, true }, + { 31246, true }, + { 31263, false }, + { 31284, false }, + { 31306, false }, + { 31325, false }, + { 31343, true }, + { 31359, true }, + { 31383, true }, + { 31411, true }, + { 31422, true }, + { 31437, true }, + { 31461, true }, + { 31480, true }, + { 31503, true }, + { 31521, true }, + { 31545, true }, + { 31559, true }, + { 31570, true }, + { 31592, true }, + { 31610, true }, + { 31625, true }, + { 31640, true }, + { 31653, true }, + { 31666, true }, + { 31681, true }, + { 31696, true }, + { 31711, true }, + { 31738, true }, + { 31750, true }, + { 31765, true }, + { 31784, true }, + { 31802, true }, + { 31810, true }, + { 31818, true }, + { 31827, true }, + { 31839, true }, + { 31851, true }, + { 31865, true }, + { 31883, true }, + { 31901, true }, + { 31916, true }, + { 31931, true }, + { 31940, true }, + { 31956, true }, + { 31973, true }, + { 31982, true }, + { 31993, true }, + { 32006, true }, { 32018, true }, - { 32037, true }, + { 32028, true }, + { 32041, false }, { 32055, true }, - { 32063, true }, { 32071, true }, - { 32080, true }, - { 32092, true }, - { 32104, true }, - { 32118, true }, - { 32136, true }, - { 32154, true }, - { 32169, true }, + { 32083, true }, + { 32093, true }, + { 32109, false }, + { 32116, true }, + { 32126, true }, + { 32140, true }, + { 32155, true }, + { 32163, true }, + { 32176, true }, { 32184, true }, - { 32193, true }, - { 32209, true }, - { 32226, true }, - { 32235, true }, - { 32246, true }, - { 32259, true }, - { 32271, true }, - { 32281, true }, - { 32294, false }, - { 32308, true }, - { 32324, true }, - { 32336, true }, - { 32346, true }, - { 32362, false }, - { 32369, true }, - { 32379, true }, - { 32393, true }, - { 32408, true }, - { 32416, true }, - { 32429, true }, - { 32437, true }, - { 32447, true }, - { 32465, true }, - { 32483, true }, - { 32494, true }, - { 32507, true }, - { 32520, true }, - { 32537, true }, - { 32551, true }, - { 32560, true }, - { 32575, true }, - { 32604, true }, - { 32621, true }, - { 32639, true }, - { 32649, true }, - { 32663, true }, - { 32675, true }, - { 32686, true }, - { 32713, true }, - { 32733, true }, - { 32750, true }, - { 32764, true }, - { 32786, true }, - { 32811, true }, + { 32194, true }, + { 32212, true }, + { 32230, true }, + { 32241, true }, + { 32254, true }, + { 32267, true }, + { 32284, true }, + { 32298, true }, + { 32307, true }, + { 32322, true }, + { 32351, true }, + { 32368, true }, + { 32386, true }, + { 32396, true }, + { 32410, true }, + { 32421, true }, + { 32448, true }, + { 32468, true }, + { 32485, true }, + { 32499, true }, + { 32521, true }, + { 32546, true }, + { 32559, true }, + { 32572, true }, + { 32589, true }, + { 32607, true }, + { 32622, true }, + { 32637, true }, + { 32648, true }, + { 32658, true }, + { 32679, true }, + { 32689, false }, + { 32708, true }, + { 32720, true }, + { 32749, true }, + { 32767, true }, + { 32785, true }, + { 32803, true }, { 32824, true }, - { 32837, true }, - { 32854, true }, - { 32872, true }, - { 32887, true }, - { 32902, true }, - { 32913, true }, + { 32838, true }, + { 32852, true }, + { 32860, true }, + { 32870, true }, + { 32883, true }, + { 32895, true }, + { 32907, true }, { 32923, true }, - { 32944, true }, - { 32954, false }, - { 32973, true }, - { 32985, true }, - { 33014, true }, - { 33032, true }, - { 33050, true }, - { 33068, true }, - { 33089, true }, - { 33103, true }, - { 33117, true }, - { 33125, true }, - { 33135, true }, - { 33148, true }, - { 33160, true }, - { 33176, true }, - { 33190, true }, - { 33212, true }, - { 33231, true }, - { 33244, true }, - { 33257, true }, + { 32937, true }, + { 32959, true }, + { 32978, true }, + { 32991, true }, + { 33004, true }, + { 33023, true }, + { 33038, true }, + { 33056, true }, + { 33067, true }, + { 33080, false }, + { 33090, true }, + { 33112, true }, + { 33126, true }, + { 33149, true }, + { 33165, true }, + { 33180, true }, + { 33196, true }, + { 33213, true }, + { 33224, false }, + { 33232, true }, + { 33245, true }, + { 33260, true }, { 33276, true }, - { 33291, true }, - { 33309, true }, - { 33320, true }, - { 33333, false }, - { 33343, true }, - { 33365, true }, - { 33379, true }, - { 33402, true }, - { 33418, true }, - { 33433, true }, - { 33449, true }, - { 33466, true }, - { 33477, false }, - { 33485, true }, - { 33498, true }, - { 33513, true }, - { 33529, true }, - { 33549, true }, - { 33563, true }, - { 33571, true }, - { 33586, true }, - { 33599, true }, - { 33611, true }, - { 33622, true }, - { 33635, true }, - { 33655, false }, - { 33677, true }, - { 33701, true }, - { 33721, true }, - { 33744, true }, - { 33762, true }, - { 33777, true }, - { 33804, true }, - { 33830, true }, - { 33857, true }, - { 33873, true }, - { 33891, true }, - { 33920, true }, - { 33932, true }, - { 33948, true }, - { 33959, true }, - { 33971, true }, - { 33984, true }, - { 33997, true }, - { 34008, true }, - { 34026, true }, - { 34039, true }, - { 34048, true }, - { 34065, true }, + { 33296, true }, + { 33310, true }, + { 33318, true }, + { 33333, true }, + { 33346, true }, + { 33358, true }, + { 33369, true }, + { 33382, true }, + { 33402, false }, + { 33424, true }, + { 33448, true }, + { 33475, true }, + { 33495, true }, + { 33518, true }, + { 33536, true }, + { 33551, true }, + { 33578, true }, + { 33604, true }, + { 33631, true }, + { 33647, true }, + { 33665, true }, + { 33694, true }, + { 33706, true }, + { 33722, true }, + { 33733, true }, + { 33745, true }, + { 33758, true }, + { 33771, true }, + { 33782, true }, + { 33800, true }, + { 33813, true }, + { 33822, true }, + { 33839, true }, + { 33852, true }, + { 33861, true }, + { 33878, true }, + { 33886, true }, + { 33894, true }, + { 33903, true }, + { 33912, true }, + { 33936, true }, + { 33946, true }, + { 33956, true }, + { 33965, true }, + { 33978, true }, + { 33991, true }, + { 34003, true }, + { 34017, true }, + { 34031, true }, + { 34049, true }, + { 34064, true }, { 34078, true }, - { 34087, true }, - { 34104, true }, - { 34112, true }, - { 34120, true }, - { 34129, true }, - { 34138, true }, - { 34162, true }, - { 34172, true }, - { 34182, true }, - { 34191, true }, - { 34204, true }, - { 34217, true }, - { 34229, true }, - { 34243, true }, - { 34257, true }, - { 34275, true }, - { 34290, true }, + { 34090, true }, + { 34106, true }, + { 34119, true }, + { 34134, true }, + { 34146, true }, + { 34161, true }, + { 34175, true }, + { 34184, true }, + { 34193, true }, + { 34207, true }, + { 34216, true }, + { 34230, true }, + { 34240, true }, + { 34253, true }, + { 34268, true }, + { 34281, true }, + { 34291, true }, { 34304, true }, - { 34316, true }, - { 34332, true }, - { 34345, true }, - { 34360, true }, - { 34372, true }, - { 34387, true }, - { 34401, true }, - { 34410, true }, - { 34419, true }, - { 34433, true }, - { 34442, true }, - { 34456, true }, - { 34466, true }, - { 34479, true }, - { 34494, true }, - { 34507, true }, + { 34319, true }, + { 34334, true }, + { 34348, true }, + { 34363, true }, + { 34382, true }, + { 34396, true }, + { 34412, true }, + { 34427, true }, + { 34438, true }, + { 34452, true }, + { 34462, true }, + { 34473, true }, + { 34489, true }, + { 34501, true }, { 34517, true }, - { 34527, true }, - { 34540, true }, + { 34531, true }, + { 34536, true }, + { 34547, true }, { 34555, true }, + { 34563, true }, { 34570, true }, - { 34584, true }, - { 34599, true }, - { 34618, true }, - { 34632, true }, - { 34648, true }, - { 34663, true }, - { 34674, true }, - { 34688, true }, - { 34698, true }, - { 34709, true }, - { 34725, true }, - { 34737, true }, - { 34753, true }, - { 34767, true }, - { 34772, true }, + { 34576, true }, + { 34586, true }, + { 34595, true }, + { 34605, true }, + { 34634, true }, + { 34649, false }, + { 34669, true }, + { 34679, true }, + { 34692, true }, + { 34710, true }, + { 34730, true }, + { 34746, true }, + { 34758, true }, + { 34770, true }, { 34783, true }, - { 34791, true }, - { 34799, true }, - { 34806, true }, - { 34812, true }, - { 34822, true }, - { 34831, true }, - { 34841, true }, - { 34870, true }, - { 34885, false }, - { 34905, true }, - { 34915, true }, - { 34928, true }, - { 34946, true }, - { 34966, true }, - { 34982, true }, - { 34994, true }, - { 35006, true }, - { 35019, true }, - { 35030, true }, - { 35041, true }, - { 35053, true }, - { 35064, true }, - { 35078, true }, - { 35096, true }, - { 35112, true }, + { 34794, true }, + { 34805, true }, + { 34817, true }, + { 34828, true }, + { 34842, true }, + { 34860, true }, + { 34876, true }, + { 34896, true }, + { 34906, true }, + { 34926, true }, + { 34934, true }, + { 34945, false }, + { 34955, true }, + { 34967, true }, + { 34976, true }, + { 34990, true }, + { 35004, true }, + { 35023, true }, + { 35031, true }, + { 35055, true }, + { 35074, true }, + { 35088, false }, + { 35104, true }, + { 35121, true }, { 35132, true }, - { 35142, true }, - { 35162, true }, - { 35170, true }, - { 35181, false }, - { 35191, true }, - { 35203, true }, - { 35212, true }, - { 35226, true }, - { 35240, true }, - { 35259, true }, - { 35267, true }, - { 35291, true }, - { 35310, true }, - { 35324, false }, - { 35340, true }, - { 35357, true }, - { 35368, true }, - { 35380, false }, - { 35395, true }, - { 35407, true }, - { 35426, true }, - { 35434, true }, - { 35446, true }, - { 35460, true }, - { 35472, true }, - { 35483, true }, - { 35497, true }, - { 35510, true }, - { 35522, true }, - { 35535, true }, - { 35555, true }, - { 35565, true }, - { 35584, true }, - { 35602, true }, - { 35614, true }, - { 35625, true }, - { 35637, true }, - { 35654, true }, - { 35677, true }, - { 35700, true }, - { 35711, true }, - { 35723, true }, - { 35738, true }, - { 35749, true }, - { 35765, true }, - { 35781, true }, - { 35799, false }, - { 35822, true }, - { 35842, true }, - { 35857, true }, - { 35871, true }, - { 35886, true }, - { 35909, true }, - { 35928, true }, - { 35943, true }, - { 35961, true }, - { 35978, true }, - { 36004, true }, - { 36023, true }, - { 36039, true }, - { 36053, true }, - { 36074, true }, - { 36090, true }, - { 36115, true }, - { 36133, true }, - { 36159, true }, - { 36173, true }, - { 36191, true }, - { 36200, true }, - { 36212, true }, - { 36225, true }, - { 36238, true }, - { 36250, true }, - { 36270, true }, + { 35144, false }, + { 35159, true }, + { 35171, true }, + { 35190, true }, + { 35198, true }, + { 35210, true }, + { 35224, true }, + { 35236, true }, + { 35247, true }, + { 35261, true }, + { 35274, true }, + { 35286, true }, + { 35299, true }, + { 35319, true }, + { 35329, true }, + { 35348, true }, + { 35366, true }, + { 35378, true }, + { 35389, true }, + { 35401, true }, + { 35418, true }, + { 35441, true }, + { 35464, true }, + { 35475, true }, + { 35487, true }, + { 35502, true }, + { 35513, true }, + { 35529, true }, + { 35545, true }, + { 35563, false }, + { 35586, true }, + { 35606, true }, + { 35621, true }, + { 35635, true }, + { 35650, true }, + { 35673, true }, + { 35692, true }, + { 35707, true }, + { 35725, true }, + { 35742, true }, + { 35768, true }, + { 35787, true }, + { 35803, true }, + { 35817, true }, + { 35838, true }, + { 35854, true }, + { 35879, true }, + { 35897, true }, + { 35923, true }, + { 35937, true }, + { 35955, true }, + { 35964, true }, + { 35976, true }, + { 35989, true }, + { 36002, true }, + { 36014, true }, + { 36034, true }, + { 36049, true }, + { 36072, true }, + { 36085, true }, + { 36097, true }, + { 36109, true }, + { 36124, true }, + { 36137, true }, + { 36151, true }, + { 36161, true }, + { 36174, true }, + { 36182, true }, + { 36189, true }, + { 36214, true }, + { 36240, true }, + { 36252, true }, + { 36273, true }, { 36285, true }, - { 36308, true }, - { 36320, true }, - { 36332, true }, - { 36347, true }, - { 36360, true }, - { 36374, true }, - { 36384, true }, - { 36397, true }, - { 36405, true }, - { 36412, true }, - { 36437, true }, - { 36463, true }, - { 36475, true }, - { 36487, true }, - { 36502, true }, - { 36518, true }, - { 36544, true }, - { 36556, true }, - { 36578, true }, + { 36300, true }, + { 36316, true }, + { 36342, true }, + { 36354, true }, + { 36376, true }, + { 36390, true }, + { 36410, true }, + { 36422, true }, + { 36432, true }, + { 36445, true }, + { 36453, true }, + { 36467, true }, + { 36481, true }, + { 36505, true }, + { 36516, true }, + { 36533, true }, + { 36546, true }, + { 36555, true }, + { 36570, true }, { 36592, true }, - { 36612, true }, - { 36624, true }, - { 36634, true }, - { 36647, true }, - { 36655, true }, - { 36669, true }, - { 36683, true }, - { 36707, true }, - { 36718, true }, - { 36735, true }, - { 36748, true }, - { 36757, true }, + { 36615, true }, + { 36639, true }, + { 36662, true }, + { 36675, true }, + { 36693, false }, + { 36724, false }, + { 36739, true }, + { 36752, true }, { 36772, true }, - { 36794, true }, - { 36817, true }, + { 36787, true }, + { 36803, true }, + { 36814, true }, + { 36830, true }, { 36841, true }, - { 36864, true }, - { 36877, true }, - { 36895, false }, - { 36926, false }, - { 36941, true }, + { 36855, true }, + { 36865, false }, + { 36878, true }, + { 36895, true }, + { 36914, true }, + { 36928, true }, + { 36942, true }, { 36954, true }, - { 36974, true }, - { 36989, true }, - { 37005, true }, - { 37016, true }, - { 37032, true }, - { 37043, true }, - { 37057, true }, - { 37067, false }, - { 37080, true }, - { 37097, true }, + { 36973, true }, + { 36990, true }, + { 37003, true }, + { 37020, true }, + { 37029, true }, + { 37049, true }, + { 37071, true }, + { 37084, true }, + { 37105, true }, { 37116, true }, - { 37130, true }, - { 37144, true }, - { 37156, true }, - { 37175, true }, - { 37192, true }, + { 37127, true }, + { 37139, true }, + { 37151, true }, + { 37162, true }, + { 37180, true }, + { 37194, true }, { 37205, true }, - { 37222, true }, - { 37231, true }, - { 37251, true }, - { 37273, true }, - { 37286, true }, - { 37307, true }, - { 37318, true }, - { 37329, true }, - { 37341, true }, - { 37353, true }, - { 37364, true }, - { 37382, true }, - { 37396, true }, - { 37407, true }, - { 37423, true }, - { 37440, true }, - { 37449, true }, - { 37464, true }, + { 37221, true }, + { 37238, true }, + { 37247, true }, + { 37262, true }, + { 37276, true }, + { 37297, true }, + { 37314, true }, + { 37331, true }, + { 37347, true }, + { 37360, true }, + { 37373, true }, + { 37385, true }, + { 37398, true }, + { 37411, true }, + { 37424, true }, + { 37447, true }, + { 37459, true }, { 37478, true }, - { 37499, true }, - { 37516, true }, - { 37533, true }, - { 37549, true }, - { 37562, true }, - { 37575, true }, - { 37587, true }, - { 37600, true }, - { 37613, true }, - { 37626, true }, - { 37649, true }, - { 37661, true }, - { 37680, true }, - { 37695, true }, - { 37711, true }, - { 37732, true }, - { 37750, true }, - { 37761, true }, - { 37769, false }, - { 37792, true }, - { 37809, true }, - { 37826, true }, - { 37839, true }, - { 37856, true }, - { 37867, true }, - { 37879, false }, - { 37889, true }, - { 37905, false }, - { 37916, true }, - { 37947, true }, - { 37984, true }, - { 37999, true }, - { 38008, true }, - { 38021, true }, - { 38055, true }, - { 38065, true }, - { 38083, true }, + { 37493, true }, + { 37509, true }, + { 37530, true }, + { 37548, true }, + { 37559, true }, + { 37567, false }, + { 37590, true }, + { 37607, true }, + { 37624, true }, + { 37637, true }, + { 37654, true }, + { 37665, true }, + { 37677, false }, + { 37687, true }, + { 37703, false }, + { 37714, true }, + { 37745, true }, + { 37782, true }, + { 37797, true }, + { 37806, true }, + { 37819, true }, + { 37853, true }, + { 37863, true }, + { 37881, true }, + { 37899, true }, + { 37910, true }, + { 37920, true }, + { 37931, true }, + { 37940, true }, + { 37952, true }, + { 37978, true }, + { 37995, true }, + { 38004, true }, + { 38020, true }, + { 38028, false }, + { 38036, true }, + { 38047, true }, + { 38057, true }, + { 38071, true }, + { 38084, true }, { 38101, true }, - { 38112, true }, - { 38122, true }, - { 38133, true }, - { 38142, true }, + { 38111, true }, + { 38126, true }, + { 38140, true }, { 38154, true }, - { 38180, true }, - { 38197, true }, - { 38206, true }, - { 38222, true }, - { 38230, false }, - { 38238, true }, - { 38249, true }, - { 38259, true }, - { 38273, true }, - { 38286, true }, + { 38167, true }, + { 38178, true }, + { 38188, true }, + { 38196, true }, + { 38210, true }, + { 38231, true }, + { 38245, true }, + { 38261, true }, + { 38268, true }, + { 38278, true }, + { 38293, false }, { 38303, true }, - { 38313, true }, - { 38328, true }, - { 38342, true }, - { 38356, true }, - { 38369, true }, - { 38380, true }, - { 38390, true }, - { 38398, true }, - { 38412, true }, - { 38433, true }, - { 38447, true }, - { 38463, true }, - { 38470, true }, - { 38480, true }, - { 38495, false }, - { 38505, true }, - { 38516, true }, - { 38535, false }, - { 38548, true }, + { 38314, true }, + { 38333, false }, + { 38346, true }, + { 38366, true }, + { 38382, true }, + { 38400, true }, + { 38416, true }, + { 38427, true }, + { 38445, true }, + { 38455, true }, + { 38477, true }, + { 38497, false }, + { 38514, true }, + { 38526, true }, + { 38538, true }, + { 38552, true }, { 38568, true }, { 38584, true }, - { 38602, true }, - { 38618, true }, - { 38629, true }, - { 38647, true }, - { 38657, true }, - { 38679, true }, - { 38699, false }, - { 38716, true }, - { 38728, true }, - { 38740, true }, - { 38754, true }, - { 38770, true }, - { 38786, true }, - { 38802, true }, - { 38821, true }, - { 38838, true }, - { 38853, true }, - { 38868, true }, - { 38883, true }, - { 38904, true }, - { 38922, true }, - { 38941, true }, + { 38600, true }, + { 38619, true }, + { 38636, true }, + { 38651, true }, + { 38666, true }, + { 38681, true }, + { 38702, true }, + { 38720, true }, + { 38739, true }, + { 38751, true }, + { 38764, true }, + { 38777, true }, + { 38791, true }, + { 38805, true }, + { 38816, true }, + { 38829, true }, + { 38848, true }, + { 38866, true }, + { 38880, true }, + { 38897, true }, + { 38912, true }, + { 38926, true }, + { 38940, true }, { 38953, true }, - { 38966, true }, - { 38979, true }, - { 38993, true }, - { 39007, true }, - { 39018, true }, - { 39031, true }, - { 39050, true }, - { 39068, true }, - { 39082, true }, - { 39099, true }, - { 39114, true }, - { 39128, true }, - { 39142, true }, - { 39155, true }, - { 39165, true }, - { 39182, true }, - { 39198, true }, - { 39214, true }, - { 39229, true }, - { 39239, true }, - { 39254, true }, - { 39266, true }, - { 39277, true }, - { 39289, false }, + { 38963, true }, + { 38980, true }, + { 38996, true }, + { 39012, true }, + { 39027, true }, + { 39037, true }, + { 39052, true }, + { 39064, true }, + { 39075, true }, + { 39087, false }, + { 39095, true }, + { 39116, true }, + { 39124, true }, + { 39135, true }, + { 39148, true }, + { 39156, true }, + { 39164, true }, + { 39178, true }, + { 39192, true }, + { 39200, true }, + { 39208, true }, + { 39222, true }, + { 39242, true }, + { 39250, true }, + { 39259, false }, + { 39279, true }, { 39297, true }, - { 39318, true }, - { 39326, true }, - { 39337, true }, - { 39350, true }, - { 39358, true }, - { 39366, true }, - { 39380, true }, - { 39394, true }, + { 39324, true }, + { 39342, true }, + { 39362, true }, + { 39374, true }, + { 39386, true }, { 39402, true }, - { 39410, true }, - { 39424, true }, - { 39444, true }, - { 39452, true }, - { 39461, false }, - { 39481, true }, - { 39499, true }, - { 39526, true }, - { 39544, true }, - { 39564, true }, - { 39576, true }, + { 39416, true }, + { 39433, true }, + { 39450, true }, + { 39468, true }, + { 39487, true }, + { 39508, true }, + { 39518, true }, + { 39531, true }, + { 39548, true }, + { 39561, true }, + { 39575, true }, { 39588, true }, - { 39604, true }, - { 39618, true }, - { 39635, true }, - { 39652, true }, - { 39670, true }, - { 39689, true }, - { 39710, true }, - { 39720, true }, - { 39733, true }, - { 39750, true }, - { 39763, true }, - { 39777, true }, - { 39790, true }, - { 39804, true }, - { 39823, true }, - { 39833, true }, - { 39853, true }, - { 39862, true }, - { 39882, true }, - { 39899, true }, - { 39919, true }, - { 39933, true }, - { 39953, true }, - { 39971, true }, - { 39991, true }, - { 40026, true }, - { 40040, true }, - { 40058, true }, - { 40068, true }, - { 40098, true }, - { 40113, true }, - { 40125, true }, - { 40138, true }, - { 40154, true }, - { 40167, true }, - { 40196, true }, - { 40210, true }, - { 40225, true }, - { 40245, true }, - { 40259, true }, - { 40273, true }, - { 40290, true }, - { 40307, true }, - { 40318, true }, - { 40334, true }, - { 40349, true }, - { 40359, false }, - { 40370, true }, - { 40378, true }, - { 40386, true }, - { 40407, true }, - { 40428, true }, - { 40449, false }, - { 40465, true }, - { 40478, true }, - { 40493, true }, - { 40505, false }, - { 40526, true }, - { 40546, true }, - { 40568, true }, - { 40582, true }, - { 40600, true }, - { 40620, true }, - { 40636, true }, - { 40650, true }, - { 40666, true }, - { 40684, true }, - { 40699, true }, - { 40710, true }, - { 40721, true }, - { 40734, true }, - { 40747, true }, - { 40761, true }, + { 39602, true }, + { 39621, true }, + { 39631, true }, + { 39651, true }, + { 39660, true }, + { 39680, true }, + { 39697, true }, + { 39717, true }, + { 39731, true }, + { 39751, true }, + { 39769, true }, + { 39789, true }, + { 39824, true }, + { 39838, true }, + { 39856, true }, + { 39866, true }, + { 39896, true }, + { 39911, true }, + { 39923, true }, + { 39936, true }, + { 39952, true }, + { 39965, true }, + { 39994, true }, + { 40008, true }, + { 40023, true }, + { 40043, true }, + { 40057, true }, + { 40071, true }, + { 40088, true }, + { 40105, true }, + { 40116, true }, + { 40132, true }, + { 40147, true }, + { 40157, false }, + { 40168, true }, + { 40176, true }, + { 40184, true }, + { 40205, true }, + { 40226, true }, + { 40247, false }, + { 40263, true }, + { 40276, true }, + { 40291, true }, + { 40303, false }, + { 40324, true }, + { 40344, true }, + { 40366, true }, + { 40380, true }, + { 40398, true }, + { 40418, true }, + { 40434, true }, + { 40448, true }, + { 40464, true }, + { 40482, true }, + { 40497, true }, + { 40508, true }, + { 40519, true }, + { 40532, true }, + { 40545, true }, + { 40559, true }, + { 40574, true }, + { 40591, true }, + { 40606, true }, + { 40625, true }, + { 40641, true }, + { 40653, true }, + { 40663, true }, + { 40674, false }, + { 40696, true }, + { 40704, true }, + { 40720, true }, + { 40735, true }, + { 40745, true }, + { 40762, true }, { 40776, true }, - { 40793, true }, - { 40808, true }, - { 40827, true }, - { 40843, true }, - { 40855, true }, - { 40865, true }, - { 40876, false }, + { 40791, true }, + { 40809, true }, + { 40821, true }, + { 40832, true }, + { 40858, true }, + { 40882, true }, { 40898, true }, - { 40906, true }, - { 40922, true }, - { 40937, true }, - { 40947, true }, - { 40964, true }, - { 40978, true }, - { 40993, true }, - { 41011, true }, - { 41023, true }, - { 41034, true }, - { 41060, true }, - { 41084, true }, - { 41100, true }, - { 41109, true }, - { 41125, true }, - { 41140, true }, - { 41161, true }, - { 41170, true }, - { 41185, true }, - { 41198, false }, - { 41208, true }, - { 41227, true }, - { 41241, true }, - { 41261, true }, - { 41276, true }, - { 41285, true }, - { 41303, true }, - { 41325, false }, - { 41347, true }, - { 41356, true }, - { 41375, true }, - { 41387, false }, - { 41403, true }, - { 41427, false }, - { 41441, true }, - { 41457, true }, - { 41476, true }, - { 41488, true }, - { 41503, true }, - { 41521, true }, - { 41539, true }, - { 41559, true }, - { 41581, true }, - { 41599, true }, - { 41609, true }, - { 41620, true }, - { 41637, true }, - { 41652, true }, - { 41669, true }, + { 40907, true }, + { 40923, true }, + { 40938, true }, + { 40959, true }, + { 40968, true }, + { 40983, true }, + { 40996, false }, + { 41006, true }, + { 41025, true }, + { 41039, true }, + { 41059, true }, + { 41074, true }, + { 41083, true }, + { 41101, true }, + { 41123, false }, + { 41145, true }, + { 41154, true }, + { 41173, true }, + { 41185, false }, + { 41201, true }, + { 41225, false }, + { 41239, true }, + { 41255, true }, + { 41274, true }, + { 41286, true }, + { 41301, true }, + { 41319, true }, + { 41334, true }, + { 41346, true }, + { 41364, true }, + { 41384, true }, + { 41406, true }, + { 41424, true }, + { 41434, true }, + { 41445, true }, + { 41462, true }, + { 41477, true }, + { 41494, true }, + { 41509, true }, + { 41526, false }, + { 41542, true }, + { 41556, true }, + { 41570, true }, + { 41589, true }, + { 41606, true }, + { 41623, true }, + { 41642, true }, + { 41657, true }, { 41684, true }, - { 41701, false }, - { 41717, true }, - { 41731, true }, - { 41745, true }, - { 41764, true }, - { 41781, true }, - { 41798, true }, - { 41817, true }, - { 41832, true }, - { 41859, true }, - { 41879, true }, - { 41901, true }, - { 41922, true }, - { 41945, true }, - { 41965, true }, - { 41983, true }, - { 42001, true }, - { 42020, true }, - { 42042, true }, - { 42061, true }, - { 42081, true }, - { 42098, true }, - { 42125, true }, - { 42145, true }, - { 42168, true }, - { 42191, true }, - { 42205, true }, - { 42222, true }, - { 42238, true }, - { 42252, true }, - { 42266, true }, - { 42279, true }, - { 42316, false }, - { 42327, true }, - { 42345, true }, - { 42365, true }, - { 42388, true }, - { 42413, false }, - { 42444, true }, - { 42458, true }, - { 42472, true }, - { 42483, true }, - { 42492, true }, - { 42503, true }, - { 42515, true }, - { 42531, true }, - { 42543, true }, - { 42552, true }, - { 42564, true }, - { 42581, true }, - { 42591, true }, - { 42605, true }, - { 42623, false }, - { 42631, true }, - { 42642, true }, - { 42656, true }, - { 42675, true }, - { 42686, false }, - { 42704, true }, - { 42717, true }, - { 42730, true }, - { 42747, true }, - { 42761, true }, - { 42777, true }, - { 42788, true }, - { 42802, true }, - { 42815, true }, - { 42833, true }, - { 42845, true }, - { 42860, true }, - { 42868, true }, - { 42888, true }, - { 42902, true }, - { 42914, true }, - { 42926, true }, - { 42936, true }, - { 42947, true }, - { 42961, true }, - { 42972, true }, - { 42986, true }, - { 43009, true }, - { 43017, true }, - { 43035, true }, - { 43050, true }, - { 43069, false }, - { 43088, true }, - { 43107, true }, - { 43120, true }, + { 41704, true }, + { 41726, true }, + { 41747, true }, + { 41770, true }, + { 41790, true }, + { 41808, true }, + { 41826, true }, + { 41845, true }, + { 41867, true }, + { 41886, true }, + { 41906, true }, + { 41923, true }, + { 41950, true }, + { 41970, true }, + { 41993, true }, + { 42016, true }, + { 42030, true }, + { 42047, true }, + { 42063, true }, + { 42077, true }, + { 42091, true }, + { 42104, true }, + { 42141, false }, + { 42152, true }, + { 42170, true }, + { 42190, true }, + { 42213, true }, + { 42238, false }, + { 42269, true }, + { 42283, true }, + { 42297, true }, + { 42308, true }, + { 42317, true }, + { 42328, true }, + { 42340, true }, + { 42356, true }, + { 42368, true }, + { 42377, true }, + { 42389, true }, + { 42406, true }, + { 42416, true }, + { 42430, true }, + { 42448, false }, + { 42456, true }, + { 42467, true }, + { 42481, true }, + { 42500, true }, + { 42511, false }, + { 42529, true }, + { 42542, true }, + { 42555, true }, + { 42572, true }, + { 42586, true }, + { 42602, true }, + { 42613, true }, + { 42627, true }, + { 42640, true }, + { 42658, true }, + { 42670, true }, + { 42685, true }, + { 42693, true }, + { 42713, true }, + { 42727, true }, + { 42739, true }, + { 42751, true }, + { 42763, true }, + { 42773, true }, + { 42784, true }, + { 42798, true }, + { 42809, true }, + { 42823, true }, + { 42846, true }, + { 42854, true }, + { 42872, true }, + { 42887, true }, + { 42906, false }, + { 42925, true }, + { 42944, true }, + { 42957, true }, + { 42969, true }, + { 42985, true }, + { 42995, true }, + { 43014, true }, + { 43028, true }, + { 43041, true }, + { 43056, true }, + { 43064, true }, + { 43078, true }, + { 43093, true }, + { 43105, true }, + { 43113, true }, + { 43119, true }, { 43132, true }, - { 43148, true }, - { 43158, true }, - { 43177, true }, - { 43191, true }, - { 43204, true }, - { 43219, true }, - { 43227, true }, + { 43141, true }, + { 43155, true }, + { 43169, true }, + { 43182, false }, + { 43202, true }, + { 43218, true }, + { 43229, true }, { 43241, true }, - { 43256, true }, - { 43268, true }, - { 43276, true }, - { 43282, true }, - { 43295, true }, + { 43257, true }, + { 43270, true }, + { 43290, true }, { 43304, true }, - { 43318, true }, - { 43332, true }, - { 43345, false }, - { 43365, true }, - { 43381, true }, - { 43392, true }, - { 43404, true }, - { 43420, true }, - { 43433, true }, - { 43453, true }, - { 43467, true }, - { 43483, true }, - { 43497, true }, + { 43320, true }, + { 43334, true }, + { 43354, true }, + { 43368, true }, + { 43383, true }, + { 43403, true }, + { 43417, true }, + { 43430, true }, + { 43439, true }, + { 43455, true }, + { 43477, true }, + { 43509, true }, { 43517, true }, - { 43531, true }, - { 43546, true }, - { 43566, true }, - { 43580, true }, - { 43593, true }, - { 43602, true }, - { 43618, true }, + { 43535, true }, + { 43551, true }, + { 43572, true }, + { 43592, true }, + { 43605, true }, + { 43620, true }, { 43640, true }, - { 43672, true }, - { 43680, true }, - { 43698, true }, - { 43714, true }, - { 43735, true }, - { 43755, true }, - { 43768, true }, - { 43783, true }, - { 43803, true }, - { 43817, true }, - { 43836, true }, - { 43855, true }, - { 43869, true }, - { 43884, true }, - { 43897, true }, - { 43910, true }, - { 43925, true }, - { 43937, true }, + { 43654, true }, + { 43673, true }, + { 43692, true }, + { 43706, true }, + { 43721, true }, + { 43734, true }, + { 43747, true }, + { 43762, true }, + { 43774, true }, + { 43789, true }, + { 43812, true }, + { 43828, true }, + { 43851, true }, + { 43870, true }, + { 43882, false }, + { 43903, true }, + { 43922, false }, + { 43930, true }, + { 43939, true }, { 43952, true }, + { 43966, true }, { 43975, true }, - { 43991, true }, - { 44014, true }, - { 44033, true }, - { 44045, false }, - { 44066, true }, - { 44085, false }, - { 44093, true }, - { 44102, true }, - { 44115, true }, - { 44129, true }, + { 43987, true }, + { 44003, true }, + { 44020, false }, + { 44030, true }, + { 44041, true }, + { 44053, true }, + { 44069, true }, + { 44082, true }, + { 44101, true }, + { 44120, true }, { 44138, true }, - { 44150, true }, - { 44166, true }, - { 44183, false }, - { 44193, true }, - { 44204, true }, + { 44155, true }, + { 44172, false }, + { 44182, true }, + { 44200, true }, { 44216, true }, - { 44232, true }, - { 44245, true }, - { 44264, true }, - { 44283, true }, - { 44301, true }, - { 44318, true }, - { 44335, false }, - { 44345, true }, - { 44363, true }, - { 44379, true }, - { 44398, true }, - { 44414, true }, - { 44428, true }, - { 44445, true }, - { 44467, true }, - { 44479, true }, - { 44500, true }, - { 44522, true }, - { 44539, true }, - { 44561, true }, - { 44577, true }, - { 44592, true }, - { 44606, true }, - { 44632, true }, - { 44648, true }, - { 44673, true }, - { 44688, true }, - { 44701, true }, - { 44713, true }, + { 44235, true }, + { 44251, true }, + { 44265, true }, + { 44282, true }, + { 44304, true }, + { 44316, true }, + { 44329, true }, + { 44350, true }, + { 44372, true }, + { 44389, true }, + { 44411, true }, + { 44427, true }, + { 44442, true }, + { 44456, true }, + { 44482, true }, + { 44498, true }, + { 44523, true }, + { 44538, true }, + { 44551, true }, + { 44563, true }, + { 44580, true }, + { 44590, true }, + { 44605, true }, + { 44615, true }, + { 44624, true }, + { 44638, true }, + { 44649, true }, + { 44660, true }, + { 44676, true }, + { 44691, true }, + { 44703, true }, + { 44717, true }, { 44730, true }, - { 44740, true }, - { 44755, true }, + { 44746, true }, + { 44756, true }, { 44765, true }, - { 44774, true }, - { 44785, true }, - { 44796, true }, - { 44812, true }, - { 44827, true }, - { 44839, true }, - { 44853, true }, - { 44866, true }, - { 44882, true }, - { 44892, true }, - { 44901, true }, - { 44913, true }, - { 44926, true }, - { 44937, true }, - { 44946, true }, - { 44954, true }, - { 44970, true }, - { 44978, true }, - { 44988, true }, - { 44999, true }, - { 45010, true }, - { 45024, false }, - { 45044, true }, - { 45064, true }, - { 45088, true }, - { 45109, true }, - { 45117, true }, - { 45138, true }, - { 45148, true }, - { 45162, true }, - { 45182, true }, - { 45195, true }, - { 45207, false }, + { 44777, true }, + { 44790, true }, + { 44801, true }, + { 44810, true }, + { 44818, true }, + { 44834, true }, + { 44842, true }, + { 44852, true }, + { 44863, true }, + { 44874, true }, + { 44888, false }, + { 44908, true }, + { 44928, true }, + { 44952, true }, + { 44973, true }, + { 44981, true }, + { 45002, true }, + { 45012, true }, + { 45026, true }, + { 45046, true }, + { 45059, false }, + { 45069, true }, + { 45099, true }, + { 45126, false }, + { 45140, true }, + { 45156, true }, + { 45169, true }, + { 45188, true }, + { 45200, true }, { 45217, true }, - { 45247, true }, - { 45274, false }, - { 45288, true }, - { 45304, true }, - { 45317, true }, - { 45336, true }, - { 45348, true }, - { 45365, true }, - { 45379, false }, - { 45397, true }, - { 45405, true }, - { 45421, true }, - { 45432, true }, - { 45447, true }, - { 45460, true }, - { 45473, true }, - { 45488, true }, - { 45508, false }, - { 45523, true }, - { 45535, true }, - { 45547, true }, - { 45559, true }, - { 45572, true }, - { 45587, true }, - { 45600, true }, - { 45613, true }, - { 45628, false }, - { 45651, false }, - { 45675, true }, - { 45692, true }, - { 45705, true }, - { 45716, true }, - { 45728, true }, - { 45742, true }, + { 45231, false }, + { 45249, true }, + { 45257, true }, + { 45273, true }, + { 45284, true }, + { 45299, true }, + { 45312, true }, + { 45325, true }, + { 45340, true }, + { 45360, false }, + { 45375, true }, + { 45387, true }, + { 45399, true }, + { 45411, true }, + { 45424, true }, + { 45439, true }, + { 45452, true }, + { 45465, true }, + { 45478, true }, + { 45493, false }, + { 45516, false }, + { 45540, true }, + { 45557, true }, + { 45570, true }, + { 45581, true }, + { 45593, true }, + { 45607, true }, + { 45625, true }, + { 45635, true }, + { 45646, true }, + { 45665, true }, + { 45682, true }, + { 45704, true }, + { 45718, true }, + { 45731, true }, + { 45750, true }, { 45760, true }, - { 45770, true }, - { 45781, true }, - { 45800, true }, - { 45817, true }, - { 45839, true }, - { 45853, true }, - { 45866, true }, - { 45885, true }, - { 45895, true }, - { 45909, true }, - { 45942, true }, - { 45963, true }, - { 45975, true }, - { 45989, true }, - { 46000, true }, + { 45774, true }, + { 45807, true }, + { 45828, true }, + { 45840, true }, + { 45854, true }, + { 45865, true }, + { 45879, true }, + { 45892, true }, + { 45908, true }, + { 45921, true }, + { 45941, true }, + { 45958, true }, + { 45969, true }, + { 45977, true }, + { 45990, true }, + { 46002, false }, { 46014, true }, - { 46027, true }, - { 46043, true }, - { 46056, true }, - { 46076, true }, - { 46093, true }, - { 46104, true }, - { 46112, true }, - { 46125, true }, - { 46137, false }, - { 46149, true }, - { 46160, true }, - { 46182, true }, - { 46195, true }, + { 46025, true }, + { 46047, true }, + { 46067, true }, + { 46079, true }, + { 46091, true }, + { 46108, true }, + { 46126, true }, + { 46140, false }, + { 46155, true }, + { 46174, true }, + { 46189, true }, + { 46203, true }, { 46215, true }, - { 46227, true }, - { 46239, true }, - { 46256, true }, - { 46274, true }, - { 46288, false }, - { 46303, true }, - { 46322, true }, - { 46337, true }, - { 46351, true }, - { 46363, true }, - { 46374, true }, - { 46390, true }, - { 46406, true }, - { 46427, true }, - { 46446, false }, - { 46463, true }, - { 46490, true }, - { 46509, true }, - { 46529, true }, - { 46543, true }, - { 46560, true }, - { 46580, true }, - { 46593, true }, - { 46607, true }, - { 46628, true }, + { 46226, true }, + { 46242, true }, + { 46258, true }, + { 46279, true }, + { 46298, false }, + { 46315, true }, + { 46342, true }, + { 46361, true }, + { 46381, true }, + { 46395, true }, + { 46412, true }, + { 46432, true }, + { 46445, true }, + { 46459, true }, + { 46480, true }, + { 46501, true }, + { 46514, true }, + { 46521, true }, + { 46533, true }, + { 46555, true }, + { 46571, true }, + { 46587, true }, + { 46602, true }, + { 46615, true }, + { 46635, true }, { 46649, true }, - { 46662, true }, - { 46669, true }, - { 46681, true }, - { 46703, true }, - { 46719, true }, + { 46664, true }, + { 46674, true }, + { 46690, true }, + { 46701, true }, + { 46711, true }, + { 46723, true }, { 46735, true }, - { 46750, true }, - { 46763, true }, - { 46783, true }, - { 46797, true }, - { 46812, true }, - { 46822, true }, - { 46838, true }, - { 46849, true }, - { 46859, true }, + { 46753, true }, + { 46772, true }, + { 46787, true }, + { 46808, false }, + { 46829, true }, + { 46839, true }, + { 46857, true }, { 46871, true }, - { 46883, true }, - { 46901, true }, - { 46920, true }, - { 46935, true }, - { 46956, false }, - { 46977, true }, - { 46987, true }, - { 47005, true }, - { 47019, true }, - { 47039, true }, + { 46891, true }, + { 46911, true }, + { 46943, true }, + { 46953, true }, + { 46972, true }, + { 46989, false }, + { 47013, false }, + { 47035, true }, { 47059, true }, - { 47091, true }, - { 47101, true }, - { 47120, true }, - { 47137, false }, - { 47161, false }, - { 47183, true }, - { 47207, true }, + { 47089, true }, + { 47113, true }, + { 47129, true }, + { 47146, true }, + { 47158, true }, + { 47176, true }, + { 47191, true }, + { 47220, true }, { 47237, true }, - { 47261, true }, - { 47277, true }, - { 47294, true }, - { 47306, true }, + { 47251, true }, + { 47273, true }, + { 47298, true }, + { 47311, true }, { 47324, true }, { 47339, true }, - { 47368, true }, - { 47385, true }, - { 47399, true }, - { 47421, true }, - { 47446, true }, - { 47459, true }, - { 47472, true }, - { 47487, true }, - { 47509, true }, + { 47361, true }, + { 47377, true }, + { 47401, true }, + { 47425, true }, + { 47439, true }, + { 47454, true }, + { 47473, true }, + { 47489, true }, + { 47508, true }, { 47525, true }, - { 47549, true }, - { 47573, true }, - { 47587, true }, + { 47543, true }, + { 47567, false }, + { 47589, true }, { 47602, true }, - { 47621, true }, - { 47637, true }, - { 47656, true }, - { 47673, true }, - { 47691, true }, - { 47715, false }, - { 47737, true }, - { 47750, true }, - { 47761, true }, - { 47773, true }, - { 47795, true }, - { 47805, true }, - { 47819, true }, - { 47837, true }, - { 47850, true }, - { 47869, true }, - { 47884, true }, - { 47899, true }, - { 47922, true }, - { 47935, true }, - { 47946, true }, - { 47959, true }, + { 47613, true }, + { 47625, true }, + { 47647, true }, + { 47657, true }, + { 47671, true }, + { 47689, true }, + { 47702, true }, + { 47721, true }, + { 47736, true }, + { 47751, true }, + { 47774, true }, + { 47787, true }, + { 47798, true }, + { 47811, true }, + { 47822, true }, + { 47840, true }, + { 47862, true }, + { 47887, true }, + { 47910, true }, + { 47930, true }, + { 47944, true }, + { 47957, true }, { 47970, true }, - { 47989, true }, - { 48007, true }, - { 48029, true }, - { 48054, true }, + { 47988, true }, + { 47998, true }, + { 48011, true }, + { 48038, true }, + { 48056, true }, { 48077, true }, - { 48097, true }, - { 48111, true }, - { 48124, true }, - { 48137, true }, - { 48155, true }, - { 48165, true }, - { 48178, true }, - { 48205, true }, - { 48223, true }, + { 48092, true }, + { 48110, true }, + { 48135, true }, + { 48150, false }, + { 48173, false }, + { 48182, true }, + { 48203, true }, + { 48220, true }, + { 48231, true }, { 48244, true }, - { 48259, true }, - { 48277, true }, - { 48302, true }, - { 48317, false }, - { 48340, false }, - { 48349, true }, - { 48370, true }, - { 48387, true }, - { 48398, true }, - { 48411, true }, - { 48424, false }, - { 48463, true }, - { 48474, true }, - { 48487, true }, - { 48499, true }, - { 48515, true }, - { 48529, false }, - { 48544, true }, - { 48564, false }, - { 48580, true }, - { 48599, true }, - { 48610, true }, - { 48623, true }, - { 48635, true }, - { 48647, true }, - { 48657, true }, + { 48257, false }, + { 48296, true }, + { 48307, true }, + { 48320, true }, + { 48332, true }, + { 48348, true }, + { 48362, false }, + { 48377, true }, + { 48397, false }, + { 48413, true }, + { 48432, true }, + { 48443, true }, + { 48456, true }, + { 48468, true }, + { 48480, true }, + { 48490, true }, + { 48513, true }, + { 48525, true }, + { 48534, true }, + { 48548, true }, + { 48563, true }, + { 48583, true }, + { 48597, true }, + { 48616, true }, + { 48627, true }, + { 48643, true }, + { 48664, true }, { 48680, true }, - { 48692, true }, - { 48701, true }, - { 48715, true }, - { 48730, true }, - { 48750, true }, - { 48764, true }, + { 48697, true }, + { 48709, true }, + { 48723, true }, + { 48735, true }, + { 48758, true }, { 48783, true }, - { 48794, true }, - { 48810, true }, - { 48831, true }, - { 48847, true }, - { 48864, true }, - { 48876, true }, - { 48890, true }, - { 48902, true }, - { 48925, true }, - { 48950, true }, - { 48970, true }, - { 48987, true }, - { 48996, true }, - { 49013, true }, - { 49025, true }, - { 49040, true }, - { 49059, true }, - { 49072, true }, - { 49090, true }, - { 49102, true }, - { 49121, true }, - { 49143, true }, - { 49155, true }, - { 49179, true }, + { 48803, true }, + { 48820, true }, + { 48829, true }, + { 48846, true }, + { 48858, true }, + { 48873, true }, + { 48892, true }, + { 48905, true }, + { 48923, true }, + { 48935, true }, + { 48954, true }, + { 48976, true }, + { 48988, true }, + { 49012, true }, + { 49042, true }, + { 49056, true }, + { 49080, true }, + { 49103, true }, + { 49117, true }, + { 49130, true }, + { 49142, true }, + { 49164, true }, + { 49184, true }, { 49209, true }, - { 49223, true }, - { 49247, true }, - { 49270, true }, - { 49284, true }, - { 49297, true }, - { 49309, true }, - { 49331, true }, - { 49351, true }, - { 49376, true }, - { 49388, true }, - { 49411, true }, - { 49430, true }, - { 49441, true }, - { 49453, true }, - { 49467, true }, - { 49479, true }, - { 49497, true }, - { 49513, true }, - { 49531, true }, - { 49549, true }, - { 49567, true }, - { 49583, true }, - { 49600, true }, - { 49629, true }, - { 49642, true }, - { 49653, true }, - { 49671, true }, - { 49689, true }, - { 49712, true }, - { 49729, false }, - { 49744, true }, - { 49756, true }, - { 49768, true }, - { 49781, true }, - { 49790, true }, - { 49805, true }, - { 49813, true }, - { 49826, true }, - { 49845, true }, - { 49859, true }, - { 49871, true }, - { 49878, true }, - { 49890, true }, - { 49904, false }, - { 49921, true }, - { 49932, true }, - { 49945, true }, - { 49958, true }, - { 49975, true }, - { 49994, false }, - { 50007, true }, - { 50025, true }, - { 50051, true }, - { 50065, true }, - { 50082, true }, - { 50101, true }, - { 50116, true }, - { 50130, true }, - { 50141, true }, - { 50155, true }, - { 50172, true }, - { 50185, true }, + { 49221, true }, + { 49244, true }, + { 49263, true }, + { 49274, true }, + { 49286, true }, + { 49300, true }, + { 49312, true }, + { 49330, true }, + { 49346, true }, + { 49364, true }, + { 49382, true }, + { 49400, true }, + { 49416, true }, + { 49433, true }, + { 49462, true }, + { 49475, true }, + { 49486, true }, + { 49504, true }, + { 49522, true }, + { 49545, true }, + { 49562, false }, + { 49577, true }, + { 49589, true }, + { 49601, true }, + { 49614, true }, + { 49623, true }, + { 49638, true }, + { 49646, true }, + { 49659, true }, + { 49678, true }, + { 49692, true }, + { 49704, true }, + { 49711, true }, + { 49723, true }, + { 49737, false }, + { 49754, true }, + { 49765, true }, + { 49778, true }, + { 49791, true }, + { 49808, true }, + { 49827, false }, + { 49840, true }, + { 49858, true }, + { 49884, true }, + { 49898, true }, + { 49915, true }, + { 49934, true }, + { 49949, true }, + { 49963, true }, + { 49974, true }, + { 49988, true }, + { 50005, true }, + { 50018, true }, + { 50031, true }, + { 50049, true }, + { 50068, true }, + { 50084, true }, + { 50103, true }, + { 50122, true }, + { 50142, true }, + { 50158, true }, + { 50174, true }, + { 50188, true }, { 50198, true }, - { 50216, true }, - { 50235, true }, - { 50251, true }, + { 50206, true }, + { 50232, true }, + { 50249, true }, { 50270, true }, - { 50289, true }, - { 50309, true }, - { 50325, true }, - { 50341, true }, - { 50355, true }, + { 50288, true }, + { 50319, true }, + { 50338, true }, + { 50354, true }, { 50365, true }, - { 50373, true }, - { 50399, true }, - { 50416, true }, - { 50437, true }, - { 50455, true }, - { 50474, true }, - { 50490, true }, - { 50501, true }, - { 50515, true }, - { 50534, true }, - { 50546, true }, - { 50562, true }, - { 50583, false }, - { 50602, true }, - { 50616, true }, - { 50625, true }, - { 50642, true }, - { 50656, true }, - { 50665, true }, - { 50680, true }, - { 50695, true }, - { 50703, true }, - { 50714, true }, - { 50732, true }, - { 50753, true }, - { 50774, true }, - { 50785, true }, - { 50794, true }, - { 50813, true }, - { 50826, true }, - { 50841, true }, - { 50863, true }, - { 50877, false }, + { 50379, true }, + { 50398, true }, + { 50410, true }, + { 50426, true }, + { 50447, false }, + { 50466, true }, + { 50480, true }, + { 50489, true }, + { 50506, true }, + { 50520, true }, + { 50529, true }, + { 50544, true }, + { 50559, true }, + { 50576, true }, + { 50584, true }, + { 50595, true }, + { 50613, true }, + { 50634, true }, + { 50655, true }, + { 50666, true }, + { 50675, true }, + { 50694, true }, + { 50707, true }, + { 50722, true }, + { 50744, true }, + { 50758, false }, + { 50772, true }, + { 50788, true }, + { 50800, true }, + { 50817, true }, + { 50829, true }, + { 50844, true }, + { 50856, true }, + { 50879, true }, { 50891, true }, - { 50907, true }, - { 50919, true }, - { 50936, true }, - { 50948, true }, - { 50963, true }, - { 50975, true }, - { 50998, true }, - { 51010, true }, - { 51033, true }, - { 51052, true }, - { 51060, true }, + { 50914, true }, + { 50933, true }, + { 50941, true }, + { 50957, true }, + { 50972, true }, + { 50997, true }, + { 51007, true }, + { 51017, true }, + { 51024, true }, + { 51041, true }, + { 51055, true }, { 51076, true }, - { 51091, true }, - { 51116, true }, - { 51126, true }, - { 51136, true }, - { 51143, true }, + { 51085, true }, + { 51093, true }, + { 51107, false }, + { 51118, true }, + { 51134, false }, + { 51144, false }, { 51160, true }, - { 51174, true }, - { 51195, true }, - { 51204, true }, - { 51212, true }, - { 51226, false }, - { 51237, true }, - { 51253, false }, - { 51263, false }, - { 51279, true }, - { 51292, true }, - { 51306, true }, - { 51321, true }, - { 51337, true }, - { 51359, true }, - { 51377, true }, + { 51173, true }, + { 51187, true }, + { 51202, true }, + { 51218, true }, + { 51240, true }, + { 51258, true }, + { 51270, true }, + { 51284, true }, + { 51298, true }, + { 51313, true }, + { 51328, true }, + { 51353, true }, + { 51373, true }, { 51389, true }, - { 51403, true }, - { 51417, true }, - { 51432, true }, - { 51447, true }, - { 51472, true }, - { 51492, true }, - { 51508, true }, - { 51521, true }, - { 51535, true }, - { 51548, true }, - { 51578, true }, - { 51590, true }, - { 51605, true }, - { 51615, true }, - { 51631, true }, - { 51639, false }, - { 51651, true }, - { 51662, true }, - { 51671, true }, - { 51679, true }, - { 51689, true }, - { 51704, true }, - { 51721, true }, - { 51737, true }, - { 51753, true }, - { 51766, true }, - { 51782, true }, - { 51795, true }, - { 51802, true }, - { 51819, true }, - { 51828, true }, - { 51836, true }, - { 51850, true }, - { 51858, false }, - { 51869, true }, - { 51878, true }, - { 51891, true }, - { 51899, true }, - { 51908, true }, - { 51918, true }, - { 51927, true }, - { 51935, true }, - { 51950, true }, - { 51958, true }, - { 51978, true }, - { 52001, true }, - { 52014, true }, - { 52028, true }, - { 52047, true }, - { 52066, true }, - { 52080, true }, - { 52089, true }, - { 52109, true }, - { 52132, true }, - { 52142, true }, - { 52152, true }, - { 52170, true }, + { 51402, true }, + { 51416, true }, + { 51429, true }, + { 51459, true }, + { 51471, true }, + { 51486, true }, + { 51496, true }, + { 51512, true }, + { 51520, false }, + { 51532, true }, + { 51543, true }, + { 51552, true }, + { 51560, true }, + { 51570, true }, + { 51585, true }, + { 51602, true }, + { 51618, true }, + { 51634, true }, + { 51647, true }, + { 51663, true }, + { 51676, true }, + { 51683, true }, + { 51700, true }, + { 51709, true }, + { 51717, true }, + { 51731, true }, + { 51739, false }, + { 51750, true }, + { 51759, true }, + { 51772, true }, + { 51780, true }, + { 51789, true }, + { 51799, true }, + { 51808, true }, + { 51816, true }, + { 51831, true }, + { 51839, true }, + { 51859, true }, + { 51882, true }, + { 51895, true }, + { 51909, true }, + { 51928, true }, + { 51947, true }, + { 51961, true }, + { 51970, true }, + { 51990, true }, + { 52013, true }, + { 52023, true }, + { 52033, true }, + { 52051, true }, + { 52071, true }, + { 52084, true }, + { 52100, true }, + { 52110, true }, + { 52121, true }, + { 52131, true }, + { 52148, true }, + { 52164, true }, + { 52171, true }, { 52190, true }, { 52203, true }, - { 52219, true }, - { 52229, true }, - { 52240, true }, - { 52250, true }, - { 52267, true }, - { 52283, true }, - { 52290, true }, - { 52309, true }, - { 52322, true }, - { 52333, true }, - { 52340, true }, - { 52351, true }, - { 52362, true }, - { 52370, true }, - { 52380, true }, - { 52394, true }, - { 52414, true }, - { 52430, true }, - { 52446, true }, - { 52467, true }, - { 52486, true }, - { 52508, true }, - { 52520, true }, - { 52531, false }, - { 52553, true }, - { 52572, true }, - { 52588, true }, - { 52606, true }, + { 52214, true }, + { 52221, true }, + { 52232, true }, + { 52243, true }, + { 52251, true }, + { 52261, true }, + { 52275, true }, + { 52295, true }, + { 52311, true }, + { 52327, true }, + { 52348, true }, + { 52367, true }, + { 52389, true }, + { 52401, true }, + { 52412, false }, + { 52434, true }, + { 52453, true }, + { 52469, true }, + { 52487, true }, + { 52502, true }, + { 52519, true }, + { 52538, true }, + { 52550, true }, + { 52565, true }, + { 52585, true }, + { 52602, true }, + { 52612, true }, { 52621, true }, - { 52638, true }, - { 52657, true }, - { 52669, true }, - { 52684, true }, - { 52704, true }, - { 52721, true }, - { 52731, true }, - { 52740, true }, - { 52752, true }, - { 52762, true }, - { 52771, true }, - { 52780, true }, + { 52633, true }, + { 52643, true }, + { 52652, true }, + { 52661, true }, + { 52670, true }, + { 52679, true }, + { 52689, true }, + { 52699, true }, + { 52708, true }, + { 52717, true }, + { 52727, true }, + { 52745, true }, + { 52761, true }, + { 52769, true }, + { 52776, true }, { 52789, true }, - { 52798, true }, - { 52808, true }, - { 52818, true }, + { 52806, true }, + { 52820, true }, { 52827, true }, - { 52836, true }, - { 52846, true }, - { 52864, true }, - { 52880, true }, - { 52888, true }, - { 52895, true }, - { 52908, true }, - { 52925, true }, - { 52939, true }, - { 52946, true }, - { 52956, true }, - { 52967, true }, - { 52979, true }, - { 52996, true }, - { 53013, true }, - { 53033, true }, - { 53052, false }, + { 52837, true }, + { 52848, true }, + { 52860, true }, + { 52877, true }, + { 52894, true }, + { 52914, true }, + { 52933, false }, + { 52947, true }, + { 52965, true }, + { 52978, true }, + { 52995, true }, + { 53009, true }, + { 53023, true }, + { 53040, true }, { 53066, true }, - { 53084, true }, - { 53097, true }, - { 53114, true }, - { 53128, true }, - { 53142, true }, - { 53159, true }, - { 53185, true }, - { 53200, true }, - { 53214, true }, - { 53229, true }, - { 53244, true }, - { 53255, true }, - { 53268, true }, + { 53081, true }, + { 53095, true }, + { 53110, true }, + { 53125, true }, + { 53136, true }, + { 53149, true }, + { 53163, true }, + { 53173, true }, + { 53184, true }, + { 53203, true }, + { 53218, true }, + { 53233, true }, + { 53260, true }, + { 53270, true }, { 53282, true }, - { 53292, true }, - { 53303, true }, - { 53322, true }, - { 53337, true }, - { 53352, true }, - { 53379, true }, - { 53389, true }, - { 53401, true }, - { 53412, true }, - { 53426, true }, - { 53434, true }, - { 53445, true }, - { 53454, true }, - { 53462, true }, - { 53473, true }, - { 53488, true }, - { 53515, true }, - { 53525, true }, - { 53536, true }, - { 53547, true }, - { 53557, true }, - { 53571, true }, - { 53585, true }, - { 53596, true }, - { 53603, false }, - { 53611, true }, - { 53619, true }, - { 53635, true }, - { 53649, true }, - { 53665, true }, - { 53679, true }, - { 53686, true }, - { 53695, true }, - { 53702, true }, - { 53714, true }, - { 53721, true }, - { 53728, true }, - { 53734, true }, - { 53750, true }, - { 53762, true }, - { 53776, true }, - { 53803, true }, - { 53835, true }, - { 53857, true }, - { 53868, true }, - { 53879, true }, - { 53890, true }, - { 53901, true }, - { 53917, true }, - { 53934, true }, - { 53947, true }, - { 53973, false }, - { 53996, true }, - { 54012, true }, - { 54022, true }, - { 54035, true }, - { 54054, true }, - { 54067, true }, - { 54078, true }, - { 54093, true }, - { 54111, true }, - { 54123, true }, - { 54137, true }, - { 54149, true }, + { 53293, true }, + { 53307, true }, + { 53315, true }, + { 53326, true }, + { 53335, true }, + { 53343, true }, + { 53354, true }, + { 53369, true }, + { 53396, true }, + { 53406, true }, + { 53417, true }, + { 53428, true }, + { 53438, true }, + { 53452, true }, + { 53466, true }, + { 53477, true }, + { 53484, false }, + { 53492, true }, + { 53500, true }, + { 53516, true }, + { 53530, true }, + { 53546, true }, + { 53560, true }, + { 53567, true }, + { 53576, true }, + { 53583, true }, + { 53595, true }, + { 53602, true }, + { 53609, true }, + { 53615, true }, + { 53631, true }, + { 53643, true }, + { 53657, true }, + { 53684, true }, + { 53716, true }, + { 53738, true }, + { 53749, true }, + { 53760, true }, + { 53771, true }, + { 53782, true }, + { 53798, true }, + { 53815, true }, + { 53828, true }, + { 53854, false }, + { 53877, true }, + { 53893, true }, + { 53903, true }, + { 53916, true }, + { 53935, true }, + { 53948, true }, + { 53959, true }, + { 53974, true }, + { 53992, true }, + { 54004, true }, + { 54018, true }, + { 54030, true }, + { 54044, true }, + { 54062, true }, + { 54075, true }, + { 54094, true }, + { 54104, true }, + { 54115, true }, + { 54128, true }, + { 54145, true }, { 54163, true }, - { 54181, true }, - { 54194, true }, - { 54213, true }, + { 54179, true }, + { 54210, true }, { 54223, true }, - { 54234, true }, - { 54247, true }, + { 54232, true }, + { 54250, true }, { 54264, true }, - { 54282, true }, - { 54298, true }, - { 54329, true }, - { 54342, true }, - { 54351, true }, - { 54369, true }, - { 54383, true }, - { 54402, true }, - { 54420, true }, - { 54435, true }, - { 54456, true }, - { 54477, true }, - { 54493, true }, - { 54509, true }, - { 54528, true }, - { 54543, true }, - { 54564, true }, - { 54584, true }, - { 54604, true }, - { 54624, true }, - { 54640, true }, - { 54657, true }, + { 54283, true }, + { 54301, true }, + { 54316, true }, + { 54337, true }, + { 54358, true }, + { 54374, true }, + { 54390, true }, + { 54409, true }, + { 54424, true }, + { 54445, true }, + { 54465, true }, + { 54485, true }, + { 54505, true }, + { 54521, true }, + { 54538, true }, + { 54556, true }, + { 54576, true }, + { 54592, true }, + { 54603, false }, + { 54613, true }, + { 54622, true }, + { 54634, true }, + { 54643, true }, + { 54661, true }, { 54675, true }, - { 54695, true }, - { 54711, true }, - { 54722, false }, - { 54732, true }, - { 54741, true }, - { 54753, true }, - { 54762, true }, - { 54780, true }, - { 54798, false }, - { 54810, true }, + { 54693, false }, + { 54705, true }, + { 54718, true }, + { 54733, true }, + { 54748, true }, + { 54763, true }, + { 54771, true }, + { 54789, true }, { 54823, true }, - { 54838, true }, - { 54853, true }, - { 54868, true }, - { 54876, true }, - { 54894, true }, - { 54928, true }, - { 54939, true }, - { 54952, false }, - { 54966, true }, - { 54984, true }, - { 54995, true }, - { 55013, true }, - { 55024, true }, + { 54834, true }, + { 54847, false }, + { 54861, true }, + { 54879, true }, + { 54890, true }, + { 54908, true }, + { 54919, true }, + { 54934, true }, + { 54945, true }, + { 54959, true }, + { 54974, true }, + { 54990, true }, + { 55010, true }, + { 55027, true }, { 55039, true }, - { 55050, true }, - { 55064, true }, - { 55079, true }, - { 55095, true }, - { 55115, true }, - { 55132, true }, - { 55144, true }, - { 55173, true }, - { 55206, true }, - { 55218, true }, - { 55230, true }, - { 55247, true }, - { 55259, true }, - { 55271, true }, - { 55286, false }, - { 55298, true }, - { 55307, true }, - { 55319, true }, - { 55331, true }, - { 55348, true }, - { 55363, false }, - { 55377, true }, - { 55387, true }, - { 55407, true }, - { 55425, true }, - { 55438, false }, - { 55452, true }, - { 55463, true }, - { 55476, true }, - { 55485, true }, - { 55495, false }, - { 55511, true }, - { 55523, true }, - { 55538, true }, - { 55552, true }, - { 55566, true }, - { 55580, true }, - { 55594, true }, - { 55614, true }, - { 55635, true }, - { 55653, true }, - { 55664, true }, - { 55684, true }, - { 55697, true }, - { 55710, true }, - { 55737, true }, - { 55748, true }, - { 55765, true }, - { 55791, true }, - { 55811, true }, - { 55825, true }, - { 55842, false }, - { 55856, true }, - { 55870, false }, - { 55887, true }, - { 55912, true }, - { 55928, true }, + { 55068, true }, + { 55101, true }, + { 55113, true }, + { 55125, true }, + { 55142, true }, + { 55154, true }, + { 55166, true }, + { 55181, false }, + { 55193, true }, + { 55202, true }, + { 55214, true }, + { 55226, true }, + { 55243, true }, + { 55258, false }, + { 55272, true }, + { 55282, true }, + { 55302, true }, + { 55320, true }, + { 55333, false }, + { 55347, true }, + { 55358, true }, + { 55371, true }, + { 55380, true }, + { 55390, false }, + { 55406, true }, + { 55418, true }, + { 55433, true }, + { 55447, true }, + { 55461, true }, + { 55475, true }, + { 55489, true }, + { 55509, true }, + { 55530, true }, + { 55548, true }, + { 55559, true }, + { 55579, true }, + { 55592, true }, + { 55605, true }, + { 55632, true }, + { 55643, true }, + { 55660, true }, + { 55686, true }, + { 55706, true }, + { 55720, true }, + { 55737, false }, + { 55751, true }, + { 55765, false }, + { 55782, true }, + { 55807, true }, + { 55823, true }, + { 55836, true }, + { 55849, true }, + { 55865, true }, + { 55892, true }, + { 55911, true }, + { 55930, true }, { 55941, true }, - { 55954, true }, - { 55970, true }, - { 55997, true }, - { 56016, true }, + { 55956, true }, + { 55968, true }, + { 55983, true }, + { 55998, true }, + { 56013, true }, { 56035, true }, - { 56046, true }, - { 56061, true }, - { 56073, true }, - { 56088, true }, - { 56103, true }, - { 56118, true }, - { 56140, true }, - { 56158, true }, - { 56174, true }, - { 56191, true }, - { 56211, true }, - { 56225, true }, - { 56241, true }, - { 56259, true }, - { 56278, true }, - { 56291, true }, - { 56308, true }, - { 56321, true }, - { 56335, true }, - { 56350, true }, - { 56366, true }, - { 56385, true }, - { 56406, true }, - { 56423, true }, - { 56439, true }, - { 56456, true }, - { 56468, true }, - { 56481, true }, - { 56492, true }, - { 56518, true }, - { 56538, false }, - { 56549, true }, - { 56567, true }, - { 56581, true }, - { 56593, true }, - { 56604, true }, - { 56612, true }, - { 56621, true }, - { 56638, true }, - { 56649, true }, - { 56661, true }, - { 56669, true }, - { 56679, true }, - { 56690, true }, - { 56711, true }, - { 56723, true }, - { 56734, true }, - { 56742, true }, - { 56749, true }, - { 56757, true }, - { 56768, true }, - { 56779, true }, - { 56789, true }, - { 56805, true }, - { 56818, true }, + { 56053, true }, + { 56069, true }, + { 56086, true }, + { 56106, true }, + { 56120, true }, + { 56136, true }, + { 56154, true }, + { 56173, true }, + { 56186, true }, + { 56203, true }, + { 56216, true }, + { 56230, true }, + { 56245, true }, + { 56261, true }, + { 56280, true }, + { 56301, true }, + { 56318, true }, + { 56334, true }, + { 56351, true }, + { 56363, true }, + { 56376, true }, + { 56387, true }, + { 56413, true }, + { 56433, false }, + { 56444, true }, + { 56462, true }, + { 56476, true }, + { 56488, true }, + { 56499, true }, + { 56507, true }, + { 56516, true }, + { 56533, true }, + { 56544, true }, + { 56556, true }, + { 56564, true }, + { 56574, true }, + { 56585, true }, + { 56606, true }, + { 56618, true }, + { 56629, true }, + { 56637, true }, + { 56644, true }, + { 56652, true }, + { 56663, true }, + { 56674, true }, + { 56684, true }, + { 56700, true }, + { 56713, true }, + { 56728, true }, + { 56745, true }, + { 56767, true }, + { 56788, true }, + { 56796, true }, + { 56809, true }, + { 56819, true }, { 56833, true }, - { 56850, true }, - { 56872, true }, - { 56893, true }, - { 56901, true }, - { 56914, true }, - { 56924, true }, - { 56938, true }, - { 56949, false }, - { 56969, true }, - { 56984, true }, - { 56997, true }, + { 56844, false }, + { 56864, true }, + { 56879, true }, + { 56892, true }, + { 56905, true }, + { 56917, true }, + { 56929, true }, + { 56950, true }, + { 56964, true }, + { 56978, true }, + { 56995, true }, { 57010, true }, - { 57022, true }, - { 57034, true }, - { 57055, true }, - { 57069, true }, - { 57083, true }, - { 57100, true }, - { 57115, true }, - { 57129, true }, - { 57143, true }, - { 57157, true }, - { 57171, true }, - { 57185, true }, - { 57200, true }, - { 57212, true }, - { 57226, true }, - { 57244, true }, - { 57259, true }, - { 57274, true }, - { 57286, true }, - { 57298, true }, - { 57310, true }, - { 57320, true }, - { 57333, true }, - { 57346, true }, - { 57367, true }, - { 57382, true }, - { 57399, true }, - { 57412, true }, - { 57424, true }, - { 57437, true }, - { 57452, true }, - { 57469, true }, - { 57486, true }, - { 57494, true }, - { 57506, true }, - { 57515, true }, - { 57535, true }, + { 57024, true }, + { 57038, true }, + { 57052, true }, + { 57066, true }, + { 57080, true }, + { 57095, true }, + { 57107, true }, + { 57121, true }, + { 57139, true }, + { 57154, true }, + { 57169, true }, + { 57181, true }, + { 57193, true }, + { 57205, true }, + { 57215, true }, + { 57228, true }, + { 57241, true }, + { 57262, true }, + { 57277, true }, + { 57294, true }, + { 57307, true }, + { 57319, true }, + { 57332, true }, + { 57347, true }, + { 57364, true }, + { 57381, true }, + { 57389, true }, + { 57401, true }, + { 57410, true }, + { 57430, true }, + { 57441, true }, + { 57456, true }, + { 57472, true }, + { 57479, true }, + { 57502, true }, + { 57516, true }, + { 57531, true }, { 57546, true }, { 57561, true }, - { 57577, true }, - { 57584, true }, - { 57607, true }, - { 57621, true }, - { 57636, true }, - { 57651, true }, - { 57666, true }, - { 57677, true }, - { 57687, true }, - { 57696, true }, - { 57708, true }, - { 57719, true }, - { 57730, true }, - { 57743, true }, - { 57764, true }, - { 57774, true }, - { 57790, true }, - { 57805, true }, - { 57821, true }, - { 57838, true }, - { 57854, true }, - { 57871, true }, - { 57885, true }, - { 57900, true }, - { 57916, true }, - { 57931, true }, - { 57941, true }, - { 57954, true }, - { 57966, true }, - { 57994, true }, - { 58006, true }, - { 58020, true }, - { 58034, true }, - { 58045, true }, - { 58061, true }, - { 58072, true }, - { 58085, true }, - { 58096, true }, - { 58118, true }, - { 58138, true }, - { 58159, true }, - { 58174, true }, - { 58188, true }, - { 58203, true }, - { 58217, true }, - { 58229, true }, + { 57572, true }, + { 57582, true }, + { 57591, true }, + { 57603, true }, + { 57614, true }, + { 57625, true }, + { 57638, true }, + { 57659, true }, + { 57669, true }, + { 57685, true }, + { 57700, true }, + { 57716, true }, + { 57733, true }, + { 57749, true }, + { 57766, true }, + { 57780, true }, + { 57795, true }, + { 57811, true }, + { 57826, true }, + { 57836, true }, + { 57849, true }, + { 57861, true }, + { 57889, true }, + { 57901, true }, + { 57915, true }, + { 57929, true }, + { 57940, true }, + { 57956, true }, + { 57967, true }, + { 57980, true }, + { 57991, true }, + { 58013, true }, + { 58033, true }, + { 58054, true }, + { 58069, true }, + { 58083, true }, + { 58098, true }, + { 58112, true }, + { 58124, true }, + { 58135, true }, + { 58154, true }, + { 58166, true }, + { 58183, true }, + { 58196, true }, + { 58210, true }, + { 58223, true }, { 58240, true }, - { 58259, true }, - { 58271, true }, - { 58288, true }, - { 58301, true }, - { 58315, true }, - { 58328, true }, + { 58253, true }, + { 58265, true }, + { 58278, true }, + { 58290, true }, + { 58303, true }, + { 58316, true }, + { 58327, true }, { 58345, true }, - { 58358, true }, - { 58370, true }, - { 58383, true }, - { 58395, true }, - { 58408, true }, - { 58421, true }, - { 58432, true }, - { 58450, true }, - { 58468, true }, - { 58480, true }, - { 58495, true }, - { 58510, true }, - { 58524, true }, - { 58540, true }, - { 58554, true }, - { 58562, true }, - { 58591, true }, - { 58610, true }, - { 58623, true }, - { 58648, true }, - { 58665, true }, - { 58686, true }, - { 58698, true }, - { 58709, true }, - { 58722, true }, - { 58739, true }, - { 58751, true }, - { 58775, true }, - { 58808, true }, - { 58820, true }, - { 58842, true }, - { 58859, true }, - { 58874, true }, - { 58888, true }, - { 58914, true }, - { 58933, true }, - { 58946, true }, - { 58956, true }, - { 58966, true }, - { 58987, true }, - { 58996, true }, - { 59014, true }, - { 59032, true }, - { 59050, true }, - { 59067, true }, - { 59089, true }, - { 59106, true }, - { 59118, true }, - { 59135, true }, - { 59162, true }, - { 59187, true }, - { 59202, true }, + { 58363, true }, + { 58375, true }, + { 58390, true }, + { 58405, true }, + { 58419, true }, + { 58435, true }, + { 58449, true }, + { 58457, true }, + { 58486, true }, + { 58505, true }, + { 58518, true }, + { 58543, true }, + { 58560, true }, + { 58581, true }, + { 58593, true }, + { 58604, true }, + { 58617, true }, + { 58634, true }, + { 58646, true }, + { 58670, true }, + { 58703, true }, + { 58715, true }, + { 58737, true }, + { 58754, true }, + { 58769, true }, + { 58783, true }, + { 58809, true }, + { 58828, true }, + { 58841, true }, + { 58851, true }, + { 58861, true }, + { 58882, true }, + { 58891, true }, + { 58909, true }, + { 58927, true }, + { 58945, true }, + { 58962, true }, + { 58984, true }, + { 59001, true }, + { 59013, true }, + { 59030, true }, + { 59057, true }, + { 59082, true }, + { 59097, true }, + { 59117, true }, + { 59132, true }, + { 59147, true }, + { 59160, true }, + { 59181, true }, + { 59206, true }, { 59222, true }, - { 59237, true }, - { 59252, true }, - { 59265, true }, - { 59286, true }, - { 59311, true }, - { 59327, true }, - { 59351, true }, - { 59364, true }, + { 59235, true }, + { 59264, true }, + { 59274, true }, + { 59285, false }, + { 59299, true }, + { 59313, true }, + { 59332, true }, + { 59346, true }, + { 59361, false }, + { 59376, true }, { 59393, true }, - { 59403, true }, - { 59414, false }, - { 59428, true }, - { 59442, true }, - { 59461, true }, - { 59475, false }, - { 59490, true }, - { 59507, true }, - { 59516, true }, - { 59526, true }, - { 59564, true }, - { 59579, true }, - { 59590, true }, - { 59602, true }, - { 59620, true }, - { 59631, true }, - { 59639, true }, - { 59648, true }, - { 59661, true }, - { 59671, true }, - { 59680, false }, + { 59402, true }, + { 59412, true }, + { 59450, true }, + { 59465, true }, + { 59476, true }, + { 59488, true }, + { 59506, true }, + { 59517, true }, + { 59525, true }, + { 59534, true }, + { 59547, true }, + { 59557, true }, + { 59566, false }, + { 59591, true }, + { 59609, false }, + { 59633, true }, + { 59647, true }, + { 59666, true }, + { 59693, true }, { 59705, true }, - { 59723, false }, - { 59747, true }, - { 59761, true }, - { 59780, true }, - { 59807, true }, - { 59819, true }, - { 59831, true }, - { 59839, true }, - { 59848, true }, - { 59862, true }, - { 59879, true }, - { 59895, true }, - { 59910, false }, - { 59922, true }, - { 59934, true }, - { 59951, true }, - { 59961, true }, - { 59973, true }, - { 59985, true }, - { 59995, true }, - { 60006, true }, - { 60019, true }, - { 60033, true }, - { 60050, true }, - { 60068, false }, + { 59717, true }, + { 59725, true }, + { 59734, true }, + { 59748, true }, + { 59765, true }, + { 59781, true }, + { 59796, false }, + { 59808, true }, + { 59820, true }, + { 59837, true }, + { 59847, true }, + { 59859, true }, + { 59871, true }, + { 59881, true }, + { 59892, true }, + { 59905, true }, + { 59919, true }, + { 59936, true }, + { 59954, false }, + { 59974, true }, + { 59986, true }, + { 59998, true }, + { 60007, true }, + { 60018, true }, + { 60030, true }, + { 60043, true }, + { 60053, true }, + { 60066, true }, { 60088, true }, - { 60100, true }, - { 60112, true }, - { 60121, true }, - { 60132, true }, - { 60144, true }, - { 60157, true }, - { 60167, true }, - { 60180, true }, - { 60202, true }, - { 60216, true }, - { 60225, true }, - { 60237, true }, - { 60244, true }, - { 60257, true }, - { 60269, true }, + { 60102, true }, + { 60111, true }, + { 60123, true }, + { 60130, true }, + { 60143, true }, + { 60155, true }, + { 60170, true }, + { 60179, true }, + { 60188, true }, + { 60198, true }, + { 60212, true }, + { 60229, true }, + { 60240, true }, + { 60254, true }, + { 60263, true }, + { 60272, true }, { 60284, true }, - { 60293, true }, - { 60302, true }, - { 60312, true }, - { 60326, true }, - { 60343, true }, - { 60354, true }, - { 60368, true }, - { 60377, true }, - { 60386, true }, - { 60398, true }, - { 60414, true }, - { 60430, true }, - { 60447, true }, - { 60464, true }, - { 60474, true }, - { 60496, true }, - { 60505, true }, - { 60517, true }, - { 60540, true }, - { 60554, true }, - { 60568, true }, - { 60583, true }, - { 60616, true }, - { 60644, true }, - { 60669, true }, - { 60678, true }, - { 60694, true }, - { 60706, true }, - { 60717, true }, - { 60728, true }, - { 60753, true }, - { 60768, true }, - { 60790, true }, - { 60806, true }, - { 60837, true }, - { 60848, true }, - { 60860, true }, - { 60876, true }, - { 60890, true }, - { 60905, true }, - { 60914, true }, - { 60932, true }, - { 60946, true }, - { 60961, true }, - { 60979, true }, - { 60989, true }, - { 61002, true }, - { 61012, true }, - { 61035, true }, - { 61047, true }, - { 61062, true }, - { 61077, true }, - { 61091, true }, - { 61105, true }, - { 61118, true }, - { 61130, true }, - { 61144, true }, - { 61155, true }, - { 61167, true }, - { 61179, true }, - { 61190, true }, - { 61202, true }, - { 61218, false }, - { 61231, true }, - { 61243, false }, - { 61260, true }, - { 61280, true }, - { 61297, true }, - { 61321, true }, - { 61339, true }, - { 61355, true }, + { 60300, true }, + { 60316, true }, + { 60333, true }, + { 60350, true }, + { 60360, true }, + { 60382, true }, + { 60391, true }, + { 60403, true }, + { 60426, true }, + { 60440, true }, + { 60454, true }, + { 60469, true }, + { 60502, true }, + { 60530, true }, + { 60555, true }, + { 60564, true }, + { 60580, true }, + { 60592, true }, + { 60603, true }, + { 60614, true }, + { 60639, true }, + { 60654, true }, + { 60676, true }, + { 60692, true }, + { 60723, true }, + { 60734, true }, + { 60746, true }, + { 60762, true }, + { 60776, true }, + { 60791, true }, + { 60800, true }, + { 60818, true }, + { 60832, true }, + { 60847, true }, + { 60865, true }, + { 60875, true }, + { 60888, true }, + { 60898, true }, + { 60921, true }, + { 60933, true }, + { 60948, true }, + { 60963, true }, + { 60977, true }, + { 60991, true }, + { 61004, true }, + { 61016, true }, + { 61030, true }, + { 61041, true }, + { 61053, true }, + { 61065, true }, + { 61076, true }, + { 61088, true }, + { 61104, false }, + { 61117, true }, + { 61129, false }, + { 61146, true }, + { 61166, true }, + { 61183, true }, + { 61207, true }, + { 61225, true }, + { 61241, true }, + { 61257, true }, + { 61272, true }, + { 61287, true }, + { 61310, true }, + { 61336, true }, + { 61356, true }, { 61371, true }, - { 61386, true }, - { 61401, true }, - { 61424, true }, + { 61391, true }, + { 61413, false }, + { 61431, true }, { 61450, true }, - { 61470, true }, - { 61485, true }, - { 61505, true }, - { 61527, false }, - { 61545, true }, - { 61564, true }, - { 61581, true }, - { 61600, true }, - { 61613, true }, - { 61630, true }, - { 61640, false }, - { 61657, true }, - { 61676, true }, - { 61684, true }, + { 61467, true }, + { 61486, true }, + { 61499, true }, + { 61516, true }, + { 61526, false }, + { 61543, true }, + { 61562, true }, + { 61570, true }, + { 61587, true }, + { 61601, true }, + { 61618, true }, + { 61626, true }, + { 61637, true }, + { 61649, true }, + { 61660, true }, + { 61670, true }, + { 61681, true }, + { 61691, true }, { 61701, true }, - { 61715, true }, - { 61732, true }, - { 61740, true }, - { 61751, true }, - { 61763, true }, - { 61774, true }, - { 61784, true }, - { 61795, true }, - { 61805, true }, - { 61815, true }, - { 61828, true }, - { 61842, true }, - { 61853, true }, - { 61866, true }, - { 61885, false }, - { 61893, true }, - { 61904, true }, - { 61915, true }, - { 61928, true }, - { 61941, true }, - { 61960, true }, - { 61981, true }, - { 61997, true }, - { 62021, true }, - { 62033, true }, + { 61714, true }, + { 61728, true }, + { 61739, true }, + { 61752, true }, + { 61771, false }, + { 61779, true }, + { 61790, true }, + { 61801, true }, + { 61814, true }, + { 61827, true }, + { 61846, true }, + { 61867, true }, + { 61883, true }, + { 61907, true }, + { 61919, true }, + { 61933, true }, + { 61954, true }, + { 61968, true }, + { 61979, true }, + { 61990, true }, + { 62004, true }, + { 62016, true }, + { 62031, true }, { 62047, true }, - { 62068, true }, - { 62082, true }, - { 62093, true }, - { 62104, true }, - { 62118, true }, - { 62130, true }, - { 62145, true }, - { 62161, true }, - { 62173, true }, - { 62187, true }, - { 62202, true }, - { 62220, true }, - { 62235, true }, - { 62249, true }, - { 62271, true }, - { 62288, true }, - { 62303, true }, - { 62319, true }, - { 62333, true }, - { 62354, true }, - { 62370, true }, - { 62389, true }, - { 62408, true }, - { 62425, false }, - { 62445, true }, - { 62475, true }, - { 62501, true }, - { 62518, true }, - { 62540, true }, + { 62059, true }, + { 62073, true }, + { 62088, true }, + { 62106, true }, + { 62121, true }, + { 62135, true }, + { 62157, true }, + { 62174, true }, + { 62189, true }, + { 62205, true }, + { 62219, true }, + { 62240, true }, + { 62256, true }, + { 62275, true }, + { 62294, true }, + { 62311, false }, + { 62331, true }, + { 62361, true }, + { 62387, true }, + { 62404, true }, + { 62426, true }, + { 62446, true }, + { 62460, true }, + { 62483, true }, + { 62502, true }, + { 62524, true }, + { 62542, true }, { 62560, true }, - { 62574, true }, + { 62575, true }, + { 62586, true }, { 62597, true }, - { 62616, true }, - { 62638, true }, - { 62656, true }, - { 62674, true }, - { 62689, true }, + { 62607, true }, + { 62624, true }, + { 62643, true }, + { 62653, true }, + { 62671, true }, + { 62690, true }, { 62700, true }, - { 62711, true }, - { 62721, true }, - { 62738, true }, - { 62757, true }, - { 62767, true }, - { 62785, true }, - { 62804, true }, - { 62814, true }, - { 62832, true }, - { 62841, false }, - { 62852, false }, - { 62872, true }, - { 62880, true }, - { 62895, true }, - { 62909, true }, - { 62922, true }, + { 62718, true }, + { 62727, false }, + { 62738, false }, + { 62758, true }, + { 62766, true }, + { 62781, true }, + { 62795, true }, + { 62808, true }, + { 62816, true }, + { 62823, true }, + { 62833, true }, + { 62842, true }, + { 62855, true }, + { 62864, false }, + { 62879, true }, + { 62888, false }, + { 62897, true }, + { 62914, true }, + { 62923, true }, { 62930, true }, - { 62937, true }, - { 62947, true }, - { 62956, true }, + { 62938, true }, + { 62950, true }, + { 62959, true }, { 62969, true }, - { 62978, false }, - { 62993, true }, - { 63002, false }, - { 63011, true }, + { 62986, true }, + { 62994, false }, + { 63002, true }, + { 63010, true }, + { 63017, true }, { 63028, true }, - { 63037, true }, - { 63044, true }, - { 63052, true }, - { 63064, true }, - { 63073, true }, - { 63083, true }, - { 63100, true }, - { 63108, false }, + { 63041, true }, + { 63048, true }, + { 63059, true }, + { 63069, true }, + { 63084, true }, + { 63101, true }, { 63116, true }, - { 63124, true }, - { 63131, true }, - { 63142, true }, - { 63155, true }, - { 63162, true }, - { 63173, true }, - { 63183, true }, - { 63198, true }, - { 63215, true }, - { 63230, true }, + { 63129, true }, + { 63141, true }, + { 63156, true }, + { 63167, true }, + { 63177, true }, + { 63185, true }, + { 63194, true }, + { 63202, true }, + { 63216, true }, + { 63228, true }, { 63243, true }, - { 63255, true }, - { 63270, true }, - { 63281, true }, - { 63291, true }, - { 63299, true }, - { 63308, true }, - { 63316, true }, - { 63328, true }, - { 63343, true }, - { 63350, true }, - { 63360, true }, - { 63377, true }, - { 63395, true }, - { 63412, true }, - { 63422, true }, - { 63436, true }, - { 63449, false }, - { 63465, true }, + { 63250, true }, + { 63260, true }, + { 63277, true }, + { 63295, true }, + { 63312, true }, + { 63322, true }, + { 63336, true }, + { 63349, false }, + { 63365, true }, + { 63381, true }, + { 63400, true }, + { 63414, true }, + { 63430, true }, + { 63443, true }, + { 63458, true }, + { 63469, true }, { 63481, true }, - { 63500, true }, - { 63514, true }, - { 63530, true }, - { 63543, true }, - { 63558, true }, - { 63569, true }, - { 63581, true }, - { 63606, false }, - { 63615, true }, - { 63635, true }, - { 63644, true }, - { 63666, true }, - { 63676, true }, - { 63689, true }, - { 63701, true }, - { 63710, true }, - { 63725, true }, - { 63739, true }, - { 63751, true }, - { 63773, true }, - { 63784, true }, - { 63796, true }, - { 63804, true }, - { 63815, true }, - { 63829, true }, - { 63849, true }, - { 63863, true }, - { 63886, true }, - { 63902, true }, - { 63910, true }, - { 63924, true }, - { 63939, true }, + { 63506, false }, + { 63515, true }, + { 63535, true }, + { 63544, true }, + { 63566, true }, + { 63576, true }, + { 63589, true }, + { 63601, true }, + { 63610, true }, + { 63625, true }, + { 63639, true }, + { 63651, true }, + { 63673, true }, + { 63684, true }, + { 63696, true }, + { 63704, true }, + { 63715, true }, + { 63729, true }, + { 63749, true }, + { 63763, true }, + { 63786, true }, + { 63802, true }, + { 63810, true }, + { 63824, true }, + { 63839, true }, + { 63868, true }, + { 63887, false }, + { 63904, true }, + { 63918, true }, + { 63937, true }, + { 63953, true }, { 63968, true }, - { 63987, false }, - { 64004, true }, - { 64018, true }, - { 64037, true }, - { 64053, true }, - { 64068, true }, + { 63979, true }, + { 63990, true }, + { 64002, true }, + { 64023, true }, + { 64040, true }, + { 64058, true }, { 64079, true }, - { 64090, true }, - { 64102, true }, - { 64123, true }, - { 64140, true }, - { 64158, true }, - { 64179, true }, - { 64194, true }, - { 64212, true }, - { 64228, true }, - { 64243, true }, - { 64271, true }, - { 64281, true }, - { 64291, true }, - { 64310, false }, - { 64322, true }, + { 64094, true }, + { 64112, true }, + { 64128, true }, + { 64143, true }, + { 64171, true }, + { 64181, true }, + { 64191, true }, + { 64210, false }, + { 64222, true }, + { 64236, true }, + { 64249, true }, + { 64268, true }, + { 64284, true }, + { 64298, true }, + { 64313, true }, { 64336, true }, { 64349, true }, - { 64368, true }, - { 64384, true }, - { 64398, true }, - { 64413, true }, - { 64436, true }, - { 64449, true }, - { 64466, true }, - { 64481, true }, - { 64502, true }, - { 64517, true }, - { 64533, true }, - { 64546, true }, - { 64559, true }, - { 64571, true }, - { 64596, true }, - { 64610, true }, + { 64366, true }, + { 64381, true }, + { 64402, true }, + { 64417, true }, + { 64433, true }, + { 64446, true }, + { 64459, true }, + { 64471, true }, + { 64496, true }, + { 64510, true }, + { 64521, true }, + { 64540, true }, + { 64553, true }, + { 64570, true }, + { 64587, true }, + { 64598, true }, + { 64612, true }, { 64621, true }, - { 64640, true }, - { 64653, true }, - { 64670, true }, + { 64628, true }, + { 64637, true }, + { 64652, true }, + { 64663, true }, { 64687, true }, { 64698, true }, - { 64712, true }, + { 64708, true }, { 64721, true }, - { 64728, true }, - { 64737, true }, - { 64752, true }, - { 64763, true }, - { 64787, true }, - { 64798, true }, - { 64808, true }, - { 64821, true }, + { 64733, true }, + { 64744, true }, + { 64755, true }, + { 64767, true }, + { 64783, true }, + { 64804, true }, + { 64818, true }, { 64833, true }, - { 64844, true }, - { 64855, true }, - { 64867, true }, - { 64883, true }, - { 64904, true }, - { 64918, true }, - { 64933, true }, - { 64945, true }, - { 64962, true }, - { 64977, true }, - { 64989, true }, - { 64999, true }, - { 65015, true }, - { 65036, true }, + { 64845, true }, + { 64862, true }, + { 64877, true }, + { 64889, true }, + { 64899, true }, + { 64915, true }, + { 64936, true }, + { 64953, true }, + { 64982, true }, + { 64996, true }, + { 65007, true }, + { 65016, false }, + { 65039, false }, { 65053, true }, - { 65082, true }, - { 65096, true }, - { 65107, true }, - { 65116, false }, - { 65139, false }, - { 65153, true }, - { 65162, true }, + { 65062, true }, + { 65074, true }, + { 65087, true }, + { 65099, true }, + { 65113, true }, + { 65131, true }, + { 65146, true }, + { 65162, false }, { 65174, true }, - { 65187, true }, - { 65199, true }, - { 65213, true }, - { 65231, true }, - { 65246, true }, - { 65262, false }, - { 65274, true }, - { 65291, true }, - { 65308, true }, - { 65319, true }, - { 65337, true }, - { 65356, true }, - { 65370, true }, + { 65191, true }, + { 65208, true }, + { 65225, true }, + { 65236, true }, + { 65254, true }, + { 65273, true }, + { 65287, true }, + { 65306, true }, + { 65325, true }, + { 65339, true }, + { 65350, true }, + { 65360, true }, + { 65373, true }, { 65389, true }, - { 65408, true }, - { 65422, true }, - { 65433, true }, - { 65443, true }, - { 65456, true }, - { 65472, true }, - { 65486, true }, - { 65506, true }, - { 65515, true }, - { 65532, true }, - { 65552, true }, - { 65572, true }, - { 65591, true }, - { 65610, true }, - { 65633, false }, - { 65651, true }, - { 65680, true }, - { 65696, true }, - { 65712, true }, - { 65727, true }, - { 65741, true }, - { 65750, true }, - { 65765, true }, - { 65777, true }, - { 65795, true }, - { 65803, true }, - { 65818, true }, - { 65831, true }, - { 65843, true }, - { 65858, true }, - { 65874, false }, - { 65884, false }, - { 65901, true }, - { 65914, true }, - { 65932, true }, - { 65946, true }, - { 65968, true }, - { 65990, true }, - { 66008, true }, + { 65403, true }, + { 65423, true }, + { 65432, true }, + { 65449, true }, + { 65469, true }, + { 65489, true }, + { 65508, true }, + { 65527, true }, + { 65550, false }, + { 65568, true }, + { 65597, true }, + { 65613, true }, + { 65629, true }, + { 65644, true }, + { 65658, true }, + { 65667, true }, + { 65682, true }, + { 65700, true }, + { 65708, true }, + { 65723, true }, + { 65736, true }, + { 65748, true }, + { 65763, true }, + { 65779, false }, + { 65789, false }, + { 65806, true }, + { 65819, true }, + { 65837, true }, + { 65851, true }, + { 65873, true }, + { 65895, true }, + { 65913, true }, + { 65924, true }, + { 65943, true }, + { 65952, true }, + { 65973, true }, + { 65994, true }, + { 66006, true }, { 66019, true }, - { 66038, true }, - { 66047, true }, - { 66068, true }, + { 66034, true }, + { 66051, true }, + { 66063, true }, + { 66080, true }, { 66089, true }, - { 66101, true }, - { 66114, true }, - { 66129, true }, - { 66146, true }, - { 66158, true }, - { 66175, true }, - { 66184, true }, - { 66199, true }, - { 66229, true }, - { 66267, true }, - { 66298, true }, - { 66330, true }, - { 66358, true }, - { 66387, true }, - { 66421, true }, + { 66104, true }, + { 66134, true }, + { 66172, true }, + { 66203, true }, + { 66235, true }, + { 66263, true }, + { 66292, true }, + { 66326, true }, + { 66364, true }, + { 66394, true }, + { 66424, true }, { 66459, true }, - { 66489, true }, - { 66519, true }, - { 66554, true }, - { 66583, true }, - { 66619, true }, - { 66631, true }, - { 66645, true }, - { 66661, true }, - { 66671, true }, - { 66681, true }, - { 66696, true }, - { 66718, true }, - { 66727, true }, - { 66741, true }, - { 66751, true }, - { 66771, true }, - { 66788, true }, - { 66799, true }, - { 66815, true }, - { 66833, true }, - { 66841, true }, - { 66855, true }, - { 66870, true }, - { 66884, true }, + { 66488, true }, + { 66524, true }, + { 66536, true }, + { 66550, true }, + { 66566, true }, + { 66576, true }, + { 66586, true }, + { 66601, true }, + { 66623, true }, + { 66632, true }, + { 66646, true }, + { 66656, true }, + { 66676, true }, + { 66693, true }, + { 66704, true }, + { 66720, true }, + { 66738, true }, + { 66746, true }, + { 66760, true }, + { 66775, true }, + { 66789, true }, + { 66797, true }, + { 66806, true }, + { 66814, true }, + { 66837, true }, + { 66853, true }, + { 66864, true }, + { 66879, true }, { 66892, true }, - { 66901, true }, - { 66909, true }, - { 66932, true }, - { 66948, true }, - { 66959, true }, - { 66974, true }, - { 66987, true }, - { 67005, true }, - { 67017, true }, - { 67033, true }, - { 67048, true }, - { 67061, true }, - { 67072, true }, - { 67087, true }, + { 66910, true }, + { 66922, true }, + { 66938, true }, + { 66953, true }, + { 66966, true }, + { 66977, true }, + { 66992, true }, + { 67009, true }, + { 67020, true }, + { 67029, true }, + { 67038, true }, + { 67054, true }, + { 67064, true }, + { 67078, true }, + { 67096, true }, { 67104, true }, - { 67115, true }, - { 67124, true }, - { 67133, true }, - { 67149, true }, - { 67159, false }, - { 67178, true }, - { 67192, true }, - { 67210, true }, - { 67218, true }, - { 67227, true }, - { 67242, true }, - { 67252, true }, + { 67113, true }, + { 67128, true }, + { 67138, true }, + { 67148, true }, + { 67163, true }, + { 67173, true }, + { 67194, true }, + { 67203, true }, + { 67212, true }, + { 67223, true }, + { 67239, true }, + { 67249, true }, { 67262, true }, - { 67277, true }, - { 67287, true }, - { 67308, true }, - { 67317, true }, - { 67326, true }, - { 67337, true }, - { 67353, true }, - { 67363, true }, - { 67382, true }, - { 67395, true }, - { 67413, true }, - { 67433, true }, - { 67453, true }, - { 67466, true }, - { 67477, true }, - { 67495, true }, - { 67505, true }, - { 67514, true }, - { 67523, true }, - { 67534, true }, - { 67542, false }, - { 67549, true }, - { 67559, true }, - { 67571, true }, - { 67581, true }, - { 67596, true }, - { 67603, true }, - { 67616, false }, - { 67631, true }, - { 67651, true }, - { 67671, true }, - { 67690, true }, - { 67707, true }, - { 67718, true }, - { 67728, true }, - { 67743, true }, + { 67280, true }, + { 67300, true }, + { 67320, true }, + { 67333, true }, + { 67344, true }, + { 67362, true }, + { 67372, true }, + { 67381, true }, + { 67390, true }, + { 67401, true }, + { 67409, false }, + { 67416, true }, + { 67426, true }, + { 67438, true }, + { 67448, true }, + { 67463, true }, + { 67470, true }, + { 67483, false }, + { 67498, true }, + { 67518, true }, + { 67538, true }, + { 67557, true }, + { 67574, true }, + { 67585, true }, + { 67595, true }, + { 67610, true }, + { 67620, true }, + { 67630, true }, + { 67646, true }, + { 67656, true }, + { 67670, true }, + { 67687, true }, + { 67708, true }, + { 67717, true }, + { 67733, true }, { 67753, true }, - { 67763, true }, - { 67779, true }, - { 67796, true }, - { 67806, true }, - { 67820, true }, - { 67837, true }, - { 67858, true }, - { 67867, true }, - { 67883, true }, - { 67903, true }, - { 67916, true }, - { 67926, true }, - { 67938, true }, - { 67947, true }, - { 67957, true }, - { 67971, true }, - { 67982, true }, - { 67990, true }, - { 67997, true }, - { 68016, true }, - { 68030, true }, - { 68055, true }, - { 68073, true }, - { 68091, true }, - { 68105, true }, - { 68114, true }, - { 68127, true }, + { 67766, true }, + { 67776, true }, + { 67788, true }, + { 67797, true }, + { 67807, true }, + { 67821, true }, + { 67832, true }, + { 67840, true }, + { 67847, true }, + { 67866, true }, + { 67880, true }, + { 67905, true }, + { 67923, true }, + { 67941, true }, + { 67955, true }, + { 67964, true }, + { 67977, true }, + { 67994, true }, + { 68007, true }, + { 68024, true }, + { 68041, true }, + { 68059, true }, + { 68069, true }, + { 68084, true }, + { 68113, true }, + { 68131, false }, { 68144, true }, - { 68157, true }, - { 68174, true }, - { 68191, true }, - { 68209, true }, - { 68219, true }, - { 68234, true }, - { 68263, true }, - { 68281, false }, - { 68294, true }, - { 68310, true }, - { 68326, true }, - { 68339, true }, - { 68352, true }, - { 68363, true }, - { 68376, true }, - { 68386, false }, - { 68404, true }, - { 68417, true }, - { 68434, true }, - { 68447, true }, - { 68463, true }, - { 68482, true }, - { 68497, true }, - { 68504, true }, - { 68533, true }, - { 68555, true }, - { 68576, true }, - { 68603, true }, - { 68623, true }, - { 68631, true }, - { 68642, true }, - { 68662, true }, - { 68681, true }, - { 68696, true }, - { 68715, true }, - { 68731, true }, - { 68745, true }, - { 68756, true }, - { 68767, true }, - { 68778, true }, - { 68790, true }, - { 68808, true }, - { 68824, false }, - { 68839, true }, - { 68860, true }, - { 68872, true }, - { 68884, true }, + { 68160, true }, + { 68176, true }, + { 68189, true }, + { 68202, true }, + { 68213, true }, + { 68226, true }, + { 68236, false }, + { 68254, true }, + { 68267, true }, + { 68284, true }, + { 68297, true }, + { 68313, true }, + { 68332, true }, + { 68347, true }, + { 68354, true }, + { 68383, true }, + { 68405, true }, + { 68426, true }, + { 68453, true }, + { 68473, true }, + { 68481, true }, + { 68492, true }, + { 68512, true }, + { 68531, true }, + { 68547, true }, + { 68561, true }, + { 68572, true }, + { 68583, true }, + { 68594, true }, + { 68606, true }, + { 68624, true }, + { 68640, false }, + { 68655, true }, + { 68676, true }, + { 68688, true }, + { 68700, true }, + { 68717, true }, + { 68732, true }, + { 68751, true }, + { 68765, true }, + { 68783, true }, + { 68792, true }, + { 68802, true }, + { 68813, true }, + { 68829, true }, + { 68843, true }, + { 68861, true }, + { 68874, true }, + { 68888, true }, { 68901, true }, - { 68916, true }, - { 68935, true }, + { 68915, true }, + { 68929, true }, + { 68938, true }, { 68949, true }, - { 68967, true }, - { 68976, true }, - { 68986, true }, - { 68997, true }, - { 69013, true }, - { 69027, true }, + { 68973, true }, + { 68994, true }, + { 69006, true }, + { 69017, false }, + { 69030, true }, + { 69036, true }, { 69045, true }, - { 69058, true }, - { 69072, true }, - { 69085, true }, - { 69099, true }, - { 69113, true }, - { 69122, true }, + { 69059, true }, + { 69071, true }, + { 69081, true }, + { 69097, true }, + { 69107, true }, + { 69120, true }, { 69133, true }, + { 69145, true }, { 69157, true }, - { 69178, true }, - { 69190, true }, - { 69201, false }, - { 69214, true }, - { 69220, true }, - { 69229, true }, - { 69243, true }, - { 69255, true }, - { 69265, true }, - { 69281, true }, - { 69291, true }, - { 69304, true }, - { 69317, true }, - { 69329, true }, - { 69341, true }, - { 69357, true }, - { 69368, true }, - { 69380, true }, - { 69395, true }, - { 69412, true }, - { 69423, true }, - { 69439, false }, - { 69454, true }, - { 69464, true }, + { 69173, true }, + { 69184, true }, + { 69196, true }, + { 69211, true }, + { 69228, true }, + { 69239, true }, + { 69255, false }, + { 69270, true }, + { 69280, true }, + { 69299, true }, + { 69315, true }, + { 69327, true }, + { 69338, true }, + { 69355, true }, + { 69374, true }, + { 69396, true }, + { 69419, true }, + { 69436, true }, + { 69452, true }, + { 69465, true }, + { 69474, false }, { 69483, true }, - { 69499, true }, + { 69494, true }, { 69511, true }, - { 69522, true }, - { 69539, true }, - { 69558, true }, - { 69580, true }, + { 69527, true }, + { 69541, true }, + { 69555, true }, + { 69573, false }, + { 69581, true }, + { 69590, true }, { 69603, true }, { 69620, true }, - { 69636, true }, - { 69649, true }, - { 69658, false }, - { 69667, true }, - { 69678, true }, - { 69695, true }, - { 69711, true }, - { 69725, true }, - { 69739, true }, - { 69757, false }, - { 69765, true }, - { 69774, true }, - { 69787, true }, - { 69804, true }, - { 69814, true }, - { 69826, true }, - { 69836, true }, - { 69884, true }, - { 69928, true }, - { 69966, true }, - { 70005, true }, - { 70040, true }, - { 70080, true }, - { 70124, true }, - { 70160, true }, - { 70201, true }, - { 70238, true }, - { 70282, true }, - { 70309, true }, + { 69630, true }, + { 69642, true }, + { 69652, true }, + { 69700, true }, + { 69744, true }, + { 69782, true }, + { 69821, true }, + { 69856, true }, + { 69896, true }, + { 69940, true }, + { 69976, true }, + { 70017, true }, + { 70054, true }, + { 70098, true }, + { 70125, true }, + { 70137, true }, + { 70146, true }, + { 70154, false }, + { 70164, true }, + { 70170, true }, + { 70178, true }, + { 70190, true }, + { 70199, true }, + { 70212, true }, + { 70234, true }, + { 70241, true }, + { 70252, true }, + { 70264, true }, + { 70273, true }, + { 70288, true }, + { 70302, true }, + { 70312, true }, { 70321, true }, - { 70330, true }, - { 70338, false }, - { 70348, true }, - { 70354, true }, - { 70362, true }, - { 70374, true }, - { 70383, true }, - { 70396, true }, - { 70418, true }, - { 70425, true }, - { 70436, true }, - { 70448, true }, - { 70457, true }, - { 70472, true }, - { 70486, true }, - { 70496, true }, - { 70505, true }, + { 70332, true }, + { 70344, true }, + { 70357, true }, + { 70373, true }, + { 70382, true }, + { 70391, true }, + { 70412, true }, + { 70423, true }, + { 70437, true }, + { 70454, true }, + { 70471, true }, + { 70483, true }, + { 70493, true }, { 70516, true }, - { 70528, true }, - { 70541, true }, - { 70557, true }, - { 70566, true }, - { 70575, true }, - { 70596, true }, - { 70607, true }, - { 70621, true }, - { 70638, true }, + { 70530, true }, + { 70552, true }, + { 70567, true }, + { 70582, true }, + { 70608, true }, + { 70619, true }, + { 70630, true }, + { 70646, true }, { 70655, true }, - { 70667, true }, - { 70677, true }, - { 70700, true }, - { 70714, true }, - { 70736, true }, - { 70751, true }, - { 70766, true }, - { 70792, true }, - { 70803, true }, + { 70666, true }, + { 70695, true }, + { 70711, true }, + { 70739, true }, + { 70755, true }, + { 70767, false }, + { 70785, false }, + { 70793, false }, + { 70804, true }, { 70814, true }, - { 70830, true }, - { 70839, true }, - { 70850, true }, - { 70879, true }, - { 70895, true }, - { 70923, true }, - { 70939, true }, - { 70951, false }, - { 70969, false }, - { 70977, false }, - { 70988, true }, - { 70998, true }, - { 71019, true }, - { 71037, true }, - { 71047, true }, - { 71057, true }, - { 71072, true }, - { 71086, true }, - { 71099, true }, - { 71109, true }, - { 71124, true }, - { 71139, true }, - { 71150, true }, - { 71162, true }, - { 71174, true }, - { 71183, true }, - { 71192, false }, - { 71204, true }, - { 71220, true }, - { 71231, true }, - { 71247, true }, - { 71266, true }, - { 71282, true }, - { 71297, true }, - { 71318, true }, - { 71349, true }, - { 71373, true }, - { 71392, true }, - { 71412, true }, - { 71432, true }, - { 71450, true }, - { 71467, true }, - { 71486, true }, - { 71510, true }, - { 71529, true }, + { 70835, true }, + { 70853, true }, + { 70863, true }, + { 70873, true }, + { 70888, true }, + { 70902, true }, + { 70912, true }, + { 70927, true }, + { 70942, true }, + { 70953, true }, + { 70965, true }, + { 70977, true }, + { 70986, true }, + { 70995, false }, + { 71007, true }, + { 71023, true }, + { 71034, true }, + { 71050, true }, + { 71069, true }, + { 71085, true }, + { 71100, true }, + { 71121, true }, + { 71152, true }, + { 71176, true }, + { 71195, true }, + { 71215, true }, + { 71235, true }, + { 71253, true }, + { 71270, true }, + { 71289, true }, + { 71313, true }, + { 71332, true }, + { 71350, true }, + { 71367, true }, + { 71389, true }, + { 71409, true }, + { 71429, true }, + { 71446, true }, + { 71468, true }, + { 71484, true }, + { 71501, true }, + { 71516, true }, + { 71532, true }, { 71547, true }, - { 71564, true }, - { 71586, true }, - { 71606, true }, - { 71626, true }, - { 71643, true }, - { 71665, true }, - { 71681, true }, - { 71698, true }, - { 71713, true }, - { 71729, true }, - { 71744, true }, - { 71763, true }, - { 71785, true }, - { 71807, true }, - { 71829, true }, - { 71846, true }, - { 71861, true }, - { 71880, true }, - { 71893, true }, - { 71906, true }, - { 71921, true }, - { 71936, true }, - { 71947, true }, - { 71957, true }, - { 71970, true }, - { 71986, true }, - { 71998, true }, - { 72011, false }, - { 72021, false }, - { 72030, true }, - { 72052, true }, - { 72072, true }, - { 72093, true }, - { 72108, true }, + { 71566, true }, + { 71588, true }, + { 71610, true }, + { 71632, true }, + { 71649, true }, + { 71664, true }, + { 71683, true }, + { 71696, true }, + { 71709, true }, + { 71724, true }, + { 71739, true }, + { 71750, true }, + { 71760, true }, + { 71773, true }, + { 71789, true }, + { 71801, true }, + { 71814, false }, + { 71824, false }, + { 71833, true }, + { 71853, true }, + { 71868, true }, + { 71879, true }, + { 71900, true }, + { 71916, true }, + { 71938, true }, + { 71962, false }, + { 71979, true }, + { 71992, true }, + { 72006, true }, + { 72022, true }, + { 72035, true }, + { 72048, true }, + { 72061, true }, + { 72080, true }, + { 72091, true }, + { 72100, true }, + { 72109, true }, { 72119, true }, - { 72140, true }, - { 72156, true }, - { 72178, true }, - { 72202, false }, - { 72219, true }, - { 72232, true }, - { 72246, true }, - { 72262, true }, + { 72132, true }, + { 72142, true }, + { 72152, true }, + { 72161, true }, + { 72177, true }, + { 72193, true }, + { 72220, true }, + { 72231, true }, + { 72248, true }, + { 72261, true }, { 72275, true }, - { 72288, true }, - { 72301, true }, - { 72320, true }, - { 72331, true }, + { 72292, true }, + { 72307, true }, + { 72330, true }, { 72340, true }, - { 72349, true }, - { 72359, true }, - { 72372, true }, - { 72382, true }, - { 72392, true }, - { 72401, true }, - { 72417, true }, - { 72433, true }, - { 72460, true }, - { 72471, true }, - { 72488, true }, - { 72501, true }, - { 72515, true }, - { 72532, true }, - { 72547, true }, - { 72570, true }, - { 72580, true }, - { 72590, true }, - { 72605, true }, - { 72615, true }, - { 72634, true }, - { 72654, true }, - { 72668, true }, - { 72693, true }, - { 72717, true }, + { 72350, true }, + { 72365, true }, + { 72375, true }, + { 72394, true }, + { 72414, true }, + { 72428, true }, + { 72453, true }, + { 72477, true }, + { 72486, true }, + { 72503, true }, + { 72524, true }, + { 72544, true }, + { 72556, true }, + { 72569, true }, + { 72583, true }, + { 72600, true }, + { 72617, false }, + { 72630, true }, + { 72647, true }, + { 72656, true }, + { 72667, true }, + { 72685, true }, + { 72701, true }, + { 72715, true }, { 72726, true }, - { 72743, true }, - { 72764, true }, - { 72784, true }, - { 72796, true }, - { 72809, true }, - { 72823, true }, - { 72840, true }, - { 72857, false }, - { 72870, true }, - { 72887, true }, - { 72896, true }, - { 72907, true }, - { 72925, true }, - { 72941, true }, - { 72955, true }, - { 72966, true }, - { 72980, true }, - { 72997, true }, - { 73006, true }, - { 73020, false }, - { 73048, true }, - { 73057, true }, + { 72740, true }, + { 72757, true }, + { 72766, true }, + { 72780, false }, + { 72808, true }, + { 72817, true }, + { 72826, true }, + { 72836, true }, + { 72852, true }, + { 72862, true }, + { 72875, true }, + { 72889, false }, + { 72903, false }, + { 72918, true }, + { 72942, true }, + { 72963, true }, + { 72985, true }, + { 72995, true }, + { 73007, true }, + { 73033, true }, + { 73047, true }, { 73066, true }, - { 73076, true }, - { 73092, true }, - { 73102, true }, - { 73115, true }, - { 73129, false }, - { 73143, false }, - { 73158, true }, + { 73083, true }, + { 73096, true }, + { 73108, true }, + { 73121, true }, + { 73133, true }, + { 73145, false }, + { 73169, true }, { 73182, true }, - { 73203, true }, + { 73201, true }, { 73225, true }, - { 73235, true }, - { 73247, true }, - { 73273, true }, - { 73287, true }, - { 73306, true }, - { 73323, true }, - { 73336, true }, - { 73348, true }, - { 73361, true }, - { 73373, true }, - { 73385, false }, - { 73409, true }, + { 73241, true }, + { 73251, true }, + { 73267, true }, + { 73283, true }, + { 73302, true }, + { 73319, true }, + { 73337, true }, + { 73354, true }, + { 73371, true }, + { 73379, false }, + { 73405, true }, { 73422, true }, - { 73441, true }, - { 73465, true }, - { 73481, true }, - { 73491, true }, - { 73507, true }, - { 73523, true }, - { 73542, true }, - { 73559, true }, - { 73577, true }, - { 73594, true }, - { 73611, true }, - { 73619, false }, - { 73645, true }, - { 73662, true }, - { 73676, true }, + { 73436, true }, + { 73447, true }, + { 73459, true }, + { 73479, true }, + { 73495, true }, + { 73513, true }, + { 73531, true }, + { 73541, true }, + { 73553, true }, + { 73568, true }, + { 73586, true }, + { 73604, true }, + { 73623, true }, + { 73633, true }, + { 73647, true }, + { 73657, true }, + { 73668, true }, { 73687, true }, - { 73699, true }, - { 73719, true }, - { 73735, true }, - { 73753, true }, - { 73771, true }, + { 73703, true }, + { 73722, true }, + { 73732, true }, + { 73744, true }, + { 73755, true }, + { 73765, true }, { 73781, true }, - { 73793, true }, - { 73808, true }, - { 73826, true }, - { 73844, true }, - { 73863, true }, - { 73873, true }, - { 73887, true }, - { 73897, true }, - { 73908, true }, - { 73927, true }, - { 73943, true }, - { 73962, true }, - { 73972, true }, - { 73984, true }, - { 73995, true }, - { 74005, true }, - { 74021, true }, - { 74034, true }, - { 74058, true }, - { 74081, true }, + { 73794, true }, + { 73818, true }, + { 73841, true }, + { 73865, true }, + { 73880, true }, + { 73900, true }, + { 73913, false }, + { 73925, true }, + { 73935, true }, + { 73948, true }, + { 73963, true }, + { 73983, true }, + { 73993, true }, + { 74003, false }, + { 74020, true }, + { 74028, true }, + { 74044, true }, + { 74059, true }, + { 74075, true }, + { 74091, true }, { 74105, true }, - { 74120, true }, - { 74140, true }, - { 74153, false }, - { 74165, true }, - { 74175, true }, - { 74188, true }, - { 74203, true }, - { 74223, true }, - { 74233, true }, - { 74243, false }, - { 74260, true }, - { 74268, true }, - { 74284, true }, - { 74299, true }, + { 74121, true }, + { 74135, true }, + { 74149, true }, + { 74161, true }, + { 74181, true }, + { 74197, true }, + { 74214, true }, + { 74224, true }, + { 74237, true }, + { 74256, true }, + { 74267, true }, + { 74280, true }, + { 74294, true }, + { 74307, true }, { 74315, true }, - { 74331, true }, - { 74345, true }, - { 74361, true }, - { 74375, true }, - { 74389, true }, - { 74401, true }, - { 74421, true }, - { 74437, true }, - { 74454, true }, - { 74464, true }, - { 74477, true }, - { 74496, true }, - { 74507, true }, - { 74520, true }, - { 74534, true }, - { 74547, true }, - { 74555, true }, - { 74565, true }, - { 74579, false }, - { 74593, false }, - { 74619, true }, - { 74631, true }, - { 74647, true }, - { 74658, true }, - { 74679, true }, - { 74703, true }, - { 74728, true }, - { 74740, true }, - { 74753, true }, - { 74766, true }, - { 74778, true }, - { 74797, true }, - { 74812, true }, - { 74825, true }, - { 74838, true }, - { 74858, true }, - { 74873, true }, - { 74889, true }, - { 74900, true }, - { 74918, true }, - { 74927, true }, - { 74938, true }, - { 74949, true }, - { 74960, true }, + { 74325, true }, + { 74339, false }, + { 74353, false }, + { 74379, true }, + { 74391, true }, + { 74407, true }, + { 74418, true }, + { 74439, true }, + { 74463, true }, + { 74488, true }, + { 74500, true }, + { 74513, true }, + { 74526, true }, + { 74538, true }, + { 74557, true }, + { 74572, true }, + { 74585, true }, + { 74598, true }, + { 74618, true }, + { 74633, true }, + { 74649, true }, + { 74660, true }, + { 74678, true }, + { 74687, true }, + { 74698, true }, + { 74709, true }, + { 74720, true }, + { 74731, true }, + { 74741, true }, + { 74755, true }, + { 74767, true }, + { 74777, true }, + { 74786, true }, + { 74800, true }, + { 74810, true }, + { 74822, true }, + { 74831, true }, + { 74842, false }, + { 74855, true }, + { 74869, true }, + { 74891, true }, + { 74898, true }, + { 74911, true }, + { 74923, true }, + { 74935, true }, + { 74947, true }, + { 74959, true }, { 74971, true }, - { 74981, true }, + { 74983, true }, { 74995, true }, { 75007, true }, - { 75017, true }, - { 75026, true }, - { 75040, true }, - { 75050, true }, - { 75062, true }, - { 75071, true }, - { 75082, false }, - { 75095, true }, - { 75109, true }, - { 75131, true }, - { 75138, true }, - { 75151, true }, - { 75163, true }, - { 75175, true }, - { 75187, true }, - { 75199, true }, - { 75211, true }, - { 75223, true }, - { 75235, true }, - { 75247, true }, + { 75023, true }, + { 75038, true }, + { 75057, true }, + { 75074, true }, + { 75096, true }, + { 75109, false }, + { 75129, true }, + { 75147, true }, + { 75157, true }, + { 75170, true }, + { 75179, true }, + { 75191, true }, + { 75204, true }, + { 75219, true }, + { 75238, true }, + { 75252, true }, { 75263, true }, - { 75278, true }, - { 75297, true }, - { 75314, true }, - { 75336, true }, - { 75349, false }, - { 75369, true }, - { 75387, true }, - { 75397, true }, - { 75410, true }, - { 75419, true }, - { 75431, true }, - { 75444, true }, - { 75459, true }, - { 75478, true }, - { 75492, true }, - { 75503, true }, - { 75527, false }, - { 75548, true }, - { 75560, true }, + { 75287, false }, + { 75308, true }, + { 75320, true }, + { 75330, true }, + { 75339, true }, + { 75354, true }, + { 75367, true }, + { 75378, true }, + { 75389, true }, + { 75402, true }, + { 75415, true }, + { 75424, true }, + { 75436, true }, + { 75445, true }, + { 75454, true }, + { 75468, true }, + { 75482, true }, + { 75502, false }, + { 75527, true }, + { 75540, true }, + { 75549, true }, { 75570, true }, - { 75579, true }, - { 75594, true }, - { 75607, true }, - { 75618, true }, - { 75629, true }, - { 75642, true }, - { 75655, true }, - { 75664, true }, - { 75676, true }, - { 75685, true }, - { 75694, true }, - { 75708, true }, - { 75722, true }, - { 75744, true }, - { 75764, false }, - { 75789, true }, - { 75802, true }, - { 75811, true }, - { 75832, true }, - { 75853, true }, - { 75863, true }, - { 75878, true }, - { 75890, true }, - { 75902, true }, - { 75927, true }, - { 75943, true }, - { 75954, true }, - { 75967, true }, - { 75982, true }, - { 75996, true }, - { 76005, true }, - { 76023, true }, - { 76057, true }, - { 76067, true }, - { 76085, true }, - { 76096, true }, - { 76122, false }, - { 76137, true }, - { 76147, true }, - { 76156, true }, - { 76168, true }, - { 76178, true }, + { 75591, true }, + { 75601, true }, + { 75616, true }, + { 75628, true }, + { 75640, true }, + { 75665, true }, + { 75681, true }, + { 75692, true }, + { 75705, true }, + { 75720, true }, + { 75734, true }, + { 75743, true }, + { 75761, true }, + { 75795, true }, + { 75805, true }, + { 75823, true }, + { 75834, true }, + { 75860, false }, + { 75875, true }, + { 75885, true }, + { 75894, true }, + { 75906, true }, + { 75916, true }, + { 75925, true }, + { 75939, false }, + { 75950, true }, + { 75958, true }, + { 75966, true }, + { 75977, true }, + { 75986, true }, + { 76001, true }, + { 76013, true }, + { 76027, true }, + { 76041, true }, + { 76061, true }, + { 76073, true }, + { 76091, true }, + { 76107, true }, + { 76121, true }, + { 76138, true }, + { 76151, true }, + { 76161, true }, + { 76175, true }, { 76187, true }, - { 76201, false }, - { 76212, true }, - { 76220, true }, - { 76228, true }, + { 76199, true }, + { 76213, true }, + { 76226, true }, { 76239, true }, - { 76248, true }, + { 76252, true }, { 76263, true }, - { 76275, true }, - { 76289, true }, - { 76303, true }, - { 76323, true }, - { 76335, true }, - { 76353, true }, - { 76369, true }, - { 76383, true }, - { 76400, true }, - { 76413, true }, - { 76423, true }, - { 76437, true }, - { 76449, true }, - { 76461, true }, - { 76475, true }, - { 76488, true }, - { 76501, true }, + { 76273, true }, + { 76285, true }, + { 76292, true }, + { 76301, true }, + { 76325, true }, + { 76344, true }, + { 76358, true }, + { 76372, true }, + { 76381, true }, + { 76394, true }, + { 76410, true }, + { 76433, true }, + { 76442, true }, + { 76457, true }, + { 76471, true }, + { 76485, true }, + { 76499, true }, { 76514, true }, - { 76525, true }, - { 76535, true }, - { 76547, true }, - { 76554, true }, - { 76563, true }, - { 76587, true }, - { 76606, true }, - { 76620, true }, - { 76634, true }, - { 76643, true }, - { 76651, true }, + { 76528, true }, + { 76542, true }, + { 76556, true }, + { 76571, true }, + { 76585, true }, + { 76599, true }, + { 76613, true }, + { 76627, true }, + { 76644, true }, { 76664, true }, - { 76680, true }, - { 76703, true }, - { 76712, true }, - { 76727, true }, - { 76741, true }, - { 76755, true }, - { 76769, true }, - { 76784, true }, - { 76798, true }, - { 76812, true }, - { 76826, true }, - { 76841, true }, - { 76855, true }, - { 76869, true }, - { 76883, true }, + { 76685, true }, + { 76717, true }, + { 76729, true }, + { 76739, true }, + { 76751, true }, + { 76766, true }, + { 76788, true }, + { 76807, true }, + { 76821, true }, + { 76839, true }, + { 76850, true }, + { 76868, true }, + { 76875, true }, + { 76885, true }, { 76897, true }, - { 76914, true }, - { 76934, true }, - { 76955, true }, - { 76987, true }, - { 76999, true }, + { 76912, true }, + { 76929, true }, + { 76947, true }, + { 76960, true }, + { 76979, true }, + { 76989, true }, { 77009, true }, - { 77021, true }, - { 77036, true }, - { 77058, true }, - { 77077, true }, - { 77091, true }, - { 77109, true }, - { 77120, true }, - { 77138, true }, - { 77145, true }, - { 77155, true }, - { 77167, true }, - { 77182, true }, - { 77199, true }, - { 77217, true }, - { 77236, true }, - { 77246, true }, - { 77266, true }, - { 77279, true }, - { 77289, true }, - { 77303, false }, - { 77320, true }, + { 77022, true }, + { 77032, true }, + { 77046, false }, + { 77063, true }, + { 77076, true }, + { 77089, true }, + { 77102, true }, + { 77112, true }, + { 77128, true }, + { 77154, true }, + { 77166, true }, + { 77178, true }, + { 77191, false }, + { 77206, true }, + { 77219, true }, + { 77233, true }, + { 77250, true }, + { 77262, true }, + { 77281, true }, + { 77288, true }, + { 77300, true }, + { 77312, true }, + { 77324, true }, { 77333, true }, - { 77346, true }, - { 77359, true }, - { 77369, true }, - { 77385, true }, - { 77411, true }, - { 77423, true }, - { 77435, true }, - { 77448, false }, - { 77463, true }, - { 77476, true }, + { 77344, true }, + { 77358, true }, + { 77371, true }, + { 77396, true }, + { 77419, false }, + { 77429, true }, + { 77440, true }, + { 77453, true }, + { 77467, true }, + { 77479, true }, { 77490, true }, - { 77507, true }, - { 77519, true }, - { 77538, true }, - { 77545, true }, - { 77557, true }, - { 77569, true }, - { 77581, true }, - { 77590, true }, - { 77601, true }, - { 77615, true }, - { 77628, true }, - { 77653, true }, - { 77676, false }, - { 77686, true }, - { 77697, true }, - { 77710, true }, - { 77724, true }, - { 77736, true }, - { 77747, true }, - { 77758, true }, - { 77767, true }, - { 77777, true }, - { 77786, true }, - { 77797, true }, - { 77817, true }, - { 77837, true }, - { 77855, true }, - { 77874, true }, - { 77892, true }, - { 77909, true }, - { 77921, true }, - { 77935, true }, - { 77958, true }, - { 77968, true }, - { 77983, true }, + { 77501, true }, + { 77510, true }, + { 77520, true }, + { 77529, true }, + { 77540, true }, + { 77560, true }, + { 77580, true }, + { 77598, true }, + { 77617, true }, + { 77635, true }, + { 77652, true }, + { 77664, true }, + { 77678, true }, + { 77701, true }, + { 77711, true }, + { 77726, true }, + { 77740, true }, + { 77756, true }, + { 77769, true }, + { 77792, true }, + { 77804, true }, + { 77818, true }, + { 77825, true }, + { 77838, true }, + { 77851, true }, + { 77871, true }, + { 77889, true }, + { 77911, true }, + { 77924, true }, + { 77944, true }, + { 77959, true }, + { 77970, true }, + { 77984, true }, { 77997, true }, - { 78013, true }, - { 78026, true }, - { 78049, true }, - { 78061, true }, - { 78075, true }, - { 78082, true }, - { 78095, true }, - { 78108, true }, - { 78128, true }, - { 78146, true }, + { 78010, true }, + { 78029, true }, + { 78044, true }, + { 78064, true }, + { 78080, true }, + { 78099, true }, + { 78118, true }, + { 78133, true }, + { 78145, true }, + { 78152, true }, { 78168, true }, - { 78181, true }, - { 78201, true }, - { 78216, true }, - { 78227, true }, - { 78241, true }, - { 78254, true }, - { 78267, true }, - { 78286, true }, - { 78301, true }, - { 78321, true }, - { 78337, true }, - { 78356, true }, - { 78375, true }, - { 78390, true }, - { 78402, true }, - { 78409, true }, - { 78425, true }, - { 78452, true }, - { 78480, true }, - { 78504, true }, - { 78523, true }, - { 78540, true }, - { 78563, true }, - { 78584, true }, - { 78603, true }, - { 78621, true }, - { 78639, true }, - { 78657, true }, - { 78669, true }, - { 78678, true }, - { 78701, true }, - { 78715, true }, - { 78727, true }, - { 78740, true }, - { 78750, true }, - { 78761, false }, - { 78771, true }, - { 78791, true }, - { 78804, true }, - { 78819, true }, - { 78828, true }, - { 78840, true }, - { 78856, true }, - { 78866, true }, - { 78873, true }, - { 78890, true }, - { 78903, true }, - { 78912, true }, - { 78919, true }, + { 78195, true }, + { 78223, true }, + { 78247, true }, + { 78266, true }, + { 78283, true }, + { 78306, true }, + { 78327, true }, + { 78346, true }, + { 78364, true }, + { 78382, true }, + { 78400, true }, + { 78412, true }, + { 78421, true }, + { 78444, true }, + { 78458, true }, + { 78470, true }, + { 78483, true }, + { 78493, true }, + { 78504, false }, + { 78514, true }, + { 78534, true }, + { 78547, true }, + { 78562, true }, + { 78571, true }, + { 78583, true }, + { 78599, true }, + { 78609, true }, + { 78616, true }, + { 78633, true }, + { 78646, true }, + { 78655, true }, + { 78662, true }, + { 78675, true }, + { 78688, true }, + { 78697, true }, + { 78710, true }, + { 78728, true }, + { 78743, true }, + { 78759, true }, + { 78775, true }, + { 78786, true }, + { 78800, true }, + { 78817, true }, + { 78834, true }, + { 78844, true }, + { 78871, true }, + { 78906, true }, { 78932, true }, - { 78945, true }, - { 78954, true }, - { 78967, true }, - { 78985, true }, - { 79000, true }, - { 79016, true }, - { 79032, true }, - { 79043, true }, + { 78944, false }, + { 78957, true }, + { 78978, true }, + { 78991, true }, + { 79010, true }, + { 79035, true }, { 79057, true }, - { 79074, true }, - { 79091, true }, - { 79101, true }, - { 79128, true }, - { 79163, true }, - { 79189, true }, - { 79201, false }, - { 79214, true }, + { 79078, true }, + { 79093, true }, + { 79113, false }, + { 79123, true }, + { 79142, true }, + { 79159, true }, + { 79176, true }, + { 79186, true }, + { 79196, true }, + { 79209, true }, + { 79220, true }, { 79235, true }, { 79248, true }, - { 79267, true }, - { 79292, true }, - { 79314, true }, - { 79335, true }, - { 79350, true }, - { 79370, false }, + { 79263, true }, + { 79276, true }, + { 79289, true }, + { 79303, true }, + { 79326, true }, + { 79341, true }, + { 79353, true }, + { 79366, true }, { 79380, true }, { 79399, true }, - { 79416, true }, - { 79433, true }, - { 79443, true }, - { 79453, true }, + { 79423, true }, + { 79445, true }, { 79466, true }, - { 79477, true }, - { 79492, true }, - { 79505, true }, - { 79520, true }, - { 79533, true }, - { 79546, true }, - { 79560, true }, - { 79583, true }, - { 79598, true }, - { 79610, true }, + { 79491, true }, + { 79514, true }, + { 79534, true }, + { 79545, true }, + { 79557, true }, + { 79569, true }, + { 79589, true }, + { 79606, true }, { 79623, true }, - { 79637, true }, - { 79656, true }, - { 79680, true }, - { 79702, true }, - { 79723, true }, - { 79748, true }, - { 79771, true }, - { 79791, true }, - { 79802, true }, - { 79814, true }, - { 79826, true }, - { 79846, true }, - { 79863, true }, - { 79880, true }, - { 79901, true }, - { 79924, true }, - { 79940, true }, - { 79960, true }, - { 79969, true }, + { 79644, true }, + { 79667, true }, + { 79683, true }, + { 79703, true }, + { 79712, true }, + { 79727, true }, + { 79737, true }, + { 79754, true }, + { 79765, true }, + { 79784, true }, + { 79794, true }, + { 79804, true }, + { 79812, true }, + { 79838, true }, + { 79852, true }, + { 79865, true }, + { 79878, true }, + { 79887, true }, + { 79894, true }, + { 79901, false }, + { 79917, true }, + { 79926, true }, + { 79943, true }, + { 79958, true }, + { 79972, true }, { 79984, true }, - { 79994, true }, - { 80011, true }, - { 80022, true }, - { 80041, true }, - { 80051, true }, - { 80061, true }, - { 80069, true }, - { 80095, true }, - { 80109, true }, - { 80122, true }, - { 80135, true }, - { 80144, true }, - { 80151, true }, - { 80158, false }, - { 80174, true }, - { 80183, true }, - { 80200, true }, - { 80215, true }, - { 80229, true }, - { 80241, true }, - { 80253, true }, - { 80276, true }, - { 80290, true }, - { 80305, true }, - { 80321, true }, - { 80333, true }, - { 80348, true }, - { 80364, true }, + { 79996, true }, + { 80019, true }, + { 80033, true }, + { 80048, true }, + { 80064, true }, + { 80076, true }, + { 80091, true }, + { 80107, true }, + { 80124, true }, + { 80142, true }, + { 80163, true }, + { 80180, true }, + { 80197, true }, + { 80214, true }, + { 80231, true }, + { 80248, true }, + { 80265, true }, + { 80282, true }, + { 80299, true }, + { 80315, true }, + { 80329, true }, + { 80354, true }, + { 80365, true }, { 80381, true }, - { 80399, true }, - { 80420, true }, - { 80437, true }, - { 80454, true }, - { 80471, true }, - { 80488, true }, - { 80505, true }, - { 80522, true }, - { 80539, true }, - { 80556, true }, - { 80572, true }, - { 80586, true }, - { 80611, true }, - { 80622, true }, + { 80400, true }, + { 80422, false }, + { 80435, true }, + { 80455, true }, + { 80464, false }, + { 80480, true }, + { 80494, true }, + { 80507, true }, + { 80517, true }, + { 80528, true }, + { 80542, true }, + { 80558, true }, + { 80570, true }, + { 80584, true }, + { 80599, true }, + { 80609, true }, + { 80619, false }, + { 80629, true }, { 80638, true }, - { 80654, true }, - { 80670, true }, - { 80689, true }, - { 80711, false }, - { 80724, true }, - { 80744, true }, - { 80753, false }, - { 80769, true }, - { 80783, true }, - { 80796, true }, - { 80806, true }, - { 80817, true }, - { 80831, true }, - { 80847, true }, - { 80859, true }, - { 80873, true }, - { 80888, true }, - { 80898, true }, - { 80908, false }, - { 80918, true }, - { 80927, true }, - { 80935, true }, - { 80945, true }, - { 80958, true }, - { 80977, true }, - { 80986, true }, - { 80996, true }, - { 81019, true }, - { 81035, false }, - { 81055, true }, - { 81078, true }, - { 81092, true }, - { 81104, true }, - { 81113, true }, - { 81130, true }, - { 81149, true }, - { 81166, false }, - { 81178, false }, - { 81190, true }, - { 81201, true }, - { 81215, true }, - { 81230, true }, - { 81248, true }, + { 80646, true }, + { 80656, true }, + { 80669, true }, + { 80688, true }, + { 80697, true }, + { 80707, true }, + { 80730, true }, + { 80746, false }, + { 80766, true }, + { 80789, true }, + { 80803, true }, + { 80815, true }, + { 80824, true }, + { 80841, true }, + { 80860, true }, + { 80877, false }, + { 80889, true }, + { 80900, false }, + { 80912, true }, + { 80923, true }, + { 80937, true }, + { 80952, true }, + { 80970, true }, + { 80980, true }, + { 80988, true }, + { 80999, true }, + { 81013, true }, + { 81027, true }, + { 81040, false }, + { 81053, true }, + { 81065, true }, + { 81080, true }, + { 81109, true }, + { 81123, true }, + { 81137, true }, + { 81152, false }, + { 81166, true }, + { 81178, true }, + { 81192, true }, + { 81206, true }, + { 81218, true }, + { 81232, true }, + { 81246, true }, { 81258, true }, - { 81266, true }, - { 81277, true }, - { 81291, true }, - { 81305, true }, - { 81318, false }, - { 81331, true }, - { 81343, true }, - { 81358, true }, - { 81387, true }, - { 81401, true }, - { 81415, true }, - { 81430, false }, - { 81444, true }, - { 81456, true }, + { 81274, true }, + { 81290, true }, + { 81309, true }, + { 81328, false }, + { 81357, true }, + { 81371, true }, + { 81385, true }, + { 81403, true }, + { 81424, true }, + { 81439, true }, + { 81452, true }, { 81470, true }, - { 81484, true }, - { 81496, true }, - { 81510, true }, - { 81524, true }, - { 81536, true }, + { 81490, true }, + { 81502, true }, + { 81514, true }, + { 81529, true }, { 81552, true }, - { 81568, true }, - { 81587, true }, - { 81606, false }, - { 81635, true }, - { 81649, true }, - { 81663, true }, - { 81681, true }, + { 81576, true }, + { 81600, true }, + { 81624, true }, + { 81634, true }, + { 81648, true }, + { 81670, true }, { 81702, true }, - { 81717, true }, + { 81713, true }, + { 81721, true }, { 81730, true }, - { 81748, true }, - { 81768, true }, - { 81780, true }, - { 81792, true }, - { 81807, true }, - { 81830, true }, - { 81854, true }, - { 81878, true }, - { 81902, true }, - { 81912, true }, - { 81926, true }, - { 81948, true }, - { 81980, true }, - { 81991, true }, - { 81999, true }, - { 82008, true }, - { 82018, true }, - { 82030, true }, - { 82045, true }, - { 82059, false }, - { 82079, true }, - { 82092, true }, - { 82103, true }, - { 82112, true }, - { 82119, true }, - { 82130, true }, - { 82139, true }, + { 81740, true }, + { 81752, true }, + { 81767, true }, + { 81781, false }, + { 81801, true }, + { 81814, true }, + { 81825, true }, + { 81834, true }, + { 81841, true }, + { 81852, true }, + { 81861, true }, + { 81874, true }, + { 81891, true }, + { 81905, true }, + { 81923, true }, + { 81946, true }, + { 81961, false }, + { 81972, false }, + { 81983, true }, + { 81996, true }, + { 82009, true }, + { 82035, false }, + { 82051, true }, + { 82061, true }, + { 82069, true }, + { 82078, true }, + { 82090, true }, + { 82102, true }, + { 82114, false }, + { 82126, true }, + { 82140, true }, { 82152, true }, - { 82169, true }, - { 82183, true }, - { 82201, true }, + { 82164, true }, + { 82181, true }, + { 82193, true }, + { 82213, true }, { 82224, true }, - { 82239, false }, - { 82250, false }, - { 82262, false }, - { 82273, true }, + { 82240, true }, + { 82252, true }, + { 82269, true }, { 82289, true }, - { 82302, true }, - { 82315, true }, - { 82341, false }, - { 82357, true }, - { 82367, true }, - { 82375, true }, - { 82384, true }, - { 82396, true }, - { 82408, true }, - { 82420, false }, - { 82432, true }, - { 82445, true }, - { 82459, true }, - { 82471, true }, + { 82298, true }, + { 82311, true }, + { 82330, true }, + { 82343, true }, + { 82361, true }, + { 82374, true }, + { 82398, true }, + { 82412, true }, + { 82429, true }, + { 82444, true }, + { 82456, true }, + { 82468, true }, { 82483, true }, { 82500, true }, - { 82512, true }, - { 82532, true }, - { 82543, true }, - { 82559, true }, - { 82571, true }, + { 82508, true }, + { 82520, true }, + { 82539, true }, + { 82556, true }, + { 82573, true }, { 82588, true }, - { 82608, true }, - { 82617, true }, - { 82630, true }, - { 82649, true }, - { 82662, true }, - { 82680, true }, - { 82693, true }, - { 82717, true }, - { 82731, true }, - { 82748, true }, - { 82763, true }, - { 82775, true }, - { 82787, true }, - { 82802, true }, - { 82819, true }, - { 82827, true }, - { 82839, true }, - { 82858, true }, - { 82875, true }, - { 82892, true }, - { 82907, true }, + { 82600, true }, + { 82625, true }, + { 82640, false }, + { 82653, false }, + { 82665, true }, + { 82685, true }, + { 82697, true }, + { 82710, true }, + { 82722, true }, + { 82736, true }, + { 82754, true }, + { 82766, true }, + { 82790, true }, + { 82803, true }, + { 82822, true }, + { 82834, true }, + { 82846, true }, + { 82870, true }, + { 82891, true }, + { 82905, true }, { 82919, true }, - { 82944, true }, - { 82959, false }, - { 82972, false }, + { 82932, false }, + { 82948, true }, + { 82972, true }, { 82984, true }, - { 83004, true }, - { 83016, true }, - { 83029, true }, - { 83041, true }, - { 83055, true }, - { 83073, true }, - { 83085, true }, - { 83109, true }, + { 82997, true }, + { 83030, true }, + { 83062, true }, + { 83080, true }, + { 83089, true }, + { 83099, true }, + { 83110, true }, { 83122, true }, - { 83141, true }, - { 83153, true }, - { 83165, true }, - { 83189, true }, - { 83210, true }, - { 83224, true }, - { 83238, true }, - { 83251, false }, - { 83267, true }, - { 83291, true }, - { 83303, true }, - { 83316, true }, - { 83349, true }, - { 83381, true }, - { 83399, true }, - { 83408, true }, - { 83418, true }, - { 83429, true }, - { 83441, true }, - { 83451, true }, - { 83462, true }, - { 83474, true }, - { 83483, true }, - { 83492, true }, - { 83513, true }, - { 83534, true }, - { 83544, true }, - { 83556, true }, - { 83572, true }, - { 83594, true }, - { 83612, true }, - { 83631, true }, - { 83650, true }, - { 83660, false }, - { 83674, true }, - { 83688, true }, - { 83701, true }, - { 83722, true }, - { 83735, true }, - { 83744, true }, - { 83757, true }, - { 83765, false }, - { 83782, true }, - { 83796, true }, - { 83812, true }, - { 83831, true }, - { 83850, true }, - { 83860, true }, - { 83874, true }, - { 83882, true }, - { 83896, true }, - { 83915, false }, - { 83933, true }, - { 83942, true }, - { 83955, true }, - { 83968, true }, - { 83983, true }, - { 84003, false }, + { 83132, true }, + { 83143, true }, + { 83155, true }, + { 83164, true }, + { 83173, true }, + { 83194, true }, + { 83215, true }, + { 83225, true }, + { 83237, true }, + { 83253, true }, + { 83275, true }, + { 83293, true }, + { 83312, true }, + { 83331, true }, + { 83341, false }, + { 83355, true }, + { 83369, true }, + { 83382, true }, + { 83403, true }, + { 83416, true }, + { 83425, true }, + { 83438, true }, + { 83446, false }, + { 83463, true }, + { 83477, true }, + { 83493, true }, + { 83512, true }, + { 83531, true }, + { 83541, true }, + { 83555, true }, + { 83563, true }, + { 83577, true }, + { 83596, false }, + { 83614, true }, + { 83623, true }, + { 83636, true }, + { 83649, true }, + { 83664, true }, + { 83684, false }, + { 83697, true }, + { 83714, true }, + { 83727, true }, + { 83740, true }, + { 83764, true }, + { 83791, true }, + { 83801, true }, + { 83814, false }, + { 83828, true }, + { 83840, true }, + { 83853, true }, + { 83867, true }, + { 83879, true }, + { 83894, true }, + { 83912, true }, + { 83925, true }, + { 83948, true }, + { 83971, false }, + { 83982, true }, + { 84000, true }, { 84016, true }, - { 84033, true }, - { 84046, true }, - { 84059, true }, - { 84083, true }, - { 84110, true }, - { 84120, true }, - { 84133, false }, - { 84147, true }, - { 84159, true }, - { 84172, true }, - { 84186, true }, - { 84198, true }, - { 84213, true }, - { 84231, true }, - { 84244, true }, - { 84267, true }, - { 84290, false }, - { 84301, true }, - { 84319, true }, - { 84335, true }, - { 84353, true }, - { 84373, true }, - { 84395, true }, - { 84411, true }, - { 84428, true }, - { 84445, true }, - { 84462, true }, - { 84480, true }, - { 84494, true }, - { 84507, true }, - { 84524, true }, - { 84539, true }, - { 84553, true }, - { 84564, true }, - { 84580, true }, - { 84589, true }, - { 84608, true }, - { 84623, true }, - { 84631, true }, - { 84640, true }, - { 84651, true }, - { 84666, true }, - { 84681, true }, - { 84698, false }, - { 84709, true }, - { 84725, true }, - { 84739, true }, - { 84751, true }, - { 84765, true }, - { 84773, true }, + { 84034, true }, + { 84054, true }, + { 84076, true }, + { 84092, true }, + { 84109, true }, + { 84126, true }, + { 84143, true }, + { 84161, true }, + { 84175, true }, + { 84188, true }, + { 84205, true }, + { 84220, true }, + { 84234, true }, + { 84245, true }, + { 84261, true }, + { 84270, true }, + { 84289, true }, + { 84304, true }, + { 84312, true }, + { 84321, true }, + { 84332, true }, + { 84347, true }, + { 84362, true }, + { 84379, false }, + { 84390, true }, + { 84406, true }, + { 84420, true }, + { 84432, true }, + { 84446, true }, + { 84454, true }, + { 84474, true }, + { 84495, true }, + { 84505, true }, + { 84514, true }, + { 84530, true }, + { 84540, true }, + { 84546, true }, + { 84558, true }, + { 84566, true }, + { 84588, true }, + { 84602, true }, + { 84610, true }, + { 84625, true }, + { 84636, true }, + { 84649, true }, + { 84665, true }, + { 84683, false }, + { 84696, true }, + { 84710, true }, + { 84719, true }, + { 84730, true }, + { 84750, true }, + { 84762, true }, + { 84774, true }, { 84793, true }, - { 84814, true }, - { 84824, true }, - { 84833, true }, - { 84849, true }, - { 84855, true }, - { 84867, true }, - { 84875, true }, - { 84897, true }, - { 84911, true }, - { 84919, true }, - { 84934, true }, - { 84945, true }, - { 84958, true }, - { 84974, true }, - { 84992, false }, - { 85005, true }, - { 85019, true }, - { 85028, true }, - { 85039, true }, - { 85059, true }, - { 85071, true }, + { 84812, true }, + { 84820, true }, + { 84837, true }, + { 84856, true }, + { 84865, true }, + { 84874, true }, + { 84893, true }, + { 84904, true }, + { 84920, true }, + { 84927, true }, + { 84939, true }, + { 84960, true }, + { 84977, true }, + { 84990, true }, + { 85000, true }, + { 85013, true }, + { 85024, true }, + { 85049, true }, + { 85064, true }, { 85083, true }, - { 85102, true }, - { 85121, true }, - { 85129, true }, - { 85146, true }, - { 85165, true }, - { 85174, true }, - { 85183, true }, - { 85202, true }, - { 85213, true }, - { 85229, true }, - { 85236, true }, - { 85248, true }, - { 85269, true }, - { 85286, true }, - { 85299, true }, - { 85309, true }, - { 85322, true }, + { 85110, true }, + { 85129, false }, + { 85143, true }, + { 85154, true }, + { 85169, true }, + { 85181, true }, + { 85192, true }, + { 85207, true }, + { 85216, true }, + { 85232, true }, + { 85246, true }, + { 85260, true }, + { 85277, true }, + { 85288, true }, + { 85304, true }, + { 85324, true }, { 85333, true }, - { 85358, true }, - { 85373, true }, - { 85392, true }, - { 85419, true }, - { 85438, false }, - { 85452, true }, - { 85463, true }, - { 85478, true }, - { 85490, true }, - { 85501, true }, - { 85516, true }, - { 85525, true }, - { 85541, true }, - { 85555, true }, - { 85569, true }, - { 85586, true }, - { 85597, true }, - { 85613, true }, - { 85633, true }, - { 85642, true }, - { 85653, true }, - { 85673, false }, + { 85344, true }, + { 85364, false }, + { 85388, true }, + { 85399, false }, + { 85407, true }, + { 85425, true }, + { 85449, true }, + { 85467, true }, + { 85489, true }, + { 85514, true }, + { 85530, true }, + { 85542, true }, + { 85554, true }, + { 85575, true }, + { 85589, true }, + { 85602, false }, + { 85619, true }, + { 85628, true }, + { 85650, true }, + { 85670, true }, { 85697, true }, - { 85708, false }, { 85716, true }, - { 85734, true }, - { 85758, true }, - { 85776, true }, - { 85798, true }, - { 85823, true }, - { 85839, true }, - { 85851, true }, + { 85728, true }, + { 85748, true }, + { 85756, true }, + { 85765, true }, + { 85782, true }, + { 85797, true }, + { 85812, true }, + { 85841, true }, { 85863, true }, - { 85884, true }, - { 85898, true }, - { 85911, false }, - { 85928, true }, - { 85937, true }, - { 85959, true }, - { 85979, true }, - { 86006, true }, - { 86025, true }, - { 86037, true }, - { 86057, true }, - { 86065, true }, - { 86074, true }, - { 86091, true }, - { 86106, true }, - { 86121, true }, - { 86150, true }, - { 86172, true }, - { 86190, true }, - { 86204, true }, - { 86217, true }, - { 86232, true }, - { 86245, true }, - { 86255, true }, - { 86271, true }, - { 86284, true }, - { 86302, true }, - { 86320, false }, - { 86328, true }, - { 86341, true }, - { 86348, false }, - { 86368, true }, - { 86377, true }, - { 86392, true }, + { 85881, true }, + { 85895, true }, + { 85908, true }, + { 85923, true }, + { 85936, true }, + { 85946, true }, + { 85962, true }, + { 85975, true }, + { 85993, true }, + { 86011, false }, + { 86019, true }, + { 86032, true }, + { 86039, false }, + { 86059, true }, + { 86068, true }, + { 86083, true }, + { 86101, true }, + { 86113, true }, + { 86122, false }, + { 86132, true }, + { 86140, true }, + { 86161, true }, + { 86175, true }, + { 86192, true }, + { 86203, true }, + { 86213, true }, + { 86230, true }, + { 86252, true }, + { 86273, true }, + { 86288, true }, + { 86305, true }, + { 86315, true }, + { 86330, true }, + { 86346, true }, + { 86357, true }, + { 86369, true }, + { 86388, true }, { 86410, true }, - { 86422, true }, - { 86431, false }, - { 86441, true }, + { 86423, true }, + { 86434, true }, { 86449, true }, - { 86470, true }, - { 86484, true }, + { 86469, true }, + { 86485, true }, { 86501, true }, - { 86512, true }, - { 86522, true }, - { 86539, true }, - { 86561, true }, + { 86511, true }, + { 86523, true }, + { 86531, true }, + { 86550, false }, + { 86569, true }, { 86582, true }, - { 86597, true }, - { 86614, true }, - { 86624, true }, - { 86640, true }, - { 86651, true }, - { 86663, true }, - { 86682, true }, - { 86704, true }, - { 86717, true }, - { 86728, true }, - { 86743, true }, - { 86763, true }, - { 86779, true }, - { 86795, true }, - { 86805, true }, - { 86817, true }, - { 86825, true }, - { 86844, false }, - { 86863, true }, - { 86876, true }, - { 86893, true }, - { 86905, true }, - { 86919, true }, + { 86599, true }, + { 86611, true }, + { 86625, true }, + { 86645, true }, + { 86659, true }, + { 86671, true }, + { 86684, true }, + { 86698, true }, + { 86723, true }, + { 86738, true }, + { 86752, true }, + { 86774, true }, + { 86790, true }, + { 86809, true }, + { 86822, true }, + { 86839, true }, + { 86857, true }, + { 86870, true }, + { 86880, true }, + { 86895, true }, + { 86910, true }, + { 86920, true }, { 86939, true }, - { 86953, true }, - { 86965, true }, - { 86978, true }, + { 86952, true }, + { 86977, true }, { 86992, true }, - { 87017, true }, - { 87032, true }, - { 87054, true }, - { 87070, true }, - { 87089, true }, - { 87102, true }, - { 87119, true }, - { 87137, true }, - { 87150, true }, - { 87160, true }, - { 87175, true }, - { 87190, true }, - { 87200, true }, - { 87219, true }, - { 87232, true }, - { 87257, true }, - { 87272, true }, - { 87290, true }, - { 87303, true }, - { 87315, true }, - { 87326, true }, - { 87340, true }, - { 87353, true }, - { 87371, true }, - { 87390, true }, - { 87404, true }, - { 87420, true }, - { 87439, true }, - { 87451, true }, - { 87464, true }, - { 87476, true }, - { 87492, true }, - { 87508, true }, - { 87524, true }, - { 87535, true }, - { 87550, true }, - { 87565, true }, - { 87579, true }, - { 87597, true }, - { 87617, true }, - { 87636, true }, - { 87649, true }, - { 87673, true }, - { 87683, true }, - { 87696, true }, - { 87708, true }, - { 87718, true }, - { 87730, true }, - { 87746, true }, - { 87754, true }, - { 87762, true }, - { 87777, true }, - { 87790, true }, - { 87801, true }, + { 87010, true }, + { 87023, true }, + { 87035, true }, + { 87046, true }, + { 87060, true }, + { 87073, true }, + { 87091, true }, + { 87110, true }, + { 87124, true }, + { 87140, true }, + { 87159, true }, + { 87171, true }, + { 87184, true }, + { 87196, true }, + { 87212, true }, + { 87228, true }, + { 87244, true }, + { 87255, true }, + { 87270, true }, + { 87285, true }, + { 87299, true }, + { 87317, true }, + { 87337, true }, + { 87356, true }, + { 87369, true }, + { 87393, true }, + { 87403, true }, + { 87416, true }, + { 87428, true }, + { 87438, true }, + { 87450, true }, + { 87466, true }, + { 87474, true }, + { 87482, true }, + { 87497, true }, + { 87510, true }, + { 87521, true }, + { 87534, true }, + { 87545, true }, + { 87561, true }, + { 87572, true }, + { 87584, true }, + { 87594, true }, + { 87611, true }, + { 87629, false }, + { 87642, true }, + { 87657, true }, + { 87674, true }, + { 87692, true }, + { 87706, false }, + { 87724, true }, + { 87740, true }, + { 87756, true }, + { 87765, true }, + { 87774, true }, + { 87789, true }, + { 87799, true }, { 87814, true }, - { 87825, true }, - { 87841, true }, - { 87852, true }, - { 87864, true }, - { 87874, true }, - { 87891, true }, - { 87909, false }, - { 87922, true }, - { 87937, true }, - { 87954, true }, + { 87824, true }, + { 87838, true }, + { 87850, true }, + { 87867, true }, + { 87881, true }, + { 87889, true }, + { 87897, true }, + { 87906, true }, + { 87918, true }, + { 87929, true }, + { 87938, false }, + { 87946, true }, { 87972, true }, - { 87986, false }, - { 88004, true }, + { 87985, true }, + { 87998, true }, + { 88006, true }, { 88020, true }, - { 88036, true }, - { 88045, true }, - { 88054, true }, - { 88069, true }, - { 88079, true }, + { 88031, true }, + { 88041, true }, + { 88058, true }, + { 88070, true }, + { 88085, true }, { 88094, true }, - { 88108, true }, - { 88120, true }, - { 88137, true }, - { 88151, true }, - { 88159, true }, + { 88105, true }, + { 88116, true }, + { 88127, true }, + { 88142, true }, + { 88155, true }, { 88167, true }, - { 88176, true }, + { 88180, true }, { 88188, true }, - { 88199, true }, - { 88208, false }, - { 88216, true }, + { 88202, true }, + { 88217, true }, + { 88228, false }, { 88242, true }, - { 88255, true }, - { 88268, true }, - { 88276, true }, - { 88290, true }, - { 88301, true }, - { 88311, true }, - { 88328, true }, - { 88340, true }, - { 88355, true }, - { 88364, true }, - { 88375, true }, - { 88386, true }, - { 88397, true }, - { 88412, true }, - { 88425, true }, - { 88437, true }, + { 88263, true }, + { 88274, true }, + { 88288, true }, + { 88306, true }, + { 88317, true }, + { 88330, true }, + { 88349, true }, + { 88363, true }, + { 88379, true }, + { 88392, true }, + { 88407, true }, + { 88420, true }, + { 88434, false }, { 88450, true }, - { 88458, true }, - { 88472, true }, - { 88487, true }, - { 88498, false }, - { 88512, true }, - { 88533, true }, - { 88544, true }, - { 88558, true }, - { 88576, true }, - { 88587, true }, - { 88600, true }, - { 88619, true }, - { 88633, true }, - { 88649, true }, - { 88662, true }, - { 88677, true }, - { 88690, true }, - { 88704, false }, - { 88720, true }, - { 88731, true }, - { 88750, true }, - { 88763, true }, - { 88786, true }, - { 88795, true }, - { 88806, true }, - { 88817, true }, - { 88826, true }, - { 88844, true }, - { 88858, true }, - { 88875, true }, - { 88893, true }, - { 88912, true }, - { 88922, true }, - { 88935, true }, - { 88946, true }, - { 88955, true }, - { 88972, true }, - { 88992, true }, - { 89006, true }, - { 89014, true }, + { 88461, true }, + { 88480, true }, + { 88493, true }, + { 88516, true }, + { 88525, true }, + { 88536, true }, + { 88547, true }, + { 88556, true }, + { 88574, true }, + { 88588, true }, + { 88605, true }, + { 88623, true }, + { 88642, true }, + { 88652, true }, + { 88665, true }, + { 88676, true }, + { 88685, true }, + { 88702, true }, + { 88722, true }, + { 88736, true }, + { 88744, true }, + { 88754, true }, + { 88762, true }, + { 88772, true }, + { 88780, true }, + { 88787, true }, + { 88800, true }, + { 88811, true }, + { 88825, true }, + { 88839, true }, + { 88853, true }, + { 88863, true }, + { 88873, true }, + { 88886, true }, + { 88896, true }, + { 88908, true }, + { 88915, true }, + { 88938, true }, + { 88947, true }, + { 88962, true }, + { 88969, true }, + { 88985, true }, + { 88991, true }, + { 89003, true }, + { 89013, true }, { 89024, true }, - { 89032, true }, - { 89042, true }, + { 89034, true }, + { 89041, true }, { 89050, true }, - { 89057, true }, - { 89070, true }, - { 89081, true }, - { 89095, true }, - { 89109, true }, - { 89123, true }, - { 89133, true }, - { 89143, true }, - { 89156, true }, - { 89166, true }, + { 89059, true }, + { 89073, true }, + { 89091, true }, + { 89107, true }, + { 89129, true }, + { 89142, true }, + { 89151, true }, + { 89165, true }, { 89178, true }, - { 89185, true }, - { 89208, true }, - { 89217, true }, - { 89232, true }, - { 89239, true }, - { 89255, true }, - { 89261, true }, - { 89273, true }, - { 89283, true }, - { 89294, true }, - { 89304, true }, - { 89311, true }, - { 89320, true }, - { 89329, true }, - { 89343, true }, - { 89361, true }, - { 89377, true }, - { 89399, true }, - { 89412, true }, - { 89421, true }, - { 89435, true }, - { 89448, true }, - { 89460, true }, - { 89470, true }, + { 89190, true }, + { 89200, true }, + { 89213, true }, + { 89222, true }, + { 89244, true }, + { 89267, true }, + { 89282, true }, + { 89297, true }, + { 89315, true }, + { 89325, true }, + { 89344, true }, + { 89363, true }, + { 89381, true }, + { 89401, true }, + { 89411, true }, + { 89422, true }, + { 89440, true }, + { 89452, true }, + { 89463, true }, { 89479, true }, - { 89501, true }, - { 89524, true }, - { 89539, true }, - { 89554, true }, - { 89572, true }, - { 89582, true }, - { 89601, true }, - { 89620, true }, - { 89638, true }, - { 89658, true }, + { 89496, true }, + { 89511, true }, + { 89527, true }, + { 89543, true }, + { 89552, true }, + { 89569, true }, + { 89581, true }, + { 89598, true }, + { 89616, true }, + { 89628, true }, + { 89645, true }, + { 89659, true }, { 89668, true }, - { 89679, true }, + { 89682, true }, { 89697, true }, - { 89709, true }, - { 89720, true }, - { 89736, true }, + { 89708, true }, + { 89723, true }, + { 89738, true }, { 89753, true }, - { 89768, true }, + { 89771, true }, { 89784, true }, - { 89800, true }, - { 89809, true }, - { 89826, true }, - { 89838, true }, - { 89855, true }, - { 89873, true }, - { 89885, true }, - { 89902, true }, - { 89916, true }, + { 89796, true }, + { 89813, true }, + { 89834, true }, + { 89858, true }, + { 89880, true }, + { 89893, true }, + { 89908, true }, { 89925, true }, - { 89939, true }, - { 89954, true }, - { 89965, true }, - { 89980, true }, - { 89995, true }, - { 90010, true }, - { 90028, true }, - { 90041, true }, - { 90053, true }, - { 90070, true }, - { 90091, true }, - { 90115, true }, - { 90137, true }, - { 90150, true }, - { 90165, true }, - { 90182, true }, + { 89941, true }, + { 89955, true }, + { 89968, true }, + { 89988, true }, + { 90006, true }, + { 90027, true }, + { 90040, false }, + { 90061, true }, + { 90079, true }, + { 90102, true }, + { 90118, true }, + { 90131, true }, + { 90146, true }, + { 90163, true }, + { 90177, true }, { 90198, true }, - { 90212, true }, - { 90225, true }, - { 90245, true }, - { 90263, true }, + { 90209, true }, + { 90234, true }, + { 90250, true }, + { 90267, true }, { 90284, true }, - { 90297, false }, - { 90318, true }, - { 90336, true }, - { 90359, true }, - { 90375, true }, - { 90388, true }, - { 90403, true }, - { 90420, true }, - { 90434, true }, - { 90455, true }, - { 90466, true }, - { 90491, true }, - { 90507, true }, - { 90524, true }, - { 90541, true }, - { 90553, false }, - { 90570, true }, - { 90584, true }, - { 90597, true }, - { 90612, true }, - { 90624, false }, - { 90635, true }, - { 90651, true }, - { 90667, true }, - { 90679, true }, - { 90695, true }, - { 90709, true }, - { 90722, true }, - { 90732, true }, - { 90751, true }, - { 90760, true }, - { 90767, true }, - { 90778, true }, - { 90787, true }, - { 90804, true }, - { 90816, true }, - { 90825, true }, - { 90836, true }, + { 90296, false }, + { 90313, true }, + { 90327, true }, + { 90340, true }, + { 90355, true }, + { 90367, false }, + { 90378, true }, + { 90394, true }, + { 90410, true }, + { 90422, true }, + { 90438, true }, + { 90452, true }, + { 90465, true }, + { 90475, true }, + { 90494, true }, + { 90503, true }, + { 90510, true }, + { 90521, true }, + { 90530, true }, + { 90547, true }, + { 90559, true }, + { 90568, true }, + { 90579, true }, + { 90592, true }, + { 90604, true }, + { 90611, true }, + { 90626, true }, + { 90641, true }, + { 90648, false }, + { 90655, false }, + { 90664, true }, + { 90700, true }, + { 90712, true }, + { 90724, true }, + { 90735, true }, + { 90756, true }, + { 90782, true }, + { 90792, true }, + { 90801, true }, + { 90810, true }, + { 90817, true }, + { 90829, false }, + { 90841, false }, { 90849, true }, { 90861, true }, - { 90868, true }, - { 90883, true }, - { 90898, true }, - { 90905, false }, - { 90912, false }, - { 90921, true }, - { 90957, true }, - { 90969, true }, - { 90981, true }, - { 90992, true }, - { 91013, true }, - { 91039, true }, - { 91049, true }, - { 91058, true }, - { 91067, true }, - { 91074, true }, - { 91086, false }, - { 91098, false }, - { 91106, true }, - { 91118, true }, + { 90874, true }, + { 90888, false }, + { 90903, true }, + { 90917, true }, + { 90930, true }, + { 90942, true }, + { 90954, true }, + { 90965, true }, + { 90979, true }, + { 90999, true }, + { 91010, true }, + { 91020, true }, + { 91028, true }, + { 91041, true }, + { 91053, true }, + { 91064, true }, + { 91076, true }, + { 91093, true }, + { 91103, true }, + { 91113, false }, { 91131, true }, - { 91145, false }, - { 91160, true }, - { 91174, true }, - { 91187, true }, - { 91199, true }, - { 91211, true }, - { 91222, true }, - { 91236, true }, - { 91256, true }, - { 91267, true }, - { 91277, true }, - { 91285, true }, + { 91149, true }, + { 91171, true }, + { 91193, true }, + { 91204, true }, + { 91216, true }, + { 91231, true }, + { 91247, true }, + { 91258, true }, + { 91274, true }, { 91298, true }, - { 91310, true }, { 91321, true }, - { 91333, true }, + { 91339, true }, { 91350, true }, - { 91360, true }, - { 91370, false }, - { 91388, true }, - { 91406, true }, - { 91428, true }, - { 91450, true }, + { 91371, true }, + { 91389, true }, + { 91402, true }, + { 91429, true }, + { 91449, true }, { 91461, true }, - { 91473, true }, - { 91488, true }, - { 91504, true }, - { 91515, true }, - { 91531, true }, - { 91555, true }, - { 91578, true }, - { 91596, true }, - { 91607, true }, - { 91628, true }, - { 91646, true }, - { 91659, true }, - { 91686, true }, - { 91706, true }, - { 91718, true }, - { 91736, true }, - { 91750, true }, - { 91766, true }, - { 91782, true }, - { 91796, true }, - { 91809, true }, - { 91823, true }, - { 91837, true }, - { 91861, true }, - { 91889, false }, - { 91900, true }, - { 91911, true }, - { 91929, true }, - { 91947, true }, - { 91968, true }, - { 91989, true }, - { 92010, true }, - { 92024, true }, - { 92037, true }, - { 92059, true }, - { 92070, true }, - { 92089, true }, - { 92107, true }, - { 92117, true }, - { 92135, true }, - { 92154, true }, - { 92172, true }, - { 92193, true }, - { 92214, true }, - { 92234, true }, - { 92244, true }, - { 92266, true }, - { 92282, true }, - { 92303, true }, - { 92319, true }, - { 92330, true }, - { 92341, true }, - { 92351, true }, + { 91479, true }, + { 91493, true }, + { 91509, true }, + { 91525, true }, + { 91539, true }, + { 91552, true }, + { 91566, true }, + { 91580, true }, + { 91604, true }, + { 91632, false }, + { 91643, true }, + { 91654, true }, + { 91672, true }, + { 91690, true }, + { 91711, true }, + { 91732, true }, + { 91753, true }, + { 91767, true }, + { 91780, true }, + { 91802, true }, + { 91813, true }, + { 91832, true }, + { 91850, true }, + { 91860, true }, + { 91878, true }, + { 91897, true }, + { 91915, true }, + { 91936, true }, + { 91957, true }, + { 91977, true }, + { 91987, true }, + { 92009, true }, + { 92025, true }, + { 92046, true }, + { 92062, true }, + { 92073, true }, + { 92084, true }, + { 92094, true }, + { 92104, true }, + { 92121, true }, + { 92135, false }, + { 92148, true }, + { 92160, true }, + { 92171, true }, + { 92188, true }, + { 92198, true }, + { 92212, true }, + { 92231, true }, + { 92249, true }, + { 92269, true }, + { 92280, true }, + { 92293, true }, + { 92309, true }, + { 92322, true }, + { 92332, true }, + { 92347, true }, { 92361, true }, - { 92378, true }, - { 92392, false }, - { 92405, true }, + { 92373, true }, + { 92387, true }, + { 92399, true }, { 92417, true }, - { 92428, true }, + { 92432, true }, { 92445, true }, - { 92455, true }, - { 92469, true }, - { 92488, true }, + { 92462, true }, + { 92479, true }, + { 92493, true }, { 92506, true }, - { 92526, true }, - { 92537, true }, - { 92550, true }, - { 92566, true }, - { 92579, true }, - { 92589, true }, - { 92604, true }, - { 92618, true }, - { 92630, true }, - { 92644, true }, - { 92656, true }, + { 92520, true }, + { 92532, true }, + { 92541, true }, + { 92560, true }, + { 92577, true }, + { 92588, false }, + { 92599, true }, + { 92609, true }, + { 92620, true }, + { 92633, true }, + { 92647, true }, + { 92657, true }, { 92674, true }, - { 92689, true }, - { 92702, true }, + { 92683, true }, + { 92697, true }, + { 92705, true }, + { 92712, true }, { 92719, true }, - { 92736, true }, - { 92750, true }, - { 92763, true }, - { 92777, true }, - { 92789, true }, - { 92798, true }, - { 92817, true }, - { 92834, true }, - { 92845, false }, - { 92856, true }, - { 92866, true }, - { 92877, true }, - { 92890, true }, - { 92904, true }, - { 92914, true }, - { 92931, true }, - { 92940, true }, - { 92954, true }, - { 92962, true }, - { 92969, true }, - { 92976, true }, - { 92985, true }, - { 93004, true }, - { 93019, true }, + { 92728, true }, + { 92747, true }, + { 92762, true }, + { 92775, true }, + { 92796, true }, + { 92816, true }, + { 92835, true }, + { 92852, true }, + { 92868, true }, + { 92888, true }, + { 92898, true }, + { 92917, true }, + { 92938, true }, + { 92955, true }, + { 92968, true }, + { 92981, true }, + { 92995, true }, + { 93005, true }, + { 93020, true }, { 93032, true }, - { 93053, true }, - { 93073, true }, - { 93092, true }, - { 93109, true }, - { 93125, true }, - { 93145, true }, - { 93155, true }, - { 93174, true }, + { 93048, false }, + { 93062, false }, + { 93075, false }, + { 93082, true }, + { 93090, true }, + { 93102, true }, + { 93112, true }, + { 93127, true }, + { 93142, true }, + { 93164, true }, + { 93183, true }, { 93195, true }, - { 93212, true }, - { 93225, true }, - { 93238, true }, - { 93252, true }, - { 93262, true }, - { 93277, true }, - { 93289, true }, - { 93305, false }, - { 93319, false }, - { 93332, false }, - { 93339, true }, + { 93207, true }, + { 93218, true }, + { 93233, true }, + { 93249, true }, + { 93267, true }, + { 93285, true }, + { 93293, true }, + { 93313, true }, + { 93327, true }, + { 93337, true }, { 93347, true }, - { 93359, true }, - { 93369, true }, - { 93384, true }, - { 93397, true }, - { 93412, true }, - { 93434, true }, - { 93453, true }, - { 93465, true }, - { 93477, true }, - { 93488, true }, - { 93503, true }, - { 93519, true }, - { 93537, true }, - { 93555, true }, - { 93563, true }, - { 93583, true }, - { 93597, true }, - { 93607, true }, - { 93617, true }, - { 93630, true }, - { 93637, true }, - { 93648, true }, - { 93657, true }, - { 93669, false }, - { 93689, false }, - { 93705, true }, - { 93716, true }, - { 93731, true }, + { 93360, true }, + { 93367, true }, + { 93378, true }, + { 93387, true }, + { 93399, false }, + { 93419, false }, + { 93435, true }, + { 93446, true }, + { 93461, true }, + { 93474, true }, + { 93487, true }, + { 93499, true }, + { 93512, true }, + { 93529, false }, + { 93540, false }, + { 93550, true }, + { 93565, true }, + { 93580, true }, + { 93596, true }, + { 93615, true }, + { 93629, true }, + { 93646, true }, + { 93672, true }, + { 93685, true }, + { 93700, true }, + { 93715, true }, + { 93730, true }, { 93744, true }, - { 93757, true }, - { 93769, true }, - { 93782, true }, - { 93799, false }, - { 93810, false }, - { 93820, true }, - { 93835, true }, - { 93850, true }, - { 93866, true }, - { 93885, true }, - { 93899, true }, - { 93916, true }, - { 93942, true }, - { 93955, true }, - { 93970, true }, - { 93985, true }, - { 94000, true }, - { 94014, true }, - { 94033, true }, - { 94050, true }, - { 94066, true }, - { 94087, true }, - { 94104, true }, - { 94138, true }, - { 94162, true }, - { 94191, true }, - { 94215, true }, - { 94231, true }, - { 94256, true }, - { 94268, true }, - { 94282, true }, - { 94300, true }, - { 94309, false }, - { 94319, true }, + { 93763, true }, + { 93780, true }, + { 93796, true }, + { 93817, true }, + { 93834, true }, + { 93868, true }, + { 93892, true }, + { 93921, true }, + { 93945, true }, + { 93961, true }, + { 93986, true }, + { 93998, true }, + { 94012, true }, + { 94030, true }, + { 94039, false }, + { 94049, true }, + { 94061, true }, + { 94076, true }, + { 94084, true }, + { 94093, true }, + { 94101, true }, + { 94115, true }, + { 94123, true }, + { 94139, true }, + { 94161, true }, + { 94173, true }, + { 94185, true }, + { 94196, true }, + { 94206, true }, + { 94216, false }, + { 94228, true }, + { 94244, true }, + { 94260, true }, + { 94274, true }, + { 94290, true }, + { 94302, true }, + { 94317, true }, { 94331, true }, - { 94346, true }, - { 94354, true }, - { 94363, true }, - { 94371, true }, - { 94385, true }, - { 94393, true }, - { 94409, true }, - { 94431, true }, - { 94443, true }, - { 94455, true }, - { 94466, true }, - { 94476, true }, - { 94486, false }, - { 94498, true }, - { 94514, true }, - { 94530, true }, - { 94544, true }, - { 94560, true }, - { 94572, true }, - { 94587, true }, - { 94601, true }, - { 94612, true }, - { 94627, true }, - { 94645, true }, - { 94660, true }, - { 94671, false }, - { 94683, true }, - { 94697, true }, - { 94708, true }, - { 94719, true }, - { 94730, true }, - { 94740, true }, - { 94757, true }, - { 94774, true }, - { 94792, true }, - { 94802, true }, - { 94825, true }, - { 94839, true }, - { 94855, true }, - { 94874, true }, - { 94887, true }, - { 94904, true }, - { 94922, false }, - { 94935, true }, - { 94956, true }, - { 94970, true }, - { 94980, true }, - { 94991, true }, - { 94998, false }, - { 95007, true }, - { 95023, true }, - { 95039, true }, - { 95046, true }, - { 95067, true }, - { 95077, false }, - { 95092, true }, - { 95107, true }, - { 95124, true }, - { 95134, true }, - { 95153, true }, - { 95168, true }, - { 95177, true }, - { 95186, true }, - { 95198, true }, - { 95217, true }, - { 95235, true }, - { 95245, true }, - { 95255, true }, - { 95268, true }, - { 95276, true }, - { 95287, true }, - { 95302, true }, + { 94342, true }, + { 94357, true }, + { 94375, true }, + { 94390, true }, + { 94401, false }, + { 94413, true }, + { 94427, true }, + { 94438, true }, + { 94449, true }, + { 94460, true }, + { 94470, true }, + { 94487, true }, + { 94504, true }, + { 94522, true }, + { 94532, true }, + { 94555, true }, + { 94569, true }, + { 94585, true }, + { 94604, true }, + { 94617, true }, + { 94634, true }, + { 94652, false }, + { 94665, true }, + { 94686, true }, + { 94700, true }, + { 94710, true }, + { 94721, true }, + { 94728, false }, + { 94737, true }, + { 94753, true }, + { 94769, true }, + { 94776, true }, + { 94797, true }, + { 94807, false }, + { 94822, true }, + { 94837, true }, + { 94854, true }, + { 94864, true }, + { 94883, true }, + { 94898, true }, + { 94907, true }, + { 94916, true }, + { 94928, true }, + { 94947, true }, + { 94965, true }, + { 94975, true }, + { 94985, true }, + { 94998, true }, + { 95006, true }, + { 95017, true }, + { 95032, true }, + { 95043, true }, + { 95059, true }, + { 95072, true }, + { 95082, true }, + { 95101, true }, + { 95117, true }, + { 95139, true }, + { 95151, true }, + { 95164, false }, + { 95178, true }, + { 95193, true }, + { 95207, true }, + { 95222, true }, + { 95238, true }, + { 95250, true }, + { 95261, false }, + { 95274, true }, + { 95286, true }, + { 95296, true }, { 95313, true }, - { 95329, true }, - { 95342, true }, - { 95352, true }, - { 95371, true }, - { 95387, true }, - { 95409, true }, - { 95421, true }, - { 95434, false }, - { 95448, true }, - { 95463, true }, - { 95477, true }, - { 95492, true }, - { 95508, true }, - { 95520, true }, - { 95531, false }, - { 95544, true }, - { 95556, true }, - { 95566, true }, - { 95583, true }, - { 95596, true }, - { 95615, true }, - { 95631, true }, - { 95643, false }, - { 95653, true }, - { 95669, true }, + { 95326, true }, + { 95345, true }, + { 95361, true }, + { 95373, false }, + { 95383, true }, + { 95399, true }, + { 95410, true }, + { 95430, false }, + { 95438, true }, + { 95450, true }, + { 95461, true }, + { 95473, true }, + { 95492, false }, + { 95512, true }, + { 95521, true }, + { 95532, true }, + { 95563, true }, + { 95577, true }, + { 95591, true }, + { 95611, true }, + { 95625, true }, + { 95649, true }, + { 95665, true }, { 95680, true }, - { 95700, false }, + { 95694, true }, { 95708, true }, - { 95720, true }, - { 95731, true }, - { 95743, true }, - { 95762, false }, - { 95782, true }, + { 95716, true }, + { 95729, true }, + { 95740, true }, + { 95752, true }, + { 95764, true }, + { 95780, true }, { 95791, true }, - { 95802, true }, - { 95833, true }, - { 95847, true }, - { 95861, true }, - { 95881, true }, + { 95806, true }, + { 95816, true }, + { 95841, true }, + { 95857, true }, + { 95873, true }, { 95895, true }, - { 95919, true }, - { 95935, true }, - { 95950, true }, - { 95964, true }, - { 95978, true }, + { 95911, true }, + { 95930, true }, + { 95954, true }, + { 95970, true }, { 95986, true }, - { 95999, true }, - { 96010, true }, - { 96022, true }, - { 96034, true }, - { 96050, true }, - { 96061, true }, - { 96076, true }, - { 96086, true }, - { 96111, true }, - { 96127, true }, - { 96143, true }, - { 96165, true }, + { 95996, true }, + { 96008, true }, + { 96025, true }, + { 96043, true }, + { 96055, true }, + { 96069, true }, + { 96084, true }, + { 96104, true }, + { 96124, true }, + { 96144, true }, + { 96165, false }, { 96181, true }, - { 96200, true }, - { 96224, true }, - { 96240, true }, - { 96256, true }, - { 96266, true }, - { 96278, true }, - { 96295, true }, - { 96313, true }, - { 96325, true }, - { 96339, true }, - { 96354, true }, - { 96374, true }, - { 96394, true }, + { 96199, true }, + { 96214, true }, + { 96230, true }, + { 96245, true }, + { 96257, true }, + { 96276, false }, + { 96284, true }, + { 96298, true }, + { 96315, true }, + { 96329, true }, + { 96343, true }, + { 96355, true }, + { 96369, true }, + { 96382, true }, + { 96400, true }, { 96414, true }, - { 96435, false }, - { 96451, true }, - { 96469, true }, - { 96484, true }, - { 96500, true }, - { 96515, true }, - { 96527, true }, - { 96546, false }, - { 96554, true }, - { 96568, true }, - { 96585, true }, - { 96599, true }, - { 96613, true }, - { 96625, true }, - { 96639, true }, - { 96652, true }, - { 96670, true }, - { 96684, true }, - { 96700, true }, - { 96720, true }, - { 96751, true }, - { 96782, true }, + { 96430, true }, + { 96450, true }, + { 96481, true }, + { 96512, true }, + { 96534, true }, + { 96552, true }, + { 96566, true }, + { 96588, true }, + { 96603, true }, + { 96622, true }, + { 96632, true }, + { 96647, true }, + { 96662, true }, + { 96677, true }, + { 96694, true }, + { 96707, true }, + { 96722, true }, + { 96735, true }, + { 96748, true }, + { 96758, true }, + { 96781, true }, + { 96792, true }, { 96804, true }, - { 96822, true }, - { 96836, true }, - { 96858, true }, - { 96873, true }, - { 96892, true }, - { 96902, true }, - { 96917, true }, - { 96932, true }, - { 96947, true }, - { 96964, true }, - { 96977, true }, - { 96992, true }, - { 97005, true }, - { 97018, true }, - { 97028, true }, - { 97051, true }, - { 97062, true }, - { 97074, true }, - { 97085, true }, - { 97102, true }, - { 97119, true }, - { 97134, true }, + { 96815, true }, + { 96832, true }, + { 96849, true }, + { 96864, true }, + { 96871, true }, + { 96884, true }, + { 96897, true }, + { 96907, true }, + { 96924, true }, + { 96934, true }, + { 96944, true }, + { 96953, true }, + { 96963, true }, + { 96982, true }, + { 97000, true }, + { 97021, true }, + { 97041, true }, + { 97054, true }, + { 97071, true }, + { 97084, true }, + { 97106, true }, + { 97118, true }, + { 97128, true }, { 97141, true }, - { 97154, true }, - { 97167, true }, + { 97163, true }, { 97177, true }, - { 97194, true }, - { 97204, true }, - { 97214, true }, - { 97223, true }, - { 97233, true }, - { 97252, true }, - { 97270, true }, - { 97291, true }, - { 97311, true }, - { 97324, true }, - { 97341, true }, - { 97354, true }, - { 97376, true }, - { 97388, true }, - { 97398, true }, - { 97411, true }, - { 97433, true }, - { 97447, true }, - { 97469, true }, - { 97486, true }, - { 97494, true }, - { 97506, true }, - { 97519, true }, - { 97534, true }, - { 97553, true }, - { 97563, true }, + { 97199, true }, + { 97216, true }, + { 97224, true }, + { 97236, true }, + { 97249, true }, + { 97264, true }, + { 97283, true }, + { 97293, true }, + { 97304, true }, + { 97316, true }, + { 97337, true }, + { 97348, true }, + { 97357, true }, + { 97367, true }, + { 97387, true }, + { 97404, true }, + { 97423, true }, + { 97445, true }, + { 97457, true }, + { 97475, true }, + { 97488, true }, + { 97499, true }, + { 97514, true }, + { 97527, true }, + { 97550, true }, + { 97564, true }, { 97574, true }, - { 97586, true }, - { 97607, true }, - { 97618, true }, - { 97627, true }, - { 97637, true }, - { 97657, true }, - { 97674, true }, - { 97693, true }, - { 97715, true }, - { 97727, true }, - { 97745, true }, - { 97758, true }, - { 97769, true }, - { 97784, true }, - { 97797, true }, - { 97820, true }, - { 97834, true }, - { 97844, true }, - { 97858, true }, - { 97874, true }, - { 97889, true }, - { 97901, true }, - { 97911, true }, - { 97919, true }, + { 97588, true }, + { 97604, true }, + { 97619, true }, + { 97631, true }, + { 97641, true }, + { 97649, true }, + { 97665, true }, + { 97683, true }, + { 97697, true }, + { 97705, true }, + { 97713, true }, + { 97724, true }, + { 97738, true }, + { 97750, true }, + { 97762, true }, + { 97775, true }, + { 97785, true }, + { 97796, false }, + { 97812, true }, + { 97825, true }, + { 97840, true }, + { 97851, true }, + { 97867, true }, + { 97885, true }, + { 97902, true }, + { 97923, true }, { 97935, true }, - { 97953, true }, - { 97967, true }, + { 97944, true }, + { 97957, false }, { 97975, true }, - { 97983, true }, - { 97994, true }, - { 98008, true }, - { 98020, true }, - { 98032, true }, - { 98045, true }, - { 98055, true }, - { 98066, false }, + { 97986, true }, + { 97998, true }, + { 98008, false }, + { 98026, true }, + { 98044, true }, + { 98063, true }, { 98082, true }, - { 98095, true }, - { 98110, true }, - { 98121, true }, - { 98137, true }, - { 98155, true }, - { 98172, true }, - { 98193, true }, - { 98205, true }, - { 98214, true }, - { 98227, false }, - { 98245, true }, - { 98256, true }, - { 98268, true }, - { 98278, false }, - { 98296, true }, - { 98314, true }, - { 98333, true }, - { 98352, true }, - { 98383, true }, - { 98397, true }, - { 98417, false }, - { 98437, false }, - { 98449, true }, - { 98462, true }, - { 98481, true }, - { 98495, true }, - { 98507, true }, - { 98520, true }, - { 98535, true }, + { 98113, true }, + { 98127, true }, + { 98147, false }, + { 98167, false }, + { 98179, true }, + { 98192, true }, + { 98211, true }, + { 98225, true }, + { 98237, true }, + { 98250, true }, + { 98265, true }, + { 98275, true }, + { 98285, true }, + { 98295, true }, + { 98307, true }, + { 98322, true }, + { 98337, true }, + { 98346, true }, + { 98354, true }, + { 98367, true }, + { 98377, true }, + { 98387, true }, + { 98414, true }, + { 98422, true }, + { 98439, true }, + { 98451, true }, + { 98468, true }, + { 98489, true }, + { 98504, true }, + { 98518, true }, + { 98528, true }, + { 98536, true }, { 98545, true }, - { 98555, true }, - { 98565, true }, - { 98577, true }, - { 98592, true }, - { 98607, true }, - { 98616, true }, - { 98624, true }, - { 98637, true }, - { 98664, true }, - { 98672, true }, - { 98689, true }, - { 98701, true }, - { 98718, true }, - { 98739, true }, - { 98754, true }, - { 98768, true }, - { 98778, true }, - { 98786, true }, - { 98795, true }, - { 98804, true }, - { 98821, true }, - { 98833, true }, - { 98841, true }, - { 98859, true }, - { 98880, true }, - { 98899, true }, - { 98913, true }, - { 98925, true }, - { 98943, true }, - { 98955, true }, - { 98966, true }, - { 98973, true }, - { 98985, true }, - { 98994, true }, - { 99003, true }, - { 99019, true }, - { 99026, true }, - { 99034, true }, - { 99048, false }, - { 99059, true }, - { 99070, true }, - { 99085, true }, - { 99095, true }, - { 99108, true }, + { 98554, true }, + { 98571, true }, + { 98583, true }, + { 98591, true }, + { 98609, true }, + { 98630, true }, + { 98649, true }, + { 98663, true }, + { 98675, true }, + { 98693, true }, + { 98705, true }, + { 98716, true }, + { 98723, true }, + { 98735, true }, + { 98744, true }, + { 98753, true }, + { 98769, true }, + { 98776, true }, + { 98784, true }, + { 98798, false }, + { 98809, true }, + { 98820, true }, + { 98835, true }, + { 98845, true }, + { 98858, true }, + { 98870, true }, + { 98881, true }, + { 98891, false }, + { 98901, true }, + { 98915, true }, + { 98929, true }, + { 98949, true }, + { 98964, true }, + { 98975, true }, + { 98988, true }, + { 99000, true }, + { 99015, true }, + { 99028, true }, + { 99055, true }, + { 99069, true }, + { 99083, true }, + { 99100, true }, { 99120, true }, - { 99131, true }, - { 99141, false }, - { 99151, true }, - { 99165, true }, - { 99179, true }, - { 99199, true }, - { 99214, true }, + { 99135, true }, + { 99145, true }, + { 99158, true }, + { 99175, true }, + { 99188, true }, + { 99198, true }, { 99225, true }, - { 99238, true }, - { 99250, true }, - { 99265, true }, - { 99278, true }, - { 99305, true }, - { 99319, true }, - { 99333, true }, - { 99350, true }, + { 99235, true }, + { 99248, true }, + { 99257, true }, + { 99264, true }, + { 99280, true }, + { 99292, true }, + { 99303, true }, + { 99314, true }, + { 99328, true }, + { 99339, true }, + { 99349, true }, { 99370, true }, - { 99385, true }, - { 99395, true }, - { 99408, true }, - { 99425, true }, - { 99438, true }, - { 99448, true }, - { 99475, true }, - { 99485, true }, - { 99498, true }, - { 99507, true }, - { 99514, true }, - { 99530, true }, - { 99542, true }, - { 99553, true }, - { 99564, true }, - { 99578, true }, - { 99589, true }, - { 99599, true }, - { 99620, true }, - { 99630, true }, - { 99641, true }, - { 99661, true }, - { 99673, true }, - { 99696, true }, - { 99710, true }, - { 99729, true }, - { 99746, true }, - { 99754, true }, - { 99782, true }, - { 99793, true }, - { 99804, true }, - { 99822, true }, - { 99832, true }, - { 99841, true }, - { 99857, true }, - { 99873, true }, - { 99882, true }, + { 99380, true }, + { 99391, true }, + { 99411, true }, + { 99423, true }, + { 99446, true }, + { 99460, true }, + { 99479, true }, + { 99496, true }, + { 99504, true }, + { 99532, true }, + { 99543, true }, + { 99554, true }, + { 99572, true }, + { 99582, true }, + { 99591, true }, + { 99607, true }, + { 99623, true }, + { 99632, true }, + { 99650, true }, + { 99682, true }, + { 99701, true }, + { 99717, true }, + { 99737, true }, + { 99758, true }, + { 99775, true }, + { 99789, true }, + { 99809, true }, + { 99821, true }, + { 99835, true }, + { 99854, true }, + { 99872, true }, + { 99883, true }, + { 99891, true }, { 99900, true }, - { 99932, true }, + { 99912, true }, + { 99926, true }, + { 99938, true }, { 99951, true }, - { 99967, true }, - { 99987, true }, - { 100008, true }, - { 100025, true }, - { 100039, true }, - { 100059, true }, - { 100071, true }, - { 100092, true }, - { 100106, true }, + { 99962, true }, + { 99974, true }, + { 99984, true }, + { 100007, false }, + { 100022, true }, + { 100037, true }, + { 100056, true }, + { 100074, true }, + { 100088, true }, + { 100102, true }, + { 100112, true }, { 100125, true }, - { 100143, true }, - { 100154, true }, - { 100162, true }, - { 100171, true }, - { 100183, true }, - { 100197, true }, - { 100209, true }, - { 100222, true }, - { 100233, true }, - { 100245, true }, - { 100255, true }, - { 100278, false }, - { 100293, true }, - { 100308, true }, - { 100327, true }, - { 100345, true }, - { 100359, true }, - { 100373, true }, - { 100383, true }, - { 100396, true }, - { 100409, true }, - { 100424, true }, - { 100436, true }, - { 100450, true }, - { 100466, true }, - { 100481, true }, - { 100490, true }, - { 100506, true }, - { 100524, true }, - { 100535, true }, - { 100562, true }, - { 100577, true }, - { 100590, true }, - { 100606, true }, - { 100623, false }, - { 100640, true }, - { 100662, true }, - { 100684, true }, - { 100706, true }, - { 100720, true }, - { 100732, true }, - { 100746, true }, - { 100757, true }, - { 100772, true }, - { 100785, true }, - { 100794, true }, - { 100810, true }, - { 100827, true }, - { 100838, true }, - { 100852, true }, - { 100865, true }, - { 100879, true }, - { 100893, true }, - { 100905, true }, - { 100917, true }, - { 100930, true }, - { 100943, true }, - { 100953, true }, - { 100967, false }, - { 100979, true }, - { 100992, true }, - { 101014, true }, - { 101036, true }, - { 101047, false }, - { 101062, true }, - { 101073, false }, - { 101093, true }, - { 101113, true }, + { 100138, true }, + { 100153, true }, + { 100165, true }, + { 100179, true }, + { 100195, true }, + { 100210, true }, + { 100219, true }, + { 100235, true }, + { 100253, true }, + { 100264, true }, + { 100291, true }, + { 100306, true }, + { 100319, true }, + { 100335, true }, + { 100352, false }, + { 100369, true }, + { 100391, true }, + { 100413, true }, + { 100435, true }, + { 100449, true }, + { 100461, true }, + { 100475, true }, + { 100486, true }, + { 100501, true }, + { 100514, true }, + { 100523, true }, + { 100539, true }, + { 100556, true }, + { 100567, true }, + { 100581, true }, + { 100594, true }, + { 100608, true }, + { 100622, true }, + { 100634, true }, + { 100646, true }, + { 100659, true }, + { 100672, true }, + { 100682, true }, + { 100696, false }, + { 100708, true }, + { 100721, true }, + { 100743, true }, + { 100765, true }, + { 100776, false }, + { 100791, true }, + { 100802, false }, + { 100822, true }, + { 100842, true }, + { 100859, true }, + { 100878, true }, + { 100896, true }, + { 100915, true }, + { 100927, true }, + { 100948, true }, + { 100973, true }, + { 100985, true }, + { 101004, true }, + { 101019, true }, + { 101039, false }, + { 101047, true }, + { 101059, true }, + { 101077, true }, + { 101094, true }, + { 101106, true }, + { 101120, true }, { 101130, true }, - { 101149, true }, - { 101167, true }, - { 101186, true }, - { 101198, true }, + { 101143, true }, + { 101161, true }, + { 101168, true }, + { 101182, true }, + { 101189, true }, + { 101196, true }, + { 101208, true }, { 101219, true }, - { 101244, true }, - { 101256, true }, - { 101275, true }, - { 101290, true }, - { 101310, false }, - { 101318, true }, - { 101330, true }, - { 101348, true }, - { 101365, true }, - { 101377, true }, - { 101391, true }, - { 101401, true }, - { 101414, true }, - { 101432, true }, - { 101439, true }, - { 101453, true }, - { 101460, true }, - { 101467, true }, - { 101479, true }, - { 101490, true }, - { 101503, true }, - { 101517, true }, + { 101232, true }, + { 101246, true }, + { 101263, true }, + { 101277, true }, + { 101293, true }, + { 101304, true }, + { 101311, true }, + { 101324, true }, + { 101337, true }, + { 101346, true }, + { 101360, true }, + { 101374, true }, + { 101390, false }, + { 101405, true }, + { 101433, true }, + { 101448, true }, + { 101469, true }, + { 101483, true }, + { 101497, true }, + { 101518, true }, { 101534, true }, - { 101548, true }, - { 101564, true }, - { 101575, true }, + { 101549, true }, + { 101561, true }, + { 101571, true }, { 101582, true }, - { 101595, true }, - { 101608, true }, - { 101617, true }, - { 101631, true }, - { 101645, true }, - { 101661, false }, - { 101676, true }, - { 101704, true }, - { 101719, true }, - { 101740, true }, - { 101754, true }, - { 101768, true }, - { 101789, true }, - { 101805, true }, - { 101820, true }, - { 101832, true }, - { 101842, true }, - { 101853, true }, - { 101863, true }, - { 101876, true }, - { 101886, true }, - { 101899, true }, - { 101919, true }, - { 101938, true }, - { 101957, true }, - { 101977, true }, - { 101995, true }, - { 102006, true }, - { 102023, true }, - { 102035, true }, - { 102047, true }, - { 102072, true }, + { 101592, true }, + { 101605, true }, + { 101615, true }, + { 101628, true }, + { 101648, true }, + { 101667, true }, + { 101686, true }, + { 101706, true }, + { 101724, true }, + { 101735, true }, + { 101752, true }, + { 101764, true }, + { 101776, true }, + { 101801, true }, + { 101812, true }, + { 101827, true }, + { 101845, true }, + { 101857, true }, + { 101872, true }, + { 101898, true }, + { 101909, true }, + { 101920, true }, + { 101931, true }, + { 101943, true }, + { 101954, true }, + { 101964, true }, + { 101978, true }, + { 101991, true }, + { 102000, true }, + { 102009, true }, + { 102022, true }, + { 102029, false }, + { 102037, true }, + { 102045, true }, + { 102058, true }, + { 102069, true }, { 102083, true }, - { 102098, true }, - { 102116, true }, - { 102128, true }, - { 102143, true }, - { 102169, true }, - { 102180, true }, - { 102191, true }, - { 102202, true }, - { 102214, true }, - { 102225, true }, - { 102235, true }, - { 102249, true }, - { 102262, true }, - { 102271, true }, - { 102280, true }, - { 102293, true }, - { 102300, false }, - { 102308, true }, + { 102097, false }, + { 102109, true }, + { 102123, true }, + { 102147, true }, + { 102162, true }, + { 102175, true }, + { 102189, true }, + { 102207, true }, + { 102222, true }, + { 102230, true }, + { 102247, true }, + { 102272, true }, + { 102292, true }, { 102316, true }, - { 102329, true }, - { 102340, true }, - { 102354, true }, - { 102368, false }, - { 102380, true }, - { 102394, true }, - { 102418, true }, - { 102433, true }, - { 102446, true }, + { 102328, true }, + { 102339, true }, + { 102352, true }, + { 102368, true }, + { 102382, true }, + { 102391, true }, + { 102407, true }, + { 102425, true }, + { 102440, true }, { 102460, true }, - { 102478, true }, - { 102493, true }, - { 102501, true }, - { 102518, true }, - { 102543, true }, - { 102563, true }, - { 102587, true }, - { 102599, true }, - { 102610, true }, - { 102623, true }, - { 102639, true }, - { 102653, true }, - { 102662, true }, - { 102678, true }, + { 102473, true }, + { 102489, true }, + { 102503, true }, + { 102519, true }, + { 102539, true }, + { 102557, true }, + { 102576, true }, + { 102593, true }, + { 102604, true }, + { 102620, true }, + { 102630, true }, + { 102659, true }, + { 102679, true }, { 102696, true }, - { 102711, true }, - { 102731, true }, - { 102744, true }, - { 102760, true }, - { 102774, true }, - { 102790, true }, - { 102810, true }, - { 102828, true }, - { 102847, true }, + { 102713, true }, + { 102729, true }, + { 102738, true }, + { 102751, true }, + { 102763, false }, + { 102777, true }, + { 102794, true }, + { 102811, true }, + { 102844, true }, { 102864, true }, - { 102875, true }, - { 102891, true }, - { 102901, true }, - { 102930, true }, - { 102950, true }, - { 102967, true }, - { 102984, true }, - { 103000, true }, - { 103009, true }, - { 103022, true }, - { 103034, false }, - { 103048, true }, - { 103065, true }, + { 102876, true }, + { 102890, true }, + { 102903, true }, + { 102916, true }, + { 102931, true }, + { 102942, true }, + { 102959, true }, + { 102971, true }, + { 102983, true }, + { 102995, true }, + { 103004, true }, + { 103016, true }, + { 103033, true }, + { 103047, true }, + { 103068, true }, { 103082, true }, - { 103115, true }, - { 103135, true }, - { 103147, true }, - { 103161, true }, - { 103174, true }, - { 103187, true }, - { 103202, true }, - { 103213, true }, - { 103230, true }, - { 103242, true }, - { 103254, true }, - { 103266, true }, - { 103275, true }, - { 103287, true }, - { 103304, true }, + { 103098, true }, + { 103113, true }, + { 103127, true }, + { 103145, true }, + { 103166, true }, + { 103180, true }, + { 103194, true }, + { 103205, true }, + { 103216, true }, + { 103232, true }, + { 103244, true }, + { 103255, true }, + { 103264, true }, + { 103273, true }, + { 103288, true }, + { 103297, true }, + { 103310, true }, { 103318, true }, - { 103339, true }, - { 103353, true }, + { 103329, true }, + { 103340, true }, + { 103354, true }, { 103369, true }, - { 103384, true }, - { 103398, true }, - { 103416, true }, - { 103437, true }, - { 103451, true }, - { 103465, true }, - { 103476, true }, - { 103487, true }, - { 103503, true }, - { 103515, true }, - { 103526, true }, - { 103535, true }, - { 103544, true }, - { 103559, true }, - { 103568, true }, - { 103581, true }, - { 103589, true }, - { 103600, true }, - { 103611, true }, + { 103383, true }, + { 103393, true }, + { 103404, true }, + { 103414, true }, + { 103424, true }, + { 103432, true }, + { 103441, true }, + { 103453, true }, + { 103462, true }, + { 103485, true }, + { 103500, true }, + { 103516, true }, + { 103531, true }, + { 103539, true }, + { 103549, true }, + { 103561, true }, + { 103573, true }, + { 103588, true }, + { 103601, true }, { 103625, true }, - { 103640, true }, - { 103654, true }, - { 103664, true }, - { 103675, true }, - { 103685, true }, - { 103695, true }, - { 103703, true }, - { 103712, true }, - { 103724, true }, - { 103733, true }, - { 103756, true }, - { 103771, true }, - { 103787, true }, - { 103802, true }, - { 103810, true }, - { 103820, true }, - { 103832, true }, - { 103844, true }, - { 103859, true }, + { 103635, false }, + { 103644, false }, + { 103653, false }, + { 103662, true }, + { 103679, true }, + { 103694, true }, + { 103713, true }, + { 103736, true }, + { 103751, true }, + { 103770, true }, + { 103780, true }, + { 103795, true }, + { 103809, true }, + { 103824, true }, + { 103843, true }, + { 103856, true }, { 103872, true }, - { 103896, true }, - { 103906, false }, - { 103915, false }, - { 103924, false }, - { 103933, true }, - { 103950, true }, - { 103965, true }, - { 103984, true }, - { 104007, true }, - { 104022, true }, - { 104041, true }, - { 104051, true }, - { 104066, true }, - { 104080, true }, - { 104095, true }, - { 104114, true }, + { 103889, true }, + { 103905, true }, + { 103920, true }, + { 103930, true }, + { 103946, true }, + { 103964, true }, + { 103983, true }, + { 103998, true }, + { 104017, true }, + { 104028, true }, + { 104046, true }, + { 104060, true }, + { 104077, true }, + { 104085, true }, + { 104099, true }, + { 104113, true }, { 104127, true }, - { 104143, true }, - { 104160, true }, - { 104176, true }, - { 104191, true }, - { 104201, true }, - { 104217, true }, - { 104235, true }, - { 104254, true }, - { 104269, true }, + { 104144, false }, + { 104164, true }, + { 104177, true }, + { 104189, true }, + { 104204, true }, + { 104222, true }, + { 104233, true }, + { 104245, true }, + { 104255, true }, + { 104265, true }, + { 104279, true }, { 104288, true }, - { 104299, true }, + { 104301, true }, { 104317, true }, - { 104331, true }, - { 104348, true }, - { 104356, true }, - { 104370, true }, - { 104384, true }, + { 104332, true }, + { 104357, true }, + { 104383, true }, { 104398, true }, - { 104415, false }, + { 104410, true }, { 104435, true }, - { 104448, true }, - { 104460, true }, - { 104475, true }, - { 104493, true }, - { 104504, true }, - { 104516, true }, - { 104526, true }, - { 104536, true }, - { 104550, true }, - { 104559, true }, - { 104572, true }, - { 104588, true }, - { 104603, true }, - { 104628, true }, - { 104654, true }, - { 104666, true }, - { 104691, true }, - { 104698, true }, - { 104720, true }, - { 104735, true }, - { 104743, true }, - { 104751, true }, - { 104762, true }, - { 104778, true }, - { 104794, true }, - { 104811, true }, - { 104825, true }, - { 104839, true }, - { 104855, true }, - { 104882, true }, - { 104896, true }, - { 104905, true }, - { 104918, true }, - { 104930, true }, - { 104946, true }, - { 104969, true }, - { 104989, true }, - { 105008, true }, - { 105030, false }, - { 105041, true }, - { 105058, true }, - { 105072, true }, - { 105092, true }, - { 105117, true }, - { 105133, true }, - { 105145, true }, + { 104442, true }, + { 104464, true }, + { 104479, true }, + { 104487, true }, + { 104495, true }, + { 104506, true }, + { 104522, true }, + { 104538, true }, + { 104555, true }, + { 104569, true }, + { 104583, true }, + { 104599, true }, + { 104626, true }, + { 104640, true }, + { 104649, true }, + { 104662, true }, + { 104674, true }, + { 104690, true }, + { 104713, true }, + { 104733, true }, + { 104752, true }, + { 104774, false }, + { 104785, true }, + { 104802, true }, + { 104816, true }, + { 104836, true }, + { 104861, true }, + { 104877, true }, + { 104889, true }, + { 104901, true }, + { 104923, true }, + { 104938, true }, + { 104953, true }, + { 104970, true }, + { 104985, true }, + { 105002, true }, + { 105017, true }, + { 105032, true }, + { 105044, true }, + { 105059, true }, + { 105073, false }, + { 105083, true }, + { 105100, true }, + { 105111, false }, + { 105126, true }, + { 105143, true }, { 105157, true }, - { 105179, true }, - { 105194, true }, - { 105209, true }, - { 105226, true }, - { 105241, true }, - { 105258, true }, - { 105273, true }, - { 105288, true }, - { 105300, true }, - { 105315, true }, - { 105329, false }, - { 105339, true }, - { 105356, true }, - { 105367, false }, - { 105382, true }, - { 105399, true }, - { 105413, true }, - { 105426, true }, - { 105439, true }, - { 105451, true }, - { 105463, true }, + { 105170, true }, + { 105183, true }, + { 105195, true }, + { 105207, true }, + { 105217, true }, + { 105229, true }, + { 105244, true }, + { 105256, true }, + { 105267, true }, + { 105287, true }, + { 105299, true }, + { 105310, true }, + { 105325, true }, + { 105341, true }, + { 105352, true }, + { 105377, true }, + { 105386, true }, + { 105401, true }, + { 105409, true }, + { 105422, true }, + { 105445, true }, + { 105462, true }, { 105473, true }, - { 105485, true }, - { 105500, true }, - { 105512, true }, - { 105523, true }, - { 105543, true }, + { 105491, true }, + { 105509, true }, + { 105525, false }, + { 105537, true }, + { 105545, true }, { 105555, true }, - { 105566, true }, - { 105581, true }, - { 105597, true }, - { 105608, true }, - { 105633, true }, - { 105642, true }, - { 105657, true }, - { 105665, true }, - { 105678, true }, - { 105701, true }, - { 105718, true }, - { 105729, true }, - { 105747, true }, + { 105570, true }, + { 105584, true }, + { 105594, false }, + { 105612, true }, + { 105636, true }, + { 105651, true }, + { 105663, true }, + { 105691, true }, + { 105707, true }, + { 105721, true }, + { 105749, true }, { 105765, true }, - { 105781, false }, - { 105793, true }, - { 105801, true }, - { 105811, true }, - { 105826, true }, - { 105840, true }, - { 105850, false }, - { 105868, true }, - { 105892, true }, - { 105907, true }, - { 105919, true }, - { 105947, true }, - { 105963, true }, + { 105782, true }, + { 105796, true }, + { 105813, true }, + { 105835, true }, + { 105845, true }, + { 105855, true }, + { 105873, true }, + { 105882, true }, + { 105896, true }, + { 105915, true }, + { 105933, true }, + { 105952, true }, { 105977, true }, - { 106005, true }, - { 106021, true }, - { 106038, true }, - { 106052, true }, - { 106069, true }, - { 106091, true }, - { 106101, true }, - { 106111, true }, - { 106129, true }, - { 106138, true }, - { 106152, true }, - { 106171, true }, - { 106189, true }, - { 106208, true }, - { 106233, true }, - { 106249, true }, - { 106268, true }, - { 106289, true }, - { 106306, true }, - { 106320, true }, - { 106333, true }, - { 106362, true }, - { 106392, true }, - { 106404, true }, - { 106413, true }, - { 106426, true }, - { 106437, true }, - { 106459, true }, - { 106470, true }, + { 105993, true }, + { 106012, true }, + { 106033, true }, + { 106050, true }, + { 106064, true }, + { 106077, true }, + { 106106, true }, + { 106136, true }, + { 106148, true }, + { 106157, true }, + { 106170, true }, + { 106181, true }, + { 106203, true }, + { 106214, true }, + { 106232, true }, + { 106242, true }, + { 106271, true }, + { 106284, true }, + { 106300, true }, + { 106317, true }, + { 106340, true }, + { 106356, true }, + { 106379, true }, + { 106405, true }, + { 106419, true }, + { 106433, true }, + { 106452, true }, + { 106466, false }, + { 106476, true }, { 106488, true }, - { 106498, true }, - { 106527, true }, - { 106540, true }, - { 106556, true }, - { 106573, true }, - { 106596, true }, - { 106612, true }, - { 106635, true }, - { 106649, true }, - { 106663, true }, - { 106682, true }, - { 106696, false }, - { 106706, true }, - { 106718, true }, - { 106734, true }, - { 106742, true }, - { 106761, true }, - { 106773, false }, - { 106784, true }, - { 106792, true }, - { 106808, true }, + { 106504, true }, + { 106512, true }, + { 106531, true }, + { 106543, false }, + { 106554, true }, + { 106562, true }, + { 106578, true }, + { 106592, true }, + { 106604, true }, + { 106617, true }, + { 106626, true }, + { 106640, true }, + { 106659, true }, + { 106668, true }, + { 106679, true }, + { 106691, true }, + { 106704, true }, + { 106714, true }, + { 106727, true }, + { 106739, true }, + { 106755, true }, + { 106763, false }, + { 106771, true }, + { 106793, true }, + { 106801, true }, { 106822, true }, - { 106834, true }, - { 106847, true }, - { 106856, true }, - { 106870, true }, - { 106889, true }, - { 106898, true }, - { 106909, true }, - { 106921, true }, - { 106934, true }, - { 106944, true }, - { 106957, true }, - { 106969, true }, - { 106985, true }, - { 106993, false }, - { 107001, true }, - { 107023, true }, - { 107031, true }, - { 107052, true }, - { 107076, true }, - { 107092, true }, - { 107108, true }, - { 107118, true }, - { 107132, true }, - { 107149, true }, - { 107159, true }, - { 107171, true }, - { 107181, true }, - { 107196, true }, - { 107208, true }, - { 107218, true }, - { 107228, true }, - { 107237, true }, + { 106846, true }, + { 106862, true }, + { 106878, true }, + { 106888, true }, + { 106902, true }, + { 106919, true }, + { 106929, true }, + { 106941, true }, + { 106951, true }, + { 106966, true }, + { 106978, true }, + { 106988, true }, + { 106998, true }, + { 107007, true }, + { 107017, true }, + { 107032, true }, + { 107044, true }, + { 107067, true }, + { 107080, true }, + { 107093, true }, + { 107107, true }, + { 107122, true }, + { 107135, true }, + { 107147, true }, + { 107156, true }, + { 107174, true }, + { 107187, true }, + { 107202, true }, + { 107217, true }, + { 107227, true }, { 107247, true }, - { 107262, true }, - { 107274, true }, - { 107297, true }, - { 107310, true }, - { 107323, true }, - { 107337, true }, + { 107261, true }, + { 107284, true }, + { 107296, true }, + { 107311, true }, + { 107319, true }, + { 107330, true }, { 107352, true }, - { 107365, true }, - { 107377, true }, + { 107363, true }, + { 107376, true }, { 107386, true }, - { 107404, true }, - { 107417, true }, - { 107432, true }, - { 107447, true }, - { 107457, true }, - { 107477, true }, - { 107491, true }, - { 107514, true }, - { 107526, true }, - { 107541, true }, - { 107549, true }, - { 107560, true }, - { 107582, true }, - { 107593, true }, - { 107606, true }, - { 107616, true }, - { 107630, true }, - { 107638, true }, - { 107646, true }, - { 107661, true }, - { 107671, true }, + { 107400, true }, + { 107408, true }, + { 107416, true }, + { 107431, true }, + { 107441, true }, + { 107451, true }, + { 107466, true }, + { 107474, true }, + { 107483, true }, + { 107494, true }, + { 107506, true }, + { 107518, true }, + { 107528, true }, + { 107538, true }, + { 107550, true }, + { 107564, true }, + { 107579, true }, + { 107596, true }, + { 107608, true }, + { 107619, true }, + { 107626, true }, + { 107640, true }, + { 107651, true }, + { 107662, true }, + { 107673, true }, { 107681, true }, { 107696, true }, - { 107704, true }, - { 107712, true }, - { 107721, true }, - { 107732, true }, - { 107744, true }, - { 107756, true }, - { 107766, true }, - { 107776, true }, - { 107788, true }, - { 107802, true }, - { 107817, true }, - { 107834, true }, - { 107846, true }, - { 107857, true }, - { 107864, true }, - { 107878, true }, - { 107889, true }, - { 107900, true }, + { 107710, true }, + { 107724, true }, + { 107739, true }, + { 107754, true }, + { 107767, true }, + { 107778, true }, + { 107793, true }, + { 107806, true }, + { 107813, true }, + { 107833, true }, + { 107842, true }, + { 107854, true }, + { 107867, true }, + { 107884, true }, + { 107899, true }, { 107911, true }, - { 107919, true }, - { 107934, true }, - { 107948, true }, - { 107962, true }, - { 107977, true }, - { 107992, true }, - { 108005, true }, - { 108016, true }, - { 108031, true }, - { 108044, true }, - { 108051, true }, - { 108071, true }, - { 108080, true }, - { 108092, true }, - { 108105, true }, - { 108122, true }, - { 108137, true }, - { 108149, true }, + { 107926, true }, + { 107939, true }, + { 107955, true }, + { 107975, true }, + { 107995, true }, + { 108018, true }, + { 108027, true }, + { 108043, true }, + { 108055, true }, + { 108064, true }, + { 108074, true }, + { 108083, true }, + { 108091, true }, + { 108101, false }, + { 108108, true }, + { 108119, true }, + { 108132, true }, + { 108147, true }, { 108164, true }, - { 108177, true }, - { 108193, true }, - { 108213, true }, - { 108233, true }, - { 108256, true }, - { 108265, true }, - { 108281, true }, - { 108293, true }, - { 108302, true }, - { 108312, true }, - { 108321, true }, - { 108329, true }, - { 108339, false }, - { 108346, true }, - { 108357, true }, - { 108370, true }, - { 108385, true }, + { 108176, true }, + { 108197, true }, + { 108204, true }, + { 108224, true }, + { 108234, true }, + { 108245, false }, + { 108258, true }, + { 108272, true }, + { 108287, true }, + { 108297, true }, + { 108309, true }, + { 108329, false }, + { 108345, true }, + { 108354, false }, + { 108363, true }, + { 108382, true }, + { 108390, true }, { 108402, true }, - { 108414, true }, - { 108435, true }, - { 108442, true }, - { 108462, true }, - { 108472, true }, - { 108483, false }, - { 108496, true }, - { 108510, true }, - { 108525, true }, - { 108535, true }, - { 108547, true }, - { 108567, false }, - { 108583, true }, - { 108592, false }, - { 108601, true }, - { 108620, true }, - { 108628, true }, - { 108640, true }, - { 108647, true }, - { 108665, true }, - { 108681, true }, - { 108700, true }, - { 108713, true }, - { 108730, true }, - { 108749, true }, - { 108762, false }, - { 108771, true }, - { 108784, true }, - { 108804, true }, - { 108821, true }, - { 108836, true }, - { 108852, false }, - { 108867, true }, - { 108881, true }, + { 108409, true }, + { 108425, true }, + { 108444, true }, + { 108457, true }, + { 108474, true }, + { 108493, true }, + { 108506, false }, + { 108515, true }, + { 108528, true }, + { 108548, true }, + { 108565, true }, + { 108580, true }, + { 108596, false }, + { 108611, true }, + { 108625, true }, + { 108638, true }, + { 108657, true }, + { 108674, true }, + { 108685, true }, + { 108696, true }, + { 108713, false }, + { 108734, false }, + { 108750, false }, + { 108770, true }, + { 108782, true }, + { 108805, true }, + { 108817, true }, + { 108830, true }, + { 108842, true }, + { 108859, true }, + { 108874, false }, + { 108885, true }, { 108894, true }, - { 108913, true }, - { 108930, true }, + { 108905, true }, + { 108920, true }, { 108941, true }, - { 108952, true }, - { 108969, false }, - { 108990, false }, - { 109006, false }, - { 109026, true }, - { 109038, true }, - { 109061, true }, - { 109073, true }, - { 109086, true }, - { 109098, true }, - { 109115, true }, - { 109130, false }, + { 108959, true }, + { 108986, true }, + { 108996, true }, + { 109004, true }, + { 109014, true }, + { 109028, true }, + { 109040, true }, + { 109055, true }, + { 109065, true }, + { 109076, true }, + { 109090, true }, + { 109099, true }, + { 109118, true }, + { 109131, true }, { 109141, true }, - { 109150, true }, - { 109161, true }, - { 109176, true }, - { 109197, true }, - { 109215, true }, - { 109242, true }, - { 109252, true }, - { 109260, true }, - { 109270, true }, - { 109284, true }, + { 109149, true }, + { 109156, true }, + { 109169, true }, + { 109179, true }, + { 109188, true }, + { 109200, false }, + { 109210, true }, + { 109230, true }, + { 109239, true }, + { 109251, true }, + { 109262, true }, + { 109273, true }, { 109296, true }, - { 109311, true }, - { 109321, true }, - { 109332, true }, - { 109346, true }, - { 109355, true }, - { 109374, true }, - { 109387, true }, - { 109397, true }, - { 109405, true }, - { 109412, true }, - { 109425, true }, - { 109435, true }, - { 109444, true }, - { 109456, false }, - { 109466, true }, - { 109486, true }, - { 109495, true }, - { 109507, true }, - { 109518, true }, - { 109529, true }, - { 109552, true }, - { 109575, true }, - { 109598, true }, - { 109608, false }, - { 109625, true }, - { 109634, true }, - { 109644, true }, - { 109657, true }, - { 109665, true }, - { 109675, true }, + { 109319, true }, + { 109342, true }, + { 109352, false }, + { 109369, true }, + { 109378, true }, + { 109388, true }, + { 109401, true }, + { 109409, true }, + { 109419, true }, + { 109430, true }, + { 109440, true }, + { 109453, true }, + { 109465, true }, + { 109480, true }, + { 109492, true }, + { 109508, true }, + { 109522, true }, + { 109536, true }, + { 109543, true }, + { 109553, true }, + { 109565, true }, + { 109574, true }, + { 109590, false }, + { 109604, true }, + { 109615, true }, + { 109627, true }, + { 109639, true }, + { 109648, true }, + { 109662, true }, + { 109674, true }, { 109686, true }, { 109696, true }, - { 109709, true }, - { 109721, true }, - { 109736, true }, - { 109748, true }, - { 109764, true }, - { 109778, true }, - { 109792, true }, - { 109799, true }, - { 109809, true }, - { 109821, true }, - { 109830, true }, - { 109846, true }, + { 109706, true }, + { 109716, true }, + { 109726, true }, + { 109744, true }, + { 109759, true }, + { 109770, true }, + { 109783, true }, + { 109794, true }, + { 109801, true }, + { 109818, false }, + { 109829, true }, + { 109839, true }, + { 109849, true }, { 109860, true }, - { 109871, true }, - { 109883, true }, - { 109895, true }, - { 109904, true }, + { 109869, true }, + { 109891, true }, { 109916, true }, - { 109928, true }, - { 109938, true }, - { 109948, true }, - { 109958, true }, - { 109968, true }, - { 109986, true }, - { 110001, true }, - { 110012, true }, - { 110025, true }, - { 110036, true }, - { 110043, true }, - { 110060, false }, - { 110071, true }, - { 110081, true }, - { 110091, true }, - { 110102, true }, - { 110111, true }, - { 110133, true }, - { 110158, true }, - { 110177, true }, - { 110184, true }, - { 110198, true }, - { 110207, true }, - { 110222, true }, - { 110232, true }, - { 110256, true }, - { 110272, true }, - { 110294, true }, - { 110304, true }, - { 110318, true }, - { 110331, true }, - { 110345, true }, - { 110368, true }, - { 110379, true }, - { 110388, true }, - { 110399, true }, - { 110413, true }, - { 110422, true }, - { 110433, true }, - { 110447, true }, - { 110458, true }, - { 110468, true }, - { 110480, true }, - { 110499, true }, - { 110512, true }, + { 109935, true }, + { 109942, true }, + { 109956, true }, + { 109965, true }, + { 109980, true }, + { 109990, true }, + { 110014, true }, + { 110030, true }, + { 110052, true }, + { 110062, true }, + { 110076, true }, + { 110089, true }, + { 110103, true }, + { 110126, true }, + { 110137, true }, + { 110146, true }, + { 110157, true }, + { 110171, true }, + { 110180, true }, + { 110191, true }, + { 110205, true }, + { 110216, true }, + { 110226, true }, + { 110238, true }, + { 110257, true }, + { 110270, true }, + { 110290, true }, + { 110314, true }, + { 110323, true }, + { 110336, true }, + { 110348, true }, + { 110361, true }, + { 110373, true }, + { 110381, true }, + { 110393, true }, + { 110402, true }, + { 110417, true }, + { 110426, true }, + { 110448, true }, + { 110460, true }, + { 110470, true }, + { 110485, true }, + { 110493, true }, + { 110506, true }, + { 110521, true }, { 110532, true }, - { 110556, true }, - { 110565, true }, - { 110578, true }, - { 110590, true }, - { 110603, true }, + { 110543, true }, + { 110552, true }, + { 110567, true }, + { 110581, true }, + { 110595, true }, { 110615, true }, - { 110623, true }, - { 110635, true }, - { 110644, true }, - { 110659, true }, - { 110668, true }, - { 110690, true }, - { 110702, true }, - { 110712, true }, - { 110727, true }, + { 110638, true }, + { 110663, true }, + { 110682, true }, + { 110699, true }, + { 110719, true }, { 110735, true }, - { 110748, true }, - { 110763, true }, - { 110774, true }, - { 110785, true }, - { 110794, true }, - { 110809, true }, - { 110823, true }, - { 110837, true }, - { 110857, true }, + { 110749, true }, + { 110765, true }, + { 110781, true }, + { 110799, true }, + { 110816, true }, + { 110831, true }, + { 110846, true }, + { 110856, true }, + { 110871, true }, { 110880, true }, - { 110905, true }, - { 110924, true }, - { 110941, true }, - { 110961, true }, - { 110977, true }, - { 110991, true }, - { 111007, true }, - { 111023, true }, - { 111041, true }, - { 111058, true }, - { 111073, true }, - { 111088, true }, - { 111098, true }, - { 111113, true }, - { 111122, true }, - { 111135, true }, - { 111152, true }, - { 111165, true }, - { 111180, true }, - { 111190, true }, - { 111201, true }, - { 111212, true }, - { 111222, true }, - { 111234, true }, - { 111247, true }, - { 111259, true }, - { 111280, true }, - { 111294, false }, - { 111314, false }, - { 111326, true }, - { 111339, true }, - { 111349, true }, - { 111362, true }, - { 111375, true }, - { 111391, true }, - { 111408, true }, - { 111420, true }, - { 111434, true }, - { 111446, true }, - { 111460, true }, - { 111480, true }, - { 111496, true }, - { 111508, true }, - { 111534, true }, - { 111555, true }, - { 111569, true }, - { 111587, false }, - { 111601, true }, - { 111619, true }, - { 111636, true }, - { 111648, true }, - { 111661, true }, - { 111681, true }, - { 111697, true }, - { 111709, true }, - { 111731, true }, - { 111753, true }, - { 111772, false }, - { 111782, true }, - { 111799, true }, - { 111821, true }, - { 111833, true }, - { 111844, true }, - { 111857, true }, - { 111877, true }, - { 111887, true }, - { 111895, true }, - { 111906, true }, - { 111931, true }, - { 111946, true }, - { 111963, true }, - { 111984, true }, - { 112004, true }, - { 112026, true }, - { 112045, true }, - { 112056, false }, - { 112069, true }, - { 112080, true }, - { 112096, true }, - { 112111, true }, - { 112126, true }, - { 112138, true }, - { 112158, true }, - { 112169, true }, - { 112181, true }, - { 112199, true }, + { 110893, true }, + { 110910, true }, + { 110923, true }, + { 110938, true }, + { 110948, true }, + { 110959, true }, + { 110970, true }, + { 110980, true }, + { 110992, true }, + { 111005, true }, + { 111017, true }, + { 111038, true }, + { 111052, false }, + { 111072, false }, + { 111084, true }, + { 111097, true }, + { 111107, true }, + { 111120, true }, + { 111133, true }, + { 111149, true }, + { 111166, true }, + { 111178, true }, + { 111192, true }, + { 111204, true }, + { 111218, true }, + { 111238, true }, + { 111254, true }, + { 111266, true }, + { 111292, true }, + { 111313, true }, + { 111327, true }, + { 111345, false }, + { 111359, true }, + { 111377, true }, + { 111394, true }, + { 111406, true }, + { 111419, true }, + { 111439, true }, + { 111455, true }, + { 111467, true }, + { 111489, true }, + { 111511, true }, + { 111530, false }, + { 111540, true }, + { 111557, true }, + { 111579, true }, + { 111591, true }, + { 111602, true }, + { 111615, true }, + { 111635, true }, + { 111645, true }, + { 111653, true }, + { 111664, true }, + { 111689, true }, + { 111704, true }, + { 111721, true }, + { 111742, true }, + { 111762, true }, + { 111784, true }, + { 111803, true }, + { 111814, false }, + { 111827, true }, + { 111838, true }, + { 111854, true }, + { 111869, true }, + { 111884, true }, + { 111896, true }, + { 111916, true }, + { 111927, true }, + { 111939, true }, + { 111957, true }, + { 111982, true }, + { 112005, true }, + { 112021, true }, + { 112038, true }, + { 112049, true }, + { 112063, true }, + { 112075, true }, + { 112091, false }, + { 112104, true }, + { 112117, true }, + { 112129, true }, + { 112140, true }, + { 112157, true }, + { 112170, true }, + { 112182, true }, + { 112192, false }, + { 112201, true }, + { 112211, true }, { 112224, true }, - { 112247, true }, - { 112263, true }, - { 112280, true }, - { 112291, true }, - { 112305, true }, - { 112317, true }, - { 112333, false }, - { 112346, true }, - { 112359, true }, - { 112371, true }, - { 112382, true }, - { 112399, true }, - { 112412, true }, - { 112424, true }, - { 112434, false }, - { 112443, true }, - { 112453, true }, - { 112466, true }, - { 112477, true }, - { 112500, true }, - { 112513, true }, - { 112531, true }, - { 112542, true }, - { 112556, true }, - { 112572, true }, - { 112580, true }, - { 112599, true }, - { 112612, true }, - { 112635, true }, - { 112649, true }, - { 112664, true }, - { 112674, true }, - { 112687, true }, - { 112700, true }, - { 112715, true }, - { 112738, true }, - { 112754, true }, + { 112235, true }, + { 112258, true }, + { 112271, true }, + { 112289, true }, + { 112300, true }, + { 112314, true }, + { 112330, true }, + { 112338, true }, + { 112357, true }, + { 112370, true }, + { 112393, true }, + { 112407, true }, + { 112422, true }, + { 112432, true }, + { 112445, true }, + { 112458, true }, + { 112473, true }, + { 112496, true }, + { 112512, true }, + { 112528, true }, + { 112545, true }, + { 112558, true }, + { 112570, true }, + { 112583, true }, + { 112595, true }, + { 112610, true }, + { 112622, true }, + { 112650, true }, + { 112667, true }, + { 112676, true }, + { 112703, true }, + { 112724, true }, + { 112742, true }, + { 112759, true }, { 112770, true }, - { 112787, true }, - { 112800, true }, - { 112812, true }, - { 112825, true }, - { 112837, true }, - { 112852, true }, - { 112864, true }, - { 112892, true }, - { 112909, true }, - { 112918, true }, - { 112945, true }, - { 112966, true }, - { 112984, true }, - { 113001, true }, - { 113012, true }, + { 112788, true }, + { 112803, true }, + { 112815, true }, + { 112827, true }, + { 112839, true }, + { 112858, true }, + { 112893, true }, + { 112916, true }, + { 112938, true }, + { 112952, true }, + { 112969, true }, + { 112982, true }, + { 112994, true }, + { 113011, false }, { 113030, true }, - { 113045, true }, - { 113057, true }, - { 113069, true }, - { 113081, true }, - { 113100, true }, - { 113135, true }, - { 113158, true }, - { 113180, true }, - { 113194, true }, - { 113211, true }, - { 113224, true }, - { 113236, true }, - { 113253, false }, - { 113272, true }, + { 113048, true }, + { 113062, true }, + { 113093, true }, + { 113110, true }, + { 113125, true }, + { 113137, true }, + { 113149, true }, + { 113162, true }, + { 113181, true }, + { 113203, true }, + { 113215, true }, + { 113232, true }, + { 113249, true }, + { 113265, true }, + { 113278, true }, { 113290, true }, - { 113304, true }, - { 113335, true }, - { 113352, true }, - { 113367, true }, - { 113379, true }, + { 113311, true }, + { 113330, true }, + { 113342, true }, + { 113359, true }, + { 113374, true }, { 113391, true }, - { 113404, true }, - { 113423, true }, - { 113445, true }, - { 113457, true }, - { 113474, true }, - { 113491, true }, - { 113513, true }, - { 113529, true }, - { 113542, true }, - { 113554, true }, - { 113575, true }, - { 113594, true }, - { 113606, true }, - { 113623, true }, - { 113638, true }, - { 113655, true }, - { 113672, true }, - { 113688, true }, - { 113703, true }, - { 113719, true }, - { 113743, true }, - { 113768, true }, - { 113790, true }, - { 113805, true }, - { 113832, true }, - { 113850, true }, - { 113867, true }, - { 113890, true }, - { 113916, true }, - { 113931, true }, - { 113949, true }, - { 113970, true }, - { 113998, true }, - { 114017, true }, - { 114041, true }, - { 114065, true }, - { 114078, true }, - { 114091, true }, - { 114108, true }, - { 114123, true }, - { 114148, false }, - { 114162, true }, - { 114172, true }, - { 114188, true }, - { 114207, true }, - { 114223, true }, - { 114247, true }, - { 114264, false }, - { 114273, true }, - { 114288, true }, - { 114298, true }, - { 114310, true }, - { 114331, true }, - { 114344, true }, - { 114361, true }, - { 114374, true }, - { 114392, true }, - { 114405, true }, - { 114424, true }, - { 114434, true }, + { 113408, true }, + { 113424, true }, + { 113439, true }, + { 113455, true }, + { 113479, true }, + { 113504, true }, + { 113526, true }, + { 113541, true }, + { 113568, true }, + { 113586, true }, + { 113603, true }, + { 113626, true }, + { 113652, true }, + { 113667, true }, + { 113685, true }, + { 113706, true }, + { 113734, true }, + { 113753, true }, + { 113777, true }, + { 113801, true }, + { 113814, true }, + { 113827, true }, + { 113844, true }, + { 113859, true }, + { 113884, false }, + { 113898, true }, + { 113908, true }, + { 113924, true }, + { 113943, true }, + { 113959, true }, + { 113983, true }, + { 114000, false }, + { 114009, true }, + { 114024, true }, + { 114034, true }, + { 114046, true }, + { 114067, true }, + { 114080, true }, + { 114097, true }, + { 114110, true }, + { 114128, true }, + { 114141, true }, + { 114160, true }, + { 114170, true }, + { 114186, true }, + { 114202, true }, + { 114218, true }, + { 114231, true }, + { 114250, true }, + { 114268, true }, + { 114282, true }, + { 114292, false }, + { 114304, true }, + { 114315, true }, + { 114323, true }, + { 114333, true }, + { 114343, true }, + { 114355, true }, + { 114369, false }, + { 114382, true }, + { 114390, true }, + { 114401, true }, + { 114412, true }, + { 114428, true }, + { 114438, true }, { 114450, true }, - { 114466, true }, + { 114459, true }, + { 114475, false }, { 114482, true }, - { 114495, true }, - { 114514, true }, - { 114532, true }, - { 114546, true }, - { 114556, false }, + { 114490, true }, + { 114500, true }, + { 114512, true }, + { 114526, true }, + { 114535, true }, + { 114551, true }, + { 114559, true }, { 114568, true }, - { 114579, true }, - { 114587, true }, - { 114597, true }, - { 114607, true }, - { 114619, true }, - { 114633, false }, - { 114646, true }, - { 114654, true }, - { 114665, true }, - { 114676, true }, + { 114584, true }, + { 114595, true }, + { 114605, false }, + { 114623, true }, + { 114633, true }, + { 114644, true }, + { 114656, true }, + { 114668, false }, + { 114679, true }, { 114692, true }, { 114702, true }, - { 114714, true }, - { 114723, true }, - { 114739, false }, - { 114746, true }, - { 114754, true }, - { 114764, true }, - { 114776, true }, + { 114712, true }, + { 114722, true }, + { 114732, true }, + { 114742, true }, + { 114761, true }, + { 114770, true }, { 114790, true }, - { 114799, true }, - { 114815, true }, + { 114806, true }, + { 114814, true }, { 114823, true }, - { 114832, true }, - { 114848, true }, - { 114859, true }, - { 114869, false }, - { 114887, true }, - { 114897, true }, - { 114908, true }, - { 114920, true }, - { 114932, false }, - { 114943, true }, - { 114956, true }, - { 114966, true }, - { 114976, true }, - { 114986, true }, - { 114996, true }, - { 115006, true }, + { 114844, true }, + { 114852, true }, + { 114868, true }, + { 114885, true }, + { 114893, true }, + { 114904, true }, + { 114916, true }, + { 114927, true }, + { 114937, true }, + { 114952, true }, + { 114963, true }, + { 114973, true }, + { 114982, true }, + { 114991, true }, + { 115009, true }, { 115025, true }, - { 115034, true }, - { 115043, true }, - { 115063, true }, - { 115079, true }, - { 115087, true }, - { 115096, true }, - { 115117, true }, - { 115125, true }, - { 115141, true }, - { 115158, true }, - { 115166, true }, - { 115177, true }, - { 115189, true }, - { 115200, true }, - { 115210, true }, - { 115225, true }, - { 115236, true }, + { 115038, true }, + { 115052, true }, + { 115080, true }, + { 115093, true }, + { 115102, true }, + { 115121, true }, + { 115131, true }, + { 115146, true }, + { 115163, true }, + { 115186, true }, + { 115205, true }, + { 115214, true }, + { 115232, true }, { 115246, true }, - { 115255, true }, - { 115264, true }, - { 115282, true }, - { 115298, true }, - { 115311, true }, - { 115325, true }, - { 115353, true }, + { 115269, true }, + { 115291, true }, + { 115301, true }, + { 115317, true }, + { 115333, true }, + { 115344, true }, + { 115354, true }, { 115366, true }, - { 115375, true }, - { 115394, true }, - { 115404, true }, - { 115419, true }, + { 115379, true }, + { 115391, true }, + { 115408, true }, + { 115425, true }, { 115436, true }, - { 115459, true }, - { 115478, true }, - { 115487, true }, - { 115505, true }, + { 115454, true }, + { 115468, true }, + { 115482, true }, + { 115500, true }, { 115519, true }, - { 115542, true }, - { 115564, true }, - { 115574, true }, - { 115590, true }, - { 115606, true }, - { 115617, true }, - { 115627, true }, - { 115639, true }, - { 115652, true }, - { 115664, true }, - { 115681, true }, - { 115698, true }, - { 115709, true }, - { 115727, true }, - { 115741, true }, - { 115755, true }, + { 115535, true }, + { 115546, true }, + { 115557, true }, + { 115575, true }, + { 115594, true }, + { 115607, true }, + { 115618, true }, + { 115628, true }, + { 115641, true }, + { 115653, true }, + { 115669, true }, + { 115680, true }, + { 115690, true }, + { 115700, true }, + { 115710, true }, + { 115720, true }, + { 115731, true }, + { 115742, true }, + { 115754, true }, + { 115764, true }, { 115773, true }, - { 115792, true }, - { 115808, true }, - { 115819, true }, - { 115830, true }, - { 115848, true }, - { 115867, true }, - { 115880, true }, - { 115891, true }, - { 115901, true }, - { 115914, true }, - { 115926, true }, - { 115942, true }, + { 115790, true }, + { 115809, true }, + { 115822, true }, + { 115841, true }, + { 115854, true }, + { 115871, true }, + { 115903, true }, + { 115917, true }, + { 115929, true }, { 115953, true }, - { 115963, true }, - { 115973, true }, - { 115983, true }, - { 115993, true }, - { 116004, true }, - { 116015, true }, - { 116027, true }, - { 116037, true }, + { 115976, true }, + { 116008, true }, + { 116033, true }, { 116046, true }, - { 116063, true }, - { 116082, true }, - { 116095, true }, - { 116114, true }, - { 116127, true }, - { 116144, true }, + { 116072, true }, + { 116091, true }, + { 116105, true }, + { 116119, true }, + { 116132, true }, + { 116147, true }, + { 116162, true }, { 116176, true }, - { 116190, true }, - { 116202, true }, - { 116226, true }, - { 116249, true }, - { 116281, true }, - { 116306, true }, + { 116190, false }, + { 116210, true }, + { 116223, true }, + { 116240, true }, + { 116255, true }, + { 116272, true }, + { 116286, true }, + { 116301, true }, + { 116310, true }, { 116319, true }, - { 116345, true }, - { 116364, true }, - { 116378, true }, + { 116335, true }, + { 116355, true }, + { 116374, true }, + { 116383, true }, { 116392, true }, - { 116405, true }, - { 116420, true }, - { 116435, true }, - { 116449, true }, - { 116463, false }, + { 116401, true }, + { 116410, true }, + { 116422, true }, + { 116433, true }, + { 116442, true }, + { 116450, true }, + { 116459, true }, + { 116470, true }, { 116483, true }, - { 116496, true }, - { 116513, true }, + { 116492, true }, + { 116505, true }, + { 116515, true }, { 116528, true }, - { 116545, true }, - { 116559, true }, + { 116541, true }, + { 116552, true }, + { 116563, true }, { 116574, true }, { 116583, true }, { 116592, true }, - { 116608, true }, - { 116628, true }, - { 116647, true }, - { 116656, true }, - { 116665, true }, - { 116674, true }, - { 116683, true }, - { 116695, true }, - { 116706, true }, - { 116715, true }, - { 116723, true }, - { 116732, true }, + { 116602, true }, + { 116619, true }, + { 116636, true }, + { 116645, true }, + { 116660, true }, + { 116679, false }, + { 116691, true }, + { 116704, true }, + { 116721, false }, + { 116734, true }, { 116743, true }, - { 116756, true }, - { 116765, true }, + { 116766, false }, { 116778, true }, - { 116788, true }, - { 116801, true }, - { 116814, true }, - { 116825, true }, - { 116836, true }, + { 116791, true }, + { 116802, true }, + { 116819, true }, + { 116830, true }, { 116847, true }, - { 116856, true }, - { 116865, true }, - { 116875, true }, - { 116892, true }, - { 116909, true }, - { 116918, true }, - { 116933, true }, - { 116952, true }, - { 116965, true }, - { 116982, false }, - { 116995, true }, - { 117004, true }, - { 117018, true }, - { 117041, false }, - { 117053, true }, - { 117066, true }, - { 117077, true }, - { 117094, true }, - { 117105, true }, - { 117122, true }, - { 117143, true }, - { 117154, true }, - { 117165, true }, - { 117172, true }, - { 117183, true }, - { 117190, true }, - { 117200, true }, - { 117212, true }, - { 117226, true }, - { 117235, true }, - { 117248, true }, + { 116868, true }, + { 116879, true }, + { 116890, true }, + { 116897, true }, + { 116908, true }, + { 116915, true }, + { 116925, true }, + { 116937, true }, + { 116951, true }, + { 116960, true }, + { 116973, true }, + { 116985, true }, + { 116999, true }, + { 117013, true }, + { 117020, true }, + { 117027, true }, + { 117034, true }, + { 117043, true }, + { 117052, true }, + { 117060, true }, + { 117070, true }, + { 117088, true }, + { 117102, true }, + { 117114, true }, + { 117125, true }, + { 117136, true }, + { 117147, true }, + { 117160, true }, + { 117171, true }, + { 117180, true }, + { 117197, true }, + { 117208, true }, + { 117224, true }, + { 117231, true }, + { 117238, true }, + { 117252, true }, { 117260, true }, - { 117277, true }, - { 117291, true }, - { 117305, true }, - { 117312, true }, - { 117319, true }, - { 117326, true }, - { 117335, true }, - { 117344, true }, - { 117352, true }, - { 117362, true }, - { 117380, true }, - { 117394, true }, - { 117406, true }, - { 117417, true }, - { 117428, true }, - { 117439, true }, - { 117452, true }, - { 117463, true }, - { 117472, true }, - { 117489, true }, - { 117500, true }, - { 117516, true }, - { 117523, true }, - { 117530, true }, + { 117267, true }, + { 117278, true }, + { 117284, true }, + { 117296, true }, + { 117309, true }, + { 117322, true }, + { 117332, true }, + { 117342, true }, + { 117355, true }, + { 117369, true }, + { 117384, true }, + { 117397, true }, + { 117410, true }, + { 117419, true }, + { 117438, true }, + { 117463, false }, + { 117475, true }, + { 117483, true }, + { 117497, true }, + { 117510, true }, + { 117525, true }, { 117544, true }, - { 117552, true }, - { 117559, true }, - { 117570, true }, - { 117576, true }, - { 117588, true }, - { 117601, true }, - { 117614, true }, - { 117624, true }, - { 117634, true }, - { 117647, true }, - { 117661, true }, - { 117676, true }, - { 117689, true }, - { 117702, true }, - { 117711, true }, - { 117730, true }, - { 117755, false }, - { 117767, true }, - { 117775, true }, - { 117789, true }, - { 117802, true }, - { 117817, true }, - { 117836, true }, - { 117849, true }, - { 117864, true }, - { 117877, true }, + { 117557, true }, + { 117572, true }, + { 117585, true }, + { 117596, true }, + { 117609, true }, + { 117626, true }, + { 117640, false }, + { 117659, true }, + { 117674, true }, + { 117686, true }, + { 117694, true }, + { 117706, true }, + { 117720, true }, + { 117736, true }, + { 117752, true }, + { 117768, true }, + { 117783, true }, + { 117803, true }, + { 117821, true }, + { 117830, true }, + { 117846, true }, + { 117861, true }, + { 117875, true }, { 117888, true }, - { 117901, true }, - { 117918, true }, - { 117932, false }, - { 117951, true }, - { 117966, true }, - { 117978, true }, - { 117986, true }, - { 117998, true }, - { 118012, true }, - { 118028, true }, - { 118044, true }, - { 118060, true }, - { 118075, true }, - { 118095, true }, - { 118113, true }, - { 118122, true }, - { 118138, true }, + { 117908, true }, + { 117927, true }, + { 117944, true }, + { 117960, true }, + { 117980, true }, + { 117993, true }, + { 118007, false }, + { 118020, true }, + { 118030, true }, + { 118042, true }, + { 118059, true }, + { 118074, true }, + { 118097, true }, + { 118110, true }, + { 118127, true }, + { 118141, true }, { 118153, true }, - { 118167, true }, - { 118180, true }, - { 118200, true }, - { 118219, true }, - { 118236, true }, - { 118252, true }, - { 118272, true }, - { 118285, true }, - { 118299, false }, - { 118312, true }, - { 118322, true }, - { 118334, true }, - { 118351, true }, - { 118366, true }, - { 118389, true }, - { 118402, true }, - { 118419, true }, - { 118433, true }, - { 118445, true }, - { 118460, true }, - { 118477, true }, - { 118491, true }, - { 118506, true }, - { 118515, true }, - { 118530, true }, - { 118548, true }, - { 118562, true }, - { 118572, true }, - { 118583, true }, - { 118593, true }, - { 118608, true }, - { 118622, true }, - { 118635, true }, - { 118646, true }, - { 118663, true }, - { 118677, true }, - { 118687, true }, - { 118699, true }, - { 118717, true }, - { 118731, true }, - { 118743, true }, - { 118758, false }, - { 118773, true }, - { 118789, true }, + { 118168, true }, + { 118185, true }, + { 118199, true }, + { 118214, true }, + { 118223, true }, + { 118238, true }, + { 118256, true }, + { 118270, true }, + { 118280, true }, + { 118291, true }, + { 118301, true }, + { 118316, true }, + { 118330, true }, + { 118343, true }, + { 118354, true }, + { 118371, true }, + { 118385, true }, + { 118395, true }, + { 118407, true }, + { 118425, true }, + { 118439, true }, + { 118451, true }, + { 118466, false }, + { 118481, true }, + { 118497, true }, + { 118516, true }, + { 118527, true }, + { 118539, true }, + { 118557, true }, + { 118569, true }, + { 118580, true }, + { 118597, true }, + { 118613, true }, + { 118632, true }, + { 118650, true }, + { 118667, true }, + { 118685, true }, + { 118707, true }, + { 118726, true }, + { 118739, true }, + { 118755, true }, + { 118768, true }, + { 118785, true }, + { 118800, true }, { 118808, true }, - { 118819, true }, - { 118831, true }, - { 118849, true }, + { 118822, true }, + { 118833, true }, + { 118843, true }, { 118861, true }, - { 118872, true }, - { 118889, true }, - { 118905, true }, + { 118879, true }, + { 118892, true }, + { 118902, true }, + { 118916, true }, { 118924, true }, - { 118942, true }, - { 118959, true }, - { 118977, true }, - { 118999, true }, - { 119018, true }, - { 119031, true }, - { 119047, true }, - { 119060, true }, + { 118937, true }, + { 118950, true }, + { 118962, true }, + { 118973, true }, + { 118988, true }, + { 118998, true }, + { 119009, true }, + { 119017, true }, + { 119032, true }, + { 119039, true }, + { 119055, true }, { 119077, true }, - { 119092, true }, - { 119100, true }, - { 119114, true }, - { 119125, true }, - { 119135, true }, - { 119153, true }, - { 119171, true }, - { 119184, true }, - { 119194, true }, - { 119208, true }, - { 119216, true }, - { 119224, true }, - { 119237, true }, - { 119250, true }, - { 119262, true }, - { 119273, true }, - { 119288, true }, - { 119298, true }, - { 119309, true }, - { 119317, true }, - { 119332, true }, - { 119339, true }, - { 119355, true }, - { 119377, true }, - { 119393, true }, - { 119402, true }, - { 119410, true }, - { 119420, true }, - { 119432, true }, - { 119445, true }, - { 119463, true }, - { 119488, true }, - { 119502, true }, - { 119521, true }, - { 119535, true }, - { 119548, true }, - { 119556, true }, - { 119572, false }, - { 119589, true }, - { 119610, true }, - { 119629, true }, - { 119648, true }, - { 119667, true }, - { 119683, true }, - { 119698, true }, - { 119708, true }, - { 119718, true }, - { 119727, true }, + { 119093, true }, + { 119102, true }, + { 119110, true }, + { 119120, true }, + { 119132, true }, + { 119145, true }, + { 119163, true }, + { 119188, true }, + { 119202, true }, + { 119221, true }, + { 119235, true }, + { 119248, true }, + { 119256, true }, + { 119272, false }, + { 119289, true }, + { 119310, true }, + { 119329, true }, + { 119348, true }, + { 119367, true }, + { 119383, true }, + { 119398, true }, + { 119408, true }, + { 119418, true }, + { 119427, true }, + { 119440, true }, + { 119450, false }, + { 119468, true }, + { 119490, true }, + { 119507, true }, + { 119523, true }, + { 119541, true }, + { 119554, true }, + { 119565, true }, + { 119581, true }, + { 119599, true }, + { 119615, true }, + { 119631, true }, + { 119646, false }, + { 119660, true }, + { 119677, true }, + { 119696, true }, + { 119707, true }, + { 119723, true }, { 119740, true }, - { 119750, false }, - { 119768, true }, - { 119790, true }, - { 119807, true }, - { 119823, true }, - { 119841, true }, - { 119854, true }, - { 119865, true }, - { 119881, true }, - { 119899, true }, - { 119915, true }, - { 119931, true }, - { 119946, false }, - { 119960, true }, - { 119977, true }, - { 119995, true }, - { 120014, true }, - { 120025, true }, - { 120041, true }, - { 120058, true }, + { 119757, true }, + { 119773, true }, + { 119786, true }, + { 119804, true }, + { 119817, true }, + { 119828, true }, + { 119845, true }, + { 119867, false }, + { 119884, true }, + { 119900, true }, + { 119914, true }, + { 119926, true }, + { 119948, false }, + { 119963, true }, + { 119970, true }, + { 119978, true }, + { 119991, true }, + { 120006, true }, + { 120021, true }, + { 120031, true }, + { 120044, true }, + { 120056, true }, + { 120065, true }, { 120075, true }, - { 120091, true }, - { 120104, true }, - { 120122, true }, - { 120135, true }, - { 120146, true }, - { 120163, true }, - { 120185, false }, - { 120202, true }, + { 120098, true }, + { 120113, true }, + { 120127, true }, + { 120141, true }, + { 120152, false }, + { 120165, true }, + { 120179, true }, + { 120187, true }, + { 120196, true }, + { 120209, true }, { 120218, true }, - { 120232, true }, - { 120244, true }, - { 120266, false }, - { 120281, true }, - { 120288, true }, - { 120296, true }, - { 120309, true }, + { 120228, true }, + { 120241, true }, + { 120261, false }, + { 120271, true }, + { 120287, true }, + { 120300, true }, + { 120313, true }, { 120324, true }, - { 120339, true }, - { 120349, true }, - { 120362, true }, - { 120374, true }, - { 120383, true }, - { 120393, true }, - { 120416, true }, - { 120431, true }, - { 120445, true }, - { 120459, true }, - { 120470, false }, - { 120483, true }, - { 120497, true }, + { 120333, true }, + { 120340, true }, + { 120356, true }, + { 120369, true }, + { 120382, true }, + { 120395, true }, + { 120410, true }, + { 120429, true }, + { 120440, true }, + { 120447, true }, + { 120467, true }, + { 120479, true }, + { 120491, true }, + { 120498, true }, { 120505, true }, { 120514, true }, - { 120527, true }, - { 120536, true }, - { 120546, true }, - { 120559, true }, - { 120579, false }, - { 120589, true }, - { 120605, true }, - { 120618, true }, + { 120523, true }, + { 120532, true }, + { 120541, true }, + { 120552, true }, + { 120566, true }, + { 120579, true }, + { 120587, true }, + { 120606, true }, + { 120617, true }, { 120631, true }, { 120642, true }, - { 120651, true }, { 120658, true }, - { 120674, true }, - { 120687, true }, + { 120672, true }, + { 120685, true }, { 120700, true }, - { 120713, true }, - { 120728, true }, - { 120747, true }, - { 120758, true }, - { 120765, true }, - { 120785, true }, - { 120797, true }, - { 120809, true }, - { 120816, true }, - { 120823, true }, - { 120832, true }, - { 120841, true }, - { 120850, true }, - { 120859, true }, - { 120870, true }, - { 120884, true }, - { 120897, true }, + { 120714, true }, + { 120724, false }, + { 120738, true }, + { 120748, true }, + { 120763, true }, + { 120777, false }, + { 120792, false }, + { 120808, true }, + { 120820, true }, + { 120833, true }, + { 120852, true }, + { 120876, true }, + { 120892, false }, { 120905, true }, - { 120924, true }, + { 120921, true }, { 120935, true }, - { 120949, true }, - { 120960, true }, - { 120976, true }, - { 120990, true }, + { 120950, true }, + { 120969, true }, + { 120986, true }, { 121003, true }, - { 121018, true }, - { 121032, true }, - { 121042, false }, - { 121056, true }, - { 121066, true }, - { 121081, true }, - { 121095, false }, - { 121110, false }, - { 121126, true }, - { 121138, true }, - { 121151, true }, - { 121170, true }, - { 121194, true }, - { 121210, false }, - { 121223, true }, - { 121239, true }, - { 121253, true }, - { 121268, true }, - { 121287, true }, - { 121304, true }, - { 121321, true }, - { 121331, true }, - { 121346, true }, - { 121360, true }, - { 121373, true }, - { 121389, true }, - { 121404, true }, - { 121420, true }, - { 121434, true }, - { 121448, true }, - { 121463, true }, - { 121471, true }, - { 121486, true }, - { 121505, true }, - { 121520, true }, - { 121544, true }, + { 121013, true }, + { 121028, true }, + { 121042, true }, + { 121055, true }, + { 121071, true }, + { 121086, true }, + { 121102, true }, + { 121116, true }, + { 121130, true }, + { 121145, true }, + { 121153, true }, + { 121168, true }, + { 121187, true }, + { 121202, true }, + { 121226, true }, + { 121242, true }, + { 121257, true }, + { 121275, true }, + { 121294, true }, + { 121313, true }, + { 121326, false }, + { 121349, true }, + { 121365, true }, + { 121378, true }, + { 121393, true }, + { 121408, true }, + { 121423, true }, + { 121439, true }, + { 121454, true }, + { 121470, true }, + { 121487, true }, + { 121499, true }, + { 121513, true }, + { 121523, true }, + { 121541, true }, { 121560, true }, - { 121575, true }, - { 121593, true }, - { 121612, true }, - { 121631, true }, - { 121644, false }, - { 121667, true }, - { 121683, true }, - { 121694, true }, - { 121707, true }, - { 121722, true }, - { 121737, true }, - { 121752, true }, - { 121768, true }, - { 121783, true }, - { 121799, true }, - { 121816, true }, - { 121828, true }, - { 121842, true }, - { 121852, true }, - { 121870, true }, - { 121889, true }, + { 121570, true }, + { 121581, true }, + { 121591, true }, + { 121605, true }, + { 121618, true }, + { 121646, true }, + { 121657, true }, + { 121668, true }, + { 121679, true }, + { 121691, true }, + { 121704, true }, + { 121717, true }, + { 121732, true }, + { 121746, true }, + { 121763, true }, + { 121777, true }, + { 121794, false }, + { 121811, true }, + { 121825, true }, + { 121840, true }, + { 121857, true }, + { 121874, true }, + { 121891, true }, { 121899, true }, - { 121910, true }, - { 121920, true }, - { 121934, true }, - { 121947, true }, - { 121975, true }, - { 121986, true }, - { 121997, true }, - { 122008, true }, - { 122020, true }, - { 122033, true }, - { 122046, true }, - { 122061, true }, - { 122075, true }, - { 122092, true }, - { 122106, true }, - { 122123, false }, - { 122140, true }, - { 122154, true }, - { 122169, true }, - { 122186, true }, - { 122203, true }, - { 122220, true }, + { 121911, true }, + { 121932, true }, + { 121943, true }, + { 121957, true }, + { 121969, true }, + { 121985, true }, + { 121998, true }, + { 122024, true }, + { 122050, true }, + { 122060, true }, + { 122073, true }, + { 122083, true }, + { 122096, true }, + { 122104, true }, + { 122119, true }, + { 122133, true }, + { 122147, true }, + { 122158, true }, + { 122178, true }, + { 122196, true }, + { 122213, true }, { 122228, true }, - { 122240, true }, - { 122261, true }, - { 122272, true }, - { 122286, true }, - { 122298, true }, - { 122314, true }, - { 122327, true }, - { 122353, true }, - { 122379, true }, - { 122389, true }, + { 122246, true }, + { 122262, true }, + { 122270, true }, + { 122284, true }, + { 122301, true }, + { 122312, true }, + { 122322, true }, + { 122338, true }, + { 122351, true }, + { 122361, false }, + { 122375, true }, + { 122386, true }, { 122402, true }, - { 122412, true }, - { 122425, true }, - { 122433, true }, - { 122448, true }, - { 122462, true }, - { 122476, true }, - { 122487, true }, - { 122507, true }, - { 122525, true }, - { 122542, true }, - { 122557, true }, - { 122575, true }, - { 122591, true }, - { 122599, true }, - { 122613, true }, - { 122630, true }, - { 122641, true }, - { 122651, true }, - { 122667, true }, - { 122680, true }, - { 122690, false }, - { 122704, true }, - { 122715, true }, - { 122731, true }, - { 122739, true }, - { 122749, true }, - { 122764, true }, - { 122780, true }, - { 122799, true }, - { 122812, true }, - { 122826, true }, - { 122844, true }, - { 122864, true }, - { 122879, true }, - { 122897, true }, - { 122916, true }, - { 122929, true }, - { 122939, true }, - { 122956, true }, - { 122971, true }, - { 122982, true }, - { 123000, true }, - { 123019, true }, - { 123038, true }, - { 123049, true }, - { 123062, true }, - { 123070, true }, - { 123079, true }, - { 123096, true }, - { 123107, true }, - { 123121, true }, + { 122410, true }, + { 122420, true }, + { 122435, true }, + { 122451, true }, + { 122470, true }, + { 122483, true }, + { 122497, true }, + { 122515, true }, + { 122535, true }, + { 122550, true }, + { 122568, true }, + { 122587, true }, + { 122600, true }, + { 122610, true }, + { 122627, true }, + { 122642, true }, + { 122653, true }, + { 122671, true }, + { 122690, true }, + { 122709, true }, + { 122720, true }, + { 122733, true }, + { 122741, true }, + { 122750, true }, + { 122767, true }, + { 122778, true }, + { 122792, true }, + { 122802, true }, + { 122825, true }, + { 122838, true }, + { 122846, true }, + { 122858, false }, + { 122869, true }, + { 122883, true }, + { 122911, true }, + { 122920, true }, + { 122935, true }, + { 122954, true }, + { 122978, true }, + { 122993, true }, + { 123013, true }, + { 123031, true }, + { 123044, true }, + { 123059, true }, + { 123072, true }, + { 123086, true }, + { 123097, true }, + { 123118, true }, { 123131, true }, - { 123154, true }, - { 123167, true }, - { 123175, true }, - { 123187, false }, - { 123198, true }, - { 123212, true }, - { 123240, true }, - { 123249, true }, - { 123264, true }, - { 123283, true }, + { 123145, true }, + { 123157, true }, + { 123174, true }, + { 123184, true }, + { 123197, true }, + { 123208, true }, + { 123223, true }, + { 123231, true }, + { 123251, true }, + { 123262, true }, + { 123272, true }, + { 123282, true }, + { 123298, true }, { 123307, true }, - { 123322, true }, - { 123342, true }, - { 123360, true }, - { 123373, true }, - { 123388, true }, + { 123318, true }, + { 123331, true }, + { 123341, true }, + { 123351, true }, + { 123363, true }, + { 123378, true }, + { 123387, true }, { 123401, true }, - { 123415, true }, - { 123426, true }, - { 123447, true }, - { 123460, true }, - { 123474, true }, - { 123486, true }, - { 123503, true }, - { 123513, true }, - { 123526, true }, - { 123537, true }, - { 123552, true }, - { 123560, true }, - { 123580, true }, - { 123591, true }, - { 123601, true }, - { 123611, true }, - { 123627, true }, - { 123636, true }, - { 123647, true }, - { 123660, true }, - { 123670, true }, - { 123680, true }, - { 123692, true }, - { 123707, true }, - { 123716, true }, - { 123730, true }, - { 123743, true }, - { 123753, true }, - { 123768, true }, - { 123782, true }, - { 123793, true }, - { 123808, true }, - { 123818, false }, - { 123828, true }, - { 123856, true }, - { 123869, true }, - { 123888, true }, - { 123901, true }, - { 123910, true }, - { 123921, true }, - { 123935, true }, - { 123949, true }, - { 123969, true }, - { 123985, true }, - { 123996, true }, - { 124007, true }, + { 123414, true }, + { 123424, true }, + { 123439, true }, + { 123453, true }, + { 123464, true }, + { 123479, true }, + { 123489, false }, + { 123499, true }, + { 123527, true }, + { 123540, true }, + { 123559, true }, + { 123572, true }, + { 123581, true }, + { 123592, true }, + { 123606, true }, + { 123620, true }, + { 123640, true }, + { 123656, true }, + { 123667, true }, + { 123678, true }, + { 123694, true }, + { 123711, true }, + { 123726, true }, + { 123739, true }, + { 123760, true }, + { 123773, true }, + { 123790, true }, + { 123800, true }, + { 123810, true }, + { 123818, true }, + { 123829, true }, + { 123839, true }, + { 123854, true }, + { 123866, true }, + { 123879, true }, + { 123893, true }, + { 123905, true }, + { 123915, true }, + { 123923, true }, + { 123936, true }, + { 123955, true }, + { 123980, true }, + { 124000, true }, + { 124009, true }, { 124023, true }, - { 124040, true }, - { 124055, true }, - { 124068, true }, - { 124089, true }, - { 124102, true }, - { 124119, true }, - { 124129, true }, - { 124139, true }, - { 124147, true }, - { 124158, true }, + { 124037, true }, + { 124079, true }, + { 124095, true }, + { 124109, true }, + { 124118, true }, + { 124130, true }, + { 124142, true }, + { 124155, true }, { 124168, true }, - { 124183, true }, - { 124195, true }, - { 124208, true }, - { 124222, true }, - { 124234, true }, - { 124244, true }, + { 124186, true }, + { 124194, true }, + { 124207, true }, + { 124218, true }, + { 124232, true }, + { 124242, true }, { 124252, true }, - { 124265, true }, - { 124284, true }, - { 124309, true }, - { 124329, true }, - { 124338, true }, - { 124352, true }, - { 124366, true }, - { 124408, true }, - { 124424, true }, - { 124438, true }, - { 124447, true }, - { 124459, true }, - { 124471, true }, - { 124484, true }, - { 124497, true }, - { 124515, true }, - { 124523, true }, - { 124536, true }, + { 124264, true }, + { 124275, true }, + { 124290, true }, + { 124307, true }, + { 124322, true }, + { 124334, true }, + { 124347, true }, + { 124359, true }, + { 124374, true }, + { 124387, true }, + { 124399, true }, + { 124409, true }, + { 124418, true }, + { 124439, true }, + { 124452, true }, + { 124470, true }, + { 124485, true }, + { 124499, true }, + { 124517, true }, + { 124535, true }, { 124547, true }, - { 124561, true }, - { 124571, true }, - { 124581, true }, + { 124558, true }, + { 124575, true }, { 124593, true }, { 124604, true }, - { 124619, true }, - { 124636, true }, + { 124618, true }, + { 124638, true }, { 124651, true }, { 124663, true }, - { 124676, true }, - { 124688, true }, - { 124703, true }, - { 124716, true }, - { 124728, true }, + { 124683, true }, + { 124692, true }, + { 124701, true }, + { 124708, true }, + { 124723, true }, { 124738, true }, - { 124747, true }, - { 124768, true }, - { 124781, true }, - { 124799, true }, - { 124814, true }, - { 124828, true }, - { 124846, true }, - { 124864, true }, - { 124876, true }, - { 124887, true }, + { 124752, true }, + { 124764, true }, + { 124783, true }, + { 124807, true }, + { 124818, true }, + { 124832, true }, + { 124844, true }, + { 124857, true }, + { 124870, true }, + { 124881, true }, + { 124891, true }, { 124904, true }, - { 124922, true }, - { 124933, true }, - { 124947, true }, - { 124967, true }, - { 124980, true }, - { 124992, true }, - { 125012, true }, - { 125021, true }, - { 125030, true }, - { 125037, true }, - { 125052, true }, - { 125067, true }, - { 125081, true }, - { 125093, true }, - { 125112, true }, - { 125136, true }, - { 125147, true }, + { 124916, true }, + { 124939, true }, + { 124948, true }, + { 124965, true }, + { 124975, true }, + { 124987, true }, + { 124998, true }, + { 125009, true }, + { 125024, true }, + { 125038, true }, + { 125046, true }, + { 125060, true }, + { 125074, true }, + { 125082, true }, + { 125095, true }, + { 125106, true }, + { 125118, true }, + { 125129, true }, + { 125153, true }, { 125161, true }, - { 125173, true }, - { 125186, true }, - { 125199, true }, - { 125210, true }, - { 125220, true }, - { 125233, true }, + { 125171, true }, + { 125181, true }, + { 125198, true }, + { 125209, true }, + { 125227, true }, { 125245, true }, - { 125268, true }, - { 125277, true }, - { 125294, true }, - { 125304, true }, - { 125316, true }, - { 125327, true }, + { 125259, true }, + { 125269, true }, + { 125281, true }, + { 125305, true }, + { 125319, true }, { 125338, true }, - { 125353, true }, - { 125367, true }, - { 125375, true }, - { 125389, true }, - { 125403, true }, + { 125350, true }, + { 125369, true }, + { 125386, true }, + { 125401, true }, { 125411, true }, - { 125424, true }, - { 125435, true }, - { 125447, true }, + { 125426, true }, + { 125446, true }, { 125458, true }, - { 125482, true }, - { 125490, true }, - { 125500, true }, + { 125470, true }, + { 125483, true }, + { 125492, true }, + { 125501, true }, { 125510, true }, - { 125527, true }, - { 125538, true }, - { 125556, true }, - { 125574, true }, - { 125588, true }, - { 125598, true }, + { 125522, true }, + { 125529, true }, + { 125557, true }, + { 125584, true }, { 125610, true }, - { 125634, true }, - { 125648, true }, - { 125667, true }, - { 125679, true }, - { 125698, true }, - { 125715, true }, - { 125730, true }, - { 125740, true }, + { 125635, true }, + { 125645, true }, + { 125654, true }, + { 125669, true }, + { 125684, false }, + { 125702, true }, + { 125713, true }, + { 125725, true }, + { 125741, true }, { 125755, true }, - { 125775, true }, - { 125787, true }, - { 125799, true }, + { 125770, true }, + { 125786, true }, { 125812, true }, - { 125821, true }, - { 125830, true }, - { 125839, true }, - { 125851, true }, - { 125858, true }, + { 125823, true }, + { 125838, true }, + { 125853, true }, + { 125868, true }, { 125886, true }, - { 125913, true }, + { 125896, true }, + { 125911, true }, + { 125926, true }, { 125939, true }, - { 125964, true }, - { 125974, true }, - { 125983, true }, - { 125998, true }, - { 126013, false }, - { 126031, true }, - { 126042, true }, - { 126054, true }, - { 126070, true }, - { 126084, true }, - { 126099, true }, - { 126115, true }, - { 126141, true }, - { 126152, true }, - { 126167, true }, - { 126182, true }, - { 126197, true }, - { 126215, true }, - { 126225, true }, - { 126240, true }, - { 126255, true }, - { 126268, true }, - { 126284, true }, - { 126307, true }, - { 126320, true }, - { 126333, true }, - { 126346, true }, - { 126365, true }, - { 126377, true }, - { 126393, true }, - { 126407, true }, - { 126419, false }, - { 126438, true }, - { 126450, true }, - { 126468, true }, - { 126479, true }, - { 126491, true }, - { 126502, true }, - { 126515, true }, - { 126526, true }, - { 126543, true }, - { 126566, true }, + { 125955, true }, + { 125978, true }, + { 125991, true }, + { 126004, true }, + { 126017, true }, + { 126036, true }, + { 126048, true }, + { 126064, true }, + { 126078, true }, + { 126090, false }, + { 126109, true }, + { 126121, true }, + { 126136, true }, + { 126154, true }, + { 126165, true }, + { 126177, true }, + { 126188, true }, + { 126201, true }, + { 126212, true }, + { 126229, true }, + { 126252, true }, + { 126267, true }, + { 126282, true }, + { 126296, true }, + { 126308, true }, + { 126325, true }, + { 126336, true }, + { 126344, true }, + { 126360, true }, + { 126373, true }, + { 126383, true }, + { 126394, true }, + { 126402, true }, + { 126419, true }, + { 126434, true }, + { 126444, true }, + { 126454, true }, + { 126465, true }, + { 126476, true }, + { 126496, true }, + { 126511, true }, + { 126528, true }, + { 126542, true }, + { 126555, true }, + { 126565, true }, { 126581, true }, - { 126596, true }, - { 126610, true }, - { 126622, true }, - { 126639, true }, - { 126650, true }, - { 126658, true }, - { 126674, true }, - { 126687, true }, - { 126697, true }, - { 126708, true }, - { 126716, true }, - { 126733, true }, - { 126748, true }, - { 126758, true }, - { 126768, true }, - { 126779, true }, - { 126790, true }, - { 126810, true }, - { 126825, true }, - { 126842, true }, - { 126856, true }, - { 126869, true }, + { 126604, true }, + { 126617, true }, + { 126631, true }, + { 126641, true }, + { 126652, true }, + { 126671, true }, + { 126682, true }, + { 126704, true }, + { 126718, true }, + { 126729, true }, + { 126742, true }, + { 126752, true }, + { 126770, true }, + { 126795, true }, + { 126812, true }, + { 126826, true }, + { 126838, true }, + { 126854, true }, + { 126868, true }, { 126879, true }, - { 126895, true }, + { 126889, false }, + { 126901, true }, { 126918, true }, - { 126931, true }, - { 126945, true }, + { 126935, true }, { 126955, true }, - { 126966, true }, - { 126985, true }, - { 126996, true }, - { 127018, true }, - { 127032, true }, - { 127043, true }, - { 127056, true }, - { 127066, true }, - { 127084, true }, - { 127109, true }, - { 127126, true }, - { 127140, true }, + { 126982, true }, + { 127007, true }, + { 127023, true }, + { 127038, true }, + { 127058, true }, + { 127070, true }, + { 127086, true }, + { 127098, true }, + { 127115, true }, + { 127132, true }, { 127152, true }, - { 127168, true }, - { 127182, true }, + { 127162, true }, + { 127179, true }, { 127193, true }, - { 127203, false }, - { 127215, true }, - { 127232, true }, - { 127249, true }, - { 127269, true }, - { 127296, true }, - { 127321, true }, - { 127337, true }, - { 127352, true }, - { 127365, true }, - { 127385, true }, - { 127397, true }, - { 127413, true }, - { 127425, true }, - { 127442, true }, - { 127459, true }, + { 127210, true }, + { 127223, true }, + { 127235, true }, + { 127247, true }, + { 127260, false }, + { 127274, true }, + { 127297, false }, + { 127311, true }, + { 127323, true }, + { 127334, true }, + { 127346, true }, + { 127364, true }, + { 127377, true }, + { 127392, true }, + { 127406, true }, + { 127424, true }, + { 127434, true }, + { 127446, true }, { 127479, true }, - { 127496, true }, - { 127510, true }, - { 127527, true }, - { 127540, true }, - { 127552, true }, + { 127489, true }, + { 127498, true }, + { 127517, true }, + { 127529, true }, + { 127543, true }, { 127564, true }, - { 127577, false }, - { 127591, true }, - { 127614, false }, + { 127578, true }, + { 127592, true }, + { 127610, true }, { 127628, true }, - { 127640, true }, - { 127651, true }, - { 127663, true }, - { 127681, true }, - { 127694, true }, - { 127709, true }, - { 127723, true }, - { 127741, true }, - { 127751, true }, - { 127763, true }, - { 127796, true }, - { 127806, true }, - { 127815, true }, - { 127834, true }, - { 127846, true }, - { 127860, true }, - { 127881, true }, + { 127646, true }, + { 127658, true }, + { 127671, true }, + { 127683, true }, + { 127691, true }, + { 127705, true }, + { 127721, true }, + { 127736, true }, + { 127750, true }, + { 127761, true }, + { 127770, true }, + { 127780, true }, + { 127792, true }, + { 127807, true }, + { 127819, true }, + { 127842, true }, + { 127854, true }, + { 127867, true }, + { 127875, true }, + { 127886, true }, { 127895, true }, - { 127909, true }, - { 127927, true }, - { 127945, true }, - { 127963, true }, - { 127975, true }, - { 127988, true }, - { 128000, true }, - { 128008, true }, - { 128022, true }, - { 128038, true }, - { 128053, true }, - { 128067, true }, - { 128078, true }, - { 128087, true }, - { 128097, true }, - { 128109, true }, - { 128124, true }, - { 128136, true }, - { 128159, true }, - { 128171, true }, - { 128184, true }, - { 128192, true }, - { 128203, true }, - { 128212, true }, - { 128225, true }, - { 128248, true }, - { 128260, true }, - { 128276, true }, - { 128288, true }, - { 128311, true }, + { 127903, true }, + { 127916, true }, + { 127939, true }, + { 127951, true }, + { 127967, true }, + { 127979, true }, + { 128002, true }, + { 128013, true }, + { 128029, true }, + { 128045, true }, + { 128060, true }, + { 128073, true }, + { 128083, true }, + { 128092, true }, + { 128099, true }, + { 128112, true }, + { 128129, true }, + { 128152, true }, + { 128169, true }, + { 128187, true }, + { 128216, true }, + { 128233, true }, + { 128247, true }, + { 128263, true }, + { 128273, true }, + { 128287, true }, + { 128301, true }, + { 128313, true }, { 128322, true }, { 128338, true }, - { 128354, true }, - { 128369, true }, - { 128382, true }, - { 128392, true }, - { 128401, true }, - { 128408, true }, - { 128421, true }, - { 128438, true }, - { 128461, true }, - { 128478, true }, - { 128496, true }, - { 128525, true }, - { 128542, true }, - { 128556, true }, - { 128572, true }, - { 128582, true }, - { 128596, true }, + { 128355, true }, + { 128371, false }, + { 128386, true }, + { 128399, true }, + { 128410, true }, + { 128428, true }, + { 128437, true }, + { 128451, true }, + { 128469, true }, + { 128487, true }, + { 128495, true }, + { 128505, true }, + { 128513, true }, + { 128523, true }, + { 128534, true }, + { 128544, true }, + { 128558, true }, + { 128566, true }, + { 128578, true }, + { 128592, true }, { 128610, true }, - { 128622, true }, - { 128631, true }, - { 128647, true }, - { 128664, true }, - { 128680, false }, - { 128695, true }, - { 128708, true }, - { 128719, true }, - { 128737, true }, - { 128746, true }, + { 128619, true }, + { 128630, true }, + { 128643, true }, + { 128658, true }, + { 128676, true }, + { 128684, true }, + { 128699, true }, + { 128712, true }, + { 128730, true }, + { 128748, true }, { 128760, true }, - { 128778, true }, - { 128796, true }, - { 128804, true }, - { 128814, true }, - { 128822, true }, - { 128832, true }, - { 128843, true }, - { 128853, true }, - { 128867, true }, - { 128875, true }, - { 128887, true }, - { 128901, true }, - { 128919, true }, - { 128928, true }, - { 128939, true }, - { 128952, true }, - { 128967, true }, - { 128985, true }, - { 128993, true }, - { 129008, true }, - { 129021, true }, - { 129039, true }, - { 129057, true }, - { 129069, true }, - { 129079, true }, - { 129090, true }, - { 129102, true }, - { 129116, true }, - { 129128, true }, - { 129142, true }, - { 129157, true }, - { 129168, true }, - { 129179, true }, - { 129193, true }, + { 128770, true }, + { 128781, true }, + { 128793, true }, + { 128807, true }, + { 128819, true }, + { 128833, true }, + { 128848, true }, + { 128859, true }, + { 128870, true }, + { 128884, true }, + { 128908, false }, + { 128924, false }, + { 128945, true }, + { 128962, true }, + { 128980, true }, + { 128997, true }, + { 129014, true }, + { 129029, true }, + { 129043, true }, + { 129055, true }, + { 129063, true }, + { 129078, true }, + { 129086, true }, + { 129099, true }, + { 129107, true }, + { 129125, true }, + { 129149, true }, + { 129166, true }, + { 129181, true }, + { 129194, true }, { 129217, false }, - { 129233, false }, - { 129254, true }, - { 129271, true }, - { 129289, true }, - { 129306, true }, - { 129323, true }, - { 129338, true }, - { 129352, true }, - { 129364, true }, - { 129372, true }, + { 129233, true }, + { 129246, true }, + { 129260, true }, + { 129272, true }, + { 129283, true }, + { 129294, true }, + { 129304, true }, + { 129315, false }, + { 129336, false }, + { 129347, true }, + { 129361, true }, + { 129373, true }, { 129387, true }, - { 129395, true }, - { 129408, true }, - { 129416, true }, - { 129434, true }, + { 129405, true }, + { 129419, true }, + { 129430, true }, + { 129447, true }, { 129458, true }, - { 129475, true }, - { 129490, true }, - { 129503, true }, - { 129526, false }, - { 129542, true }, - { 129555, true }, - { 129569, true }, + { 129468, true }, + { 129488, true }, + { 129499, true }, + { 129513, true }, + { 129527, true }, + { 129538, true }, + { 129551, true }, + { 129562, true }, { 129581, true }, - { 129592, true }, - { 129603, true }, - { 129613, true }, - { 129624, false }, - { 129645, false }, - { 129656, true }, + { 129597, true }, + { 129610, true }, + { 129618, true }, + { 129632, false }, + { 129645, true }, + { 129657, true }, { 129670, true }, - { 129682, true }, - { 129696, true }, - { 129714, true }, - { 129728, true }, - { 129739, true }, - { 129756, true }, - { 129767, true }, - { 129777, true }, - { 129797, true }, - { 129808, true }, - { 129822, true }, - { 129836, true }, - { 129847, true }, - { 129860, true }, - { 129871, true }, + { 129683, true }, + { 129695, true }, + { 129707, true }, + { 129722, true }, + { 129737, true }, + { 129747, true }, + { 129762, true }, + { 129776, true }, + { 129789, true }, + { 129799, false }, + { 129810, true }, + { 129832, true }, + { 129846, true }, + { 129859, true }, + { 129870, true }, + { 129880, true }, { 129890, true }, - { 129906, true }, - { 129919, true }, - { 129927, true }, - { 129941, false }, - { 129954, true }, - { 129966, true }, - { 129979, true }, + { 129901, true }, + { 129913, true }, + { 129923, true }, + { 129934, true }, + { 129945, true }, + { 129958, true }, + { 129970, true }, + { 129980, true }, { 129992, true }, - { 130004, true }, - { 130016, true }, - { 130031, true }, - { 130046, true }, - { 130056, true }, - { 130071, true }, - { 130085, true }, - { 130098, true }, - { 130108, false }, - { 130119, true }, - { 130141, true }, - { 130155, true }, - { 130168, true }, - { 130179, true }, - { 130189, true }, - { 130199, true }, - { 130210, true }, - { 130222, true }, - { 130232, true }, - { 130243, true }, - { 130254, true }, - { 130267, true }, - { 130279, true }, - { 130289, true }, - { 130301, true }, - { 130311, true }, - { 130319, true }, - { 130341, true }, + { 130002, true }, + { 130010, true }, + { 130032, true }, + { 130044, true }, + { 130053, true }, + { 130069, true }, + { 130078, true }, + { 130090, true }, + { 130102, true }, + { 130112, true }, + { 130122, true }, + { 130133, true }, + { 130143, true }, + { 130156, false }, + { 130167, true }, + { 130180, false }, + { 130205, true }, + { 130217, true }, + { 130226, true }, + { 130235, true }, + { 130252, true }, + { 130270, true }, + { 130278, true }, + { 130297, true }, + { 130310, true }, + { 130324, true }, + { 130334, true }, { 130353, true }, - { 130362, true }, - { 130378, true }, - { 130387, true }, - { 130399, true }, - { 130411, true }, - { 130421, true }, + { 130376, true }, + { 130395, true }, + { 130407, true }, { 130431, true }, - { 130442, true }, - { 130452, true }, - { 130465, false }, - { 130476, true }, - { 130489, false }, - { 130514, true }, - { 130526, true }, - { 130535, true }, - { 130544, true }, - { 130561, true }, - { 130579, true }, - { 130587, true }, - { 130606, true }, - { 130619, true }, - { 130633, true }, - { 130643, true }, - { 130662, true }, - { 130685, true }, - { 130704, true }, - { 130716, true }, - { 130740, true }, - { 130754, true }, - { 130772, true }, - { 130790, true }, - { 130804, true }, - { 130822, true }, + { 130445, true }, + { 130463, true }, + { 130481, true }, + { 130499, true }, + { 130515, true }, + { 130534, true }, + { 130544, false }, + { 130557, true }, + { 130568, true }, + { 130578, true }, + { 130591, true }, + { 130600, true }, + { 130611, true }, + { 130623, true }, + { 130633, false }, + { 130646, true }, + { 130656, true }, + { 130664, true }, + { 130676, true }, + { 130688, true }, + { 130696, true }, + { 130708, true }, + { 130723, true }, + { 130732, true }, + { 130747, true }, + { 130753, true }, + { 130765, true }, + { 130775, true }, + { 130784, true }, + { 130794, true }, + { 130801, false }, + { 130816, true }, + { 130827, true }, { 130838, true }, - { 130857, true }, - { 130867, false }, - { 130880, true }, - { 130891, true }, - { 130901, true }, - { 130914, true }, + { 130856, true }, + { 130871, true }, + { 130884, true }, + { 130897, true }, + { 130911, true }, { 130923, true }, - { 130934, true }, - { 130946, true }, - { 130956, false }, - { 130969, true }, - { 130979, true }, - { 130987, true }, + { 130937, true }, + { 130950, true }, + { 130964, true }, + { 130975, true }, + { 130984, true }, { 130999, true }, - { 131011, true }, - { 131019, true }, - { 131031, true }, - { 131046, true }, - { 131055, true }, - { 131070, true }, - { 131076, true }, - { 131088, true }, - { 131098, true }, - { 131107, true }, - { 131117, true }, - { 131124, false }, - { 131139, true }, - { 131150, true }, - { 131161, true }, - { 131179, true }, - { 131194, true }, - { 131207, true }, - { 131220, true }, - { 131234, true }, - { 131246, true }, + { 131018, true }, + { 131028, true }, + { 131040, true }, + { 131053, true }, + { 131061, true }, + { 131074, true }, + { 131086, true }, + { 131099, true }, + { 131119, true }, + { 131138, true }, + { 131154, true }, + { 131171, true }, + { 131183, true }, + { 131203, true }, + { 131217, true }, + { 131232, true }, + { 131247, true }, { 131260, true }, - { 131273, true }, - { 131287, true }, - { 131298, true }, - { 131307, true }, + { 131279, true }, + { 131291, true }, + { 131303, true }, { 131322, true }, - { 131341, true }, - { 131351, true }, - { 131363, true }, - { 131376, true }, - { 131384, true }, - { 131397, true }, - { 131409, true }, - { 131422, true }, - { 131442, true }, - { 131461, true }, - { 131477, true }, - { 131494, true }, - { 131506, true }, - { 131526, true }, - { 131540, true }, - { 131555, true }, - { 131570, true }, - { 131583, true }, - { 131602, true }, - { 131614, true }, - { 131626, true }, - { 131645, true }, - { 131653, true }, - { 131672, true }, - { 131690, true }, - { 131712, true }, - { 131728, true }, - { 131739, true }, + { 131330, true }, + { 131349, true }, + { 131367, true }, + { 131389, true }, + { 131405, true }, + { 131416, true }, + { 131431, true }, + { 131441, true }, + { 131455, true }, + { 131470, false }, + { 131481, true }, + { 131500, true }, + { 131509, false }, + { 131520, true }, + { 131528, true }, + { 131536, true }, + { 131545, true }, + { 131553, true }, + { 131564, true }, + { 131576, true }, + { 131591, true }, + { 131605, true }, + { 131619, true }, + { 131630, true }, + { 131639, true }, + { 131655, true }, + { 131677, true }, + { 131689, true }, + { 131707, true }, + { 131725, true }, + { 131732, true }, + { 131744, true }, { 131754, true }, - { 131764, true }, - { 131778, true }, - { 131793, false }, - { 131804, true }, - { 131823, true }, - { 131832, false }, - { 131843, true }, - { 131851, true }, - { 131859, true }, - { 131868, true }, + { 131770, true }, + { 131777, true }, + { 131789, true }, + { 131807, true }, + { 131825, true }, + { 131845, true }, + { 131866, true }, { 131876, true }, - { 131887, true }, { 131899, true }, - { 131914, true }, - { 131928, true }, - { 131942, true }, - { 131953, true }, - { 131962, true }, - { 131978, true }, - { 132000, true }, - { 132012, true }, - { 132030, true }, - { 132048, true }, - { 132060, true }, - { 132070, true }, + { 131934, true }, + { 131968, true }, + { 131991, true }, + { 132046, true }, + { 132058, true }, + { 132068, true }, { 132086, true }, - { 132093, true }, - { 132105, true }, - { 132123, true }, - { 132141, true }, - { 132161, true }, - { 132182, true }, - { 132192, true }, - { 132215, true }, - { 132250, true }, - { 132284, true }, - { 132307, true }, - { 132362, true }, + { 132101, true }, + { 132114, false }, + { 132128, true }, + { 132143, true }, + { 132157, true }, + { 132169, false }, + { 132185, true }, + { 132210, true }, + { 132220, true }, + { 132231, true }, + { 132243, true }, + { 132265, true }, + { 132288, true }, + { 132298, true }, + { 132308, true }, + { 132331, false }, + { 132345, true }, + { 132363, true }, { 132374, true }, - { 132384, true }, - { 132402, true }, - { 132417, true }, - { 132430, false }, - { 132444, true }, - { 132459, true }, - { 132473, true }, - { 132485, false }, - { 132501, true }, - { 132526, true }, - { 132536, true }, - { 132547, true }, - { 132559, true }, - { 132581, true }, + { 132385, true }, + { 132404, true }, + { 132420, true }, + { 132433, true }, + { 132458, true }, + { 132472, true }, + { 132485, true }, + { 132514, true }, + { 132527, true }, + { 132537, true }, + { 132549, true }, + { 132561, true }, + { 132580, true }, + { 132590, true }, { 132604, true }, - { 132614, true }, - { 132624, true }, - { 132647, true }, - { 132660, false }, - { 132674, true }, - { 132692, true }, - { 132703, true }, - { 132714, true }, - { 132733, true }, - { 132749, true }, - { 132762, true }, - { 132787, true }, - { 132801, true }, - { 132814, true }, - { 132843, true }, - { 132856, true }, - { 132866, true }, - { 132878, true }, - { 132890, true }, - { 132909, true }, - { 132919, true }, - { 132933, true }, - { 132950, true }, - { 132967, true }, - { 132979, true }, - { 132993, true }, - { 133007, true }, - { 133017, true }, - { 133034, true }, - { 133046, true }, - { 133057, true }, - { 133073, true }, - { 133088, true }, - { 133100, false }, - { 133109, true }, - { 133129, true }, - { 133149, true }, - { 133165, true }, - { 133186, true }, - { 133200, true }, - { 133213, true }, - { 133228, true }, - { 133240, true }, - { 133257, true }, - { 133267, true }, - { 133288, true }, - { 133302, true }, - { 133316, true }, - { 133334, true }, - { 133349, true }, - { 133361, true }, - { 133379, true }, - { 133390, true }, + { 132621, true }, + { 132638, true }, + { 132650, true }, + { 132664, true }, + { 132678, true }, + { 132688, true }, + { 132705, true }, + { 132717, true }, + { 132728, true }, + { 132744, true }, + { 132759, true }, + { 132771, false }, + { 132780, true }, + { 132800, true }, + { 132820, true }, + { 132836, true }, + { 132857, true }, + { 132871, true }, + { 132884, true }, + { 132899, true }, + { 132911, true }, + { 132928, true }, + { 132938, true }, + { 132959, true }, + { 132973, true }, + { 132987, true }, + { 133005, true }, + { 133020, true }, + { 133032, true }, + { 133050, true }, + { 133061, true }, + { 133074, true }, + { 133086, true }, + { 133100, true }, + { 133112, true }, + { 133133, true }, + { 133152, true }, + { 133164, true }, + { 133176, true }, + { 133195, true }, + { 133207, true }, + { 133226, true }, + { 133247, true }, + { 133263, true }, + { 133276, true }, + { 133293, true }, + { 133308, true }, + { 133322, true }, + { 133335, true }, + { 133348, true }, + { 133362, true }, + { 133377, true }, + { 133389, true }, { 133403, true }, - { 133415, true }, - { 133429, true }, - { 133441, true }, - { 133462, true }, - { 133481, true }, - { 133493, true }, - { 133505, true }, - { 133524, true }, - { 133536, true }, - { 133555, true }, - { 133576, true }, - { 133592, true }, - { 133605, true }, - { 133622, true }, - { 133637, true }, - { 133651, true }, + { 133418, true }, + { 133426, true }, + { 133436, true }, + { 133449, true }, + { 133468, true }, + { 133491, false }, + { 133504, true }, + { 133522, true }, + { 133530, true }, + { 133550, false }, + { 133568, true }, + { 133588, true }, + { 133606, true }, + { 133619, true }, + { 133634, true }, + { 133649, true }, { 133664, true }, - { 133677, true }, - { 133691, true }, - { 133706, true }, + { 133678, true }, + { 133693, true }, { 133718, true }, - { 133732, true }, - { 133747, true }, - { 133755, true }, - { 133765, true }, - { 133778, true }, - { 133797, true }, - { 133820, false }, - { 133833, true }, - { 133851, true }, - { 133859, true }, - { 133879, false }, - { 133897, true }, - { 133917, true }, - { 133935, true }, - { 133948, true }, - { 133963, true }, - { 133978, true }, - { 133993, true }, - { 134007, true }, - { 134022, true }, - { 134047, true }, - { 134058, true }, - { 134074, true }, - { 134088, true }, - { 134101, true }, - { 134129, true }, - { 134156, true }, - { 134181, true }, - { 134209, true }, - { 134223, true }, - { 134237, true }, - { 134256, true }, - { 134270, true }, - { 134286, true }, - { 134299, true }, - { 134310, true }, - { 134321, true }, - { 134339, true }, - { 134350, true }, - { 134362, true }, - { 134390, true }, - { 134400, true }, - { 134417, true }, - { 134434, true }, - { 134447, true }, - { 134457, true }, - { 134480, true }, - { 134490, true }, - { 134499, true }, - { 134521, true }, - { 134533, true }, - { 134544, true }, - { 134556, true }, - { 134568, true }, - { 134580, true }, - { 134591, true }, - { 134609, true }, - { 134624, true }, - { 134634, true }, - { 134643, true }, - { 134661, false }, - { 134672, true }, - { 134683, true }, - { 134707, false }, - { 134717, true }, - { 134725, true }, - { 134739, true }, - { 134751, true }, - { 134763, true }, - { 134774, true }, - { 134792, true }, - { 134812, true }, - { 134827, true }, - { 134844, true }, - { 134860, true }, - { 134873, true }, - { 134884, true }, - { 134899, true }, - { 134920, true }, - { 134938, true }, - { 134953, true }, - { 134969, true }, - { 134982, true }, - { 135007, true }, - { 135023, true }, - { 135032, true }, - { 135052, true }, - { 135067, true }, - { 135083, true }, - { 135094, true }, - { 135105, true }, - { 135119, true }, - { 135136, true }, - { 135148, true }, - { 135165, true }, - { 135176, true }, - { 135184, true }, - { 135197, true }, - { 135209, true }, - { 135221, true }, - { 135235, true }, - { 135245, true }, - { 135259, true }, - { 135275, true }, - { 135288, true }, - { 135304, true }, - { 135313, true }, - { 135328, true }, - { 135346, true }, - { 135365, true }, - { 135380, true }, - { 135392, true }, - { 135409, false }, - { 135429, false }, - { 135445, true }, - { 135456, true }, - { 135469, true }, + { 133729, true }, + { 133745, true }, + { 133759, true }, + { 133772, true }, + { 133800, true }, + { 133827, true }, + { 133852, true }, + { 133880, true }, + { 133894, true }, + { 133908, true }, + { 133927, true }, + { 133941, true }, + { 133957, true }, + { 133970, true }, + { 133981, true }, + { 133992, true }, + { 134010, true }, + { 134021, true }, + { 134049, true }, + { 134059, true }, + { 134076, true }, + { 134093, true }, + { 134106, true }, + { 134116, true }, + { 134139, true }, + { 134149, true }, + { 134158, true }, + { 134180, true }, + { 134192, true }, + { 134203, true }, + { 134215, true }, + { 134227, true }, + { 134239, true }, + { 134250, true }, + { 134268, true }, + { 134283, true }, + { 134293, true }, + { 134302, true }, + { 134320, false }, + { 134331, true }, + { 134342, true }, + { 134366, false }, + { 134376, true }, + { 134384, true }, + { 134398, true }, + { 134410, true }, + { 134422, true }, + { 134433, true }, + { 134451, true }, + { 134471, true }, + { 134486, true }, + { 134503, true }, + { 134519, true }, + { 134532, true }, + { 134543, true }, + { 134558, true }, + { 134579, true }, + { 134597, true }, + { 134612, true }, + { 134628, true }, + { 134641, true }, + { 134666, true }, + { 134682, true }, + { 134691, true }, + { 134711, true }, + { 134726, true }, + { 134742, true }, + { 134753, true }, + { 134764, true }, + { 134778, true }, + { 134795, true }, + { 134807, true }, + { 134824, true }, + { 134835, true }, + { 134843, true }, + { 134856, true }, + { 134868, true }, + { 134880, true }, + { 134894, true }, + { 134904, true }, + { 134918, true }, + { 134934, true }, + { 134947, true }, + { 134963, true }, + { 134972, true }, + { 134987, true }, + { 135005, true }, + { 135024, true }, + { 135039, true }, + { 135051, true }, + { 135068, false }, + { 135088, false }, + { 135104, true }, + { 135115, true }, + { 135128, true }, + { 135141, true }, + { 135161, true }, + { 135182, true }, + { 135195, false }, + { 135216, true }, + { 135227, true }, + { 135246, true }, + { 135265, true }, + { 135280, true }, + { 135291, true }, + { 135308, true }, + { 135316, true }, + { 135343, true }, + { 135354, true }, + { 135371, true }, + { 135381, true }, + { 135396, true }, + { 135408, true }, + { 135429, true }, + { 135438, true }, + { 135451, true }, + { 135464, true }, { 135482, true }, - { 135502, true }, - { 135523, true }, - { 135536, false }, - { 135557, true }, - { 135568, true }, - { 135587, true }, - { 135606, true }, - { 135621, true }, - { 135632, true }, - { 135649, true }, - { 135657, true }, - { 135684, true }, - { 135695, true }, - { 135712, true }, - { 135722, true }, - { 135737, true }, - { 135749, true }, + { 135491, true }, + { 135500, true }, + { 135509, true }, + { 135521, false }, + { 135538, false }, + { 135549, true }, + { 135567, true }, + { 135578, true }, + { 135593, true }, + { 135608, true }, + { 135624, true }, + { 135646, true }, + { 135661, true }, + { 135669, true }, + { 135682, true }, + { 135694, true }, + { 135711, true }, + { 135725, true }, + { 135735, true }, + { 135752, true }, { 135770, true }, - { 135779, true }, - { 135792, true }, - { 135805, true }, - { 135823, true }, - { 135832, true }, - { 135841, true }, - { 135850, true }, - { 135862, false }, - { 135879, false }, - { 135890, true }, - { 135908, true }, - { 135919, true }, - { 135934, true }, - { 135950, true }, - { 135972, true }, - { 135987, true }, - { 135995, true }, - { 136008, true }, - { 136020, true }, - { 136037, true }, - { 136051, true }, - { 136061, true }, - { 136078, true }, - { 136096, true }, - { 136113, true }, - { 136130, true }, - { 136138, true }, - { 136157, true }, - { 136172, true }, - { 136196, true }, - { 136214, true }, - { 136228, true }, - { 136246, true }, - { 136257, true }, - { 136270, true }, - { 136284, true }, - { 136298, true }, - { 136317, true }, - { 136328, true }, - { 136338, true }, - { 136349, true }, - { 136371, true }, + { 135787, true }, + { 135804, true }, + { 135812, true }, + { 135831, true }, + { 135846, true }, + { 135870, true }, + { 135894, true }, + { 135912, true }, + { 135926, true }, + { 135944, true }, + { 135955, true }, + { 135968, true }, + { 135982, true }, + { 135996, true }, + { 136015, true }, + { 136026, true }, + { 136036, true }, + { 136047, true }, + { 136069, true }, + { 136081, true }, + { 136092, true }, + { 136119, true }, + { 136131, true }, + { 136154, true }, + { 136166, true }, + { 136181, true }, + { 136202, true }, + { 136215, true }, + { 136222, true }, + { 136242, true }, + { 136252, true }, + { 136268, true }, + { 136278, false }, + { 136295, true }, + { 136306, true }, + { 136313, true }, + { 136322, true }, + { 136341, true }, + { 136354, true }, + { 136372, true }, { 136382, true }, - { 136409, true }, - { 136421, true }, - { 136444, true }, - { 136456, true }, - { 136471, true }, - { 136492, true }, - { 136505, true }, - { 136512, true }, - { 136532, true }, - { 136542, true }, - { 136558, true }, - { 136568, false }, + { 136402, true }, + { 136412, true }, + { 136427, true }, + { 136440, true }, + { 136450, true }, + { 136474, true }, + { 136491, true }, + { 136503, false }, + { 136518, true }, + { 136531, true }, + { 136546, true }, + { 136556, true }, + { 136574, true }, { 136585, true }, - { 136596, true }, - { 136603, true }, - { 136612, true }, - { 136631, true }, - { 136644, true }, + { 136597, true }, + { 136615, true }, + { 136636, false }, { 136662, true }, - { 136672, true }, - { 136692, true }, - { 136702, true }, - { 136717, true }, - { 136730, true }, - { 136740, true }, - { 136764, true }, - { 136781, true }, - { 136793, false }, - { 136808, true }, - { 136821, true }, - { 136836, true }, - { 136846, true }, - { 136864, true }, - { 136875, true }, - { 136887, true }, - { 136905, true }, - { 136926, false }, - { 136952, true }, - { 136966, true }, - { 136980, true }, - { 136993, true }, - { 137007, true }, - { 137018, true }, - { 137032, true }, - { 137045, true }, + { 136676, true }, + { 136689, true }, + { 136703, true }, + { 136714, true }, + { 136728, true }, + { 136741, true }, + { 136753, true }, + { 136766, true }, + { 136783, true }, + { 136798, true }, + { 136810, false }, + { 136824, true }, + { 136844, true }, + { 136857, true }, + { 136870, true }, + { 136883, true }, + { 136903, true }, + { 136913, true }, + { 136924, true }, + { 136935, true }, + { 136946, true }, + { 136958, true }, + { 136971, true }, + { 136995, true }, + { 137008, true }, + { 137031, true }, + { 137043, true }, { 137057, true }, - { 137070, true }, - { 137087, true }, - { 137102, true }, - { 137114, false }, - { 137128, true }, - { 137148, true }, - { 137161, true }, - { 137174, true }, - { 137187, true }, - { 137207, true }, - { 137217, true }, + { 137068, true }, + { 137081, true }, + { 137089, true }, + { 137101, true }, + { 137115, true }, + { 137130, true }, + { 137153, true }, + { 137164, true }, + { 137178, true }, + { 137191, false }, + { 137206, true }, + { 137218, true }, { 137228, true }, - { 137239, true }, - { 137250, true }, - { 137262, true }, - { 137275, true }, - { 137299, true }, - { 137312, true }, + { 137244, true }, + { 137256, false }, + { 137270, true }, + { 137284, true }, + { 137296, true }, + { 137310, true }, + { 137320, true }, { 137335, true }, - { 137347, true }, - { 137361, true }, - { 137372, true }, - { 137385, true }, - { 137393, true }, - { 137405, true }, - { 137419, true }, - { 137434, true }, - { 137457, true }, - { 137468, true }, - { 137482, true }, - { 137495, false }, - { 137510, true }, - { 137522, true }, - { 137532, true }, - { 137548, true }, - { 137560, false }, - { 137574, true }, - { 137588, true }, - { 137600, true }, - { 137614, true }, - { 137624, true }, - { 137639, true }, - { 137653, true }, - { 137666, true }, - { 137679, true }, - { 137705, true }, - { 137715, true }, - { 137743, true }, + { 137349, true }, + { 137362, true }, + { 137375, true }, + { 137401, true }, + { 137411, true }, + { 137439, true }, + { 137467, true }, + { 137477, true }, + { 137504, true }, + { 137516, true }, + { 137526, true }, + { 137536, true }, + { 137549, true }, + { 137565, true }, + { 137578, true }, + { 137592, true }, + { 137608, false }, + { 137623, true }, + { 137641, true }, + { 137654, true }, + { 137673, true }, + { 137681, true }, + { 137694, true }, + { 137709, true }, + { 137723, true }, + { 137739, true }, + { 137753, true }, { 137771, true }, - { 137781, true }, - { 137808, true }, - { 137820, true }, - { 137830, true }, - { 137840, true }, - { 137853, true }, - { 137869, true }, - { 137882, true }, - { 137896, true }, - { 137912, false }, - { 137927, true }, - { 137945, true }, + { 137784, true }, + { 137794, true }, + { 137803, false }, + { 137814, true }, + { 137825, true }, + { 137835, true }, + { 137847, true }, + { 137857, true }, + { 137868, true }, + { 137895, true }, + { 137913, true }, + { 137933, true }, + { 137947, true }, { 137958, true }, - { 137977, true }, - { 137985, true }, - { 137998, true }, - { 138013, true }, - { 138027, true }, - { 138043, true }, - { 138057, true }, - { 138075, true }, - { 138088, true }, - { 138098, true }, - { 138107, false }, + { 137967, true }, + { 137976, true }, + { 137993, false }, + { 138007, true }, + { 138030, true }, + { 138046, true }, + { 138067, true }, + { 138083, true }, + { 138096, true }, { 138118, true }, - { 138129, true }, - { 138139, true }, - { 138151, true }, - { 138161, true }, - { 138172, true }, - { 138199, true }, - { 138217, true }, - { 138237, true }, + { 138128, true }, + { 138136, true }, + { 138145, true }, + { 138156, true }, + { 138171, true }, + { 138185, true }, + { 138195, true }, + { 138212, true }, + { 138227, true }, + { 138241, true }, { 138251, true }, - { 138262, true }, { 138271, true }, - { 138280, true }, - { 138297, false }, - { 138311, true }, - { 138334, true }, - { 138350, true }, - { 138371, true }, - { 138387, true }, - { 138400, true }, - { 138422, true }, - { 138432, true }, - { 138440, true }, - { 138449, true }, - { 138460, true }, - { 138475, true }, - { 138489, true }, - { 138499, true }, - { 138516, true }, - { 138531, true }, - { 138545, true }, - { 138555, true }, - { 138575, true }, - { 138590, true }, - { 138600, true }, - { 138618, true }, + { 138286, true }, + { 138296, true }, + { 138314, true }, + { 138329, true }, + { 138355, true }, + { 138369, true }, + { 138382, true }, + { 138394, true }, + { 138413, true }, + { 138426, true }, + { 138450, false }, + { 138469, true }, + { 138497, true }, + { 138511, true }, + { 138524, true }, + { 138538, true }, + { 138550, true }, + { 138564, true }, + { 138574, true }, + { 138596, true }, + { 138615, true }, { 138633, true }, - { 138659, true }, - { 138673, true }, - { 138686, true }, - { 138698, true }, - { 138717, true }, - { 138730, true }, - { 138754, false }, - { 138773, true }, - { 138801, true }, - { 138815, true }, - { 138828, true }, - { 138842, true }, - { 138854, true }, - { 138868, true }, - { 138878, true }, - { 138900, true }, - { 138919, true }, - { 138937, true }, - { 138945, true }, - { 138961, true }, - { 138976, true }, - { 138984, true }, - { 138995, true }, - { 139008, true }, - { 139019, true }, - { 139035, true }, - { 139049, true }, - { 139067, true }, - { 139083, true }, + { 138641, true }, + { 138657, true }, + { 138672, true }, + { 138680, true }, + { 138691, true }, + { 138704, true }, + { 138715, true }, + { 138731, true }, + { 138745, true }, + { 138763, true }, + { 138779, true }, + { 138793, true }, + { 138808, true }, + { 138823, true }, + { 138835, true }, + { 138847, true }, + { 138866, true }, + { 138882, false }, + { 138907, true }, + { 138926, true }, + { 138943, true }, + { 138953, true }, + { 138964, true }, + { 138976, false }, + { 138991, true }, + { 139009, true }, + { 139018, true }, + { 139025, true }, + { 139033, true }, + { 139044, true }, + { 139058, true }, + { 139071, true }, + { 139084, true }, { 139097, true }, - { 139112, true }, - { 139127, true }, - { 139139, true }, - { 139151, true }, - { 139170, true }, - { 139186, false }, - { 139211, true }, - { 139230, true }, - { 139247, true }, - { 139257, true }, - { 139268, true }, - { 139280, false }, - { 139295, true }, - { 139313, true }, - { 139322, true }, - { 139329, true }, - { 139337, true }, - { 139348, true }, - { 139362, true }, + { 139108, true }, + { 139121, true }, + { 139131, true }, + { 139141, true }, + { 139153, true }, + { 139161, true }, + { 139173, true }, + { 139182, true }, + { 139189, true }, + { 139199, true }, + { 139210, true }, + { 139221, true }, + { 139239, true }, + { 139253, true }, + { 139267, true }, + { 139290, true }, + { 139300, true }, + { 139311, true }, + { 139326, true }, + { 139344, true }, + { 139361, true }, { 139375, true }, - { 139388, true }, - { 139401, true }, - { 139412, true }, - { 139425, true }, + { 139390, true }, + { 139406, true }, + { 139419, true }, { 139435, true }, - { 139445, true }, - { 139457, true }, - { 139465, true }, - { 139477, true }, - { 139486, true }, - { 139493, true }, - { 139503, true }, - { 139514, true }, - { 139525, true }, - { 139543, true }, - { 139557, true }, - { 139571, true }, - { 139594, true }, - { 139604, true }, - { 139615, true }, - { 139630, true }, - { 139648, true }, - { 139665, true }, - { 139679, true }, - { 139694, true }, - { 139710, true }, - { 139723, true }, - { 139739, true }, - { 139753, true }, - { 139765, true }, - { 139777, true }, - { 139789, true }, - { 139802, true }, - { 139819, true }, - { 139832, false }, - { 139843, true }, - { 139857, true }, - { 139868, true }, - { 139881, true }, - { 139896, true }, - { 139903, true }, - { 139922, true }, - { 139941, true }, - { 139967, true }, + { 139449, true }, + { 139461, true }, + { 139473, true }, + { 139485, true }, + { 139498, true }, + { 139515, true }, + { 139528, false }, + { 139539, true }, + { 139553, true }, + { 139564, true }, + { 139577, true }, + { 139592, true }, + { 139599, true }, + { 139618, true }, + { 139637, true }, + { 139663, true }, + { 139678, true }, + { 139690, true }, + { 139714, false }, + { 139729, true }, + { 139740, true }, + { 139763, false }, + { 139774, false }, + { 139785, false }, + { 139797, true }, + { 139811, true }, + { 139824, true }, + { 139837, true }, + { 139850, true }, + { 139872, true }, + { 139882, true }, + { 139902, true }, + { 139920, true }, + { 139934, true }, + { 139951, false }, + { 139966, false }, { 139982, true }, - { 139994, true }, - { 140018, false }, - { 140033, true }, - { 140044, true }, - { 140067, false }, - { 140078, false }, - { 140089, false }, - { 140101, true }, - { 140115, true }, - { 140128, true }, - { 140141, true }, - { 140154, true }, + { 139999, true }, + { 140010, true }, + { 140021, true }, + { 140043, true }, + { 140057, true }, + { 140077, true }, + { 140094, true }, + { 140104, true }, + { 140112, true }, + { 140123, true }, + { 140131, true }, + { 140140, true }, + { 140151, true }, + { 140161, true }, { 140176, true }, - { 140186, true }, - { 140206, true }, - { 140224, true }, + { 140189, true }, + { 140203, true }, + { 140211, true }, + { 140221, true }, { 140238, true }, - { 140255, false }, - { 140270, false }, - { 140286, true }, - { 140303, true }, - { 140314, true }, - { 140325, true }, + { 140259, true }, + { 140273, true }, + { 140290, true }, + { 140305, true }, + { 140327, true }, { 140347, true }, - { 140361, true }, - { 140381, true }, - { 140398, true }, - { 140408, true }, + { 140362, true }, + { 140377, true }, + { 140388, true }, + { 140400, true }, { 140416, true }, - { 140427, true }, - { 140435, true }, - { 140444, true }, - { 140455, true }, - { 140465, true }, - { 140480, true }, - { 140493, true }, - { 140507, true }, - { 140515, true }, - { 140525, true }, - { 140542, true }, - { 140563, true }, - { 140577, true }, - { 140594, true }, - { 140609, true }, - { 140631, true }, - { 140651, true }, - { 140666, true }, - { 140681, true }, - { 140692, true }, - { 140704, true }, - { 140720, true }, - { 140734, true }, - { 140747, true }, - { 140760, true }, - { 140773, true }, - { 140786, true }, - { 140799, true }, - { 140818, true }, - { 140831, true }, - { 140843, true }, - { 140854, false }, + { 140430, true }, + { 140443, true }, + { 140456, true }, + { 140469, true }, + { 140482, true }, + { 140495, true }, + { 140514, true }, + { 140527, true }, + { 140539, true }, + { 140550, false }, + { 140566, true }, + { 140579, true }, + { 140593, true }, + { 140606, true }, + { 140616, true }, + { 140636, true }, + { 140659, true }, + { 140679, true }, + { 140690, true }, + { 140700, true }, + { 140715, true }, + { 140731, true }, + { 140741, true }, + { 140758, true }, + { 140770, true }, + { 140787, true }, + { 140795, true }, + { 140811, true }, + { 140826, true }, + { 140846, true }, + { 140856, true }, { 140870, true }, - { 140883, true }, - { 140897, true }, - { 140910, true }, - { 140920, true }, - { 140940, true }, - { 140963, true }, - { 140983, true }, + { 140895, true }, + { 140909, true }, + { 140923, true }, + { 140937, true }, + { 140951, true }, + { 140965, true }, + { 140980, true }, { 140994, true }, - { 141004, true }, - { 141019, true }, - { 141035, true }, - { 141045, true }, - { 141062, true }, - { 141074, true }, - { 141091, true }, - { 141099, true }, - { 141115, true }, - { 141130, true }, - { 141150, true }, - { 141160, true }, - { 141174, true }, - { 141199, true }, - { 141213, true }, - { 141227, true }, + { 141008, true }, + { 141022, true }, + { 141042, true }, + { 141059, true }, + { 141077, true }, + { 141092, true }, + { 141103, true }, + { 141116, true }, + { 141134, true }, + { 141149, true }, + { 141165, true }, + { 141177, true }, + { 141194, true }, + { 141207, true }, + { 141222, true }, + { 141232, true }, { 141241, true }, - { 141255, true }, + { 141254, false }, { 141269, true }, - { 141284, true }, - { 141298, true }, - { 141312, true }, - { 141326, true }, - { 141346, true }, - { 141363, true }, - { 141381, true }, - { 141396, true }, - { 141407, true }, + { 141280, true }, + { 141295, true }, + { 141307, true }, + { 141324, true }, + { 141333, true }, + { 141345, false }, + { 141355, true }, + { 141370, true }, + { 141386, true }, + { 141405, true }, { 141420, true }, - { 141438, true }, - { 141453, true }, - { 141469, true }, - { 141481, true }, - { 141498, true }, - { 141511, true }, - { 141526, true }, - { 141536, true }, - { 141545, true }, - { 141558, false }, + { 141432, true }, + { 141448, true }, + { 141458, true }, + { 141474, true }, + { 141494, true }, + { 141508, true }, + { 141522, true }, + { 141541, true }, + { 141561, true }, { 141573, true }, - { 141584, true }, + { 141589, true }, { 141599, true }, - { 141611, true }, - { 141628, true }, - { 141637, true }, - { 141649, true }, - { 141666, true }, - { 141681, true }, - { 141697, true }, - { 141716, true }, - { 141731, true }, + { 141609, true }, + { 141623, true }, + { 141646, true }, + { 141656, true }, + { 141675, true }, + { 141692, true }, + { 141701, true }, + { 141714, true }, + { 141729, true }, { 141743, true }, - { 141759, true }, - { 141769, true }, - { 141785, true }, - { 141805, true }, - { 141819, true }, - { 141833, true }, - { 141852, true }, - { 141872, true }, - { 141884, true }, - { 141900, true }, - { 141910, true }, - { 141920, true }, - { 141934, true }, - { 141957, true }, - { 141967, true }, - { 141986, true }, - { 142003, true }, - { 142012, true }, - { 142025, true }, + { 141762, true }, + { 141780, true }, + { 141794, true }, + { 141809, true }, + { 141825, true }, + { 141841, true }, + { 141849, true }, + { 141859, true }, + { 141870, true }, + { 141890, true }, + { 141902, true }, + { 141913, true }, + { 141925, true }, + { 141937, true }, + { 141950, true }, + { 141963, true }, + { 141977, true }, + { 141991, true }, + { 142005, false }, + { 142031, true }, { 142040, true }, - { 142054, true }, - { 142073, true }, - { 142091, true }, - { 142105, true }, - { 142120, true }, - { 142136, true }, + { 142048, true }, + { 142056, true }, + { 142064, true }, + { 142074, true }, + { 142083, true }, + { 142095, true }, + { 142114, true }, + { 142124, true }, + { 142135, true }, { 142152, true }, - { 142160, true }, - { 142170, true }, - { 142181, true }, + { 142165, true }, + { 142175, true }, + { 142189, true }, { 142201, true }, - { 142213, true }, - { 142224, true }, - { 142236, true }, + { 142212, true }, + { 142230, true }, { 142248, true }, - { 142261, true }, - { 142274, true }, - { 142288, true }, - { 142302, true }, - { 142316, false }, - { 142342, true }, - { 142351, true }, - { 142359, true }, - { 142367, true }, - { 142375, true }, - { 142385, true }, - { 142394, true }, - { 142406, true }, - { 142425, true }, - { 142435, true }, - { 142446, true }, - { 142463, true }, - { 142476, true }, - { 142486, true }, - { 142500, true }, - { 142512, true }, + { 142262, true }, + { 142272, true }, + { 142286, true }, + { 142293, true }, + { 142303, true }, + { 142318, true }, + { 142340, true }, + { 142348, true }, + { 142358, true }, + { 142377, true }, + { 142395, true }, + { 142407, true }, + { 142417, true }, + { 142427, true }, + { 142437, true }, + { 142449, true }, + { 142460, true }, + { 142473, true }, + { 142481, true }, + { 142495, true }, + { 142505, true }, + { 142516, true }, { 142523, true }, - { 142541, true }, - { 142559, true }, - { 142573, true }, - { 142583, true }, - { 142597, true }, - { 142604, true }, - { 142614, true }, - { 142629, true }, - { 142651, true }, - { 142659, true }, - { 142669, true }, - { 142688, true }, - { 142706, true }, - { 142718, true }, + { 142531, true }, + { 142549, true }, + { 142565, true }, + { 142576, true }, + { 142592, false }, + { 142607, true }, + { 142617, true }, + { 142625, true }, + { 142634, true }, + { 142643, true }, + { 142663, true }, + { 142672, false }, + { 142683, true }, + { 142695, false }, + { 142709, true }, { 142728, true }, - { 142738, true }, - { 142748, true }, - { 142760, true }, - { 142771, true }, - { 142784, true }, - { 142792, true }, - { 142806, true }, - { 142816, true }, - { 142827, true }, - { 142834, true }, - { 142842, true }, + { 142741, true }, + { 142757, true }, + { 142770, true }, + { 142783, false }, + { 142794, true }, + { 142811, true }, + { 142823, true }, + { 142838, true }, + { 142848, true }, { 142860, true }, - { 142876, true }, - { 142887, true }, - { 142903, false }, - { 142918, true }, - { 142928, true }, - { 142936, true }, - { 142945, true }, - { 142954, true }, - { 142974, true }, - { 142983, false }, - { 142994, true }, - { 143006, false }, - { 143020, true }, - { 143039, true }, - { 143052, true }, - { 143068, true }, - { 143081, true }, - { 143094, false }, - { 143105, true }, - { 143122, true }, - { 143134, true }, - { 143149, true }, - { 143159, true }, - { 143171, true }, - { 143183, true }, - { 143194, true }, - { 143205, true }, - { 143217, true }, - { 143240, true }, - { 143250, true }, - { 143260, true }, - { 143276, true }, + { 142872, true }, + { 142883, true }, + { 142894, true }, + { 142906, true }, + { 142929, true }, + { 142939, true }, + { 142949, true }, + { 142965, true }, + { 142980, true }, + { 142993, true }, + { 143019, true }, + { 143028, true }, + { 143043, true }, + { 143053, true }, + { 143066, true }, + { 143079, true }, + { 143094, true }, + { 143104, true }, + { 143121, true }, + { 143137, true }, + { 143151, false }, + { 143161, true }, + { 143175, true }, + { 143186, true }, + { 143196, true }, + { 143210, true }, + { 143221, true }, + { 143234, true }, + { 143247, true }, + { 143264, true }, + { 143279, true }, { 143291, true }, - { 143304, true }, - { 143330, true }, - { 143339, true }, - { 143354, true }, - { 143364, true }, - { 143377, true }, - { 143390, true }, - { 143405, true }, - { 143415, true }, - { 143432, true }, - { 143448, true }, - { 143462, false }, - { 143472, true }, - { 143486, true }, - { 143497, true }, - { 143507, true }, - { 143521, true }, - { 143532, true }, - { 143545, true }, - { 143558, true }, - { 143575, true }, - { 143590, true }, - { 143602, true }, - { 143619, true }, + { 143308, true }, + { 143326, true }, + { 143337, true }, + { 143352, true }, + { 143365, true }, + { 143386, true }, + { 143397, true }, + { 143412, true }, + { 143437, true }, + { 143445, true }, + { 143461, false }, + { 143476, true }, + { 143488, true }, + { 143500, true }, + { 143514, true }, + { 143528, true }, + { 143542, true }, + { 143556, true }, + { 143573, true }, + { 143600, true }, + { 143617, true }, { 143637, true }, - { 143648, true }, - { 143663, true }, - { 143676, true }, - { 143697, true }, - { 143708, true }, - { 143732, true }, + { 143649, true }, + { 143659, true }, + { 143673, true }, + { 143693, true }, + { 143715, true }, + { 143729, true }, { 143747, true }, - { 143772, true }, - { 143780, true }, - { 143796, false }, - { 143811, true }, - { 143823, true }, - { 143835, true }, - { 143849, true }, - { 143863, true }, - { 143877, true }, - { 143891, true }, - { 143908, true }, - { 143935, true }, + { 143767, true }, + { 143788, true }, + { 143805, true }, + { 143819, true }, + { 143830, true }, + { 143844, true }, + { 143857, true }, + { 143868, true }, + { 143884, true }, + { 143896, true }, + { 143910, true }, + { 143927, true }, + { 143938, true }, { 143952, true }, - { 143972, true }, - { 143984, true }, - { 143994, true }, - { 144008, true }, - { 144028, true }, - { 144050, true }, - { 144064, true }, - { 144082, true }, - { 144102, true }, - { 144123, true }, - { 144140, true }, - { 144154, true }, - { 144165, true }, - { 144179, true }, - { 144192, true }, - { 144203, true }, - { 144219, true }, - { 144231, true }, - { 144245, true }, - { 144261, true }, - { 144278, true }, - { 144289, true }, + { 143964, false }, + { 143989, true }, + { 144013, true }, + { 144023, false }, + { 144049, true }, + { 144066, true }, + { 144083, true }, + { 144097, true }, + { 144111, true }, + { 144141, false }, + { 144155, true }, + { 144172, true }, + { 144186, true }, + { 144209, true }, + { 144217, true }, + { 144225, true }, + { 144233, true }, + { 144241, true }, + { 144249, true }, + { 144260, true }, + { 144270, true }, + { 144284, true }, { 144303, true }, - { 144315, false }, - { 144340, true }, - { 144364, true }, - { 144374, false }, - { 144400, true }, - { 144417, true }, - { 144434, true }, - { 144448, true }, - { 144462, true }, - { 144492, false }, - { 144506, true }, - { 144523, true }, - { 144537, true }, - { 144560, true }, - { 144568, true }, - { 144576, true }, - { 144584, true }, - { 144592, true }, - { 144600, true }, - { 144611, true }, - { 144621, true }, - { 144635, true }, - { 144654, true }, - { 144663, true }, - { 144676, true }, - { 144687, true }, - { 144698, true }, - { 144723, true }, - { 144735, true }, - { 144744, false }, - { 144760, true }, - { 144770, false }, - { 144792, true }, - { 144807, true }, - { 144821, true }, - { 144834, true }, - { 144851, true }, - { 144867, true }, - { 144890, true }, - { 144912, true }, - { 144930, true }, - { 144949, false }, - { 144968, true }, - { 144981, true }, - { 144994, true }, - { 145018, true }, - { 145029, true }, - { 145048, true }, - { 145065, true }, - { 145078, true }, - { 145106, true }, - { 145119, true }, - { 145136, true }, - { 145156, true }, - { 145167, true }, - { 145180, true }, - { 145195, true }, - { 145215, true }, - { 145229, true }, - { 145242, true }, - { 145263, false }, - { 145274, true }, - { 145293, true }, - { 145312, true }, - { 145323, false }, - { 145341, true }, - { 145353, true }, - { 145364, true }, - { 145394, true }, - { 145405, true }, - { 145419, true }, - { 145433, true }, - { 145445, true }, - { 145459, true }, - { 145479, true }, - { 145502, true }, - { 145517, true }, - { 145528, true }, - { 145552, true }, - { 145573, true }, - { 145586, true }, - { 145603, true }, - { 145621, true }, - { 145637, true }, - { 145655, true }, - { 145669, true }, - { 145691, true }, - { 145708, true }, - { 145722, true }, - { 145738, true }, - { 145754, true }, - { 145774, true }, - { 145785, true }, - { 145801, true }, - { 145816, true }, + { 144312, true }, + { 144325, true }, + { 144336, true }, + { 144347, true }, + { 144372, true }, + { 144384, true }, + { 144393, false }, + { 144409, true }, + { 144419, false }, + { 144441, true }, + { 144456, true }, + { 144470, true }, + { 144483, true }, + { 144500, true }, + { 144516, true }, + { 144539, true }, + { 144561, true }, + { 144579, true }, + { 144598, false }, + { 144617, true }, + { 144630, true }, + { 144643, true }, + { 144667, true }, + { 144678, true }, + { 144697, true }, + { 144714, true }, + { 144727, true }, + { 144755, true }, + { 144768, true }, + { 144785, true }, + { 144805, true }, + { 144816, true }, + { 144829, true }, + { 144844, true }, + { 144864, true }, + { 144878, true }, + { 144891, true }, + { 144912, false }, + { 144923, true }, + { 144942, true }, + { 144961, true }, + { 144972, false }, + { 144990, true }, + { 145002, true }, + { 145013, true }, + { 145043, true }, + { 145054, true }, + { 145068, true }, + { 145082, true }, + { 145094, true }, + { 145108, true }, + { 145128, true }, + { 145151, true }, + { 145166, true }, + { 145177, true }, + { 145201, true }, + { 145222, true }, + { 145235, true }, + { 145252, true }, + { 145270, true }, + { 145286, true }, + { 145304, true }, + { 145318, true }, + { 145340, true }, + { 145357, true }, + { 145371, true }, + { 145387, true }, + { 145403, true }, + { 145423, true }, + { 145434, true }, + { 145450, true }, + { 145465, true }, + { 145482, true }, + { 145505, true }, + { 145521, true }, + { 145540, true }, + { 145555, true }, + { 145570, true }, + { 145584, true }, + { 145601, true }, + { 145617, true }, + { 145634, true }, + { 145653, true }, + { 145668, true }, + { 145679, true }, + { 145695, true }, + { 145711, true }, + { 145728, true }, + { 145740, true }, + { 145760, true }, + { 145775, true }, + { 145794, true }, + { 145810, true }, + { 145820, true }, { 145833, true }, - { 145856, true }, - { 145872, true }, - { 145891, true }, - { 145906, true }, - { 145921, true }, - { 145932, true }, - { 145946, true }, - { 145963, true }, - { 145979, true }, - { 145996, true }, - { 146015, true }, - { 146030, true }, - { 146041, true }, - { 146057, true }, - { 146073, true }, - { 146090, true }, - { 146102, true }, - { 146122, true }, - { 146137, true }, - { 146156, true }, - { 146172, true }, + { 145852, true }, + { 145868, true }, + { 145888, true }, + { 145900, true }, + { 145917, true }, + { 145929, true }, + { 145942, true }, + { 145952, true }, + { 145969, true }, + { 145981, false }, + { 145991, true }, + { 146004, true }, + { 146021, true }, + { 146044, true }, + { 146061, false }, + { 146076, true }, + { 146095, true }, + { 146120, true }, + { 146153, true }, + { 146163, true }, { 146182, true }, - { 146195, true }, - { 146214, true }, - { 146230, true }, - { 146250, true }, - { 146262, true }, - { 146279, true }, - { 146291, true }, - { 146304, true }, - { 146314, true }, - { 146331, false }, - { 146341, true }, - { 146354, true }, - { 146371, true }, - { 146394, true }, - { 146411, false }, - { 146426, true }, - { 146445, true }, - { 146470, true }, - { 146503, true }, - { 146513, true }, - { 146532, true }, - { 146546, true }, - { 146559, true }, - { 146575, true }, - { 146594, true }, - { 146624, false }, - { 146647, true }, - { 146661, true }, - { 146675, true }, - { 146687, true }, - { 146702, true }, - { 146722, true }, - { 146736, true }, - { 146748, true }, - { 146768, true }, - { 146786, true }, - { 146797, true }, - { 146812, true }, - { 146825, true }, - { 146838, true }, + { 146196, true }, + { 146209, true }, + { 146225, true }, + { 146244, true }, + { 146274, false }, + { 146297, true }, + { 146311, true }, + { 146325, true }, + { 146337, true }, + { 146352, true }, + { 146372, true }, + { 146386, true }, + { 146398, true }, + { 146418, true }, + { 146436, true }, + { 146447, true }, + { 146462, true }, + { 146475, true }, + { 146488, true }, + { 146501, true }, + { 146512, true }, + { 146527, true }, + { 146538, true }, + { 146554, true }, + { 146568, true }, + { 146580, true }, + { 146597, true }, + { 146611, true }, + { 146619, true }, + { 146638, true }, + { 146652, true }, + { 146674, true }, + { 146691, true }, + { 146700, true }, + { 146713, true }, + { 146723, false }, + { 146735, true }, + { 146746, true }, + { 146756, true }, + { 146779, true }, + { 146793, true }, + { 146808, true }, + { 146832, true }, { 146851, true }, - { 146862, true }, - { 146877, true }, - { 146888, true }, - { 146904, true }, - { 146918, true }, - { 146930, true }, - { 146947, true }, - { 146961, true }, - { 146969, true }, - { 146988, true }, - { 147002, true }, - { 147024, true }, - { 147041, true }, - { 147050, true }, + { 146865, true }, + { 146879, true }, + { 146900, true }, + { 146919, true }, + { 146928, true }, + { 146938, true }, + { 146954, true }, + { 146971, true }, + { 146984, true }, + { 147001, true }, + { 147017, true }, + { 147036, true }, + { 147049, true }, { 147063, true }, - { 147073, false }, - { 147085, true }, - { 147096, true }, - { 147106, true }, - { 147129, true }, - { 147143, true }, - { 147158, true }, - { 147182, true }, - { 147201, true }, - { 147215, true }, - { 147229, true }, - { 147250, true }, - { 147269, true }, - { 147278, true }, - { 147288, true }, - { 147304, true }, - { 147321, true }, - { 147334, true }, - { 147351, true }, - { 147367, true }, - { 147386, true }, - { 147399, true }, - { 147413, true }, - { 147426, true }, + { 147076, true }, + { 147087, true }, + { 147095, true }, + { 147111, true }, + { 147127, true }, + { 147147, true }, + { 147165, true }, + { 147179, true }, + { 147199, true }, + { 147215, false }, + { 147232, true }, + { 147251, true }, + { 147268, true }, + { 147282, true }, + { 147303, true }, + { 147322, true }, + { 147340, true }, + { 147353, true }, + { 147363, true }, + { 147381, true }, + { 147394, true }, + { 147414, true }, + { 147423, true }, { 147437, true }, - { 147445, true }, - { 147461, true }, + { 147454, true }, { 147477, true }, - { 147497, true }, - { 147515, true }, - { 147529, true }, - { 147549, true }, - { 147565, false }, - { 147582, true }, - { 147601, true }, - { 147618, true }, - { 147632, true }, - { 147653, true }, - { 147672, true }, - { 147690, true }, - { 147703, true }, + { 147498, true }, + { 147507, true }, + { 147523, true }, + { 147541, true }, + { 147553, true }, + { 147566, true }, + { 147579, true }, + { 147595, true }, + { 147603, false }, + { 147615, true }, + { 147625, true }, + { 147639, true }, + { 147654, true }, + { 147664, true }, + { 147683, true }, + { 147698, true }, { 147713, true }, - { 147731, true }, - { 147744, true }, - { 147764, true }, + { 147732, true }, + { 147754, true }, { 147773, true }, { 147787, true }, - { 147804, true }, - { 147827, true }, + { 147799, true }, + { 147813, true }, + { 147826, false }, { 147848, true }, - { 147857, true }, - { 147873, true }, - { 147891, true }, - { 147903, true }, - { 147916, true }, - { 147929, true }, - { 147945, true }, - { 147953, false }, - { 147965, true }, - { 147975, true }, - { 147989, true }, - { 148004, true }, - { 148014, true }, - { 148033, true }, - { 148048, true }, - { 148063, true }, - { 148082, true }, - { 148104, true }, - { 148123, true }, - { 148137, true }, - { 148149, true }, - { 148163, true }, - { 148176, false }, - { 148198, true }, + { 147865, true }, + { 147883, true }, + { 147900, true }, + { 147913, true }, + { 147921, true }, + { 147932, true }, + { 147946, true }, + { 147958, false }, + { 147978, true }, + { 147995, true }, + { 148003, true }, + { 148014, false }, + { 148023, false }, + { 148039, true }, + { 148054, false }, + { 148072, true }, + { 148085, true }, + { 148095, true }, + { 148106, false }, + { 148121, true }, + { 148130, true }, + { 148142, true }, + { 148151, true }, + { 148164, true }, + { 148177, true }, + { 148188, true }, + { 148202, true }, { 148215, true }, - { 148233, true }, - { 148250, true }, - { 148263, true }, - { 148271, true }, - { 148282, true }, - { 148296, true }, - { 148308, false }, - { 148328, true }, - { 148345, true }, + { 148232, false }, + { 148249, true }, + { 148256, true }, + { 148264, true }, + { 148273, true }, + { 148285, true }, + { 148308, true }, + { 148322, true }, + { 148336, true }, { 148353, true }, - { 148364, false }, - { 148373, false }, - { 148389, true }, - { 148404, false }, - { 148422, true }, - { 148435, true }, - { 148445, true }, - { 148456, false }, + { 148364, true }, + { 148378, false }, + { 148394, false }, + { 148408, true }, + { 148415, true }, + { 148425, true }, + { 148436, true }, + { 148451, true }, + { 148463, true }, { 148471, true }, - { 148480, true }, - { 148492, true }, - { 148501, true }, - { 148514, true }, - { 148527, true }, - { 148538, true }, - { 148552, true }, - { 148565, true }, - { 148582, false }, - { 148599, true }, - { 148606, true }, - { 148614, true }, - { 148623, true }, - { 148635, true }, - { 148658, true }, - { 148672, true }, - { 148686, true }, - { 148703, true }, - { 148714, true }, - { 148728, false }, - { 148744, false }, - { 148758, true }, - { 148765, true }, - { 148775, true }, - { 148786, true }, - { 148801, true }, - { 148813, true }, - { 148821, true }, - { 148833, true }, - { 148848, false }, - { 148858, true }, - { 148870, true }, + { 148483, true }, + { 148498, false }, + { 148508, true }, + { 148520, true }, + { 148532, true }, + { 148544, true }, + { 148559, true }, + { 148588, true }, + { 148596, true }, + { 148604, true }, + { 148613, true }, + { 148626, true }, + { 148634, true }, + { 148644, true }, + { 148655, true }, + { 148666, true }, + { 148673, true }, + { 148682, true }, + { 148692, true }, + { 148712, true }, + { 148724, true }, + { 148736, true }, + { 148745, false }, + { 148754, true }, + { 148777, true }, + { 148797, false }, + { 148818, true }, + { 148829, true }, + { 148842, true }, + { 148851, true }, + { 148865, true }, { 148882, true }, - { 148894, true }, - { 148909, true }, - { 148938, true }, - { 148946, true }, - { 148954, true }, - { 148963, true }, - { 148976, true }, - { 148984, true }, - { 148994, true }, - { 149005, true }, - { 149016, true }, - { 149023, true }, - { 149032, true }, - { 149042, true }, - { 149062, true }, - { 149074, true }, - { 149086, true }, - { 149095, false }, - { 149104, true }, - { 149127, true }, - { 149147, false }, - { 149168, true }, - { 149179, true }, - { 149192, true }, - { 149201, true }, - { 149215, true }, - { 149232, true }, - { 149248, true }, - { 149266, true }, - { 149280, true }, - { 149297, true }, - { 149309, true }, - { 149322, true }, - { 149336, true }, - { 149354, true }, - { 149368, true }, - { 149384, false }, - { 149402, true }, - { 149419, true }, - { 149441, true }, - { 149464, true }, - { 149475, true }, - { 149486, true }, - { 149500, true }, - { 149516, true }, - { 149527, true }, - { 149538, true }, - { 149550, true }, - { 149564, true }, - { 149575, true }, - { 149587, true }, - { 149603, true }, - { 149632, false }, - { 149651, true }, - { 149667, true }, - { 149693, true }, - { 149707, true }, - { 149724, true }, - { 149743, true }, - { 149760, true }, - { 149776, true }, - { 149787, true }, - { 149795, true }, - { 149807, true }, + { 148898, true }, + { 148916, true }, + { 148930, true }, + { 148947, true }, + { 148959, true }, + { 148972, true }, + { 148986, true }, + { 149004, true }, + { 149018, true }, + { 149034, false }, + { 149052, true }, + { 149069, true }, + { 149091, true }, + { 149114, true }, + { 149125, true }, + { 149136, true }, + { 149150, true }, + { 149166, true }, + { 149177, true }, + { 149188, true }, + { 149200, true }, + { 149214, true }, + { 149225, true }, + { 149237, true }, + { 149253, true }, + { 149282, false }, + { 149301, true }, + { 149317, true }, + { 149343, true }, + { 149357, true }, + { 149374, true }, + { 149393, true }, + { 149410, true }, + { 149426, true }, + { 149437, true }, + { 149445, true }, + { 149457, true }, + { 149474, true }, + { 149487, true }, + { 149502, true }, + { 149515, true }, + { 149529, true }, + { 149541, true }, + { 149553, true }, + { 149567, true }, + { 149584, true }, + { 149597, true }, + { 149612, true }, + { 149625, true }, + { 149637, true }, + { 149648, true }, + { 149671, true }, + { 149689, true }, + { 149708, true }, + { 149734, true }, + { 149751, true }, + { 149779, true }, + { 149792, true }, + { 149806, true }, { 149824, true }, - { 149837, true }, - { 149852, true }, - { 149865, true }, - { 149879, true }, + { 149841, true }, + { 149858, true }, + { 149869, true }, { 149891, true }, - { 149903, true }, - { 149917, true }, - { 149934, true }, - { 149947, true }, - { 149962, true }, + { 149913, true }, + { 149925, true }, + { 149933, true }, + { 149954, true }, { 149975, true }, - { 149987, true }, - { 149998, true }, - { 150021, true }, - { 150039, true }, - { 150058, true }, - { 150084, true }, - { 150101, true }, - { 150129, true }, - { 150142, true }, - { 150156, true }, - { 150174, true }, - { 150191, true }, - { 150208, true }, - { 150219, true }, - { 150241, true }, - { 150263, true }, - { 150275, true }, - { 150283, true }, - { 150304, true }, - { 150325, true }, - { 150346, true }, - { 150364, true }, - { 150380, true }, - { 150392, true }, - { 150407, true }, - { 150419, true }, - { 150437, true }, + { 149996, true }, + { 150014, true }, + { 150030, true }, + { 150042, true }, + { 150057, true }, + { 150069, true }, + { 150087, true }, + { 150100, true }, + { 150110, true }, + { 150124, true }, + { 150140, true }, + { 150166, false }, + { 150195, true }, + { 150206, true }, + { 150221, true }, + { 150237, true }, + { 150252, true }, + { 150281, true }, + { 150294, true }, + { 150313, true }, + { 150322, true }, + { 150336, true }, + { 150352, true }, + { 150379, true }, + { 150397, true }, + { 150424, true }, { 150450, true }, - { 150460, true }, - { 150474, true }, - { 150490, true }, - { 150516, false }, + { 150467, false }, + { 150478, true }, + { 150488, true }, + { 150503, true }, + { 150514, true }, + { 150532, true }, { 150545, true }, { 150556, true }, - { 150571, true }, - { 150587, true }, - { 150602, true }, - { 150631, true }, - { 150644, true }, - { 150663, true }, - { 150672, true }, - { 150686, true }, - { 150702, true }, - { 150729, true }, - { 150747, true }, - { 150774, true }, - { 150800, true }, - { 150817, false }, - { 150828, true }, - { 150838, true }, - { 150853, true }, - { 150864, true }, - { 150882, true }, - { 150895, true }, - { 150906, true }, - { 150928, true }, - { 150947, true }, - { 150961, true }, - { 150973, false }, - { 150993, true }, - { 151003, true }, - { 151017, true }, - { 151035, true }, - { 151049, true }, - { 151062, true }, - { 151074, true }, - { 151084, true }, + { 150578, true }, + { 150597, true }, + { 150611, true }, + { 150623, false }, + { 150643, true }, + { 150653, true }, + { 150667, true }, + { 150685, true }, + { 150699, true }, + { 150712, true }, + { 150724, true }, + { 150734, true }, + { 150746, true }, + { 150754, true }, + { 150768, true }, + { 150785, true }, + { 150799, true }, + { 150820, true }, + { 150832, true }, + { 150850, true }, + { 150866, true }, + { 150878, true }, + { 150890, true }, + { 150902, true }, + { 150914, true }, + { 150926, true }, + { 150938, true }, + { 150950, true }, + { 150962, false }, + { 150982, true }, + { 150995, true }, + { 151004, true }, + { 151018, true }, + { 151034, true }, + { 151047, true }, + { 151060, true }, + { 151083, true }, { 151096, true }, { 151104, true }, - { 151118, true }, - { 151135, true }, - { 151149, true }, + { 151119, true }, + { 151129, true }, + { 151147, true }, + { 151161, true }, { 151170, true }, - { 151182, true }, - { 151200, true }, - { 151216, true }, - { 151228, true }, - { 151240, true }, - { 151252, true }, - { 151264, true }, - { 151276, true }, - { 151288, true }, - { 151300, true }, - { 151312, false }, - { 151332, true }, - { 151345, true }, - { 151354, true }, - { 151368, true }, - { 151384, true }, - { 151397, true }, - { 151410, true }, - { 151433, true }, - { 151446, true }, - { 151454, true }, - { 151469, true }, - { 151479, true }, - { 151497, true }, - { 151511, true }, - { 151525, true }, - { 151534, true }, - { 151547, true }, - { 151563, true }, - { 151578, true }, - { 151594, true }, - { 151606, true }, - { 151617, true }, - { 151626, true }, - { 151633, true }, - { 151648, true }, - { 151663, true }, - { 151675, true }, - { 151693, true }, - { 151715, true }, - { 151734, true }, - { 151753, true }, - { 151770, true }, - { 151792, true }, - { 151812, true }, + { 151183, true }, + { 151199, true }, + { 151214, true }, + { 151230, true }, + { 151242, true }, + { 151253, true }, + { 151262, true }, + { 151269, true }, + { 151284, true }, + { 151299, true }, + { 151311, true }, + { 151329, true }, + { 151351, true }, + { 151370, true }, + { 151389, true }, + { 151406, true }, + { 151428, true }, + { 151448, true }, + { 151467, true }, + { 151484, true }, + { 151502, true }, + { 151520, true }, + { 151537, true }, + { 151555, true }, + { 151577, true }, + { 151591, true }, + { 151608, true }, + { 151624, true }, + { 151641, true }, + { 151658, true }, + { 151679, true }, + { 151694, true }, + { 151716, true }, + { 151740, true }, + { 151757, true }, + { 151768, true }, + { 151781, true }, + { 151794, true }, + { 151806, true }, + { 151816, true }, { 151831, true }, - { 151848, true }, - { 151866, true }, - { 151884, true }, - { 151901, true }, - { 151919, true }, - { 151941, true }, - { 151955, true }, - { 151972, true }, - { 151988, true }, - { 152005, true }, - { 152022, true }, - { 152043, true }, - { 152058, true }, - { 152080, true }, - { 152104, true }, - { 152121, true }, - { 152132, true }, + { 151842, true }, + { 151854, true }, + { 151874, true }, + { 151883, true }, + { 151892, true }, + { 151917, true }, + { 151929, true }, + { 151947, true }, + { 151963, true }, + { 151974, true }, + { 151990, true }, + { 152013, true }, + { 152034, true }, + { 152047, true }, + { 152065, true }, + { 152084, true }, + { 152093, false }, + { 152107, true }, + { 152118, true }, + { 152131, true }, { 152145, true }, - { 152158, true }, - { 152170, true }, - { 152180, true }, - { 152195, true }, - { 152206, true }, - { 152218, true }, - { 152238, true }, - { 152247, true }, - { 152256, true }, - { 152281, true }, - { 152293, true }, - { 152311, true }, - { 152327, true }, - { 152338, true }, - { 152354, true }, - { 152377, true }, - { 152398, true }, - { 152411, true }, - { 152429, true }, - { 152448, true }, - { 152457, false }, - { 152471, true }, - { 152482, true }, - { 152495, true }, - { 152509, true }, - { 152524, true }, - { 152535, true }, - { 152551, true }, + { 152160, true }, + { 152171, true }, + { 152187, true }, + { 152200, true }, + { 152209, true }, + { 152223, true }, + { 152236, true }, + { 152250, true }, + { 152263, true }, + { 152274, true }, + { 152282, true }, + { 152295, true }, + { 152307, true }, + { 152320, true }, + { 152332, true }, + { 152342, true }, + { 152356, true }, + { 152370, true }, + { 152379, true }, + { 152394, true }, + { 152405, true }, + { 152418, true }, + { 152431, true }, + { 152450, true }, + { 152461, true }, + { 152474, true }, + { 152488, true }, + { 152506, true }, + { 152519, true }, + { 152531, true }, + { 152546, true }, { 152564, true }, - { 152573, true }, - { 152587, true }, - { 152600, true }, - { 152614, true }, - { 152627, true }, - { 152638, true }, - { 152646, true }, - { 152659, true }, - { 152671, true }, - { 152684, true }, - { 152696, true }, - { 152706, true }, - { 152720, true }, - { 152734, true }, - { 152743, true }, - { 152758, true }, - { 152769, true }, - { 152782, true }, - { 152795, true }, - { 152814, true }, - { 152825, true }, - { 152838, true }, - { 152852, true }, - { 152870, true }, - { 152883, true }, - { 152895, true }, - { 152910, true }, - { 152928, true }, - { 152944, true }, - { 152956, true }, + { 152580, true }, + { 152592, true }, + { 152605, true }, + { 152620, true }, + { 152630, true }, + { 152640, true }, + { 152657, true }, + { 152668, true }, + { 152682, true }, + { 152693, true }, + { 152705, true }, + { 152732, true }, + { 152746, true }, + { 152754, true }, + { 152776, true }, + { 152790, true }, + { 152804, true }, + { 152815, true }, + { 152834, true }, + { 152853, true }, + { 152872, true }, + { 152891, true }, + { 152911, true }, + { 152931, true }, + { 152951, true }, { 152969, true }, - { 152984, true }, - { 152994, true }, - { 153004, true }, - { 153021, true }, - { 153032, true }, - { 153046, true }, - { 153057, true }, - { 153069, true }, - { 153096, true }, - { 153110, true }, - { 153118, true }, - { 153140, true }, + { 152988, true }, + { 153007, true }, + { 153026, true }, + { 153045, true }, + { 153059, true }, + { 153072, true }, + { 153084, true }, + { 153097, false }, + { 153119, true }, + { 153134, true }, + { 153146, true }, { 153154, true }, - { 153168, true }, { 153179, true }, - { 153198, true }, - { 153217, true }, - { 153236, true }, - { 153255, true }, - { 153275, true }, - { 153295, true }, - { 153315, true }, + { 153195, true }, + { 153204, true }, + { 153218, true }, + { 153229, true }, + { 153241, true }, + { 153258, true }, + { 153271, true }, + { 153286, true }, + { 153302, true }, + { 153320, true }, { 153333, true }, - { 153352, true }, - { 153371, true }, - { 153390, true }, - { 153409, true }, - { 153423, true }, - { 153436, true }, - { 153448, true }, - { 153461, false }, - { 153483, true }, - { 153498, true }, - { 153510, true }, - { 153518, true }, - { 153543, true }, - { 153559, true }, - { 153568, true }, - { 153582, true }, - { 153593, true }, - { 153605, true }, - { 153622, true }, - { 153635, true }, - { 153650, true }, - { 153666, true }, - { 153684, true }, - { 153697, true }, + { 153357, true }, + { 153380, true }, + { 153406, true }, + { 153418, true }, + { 153432, true }, + { 153447, true }, + { 153460, true }, + { 153471, true }, + { 153485, true }, + { 153500, true }, + { 153509, true }, + { 153522, true }, + { 153538, true }, + { 153557, true }, + { 153571, true }, + { 153586, true }, + { 153597, true }, + { 153607, true }, + { 153619, true }, + { 153634, true }, + { 153651, true }, + { 153675, true }, + { 153706, true }, { 153721, true }, - { 153744, true }, - { 153770, true }, - { 153782, true }, - { 153796, true }, - { 153811, true }, + { 153739, true }, + { 153760, true }, + { 153774, true }, + { 153792, true }, + { 153802, true }, + { 153814, true }, { 153824, true }, - { 153835, true }, - { 153849, true }, - { 153864, true }, - { 153873, true }, + { 153833, true }, + { 153846, true }, + { 153861, true }, + { 153874, true }, { 153886, true }, - { 153902, true }, - { 153921, true }, - { 153935, true }, - { 153950, true }, - { 153961, true }, - { 153971, true }, - { 153983, true }, - { 153998, true }, - { 154015, true }, - { 154039, true }, - { 154070, true }, - { 154085, true }, - { 154103, true }, - { 154124, true }, - { 154138, true }, - { 154156, true }, - { 154166, true }, - { 154178, true }, - { 154188, true }, - { 154197, true }, - { 154210, true }, + { 153894, true }, + { 153912, true }, + { 153943, true }, + { 153954, true }, + { 153969, true }, + { 153986, true }, + { 154001, true }, + { 154014, true }, + { 154030, true }, + { 154050, true }, + { 154065, true }, + { 154081, true }, + { 154094, true }, + { 154108, true }, + { 154116, true }, + { 154129, true }, + { 154139, true }, + { 154153, true }, + { 154163, true }, + { 154183, true }, + { 154192, true }, + { 154201, true }, + { 154215, true }, { 154225, true }, - { 154238, true }, - { 154250, true }, - { 154258, true }, - { 154276, true }, - { 154307, true }, - { 154318, true }, - { 154333, true }, - { 154350, true }, - { 154365, true }, - { 154378, true }, + { 154236, true }, + { 154245, true }, + { 154253, true }, + { 154266, true }, + { 154285, true }, + { 154295, true }, + { 154304, true }, + { 154320, true }, + { 154331, true }, + { 154344, true }, + { 154351, true }, + { 154360, true }, + { 154376, true }, + { 154387, true }, { 154394, true }, - { 154414, true }, - { 154429, true }, - { 154445, true }, - { 154458, true }, - { 154472, true }, - { 154480, true }, - { 154493, true }, - { 154503, true }, - { 154517, true }, - { 154527, true }, - { 154547, true }, - { 154556, true }, - { 154565, true }, - { 154579, true }, - { 154589, true }, + { 154417, true }, + { 154426, true }, + { 154446, true }, + { 154454, true }, + { 154464, true }, + { 154485, true }, + { 154497, true }, + { 154506, true }, + { 154514, true }, + { 154523, true }, + { 154534, true }, + { 154545, true }, + { 154555, true }, + { 154566, true }, + { 154573, true }, + { 154583, true }, + { 154592, true }, { 154600, true }, - { 154609, true }, - { 154617, true }, - { 154630, true }, - { 154649, true }, - { 154659, true }, - { 154668, true }, - { 154684, true }, - { 154695, true }, - { 154708, true }, - { 154715, true }, - { 154724, true }, - { 154740, true }, - { 154751, true }, - { 154758, true }, - { 154781, true }, - { 154790, true }, - { 154810, true }, - { 154818, true }, - { 154828, true }, - { 154849, true }, - { 154861, true }, - { 154870, true }, + { 154611, true }, + { 154623, true }, + { 154631, true }, + { 154641, true }, + { 154657, true }, + { 154669, true }, + { 154699, true }, + { 154719, true }, + { 154733, false }, + { 154751, false }, + { 154767, true }, + { 154782, true }, + { 154798, true }, + { 154813, true }, + { 154834, true }, + { 154848, true }, + { 154867, true }, { 154878, true }, - { 154887, true }, - { 154898, true }, - { 154909, true }, - { 154919, true }, - { 154930, true }, - { 154937, true }, - { 154947, true }, + { 154888, true }, + { 154906, true }, + { 154917, true }, + { 154928, true }, + { 154942, true }, { 154956, true }, - { 154964, true }, - { 154975, true }, - { 154987, true }, - { 154995, true }, - { 155005, true }, - { 155021, true }, - { 155033, true }, - { 155063, true }, - { 155083, true }, - { 155097, false }, - { 155115, false }, - { 155131, true }, - { 155146, true }, - { 155162, true }, - { 155177, true }, - { 155198, true }, - { 155212, true }, - { 155231, true }, - { 155242, true }, - { 155252, true }, - { 155270, true }, - { 155281, true }, + { 154970, true }, + { 154985, true }, + { 155018, true }, + { 155038, true }, + { 155054, true }, + { 155067, true }, + { 155087, false }, + { 155103, true }, + { 155117, true }, + { 155136, true }, + { 155151, true }, + { 155166, true }, + { 155192, true }, + { 155209, true }, + { 155222, true }, + { 155238, true }, + { 155246, true }, + { 155253, true }, + { 155265, true }, + { 155277, true }, { 155292, true }, - { 155306, true }, - { 155320, true }, - { 155334, true }, - { 155349, true }, - { 155382, true }, - { 155402, true }, - { 155418, true }, - { 155431, true }, - { 155451, false }, - { 155467, true }, - { 155481, true }, - { 155500, true }, - { 155515, true }, + { 155304, true }, + { 155315, true }, + { 155326, true }, + { 155346, true }, + { 155357, false }, + { 155375, true }, + { 155388, true }, + { 155399, true }, + { 155409, true }, + { 155423, true }, + { 155435, false }, + { 155451, true }, + { 155462, true }, + { 155471, true }, + { 155484, true }, + { 155492, true }, + { 155502, true }, + { 155519, true }, { 155530, true }, - { 155556, true }, - { 155573, true }, - { 155586, true }, - { 155602, true }, - { 155610, true }, - { 155617, true }, - { 155629, true }, - { 155641, true }, - { 155656, true }, + { 155546, true }, + { 155557, true }, + { 155569, true }, + { 155579, false }, + { 155594, true }, + { 155609, true }, + { 155618, true }, + { 155633, true }, + { 155652, true }, { 155668, true }, - { 155679, true }, - { 155690, true }, - { 155710, true }, - { 155730, true }, - { 155741, false }, - { 155759, true }, - { 155772, true }, - { 155783, true }, - { 155793, true }, - { 155807, true }, - { 155819, false }, - { 155835, true }, - { 155846, true }, - { 155855, true }, - { 155868, true }, + { 155680, true }, + { 155695, true }, + { 155715, true }, + { 155726, true }, + { 155740, true }, + { 155756, true }, + { 155767, true }, + { 155789, true }, + { 155810, true }, + { 155823, true }, + { 155842, true }, + { 155854, true }, + { 155867, true }, { 155876, true }, - { 155886, true }, - { 155903, true }, - { 155914, true }, + { 155891, true }, + { 155905, true }, + { 155918, true }, { 155930, true }, - { 155941, true }, - { 155953, true }, - { 155963, false }, - { 155978, true }, - { 155993, true }, - { 156002, true }, - { 156017, true }, - { 156036, true }, - { 156052, true }, - { 156064, true }, - { 156079, true }, - { 156099, true }, - { 156110, true }, - { 156124, true }, - { 156140, true }, - { 156151, true }, - { 156173, true }, - { 156194, true }, - { 156207, true }, - { 156226, true }, - { 156238, true }, - { 156251, true }, - { 156260, true }, - { 156275, true }, - { 156289, true }, - { 156302, true }, - { 156314, true }, - { 156331, true }, - { 156355, true }, - { 156376, true }, - { 156389, true }, - { 156407, true }, - { 156428, true }, - { 156445, true }, - { 156457, true }, + { 155947, true }, + { 155971, true }, + { 155992, true }, + { 156005, true }, + { 156023, true }, + { 156044, true }, + { 156061, true }, + { 156073, true }, + { 156090, true }, + { 156107, true }, + { 156119, true }, + { 156137, true }, + { 156150, true }, + { 156157, true }, + { 156169, true }, + { 156179, true }, + { 156193, true }, + { 156206, true }, + { 156219, true }, + { 156233, true }, + { 156246, true }, + { 156263, true }, + { 156278, true }, + { 156292, true }, + { 156304, true }, + { 156317, true }, + { 156337, true }, + { 156357, true }, + { 156372, true }, + { 156387, true }, + { 156402, true }, + { 156421, true }, + { 156440, true }, + { 156459, true }, { 156474, true }, - { 156491, true }, - { 156503, true }, - { 156521, true }, - { 156534, true }, - { 156549, true }, - { 156556, true }, - { 156568, true }, - { 156578, true }, - { 156592, true }, - { 156605, true }, - { 156618, true }, - { 156632, true }, - { 156645, true }, - { 156662, true }, - { 156677, true }, - { 156691, true }, - { 156703, true }, - { 156716, true }, - { 156736, true }, - { 156756, true }, - { 156771, true }, - { 156786, true }, - { 156801, true }, - { 156820, true }, - { 156839, true }, - { 156858, true }, - { 156873, true }, - { 156884, true }, - { 156897, false }, - { 156910, true }, - { 156925, true }, - { 156939, true }, - { 156950, true }, + { 156485, true }, + { 156498, false }, + { 156511, true }, + { 156526, true }, + { 156540, true }, + { 156551, true }, + { 156566, true }, + { 156582, true }, + { 156595, true }, + { 156608, true }, + { 156628, true }, + { 156637, true }, + { 156653, true }, + { 156666, true }, + { 156682, true }, + { 156695, true }, + { 156712, true }, + { 156727, true }, + { 156741, true }, + { 156751, true }, + { 156764, true }, + { 156777, true }, + { 156795, true }, + { 156803, false }, + { 156816, true }, + { 156834, true }, + { 156857, true }, + { 156886, true }, + { 156904, true }, + { 156935, true }, { 156965, true }, - { 156981, true }, - { 156994, true }, - { 157007, true }, + { 156987, true }, + { 157003, true }, + { 157014, false }, { 157027, true }, - { 157036, true }, - { 157052, true }, - { 157065, true }, - { 157081, true }, - { 157094, true }, - { 157111, true }, - { 157126, true }, + { 157039, true }, + { 157054, true }, + { 157071, false }, + { 157090, true }, + { 157109, true }, + { 157120, true }, + { 157130, true }, { 157140, true }, - { 157150, true }, - { 157163, true }, - { 157176, true }, - { 157194, true }, - { 157202, false }, - { 157215, true }, - { 157233, true }, + { 157155, true }, + { 157169, true }, + { 157180, true }, + { 157190, true }, + { 157200, true }, + { 157212, true }, + { 157228, true }, + { 157239, true }, { 157256, true }, - { 157285, true }, + { 157269, true }, + { 157282, true }, + { 157292, true }, { 157303, true }, - { 157334, true }, - { 157364, true }, - { 157386, true }, - { 157402, true }, - { 157413, false }, - { 157426, true }, + { 157313, false }, + { 157328, true }, + { 157343, true }, + { 157360, true }, + { 157375, true }, + { 157385, false }, + { 157398, true }, + { 157411, true }, + { 157421, true }, { 157438, true }, - { 157453, true }, - { 157470, false }, + { 157450, true }, + { 157464, true }, + { 157475, true }, { 157489, true }, - { 157508, true }, - { 157519, true }, - { 157529, true }, + { 157500, true }, + { 157517, true }, + { 157530, true }, { 157539, true }, - { 157554, true }, - { 157568, true }, - { 157579, true }, - { 157589, true }, - { 157599, true }, - { 157611, true }, - { 157627, true }, - { 157638, true }, - { 157655, true }, - { 157668, true }, - { 157681, true }, - { 157691, true }, - { 157702, true }, - { 157712, false }, - { 157727, true }, - { 157742, true }, - { 157759, true }, - { 157774, true }, - { 157784, false }, - { 157797, true }, - { 157810, true }, - { 157820, true }, + { 157550, true }, + { 157560, true }, + { 157574, true }, + { 157585, true }, + { 157594, true }, + { 157608, true }, + { 157618, true }, + { 157628, true }, + { 157644, true }, + { 157652, true }, + { 157663, true }, + { 157675, true }, + { 157685, true }, + { 157694, true }, + { 157707, true }, + { 157718, false }, + { 157726, true }, + { 157744, true }, + { 157751, true }, + { 157762, false }, + { 157782, true }, + { 157789, false }, + { 157805, true }, + { 157821, true }, { 157837, true }, - { 157849, true }, - { 157863, true }, - { 157874, true }, - { 157888, true }, - { 157899, true }, - { 157916, true }, - { 157929, true }, - { 157938, true }, + { 157852, true }, + { 157864, true }, + { 157884, true }, + { 157898, true }, + { 157910, true }, + { 157926, true }, + { 157936, true }, { 157949, true }, - { 157959, true }, - { 157973, true }, - { 157984, true }, - { 157993, true }, - { 158007, true }, + { 157967, true }, + { 157981, true }, + { 157998, true }, { 158017, true }, - { 158027, true }, - { 158043, true }, - { 158051, true }, - { 158062, true }, - { 158074, true }, - { 158084, true }, - { 158093, true }, - { 158106, true }, - { 158117, false }, - { 158125, true }, - { 158143, true }, - { 158150, true }, - { 158161, false }, - { 158181, true }, - { 158188, false }, - { 158204, true }, - { 158220, true }, - { 158236, true }, - { 158251, true }, - { 158263, true }, - { 158283, true }, - { 158297, true }, - { 158309, true }, - { 158325, true }, - { 158335, true }, - { 158348, true }, - { 158366, true }, - { 158380, true }, - { 158397, true }, - { 158416, true }, - { 158432, true }, - { 158451, true }, - { 158474, true }, - { 158486, true }, - { 158498, true }, - { 158511, true }, - { 158533, true }, - { 158547, true }, - { 158558, true }, - { 158568, true }, - { 158579, true }, - { 158596, true }, - { 158611, true }, - { 158620, true }, - { 158629, true }, - { 158637, true }, - { 158654, true }, - { 158668, true }, - { 158684, true }, - { 158706, true }, - { 158722, true }, - { 158736, true }, - { 158744, true }, - { 158761, true }, - { 158778, true }, - { 158792, true }, - { 158811, true }, - { 158827, false }, - { 158841, true }, - { 158854, true }, + { 158033, true }, + { 158052, true }, + { 158075, true }, + { 158087, true }, + { 158099, true }, + { 158112, true }, + { 158134, true }, + { 158148, true }, + { 158159, true }, + { 158169, true }, + { 158180, true }, + { 158197, true }, + { 158212, true }, + { 158221, true }, + { 158230, true }, + { 158238, true }, + { 158255, true }, + { 158269, true }, + { 158285, true }, + { 158307, true }, + { 158323, true }, + { 158337, true }, + { 158345, true }, + { 158362, true }, + { 158379, true }, + { 158393, true }, + { 158412, true }, + { 158428, false }, + { 158442, true }, + { 158455, true }, + { 158472, true }, + { 158487, true }, + { 158506, true }, + { 158517, true }, + { 158528, true }, + { 158542, true }, + { 158556, true }, + { 158571, true }, + { 158592, true }, + { 158608, true }, + { 158626, true }, + { 158644, true }, + { 158657, true }, + { 158685, true }, + { 158697, true }, + { 158713, true }, + { 158731, true }, + { 158739, true }, + { 158750, true }, + { 158758, true }, + { 158772, true }, + { 158786, false }, + { 158795, true }, + { 158802, false }, + { 158812, false }, + { 158832, true }, + { 158843, true }, + { 158850, true }, + { 158860, true }, { 158871, true }, - { 158886, true }, - { 158905, true }, - { 158916, true }, - { 158927, true }, - { 158941, true }, - { 158955, true }, - { 158970, true }, - { 158991, true }, - { 159007, true }, - { 159025, true }, - { 159043, true }, + { 158881, false }, + { 158900, true }, + { 158914, false }, + { 158927, false }, + { 158939, false }, + { 158960, true }, + { 158982, true }, + { 158995, true }, + { 159013, true }, + { 159029, true }, + { 159047, true }, { 159056, true }, + { 159068, true }, { 159084, true }, - { 159096, true }, - { 159112, true }, - { 159130, true }, - { 159138, true }, - { 159149, true }, - { 159157, true }, - { 159171, true }, - { 159185, false }, - { 159194, true }, - { 159201, false }, - { 159211, false }, + { 159095, true }, + { 159119, true }, + { 159133, true }, + { 159144, true }, + { 159170, false }, + { 159186, true }, + { 159204, true }, + { 159219, true }, { 159231, true }, - { 159242, true }, - { 159249, true }, - { 159259, true }, - { 159270, true }, - { 159280, false }, - { 159299, true }, - { 159313, false }, - { 159326, false }, - { 159338, false }, - { 159359, true }, - { 159381, true }, - { 159394, true }, - { 159412, true }, - { 159428, true }, - { 159446, true }, - { 159455, true }, - { 159467, true }, - { 159483, true }, - { 159494, true }, - { 159518, true }, + { 159239, true }, + { 159254, true }, + { 159268, true }, + { 159283, true }, + { 159302, true }, + { 159321, true }, + { 159336, true }, + { 159347, true }, + { 159363, true }, + { 159377, true }, + { 159395, true }, + { 159405, false }, + { 159434, true }, + { 159448, true }, + { 159472, true }, + { 159491, true }, + { 159504, true }, + { 159517, true }, { 159532, true }, - { 159543, true }, - { 159569, false }, - { 159585, true }, - { 159603, true }, - { 159618, true }, - { 159630, true }, - { 159638, true }, - { 159653, true }, - { 159667, true }, - { 159682, true }, - { 159701, true }, - { 159720, true }, + { 159546, true }, + { 159559, true }, + { 159579, true }, + { 159594, true }, + { 159612, true }, + { 159622, false }, + { 159637, true }, + { 159645, true }, + { 159658, false }, + { 159672, true }, + { 159683, true }, + { 159691, true }, + { 159699, true }, + { 159713, true }, { 159735, true }, - { 159746, true }, - { 159757, true }, - { 159773, true }, - { 159787, true }, - { 159805, true }, - { 159815, false }, - { 159844, true }, - { 159858, true }, - { 159882, true }, - { 159901, true }, - { 159914, true }, - { 159927, true }, - { 159942, true }, - { 159956, true }, - { 159969, true }, - { 159989, true }, - { 160004, true }, - { 160022, true }, - { 160032, false }, + { 159747, true }, + { 159759, true }, + { 159771, true }, + { 159786, true }, + { 159806, true }, + { 159829, true }, + { 159848, true }, + { 159867, true }, + { 159886, true }, + { 159905, true }, + { 159924, true }, + { 159943, true }, + { 159962, true }, + { 159979, true }, + { 159997, true }, + { 160014, true }, + { 160032, true }, { 160047, true }, - { 160055, true }, - { 160068, false }, - { 160082, true }, - { 160093, true }, - { 160101, true }, - { 160109, true }, - { 160123, true }, - { 160145, true }, - { 160157, true }, - { 160169, true }, - { 160181, true }, - { 160196, true }, - { 160216, true }, + { 160060, false }, + { 160074, true }, + { 160098, true }, + { 160115, true }, + { 160133, true }, + { 160149, true }, + { 160167, true }, + { 160184, true }, + { 160200, true }, + { 160213, true }, + { 160226, true }, { 160239, true }, - { 160258, true }, + { 160256, true }, { 160277, true }, - { 160296, true }, - { 160315, true }, - { 160334, true }, - { 160353, true }, - { 160372, true }, - { 160389, true }, + { 160295, true }, + { 160310, true }, + { 160327, true }, + { 160346, true }, + { 160363, true }, + { 160375, true }, + { 160386, true }, + { 160394, true }, { 160407, true }, - { 160424, true }, - { 160442, true }, - { 160457, true }, - { 160470, false }, - { 160484, true }, - { 160508, true }, - { 160525, true }, + { 160421, true }, + { 160448, true }, + { 160464, true }, + { 160480, true }, + { 160494, true }, + { 160507, true }, + { 160520, true }, + { 160533, true }, { 160543, true }, - { 160559, true }, - { 160577, true }, - { 160594, true }, - { 160610, true }, - { 160623, true }, - { 160636, true }, - { 160649, true }, - { 160666, true }, - { 160687, true }, - { 160705, true }, - { 160720, true }, - { 160737, true }, - { 160756, true }, - { 160773, true }, - { 160785, true }, - { 160796, true }, - { 160804, true }, - { 160817, true }, - { 160831, true }, - { 160847, true }, + { 160556, true }, + { 160567, true }, + { 160587, true }, + { 160607, true }, + { 160622, true }, + { 160632, true }, + { 160643, false }, + { 160658, true }, + { 160673, false }, + { 160683, false }, + { 160693, false }, + { 160703, true }, + { 160719, true }, + { 160731, true }, + { 160739, false }, + { 160748, false }, + { 160759, true }, + { 160767, true }, + { 160776, true }, + { 160789, true }, + { 160809, true }, + { 160830, true }, + { 160846, true }, { 160863, true }, - { 160877, true }, - { 160890, true }, - { 160903, true }, - { 160916, true }, - { 160926, true }, - { 160939, true }, - { 160950, true }, - { 160970, true }, - { 160990, true }, - { 161005, true }, - { 161015, true }, - { 161026, false }, - { 161041, true }, - { 161056, false }, - { 161066, false }, - { 161076, false }, - { 161086, true }, - { 161102, true }, - { 161114, true }, - { 161122, false }, - { 161131, false }, - { 161142, true }, - { 161150, true }, - { 161159, true }, - { 161172, true }, - { 161192, true }, - { 161213, true }, - { 161229, true }, - { 161246, true }, - { 161265, true }, - { 161282, true }, - { 161296, true }, - { 161306, true }, - { 161317, true }, - { 161326, true }, - { 161335, true }, - { 161348, true }, - { 161370, true }, - { 161399, true }, - { 161418, true }, - { 161435, true }, - { 161458, true }, - { 161466, true }, + { 160882, true }, + { 160899, true }, + { 160913, true }, + { 160923, true }, + { 160934, true }, + { 160943, true }, + { 160952, true }, + { 160965, true }, + { 160987, true }, + { 161016, true }, + { 161035, true }, + { 161052, true }, + { 161075, true }, + { 161083, true }, + { 161101, true }, + { 161119, true }, + { 161130, true }, + { 161141, false }, + { 161152, true }, + { 161161, true }, + { 161174, true }, + { 161185, true }, + { 161198, true }, + { 161211, true }, + { 161228, true }, + { 161241, true }, + { 161252, true }, + { 161262, true }, + { 161271, true }, + { 161281, true }, + { 161291, true }, + { 161304, true }, + { 161315, true }, + { 161336, true }, + { 161346, true }, + { 161359, true }, + { 161369, true }, + { 161382, true }, + { 161401, true }, + { 161412, true }, + { 161427, true }, + { 161441, true }, + { 161452, true }, + { 161464, true }, + { 161476, true }, { 161484, true }, - { 161502, true }, + { 161498, true }, { 161513, true }, - { 161524, false }, { 161535, true }, - { 161544, true }, - { 161557, true }, - { 161568, true }, - { 161581, true }, - { 161594, true }, - { 161611, true }, - { 161624, true }, - { 161635, true }, - { 161645, true }, - { 161654, true }, - { 161664, true }, - { 161674, true }, - { 161687, true }, - { 161698, true }, - { 161719, true }, - { 161729, true }, - { 161742, true }, - { 161752, true }, - { 161765, true }, - { 161784, true }, - { 161795, true }, - { 161810, true }, - { 161824, true }, - { 161835, true }, - { 161847, true }, - { 161859, true }, - { 161867, true }, - { 161881, true }, - { 161896, true }, - { 161918, true }, - { 161933, false }, + { 161550, false }, + { 161564, true }, + { 161587, false }, + { 161599, false }, + { 161614, true }, + { 161628, true }, + { 161637, true }, + { 161652, true }, + { 161673, true }, + { 161688, true }, + { 161700, true }, + { 161711, true }, + { 161724, true }, + { 161734, true }, + { 161755, true }, + { 161773, true }, + { 161794, true }, + { 161820, true }, + { 161843, true }, + { 161876, true }, + { 161895, true }, + { 161919, true }, { 161947, true }, - { 161970, false }, - { 161982, false }, - { 161997, true }, - { 162011, true }, - { 162020, true }, - { 162035, true }, - { 162056, true }, - { 162071, true }, - { 162083, true }, - { 162094, true }, - { 162107, true }, - { 162117, true }, - { 162138, true }, - { 162156, true }, - { 162177, true }, + { 161961, false }, + { 161971, true }, + { 161982, true }, + { 161996, true }, + { 162007, true }, + { 162018, false }, + { 162042, true }, + { 162053, true }, + { 162065, true }, + { 162079, true }, + { 162090, true }, + { 162100, true }, + { 162108, true }, + { 162115, true }, + { 162126, true }, + { 162136, true }, + { 162147, true }, + { 162158, true }, + { 162168, true }, + { 162179, true }, + { 162188, true }, { 162203, true }, - { 162226, true }, - { 162259, true }, - { 162278, true }, - { 162302, true }, - { 162330, true }, - { 162344, false }, - { 162354, true }, - { 162365, true }, - { 162379, true }, - { 162390, true }, - { 162401, false }, - { 162425, true }, - { 162436, true }, - { 162448, true }, - { 162462, true }, - { 162473, true }, - { 162483, true }, - { 162491, true }, - { 162498, true }, - { 162509, true }, - { 162519, true }, - { 162530, true }, - { 162541, true }, - { 162551, true }, - { 162562, true }, - { 162571, true }, - { 162586, true }, - { 162601, true }, - { 162614, true }, - { 162625, true }, - { 162634, true }, - { 162645, true }, - { 162656, true }, - { 162670, true }, + { 162218, true }, + { 162231, true }, + { 162242, true }, + { 162251, true }, + { 162262, true }, + { 162273, true }, + { 162287, true }, + { 162296, true }, + { 162312, true }, + { 162320, true }, + { 162332, true }, + { 162344, true }, + { 162360, true }, + { 162368, true }, + { 162378, true }, + { 162397, true }, + { 162405, true }, + { 162418, true }, + { 162435, true }, + { 162446, true }, + { 162458, true }, + { 162467, true }, + { 162476, true }, + { 162497, true }, + { 162516, true }, + { 162546, true }, + { 162576, true }, + { 162592, true }, + { 162607, true }, + { 162620, true }, + { 162633, true }, + { 162650, true }, + { 162663, true }, { 162679, true }, + { 162687, true }, { 162695, true }, - { 162703, true }, - { 162715, true }, - { 162727, true }, - { 162743, true }, - { 162751, true }, - { 162761, true }, - { 162780, true }, - { 162788, true }, - { 162801, true }, - { 162818, true }, - { 162829, true }, - { 162841, true }, - { 162850, true }, + { 162709, true }, + { 162728, false }, + { 162737, true }, + { 162759, true }, + { 162781, true }, + { 162795, true }, + { 162810, true }, + { 162823, true }, + { 162837, true }, + { 162851, true }, { 162859, true }, - { 162880, true }, - { 162899, true }, - { 162929, true }, - { 162959, true }, - { 162975, true }, + { 162871, true }, + { 162882, true }, + { 162894, true }, + { 162912, true }, + { 162925, true }, + { 162938, true }, + { 162950, true }, + { 162960, true }, + { 162970, true }, + { 162979, true }, { 162990, true }, - { 163003, true }, - { 163016, true }, - { 163033, true }, - { 163046, true }, - { 163062, true }, - { 163070, true }, - { 163078, true }, - { 163092, true }, - { 163111, false }, - { 163120, true }, - { 163142, true }, - { 163164, true }, - { 163178, true }, - { 163193, true }, - { 163206, true }, - { 163220, true }, - { 163234, true }, - { 163242, true }, - { 163254, true }, + { 163001, false }, + { 163011, false }, + { 163027, true }, + { 163037, true }, + { 163051, true }, + { 163063, true }, + { 163076, true }, + { 163086, true }, + { 163100, true }, + { 163115, true }, + { 163127, true }, + { 163138, true }, + { 163147, true }, + { 163160, true }, + { 163170, true }, + { 163183, true }, + { 163194, true }, + { 163217, false }, + { 163231, true }, + { 163243, true }, + { 163256, true }, { 163265, true }, - { 163277, true }, - { 163295, true }, - { 163308, true }, - { 163321, true }, - { 163333, true }, - { 163343, true }, - { 163353, true }, - { 163362, true }, - { 163373, true }, - { 163384, false }, - { 163394, false }, - { 163410, true }, - { 163420, true }, - { 163434, true }, - { 163446, true }, - { 163459, true }, - { 163469, true }, - { 163483, true }, - { 163498, true }, - { 163510, true }, - { 163521, true }, - { 163530, true }, - { 163543, true }, - { 163553, true }, - { 163566, true }, + { 163278, false }, + { 163288, true }, + { 163300, true }, + { 163311, true }, + { 163325, true }, + { 163339, true }, + { 163349, true }, + { 163358, true }, + { 163368, true }, + { 163379, true }, + { 163394, true }, + { 163406, true }, + { 163418, true }, + { 163430, true }, + { 163444, true }, + { 163461, true }, + { 163471, true }, + { 163481, false }, + { 163490, false }, + { 163509, true }, + { 163524, true }, + { 163540, true }, + { 163555, false }, + { 163565, true }, { 163577, true }, - { 163600, false }, + { 163589, false }, + { 163601, true }, { 163614, true }, - { 163626, true }, - { 163639, true }, - { 163648, true }, - { 163661, false }, - { 163671, true }, - { 163683, true }, - { 163694, true }, - { 163708, true }, - { 163722, true }, - { 163732, true }, - { 163741, true }, - { 163751, true }, - { 163762, true }, - { 163777, true }, - { 163789, true }, + { 163632, true }, + { 163647, true }, + { 163662, true }, + { 163684, false }, + { 163700, true }, + { 163712, true }, + { 163725, true }, + { 163737, true }, + { 163748, true }, + { 163761, false }, + { 163776, true }, + { 163791, true }, { 163801, true }, - { 163813, true }, - { 163827, true }, - { 163844, true }, - { 163854, true }, - { 163864, false }, - { 163873, false }, - { 163892, true }, - { 163907, true }, + { 163811, true }, + { 163825, true }, + { 163839, true }, + { 163862, true }, + { 163874, true }, + { 163885, true }, + { 163901, true }, + { 163912, true }, { 163923, true }, - { 163938, false }, - { 163948, true }, - { 163960, true }, - { 163972, false }, - { 163984, true }, - { 163997, true }, - { 164015, true }, - { 164030, true }, - { 164045, true }, - { 164067, false }, - { 164083, true }, - { 164095, true }, - { 164108, true }, - { 164120, true }, - { 164131, true }, - { 164144, false }, - { 164159, true }, - { 164174, true }, - { 164184, true }, - { 164194, true }, - { 164208, true }, - { 164222, true }, - { 164245, true }, - { 164257, true }, - { 164268, true }, - { 164284, true }, - { 164295, true }, - { 164306, true }, - { 164324, true }, - { 164342, true }, - { 164355, true }, - { 164376, false }, + { 163941, true }, + { 163959, true }, + { 163972, true }, + { 163993, false }, + { 164012, true }, + { 164032, true }, + { 164054, true }, + { 164078, true }, + { 164093, true }, + { 164111, true }, + { 164123, true }, + { 164139, true }, + { 164154, true }, + { 164170, true }, + { 164186, true }, + { 164203, true }, + { 164219, true }, + { 164236, true }, + { 164258, true }, + { 164280, true }, + { 164291, true }, + { 164307, true }, + { 164318, true }, + { 164338, true }, + { 164349, true }, + { 164364, true }, + { 164380, true }, { 164395, true }, - { 164415, true }, - { 164437, true }, - { 164461, true }, + { 164410, true }, + { 164424, true }, + { 164447, true }, + { 164462, true }, { 164476, true }, - { 164494, true }, - { 164506, true }, - { 164522, true }, + { 164491, true }, + { 164508, true }, + { 164525, true }, { 164537, true }, - { 164553, true }, - { 164569, true }, - { 164586, true }, - { 164602, true }, - { 164619, true }, - { 164641, true }, - { 164663, true }, - { 164674, true }, - { 164690, true }, - { 164701, true }, - { 164721, true }, - { 164732, true }, - { 164747, true }, - { 164763, true }, - { 164778, true }, - { 164793, true }, - { 164807, true }, - { 164830, true }, - { 164845, true }, - { 164859, true }, - { 164874, true }, - { 164891, true }, - { 164908, true }, - { 164920, true }, - { 164945, true }, - { 164957, true }, - { 164972, true }, - { 164988, true }, - { 165003, true }, - { 165032, true }, - { 165054, true }, - { 165072, true }, - { 165086, true }, - { 165099, true }, - { 165114, true }, + { 164562, true }, + { 164574, true }, + { 164589, true }, + { 164605, true }, + { 164620, true }, + { 164649, true }, + { 164671, true }, + { 164689, true }, + { 164703, true }, + { 164716, true }, + { 164731, true }, + { 164746, true }, + { 164753, true }, + { 164769, true }, + { 164780, true }, + { 164792, true }, + { 164803, true }, + { 164813, true }, + { 164824, true }, + { 164838, true }, + { 164852, true }, + { 164864, true }, + { 164876, true }, + { 164887, true }, + { 164902, true }, + { 164916, true }, + { 164927, true }, + { 164940, true }, + { 164953, true }, + { 164982, true }, + { 164998, true }, + { 165017, true }, + { 165026, true }, + { 165041, true }, + { 165048, true }, + { 165058, true }, + { 165068, true }, + { 165077, true }, + { 165093, true }, + { 165108, true }, + { 165117, true }, { 165129, true }, - { 165136, true }, - { 165152, true }, - { 165163, true }, - { 165175, true }, - { 165186, true }, - { 165196, true }, - { 165207, true }, - { 165221, true }, - { 165235, true }, - { 165247, true }, - { 165259, true }, - { 165270, true }, - { 165285, true }, - { 165299, true }, - { 165310, true }, - { 165323, true }, - { 165336, true }, - { 165365, true }, - { 165381, true }, - { 165400, true }, - { 165409, true }, - { 165424, true }, + { 165137, true }, + { 165146, true }, + { 165158, true }, + { 165174, true }, + { 165193, true }, + { 165205, false }, + { 165222, false }, + { 165242, true }, + { 165257, true }, + { 165273, true }, + { 165286, true }, + { 165304, true }, + { 165319, true }, + { 165328, true }, + { 165343, true }, + { 165357, true }, + { 165373, true }, + { 165388, true }, + { 165410, true }, { 165431, true }, - { 165441, true }, - { 165451, true }, - { 165460, true }, - { 165476, true }, - { 165491, true }, - { 165500, true }, - { 165512, true }, - { 165520, true }, - { 165529, true }, - { 165541, true }, - { 165557, true }, - { 165576, true }, - { 165588, false }, - { 165605, false }, + { 165450, true }, + { 165469, true }, + { 165485, true }, + { 165504, true }, + { 165515, true }, + { 165524, true }, + { 165536, true }, + { 165546, true }, + { 165561, true }, + { 165575, true }, + { 165588, true }, + { 165596, true }, + { 165604, true }, + { 165613, true }, { 165625, true }, - { 165640, true }, - { 165656, true }, - { 165669, true }, - { 165687, true }, - { 165702, true }, - { 165711, true }, - { 165726, true }, - { 165740, true }, - { 165756, true }, - { 165771, true }, - { 165793, true }, - { 165814, true }, - { 165833, true }, - { 165852, true }, - { 165868, true }, - { 165887, true }, - { 165898, true }, - { 165907, true }, - { 165919, true }, - { 165929, true }, - { 165944, true }, - { 165958, true }, - { 165971, true }, - { 165979, true }, - { 165987, true }, - { 165996, true }, - { 166008, true }, - { 166020, true }, - { 166029, true }, - { 166041, true }, - { 166049, true }, - { 166061, true }, - { 166087, true }, - { 166110, false }, - { 166126, true }, - { 166140, true }, - { 166160, true }, - { 166171, true }, - { 166192, true }, - { 166211, true }, - { 166225, true }, - { 166240, true }, - { 166254, true }, + { 165637, true }, + { 165646, true }, + { 165658, true }, + { 165666, true }, + { 165678, true }, + { 165704, true }, + { 165727, false }, + { 165743, true }, + { 165757, true }, + { 165777, true }, + { 165788, true }, + { 165809, true }, + { 165828, true }, + { 165842, true }, + { 165857, true }, + { 165871, true }, + { 165888, true }, + { 165902, true }, + { 165922, false }, + { 165937, true }, + { 165945, true }, + { 165960, true }, + { 165975, true }, + { 165989, true }, + { 166000, true }, + { 166010, true }, + { 166027, true }, + { 166045, true }, + { 166065, true }, + { 166089, true }, + { 166096, true }, + { 166107, true }, + { 166118, true }, + { 166131, true }, + { 166143, false }, + { 166158, true }, + { 166174, true }, + { 166187, true }, + { 166195, true }, + { 166205, true }, + { 166218, true }, + { 166233, false }, + { 166242, true }, + { 166256, true }, { 166271, true }, - { 166285, true }, - { 166305, false }, - { 166320, true }, - { 166328, true }, - { 166343, true }, - { 166358, true }, - { 166372, true }, - { 166383, true }, - { 166393, true }, - { 166410, true }, - { 166428, true }, + { 166281, true }, + { 166293, true }, + { 166303, true }, + { 166316, true }, + { 166329, true }, + { 166341, true }, + { 166349, true }, + { 166359, true }, + { 166373, true }, + { 166394, true }, + { 166407, true }, + { 166417, false }, + { 166437, true }, { 166448, true }, - { 166472, true }, - { 166479, true }, - { 166490, true }, + { 166456, true }, + { 166463, true }, + { 166473, true }, + { 166485, true }, + { 166491, true }, { 166501, true }, - { 166514, true }, - { 166526, false }, - { 166541, true }, - { 166557, true }, - { 166570, true }, - { 166578, true }, - { 166588, true }, - { 166601, true }, - { 166616, false }, - { 166625, true }, - { 166639, true }, - { 166654, true }, - { 166664, true }, - { 166676, true }, - { 166686, true }, + { 166509, false }, + { 166529, true }, + { 166544, true }, + { 166571, true }, + { 166580, true }, + { 166589, true }, + { 166597, true }, + { 166611, true }, + { 166626, true }, + { 166638, true }, + { 166651, true }, + { 166669, true }, + { 166680, true }, + { 166691, true }, { 166699, true }, - { 166712, true }, - { 166724, true }, - { 166732, true }, - { 166742, true }, - { 166756, true }, - { 166777, true }, - { 166790, true }, - { 166800, false }, - { 166820, true }, - { 166831, true }, - { 166839, true }, - { 166846, true }, - { 166856, true }, - { 166868, true }, - { 166874, true }, + { 166709, true }, + { 166717, true }, + { 166729, true }, + { 166738, true }, + { 166748, true }, + { 166761, true }, + { 166771, true }, + { 166783, true }, + { 166798, true }, + { 166810, true }, + { 166824, true }, + { 166840, true }, + { 166858, true }, + { 166871, true }, { 166884, true }, - { 166892, false }, - { 166912, true }, - { 166927, true }, - { 166954, true }, - { 166963, true }, - { 166972, true }, - { 166980, true }, - { 166994, true }, - { 167009, true }, - { 167021, true }, - { 167034, true }, - { 167052, true }, - { 167063, true }, - { 167074, true }, + { 166901, true }, + { 166916, true }, + { 166935, true }, + { 166950, true }, + { 166958, true }, + { 166970, true }, + { 166984, true }, + { 167004, true }, + { 167016, true }, + { 167042, true }, + { 167064, true }, { 167082, true }, - { 167092, true }, - { 167100, true }, - { 167112, true }, - { 167121, true }, - { 167131, true }, - { 167144, true }, - { 167154, true }, - { 167166, true }, - { 167181, true }, - { 167193, true }, - { 167207, true }, - { 167223, true }, - { 167241, true }, - { 167254, true }, - { 167267, true }, - { 167284, true }, - { 167299, true }, - { 167318, true }, - { 167333, true }, - { 167341, true }, - { 167353, true }, - { 167367, true }, - { 167387, true }, - { 167399, true }, - { 167425, true }, - { 167447, true }, + { 167099, true }, + { 167116, true }, + { 167127, true }, + { 167145, true }, + { 167157, true }, + { 167170, true }, + { 167186, true }, + { 167217, true }, + { 167231, true }, + { 167248, true }, + { 167266, true }, + { 167285, true }, + { 167301, true }, + { 167324, true }, + { 167343, true }, + { 167357, true }, + { 167373, true }, + { 167401, true }, + { 167417, true }, + { 167434, true }, { 167465, true }, - { 167482, true }, - { 167499, true }, - { 167510, true }, - { 167528, true }, - { 167540, true }, - { 167553, true }, - { 167569, true }, - { 167600, true }, - { 167614, true }, - { 167631, true }, - { 167649, true }, + { 167495, false }, + { 167511, true }, + { 167522, true }, + { 167534, true }, + { 167547, true }, + { 167564, true }, + { 167578, true }, + { 167603, true }, + { 167622, true }, + { 167637, true }, + { 167648, true }, { 167668, true }, - { 167684, true }, - { 167707, true }, - { 167726, true }, - { 167740, true }, - { 167756, true }, - { 167784, true }, - { 167800, true }, - { 167817, true }, - { 167848, true }, - { 167878, false }, - { 167894, true }, - { 167905, true }, + { 167683, true }, + { 167694, true }, + { 167709, true }, + { 167727, true }, + { 167743, true }, + { 167755, true }, + { 167765, true }, + { 167782, true }, + { 167794, false }, + { 167808, true }, + { 167815, false }, + { 167847, true }, + { 167860, true }, + { 167879, true }, + { 167893, true }, + { 167903, true }, { 167917, true }, { 167930, true }, { 167947, true }, { 167961, true }, - { 167986, true }, - { 168005, true }, - { 168020, true }, - { 168031, true }, - { 168051, true }, - { 168066, true }, - { 168077, true }, - { 168092, true }, - { 168110, true }, - { 168126, true }, - { 168138, true }, - { 168148, true }, + { 167977, false }, + { 167992, true }, + { 168006, true }, + { 168017, true }, + { 168028, true }, + { 168040, true }, + { 168049, true }, + { 168056, true }, + { 168067, true }, + { 168075, true }, + { 168082, true }, + { 168093, true }, + { 168101, true }, + { 168109, true }, + { 168117, true }, + { 168130, true }, + { 168145, true }, + { 168155, true }, { 168165, true }, - { 168177, false }, - { 168191, true }, - { 168198, false }, - { 168230, true }, - { 168243, true }, - { 168262, true }, - { 168276, true }, - { 168286, true }, - { 168300, true }, - { 168313, true }, - { 168330, true }, - { 168344, true }, - { 168360, false }, - { 168375, true }, - { 168389, true }, - { 168400, true }, - { 168411, true }, - { 168423, true }, - { 168432, true }, - { 168439, true }, - { 168450, true }, - { 168458, true }, - { 168465, true }, - { 168476, true }, - { 168484, true }, - { 168492, true }, - { 168500, true }, - { 168513, true }, - { 168528, true }, - { 168538, true }, - { 168548, true }, - { 168560, true }, - { 168574, true }, - { 168583, true }, - { 168602, true }, - { 168611, true }, + { 168172, true }, + { 168184, true }, + { 168198, true }, + { 168207, true }, + { 168226, true }, + { 168235, true }, + { 168251, true }, + { 168263, true }, + { 168275, true }, + { 168287, true }, + { 168298, true }, + { 168310, true }, + { 168321, true }, + { 168332, true }, + { 168347, true }, + { 168355, true }, + { 168380, true }, + { 168391, true }, + { 168402, true }, + { 168413, true }, + { 168427, true }, + { 168443, true }, + { 168457, true }, + { 168471, true }, + { 168486, true }, + { 168507, true }, + { 168522, true }, + { 168543, true }, + { 168551, true }, + { 168565, true }, + { 168572, true }, + { 168584, true }, + { 168596, true }, + { 168610, true }, { 168627, true }, - { 168639, true }, - { 168651, true }, - { 168663, true }, - { 168674, true }, - { 168686, true }, - { 168697, true }, - { 168708, true }, - { 168723, true }, - { 168731, true }, - { 168756, true }, - { 168767, true }, - { 168778, true }, - { 168789, true }, - { 168803, true }, - { 168819, true }, - { 168833, true }, - { 168847, true }, - { 168862, true }, - { 168883, true }, - { 168898, true }, - { 168919, true }, - { 168927, true }, - { 168941, true }, + { 168640, true }, + { 168656, false }, + { 168669, true }, + { 168682, true }, + { 168696, true }, + { 168707, true }, + { 168716, true }, + { 168726, true }, + { 168733, true }, + { 168745, true }, + { 168754, true }, + { 168763, true }, + { 168771, true }, + { 168786, true }, + { 168794, true }, + { 168806, true }, + { 168818, true }, + { 168828, true }, + { 168838, true }, + { 168849, true }, + { 168858, true }, + { 168876, true }, + { 168894, true }, + { 168904, true }, + { 168915, false }, + { 168926, true }, { 168948, true }, - { 168960, true }, + { 168956, true }, + { 168964, false }, { 168972, true }, - { 168986, true }, - { 169003, true }, - { 169016, true }, - { 169032, false }, - { 169045, true }, - { 169058, true }, - { 169072, true }, - { 169083, true }, - { 169092, true }, - { 169102, true }, - { 169109, true }, + { 168980, true }, + { 168996, true }, + { 169012, true }, + { 169025, true }, + { 169036, true }, + { 169048, true }, + { 169067, true }, + { 169093, true }, + { 169107, true }, { 169121, true }, - { 169130, true }, - { 169139, true }, - { 169147, true }, + { 169135, true }, + { 169150, true }, { 169162, true }, - { 169170, true }, - { 169182, true }, - { 169194, true }, - { 169204, true }, - { 169214, true }, - { 169225, true }, - { 169234, true }, - { 169252, true }, - { 169270, true }, - { 169280, true }, - { 169291, false }, - { 169302, true }, - { 169324, true }, + { 169175, true }, + { 169187, true }, + { 169197, false }, + { 169215, true }, + { 169231, true }, + { 169246, true }, + { 169257, true }, + { 169274, true }, + { 169286, true }, + { 169297, true }, + { 169316, true }, { 169332, true }, - { 169340, false }, - { 169348, true }, + { 169344, true }, { 169356, true }, - { 169372, true }, - { 169388, true }, - { 169401, true }, - { 169412, true }, - { 169424, true }, - { 169443, true }, - { 169469, true }, - { 169483, true }, - { 169497, true }, + { 169369, true }, + { 169381, true }, + { 169398, true }, + { 169405, true }, + { 169418, true }, + { 169435, true }, + { 169457, true }, + { 169468, true }, + { 169478, true }, + { 169488, true }, + { 169500, false }, { 169511, true }, - { 169526, true }, - { 169538, true }, - { 169551, true }, + { 169525, true }, + { 169534, true }, + { 169545, true }, { 169563, true }, - { 169573, false }, - { 169591, true }, - { 169607, true }, - { 169622, true }, - { 169633, true }, - { 169650, true }, - { 169662, true }, - { 169673, true }, - { 169692, true }, - { 169708, true }, - { 169720, true }, - { 169732, true }, - { 169745, true }, - { 169757, true }, - { 169774, true }, - { 169781, true }, - { 169794, true }, - { 169811, true }, - { 169833, true }, - { 169844, true }, - { 169854, true }, + { 169582, true }, + { 169598, true }, + { 169611, true }, + { 169627, true }, + { 169654, true }, + { 169666, true }, + { 169681, true }, + { 169689, true }, + { 169706, true }, + { 169735, true }, + { 169749, true }, + { 169759, true }, + { 169795, true }, + { 169828, true }, + { 169851, true }, { 169864, true }, - { 169876, false }, - { 169887, true }, - { 169901, true }, - { 169910, true }, - { 169921, true }, - { 169939, true }, - { 169958, true }, - { 169974, true }, - { 169987, true }, - { 170003, true }, - { 170030, true }, - { 170042, true }, - { 170057, true }, - { 170065, true }, - { 170082, true }, - { 170111, true }, + { 169876, true }, + { 169888, true }, + { 169897, true }, + { 169910, false }, + { 169933, true }, + { 169949, true }, + { 169967, true }, + { 169984, true }, + { 170008, true }, + { 170020, true }, + { 170029, true }, + { 170038, true }, + { 170047, true }, + { 170059, true }, + { 170068, true }, + { 170076, true }, + { 170089, true }, + { 170100, true }, { 170125, true }, - { 170135, true }, - { 170171, true }, - { 170204, true }, - { 170227, true }, + { 170136, true }, + { 170149, true }, + { 170162, true }, + { 170175, true }, + { 170189, true }, + { 170202, true }, + { 170213, false }, + { 170224, true }, + { 170232, true }, { 170240, true }, - { 170252, true }, - { 170264, true }, - { 170273, true }, - { 170286, false }, - { 170309, true }, - { 170325, true }, - { 170343, true }, - { 170360, true }, - { 170384, true }, - { 170396, true }, - { 170405, true }, - { 170414, true }, - { 170423, true }, - { 170435, true }, - { 170444, true }, - { 170452, true }, - { 170465, true }, - { 170476, true }, - { 170501, true }, - { 170512, true }, - { 170525, true }, - { 170538, true }, - { 170551, true }, - { 170565, true }, - { 170578, true }, + { 170255, true }, + { 170263, true }, + { 170271, true }, + { 170283, true }, + { 170291, true }, + { 170304, false }, + { 170315, true }, + { 170330, true }, + { 170350, true }, + { 170358, true }, + { 170376, true }, + { 170386, true }, + { 170406, true }, + { 170426, false }, + { 170439, true }, + { 170450, true }, + { 170471, true }, + { 170494, true }, + { 170509, true }, + { 170535, true }, + { 170545, true }, + { 170558, true }, + { 170574, true }, { 170589, false }, - { 170600, true }, - { 170608, true }, - { 170616, true }, - { 170631, true }, - { 170639, true }, - { 170647, true }, - { 170659, true }, - { 170667, true }, - { 170680, false }, - { 170691, true }, - { 170706, true }, - { 170726, true }, - { 170734, true }, - { 170752, true }, - { 170762, true }, - { 170782, true }, - { 170802, false }, - { 170815, true }, - { 170826, true }, - { 170847, true }, + { 170607, true }, + { 170638, true }, + { 170658, true }, + { 170675, true }, + { 170692, true }, + { 170710, true }, + { 170723, true }, + { 170738, true }, + { 170750, true }, + { 170760, true }, + { 170767, true }, + { 170787, true }, + { 170800, true }, + { 170817, true }, + { 170829, true }, + { 170843, true }, + { 170855, true }, { 170870, true }, - { 170885, true }, - { 170911, true }, - { 170921, true }, - { 170934, true }, - { 170950, true }, - { 170965, false }, - { 170983, true }, - { 171014, true }, - { 171034, true }, - { 171051, true }, - { 171068, true }, - { 171086, true }, - { 171099, true }, - { 171114, true }, + { 170888, true }, + { 170901, true }, + { 170914, true }, + { 170925, true }, + { 170936, true }, + { 170953, true }, + { 170964, true }, + { 170979, true }, + { 170990, true }, + { 171002, true }, + { 171014, false }, + { 171026, true }, + { 171040, true }, + { 171057, true }, + { 171067, true }, + { 171080, false }, + { 171098, false }, + { 171109, true }, { 171126, true }, - { 171136, true }, { 171143, true }, - { 171163, true }, - { 171176, true }, - { 171193, true }, - { 171205, true }, - { 171219, true }, - { 171231, true }, - { 171246, true }, - { 171264, true }, - { 171277, true }, - { 171290, true }, - { 171301, true }, - { 171312, true }, - { 171329, true }, - { 171340, true }, - { 171355, true }, - { 171366, true }, - { 171378, true }, - { 171390, false }, - { 171402, true }, - { 171416, true }, - { 171433, true }, - { 171443, true }, - { 171456, false }, - { 171474, false }, - { 171485, true }, - { 171502, true }, - { 171519, true }, - { 171530, true }, - { 171540, true }, - { 171555, true }, - { 171565, true }, - { 171580, true }, - { 171597, true }, + { 171154, true }, + { 171164, true }, + { 171179, true }, + { 171189, true }, + { 171204, true }, + { 171221, true }, + { 171232, true }, + { 171250, true }, + { 171261, true }, + { 171276, true }, + { 171291, true }, + { 171306, true }, + { 171331, true }, + { 171356, true }, + { 171369, true }, + { 171386, true }, + { 171405, true }, + { 171417, true }, + { 171437, true }, + { 171458, true }, + { 171472, true }, + { 171489, true }, + { 171514, true }, + { 171535, true }, + { 171557, true }, + { 171587, true }, { 171608, true }, - { 171626, true }, - { 171637, true }, - { 171652, true }, - { 171667, true }, - { 171682, true }, - { 171707, true }, - { 171732, true }, - { 171745, true }, + { 171629, true }, + { 171653, true }, + { 171668, true }, + { 171678, true }, + { 171701, true }, + { 171712, true }, + { 171719, true }, + { 171734, true }, + { 171753, true }, { 171762, true }, - { 171781, true }, - { 171793, true }, - { 171813, true }, - { 171834, true }, - { 171848, true }, - { 171865, true }, - { 171890, true }, - { 171911, true }, - { 171933, true }, - { 171963, true }, - { 171984, true }, - { 172005, true }, - { 172029, true }, - { 172044, true }, + { 171769, true }, + { 171780, true }, + { 171799, true }, + { 171816, true }, + { 171832, true }, + { 171842, true }, + { 171853, true }, + { 171863, true }, + { 171874, true }, + { 171886, true }, + { 171902, true }, + { 171912, true }, + { 171922, true }, + { 171932, true }, + { 171944, true }, + { 171955, true }, + { 171970, true }, + { 171994, true }, + { 172010, true }, + { 172024, true }, + { 172049, true }, { 172057, true }, - { 172067, true }, - { 172090, true }, - { 172101, true }, - { 172108, true }, - { 172123, true }, - { 172142, true }, - { 172151, true }, - { 172158, true }, - { 172169, true }, - { 172188, true }, - { 172205, true }, - { 172221, true }, - { 172231, true }, - { 172242, true }, - { 172252, true }, - { 172263, true }, + { 172075, true }, + { 172086, true }, + { 172099, true }, + { 172110, true }, + { 172125, true }, + { 172144, true }, + { 172156, true }, + { 172167, true }, + { 172182, true }, + { 172197, true }, + { 172211, true }, + { 172227, true }, + { 172245, true }, + { 172257, true }, { 172275, true }, - { 172291, true }, - { 172301, true }, - { 172311, true }, - { 172321, true }, - { 172333, true }, - { 172344, true }, - { 172359, true }, - { 172383, true }, - { 172399, true }, - { 172413, true }, - { 172438, true }, - { 172446, true }, - { 172464, true }, - { 172475, true }, - { 172488, true }, - { 172499, true }, - { 172514, true }, - { 172533, true }, - { 172545, true }, - { 172556, true }, - { 172571, true }, + { 172295, true }, + { 172307, true }, + { 172324, true }, + { 172338, true }, + { 172353, true }, + { 172367, true }, + { 172381, true }, + { 172392, true }, + { 172409, true }, + { 172418, true }, + { 172431, true }, + { 172440, true }, + { 172458, true }, + { 172469, true }, + { 172480, true }, + { 172492, true }, + { 172513, true }, + { 172520, true }, + { 172531, true }, + { 172548, false }, + { 172574, false }, { 172586, true }, - { 172600, true }, - { 172616, true }, - { 172634, true }, + { 172599, true }, + { 172618, true }, + { 172635, true }, { 172646, true }, - { 172664, true }, - { 172684, true }, - { 172696, true }, - { 172713, true }, - { 172727, true }, - { 172742, true }, - { 172756, true }, - { 172770, true }, - { 172781, true }, - { 172798, true }, - { 172807, true }, - { 172820, true }, - { 172829, true }, - { 172847, true }, - { 172858, true }, - { 172869, true }, - { 172881, true }, - { 172902, true }, - { 172909, true }, - { 172920, true }, - { 172937, false }, - { 172963, false }, - { 172975, true }, + { 172663, true }, + { 172673, true }, + { 172686, true }, + { 172707, true }, + { 172723, true }, + { 172747, true }, + { 172761, true }, + { 172772, true }, + { 172786, true }, + { 172803, true }, + { 172813, true }, + { 172828, true }, + { 172840, true }, + { 172855, true }, + { 172865, true }, + { 172878, true }, + { 172891, true }, + { 172904, true }, + { 172924, true }, + { 172946, true }, + { 172960, true }, + { 172975, false }, { 172988, true }, - { 173007, true }, - { 173024, true }, - { 173035, true }, - { 173052, true }, - { 173062, true }, - { 173075, true }, - { 173096, true }, - { 173112, true }, - { 173136, true }, - { 173150, true }, + { 173003, true }, + { 173014, true }, + { 173034, true }, + { 173050, true }, + { 173069, true }, + { 173083, true }, + { 173102, true }, + { 173123, true }, + { 173134, true }, + { 173153, true }, { 173161, true }, - { 173175, true }, - { 173192, true }, - { 173202, true }, - { 173217, true }, + { 173169, true }, + { 173180, true }, + { 173189, true }, + { 173205, true }, + { 173214, true }, { 173229, true }, - { 173244, true }, - { 173254, true }, - { 173267, true }, - { 173280, true }, + { 173240, true }, + { 173251, true }, + { 173262, true }, + { 173272, true }, + { 173282, true }, { 173293, true }, - { 173313, true }, - { 173335, true }, - { 173349, true }, - { 173364, false }, - { 173377, true }, - { 173392, true }, - { 173403, true }, - { 173423, true }, - { 173439, true }, - { 173458, true }, - { 173472, true }, - { 173491, true }, - { 173512, true }, - { 173523, true }, - { 173542, true }, - { 173550, true }, - { 173558, true }, - { 173569, true }, - { 173578, true }, + { 173303, true }, + { 173310, true }, + { 173328, true }, + { 173340, true }, + { 173351, true }, + { 173373, true }, + { 173387, true }, + { 173406, true }, + { 173414, true }, + { 173433, true }, + { 173455, true }, + { 173464, true }, + { 173476, true }, + { 173494, true }, + { 173508, true }, + { 173520, true }, + { 173539, true }, + { 173549, true }, + { 173561, true }, + { 173570, true }, + { 173586, true }, { 173594, true }, - { 173603, true }, - { 173618, true }, - { 173629, true }, - { 173640, true }, - { 173651, true }, - { 173661, true }, - { 173671, true }, - { 173682, true }, - { 173692, true }, - { 173699, true }, - { 173717, true }, - { 173729, true }, - { 173740, true }, - { 173762, true }, - { 173776, true }, - { 173795, true }, - { 173803, true }, - { 173822, true }, - { 173844, true }, - { 173853, true }, - { 173865, true }, - { 173883, true }, - { 173897, true }, - { 173909, true }, - { 173928, true }, - { 173938, true }, - { 173950, true }, - { 173959, true }, - { 173975, true }, - { 173983, true }, + { 173606, true }, + { 173621, true }, + { 173641, true }, + { 173649, true }, + { 173662, true }, + { 173679, true }, + { 173688, true }, + { 173706, true }, + { 173718, true }, + { 173737, true }, + { 173751, true }, + { 173771, true }, + { 173794, true }, + { 173807, true }, + { 173819, true }, + { 173843, true }, + { 173859, true }, + { 173882, true }, + { 173896, true }, + { 173913, true }, + { 173929, true }, + { 173946, true }, + { 173961, true }, + { 173976, true }, { 173995, true }, - { 174010, true }, - { 174030, true }, - { 174038, true }, - { 174051, true }, - { 174068, true }, - { 174077, true }, + { 174011, true }, + { 174019, true }, + { 174037, true }, + { 174046, false }, + { 174055, true }, + { 174067, true }, + { 174081, true }, { 174095, true }, - { 174107, true }, - { 174126, true }, - { 174140, true }, - { 174160, true }, - { 174183, true }, - { 174196, true }, + { 174105, true }, + { 174116, true }, + { 174129, true }, + { 174138, true }, + { 174161, true }, + { 174173, true }, + { 174189, true }, + { 174199, false }, { 174208, true }, + { 174215, true }, + { 174224, true }, { 174232, true }, - { 174248, true }, - { 174271, true }, - { 174285, true }, - { 174302, true }, - { 174318, true }, - { 174335, true }, - { 174350, true }, - { 174365, true }, - { 174384, true }, - { 174400, true }, + { 174241, false }, + { 174255, true }, + { 174269, true }, + { 174279, true }, + { 174289, true }, + { 174299, true }, + { 174311, true }, + { 174324, true }, + { 174336, true }, + { 174348, true }, + { 174362, true }, + { 174380, false }, + { 174393, true }, { 174408, true }, { 174426, true }, - { 174435, false }, - { 174444, true }, - { 174456, true }, - { 174470, true }, - { 174484, true }, - { 174494, true }, - { 174505, true }, - { 174518, true }, - { 174527, true }, - { 174550, true }, - { 174562, true }, - { 174578, true }, - { 174588, false }, - { 174597, true }, - { 174604, true }, - { 174613, true }, - { 174621, true }, - { 174630, false }, - { 174644, true }, - { 174658, true }, - { 174668, true }, - { 174678, true }, - { 174688, true }, - { 174700, true }, - { 174713, true }, - { 174725, true }, - { 174737, true }, - { 174751, true }, - { 174769, false }, - { 174782, true }, - { 174797, true }, - { 174815, true }, - { 174825, true }, - { 174836, true }, - { 174848, true }, - { 174861, true }, - { 174875, true }, - { 174889, true }, - { 174899, true }, + { 174436, true }, + { 174447, true }, + { 174459, true }, + { 174472, true }, + { 174486, true }, + { 174500, true }, + { 174510, true }, + { 174523, true }, + { 174533, true }, + { 174544, true }, + { 174553, true }, + { 174570, true }, + { 174581, true }, + { 174590, true }, + { 174603, true }, + { 174614, true }, + { 174632, true }, + { 174642, true }, + { 174652, true }, + { 174664, true }, + { 174676, true }, + { 174691, true }, + { 174702, true }, + { 174718, true }, + { 174735, true }, + { 174748, true }, + { 174762, true }, + { 174771, true }, + { 174784, false }, + { 174795, true }, + { 174811, false }, + { 174826, false }, + { 174837, false }, + { 174844, true }, + { 174860, true }, + { 174878, true }, + { 174897, true }, { 174912, true }, - { 174922, true }, - { 174933, true }, - { 174942, true }, - { 174959, true }, - { 174970, true }, - { 174979, true }, - { 174992, true }, - { 175003, true }, - { 175021, true }, - { 175031, true }, + { 174929, true }, + { 174945, true }, + { 174966, true }, + { 174980, true }, + { 175005, true }, + { 175022, true }, { 175041, true }, - { 175053, true }, - { 175065, true }, - { 175080, true }, - { 175091, true }, - { 175107, true }, - { 175124, true }, - { 175137, true }, - { 175151, true }, - { 175160, true }, - { 175173, false }, - { 175184, true }, - { 175200, false }, - { 175215, false }, - { 175226, false }, - { 175233, true }, - { 175249, true }, - { 175267, true }, - { 175286, true }, - { 175301, true }, - { 175318, true }, - { 175334, true }, + { 175056, false }, + { 175070, true }, + { 175084, true }, + { 175097, true }, + { 175118, true }, + { 175130, true }, + { 175143, true }, + { 175153, true }, + { 175167, true }, + { 175187, true }, + { 175200, true }, + { 175219, true }, + { 175235, true }, + { 175253, true }, + { 175267, false }, + { 175279, true }, + { 175289, true }, + { 175303, true }, + { 175313, true }, + { 175329, true }, { 175355, true }, - { 175369, true }, - { 175394, true }, + { 175383, true }, + { 175396, true }, { 175411, true }, - { 175430, true }, - { 175445, false }, - { 175459, true }, - { 175473, true }, - { 175486, true }, - { 175507, true }, - { 175519, true }, - { 175532, true }, - { 175542, true }, - { 175556, true }, - { 175576, true }, - { 175589, true }, - { 175608, true }, - { 175624, true }, - { 175642, true }, - { 175656, false }, - { 175668, true }, - { 175678, true }, - { 175692, true }, - { 175702, true }, - { 175718, true }, - { 175744, true }, - { 175772, true }, - { 175785, true }, - { 175800, true }, - { 175816, true }, - { 175840, true }, - { 175856, true }, - { 175871, true }, - { 175885, true }, - { 175897, true }, - { 175909, true }, - { 175921, false }, - { 175939, true }, - { 175952, true }, - { 175971, true }, - { 175989, true }, - { 176004, true }, - { 176027, true }, - { 176044, true }, - { 176063, true }, - { 176083, true }, - { 176106, true }, - { 176125, true }, - { 176144, true }, - { 176163, true }, - { 176181, true }, - { 176200, true }, - { 176211, true }, - { 176221, true }, - { 176236, true }, - { 176256, true }, + { 175427, true }, + { 175451, true }, + { 175467, true }, + { 175482, true }, + { 175496, true }, + { 175508, true }, + { 175520, true }, + { 175532, false }, + { 175550, true }, + { 175563, true }, + { 175582, true }, + { 175600, true }, + { 175615, true }, + { 175638, true }, + { 175655, true }, + { 175674, true }, + { 175694, true }, + { 175717, true }, + { 175736, true }, + { 175755, true }, + { 175774, true }, + { 175792, true }, + { 175811, true }, + { 175822, true }, + { 175832, true }, + { 175847, true }, + { 175867, true }, + { 175888, true }, + { 175908, true }, + { 175927, true }, + { 175941, true }, + { 175965, true }, + { 175980, true }, + { 175994, true }, + { 176006, true }, + { 176016, true }, + { 176036, true }, + { 176066, true }, + { 176089, true }, + { 176112, true }, + { 176141, true }, + { 176159, true }, + { 176175, true }, + { 176187, true }, + { 176197, true }, + { 176217, false }, + { 176229, true }, + { 176242, true }, + { 176260, true }, { 176277, true }, - { 176297, true }, - { 176316, true }, - { 176340, true }, - { 176355, true }, - { 176369, true }, - { 176381, true }, - { 176391, true }, - { 176411, true }, - { 176441, true }, - { 176464, true }, - { 176487, true }, - { 176516, true }, + { 176295, true }, + { 176315, true }, + { 176330, true }, + { 176339, true }, + { 176352, true }, + { 176364, true }, + { 176375, true }, + { 176387, true }, + { 176399, false }, + { 176416, true }, + { 176429, true }, + { 176447, true }, + { 176462, true }, + { 176477, true }, + { 176491, true }, + { 176503, true }, + { 176523, true }, { 176534, true }, - { 176550, true }, - { 176562, true }, - { 176572, true }, - { 176592, false }, + { 176546, true }, + { 176556, true }, + { 176570, true }, + { 176590, true }, { 176604, true }, - { 176617, true }, + { 176622, true }, { 176635, true }, - { 176652, true }, - { 176670, true }, - { 176690, true }, - { 176705, true }, - { 176714, true }, - { 176727, true }, - { 176739, true }, - { 176750, true }, - { 176762, true }, - { 176774, false }, - { 176791, true }, - { 176804, true }, - { 176822, true }, - { 176837, true }, - { 176852, true }, - { 176866, true }, - { 176878, true }, - { 176898, true }, - { 176909, true }, - { 176921, true }, - { 176931, true }, - { 176945, true }, - { 176965, true }, - { 176979, true }, - { 176997, true }, - { 177010, true }, - { 177025, true }, - { 177041, true }, - { 177056, true }, - { 177068, true }, - { 177083, true }, - { 177099, true }, + { 176650, true }, + { 176666, true }, + { 176681, true }, + { 176693, true }, + { 176708, true }, + { 176724, true }, + { 176734, true }, + { 176741, true }, + { 176756, true }, + { 176776, true }, + { 176788, true }, + { 176799, true }, + { 176812, true }, + { 176821, true }, + { 176841, true }, + { 176861, true }, + { 176884, true }, + { 176904, true }, + { 176918, true }, + { 176930, true }, + { 176941, true }, + { 176951, true }, + { 176962, false }, + { 176973, true }, + { 176984, true }, + { 176995, false }, + { 177005, false }, + { 177022, true }, + { 177034, true }, + { 177050, true }, + { 177063, true }, + { 177072, true }, + { 177086, true }, + { 177097, true }, { 177109, true }, - { 177116, true }, - { 177131, true }, - { 177151, true }, + { 177127, true }, + { 177141, true }, + { 177152, true }, { 177163, true }, - { 177174, true }, - { 177187, true }, - { 177196, true }, - { 177216, true }, - { 177236, true }, - { 177259, true }, - { 177279, true }, - { 177293, true }, - { 177305, true }, - { 177316, true }, - { 177326, true }, - { 177337, false }, - { 177348, true }, - { 177359, true }, - { 177370, false }, - { 177380, false }, - { 177397, true }, - { 177409, true }, - { 177425, true }, + { 177176, true }, + { 177189, true }, + { 177198, true }, + { 177213, true }, + { 177224, true }, + { 177242, true }, + { 177262, true }, + { 177274, true }, + { 177285, true }, + { 177318, true }, + { 177330, true }, + { 177344, true }, + { 177358, true }, + { 177373, true }, + { 177387, true }, + { 177401, false }, + { 177421, true }, { 177438, true }, - { 177447, true }, - { 177461, true }, - { 177472, true }, - { 177484, true }, - { 177502, true }, + { 177451, true }, + { 177466, true }, + { 177482, true }, + { 177500, true }, { 177516, true }, - { 177527, true }, - { 177538, true }, - { 177551, true }, - { 177564, true }, - { 177573, true }, - { 177588, true }, - { 177599, true }, - { 177617, true }, - { 177637, true }, - { 177649, true }, - { 177659, true }, - { 177670, true }, - { 177703, true }, - { 177715, true }, - { 177729, true }, - { 177743, true }, - { 177758, true }, - { 177772, true }, - { 177786, false }, - { 177806, true }, - { 177823, true }, - { 177836, true }, - { 177851, true }, - { 177867, true }, - { 177885, true }, - { 177901, true }, - { 177918, true }, - { 177930, true }, - { 177943, true }, - { 177956, true }, - { 177970, true }, - { 177983, true }, - { 177996, true }, - { 178012, true }, - { 178026, true }, - { 178039, true }, - { 178052, true }, - { 178065, true }, - { 178078, true }, - { 178091, true }, - { 178106, true }, - { 178119, true }, - { 178133, true }, - { 178146, true }, - { 178160, true }, - { 178173, true }, - { 178186, true }, - { 178199, true }, - { 178212, true }, - { 178225, true }, - { 178237, true }, - { 178248, true }, - { 178255, true }, - { 178272, true }, - { 178285, true }, - { 178294, true }, - { 178305, true }, - { 178314, true }, - { 178327, true }, - { 178358, true }, + { 177533, true }, + { 177545, true }, + { 177558, true }, + { 177571, true }, + { 177585, true }, + { 177598, true }, + { 177611, true }, + { 177627, true }, + { 177641, true }, + { 177654, true }, + { 177667, true }, + { 177680, true }, + { 177693, true }, + { 177706, true }, + { 177721, true }, + { 177734, true }, + { 177748, true }, + { 177761, true }, + { 177775, true }, + { 177788, true }, + { 177801, true }, + { 177814, true }, + { 177827, true }, + { 177840, true }, + { 177852, true }, + { 177863, true }, + { 177870, true }, + { 177887, true }, + { 177900, true }, + { 177909, true }, + { 177920, true }, + { 177929, true }, + { 177942, true }, + { 177973, true }, + { 177990, true }, + { 178003, true }, + { 178016, true }, + { 178029, true }, + { 178042, true }, + { 178053, true }, + { 178062, true }, + { 178072, true }, + { 178087, true }, + { 178099, true }, + { 178115, true }, + { 178140, true }, + { 178164, true }, + { 178185, true }, + { 178202, false }, + { 178215, true }, + { 178228, true }, + { 178239, true }, + { 178256, true }, + { 178267, true }, + { 178286, true }, + { 178304, false }, + { 178316, true }, + { 178329, true }, + { 178339, true }, { 178375, true }, { 178388, true }, - { 178401, true }, - { 178414, true }, - { 178427, true }, - { 178438, true }, - { 178447, true }, - { 178457, true }, - { 178472, true }, - { 178484, true }, + { 178402, true }, + { 178415, true }, + { 178424, true }, + { 178432, false }, + { 178442, true }, + { 178456, true }, + { 178468, true }, + { 178486, true }, { 178500, true }, - { 178525, true }, - { 178549, true }, - { 178570, true }, - { 178587, false }, - { 178600, true }, - { 178613, true }, - { 178624, true }, - { 178641, true }, - { 178652, true }, - { 178671, true }, - { 178689, false }, - { 178701, true }, - { 178714, true }, - { 178724, true }, - { 178760, true }, - { 178773, true }, - { 178787, true }, - { 178800, true }, - { 178809, true }, - { 178817, false }, - { 178827, true }, - { 178841, true }, - { 178853, true }, - { 178871, true }, - { 178885, true }, - { 178903, true }, - { 178924, true }, - { 178944, true }, - { 178967, true }, - { 178983, true }, - { 179000, true }, - { 179014, true }, + { 178518, true }, + { 178539, true }, + { 178559, true }, + { 178582, true }, + { 178598, true }, + { 178615, true }, + { 178629, true }, + { 178645, true }, + { 178658, true }, + { 178679, true }, + { 178699, true }, + { 178713, true }, + { 178723, true }, + { 178736, true }, + { 178745, true }, + { 178779, true }, + { 178796, true }, + { 178807, true }, + { 178818, true }, + { 178830, true }, + { 178844, true }, + { 178855, true }, + { 178874, true }, + { 178886, true }, + { 178899, true }, + { 178915, true }, + { 178934, true }, + { 178949, true }, + { 178963, true }, + { 178978, true }, + { 178995, false }, + { 179010, true }, { 179030, true }, - { 179043, true }, - { 179064, true }, - { 179084, true }, - { 179098, true }, - { 179108, true }, - { 179121, true }, - { 179130, true }, - { 179164, true }, - { 179181, true }, - { 179192, true }, - { 179203, true }, - { 179215, true }, - { 179229, true }, - { 179240, true }, - { 179259, true }, + { 179041, true }, + { 179061, false }, + { 179070, true }, + { 179079, true }, + { 179090, true }, + { 179102, true }, + { 179116, true }, + { 179134, true }, + { 179146, true }, + { 179161, true }, + { 179173, true }, + { 179184, false }, + { 179201, true }, + { 179211, true }, + { 179232, true }, + { 179260, false }, { 179271, true }, - { 179284, true }, - { 179300, true }, + { 179291, true }, + { 179298, true }, + { 179309, true }, { 179319, true }, - { 179334, true }, - { 179348, true }, - { 179363, true }, - { 179380, false }, - { 179395, true }, - { 179415, true }, - { 179426, true }, - { 179446, false }, - { 179455, true }, - { 179464, true }, - { 179475, true }, - { 179487, true }, - { 179501, true }, - { 179519, true }, - { 179531, true }, - { 179546, true }, - { 179558, true }, - { 179569, false }, - { 179586, true }, - { 179596, true }, - { 179617, true }, - { 179645, false }, + { 179329, true }, + { 179343, true }, + { 179357, true }, + { 179368, false }, + { 179379, true }, + { 179387, false }, + { 179407, true }, + { 179422, true }, + { 179435, true }, + { 179451, true }, + { 179466, true }, + { 179482, true }, + { 179496, true }, + { 179511, true }, + { 179524, true }, + { 179540, true }, + { 179553, true }, + { 179562, true }, + { 179582, true }, + { 179595, true }, + { 179614, true }, + { 179632, true }, + { 179642, true }, { 179656, true }, - { 179676, true }, - { 179683, true }, - { 179694, true }, - { 179704, true }, - { 179714, true }, - { 179728, true }, - { 179742, true }, - { 179753, false }, - { 179764, true }, - { 179772, false }, - { 179792, true }, - { 179807, true }, - { 179820, true }, - { 179836, true }, - { 179851, true }, + { 179674, true }, + { 179682, true }, + { 179702, true }, + { 179734, true }, + { 179748, true }, + { 179763, true }, + { 179782, true }, + { 179801, true }, + { 179818, true }, + { 179831, true }, + { 179846, true }, { 179867, true }, - { 179881, true }, - { 179896, true }, - { 179909, true }, - { 179925, true }, - { 179938, true }, - { 179947, true }, - { 179967, true }, - { 179980, true }, - { 179999, true }, - { 180017, true }, - { 180027, true }, - { 180041, true }, - { 180059, true }, - { 180067, true }, - { 180087, true }, - { 180119, true }, - { 180133, true }, - { 180148, true }, - { 180167, true }, - { 180186, true }, + { 179888, true }, + { 179902, true }, + { 179924, true }, + { 179940, true }, + { 179965, true }, + { 179977, true }, + { 179988, true }, + { 180005, true }, + { 180029, true }, + { 180038, true }, + { 180052, true }, + { 180065, true }, + { 180078, true }, + { 180090, true }, + { 180103, true }, + { 180121, true }, + { 180138, true }, + { 180163, true }, + { 180176, true }, + { 180191, true }, { 180203, true }, - { 180216, false }, + { 180217, true }, { 180231, true }, - { 180252, true }, - { 180273, true }, - { 180287, true }, - { 180309, true }, - { 180325, true }, - { 180350, true }, - { 180362, true }, - { 180373, true }, - { 180390, true }, - { 180414, true }, - { 180423, true }, - { 180437, true }, - { 180450, true }, - { 180463, true }, - { 180475, true }, - { 180488, true }, - { 180506, true }, - { 180523, true }, - { 180548, true }, - { 180561, true }, - { 180576, true }, - { 180588, true }, - { 180602, true }, - { 180616, true }, - { 180633, true }, - { 180653, true }, + { 180248, true }, + { 180268, true }, + { 180284, true }, + { 180302, true }, + { 180313, true }, + { 180328, true }, + { 180341, true }, + { 180356, true }, + { 180364, false }, + { 180377, true }, + { 180389, true }, + { 180404, true }, + { 180418, true }, + { 180427, true }, + { 180436, true }, + { 180452, true }, + { 180474, true }, + { 180491, true }, + { 180505, true }, + { 180515, true }, + { 180529, true }, + { 180547, true }, + { 180564, true }, + { 180583, true }, + { 180600, true }, + { 180618, true }, + { 180636, true }, + { 180649, true }, + { 180657, true }, { 180669, true }, - { 180687, true }, - { 180698, true }, - { 180713, true }, - { 180726, true }, - { 180741, true }, - { 180749, true }, - { 180761, true }, - { 180776, true }, - { 180790, true }, - { 180799, true }, - { 180808, true }, - { 180824, true }, - { 180846, true }, - { 180863, true }, - { 180877, true }, - { 180887, true }, - { 180901, true }, - { 180919, true }, - { 180936, true }, - { 180955, true }, - { 180972, true }, - { 180990, true }, - { 181008, true }, - { 181021, true }, - { 181029, true }, - { 181041, true }, - { 181052, true }, - { 181068, true }, - { 181078, true }, - { 181091, true }, - { 181104, true }, - { 181118, true }, - { 181134, true }, - { 181147, true }, - { 181161, true }, - { 181178, true }, - { 181189, true }, - { 181199, true }, - { 181219, true }, - { 181231, true }, - { 181245, true }, - { 181260, true }, - { 181272, true }, - { 181281, true }, - { 181289, true }, - { 181301, true }, - { 181312, true }, - { 181326, true }, - { 181347, true }, - { 181366, true }, - { 181384, true }, - { 181402, true }, - { 181422, true }, - { 181431, true }, - { 181443, true }, - { 181465, true }, - { 181483, true }, - { 181496, true }, + { 180680, true }, + { 180696, true }, + { 180706, true }, + { 180719, true }, + { 180732, true }, + { 180746, true }, + { 180762, true }, + { 180775, true }, + { 180789, true }, + { 180806, true }, + { 180817, true }, + { 180827, true }, + { 180847, true }, + { 180859, true }, + { 180873, true }, + { 180888, true }, + { 180900, true }, + { 180909, true }, + { 180917, true }, + { 180929, true }, + { 180940, true }, + { 180954, true }, + { 180975, true }, + { 180994, true }, + { 181012, true }, + { 181030, true }, + { 181050, true }, + { 181059, true }, + { 181071, true }, + { 181093, true }, + { 181111, true }, + { 181124, true }, + { 181138, true }, + { 181157, true }, + { 181170, true }, + { 181182, true }, + { 181194, true }, + { 181205, true }, + { 181219, false }, + { 181234, true }, + { 181254, true }, + { 181267, true }, + { 181284, true }, + { 181295, true }, + { 181306, true }, + { 181320, true }, + { 181341, true }, + { 181357, true }, + { 181368, true }, + { 181387, true }, + { 181403, true }, + { 181421, true }, + { 181437, true }, + { 181460, true }, + { 181476, true }, + { 181488, true }, + { 181497, true }, { 181510, true }, - { 181529, true }, - { 181542, true }, - { 181554, true }, - { 181566, true }, - { 181577, true }, - { 181591, false }, - { 181606, true }, - { 181626, true }, - { 181639, true }, - { 181656, true }, + { 181528, true }, + { 181543, true }, + { 181558, true }, + { 181574, true }, + { 181589, true }, + { 181604, true }, + { 181620, true }, + { 181635, true }, + { 181650, true }, { 181667, true }, - { 181678, true }, - { 181692, true }, + { 181677, true }, + { 181690, true }, + { 181703, true }, { 181713, true }, - { 181729, true }, - { 181740, true }, - { 181759, true }, - { 181775, true }, - { 181793, true }, - { 181809, true }, - { 181832, true }, - { 181848, true }, - { 181860, true }, - { 181869, true }, - { 181882, true }, - { 181900, true }, - { 181915, true }, - { 181930, true }, - { 181946, true }, - { 181961, true }, - { 181976, true }, - { 181992, true }, - { 182007, true }, - { 182022, true }, - { 182039, true }, - { 182049, true }, - { 182062, true }, - { 182075, true }, - { 182085, true }, - { 182106, true }, - { 182118, false }, - { 182129, true }, + { 181734, true }, + { 181746, false }, + { 181757, true }, + { 181771, true }, + { 181783, true }, + { 181792, true }, + { 181807, false }, + { 181826, true }, + { 181843, true }, + { 181856, true }, + { 181871, true }, + { 181887, true }, + { 181901, true }, + { 181911, false }, + { 181924, false }, + { 181934, true }, + { 181947, true }, + { 181957, true }, + { 181969, true }, + { 181979, false }, + { 181988, false }, + { 181996, true }, + { 182004, false }, + { 182024, true }, + { 182037, true }, + { 182055, true }, + { 182067, false }, + { 182079, true }, + { 182096, true }, + { 182110, true }, + { 182127, true }, { 182143, true }, - { 182155, true }, - { 182164, true }, - { 182179, false }, - { 182198, true }, + { 182162, true }, + { 182178, true }, + { 182195, true }, { 182215, true }, - { 182228, true }, + { 182229, true }, { 182243, true }, - { 182259, true }, - { 182273, true }, - { 182283, false }, - { 182296, false }, + { 182257, true }, + { 182271, true }, + { 182292, true }, { 182306, true }, - { 182319, true }, - { 182329, true }, - { 182341, true }, - { 182351, false }, - { 182360, false }, - { 182368, true }, - { 182376, false }, - { 182396, true }, - { 182409, true }, - { 182427, true }, - { 182439, false }, + { 182322, true }, + { 182335, true }, + { 182364, true }, + { 182378, true }, + { 182397, false }, + { 182419, true }, + { 182434, true }, { 182451, true }, - { 182468, true }, - { 182482, true }, - { 182499, true }, - { 182515, true }, - { 182534, true }, + { 182459, true }, + { 182471, true }, + { 182484, true }, + { 182497, true }, + { 182510, false }, + { 182521, true }, + { 182532, true }, { 182550, true }, - { 182567, true }, - { 182587, true }, + { 182569, true }, + { 182585, true }, { 182601, true }, - { 182615, true }, - { 182629, true }, - { 182643, true }, - { 182664, true }, - { 182678, true }, - { 182694, true }, - { 182707, true }, - { 182736, true }, - { 182750, true }, - { 182769, false }, - { 182791, true }, - { 182806, true }, - { 182823, true }, - { 182831, true }, - { 182843, true }, - { 182856, true }, - { 182869, true }, - { 182882, false }, - { 182893, true }, - { 182904, true }, - { 182922, true }, - { 182941, true }, - { 182957, true }, - { 182973, true }, - { 182982, false }, - { 182996, true }, - { 183014, true }, - { 183032, true }, - { 183049, true }, - { 183060, false }, - { 183076, false }, - { 183100, true }, - { 183114, true }, - { 183141, true }, - { 183156, true }, - { 183175, true }, - { 183185, true }, - { 183230, true }, - { 183275, true }, - { 183289, true }, - { 183297, true }, - { 183306, true }, - { 183314, true }, - { 183326, true }, - { 183338, true }, + { 182610, false }, + { 182624, true }, + { 182642, true }, + { 182660, true }, + { 182677, true }, + { 182688, false }, + { 182704, false }, + { 182728, true }, + { 182742, true }, + { 182769, true }, + { 182784, true }, + { 182803, true }, + { 182813, true }, + { 182858, true }, + { 182903, true }, + { 182917, true }, + { 182925, true }, + { 182934, true }, + { 182942, true }, + { 182954, true }, + { 182966, true }, + { 182980, true }, + { 183005, true }, + { 183022, true }, + { 183039, true }, + { 183054, true }, + { 183066, true }, + { 183078, true }, + { 183091, true }, + { 183099, true }, + { 183117, true }, + { 183126, false }, + { 183134, true }, + { 183146, true }, + { 183167, true }, + { 183180, true }, + { 183193, true }, + { 183205, true }, + { 183217, true }, + { 183230, false }, + { 183243, true }, + { 183259, true }, + { 183273, true }, + { 183291, true }, + { 183312, true }, + { 183333, true }, { 183352, true }, { 183377, true }, - { 183394, true }, - { 183411, true }, - { 183426, true }, - { 183438, true }, - { 183450, true }, - { 183463, true }, - { 183471, true }, - { 183489, true }, - { 183498, false }, - { 183506, true }, - { 183518, true }, - { 183539, true }, - { 183552, true }, - { 183565, true }, - { 183577, true }, - { 183589, true }, - { 183602, false }, - { 183615, true }, - { 183631, true }, - { 183645, true }, - { 183663, true }, - { 183684, true }, + { 183386, true }, + { 183399, true }, + { 183412, true }, + { 183424, true }, + { 183436, true }, + { 183455, true }, + { 183467, true }, + { 183484, true }, + { 183496, false }, + { 183505, true }, + { 183514, true }, + { 183529, true }, + { 183551, true }, + { 183570, true }, + { 183585, true }, + { 183600, true }, + { 183614, true }, + { 183627, true }, + { 183649, true }, + { 183664, true }, + { 183679, true }, + { 183694, true }, { 183705, true }, - { 183724, true }, - { 183749, true }, - { 183758, true }, - { 183771, true }, - { 183784, true }, - { 183796, true }, - { 183808, true }, - { 183827, true }, - { 183839, true }, - { 183856, true }, - { 183868, false }, - { 183877, true }, - { 183886, true }, - { 183901, true }, - { 183923, true }, - { 183942, true }, - { 183957, true }, - { 183972, true }, - { 183986, true }, - { 183999, true }, - { 184021, true }, - { 184036, true }, - { 184051, true }, - { 184066, true }, - { 184077, true }, - { 184086, true }, - { 184111, true }, - { 184123, true }, - { 184140, true }, - { 184152, true }, - { 184168, false }, - { 184184, true }, - { 184195, false }, - { 184210, true }, - { 184223, false }, + { 183714, true }, + { 183739, true }, + { 183751, true }, + { 183768, true }, + { 183780, true }, + { 183796, false }, + { 183812, true }, + { 183823, false }, + { 183838, true }, + { 183851, false }, + { 183875, true }, + { 183883, true }, + { 183894, true }, + { 183905, true }, + { 183916, true }, + { 183927, true }, + { 183938, false }, + { 183951, true }, + { 183965, true }, + { 183977, true }, + { 183990, true }, + { 184002, true }, + { 184018, true }, + { 184033, true }, + { 184052, true }, + { 184076, true }, + { 184090, true }, + { 184110, true }, + { 184126, true }, + { 184145, true }, + { 184165, true }, + { 184177, true }, + { 184200, true }, + { 184217, true }, { 184247, true }, - { 184255, true }, - { 184266, true }, - { 184277, true }, - { 184288, true }, - { 184299, true }, - { 184310, false }, - { 184323, true }, - { 184337, true }, + { 184259, true }, + { 184270, true }, + { 184280, true }, + { 184294, true }, + { 184307, true }, + { 184325, false }, + { 184335, true }, { 184349, true }, - { 184362, true }, - { 184374, true }, - { 184390, true }, - { 184405, true }, - { 184424, true }, - { 184448, true }, - { 184462, true }, - { 184476, true }, - { 184496, true }, - { 184512, true }, - { 184531, true }, - { 184551, true }, - { 184563, true }, - { 184586, true }, - { 184603, true }, - { 184633, true }, - { 184645, true }, - { 184656, true }, - { 184666, true }, - { 184680, true }, - { 184693, true }, - { 184711, false }, - { 184721, true }, - { 184736, true }, - { 184754, true }, - { 184763, true }, - { 184776, false }, - { 184793, true }, - { 184804, true }, - { 184814, true }, + { 184364, true }, + { 184382, true }, + { 184391, true }, + { 184404, false }, + { 184421, true }, + { 184432, true }, + { 184442, true }, + { 184451, true }, + { 184472, true }, + { 184483, true }, + { 184505, true }, + { 184521, true }, + { 184536, true }, + { 184556, true }, + { 184571, true }, + { 184588, true }, + { 184610, true }, + { 184620, true }, + { 184642, true }, + { 184661, true }, + { 184683, true }, + { 184700, true }, + { 184714, true }, + { 184727, true }, + { 184744, true }, + { 184769, true }, + { 184786, true }, + { 184802, true }, + { 184812, true }, { 184823, true }, - { 184844, true }, - { 184855, true }, - { 184877, true }, - { 184893, true }, - { 184908, true }, - { 184928, true }, - { 184943, true }, - { 184960, true }, - { 184982, true }, - { 184992, true }, - { 185014, true }, - { 185033, true }, - { 185055, true }, - { 185072, true }, - { 185086, true }, - { 185099, true }, - { 185116, true }, - { 185141, true }, - { 185158, true }, - { 185174, true }, - { 185184, true }, - { 185195, true }, - { 185204, false }, - { 185213, true }, - { 185220, true }, - { 185230, true }, - { 185244, true }, - { 185262, true }, + { 184832, false }, + { 184841, true }, + { 184848, true }, + { 184858, true }, + { 184872, true }, + { 184890, true }, + { 184910, true }, + { 184924, true }, + { 184933, true }, + { 184957, true }, + { 184978, true }, + { 184998, true }, + { 185016, true }, + { 185029, true }, + { 185050, true }, + { 185068, true }, + { 185080, true }, + { 185088, true }, + { 185110, true }, + { 185123, true }, + { 185148, true }, + { 185159, true }, + { 185180, true }, + { 185191, true }, + { 185212, true }, + { 185227, true }, + { 185239, true }, + { 185256, true }, { 185282, true }, - { 185296, true }, - { 185305, true }, - { 185329, true }, - { 185350, true }, - { 185370, true }, - { 185388, true }, - { 185401, true }, - { 185422, true }, - { 185440, true }, - { 185452, true }, - { 185460, true }, - { 185482, true }, - { 185495, true }, - { 185520, true }, - { 185531, true }, - { 185552, true }, - { 185563, true }, - { 185584, true }, - { 185599, true }, - { 185611, true }, - { 185628, true }, - { 185654, true }, + { 185299, true }, + { 185328, false }, + { 185346, true }, + { 185362, true }, + { 185378, true }, + { 185397, false }, + { 185416, true }, + { 185428, true }, + { 185448, true }, + { 185461, true }, + { 185483, true }, + { 185496, true }, + { 185511, true }, + { 185525, true }, + { 185548, true }, + { 185558, true }, + { 185568, true }, + { 185587, true }, + { 185600, true }, + { 185622, true }, + { 185642, true }, + { 185652, true }, { 185671, true }, - { 185700, false }, - { 185718, true }, - { 185734, true }, - { 185750, true }, - { 185769, false }, - { 185788, true }, - { 185800, true }, - { 185820, true }, - { 185842, true }, - { 185855, true }, - { 185870, true }, - { 185884, true }, - { 185907, true }, - { 185917, true }, - { 185927, true }, - { 185946, true }, - { 185959, true }, + { 185683, true }, + { 185696, true }, + { 185709, true }, + { 185730, true }, + { 185756, true }, + { 185777, true }, + { 185798, true }, + { 185819, true }, + { 185839, true }, + { 185851, true }, + { 185871, true }, + { 185885, true }, + { 185903, true }, + { 185921, true }, + { 185933, true }, + { 185942, true }, + { 185965, true }, { 185981, true }, - { 186001, true }, + { 185993, true }, { 186011, true }, - { 186030, true }, - { 186042, true }, - { 186055, true }, - { 186068, true }, - { 186089, true }, - { 186115, true }, - { 186136, true }, - { 186157, true }, - { 186178, true }, - { 186198, true }, - { 186210, true }, - { 186230, true }, - { 186244, true }, - { 186262, true }, - { 186280, true }, - { 186292, true }, - { 186301, true }, - { 186324, true }, - { 186340, true }, - { 186352, true }, - { 186370, true }, - { 186395, true }, - { 186410, true }, - { 186431, true }, - { 186447, true }, - { 186464, true }, - { 186485, false }, - { 186502, false }, - { 186520, true }, - { 186530, true }, - { 186544, true }, - { 186558, true }, - { 186568, true }, - { 186580, true }, - { 186592, true }, + { 186036, true }, + { 186051, true }, + { 186072, true }, + { 186088, true }, + { 186105, true }, + { 186126, false }, + { 186143, false }, + { 186161, true }, + { 186171, true }, + { 186185, true }, + { 186199, true }, + { 186209, true }, + { 186221, true }, + { 186233, true }, + { 186243, true }, + { 186254, true }, + { 186265, true }, + { 186279, true }, + { 186291, true }, + { 186315, true }, + { 186327, true }, + { 186356, true }, + { 186371, true }, + { 186385, true }, + { 186399, true }, + { 186415, true }, + { 186430, true }, + { 186444, true }, + { 186456, true }, + { 186476, true }, + { 186489, true }, + { 186503, true }, + { 186516, true }, + { 186528, true }, + { 186541, true }, + { 186553, true }, + { 186571, true }, + { 186583, true }, { 186602, true }, - { 186613, true }, - { 186624, true }, - { 186638, true }, - { 186650, true }, - { 186674, true }, - { 186686, true }, - { 186715, true }, - { 186730, true }, - { 186744, true }, - { 186758, true }, - { 186774, true }, + { 186619, true }, + { 186640, true }, + { 186664, true }, + { 186687, true }, + { 186699, true }, + { 186717, true }, + { 186735, true }, + { 186751, true }, + { 186771, false }, { 186789, true }, - { 186803, true }, - { 186815, true }, - { 186835, true }, - { 186848, true }, - { 186862, true }, - { 186875, true }, - { 186888, true }, - { 186900, true }, - { 186918, true }, - { 186930, true }, - { 186949, true }, - { 186966, true }, - { 186987, true }, - { 187011, true }, - { 187034, true }, - { 187046, true }, - { 187064, true }, - { 187082, true }, - { 187098, true }, - { 187118, false }, - { 187136, true }, - { 187156, true }, - { 187171, true }, - { 187197, true }, - { 187223, true }, - { 187236, true }, - { 187249, true }, - { 187269, true }, - { 187280, true }, - { 187290, true }, - { 187309, true }, - { 187328, true }, - { 187342, true }, - { 187360, true }, - { 187375, true }, - { 187391, false }, - { 187410, true }, - { 187424, true }, - { 187433, true }, - { 187450, true }, - { 187466, true }, - { 187488, true }, - { 187505, true }, - { 187523, true }, - { 187542, true }, - { 187559, true }, - { 187572, true }, - { 187582, true }, - { 187597, true }, - { 187605, true }, - { 187623, true }, - { 187651, true }, - { 187666, true }, - { 187681, true }, - { 187699, true }, - { 187716, true }, + { 186809, true }, + { 186824, true }, + { 186850, true }, + { 186876, true }, + { 186889, true }, + { 186902, true }, + { 186922, true }, + { 186933, true }, + { 186943, true }, + { 186962, true }, + { 186981, true }, + { 186995, true }, + { 187013, true }, + { 187028, true }, + { 187044, false }, + { 187063, true }, + { 187077, true }, + { 187086, true }, + { 187103, true }, + { 187119, true }, + { 187141, true }, + { 187158, true }, + { 187176, true }, + { 187195, true }, + { 187212, true }, + { 187225, true }, + { 187235, true }, + { 187250, true }, + { 187258, true }, + { 187276, true }, + { 187304, true }, + { 187319, true }, + { 187334, true }, + { 187352, true }, + { 187369, true }, + { 187383, true }, + { 187398, false }, + { 187411, false }, + { 187421, false }, + { 187434, false }, + { 187449, true }, + { 187467, true }, + { 187484, true }, + { 187496, true }, + { 187508, true }, + { 187520, true }, + { 187536, true }, + { 187548, true }, + { 187561, true }, + { 187573, true }, + { 187585, true }, + { 187601, true }, + { 187614, true }, + { 187624, true }, + { 187634, true }, + { 187647, true }, + { 187662, true }, + { 187673, true }, + { 187685, true }, + { 187696, true }, + { 187714, true }, + { 187722, true }, { 187730, true }, - { 187745, false }, - { 187758, false }, - { 187768, false }, - { 187781, false }, - { 187796, true }, - { 187814, true }, - { 187831, true }, - { 187843, true }, - { 187855, true }, + { 187740, true }, + { 187752, true }, + { 187766, true }, + { 187780, true }, + { 187793, true }, + { 187810, true }, + { 187840, true }, { 187867, true }, - { 187883, true }, - { 187895, true }, - { 187908, true }, - { 187920, true }, - { 187932, true }, - { 187948, true }, - { 187961, true }, - { 187971, true }, - { 187981, true }, - { 187994, true }, - { 188009, true }, - { 188020, true }, - { 188032, true }, - { 188043, true }, - { 188061, true }, - { 188069, true }, - { 188077, true }, - { 188087, true }, - { 188099, true }, - { 188113, true }, - { 188127, true }, - { 188140, true }, - { 188157, true }, - { 188187, true }, - { 188214, true }, - { 188229, true }, - { 188245, true }, - { 188260, true }, - { 188275, true }, - { 188290, true }, - { 188298, true }, - { 188313, true }, + { 187882, true }, + { 187898, true }, + { 187913, true }, + { 187928, true }, + { 187943, true }, + { 187951, true }, + { 187966, true }, + { 187977, true }, + { 187990, true }, + { 187998, true }, + { 188008, true }, + { 188024, true }, + { 188041, true }, + { 188066, true }, + { 188083, true }, + { 188104, true }, + { 188117, true }, + { 188129, true }, + { 188137, true }, + { 188154, true }, + { 188170, true }, + { 188177, true }, + { 188185, true }, + { 188197, false }, + { 188221, true }, + { 188253, true }, + { 188280, true }, + { 188300, true }, { 188324, true }, - { 188337, true }, - { 188345, true }, - { 188355, true }, - { 188371, true }, - { 188388, true }, - { 188413, true }, - { 188430, true }, - { 188451, true }, - { 188464, true }, - { 188476, true }, - { 188484, true }, - { 188501, true }, - { 188517, true }, - { 188524, true }, - { 188532, true }, - { 188544, false }, - { 188568, true }, - { 188600, true }, - { 188627, true }, - { 188647, true }, - { 188671, true }, - { 188688, false }, - { 188701, true }, - { 188716, true }, - { 188727, true }, - { 188738, true }, - { 188748, true }, - { 188761, true }, - { 188769, true }, - { 188781, true }, - { 188793, false }, - { 188805, false }, - { 188813, false }, - { 188838, true }, - { 188857, true }, - { 188870, true }, - { 188885, true }, - { 188899, true }, - { 188912, true }, - { 188924, true }, - { 188941, true }, + { 188341, false }, + { 188354, true }, + { 188369, true }, + { 188380, true }, + { 188391, true }, + { 188401, true }, + { 188414, true }, + { 188422, true }, + { 188434, true }, + { 188446, false }, + { 188458, false }, + { 188466, false }, + { 188491, true }, + { 188510, true }, + { 188523, true }, + { 188538, true }, + { 188552, true }, + { 188565, true }, + { 188577, true }, + { 188594, true }, + { 188608, true }, + { 188625, true }, + { 188637, true }, + { 188651, true }, + { 188666, true }, + { 188681, true }, + { 188692, true }, + { 188699, true }, + { 188719, true }, + { 188733, true }, + { 188741, true }, + { 188749, false }, + { 188764, true }, + { 188776, true }, + { 188790, false }, + { 188801, true }, + { 188812, true }, + { 188825, true }, + { 188835, true }, + { 188845, true }, + { 188852, true }, + { 188865, true }, + { 188878, true }, + { 188886, true }, + { 188903, true }, + { 188911, true }, + { 188920, true }, + { 188936, true }, { 188955, true }, - { 188972, true }, - { 188984, true }, - { 188998, true }, - { 189013, true }, - { 189028, true }, - { 189039, true }, - { 189046, true }, - { 189066, true }, + { 188966, true }, + { 188978, true }, + { 188988, true }, + { 189005, false }, + { 189016, true }, + { 189024, true }, + { 189034, true }, + { 189043, true }, + { 189059, true }, { 189080, true }, - { 189088, true }, - { 189096, false }, - { 189111, true }, - { 189123, true }, - { 189137, false }, - { 189148, true }, - { 189159, true }, - { 189172, true }, - { 189182, true }, - { 189192, true }, - { 189199, true }, - { 189212, true }, - { 189225, true }, - { 189233, true }, - { 189250, true }, - { 189258, true }, - { 189267, true }, - { 189283, true }, - { 189302, true }, - { 189313, true }, - { 189325, true }, - { 189335, true }, - { 189352, false }, - { 189363, true }, - { 189371, true }, - { 189381, true }, - { 189390, true }, - { 189406, true }, - { 189427, true }, - { 189452, false }, - { 189468, true }, - { 189480, true }, - { 189492, true }, - { 189505, true }, - { 189513, true }, - { 189521, false }, - { 189541, false }, - { 189560, false }, - { 189579, false }, - { 189599, true }, - { 189619, false }, - { 189639, false }, - { 189658, false }, - { 189677, true }, - { 189696, true }, - { 189707, true }, - { 189717, true }, - { 189729, true }, - { 189738, true }, - { 189751, true }, - { 189766, true }, - { 189776, true }, - { 189789, false }, - { 189800, true }, - { 189811, true }, - { 189820, true }, - { 189832, true }, - { 189840, true }, - { 189853, true }, - { 189861, true }, - { 189871, true }, - { 189880, true }, - { 189895, true }, - { 189918, true }, - { 189937, false }, - { 189948, true }, - { 189970, true }, + { 189105, false }, + { 189121, true }, + { 189133, true }, + { 189145, true }, + { 189158, true }, + { 189166, true }, + { 189174, false }, + { 189194, false }, + { 189213, false }, + { 189232, false }, + { 189252, true }, + { 189272, false }, + { 189292, false }, + { 189311, false }, + { 189330, true }, + { 189349, true }, + { 189360, true }, + { 189370, true }, + { 189382, true }, + { 189391, true }, + { 189404, true }, + { 189419, true }, + { 189429, true }, + { 189442, false }, + { 189453, true }, + { 189464, true }, + { 189473, true }, + { 189485, true }, + { 189493, true }, + { 189506, true }, + { 189514, true }, + { 189524, true }, + { 189533, true }, + { 189548, true }, + { 189571, true }, + { 189590, false }, + { 189601, true }, + { 189623, true }, + { 189637, true }, + { 189646, true }, + { 189655, true }, + { 189663, true }, + { 189675, true }, + { 189692, true }, + { 189701, true }, + { 189708, true }, + { 189716, true }, + { 189727, true }, + { 189741, true }, + { 189753, true }, + { 189765, true }, + { 189774, true }, + { 189783, true }, + { 189795, false }, + { 189806, true }, + { 189819, true }, + { 189845, true }, + { 189868, false }, + { 189888, true }, + { 189905, true }, + { 189920, true }, + { 189934, true }, + { 189953, true }, + { 189968, true }, { 189984, true }, - { 189993, true }, - { 190002, true }, - { 190010, true }, - { 190022, true }, - { 190039, true }, - { 190048, true }, - { 190055, true }, + { 189997, true }, + { 190008, true }, + { 190023, true }, + { 190043, true }, { 190063, true }, - { 190074, true }, - { 190088, true }, - { 190100, true }, - { 190112, true }, - { 190121, true }, - { 190130, true }, - { 190142, false }, - { 190153, true }, - { 190166, true }, - { 190192, true }, - { 190215, false }, - { 190235, true }, - { 190252, true }, - { 190267, true }, - { 190281, true }, - { 190300, true }, - { 190315, true }, - { 190331, true }, - { 190344, true }, - { 190355, true }, - { 190370, true }, - { 190390, true }, - { 190410, true }, - { 190425, true }, + { 190078, true }, + { 190095, true }, + { 190104, true }, + { 190124, true }, + { 190142, true }, + { 190157, true }, + { 190178, true }, + { 190198, true }, + { 190213, true }, + { 190228, true }, + { 190243, true }, + { 190258, true }, + { 190272, true }, + { 190286, true }, + { 190295, true }, + { 190306, true }, + { 190321, true }, + { 190330, true }, + { 190348, true }, + { 190359, true }, + { 190369, true }, + { 190378, true }, + { 190389, true }, + { 190399, true }, + { 190408, true }, + { 190418, true }, + { 190431, true }, { 190442, true }, - { 190451, true }, - { 190471, true }, - { 190489, true }, - { 190504, true }, - { 190525, true }, - { 190545, true }, - { 190560, true }, - { 190575, true }, - { 190590, true }, - { 190605, true }, - { 190619, true }, - { 190633, true }, - { 190642, true }, - { 190653, true }, - { 190668, true }, - { 190677, true }, - { 190695, true }, - { 190706, true }, - { 190716, true }, - { 190725, true }, - { 190736, true }, - { 190746, true }, - { 190755, true }, - { 190765, true }, - { 190778, true }, - { 190789, true }, - { 190799, true }, - { 190808, true }, - { 190824, true }, - { 190831, true }, - { 190842, true }, + { 190452, true }, + { 190461, true }, + { 190477, true }, + { 190484, true }, + { 190495, true }, + { 190506, true }, + { 190517, true }, + { 190531, true }, + { 190542, true }, + { 190550, true }, + { 190568, true }, + { 190580, true }, + { 190588, true }, + { 190608, false }, + { 190624, true }, + { 190643, true }, + { 190666, true }, + { 190685, true }, + { 190702, true }, + { 190713, true }, + { 190735, true }, + { 190758, true }, + { 190771, true }, + { 190780, true }, + { 190803, true }, + { 190837, true }, { 190853, true }, - { 190864, true }, - { 190878, true }, - { 190889, true }, - { 190897, true }, - { 190915, true }, - { 190927, true }, - { 190935, true }, - { 190955, false }, - { 190971, true }, - { 190990, true }, - { 191013, true }, - { 191032, true }, - { 191049, true }, + { 190867, true }, + { 190883, true }, + { 190905, true }, + { 190918, true }, + { 190945, true }, + { 190959, true }, + { 190969, true }, + { 190987, true }, + { 190997, true }, + { 191016, true }, + { 191030, true }, + { 191044, true }, { 191060, true }, - { 191082, true }, - { 191105, true }, - { 191118, true }, - { 191127, true }, - { 191150, true }, - { 191184, true }, - { 191200, true }, - { 191214, true }, - { 191230, true }, - { 191252, true }, - { 191265, true }, - { 191292, true }, - { 191306, true }, - { 191316, true }, - { 191334, true }, - { 191344, true }, - { 191363, true }, - { 191377, true }, - { 191391, true }, - { 191407, true }, - { 191418, true }, - { 191433, true }, - { 191444, true }, - { 191467, true }, - { 191482, true }, - { 191505, true }, - { 191514, true }, - { 191527, true }, - { 191545, true }, + { 191071, true }, + { 191086, true }, + { 191097, true }, + { 191120, true }, + { 191135, true }, + { 191158, true }, + { 191167, true }, + { 191180, true }, + { 191198, true }, + { 191215, true }, + { 191225, true }, + { 191250, true }, + { 191268, true }, + { 191283, true }, + { 191293, true }, + { 191305, true }, + { 191318, false }, + { 191330, true }, + { 191347, true }, + { 191357, true }, + { 191380, true }, + { 191401, true }, + { 191423, true }, + { 191441, true }, + { 191452, true }, + { 191466, true }, + { 191479, true }, + { 191496, true }, + { 191504, true }, + { 191512, true }, + { 191523, true }, + { 191535, true }, + { 191549, true }, { 191562, true }, - { 191572, true }, + { 191573, true }, + { 191583, true }, { 191597, true }, - { 191615, true }, - { 191630, true }, - { 191640, true }, - { 191652, true }, - { 191665, false }, + { 191612, true }, + { 191622, true }, + { 191633, true }, + { 191646, true }, + { 191655, true }, + { 191664, true }, { 191677, true }, - { 191694, true }, - { 191704, true }, - { 191727, true }, + { 191693, false }, + { 191706, false }, + { 191718, true }, + { 191734, true }, { 191748, true }, - { 191770, true }, - { 191788, true }, - { 191799, true }, + { 191765, true }, + { 191776, true }, + { 191791, true }, + { 191801, true }, { 191813, true }, - { 191826, true }, - { 191843, true }, - { 191851, true }, - { 191859, true }, - { 191870, true }, - { 191882, true }, + { 191831, true }, + { 191845, true }, + { 191858, true }, + { 191876, true }, + { 191885, true }, { 191896, true }, - { 191909, true }, - { 191920, true }, - { 191930, true }, - { 191944, true }, - { 191959, true }, - { 191969, true }, - { 191980, true }, - { 191993, true }, - { 192002, true }, - { 192011, true }, - { 192024, true }, - { 192040, false }, - { 192053, false }, - { 192065, true }, - { 192081, true }, - { 192095, true }, - { 192112, true }, - { 192123, true }, - { 192138, true }, - { 192148, true }, - { 192160, true }, - { 192178, true }, - { 192192, true }, - { 192205, true }, - { 192223, true }, + { 191908, true }, + { 191921, true }, + { 191933, true }, + { 191942, true }, + { 191953, true }, + { 191970, true }, + { 191986, true }, + { 191998, true }, + { 192010, true }, + { 192022, true }, + { 192039, true }, + { 192051, true }, + { 192061, true }, + { 192074, true }, + { 192082, true }, + { 192099, true }, + { 192113, true }, + { 192128, true }, + { 192140, true }, + { 192147, true }, + { 192163, true }, + { 192171, true }, + { 192180, true }, + { 192187, true }, + { 192204, true }, + { 192217, true }, { 192232, true }, - { 192243, true }, - { 192255, true }, - { 192268, true }, - { 192280, true }, - { 192289, true }, - { 192300, true }, - { 192317, true }, - { 192333, true }, - { 192345, true }, - { 192357, true }, - { 192369, true }, + { 192242, true }, + { 192261, true }, + { 192272, true }, + { 192291, true }, + { 192314, true }, + { 192326, false }, + { 192340, true }, + { 192356, true }, + { 192374, true }, { 192386, true }, - { 192398, true }, - { 192408, true }, - { 192421, true }, - { 192429, true }, - { 192446, true }, - { 192460, true }, - { 192475, true }, - { 192487, true }, - { 192494, true }, - { 192510, true }, - { 192518, true }, - { 192527, true }, - { 192534, true }, - { 192551, true }, - { 192564, true }, - { 192579, true }, - { 192589, true }, - { 192608, true }, - { 192619, true }, - { 192638, true }, - { 192661, true }, - { 192673, false }, + { 192403, true }, + { 192414, true }, + { 192430, false }, + { 192449, true }, + { 192462, true }, + { 192477, true }, + { 192496, true }, + { 192507, true }, + { 192523, true }, + { 192544, true }, + { 192560, true }, + { 192572, true }, + { 192586, true }, + { 192600, true }, + { 192621, true }, + { 192634, true }, + { 192644, true }, + { 192665, true }, { 192687, true }, - { 192703, true }, - { 192721, true }, - { 192733, true }, + { 192698, true }, + { 192715, true }, + { 192730, true }, { 192750, true }, - { 192761, true }, - { 192777, false }, - { 192796, true }, - { 192809, true }, - { 192824, true }, - { 192843, true }, + { 192781, true }, + { 192793, true }, + { 192808, true }, + { 192827, false }, + { 192844, true }, { 192859, true }, - { 192880, true }, - { 192896, true }, - { 192908, true }, - { 192922, true }, + { 192875, true }, + { 192887, true }, + { 192910, true }, + { 192925, true }, { 192936, true }, - { 192957, true }, - { 192970, true }, - { 192980, true }, - { 193001, true }, - { 193023, true }, - { 193034, true }, - { 193051, true }, - { 193066, true }, - { 193086, true }, - { 193117, true }, - { 193129, true }, - { 193144, true }, - { 193163, false }, - { 193180, true }, - { 193195, true }, - { 193211, true }, - { 193223, true }, - { 193246, true }, - { 193261, true }, - { 193272, true }, - { 193280, true }, - { 193303, true }, - { 193315, true }, - { 193328, true }, - { 193336, true }, - { 193362, true }, + { 192944, true }, + { 192967, true }, + { 192979, true }, + { 192992, true }, + { 193000, true }, + { 193026, true }, + { 193044, true }, + { 193057, true }, + { 193074, true }, + { 193100, true }, + { 193112, true }, + { 193139, true }, + { 193170, true }, + { 193181, true }, + { 193191, true }, + { 193206, true }, + { 193217, true }, + { 193228, true }, + { 193244, true }, + { 193256, true }, + { 193265, true }, + { 193278, true }, + { 193306, true }, + { 193327, true }, + { 193341, true }, + { 193363, true }, { 193380, true }, - { 193393, true }, - { 193410, true }, - { 193436, true }, - { 193448, true }, + { 193390, true }, + { 193402, true }, + { 193418, true }, + { 193432, true }, + { 193443, true }, + { 193457, true }, { 193475, true }, - { 193506, true }, - { 193517, true }, - { 193527, true }, - { 193542, true }, - { 193553, true }, - { 193564, true }, - { 193580, true }, - { 193592, true }, - { 193601, true }, - { 193614, true }, + { 193492, true }, + { 193512, true }, + { 193523, true }, + { 193534, false }, + { 193541, true }, + { 193551, true }, + { 193578, true }, + { 193598, true }, + { 193616, true }, + { 193631, false }, { 193642, true }, - { 193663, true }, - { 193677, true }, - { 193699, true }, - { 193716, true }, - { 193726, true }, - { 193738, true }, - { 193754, true }, - { 193768, true }, - { 193779, true }, - { 193793, true }, - { 193811, true }, - { 193828, true }, - { 193848, true }, - { 193859, true }, - { 193870, false }, - { 193877, true }, - { 193887, true }, - { 193914, true }, - { 193934, true }, - { 193952, true }, - { 193967, false }, - { 193978, true }, - { 193994, true }, - { 194011, true }, - { 194028, true }, - { 194050, true }, - { 194064, true }, - { 194080, false }, - { 194097, true }, - { 194113, true }, - { 194123, true }, - { 194141, true }, - { 194155, true }, - { 194176, true }, - { 194194, true }, - { 194211, true }, - { 194229, true }, - { 194247, true }, - { 194265, true }, - { 194279, true }, + { 193658, true }, + { 193675, true }, + { 193692, true }, + { 193714, true }, + { 193728, true }, + { 193744, false }, + { 193761, true }, + { 193777, true }, + { 193787, true }, + { 193805, true }, + { 193819, true }, + { 193840, true }, + { 193858, true }, + { 193875, true }, + { 193893, true }, + { 193911, true }, + { 193929, true }, + { 193943, true }, + { 193953, true }, + { 193964, true }, + { 193986, true }, + { 194002, true }, + { 194024, true }, + { 194041, true }, + { 194061, true }, + { 194072, true }, + { 194091, true }, + { 194105, true }, + { 194122, true }, + { 194134, true }, + { 194151, true }, + { 194172, true }, + { 194188, true }, + { 194200, true }, + { 194223, true }, + { 194241, true }, + { 194252, true }, + { 194262, true }, + { 194278, true }, { 194289, true }, - { 194300, true }, - { 194322, true }, - { 194338, true }, - { 194360, true }, - { 194377, true }, - { 194397, true }, - { 194408, true }, - { 194427, true }, - { 194441, true }, - { 194453, true }, - { 194470, true }, - { 194491, true }, - { 194507, true }, - { 194519, true }, - { 194542, true }, + { 194301, false }, + { 194321, true }, + { 194340, true }, + { 194353, true }, + { 194374, true }, + { 194384, true }, + { 194398, true }, + { 194415, true }, + { 194435, true }, + { 194449, true }, + { 194464, true }, + { 194478, true }, + { 194492, true }, + { 194510, true }, + { 194524, true }, + { 194539, true }, { 194560, true }, { 194571, true }, - { 194581, true }, - { 194597, true }, - { 194608, true }, - { 194620, false }, - { 194640, true }, - { 194659, true }, - { 194672, true }, - { 194693, true }, - { 194703, true }, + { 194585, true }, + { 194601, true }, + { 194614, false }, + { 194628, true }, + { 194644, true }, + { 194661, true }, + { 194677, true }, + { 194700, true }, + { 194709, false }, { 194717, true }, - { 194734, true }, - { 194754, true }, - { 194768, true }, - { 194783, true }, - { 194797, true }, - { 194811, true }, - { 194829, true }, - { 194843, true }, - { 194858, true }, - { 194879, true }, - { 194890, true }, - { 194904, true }, - { 194920, true }, - { 194933, false }, - { 194947, true }, - { 194963, true }, - { 194980, true }, - { 194996, true }, - { 195019, true }, - { 195028, false }, - { 195036, true }, - { 195046, false }, - { 195068, true }, - { 195082, true }, - { 195095, true }, - { 195110, true }, - { 195124, true }, - { 195139, true }, - { 195153, true }, - { 195167, true }, - { 195180, true }, - { 195194, true }, - { 195207, true }, - { 195235, true }, - { 195247, true }, + { 194727, false }, + { 194749, true }, + { 194763, true }, + { 194776, true }, + { 194791, true }, + { 194805, true }, + { 194820, true }, + { 194834, true }, + { 194848, true }, + { 194861, true }, + { 194875, true }, + { 194888, true }, + { 194916, true }, + { 194928, true }, + { 194943, true }, + { 194968, true }, + { 194982, true }, + { 195003, true }, + { 195014, true }, + { 195024, true }, + { 195032, true }, + { 195050, true }, + { 195062, true }, + { 195079, true }, + { 195089, true }, + { 195107, true }, + { 195132, true }, + { 195152, true }, + { 195173, true }, + { 195193, true }, + { 195203, true }, + { 195216, false }, + { 195241, true }, { 195262, true }, - { 195287, true }, - { 195301, true }, + { 195288, true }, + { 195308, true }, { 195322, true }, - { 195333, true }, - { 195343, true }, - { 195351, true }, - { 195369, true }, - { 195381, true }, - { 195398, true }, - { 195408, true }, - { 195426, true }, - { 195451, true }, - { 195471, true }, - { 195492, true }, - { 195512, true }, - { 195522, true }, - { 195535, false }, - { 195560, true }, - { 195581, true }, - { 195607, true }, - { 195627, true }, - { 195641, true }, - { 195658, true }, - { 195671, true }, - { 195682, true }, + { 195339, true }, + { 195352, true }, + { 195363, true }, + { 195371, true }, + { 195380, true }, + { 195388, true }, + { 195402, true }, + { 195416, true }, + { 195429, true }, + { 195445, true }, + { 195458, true }, + { 195468, true }, + { 195479, true }, + { 195490, true }, + { 195508, true }, + { 195524, true }, + { 195534, false }, + { 195546, true }, + { 195558, true }, + { 195576, true }, + { 195597, true }, + { 195621, true }, + { 195633, true }, + { 195643, true }, + { 195659, true }, + { 195683, true }, { 195690, true }, - { 195699, true }, - { 195707, true }, - { 195721, true }, - { 195735, true }, - { 195748, true }, - { 195764, true }, - { 195777, true }, - { 195787, true }, - { 195798, true }, - { 195809, true }, - { 195827, true }, - { 195843, true }, - { 195853, false }, - { 195865, true }, - { 195877, true }, - { 195895, true }, - { 195916, true }, - { 195940, true }, - { 195952, true }, - { 195962, true }, - { 195978, true }, - { 196002, true }, - { 196009, true }, - { 196025, true }, - { 196042, true }, - { 196056, true }, - { 196068, true }, - { 196080, true }, - { 196093, true }, - { 196105, true }, - { 196115, true }, - { 196129, true }, - { 196138, true }, - { 196159, true }, - { 196172, true }, + { 195706, true }, + { 195723, true }, + { 195737, true }, + { 195749, true }, + { 195761, true }, + { 195774, true }, + { 195786, true }, + { 195796, true }, + { 195810, true }, + { 195819, true }, + { 195840, true }, + { 195853, true }, + { 195870, true }, + { 195885, true }, + { 195910, true }, + { 195936, true }, + { 195951, true }, + { 195961, true }, + { 195972, true }, + { 195981, true }, + { 196003, true }, + { 196012, true }, + { 196027, true }, + { 196037, true }, + { 196053, true }, + { 196066, true }, + { 196078, true }, + { 196095, true }, + { 196116, true }, + { 196137, true }, + { 196154, true }, + { 196170, true }, { 196189, true }, - { 196204, true }, - { 196229, true }, - { 196255, true }, - { 196270, true }, - { 196280, true }, - { 196291, true }, - { 196300, true }, - { 196322, true }, - { 196331, true }, - { 196346, true }, - { 196356, true }, - { 196372, true }, - { 196385, true }, - { 196397, true }, - { 196414, true }, - { 196435, true }, - { 196456, true }, - { 196473, true }, - { 196489, true }, - { 196508, true }, - { 196520, true }, - { 196534, true }, - { 196549, true }, - { 196565, true }, - { 196579, true }, - { 196591, true }, - { 196605, true }, - { 196617, true }, - { 196636, true }, - { 196652, true }, - { 196668, true }, - { 196684, true }, - { 196702, true }, - { 196721, true }, - { 196731, true }, - { 196748, true }, - { 196765, true }, - { 196783, true }, - { 196801, true }, - { 196816, true }, - { 196832, true }, - { 196846, true }, + { 196201, true }, + { 196215, true }, + { 196230, true }, + { 196246, true }, + { 196260, true }, + { 196272, true }, + { 196286, true }, + { 196298, true }, + { 196317, true }, + { 196333, true }, + { 196349, true }, + { 196365, true }, + { 196383, true }, + { 196402, true }, + { 196412, true }, + { 196429, true }, + { 196446, true }, + { 196464, true }, + { 196482, true }, + { 196497, true }, + { 196513, true }, + { 196527, true }, + { 196545, true }, + { 196562, true }, + { 196575, true }, + { 196594, true }, + { 196614, true }, + { 196631, true }, + { 196647, true }, + { 196665, true }, + { 196678, true }, + { 196695, false }, + { 196712, false }, + { 196733, true }, + { 196750, true }, + { 196760, true }, + { 196779, true }, + { 196793, true }, + { 196806, true }, + { 196814, true }, + { 196825, true }, + { 196840, true }, + { 196853, true }, { 196864, true }, - { 196881, true }, + { 196882, true }, { 196894, true }, - { 196913, true }, - { 196933, true }, - { 196950, true }, - { 196966, true }, - { 196984, true }, - { 196997, true }, - { 197014, false }, - { 197031, false }, - { 197052, true }, - { 197069, true }, - { 197079, true }, + { 196907, true }, + { 196931, true }, + { 196940, true }, + { 196955, true }, + { 196979, true }, + { 197006, true }, + { 197024, true }, + { 197036, true }, + { 197045, true }, + { 197055, true }, + { 197066, true }, + { 197075, true }, { 197098, true }, - { 197112, true }, - { 197125, true }, - { 197133, true }, - { 197144, true }, - { 197159, true }, - { 197172, true }, - { 197183, true }, - { 197201, true }, - { 197213, true }, - { 197226, true }, - { 197250, true }, - { 197259, true }, - { 197274, true }, - { 197301, true }, - { 197319, true }, - { 197331, true }, - { 197340, true }, - { 197350, true }, - { 197361, true }, - { 197370, true }, - { 197393, true }, - { 197406, true }, - { 197414, true }, - { 197422, true }, - { 197430, true }, - { 197440, true }, - { 197447, true }, - { 197466, true }, - { 197473, true }, - { 197488, true }, - { 197497, true }, - { 197509, false }, - { 197529, true }, - { 197539, true }, - { 197550, true }, - { 197567, true }, - { 197583, true }, - { 197602, true }, - { 197620, true }, - { 197637, true }, - { 197659, false }, - { 197672, true }, - { 197697, true }, - { 197716, true }, - { 197728, true }, - { 197739, true }, - { 197752, true }, - { 197771, true }, - { 197786, true }, - { 197801, true }, - { 197817, true }, - { 197840, true }, - { 197860, true }, - { 197873, true }, - { 197886, true }, - { 197900, true }, - { 197914, true }, - { 197925, true }, - { 197936, true }, - { 197946, true }, - { 197966, true }, - { 197985, true }, - { 197997, true }, - { 198014, true }, - { 198032, true }, - { 198041, true }, - { 198053, true }, - { 198068, true }, - { 198087, true }, - { 198098, true }, - { 198122, true }, - { 198144, true }, - { 198154, true }, - { 198166, true }, - { 198176, true }, - { 198193, true }, - { 198203, true }, - { 198217, true }, - { 198233, true }, - { 198264, true }, - { 198273, true }, - { 198287, true }, - { 198300, true }, - { 198317, true }, - { 198334, true }, - { 198346, true }, - { 198362, true }, - { 198379, true }, - { 198392, true }, - { 198405, true }, - { 198415, true }, + { 197111, true }, + { 197119, true }, + { 197127, true }, + { 197135, true }, + { 197145, true }, + { 197152, true }, + { 197171, true }, + { 197178, true }, + { 197193, true }, + { 197202, true }, + { 197214, false }, + { 197234, true }, + { 197244, true }, + { 197255, true }, + { 197272, true }, + { 197288, true }, + { 197307, true }, + { 197325, true }, + { 197342, true }, + { 197364, false }, + { 197377, true }, + { 197402, true }, + { 197421, true }, + { 197433, true }, + { 197444, true }, + { 197457, true }, + { 197476, true }, + { 197491, true }, + { 197506, true }, + { 197522, true }, + { 197545, true }, + { 197565, true }, + { 197578, true }, + { 197591, true }, + { 197605, true }, + { 197619, true }, + { 197630, true }, + { 197641, true }, + { 197651, true }, + { 197671, true }, + { 197690, true }, + { 197702, true }, + { 197719, true }, + { 197737, true }, + { 197746, true }, + { 197758, true }, + { 197773, true }, + { 197792, true }, + { 197803, true }, + { 197827, true }, + { 197849, true }, + { 197859, true }, + { 197871, true }, + { 197881, true }, + { 197898, true }, + { 197908, true }, + { 197922, true }, + { 197938, true }, + { 197969, true }, + { 197978, true }, + { 197992, true }, + { 198005, true }, + { 198022, true }, + { 198039, true }, + { 198051, true }, + { 198067, true }, + { 198084, true }, + { 198097, true }, + { 198110, true }, + { 198120, true }, + { 198134, true }, + { 198148, true }, + { 198157, true }, + { 198167, true }, + { 198182, true }, + { 198192, true }, + { 198206, true }, + { 198222, true }, + { 198239, true }, + { 198252, true }, + { 198266, true }, + { 198276, true }, + { 198294, true }, + { 198311, true }, + { 198327, true }, + { 198344, true }, + { 198366, true }, + { 198388, true }, + { 198399, true }, + { 198411, true }, { 198429, true }, { 198443, true }, - { 198452, true }, - { 198462, true }, - { 198477, true }, - { 198487, true }, - { 198501, true }, - { 198517, true }, - { 198534, true }, - { 198547, true }, + { 198456, true }, + { 198469, true }, + { 198488, true }, + { 198508, true }, + { 198520, true }, + { 198527, true }, + { 198539, true }, + { 198549, true }, { 198561, true }, - { 198571, true }, - { 198589, true }, - { 198606, true }, - { 198622, true }, - { 198639, true }, - { 198661, true }, - { 198683, true }, + { 198572, true }, + { 198587, true }, + { 198599, true }, + { 198611, true }, + { 198630, true }, + { 198656, true }, + { 198665, true }, + { 198680, true }, { 198694, true }, - { 198706, true }, - { 198724, true }, - { 198738, true }, - { 198751, true }, - { 198764, true }, - { 198783, true }, - { 198803, true }, - { 198815, true }, - { 198822, true }, - { 198834, true }, - { 198844, true }, - { 198856, true }, - { 198867, true }, - { 198882, true }, - { 198894, true }, + { 198710, true }, + { 198725, true }, + { 198747, true }, + { 198760, true }, + { 198774, true }, + { 198799, true }, + { 198815, false }, + { 198833, true }, + { 198847, true }, + { 198857, true }, + { 198868, true }, + { 198883, true }, + { 198893, true }, { 198906, true }, - { 198925, true }, - { 198951, true }, - { 198960, true }, - { 198975, true }, - { 198989, true }, - { 199005, true }, - { 199020, true }, - { 199042, true }, - { 199055, true }, - { 199069, true }, - { 199094, true }, - { 199110, false }, - { 199128, true }, - { 199142, true }, - { 199152, true }, - { 199163, true }, - { 199178, true }, - { 199188, true }, - { 199201, true }, - { 199213, true }, - { 199231, true }, - { 199247, true }, - { 199262, true }, - { 199271, true }, - { 199286, false }, - { 199309, true }, - { 199325, true }, + { 198918, true }, + { 198936, true }, + { 198952, true }, + { 198967, true }, + { 198976, true }, + { 198991, false }, + { 199014, true }, + { 199030, true }, + { 199043, true }, + { 199054, true }, + { 199064, true }, + { 199080, true }, + { 199097, true }, + { 199117, true }, + { 199129, true }, + { 199160, true }, + { 199181, true }, + { 199206, true }, + { 199227, true }, + { 199238, true }, + { 199255, true }, + { 199266, true }, + { 199278, true }, + { 199293, true }, + { 199305, true }, + { 199318, true }, { 199338, true }, - { 199349, true }, - { 199359, true }, + { 199346, true }, + { 199357, true }, + { 199366, true }, { 199375, true }, - { 199392, true }, - { 199412, true }, - { 199424, true }, - { 199455, true }, - { 199476, true }, - { 199501, true }, - { 199522, true }, - { 199533, true }, - { 199550, true }, - { 199561, true }, - { 199573, true }, - { 199588, true }, - { 199600, true }, - { 199613, true }, - { 199633, true }, - { 199641, true }, - { 199652, true }, - { 199661, true }, - { 199670, true }, - { 199677, true }, - { 199685, true }, - { 199699, true }, - { 199710, true }, - { 199722, false }, - { 199729, true }, - { 199741, true }, + { 199382, true }, + { 199390, true }, + { 199404, true }, + { 199415, true }, + { 199427, false }, + { 199434, true }, + { 199446, true }, + { 199453, true }, + { 199461, true }, + { 199474, false }, + { 199483, true }, + { 199492, true }, + { 199503, true }, + { 199510, true }, + { 199527, true }, + { 199536, true }, + { 199544, true }, + { 199558, true }, + { 199577, false }, + { 199597, true }, + { 199607, true }, + { 199628, true }, + { 199637, true }, + { 199648, false }, + { 199660, true }, + { 199674, true }, + { 199691, true }, + { 199708, true }, + { 199719, true }, { 199748, true }, - { 199756, true }, - { 199769, false }, - { 199778, true }, - { 199787, true }, - { 199798, true }, - { 199805, true }, + { 199761, true }, + { 199782, true }, + { 199796, true }, + { 199808, true }, { 199822, true }, - { 199831, true }, - { 199839, true }, - { 199853, true }, - { 199872, false }, - { 199892, true }, - { 199902, true }, - { 199923, true }, - { 199932, true }, - { 199943, false }, - { 199955, true }, - { 199969, true }, - { 199986, true }, - { 200003, true }, - { 200014, true }, - { 200043, true }, - { 200056, true }, + { 199830, true }, + { 199847, true }, + { 199859, true }, + { 199874, true }, + { 199888, true }, + { 199896, true }, + { 199904, true }, + { 199916, true }, + { 199924, true }, + { 199937, true }, + { 199949, true }, + { 199963, true }, + { 199980, true }, + { 199998, true }, + { 200011, true }, + { 200021, true }, + { 200030, true }, + { 200040, true }, + { 200052, false }, + { 200064, true }, { 200077, true }, - { 200091, true }, - { 200103, true }, - { 200117, true }, - { 200125, true }, - { 200142, true }, - { 200154, true }, - { 200169, true }, - { 200183, true }, - { 200191, true }, - { 200199, true }, - { 200211, true }, - { 200219, true }, - { 200232, true }, + { 200090, true }, + { 200099, true }, + { 200122, true }, + { 200136, true }, + { 200144, true }, + { 200157, true }, + { 200173, true }, + { 200190, true }, + { 200203, true }, + { 200221, true }, + { 200233, true }, { 200244, true }, - { 200258, true }, - { 200275, true }, - { 200293, true }, - { 200306, true }, - { 200316, true }, - { 200325, true }, - { 200335, true }, - { 200347, false }, - { 200359, true }, - { 200372, true }, - { 200385, true }, - { 200394, true }, - { 200417, true }, - { 200431, true }, - { 200439, true }, - { 200452, true }, - { 200468, true }, - { 200485, true }, - { 200498, true }, - { 200516, true }, - { 200528, true }, - { 200539, true }, - { 200558, true }, - { 200580, true }, - { 200602, true }, - { 200622, true }, - { 200640, false }, - { 200656, true }, - { 200679, true }, - { 200688, true }, - { 200696, true }, - { 200711, true }, - { 200730, true }, - { 200746, true }, - { 200760, true }, - { 200776, true }, - { 200796, false }, - { 200821, true }, - { 200831, true }, - { 200849, true }, - { 200856, true }, - { 200868, true }, - { 200881, true }, - { 200891, true }, - { 200907, true }, - { 200915, true }, + { 200263, true }, + { 200285, true }, + { 200307, true }, + { 200327, true }, + { 200345, false }, + { 200361, true }, + { 200384, true }, + { 200393, true }, + { 200401, true }, + { 200416, true }, + { 200435, true }, + { 200451, true }, + { 200465, true }, + { 200481, true }, + { 200501, false }, + { 200526, true }, + { 200536, true }, + { 200554, true }, + { 200561, true }, + { 200573, true }, + { 200586, true }, + { 200596, true }, + { 200612, true }, + { 200620, true }, + { 200628, true }, + { 200636, true }, + { 200643, false }, + { 200666, true }, + { 200685, true }, + { 200710, true }, + { 200727, true }, + { 200739, true }, + { 200751, true }, + { 200761, true }, + { 200772, true }, + { 200787, true }, + { 200796, true }, + { 200810, true }, + { 200819, true }, + { 200834, true }, + { 200845, true }, + { 200858, true }, + { 200880, true }, + { 200892, true }, + { 200902, true }, { 200923, true }, - { 200931, true }, - { 200938, false }, + { 200940, true }, { 200961, true }, - { 200980, true }, - { 201005, true }, - { 201022, true }, - { 201034, true }, - { 201046, true }, - { 201056, true }, - { 201067, true }, - { 201082, true }, - { 201091, true }, - { 201105, true }, - { 201114, true }, - { 201129, true }, - { 201140, true }, + { 200975, true }, + { 200991, true }, + { 201004, true }, + { 201016, true }, + { 201031, true }, + { 201041, true }, + { 201054, true }, + { 201078, true }, + { 201097, true }, + { 201109, true }, + { 201127, true }, + { 201136, false }, { 201153, true }, - { 201175, true }, - { 201187, true }, - { 201197, true }, - { 201218, true }, - { 201235, true }, - { 201256, true }, - { 201270, true }, - { 201286, true }, - { 201299, true }, - { 201311, true }, - { 201326, true }, - { 201336, true }, - { 201349, true }, - { 201373, true }, - { 201392, true }, - { 201404, true }, - { 201422, true }, - { 201431, false }, - { 201448, true }, - { 201466, true }, - { 201480, true }, - { 201493, true }, - { 201506, false }, - { 201527, true }, - { 201537, true }, - { 201556, true }, - { 201569, true }, - { 201589, true }, - { 201614, true }, - { 201625, true }, - { 201637, true }, - { 201652, true }, - { 201665, true }, - { 201680, true }, - { 201695, true }, - { 201715, true }, - { 201728, true }, - { 201756, true }, - { 201773, false }, - { 201782, true }, - { 201801, true }, - { 201818, false }, - { 201833, true }, + { 201171, true }, + { 201185, true }, + { 201198, true }, + { 201211, false }, + { 201232, true }, + { 201242, true }, + { 201261, true }, + { 201274, true }, + { 201294, true }, + { 201319, true }, + { 201330, true }, + { 201342, true }, + { 201357, true }, + { 201370, true }, + { 201385, true }, + { 201400, true }, + { 201420, true }, + { 201433, true }, + { 201461, true }, + { 201478, false }, + { 201487, true }, + { 201506, true }, + { 201523, false }, + { 201538, true }, + { 201548, true }, + { 201561, true }, + { 201577, true }, + { 201593, true }, + { 201611, true }, + { 201621, true }, + { 201634, true }, + { 201646, true }, + { 201659, true }, + { 201672, true }, + { 201681, true }, + { 201705, true }, + { 201729, false }, + { 201742, true }, + { 201753, true }, + { 201769, true }, + { 201781, true }, + { 201797, true }, + { 201814, true }, + { 201831, false }, { 201843, true }, - { 201856, true }, - { 201872, true }, + { 201860, true }, + { 201879, false }, { 201888, true }, - { 201906, true }, - { 201916, true }, - { 201929, true }, - { 201941, true }, - { 201954, true }, - { 201967, true }, - { 201976, true }, - { 202000, true }, - { 202024, true }, - { 202041, false }, - { 202054, true }, - { 202065, true }, - { 202081, true }, - { 202093, true }, - { 202109, true }, - { 202126, true }, - { 202143, false }, - { 202155, true }, - { 202172, true }, - { 202191, false }, - { 202200, true }, - { 202222, true }, - { 202235, false }, + { 201910, true }, + { 201923, false }, + { 201938, true }, + { 201960, true }, + { 201975, true }, + { 201987, true }, + { 202006, false }, + { 202029, true }, + { 202045, true }, + { 202061, true }, + { 202079, true }, + { 202097, false }, + { 202117, true }, + { 202129, true }, + { 202142, true }, + { 202158, true }, + { 202169, true }, + { 202188, true }, + { 202199, true }, + { 202209, true }, + { 202226, true }, + { 202238, true }, { 202250, true }, - { 202272, true }, - { 202287, true }, - { 202299, true }, - { 202318, false }, - { 202341, true }, - { 202357, true }, - { 202373, true }, - { 202391, true }, - { 202409, false }, - { 202429, true }, - { 202441, true }, - { 202454, true }, - { 202470, true }, - { 202481, true }, - { 202500, true }, - { 202511, true }, - { 202521, true }, - { 202538, true }, - { 202550, true }, - { 202562, true }, - { 202581, true }, - { 202593, true }, - { 202610, true }, + { 202269, true }, + { 202281, true }, + { 202298, true }, + { 202319, true }, + { 202330, true }, + { 202349, true }, + { 202370, true }, + { 202380, true }, + { 202389, true }, + { 202402, true }, + { 202410, true }, + { 202426, true }, + { 202450, false }, + { 202468, true }, + { 202486, false }, + { 202506, true }, + { 202522, true }, + { 202540, true }, + { 202552, true }, + { 202569, true }, + { 202592, true }, + { 202611, true }, { 202631, true }, - { 202642, true }, - { 202661, true }, - { 202682, true }, - { 202692, true }, - { 202701, true }, - { 202714, true }, - { 202722, true }, + { 202644, true }, + { 202656, true }, + { 202666, true }, + { 202674, true }, + { 202696, true }, + { 202716, true }, + { 202724, true }, { 202738, true }, - { 202762, false }, - { 202780, true }, - { 202798, false }, - { 202818, true }, - { 202834, true }, - { 202852, true }, - { 202864, true }, - { 202881, true }, - { 202904, true }, - { 202923, true }, - { 202943, true }, - { 202956, true }, - { 202968, true }, - { 202978, true }, - { 202986, true }, - { 203008, true }, - { 203028, true }, + { 202754, true }, + { 202764, true }, + { 202778, true }, + { 202790, true }, + { 202799, true }, + { 202808, true }, + { 202825, true }, + { 202835, true }, + { 202856, true }, + { 202869, true }, + { 202886, true }, + { 202907, true }, + { 202925, true }, + { 202936, true }, + { 202954, true }, + { 202970, true }, + { 202983, true }, + { 202993, true }, + { 203010, true }, + { 203027, true }, { 203036, true }, { 203050, true }, - { 203066, true }, + { 203064, true }, { 203076, true }, - { 203090, true }, - { 203102, true }, - { 203111, true }, - { 203120, true }, - { 203137, true }, - { 203147, true }, - { 203168, true }, - { 203181, true }, - { 203198, true }, - { 203219, true }, - { 203237, true }, + { 203095, true }, + { 203105, true }, + { 203122, true }, + { 203144, true }, + { 203166, true }, + { 203180, true }, + { 203194, true }, + { 203212, true }, + { 203227, true }, + { 203241, true }, { 203248, true }, - { 203266, true }, - { 203282, true }, - { 203295, true }, - { 203305, true }, + { 203257, true }, + { 203269, true }, + { 203275, true }, + { 203281, true }, + { 203289, true }, + { 203301, true }, { 203322, true }, - { 203339, true }, - { 203348, true }, - { 203362, true }, - { 203376, true }, - { 203388, true }, - { 203407, true }, + { 203334, true }, + { 203344, true }, + { 203355, true }, + { 203367, true }, + { 203385, true }, + { 203398, true }, { 203417, true }, - { 203434, true }, - { 203456, true }, - { 203478, true }, - { 203492, true }, - { 203506, true }, - { 203524, true }, - { 203539, true }, - { 203553, true }, - { 203560, true }, - { 203569, true }, - { 203581, true }, - { 203587, true }, - { 203593, true }, - { 203601, true }, - { 203613, true }, - { 203634, true }, - { 203646, true }, - { 203656, true }, - { 203667, true }, - { 203679, true }, - { 203697, true }, - { 203710, true }, - { 203729, true }, + { 203433, true }, + { 203446, true }, + { 203457, true }, + { 203470, true }, + { 203488, true }, + { 203502, true }, + { 203524, false }, + { 203538, true }, + { 203557, true }, + { 203573, true }, + { 203584, true }, + { 203594, true }, + { 203602, true }, + { 203619, true }, + { 203633, true }, + { 203645, true }, + { 203662, true }, + { 203676, true }, + { 203690, false }, + { 203703, true }, + { 203721, true }, + { 203733, true }, { 203745, true }, - { 203758, true }, - { 203769, true }, - { 203782, true }, + { 203764, true }, + { 203783, true }, { 203800, true }, - { 203814, true }, - { 203836, false }, - { 203850, true }, - { 203869, true }, - { 203885, true }, - { 203896, true }, - { 203906, true }, - { 203914, true }, - { 203931, true }, - { 203945, true }, - { 203957, true }, - { 203974, true }, - { 203988, true }, - { 204002, false }, - { 204015, true }, - { 204033, true }, - { 204045, true }, - { 204057, true }, - { 204076, true }, - { 204095, true }, - { 204112, true }, - { 204125, true }, - { 204139, true }, - { 204151, true }, - { 204164, true }, - { 204180, true }, - { 204193, true }, - { 204206, true }, - { 204221, true }, + { 203813, true }, + { 203827, true }, + { 203839, true }, + { 203852, true }, + { 203868, true }, + { 203881, true }, + { 203894, true }, + { 203909, true }, + { 203937, true }, + { 203947, true }, + { 203958, true }, + { 203971, true }, + { 203986, true }, + { 203999, true }, + { 204011, true }, + { 204025, true }, + { 204039, true }, + { 204055, true }, + { 204078, true }, + { 204094, true }, + { 204109, true }, + { 204133, true }, + { 204148, true }, + { 204160, true }, + { 204182, true }, + { 204201, true }, + { 204219, true }, + { 204232, true }, { 204249, true }, - { 204259, true }, - { 204270, true }, - { 204283, true }, - { 204298, true }, - { 204311, true }, - { 204323, true }, - { 204337, true }, - { 204351, true }, - { 204367, true }, - { 204390, true }, - { 204406, true }, - { 204421, true }, - { 204445, true }, - { 204460, true }, - { 204472, true }, - { 204494, true }, - { 204513, true }, - { 204531, true }, - { 204544, true }, - { 204561, true }, - { 204572, true }, - { 204592, true }, - { 204604, true }, - { 204616, true }, - { 204634, true }, - { 204651, true }, - { 204666, true }, - { 204685, true }, - { 204698, true }, - { 204714, true }, - { 204732, true }, - { 204748, true }, - { 204761, true }, - { 204781, true }, + { 204260, true }, + { 204280, true }, + { 204292, true }, + { 204304, true }, + { 204322, true }, + { 204339, true }, + { 204354, true }, + { 204373, true }, + { 204386, true }, + { 204402, true }, + { 204420, true }, + { 204436, true }, + { 204449, true }, + { 204469, true }, + { 204482, true }, + { 204504, true }, + { 204521, true }, + { 204536, true }, + { 204552, true }, + { 204573, true }, + { 204593, true }, + { 204606, true }, + { 204621, true }, + { 204633, true }, + { 204647, true }, + { 204665, true }, + { 204680, true }, + { 204699, true }, + { 204718, true }, + { 204733, true }, + { 204745, true }, + { 204762, true }, + { 204777, true }, { 204794, true }, - { 204816, true }, - { 204833, true }, - { 204848, true }, - { 204864, true }, - { 204885, true }, - { 204905, true }, - { 204918, true }, - { 204933, true }, - { 204945, true }, - { 204959, true }, - { 204977, true }, - { 204992, true }, - { 205011, true }, - { 205030, true }, - { 205045, true }, - { 205057, true }, - { 205074, true }, - { 205089, true }, + { 204812, true }, + { 204832, true }, + { 204844, true }, + { 204858, true }, + { 204869, true }, + { 204881, true }, + { 204903, true }, + { 204915, true }, + { 204924, true }, + { 204936, true }, + { 204951, true }, + { 204969, true }, + { 204988, true }, + { 205004, true }, + { 205023, true }, + { 205039, true }, + { 205056, true }, + { 205069, true }, + { 205088, true }, { 205106, true }, - { 205124, true }, - { 205144, true }, - { 205156, true }, - { 205170, true }, - { 205181, true }, - { 205193, true }, - { 205215, true }, - { 205227, true }, - { 205236, true }, - { 205248, true }, - { 205263, true }, - { 205281, true }, - { 205300, true }, - { 205316, true }, + { 205112, true }, + { 205130, true }, + { 205153, true }, + { 205162, true }, + { 205170, false }, + { 205190, true }, + { 205207, true }, + { 205221, true }, + { 205233, true }, + { 205252, false }, + { 205269, true }, + { 205288, true }, + { 205299, true }, + { 205318, true }, { 205335, true }, - { 205351, true }, - { 205368, true }, - { 205381, true }, - { 205400, true }, - { 205418, true }, - { 205424, true }, - { 205442, true }, - { 205465, true }, - { 205474, true }, - { 205482, false }, - { 205502, true }, - { 205519, true }, - { 205533, true }, - { 205545, true }, - { 205564, false }, - { 205581, true }, + { 205358, true }, + { 205384, true }, + { 205395, true }, + { 205413, true }, + { 205433, true }, + { 205450, true }, + { 205469, true }, + { 205487, true }, + { 205505, true }, + { 205514, true }, + { 205521, true }, + { 205528, true }, + { 205539, true }, + { 205551, true }, + { 205561, true }, + { 205572, false }, + { 205592, true }, { 205600, true }, { 205611, true }, - { 205630, true }, - { 205647, true }, - { 205670, true }, - { 205696, true }, - { 205707, true }, - { 205725, true }, - { 205745, true }, - { 205762, true }, - { 205781, true }, - { 205799, true }, + { 205622, true }, + { 205633, true }, + { 205656, true }, + { 205680, true }, + { 205703, true }, + { 205726, true }, + { 205754, true }, + { 205783, true }, + { 205798, true }, { 205817, true }, - { 205826, true }, - { 205833, true }, - { 205840, true }, - { 205851, true }, - { 205863, true }, - { 205873, true }, - { 205884, false }, - { 205904, true }, - { 205912, true }, - { 205923, true }, - { 205934, true }, - { 205945, true }, - { 205968, true }, - { 205992, true }, - { 206015, true }, - { 206038, true }, - { 206066, true }, - { 206095, true }, - { 206110, true }, - { 206129, true }, - { 206142, true }, - { 206160, true }, - { 206183, true }, - { 206200, true }, - { 206211, true }, - { 206228, true }, - { 206239, true }, - { 206254, true }, - { 206267, true }, - { 206278, true }, + { 205830, true }, + { 205848, true }, + { 205871, true }, + { 205888, true }, + { 205899, true }, + { 205916, true }, + { 205927, true }, + { 205942, true }, + { 205955, true }, + { 205966, true }, + { 205984, true }, + { 206010, true }, + { 206039, true }, + { 206051, true }, + { 206064, false }, + { 206084, true }, + { 206099, true }, + { 206117, true }, + { 206132, true }, + { 206153, false }, + { 206169, true }, + { 206185, true }, + { 206203, true }, + { 206219, true }, + { 206235, true }, + { 206250, true }, + { 206268, true }, + { 206284, true }, { 206296, true }, - { 206322, true }, - { 206351, true }, - { 206363, true }, - { 206376, false }, - { 206396, true }, - { 206411, true }, - { 206429, true }, - { 206444, true }, - { 206465, false }, - { 206481, true }, - { 206497, true }, - { 206515, true }, - { 206531, true }, - { 206547, true }, - { 206562, true }, + { 206308, true }, + { 206330, true }, + { 206352, true }, + { 206372, true }, + { 206386, true }, + { 206407, true }, + { 206426, true }, + { 206446, true }, + { 206467, true }, + { 206486, true }, + { 206504, false }, + { 206522, true }, + { 206542, true }, + { 206561, true }, { 206580, true }, { 206596, true }, - { 206608, true }, - { 206620, true }, - { 206642, true }, + { 206616, true }, + { 206637, true }, { 206664, true }, - { 206684, true }, - { 206698, true }, - { 206719, true }, - { 206738, true }, - { 206758, true }, - { 206779, true }, - { 206798, true }, - { 206815, true }, - { 206833, false }, - { 206851, true }, - { 206871, true }, - { 206890, true }, - { 206909, true }, - { 206925, true }, - { 206945, true }, - { 206966, true }, - { 206993, true }, - { 207005, true }, - { 207016, true }, - { 207030, true }, - { 207045, true }, - { 207056, true }, - { 207075, true }, - { 207086, true }, - { 207100, true }, - { 207111, true }, - { 207123, true }, - { 207132, true }, - { 207147, true }, - { 207157, true }, - { 207170, true }, - { 207189, true }, - { 207207, true }, - { 207227, true }, - { 207236, true }, - { 207246, true }, - { 207267, false }, - { 207284, true }, - { 207304, true }, - { 207313, true }, - { 207326, true }, - { 207343, true }, - { 207366, true }, - { 207380, true }, - { 207394, true }, - { 207406, true }, - { 207423, true }, - { 207438, true }, - { 207455, true }, - { 207471, true }, - { 207488, true }, - { 207504, true }, - { 207516, true }, - { 207527, true }, - { 207541, false }, - { 207557, true }, - { 207568, true }, - { 207584, true }, - { 207593, true }, - { 207608, true }, - { 207624, true }, - { 207637, true }, + { 206676, true }, + { 206687, true }, + { 206701, true }, + { 206716, true }, + { 206727, true }, + { 206746, true }, + { 206757, true }, + { 206771, true }, + { 206782, true }, + { 206794, true }, + { 206803, true }, + { 206818, true }, + { 206828, true }, + { 206841, true }, + { 206860, true }, + { 206878, true }, + { 206898, true }, + { 206907, true }, + { 206917, true }, + { 206938, false }, + { 206955, true }, + { 206975, true }, + { 206984, true }, + { 206997, true }, + { 207014, true }, + { 207037, true }, + { 207051, true }, + { 207065, true }, + { 207077, true }, + { 207094, true }, + { 207109, true }, + { 207126, true }, + { 207142, true }, + { 207159, true }, + { 207175, true }, + { 207187, true }, + { 207198, true }, + { 207212, false }, + { 207228, true }, + { 207239, true }, + { 207255, true }, + { 207264, true }, + { 207279, true }, + { 207295, true }, + { 207308, true }, + { 207317, true }, + { 207330, true }, + { 207347, true }, + { 207359, true }, + { 207371, true }, + { 207383, true }, + { 207395, true }, + { 207404, true }, + { 207416, true }, + { 207431, true }, + { 207445, true }, + { 207457, true }, + { 207474, true }, + { 207486, true }, + { 207496, true }, + { 207512, true }, + { 207528, true }, + { 207549, true }, + { 207567, true }, + { 207583, true }, + { 207599, true }, + { 207619, true }, + { 207634, true }, { 207646, true }, - { 207659, true }, - { 207676, true }, - { 207688, true }, - { 207700, true }, - { 207712, true }, - { 207724, true }, - { 207733, true }, - { 207745, true }, - { 207760, true }, - { 207774, true }, - { 207786, true }, - { 207803, true }, - { 207815, true }, - { 207825, true }, - { 207841, true }, - { 207857, true }, - { 207878, true }, - { 207896, true }, - { 207912, true }, - { 207928, true }, - { 207948, true }, - { 207963, true }, - { 207975, true }, - { 207990, true }, - { 208000, true }, - { 208015, true }, - { 208027, true }, - { 208039, true }, - { 208054, true }, - { 208068, true }, - { 208079, true }, - { 208090, true }, - { 208101, true }, - { 208112, true }, - { 208120, true }, - { 208133, true }, - { 208147, true }, - { 208160, true }, - { 208178, true }, - { 208195, true }, - { 208205, true }, - { 208218, true }, - { 208235, true }, - { 208249, true }, + { 207661, true }, + { 207671, true }, + { 207686, true }, + { 207698, true }, + { 207710, true }, + { 207725, true }, + { 207739, true }, + { 207750, true }, + { 207761, true }, + { 207772, true }, + { 207783, true }, + { 207791, true }, + { 207804, true }, + { 207818, true }, + { 207831, true }, + { 207849, true }, + { 207866, true }, + { 207876, true }, + { 207889, true }, + { 207906, true }, + { 207920, true }, + { 207929, true }, + { 207944, true }, + { 207958, true }, + { 207971, true }, + { 207985, true }, + { 207999, true }, + { 208007, true }, + { 208026, true }, + { 208046, true }, + { 208063, true }, + { 208078, true }, + { 208093, true }, + { 208107, true }, + { 208125, true }, + { 208141, true }, + { 208157, true }, + { 208171, true }, + { 208187, true }, + { 208209, true }, + { 208226, true }, + { 208245, true }, { 208258, true }, - { 208273, true }, - { 208287, true }, - { 208300, true }, - { 208314, true }, - { 208328, true }, - { 208336, true }, - { 208355, true }, - { 208375, true }, - { 208392, true }, - { 208407, true }, - { 208422, true }, - { 208436, true }, - { 208454, true }, - { 208470, true }, - { 208486, true }, - { 208500, true }, - { 208516, true }, - { 208538, true }, - { 208555, true }, - { 208574, true }, - { 208587, true }, + { 208272, true }, + { 208288, false }, + { 208306, true }, + { 208321, true }, + { 208338, true }, + { 208353, true }, + { 208370, false }, + { 208396, true }, + { 208411, true }, + { 208429, true }, + { 208442, true }, + { 208455, true }, + { 208474, true }, + { 208489, true }, + { 208499, true }, + { 208515, true }, + { 208527, true }, + { 208549, true }, + { 208562, false }, + { 208573, true }, { 208601, true }, - { 208617, false }, - { 208635, true }, - { 208650, true }, - { 208667, true }, + { 208618, true }, + { 208649, true }, + { 208659, true }, + { 208670, true }, { 208682, true }, - { 208699, false }, - { 208725, true }, - { 208740, true }, - { 208758, true }, - { 208771, true }, - { 208784, true }, - { 208803, true }, - { 208818, true }, - { 208828, true }, - { 208844, true }, - { 208856, true }, - { 208878, true }, - { 208891, false }, - { 208902, true }, - { 208930, true }, - { 208947, true }, - { 208978, true }, - { 208988, true }, + { 208696, true }, + { 208708, true }, + { 208716, true }, + { 208724, true }, + { 208742, true }, + { 208753, false }, + { 208773, true }, + { 208791, true }, + { 208811, true }, + { 208826, true }, + { 208841, true }, + { 208858, false }, + { 208872, true }, + { 208892, true }, + { 208903, true }, + { 208928, true }, + { 208949, true }, + { 208967, true }, + { 208982, true }, { 208999, true }, - { 209011, true }, - { 209025, true }, - { 209037, true }, - { 209045, true }, - { 209053, true }, - { 209071, true }, - { 209082, false }, - { 209102, true }, - { 209120, true }, - { 209140, true }, - { 209155, true }, - { 209170, true }, - { 209187, false }, - { 209201, true }, - { 209221, true }, - { 209232, true }, - { 209257, true }, - { 209278, true }, - { 209296, true }, - { 209311, true }, - { 209328, true }, - { 209343, true }, - { 209359, true }, - { 209378, true }, - { 209403, true }, - { 209416, true }, - { 209427, true }, - { 209441, true }, - { 209454, false }, - { 209482, true }, - { 209494, true }, - { 209507, true }, - { 209520, false }, - { 209528, true }, - { 209538, true }, - { 209554, true }, - { 209569, true }, - { 209587, true }, - { 209599, true }, - { 209618, true }, - { 209630, true }, - { 209643, true }, - { 209656, true }, - { 209671, true }, - { 209693, true }, - { 209707, true }, - { 209720, true }, - { 209735, true }, - { 209749, true }, - { 209762, true }, - { 209782, false }, - { 209799, true }, - { 209817, true }, - { 209831, true }, - { 209844, true }, - { 209858, true }, - { 209869, true }, - { 209880, true }, - { 209893, true }, - { 209903, true }, - { 209920, true }, - { 209928, true }, - { 209943, true }, - { 209956, true }, - { 209970, true }, - { 209985, true }, - { 210010, true }, - { 210046, true }, - { 210059, true }, - { 210074, true }, - { 210087, true }, - { 210104, true }, - { 210126, true }, - { 210148, true }, - { 210166, true }, - { 210179, true }, - { 210190, true }, + { 209014, true }, + { 209030, true }, + { 209049, true }, + { 209074, true }, + { 209087, true }, + { 209098, true }, + { 209109, true }, + { 209123, true }, + { 209136, false }, + { 209164, true }, + { 209176, true }, + { 209189, true }, + { 209202, false }, + { 209210, true }, + { 209220, true }, + { 209236, true }, + { 209251, true }, + { 209269, true }, + { 209281, true }, + { 209300, true }, + { 209312, true }, + { 209325, true }, + { 209338, true }, + { 209353, true }, + { 209375, true }, + { 209389, true }, + { 209402, true }, + { 209417, true }, + { 209431, true }, + { 209444, true }, + { 209464, false }, + { 209481, true }, + { 209499, true }, + { 209513, true }, + { 209526, true }, + { 209540, true }, + { 209551, true }, + { 209562, true }, + { 209575, true }, + { 209585, true }, + { 209602, true }, + { 209610, true }, + { 209625, true }, + { 209638, true }, + { 209652, true }, + { 209667, true }, + { 209692, true }, + { 209728, true }, + { 209741, true }, + { 209756, true }, + { 209769, true }, + { 209786, true }, + { 209808, true }, + { 209830, true }, + { 209848, true }, + { 209861, true }, + { 209872, true }, + { 209884, true }, + { 209895, true }, + { 209913, true }, + { 209921, true }, + { 209954, true }, + { 209961, true }, + { 209978, true }, + { 209994, true }, + { 210011, true }, + { 210021, true }, + { 210034, true }, + { 210048, true }, + { 210058, false }, + { 210076, true }, + { 210094, true }, + { 210106, true }, + { 210118, true }, + { 210129, true }, + { 210142, true }, + { 210155, true }, + { 210171, true }, + { 210188, true }, { 210202, true }, - { 210213, true }, - { 210231, true }, - { 210239, true }, - { 210272, true }, - { 210279, true }, - { 210296, true }, - { 210312, true }, - { 210329, true }, - { 210339, true }, - { 210352, true }, - { 210366, true }, - { 210376, false }, - { 210394, true }, - { 210412, true }, - { 210424, true }, - { 210436, true }, - { 210447, true }, - { 210460, true }, - { 210473, true }, - { 210489, true }, - { 210506, true }, - { 210520, true }, - { 210534, true }, - { 210554, true }, - { 210568, true }, - { 210580, true }, - { 210600, true }, - { 210619, true }, + { 210216, true }, + { 210236, true }, + { 210250, true }, + { 210262, true }, + { 210282, true }, + { 210301, true }, + { 210314, true }, + { 210334, true }, + { 210345, true }, + { 210362, true }, + { 210372, true }, + { 210381, true }, + { 210393, true }, + { 210415, true }, + { 210426, true }, + { 210440, true }, + { 210459, true }, + { 210476, true }, + { 210493, true }, + { 210507, true }, + { 210521, true }, + { 210535, true }, + { 210558, true }, + { 210578, true }, + { 210592, true }, + { 210606, true }, + { 210620, true }, { 210632, true }, - { 210652, true }, - { 210663, true }, - { 210680, true }, - { 210690, true }, - { 210699, true }, - { 210711, true }, - { 210733, true }, - { 210744, true }, - { 210758, true }, - { 210777, true }, - { 210794, true }, - { 210811, true }, - { 210825, true }, - { 210839, true }, - { 210853, true }, - { 210876, true }, + { 210644, true }, + { 210660, true }, + { 210670, true }, + { 210684, true }, + { 210694, true }, + { 210708, true }, + { 210717, true }, + { 210729, true }, + { 210740, true }, + { 210751, true }, + { 210763, true }, + { 210772, true }, + { 210781, true }, + { 210792, true }, + { 210806, true }, + { 210818, true }, + { 210831, true }, + { 210846, false }, + { 210873, true }, + { 210883, true }, { 210896, true }, - { 210910, true }, - { 210924, true }, - { 210938, true }, - { 210950, true }, - { 210962, true }, - { 210978, true }, - { 210988, true }, - { 211002, true }, - { 211012, true }, - { 211026, true }, - { 211035, true }, - { 211047, true }, - { 211058, true }, - { 211069, true }, - { 211081, true }, - { 211090, true }, - { 211099, true }, - { 211110, true }, - { 211124, true }, + { 210909, true }, + { 210925, true }, + { 210946, true }, + { 210967, true }, + { 210986, true }, + { 210996, true }, + { 211008, true }, + { 211019, true }, + { 211042, false }, + { 211050, true }, + { 211065, true }, + { 211079, true }, + { 211093, true }, + { 211105, true }, + { 211118, true }, + { 211128, true }, { 211136, true }, - { 211149, true }, - { 211164, false }, - { 211191, true }, - { 211201, true }, - { 211214, true }, - { 211227, true }, - { 211243, true }, - { 211264, true }, - { 211285, true }, - { 211304, true }, - { 211314, true }, - { 211326, true }, - { 211337, true }, - { 211360, false }, - { 211368, true }, - { 211383, true }, - { 211397, true }, - { 211411, true }, - { 211423, true }, - { 211436, true }, - { 211446, true }, - { 211454, true }, - { 211475, true }, - { 211487, true }, - { 211498, true }, - { 211518, true }, - { 211537, true }, - { 211548, true }, - { 211563, true }, - { 211588, false }, - { 211616, false }, - { 211628, true }, - { 211639, true }, - { 211649, true }, - { 211665, true }, - { 211680, true }, - { 211695, true }, - { 211706, true }, - { 211723, true }, - { 211735, true }, + { 211157, true }, + { 211169, true }, + { 211180, true }, + { 211200, true }, + { 211219, true }, + { 211230, true }, + { 211245, true }, + { 211270, false }, + { 211298, false }, + { 211310, true }, + { 211321, true }, + { 211331, true }, + { 211347, true }, + { 211362, true }, + { 211377, true }, + { 211388, true }, + { 211405, true }, + { 211417, true }, + { 211433, true }, + { 211448, true }, + { 211463, true }, + { 211479, true }, + { 211496, true }, + { 211519, true }, + { 211538, true }, + { 211552, true }, + { 211573, true }, + { 211593, true }, + { 211611, true }, + { 211630, true }, + { 211648, true }, + { 211666, true }, + { 211682, true }, + { 211697, true }, + { 211709, false }, + { 211724, false }, + { 211738, true }, { 211751, true }, - { 211766, true }, - { 211781, true }, - { 211797, true }, - { 211814, true }, - { 211837, true }, + { 211767, true }, + { 211778, true }, + { 211789, true }, + { 211800, true }, + { 211811, true }, + { 211823, true }, + { 211838, true }, { 211856, true }, - { 211870, true }, - { 211891, true }, - { 211911, true }, - { 211929, true }, - { 211948, true }, - { 211966, true }, - { 211984, true }, - { 212000, true }, - { 212015, true }, - { 212027, false }, - { 212042, false }, - { 212056, true }, - { 212069, true }, - { 212085, true }, - { 212096, true }, - { 212107, true }, - { 212118, true }, - { 212129, true }, - { 212141, true }, - { 212156, true }, - { 212174, true }, - { 212192, true }, - { 212214, true }, - { 212228, true }, - { 212245, true }, - { 212264, true }, - { 212282, true }, - { 212303, true }, - { 212317, false }, - { 212329, true }, - { 212344, true }, - { 212360, true }, - { 212378, true }, + { 211874, true }, + { 211896, true }, + { 211910, true }, + { 211927, true }, + { 211946, true }, + { 211964, true }, + { 211985, true }, + { 211999, false }, + { 212011, true }, + { 212026, true }, + { 212042, true }, + { 212060, true }, + { 212070, true }, + { 212082, false }, + { 212093, true }, + { 212112, false }, + { 212131, true }, + { 212146, true }, + { 212159, false }, + { 212178, true }, + { 212189, true }, + { 212207, true }, + { 212221, true }, + { 212246, true }, + { 212261, true }, + { 212276, true }, + { 212294, true }, + { 212309, true }, + { 212324, true }, + { 212341, true }, + { 212352, true }, + { 212362, true }, + { 212374, true }, { 212388, true }, - { 212400, false }, - { 212411, true }, - { 212430, false }, - { 212449, true }, - { 212464, true }, - { 212477, false }, - { 212496, true }, - { 212507, true }, - { 212525, true }, - { 212539, true }, - { 212564, true }, - { 212579, true }, - { 212594, true }, - { 212612, true }, - { 212627, true }, - { 212642, true }, - { 212659, true }, - { 212670, true }, - { 212680, true }, - { 212692, true }, - { 212706, true }, - { 212718, true }, - { 212733, true }, - { 212742, true }, - { 212760, true }, - { 212771, true }, - { 212784, true }, + { 212400, true }, + { 212415, true }, + { 212424, true }, + { 212442, true }, + { 212453, true }, + { 212466, true }, + { 212481, false }, + { 212494, true }, + { 212506, true }, + { 212527, true }, + { 212540, true }, + { 212557, true }, + { 212577, true }, + { 212600, true }, + { 212619, true }, + { 212630, true }, + { 212644, true }, + { 212654, false }, + { 212666, true }, + { 212681, true }, + { 212695, true }, + { 212705, true }, + { 212719, true }, + { 212739, true }, + { 212762, true }, + { 212775, true }, + { 212793, true }, { 212801, true }, - { 212816, false }, - { 212829, true }, - { 212841, true }, - { 212862, true }, - { 212875, true }, - { 212892, true }, - { 212912, true }, - { 212935, true }, - { 212954, true }, - { 212965, true }, - { 212979, true }, - { 212989, false }, - { 213001, true }, - { 213016, true }, - { 213030, true }, - { 213040, true }, - { 213054, true }, - { 213074, true }, - { 213097, true }, - { 213110, true }, - { 213128, true }, - { 213136, true }, - { 213147, true }, - { 213154, true }, - { 213162, true }, - { 213177, true }, + { 212812, true }, + { 212819, true }, + { 212827, true }, + { 212842, true }, + { 212854, true }, + { 212869, true }, + { 212886, true }, + { 212898, true }, + { 212915, true }, + { 212932, true }, + { 212943, false }, + { 212952, true }, + { 212965, false }, + { 212982, true }, + { 212995, true }, + { 213006, false }, + { 213019, true }, + { 213036, true }, + { 213051, false }, + { 213075, false }, + { 213087, true }, + { 213112, true }, + { 213121, true }, + { 213133, true }, + { 213153, true }, + { 213170, true }, + { 213180, true }, { 213189, true }, - { 213204, true }, - { 213221, true }, - { 213233, true }, - { 213250, true }, - { 213267, true }, - { 213278, false }, - { 213287, true }, - { 213300, false }, - { 213317, true }, - { 213330, true }, - { 213341, false }, - { 213354, true }, - { 213371, true }, - { 213386, false }, - { 213410, false }, - { 213422, true }, - { 213447, true }, - { 213456, true }, - { 213468, true }, - { 213488, true }, - { 213505, true }, + { 213205, true }, + { 213224, true }, + { 213242, true }, + { 213258, true }, + { 213278, true }, + { 213291, true }, + { 213304, true }, + { 213317, false }, + { 213326, true }, + { 213339, true }, + { 213353, true }, + { 213367, true }, + { 213390, true }, + { 213401, true }, + { 213423, true }, + { 213449, true }, + { 213464, true }, + { 213479, true }, + { 213489, true }, + { 213503, true }, { 213515, true }, - { 213524, true }, - { 213540, true }, - { 213559, true }, - { 213577, true }, - { 213593, true }, - { 213613, true }, - { 213626, true }, - { 213639, true }, - { 213652, true }, - { 213661, true }, - { 213674, true }, - { 213688, true }, - { 213702, true }, - { 213725, true }, - { 213736, true }, - { 213758, true }, - { 213784, true }, - { 213799, true }, - { 213814, true }, - { 213824, true }, - { 213838, true }, - { 213850, true }, - { 213873, true }, - { 213882, true }, - { 213890, true }, - { 213906, true }, - { 213920, true }, - { 213932, true }, - { 213945, true }, - { 213962, false }, - { 213980, true }, - { 214004, true }, - { 214017, true }, - { 214028, true }, - { 214045, true }, - { 214058, true }, - { 214069, true }, - { 214079, true }, - { 214094, true }, - { 214107, true }, - { 214123, true }, - { 214133, false }, - { 214143, true }, + { 213538, true }, + { 213547, true }, + { 213555, true }, + { 213571, true }, + { 213585, true }, + { 213597, true }, + { 213610, true }, + { 213627, false }, + { 213645, true }, + { 213669, true }, + { 213682, true }, + { 213693, true }, + { 213710, true }, + { 213723, true }, + { 213734, true }, + { 213744, true }, + { 213759, true }, + { 213772, true }, + { 213788, true }, + { 213798, false }, + { 213808, true }, + { 213821, true }, + { 213836, true }, + { 213846, true }, + { 213862, true }, + { 213876, true }, + { 213888, true }, + { 213897, true }, + { 213912, true }, + { 213930, true }, + { 213939, true }, + { 213959, true }, + { 213975, true }, + { 213992, true }, + { 214005, true }, + { 214015, true }, + { 214025, true }, + { 214039, true }, + { 214051, true }, + { 214064, true }, + { 214081, true }, + { 214096, true }, + { 214113, true }, + { 214125, true }, + { 214142, true }, { 214156, true }, - { 214171, true }, + { 214165, true }, { 214181, true }, - { 214197, true }, - { 214211, true }, - { 214223, true }, - { 214232, true }, + { 214194, true }, + { 214207, true }, + { 214222, false }, + { 214234, true }, { 214247, true }, - { 214265, true }, - { 214274, true }, + { 214257, true }, + { 214266, true }, + { 214278, true }, + { 214286, true }, { 214294, true }, - { 214310, true }, - { 214327, true }, - { 214340, true }, - { 214350, true }, - { 214360, true }, - { 214374, true }, - { 214386, true }, - { 214399, true }, - { 214416, true }, - { 214431, true }, - { 214448, true }, - { 214460, true }, - { 214477, true }, - { 214491, true }, - { 214500, true }, - { 214516, true }, - { 214529, true }, - { 214542, true }, - { 214557, false }, - { 214569, true }, - { 214582, true }, - { 214592, true }, - { 214601, true }, - { 214613, true }, - { 214621, true }, - { 214629, true }, - { 214637, true }, - { 214643, true }, - { 214654, true }, - { 214669, true }, - { 214682, true }, - { 214697, true }, - { 214716, true }, - { 214729, true }, - { 214744, true }, - { 214768, true }, - { 214778, true }, - { 214790, true }, - { 214807, true }, - { 214817, true }, - { 214833, true }, - { 214854, true }, - { 214869, false }, - { 214892, true }, - { 214913, true }, - { 214926, true }, - { 214939, true }, - { 214956, true }, - { 214970, true }, - { 214982, true }, - { 215001, true }, - { 215014, true }, - { 215032, true }, - { 215056, false }, - { 215083, true }, - { 215109, true }, - { 215124, true }, - { 215141, true }, + { 214302, true }, + { 214308, true }, + { 214319, true }, + { 214334, true }, + { 214347, true }, + { 214362, true }, + { 214381, true }, + { 214405, true }, + { 214418, true }, + { 214433, true }, + { 214457, true }, + { 214467, true }, + { 214479, true }, + { 214496, true }, + { 214506, true }, + { 214522, true }, + { 214543, true }, + { 214558, false }, + { 214581, true }, + { 214602, true }, + { 214615, true }, + { 214628, true }, + { 214645, true }, + { 214659, true }, + { 214671, true }, + { 214690, true }, + { 214703, true }, + { 214721, true }, + { 214745, false }, + { 214772, true }, + { 214798, true }, + { 214813, true }, + { 214830, true }, + { 214846, true }, + { 214863, true }, + { 214880, true }, + { 214895, true }, + { 214908, true }, + { 214919, true }, + { 214930, true }, + { 214940, true }, + { 214953, true }, + { 214971, true }, + { 214984, true }, + { 214998, true }, + { 215008, true }, + { 215019, true }, + { 215028, true }, + { 215049, true }, + { 215063, true }, + { 215072, true }, + { 215079, true }, + { 215086, true }, + { 215094, true }, + { 215117, true }, + { 215130, true }, + { 215144, true }, { 215157, true }, - { 215174, true }, - { 215191, true }, - { 215206, true }, - { 215219, true }, - { 215230, true }, - { 215241, true }, - { 215251, true }, - { 215264, true }, - { 215282, true }, - { 215295, true }, - { 215309, true }, - { 215319, true }, - { 215330, true }, - { 215339, true }, - { 215360, true }, - { 215374, true }, - { 215383, true }, - { 215390, true }, - { 215397, true }, - { 215405, true }, - { 215428, true }, - { 215441, true }, - { 215455, true }, - { 215468, true }, - { 215483, true }, + { 215172, true }, + { 215186, true }, + { 215201, true }, + { 215210, true }, + { 215218, true }, + { 215231, true }, + { 215242, true }, + { 215250, true }, + { 215268, true }, + { 215280, true }, + { 215291, true }, + { 215307, true }, + { 215316, true }, + { 215329, true }, + { 215340, true }, + { 215352, true }, + { 215367, false }, + { 215380, true }, + { 215389, true }, + { 215401, true }, + { 215412, true }, + { 215424, true }, + { 215437, true }, + { 215450, true }, + { 215465, true }, + { 215485, true }, { 215497, true }, - { 215512, true }, - { 215521, true }, - { 215529, true }, - { 215542, true }, - { 215553, true }, - { 215561, true }, - { 215579, true }, - { 215591, true }, - { 215602, true }, - { 215618, true }, - { 215627, true }, - { 215640, true }, - { 215651, true }, - { 215663, true }, - { 215678, false }, + { 215507, true }, + { 215514, true }, + { 215524, true }, + { 215536, true }, + { 215552, true }, + { 215567, true }, + { 215576, true }, + { 215590, true }, + { 215610, true }, + { 215622, true }, + { 215635, true }, + { 215649, true }, + { 215667, true }, + { 215674, true }, { 215691, true }, - { 215700, true }, - { 215712, true }, - { 215723, true }, - { 215735, true }, - { 215748, true }, - { 215761, true }, - { 215776, true }, - { 215796, true }, - { 215808, true }, - { 215818, true }, - { 215825, true }, - { 215835, true }, - { 215847, true }, - { 215863, true }, - { 215878, true }, + { 215708, true }, + { 215728, true }, + { 215746, true }, + { 215762, false }, + { 215780, true }, + { 215799, true }, + { 215826, true }, + { 215843, true }, + { 215857, true }, + { 215873, true }, { 215887, true }, - { 215901, true }, - { 215921, true }, - { 215933, true }, - { 215946, true }, - { 215960, true }, - { 215978, true }, - { 215985, true }, - { 216002, true }, - { 216019, true }, - { 216039, true }, - { 216057, true }, - { 216073, false }, + { 215903, true }, + { 215918, false }, + { 215937, true }, + { 215955, true }, + { 215973, true }, + { 215991, true }, + { 216008, true }, + { 216029, true }, + { 216048, true }, + { 216062, true }, + { 216073, true }, + { 216081, true }, { 216091, true }, - { 216110, true }, - { 216137, true }, + { 216106, true }, + { 216121, true }, + { 216132, true }, { 216154, true }, - { 216168, true }, - { 216184, true }, - { 216198, true }, - { 216214, true }, - { 216229, false }, - { 216248, true }, - { 216266, true }, - { 216284, true }, - { 216302, true }, - { 216319, true }, - { 216338, true }, - { 216352, true }, - { 216363, true }, - { 216371, true }, - { 216381, true }, - { 216396, true }, - { 216411, true }, - { 216422, true }, - { 216444, true }, - { 216457, true }, + { 216167, true }, + { 216187, true }, + { 216202, true }, + { 216221, true }, + { 216247, true }, + { 216263, true }, + { 216281, true }, + { 216299, true }, + { 216314, true }, + { 216322, true }, + { 216335, true }, + { 216343, true }, + { 216354, true }, + { 216368, true }, + { 216382, true }, + { 216393, true }, + { 216409, true }, + { 216426, true }, + { 216436, true }, + { 216446, true }, + { 216459, true }, { 216477, true }, - { 216492, true }, - { 216511, true }, - { 216537, true }, - { 216553, true }, - { 216571, true }, - { 216589, true }, - { 216604, true }, - { 216612, true }, - { 216625, true }, - { 216633, true }, - { 216644, true }, - { 216658, true }, - { 216672, true }, - { 216683, true }, - { 216699, true }, - { 216716, true }, - { 216726, true }, + { 216490, true }, + { 216516, true }, + { 216535, false }, + { 216545, true }, + { 216561, true }, + { 216578, true }, + { 216594, true }, + { 216617, true }, + { 216642, true }, + { 216655, true }, + { 216666, true }, + { 216681, true }, + { 216691, true }, + { 216706, true }, + { 216718, true }, { 216736, true }, - { 216749, true }, - { 216767, true }, - { 216780, true }, - { 216806, true }, - { 216825, false }, - { 216835, true }, - { 216851, true }, - { 216868, true }, - { 216884, true }, - { 216907, true }, - { 216932, true }, - { 216945, true }, - { 216956, true }, - { 216971, true }, - { 216981, true }, - { 216996, true }, - { 217008, true }, - { 217026, true }, + { 216761, true }, + { 216773, true }, + { 216785, true }, + { 216797, true }, + { 216808, true }, + { 216820, true }, + { 216838, true }, + { 216859, true }, + { 216883, true }, + { 216894, true }, + { 216910, true }, + { 216922, true }, + { 216936, true }, + { 216951, true }, + { 216964, true }, + { 216980, false }, + { 216989, true }, + { 217007, true }, + { 217021, true }, + { 217029, false }, + { 217041, true }, { 217051, true }, - { 217063, true }, - { 217075, true }, - { 217087, true }, - { 217098, true }, - { 217110, true }, - { 217128, true }, - { 217149, true }, + { 217068, true }, + { 217078, true }, + { 217089, true }, + { 217096, true }, + { 217107, true }, + { 217127, true }, + { 217144, true }, + { 217156, true }, { 217173, true }, - { 217184, true }, - { 217200, true }, - { 217212, true }, - { 217226, true }, - { 217241, true }, - { 217254, true }, - { 217270, false }, - { 217279, true }, - { 217297, true }, - { 217311, true }, - { 217319, false }, - { 217331, true }, - { 217341, true }, - { 217358, true }, - { 217368, true }, - { 217379, true }, - { 217386, true }, - { 217397, true }, - { 217417, true }, - { 217434, true }, - { 217446, true }, - { 217463, true }, - { 217483, true }, + { 217193, false }, + { 217208, true }, + { 217219, true }, + { 217228, false }, + { 217235, true }, + { 217245, true }, + { 217256, true }, + { 217272, true }, + { 217281, true }, + { 217296, true }, + { 217308, true }, + { 217322, true }, + { 217332, true }, + { 217353, true }, + { 217362, true }, + { 217380, false }, + { 217391, true }, + { 217407, false }, + { 217420, true }, + { 217436, true }, + { 217448, true }, + { 217460, true }, + { 217480, true }, { 217494, true }, - { 217503, false }, { 217510, true }, - { 217520, true }, - { 217531, true }, + { 217524, true }, + { 217539, true }, { 217547, true }, - { 217556, true }, - { 217571, true }, - { 217583, true }, - { 217597, true }, - { 217607, true }, - { 217628, true }, - { 217637, true }, - { 217655, false }, - { 217666, true }, - { 217682, false }, - { 217695, true }, - { 217711, true }, - { 217723, true }, - { 217735, true }, - { 217755, true }, - { 217769, true }, - { 217785, true }, - { 217799, true }, - { 217814, true }, - { 217822, true }, - { 217837, true }, - { 217850, true }, - { 217866, true }, - { 217879, true }, - { 217892, true }, - { 217906, true }, - { 217928, true }, - { 217948, true }, - { 217969, true }, - { 217994, true }, - { 218013, true }, - { 218029, true }, - { 218057, true }, - { 218078, true }, - { 218107, true }, - { 218126, true }, - { 218150, true }, - { 218160, true }, - { 218169, true }, - { 218182, true }, - { 218191, true }, - { 218197, true }, - { 218209, true }, - { 218226, true }, - { 218240, true }, - { 218259, true }, - { 218273, true }, - { 218287, false }, - { 218300, true }, - { 218313, true }, - { 218326, true }, - { 218344, true }, - { 218365, true }, - { 218391, true }, - { 218404, true }, - { 218414, true }, - { 218433, true }, - { 218452, true }, - { 218469, true }, - { 218489, true }, - { 218505, true }, - { 218525, true }, - { 218534, true }, - { 218545, true }, - { 218554, true }, - { 218573, false }, - { 218589, false }, - { 218602, false }, - { 218615, true }, - { 218626, true }, - { 218637, true }, - { 218656, true }, - { 218669, true }, - { 218681, true }, - { 218694, true }, - { 218713, true }, - { 218728, true }, - { 218741, true }, - { 218756, true }, - { 218772, true }, - { 218786, true }, - { 218803, true }, - { 218812, true }, - { 218826, true }, - { 218850, true }, - { 218865, true }, - { 218881, true }, + { 217562, true }, + { 217575, true }, + { 217591, true }, + { 217604, true }, + { 217617, true }, + { 217631, true }, + { 217653, true }, + { 217673, true }, + { 217694, true }, + { 217719, true }, + { 217738, true }, + { 217754, true }, + { 217782, true }, + { 217803, true }, + { 217832, true }, + { 217851, true }, + { 217875, true }, + { 217885, true }, + { 217894, true }, + { 217907, true }, + { 217916, true }, + { 217922, true }, + { 217934, true }, + { 217951, true }, + { 217965, true }, + { 217984, true }, + { 217998, true }, + { 218012, false }, + { 218025, true }, + { 218038, true }, + { 218051, true }, + { 218069, true }, + { 218090, true }, + { 218116, true }, + { 218129, true }, + { 218139, true }, + { 218158, true }, + { 218177, true }, + { 218194, true }, + { 218214, true }, + { 218233, true }, + { 218249, true }, + { 218269, true }, + { 218278, true }, + { 218289, true }, + { 218298, true }, + { 218317, false }, + { 218333, false }, + { 218346, false }, + { 218359, true }, + { 218370, true }, + { 218381, true }, + { 218400, true }, + { 218413, true }, + { 218425, true }, + { 218438, true }, + { 218457, true }, + { 218472, true }, + { 218485, true }, + { 218500, true }, + { 218516, true }, + { 218530, true }, + { 218547, true }, + { 218556, true }, + { 218570, true }, + { 218594, true }, + { 218609, true }, + { 218625, true }, + { 218643, true }, + { 218660, true }, + { 218677, true }, + { 218692, true }, + { 218710, true }, + { 218726, true }, + { 218739, true }, + { 218748, true }, + { 218761, true }, + { 218781, true }, + { 218792, true }, + { 218806, true }, + { 218815, true }, + { 218824, true }, + { 218842, true }, + { 218858, true }, + { 218872, true }, + { 218886, true }, { 218899, true }, - { 218916, true }, - { 218933, true }, - { 218948, true }, - { 218966, true }, - { 218982, true }, - { 218995, true }, - { 219004, true }, - { 219017, true }, - { 219037, true }, - { 219048, true }, - { 219062, true }, - { 219071, true }, - { 219080, true }, - { 219098, true }, - { 219114, true }, - { 219128, true }, - { 219142, true }, - { 219155, true }, - { 219170, true }, - { 219190, true }, - { 219207, true }, - { 219224, true }, - { 219236, true }, - { 219252, true }, - { 219264, true }, - { 219278, true }, - { 219292, true }, - { 219313, true }, - { 219332, true }, - { 219357, false }, - { 219373, true }, - { 219392, true }, - { 219407, true }, - { 219431, true }, + { 218914, true }, + { 218934, true }, + { 218951, true }, + { 218968, true }, + { 218980, true }, + { 218996, true }, + { 219008, true }, + { 219022, true }, + { 219036, true }, + { 219057, true }, + { 219076, true }, + { 219101, false }, + { 219117, true }, + { 219136, true }, + { 219151, true }, + { 219175, true }, + { 219187, true }, + { 219197, true }, + { 219208, true }, + { 219221, true }, + { 219235, true }, + { 219244, true }, + { 219273, true }, + { 219298, true }, + { 219323, true }, + { 219352, true }, + { 219364, true }, + { 219380, true }, + { 219389, true }, + { 219401, true }, + { 219415, true }, + { 219429, true }, { 219443, true }, - { 219453, true }, - { 219464, true }, - { 219477, true }, - { 219491, true }, - { 219500, true }, - { 219529, true }, - { 219554, true }, - { 219579, true }, - { 219608, true }, - { 219620, true }, - { 219636, true }, - { 219645, true }, - { 219657, true }, - { 219671, true }, - { 219685, true }, - { 219699, true }, - { 219716, true }, - { 219729, true }, - { 219748, true }, - { 219759, true }, - { 219772, true }, - { 219789, true }, - { 219798, true }, - { 219816, true }, - { 219830, false }, - { 219841, true }, - { 219854, true }, - { 219874, false }, + { 219460, true }, + { 219473, true }, + { 219492, true }, + { 219503, true }, + { 219516, true }, + { 219533, true }, + { 219542, true }, + { 219560, true }, + { 219574, false }, + { 219585, true }, + { 219598, true }, + { 219618, false }, + { 219631, true }, + { 219641, true }, + { 219660, true }, + { 219673, true }, + { 219692, true }, + { 219704, true }, + { 219726, true }, + { 219734, true }, + { 219745, true }, + { 219756, true }, + { 219769, true }, + { 219780, true }, + { 219790, true }, + { 219802, true }, + { 219811, true }, + { 219823, true }, + { 219831, true }, + { 219837, true }, + { 219843, false }, + { 219851, true }, + { 219860, true }, + { 219869, true }, + { 219877, true }, { 219887, true }, - { 219897, true }, - { 219916, true }, - { 219929, true }, - { 219948, true }, - { 219960, true }, - { 219982, true }, + { 219895, true }, + { 219914, true }, + { 219921, true }, + { 219946, true }, + { 219953, true }, + { 219966, true }, + { 219980, true }, { 219990, true }, - { 220001, true }, - { 220012, true }, - { 220025, true }, - { 220036, true }, + { 220000, true }, + { 220019, true }, + { 220031, true }, { 220046, true }, - { 220056, true }, - { 220068, true }, - { 220077, true }, - { 220089, true }, - { 220097, true }, + { 220057, true }, + { 220069, true }, + { 220082, true }, + { 220090, true }, { 220103, true }, - { 220109, false }, - { 220117, true }, - { 220126, true }, - { 220135, true }, - { 220143, true }, - { 220153, true }, - { 220161, true }, - { 220180, true }, - { 220187, true }, - { 220212, true }, - { 220219, true }, - { 220232, true }, - { 220246, true }, - { 220256, true }, - { 220266, true }, - { 220285, true }, - { 220297, true }, - { 220312, true }, - { 220323, true }, - { 220335, true }, - { 220348, true }, - { 220356, true }, - { 220369, true }, - { 220381, true }, - { 220393, true }, - { 220412, true }, - { 220439, true }, - { 220450, false }, - { 220461, true }, - { 220476, true }, - { 220492, true }, - { 220514, true }, - { 220528, true }, - { 220541, true }, - { 220554, true }, - { 220573, true }, - { 220602, true }, - { 220618, true }, - { 220639, false }, - { 220666, false }, - { 220682, true }, - { 220698, true }, - { 220713, true }, - { 220729, true }, - { 220747, true }, - { 220766, true }, - { 220775, true }, - { 220788, true }, - { 220805, true }, + { 220115, true }, + { 220127, true }, + { 220146, true }, + { 220173, true }, + { 220184, false }, + { 220195, true }, + { 220210, true }, + { 220226, true }, + { 220248, true }, + { 220262, true }, + { 220275, true }, + { 220288, true }, + { 220307, true }, + { 220336, true }, + { 220352, true }, + { 220373, false }, + { 220400, false }, + { 220416, true }, + { 220432, true }, + { 220447, true }, + { 220463, true }, + { 220481, true }, + { 220500, true }, + { 220509, true }, + { 220522, true }, + { 220539, true }, + { 220558, true }, + { 220571, true }, + { 220589, true }, + { 220610, true }, + { 220623, true }, + { 220642, true }, + { 220669, true }, + { 220687, true }, + { 220704, true }, + { 220727, true }, + { 220741, true }, + { 220759, true }, + { 220777, true }, + { 220793, true }, + { 220811, true }, { 220824, true }, - { 220837, true }, - { 220855, true }, - { 220876, true }, - { 220889, true }, - { 220908, true }, - { 220935, true }, - { 220953, true }, + { 220840, true }, + { 220861, true }, + { 220871, true }, + { 220884, true }, + { 220893, true }, + { 220904, true }, + { 220914, true }, + { 220927, true }, + { 220943, true }, + { 220956, true }, { 220970, true }, - { 220993, true }, - { 221007, true }, - { 221025, true }, - { 221043, true }, - { 221059, true }, - { 221077, true }, - { 221090, true }, - { 221106, true }, - { 221127, true }, - { 221137, true }, + { 220985, true }, + { 220999, true }, + { 221014, true }, + { 221026, true }, + { 221042, true }, + { 221058, true }, + { 221071, true }, + { 221086, true }, + { 221096, true }, + { 221105, true }, + { 221117, true }, { 221150, true }, - { 221159, true }, - { 221170, true }, - { 221180, true }, - { 221193, true }, - { 221209, true }, - { 221222, true }, - { 221236, true }, - { 221251, true }, - { 221265, true }, - { 221280, true }, + { 221184, true }, + { 221218, true }, + { 221233, false }, + { 221250, true }, + { 221268, true }, { 221292, true }, - { 221308, true }, - { 221324, true }, - { 221337, true }, - { 221352, true }, - { 221361, true }, + { 221313, true }, + { 221332, true }, + { 221349, true }, { 221373, true }, - { 221406, true }, - { 221440, true }, - { 221474, true }, - { 221489, false }, - { 221506, true }, - { 221524, true }, - { 221548, true }, - { 221569, true }, - { 221588, true }, - { 221605, true }, - { 221629, true }, - { 221648, true }, - { 221661, true }, - { 221675, true }, - { 221683, true }, - { 221694, true }, - { 221708, true }, - { 221720, true }, - { 221729, false }, - { 221739, true }, - { 221759, true }, - { 221773, true }, - { 221786, true }, - { 221806, true }, - { 221824, true }, - { 221836, true }, - { 221851, true }, - { 221866, true }, - { 221877, true }, - { 221892, false }, - { 221909, true }, - { 221921, false }, - { 221944, true }, - { 221969, true }, - { 221988, true }, - { 222005, true }, - { 222022, true }, - { 222035, true }, - { 222046, true }, - { 222063, true }, - { 222085, true }, - { 222108, true }, - { 222121, true }, - { 222139, true }, - { 222162, true }, - { 222179, true }, - { 222189, false }, - { 222203, true }, - { 222220, true }, - { 222232, true }, - { 222252, true }, - { 222269, true }, - { 222279, true }, - { 222294, true }, - { 222307, true }, - { 222322, true }, - { 222340, true }, - { 222351, true }, - { 222368, true }, - { 222382, true }, - { 222398, true }, - { 222410, true }, - { 222447, true }, - { 222466, true }, - { 222480, true }, - { 222492, true }, - { 222507, true }, - { 222520, true }, - { 222535, false }, - { 222547, true }, - { 222564, false }, - { 222579, true }, - { 222592, true }, - { 222600, true }, - { 222621, false }, - { 222633, true }, - { 222650, true }, - { 222663, true }, - { 222679, true }, - { 222709, true }, - { 222725, false }, - { 222733, true }, - { 222746, true }, + { 221392, true }, + { 221405, true }, + { 221419, true }, + { 221427, true }, + { 221438, true }, + { 221452, true }, + { 221464, true }, + { 221473, false }, + { 221483, true }, + { 221503, true }, + { 221517, true }, + { 221530, true }, + { 221550, true }, + { 221568, true }, + { 221580, true }, + { 221595, true }, + { 221610, true }, + { 221621, true }, + { 221636, false }, + { 221653, true }, + { 221665, false }, + { 221688, true }, + { 221713, true }, + { 221732, true }, + { 221749, true }, + { 221766, true }, + { 221779, true }, + { 221790, true }, + { 221807, true }, + { 221829, true }, + { 221852, true }, + { 221865, true }, + { 221883, true }, + { 221906, true }, + { 221923, true }, + { 221933, false }, + { 221947, true }, + { 221964, true }, + { 221976, true }, + { 221996, true }, + { 222013, true }, + { 222023, true }, + { 222038, true }, + { 222051, true }, + { 222066, true }, + { 222084, true }, + { 222095, true }, + { 222112, true }, + { 222126, true }, + { 222142, true }, + { 222154, true }, + { 222191, true }, + { 222210, true }, + { 222224, true }, + { 222236, true }, + { 222251, true }, + { 222264, true }, + { 222279, false }, + { 222291, true }, + { 222308, false }, + { 222323, true }, + { 222336, true }, + { 222344, true }, + { 222365, false }, + { 222377, true }, + { 222394, true }, + { 222407, true }, + { 222423, true }, + { 222453, true }, + { 222469, false }, + { 222477, true }, + { 222490, true }, + { 222509, true }, + { 222525, true }, + { 222538, true }, + { 222556, true }, + { 222566, true }, + { 222577, true }, + { 222593, true }, + { 222619, true }, + { 222638, true }, + { 222651, true }, + { 222670, true }, + { 222695, true }, + { 222712, true }, + { 222726, true }, + { 222752, true }, { 222765, true }, - { 222781, true }, - { 222794, true }, - { 222812, true }, - { 222822, true }, - { 222833, true }, + { 222780, false }, + { 222791, true }, + { 222811, true }, + { 222824, true }, + { 222837, true }, { 222849, true }, - { 222875, true }, - { 222894, true }, + { 222868, true }, + { 222881, true }, + { 222896, true }, { 222907, true }, - { 222926, true }, - { 222951, true }, - { 222968, true }, - { 222982, true }, - { 223008, true }, - { 223021, true }, - { 223036, false }, - { 223047, true }, + { 222918, true }, + { 222928, true }, + { 222938, true }, + { 222960, true }, + { 222980, true }, + { 222997, true }, + { 223015, true }, + { 223028, true }, + { 223041, true }, + { 223056, true }, { 223067, true }, - { 223080, true }, + { 223078, true }, { 223093, true }, - { 223105, true }, - { 223124, true }, - { 223137, true }, - { 223152, true }, - { 223163, true }, - { 223174, true }, - { 223184, true }, - { 223194, true }, - { 223216, true }, - { 223236, true }, - { 223253, true }, - { 223271, true }, - { 223284, true }, - { 223297, true }, - { 223312, true }, - { 223323, true }, + { 223117, true }, + { 223133, true }, + { 223155, true }, + { 223166, true }, + { 223182, true }, + { 223198, true }, + { 223211, true }, + { 223235, true }, + { 223250, true }, + { 223263, true }, + { 223282, true }, + { 223292, true }, + { 223306, true }, + { 223317, true }, { 223334, true }, - { 223349, true }, - { 223373, true }, - { 223389, true }, - { 223411, true }, - { 223422, true }, - { 223438, true }, - { 223454, true }, - { 223467, true }, - { 223491, true }, - { 223506, true }, - { 223519, true }, - { 223538, true }, - { 223548, true }, - { 223562, true }, - { 223573, true }, - { 223590, true }, - { 223602, true }, - { 223616, true }, - { 223633, true }, - { 223650, true }, - { 223662, true }, - { 223673, true }, - { 223688, true }, - { 223705, true }, - { 223714, true }, - { 223734, true }, - { 223751, true }, - { 223766, true }, - { 223792, true }, - { 223810, true }, - { 223820, true }, - { 223837, true }, - { 223854, true }, + { 223346, true }, + { 223360, true }, + { 223377, true }, + { 223394, true }, + { 223406, true }, + { 223417, true }, + { 223432, true }, + { 223449, true }, + { 223458, true }, + { 223478, true }, + { 223495, true }, + { 223510, true }, + { 223536, true }, + { 223554, true }, + { 223564, true }, + { 223581, true }, + { 223598, true }, + { 223613, true }, + { 223629, true }, + { 223645, true }, + { 223664, true }, + { 223681, true }, + { 223698, true }, + { 223709, true }, + { 223720, true }, + { 223732, true }, + { 223747, true }, + { 223765, true }, + { 223775, true }, + { 223784, true }, + { 223797, true }, + { 223812, true }, + { 223822, true }, + { 223834, true }, + { 223848, false }, + { 223857, false }, { 223869, true }, - { 223885, true }, - { 223901, true }, - { 223920, true }, - { 223937, true }, - { 223954, true }, + { 223880, true }, + { 223897, true }, + { 223907, true }, + { 223918, true }, + { 223927, true }, + { 223938, true }, + { 223952, false }, { 223965, true }, - { 223976, true }, - { 223988, true }, - { 224003, true }, - { 224021, true }, - { 224031, true }, - { 224040, true }, - { 224053, true }, - { 224068, true }, - { 224078, true }, + { 223981, true }, + { 223993, true }, + { 224004, true }, + { 224018, false }, + { 224029, true }, + { 224052, true }, + { 224074, true }, + { 224082, true }, { 224092, false }, - { 224101, false }, - { 224113, true }, - { 224124, true }, - { 224141, true }, - { 224151, true }, - { 224162, true }, - { 224171, true }, - { 224182, true }, - { 224196, false }, - { 224209, true }, - { 224225, true }, - { 224237, true }, - { 224248, true }, - { 224262, false }, - { 224273, true }, + { 224104, true }, + { 224117, true }, + { 224125, true }, + { 224133, true }, + { 224145, true }, + { 224160, true }, + { 224170, true }, + { 224186, true }, + { 224199, true }, + { 224208, true }, + { 224222, true }, + { 224235, true }, + { 224250, true }, + { 224259, true }, + { 224268, false }, + { 224277, true }, { 224296, true }, - { 224318, true }, - { 224326, true }, - { 224336, false }, - { 224348, true }, - { 224361, true }, - { 224369, true }, - { 224377, true }, - { 224389, true }, - { 224404, true }, + { 224309, true }, + { 224324, true }, + { 224346, true }, + { 224362, true }, + { 224372, true }, + { 224385, true }, + { 224401, true }, { 224414, true }, - { 224430, true }, - { 224443, true }, - { 224452, true }, - { 224466, true }, - { 224479, true }, - { 224494, true }, - { 224503, true }, - { 224512, false }, - { 224521, true }, - { 224540, true }, - { 224553, true }, - { 224568, true }, - { 224590, true }, - { 224606, true }, - { 224616, true }, - { 224629, true }, - { 224645, true }, - { 224658, true }, - { 224669, true }, - { 224681, true }, - { 224689, true }, - { 224703, true }, - { 224720, true }, - { 224737, true }, - { 224750, true }, - { 224766, true }, - { 224787, true }, - { 224806, true }, + { 224425, true }, + { 224437, true }, + { 224445, true }, + { 224459, true }, + { 224476, true }, + { 224493, true }, + { 224506, true }, + { 224522, true }, + { 224543, true }, + { 224562, true }, + { 224579, true }, + { 224595, true }, + { 224615, true }, + { 224628, true }, + { 224639, true }, + { 224653, true }, + { 224673, true }, + { 224693, true }, + { 224717, true }, + { 224740, true }, + { 224751, true }, + { 224773, true }, + { 224798, true }, + { 224810, false }, { 224823, true }, - { 224839, true }, - { 224859, true }, - { 224872, true }, - { 224883, true }, - { 224897, true }, + { 224841, true }, + { 224855, true }, + { 224869, false }, + { 224890, true }, + { 224907, true }, { 224917, true }, - { 224937, true }, - { 224961, true }, - { 224984, true }, - { 224995, true }, - { 225017, true }, + { 224929, true }, + { 224941, true }, + { 224953, true }, + { 224972, true }, + { 224998, true }, + { 225011, true }, + { 225025, true }, { 225042, true }, - { 225054, false }, - { 225067, true }, - { 225085, true }, - { 225099, true }, - { 225113, false }, - { 225134, true }, - { 225151, true }, - { 225161, true }, - { 225173, true }, - { 225185, true }, - { 225197, true }, - { 225216, true }, - { 225242, true }, - { 225255, true }, - { 225269, true }, - { 225286, true }, - { 225305, true }, - { 225322, true }, - { 225340, true }, - { 225355, true }, - { 225376, true }, - { 225397, true }, - { 225405, false }, - { 225423, true }, - { 225437, true }, - { 225459, true }, - { 225478, true }, - { 225490, true }, - { 225503, true }, - { 225515, true }, - { 225536, true }, - { 225560, true }, - { 225570, true }, - { 225585, true }, - { 225600, true }, - { 225617, true }, - { 225639, true }, - { 225657, true }, - { 225673, true }, - { 225692, true }, - { 225706, true }, - { 225723, true }, - { 225733, true }, - { 225748, true }, - { 225764, true }, - { 225791, true }, - { 225805, true }, - { 225821, true }, - { 225836, true }, - { 225849, true }, - { 225858, true }, - { 225874, true }, - { 225890, true }, - { 225905, true }, - { 225918, true }, - { 225931, false }, - { 225942, true }, - { 225958, true }, - { 225970, true }, - { 225984, true }, - { 226001, true }, - { 226016, true }, - { 226027, true }, - { 226043, true }, - { 226055, true }, - { 226071, true }, - { 226092, true }, - { 226115, true }, - { 226130, true }, - { 226140, true }, - { 226154, true }, - { 226163, true }, - { 226170, true }, - { 226184, true }, - { 226204, true }, - { 226215, true }, - { 226229, true }, - { 226242, false }, - { 226256, true }, - { 226264, true }, - { 226275, true }, - { 226293, true }, - { 226303, true }, - { 226320, true }, - { 226333, true }, - { 226343, true }, - { 226354, true }, - { 226379, true }, - { 226393, true }, - { 226404, true }, + { 225061, true }, + { 225078, true }, + { 225096, true }, + { 225111, true }, + { 225132, true }, + { 225153, true }, + { 225161, false }, + { 225179, true }, + { 225193, true }, + { 225215, true }, + { 225234, true }, + { 225246, true }, + { 225259, true }, + { 225271, true }, + { 225292, true }, + { 225316, true }, + { 225326, true }, + { 225341, true }, + { 225356, true }, + { 225373, true }, + { 225395, true }, + { 225413, true }, + { 225429, true }, + { 225448, true }, + { 225462, true }, + { 225479, true }, + { 225489, true }, + { 225504, true }, + { 225520, true }, + { 225547, true }, + { 225561, true }, + { 225577, true }, + { 225592, true }, + { 225605, true }, + { 225614, true }, + { 225630, true }, + { 225646, true }, + { 225661, true }, + { 225674, true }, + { 225687, false }, + { 225698, true }, + { 225714, true }, + { 225726, true }, + { 225740, true }, + { 225757, true }, + { 225772, true }, + { 225783, true }, + { 225799, true }, + { 225811, true }, + { 225827, true }, + { 225848, true }, + { 225871, true }, + { 225886, true }, + { 225896, true }, + { 225910, true }, + { 225919, true }, + { 225926, true }, + { 225940, true }, + { 225960, true }, + { 225971, true }, + { 225985, true }, + { 225998, false }, + { 226012, true }, + { 226020, true }, + { 226031, true }, + { 226049, true }, + { 226059, true }, + { 226076, true }, + { 226089, true }, + { 226099, true }, + { 226110, true }, + { 226135, true }, + { 226149, true }, + { 226160, true }, + { 226171, true }, + { 226186, true }, + { 226202, false }, + { 226213, true }, + { 226228, true }, + { 226243, false }, + { 226262, true }, + { 226273, true }, + { 226283, true }, + { 226294, true }, + { 226314, true }, + { 226321, true }, + { 226334, true }, + { 226352, false }, + { 226362, true }, + { 226371, true }, + { 226381, true }, + { 226392, true }, + { 226403, true }, { 226415, true }, - { 226430, true }, - { 226446, false }, - { 226457, true }, - { 226472, true }, - { 226487, false }, - { 226506, true }, - { 226517, true }, - { 226527, true }, - { 226538, true }, - { 226558, true }, - { 226565, true }, - { 226578, true }, - { 226596, false }, - { 226606, true }, - { 226615, true }, - { 226625, true }, - { 226636, true }, - { 226647, true }, - { 226659, true }, - { 226670, true }, - { 226678, true }, - { 226688, true }, - { 226699, true }, - { 226714, true }, - { 226731, true }, - { 226748, true }, - { 226757, true }, - { 226764, true }, - { 226783, true }, - { 226794, true }, - { 226813, false }, - { 226824, true }, - { 226841, true }, - { 226858, true }, - { 226871, true }, - { 226882, true }, - { 226893, true }, - { 226910, true }, - { 226927, false }, - { 226942, false }, - { 226950, true }, - { 226959, true }, - { 226982, false }, - { 226995, true }, - { 227006, true }, - { 227022, true }, - { 227030, false }, - { 227037, true }, - { 227051, true }, - { 227065, true }, - { 227085, false }, - { 227105, false }, - { 227117, false }, - { 227133, true }, - { 227145, true }, - { 227157, true }, - { 227176, true }, - { 227186, true }, - { 227210, true }, - { 227218, true }, - { 227235, true }, - { 227251, true }, - { 227267, true }, - { 227280, true }, - { 227289, true }, - { 227301, true }, - { 227314, true }, - { 227329, true }, - { 227343, true }, - { 227359, false }, - { 227374, true }, - { 227383, true }, - { 227403, true }, - { 227414, true }, - { 227422, true }, - { 227436, true }, - { 227449, true }, - { 227460, true }, - { 227470, false }, - { 227480, true }, - { 227494, true }, - { 227506, true }, - { 227516, true }, - { 227536, true }, - { 227555, false }, - { 227568, true }, - { 227584, true }, - { 227606, true }, - { 227623, true }, + { 226426, true }, + { 226434, true }, + { 226444, true }, + { 226455, true }, + { 226470, true }, + { 226487, true }, + { 226504, true }, + { 226513, true }, + { 226520, true }, + { 226539, true }, + { 226550, true }, + { 226569, false }, + { 226580, true }, + { 226597, true }, + { 226614, true }, + { 226627, true }, + { 226638, true }, + { 226649, true }, + { 226666, true }, + { 226683, false }, + { 226698, false }, + { 226706, true }, + { 226715, true }, + { 226738, false }, + { 226751, true }, + { 226762, true }, + { 226778, true }, + { 226786, false }, + { 226793, true }, + { 226807, true }, + { 226821, true }, + { 226841, false }, + { 226861, false }, + { 226873, false }, + { 226889, true }, + { 226901, true }, + { 226913, true }, + { 226932, true }, + { 226942, true }, + { 226966, true }, + { 226974, true }, + { 226991, true }, + { 227007, true }, + { 227023, true }, + { 227036, true }, + { 227045, true }, + { 227057, true }, + { 227070, true }, + { 227085, true }, + { 227099, true }, + { 227115, false }, + { 227130, true }, + { 227139, true }, + { 227159, true }, + { 227170, true }, + { 227178, true }, + { 227192, true }, + { 227205, true }, + { 227216, true }, + { 227226, false }, + { 227236, true }, + { 227250, true }, + { 227262, true }, + { 227272, true }, + { 227292, true }, + { 227311, false }, + { 227324, true }, + { 227340, true }, + { 227362, true }, + { 227379, true }, + { 227393, true }, + { 227406, true }, + { 227415, true }, + { 227424, true }, + { 227439, true }, + { 227453, true }, + { 227463, true }, + { 227473, true }, + { 227502, true }, + { 227514, true }, + { 227526, true }, + { 227547, true }, + { 227561, true }, + { 227572, true }, + { 227587, true }, + { 227601, true }, + { 227621, true }, { 227637, true }, - { 227650, true }, - { 227659, true }, - { 227668, true }, - { 227683, true }, - { 227697, true }, - { 227707, true }, - { 227717, true }, + { 227649, false }, + { 227665, true }, + { 227679, true }, + { 227694, true }, + { 227709, true }, + { 227723, true }, + { 227733, true }, { 227746, true }, - { 227758, true }, - { 227770, true }, - { 227791, true }, - { 227805, true }, - { 227816, true }, - { 227831, true }, - { 227845, true }, - { 227865, true }, - { 227881, true }, - { 227893, false }, - { 227909, true }, - { 227923, true }, - { 227938, true }, - { 227953, true }, - { 227967, true }, + { 227757, true }, + { 227768, true }, + { 227784, true }, + { 227800, true }, + { 227809, true }, + { 227819, true }, + { 227843, false }, + { 227862, false }, + { 227874, true }, + { 227890, true }, + { 227918, true }, + { 227950, true }, + { 227965, true }, { 227977, true }, - { 227990, true }, - { 228001, true }, - { 228012, true }, - { 228028, true }, - { 228044, true }, - { 228053, true }, + { 227988, true }, + { 227997, true }, + { 228011, true }, + { 228024, false }, + { 228037, true }, + { 228055, true }, { 228063, true }, - { 228087, false }, - { 228106, false }, - { 228118, true }, - { 228134, true }, - { 228162, true }, - { 228194, true }, - { 228209, true }, - { 228221, true }, + { 228077, true }, + { 228091, true }, + { 228103, true }, + { 228121, true }, + { 228142, true }, + { 228157, true }, + { 228173, true }, + { 228190, true }, + { 228203, false }, + { 228211, false }, + { 228223, true }, { 228232, true }, - { 228241, true }, - { 228255, true }, - { 228268, false }, + { 228242, true }, + { 228253, true }, + { 228265, true }, { 228281, true }, - { 228299, true }, + { 228297, true }, { 228307, true }, - { 228321, true }, - { 228335, true }, - { 228347, true }, - { 228365, true }, - { 228386, true }, - { 228401, true }, - { 228417, true }, - { 228434, true }, - { 228447, false }, - { 228455, false }, - { 228467, true }, - { 228476, true }, - { 228486, true }, - { 228497, true }, - { 228509, true }, - { 228525, true }, - { 228541, true }, - { 228551, true }, - { 228562, true }, - { 228573, true }, - { 228585, true }, - { 228596, true }, - { 228608, true }, - { 228618, true }, - { 228627, true }, - { 228646, true }, - { 228674, true }, - { 228688, true }, - { 228702, true }, - { 228721, true }, - { 228743, true }, - { 228765, true }, - { 228787, true }, - { 228805, true }, - { 228822, true }, - { 228838, true }, - { 228849, true }, - { 228864, true }, - { 228880, true }, - { 228893, false }, - { 228909, true }, - { 228925, true }, - { 228938, true }, - { 228956, true }, - { 228970, true }, - { 228982, true }, - { 228997, true }, + { 228318, true }, + { 228329, true }, + { 228341, true }, + { 228352, true }, + { 228364, true }, + { 228374, true }, + { 228383, true }, + { 228402, true }, + { 228430, true }, + { 228444, true }, + { 228458, true }, + { 228477, true }, + { 228499, true }, + { 228521, true }, + { 228543, true }, + { 228561, true }, + { 228578, true }, + { 228594, true }, + { 228605, true }, + { 228620, true }, + { 228636, true }, + { 228649, false }, + { 228665, true }, + { 228681, true }, + { 228694, true }, + { 228712, true }, + { 228726, true }, + { 228738, true }, + { 228753, true }, + { 228773, true }, + { 228792, true }, + { 228811, true }, + { 228824, true }, + { 228840, true }, + { 228853, true }, + { 228868, true }, + { 228884, true }, + { 228901, true }, + { 228920, true }, + { 228936, true }, + { 228953, true }, + { 228966, true }, + { 228981, true }, + { 228998, true }, { 229017, true }, - { 229036, true }, - { 229055, true }, - { 229068, true }, - { 229084, true }, - { 229097, true }, - { 229112, true }, - { 229128, true }, - { 229145, true }, - { 229164, true }, - { 229180, true }, - { 229197, true }, - { 229210, true }, - { 229225, true }, - { 229242, true }, - { 229261, true }, - { 229276, true }, - { 229289, true }, - { 229305, true }, - { 229316, true }, - { 229329, true }, - { 229343, true }, - { 229357, false }, - { 229373, true }, - { 229392, true }, - { 229412, true }, - { 229432, true }, - { 229446, true }, + { 229032, true }, + { 229045, true }, + { 229061, true }, + { 229072, true }, + { 229085, true }, + { 229099, true }, + { 229113, false }, + { 229129, true }, + { 229148, true }, + { 229168, true }, + { 229188, true }, + { 229202, true }, + { 229214, true }, + { 229229, true }, + { 229240, true }, + { 229251, true }, + { 229267, true }, + { 229291, true }, + { 229306, true }, + { 229322, true }, + { 229348, true }, + { 229365, true }, + { 229386, true }, + { 229403, true }, + { 229421, true }, + { 229439, false }, { 229458, true }, - { 229473, true }, - { 229484, true }, - { 229495, true }, - { 229511, true }, - { 229535, true }, - { 229550, true }, - { 229566, true }, - { 229592, true }, - { 229609, true }, - { 229630, true }, + { 229469, true }, + { 229485, true }, + { 229499, true }, + { 229512, true }, + { 229526, true }, + { 229547, true }, + { 229560, true }, + { 229573, true }, + { 229588, true }, + { 229605, true }, + { 229620, true }, + { 229636, true }, { 229647, true }, - { 229665, true }, - { 229683, false }, - { 229702, true }, - { 229713, true }, - { 229729, true }, - { 229743, true }, - { 229756, true }, - { 229770, true }, - { 229791, true }, - { 229804, true }, - { 229817, true }, - { 229832, true }, - { 229849, true }, - { 229864, true }, - { 229880, true }, - { 229891, true }, - { 229899, true }, - { 229908, true }, + { 229655, true }, + { 229664, true }, + { 229674, true }, + { 229685, true }, + { 229697, true }, + { 229711, true }, + { 229720, true }, + { 229737, true }, + { 229746, true }, + { 229759, true }, + { 229778, true }, + { 229799, true }, + { 229807, true }, + { 229826, true }, + { 229843, false }, + { 229858, true }, + { 229871, true }, + { 229886, false }, + { 229898, true }, { 229918, true }, - { 229929, true }, - { 229941, true }, - { 229955, true }, - { 229964, true }, - { 229981, true }, - { 229990, true }, - { 230003, true }, - { 230022, true }, - { 230043, true }, - { 230051, true }, - { 230070, true }, - { 230087, false }, - { 230102, true }, - { 230115, true }, - { 230130, false }, - { 230142, true }, - { 230162, true }, - { 230177, true }, - { 230190, true }, - { 230210, true }, - { 230232, true }, - { 230255, true }, - { 230273, true }, + { 229933, true }, + { 229946, true }, + { 229966, true }, + { 229988, true }, + { 230011, true }, + { 230029, true }, + { 230045, true }, + { 230057, true }, + { 230075, true }, + { 230087, true }, + { 230101, true }, + { 230110, true }, + { 230124, true }, + { 230132, true }, + { 230141, true }, + { 230157, true }, + { 230167, true }, + { 230187, true }, + { 230204, true }, + { 230218, true }, + { 230238, true }, + { 230249, true }, + { 230262, true }, + { 230277, true }, { 230289, true }, - { 230301, true }, - { 230319, true }, - { 230331, true }, - { 230345, true }, - { 230354, true }, - { 230368, true }, - { 230376, true }, - { 230385, true }, - { 230401, true }, - { 230411, true }, - { 230431, true }, - { 230448, true }, - { 230462, true }, - { 230482, true }, - { 230493, true }, - { 230506, true }, - { 230521, true }, - { 230533, true }, - { 230549, true }, - { 230562, true }, - { 230583, true }, - { 230591, true }, - { 230601, true }, - { 230618, true }, - { 230641, true }, - { 230650, true }, - { 230660, true }, + { 230305, true }, + { 230318, true }, + { 230339, true }, + { 230347, true }, + { 230357, true }, + { 230374, true }, + { 230397, true }, + { 230406, true }, + { 230416, true }, + { 230429, true }, + { 230440, true }, + { 230455, true }, + { 230468, false }, + { 230478, true }, + { 230492, true }, + { 230512, true }, + { 230525, true }, + { 230545, false }, + { 230568, true }, + { 230581, true }, + { 230592, true }, + { 230603, true }, + { 230613, true }, + { 230624, true }, + { 230649, true }, + { 230659, true }, { 230673, true }, - { 230683, true }, - { 230694, true }, - { 230709, true }, - { 230722, false }, - { 230732, true }, - { 230746, true }, - { 230766, true }, - { 230779, true }, - { 230799, false }, - { 230822, true }, - { 230835, true }, - { 230846, true }, - { 230857, true }, - { 230867, true }, - { 230878, true }, - { 230903, true }, - { 230913, true }, - { 230927, true }, - { 230941, true }, - { 230954, false }, - { 230969, true }, - { 230983, true }, - { 231008, true }, - { 231022, true }, - { 231034, true }, - { 231046, true }, - { 231058, true }, - { 231072, true }, - { 231082, false }, - { 231102, true }, - { 231112, true }, - { 231126, true }, - { 231136, true }, - { 231149, true }, - { 231164, true }, - { 231173, true }, - { 231183, true }, - { 231197, true }, - { 231206, true }, - { 231217, true }, - { 231228, true }, - { 231239, true }, - { 231249, true }, - { 231257, true }, - { 231266, false }, - { 231286, true }, - { 231301, true }, - { 231313, true }, - { 231325, false }, - { 231335, true }, - { 231350, true }, - { 231369, true }, - { 231389, true }, - { 231417, true }, - { 231442, true }, - { 231452, true }, - { 231465, true }, - { 231479, true }, - { 231494, true }, - { 231520, true }, - { 231537, true }, - { 231552, true }, - { 231560, true }, - { 231575, true }, - { 231596, false }, - { 231614, true }, - { 231626, true }, - { 231648, true }, - { 231664, true }, - { 231679, true }, - { 231690, true }, - { 231712, true }, - { 231726, true }, - { 231747, true }, + { 230687, true }, + { 230700, false }, + { 230715, true }, + { 230729, true }, + { 230754, true }, + { 230768, true }, + { 230780, true }, + { 230792, true }, + { 230804, true }, + { 230818, true }, + { 230828, false }, + { 230848, true }, + { 230858, true }, + { 230872, true }, + { 230882, true }, + { 230895, true }, + { 230910, true }, + { 230919, true }, + { 230929, true }, + { 230943, true }, + { 230952, true }, + { 230963, true }, + { 230974, true }, + { 230985, true }, + { 230995, true }, + { 231003, true }, + { 231012, false }, + { 231032, true }, + { 231047, true }, + { 231059, true }, + { 231071, false }, + { 231081, true }, + { 231096, true }, + { 231115, true }, + { 231135, true }, + { 231163, true }, + { 231188, true }, + { 231198, true }, + { 231211, true }, + { 231225, true }, + { 231240, true }, + { 231266, true }, + { 231283, true }, + { 231298, true }, + { 231306, true }, + { 231321, true }, + { 231342, false }, + { 231360, true }, + { 231372, true }, + { 231394, true }, + { 231410, true }, + { 231425, true }, + { 231436, true }, + { 231458, true }, + { 231472, true }, + { 231493, true }, + { 231507, true }, + { 231524, true }, + { 231543, true }, + { 231564, true }, + { 231583, true }, + { 231596, true }, + { 231616, true }, + { 231632, true }, + { 231658, true }, + { 231678, true }, + { 231699, true }, + { 231718, true }, + { 231742, true }, { 231761, true }, - { 231778, true }, - { 231797, true }, - { 231818, true }, - { 231837, true }, - { 231850, true }, - { 231870, true }, - { 231886, true }, - { 231912, true }, - { 231932, true }, - { 231953, true }, - { 231972, true }, - { 231996, true }, + { 231777, true }, + { 231802, true }, + { 231828, true }, + { 231839, true }, + { 231863, true }, + { 231889, true }, + { 231907, true }, + { 231918, true }, + { 231940, true }, + { 231956, true }, + { 231973, true }, + { 231991, true }, + { 232001, true }, { 232015, true }, { 232031, true }, - { 232056, true }, - { 232082, true }, - { 232093, true }, - { 232117, true }, - { 232143, true }, - { 232161, true }, - { 232172, true }, - { 232194, true }, - { 232210, true }, - { 232228, true }, - { 232238, true }, - { 232252, true }, - { 232268, true }, - { 232286, true }, - { 232303, true }, - { 232325, true }, - { 232348, true }, - { 232360, true }, - { 232379, true }, - { 232397, true }, - { 232420, true }, - { 232433, true }, - { 232449, true }, - { 232467, true }, - { 232485, true }, - { 232499, true }, - { 232517, true }, - { 232532, true }, - { 232549, true }, - { 232563, true }, - { 232590, true }, - { 232608, true }, - { 232622, true }, - { 232640, true }, - { 232656, true }, - { 232672, true }, - { 232685, true }, - { 232705, true }, - { 232723, true }, - { 232742, true }, - { 232755, true }, - { 232791, true }, - { 232814, true }, - { 232834, true }, - { 232849, true }, - { 232867, true }, - { 232884, true }, - { 232903, true }, - { 232914, true }, - { 232932, true }, - { 232962, true }, + { 232049, true }, + { 232066, true }, + { 232088, true }, + { 232111, true }, + { 232123, true }, + { 232142, true }, + { 232160, true }, + { 232183, true }, + { 232196, true }, + { 232212, true }, + { 232230, true }, + { 232248, true }, + { 232262, true }, + { 232280, true }, + { 232295, true }, + { 232312, true }, + { 232326, true }, + { 232353, true }, + { 232371, true }, + { 232385, true }, + { 232403, true }, + { 232419, true }, + { 232435, true }, + { 232448, true }, + { 232468, true }, + { 232486, true }, + { 232505, true }, + { 232518, true }, + { 232554, true }, + { 232577, true }, + { 232597, true }, + { 232612, true }, + { 232630, true }, + { 232647, true }, + { 232666, true }, + { 232677, true }, + { 232695, true }, + { 232725, true }, + { 232741, true }, + { 232756, true }, + { 232771, true }, + { 232782, true }, + { 232796, true }, + { 232818, true }, + { 232832, true }, + { 232847, true }, + { 232862, true }, + { 232883, true }, + { 232896, true }, + { 232911, true }, + { 232924, true }, + { 232947, true }, + { 232956, true }, { 232978, true }, - { 232993, true }, - { 233008, true }, - { 233019, true }, + { 232988, true }, + { 233009, true }, { 233033, true }, - { 233055, true }, - { 233069, true }, - { 233084, true }, - { 233099, true }, - { 233120, true }, - { 233133, true }, - { 233148, true }, - { 233161, true }, - { 233184, true }, - { 233193, true }, - { 233215, true }, - { 233225, true }, - { 233246, true }, - { 233270, true }, - { 233296, true }, - { 233314, true }, - { 233325, true }, - { 233342, true }, - { 233360, true }, - { 233375, true }, - { 233391, true }, - { 233405, true }, - { 233418, true }, - { 233434, true }, - { 233453, true }, - { 233471, true }, - { 233495, true }, - { 233508, true }, - { 233525, true }, - { 233547, true }, - { 233566, true }, - { 233586, true }, - { 233603, false }, - { 233618, true }, - { 233636, true }, - { 233658, true }, - { 233674, true }, - { 233693, true }, - { 233705, true }, - { 233731, true }, - { 233743, true }, - { 233755, true }, - { 233771, true }, - { 233789, true }, + { 233059, true }, + { 233077, true }, + { 233088, true }, + { 233105, true }, + { 233123, true }, + { 233138, true }, + { 233154, true }, + { 233168, true }, + { 233181, true }, + { 233197, true }, + { 233216, true }, + { 233234, true }, + { 233258, true }, + { 233271, true }, + { 233288, true }, + { 233310, true }, + { 233329, true }, + { 233349, true }, + { 233366, false }, + { 233381, true }, + { 233399, true }, + { 233421, true }, + { 233437, true }, + { 233456, true }, + { 233468, true }, + { 233494, true }, + { 233506, true }, + { 233518, true }, + { 233534, true }, + { 233552, true }, + { 233571, true }, + { 233591, true }, + { 233611, true }, + { 233627, true }, + { 233646, true }, + { 233657, true }, + { 233687, false }, + { 233701, true }, + { 233718, true }, + { 233739, true }, + { 233759, true }, + { 233773, true }, + { 233791, true }, { 233808, true }, - { 233828, true }, - { 233848, true }, - { 233864, true }, - { 233883, true }, - { 233894, true }, - { 233924, false }, - { 233938, true }, + { 233824, true }, + { 233834, true }, + { 233850, true }, + { 233861, true }, + { 233873, true }, + { 233892, true }, + { 233908, true }, + { 233928, true }, + { 233942, true }, { 233955, true }, - { 233976, true }, - { 233996, true }, + { 233966, true }, + { 233994, true }, { 234010, true }, - { 234028, true }, - { 234045, true }, - { 234061, true }, - { 234071, true }, - { 234087, true }, - { 234098, true }, - { 234110, true }, - { 234129, true }, - { 234145, true }, - { 234165, true }, - { 234179, true }, - { 234192, true }, - { 234203, true }, - { 234224, true }, - { 234252, true }, - { 234268, true }, - { 234281, true }, - { 234306, true }, - { 234323, true }, - { 234340, false }, - { 234355, true }, - { 234380, true }, - { 234401, true }, - { 234410, true }, - { 234420, true }, - { 234432, true }, - { 234447, true }, - { 234466, true }, - { 234485, true }, - { 234502, true }, - { 234523, true }, - { 234540, true }, - { 234556, false }, - { 234574, true }, - { 234591, true }, - { 234604, true }, - { 234628, true }, - { 234646, true }, - { 234667, true }, - { 234682, true }, - { 234697, true }, - { 234709, true }, - { 234734, true }, - { 234747, true }, - { 234769, true }, - { 234779, true }, - { 234796, true }, - { 234815, true }, - { 234828, true }, - { 234842, true }, - { 234855, true }, - { 234879, true }, - { 234893, true }, - { 234915, true }, - { 234948, true }, - { 234963, true }, - { 234977, true }, - { 234986, true }, - { 234995, true }, - { 235009, true }, - { 235019, false }, - { 235033, true }, - { 235042, true }, - { 235053, true }, - { 235067, true }, - { 235078, true }, - { 235096, true }, - { 235111, true }, - { 235124, true }, - { 235134, true }, - { 235149, true }, - { 235162, true }, - { 235181, true }, - { 235201, true }, - { 235224, true }, - { 235231, true }, - { 235247, true }, - { 235265, true }, - { 235286, true }, - { 235298, true }, - { 235328, true }, - { 235341, true }, + { 234023, true }, + { 234048, true }, + { 234065, true }, + { 234082, false }, + { 234097, true }, + { 234122, true }, + { 234143, true }, + { 234152, true }, + { 234162, true }, + { 234174, true }, + { 234189, true }, + { 234208, true }, + { 234227, true }, + { 234244, true }, + { 234265, true }, + { 234282, true }, + { 234298, false }, + { 234316, true }, + { 234333, true }, + { 234346, true }, + { 234370, true }, + { 234388, true }, + { 234409, true }, + { 234424, true }, + { 234439, true }, + { 234451, true }, + { 234476, true }, + { 234489, true }, + { 234511, true }, + { 234521, true }, + { 234538, true }, + { 234557, true }, + { 234570, true }, + { 234584, true }, + { 234597, true }, + { 234621, true }, + { 234635, true }, + { 234657, true }, + { 234690, true }, + { 234705, true }, + { 234719, true }, + { 234728, true }, + { 234737, true }, + { 234751, true }, + { 234761, false }, + { 234775, true }, + { 234784, true }, + { 234795, true }, + { 234809, true }, + { 234820, true }, + { 234838, true }, + { 234853, true }, + { 234866, true }, + { 234876, true }, + { 234891, true }, + { 234904, true }, + { 234923, true }, + { 234943, true }, + { 234966, true }, + { 234973, true }, + { 234989, true }, + { 235007, true }, + { 235028, true }, + { 235040, true }, + { 235070, true }, + { 235083, true }, + { 235093, true }, + { 235105, true }, + { 235119, true }, + { 235133, true }, + { 235148, true }, + { 235159, true }, + { 235172, true }, + { 235184, true }, + { 235195, true }, + { 235209, true }, + { 235228, true }, + { 235243, true }, + { 235255, true }, + { 235267, true }, + { 235278, true }, + { 235293, true }, + { 235308, true }, + { 235320, true }, + { 235336, true }, { 235351, true }, - { 235363, true }, - { 235377, true }, - { 235391, true }, - { 235406, true }, - { 235417, true }, - { 235430, true }, - { 235442, true }, - { 235453, true }, - { 235467, true }, - { 235486, true }, - { 235501, true }, - { 235513, true }, - { 235525, true }, - { 235536, true }, - { 235551, true }, - { 235566, true }, - { 235578, true }, - { 235594, true }, - { 235609, true }, - { 235623, true }, - { 235639, true }, - { 235648, true }, - { 235657, true }, - { 235668, false }, - { 235683, true }, - { 235697, true }, - { 235706, true }, - { 235722, true }, - { 235735, true }, - { 235745, true }, - { 235765, true }, - { 235779, true }, - { 235792, false }, - { 235812, true }, - { 235826, true }, - { 235840, true }, - { 235851, true }, - { 235868, true }, - { 235882, true }, - { 235894, true }, - { 235908, true }, - { 235920, true }, - { 235932, true }, - { 235944, true }, - { 235956, true }, - { 235966, true }, - { 235981, true }, - { 235994, true }, - { 236011, true }, - { 236038, true }, - { 236051, true }, - { 236065, true }, - { 236090, true }, - { 236108, true }, - { 236120, true }, - { 236131, true }, - { 236139, true }, - { 236151, true }, + { 235365, true }, + { 235381, true }, + { 235390, true }, + { 235399, true }, + { 235410, false }, + { 235425, true }, + { 235439, true }, + { 235448, true }, + { 235464, true }, + { 235477, true }, + { 235487, true }, + { 235507, true }, + { 235521, true }, + { 235534, false }, + { 235554, true }, + { 235568, true }, + { 235582, true }, + { 235593, true }, + { 235610, true }, + { 235624, true }, + { 235636, true }, + { 235650, true }, + { 235662, true }, + { 235674, true }, + { 235686, true }, + { 235698, true }, + { 235708, true }, + { 235723, true }, + { 235736, true }, + { 235753, true }, + { 235780, true }, + { 235793, true }, + { 235807, true }, + { 235832, true }, + { 235850, true }, + { 235862, true }, + { 235873, true }, + { 235881, true }, + { 235893, true }, + { 235906, true }, + { 235933, true }, + { 235942, true }, + { 235957, true }, + { 235975, true }, + { 235982, false }, + { 235995, true }, + { 236003, true }, + { 236013, true }, + { 236022, true }, + { 236032, true }, + { 236040, true }, + { 236053, true }, + { 236062, true }, + { 236074, true }, + { 236083, true }, + { 236096, true }, + { 236105, true }, + { 236115, true }, + { 236125, true }, + { 236135, true }, + { 236145, true }, + { 236155, true }, { 236164, true }, - { 236191, true }, - { 236200, true }, - { 236215, true }, - { 236233, true }, - { 236240, false }, - { 236253, true }, - { 236261, true }, - { 236271, true }, + { 236171, true }, + { 236187, true }, + { 236204, true }, + { 236211, true }, + { 236225, true }, + { 236242, true }, + { 236254, true }, + { 236274, true }, + { 236283, true }, { 236291, true }, - { 236300, true }, - { 236310, true }, - { 236318, true }, - { 236331, true }, - { 236340, true }, - { 236352, true }, - { 236361, true }, - { 236374, true }, - { 236383, true }, - { 236393, true }, - { 236403, true }, - { 236413, true }, - { 236423, true }, - { 236433, true }, - { 236442, true }, - { 236449, true }, - { 236465, true }, - { 236482, true }, - { 236489, true }, - { 236503, true }, - { 236520, true }, - { 236532, true }, - { 236552, true }, - { 236561, true }, - { 236569, true }, - { 236576, true }, - { 236585, true }, - { 236594, true }, - { 236606, true }, - { 236620, true }, - { 236637, true }, + { 236298, true }, + { 236307, true }, + { 236316, true }, + { 236328, true }, + { 236342, true }, + { 236359, true }, + { 236375, true }, + { 236391, true }, + { 236410, true }, + { 236428, true }, + { 236446, true }, + { 236463, true }, + { 236478, true }, + { 236493, true }, + { 236511, true }, + { 236528, true }, + { 236538, true }, + { 236547, true }, + { 236557, true }, + { 236567, true }, + { 236577, true }, + { 236589, true }, + { 236607, true }, + { 236624, true }, + { 236638, true }, { 236653, true }, - { 236669, true }, - { 236688, true }, - { 236706, true }, - { 236724, true }, - { 236741, true }, - { 236756, true }, - { 236771, true }, - { 236789, true }, + { 236668, true }, + { 236680, true }, + { 236694, true }, + { 236702, true }, + { 236712, true }, + { 236725, true }, + { 236735, true }, + { 236750, true }, + { 236762, true }, + { 236776, true }, + { 236785, true }, + { 236794, false }, { 236806, true }, - { 236816, true }, - { 236825, true }, - { 236835, true }, - { 236845, true }, - { 236855, true }, + { 236819, false }, + { 236852, true }, { 236867, true }, - { 236885, true }, - { 236902, true }, - { 236916, true }, - { 236931, true }, - { 236946, true }, - { 236958, true }, + { 236878, true }, + { 236901, true }, + { 236914, true }, + { 236925, true }, + { 236939, true }, + { 236959, true }, { 236972, true }, - { 236980, true }, - { 236990, true }, - { 237003, true }, - { 237013, true }, - { 237028, true }, - { 237040, true }, - { 237054, true }, - { 237063, true }, - { 237072, false }, - { 237084, true }, - { 237097, false }, - { 237130, true }, - { 237145, true }, - { 237156, true }, - { 237179, true }, - { 237192, true }, - { 237203, true }, - { 237217, true }, - { 237237, true }, + { 236986, true }, + { 236999, true }, + { 237015, true }, + { 237025, true }, + { 237039, true }, + { 237057, true }, + { 237071, true }, + { 237087, true }, + { 237102, true }, + { 237124, true }, + { 237134, true }, + { 237146, true }, + { 237160, true }, + { 237176, true }, + { 237188, true }, + { 237198, true }, + { 237211, true }, + { 237228, true }, + { 237242, true }, { 237250, true }, - { 237264, true }, - { 237277, true }, - { 237293, true }, - { 237303, true }, - { 237317, true }, + { 237262, true }, + { 237276, true }, + { 237287, true }, + { 237296, true }, + { 237304, true }, + { 237316, false }, + { 237324, true }, { 237335, true }, - { 237349, true }, - { 237365, true }, - { 237380, true }, - { 237402, true }, - { 237412, true }, - { 237424, true }, - { 237438, true }, - { 237454, true }, - { 237466, true }, - { 237476, true }, - { 237489, true }, - { 237506, true }, - { 237520, true }, - { 237528, true }, - { 237540, true }, - { 237554, true }, - { 237565, true }, + { 237351, true }, + { 237362, true }, + { 237375, true }, + { 237387, false }, + { 237401, true }, + { 237414, true }, + { 237425, true }, + { 237435, true }, + { 237449, true }, + { 237468, true }, + { 237479, true }, + { 237493, true }, + { 237504, true }, + { 237515, true }, + { 237526, true }, + { 237537, true }, + { 237548, true }, + { 237562, true }, { 237574, true }, - { 237582, true }, - { 237594, false }, - { 237602, true }, - { 237613, true }, - { 237629, true }, - { 237640, true }, - { 237653, true }, - { 237665, false }, + { 237589, true }, + { 237603, true }, + { 237618, true }, + { 237631, true }, + { 237647, true }, + { 237656, true }, + { 237665, true }, { 237679, true }, - { 237692, true }, - { 237703, true }, - { 237713, true }, - { 237727, true }, - { 237746, true }, - { 237757, true }, - { 237771, true }, - { 237782, true }, - { 237793, true }, - { 237804, true }, - { 237815, true }, - { 237826, true }, - { 237840, true }, - { 237852, true }, - { 237867, true }, - { 237881, true }, - { 237896, true }, - { 237909, true }, - { 237925, true }, - { 237934, true }, - { 237943, true }, - { 237957, true }, - { 237968, true }, - { 237979, false }, - { 237995, true }, - { 238006, true }, - { 238017, true }, - { 238027, true }, - { 238043, true }, - { 238050, false }, - { 238064, true }, - { 238077, true }, - { 238086, true }, - { 238096, true }, - { 238109, true }, - { 238119, true }, - { 238143, true }, - { 238156, true }, - { 238166, true }, - { 238179, true }, - { 238193, true }, - { 238205, true }, - { 238219, true }, - { 238240, true }, - { 238255, true }, - { 238269, true }, - { 238281, true }, - { 238296, false }, - { 238315, true }, + { 237690, true }, + { 237701, false }, + { 237717, true }, + { 237728, true }, + { 237739, true }, + { 237749, true }, + { 237765, true }, + { 237772, false }, + { 237786, true }, + { 237799, true }, + { 237808, true }, + { 237818, true }, + { 237831, true }, + { 237841, true }, + { 237865, true }, + { 237878, true }, + { 237888, true }, + { 237901, true }, + { 237915, true }, + { 237927, true }, + { 237941, true }, + { 237962, true }, + { 237977, true }, + { 237991, true }, + { 238003, true }, + { 238018, false }, + { 238037, true }, + { 238047, true }, + { 238059, true }, + { 238069, true }, + { 238081, true }, + { 238098, true }, + { 238115, true }, + { 238134, true }, + { 238143, false }, + { 238158, true }, + { 238176, false }, + { 238188, true }, + { 238214, true }, + { 238225, true }, + { 238246, true }, + { 238261, true }, + { 238279, true }, + { 238296, true }, + { 238309, true }, { 238325, true }, - { 238337, true }, - { 238347, true }, - { 238359, true }, - { 238376, true }, - { 238393, true }, - { 238412, true }, - { 238421, false }, - { 238436, true }, - { 238454, false }, - { 238466, true }, - { 238492, true }, - { 238503, true }, - { 238524, true }, - { 238539, true }, - { 238557, true }, - { 238574, true }, - { 238587, true }, - { 238603, true }, - { 238618, true }, - { 238633, true }, - { 238645, true }, + { 238340, true }, + { 238355, true }, + { 238367, true }, + { 238378, true }, + { 238391, true }, + { 238401, true }, + { 238419, true }, + { 238439, true }, + { 238458, true }, + { 238486, true }, + { 238500, true }, + { 238519, true }, + { 238540, true }, + { 238549, true }, + { 238573, false }, + { 238592, true }, + { 238606, true }, + { 238624, true }, + { 238639, true }, { 238656, true }, - { 238669, true }, - { 238679, true }, - { 238697, true }, - { 238717, true }, - { 238736, true }, - { 238764, true }, - { 238778, true }, - { 238797, true }, - { 238818, true }, - { 238827, true }, - { 238851, false }, - { 238870, true }, - { 238884, true }, - { 238902, true }, + { 238676, true }, + { 238690, true }, + { 238700, true }, + { 238721, true }, + { 238739, true }, + { 238752, true }, + { 238773, true }, + { 238785, true }, + { 238796, true }, + { 238811, true }, + { 238826, true }, + { 238837, true }, + { 238858, true }, + { 238877, true }, + { 238888, true }, { 238917, true }, - { 238934, true }, - { 238954, true }, - { 238968, true }, - { 238978, true }, - { 238999, true }, - { 239017, true }, - { 239030, true }, - { 239051, true }, - { 239063, true }, - { 239074, true }, - { 239089, true }, - { 239104, true }, - { 239115, true }, - { 239136, true }, - { 239155, true }, - { 239166, true }, - { 239195, true }, - { 239220, true }, - { 239241, true }, - { 239248, true }, - { 239260, true }, - { 239276, true }, - { 239291, true }, - { 239307, true }, - { 239324, true }, - { 239346, true }, - { 239356, true }, + { 238942, true }, + { 238963, true }, + { 238970, true }, + { 238982, true }, + { 238998, true }, + { 239013, true }, + { 239029, true }, + { 239046, true }, + { 239068, true }, + { 239078, true }, + { 239090, true }, + { 239102, true }, + { 239119, true }, + { 239128, true }, + { 239141, false }, + { 239154, false }, + { 239174, true }, + { 239184, true }, + { 239196, true }, + { 239213, true }, + { 239229, true }, + { 239244, true }, + { 239262, true }, + { 239275, true }, + { 239290, true }, + { 239303, true }, + { 239319, true }, + { 239337, true }, + { 239349, true }, { 239368, true }, - { 239380, true }, - { 239397, true }, - { 239406, true }, - { 239419, false }, - { 239432, false }, - { 239452, true }, - { 239462, true }, - { 239474, true }, + { 239385, true }, + { 239396, true }, + { 239416, true }, + { 239427, true }, + { 239446, true }, + { 239472, true }, { 239491, true }, - { 239507, true }, - { 239522, true }, - { 239540, true }, - { 239553, true }, - { 239568, true }, - { 239581, true }, - { 239597, true }, + { 239510, true }, + { 239520, true }, + { 239535, true }, + { 239547, true }, + { 239567, true }, + { 239585, true }, + { 239602, true }, { 239615, true }, - { 239627, true }, - { 239646, true }, - { 239663, true }, - { 239674, true }, - { 239694, true }, - { 239705, true }, - { 239724, true }, - { 239750, true }, - { 239769, true }, - { 239788, true }, - { 239798, true }, - { 239813, true }, - { 239825, true }, - { 239845, true }, - { 239863, true }, - { 239880, true }, - { 239893, true }, - { 239906, true }, - { 239919, true }, - { 239932, true }, - { 239945, true }, - { 239969, true }, - { 239980, true }, - { 239992, true }, - { 240007, true }, - { 240023, true }, - { 240033, true }, - { 240046, true }, - { 240064, true }, - { 240082, true }, - { 240101, true }, - { 240113, true }, - { 240126, true }, - { 240144, true }, - { 240166, true }, - { 240179, true }, - { 240201, true }, - { 240218, true }, - { 240234, true }, - { 240262, true }, - { 240287, true }, + { 239628, true }, + { 239641, true }, + { 239654, true }, + { 239667, true }, + { 239691, true }, + { 239702, true }, + { 239714, true }, + { 239729, true }, + { 239745, true }, + { 239755, true }, + { 239768, true }, + { 239786, true }, + { 239804, true }, + { 239823, true }, + { 239835, true }, + { 239848, true }, + { 239866, true }, + { 239888, true }, + { 239901, true }, + { 239923, true }, + { 239940, true }, + { 239956, true }, + { 239984, true }, + { 240009, true }, + { 240041, true }, + { 240060, true }, + { 240080, true }, + { 240095, true }, + { 240115, true }, + { 240128, true }, + { 240153, true }, + { 240169, true }, + { 240186, true }, + { 240203, true }, + { 240215, true }, + { 240228, true }, + { 240241, true }, + { 240266, true }, + { 240284, true }, + { 240298, true }, { 240319, true }, - { 240338, true }, - { 240358, true }, - { 240373, true }, - { 240393, true }, - { 240406, true }, - { 240431, true }, - { 240447, true }, - { 240464, true }, + { 240331, true }, + { 240346, true }, + { 240363, true }, + { 240375, true }, + { 240394, true }, + { 240411, true }, + { 240429, true }, + { 240455, true }, + { 240470, true }, { 240481, true }, - { 240493, true }, - { 240506, true }, - { 240519, true }, - { 240544, true }, - { 240562, true }, - { 240576, true }, - { 240597, true }, - { 240609, true }, - { 240624, true }, - { 240641, true }, - { 240653, true }, - { 240686, true }, - { 240705, true }, - { 240722, true }, - { 240740, true }, - { 240766, true }, - { 240781, true }, - { 240792, true }, - { 240806, true }, - { 240825, true }, + { 240495, true }, + { 240514, true }, + { 240531, true }, + { 240546, true }, + { 240556, true }, + { 240568, true }, + { 240588, true }, + { 240602, true }, + { 240616, true }, + { 240626, true }, + { 240639, true }, + { 240658, true }, + { 240670, true }, + { 240684, true }, + { 240693, true }, + { 240707, true }, + { 240721, true }, + { 240731, true }, + { 240743, true }, + { 240754, true }, + { 240772, false }, + { 240780, true }, + { 240796, true }, + { 240808, true }, + { 240819, true }, + { 240831, true }, { 240842, true }, - { 240857, true }, - { 240867, true }, - { 240879, true }, + { 240854, true }, + { 240866, true }, + { 240875, true }, + { 240885, true }, { 240899, true }, { 240913, true }, { 240927, true }, - { 240937, true }, - { 240950, true }, - { 240969, true }, - { 240981, true }, - { 240995, true }, - { 241004, true }, - { 241018, true }, - { 241032, true }, - { 241042, true }, - { 241054, true }, - { 241065, true }, - { 241083, true }, - { 241099, true }, - { 241111, true }, - { 241122, true }, - { 241134, true }, - { 241145, true }, - { 241157, true }, - { 241169, true }, - { 241178, true }, + { 240941, true }, + { 240959, true }, + { 240970, true }, + { 240978, true }, + { 240994, true }, + { 241009, true }, + { 241027, true }, + { 241047, true }, + { 241055, true }, + { 241076, true }, + { 241087, true }, + { 241102, true }, + { 241117, false }, + { 241135, false }, + { 241156, true }, + { 241165, true }, { 241188, true }, - { 241202, true }, - { 241216, true }, - { 241230, true }, - { 241244, true }, - { 241262, true }, - { 241273, true }, - { 241281, true }, - { 241297, true }, - { 241312, true }, - { 241330, true }, - { 241350, true }, - { 241358, true }, - { 241379, true }, + { 241211, true }, + { 241228, true }, + { 241240, true }, + { 241261, true }, + { 241287, true }, + { 241304, true }, + { 241321, true }, + { 241341, true }, + { 241354, true }, + { 241368, true }, { 241390, true }, - { 241405, true }, - { 241420, false }, - { 241438, false }, - { 241459, true }, - { 241468, true }, - { 241491, true }, - { 241514, true }, - { 241531, true }, - { 241543, true }, - { 241564, true }, - { 241590, true }, - { 241607, true }, - { 241624, true }, + { 241407, true }, + { 241424, true }, + { 241444, true }, + { 241469, true }, + { 241494, true }, + { 241520, true }, + { 241536, true }, + { 241547, true }, + { 241565, true }, + { 241574, true }, + { 241584, true }, + { 241595, true }, + { 241608, true }, + { 241622, true }, + { 241631, true }, { 241644, true }, - { 241657, true }, - { 241671, true }, - { 241693, true }, - { 241710, true }, - { 241727, true }, - { 241747, true }, - { 241772, true }, - { 241797, true }, + { 241666, true }, + { 241678, true }, + { 241686, false }, + { 241700, true }, + { 241708, true }, + { 241719, true }, + { 241729, true }, + { 241739, true }, + { 241746, true }, + { 241757, true }, + { 241769, true }, + { 241779, true }, + { 241786, true }, + { 241798, true }, + { 241810, true }, { 241823, true }, - { 241839, true }, - { 241850, true }, - { 241868, true }, - { 241877, true }, - { 241887, true }, - { 241898, true }, - { 241911, true }, - { 241925, true }, - { 241934, true }, - { 241947, true }, - { 241969, true }, - { 241981, true }, - { 241989, false }, - { 242003, true }, - { 242011, true }, - { 242022, true }, - { 242032, true }, - { 242042, true }, - { 242049, true }, - { 242060, true }, - { 242072, true }, - { 242082, true }, - { 242089, true }, - { 242101, true }, - { 242113, true }, - { 242126, true }, - { 242135, true }, + { 241832, true }, + { 241842, true }, + { 241852, true }, + { 241863, true }, + { 241874, true }, + { 241882, true }, + { 241903, true }, + { 241916, true }, + { 241928, true }, + { 241939, true }, + { 241953, true }, + { 241979, true }, + { 242009, false }, + { 242023, true }, + { 242039, true }, + { 242055, true }, + { 242068, true }, + { 242080, true }, + { 242095, true }, + { 242108, true }, + { 242129, true }, { 242145, true }, - { 242155, true }, - { 242166, true }, - { 242177, true }, - { 242185, true }, - { 242206, true }, - { 242219, true }, - { 242231, true }, - { 242242, true }, - { 242256, true }, - { 242282, true }, - { 242312, false }, - { 242326, true }, - { 242342, true }, - { 242358, true }, - { 242371, true }, - { 242383, true }, - { 242398, true }, - { 242411, true }, - { 242432, true }, - { 242448, true }, - { 242460, true }, - { 242470, true }, - { 242492, true }, - { 242523, true }, - { 242540, true }, - { 242557, true }, - { 242570, true }, - { 242581, false }, - { 242592, true }, - { 242602, true }, - { 242614, true }, + { 242157, true }, + { 242167, true }, + { 242189, true }, + { 242220, true }, + { 242237, true }, + { 242254, true }, + { 242267, true }, + { 242278, false }, + { 242289, true }, + { 242299, true }, + { 242311, true }, + { 242323, true }, + { 242337, true }, + { 242348, false }, + { 242361, false }, + { 242381, true }, + { 242391, true }, + { 242399, false }, + { 242408, true }, + { 242421, true }, + { 242479, true }, + { 242525, true }, + { 242579, true }, { 242626, true }, - { 242640, true }, - { 242651, false }, - { 242664, false }, - { 242684, true }, - { 242694, true }, - { 242702, false }, - { 242711, true }, - { 242724, true }, - { 242782, true }, - { 242828, true }, - { 242882, true }, - { 242929, true }, - { 242978, true }, - { 243023, true }, + { 242675, true }, + { 242720, true }, + { 242770, true }, + { 242824, true }, + { 242870, true }, + { 242917, true }, + { 242971, true }, + { 242998, true }, + { 243031, true }, + { 243044, true }, + { 243057, true }, { 243073, true }, - { 243127, true }, - { 243173, true }, - { 243220, true }, + { 243096, true }, + { 243112, true }, + { 243125, true }, + { 243141, true }, + { 243151, true }, + { 243162, false }, + { 243174, true }, + { 243191, true }, + { 243208, true }, + { 243226, true }, + { 243240, true }, + { 243258, true }, { 243274, true }, - { 243301, true }, - { 243334, true }, - { 243347, true }, - { 243360, true }, - { 243376, true }, - { 243399, true }, - { 243415, true }, - { 243428, true }, - { 243444, true }, - { 243454, true }, - { 243465, false }, - { 243477, true }, - { 243494, true }, - { 243511, true }, - { 243529, true }, - { 243543, true }, - { 243561, true }, - { 243577, true }, - { 243588, true }, - { 243599, true }, - { 243607, true }, - { 243617, true }, - { 243624, true }, - { 243633, true }, - { 243641, true }, - { 243651, true }, + { 243285, true }, + { 243296, true }, + { 243304, true }, + { 243314, true }, + { 243321, true }, + { 243330, true }, + { 243338, true }, + { 243348, true }, + { 243359, true }, + { 243366, true }, + { 243384, true }, + { 243403, true }, + { 243416, true }, + { 243430, true }, + { 243442, true }, + { 243456, true }, + { 243471, true }, + { 243483, true }, + { 243496, true }, + { 243507, true }, + { 243528, true }, + { 243538, true }, + { 243547, true }, + { 243556, true }, + { 243563, true }, + { 243570, true }, + { 243594, true }, + { 243608, true }, + { 243618, true }, + { 243635, false }, + { 243650, true }, { 243662, true }, - { 243669, true }, - { 243687, true }, - { 243706, true }, - { 243719, true }, - { 243733, true }, - { 243745, true }, - { 243759, true }, - { 243774, true }, - { 243786, true }, - { 243799, true }, - { 243810, true }, + { 243676, true }, + { 243688, true }, + { 243702, true }, + { 243713, true }, + { 243725, true }, + { 243737, true }, + { 243744, true }, + { 243756, true }, + { 243769, true }, + { 243779, true }, + { 243790, true }, + { 243806, true }, + { 243821, true }, { 243831, true }, - { 243841, true }, { 243850, true }, - { 243859, true }, - { 243866, true }, - { 243873, true }, - { 243897, true }, - { 243911, true }, - { 243921, true }, - { 243938, false }, - { 243953, true }, - { 243965, true }, - { 243979, true }, - { 243991, true }, - { 244005, true }, + { 243862, true }, + { 243869, true }, + { 243891, true }, + { 243902, true }, + { 243917, true }, + { 243940, true }, + { 243947, true }, + { 243957, true }, + { 243968, true }, + { 243978, true }, + { 243990, true }, + { 244006, true }, { 244016, true }, - { 244028, true }, - { 244040, true }, - { 244047, true }, - { 244059, true }, - { 244072, true }, - { 244082, true }, - { 244093, true }, - { 244109, true }, - { 244124, true }, - { 244134, true }, - { 244153, true }, - { 244165, true }, - { 244172, true }, - { 244194, true }, + { 244023, true }, + { 244030, true }, + { 244042, true }, + { 244053, true }, + { 244063, true }, + { 244075, true }, + { 244085, false }, + { 244105, false }, + { 244128, true }, + { 244152, true }, + { 244162, false }, + { 244169, true }, + { 244180, true }, + { 244192, true }, { 244205, true }, - { 244220, true }, - { 244243, true }, - { 244250, true }, - { 244260, true }, - { 244271, true }, - { 244281, true }, - { 244293, true }, - { 244309, true }, - { 244319, true }, - { 244326, true }, - { 244333, true }, - { 244345, true }, - { 244356, true }, - { 244366, true }, - { 244378, true }, - { 244388, false }, - { 244408, false }, - { 244431, true }, + { 244219, true }, + { 244233, true }, + { 244246, true }, + { 244257, true }, + { 244273, false }, + { 244294, true }, + { 244304, true }, + { 244315, true }, + { 244330, true }, + { 244344, true }, + { 244355, true }, + { 244369, true }, + { 244389, true }, + { 244403, true }, + { 244414, true }, + { 244429, true }, + { 244442, true }, { 244455, true }, - { 244465, false }, - { 244472, true }, - { 244483, true }, - { 244495, true }, - { 244508, true }, - { 244522, true }, - { 244536, true }, - { 244549, true }, - { 244560, true }, - { 244576, false }, - { 244597, true }, - { 244607, true }, - { 244618, true }, - { 244633, true }, - { 244647, true }, - { 244658, true }, - { 244672, true }, - { 244692, true }, - { 244706, true }, - { 244717, true }, - { 244732, true }, - { 244745, true }, + { 244470, true }, + { 244486, true }, + { 244500, true }, + { 244515, true }, + { 244529, true }, + { 244545, true }, + { 244559, true }, + { 244573, true }, + { 244591, true }, + { 244609, true }, + { 244629, true }, + { 244648, true }, + { 244664, true }, + { 244679, true }, + { 244693, true }, + { 244713, true }, + { 244729, true }, + { 244744, true }, { 244758, true }, - { 244773, true }, - { 244789, true }, - { 244803, true }, - { 244818, true }, - { 244832, true }, + { 244774, true }, + { 244785, true }, + { 244795, false }, + { 244819, true }, + { 244833, true }, { 244848, true }, { 244862, true }, - { 244876, true }, - { 244894, true }, - { 244912, true }, - { 244932, true }, - { 244951, true }, - { 244967, true }, - { 244982, true }, - { 244996, true }, - { 245016, true }, - { 245032, true }, - { 245047, true }, + { 244872, true }, + { 244890, true }, + { 244907, true }, + { 244920, true }, + { 244933, true }, + { 244950, true }, + { 244967, false }, + { 244984, true }, + { 244997, true }, + { 245014, true }, + { 245035, true }, + { 245048, true }, { 245061, true }, - { 245077, true }, - { 245088, true }, - { 245098, false }, + { 245081, true }, + { 245099, true }, + { 245109, true }, { 245122, true }, { 245136, true }, - { 245151, true }, - { 245165, true }, - { 245175, true }, - { 245193, true }, - { 245210, true }, - { 245223, true }, - { 245236, true }, - { 245253, true }, - { 245270, false }, - { 245287, true }, - { 245300, true }, + { 245150, false }, + { 245161, true }, + { 245178, true }, + { 245192, true }, + { 245211, true }, + { 245234, true }, + { 245262, true }, + { 245278, true }, + { 245290, true }, + { 245304, false }, { 245317, true }, - { 245338, true }, - { 245351, true }, - { 245364, true }, - { 245384, true }, - { 245402, true }, - { 245412, true }, - { 245425, true }, - { 245439, true }, - { 245453, false }, - { 245464, true }, - { 245481, true }, - { 245495, true }, - { 245514, true }, - { 245537, true }, - { 245565, true }, - { 245581, true }, - { 245593, true }, - { 245607, false }, - { 245620, true }, - { 245634, true }, - { 245647, true }, - { 245657, true }, - { 245666, true }, - { 245678, true }, - { 245691, true }, - { 245704, true }, - { 245720, true }, - { 245730, true }, - { 245745, true }, - { 245753, true }, - { 245764, true }, - { 245779, true }, - { 245796, true }, - { 245803, true }, - { 245813, true }, - { 245823, true }, - { 245844, true }, - { 245860, true }, - { 245879, true }, - { 245899, true }, - { 245914, true }, - { 245922, true }, - { 245941, true }, + { 245331, true }, + { 245344, true }, + { 245354, true }, + { 245363, true }, + { 245375, true }, + { 245388, true }, + { 245401, true }, + { 245417, true }, + { 245427, true }, + { 245442, true }, + { 245450, true }, + { 245461, true }, + { 245476, true }, + { 245493, true }, + { 245500, true }, + { 245510, true }, + { 245520, true }, + { 245541, true }, + { 245557, true }, + { 245576, true }, + { 245596, true }, + { 245611, true }, + { 245619, true }, + { 245638, true }, + { 245649, true }, + { 245665, true }, + { 245680, true }, + { 245690, true }, + { 245698, true }, + { 245709, true }, + { 245722, true }, + { 245733, true }, + { 245748, false }, + { 245768, true }, + { 245783, true }, + { 245805, true }, + { 245815, true }, + { 245830, true }, + { 245843, true }, + { 245854, true }, + { 245864, true }, + { 245876, true }, + { 245900, true }, + { 245913, true }, + { 245926, true }, + { 245938, true }, { 245952, true }, - { 245968, true }, - { 245983, true }, - { 245993, true }, - { 246001, true }, + { 245963, true }, + { 245980, true }, + { 245996, true }, { 246012, true }, - { 246025, true }, - { 246036, true }, - { 246051, false }, - { 246071, true }, - { 246086, true }, - { 246108, true }, - { 246118, true }, - { 246133, true }, - { 246146, true }, - { 246157, true }, - { 246167, true }, - { 246179, true }, - { 246203, true }, - { 246216, true }, - { 246229, true }, + { 246028, true }, + { 246047, true }, + { 246067, true }, + { 246089, true }, + { 246100, true }, + { 246110, true }, + { 246121, true }, + { 246129, false }, + { 246136, true }, + { 246149, true }, + { 246160, true }, + { 246170, true }, + { 246184, true }, + { 246199, true }, + { 246209, true }, + { 246227, true }, { 246241, true }, - { 246255, true }, - { 246266, true }, - { 246283, true }, - { 246299, true }, - { 246315, true }, - { 246331, true }, - { 246350, true }, - { 246370, true }, - { 246392, true }, - { 246403, true }, - { 246413, true }, - { 246424, true }, - { 246432, false }, - { 246439, true }, + { 246260, true }, + { 246272, true }, + { 246299, false }, + { 246308, true }, + { 246321, false }, + { 246344, true }, + { 246355, true }, + { 246362, true }, + { 246369, true }, + { 246380, true }, + { 246393, true }, + { 246409, true }, + { 246422, true }, + { 246434, true }, { 246452, true }, - { 246463, true }, - { 246473, true }, - { 246487, true }, - { 246502, true }, - { 246512, true }, - { 246530, true }, - { 246544, true }, - { 246563, true }, - { 246575, true }, - { 246602, false }, - { 246611, true }, - { 246624, false }, - { 246647, true }, - { 246658, true }, - { 246665, true }, - { 246672, true }, - { 246683, true }, - { 246696, true }, - { 246712, true }, - { 246725, true }, - { 246737, true }, - { 246755, true }, - { 246765, true }, - { 246782, true }, - { 246797, true }, - { 246806, true }, - { 246817, true }, - { 246828, true }, - { 246846, true }, - { 246860, true }, - { 246872, false }, - { 246881, true }, - { 246891, true }, - { 246903, true }, - { 246915, true }, - { 246928, true }, - { 246944, true }, - { 246963, true }, - { 246982, true }, - { 246997, true }, - { 247007, true }, - { 247026, true }, - { 247044, true }, - { 247056, true }, - { 247075, true }, - { 247083, false }, - { 247098, true }, - { 247105, true }, - { 247117, true }, - { 247126, true }, - { 247141, true }, - { 247150, true }, - { 247161, false }, - { 247171, true }, - { 247180, true }, - { 247189, true }, - { 247197, true }, - { 247203, true }, - { 247222, true }, - { 247235, true }, - { 247257, true }, - { 247275, true }, - { 247288, true }, - { 247304, true }, - { 247313, true }, - { 247323, true }, - { 247339, true }, - { 247351, true }, - { 247362, true }, - { 247377, true }, - { 247391, true }, + { 246462, true }, + { 246479, true }, + { 246494, true }, + { 246503, true }, + { 246514, true }, + { 246525, true }, + { 246543, true }, + { 246557, true }, + { 246569, false }, + { 246578, true }, + { 246588, true }, + { 246600, true }, + { 246612, true }, + { 246625, true }, + { 246641, true }, + { 246660, true }, + { 246679, true }, + { 246694, true }, + { 246704, true }, + { 246723, true }, + { 246741, true }, + { 246753, true }, + { 246772, true }, + { 246780, false }, + { 246795, true }, + { 246802, true }, + { 246814, true }, + { 246823, true }, + { 246838, true }, + { 246847, true }, + { 246858, false }, + { 246868, true }, + { 246877, true }, + { 246886, true }, + { 246894, true }, + { 246900, true }, + { 246919, true }, + { 246932, true }, + { 246954, true }, + { 246972, true }, + { 246985, true }, + { 247001, true }, + { 247010, true }, + { 247020, true }, + { 247036, true }, + { 247048, true }, + { 247059, true }, + { 247074, true }, + { 247088, true }, + { 247103, true }, + { 247121, true }, + { 247133, true }, + { 247143, true }, + { 247167, true }, + { 247187, true }, + { 247208, true }, + { 247221, true }, + { 247237, true }, + { 247249, true }, + { 247263, true }, + { 247280, true }, + { 247299, true }, + { 247309, true }, + { 247331, true }, + { 247346, true }, + { 247360, true }, + { 247373, true }, + { 247382, true }, + { 247393, true }, { 247406, true }, - { 247424, true }, - { 247436, true }, + { 247417, true }, + { 247431, true }, { 247446, true }, - { 247470, true }, - { 247490, true }, + { 247460, true }, + { 247475, true }, + { 247498, false }, { 247511, true }, - { 247524, true }, - { 247540, true }, + { 247523, true }, + { 247537, true }, { 247552, true }, - { 247566, true }, + { 247561, true }, + { 247573, true }, { 247583, true }, - { 247602, true }, - { 247612, true }, - { 247634, true }, - { 247649, true }, - { 247663, true }, - { 247676, true }, - { 247685, true }, + { 247597, true }, + { 247610, true }, + { 247623, true }, + { 247642, true }, + { 247656, true }, + { 247668, true }, + { 247680, true }, { 247696, true }, - { 247709, true }, - { 247720, true }, - { 247734, true }, - { 247749, true }, - { 247763, true }, - { 247778, true }, - { 247801, false }, - { 247814, true }, + { 247714, true }, + { 247740, true }, + { 247758, false }, + { 247771, true }, + { 247789, true }, + { 247799, true }, + { 247809, true }, { 247826, true }, - { 247840, true }, - { 247855, true }, - { 247864, true }, + { 247837, true }, + { 247852, true }, + { 247868, true }, { 247876, true }, { 247886, true }, - { 247900, true }, - { 247913, true }, - { 247926, true }, - { 247945, true }, - { 247959, true }, - { 247971, true }, - { 247983, true }, - { 247999, true }, - { 248017, true }, - { 248043, true }, - { 248061, false }, - { 248074, true }, - { 248092, true }, - { 248102, true }, - { 248112, true }, - { 248129, true }, - { 248140, true }, - { 248155, true }, - { 248171, true }, - { 248179, true }, - { 248189, true }, - { 248199, true }, - { 248209, true }, - { 248221, true }, - { 248231, true }, - { 248241, true }, - { 248252, true }, - { 248272, true }, - { 248280, false }, - { 248301, true }, - { 248314, true }, - { 248323, true }, - { 248337, true }, - { 248347, true }, - { 248360, true }, - { 248376, true }, - { 248387, false }, - { 248407, true }, - { 248417, true }, - { 248424, true }, - { 248434, true }, - { 248444, true }, - { 248459, true }, - { 248473, true }, - { 248490, true }, - { 248507, true }, - { 248527, true }, - { 248540, true }, - { 248558, true }, - { 248574, true }, - { 248583, true }, - { 248613, true }, - { 248639, true }, - { 248659, true }, - { 248667, true }, - { 248686, true }, - { 248700, true }, - { 248709, true }, - { 248724, true }, - { 248749, true }, - { 248768, true }, - { 248778, true }, - { 248799, true }, - { 248811, true }, - { 248826, true }, + { 247896, true }, + { 247906, true }, + { 247918, true }, + { 247928, true }, + { 247938, true }, + { 247949, true }, + { 247969, true }, + { 247977, false }, + { 247998, true }, + { 248011, true }, + { 248020, true }, + { 248034, true }, + { 248044, true }, + { 248057, true }, + { 248073, true }, + { 248084, false }, + { 248104, true }, + { 248114, true }, + { 248121, true }, + { 248131, true }, + { 248141, true }, + { 248156, true }, + { 248170, true }, + { 248187, true }, + { 248204, true }, + { 248224, true }, + { 248237, true }, + { 248255, true }, + { 248271, true }, + { 248280, true }, + { 248310, true }, + { 248336, true }, + { 248356, true }, + { 248364, true }, + { 248383, true }, + { 248397, true }, + { 248406, true }, + { 248421, true }, + { 248446, true }, + { 248465, true }, + { 248475, true }, + { 248496, true }, + { 248508, true }, + { 248523, true }, + { 248536, true }, + { 248552, true }, + { 248564, true }, + { 248581, true }, + { 248592, true }, + { 248609, true }, + { 248627, true }, + { 248643, true }, + { 248663, true }, + { 248685, true }, + { 248698, true }, + { 248708, true }, + { 248730, true }, + { 248751, true }, + { 248770, true }, + { 248791, true }, + { 248804, true }, + { 248828, true }, { 248839, true }, - { 248855, true }, - { 248867, true }, - { 248884, true }, + { 248851, true }, + { 248863, true }, + { 248885, true }, { 248895, true }, - { 248912, true }, - { 248930, true }, - { 248946, true }, - { 248966, true }, - { 248988, true }, - { 249001, true }, - { 249011, true }, - { 249033, true }, - { 249054, true }, - { 249073, true }, + { 248913, true }, + { 248925, false }, + { 248942, true }, + { 248974, true }, + { 248985, true }, + { 248995, true }, + { 249008, true }, + { 249017, true }, + { 249030, true }, + { 249041, true }, + { 249052, true }, + { 249062, true }, + { 249069, true }, + { 249080, true }, { 249094, true }, - { 249107, true }, - { 249131, true }, - { 249142, true }, - { 249154, true }, - { 249166, true }, - { 249188, true }, - { 249198, true }, - { 249216, true }, - { 249228, false }, - { 249245, true }, - { 249277, true }, - { 249288, true }, - { 249298, true }, - { 249311, true }, - { 249320, true }, - { 249331, true }, - { 249342, true }, - { 249352, true }, - { 249359, true }, - { 249370, true }, - { 249384, true }, - { 249397, false }, - { 249409, true }, - { 249429, true }, - { 249442, true }, - { 249452, true }, - { 249465, true }, - { 249486, true }, - { 249496, true }, - { 249513, true }, - { 249527, true }, - { 249544, true }, - { 249562, true }, - { 249569, true }, - { 249587, false }, - { 249605, false }, - { 249623, false }, - { 249640, true }, - { 249662, true }, - { 249675, true }, - { 249688, false }, - { 249702, true }, - { 249714, true }, - { 249735, true }, - { 249753, true }, - { 249768, true }, - { 249793, true }, - { 249811, true }, - { 249827, true }, - { 249855, true }, - { 249870, true }, - { 249881, true }, - { 249904, false }, - { 249922, true }, - { 249937, true }, - { 249949, true }, - { 249962, true }, - { 249991, true }, - { 250009, true }, - { 250032, true }, - { 250051, true }, - { 250068, true }, - { 250078, true }, - { 250093, true }, - { 250104, true }, - { 250128, true }, - { 250139, false }, - { 250154, true }, - { 250169, true }, - { 250187, true }, - { 250201, true }, + { 249107, false }, + { 249119, true }, + { 249139, true }, + { 249152, true }, + { 249162, true }, + { 249175, true }, + { 249196, true }, + { 249206, true }, + { 249223, true }, + { 249237, true }, + { 249254, true }, + { 249272, true }, + { 249279, true }, + { 249297, false }, + { 249315, false }, + { 249333, false }, + { 249350, true }, + { 249372, true }, + { 249385, true }, + { 249398, false }, + { 249412, true }, + { 249424, true }, + { 249445, true }, + { 249463, true }, + { 249478, true }, + { 249503, true }, + { 249521, true }, + { 249537, true }, + { 249565, true }, + { 249580, true }, + { 249591, true }, + { 249614, false }, + { 249632, true }, + { 249647, true }, + { 249659, true }, + { 249672, true }, + { 249701, true }, + { 249719, true }, + { 249742, true }, + { 249761, true }, + { 249778, true }, + { 249788, true }, + { 249803, true }, + { 249814, true }, + { 249838, true }, + { 249849, false }, + { 249864, true }, + { 249879, true }, + { 249897, true }, + { 249911, true }, + { 249926, true }, + { 249939, true }, + { 249951, true }, + { 249974, true }, + { 249988, true }, + { 250011, true }, + { 250036, true }, + { 250048, true }, + { 250064, true }, + { 250088, true }, + { 250106, true }, + { 250120, true }, + { 250131, true }, + { 250149, true }, + { 250173, false }, + { 250196, true }, { 250216, true }, - { 250228, true }, - { 250251, true }, - { 250265, true }, + { 250234, true }, + { 250254, true }, + { 250264, true }, + { 250277, true }, { 250288, true }, - { 250313, true }, - { 250325, true }, - { 250341, true }, - { 250365, true }, - { 250383, true }, - { 250397, true }, + { 250301, true }, + { 250318, true }, + { 250329, true }, + { 250340, true }, + { 250362, true }, + { 250380, false }, + { 250394, true }, { 250408, true }, { 250426, true }, - { 250450, false }, - { 250473, true }, - { 250493, true }, - { 250511, true }, - { 250531, true }, - { 250541, true }, - { 250554, true }, - { 250565, true }, - { 250578, true }, - { 250595, true }, - { 250606, true }, - { 250617, true }, - { 250639, true }, - { 250657, false }, - { 250671, true }, - { 250685, true }, - { 250703, true }, - { 250723, true }, + { 250446, true }, + { 250460, true }, + { 250469, true }, + { 250485, true }, + { 250503, true }, + { 250518, true }, + { 250533, true }, + { 250546, true }, + { 250558, true }, + { 250570, true }, + { 250581, true }, + { 250592, true }, + { 250605, true }, + { 250618, true }, + { 250632, true }, + { 250643, true }, + { 250654, true }, + { 250667, true }, + { 250681, true }, + { 250691, true }, + { 250700, true }, + { 250717, true }, + { 250727, true }, { 250737, true }, - { 250746, true }, - { 250762, true }, + { 250750, true }, + { 250759, true }, + { 250769, true }, { 250780, true }, - { 250795, true }, - { 250810, true }, - { 250823, true }, - { 250835, true }, - { 250847, true }, + { 250790, true }, + { 250798, true }, + { 250806, false }, + { 250820, true }, + { 250828, false }, + { 250848, true }, { 250858, true }, - { 250869, true }, - { 250882, true }, - { 250895, true }, - { 250909, true }, - { 250920, true }, - { 250931, true }, - { 250944, true }, - { 250958, true }, - { 250968, true }, - { 250977, true }, - { 250994, true }, - { 251004, true }, - { 251014, true }, - { 251027, true }, - { 251036, true }, - { 251046, true }, - { 251057, true }, - { 251067, true }, - { 251075, true }, - { 251083, false }, - { 251097, true }, - { 251105, false }, - { 251125, true }, - { 251135, true }, - { 251149, true }, - { 251163, true }, - { 251173, true }, + { 250872, true }, + { 250886, true }, + { 250896, true }, + { 250907, true }, + { 250919, true }, + { 250930, true }, + { 250942, true }, + { 250952, true }, + { 250961, true }, + { 250972, true }, + { 250985, true }, + { 250997, true }, + { 251009, true }, + { 251021, true }, + { 251032, true }, + { 251046, false }, + { 251062, true }, + { 251078, true }, + { 251093, true }, + { 251107, true }, + { 251116, true }, + { 251128, true }, + { 251138, true }, + { 251154, true }, + { 251169, true }, { 251184, true }, - { 251196, true }, - { 251207, true }, - { 251219, true }, - { 251229, true }, - { 251238, true }, - { 251249, true }, - { 251262, true }, - { 251274, true }, + { 251200, true }, + { 251215, true }, + { 251230, true }, + { 251252, true }, + { 251264, true }, + { 251271, true }, { 251286, true }, - { 251298, true }, - { 251309, true }, - { 251323, false }, - { 251339, true }, - { 251355, true }, - { 251370, true }, - { 251384, true }, - { 251393, true }, - { 251405, true }, - { 251415, true }, - { 251431, true }, - { 251446, true }, - { 251461, true }, - { 251477, true }, - { 251492, true }, - { 251507, true }, - { 251529, true }, - { 251541, true }, - { 251548, true }, - { 251563, true }, - { 251574, true }, - { 251584, true }, - { 251599, true }, - { 251613, true }, - { 251627, true }, - { 251638, true }, - { 251651, true }, - { 251662, true }, - { 251672, false }, - { 251687, true }, - { 251703, true }, - { 251712, true }, - { 251722, true }, - { 251729, true }, - { 251740, true }, - { 251752, true }, - { 251774, true }, - { 251786, true }, - { 251798, true }, - { 251812, true }, - { 251835, true }, - { 251882, true }, - { 251917, true }, - { 251953, true }, - { 251990, true }, - { 252023, true }, - { 252061, true }, - { 252096, true }, - { 252131, true }, - { 252171, true }, - { 252207, true }, - { 252250, true }, - { 252276, true }, - { 252285, true }, - { 252295, true }, - { 252305, true }, - { 252332, true }, - { 252341, true }, - { 252350, true }, - { 252367, true }, + { 251297, true }, + { 251307, true }, + { 251322, true }, + { 251336, true }, + { 251350, true }, + { 251361, true }, + { 251374, true }, + { 251385, true }, + { 251395, false }, + { 251410, true }, + { 251426, true }, + { 251435, true }, + { 251445, true }, + { 251452, true }, + { 251463, true }, + { 251475, true }, + { 251497, true }, + { 251509, true }, + { 251521, true }, + { 251535, true }, + { 251558, true }, + { 251605, true }, + { 251640, true }, + { 251676, true }, + { 251713, true }, + { 251746, true }, + { 251784, true }, + { 251819, true }, + { 251854, true }, + { 251894, true }, + { 251930, true }, + { 251973, true }, + { 251999, true }, + { 252008, true }, + { 252018, true }, + { 252028, true }, + { 252055, true }, + { 252064, true }, + { 252073, true }, + { 252090, true }, + { 252107, true }, + { 252119, true }, + { 252132, true }, + { 252145, true }, + { 252172, true }, + { 252179, true }, + { 252191, true }, + { 252202, true }, + { 252211, true }, + { 252228, true }, + { 252244, true }, + { 252255, true }, + { 252267, true }, + { 252280, true }, + { 252304, true }, + { 252316, true }, + { 252327, true }, + { 252335, true }, + { 252345, true }, + { 252352, true }, + { 252372, true }, { 252384, true }, - { 252396, true }, - { 252409, true }, - { 252422, true }, - { 252449, true }, - { 252456, true }, - { 252468, true }, + { 252402, true }, + { 252414, true }, + { 252425, true }, + { 252437, true }, + { 252447, true }, + { 252459, true }, { 252479, true }, - { 252488, true }, - { 252505, true }, - { 252521, true }, - { 252532, true }, - { 252544, true }, - { 252557, true }, - { 252581, true }, - { 252593, true }, - { 252604, true }, - { 252612, true }, - { 252622, true }, - { 252629, true }, - { 252649, true }, - { 252661, true }, + { 252501, true }, + { 252510, true }, + { 252518, true }, + { 252527, true }, + { 252536, true }, + { 252555, true }, + { 252569, true }, + { 252590, true }, + { 252603, true }, + { 252615, true }, + { 252643, true }, + { 252667, true }, { 252679, true }, - { 252691, true }, - { 252702, true }, - { 252714, true }, - { 252724, true }, - { 252736, true }, - { 252756, true }, - { 252778, true }, - { 252787, true }, - { 252795, true }, - { 252804, true }, - { 252813, true }, - { 252832, true }, - { 252846, true }, - { 252867, true }, - { 252880, true }, - { 252892, true }, - { 252920, true }, + { 252697, true }, + { 252715, false }, + { 252729, true }, + { 252744, true }, + { 252759, true }, + { 252768, true }, + { 252785, true }, + { 252806, true }, + { 252816, true }, + { 252830, true }, + { 252838, true }, + { 252853, true }, + { 252869, true }, + { 252885, true }, + { 252908, true }, + { 252918, true }, + { 252928, true }, { 252944, true }, - { 252956, true }, - { 252974, true }, - { 252992, false }, - { 253006, true }, - { 253021, true }, - { 253036, true }, - { 253045, true }, - { 253062, true }, - { 253083, true }, - { 253093, true }, - { 253107, true }, - { 253115, true }, - { 253130, true }, - { 253146, true }, - { 253162, true }, - { 253185, true }, + { 252955, true }, + { 252966, true }, + { 252978, true }, + { 252989, true }, + { 253002, true }, + { 253016, true }, + { 253033, false }, + { 253049, true }, + { 253065, true }, + { 253077, false }, + { 253096, true }, + { 253106, true }, + { 253124, true }, + { 253139, true }, + { 253161, true }, + { 253184, true }, { 253195, true }, { 253205, true }, - { 253221, true }, + { 253222, true }, { 253232, true }, - { 253243, true }, - { 253255, true }, - { 253266, true }, - { 253279, true }, - { 253293, true }, - { 253310, false }, - { 253326, true }, - { 253342, true }, - { 253354, false }, - { 253373, true }, - { 253383, true }, - { 253401, true }, - { 253416, true }, - { 253438, true }, - { 253461, true }, - { 253472, true }, + { 253248, true }, + { 253267, true }, + { 253282, true }, + { 253298, true }, + { 253315, true }, + { 253335, true }, + { 253352, true }, + { 253364, true }, + { 253379, true }, + { 253393, true }, + { 253412, true }, + { 253428, true }, + { 253437, true }, + { 253453, true }, + { 253470, true }, { 253482, true }, - { 253499, true }, - { 253509, true }, + { 253494, true }, + { 253506, true }, + { 253515, true }, { 253525, true }, - { 253544, true }, - { 253559, true }, - { 253575, true }, - { 253592, true }, - { 253612, true }, - { 253629, true }, + { 253542, true }, + { 253560, true }, + { 253571, true }, + { 253579, true }, + { 253589, true }, + { 253604, true }, + { 253614, true }, + { 253624, false }, + { 253631, true }, { 253641, true }, - { 253656, true }, - { 253670, true }, - { 253689, true }, - { 253705, true }, + { 253657, true }, + { 253673, true }, + { 253694, true }, { 253714, true }, - { 253730, true }, - { 253747, true }, - { 253759, true }, - { 253771, true }, - { 253783, true }, - { 253792, true }, - { 253802, true }, - { 253819, true }, - { 253837, true }, - { 253848, true }, - { 253856, true }, - { 253866, true }, - { 253881, true }, - { 253891, true }, - { 253901, false }, - { 253908, true }, - { 253918, true }, - { 253934, true }, - { 253950, true }, - { 253971, true }, + { 253737, true }, + { 253757, true }, + { 253772, true }, + { 253790, true }, + { 253801, false }, + { 253825, true }, + { 253844, true }, + { 253857, true }, + { 253873, true }, + { 253887, true }, + { 253899, true }, + { 253911, true }, + { 253922, true }, + { 253932, false }, + { 253946, false }, + { 253959, true }, + { 253973, true }, { 253991, true }, { 254014, true }, - { 254034, true }, - { 254049, true }, - { 254067, true }, - { 254078, false }, - { 254102, true }, - { 254121, true }, - { 254134, true }, - { 254150, true }, - { 254164, true }, - { 254176, true }, - { 254188, true }, - { 254199, true }, - { 254209, false }, - { 254223, false }, - { 254236, true }, - { 254250, true }, - { 254268, true }, + { 254032, true }, + { 254045, true }, + { 254057, true }, + { 254068, true }, + { 254079, true }, + { 254094, true }, + { 254108, true }, + { 254133, true }, + { 254166, true }, + { 254192, true }, + { 254226, true }, + { 254249, true }, + { 254262, true }, + { 254275, true }, { 254291, true }, - { 254309, true }, - { 254322, true }, - { 254334, true }, - { 254345, true }, - { 254356, true }, - { 254371, true }, + { 254308, true }, + { 254325, true }, + { 254337, true }, + { 254349, true }, + { 254365, false }, { 254385, true }, - { 254410, true }, - { 254443, true }, - { 254469, true }, - { 254503, true }, - { 254526, true }, - { 254539, true }, - { 254552, true }, - { 254568, true }, - { 254585, true }, - { 254602, true }, - { 254614, true }, - { 254626, true }, - { 254642, false }, - { 254662, true }, - { 254675, false }, - { 254693, false }, - { 254716, true }, - { 254736, true }, - { 254752, true }, - { 254766, true }, - { 254787, true }, - { 254802, false }, - { 254815, true }, + { 254398, false }, + { 254416, false }, + { 254439, true }, + { 254459, true }, + { 254475, true }, + { 254489, true }, + { 254510, true }, + { 254525, false }, + { 254538, true }, + { 254553, true }, + { 254570, true }, + { 254584, true }, + { 254597, true }, + { 254609, true }, + { 254621, true }, + { 254637, true }, + { 254652, false }, + { 254674, true }, + { 254694, true }, + { 254710, false }, + { 254722, true }, + { 254738, true }, + { 254756, true }, + { 254768, true }, + { 254782, true }, + { 254796, true }, + { 254813, true }, { 254830, true }, - { 254847, true }, - { 254861, true }, - { 254874, true }, - { 254886, true }, - { 254898, true }, - { 254914, true }, - { 254929, false }, - { 254951, true }, - { 254971, true }, - { 254987, false }, - { 254999, true }, - { 255015, true }, - { 255033, true }, - { 255045, true }, - { 255059, true }, - { 255073, true }, + { 254844, true }, + { 254854, false }, + { 254868, true }, + { 254878, true }, + { 254888, true }, + { 254909, true }, + { 254922, true }, + { 254940, true }, + { 254956, true }, + { 254969, true }, + { 254980, true }, + { 254993, true }, + { 255014, true }, + { 255027, true }, + { 255047, true }, + { 255064, true }, + { 255076, true }, { 255090, true }, - { 255107, true }, - { 255121, true }, - { 255131, false }, + { 255100, true }, + { 255117, true }, { 255145, true }, - { 255155, true }, - { 255165, true }, - { 255186, true }, - { 255199, true }, - { 255217, true }, - { 255233, true }, - { 255246, true }, - { 255257, true }, - { 255270, true }, - { 255291, true }, - { 255304, true }, + { 255154, true }, + { 255164, true }, + { 255182, true }, + { 255190, true }, + { 255206, true }, + { 255222, true }, + { 255238, true }, + { 255259, true }, + { 255272, true }, + { 255297, true }, + { 255312, true }, { 255324, true }, - { 255341, true }, - { 255353, true }, - { 255367, true }, - { 255377, true }, - { 255394, true }, - { 255422, true }, - { 255431, true }, - { 255441, true }, - { 255459, true }, - { 255467, true }, + { 255344, true }, + { 255358, true }, + { 255373, true }, + { 255395, true }, + { 255417, true }, + { 255437, true }, + { 255452, true }, + { 255465, true }, { 255483, true }, - { 255499, true }, - { 255515, true }, - { 255536, true }, - { 255549, true }, - { 255574, true }, - { 255589, true }, - { 255601, true }, - { 255621, true }, - { 255635, true }, - { 255650, true }, - { 255672, true }, - { 255694, true }, - { 255714, true }, - { 255729, true }, - { 255742, true }, - { 255760, true }, - { 255775, true }, - { 255791, true }, - { 255807, true }, - { 255823, true }, - { 255847, true }, - { 255858, true }, - { 255867, true }, - { 255875, false }, - { 255885, true }, - { 255897, true }, - { 255914, true }, - { 255926, true }, - { 255942, true }, - { 255958, true }, - { 255975, true }, - { 255996, true }, - { 256008, true }, - { 256020, true }, + { 255498, true }, + { 255514, true }, + { 255530, true }, + { 255546, true }, + { 255570, true }, + { 255581, true }, + { 255590, true }, + { 255598, false }, + { 255608, true }, + { 255620, true }, + { 255637, true }, + { 255649, true }, + { 255665, true }, + { 255681, true }, + { 255698, true }, + { 255719, true }, + { 255731, true }, + { 255743, true }, + { 255757, true }, + { 255776, false }, + { 255788, true }, + { 255800, true }, + { 255810, true }, + { 255825, true }, + { 255837, true }, + { 255861, true }, + { 255873, true }, + { 255905, true }, + { 255920, true }, + { 255941, true }, + { 255972, true }, + { 255986, true }, + { 256011, true }, { 256034, true }, - { 256053, false }, - { 256065, true }, - { 256077, true }, - { 256087, true }, - { 256102, true }, - { 256114, true }, - { 256128, true }, - { 256152, true }, - { 256164, true }, - { 256196, true }, - { 256211, true }, - { 256232, true }, - { 256263, true }, - { 256277, true }, - { 256302, true }, - { 256325, true }, - { 256336, true }, - { 256348, true }, - { 256363, true }, - { 256376, true }, - { 256389, true }, - { 256402, true }, - { 256412, true }, - { 256441, true }, - { 256464, true }, - { 256488, true }, - { 256515, true }, - { 256529, true }, - { 256552, true }, - { 256578, true }, - { 256606, true }, - { 256637, true }, - { 256662, true }, - { 256670, true }, - { 256677, true }, - { 256685, true }, - { 256694, true }, - { 256706, true }, - { 256728, true }, - { 256741, true }, - { 256762, true }, - { 256775, true }, - { 256796, true }, - { 256815, true }, - { 256836, true }, - { 256855, true }, - { 256866, true }, - { 256879, true }, - { 256891, true }, - { 256907, true }, - { 256921, false }, - { 256937, true }, - { 256945, true }, - { 256960, true }, - { 256977, true }, - { 256994, false }, - { 257009, true }, - { 257025, true }, - { 257035, true }, - { 257047, true }, - { 257063, true }, - { 257082, true }, - { 257096, false }, - { 257105, true }, + { 256045, true }, + { 256057, true }, + { 256072, true }, + { 256085, true }, + { 256098, true }, + { 256111, true }, + { 256121, true }, + { 256150, true }, + { 256173, true }, + { 256197, true }, + { 256224, true }, + { 256238, true }, + { 256261, true }, + { 256287, true }, + { 256315, true }, + { 256346, true }, + { 256371, true }, + { 256379, true }, + { 256386, true }, + { 256394, true }, + { 256403, true }, + { 256415, true }, + { 256437, true }, + { 256450, true }, + { 256471, true }, + { 256484, true }, + { 256505, true }, + { 256524, true }, + { 256545, true }, + { 256564, true }, + { 256575, true }, + { 256588, true }, + { 256600, true }, + { 256616, true }, + { 256630, false }, + { 256646, true }, + { 256654, true }, + { 256669, true }, + { 256686, true }, + { 256703, false }, + { 256718, true }, + { 256734, true }, + { 256744, true }, + { 256756, true }, + { 256772, true }, + { 256791, true }, + { 256805, false }, + { 256814, true }, + { 256826, true }, + { 256841, true }, + { 256854, true }, + { 256872, true }, + { 256883, true }, + { 256898, true }, + { 256911, true }, + { 256933, true }, + { 256950, true }, + { 256972, true }, + { 256994, true }, + { 257008, true }, + { 257022, true }, + { 257029, true }, + { 257042, true }, + { 257055, true }, + { 257072, true }, + { 257091, true }, { 257117, true }, - { 257132, true }, - { 257145, true }, - { 257163, true }, - { 257174, true }, - { 257189, true }, - { 257202, true }, - { 257224, true }, - { 257241, true }, - { 257263, true }, - { 257285, true }, - { 257299, true }, - { 257313, true }, - { 257320, true }, - { 257333, true }, - { 257346, true }, - { 257363, true }, - { 257382, true }, - { 257408, true }, - { 257420, true }, - { 257448, true }, - { 257459, true }, - { 257485, true }, - { 257505, true }, + { 257129, true }, + { 257157, true }, + { 257168, true }, + { 257194, true }, + { 257214, true }, + { 257235, true }, + { 257245, true }, + { 257255, false }, + { 257272, true }, + { 257284, true }, + { 257293, true }, + { 257306, true }, + { 257316, true }, + { 257330, true }, + { 257347, true }, + { 257359, true }, + { 257372, true }, + { 257390, true }, + { 257402, true }, + { 257413, true }, + { 257423, true }, + { 257436, false }, + { 257452, true }, + { 257468, true }, + { 257482, true }, + { 257495, false }, + { 257512, true }, { 257526, true }, - { 257536, true }, - { 257546, false }, - { 257563, true }, - { 257575, true }, - { 257584, true }, - { 257597, true }, - { 257607, true }, - { 257621, true }, - { 257638, true }, - { 257650, true }, + { 257540, true }, + { 257554, true }, + { 257578, true }, + { 257591, true }, + { 257604, true }, + { 257618, true }, + { 257632, true }, + { 257647, true }, { 257663, true }, - { 257681, true }, + { 257678, true }, { 257693, true }, - { 257704, true }, - { 257714, true }, - { 257727, false }, - { 257743, true }, - { 257759, true }, - { 257773, true }, - { 257786, false }, - { 257803, true }, - { 257817, true }, - { 257831, true }, - { 257845, true }, - { 257869, true }, - { 257882, true }, - { 257895, true }, - { 257909, true }, - { 257923, true }, - { 257938, true }, - { 257954, true }, - { 257969, true }, - { 257984, true }, - { 258002, true }, - { 258013, true }, - { 258036, true }, - { 258048, true }, - { 258060, true }, - { 258072, true }, - { 258086, true }, - { 258105, true }, - { 258123, true }, - { 258139, true }, - { 258153, true }, - { 258168, true }, - { 258183, true }, + { 257711, true }, + { 257722, true }, + { 257745, true }, + { 257757, true }, + { 257769, true }, + { 257781, true }, + { 257795, true }, + { 257814, true }, + { 257832, true }, + { 257848, true }, + { 257862, true }, + { 257877, true }, + { 257892, true }, + { 257916, true }, + { 257933, true }, + { 257951, true }, + { 257970, true }, + { 257990, true }, + { 258005, true }, + { 258023, true }, + { 258035, true }, + { 258052, true }, + { 258066, true }, + { 258083, true }, + { 258092, true }, + { 258106, true }, + { 258115, true }, + { 258128, true }, + { 258140, true }, + { 258160, true }, + { 258174, true }, + { 258189, true }, { 258207, true }, - { 258224, true }, - { 258242, true }, - { 258261, true }, - { 258281, true }, - { 258296, true }, - { 258314, true }, - { 258326, true }, - { 258343, true }, - { 258357, true }, - { 258374, true }, - { 258383, true }, - { 258397, true }, - { 258406, true }, + { 258223, true }, + { 258240, true }, + { 258252, false }, + { 258265, true }, + { 258276, true }, + { 258290, true }, + { 258303, true }, + { 258321, true }, + { 258333, true }, + { 258345, true }, + { 258363, false }, + { 258382, true }, + { 258404, true }, { 258419, true }, - { 258431, true }, - { 258451, true }, - { 258465, true }, - { 258480, true }, - { 258498, true }, - { 258514, true }, - { 258526, false }, - { 258539, true }, - { 258550, true }, - { 258571, true }, - { 258585, true }, - { 258598, true }, - { 258616, true }, - { 258628, true }, - { 258640, true }, - { 258658, false }, - { 258677, true }, - { 258699, true }, - { 258714, true }, - { 258733, true }, - { 258747, false }, - { 258758, true }, - { 258773, true }, - { 258789, true }, - { 258810, true }, - { 258824, true }, - { 258836, true }, - { 258848, true }, - { 258865, true }, - { 258883, true }, - { 258894, true }, + { 258438, true }, + { 258452, false }, + { 258463, true }, + { 258478, true }, + { 258494, true }, + { 258515, true }, + { 258529, true }, + { 258541, true }, + { 258553, true }, + { 258570, true }, + { 258588, true }, + { 258599, true }, + { 258606, true }, + { 258618, true }, + { 258632, true }, + { 258651, true }, + { 258661, true }, + { 258669, true }, + { 258679, true }, + { 258689, true }, + { 258704, true }, + { 258723, true }, + { 258739, false }, + { 258749, true }, + { 258756, true }, + { 258767, false }, + { 258779, true }, + { 258788, true }, + { 258802, true }, + { 258814, true }, + { 258822, true }, + { 258829, true }, + { 258839, true }, + { 258851, true }, + { 258862, true }, + { 258881, true }, + { 258889, false }, { 258901, true }, - { 258913, true }, - { 258927, true }, - { 258946, true }, - { 258956, true }, - { 258964, true }, - { 258974, true }, - { 258984, true }, - { 258999, true }, - { 259018, true }, - { 259034, false }, - { 259044, true }, - { 259051, true }, - { 259062, false }, - { 259074, true }, - { 259083, true }, - { 259097, true }, - { 259109, true }, - { 259117, true }, - { 259124, true }, - { 259134, true }, - { 259146, true }, - { 259157, true }, - { 259176, true }, - { 259184, false }, - { 259196, true }, - { 259209, true }, - { 259224, true }, - { 259246, true }, - { 259260, true }, - { 259272, true }, - { 259290, true }, - { 259303, true }, - { 259312, false }, - { 259329, true }, - { 259350, true }, - { 259361, true }, - { 259372, true }, - { 259386, true }, - { 259407, true }, - { 259419, true }, - { 259435, true }, - { 259460, true }, - { 259486, true }, - { 259512, true }, - { 259523, true }, - { 259533, true }, - { 259545, true }, - { 259558, true }, - { 259571, true }, - { 259581, true }, - { 259590, true }, - { 259604, true }, - { 259619, true }, - { 259635, true }, - { 259655, true }, - { 259670, true }, - { 259680, true }, - { 259692, true }, - { 259712, true }, - { 259734, true }, - { 259747, true }, - { 259766, true }, - { 259780, true }, - { 259799, true }, - { 259811, true }, - { 259835, false }, - { 259849, true }, - { 259862, true }, - { 259875, true }, - { 259894, true }, - { 259916, true }, - { 259928, true }, - { 259943, true }, - { 259964, true }, - { 259989, true }, - { 260014, true }, - { 260030, true }, - { 260056, true }, - { 260084, true }, - { 260105, true }, - { 260124, true }, - { 260137, true }, - { 260153, true }, - { 260166, true }, - { 260178, true }, + { 258914, true }, + { 258929, true }, + { 258951, true }, + { 258965, true }, + { 258977, true }, + { 258995, true }, + { 259008, true }, + { 259024, true }, + { 259033, false }, + { 259050, true }, + { 259071, true }, + { 259082, true }, + { 259093, true }, + { 259107, true }, + { 259128, true }, + { 259140, true }, + { 259156, true }, + { 259181, true }, + { 259207, true }, + { 259233, true }, + { 259244, true }, + { 259254, true }, + { 259266, true }, + { 259279, true }, + { 259292, true }, + { 259302, true }, + { 259311, true }, + { 259325, true }, + { 259340, true }, + { 259356, true }, + { 259376, true }, + { 259391, true }, + { 259401, true }, + { 259413, true }, + { 259433, true }, + { 259455, true }, + { 259468, true }, + { 259487, true }, + { 259501, true }, + { 259520, true }, + { 259532, true }, + { 259556, false }, + { 259570, true }, + { 259583, true }, + { 259596, true }, + { 259615, true }, + { 259637, true }, + { 259649, true }, + { 259664, true }, + { 259685, true }, + { 259710, true }, + { 259735, true }, + { 259751, true }, + { 259777, true }, + { 259805, true }, + { 259826, true }, + { 259845, true }, + { 259858, true }, + { 259874, true }, + { 259887, true }, + { 259899, true }, + { 259917, true }, + { 259931, true }, + { 259950, true }, + { 259961, true }, + { 259973, true }, + { 259983, true }, + { 259992, true }, + { 260006, true }, + { 260023, true }, + { 260034, true }, + { 260045, true }, + { 260053, true }, + { 260065, true }, + { 260079, true }, + { 260091, true }, + { 260104, false }, + { 260115, true }, + { 260132, true }, + { 260143, true }, + { 260152, false }, + { 260164, true }, + { 260183, true }, { 260196, true }, - { 260210, true }, + { 260207, true }, + { 260218, true }, { 260229, true }, - { 260240, true }, - { 260252, true }, - { 260262, true }, - { 260271, true }, - { 260285, true }, - { 260302, true }, - { 260313, true }, - { 260324, true }, - { 260332, true }, + { 260242, true }, + { 260253, true }, + { 260265, true }, + { 260275, true }, + { 260281, true }, + { 260291, true }, + { 260311, true }, + { 260321, true }, { 260344, true }, - { 260358, true }, - { 260370, true }, - { 260383, true }, + { 260369, true }, + { 260381, true }, { 260400, true }, - { 260411, true }, - { 260420, false }, - { 260432, true }, - { 260451, true }, - { 260464, true }, - { 260475, true }, - { 260486, true }, - { 260497, true }, - { 260510, true }, - { 260521, true }, + { 260408, true }, + { 260416, true }, + { 260430, true }, + { 260442, true }, + { 260454, true }, + { 260469, false }, + { 260482, true }, + { 260495, true }, + { 260506, true }, + { 260517, true }, { 260533, true }, { 260543, true }, - { 260549, true }, - { 260559, true }, - { 260579, true }, - { 260589, true }, - { 260612, true }, - { 260637, true }, - { 260649, true }, - { 260668, true }, - { 260676, true }, - { 260684, true }, - { 260698, true }, - { 260710, true }, - { 260722, true }, - { 260737, false }, - { 260750, true }, - { 260763, true }, - { 260774, true }, - { 260785, true }, - { 260801, true }, - { 260811, true }, - { 260825, true }, - { 260835, true }, - { 260849, true }, + { 260557, true }, + { 260567, true }, + { 260581, true }, + { 260588, true }, + { 260598, true }, + { 260611, true }, + { 260628, true }, + { 260638, true }, + { 260646, true }, + { 260661, true }, + { 260673, true }, + { 260689, true }, + { 260704, true }, + { 260714, true }, + { 260739, true }, + { 260751, true }, + { 260759, true }, + { 260771, false }, + { 260782, false }, + { 260800, false }, + { 260813, true }, + { 260828, true }, + { 260842, true }, { 260856, true }, - { 260866, true }, - { 260879, true }, - { 260896, true }, - { 260906, true }, - { 260914, true }, - { 260929, true }, + { 260873, true }, + { 260890, true }, + { 260905, true }, + { 260923, true }, { 260941, true }, - { 260957, true }, - { 260972, true }, - { 260982, true }, - { 261007, true }, - { 261019, true }, - { 261027, true }, - { 261039, false }, - { 261050, false }, - { 261068, false }, - { 261081, true }, - { 261096, true }, + { 260959, true }, + { 260973, true }, + { 260987, true }, + { 261001, true }, + { 261015, true }, + { 261029, false }, + { 261047, false }, + { 261070, false }, + { 261091, false }, { 261110, true }, - { 261124, true }, - { 261141, true }, + { 261126, false }, + { 261142, false }, { 261158, true }, - { 261173, true }, - { 261191, true }, - { 261209, true }, + { 261180, true }, + { 261193, false }, + { 261210, false }, { 261227, true }, - { 261241, true }, - { 261255, true }, - { 261269, true }, - { 261283, true }, - { 261297, false }, - { 261315, false }, - { 261338, false }, - { 261359, false }, - { 261378, true }, - { 261394, false }, - { 261410, false }, - { 261426, true }, - { 261448, true }, - { 261461, false }, - { 261478, false }, - { 261495, true }, - { 261512, false }, - { 261529, false }, - { 261543, false }, - { 261562, false }, - { 261573, false }, + { 261244, false }, + { 261261, false }, + { 261275, false }, + { 261294, false }, + { 261305, false }, + { 261317, false }, + { 261329, false }, + { 261348, true }, + { 261366, false }, + { 261380, true }, + { 261396, false }, + { 261413, false }, + { 261430, false }, + { 261445, false }, + { 261461, true }, + { 261482, false }, + { 261501, false }, + { 261519, false }, + { 261539, true }, + { 261555, false }, + { 261570, true }, { 261585, false }, - { 261597, false }, + { 261609, true }, { 261616, true }, - { 261634, false }, - { 261648, true }, - { 261664, false }, - { 261681, false }, - { 261698, false }, - { 261713, false }, - { 261729, true }, - { 261750, false }, - { 261769, false }, - { 261787, false }, - { 261807, true }, - { 261823, false }, - { 261838, true }, - { 261853, false }, - { 261877, true }, - { 261884, true }, - { 261903, false }, - { 261921, false }, - { 261936, true }, - { 261956, true }, - { 261977, false }, - { 262001, false }, - { 262020, false }, - { 262036, false }, - { 262051, false }, - { 262064, true }, - { 262080, false }, - { 262095, false }, - { 262109, false }, - { 262127, true }, - { 262138, true }, - { 262149, true }, - { 262157, true }, - { 262165, true }, - { 262180, true }, - { 262190, true }, - { 262203, true }, - { 262220, true }, - { 262236, true }, - { 262250, true }, - { 262258, true }, + { 261635, false }, + { 261653, false }, + { 261668, true }, + { 261688, true }, + { 261709, false }, + { 261733, false }, + { 261752, false }, + { 261768, false }, + { 261783, false }, + { 261796, true }, + { 261812, false }, + { 261827, false }, + { 261841, false }, + { 261859, true }, + { 261870, true }, + { 261881, true }, + { 261889, true }, + { 261897, true }, + { 261912, true }, + { 261922, true }, + { 261935, true }, + { 261952, true }, + { 261968, true }, + { 261982, true }, + { 261990, true }, + { 262001, true }, + { 262011, true }, + { 262029, true }, + { 262045, true }, + { 262050, true }, + { 262055, true }, + { 262063, true }, + { 262071, true }, + { 262091, true }, + { 262099, true }, + { 262108, true }, + { 262115, true }, + { 262134, true }, + { 262141, true }, + { 262148, true }, + { 262155, true }, + { 262164, true }, + { 262185, true }, + { 262205, true }, + { 262229, true }, + { 262239, true }, + { 262252, true }, { 262269, true }, - { 262279, true }, - { 262297, true }, - { 262313, true }, - { 262318, true }, - { 262323, true }, - { 262331, true }, - { 262339, true }, - { 262359, true }, - { 262367, true }, - { 262376, true }, - { 262383, true }, - { 262402, true }, - { 262409, true }, - { 262416, true }, - { 262423, true }, - { 262432, true }, - { 262453, true }, + { 262289, true }, + { 262295, true }, + { 262302, true }, + { 262314, true }, + { 262327, true }, + { 262338, true }, + { 262353, true }, + { 262366, false }, + { 262377, true }, + { 262388, true }, + { 262396, false }, + { 262415, true }, + { 262426, true }, + { 262437, true }, + { 262444, true }, + { 262455, true }, + { 262466, true }, { 262473, true }, - { 262497, true }, - { 262507, true }, - { 262520, true }, - { 262537, true }, - { 262557, true }, - { 262563, true }, + { 262484, true }, + { 262496, true }, + { 262515, true }, + { 262531, true }, + { 262543, true }, + { 262554, true }, { 262570, true }, - { 262582, true }, - { 262595, true }, - { 262606, true }, - { 262621, true }, - { 262634, false }, - { 262645, true }, - { 262656, true }, - { 262664, false }, - { 262683, true }, - { 262694, true }, - { 262705, true }, - { 262712, true }, - { 262723, true }, - { 262734, true }, - { 262741, true }, - { 262752, true }, - { 262764, true }, - { 262783, true }, - { 262799, true }, - { 262811, true }, - { 262822, true }, - { 262838, true }, - { 262852, true }, - { 262867, true }, - { 262882, true }, - { 262892, true }, - { 262902, true }, - { 262913, false }, - { 262923, true }, - { 262933, true }, - { 262944, true }, - { 262952, true }, - { 262960, true }, - { 262970, true }, - { 262979, false }, - { 262993, true }, - { 263001, true }, + { 262584, true }, + { 262599, true }, + { 262614, true }, + { 262624, true }, + { 262634, true }, + { 262645, false }, + { 262655, true }, + { 262665, true }, + { 262676, true }, + { 262684, true }, + { 262692, true }, + { 262702, true }, + { 262711, false }, + { 262725, true }, + { 262733, true }, + { 262743, true }, + { 262754, true }, + { 262762, true }, + { 262774, true }, + { 262785, true }, + { 262796, true }, + { 262808, true }, + { 262818, true }, + { 262826, true }, + { 262833, true }, + { 262840, true }, + { 262847, true }, + { 262872, true }, + { 262890, true }, + { 262916, true }, + { 262942, true }, + { 262953, true }, + { 262969, true }, + { 262999, true }, { 263011, true }, - { 263022, true }, { 263030, true }, - { 263042, true }, - { 263053, true }, - { 263064, true }, - { 263076, true }, - { 263086, true }, - { 263094, true }, + { 263054, true }, + { 263075, true }, { 263101, true }, - { 263108, true }, - { 263115, true }, - { 263140, true }, - { 263158, true }, - { 263184, true }, - { 263210, true }, - { 263221, true }, - { 263237, true }, - { 263267, true }, - { 263279, true }, - { 263298, true }, - { 263322, true }, - { 263343, true }, - { 263369, true }, - { 263402, true }, - { 263425, true }, - { 263444, true }, - { 263472, true }, - { 263492, true }, - { 263510, true }, - { 263532, true }, - { 263557, true }, - { 263582, true }, - { 263622, true }, - { 263652, true }, - { 263663, true }, - { 263682, true }, - { 263713, true }, - { 263724, false }, - { 263745, true }, - { 263763, true }, - { 263781, true }, - { 263799, true }, - { 263836, true }, - { 263864, true }, - { 263887, true }, - { 263915, true }, - { 263930, true }, - { 263957, true }, - { 263977, true }, - { 263998, true }, - { 264012, true }, - { 264029, true }, - { 264051, true }, - { 264076, true }, - { 264096, true }, - { 264115, true }, - { 264157, true }, - { 264176, true }, - { 264199, true }, - { 264215, true }, - { 264237, true }, - { 264271, true }, - { 264295, true }, - { 264302, false }, - { 264309, true }, - { 264320, true }, + { 263134, true }, + { 263157, true }, + { 263176, true }, + { 263204, true }, + { 263224, true }, + { 263242, true }, + { 263264, true }, + { 263289, true }, + { 263314, true }, + { 263354, true }, + { 263384, true }, + { 263395, true }, + { 263414, true }, + { 263445, true }, + { 263456, false }, + { 263477, true }, + { 263495, true }, + { 263513, true }, + { 263531, true }, + { 263568, true }, + { 263596, true }, + { 263619, true }, + { 263647, true }, + { 263662, true }, + { 263689, true }, + { 263709, true }, + { 263730, true }, + { 263744, true }, + { 263761, true }, + { 263783, true }, + { 263808, true }, + { 263828, true }, + { 263847, true }, + { 263889, true }, + { 263908, true }, + { 263931, true }, + { 263947, true }, + { 263969, true }, + { 264003, true }, + { 264027, true }, + { 264034, false }, + { 264041, true }, + { 264052, true }, + { 264058, true }, + { 264069, true }, + { 264079, true }, + { 264095, true }, + { 264111, true }, + { 264121, true }, + { 264131, true }, + { 264138, true }, + { 264145, true }, + { 264162, true }, + { 264178, true }, + { 264191, true }, + { 264198, true }, + { 264213, true }, + { 264227, true }, + { 264236, true }, + { 264250, true }, + { 264260, true }, + { 264270, true }, + { 264283, true }, + { 264296, true }, + { 264303, true }, + { 264310, true }, + { 264319, true }, { 264326, true }, { 264337, true }, - { 264347, true }, - { 264363, true }, - { 264379, true }, - { 264389, true }, - { 264399, true }, - { 264406, true }, - { 264413, true }, - { 264430, true }, - { 264446, true }, - { 264459, true }, - { 264466, true }, - { 264481, true }, - { 264495, true }, - { 264504, true }, - { 264518, true }, - { 264528, true }, - { 264538, true }, + { 264346, true }, + { 264357, true }, + { 264373, true }, + { 264382, true }, + { 264395, false }, + { 264402, true }, + { 264412, true }, + { 264420, true }, + { 264431, true }, + { 264443, true }, + { 264453, true }, + { 264468, true }, + { 264477, true }, + { 264491, true }, + { 264511, true }, + { 264521, true }, + { 264533, true }, + { 264542, true }, { 264551, true }, - { 264564, true }, { 264571, true }, - { 264578, true }, - { 264587, true }, - { 264594, true }, - { 264605, true }, - { 264614, true }, - { 264625, true }, - { 264641, true }, - { 264650, true }, - { 264663, false }, - { 264670, true }, - { 264680, true }, - { 264688, true }, + { 264582, true }, + { 264593, true }, + { 264607, true }, + { 264616, true }, + { 264632, true }, + { 264639, true }, + { 264651, true }, + { 264661, true }, + { 264668, true }, + { 264676, true }, + { 264688, false }, { 264699, true }, - { 264711, true }, + { 264709, false }, { 264721, true }, - { 264736, true }, - { 264745, true }, - { 264759, true }, + { 264735, true }, + { 264748, true }, + { 264764, true }, { 264779, true }, - { 264789, true }, - { 264801, true }, - { 264810, true }, - { 264819, true }, - { 264839, true }, - { 264850, true }, + { 264791, true }, + { 264804, false }, + { 264814, true }, + { 264827, true }, + { 264849, true }, { 264861, true }, - { 264875, true }, - { 264884, true }, - { 264900, true }, - { 264907, true }, - { 264919, true }, - { 264929, true }, - { 264936, true }, - { 264944, true }, - { 264956, false }, - { 264967, true }, - { 264977, false }, - { 264989, true }, - { 265003, true }, - { 265016, true }, + { 264873, true }, + { 264881, true }, + { 264890, true }, + { 264902, true }, + { 264912, false }, + { 264920, true }, + { 264930, true }, + { 264939, true }, + { 264959, true }, + { 264974, true }, + { 264990, false }, + { 265005, false }, + { 265018, true }, { 265032, true }, - { 265047, true }, - { 265059, true }, - { 265072, false }, - { 265082, true }, - { 265095, true }, + { 265042, false }, + { 265051, true }, + { 265058, true }, + { 265074, true }, + { 265081, true }, + { 265091, true }, + { 265100, true }, + { 265108, true }, { 265117, true }, - { 265129, true }, - { 265141, true }, - { 265149, true }, - { 265158, true }, - { 265170, true }, - { 265180, false }, - { 265188, true }, - { 265198, true }, + { 265128, true }, + { 265142, true }, + { 265153, true }, + { 265163, true }, + { 265185, true }, + { 265200, true }, { 265207, true }, - { 265227, true }, - { 265242, true }, - { 265258, false }, - { 265273, false }, - { 265286, true }, - { 265300, true }, - { 265310, false }, - { 265319, true }, - { 265326, true }, - { 265342, true }, - { 265349, true }, + { 265218, true }, + { 265226, true }, + { 265236, true }, + { 265249, true }, + { 265267, true }, + { 265279, false }, + { 265288, true }, + { 265302, true }, + { 265318, true }, + { 265335, true }, { 265359, true }, - { 265368, true }, - { 265376, true }, - { 265385, true }, - { 265396, true }, - { 265410, true }, - { 265421, true }, - { 265431, true }, - { 265453, true }, - { 265468, true }, - { 265475, true }, - { 265486, true }, - { 265494, true }, - { 265504, true }, - { 265517, true }, - { 265535, true }, - { 265547, false }, - { 265556, true }, - { 265570, true }, - { 265586, true }, - { 265603, true }, - { 265627, true }, - { 265645, true }, - { 265658, true }, - { 265675, true }, - { 265687, true }, - { 265698, true }, - { 265711, true }, - { 265723, false }, + { 265377, true }, + { 265390, true }, + { 265407, true }, + { 265419, true }, + { 265430, true }, + { 265443, true }, + { 265455, false }, + { 265470, true }, + { 265480, true }, + { 265492, true }, + { 265504, false }, + { 265514, true }, + { 265538, true }, + { 265549, true }, + { 265559, true }, + { 265571, true }, + { 265584, true }, + { 265601, true }, + { 265616, true }, + { 265629, true }, + { 265643, true }, + { 265659, true }, + { 265674, true }, + { 265689, true }, + { 265701, true }, + { 265713, true }, + { 265727, true }, { 265738, true }, { 265748, true }, - { 265760, true }, - { 265772, false }, - { 265782, true }, - { 265806, true }, - { 265817, true }, - { 265827, true }, - { 265839, true }, - { 265852, true }, - { 265869, true }, - { 265884, true }, - { 265897, true }, - { 265911, true }, - { 265927, true }, + { 265766, true }, + { 265779, true }, + { 265794, true }, + { 265807, true }, + { 265820, true }, + { 265835, true }, + { 265847, true }, + { 265856, true }, + { 265867, true }, + { 265889, true }, + { 265905, true }, + { 265925, false }, + { 265934, true }, { 265942, true }, - { 265957, true }, - { 265969, true }, - { 265981, true }, - { 265995, true }, - { 266006, true }, - { 266016, true }, - { 266034, true }, - { 266047, true }, - { 266062, true }, + { 265950, true }, + { 265963, true }, + { 265976, true }, + { 265988, true }, + { 265996, true }, + { 266011, true }, + { 266021, true }, + { 266032, true }, + { 266048, true }, + { 266056, true }, + { 266065, true }, { 266075, true }, - { 266088, true }, - { 266103, true }, - { 266115, true }, - { 266124, true }, - { 266135, true }, - { 266157, true }, - { 266173, true }, - { 266193, false }, - { 266202, true }, - { 266210, true }, - { 266218, true }, - { 266231, true }, - { 266244, true }, + { 266084, true }, + { 266093, true }, + { 266108, true }, + { 266127, true }, + { 266140, true }, + { 266158, true }, + { 266171, true }, + { 266180, true }, + { 266191, true }, + { 266205, true }, + { 266217, true }, + { 266235, true }, + { 266248, true }, { 266256, true }, - { 266264, true }, - { 266279, true }, - { 266289, true }, - { 266300, true }, - { 266316, true }, - { 266324, true }, - { 266333, true }, + { 266270, true }, + { 266282, true }, + { 266292, true }, + { 266299, true }, + { 266313, true }, + { 266321, true }, + { 266329, true }, { 266343, true }, - { 266352, true }, - { 266361, true }, - { 266376, true }, - { 266395, true }, - { 266408, true }, - { 266426, true }, - { 266439, true }, - { 266448, true }, - { 266459, true }, - { 266473, true }, + { 266353, true }, + { 266362, true }, + { 266385, true }, + { 266398, true }, + { 266403, true }, + { 266413, true }, + { 266420, true }, + { 266427, true }, + { 266439, false }, + { 266458, true }, + { 266469, true }, { 266485, true }, - { 266503, true }, + { 266500, true }, { 266516, true }, - { 266524, true }, - { 266538, true }, - { 266550, true }, - { 266560, true }, - { 266567, true }, - { 266581, true }, - { 266589, true }, - { 266597, true }, - { 266611, true }, - { 266621, true }, - { 266630, true }, - { 266653, true }, - { 266666, true }, - { 266671, true }, - { 266681, true }, - { 266688, true }, - { 266695, true }, - { 266707, false }, - { 266726, true }, + { 266531, true }, + { 266544, true }, + { 266557, true }, + { 266565, true }, + { 266575, true }, + { 266585, true }, + { 266600, true }, + { 266614, true }, + { 266642, true }, + { 266655, true }, + { 266668, true }, + { 266685, true }, + { 266693, true }, + { 266702, true }, + { 266712, true }, + { 266725, true }, { 266737, true }, - { 266753, true }, - { 266768, true }, - { 266784, true }, - { 266799, true }, - { 266812, true }, - { 266825, true }, - { 266833, true }, - { 266843, true }, - { 266853, true }, - { 266868, true }, - { 266882, true }, + { 266767, true }, + { 266778, true }, + { 266796, true }, + { 266804, true }, + { 266828, true }, + { 266838, true }, + { 266855, true }, + { 266867, true }, + { 266878, true }, + { 266890, true }, + { 266903, false }, { 266910, true }, - { 266923, true }, - { 266936, true }, - { 266953, true }, - { 266961, true }, - { 266970, true }, - { 266980, true }, - { 266993, true }, - { 267005, true }, - { 267035, true }, - { 267046, true }, - { 267064, true }, - { 267072, true }, - { 267096, true }, - { 267106, true }, - { 267123, true }, - { 267135, true }, - { 267146, true }, - { 267158, true }, - { 267171, false }, - { 267178, true }, - { 267196, true }, - { 267205, true }, - { 267216, true }, - { 267228, true }, - { 267236, true }, - { 267243, true }, - { 267251, true }, - { 267262, true }, - { 267272, true }, - { 267281, true }, - { 267299, true }, - { 267325, true }, - { 267337, true }, - { 267346, true }, - { 267371, true }, - { 267398, true }, - { 267418, true }, - { 267440, true }, - { 267451, true }, - { 267462, true }, - { 267474, true }, - { 267487, true }, - { 267500, true }, - { 267515, true }, - { 267533, true }, + { 266928, true }, + { 266937, true }, + { 266948, true }, + { 266960, true }, + { 266968, true }, + { 266975, true }, + { 266983, true }, + { 266994, true }, + { 267004, true }, + { 267013, true }, + { 267031, true }, + { 267057, true }, + { 267069, true }, + { 267078, true }, + { 267103, true }, + { 267130, true }, + { 267150, true }, + { 267172, true }, + { 267183, true }, + { 267194, true }, + { 267206, true }, + { 267219, true }, + { 267232, true }, + { 267247, true }, + { 267265, true }, + { 267278, true }, + { 267293, true }, + { 267309, true }, + { 267327, true }, + { 267340, true }, + { 267354, true }, + { 267364, true }, + { 267376, true }, + { 267384, true }, + { 267396, true }, + { 267408, true }, + { 267421, true }, + { 267432, true }, + { 267445, true }, + { 267457, true }, + { 267469, false }, + { 267479, true }, + { 267490, true }, + { 267505, true }, + { 267518, true }, + { 267529, true }, + { 267536, true }, { 267546, true }, - { 267561, true }, - { 267577, true }, - { 267595, true }, - { 267608, true }, - { 267622, true }, - { 267632, true }, - { 267644, true }, - { 267652, true }, - { 267664, true }, - { 267676, true }, - { 267689, true }, - { 267700, true }, - { 267713, true }, - { 267725, true }, - { 267737, false }, - { 267747, true }, - { 267758, true }, - { 267773, true }, - { 267786, true }, - { 267797, true }, - { 267804, true }, - { 267814, true }, - { 267821, true }, - { 267835, true }, - { 267853, true }, - { 267865, true }, - { 267877, true }, - { 267893, true }, - { 267906, true }, - { 267921, true }, - { 267936, true }, - { 267949, true }, - { 267961, true }, - { 267975, true }, - { 267988, true }, - { 268003, true }, - { 268010, true }, - { 268025, false }, - { 268038, true }, - { 268050, true }, - { 268059, true }, - { 268071, true }, - { 268100, true }, - { 268108, true }, + { 267553, true }, + { 267567, true }, + { 267585, true }, + { 267597, true }, + { 267609, true }, + { 267625, true }, + { 267638, true }, + { 267653, true }, + { 267668, true }, + { 267681, true }, + { 267693, true }, + { 267707, true }, + { 267720, true }, + { 267735, true }, + { 267742, true }, + { 267757, false }, + { 267770, true }, + { 267782, true }, + { 267791, true }, + { 267803, true }, + { 267832, true }, + { 267840, true }, + { 267855, true }, + { 267863, true }, + { 267878, false }, + { 267886, true }, + { 267897, true }, + { 267905, true }, + { 267916, true }, + { 267933, true }, + { 267947, false }, + { 267959, true }, + { 267978, true }, + { 267996, true }, + { 268007, true }, + { 268016, true }, + { 268036, true }, + { 268046, true }, + { 268062, true }, + { 268077, true }, + { 268089, true }, + { 268096, true }, + { 268107, true }, + { 268117, true }, { 268123, true }, - { 268131, true }, - { 268146, false }, - { 268154, true }, - { 268165, true }, - { 268173, true }, - { 268184, true }, - { 268201, true }, - { 268215, false }, - { 268227, true }, + { 268133, true }, + { 268148, true }, + { 268160, true }, + { 268172, true }, + { 268187, true }, + { 268198, true }, + { 268211, true }, + { 268235, true }, { 268246, true }, - { 268264, true }, - { 268275, true }, - { 268284, true }, - { 268304, true }, - { 268314, true }, - { 268330, true }, - { 268345, true }, - { 268357, true }, - { 268364, true }, - { 268375, true }, - { 268385, true }, - { 268391, true }, - { 268401, true }, - { 268416, true }, - { 268428, true }, - { 268440, true }, - { 268455, true }, - { 268466, true }, - { 268479, true }, - { 268503, true }, - { 268514, true }, - { 268525, true }, - { 268536, true }, - { 268547, true }, - { 268558, true }, - { 268573, true }, - { 268597, true }, - { 268615, true }, - { 268626, true }, - { 268641, true }, - { 268657, true }, - { 268666, true }, + { 268257, true }, + { 268268, true }, + { 268279, true }, + { 268290, true }, + { 268305, true }, + { 268329, true }, + { 268347, true }, + { 268358, true }, + { 268373, true }, + { 268389, true }, + { 268398, true }, + { 268409, true }, + { 268433, true }, + { 268448, true }, + { 268460, true }, + { 268472, true }, + { 268483, true }, + { 268493, true }, + { 268501, true }, + { 268520, true }, + { 268531, true }, + { 268541, true }, + { 268551, true }, + { 268562, true }, + { 268570, true }, + { 268584, false }, + { 268591, true }, + { 268598, true }, + { 268610, true }, + { 268619, true }, + { 268628, true }, + { 268642, true }, + { 268650, true }, + { 268663, true }, { 268677, true }, - { 268701, true }, - { 268716, true }, - { 268728, true }, + { 268698, true }, + { 268712, true }, + { 268722, true }, + { 268729, true }, { 268740, true }, - { 268751, true }, - { 268761, true }, - { 268769, true }, - { 268788, true }, - { 268799, true }, - { 268809, true }, - { 268819, true }, - { 268830, true }, - { 268838, true }, - { 268852, false }, - { 268859, true }, - { 268866, true }, - { 268878, true }, + { 268750, true }, + { 268760, true }, + { 268770, true }, + { 268783, true }, + { 268794, true }, + { 268802, true }, + { 268811, true }, + { 268831, true }, + { 268854, true }, + { 268867, true }, + { 268880, false }, { 268887, true }, - { 268896, true }, + { 268900, true }, { 268910, true }, - { 268918, true }, + { 268921, true }, { 268931, true }, - { 268945, true }, - { 268966, true }, - { 268980, true }, - { 268990, true }, - { 268997, true }, - { 269008, true }, - { 269018, true }, - { 269028, true }, - { 269038, true }, - { 269051, true }, - { 269062, true }, - { 269070, true }, - { 269079, true }, - { 269099, true }, - { 269122, true }, - { 269135, true }, - { 269148, true }, - { 269161, true }, - { 269171, true }, - { 269182, true }, - { 269192, true }, - { 269202, true }, - { 269211, true }, - { 269218, true }, - { 269228, true }, + { 268941, true }, + { 268950, true }, + { 268957, true }, + { 268967, true }, }; From ee7cfd05d7d9f83b017dd54c2052a2ec19cbd48b Mon Sep 17 00:00:00 2001 From: ffxbld Date: Mon, 20 Mar 2017 08:25:08 -0700 Subject: [PATCH 156/169] No bug, Automated HPKP preload list update from host bld-linux64-spot-036 - a=hpkp-update --- security/manager/ssl/StaticHPKPins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index 17550824bd12..6f5f8d1721c6 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498403452815000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498490306901000); From 399d6c086f6626150bfc0e850910046021e8832f Mon Sep 17 00:00:00 2001 From: KuoE0 Date: Tue, 21 Mar 2017 00:38:11 +0800 Subject: [PATCH 157/169] Bug 1348221 - Implement NewNamedTimerCallback to create named timer callback. r=kats MozReview-Commit-ID: IcEVkfB3puW --HG-- extra : rebase_source : 45e3f28325d5e6da41fb65688d518170eb5764bb --- gfx/layers/apz/util/APZThreadUtils.cpp | 1 + gfx/layers/apz/util/APZThreadUtils.h | 63 ++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/gfx/layers/apz/util/APZThreadUtils.cpp b/gfx/layers/apz/util/APZThreadUtils.cpp index e1975a2a067f..ee100add452d 100644 --- a/gfx/layers/apz/util/APZThreadUtils.cpp +++ b/gfx/layers/apz/util/APZThreadUtils.cpp @@ -74,6 +74,7 @@ APZThreadUtils::IsControllerThread() } NS_IMPL_ISUPPORTS(GenericTimerCallbackBase, nsITimerCallback) +NS_IMPL_ISUPPORTS(GenericNamedTimerCallbackBase, nsITimerCallback, nsINamed) } // namespace layers } // namespace mozilla diff --git a/gfx/layers/apz/util/APZThreadUtils.h b/gfx/layers/apz/util/APZThreadUtils.h index 4b9b2c0d0072..3ac5bdfbf966 100644 --- a/gfx/layers/apz/util/APZThreadUtils.h +++ b/gfx/layers/apz/util/APZThreadUtils.h @@ -7,6 +7,7 @@ #define mozilla_layers_APZThreadUtils_h #include "base/message_loop.h" +#include "nsINamed.h" #include "nsITimer.h" namespace mozilla { @@ -98,6 +99,68 @@ GenericTimerCallback* NewTimerCallback(const Function& aFunction) return new GenericTimerCallback(aFunction); } +// A base class for GenericNamedTimerCallback. +// This is necessary because NS_IMPL_ISUPPORTS doesn't work for a class +// template. +class GenericNamedTimerCallbackBase : public nsITimerCallback, + public nsINamed +{ +public: + NS_DECL_THREADSAFE_ISUPPORTS + +protected: + virtual ~GenericNamedTimerCallbackBase() {} +}; + +// An nsITimerCallback implementation with nsINamed that can be used with any +// function object that's callable with no arguments. +template +class GenericNamedTimerCallback final : public GenericNamedTimerCallbackBase +{ +public: + explicit GenericNamedTimerCallback(const Function& aFunction, + const char* aName) + : mFunction(aFunction) + , mName(aName) + { + } + + NS_IMETHOD Notify(nsITimer*) override + { + mFunction(); + return NS_OK; + } + + NS_IMETHOD GetName(nsACString& aName) override + { + aName = mName; + return NS_OK; + } + + NS_IMETHOD SetName(const char * aName) override + { + mName.Assign(aName); + return NS_OK; + } + +private: + Function mFunction; + nsCString mName; +}; + +// Convenience function for constructing a GenericNamedTimerCallback. +// Returns a raw pointer, suitable for passing directly as an argument to +// nsITimer::InitWithCallback(). The intention is to enable the following +// terse inline usage: +// timer->InitWithCallback(NewNamedTimerCallback([](){ ... }, name), delay); +template +GenericNamedTimerCallback* + NewNamedTimerCallback(const Function& aFunction, + const char* aName) +{ + return new GenericNamedTimerCallback(aFunction, aName); +} + } // namespace layers } // namespace mozilla From 56361d2b499e6ddec01203a291da50a8fa567776 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 21:19:01 +0100 Subject: [PATCH 158/169] Backed out changeset ffa2f50d49ce (bug 1342258) for failing mochitest dom/tests/mochitest/dom-level0/test_setting_document.domain_idn.html. r=backout --- dom/html/nsHTMLDocument.cpp | 148 ++++++++++++------------------------ dom/html/nsHTMLDocument.h | 6 -- 2 files changed, 48 insertions(+), 106 deletions(-) diff --git a/dom/html/nsHTMLDocument.cpp b/dom/html/nsHTMLDocument.cpp index d076df39e852..555429b7804b 100644 --- a/dom/html/nsHTMLDocument.cpp +++ b/dom/html/nsHTMLDocument.cpp @@ -906,104 +906,6 @@ nsHTMLDocument::GetDomain(nsAString& aDomain) return NS_OK; } -already_AddRefed -nsHTMLDocument::CreateInheritingURIForHost(const nsACString& aHostString) -{ - if (aHostString.IsEmpty()) { - return nullptr; - } - - // Create new URI - nsCOMPtr uri = GetDomainURI(); - if (!uri) { - return nullptr; - } - - nsCOMPtr newURI; - nsresult rv = uri->Clone(getter_AddRefs(newURI)); - if (NS_FAILED(rv)) { - return nullptr; - } - - rv = newURI->SetUserPass(EmptyCString()); - if (NS_FAILED(rv)) { - return nullptr; - } - - // We use SetHostAndPort because we want to reset the port number if needed. - rv = newURI->SetHostAndPort(aHostString); - if (NS_FAILED(rv)) { - return nullptr; - } - - return newURI.forget(); -} - -already_AddRefed -nsHTMLDocument::RegistrableDomainSuffixOfInternal(const nsAString& aNewDomain, - nsIURI* aOrigHost) -{ - // Check new domain - must be a superdomain of the current host - // For example, a page from foo.bar.com may set domain to bar.com, - // but not to ar.com, baz.com, or fi.foo.bar.com. - nsAutoCString domain = NS_ConvertUTF16toUTF8(aNewDomain); - nsAutoCString current; - if (NS_FAILED(aOrigHost->GetAsciiHost(current))) { - current.Truncate(); - } - - bool ok = current.Equals(domain); - if (current.Length() > domain.Length() && - StringEndsWith(current, domain) && - current.CharAt(current.Length() - domain.Length() - 1) == '.') { - // We're golden if the new domain is the current page's base domain or a - // subdomain of it. - nsCOMPtr tldService = - do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); - if (!tldService) { - return nullptr; - } - - nsAutoCString currentBaseDomain; - ok = NS_SUCCEEDED(tldService->GetBaseDomain(aOrigHost, 0, currentBaseDomain)); - NS_ASSERTION(StringEndsWith(domain, currentBaseDomain) == - (domain.Length() >= currentBaseDomain.Length()), - "uh-oh! slight optimization wasn't valid somehow!"); - ok = ok && domain.Length() >= currentBaseDomain.Length(); - } - - if (!ok) { - // Error: illegal domain - return nullptr; - } - - return CreateInheritingURIForHost(domain); -} - -bool -nsHTMLDocument::IsRegistrableDomainSuffixOfOrEqualTo(const nsAString& aHostSuffixString, - const nsACString& aOrigHost) -{ - // https://html.spec.whatwg.org/multipage/browsers.html#is-a-registrable-domain-suffix-of-or-is-equal-to - if (aHostSuffixString.IsEmpty()) { - return false; - } - - nsCOMPtr origURI = CreateInheritingURIForHost(aOrigHost); - if (!origURI) { - // Error: failed to parse input domain - return false; - } - - nsCOMPtr newURI = RegistrableDomainSuffixOfInternal(aHostSuffixString, origURI); - if (!newURI) { - // Error: illegal domain - return false; - } - return true; -} - - NS_IMETHODIMP nsHTMLDocument::SetDomain(const nsAString& aDomain) { @@ -1026,18 +928,64 @@ nsHTMLDocument::SetDomain(const nsAString& aDomain, ErrorResult& rv) return; } + // Create new URI nsCOMPtr uri = GetDomainURI(); + if (!uri) { rv.Throw(NS_ERROR_FAILURE); return; } + nsCOMPtr newURI; + nsresult rv2 = uri->Clone(getter_AddRefs(newURI)); + if (NS_FAILED(rv2)) { + rv.Throw(rv2); + return; + } + + rv2 = newURI->SetUserPass(EmptyCString()); + if (NS_FAILED(rv2)) { + rv.Throw(rv2); + return; + } + + // We use SetHostAndPort because we want to reset the port number if needed. + rv2 = newURI->SetHostAndPort(NS_ConvertUTF16toUTF8(aDomain)); + if (NS_FAILED(rv2)) { + rv.Throw(rv2); + return; + } + // Check new domain - must be a superdomain of the current host // For example, a page from foo.bar.com may set domain to bar.com, // but not to ar.com, baz.com, or fi.foo.bar.com. + nsAutoCString current, domain; + if (NS_FAILED(uri->GetAsciiHost(current))) + current.Truncate(); + if (NS_FAILED(newURI->GetAsciiHost(domain))) + domain.Truncate(); - nsCOMPtr newURI = RegistrableDomainSuffixOfInternal(aDomain, uri); - if (!newURI) { + bool ok = current.Equals(domain); + if (current.Length() > domain.Length() && + StringEndsWith(current, domain) && + current.CharAt(current.Length() - domain.Length() - 1) == '.') { + // We're golden if the new domain is the current page's base domain or a + // subdomain of it. + nsCOMPtr tldService = + do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); + if (!tldService) { + rv.Throw(NS_ERROR_NOT_AVAILABLE); + return; + } + + nsAutoCString currentBaseDomain; + ok = NS_SUCCEEDED(tldService->GetBaseDomain(uri, 0, currentBaseDomain)); + NS_ASSERTION(StringEndsWith(domain, currentBaseDomain) == + (domain.Length() >= currentBaseDomain.Length()), + "uh-oh! slight optimization wasn't valid somehow!"); + ok = ok && domain.Length() >= currentBaseDomain.Length(); + } + if (!ok) { // Error: illegal domain rv.Throw(NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN); return; diff --git a/dom/html/nsHTMLDocument.h b/dom/html/nsHTMLDocument.h index 486c6e2d980e..ff79e62871b5 100644 --- a/dom/html/nsHTMLDocument.h +++ b/dom/html/nsHTMLDocument.h @@ -166,8 +166,6 @@ public: virtual JSObject* WrapNode(JSContext* aCx, JS::Handle aGivenProto) override; void SetDomain(const nsAString& aDomain, mozilla::ErrorResult& rv); - bool IsRegistrableDomainSuffixOfOrEqualTo(const nsAString& aHostSuffixString, - const nsACString& aOrigHost); void GetCookie(nsAString& aCookie, mozilla::ErrorResult& rv); void SetCookie(const nsAString& aCookie, mozilla::ErrorResult& rv); void NamedGetter(JSContext* cx, const nsAString& aName, bool& aFound, @@ -276,10 +274,6 @@ protected: static void DocumentWriteTerminationFunc(nsISupports *aRef); already_AddRefed GetDomainURI(); - already_AddRefed CreateInheritingURIForHost(const nsACString& aHostString); - already_AddRefed RegistrableDomainSuffixOfInternal(const nsAString& aHostSuffixString, - nsIURI* aOrigHost); - nsresult WriteCommon(JSContext *cx, const nsAString& aText, bool aNewlineTerminate); From a898496d83343250a54c2ffdbda4b05886a8e5de Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 23:23:01 +0100 Subject: [PATCH 159/169] Backed out changeset e4062da24f6b (bug 1336828) --- dom/xslt/crashtests/1336828.html | 22 ---- dom/xslt/crashtests/1336832.html | 28 ---- dom/xslt/crashtests/1338277.html | 21 --- dom/xslt/crashtests/crashtests.list | 3 - dom/xslt/xpath/XPathExpression.cpp | 8 +- dom/xslt/xpath/txExpr.h | 38 +----- dom/xslt/xpath/txForwardContext.cpp | 5 +- dom/xslt/xpath/txIXPathContext.h | 5 +- dom/xslt/xpath/txLocationStep.cpp | 125 ++++++++---------- dom/xslt/xpath/txNameTest.cpp | 28 ++-- dom/xslt/xpath/txNodeSetContext.cpp | 5 +- dom/xslt/xpath/txNodeTypeTest.cpp | 41 ++---- dom/xslt/xpath/txPathExpr.cpp | 4 +- dom/xslt/xpath/txPredicatedNodeTest.cpp | 19 +-- dom/xslt/xpath/txSingleNodeContext.h | 5 +- dom/xslt/xpath/txUnionNodeTest.cpp | 16 +-- dom/xslt/xpath/txXPathOptimizer.cpp | 2 +- dom/xslt/xslt/txExecutionState.cpp | 13 +- dom/xslt/xslt/txInstructions.cpp | 20 +-- dom/xslt/xslt/txKeyFunctionCall.cpp | 6 +- dom/xslt/xslt/txMozillaXSLTProcessor.cpp | 6 +- dom/xslt/xslt/txStylesheet.cpp | 61 +++------ dom/xslt/xslt/txStylesheet.h | 22 ++-- dom/xslt/xslt/txXSLTNumber.cpp | 106 +++++---------- dom/xslt/xslt/txXSLTNumber.h | 7 +- dom/xslt/xslt/txXSLTPatterns.cpp | 156 ++++++----------------- dom/xslt/xslt/txXSLTPatterns.h | 8 +- 27 files changed, 229 insertions(+), 551 deletions(-) delete mode 100644 dom/xslt/crashtests/1336828.html delete mode 100644 dom/xslt/crashtests/1336832.html delete mode 100644 dom/xslt/crashtests/1338277.html diff --git a/dom/xslt/crashtests/1336828.html b/dom/xslt/crashtests/1336828.html deleted file mode 100644 index 3f25e23e034e..000000000000 --- a/dom/xslt/crashtests/1336828.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - diff --git a/dom/xslt/crashtests/1336832.html b/dom/xslt/crashtests/1336832.html deleted file mode 100644 index 0fb9033d1a34..000000000000 --- a/dom/xslt/crashtests/1336832.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - diff --git a/dom/xslt/crashtests/1338277.html b/dom/xslt/crashtests/1338277.html deleted file mode 100644 index d928819c7572..000000000000 --- a/dom/xslt/crashtests/1338277.html +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/dom/xslt/crashtests/crashtests.list b/dom/xslt/crashtests/crashtests.list index 0c97c7e4f970..2c54819ec5e9 100644 --- a/dom/xslt/crashtests/crashtests.list +++ b/dom/xslt/crashtests/crashtests.list @@ -18,7 +18,4 @@ load 667315.xml load 1089049.html load 1205163.xml load 1243337.xml -load 1336828.html load 1336830.html -load 1336832.html -load 1338277.html diff --git a/dom/xslt/xpath/XPathExpression.cpp b/dom/xslt/xpath/XPathExpression.cpp index 88bbc1b84fe0..2f92a120fbac 100644 --- a/dom/xslt/xpath/XPathExpression.cpp +++ b/dom/xslt/xpath/XPathExpression.cpp @@ -206,12 +206,10 @@ EvalContextImpl::getVariable(int32_t aNamespace, return NS_ERROR_INVALID_ARG; } -nsresult -EvalContextImpl::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) +bool +EvalContextImpl::isStripSpaceAllowed(const txXPathNode& aNode) { - aAllowed = false; - - return NS_OK; + return false; } void* diff --git a/dom/xslt/xpath/txExpr.h b/dom/xslt/xpath/txExpr.h index 4b0b8bcbc3a6..562fca7a3293 100644 --- a/dom/xslt/xpath/txExpr.h +++ b/dom/xslt/xpath/txExpr.h @@ -28,7 +28,6 @@ class txIMatchContext; class txIEvalContext; class txNodeSet; class txXPathNode; -class txXPathTreeWalker; /** * A Base Class for all XSL Expressions @@ -395,9 +394,8 @@ public: * standalone. The NodeTest node() is different to the * Pattern "node()" (document node isn't matched) */ - virtual nsresult matches(const txXPathNode& aNode, - txIMatchContext* aContext, - bool& aMatched) = 0; + virtual bool matches(const txXPathNode& aNode, + txIMatchContext* aContext) = 0; virtual double getDefaultPriority() = 0; /** @@ -426,9 +424,7 @@ public: #define TX_DECL_NODE_TEST \ TX_DECL_TOSTRING \ - nsresult matches(const txXPathNode& aNode, \ - txIMatchContext* aContext, \ - bool& aMatched) override; \ + bool matches(const txXPathNode& aNode, txIMatchContext* aContext) override; \ double getDefaultPriority() override; \ bool isSensitiveTo(Expr::ContextSensitivity aContext) override; @@ -634,30 +630,10 @@ public: } private: - /** - * Append the current position of aWalker to aNodes if it matches mNodeTest, - * using aContext as the context for matching. - */ - nsresult appendIfMatching(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes); - - /** - * Append the descendants of the current position of aWalker to aNodes if - * they match mNodeTest, using aContext as the context for matching. - */ - nsresult appendMatchingDescendants(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes); - - /** - * Append the descendants of the current position of aWalker to aNodes in - * reverse order if they match mNodeTest, using aContext as the context for - * matching. - */ - nsresult appendMatchingDescendantsRev(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes); + void fromDescendants(const txXPathNode& aNode, txIMatchContext* aCs, + txNodeSet* aNodes); + void fromDescendantsRev(const txXPathNode& aNode, txIMatchContext* aCs, + txNodeSet* aNodes); nsAutoPtr mNodeTest; LocationStepType mAxisIdentifier; diff --git a/dom/xslt/xpath/txForwardContext.cpp b/dom/xslt/xpath/txForwardContext.cpp index 73bd6a626938..e2367a3aeb71 100644 --- a/dom/xslt/xpath/txForwardContext.cpp +++ b/dom/xslt/xpath/txForwardContext.cpp @@ -30,11 +30,10 @@ nsresult txForwardContext::getVariable(int32_t aNamespace, nsIAtom* aLName, return mInner->getVariable(aNamespace, aLName, aResult); } -nsresult -txForwardContext::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) +bool txForwardContext::isStripSpaceAllowed(const txXPathNode& aNode) { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode, aAllowed); + return mInner->isStripSpaceAllowed(aNode); } void* txForwardContext::getPrivateContext() diff --git a/dom/xslt/xpath/txIXPathContext.h b/dom/xslt/xpath/txIXPathContext.h index 66b1905d363c..ed5f81a53265 100644 --- a/dom/xslt/xpath/txIXPathContext.h +++ b/dom/xslt/xpath/txIXPathContext.h @@ -88,8 +88,7 @@ public: * Is whitespace stripping allowed for the given node? * See http://www.w3.org/TR/xslt#strip */ - virtual nsresult isStripSpaceAllowed(const txXPathNode& aNode, - bool& aAllowed) = 0; + virtual bool isStripSpaceAllowed(const txXPathNode& aNode) = 0; /** * Returns a pointer to the private context @@ -107,7 +106,7 @@ public: #define TX_DECL_MATCH_CONTEXT \ nsresult getVariable(int32_t aNamespace, nsIAtom* aLName, \ txAExprResult*& aResult); \ - nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed); \ + bool isStripSpaceAllowed(const txXPathNode& aNode); \ void* getPrivateContext(); \ txResultRecycler* recycler(); \ void receiveError(const nsAString& aMsg, nsresult aRes) diff --git a/dom/xslt/xpath/txLocationStep.cpp b/dom/xslt/xpath/txLocationStep.cpp index 6351359290aa..f945b750fe44 100644 --- a/dom/xslt/xpath/txLocationStep.cpp +++ b/dom/xslt/xpath/txLocationStep.cpp @@ -49,8 +49,9 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) nodes->setReverse(); do { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } } while (walker.moveToParent()); break; @@ -62,29 +63,29 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } do { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } } while (walker.moveToNextAttribute()); break; } case DESCENDANT_OR_SELF_AXIS: { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } MOZ_FALLTHROUGH; } case DESCENDANT_AXIS: { - rv = appendMatchingDescendants(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + fromDescendants(walker.getCurrentPosition(), aContext, nodes); break; } case FOLLOWING_AXIS: { if (txXPathNodeUtils::isAttribute(walker.getCurrentPosition())) { walker.moveToParent(); - rv = appendMatchingDescendants(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + fromDescendants(walker.getCurrentPosition(), aContext, nodes); } bool cont = true; while (!walker.moveToNextSibling()) { @@ -94,11 +95,11 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } } while (cont) { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } - rv = appendMatchingDescendants(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + fromDescendants(walker.getCurrentPosition(), aContext, nodes); while (!walker.moveToNextSibling()) { if (!walker.moveToParent()) { @@ -112,8 +113,9 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) case FOLLOWING_SIBLING_AXIS: { while (walker.moveToNextSibling()) { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } } break; } @@ -125,9 +127,9 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) break; case PARENT_AXIS : { - if (walker.moveToParent()) { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (walker.moveToParent() && + mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); } break; } @@ -143,11 +145,11 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } } while (cont) { - rv = appendMatchingDescendantsRev(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + fromDescendantsRev(walker.getCurrentPosition(), aContext, nodes); - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } while (!walker.moveToPreviousSibling()) { if (!walker.moveToParent()) { @@ -163,15 +165,17 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) nodes->setReverse(); while (walker.moveToPreviousSibling()) { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } } break; } case SELF_AXIS: { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } break; } default: // Children Axis @@ -181,8 +185,9 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) } do { - rv = appendIfMatching(walker, aContext, nodes); - NS_ENSURE_SUCCESS(rv, rv); + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { + nodes->append(walker.getCurrentPosition()); + } } while (walker.moveToNextSibling()); break; } @@ -201,62 +206,42 @@ LocationStep::evaluate(txIEvalContext* aContext, txAExprResult** aResult) return NS_OK; } -nsresult -LocationStep::appendIfMatching(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes) +void LocationStep::fromDescendants(const txXPathNode& aNode, + txIMatchContext* aCs, + txNodeSet* aNodes) { - bool matched; - const txXPathNode& child = aWalker.getCurrentPosition(); - nsresult rv = mNodeTest->matches(child, aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - aNodes->append(child); - } - return NS_OK; -} - -nsresult -LocationStep::appendMatchingDescendants(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes) -{ - txXPathTreeWalker walker(aWalker); + txXPathTreeWalker walker(aNode); if (!walker.moveToFirstChild()) { - return NS_OK; + return; } do { - nsresult rv = appendIfMatching(walker, aContext, aNodes); - NS_ENSURE_SUCCESS(rv, rv); - - rv = appendMatchingDescendants(walker, aContext, aNodes); - NS_ENSURE_SUCCESS(rv, rv); + const txXPathNode& child = walker.getCurrentPosition(); + if (mNodeTest->matches(child, aCs)) { + aNodes->append(child); + } + fromDescendants(child, aCs, aNodes); } while (walker.moveToNextSibling()); - - return NS_OK; } -nsresult -LocationStep::appendMatchingDescendantsRev(const txXPathTreeWalker& aWalker, - txIMatchContext* aContext, - txNodeSet* aNodes) +void LocationStep::fromDescendantsRev(const txXPathNode& aNode, + txIMatchContext* aCs, + txNodeSet* aNodes) { - txXPathTreeWalker walker(aWalker); + txXPathTreeWalker walker(aNode); if (!walker.moveToLastChild()) { - return NS_OK; + return; } do { - nsresult rv = appendMatchingDescendantsRev(walker, aContext, aNodes); - NS_ENSURE_SUCCESS(rv, rv); + const txXPathNode& child = walker.getCurrentPosition(); + fromDescendantsRev(child, aCs, aNodes); + + if (mNodeTest->matches(child, aCs)) { + aNodes->append(child); + } - rv = appendIfMatching(walker, aContext, aNodes); - NS_ENSURE_SUCCESS(rv, rv); } while (walker.moveToPreviousSibling()); - - return NS_OK; } Expr::ExprType diff --git a/dom/xslt/xpath/txNameTest.cpp b/dom/xslt/xpath/txNameTest.cpp index d2bb87c72716..bad0432825ea 100644 --- a/dom/xslt/xpath/txNameTest.cpp +++ b/dom/xslt/xpath/txNameTest.cpp @@ -23,9 +23,7 @@ txNameTest::txNameTest(nsIAtom* aPrefix, nsIAtom* aLocalName, int32_t aNSID, "Go fix txNameTest::matches"); } -nsresult -txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext) { if ((mNodeType == txXPathNodeType::ELEMENT_NODE && !txXPathNodeUtils::isElement(aNode)) || @@ -33,34 +31,26 @@ txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, !txXPathNodeUtils::isAttribute(aNode)) || (mNodeType == txXPathNodeType::DOCUMENT_NODE && !txXPathNodeUtils::isRoot(aNode))) { - aMatched = false; - return NS_OK; + return false; } // Totally wild? - if (mLocalName == nsGkAtoms::_asterisk && !mPrefix) { - aMatched = true; - return NS_OK; - } + if (mLocalName == nsGkAtoms::_asterisk && !mPrefix) + return true; // Compare namespaces if (mNamespace != txXPathNodeUtils::getNamespaceID(aNode) && !(mNamespace == kNameSpaceID_None && txXPathNodeUtils::isHTMLElementInHTMLDocument(aNode)) - ) { - aMatched = false; - return NS_OK; - } + ) + return false; // Name wild? - if (mLocalName == nsGkAtoms::_asterisk) { - aMatched = true; - return NS_OK; - } + if (mLocalName == nsGkAtoms::_asterisk) + return true; // Compare local-names - aMatched = txXPathNodeUtils::localNameEquals(aNode, mLocalName); - return NS_OK; + return txXPathNodeUtils::localNameEquals(aNode, mLocalName); } /* diff --git a/dom/xslt/xpath/txNodeSetContext.cpp b/dom/xslt/xpath/txNodeSetContext.cpp index 578e1d82f13c..7d98391fdea0 100644 --- a/dom/xslt/xpath/txNodeSetContext.cpp +++ b/dom/xslt/xpath/txNodeSetContext.cpp @@ -29,11 +29,10 @@ nsresult txNodeSetContext::getVariable(int32_t aNamespace, nsIAtom* aLName, return mInner->getVariable(aNamespace, aLName, aResult); } -nsresult -txNodeSetContext::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) +bool txNodeSetContext::isStripSpaceAllowed(const txXPathNode& aNode) { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode, aAllowed); + return mInner->isStripSpaceAllowed(aNode); } void* txNodeSetContext::getPrivateContext() diff --git a/dom/xslt/xpath/txNodeTypeTest.cpp b/dom/xslt/xpath/txNodeTypeTest.cpp index 57319c2a4963..650a1ae5fefc 100644 --- a/dom/xslt/xpath/txNodeTypeTest.cpp +++ b/dom/xslt/xpath/txNodeTypeTest.cpp @@ -8,51 +8,32 @@ #include "txIXPathContext.h" #include "txXPathTreeWalker.h" -nsresult -txNodeTypeTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txNodeTypeTest::matches(const txXPathNode& aNode, + txIMatchContext* aContext) { switch (mNodeType) { case COMMENT_TYPE: { - aMatched = txXPathNodeUtils::isComment(aNode); - return NS_OK; + return txXPathNodeUtils::isComment(aNode); } case TEXT_TYPE: { - aMatched = txXPathNodeUtils::isText(aNode); - if (aMatched) { - bool allowed; - nsresult rv = aContext->isStripSpaceAllowed(aNode, allowed); - NS_ENSURE_SUCCESS(rv, rv); - - aMatched = !allowed; - } - return NS_OK; + return txXPathNodeUtils::isText(aNode) && + !aContext->isStripSpaceAllowed(aNode); } case PI_TYPE: { - aMatched = txXPathNodeUtils::isProcessingInstruction(aNode) && - (!mNodeName || - txXPathNodeUtils::localNameEquals(aNode, mNodeName)); - return NS_OK; + return txXPathNodeUtils::isProcessingInstruction(aNode) && + (!mNodeName || + txXPathNodeUtils::localNameEquals(aNode, mNodeName)); } case NODE_TYPE: { - if (txXPathNodeUtils::isText(aNode)) { - bool allowed; - nsresult rv = aContext->isStripSpaceAllowed(aNode, allowed); - NS_ENSURE_SUCCESS(rv, rv); - - aMatched = !allowed; - } else { - aMatched = true; - } - return NS_OK; + return !txXPathNodeUtils::isText(aNode) || + !aContext->isStripSpaceAllowed(aNode); } } - - NS_NOTREACHED("Didn't deal with all values of the NodeType enum!"); + return true; } txNodeTest::NodeTestType diff --git a/dom/xslt/xpath/txPathExpr.cpp b/dom/xslt/xpath/txPathExpr.cpp index d36d615fc71c..bcff47e9f788 100644 --- a/dom/xslt/xpath/txPathExpr.cpp +++ b/dom/xslt/xpath/txPathExpr.cpp @@ -160,9 +160,7 @@ PathExpr::evalDescendants(Expr* aStep, const txXPathNode& aNode, resNodes->addAndTransfer(newSet); - bool filterWS; - rv = aContext->isStripSpaceAllowed(aNode, filterWS); - NS_ENSURE_SUCCESS(rv, rv); + bool filterWS = aContext->isStripSpaceAllowed(aNode); txXPathTreeWalker walker(aNode); if (!walker.moveToFirstChild()) { diff --git a/dom/xslt/xpath/txPredicatedNodeTest.cpp b/dom/xslt/xpath/txPredicatedNodeTest.cpp index 598f05f78299..4726f48f280b 100644 --- a/dom/xslt/xpath/txPredicatedNodeTest.cpp +++ b/dom/xslt/xpath/txPredicatedNodeTest.cpp @@ -16,25 +16,20 @@ txPredicatedNodeTest::txPredicatedNodeTest(txNodeTest* aNodeTest, "predicate must not be context-nodeset-sensitive"); } -nsresult +bool txPredicatedNodeTest::matches(const txXPathNode& aNode, - txIMatchContext* aContext, - bool& aMatched) + txIMatchContext* aContext) { - nsresult rv = mNodeTest->matches(aNode, aContext, aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (!aMatched) { - return NS_OK; + if (!mNodeTest->matches(aNode, aContext)) { + return false; } txSingleNodeContext context(aNode, aContext); RefPtr res; - rv = mPredicate->evaluate(&context, getter_AddRefs(res)); - NS_ENSURE_SUCCESS(rv, rv); + nsresult rv = mPredicate->evaluate(&context, getter_AddRefs(res)); + NS_ENSURE_SUCCESS(rv, false); - aMatched = res->booleanValue(); - return NS_OK; + return res->booleanValue(); } double diff --git a/dom/xslt/xpath/txSingleNodeContext.h b/dom/xslt/xpath/txSingleNodeContext.h index dd470294c645..e66083d80ac2 100644 --- a/dom/xslt/xpath/txSingleNodeContext.h +++ b/dom/xslt/xpath/txSingleNodeContext.h @@ -27,11 +27,10 @@ public: return mInner->getVariable(aNamespace, aLName, aResult); } - nsresult isStripSpaceAllowed(const txXPathNode& aNode, - bool& aAllowed) override + bool isStripSpaceAllowed(const txXPathNode& aNode) override { NS_ASSERTION(mInner, "mInner is null!!!"); - return mInner->isStripSpaceAllowed(aNode, aAllowed); + return mInner->isStripSpaceAllowed(aNode); } void* getPrivateContext() override diff --git a/dom/xslt/xpath/txUnionNodeTest.cpp b/dom/xslt/xpath/txUnionNodeTest.cpp index b8ac34f87d4f..421ea680c0a4 100644 --- a/dom/xslt/xpath/txUnionNodeTest.cpp +++ b/dom/xslt/xpath/txUnionNodeTest.cpp @@ -10,22 +10,18 @@ #include "txExprResult.h" #include "txSingleNodeContext.h" -nsresult -txUnionNodeTest::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool +txUnionNodeTest::matches(const txXPathNode& aNode, + txIMatchContext* aContext) { uint32_t i, len = mNodeTests.Length(); for (i = 0; i < len; ++i) { - nsresult rv = mNodeTests[i]->matches(aNode, aContext, aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (aMatched) { - return NS_OK; + if (mNodeTests[i]->matches(aNode, aContext)) { + return true; } } - aMatched = false; - return NS_OK; + return false; } double diff --git a/dom/xslt/xpath/txXPathOptimizer.cpp b/dom/xslt/xpath/txXPathOptimizer.cpp index 070302692b24..756dd253d7f4 100644 --- a/dom/xslt/xpath/txXPathOptimizer.cpp +++ b/dom/xslt/xpath/txXPathOptimizer.cpp @@ -26,7 +26,7 @@ public: { MOZ_CRASH("shouldn't depend on this context"); } - nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) + bool isStripSpaceAllowed(const txXPathNode& aNode) { MOZ_CRASH("shouldn't depend on this context"); } diff --git a/dom/xslt/xslt/txExecutionState.cpp b/dom/xslt/xslt/txExecutionState.cpp index de439f78953b..ed57c79351dd 100644 --- a/dom/xslt/xslt/txExecutionState.cpp +++ b/dom/xslt/xslt/txExecutionState.cpp @@ -138,11 +138,8 @@ txExecutionState::init(const txXPathNode& aNode, // might use us. txStylesheet::ImportFrame* frame = 0; txExpandedName nullName; - txInstruction* templ; - rv = mStylesheet->findTemplate(aNode, nullName, this, nullptr, &templ, - &frame); - NS_ENSURE_SUCCESS(rv, rv); - + txInstruction* templ = mStylesheet->findTemplate(aNode, nullName, + this, nullptr, &frame); pushTemplateRule(frame, nullName, nullptr); return runTemplate(templ); @@ -295,10 +292,10 @@ txExecutionState::getVariable(int32_t aNamespace, nsIAtom* aLName, return NS_OK; } -nsresult -txExecutionState::isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) +bool +txExecutionState::isStripSpaceAllowed(const txXPathNode& aNode) { - return mStylesheet->isStripSpaceAllowed(aNode, this, aAllowed); + return mStylesheet->isStripSpaceAllowed(aNode, this); } void* diff --git a/dom/xslt/xslt/txInstructions.cpp b/dom/xslt/xslt/txInstructions.cpp index e891b2f3b0bb..bf6f50183711 100644 --- a/dom/xslt/xslt/txInstructions.cpp +++ b/dom/xslt/xslt/txInstructions.cpp @@ -27,11 +27,9 @@ txApplyDefaultElementTemplate::execute(txExecutionState& aEs) txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); txStylesheet::ImportFrame* frame = 0; - txInstruction* templ; - nsresult rv = + txInstruction* templ = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, nullptr, &templ, &frame); - NS_ENSURE_SUCCESS(rv, rv); + mode, &aEs, nullptr, &frame); aEs.pushTemplateRule(frame, mode, aEs.mTemplateParams); @@ -55,11 +53,9 @@ txApplyImports::execute(txExecutionState& aEs) txStylesheet::ImportFrame* frame = 0; txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); - txInstruction* templ; - rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, rule->mFrame, &templ, - &frame); - NS_ENSURE_SUCCESS(rv, rv); + txInstruction* templ = + aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), + mode, &aEs, rule->mFrame, &frame); aEs.pushTemplateRule(frame, mode, rule->mParams); @@ -80,11 +76,9 @@ nsresult txApplyTemplates::execute(txExecutionState& aEs) { txStylesheet::ImportFrame* frame = 0; - txInstruction* templ; - nsresult rv = + txInstruction* templ = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mMode, &aEs, nullptr, &templ, &frame); - NS_ENSURE_SUCCESS(rv, rv); + mMode, &aEs, nullptr, &frame); aEs.pushTemplateRule(frame, mMode, aEs.mTemplateParams); diff --git a/dom/xslt/xslt/txKeyFunctionCall.cpp b/dom/xslt/xslt/txKeyFunctionCall.cpp index d10229f24694..ae76275ffddf 100644 --- a/dom/xslt/xslt/txKeyFunctionCall.cpp +++ b/dom/xslt/xslt/txKeyFunctionCall.cpp @@ -338,11 +338,7 @@ nsresult txXSLKey::testNode(const txXPathNode& aNode, nsAutoString val; uint32_t currKey, numKeys = mKeys.Length(); for (currKey = 0; currKey < numKeys; ++currKey) { - bool matched; - nsresult rv = mKeys[currKey].matchPattern->matches(aNode, &aEs, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { + if (mKeys[currKey].matchPattern->matches(aNode, &aEs)) { txSingleNodeContext *evalContext = new txSingleNodeContext(aNode, &aEs); NS_ENSURE_TRUE(evalContext, NS_ERROR_OUT_OF_MEMORY); diff --git a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp index 9424d1110593..35c4b08b3d0b 100644 --- a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp +++ b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp @@ -441,11 +441,9 @@ public: aResult = nullptr; return NS_ERROR_INVALID_ARG; } - nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) + bool isStripSpaceAllowed(const txXPathNode& aNode) { - aAllowed = false; - - return NS_OK; + return false; } void* getPrivateContext() { diff --git a/dom/xslt/xslt/txStylesheet.cpp b/dom/xslt/xslt/txStylesheet.cpp index 37052c00f5fc..b680da01f94a 100644 --- a/dom/xslt/xslt/txStylesheet.cpp +++ b/dom/xslt/xslt/txStylesheet.cpp @@ -88,18 +88,17 @@ txStylesheet::~txStylesheet() } } -nsresult +txInstruction* txStylesheet::findTemplate(const txXPathNode& aNode, const txExpandedName& aMode, txIMatchContext* aContext, ImportFrame* aImportedBy, - txInstruction** aTemplate, ImportFrame** aImportFrame) { NS_ASSERTION(aImportFrame, "missing ImportFrame pointer"); - *aTemplate = nullptr; *aImportFrame = nullptr; + txInstruction* matchTemplate = nullptr; ImportFrame* endFrame = nullptr; txListIterator frameIter(&mImportFrames); @@ -116,7 +115,7 @@ txStylesheet::findTemplate(const txXPathNode& aNode, #endif ImportFrame* frame; - while (!*aTemplate && + while (!matchTemplate && (frame = static_cast(frameIter.next())) && frame != endFrame) { @@ -127,14 +126,10 @@ txStylesheet::findTemplate(const txXPathNode& aNode, if (templates) { // Find template with highest priority uint32_t i, len = templates->Length(); - for (i = 0; i < len && !*aTemplate; ++i) { + for (i = 0; i < len && !matchTemplate; ++i) { MatchableTemplate& templ = (*templates)[i]; - bool matched; - nsresult rv = templ.mMatch->matches(aNode, aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - *aTemplate = templ.mFirstInstruction; + if (templ.mMatch->matches(aNode, aContext)) { + matchTemplate = templ.mFirstInstruction; *aImportFrame = frame; #if defined(TX_TO_STRING) match = templ.mMatch; @@ -150,7 +145,7 @@ txStylesheet::findTemplate(const txXPathNode& aNode, aMode.mLocalName->ToString(mode); } txXPathNodeUtils::getNodeName(aNode, nodeName); - if (*aTemplate) { + if (matchTemplate) { nsAutoString matchAttr; #ifdef TX_TO_STRING match->toString(matchAttr); @@ -169,23 +164,23 @@ txStylesheet::findTemplate(const txXPathNode& aNode, } } - if (!*aTemplate) { + if (!matchTemplate) { // Test for these first since a node can be both a text node // and a root (if it is orphaned) if (txXPathNodeUtils::isAttribute(aNode) || txXPathNodeUtils::isText(aNode)) { - *aTemplate = mCharactersTemplate; + matchTemplate = mCharactersTemplate; } else if (txXPathNodeUtils::isElement(aNode) || txXPathNodeUtils::isRoot(aNode)) { - *aTemplate = mContainerTemplate; + matchTemplate = mContainerTemplate; } else { - *aTemplate = mEmptyTemplate; + matchTemplate = mEmptyTemplate; } } - return NS_OK; + return matchTemplate; } txDecimalFormat* @@ -224,53 +219,37 @@ txStylesheet::getKeyMap() return mKeys; } -nsresult -txStylesheet::isStripSpaceAllowed(const txXPathNode& aNode, - txIMatchContext* aContext, bool& aAllowed) +bool +txStylesheet::isStripSpaceAllowed(const txXPathNode& aNode, txIMatchContext* aContext) { int32_t frameCount = mStripSpaceTests.Length(); if (frameCount == 0) { - aAllowed = false; - - return NS_OK; + return false; } txXPathTreeWalker walker(aNode); if (txXPathNodeUtils::isText(walker.getCurrentPosition()) && (!txXPathNodeUtils::isWhitespace(aNode) || !walker.moveToParent())) { - aAllowed = false; - - return NS_OK; + return false; } const txXPathNode& node = walker.getCurrentPosition(); if (!txXPathNodeUtils::isElement(node)) { - aAllowed = false; - - return NS_OK; + return false; } // check Whitespace stipping handling list against given Node int32_t i; for (i = 0; i < frameCount; ++i) { txStripSpaceTest* sst = mStripSpaceTests[i]; - bool matched; - nsresult rv = sst->matches(node, aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - aAllowed = sst->stripsSpace() && - !XMLUtils::getXMLSpacePreserve(node); - - return NS_OK; + if (sst->matches(node, aContext)) { + return sst->stripsSpace() && !XMLUtils::getXMLSpacePreserve(node); } } - aAllowed = false; - - return NS_OK; + return false; } nsresult diff --git a/dom/xslt/xslt/txStylesheet.h b/dom/xslt/xslt/txStylesheet.h index 370f4d6fa78f..978527a13e4d 100644 --- a/dom/xslt/xslt/txStylesheet.h +++ b/dom/xslt/xslt/txStylesheet.h @@ -35,21 +35,19 @@ public: NS_INLINE_DECL_REFCOUNTING(txStylesheet) - nsresult findTemplate(const txXPathNode& aNode, - const txExpandedName& aMode, - txIMatchContext* aContext, - ImportFrame* aImportedBy, - txInstruction** aTemplate, - ImportFrame** aImportFrame); + txInstruction* findTemplate(const txXPathNode& aNode, + const txExpandedName& aMode, + txIMatchContext* aContext, + ImportFrame* aImportedBy, + ImportFrame** aImportFrame); txDecimalFormat* getDecimalFormat(const txExpandedName& aName); txInstruction* getAttributeSet(const txExpandedName& aName); txInstruction* getNamedTemplate(const txExpandedName& aName); txOutputFormat* getOutputFormat(); GlobalVariable* getGlobalVariable(const txExpandedName& aName); const txOwningExpandedNameMap& getKeyMap(); - nsresult isStripSpaceAllowed(const txXPathNode& aNode, - txIMatchContext* aContext, - bool& aAllowed); + bool isStripSpaceAllowed(const txXPathNode& aNode, + txIMatchContext* aContext); /** * Called by the stylesheet compiler once all stylesheets has been read. @@ -168,10 +166,8 @@ public: { } - nsresult matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) - { - return mNameTest.matches(aNode, aContext, aMatched); + bool matches(const txXPathNode& aNode, txIMatchContext* aContext) { + return mNameTest.matches(aNode, aContext); } bool stripsSpace() { diff --git a/dom/xslt/xslt/txXSLTNumber.cpp b/dom/xslt/xslt/txXSLTNumber.cpp index 96e21dfe01d1..237a46ec539d 100644 --- a/dom/xslt/xslt/txXSLTNumber.cpp +++ b/dom/xslt/xslt/txXSLTNumber.cpp @@ -108,12 +108,13 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, // Otherwise use count/from/level txPattern* countPattern = aCountPattern; - nsAutoPtr newCountPattern; + bool ownsCountPattern = false; const txXPathNode& currNode = aContext->getContextNode(); // Parse count- and from-attributes if (!aCountPattern) { + ownsCountPattern = true; txNodeTest* nodeTest; uint16_t nodeType = txXPathNodeUtils::getNodeType(currNode); switch (nodeType) { @@ -159,7 +160,7 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, } } MOZ_ASSERT(nodeTest); - countPattern = newCountPattern = new txStepPattern(nodeTest, false); + countPattern = new txStepPattern(nodeTest, false); } @@ -169,28 +170,14 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, if (aLevel == eLevelSingle) { txXPathTreeWalker walker(currNode); do { - if (aFromPattern && !walker.isOnNode(currNode)) { - bool matched; - rv = aFromPattern->matches(walker.getCurrentPosition(), - aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - break; - } + if (aFromPattern && !walker.isOnNode(currNode) && + aFromPattern->matches(walker.getCurrentPosition(), aContext)) { + break; } - bool matched; - rv = countPattern->matches(walker.getCurrentPosition(), aContext, - matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - int32_t count; - rv = getSiblingCount(walker, countPattern, aContext, &count); - NS_ENSURE_SUCCESS(rv, rv); - - aValues.add(NS_INT32_TO_PTR(count)); + if (countPattern->matches(walker.getCurrentPosition(), aContext)) { + aValues.add(NS_INT32_TO_PTR(getSiblingCount(walker, countPattern, + aContext))); break; } @@ -202,12 +189,7 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, if (aFromPattern && aValues.getLength()) { bool hasParent; while ((hasParent = walker.moveToParent())) { - bool matched; - rv = aFromPattern->matches(walker.getCurrentPosition(), - aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { + if (aFromPattern->matches(walker.getCurrentPosition(), aContext)) { break; } } @@ -223,28 +205,16 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, txXPathTreeWalker walker(currNode); bool matchedFrom = false; do { - if (aFromPattern && !walker.isOnNode(currNode)) { - rv = aFromPattern->matches(walker.getCurrentPosition(), - aContext, matchedFrom); - NS_ENSURE_SUCCESS(rv, rv); - - if (matchedFrom) { - //... we find one that matches from - break; - } + if (aFromPattern && !walker.isOnNode(currNode) && + aFromPattern->matches(walker.getCurrentPosition(), aContext)) { + //... we find one that matches from + matchedFrom = true; + break; } - bool matched; - rv = countPattern->matches(walker.getCurrentPosition(), aContext, - matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { - int32_t count; - rv = getSiblingCount(walker, countPattern, aContext, &count); - NS_ENSURE_SUCCESS(rv, rv); - - aValues.add(NS_INT32_TO_PTR(count)); + if (countPattern->matches(walker.getCurrentPosition(), aContext)) { + aValues.add(NS_INT32_TO_PTR(getSiblingCount(walker, countPattern, + aContext))); } } while (walker.moveToParent()); @@ -262,22 +232,13 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, txXPathTreeWalker walker(currNode); do { - if (aFromPattern && !walker.isOnNode(currNode)) { - rv = aFromPattern->matches(walker.getCurrentPosition(), - aContext, matchedFrom); - NS_ENSURE_SUCCESS(rv, rv); - - if (matchedFrom) { - break; - } + if (aFromPattern && !walker.isOnNode(currNode) && + aFromPattern->matches(walker.getCurrentPosition(), aContext)) { + matchedFrom = true; + break; } - bool matched; - rv = countPattern->matches(walker.getCurrentPosition(), aContext, - matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { + if (countPattern->matches(walker.getCurrentPosition(), aContext)) { ++value; } @@ -295,6 +256,10 @@ txXSLTNumber::getValueList(Expr* aValueExpr, txPattern* aCountPattern, } } + if (ownsCountPattern) { + delete countPattern; + } + return NS_OK; } @@ -423,27 +388,18 @@ txXSLTNumber::getCounters(Expr* aGroupSize, Expr* aGroupSeparator, return NS_OK; } -nsresult +int32_t txXSLTNumber::getSiblingCount(txXPathTreeWalker& aWalker, txPattern* aCountPattern, - txIMatchContext* aContext, - int32_t* aCount) + txIMatchContext* aContext) { int32_t value = 1; while (aWalker.moveToPreviousSibling()) { - bool matched; - nsresult rv = aCountPattern->matches(aWalker.getCurrentPosition(), - aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { + if (aCountPattern->matches(aWalker.getCurrentPosition(), aContext)) { ++value; } } - - *aCount = value; - - return NS_OK; + return value; } bool diff --git a/dom/xslt/xslt/txXSLTNumber.h b/dom/xslt/xslt/txXSLTNumber.h index 73326d3ab513..e6cdd421009c 100644 --- a/dom/xslt/xslt/txXSLTNumber.h +++ b/dom/xslt/xslt/txXSLTNumber.h @@ -46,10 +46,9 @@ private: * position. * */ - static nsresult getSiblingCount(txXPathTreeWalker& aWalker, - txPattern* aCountPattern, - txIMatchContext* aContext, - int32_t* aCount); + static int32_t getSiblingCount(txXPathTreeWalker& aWalker, + txPattern* aCountPattern, + txIMatchContext* aContext); static bool getPrevInDocumentOrder(txXPathTreeWalker& aWalker); diff --git a/dom/xslt/xslt/txXSLTPatterns.cpp b/dom/xslt/xslt/txXSLTPatterns.cpp index e5775dd3ef3b..c8fe71f72369 100644 --- a/dom/xslt/xslt/txXSLTPatterns.cpp +++ b/dom/xslt/xslt/txXSLTPatterns.cpp @@ -32,25 +32,15 @@ double txUnionPattern::getDefaultPriority() * This should be called on the simple patterns for xsl:template, * but is fine for xsl:key and xsl:number */ -nsresult -txUnionPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txUnionPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { uint32_t i, len = mLocPathPatterns.Length(); for (i = 0; i < len; ++i) { - nsresult rv = mLocPathPatterns[i]->matches(aNode, aContext, aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (aMatched) { - aMatched = true; - - return NS_OK; + if (mLocPathPatterns[i]->matches(aNode, aContext)) { + return true; } } - - aMatched = false; - - return NS_OK; + return false; } txPattern::Type @@ -113,9 +103,7 @@ nsresult txLocPathPattern::addStep(txPattern* aPattern, bool isChild) return NS_OK; } -nsresult -txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { NS_ASSERTION(mSteps.Length() > 1, "Internal error"); @@ -133,39 +121,18 @@ txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, uint32_t pos = mSteps.Length(); Step* step = &mSteps[--pos]; - nsresult rv = step->pattern->matches(aNode, aContext, aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (!aMatched) { - return NS_OK; - } + if (!step->pattern->matches(aNode, aContext)) + return false; txXPathTreeWalker walker(aNode); bool hasParent = walker.moveToParent(); while (step->isChild) { - if (!pos) { - aMatched = true; - - return NS_OK; // all steps matched - } - - if (!hasParent) { - // no more ancestors - aMatched = false; - - return NS_OK; - } - + if (!pos) + return true; // all steps matched step = &mSteps[--pos]; - rv = step->pattern->matches(walker.getCurrentPosition(), aContext, - aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (!aMatched) { - // no match - return NS_OK; - } + if (!hasParent || !step->pattern->matches(walker.getCurrentPosition(), aContext)) + return false; // no more ancestors or no match hasParent = walker.moveToParent(); } @@ -175,19 +142,12 @@ txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, uint32_t blockPos = pos; while (pos) { - if (!hasParent) { - aMatched = false; // There are more steps in the current block - // than ancestors of the tested node - return NS_OK; - } + if (!hasParent) + return false; // There are more steps in the current block + // than ancestors of the tested node step = &mSteps[--pos]; - bool matched; - rv = step->pattern->matches(walker.getCurrentPosition(), aContext, - matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (!matched) { + if (!step->pattern->matches(walker.getCurrentPosition(), aContext)) { // Didn't match. We restart at beginning of block using a new // start node pos = blockPos; @@ -204,9 +164,7 @@ txLocPathPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, } } - aMatched = true; - - return NS_OK; + return true; } // txLocPathPattern::matches double txLocPathPattern::getDefaultPriority() @@ -260,13 +218,9 @@ txLocPathPattern::toString(nsAString& aDest) * a txPattern matching the document node, or '/' */ -nsresult -txRootPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txRootPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { - aMatched = txXPathNodeUtils::isRoot(aNode); - - return NS_OK; + return txXPathNodeUtils::isRoot(aNode); } double txRootPattern::getDefaultPriority() @@ -310,14 +264,10 @@ txIdPattern::txIdPattern(const nsSubstring& aString) } } -nsresult -txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { if (!txXPathNodeUtils::isElement(aNode)) { - aMatched = false; - - return NS_OK; + return false; } // Get a ID attribute, if there is @@ -325,9 +275,7 @@ txIdPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, NS_ASSERTION(content, "a Element without nsIContent"); nsIAtom* id = content->GetID(); - aMatched = id && mIds.IndexOf(id) > -1; - - return NS_OK; + return id && mIds.IndexOf(id) > -1; } double txIdPattern::getDefaultPriority() @@ -372,22 +320,18 @@ txIdPattern::toString(nsAString& aDest) * argument. */ -nsresult -txKeyPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txKeyPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { txExecutionState* es = (txExecutionState*)aContext->getPrivateContext(); nsAutoPtr contextDoc(txXPathNodeUtils::getOwnerDocument(aNode)); - NS_ENSURE_TRUE(contextDoc, NS_ERROR_FAILURE); + NS_ENSURE_TRUE(contextDoc, false); RefPtr nodes; nsresult rv = es->getKeyNodes(mName, *contextDoc, mValue, true, getter_AddRefs(nodes)); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, false); - aMatched = nodes->contains(aNode); - - return NS_OK; + return nodes->contains(aNode); } double txKeyPattern::getDefaultPriority() @@ -429,32 +373,21 @@ txKeyPattern::toString(nsAString& aDest) * a txPattern to hold the NodeTest and the Predicates of a StepPattern */ -nsresult -txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, - bool& aMatched) +bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { NS_ASSERTION(mNodeTest, "Internal error"); - nsresult rv = mNodeTest->matches(aNode, aContext, aMatched); - NS_ENSURE_SUCCESS(rv, rv); - - if (!aMatched) { - return NS_OK; - } + if (!mNodeTest->matches(aNode, aContext)) + return false; txXPathTreeWalker walker(aNode); if ((!mIsAttr && txXPathNodeUtils::isAttribute(walker.getCurrentPosition())) || !walker.moveToParent()) { - aMatched = false; - - return NS_OK; + return false; } - if (isEmpty()) { - aMatched = true; - - return NS_OK; + return true; } /* @@ -477,17 +410,13 @@ txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, // Create the context node set for evaluating the predicates RefPtr nodes; - rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes)); - NS_ENSURE_SUCCESS(rv, rv); + nsresult rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes)); + NS_ENSURE_SUCCESS(rv, false); bool hasNext = mIsAttr ? walker.moveToFirstAttribute() : walker.moveToFirstChild(); while (hasNext) { - bool matched; - rv = mNodeTest->matches(walker.getCurrentPosition(), aContext, matched); - NS_ENSURE_SUCCESS(rv, rv); - - if (matched) { + if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { nodes->append(walker.getCurrentPosition()); } hasNext = mIsAttr ? walker.moveToNextAttribute() : @@ -497,7 +426,7 @@ txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, Expr* predicate = mPredicates[0]; RefPtr newNodes; rv = aContext->recycler()->getNodeSet(getter_AddRefs(newNodes)); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, false); uint32_t i, predLen = mPredicates.Length(); for (i = 1; i < predLen; ++i) { @@ -508,7 +437,7 @@ txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, predContext.next(); RefPtr exprResult; rv = predicate->evaluate(&predContext, getter_AddRefs(exprResult)); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, false); switch(exprResult->getResultType()) { case txAExprResult::NUMBER: @@ -535,25 +464,20 @@ txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext, nodes->clear(); nodes->append(*newNodes); if (!contextIsInPredicate) { - aMatched = false; - - return NS_OK; + return false; } predicate = mPredicates[i]; } txForwardContext evalContext(aContext, aNode, nodes); RefPtr exprResult; rv = predicate->evaluate(&evalContext, getter_AddRefs(exprResult)); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, false); - if (exprResult->getResultType() == txAExprResult::NUMBER) { + if (exprResult->getResultType() == txAExprResult::NUMBER) // handle default, [position() == numberValue()] - aMatched = ((double)evalContext.position() == exprResult->numberValue()); - } else { - aMatched = exprResult->booleanValue(); - } + return ((double)evalContext.position() == exprResult->numberValue()); - return NS_OK; + return exprResult->booleanValue(); } // matches double txStepPattern::getDefaultPriority() diff --git a/dom/xslt/xslt/txXSLTPatterns.h b/dom/xslt/xslt/txXSLTPatterns.h index e7bab74f05c0..d93d54fe0eec 100644 --- a/dom/xslt/xslt/txXSLTPatterns.h +++ b/dom/xslt/xslt/txXSLTPatterns.h @@ -26,9 +26,8 @@ public: /* * Determines whether this Pattern matches the given node. */ - virtual nsresult matches(const txXPathNode& aNode, - txIMatchContext* aContext, - bool& aMatched) = 0; + virtual bool matches(const txXPathNode& aNode, + txIMatchContext* aContext) = 0; /* * Returns the default priority of this Pattern. @@ -87,8 +86,7 @@ public: }; #define TX_DECL_PATTERN_BASE \ - nsresult matches(const txXPathNode& aNode, txIMatchContext* aContext, \ - bool& aMatched) override; \ + bool matches(const txXPathNode& aNode, txIMatchContext* aContext) override; \ double getDefaultPriority() override; \ virtual Expr* getSubExprAt(uint32_t aPos) override; \ virtual void setSubExprAt(uint32_t aPos, Expr* aExpr) override; \ From b3fe6cf3e66747395ef5f7bf8adcfe937b4c59fd Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 23:23:53 +0100 Subject: [PATCH 160/169] Backed out changeset 2b0cd920b4fc (bug 1336830) for bustage in dom/xslt/xpath/txNodeTypeTest.cpp. r=backout on a CLOSED TREE --- dom/xslt/crashtests/1336830.html | 27 ------------------- dom/xslt/crashtests/crashtests.list | 1 - dom/xslt/xslt/txInstructions.cpp | 18 ++++++++----- dom/xslt/xslt/txInstructions.h | 8 +++++- dom/xslt/xslt/txStylesheetCompileHandlers.cpp | 9 +++++-- 5 files changed, 25 insertions(+), 38 deletions(-) delete mode 100644 dom/xslt/crashtests/1336830.html diff --git a/dom/xslt/crashtests/1336830.html b/dom/xslt/crashtests/1336830.html deleted file mode 100644 index 907f58956394..000000000000 --- a/dom/xslt/crashtests/1336830.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - diff --git a/dom/xslt/crashtests/crashtests.list b/dom/xslt/crashtests/crashtests.list index 2c54819ec5e9..5958655d6473 100644 --- a/dom/xslt/crashtests/crashtests.list +++ b/dom/xslt/crashtests/crashtests.list @@ -18,4 +18,3 @@ load 667315.xml load 1089049.html load 1205163.xml load 1243337.xml -load 1336830.html diff --git a/dom/xslt/xslt/txInstructions.cpp b/dom/xslt/xslt/txInstructions.cpp index bf6f50183711..38253e0cb332 100644 --- a/dom/xslt/xslt/txInstructions.cpp +++ b/dom/xslt/xslt/txInstructions.cpp @@ -37,7 +37,16 @@ txApplyDefaultElementTemplate::execute(txExecutionState& aEs) } nsresult -txApplyImports::execute(txExecutionState& aEs) +txApplyImportsEnd::execute(txExecutionState& aEs) +{ + aEs.popTemplateRule(); + aEs.popParamMap(); + + return NS_OK; +} + +nsresult +txApplyImportsStart::execute(txExecutionState& aEs) { txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); // The frame is set to null when there is no current template rule, or @@ -59,12 +68,7 @@ txApplyImports::execute(txExecutionState& aEs) aEs.pushTemplateRule(frame, mode, rule->mParams); - rv = aEs.runTemplate(templ); - - aEs.popTemplateRule(); - aEs.popParamMap(); - - return rv; + return aEs.runTemplate(templ); } txApplyTemplates::txApplyTemplates(const txExpandedName& aMode) diff --git a/dom/xslt/xslt/txInstructions.h b/dom/xslt/xslt/txInstructions.h index d363400e868c..55138a600a54 100644 --- a/dom/xslt/xslt/txInstructions.h +++ b/dom/xslt/xslt/txInstructions.h @@ -47,7 +47,13 @@ public: TX_DECL_TXINSTRUCTION }; -class txApplyImports : public txInstruction +class txApplyImportsEnd : public txInstruction +{ +public: + TX_DECL_TXINSTRUCTION +}; + +class txApplyImportsStart : public txInstruction { public: TX_DECL_TXINSTRUCTION diff --git a/dom/xslt/xslt/txStylesheetCompileHandlers.cpp b/dom/xslt/xslt/txStylesheetCompileHandlers.cpp index 4d451e3c303f..f447df7cfc46 100644 --- a/dom/xslt/xslt/txStylesheetCompileHandlers.cpp +++ b/dom/xslt/xslt/txStylesheetCompileHandlers.cpp @@ -1312,7 +1312,8 @@ txFnText(const nsAString& aStr, txStylesheetCompilerState& aState) /* xsl:apply-imports - txApplyImports + txApplyImportsStart + txApplyImportsEnd */ static nsresult txFnStartApplyImports(int32_t aNamespaceID, @@ -1324,7 +1325,11 @@ txFnStartApplyImports(int32_t aNamespaceID, { nsresult rv = NS_OK; - nsAutoPtr instr(new txApplyImports); + nsAutoPtr instr(new txApplyImportsStart); + rv = aState.addInstruction(Move(instr)); + NS_ENSURE_SUCCESS(rv, rv); + + instr = new txApplyImportsEnd; rv = aState.addInstruction(Move(instr)); NS_ENSURE_SUCCESS(rv, rv); From 902f860ca74b25d746975d0c00f69fd83060f992 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Mon, 20 Mar 2017 18:13:19 -0400 Subject: [PATCH 161/169] Bug 1340482 - Trace shape for shaped but non-native objects. r=sfink --HG-- extra : rebase_source : c21602d9b65c02920c8dc57cf3bce5011d7ed340 --- js/src/jsobj.cpp | 5 +++-- js/src/vm/ShapedObject.h | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index e3439bad7d19..7820d0295f72 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -3879,12 +3879,13 @@ JSObject::traceChildren(JSTracer* trc) { TraceEdge(trc, &group_, "group"); + if (is()) + as().traceShape(trc); + const Class* clasp = group_->clasp(); if (clasp->isNative()) { NativeObject* nobj = &as(); - TraceEdge(trc, &nobj->shape_, "shape"); - { GetObjectSlotNameFunctor func(nobj); JS::AutoTracingDetails ctx(trc, func); diff --git a/js/src/vm/ShapedObject.h b/js/src/vm/ShapedObject.h index b8b665e9d2ff..408649bd8269 100644 --- a/js/src/vm/ShapedObject.h +++ b/js/src/vm/ShapedObject.h @@ -39,6 +39,10 @@ class ShapedObject : public JSObject Shape* shape() const { return this->shape_; } + void traceShape(JSTracer* trc) { + TraceEdge(trc, &shape_, "shape"); + } + static size_t offsetOfShape() { return offsetof(ShapedObject, shape_); } private: From 89ce732573a0c83028991001a9652a0d80330fe6 Mon Sep 17 00:00:00 2001 From: Petr Cerny Date: Mon, 20 Mar 2017 18:20:19 -0400 Subject: [PATCH 162/169] Bug 1292534 - Patch lexical parser files generated by flex. r=jgilbert --HG-- extra : rebase_source : 75f659604b0dfbebe38e2d75912f00a171576439 --- gfx/angle/src/compiler/translator/glslang_lex.cpp | 2 +- media/sphinxbase/src/libsphinxbase/lm/jsgf_scanner.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/angle/src/compiler/translator/glslang_lex.cpp b/gfx/angle/src/compiler/translator/glslang_lex.cpp index ef9d59c93197..2dcc1bc0f0db 100755 --- a/gfx/angle/src/compiler/translator/glslang_lex.cpp +++ b/gfx/angle/src/compiler/translator/glslang_lex.cpp @@ -2338,7 +2338,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) diff --git a/media/sphinxbase/src/libsphinxbase/lm/jsgf_scanner.c b/media/sphinxbase/src/libsphinxbase/lm/jsgf_scanner.c index c9f40261d9aa..5d41d2a6b8e1 100644 --- a/media/sphinxbase/src/libsphinxbase/lm/jsgf_scanner.c +++ b/media/sphinxbase/src/libsphinxbase/lm/jsgf_scanner.c @@ -1247,7 +1247,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) From 69a981c64aec87c942dc0801d3c75f7615f5eba9 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Mon, 20 Mar 2017 18:21:00 -0400 Subject: [PATCH 163/169] Bug 1343795 - Hold a strong ref on the Selection while calling ScrollIntoView with SCROLL_DO_FLUSH. r=smaug --HG-- extra : rebase_source : d2bd613d69ac59244818dbe2403e2f7b18deca35 --- layout/generic/Selection.h | 9 ++++++--- layout/generic/nsSelection.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/layout/generic/Selection.h b/layout/generic/Selection.h index ef3ce0fda57d..bb3e3b6e49f9 100644 --- a/layout/generic/Selection.h +++ b/layout/generic/Selection.h @@ -101,12 +101,15 @@ public: enum { SCROLL_SYNCHRONOUS = 1<<1, SCROLL_FIRST_ANCESTOR_ONLY = 1<<2, - SCROLL_DO_FLUSH = 1<<3, + SCROLL_DO_FLUSH = 1<<3, // only matters if SCROLL_SYNCHRONOUS is passed too SCROLL_OVERFLOW_HIDDEN = 1<<5, SCROLL_FOR_CARET_MOVE = 1<<6 }; - // aDoFlush only matters if aIsSynchronous is true. If not, we'll just flush - // when the scroll event fires so we make sure to scroll to the right place. + // If aFlags doesn't contain SCROLL_SYNCHRONOUS, then we'll flush when + // the scroll event fires so we make sure to scroll to the right place. + // Otherwise, if SCROLL_DO_FLUSH is also in aFlags, then this method will + // flush layout and you MUST hold a strong ref on 'this' for the duration + // of this call. This might destroy arbitrary layout objects. nsresult ScrollIntoView(SelectionRegion aRegion, nsIPresShell::ScrollAxis aVertical = nsIPresShell::ScrollAxis(), diff --git a/layout/generic/nsSelection.cpp b/layout/generic/nsSelection.cpp index 58d18b46d64b..3beefbb8031f 100644 --- a/layout/generic/nsSelection.cpp +++ b/layout/generic/nsSelection.cpp @@ -1974,10 +1974,9 @@ nsFrameSelection::ScrollSelectionIntoView(SelectionType aSelectionType, // After ScrollSelectionIntoView(), the pending notifications might be // flushed and PresShell/PresContext/Frames may be dead. See bug 418470. - return mDomSelections[index]->ScrollIntoView(aRegion, - verticalScroll, - nsIPresShell::ScrollAxis(), - flags); + RefPtr sel = mDomSelections[index]; + return sel->ScrollIntoView(aRegion, verticalScroll, + nsIPresShell::ScrollAxis(), flags); } nsresult @@ -6171,6 +6170,7 @@ Selection::ScrollSelectionIntoViewEvent::Run() int32_t flags = Selection::SCROLL_DO_FLUSH | Selection::SCROLL_SYNCHRONOUS; + RefPtr kungFuDeathGrip = mSelection; mSelection->mScrollEvent.Forget(); mSelection->ScrollIntoView(mRegion, mVerticalScroll, mHorizontalScroll, mFlags | flags); From 6ae1479eb987d6b2126be6199f8a3960dd3b9308 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 20 Mar 2017 18:23:18 -0400 Subject: [PATCH 164/169] Bug 1344461 - Keep track of line length to not read beyond eol. r=valentin --HG-- extra : rebase_source : 662cfbee945210e4fb3a15ef1073bad4afb3c30a --- .../converters/nsDirIndexParser.cpp | 57 ++++++++++++++----- .../streamconv/converters/nsDirIndexParser.h | 2 +- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/netwerk/streamconv/converters/nsDirIndexParser.cpp b/netwerk/streamconv/converters/nsDirIndexParser.cpp index a25f28039fd6..f1db0347576b 100644 --- a/netwerk/streamconv/converters/nsDirIndexParser.cpp +++ b/netwerk/streamconv/converters/nsDirIndexParser.cpp @@ -154,6 +154,7 @@ nsDirIndexParser::ParseFormat(const char* aFormatStr) { if (mFormat == nullptr) return NS_ERROR_OUT_OF_MEMORY; mFormat[num] = -1; + mFormat[0] = -1; // to detect zero header fields int formatNum=0; do { @@ -192,7 +193,8 @@ nsDirIndexParser::ParseFormat(const char* aFormatStr) { } nsresult -nsDirIndexParser::ParseData(nsIDirIndex *aIdx, char* aDataStr) { +nsDirIndexParser::ParseData(nsIDirIndex *aIdx, char* aDataStr, int32_t aLineLen) +{ // Parse a "201" data line, using the field ordering specified in // mFormat. @@ -202,37 +204,62 @@ nsDirIndexParser::ParseData(nsIDirIndex *aIdx, char* aDataStr) { } nsresult rv = NS_OK; - nsAutoCString filename; + int32_t lineLen = aLineLen; + + if (mFormat[0] == -1) { + // no known header fields is an error + return NS_ERROR_ILLEGAL_VALUE; + } for (int32_t i = 0; mFormat[i] != -1; ++i) { - // If we've exhausted the data before we run out of fields, just - // bail. - if (! *aDataStr) - break; + // If we've exhausted the data before we run out of fields, just bail. + if (!*aDataStr || (lineLen < 1)) { + return NS_ERROR_ILLEGAL_VALUE; + } - while (*aDataStr && nsCRT::IsAsciiSpace(*aDataStr)) + while ((lineLen > 0) && nsCRT::IsAsciiSpace(*aDataStr)) { ++aDataStr; + --lineLen; + } + + if (lineLen < 1) { + // invalid format, bail + return NS_ERROR_ILLEGAL_VALUE; + } char *value = aDataStr; - if (*aDataStr == '"' || *aDataStr == '\'') { // it's a quoted string. snarf everything up to the next quote character const char quotechar = *(aDataStr++); + lineLen--; ++value; - while (*aDataStr && *aDataStr != quotechar) + while ((lineLen > 0) && *aDataStr != quotechar) { ++aDataStr; - *aDataStr++ = '\0'; + --lineLen; + } + if (lineLen > 0) { + *aDataStr++ = '\0'; + --lineLen; + } - if (! aDataStr) { - NS_WARNING("quoted value not terminated"); + if (!lineLen) { + // invalid format, bail + return NS_ERROR_ILLEGAL_VALUE; } } else { // it's unquoted. snarf until we see whitespace. value = aDataStr; - while (*aDataStr && (!nsCRT::IsAsciiSpace(*aDataStr))) + while ((lineLen > 0) && (!nsCRT::IsAsciiSpace(*aDataStr))) { ++aDataStr; - *aDataStr++ = '\0'; + --lineLen; + } + if (lineLen > 0) { + *aDataStr++ = '\0'; + --lineLen; + } + // even if we ran out of line length here, there's still a trailing zero + // byte afterwards } fieldType t = fieldType(mFormat[i]); @@ -404,7 +431,7 @@ nsDirIndexParser::ProcessData(nsIRequest *aRequest, nsISupports *aCtxt) { if (NS_FAILED(rv)) return rv; - rv = ParseData(idx, ((char *)buf) + 4); + rv = ParseData(idx, ((char *)buf) + 4, lineLen - 4); if (NS_FAILED(rv)) { return rv; } diff --git a/netwerk/streamconv/converters/nsDirIndexParser.h b/netwerk/streamconv/converters/nsDirIndexParser.h index 11414c75957a..54e0d511701a 100644 --- a/netwerk/streamconv/converters/nsDirIndexParser.h +++ b/netwerk/streamconv/converters/nsDirIndexParser.h @@ -51,7 +51,7 @@ protected: nsresult ProcessData(nsIRequest *aRequest, nsISupports *aCtxt); nsresult ParseFormat(const char* buf); - nsresult ParseData(nsIDirIndex* aIdx, char* aDataStr); + nsresult ParseData(nsIDirIndex* aIdx, char* aDataStr, int32_t lineLen); struct Field { const char *mName; From 48b67cbb5fc00d160403f1f850bd012fd446c080 Mon Sep 17 00:00:00 2001 From: Shu-yu Guo Date: Mon, 20 Mar 2017 18:34:10 -0400 Subject: [PATCH 165/169] Bug 1342101 - Move canonicalFunction.init before Scope::create in case create fails. r=jandem --- js/src/vm/Scope.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/js/src/vm/Scope.cpp b/js/src/vm/Scope.cpp index 6087b0ecd809..809334dbc237 100644 --- a/js/src/vm/Scope.cpp +++ b/js/src/vm/Scope.cpp @@ -630,6 +630,7 @@ FunctionScope::create(JSContext* cx, Handle data, return nullptr; copy->hasParameterExprs = hasParameterExprs; + copy->canonicalFunction.init(fun); // An environment may be needed regardless of existence of any closed over // bindings: @@ -647,8 +648,6 @@ FunctionScope::create(JSContext* cx, Handle data, if (!scope) return nullptr; - copy->canonicalFunction.init(fun); - funScope = &scope->as(); funScope->initData(Move(copy.get())); } @@ -701,12 +700,12 @@ FunctionScope::clone(JSContext* cx, Handle scope, HandleFunction if (!dataClone) return nullptr; - Scope* scopeClone= Scope::create(cx, scope->kind(), enclosing, envShape); + dataClone->canonicalFunction.init(fun); + + Scope* scopeClone = Scope::create(cx, scope->kind(), enclosing, envShape); if (!scopeClone) return nullptr; - dataClone->canonicalFunction.init(fun); - funScopeClone = &scopeClone->as(); funScopeClone->initData(Move(dataClone.get())); } From af455321f5b817d41d2eb036c2f8002016f09a8e Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Mon, 20 Mar 2017 23:41:44 +0100 Subject: [PATCH 166/169] Backed out changeset b4e95d147909 (bug 1343795) for bustage in layout/generic/nsSelection.cpp. r=backout --- layout/generic/Selection.h | 9 +++------ layout/generic/nsSelection.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/layout/generic/Selection.h b/layout/generic/Selection.h index bb3e3b6e49f9..ef3ce0fda57d 100644 --- a/layout/generic/Selection.h +++ b/layout/generic/Selection.h @@ -101,15 +101,12 @@ public: enum { SCROLL_SYNCHRONOUS = 1<<1, SCROLL_FIRST_ANCESTOR_ONLY = 1<<2, - SCROLL_DO_FLUSH = 1<<3, // only matters if SCROLL_SYNCHRONOUS is passed too + SCROLL_DO_FLUSH = 1<<3, SCROLL_OVERFLOW_HIDDEN = 1<<5, SCROLL_FOR_CARET_MOVE = 1<<6 }; - // If aFlags doesn't contain SCROLL_SYNCHRONOUS, then we'll flush when - // the scroll event fires so we make sure to scroll to the right place. - // Otherwise, if SCROLL_DO_FLUSH is also in aFlags, then this method will - // flush layout and you MUST hold a strong ref on 'this' for the duration - // of this call. This might destroy arbitrary layout objects. + // aDoFlush only matters if aIsSynchronous is true. If not, we'll just flush + // when the scroll event fires so we make sure to scroll to the right place. nsresult ScrollIntoView(SelectionRegion aRegion, nsIPresShell::ScrollAxis aVertical = nsIPresShell::ScrollAxis(), diff --git a/layout/generic/nsSelection.cpp b/layout/generic/nsSelection.cpp index 3beefbb8031f..58d18b46d64b 100644 --- a/layout/generic/nsSelection.cpp +++ b/layout/generic/nsSelection.cpp @@ -1974,9 +1974,10 @@ nsFrameSelection::ScrollSelectionIntoView(SelectionType aSelectionType, // After ScrollSelectionIntoView(), the pending notifications might be // flushed and PresShell/PresContext/Frames may be dead. See bug 418470. - RefPtr sel = mDomSelections[index]; - return sel->ScrollIntoView(aRegion, verticalScroll, - nsIPresShell::ScrollAxis(), flags); + return mDomSelections[index]->ScrollIntoView(aRegion, + verticalScroll, + nsIPresShell::ScrollAxis(), + flags); } nsresult @@ -6170,7 +6171,6 @@ Selection::ScrollSelectionIntoViewEvent::Run() int32_t flags = Selection::SCROLL_DO_FLUSH | Selection::SCROLL_SYNCHRONOUS; - RefPtr kungFuDeathGrip = mSelection; mSelection->mScrollEvent.Forget(); mSelection->ScrollIntoView(mRegion, mVerticalScroll, mHorizontalScroll, mFlags | flags); From 5587bb56c57714dc786fcbb81a1793ad8abc0c19 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Tue, 21 Mar 2017 00:16:41 -0500 Subject: [PATCH 167/169] Bug 1346109. Set a displayport base rect in MobileViewportManager::UpdateDisplayPortMargins when we are setting displayport margins. r=botond It's easy to calculate because it's always a root content document. --- layout/base/MobileViewportManager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/layout/base/MobileViewportManager.cpp b/layout/base/MobileViewportManager.cpp index ec28cdc8650d..6c359048eac1 100644 --- a/layout/base/MobileViewportManager.cpp +++ b/layout/base/MobileViewportManager.cpp @@ -305,6 +305,13 @@ MobileViewportManager::UpdateDisplayPortMargins() // comment 1). return; } + nsRect displayportBase = + nsRect(nsPoint(0, 0), nsLayoutUtils::CalculateCompositionSizeForFrame(root)); + // We only create MobileViewportManager for root content documents. If that ever changes + // we'd need to limit the size of this displayport base rect because non-toplevel documents + // have no limit on their size. + MOZ_ASSERT(mPresShell->GetPresContext()->IsRootContentDocument()); + nsLayoutUtils::SetDisplayPortBaseIfNotSet(root->GetContent(), displayportBase); nsIScrollableFrame* scrollable = do_QueryFrame(root); nsLayoutUtils::CalculateAndSetDisplayPortMargins(scrollable, nsLayoutUtils::RepaintMode::DoNotRepaint); From 2e9d67bae075f57170f98819704fb7a4ae4f968a Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Tue, 21 Mar 2017 07:47:25 +0100 Subject: [PATCH 168/169] Bug 1347557 - Move 2 static methods about the IPC serialization of streams into an helper class, r=qdot --- dom/file/ipc/Blob.cpp | 8 +++-- ipc/glue/IPCStreamUtils.cpp | 2 +- ipc/glue/InputStreamUtils.cpp | 48 +++-------------------------- ipc/glue/InputStreamUtils.h | 28 ++++++++--------- netwerk/base/nsBufferedStreams.cpp | 8 +++-- netwerk/base/nsMIMEInputStream.cpp | 8 +++-- xpcom/io/SlicedInputStream.cpp | 6 ++-- xpcom/io/nsMultiplexInputStream.cpp | 8 +++-- 8 files changed, 42 insertions(+), 74 deletions(-) diff --git a/dom/file/ipc/Blob.cpp b/dom/file/ipc/Blob.cpp index aa8b9dafd857..b79072a632c3 100644 --- a/dom/file/ipc/Blob.cpp +++ b/dom/file/ipc/Blob.cpp @@ -993,7 +993,8 @@ RemoteInputStream::BlockAndWaitForStream() nsTArray fds; OptionalFileDescriptorSetToFDs(optionalFDs, fds); - nsCOMPtr stream = DeserializeInputStream(params, fds); + nsCOMPtr stream = + InputStreamHelper::DeserializeInputStream(params, fds); MOZ_ASSERT(stream); SetStream(stream); @@ -4450,7 +4451,7 @@ BlobParent::RecvPBlobStreamConstructor(PBlobStreamParent* aActor, if (mBlobImpl->IsMemoryFile()) { InputStreamParams params; nsTArray fds; - SerializeInputStream(stream, params, fds); + InputStreamHelper::SerializeInputStream(stream, params, fds); MOZ_ASSERT(params.type() != InputStreamParams::T__None); MOZ_ASSERT(fds.IsEmpty()); @@ -4788,7 +4789,8 @@ InputStreamChild::Recv__delete__(const InputStreamParams& aParams, const_cast(aOptionalSet), fds); - nsCOMPtr stream = DeserializeInputStream(aParams, fds); + nsCOMPtr stream = + InputStreamHelper::DeserializeInputStream(aParams, fds); MOZ_ASSERT(stream); mRemoteStream->SetStream(stream); diff --git a/ipc/glue/IPCStreamUtils.cpp b/ipc/glue/IPCStreamUtils.cpp index f9dc1e6aede2..4cae37fc701e 100644 --- a/ipc/glue/IPCStreamUtils.cpp +++ b/ipc/glue/IPCStreamUtils.cpp @@ -392,7 +392,7 @@ DeserializeIPCStream(const IPCStream& aValue) Unused << fdSetActor->Send__delete__(fdSetActor); } - return DeserializeInputStream(streamWithFds.stream(), fds); + return InputStreamHelper::DeserializeInputStream(streamWithFds.stream(), fds); } already_AddRefed diff --git a/ipc/glue/InputStreamUtils.cpp b/ipc/glue/InputStreamUtils.cpp index bf4ee02fa7e9..883738859b11 100644 --- a/ipc/glue/InputStreamUtils.cpp +++ b/ipc/glue/InputStreamUtils.cpp @@ -40,9 +40,9 @@ namespace mozilla { namespace ipc { void -SerializeInputStream(nsIInputStream* aInputStream, - InputStreamParams& aParams, - nsTArray& aFileDescriptors) +InputStreamHelper::SerializeInputStream(nsIInputStream* aInputStream, + InputStreamParams& aParams, + nsTArray& aFileDescriptors) { MOZ_ASSERT(aInputStream); @@ -59,24 +59,9 @@ SerializeInputStream(nsIInputStream* aInputStream, } } -void -SerializeInputStream(nsIInputStream* aInputStream, - OptionalInputStreamParams& aParams, - nsTArray& aFileDescriptors) -{ - if (aInputStream) { - InputStreamParams params; - SerializeInputStream(aInputStream, params, aFileDescriptors); - aParams = params; - } - else { - aParams = mozilla::void_t(); - } -} - already_AddRefed -DeserializeInputStream(const InputStreamParams& aParams, - const nsTArray& aFileDescriptors) +InputStreamHelper::DeserializeInputStream(const InputStreamParams& aParams, + const nsTArray& aFileDescriptors) { nsCOMPtr stream; nsCOMPtr serializable; @@ -166,28 +151,5 @@ DeserializeInputStream(const InputStreamParams& aParams, return stream.forget(); } -already_AddRefed -DeserializeInputStream(const OptionalInputStreamParams& aParams, - const nsTArray& aFileDescriptors) -{ - nsCOMPtr stream; - - switch (aParams.type()) { - case OptionalInputStreamParams::Tvoid_t: - // Leave stream null. - break; - - case OptionalInputStreamParams::TInputStreamParams: - stream = DeserializeInputStream(aParams.get_InputStreamParams(), - aFileDescriptors); - break; - - default: - MOZ_ASSERT(false, "Unknown params!"); - } - - return stream.forget(); -} - } // namespace ipc } // namespace mozilla diff --git a/ipc/glue/InputStreamUtils.h b/ipc/glue/InputStreamUtils.h index 215a8cb23d0a..b00da0170207 100644 --- a/ipc/glue/InputStreamUtils.h +++ b/ipc/glue/InputStreamUtils.h @@ -17,23 +17,19 @@ namespace ipc { class FileDescriptor; -void -SerializeInputStream(nsIInputStream* aInputStream, - InputStreamParams& aParams, - nsTArray& aFileDescriptors); +// If you want to serialize an inputStream, please use AutoIPCStream. +class InputStreamHelper +{ +public: + static void + SerializeInputStream(nsIInputStream* aInputStream, + InputStreamParams& aParams, + nsTArray& aFileDescriptors); -void -SerializeInputStream(nsIInputStream* aInputStream, - OptionalInputStreamParams& aParams, - nsTArray& aFileDescriptors); - -already_AddRefed -DeserializeInputStream(const InputStreamParams& aParams, - const nsTArray& aFileDescriptors); - -already_AddRefed -DeserializeInputStream(const OptionalInputStreamParams& aParams, - const nsTArray& aFileDescriptors); + static already_AddRefed + DeserializeInputStream(const InputStreamParams& aParams, + const nsTArray& aFileDescriptors); +}; } // namespace ipc } // namespace mozilla diff --git a/netwerk/base/nsBufferedStreams.cpp b/netwerk/base/nsBufferedStreams.cpp index 6df8c2a04752..56bfe6b77bbe 100644 --- a/netwerk/base/nsBufferedStreams.cpp +++ b/netwerk/base/nsBufferedStreams.cpp @@ -554,7 +554,8 @@ nsBufferedInputStream::Serialize(InputStreamParams& aParams, MOZ_ASSERT(stream); InputStreamParams wrappedParams; - SerializeInputStream(stream, wrappedParams, aFileDescriptors); + InputStreamHelper::SerializeInputStream(stream, wrappedParams, + aFileDescriptors); params.optionalStream() = wrappedParams; } @@ -582,8 +583,9 @@ nsBufferedInputStream::Deserialize(const InputStreamParams& aParams, nsCOMPtr stream; if (wrappedParams.type() == OptionalInputStreamParams::TInputStreamParams) { - stream = DeserializeInputStream(wrappedParams.get_InputStreamParams(), - aFileDescriptors); + stream = + InputStreamHelper::DeserializeInputStream(wrappedParams.get_InputStreamParams(), + aFileDescriptors); if (!stream) { NS_WARNING("Failed to deserialize wrapped stream!"); return false; diff --git a/netwerk/base/nsMIMEInputStream.cpp b/netwerk/base/nsMIMEInputStream.cpp index 02c727b0be68..b76a5786af7b 100644 --- a/netwerk/base/nsMIMEInputStream.cpp +++ b/netwerk/base/nsMIMEInputStream.cpp @@ -269,7 +269,8 @@ nsMIMEInputStream::Serialize(InputStreamParams& aParams, if (mStream) { InputStreamParams wrappedParams; - SerializeInputStream(mStream, wrappedParams, aFileDescriptors); + InputStreamHelper::SerializeInputStream(mStream, wrappedParams, + aFileDescriptors); NS_ASSERTION(wrappedParams.type() != InputStreamParams::T__None, "Wrapped stream failed to serialize!"); @@ -304,8 +305,9 @@ nsMIMEInputStream::Deserialize(const InputStreamParams& aParams, if (wrappedParams.type() == OptionalInputStreamParams::TInputStreamParams) { nsCOMPtr stream; - stream = DeserializeInputStream(wrappedParams.get_InputStreamParams(), - aFileDescriptors); + stream = + InputStreamHelper::DeserializeInputStream(wrappedParams.get_InputStreamParams(), + aFileDescriptors); if (!stream) { NS_WARNING("Failed to deserialize wrapped stream!"); return false; diff --git a/xpcom/io/SlicedInputStream.cpp b/xpcom/io/SlicedInputStream.cpp index 52693db91ca5..43e0b871971c 100644 --- a/xpcom/io/SlicedInputStream.cpp +++ b/xpcom/io/SlicedInputStream.cpp @@ -256,7 +256,8 @@ SlicedInputStream::Serialize(mozilla::ipc::InputStreamParams& aParams, MOZ_ASSERT(mWeakIPCSerializableInputStream); SlicedInputStreamParams params; - SerializeInputStream(mInputStream, params.stream(), aFileDescriptors); + InputStreamHelper::SerializeInputStream(mInputStream, params.stream(), + aFileDescriptors); params.start() = mStart; params.length() = mLength; params.curPos() = mCurPos; @@ -282,7 +283,8 @@ SlicedInputStream::Deserialize(const mozilla::ipc::InputStreamParams& aParams, aParams.get_SlicedInputStreamParams(); nsCOMPtr stream = - DeserializeInputStream(params.stream(), aFileDescriptors); + InputStreamHelper::DeserializeInputStream(params.stream(), + aFileDescriptors); if (!stream) { NS_WARNING("Deserialize failed!"); return false; diff --git a/xpcom/io/nsMultiplexInputStream.cpp b/xpcom/io/nsMultiplexInputStream.cpp index f0dcd11a4e11..de0c10df6cb6 100644 --- a/xpcom/io/nsMultiplexInputStream.cpp +++ b/xpcom/io/nsMultiplexInputStream.cpp @@ -709,8 +709,9 @@ nsMultiplexInputStream::Serialize(InputStreamParams& aParams, streams.SetCapacity(streamCount); for (uint32_t index = 0; index < streamCount; index++) { InputStreamParams childStreamParams; - SerializeInputStream(mStreams[index], childStreamParams, - aFileDescriptors); + InputStreamHelper::SerializeInputStream(mStreams[index], + childStreamParams, + aFileDescriptors); streams.AppendElement(childStreamParams); } @@ -741,7 +742,8 @@ nsMultiplexInputStream::Deserialize(const InputStreamParams& aParams, uint32_t streamCount = streams.Length(); for (uint32_t index = 0; index < streamCount; index++) { nsCOMPtr stream = - DeserializeInputStream(streams[index], aFileDescriptors); + InputStreamHelper::DeserializeInputStream(streams[index], + aFileDescriptors); if (!stream) { NS_WARNING("Deserialize failed!"); return false; From e557a3222d66a31cfe45c55f1c5c4366c998b185 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Tue, 21 Mar 2017 11:28:38 +0100 Subject: [PATCH 169/169] Backed out changeset 5733e0b0e096 (bug 1120409) for causing frequent timeouts in test_XHR_timeout.html --- toolkit/components/telemetry/TelemetryHistogram.cpp | 6 ------ .../telemetry/tests/unit/test_TelemetryHistograms.js | 8 -------- 2 files changed, 14 deletions(-) diff --git a/toolkit/components/telemetry/TelemetryHistogram.cpp b/toolkit/components/telemetry/TelemetryHistogram.cpp index f5c6895ee400..7644ab9894ca 100644 --- a/toolkit/components/telemetry/TelemetryHistogram.cpp +++ b/toolkit/components/telemetry/TelemetryHistogram.cpp @@ -2279,12 +2279,6 @@ TelemetryHistogram::CreateHistogramSnapshots(JSContext *cx, continue; } - mozilla::Telemetry::HistogramID id; - nsresult rv = internal_GetHistogramEnumId(h->histogram_name().c_str(), &id); - if (NS_WARN_IF(NS_FAILED(rv)) || gHistograms[id].keyed) { - continue; - } - Histogram* original = h; #if !defined(MOZ_WIDGET_ANDROID) if (subsession) { diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js b/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js index c855b0c68227..08e5acfdf6ce 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js @@ -757,14 +757,6 @@ add_task(function* test_keyed_histogram_recording_enabled() { "Keyed histogram add should not record when recording is disabled"); }); -add_task(function* test_histogramSnapshots() { - let keyed = Telemetry.getKeyedHistogramById("TELEMETRY_TEST_KEYED_COUNT"); - keyed.add("a", 1); - - // Check that keyed histograms are not returned - Assert.ok(!("TELEMETRY_TEST_KEYED_COUNT#a" in Telemetry.histogramSnapshots)); -}); - add_task(function* test_datasets() { // Check that datasets work as expected.