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(); diff --git a/browser/app/moz.build b/browser/app/moz.build index d43092b4f18b..cbf111027c5b 100644 --- a/browser/app/moz.build +++ b/browser/app/moz.build @@ -29,10 +29,6 @@ LOCAL_INCLUDES += [ '/xpcom/build', ] -USE_LIBS += [ - 'mozglue', -] - if CONFIG['LIBFUZZER']: USE_LIBS += [ 'fuzzer' ] LOCAL_INCLUDES += [ diff --git a/browser/base/content/browser-feeds.js b/browser/base/content/browser-feeds.js index 10c0c14bb9e2..3e95db0f130d 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,240 @@ 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) { + Services.prefs.setStringPref(aPrefName, aPrefValue); + } 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.getStringPref(getPrefWebForType(feedType)); + } 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/base/content/browser-syncui.js b/browser/base/content/browser-syncui.js index 6e9ccb283a2f..8d81b7d25e9b 100644 --- a/browser/base/content/browser-syncui.js +++ b/browser/base/content/browser-syncui.js @@ -473,7 +473,7 @@ XPCOMUtils.defineLazyGetter(gSyncUI, "_stringBundle", function() { // XXXzpao these strings should probably be moved from /services to /browser... (bug 583381) // but for now just make it work return Services.strings.createBundle( - "chrome://weave/locale/services/sync.properties"); + "chrome://weave/locale/sync.properties"); }); XPCOMUtils.defineLazyGetter(gSyncUI, "log", function() { diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 5ceca60efb10..14c6f43444fd 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -15,7 +15,7 @@ Cu.import("resource://gre/modules/NotificationDB.jsm"); // lazy module getters -/* global AboutHome:false, AddonWatcher:false, AppConstants: false, +/* global AboutHome:false, AddonWatcher:false, BrowserUITelemetry:false, BrowserUsageTelemetry:false, BrowserUtils:false, CastingApps:false, CharsetMenu:false, Color:false, ContentSearch:false, Deprecated:false, E10SUtils:false, FormValidationHandler:false, @@ -38,7 +38,6 @@ Cu.import("resource://gre/modules/NotificationDB.jsm"); [ ["AboutHome", "resource:///modules/AboutHome.jsm"], ["AddonWatcher", "resource://gre/modules/AddonWatcher.jsm"], - ["AppConstants", "resource://gre/modules/AppConstants.jsm"], ["BrowserUITelemetry", "resource:///modules/BrowserUITelemetry.jsm"], ["BrowserUsageTelemetry", "resource:///modules/BrowserUsageTelemetry.jsm"], ["BrowserUtils", "resource://gre/modules/BrowserUtils.jsm"], @@ -2572,8 +2571,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"); } @@ -6680,6 +6684,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/base/content/test/captivePortal/browser_CaptivePortalWatcher.js b/browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js index e9c0fad6dad0..c37f3cb8d254 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 diff --git a/browser/base/content/test/general/browser_syncui.js b/browser/base/content/test/general/browser_syncui.js index 29954278ed99..71074ef5ed97 100644 --- a/browser/base/content/test/general/browser_syncui.js +++ b/browser/base/content/test/general/browser_syncui.js @@ -6,7 +6,7 @@ var {Weave} = Cu.import("resource://services-sync/main.js", {}); var stringBundle = Cc["@mozilla.org/intl/stringbundle;1"] .getService(Ci.nsIStringBundleService) - .createBundle("chrome://weave/locale/services/sync.properties"); + .createBundle("chrome://weave/locale/sync.properties"); // ensure test output sees log messages. Log.repository.getLogger("browserwindow.syncui").addAppender(new Log.DumpAppender()); 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; 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] diff --git a/browser/base/content/test/static/browser.ini b/browser/base/content/test/static/browser.ini index 25760848bf62..75fb4b904b64 100644 --- a/browser/base/content/test/static/browser.ini +++ b/browser/base/content/test/static/browser.ini @@ -2,6 +2,8 @@ support-files = head.js +[browser_all_files_referenced.js] +skip-if = debug # no point in running on both opt and debug, and will likely intermittently timeout on debug [browser_misused_characters_in_strings.js] support-files = bug1262648_string_with_newlines.dtd diff --git a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js new file mode 100644 index 000000000000..e72d5d2d0603 --- /dev/null +++ b/browser/base/content/test/static/browser_all_files_referenced.js @@ -0,0 +1,498 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +var isDevtools = SimpleTest.harnessParameters.subsuite == "devtools"; + +var gExceptionPaths = ["chrome://browser/content/defaultthemes/", + "chrome://browser/locale/searchplugins/"]; + +var whitelist = new Set([ + // browser/extensions/pdfjs/content/PdfStreamConverter.jsm + {file: "chrome://pdf.js/locale/chrome.properties"}, + {file: "chrome://pdf.js/locale/viewer.properties"}, + + // security/manager/pki/resources/content/device_manager.js + {file: "chrome://pippki/content/load_device.xul"}, + + // browser/modules/ReaderParent.jsm + {file: "chrome://browser/skin/reader-tour.png"}, + {file: "chrome://browser/skin/reader-tour@2x.png"}, + + // Used by setting this url as a pref in about:config + {file: "chrome://browser/content/newtab/alternativeDefaultSites.json"}, + + // Add-on compat + {file: "chrome://browser/skin/devtools/common.css"}, + {file: "chrome://global/content/XPCNativeWrapper.js"}, + {file: "chrome://global/locale/brand.dtd"}, + + // The l10n build system can't package string files only for some platforms. + // See bug 1339424 for why this is hard to fix. + {file: "chrome://global/locale/fallbackMenubar.properties", + platforms: ["linux", "win"]}, + {file: "chrome://global/locale/printPageSetup.dtd", platforms: ["macosx"]}, + {file: "chrome://global/locale/printPreviewProgress.dtd", + platforms: ["macosx"]}, + {file: "chrome://global/locale/printProgress.dtd", platforms: ["macosx"]}, + {file: "chrome://global/locale/printdialog.dtd", + platforms: ["macosx", "win"]}, + {file: "chrome://global/locale/printjoboptions.dtd", + platforms: ["macosx", "win"]}, + + // services/cloudsync/CloudSyncLocal.jsm + {file: "chrome://weave/locale/errors.properties"}, + + // devtools/client/inspector/bin/dev-server.js + {file: "chrome://devtools/content/inspector/markup/markup.xhtml", + isFromDevTools: true}, + + // Starting from here, files in the whitelist are bugs that need fixing. + // Bug 1339420 + {file: "chrome://branding/content/icon128.png"}, + // Bug 1339424 (wontfix?) + {file: "chrome://browser/locale/taskbar.properties", + platforms: ["linux", "macosx"]}, + // Bug 1320156 + {file: "chrome://browser/skin/Privacy-16.png", platforms: ["linux"]}, + // Bug 1343584 + {file: "chrome://browser/skin/click-to-play-warning-stripes.png"}, + // Bug 1343824 + {file: "chrome://browser/skin/customizableui/customize-illustration-rtl@2x.png", + platforms: ["linux", "win"]}, + {file: "chrome://browser/skin/customizableui/customize-illustration@2x.png", + platforms: ["linux", "win"]}, + {file: "chrome://browser/skin/customizableui/info-icon-customizeTip@2x.png", + platforms: ["linux", "win"]}, + {file: "chrome://browser/skin/customizableui/panelarrow-customizeTip@2x.png", + platforms: ["linux", "win"]}, + // Bug 1320058 + {file: "chrome://browser/skin/preferences/saveFile.png", platforms: ["win"]}, + // Bug 1348369 + {file: "chrome://formautofill/content/editProfile.xhtml"}, + // Bug 1316187 + {file: "chrome://global/content/customizeToolbar.xul"}, + // Bug 1343837 + {file: "chrome://global/content/findUtils.js"}, + // Bug 1343843 + {file: "chrome://global/content/url-classifier/unittests.xul"}, + // Bug 1343839 + {file: "chrome://global/locale/headsUpDisplay.properties"}, + // Bug 1348358 + {file: "chrome://global/skin/arrow.css"}, + {file: "chrome://global/skin/arrow/arrow-dn-sharp.gif", + platforms: ["linux", "win"]}, + {file: "chrome://global/skin/arrow/arrow-down.png", + platforms: ["linux", "win"]}, + {file: "chrome://global/skin/arrow/arrow-lft-sharp-end.gif"}, + {file: "chrome://global/skin/arrow/arrow-lft-sharp.gif", + platforms: ["linux", "win"]}, + {file: "chrome://global/skin/arrow/arrow-rit-sharp-end.gif"}, + {file: "chrome://global/skin/arrow/arrow-rit-sharp.gif", + platforms: ["linux", "win"]}, + {file: "chrome://global/skin/arrow/arrow-up-sharp.gif", + platforms: ["linux", "win"]}, + {file: "chrome://global/skin/arrow/panelarrow-horizontal.svg", + platforms: ["linux"]}, + {file: "chrome://global/skin/arrow/panelarrow-vertical.svg", + platforms: ["linux"]}, + // Bug 1348529 + {file: "chrome://global/skin/checkbox/cbox-check-dis.gif", + platforms: ["linux"]}, + {file: "chrome://global/skin/checkbox/cbox-check.gif", platforms: ["linux"]}, + // Bug 1348359 + {file: "chrome://global/skin/dirListing/folder.png", platforms: ["linux"]}, + {file: "chrome://global/skin/dirListing/local.png", platforms: ["linux", "win"]}, + {file: "chrome://global/skin/dirListing/remote.png"}, + {file: "chrome://global/skin/dirListing/up.png", platforms: ["linux"]}, + // Bug 1348362 + {file: "chrome://global/skin/icons/Close.gif", platforms: ["win"]}, + {file: "chrome://global/skin/icons/Error.png", platforms: ["linux", "macosx"]}, + {file: "chrome://global/skin/icons/Landscape.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Minimize.gif", platforms: ["win"]}, + {file: "chrome://global/skin/icons/Portrait.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Print-preview.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Question.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Restore.gif", platforms: ["win"]}, + {file: "chrome://global/skin/icons/Search-close.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Search-glass.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/Warning.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/checkbox.png", platforms: ["macosx"]}, + {file: "chrome://global/skin/icons/checkbox@2x.png", platforms: ["macosx"]}, + {file: "chrome://global/skin/icons/close-inverted.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/close-inverted@2x.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/close.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/close@2x.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/collapse.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/error-64.png", platforms: ["linux", "win"]}, + {file: "chrome://global/skin/icons/error-large.png", platforms: ["macosx"]}, + {file: "chrome://global/skin/icons/expand.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/folder-item.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/question-large.png", platforms: ["macosx"]}, + {file: "chrome://global/skin/icons/warning-32.png", platforms: ["macosx"]}, + {file: "chrome://global/skin/icons/warning-64.png", platforms: ["linux", "win"]}, + {file: "chrome://global/skin/icons/warning-large.png", platforms: ["linux"]}, + {file: "chrome://global/skin/icons/windowControls.png", platforms: ["linux"]}, + // Bug 1348521 + {file: "chrome://global/skin/linkTree.css"}, + // Bug 1348522 + {file: "chrome://global/skin/media/clicktoplay-bgtexture.png"}, + {file: "chrome://global/skin/media/videoClickToPlayButton.svg"}, + // Bug 1348524 + {file: "chrome://global/skin/notification/close.png", platforms: ["macosx"]}, + // Bug 1348525 + {file: "chrome://global/skin/splitter/grip-bottom.gif", platforms: ["linux"]}, + {file: "chrome://global/skin/splitter/grip-left.gif", platforms: ["linux"]}, + {file: "chrome://global/skin/splitter/grip-right.gif", platforms: ["linux"]}, + {file: "chrome://global/skin/splitter/grip-top.gif", platforms: ["linux"]}, + // Bug 1348526 + {file: "chrome://global/skin/tree/sort-asc-classic.png", platforms: ["linux"]}, + {file: "chrome://global/skin/tree/sort-asc.png", platforms: ["linux"]}, + {file: "chrome://global/skin/tree/sort-dsc-classic.png", platforms: ["linux"]}, + {file: "chrome://global/skin/tree/sort-dsc.png", platforms: ["linux"]}, + // Bug 1344267 + {file: "chrome://marionette/content/test_anonymous_content.xul"}, + {file: "chrome://marionette/content/test_dialog.properties"}, + {file: "chrome://marionette/content/test_dialog.xul"}, + // Bug 1348532 + {file: "chrome://mozapps/content/extensions/list.xul"}, + // Bug 1348533 + {file: "chrome://mozapps/skin/downloads/buttons.png", platforms: ["macosx"]}, + {file: "chrome://mozapps/skin/downloads/downloadButtons.png", platforms: ["linux", "win"]}, + // Bug 1348555 + {file: "chrome://mozapps/skin/extensions/dictionaryGeneric-16.png"}, + {file: "chrome://mozapps/skin/extensions/search.png", platforms: ["macosx"]}, + {file: "chrome://mozapps/skin/extensions/themeGeneric-16.png"}, + // Bug 1348556 + {file: "chrome://mozapps/skin/plugins/pluginBlocked.png"}, + // Bug 1348558 + {file: "chrome://mozapps/skin/update/downloadButtons.png", + platforms: ["linux"]}, + // Bug 1348559 + {file: "chrome://pippki/content/resetpassword.xul"}, + // Bug 1348562 + {file: "chrome://devtools/skin/images/debugging-devices.svg", + isFromDevTools: true}, + {file: "chrome://devtools/skin/images/fast-forward.svg", + isFromDevTools: true}, + {file: "chrome://devtools/skin/images/firebug/spinner.png", + isFromDevTools: true}, + {file: "chrome://devtools/skin/images/noise.png", + isFromDevTools: true}, + +].filter(item => + ("isFromDevTools" in item) == isDevtools && + (!item.platforms || item.platforms.includes(AppConstants.platform)) +).map(item => item.file)); + +const ignorableWhitelist = new Set([ + // chrome://xslt-qa/ isn't referenced, but isn't included in packaged builds, + // so it's fine to just ignore it and ignore if the exceptions are unused. + "chrome://xslt-qa/content/buster/result-view.xul", + "chrome://xslt-qa/content/xslt-qa-overlay.xul", + // The communicator.css file is kept for add-on backward compat, but it is + // referenced by something in xslt-qa, so the exception won't be used when + // running the test on a local non-packaged build. + "chrome://communicator/skin/communicator.css", + + // These 2 files are unreferenced only when building without the crash + // reporter (eg. Linux x64 asan builds on treeherder) + "chrome://global/locale/crashes.dtd", + "chrome://global/locale/crashes.properties", +]); +for (let entry of ignorableWhitelist) + whitelist.add(entry); + +const gInterestingCategories = new Set([ + "agent-style-sheets", "webextension-scripts", + "webextension-schemas", "webextension-scripts-addon", + "webextension-scripts-content", "webextension-scripts-devtools" +]); + +var gChromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] + .getService(Ci.nsIChromeRegistry); +var gChromeMap = new Map(); +var gOverrideMap = new Map(); +var gReferencesFromCode = new Set(); + +function getBaseUriForChromeUri(chromeUri) { + let chromeFile = chromeUri + "gobbledygooknonexistentfile.reallynothere"; + let uri = Services.io.newURI(chromeFile); + let fileUri = gChromeReg.convertChromeURL(uri); + return fileUri.resolve("."); +} + +function parseManifest(manifestUri) { + return fetchFile(manifestUri.spec).then(data => { + for (let line of data.split("\n")) { + let [type, ...argv] = line.split(/\s+/); + if (type == "content" || type == "skin" || type == "locale") { + let chromeUri = `chrome://${argv[0]}/${type}/`; + gChromeMap.set(getBaseUriForChromeUri(chromeUri), chromeUri); + } else if (type == "override" || type == "overlay") { + // Overlays aren't really overrides, but behave the same in + // that the overlay is only referenced if the original xul + // file is referenced somewhere. + let os = "os=" + Services.appinfo.OS; + if (!argv.some(s => s.startsWith("os=") && s != os)) { + gOverrideMap.set(Services.io.newURI(argv[1]).specIgnoringRef, + Services.io.newURI(argv[0]).specIgnoringRef); + } + } else if (type == "category" && gInterestingCategories.has(argv[0])) { + gReferencesFromCode.add(argv[2]); + } + } + }); +} + +function parseCSSFile(fileUri) { + return fetchFile(fileUri.spec).then(data => { + for (let line of data.split("\n")) { + let urls = line.match(/url\([^()]+\)/g); + if (!urls) { + // @import rules can take a string instead of a url. + let importMatch = line.match(/@import ['"]?([^'"]*)['"]?/); + if (importMatch && importMatch[1]) { + let url = Services.io.newURI(importMatch[1], null, fileUri).spec; + gReferencesFromCode.add(convertToChromeUri(url)); + } + continue; + } + + for (let url of urls) { + // Remove the url(" prefix and the ") suffix. + url = url.replace(/url\(([^)]*)\)/, "$1") + .replace(/^"(.*)"$/, "$1") + .replace(/^'(.*)'$/, "$1"); + if (url.startsWith("data:")) + continue; + + try { + url = Services.io.newURI(url, null, fileUri).specIgnoringRef; + gReferencesFromCode.add(convertToChromeUri(url)); + } catch (e) { + ok(false, "unexpected error while resolving this URI: " + url); + } + } + } + }); +} + +function parseCodeFile(fileUri) { + return fetchFile(fileUri.spec).then(data => { + for (let line of data.split("\n")) { + let urls = + line.match(/["']chrome:\/\/[a-zA-Z0-9 -]+\/(content|skin|locale)\/[^"' ]*["']/g); + if (!urls) { + // If there's no absolute chrome URL, look for relative ones in + // src and href attributes. + let match = line.match("(?:src|href)=[\"']([^$&\"']+)"); + if (match && match[1]) { + let url = Services.io.newURI(match[1], null, fileUri).spec; + gReferencesFromCode.add(convertToChromeUri(url)); + } + + if (isDevtools) { + // Handle usage of devtools' LocalizationHelper object + match = line.match('"devtools/client/locales/([^/.]+).properties"'); + if (match && match[1]) { + gReferencesFromCode.add("chrome://devtools/locale/" + + match[1] + ".properties"); + } + + match = line.match('"devtools/shared/locales/([^/.]+).properties"'); + if (match && match[1]) { + gReferencesFromCode.add("chrome://devtools-shared/locale/" + + match[1] + ".properties"); + } + } + continue; + } + + for (let url of urls) { + // Remove quotes. + url = url.slice(1, -1); + // Remove ? or \ trailing characters. + if (url.endsWith("?") || url.endsWith("\\")) + url = url.slice(0, -1); + + // Make urls like chrome://browser/skin/ point to an actual file, + // and remove the ref if any. + url = Services.io.newURI(url).specIgnoringRef; + + gReferencesFromCode.add(url); + } + } + }); +} + +function convertToChromeUri(fileUri) { + let baseUri = fileUri; + let path = ""; + while (true) { + let slashPos = baseUri.lastIndexOf("/", baseUri.length - 2); + if (slashPos <= 0) { + // File not accessible from chrome protocol, + // TODO: bug 1349005 handle resource:// urls. + return fileUri; + } + path = baseUri.slice(slashPos + 1) + path; + baseUri = baseUri.slice(0, slashPos + 1); + if (gChromeMap.has(baseUri)) { + let chromeBaseUri = gChromeMap.get(baseUri); + return `${chromeBaseUri}${path}`; + } + } +} + +function chromeFileExists(aURI) { + let available = 0; + try { + let channel = NetUtil.newChannel({uri: aURI, loadUsingSystemPrincipal: true}); + let stream = channel.open(); + let sstream = Cc["@mozilla.org/scriptableinputstream;1"] + .createInstance(Ci.nsIScriptableInputStream); + sstream.init(stream); + available = sstream.available(); + sstream.close(); + } catch (e) { + if (e.result != Components.results.NS_ERROR_FILE_NOT_FOUND) { + dump("Checking " + aURI + ": " + e + "\n"); + Cu.reportError(e); + } + } + return available > 0; +} + +function findChromeUrlsFromArray(array) { + const prefix = "chrome://"; + // Find the 'c' character... + for (let index = 0; + (index = array.indexOf(prefix.charCodeAt(0), index)) != -1; + ++index) { + // Then ensure we actually have the whole chrome:// prefix. + let found = true; + for (let i = 1; i < prefix.length; ++i) { + if (array[index + i] != prefix.charCodeAt(i)) { + found = false; + break; + } + } + if (!found) + continue; + + // C strings are null terminated, but " also terminates urls + // (nsIndexedToHTML.cpp contains an HTML fragment with several chrome urls) + // Let's also terminate the string on the # character to skip references. + let end = Math.min(array.indexOf(0, index), + array.indexOf('"'.charCodeAt(0), index), + array.indexOf("#".charCodeAt(0), index)); + let string = ""; + for ( ; index < end; ++index) + string += String.fromCharCode(array[index]); + + // Only keep strings that look like real chrome urls. + if (/chrome:\/\/[a-zA-Z09 -]+\/(content|skin|locale)\//.test(string)) + gReferencesFromCode.add(string); + } +} + +add_task(function* checkAllTheFiles() { + let libxulPath = OS.Constants.Path.libxul; + if (AppConstants.platform != "macosx") + libxulPath = OS.Constants.Path.libDir + "/" + libxulPath; + let libxul = yield OS.File.read(libxulPath); + findChromeUrlsFromArray(libxul); + // Handle NS_LITERAL_STRING. + findChromeUrlsFromArray(new Uint16Array(libxul.buffer)); + + const kCodeExtensions = [".xul", ".xml", ".xsl", ".js", ".jsm", ".html", ".xhtml"]; + + let appDir = Services.dirsvc.get("GreD", Ci.nsIFile); + // This asynchronously produces a list of URLs (sadly, mostly sync on our + // test infrastructure because it runs against jarfiles there, and + // our zipreader APIs are all sync) + let uris = yield generateURIsFromDirTree(appDir, [".css", ".manifest", ".json", ".jpg", ".png", ".gif", ".svg", ".dtd", ".properties"].concat(kCodeExtensions)); + + // Parse and remove all manifests from the list. + // NOTE that this must be done before filtering out devtools paths + // so that all chrome paths can be recorded. + let manifestPromises = []; + uris = uris.filter(uri => { + let path = uri.path; + if (path.endsWith(".manifest")) { + manifestPromises.push(parseManifest(uri)); + return false; + } + + return true; + }); + + // Wait for all manifest to be parsed + yield Promise.all(manifestPromises); + + // We build a list of promises that get resolved when their respective + // files have loaded and produced no errors. + let allPromises = []; + + for (let uri of uris) { + let path = uri.path; + if (path.endsWith(".css")) + allPromises.push(parseCSSFile(uri)); + else if (kCodeExtensions.some(ext => path.endsWith(ext))) + allPromises.push(parseCodeFile(uri)); + } + + // Wait for all the files to have actually loaded: + yield Promise.all(allPromises); + + // Keep only chrome:// files, and filter out either the devtools paths or + // the non-devtools paths: + let devtoolsPrefixes = ["chrome://webide/", "chrome://devtools"]; + let chromeFiles = + uris.map(uri => convertToChromeUri(uri.spec)) + .filter(u => u.startsWith("chrome://")) + .filter(u => isDevtools == devtoolsPrefixes.some(prefix => u.startsWith(prefix))); + + let isUnreferenced = + file => !gReferencesFromCode.has(file) && + !gExceptionPaths.some(e => file.startsWith(e)) && + (!gOverrideMap.has(file) || isUnreferenced(gOverrideMap.get(file))); + + let notWhitelisted = file => { + if (!whitelist.has(file)) + return true; + whitelist.delete(file); + return false; + }; + + let unreferencedFiles = + chromeFiles.filter(isUnreferenced).filter(notWhitelisted).sort(); + + is(unreferencedFiles.length, 0, "there should be no unreferenced files"); + for (let file of unreferencedFiles) + ok(false, "unreferenced chrome file: " + file); + + for (let file of whitelist) { + if (ignorableWhitelist.has(file)) + info("ignored unused whitelist entry: " + file); + else + ok(false, "unused whitelist entry: " + file); + } + + for (let file of gReferencesFromCode) { + if (isDevtools != devtoolsPrefixes.some(prefix => file.startsWith(prefix))) + continue; + + if (file.startsWith("chrome://") && !chromeFileExists(file)) { + // Ignore chrome prefixes that have been automatically expanded. + let pathParts = + file.match("chrome://([^/]+)/content/([^/.]+)\.xul") || + file.match("chrome://([^/]+)/skin/([^/.]+)\.css"); + if (!pathParts || pathParts[1] != pathParts[2]) { + // TODO: bug 1349010 - add a whitelist and make this reliable enough + // that we could make the test fail when this catches something new. + info("missing file with code reference: " + file); + } + } + } +}); diff --git a/browser/base/content/test/static/browser_misused_characters_in_strings.js b/browser/base/content/test/static/browser_misused_characters_in_strings.js index b18fcf6ff015..b6bbd4f53bdd 100644 --- a/browser/base/content/test/static/browser_misused_characters_in_strings.js +++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js @@ -129,30 +129,6 @@ function ignoredError(filepath, key, type) { return false; } -function fetchFile(uri) { - return new Promise((resolve, reject) => { - let xhr = new XMLHttpRequest(); - xhr.responseType = "text"; - xhr.open("GET", uri, true); - xhr.onreadystatechange = function() { - if (this.readyState != this.DONE) { - return; - } - try { - resolve(this.responseText); - } catch (ex) { - ok(false, `Script error reading ${uri}: ${ex}`); - resolve(""); - } - }; - xhr.onerror = error => { - ok(false, `XHR error reading ${uri}: ${error}`); - resolve(""); - }; - xhr.send(null); - }); -} - function testForError(filepath, key, str, pattern, type, helpText) { if (str.match(pattern) && !ignoredError(filepath, key, type)) { diff --git a/browser/base/content/test/static/browser_parsable_css.js b/browser/base/content/test/static/browser_parsable_css.js index c49aa7513a63..4a99bacd3ee7 100644 --- a/browser/base/content/test/static/browser_parsable_css.js +++ b/browser/base/content/test/static/browser_parsable_css.js @@ -107,30 +107,6 @@ function once(target, name) { }); } -function fetchFile(uri) { - return new Promise((resolve, reject) => { - let xhr = new XMLHttpRequest(); - xhr.responseType = "text"; - xhr.open("GET", uri, true); - xhr.onreadystatechange = function() { - if (this.readyState != this.DONE) { - return; - } - try { - resolve(this.responseText); - } catch (ex) { - ok(false, `Script error reading ${uri}: ${ex}`); - resolve(""); - } - }; - xhr.onerror = error => { - ok(false, `XHR error reading ${uri}: ${error}`); - resolve(""); - }; - xhr.send(null); - }); -} - var gChromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] .getService(Ci.nsIChromeRegistry); var gChromeMap = new Map(); diff --git a/browser/base/content/test/static/head.js b/browser/base/content/test/static/head.js index 85695a617c80..5b10e0f1ced2 100644 --- a/browser/base/content/test/static/head.js +++ b/browser/base/content/test/static/head.js @@ -125,3 +125,27 @@ function* generateEntriesFromJarFile(jarFile, extension) { } zr.close(); } + +function fetchFile(uri) { + return new Promise((resolve, reject) => { + let xhr = new XMLHttpRequest(); + xhr.responseType = "text"; + xhr.open("GET", uri, true); + xhr.onreadystatechange = function() { + if (this.readyState != this.DONE) { + return; + } + try { + resolve(this.responseText); + } catch (ex) { + ok(false, `Script error reading ${uri}: ${ex}`); + resolve(""); + } + }; + xhr.onerror = error => { + ok(false, `XHR error reading ${uri}: ${error}`); + resolve(""); + }; + xhr.send(null); + }); +} 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 { 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(); +}); 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/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/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/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/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: 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; } 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] 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"); } 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/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); }; 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] 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 + + + + + + + + + + diff --git a/dom/smil/nsSMILAnimationController.cpp b/dom/smil/nsSMILAnimationController.cpp index 45f58bca8c97..ebe142a808f3 100644 --- a/dom/smil/nsSMILAnimationController.cpp +++ b/dom/smil/nsSMILAnimationController.cpp @@ -385,6 +385,8 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers) // Create the compositor table nsAutoPtr currentCompositorTable(new nsSMILCompositorTable(0)); + nsTArray> + animElems(mAnimationElementTable.Count()); for (auto iter = mAnimationElementTable.Iter(); !iter.Done(); iter.Next()) { SVGAnimationElement* animElem = iter.Get()->GetKey(); @@ -392,6 +394,7 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers) AddAnimationToCompositorTable(animElem, currentCompositorTable, isStyleFlushNeeded); + animElems.AppendElement(animElem); } activeContainers.Clear(); 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/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/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 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/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); diff --git a/gfx/layers/apz/test/mochitest/helper_bug1346632.html b/gfx/layers/apz/test/mochitest/helper_bug1346632.html new file mode 100644 index 000000000000..ab3653887c0f --- /dev/null +++ b/gfx/layers/apz/test/mochitest/helper_bug1346632.html @@ -0,0 +1,77 @@ + + + + + + Dragging the scrollbar on a page with a fixed-positioned element just past the right edge of the content + + + + + + + +
+

+
+ + 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()) { diff --git a/gfx/layers/apz/util/APZCCallbackHelper.cpp b/gfx/layers/apz/util/APZCCallbackHelper.cpp index 382d0f04d3b4..8ad1d144b101 100644 --- a/gfx/layers/apz/util/APZCCallbackHelper.cpp +++ b/gfx/layers/apz/util/APZCCallbackHelper.cpp @@ -628,8 +628,15 @@ PrepareForSetTargetAPZCNotification(nsIWidget* aWidget, ScrollableLayerGuid guid(aGuid.mLayersId, 0, FrameMetrics::NULL_SCROLL_ID); nsPoint point = nsLayoutUtils::GetEventCoordinatesRelativeTo(aWidget, aRefPoint, aRootFrame); + uint32_t flags = 0; +#ifdef MOZ_WIDGET_ANDROID + // On Android, we need IGNORE_ROOT_SCROLL_FRAME for correct hit testing + // when zoomed out. On desktop, don't use it because it interferes with + // hit testing for some purposes such as scrollbar dragging. + flags = nsLayoutUtils::IGNORE_ROOT_SCROLL_FRAME; +#endif nsIFrame* target = - nsLayoutUtils::GetFrameForPoint(aRootFrame, point, nsLayoutUtils::IGNORE_ROOT_SCROLL_FRAME); + nsLayoutUtils::GetFrameForPoint(aRootFrame, point, flags); nsIScrollableFrame* scrollAncestor = target ? nsLayoutUtils::GetAsyncScrollableAncestorFrame(target) : aRootFrame->PresContext()->PresShell()->GetRootScrollFrameAsScrollable(); 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 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/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/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 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. 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"], []], 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/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/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; }; 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] 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/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, 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/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/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())); diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index 5270c17eecb9..33feced1aee4 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -552,7 +552,7 @@ PrintSingleError(JSContext* cx, FILE* file, JS::ConstUTF8CharsZ toStringResult, const char* kindPrefix = nullptr; switch (kind) { case PrintErrorKind::Error: - break; + MOZ_CRASH("unreachable"); case PrintErrorKind::Warning: kindPrefix = "warning"; break; 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/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())); } 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: 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; } diff --git a/js/src/wasm/WasmIonCompile.cpp b/js/src/wasm/WasmIonCompile.cpp index 393d10763cf4..f49e2ddbf5ea 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 (!f.inDeadCode() && !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 (!f.inDeadCode() && !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 (!f.inDeadCode() && !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 (!f.inDeadCode() && !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 (!f.inDeadCode() && !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 (!f.inDeadCode() && !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 diff --git a/layout/base/GeckoRestyleManager.cpp b/layout/base/GeckoRestyleManager.cpp index f20b84c88486..3b161914df97 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. @@ -1515,7 +1514,7 @@ ElementRestyler::ConditionallyRestyleUndisplayedNodes( } for (UndisplayedNode* undisplayed = aUndisplayed; undisplayed; - undisplayed = undisplayed->mNext) { + undisplayed = undisplayed->getNext()) { if (!undisplayed->mContent->IsElement()) { continue; @@ -3174,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/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/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); 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/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 93c3c5e2edf0..d89d122c2f4a 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -1172,12 +1172,8 @@ SyncViewsAndInvalidateDescendants(nsIFrame* aFrame, nsChangeHint aChange) nsChangeHint_SchedulePaint)), "Invalid change flag"); - nsView* view = aFrame->GetView(); - if (view) { - if (aChange & nsChangeHint_SyncFrameView) { - nsContainerFrame::SyncFrameViewProperties(aFrame->PresContext(), aFrame, - nullptr, view); - } + if (aChange & nsChangeHint_SyncFrameView) { + aFrame->SyncFrameViewProperties(); } nsIFrame::ChildListIterator lists(aFrame); 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, diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 60aea641c4f8..1b18cb2477a9 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -2732,8 +2732,7 @@ nsCSSFrameConstructor::ConstructRootFrame() nsView* rootView = mPresShell->GetViewManager()->GetRootView(); viewportFrame->SetView(rootView); - nsContainerFrame::SyncFrameViewProperties(mPresShell->GetPresContext(), viewportFrame, - viewportPseudoStyle, rootView); + viewportFrame->SyncFrameViewProperties(rootView); nsContainerFrame::SyncWindowProperties(mPresShell->GetPresContext(), viewportFrame, rootView, nullptr, nsContainerFrame::SET_ASYNC); @@ -3215,7 +3214,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, @@ -3241,10 +3240,6 @@ nsCSSFrameConstructor::InitializeSelectFrame(nsFrameConstructorState& aState, aStyleContext, aParentFrame); } - if (aBuildCombobox) { - nsContainerFrame::CreateViewForFrame(scrollFrame, true); - } - BuildScrollFrame(aState, aContent, aStyleContext, scrolledFrame, geometricParent, scrollFrame); @@ -3261,7 +3256,6 @@ nsCSSFrameConstructor::InitializeSelectFrame(nsFrameConstructorState& aState, // Set the scrolled frame's initial child lists scrolledFrame->SetInitialChildList(kPrincipalList, childItems); - return NS_OK; } nsIFrame* @@ -3930,8 +3924,6 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt frameToAddToList = scrollframe; } else { InitAndRestoreFrame(aState, content, geometricParent, newFrame); - // See whether we need to create a view - nsContainerFrame::CreateViewForFrame(newFrame, false); frameToAddToList = newFrame; } @@ -6264,16 +6256,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 +6515,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 +6598,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 +7373,7 @@ nsCSSFrameConstructor::MaybeRecreateForFrameset(nsIFrame* aParentFrame, return false; } -nsresult +void nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, nsIContent* aFirstNewContent, bool aAllowLazyConstruction, @@ -7429,8 +7419,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (tag == nsGkAtoms::treechildren || tag == nsGkAtoms::treeitem || tag == nsGkAtoms::treerow) - return NS_OK; - + return; } #endif // MOZ_XUL @@ -7443,10 +7432,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 +7455,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } if (aAllowLazyConstruction && @@ -7474,7 +7463,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 +7478,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 +7492,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 +7607,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 +7693,6 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer, aFirstNewContent, nullptr); } #endif - - return NS_OK; } #ifdef MOZ_XUL @@ -7748,17 +7735,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 +7766,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 +7824,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 +7833,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, IssueSingleInsertNofications(aContainer, aStartChild, aEndChild, aAllowLazyConstruction); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } } #endif // MOZ_XUL @@ -7861,7 +7848,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 +7885,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, } #endif - return NS_OK; + return; } if (aContainer->HasFlag(NODE_IS_IN_SHADOW_TREE) && @@ -7911,10 +7898,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 +7927,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 +7939,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (isNewlyAddedContentForServo) { aContainer->AsElement()->NoteDirtyDescendantsForServo(); } - return NS_OK; + return; } } @@ -7977,7 +7964,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, } if (!insertion.mParentFrame) { - return NS_OK; + return; } bool isAppend, isRangeInsertSafe; @@ -7991,7 +7978,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 +7987,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 +8004,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 +8019,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 +8118,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, IssueSingleInsertNofications(aContainer, aStartChild, aEndChild, aAllowLazyConstruction); LAYOUT_PHASE_TEMP_REENTER(); - return NS_OK; + return; } container = insertion.mParentFrame->GetContent(); @@ -8200,7 +8186,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 +8357,9 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, aStartChild, aEndChild); } #endif - - return NS_OK; } -nsresult +void nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, nsIContent* aChild, nsIContent* aOldNextSibling, @@ -8415,7 +8399,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 +8425,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 +8433,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 +8450,7 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, if (aFlags == REMOVE_DESTROY_FRAMES) { CaptureStateForFramesOf(aChild, mTempFrameTreeState); } - return NS_OK; + return; } #endif // MOZ_XUL @@ -8506,10 +8488,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 +8503,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 +8523,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 +8537,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 +8554,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 +8601,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 +8689,6 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, } #endif } - - return rv; } /** @@ -8771,12 +8750,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 +8766,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 +8817,6 @@ nsCSSFrameConstructor::CharacterDataChanged(nsIContent* aContent, RecoverLetterFrames(block); } } - - return rv; } void @@ -9507,12 +9483,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 +9504,7 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame, } #endif - *aResult = ReframeContainingBlock(aFrame, aFlags, aDestroyedFramesFor); + ReframeContainingBlock(aFrame, aFlags, aDestroyedFramesFor); return true; } @@ -9539,8 +9513,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 +9527,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 +9561,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 +9591,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 +9608,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 +9632,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 +9651,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 +9660,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 +9672,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 +9709,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 +9726,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 +9792,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 +9819,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 +9830,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 +11241,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 +11250,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 +11379,6 @@ nsCSSFrameConstructor::InsertFirstLineFrames( } #endif - return rv; } //---------------------------------------------------------------------- @@ -11737,7 +11705,7 @@ FindFirstLetterFrame(nsIFrame* aFrame, nsIFrame::ChildListID aListID) return nullptr; } -nsresult +void nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( nsIPresShell* aPresShell, nsIFrame* aBlockFrame) @@ -11749,7 +11717,7 @@ nsCSSFrameConstructor::RemoveFloatingFirstLetterFrames( floatFrame = ::FindFirstLetterFrame(aBlockFrame, nsIFrame::kPushedFloatsList); if (!floatFrame) { - return NS_OK; + return; } } @@ -11757,19 +11725,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 +11746,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 +11791,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 +11866,9 @@ nsCSSFrameConstructor::RemoveFirstLetterFrames(nsIPresShell* aPresShell, prevSibling = kid; kid = kid->GetNextSibling(); } - - return NS_OK; } -nsresult +void nsCSSFrameConstructor::RemoveLetterFrames(nsIPresShell* aPresShell, nsContainerFrame* aBlockFrame) { @@ -11913,20 +11877,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 +11929,7 @@ nsCSSFrameConstructor::RecoverLetterFrames(nsContainerFrame* aBlockFrame) // listbox Widget Routines -nsresult +void nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, nsIFrame* aPrevFrame, nsIContent* aChild, @@ -11977,8 +11937,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 +11960,7 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, if (StyleDisplay::None == display->mDisplay) { *aNewFrame = nullptr; - return NS_OK; + return; } BeginUpdate(); @@ -12021,9 +11979,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 +11996,6 @@ nsCSSFrameConstructor::CreateListBoxContent(nsContainerFrame* aParentFrame, } #endif } - - return rv; -#else - return NS_ERROR_FAILURE; #endif } @@ -12815,7 +12769,7 @@ nsCSSFrameConstructor::WipeContainingBlock(nsFrameConstructorState& aState, return true; } -nsresult +void nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame, RemoveFlags aFlags, nsIContent** aDestroyedFramesFor) @@ -12838,7 +12792,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 +12824,7 @@ nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame, true, aFlags, nullptr); } -nsresult +void nsCSSFrameConstructor::GenerateChildFrames(nsContainerFrame* aFrame) { { @@ -12905,8 +12859,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/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/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 1086e331b28a..0d9184734640 100644 --- a/layout/base/nsFrameManager.h +++ b/layout/base/nsFrameManager.h @@ -33,32 +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) + : mContent(aContent) + , mStyle(aStyle) { MOZ_COUNT_CTOR(mozilla::UndisplayedNode); } - ~UndisplayedNode() - { - MOZ_COUNT_DTOR(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; - } - } - - nsCOMPtr mContent; - RefPtr mStyle; - UndisplayedNode* mNext; + nsCOMPtr mContent; + RefPtr mStyle; }; } // namespace mozilla @@ -75,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; @@ -99,7 +85,7 @@ public: void RegisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame); void UnregisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame); - void ClearPlaceholderFrameMap(); + void ClearPlaceholderFrameMap(); // Mapping undisplayed content nsStyleContext* GetUndisplayedContent(const nsIContent* aContent) @@ -156,8 +142,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 +157,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 +187,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); 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 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/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 0622b5d818d4..4e10c617b805 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -93,6 +93,7 @@ NS_IMPL_FRAMEARENA_HELPERS(nsListControlFrame) //--------------------------------------------------------- nsListControlFrame::nsListControlFrame(nsStyleContext* aContext) : nsHTMLScrollFrame(aContext, false), + mView(nullptr), mMightNeedSecondPass(false), mHasPendingInterruptAtStartOfReflow(false), mDropdownCanGrow(false), @@ -975,6 +976,11 @@ nsListControlFrame::Init(nsIContent* aContent, { nsHTMLScrollFrame::Init(aContent, aParent, aPrevInFlow); + if (IsInDropDownMode()) { + AddStateBits(NS_FRAME_IN_POPUP); + CreateView(); + } + // we shouldn't have to unregister this listener because when // our frame goes away all these content node go away as well // because our frame is the only one who references them. @@ -996,10 +1002,6 @@ nsListControlFrame::Init(nsIContent* aContent, mEndSelectionIndex = kNothingSelected; mLastDropdownBackstopColor = PresContext()->DefaultBackgroundColor(); - - if (IsInDropDownMode()) { - AddStateBits(NS_FRAME_IN_POPUP); - } } dom::HTMLOptionsCollection* diff --git a/layout/forms/nsListControlFrame.h b/layout/forms/nsListControlFrame.h index 152130ea4ff2..e4e177b322e6 100644 --- a/layout/forms/nsListControlFrame.h +++ b/layout/forms/nsListControlFrame.h @@ -239,11 +239,6 @@ public: */ bool GetDropdownCanGrow() const { return mDropdownCanGrow; } - /** - * Dropdowns need views - */ - virtual bool NeedsView() override { return IsInDropDownMode(); } - /** * Frees statics owned by this class. */ @@ -398,16 +393,23 @@ protected: */ uint32_t GetNumberOfRows(); + nsView* GetViewInternal() const override { return mView; } + void SetViewInternal(nsView* aView) override { mView = aView; } + // Data Members int32_t mStartSelectionIndex; int32_t mEndSelectionIndex; - nsIComboboxControlFrame *mComboboxFrame; - uint32_t mNumDisplayRows; + nsIComboboxControlFrame* mComboboxFrame; + + // The view is only created (& non-null) if IsInDropDownMode() is true. + nsView* mView; + + uint32_t mNumDisplayRows; bool mChangesSinceDragStart:1; bool mButtonDown:1; - // Has the user selected a visible item since we showed the - // dropdown? + + // Has the user selected a visible item since we showed the dropdown? bool mItemSelectionStarted:1; bool mIsAllContentHere:1; 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/ViewportFrame.cpp b/layout/generic/ViewportFrame.cpp index a8638621f96e..f370de4c1fa6 100644 --- a/layout/generic/ViewportFrame.cpp +++ b/layout/generic/ViewportFrame.cpp @@ -39,6 +39,8 @@ ViewportFrame::Init(nsIContent* aContent, nsIFrame* aPrevInFlow) { nsContainerFrame::Init(aContent, aParent, aPrevInFlow); + // No need to call CreateView() here - the frame ctor will call SetView() + // with the ViewManager's root view, so we'll assign it in SetViewInternal(). nsIFrame* parent = nsLayoutUtils::GetCrossDocParentFrame(this); if (parent) { diff --git a/layout/generic/ViewportFrame.h b/layout/generic/ViewportFrame.h index cf650b6e418f..a0c39a27e11a 100644 --- a/layout/generic/ViewportFrame.h +++ b/layout/generic/ViewportFrame.h @@ -31,6 +31,7 @@ public: explicit ViewportFrame(nsStyleContext* aContext) : nsContainerFrame(aContext) + , mView(nullptr) {} virtual ~ViewportFrame() { } // useful for debugging @@ -83,9 +84,6 @@ public: virtual nsresult GetFrameName(nsAString& aResult) const override; #endif -private: - virtual mozilla::layout::FrameChildListID GetAbsoluteListID() const override { return kFixedList; } - protected: /** * Calculate how much room is available for fixed frames. That means @@ -95,6 +93,14 @@ protected: * @return the current scroll position, or 0,0 if not scrollable */ nsPoint AdjustReflowInputForScrollbars(ReflowInput* aReflowInput) const; + + nsView* GetViewInternal() const override { return mView; } + void SetViewInternal(nsView* aView) override { mView = aView; } + +private: + virtual mozilla::layout::FrameChildListID GetAbsoluteListID() const override { return kFixedList; } + + nsView* mView; }; } // namespace mozilla diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp index aeef0de0bd44..be579c802189 100644 --- a/layout/generic/nsContainerFrame.cpp +++ b/layout/generic/nsContainerFrame.cpp @@ -377,92 +377,6 @@ nsContainerFrame::PeekOffsetCharacter(bool aForward, int32_t* aOffset, ///////////////////////////////////////////////////////////////////////////// // Helper member functions -static void -ReparentFrameViewTo(nsIFrame* aFrame, - nsViewManager* aViewManager, - nsView* aNewParentView, - nsView* aOldParentView) -{ - if (aFrame->HasView()) { -#ifdef MOZ_XUL - if (aFrame->GetType() == nsGkAtoms::menuPopupFrame) { - // This view must be parented by the root view, don't reparent it. - return; - } -#endif - nsView* view = aFrame->GetView(); - // Verify that the current parent view is what we think it is - //nsView* parentView; - //NS_ASSERTION(parentView == aOldParentView, "unexpected parent view"); - - aViewManager->RemoveChild(view); - - // The view will remember the Z-order and other attributes that have been set on it. - nsView* insertBefore = nsLayoutUtils::FindSiblingViewFor(aNewParentView, aFrame); - aViewManager->InsertChild(aNewParentView, view, insertBefore, insertBefore != nullptr); - } else if (aFrame->GetStateBits() & NS_FRAME_HAS_CHILD_WITH_VIEW) { - nsIFrame::ChildListIterator lists(aFrame); - for (; !lists.IsDone(); lists.Next()) { - // Iterate the child frames, and check each child frame to see if it has - // a view - nsFrameList::Enumerator childFrames(lists.CurrentList()); - for (; !childFrames.AtEnd(); childFrames.Next()) { - ReparentFrameViewTo(childFrames.get(), aViewManager, - aNewParentView, aOldParentView); - } - } - } -} - -void -nsContainerFrame::CreateViewForFrame(nsIFrame* aFrame, - bool aForce) -{ - if (aFrame->HasView()) { - return; - } - - // If we don't yet have a view, see if we need a view - if (!aForce && !aFrame->NeedsView()) { - // don't need a view - return; - } - - nsView* parentView = aFrame->GetParent()->GetClosestView(); - NS_ASSERTION(parentView, "no parent with view"); - - nsViewManager* viewManager = parentView->GetViewManager(); - NS_ASSERTION(viewManager, "null view manager"); - - // Create a view - nsView* view = viewManager->CreateView(aFrame->GetRect(), parentView); - - SyncFrameViewProperties(aFrame->PresContext(), aFrame, nullptr, view); - - nsView* insertBefore = nsLayoutUtils::FindSiblingViewFor(parentView, aFrame); - // we insert this view 'above' the insertBefore view, unless insertBefore is null, - // in which case we want to call with aAbove == false to insert at the beginning - // in document order - viewManager->InsertChild(parentView, view, insertBefore, insertBefore != nullptr); - - // REVIEW: Don't create a widget for fixed-pos elements anymore. - // ComputeRepaintRegionForCopy will calculate the right area to repaint - // when we scroll. - // Reparent views on any child frames (or their descendants) to this - // view. We can just call ReparentFrameViewTo on this frame because - // we know this frame has no view, so it will crawl the children. Also, - // we know that any descendants with views must have 'parentView' as their - // parent view. - ReparentFrameViewTo(aFrame, viewManager, view, parentView); - - // Remember our view - aFrame->SetView(view); - - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsContainerFrame::CreateViewForFrame: frame=%p view=%p", - aFrame, view)); -} - /** * Position the view associated with |aKidFrame|, if there is one. A * container frame should call this method after positioning a frame, @@ -543,8 +457,9 @@ nsContainerFrame::ReparentFrameView(nsIFrame* aChildFrame, // anything if (oldParentView != newParentView) { // They're not so we need to reparent any child views - ReparentFrameViewTo(aChildFrame, oldParentView->GetViewManager(), newParentView, - oldParentView); + aChildFrame->ReparentFrameViewTo(oldParentView->GetViewManager(), + newParentView, + oldParentView); } return NS_OK; @@ -605,7 +520,7 @@ nsContainerFrame::ReparentFrameViewList(const nsFrameList& aChildFrameList, // They're not so we need to reparent any child views for (nsFrameList::Enumerator e(aChildFrameList); !e.AtEnd(); e.Next()) { - ReparentFrameViewTo(e.get(), viewManager, newParentView, oldParentView); + e.get()->ReparentFrameViewTo(viewManager, newParentView, oldParentView); } } @@ -769,54 +684,6 @@ nsContainerFrame::SyncFrameViewAfterReflow(nsPresContext* aPresContext, } } -void -nsContainerFrame::SyncFrameViewProperties(nsPresContext* aPresContext, - nsIFrame* aFrame, - nsStyleContext* aStyleContext, - nsView* aView, - uint32_t aFlags) -{ - NS_ASSERTION(!aStyleContext || aFrame->StyleContext() == aStyleContext, - "Wrong style context for frame?"); - - if (!aView) { - return; - } - - nsViewManager* vm = aView->GetViewManager(); - - if (nullptr == aStyleContext) { - aStyleContext = aFrame->StyleContext(); - } - - // Make sure visibility is correct. This only affects nsSubdocumentFrame. - if (0 == (aFlags & NS_FRAME_NO_VISIBILITY) && - !aFrame->SupportsVisibilityHidden()) { - // See if the view should be hidden or visible - vm->SetViewVisibility(aView, - aStyleContext->StyleVisibility()->IsVisible() - ? nsViewVisibility_kShow : nsViewVisibility_kHide); - } - - int32_t zIndex = 0; - bool autoZIndex = false; - - if (aFrame->IsAbsPosContainingBlock()) { - // Make sure z-index is correct - const nsStylePosition* position = aStyleContext->StylePosition(); - - if (position->mZIndex.GetUnit() == eStyleUnit_Integer) { - zIndex = position->mZIndex.GetIntValue(); - } else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) { - autoZIndex = true; - } - } else { - autoZIndex = true; - } - - vm->SetViewZIndex(aView, autoZIndex, zIndex); -} - static nscoord GetCoord(const nsStyleCoord& aCoord, nscoord aIfNotCoord) { if (aCoord.ConvertsToLength()) { diff --git a/layout/generic/nsContainerFrame.h b/layout/generic/nsContainerFrame.h index 9d1edd0141c0..2f51a6f52050 100644 --- a/layout/generic/nsContainerFrame.h +++ b/layout/generic/nsContainerFrame.h @@ -155,13 +155,6 @@ public: virtual void DeleteNextInFlowChild(nsIFrame* aNextInFlow, bool aDeletingEmptyFrames); - /** - * Helper method to wrap views around frames. Used by containers - * under special circumstances (can be used by leaf frames as well) - */ - static void CreateViewForFrame(nsIFrame* aFrame, - bool aForce); - // Positions the frame's view based on the frame's origin static void PositionFrameView(nsIFrame* aKidFrame); @@ -198,18 +191,6 @@ public: nsRenderingContext* aRC, uint32_t aFlags); - // Sets the view's attributes from the frame style. - // - visibility - // - clip - // Call this when one of these styles changes or when the view has just - // been created. - // @param aStyleContext can be null, in which case the frame's style context is used - static void SyncFrameViewProperties(nsPresContext* aPresContext, - nsIFrame* aFrame, - nsStyleContext* aStyleContext, - nsView* aView, - uint32_t aFlags = 0); - /** * Converts the minimum and maximum sizes given in inner window app units to * outer window device pixel sizes and assigns these constraints to the widget. diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 94ff50a135a0..956c85c505af 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -690,12 +690,8 @@ nsFrame::DestroyFrom(nsIFrame* aDestructRoot) } } - // Get the view pointer now before the frame properties disappear - // when we call NotifyDestroyingFrame() - nsView* view = GetView(); nsPresContext* presContext = PresContext(); - - nsIPresShell *shell = presContext->GetPresShell(); + nsIPresShell* shell = presContext->GetPresShell(); if (mState & NS_FRAME_OUT_OF_FLOW) { nsPlaceholderFrame* placeholder = shell->FrameManager()->GetPlaceholderFrameFor(this); @@ -785,11 +781,9 @@ nsFrame::DestroyFrom(nsIFrame* aDestructRoot) shell->ClearFrameRefs(this); } + nsView* view = GetView(); if (view) { - // Break association between view and frame view->SetFrame(nullptr); - - // Destroy the view view->Destroy(); } @@ -986,6 +980,120 @@ nsFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext) RemoveStateBits(NS_FRAME_SIMPLE_EVENT_REGIONS); } +void +nsIFrame::ReparentFrameViewTo(nsViewManager* aViewManager, + nsView* aNewParentView, + nsView* aOldParentView) +{ + if (HasView()) { +#ifdef MOZ_XUL + if (GetType() == nsGkAtoms::menuPopupFrame) { + // This view must be parented by the root view, don't reparent it. + return; + } +#endif + nsView* view = GetView(); + // Verify that the current parent view is what we think it is + //nsView* parentView; + //NS_ASSERTION(parentView == aOldParentView, "unexpected parent view"); + + aViewManager->RemoveChild(view); + + // The view will remember the Z-order and other attributes that have been set on it. + nsView* insertBefore = nsLayoutUtils::FindSiblingViewFor(aNewParentView, this); + aViewManager->InsertChild(aNewParentView, view, insertBefore, insertBefore != nullptr); + } else if (GetStateBits() & NS_FRAME_HAS_CHILD_WITH_VIEW) { + nsIFrame::ChildListIterator lists(this); + for (; !lists.IsDone(); lists.Next()) { + // Iterate the child frames, and check each child frame to see if it has + // a view + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + childFrames.get()->ReparentFrameViewTo(aViewManager, aNewParentView, + aOldParentView); + } + } + } +} + +void +nsIFrame::SyncFrameViewProperties(nsView* aView) +{ + if (!aView) { + aView = GetView(); + if (!aView) { + return; + } + } + + nsViewManager* vm = aView->GetViewManager(); + + // Make sure visibility is correct. This only affects nsSubDocumentFrame. + if (!SupportsVisibilityHidden()) { + // See if the view should be hidden or visible + nsStyleContext* sc = StyleContext(); + vm->SetViewVisibility(aView, + sc->StyleVisibility()->IsVisible() + ? nsViewVisibility_kShow : nsViewVisibility_kHide); + } + + int32_t zIndex = 0; + bool autoZIndex = false; + + if (IsAbsPosContainingBlock()) { + // Make sure z-index is correct + nsStyleContext* sc = StyleContext(); + const nsStylePosition* position = sc->StylePosition(); + if (position->mZIndex.GetUnit() == eStyleUnit_Integer) { + zIndex = position->mZIndex.GetIntValue(); + } else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) { + autoZIndex = true; + } + } else { + autoZIndex = true; + } + + vm->SetViewZIndex(aView, autoZIndex, zIndex); +} + +void +nsFrame::CreateView() +{ + MOZ_ASSERT(!HasView()); + + nsView* parentView = GetParent()->GetClosestView(); + MOZ_ASSERT(parentView, "no parent with view"); + + nsViewManager* viewManager = parentView->GetViewManager(); + MOZ_ASSERT(viewManager, "null view manager"); + + nsView* view = viewManager->CreateView(GetRect(), parentView); + SyncFrameViewProperties(view); + + nsView* insertBefore = nsLayoutUtils::FindSiblingViewFor(parentView, this); + // we insert this view 'above' the insertBefore view, unless insertBefore is null, + // in which case we want to call with aAbove == false to insert at the beginning + // in document order + viewManager->InsertChild(parentView, view, insertBefore, insertBefore != nullptr); + + // REVIEW: Don't create a widget for fixed-pos elements anymore. + // ComputeRepaintRegionForCopy will calculate the right area to repaint + // when we scroll. + // Reparent views on any child frames (or their descendants) to this + // view. We can just call ReparentFrameViewTo on this frame because + // we know this frame has no view, so it will crawl the children. Also, + // we know that any descendants with views must have 'parentView' as their + // parent view. + ReparentFrameViewTo(viewManager, view, parentView); + + // Remember our view + SetView(view); + + NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, + ("nsFrame::CreateView: frame=%p view=%p", + this, view)); +} + // MSVC fails with link error "one or more multiply defined symbols found", // gcc fails with "hidden symbol `nsIFrame::kPrincipalList' isn't defined" // etc if they are not defined. @@ -5850,23 +5958,8 @@ nsIFrame* nsIFrame::GetTailContinuation() return frame; } -NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(ViewProperty, nsView) - // Associated view object -nsView* -nsIFrame::GetView() const -{ - // Check the frame state bit and see if the frame has a view - if (!(GetStateBits() & NS_FRAME_HAS_VIEW)) - return nullptr; - - // Check for a property on the frame - nsView* value = Properties().Get(ViewProperty()); - NS_ASSERTION(value, "frame state bit was set but frame has no view"); - return value; -} - -nsresult +void nsIFrame::SetView(nsView* aView) { if (aView) { @@ -5874,8 +5967,7 @@ nsIFrame::SetView(nsView* aView) #ifdef DEBUG nsIAtom* frameType = GetType(); - NS_ASSERTION(frameType == nsGkAtoms::scrollFrame || - frameType == nsGkAtoms::subDocumentFrame || + NS_ASSERTION(frameType == nsGkAtoms::subDocumentFrame || frameType == nsGkAtoms::listControlFrame || frameType == nsGkAtoms::objectFrame || frameType == nsGkAtoms::viewportFrame || @@ -5883,8 +5975,8 @@ nsIFrame::SetView(nsView* aView) "Only specific frame types can have an nsView"); #endif - // Set a property on the frame - Properties().Set(ViewProperty(), aView); + // Store the view on the frame. + SetViewInternal(aView); // Set the frame state bit that says the frame has a view AddStateBits(NS_FRAME_HAS_VIEW); @@ -5894,9 +5986,11 @@ nsIFrame::SetView(nsView* aView) f && !(f->GetStateBits() & NS_FRAME_HAS_CHILD_WITH_VIEW); f = f->GetParent()) f->AddStateBits(NS_FRAME_HAS_CHILD_WITH_VIEW); + } else { + MOZ_ASSERT_UNREACHABLE("Destroying a view while the frame is alive?"); + RemoveStateBits(NS_FRAME_HAS_VIEW); + SetViewInternal(nullptr); } - - return NS_OK; } // Find the first geometric parent that has a view diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h index afe152047d22..4750a1b0bab4 100644 --- a/layout/generic/nsFrame.h +++ b/layout/generic/nsFrame.h @@ -595,6 +595,12 @@ protected: void DidSetStyleContext(nsStyleContext* aOldStyleContext) override; public: + /** + * Helper method to create a view for a frame. Only used by a few sub-classes + * that need a view. + */ + void CreateView(); + //given a frame five me the first/last leaf available //XXX Robert O'Callahan wants to move these elsewhere static void GetLastLeaf(nsPresContext* aPresContext, nsIFrame **aFrame); diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index c2423c29e602..f4f583ab917c 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -613,8 +613,8 @@ public: * If the frame is a continuing frame, then aPrevInFlow indicates the previous * frame (the frame that was split). * - * If you want a view associated with your frame, you should create the view - * after Init() has returned. + * Each subclass that need a view should override this method and call + * CreateView() after calling its base class Init(). * * @param aContent the content object associated with the frame * @param aParent the parent frame @@ -1607,11 +1607,6 @@ public: const nsDisplayListSet& aLists, uint32_t aFlags = 0); - /** - * Does this frame need a view? - */ - virtual bool NeedsView() { return false; } - bool RefusedAsyncAnimation() const { return Properties().Get(RefusedAsyncAnimationProperty()); @@ -2445,14 +2440,31 @@ public: virtual bool HasAnyNoncollapsedCharacters() { return false; } - /** - * Accessor functions to get/set the associated view object - * - * GetView returns non-null if and only if |HasView| returns true. - */ + // + // Accessor functions to an associated view object: + // bool HasView() const { return !!(mState & NS_FRAME_HAS_VIEW); } - nsView* GetView() const; - nsresult SetView(nsView* aView); +protected: + virtual nsView* GetViewInternal() const + { + MOZ_ASSERT_UNREACHABLE("method should have been overridden by subclass"); + return nullptr; + } + virtual void SetViewInternal(nsView* aView) + { + MOZ_ASSERT_UNREACHABLE("method should have been overridden by subclass"); + } +public: + nsView* GetView() const + { + if (MOZ_LIKELY(!HasView())) { + return nullptr; + } + nsView* view = GetViewInternal(); + MOZ_ASSERT(view, "GetViewInternal() should agree with HasView()"); + return view; + } + void SetView(nsView* aView); /** * Find the closest view (on |this| or an ancestor). @@ -2466,6 +2478,14 @@ public: */ nsIFrame* GetAncestorWithView() const; + /** + * Sets the view's attributes from the frame style. + * Call this for nsChangeHint_SyncFrameView style changes or when the view + * has just been created. + * @param aView the frame's view or use GetView() if nullptr is given + */ + void SyncFrameViewProperties(nsView* aView = nullptr); + /** * Get the offset between the coordinate systems of |this| and aOther. * Adding the return value to a point in the coordinate system of |this| @@ -3616,6 +3636,13 @@ public: const nsStyleCoord& aCoord, ComputeSizeFlags aFlags = eDefault); protected: + /** + * Reparent this frame's view if it has one. + */ + void ReparentFrameViewTo(nsViewManager* aViewManager, + nsView* aNewParentView, + nsView* aOldParentView); + // Members nsRect mRect; nsIContent* mContent; diff --git a/layout/generic/nsPluginFrame.cpp b/layout/generic/nsPluginFrame.cpp index 12f3b2805e8b..5a5c8f2e3fef 100644 --- a/layout/generic/nsPluginFrame.cpp +++ b/layout/generic/nsPluginFrame.cpp @@ -150,6 +150,7 @@ protected: nsPluginFrame::nsPluginFrame(nsStyleContext* aContext) : nsFrame(aContext) , mInstanceOwner(nullptr) + , mOuterView(nullptr) , mInnerView(nullptr) , mBackgroundSink(nullptr) , mReflowCallbackPosted(false) @@ -194,6 +195,7 @@ nsPluginFrame::Init(nsIContent* aContent, ("Initializing nsPluginFrame %p for content %p\n", this, aContent)); nsFrame::Init(aContent, aParent, aPrevInFlow); + CreateView(); } void diff --git a/layout/generic/nsPluginFrame.h b/layout/generic/nsPluginFrame.h index 5d9f9f4757cc..b21ad43b3436 100644 --- a/layout/generic/nsPluginFrame.h +++ b/layout/generic/nsPluginFrame.h @@ -96,8 +96,6 @@ public: ~(nsIFrame::eReplaced | nsIFrame::eReplacedSizing)); } - virtual bool NeedsView() override { return true; } - #ifdef DEBUG_FRAME_DUMP virtual nsresult GetFrameName(nsAString& aResult) const override; #endif @@ -271,6 +269,9 @@ protected: friend class nsDisplayPlugin; friend class PluginBackgroundSink; + nsView* GetViewInternal() const override { return mOuterView; } + void SetViewInternal(nsView* aView) override { mOuterView = aView; } + private: // Registers the plugin for a geometry update, and requests a geometry // update. This caches the root pres context in @@ -303,7 +304,8 @@ private: }; nsPluginInstanceOwner* mInstanceOwner; // WEAK - nsView* mInnerView; + nsView* mOuterView; + nsView* mInnerView; nsCOMPtr mWidget; nsIntRect mWindowlessRect; /** diff --git a/layout/generic/nsSelection.cpp b/layout/generic/nsSelection.cpp index 58d18b46d64b..c1e213453933 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,8 @@ Selection::ScrollSelectionIntoViewEvent::Run() int32_t flags = Selection::SCROLL_DO_FLUSH | Selection::SCROLL_SYNCHRONOUS; + Selection* sel = mSelection; // workaround to satisfy static analysis + RefPtr kungFuDeathGrip(sel); mSelection->mScrollEvent.Forget(); mSelection->ScrollIntoView(mRegion, mVerticalScroll, mHorizontalScroll, mFlags | flags); diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index a9bcb63470c5..3575cd6f5ee3 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -60,6 +60,7 @@ GetDocumentFromView(nsView* aView) nsSubDocumentFrame::nsSubDocumentFrame(nsStyleContext* aContext) : nsAtomicContainerFrame(aContext) + , mOuterView(nullptr) , mInnerView(nullptr) , mIsInline(false) , mPostedReflowCallback(false) @@ -121,17 +122,10 @@ nsSubDocumentFrame::Init(nsIContent* aContent, nsAtomicContainerFrame::Init(aContent, aParent, aPrevInFlow); - // We are going to create an inner view. If we need a view for the - // OuterFrame but we wait for the normal view creation path in - // nsCSSFrameConstructor, then we will lose because the inner view's - // parent will already have been set to some outer view (e.g., the - // canvas) when it really needs to have this frame's view as its - // parent. So, create this frame's view right away, whether we - // really need it or not, and the inner view will get it as the - // parent. - if (!HasView()) { - nsContainerFrame::CreateViewForFrame(this, true); - } + // CreateView() creates this frame's view, stored in mOuterView. It needs to + // be created first since it's the parent of the inner view, stored in + // mInnerView. + CreateView(); EnsureInnerView(); // Set the primary frame now so that nsDocumentViewer::FindContainerView diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h index 634e2ab3b2c5..5b3bb815ec1f 100644 --- a/layout/generic/nsSubDocumentFrame.h +++ b/layout/generic/nsSubDocumentFrame.h @@ -157,7 +157,11 @@ protected: */ nsIFrame* ObtainIntrinsicSizeFrame(); + nsView* GetViewInternal() const override { return mOuterView; } + void SetViewInternal(nsView* aView) override { mOuterView = aView; } + RefPtr mFrameLoader; + nsView* mOuterView; nsView* mInnerView; bool mIsInline; bool mPostedReflowCallback; 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); diff --git a/layout/reftests/bugs/reftest-stylo.list b/layout/reftests/bugs/reftest-stylo.list index bcff09e25d08..3ba1f024e7dc 100644 --- a/layout/reftests/bugs/reftest-stylo.list +++ b/layout/reftests/bugs/reftest-stylo.list @@ -386,10 +386,10 @@ fails == 315920-14.html 315920-14.html == 315920-15.html 315920-15.html fails == 315920-16.html 315920-16.html fails == 315920-17.html 315920-17.html -== 315920-18a.html 315920-18a.html -fails == 315920-18b.html 315920-18b.html -== 315920-18c.html 315920-18c.html -== 315920-18d.html 315920-18d.html +skip-if(stylo) == 315920-18a.html 315920-18a.html # bug 1338982, which makes this timing-dependent +skip-if(stylo) == 315920-18b.html 315920-18b.html # bug 1338982, which makes this timing-dependent +skip-if(stylo) == 315920-18c.html 315920-18c.html # bug 1338982, which makes this timing-dependent +skip-if(stylo) == 315920-18d.html 315920-18d.html # bug 1338982, which makes this timing-dependent fails == 315920-18e.html 315920-18e.html fails == 315920-18f.html 315920-18f.html fails == 315920-18g.html 315920-18g.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 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/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 { 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()); } } } 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/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/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; } diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index 16a5432f93db..5f30efbc529a 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -1680,13 +1680,17 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult, unit == eCSSUnit_RGBAColor) { nscolor color = GetColorValue(); // For brevity, we omit the alpha component if it's equal to 255 (full - // opaque). Also, we try to preserve the author-specified function name, - // unless it's rgba() and we're omitting the alpha component - then we - // use rgb(). + // opaque). Also, we use "rgba" rather than "rgb" when the color includes + // the non-opaque alpha value, for backwards-compat (even though they're + // aliases as of css-color-4). + // e.g.: + // rgba(1, 2, 3, 1.0) => rgb(1, 2, 3) + // rgba(1, 2, 3, 0.5) => rgba(1, 2, 3, 0.5) + uint8_t a = NS_GET_A(color); bool showAlpha = (a != 255); - if (unit == eCSSUnit_RGBAColor && showAlpha) { + if (showAlpha) { aResult.AppendLiteral("rgba("); } else { aResult.AppendLiteral("rgb("); @@ -3057,7 +3061,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/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; 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; 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_)); \ 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; }; diff --git a/layout/style/test/stylo-failures.md b/layout/style/test/stylo-failures.md index 604116f8abaa..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] @@ -378,7 +381,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 @@ -407,7 +409,7 @@ to mochitest command. * :-moz-window-inactive bug 1348489 * test_selectors.html `:-moz-window-inactive` [2] * :-moz-{first,last}-node - * test_selectors.html `:-moz-` [13] + * test_selectors.html `:-moz-` [6] * ... `unexpected rule index` [5] * :dir * test_selectors.html `:dir` [10] diff --git a/layout/style/test/test_computed_style.html b/layout/style/test/test_computed_style.html index 77e91b9dfddc..9ba9403af841 100644 --- a/layout/style/test/test_computed_style.html +++ b/layout/style/test/test_computed_style.html @@ -375,6 +375,45 @@ var noframe_container = document.getElementById("content"); p.remove(); })(); +(function test_bug_1347164() { + // Test that computed 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)"], + ]; + + var css_color_4 = [ + ["rgba(0 0 0 / 1)", "rgb(0, 0, 0)"], + ["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.2)", "rgba(0, 0, 0, 0.2)"], + ["hsla(0 0% 0% / 1)", "rgb(0, 0, 0)"], + ["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.4)", "rgba(0, 0, 0, 0.4)"], + ]; + + var p = document.createElement("p"); + var cs = getComputedStyle(p, ""); + frame_container.appendChild(p); + + for (var i = 0; i < color.length; ++i) { + var test = color[i]; + 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 9cc2f9b2f14a..73bf62edfa51 100644 --- a/layout/style/test/test_specified_value_serialization.html +++ b/layout/style/test/test_specified_value_serialization.html @@ -1,62 +1,112 @@ - -Test for Bug 721136 - - -Mozilla Bug 721136 + + + Test for miscellaneous specified value issues + + + + +Mozilla Bug +

+ +
-
 
+ + diff --git a/layout/xul/nsMenuPopupFrame.cpp b/layout/xul/nsMenuPopupFrame.cpp index 7b58fdd05fed..1be0362bf02f 100644 --- a/layout/xul/nsMenuPopupFrame.cpp +++ b/layout/xul/nsMenuPopupFrame.cpp @@ -94,6 +94,7 @@ NS_QUERYFRAME_TAIL_INHERITING(nsBoxFrame) nsMenuPopupFrame::nsMenuPopupFrame(nsStyleContext* aContext) :nsBoxFrame(aContext), mCurrentMenu(nullptr), + mView(nullptr), mPrefSize(-1, -1), mLastClientOffset(0, 0), mPopupType(ePopupTypePanel), @@ -529,7 +530,7 @@ nsMenuPopupFrame::LayoutPopup(nsBoxLayoutState& aState, nsIFrame* aParentMenu, } viewManager->SetViewVisibility(view, nsViewVisibility_kShow); - nsContainerFrame::SyncFrameViewProperties(pc, this, nullptr, view, 0); + SyncFrameViewProperties(view); } // finally, if the popup just opened, send a popupshown event @@ -2436,7 +2437,7 @@ nsMenuPopupFrame::GetAlignmentPosition() const } /** - * KEEP THIS IN SYNC WITH nsContainerFrame::CreateViewForFrame + * KEEP THIS IN SYNC WITH nsFrame::CreateView * as much as possible. Until we get rid of views finally... */ void diff --git a/layout/xul/nsMenuPopupFrame.h b/layout/xul/nsMenuPopupFrame.h index 44f91b803eae..c2236fd0694e 100644 --- a/layout/xul/nsMenuPopupFrame.h +++ b/layout/xul/nsMenuPopupFrame.h @@ -533,6 +533,9 @@ protected: // view, and is initially hidden. void CreatePopupView(); + nsView* GetViewInternal() const override { return mView; } + void SetViewInternal(nsView* aView) override { mView = aView; } + // Returns true if the popup should try to remain at the same relative // location as the anchor while it is open. If the anchor becomes hidden // either directly or indirectly because a parent popup or other element @@ -555,6 +558,7 @@ protected: nsCOMPtr mTriggerContent; nsMenuFrame* mCurrentMenu; // The current menu that is active. + nsView* mView; RefPtr mPopupShownDispatcher; 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; } 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 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 ) 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); diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java index 6be06f419dc0..a4c2e36388dd 100644 --- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java @@ -644,7 +644,7 @@ public class BrowserApp extends GeckoApp } }); - mProgressView = (ToolbarProgressView) findViewById(R.id.progress); + mProgressView = (ToolbarProgressView) findViewById(R.id.page_progress); mProgressView.setDynamicToolbar(mDynamicToolbar); mBrowserToolbar.setProgressBar(mProgressView); diff --git a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java index ef1394097b7b..074f3c883c32 100644 --- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java +++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java @@ -30,6 +30,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.ImageButton; +import android.widget.ProgressBar; import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.R; @@ -54,6 +55,7 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi private final SparseArrayCompat menuItemsIntent = new SparseArrayCompat<>(); private GeckoPopupMenu popupMenu; private ActionBarPresenter actionBarPresenter; + private ProgressBar mProgressView; // A state to indicate whether this activity is finishing with customize animation private boolean usingCustomAnimation = false; @@ -75,7 +77,8 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi setThemeFromToolbarColor(); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + mProgressView = (ProgressBar) findViewById(R.id.page_progress); + final Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); bindNavigationCallback(toolbar); @@ -150,6 +153,17 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi return; } + if (msg == Tabs.TabEvents.START + || msg == Tabs.TabEvents.STOP + || msg == Tabs.TabEvents.ADDED + || msg == Tabs.TabEvents.LOAD_ERROR + || msg == Tabs.TabEvents.LOADED + || msg == Tabs.TabEvents.LOCATION_CHANGE) { + + updateProgress((tab.getState() == Tab.STATE_LOADING), + tab.getLoadProgress()); + } + if (msg == Tabs.TabEvents.LOCATION_CHANGE || msg == Tabs.TabEvents.SECURITY_CHANGE || msg == Tabs.TabEvents.TITLE) { @@ -363,6 +377,21 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi forwardMenuItem.setEnabled(enabled); } + /** + * Update loading progress of current page + * + * @param isLoading to indicate whether ProgressBar should be visible or not + * @param progress value of loading progress in percent, should be 0 - 100. + */ + private void updateProgress(final boolean isLoading, final int progress) { + if (isLoading) { + mProgressView.setVisibility(View.VISIBLE); + mProgressView.setProgress(progress); + } else { + mProgressView.setVisibility(View.GONE); + } + } + private void onReloadClicked() { final Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null) { 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..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; @@ -196,8 +204,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 +479,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/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) { 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) { 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); 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/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); diff --git a/mobile/android/base/resources/layout/customtabs_activity.xml b/mobile/android/base/resources/layout/customtabs_activity.xml index 7ba9c07f68a1..6d77696131de 100644 --- a/mobile/android/base/resources/layout/customtabs_activity.xml +++ b/mobile/android/base/resources/layout/customtabs_activity.xml @@ -6,6 +6,7 @@ @@ -47,4 +48,14 @@ + + \ No newline at end of file diff --git a/mobile/android/base/resources/layout/gecko_app.xml b/mobile/android/base/resources/layout/gecko_app.xml index ec43b341f2ca..6ae0416e8ffc 100644 --- a/mobile/android/base/resources/layout/gecko_app.xml +++ b/mobile/android/base/resources/layout/gecko_app.xml @@ -144,7 +144,7 @@ android:focusable="true" android:background="@drawable/url_bar_bg"/> - @@ -153,7 +153,7 @@ - + + 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..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 @@ -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); @@ -544,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 { @@ -565,7 +588,7 @@ public class GlobalSession implements HttpResponseObserver { @Override public String ifUnmodifiedSince() { - return null; + return Utils.millisecondsToDecimalSecondsString(timestamp); } @Override @@ -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 + "."); @@ -784,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."); 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); + } } 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 +} 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/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; 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)); 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(); 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; 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); 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 }, }; diff --git a/services/cloudsync/CloudSyncLocal.jsm b/services/cloudsync/CloudSyncLocal.jsm index 8e586dcd6da6..b0fbd9fde6a4 100644 --- a/services/cloudsync/CloudSyncLocal.jsm +++ b/services/cloudsync/CloudSyncLocal.jsm @@ -18,7 +18,7 @@ Cu.import("resource://gre/modules/Preferences.jsm"); function lazyStrings(name) { return () => Services.strings.createBundle( - `chrome://weave/locale/services//${name}.properties`); + `chrome://weave/locale/${name}.properties`); } this.Str = {}; diff --git a/services/sync/locales/jar.mn b/services/sync/locales/jar.mn index ab9848f9d5b9..9eedff538869 100644 --- a/services/sync/locales/jar.mn +++ b/services/sync/locales/jar.mn @@ -5,6 +5,6 @@ @AB_CD@.jar: -% locale weave @AB_CD@ %locale/@AB_CD@/ +% locale weave @AB_CD@ %locale/@AB_CD@/services/ locale/@AB_CD@/services/errors.properties (%errors.properties) locale/@AB_CD@/services/sync.properties (%sync.properties) 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/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/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/modules/util.js b/services/sync/modules/util.js index 799e6fcd7b46..11e3e51edf31 100644 --- a/services/sync/modules/util.js +++ b/services/sync/modules/util.js @@ -218,7 +218,7 @@ this.Utils = { lazyStrings: function Weave_lazyStrings(name) { return () => Services.strings.createBundle( - `chrome://weave/locale/services/${name}.properties`); + `chrome://weave/locale/${name}.properties`); }, deepEquals: function eq(a, b) { 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"); 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 = { 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() { 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/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/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())) } } 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(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, + } }) } } 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(); + } } } 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(()) 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, 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/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/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/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}; 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), 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) 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); + } + } } 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] 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, 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: 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/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 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 - 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"); + }); 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); 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); } 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")); diff --git a/toolkit/components/places/tests/unifiedcomplete/test_autofill_default_behavior.js b/toolkit/components/places/tests/unifiedcomplete/test_autofill_default_behavior.js index 930986905f93..2861bb989ca2 100644 --- a/toolkit/components/places/tests/unifiedcomplete/test_autofill_default_behavior.js +++ b/toolkit/components/places/tests/unifiedcomplete/test_autofill_default_behavior.js @@ -24,7 +24,7 @@ add_task(function* test_default_behavior_host() { yield addBookmark( { uri: uri4, title: "tpbk" } ); yield addBookmark( { uri: uri5, title: "title", tags: ["foo"] } ); - yield setFaviconForHref(uri1.spec, "chrome://global/skin/icons/information-16.png"); + yield setFaviconForHref(uri1.spec, "chrome://global/skin/icons/info.svg"); yield setFaviconForHref(uri3.spec, "chrome://global/skin/icons/error-16.png"); yield setFaviconForHref(uri6.spec, "chrome://global/skin/icons/question-16.png"); @@ -45,7 +45,7 @@ add_task(function* test_default_behavior_host() { yield check_autocomplete({ search: "ty", matches: [ { uri: uri1, title: "typed", style: [ "autofill", "heuristic" ], - icon: "chrome://global/skin/icons/information-16.png" } ], + icon: "chrome://global/skin/icons/info.svg" } ], autofilled: "typed/", completed: "typed/" }); @@ -116,7 +116,7 @@ add_task(function* test_default_behavior_host() { yield check_autocomplete({ search: "ty", matches: [ { uri: uri1, title: "typed", style: [ "autofill", "heuristic" ], - icon: "chrome://global/skin/icons/information-16.png"} ], + icon: "chrome://global/skin/icons/info.svg"} ], autofilled: "typed/", completed: "typed/" }); @@ -223,7 +223,7 @@ add_task(function* test_default_behavior_url() { yield addBookmark( { uri: uri3, title: "bookmarked" } ); yield addBookmark( { uri: uri4, title: "tpbk" } ); - yield setFaviconForHref(uri1.spec, "chrome://global/skin/icons/information-16.png"); + yield setFaviconForHref(uri1.spec, "chrome://global/skin/icons/info.svg"); yield setFaviconForHref(uri3.spec, "chrome://global/skin/icons/error-16.png"); // RESTRICT TO HISTORY. @@ -245,7 +245,7 @@ add_task(function* test_default_behavior_url() { yield check_autocomplete({ search: "typed/t", matches: [ { uri: uri1, title: "typed/ty/", style: [ "autofill", "heuristic" ], - icon: "chrome://global/skin/icons/information-16.png"} ], + icon: "chrome://global/skin/icons/info.svg"} ], autofilled: "typed/ty/", completed: "http://typed/ty/" }); diff --git a/toolkit/components/places/tests/unit/test_bookmarks_html.js b/toolkit/components/places/tests/unit/test_bookmarks_html.js index ad04b61dccf2..fb05be298089 100644 --- a/toolkit/components/places/tests/unit/test_bookmarks_html.js +++ b/toolkit/components/places/tests/unit/test_bookmarks_html.js @@ -176,7 +176,7 @@ add_task(function* test_import_chromefavicon() { // 9. empty bookmarks db and continue const PAGE_URI = NetUtil.newURI("http://example.com/chromefavicon_page"); - const CHROME_FAVICON_URI = NetUtil.newURI("chrome://global/skin/icons/information-16.png"); + const CHROME_FAVICON_URI = NetUtil.newURI("chrome://global/skin/icons/info.svg"); const CHROME_FAVICON_URI_2 = NetUtil.newURI("chrome://global/skin/icons/error-16.png"); do_print("Importing from html"); 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/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