From 2445ed184810debab92f860e2ad161a57fba71b2 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Wed, 26 Oct 2016 21:24:15 +0300 Subject: [PATCH 01/61] Bug 1312742 - Match spec/other browsers for ping reflection; r=bkelly The spec used to say that getting the .ping property on HTMLAnchorElement or HTMLAreaElement should return a DOMTokenList of parsed URLs, but it now says to return a plain string. All other UAs that implement ping match the new spec, and it's hopefully unlikely that any sites depend on our old behavior. Discussion: https://github.com/whatwg/html/issues/1780 MozReview-Commit-ID: LpmH8ANNT9g --- dom/html/HTMLAnchorElement.cpp | 5 +- dom/html/HTMLAreaElement.cpp | 5 +- dom/html/nsGenericHTMLElement.cpp | 62 -------------- dom/html/nsGenericHTMLElement.h | 14 ---- .../html/dom/reflection-embedded.html.ini | 84 ------------------- .../meta/html/dom/reflection-text.html.ini | 84 ------------------- 6 files changed, 6 insertions(+), 248 deletions(-) diff --git a/dom/html/HTMLAnchorElement.cpp b/dom/html/HTMLAnchorElement.cpp index b73db8541bd5..a6cfacc53d3e 100644 --- a/dom/html/HTMLAnchorElement.cpp +++ b/dom/html/HTMLAnchorElement.cpp @@ -347,10 +347,11 @@ HTMLAnchorElement::ToString(nsAString& aSource) return GetHref(aSource); } -NS_IMETHODIMP +NS_IMETHODIMP HTMLAnchorElement::GetPing(nsAString& aValue) { - return GetURIListAttr(nsGkAtoms::ping, aValue); + GetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue); + return NS_OK; } NS_IMETHODIMP diff --git a/dom/html/HTMLAreaElement.cpp b/dom/html/HTMLAreaElement.cpp index 6ca5c2b63150..098081b8b050 100644 --- a/dom/html/HTMLAreaElement.cpp +++ b/dom/html/HTMLAreaElement.cpp @@ -221,10 +221,11 @@ HTMLAreaElement::ToString(nsAString& aSource) return GetHref(aSource); } -NS_IMETHODIMP +NS_IMETHODIMP HTMLAreaElement::GetPing(nsAString& aValue) { - return GetURIListAttr(nsGkAtoms::ping, aValue); + GetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue); + return NS_OK; } NS_IMETHODIMP diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index 1808da33a2f2..574f6a2c7015 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -1679,68 +1679,6 @@ nsGenericHTMLElement::IsScrollGrabAllowed(JSContext*, JSObject*) return nsContentUtils::IsSystemPrincipal(prin); } -nsresult -nsGenericHTMLElement::GetURIListAttr(nsIAtom* aAttr, nsAString& aResult) -{ - aResult.Truncate(); - - nsAutoString value; - if (!GetAttr(kNameSpaceID_None, aAttr, value)) - return NS_OK; - - nsIDocument* doc = OwnerDoc(); - nsCOMPtr baseURI = GetBaseURI(); - - nsString::const_iterator end; - value.EndReading(end); - - nsAString::const_iterator iter; - value.BeginReading(iter); - - while (iter != end) { - while (*iter == ' ' && iter != end) { - ++iter; - } - - if (iter == end) { - break; - } - - nsAString::const_iterator start = iter; - - while (iter != end && *iter != ' ') { - ++iter; - } - - if (!aResult.IsEmpty()) { - aResult.Append(NS_LITERAL_STRING(" ")); - } - - const nsSubstring& uriPart = Substring(start, iter); - nsCOMPtr attrURI; - nsresult rv = - nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(attrURI), - uriPart, doc, baseURI); - if (NS_FAILED(rv)) { - aResult.Append(uriPart); - continue; - } - - MOZ_ASSERT(attrURI); - - nsAutoCString spec; - rv = attrURI->GetSpec(spec); - if (NS_WARN_IF(NS_FAILED(rv))) { - aResult.Append(uriPart); - continue; - } - - AppendUTF8toUTF16(spec, aResult); - } - - return NS_OK; -} - HTMLMenuElement* nsGenericHTMLElement::GetContextMenu() const { diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h index e96ff36ab8f4..b9839182f3d7 100644 --- a/dom/html/nsGenericHTMLElement.h +++ b/dom/html/nsGenericHTMLElement.h @@ -1062,20 +1062,6 @@ protected: SetHTMLAttr(aAttr, value, aRv); } - /** - * This method works like GetURIAttr, except that it supports multiple - * URIs separated by whitespace (one or more U+0020 SPACE characters). - * - * Gets the absolute URI values of an attribute, by resolving any relative - * URIs in the attribute against the baseuri of the element. If a substring - * isn't a relative URI, the substring is returned as is. Only works for - * attributes in null namespace. - * - * @param aAttr name of attribute. - * @param aResult result value [out] - */ - nsresult GetURIListAttr(nsIAtom* aAttr, nsAString& aResult); - /** * Locates the nsIEditor associated with this node. In general this is * equivalent to GetEditorInternal(), but for designmode or contenteditable, diff --git a/testing/web-platform/meta/html/dom/reflection-embedded.html.ini b/testing/web-platform/meta/html/dom/reflection-embedded.html.ini index caaca684582c..a47b23bd9408 100644 --- a/testing/web-platform/meta/html/dom/reflection-embedded.html.ini +++ b/testing/web-platform/meta/html/dom/reflection-embedded.html.ini @@ -696,87 +696,3 @@ [area.type: IDL set to object "test-valueOf" followed by IDL get] expected: FAIL - [area.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to true followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to false followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to null followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [area.ping: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [area.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [area.ping: IDL set to undefined followed by IDL get] - expected: FAIL - - [area.ping: IDL set to 7 followed by IDL get] - expected: FAIL - - [area.ping: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [area.ping: IDL set to true followed by IDL get] - expected: FAIL - - [area.ping: IDL set to false followed by IDL get] - expected: FAIL - - [area.ping: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [area.ping: IDL set to NaN followed by IDL get] - expected: FAIL - - [area.ping: IDL set to Infinity followed by IDL get] - expected: FAIL - - [area.ping: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [area.ping: IDL set to "\\0" followed by IDL get] - expected: FAIL - - [area.ping: IDL set to null followed by IDL get] - expected: FAIL - - [area.ping: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [area.ping: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - diff --git a/testing/web-platform/meta/html/dom/reflection-text.html.ini b/testing/web-platform/meta/html/dom/reflection-text.html.ini index 61833d3e75e4..371237f50ac8 100644 --- a/testing/web-platform/meta/html/dom/reflection-text.html.ini +++ b/testing/web-platform/meta/html/dom/reflection-text.html.ini @@ -174,87 +174,3 @@ [wbr.tabIndex: setAttribute() to object "3" followed by IDL get] expected: FAIL - [a.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to true followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to false followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to null followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [a.ping: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [a.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [a.ping: IDL set to undefined followed by IDL get] - expected: FAIL - - [a.ping: IDL set to 7 followed by IDL get] - expected: FAIL - - [a.ping: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [a.ping: IDL set to true followed by IDL get] - expected: FAIL - - [a.ping: IDL set to false followed by IDL get] - expected: FAIL - - [a.ping: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [a.ping: IDL set to NaN followed by IDL get] - expected: FAIL - - [a.ping: IDL set to Infinity followed by IDL get] - expected: FAIL - - [a.ping: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [a.ping: IDL set to "\\0" followed by IDL get] - expected: FAIL - - [a.ping: IDL set to null followed by IDL get] - expected: FAIL - - [a.ping: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [a.ping: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - From 04c4beaa73ee4c3bc0cdb4d0c0cf2d7d6093dc49 Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Sun, 30 Oct 2016 15:57:09 +0100 Subject: [PATCH 02/61] Bug 1313914 - ObjectDefineProperties should throw for non-callable accessors. r=arai --- js/src/builtin/Object.cpp | 2 +- .../defineProperties-callable-accessor.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 js/src/tests/ecma_5/Object/defineProperties-callable-accessor.js diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp index 1fa4a63852f9..c79d43badbf9 100644 --- a/js/src/builtin/Object.cpp +++ b/js/src/builtin/Object.cpp @@ -704,7 +704,7 @@ ObjectDefineProperties(JSContext* cx, HandleObject obj, HandleValue properties) // Step 5.b. if (desc.object() && desc.enumerable()) { if (!GetProperty(cx, props, props, nextKey, &descObj) || - !ToPropertyDescriptor(cx, descObj, false, &desc) || + !ToPropertyDescriptor(cx, descObj, true, &desc) || !descriptors.append(desc) || !descriptorKeys.append(nextKey)) { diff --git a/js/src/tests/ecma_5/Object/defineProperties-callable-accessor.js b/js/src/tests/ecma_5/Object/defineProperties-callable-accessor.js new file mode 100644 index 000000000000..1e92a2c92e51 --- /dev/null +++ b/js/src/tests/ecma_5/Object/defineProperties-callable-accessor.js @@ -0,0 +1,19 @@ +// ObjectDefineProperties with non callable accessor throws. +const descriptors = [ + {get: 1}, {set: 1}, + {get: []}, {set: []}, + {get: {}}, {set: {}}, + {get: new Number}, {set: new Number}, + + {get: 1, set: 1}, + {get: [], set: []}, + {get: {}, set: {}}, + {get: new Number, set: new Number}, +]; + +for (const descriptor of descriptors) { + assertThrowsInstanceOf(() => Object.create(null, {x: descriptor}), TypeError); + assertThrowsInstanceOf(() => Object.defineProperties({}, {x: descriptor}), TypeError); +} + +reportCompare(true, true); From 762a175cfdaa94063b5ed182edbe374715887068 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 31 Oct 2016 00:59:13 +0900 Subject: [PATCH 03/61] Bug 1313764 - Unlock mutex before calling JS_ReportErrorNumberASCII in js::FutexRuntime::wait. r=lth --- js/src/builtin/AtomicsObject.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/builtin/AtomicsObject.cpp b/js/src/builtin/AtomicsObject.cpp index 7ea5dbb7942f..863e07f5d044 100644 --- a/js/src/builtin/AtomicsObject.cpp +++ b/js/src/builtin/AtomicsObject.cpp @@ -966,6 +966,7 @@ js::FutexRuntime::wait(JSContext* cx, js::UniqueLock& locked, // See explanation below. if (state_ == WaitingInterrupted) { + UnlockGuard unlock(locked); JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_ATOMICS_WAIT_NOT_ALLOWED); return false; } From 8f8d409007b82d643215a1e57edea365d6485e5e Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 17 Jul 2016 10:22:33 +0900 Subject: [PATCH 04/61] Bug 1185106 - Part 0.1: Refactor JSOP_DEFFUN. r=efaust,jandem,till,h4writer MozReview-Commit-ID: 8XpAiHEzWVm --- js/src/frontend/BytecodeEmitter.cpp | 11 ++++++++++- js/src/jit/BaselineCompiler.cpp | 9 ++++----- js/src/jit/CodeGenerator.cpp | 3 ++- js/src/jit/IonBuilder.cpp | 6 +----- js/src/jit/Lowering.cpp | 6 +++++- js/src/jit/MIR.h | 19 +++++-------------- js/src/jit/shared/LIR-shared.h | 12 ++++++++---- js/src/vm/Interpreter.cpp | 24 +++--------------------- js/src/vm/Opcodes.h | 6 +++--- 9 files changed, 41 insertions(+), 55 deletions(-) diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 1d51666a99b4..37223938e0d5 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -6942,6 +6942,13 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) MOZ_ASSERT(pn->getOp() == JSOP_FUNWITHPROTO || pn->getOp() == JSOP_LAMBDA); pn->setOp(JSOP_FUNWITHPROTO); } + + if (pn->getOp() == JSOP_DEFFUN) { + if (!emitIndex32(JSOP_LAMBDA, index)) + return false; + return emit1(JSOP_DEFFUN); + } + return emitIndex32(pn->getOp(), index); } @@ -6972,7 +6979,9 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) MOZ_ASSERT(sc->isGlobalContext() || sc->isEvalContext()); MOZ_ASSERT(pn->getOp() == JSOP_NOP); switchToPrologue(); - if (!emitIndex32(JSOP_DEFFUN, index)) + if (!emitIndex32(JSOP_LAMBDA, index)) + return false; + if (!emit1(JSOP_DEFFUN)) return false; if (!updateSourceCoordNotes(pn->pn_pos.begin)) return false; diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 846a6cd3c816..5e2f9a4a0edc 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -2750,15 +2750,14 @@ static const VMFunction DefFunOperationInfo = bool BaselineCompiler::emit_JSOP_DEFFUN() { - RootedFunction fun(cx, script->getFunction(GET_UINT32_INDEX(pc))); - - frame.syncStack(0); - masm.loadPtr(frame.addressOfEnvironmentChain(), R0.scratchReg()); + frame.popRegsAndSync(1); + masm.unboxObject(R0, R0.scratchReg()); + masm.loadPtr(frame.addressOfEnvironmentChain(), R1.scratchReg()); prepareVMCall(); - pushArg(ImmGCPtr(fun)); pushArg(R0.scratchReg()); + pushArg(R1.scratchReg()); pushArg(ImmGCPtr(script)); return callVM(DefFunOperationInfo); diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index 9e55d5bb42e3..922260b2e06f 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -4694,7 +4694,8 @@ CodeGenerator::visitDefFun(LDefFun* lir) { Register envChain = ToRegister(lir->environmentChain()); - pushArg(ImmGCPtr(lir->mir()->fun())); + Register fun = ToRegister(lir->fun()); + pushArg(fun); pushArg(envChain); pushArg(ImmGCPtr(current->mir()->info().script())); diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index e10eb5eea685..c8987acf8677 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -13442,13 +13442,9 @@ IonBuilder::jsop_deflexical(uint32_t index) bool IonBuilder::jsop_deffun(uint32_t index) { - JSFunction* fun = script()->getFunction(index); - if (IsAsmJSModule(fun)) - return abort("asm.js module function"); - MOZ_ASSERT(analysis().usesEnvironmentChain()); - MDefFun* deffun = MDefFun::New(alloc(), fun, current->environmentChain()); + MDefFun* deffun = MDefFun::New(alloc(), current->pop(), current->environmentChain()); current->add(deffun); return resumeAfter(deffun); diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index efe86356204f..4a04a4e7a202 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -207,7 +207,11 @@ LIRGenerator::visitDefLexical(MDefLexical* ins) void LIRGenerator::visitDefFun(MDefFun* ins) { - LDefFun* lir = new(alloc()) LDefFun(useRegisterAtStart(ins->environmentChain())); + MDefinition* fun = ins->fun(); + MOZ_ASSERT(fun->type() == MIRType::Object); + + LDefFun* lir = new(alloc()) LDefFun(useRegisterAtStart(fun), + useRegisterAtStart(ins->environmentChain())); add(lir, ins); assignSafepoint(lir, ins); } diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index 50136ff7a87b..9be745c24ef9 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -8106,31 +8106,22 @@ class MDefLexical }; class MDefFun - : public MUnaryInstruction, - public NoTypePolicy::Data + : public MBinaryInstruction, + public ObjectPolicy<0>::Data { - CompilerFunction fun_; - private: - MDefFun(JSFunction* fun, MDefinition* envChain) - : MUnaryInstruction(envChain), - fun_(fun) + MDefFun(MDefinition* fun, MDefinition* envChain) + : MBinaryInstruction(fun, envChain) {} public: INSTRUCTION_HEADER(DefFun) TRIVIAL_NEW_WRAPPERS - NAMED_OPERANDS((0, environmentChain)) + NAMED_OPERANDS((0, fun), (1, environmentChain)) - JSFunction* fun() const { - return fun_; - } bool possiblyCalls() const override { return true; } - bool appendRoots(MRootList& roots) const override { - return roots.append(fun_); - } }; class MRegExp : public MNullaryInstruction diff --git a/js/src/jit/shared/LIR-shared.h b/js/src/jit/shared/LIR-shared.h index ff346326bc23..8bd46a6b2bf4 100644 --- a/js/src/jit/shared/LIR-shared.h +++ b/js/src/jit/shared/LIR-shared.h @@ -1550,19 +1550,23 @@ class LDefLexical : public LCallInstructionHelper<0, 0, 0> } }; -class LDefFun : public LCallInstructionHelper<0, 1, 0> +class LDefFun : public LCallInstructionHelper<0, 2, 0> { public: LIR_HEADER(DefFun) - explicit LDefFun(const LAllocation& envChain) + LDefFun(const LAllocation& fun, const LAllocation& envChain) { - setOperand(0, envChain); + setOperand(0, fun); + setOperand(1, envChain); } - const LAllocation* environmentChain() { + const LAllocation* fun() { return getOperand(0); } + const LAllocation* environmentChain() { + return getOperand(1); + } MDefFun* mir() const { return mir_->toDefFun(); } diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index a460fc7fcdec..291e9b2de013 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -3446,9 +3446,10 @@ CASE(JSOP_DEFFUN) * a compound statement (not at the top statement level of global code, or * at the top level of a function body). */ - ReservedRooted fun(&rootFunction0, script->getFunction(GET_UINT32_INDEX(REGS.pc))); + ReservedRooted fun(&rootFunction0, ®S.sp[-1].toObject().as()); if (!DefFunOperation(cx, script, REGS.fp()->environmentChain(), fun)) goto error; + REGS.sp--; } END_CASE(JSOP_DEFFUN) @@ -4330,27 +4331,8 @@ js::LambdaArrow(JSContext* cx, HandleFunction fun, HandleObject parent, HandleVa bool js::DefFunOperation(JSContext* cx, HandleScript script, HandleObject envChain, - HandleFunction funArg) + HandleFunction fun) { - /* - * If static link is not current scope, clone fun's object to link to the - * current scope via parent. We do this to enable sharing of compiled - * functions among multiple equivalent scopes, amortizing the cost of - * compilation over a number of executions. Examples include XUL scripts - * and event handlers shared among Firefox or other Mozilla app chrome - * windows, and user-defined JS functions precompiled and then shared among - * requests in server-side JS. - */ - RootedFunction fun(cx, funArg); - if (fun->isNative() || fun->environment() != envChain) { - fun = CloneFunctionObjectIfNotSingleton(cx, fun, envChain, nullptr, TenuredObject); - if (!fun) - return false; - } else { - MOZ_ASSERT(script->treatAsRunOnce()); - MOZ_ASSERT(!script->functionNonDelazifying()); - } - /* * We define the function as a property of the variable object and not the * current scope chain even for the case of function expression statements diff --git a/js/src/vm/Opcodes.h b/js/src/vm/Opcodes.h index 6f2efa6409ca..38f351575c80 100644 --- a/js/src/vm/Opcodes.h +++ b/js/src/vm/Opcodes.h @@ -1300,10 +1300,10 @@ * scripts where use of dynamic scoping inhibits optimization. * Category: Variables and Scopes * Type: Variables - * Operands: uint32_t funcIndex - * Stack: => + * Operands: + * Stack: fun => */ \ - macro(JSOP_DEFFUN, 127,"deffun", NULL, 5, 0, 0, JOF_OBJECT) \ + macro(JSOP_DEFFUN, 127,"deffun", NULL, 1, 1, 0, JOF_BYTE) \ /* Defines the new constant binding on global lexical scope. * * Throws if a binding with the same name already exists on the scope, or From ae79a1ae1caac3d047af069ce68cc43d5d478f9b Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 20:42:39 +0900 Subject: [PATCH 05/61] Bug 1185106 - Part 1: Add AsyncFunction flag in FunctionBox, JSScript, and LazyScript. r=efaust,till MozReview-Commit-ID: 6nOsJO3doV9 --- js/src/asmjs/AsmJS.cpp | 2 +- js/src/frontend/Parser.cpp | 22 +++++++++++++--------- js/src/frontend/Parser.h | 7 ++++++- js/src/frontend/SharedContext.h | 7 ++++++- js/src/jsfun.h | 19 +++++++++++++++++++ js/src/jsscript.cpp | 3 +++ js/src/jsscript.h | 33 ++++++++++++++++++++++++++++++++- 7 files changed, 80 insertions(+), 13 deletions(-) diff --git a/js/src/asmjs/AsmJS.cpp b/js/src/asmjs/AsmJS.cpp index 3d679e5a8aae..f78e43a4c275 100644 --- a/js/src/asmjs/AsmJS.cpp +++ b/js/src/asmjs/AsmJS.cpp @@ -7068,7 +7068,7 @@ ParseFunction(ModuleValidator& m, ParseNode** fnOut, unsigned* line) ParseContext* outerpc = m.parser().pc; Directives directives(outerpc); FunctionBox* funbox = m.parser().newFunctionBox(fn, fun, directives, NotGenerator, - /* tryAnnexB = */ false); + SyncFunction, /* tryAnnexB = */ false); if (!funbox) return false; funbox->initWithEnclosingParseContext(outerpc, frontend::Statement); diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index d6c057eda1fb..edd322b3882c 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -436,7 +436,7 @@ UsedNameTracker::rewind(RewindToken token) FunctionBox::FunctionBox(ExclusiveContext* cx, LifoAlloc& alloc, ObjectBox* traceListHead, JSFunction* fun, Directives directives, bool extraWarnings, - GeneratorKind generatorKind) + GeneratorKind generatorKind, FunctionAsyncKind asyncKind) : ObjectBox(fun, traceListHead), SharedContext(cx, Kind::ObjectBox, directives, extraWarnings), enclosingScope_(nullptr), @@ -450,6 +450,7 @@ FunctionBox::FunctionBox(ExclusiveContext* cx, LifoAlloc& alloc, ObjectBox* trac startColumn(0), length(0), generatorKindBits_(GeneratorKindAsBits(generatorKind)), + asyncKindBits_(AsyncKindAsBits(asyncKind)), isGenexpLambda(false), hasDestructuringArgs(false), hasParameterExprs(false), @@ -734,7 +735,8 @@ Parser::newObjectBox(JSObject* obj) template FunctionBox* Parser::newFunctionBox(Node fn, JSFunction* fun, Directives inheritedDirectives, - GeneratorKind generatorKind, bool tryAnnexB) + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + bool tryAnnexB) { MOZ_ASSERT(fun); MOZ_ASSERT_IF(tryAnnexB, !pc->sc()->strict()); @@ -748,7 +750,7 @@ Parser::newFunctionBox(Node fn, JSFunction* fun, Directives inheri */ FunctionBox* funbox = alloc.new_(context, alloc, traceListHead, fun, inheritedDirectives, - options().extraWarningsOption, generatorKind); + options().extraWarningsOption, generatorKind, asyncKind); if (!funbox) { ReportOutOfMemory(context); return nullptr; @@ -2195,6 +2197,7 @@ Parser::finishFunction() if (pc->sc()->strict()) lazy->setStrict(); lazy->setGeneratorKind(funbox->generatorKind()); + lazy->setAsyncKind(funbox->asyncKind()); if (funbox->isLikelyConstructorWrapper()) lazy->setLikelyConstructorWrapper(); if (funbox->isDerivedClassConstructor()) @@ -2235,7 +2238,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, fn->pn_body = argsbody; FunctionBox* funbox = newFunctionBox(fn, fun, inheritedDirectives, generatorKind, - /* tryAnnexB = */ false); + SyncFunction, /* tryAnnexB = */ false); if (!funbox) return null(); funbox->initStandaloneFunction(enclosingScope); @@ -2921,7 +2924,7 @@ Parser::skipLazyInnerFunction(ParseNode* pn, FunctionSyntaxKin RootedFunction fun(context, handler.nextLazyInnerFunction()); MOZ_ASSERT(!fun->isLegacyGenerator()); FunctionBox* funbox = newFunctionBox(pn, fun, Directives(/* strict = */ false), - fun->generatorKind(), tryAnnexB); + fun->generatorKind(), fun->asyncKind(), tryAnnexB); if (!funbox) return false; @@ -3143,7 +3146,7 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct // still expects a FunctionBox to be attached to it during BCE, and // the syntax parser cannot attach one to it. FunctionBox* funbox = newFunctionBox(pn, fun, inheritedDirectives, generatorKind, - tryAnnexB); + SyncFunction, tryAnnexB); if (!funbox) return false; funbox->initWithEnclosingParseContext(pc, kind); @@ -3231,7 +3234,8 @@ Parser::innerFunction(Node pn, ParseContext* outerpc, HandleFuncti // parser. In that case, outerpc is a ParseContext from the full parser // instead of the current top of the stack of the syntax parser. - FunctionBox* funbox = newFunctionBox(pn, fun, inheritedDirectives, generatorKind, tryAnnexB); + FunctionBox* funbox = newFunctionBox(pn, fun, inheritedDirectives, generatorKind, + SyncFunction, tryAnnexB); if (!funbox) return false; funbox->initWithEnclosingParseContext(outerpc, kind); @@ -3271,7 +3275,7 @@ Parser::standaloneLazyFunction(HandleFunction fun, bool strict return null(); Directives directives(strict); - FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, + FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, SyncFunction, /* tryAnnexB = */ false); if (!funbox) return null(); @@ -7817,7 +7821,7 @@ Parser::generatorComprehensionLambda(unsigned begin) // Create box for fun->object early to root it. Directives directives(/* strict = */ outerpc->sc()->strict()); - FunctionBox* genFunbox = newFunctionBox(genfn, fun, directives, StarGenerator, + FunctionBox* genFunbox = newFunctionBox(genfn, fun, directives, StarGenerator, SyncFunction, /* tryAnnexB = */ false); if (!genFunbox) return null(); diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 65f45981adb4..36298487c451 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -498,6 +498,10 @@ class ParseContext : public Nestable return generatorKind() == StarGenerator; } + bool isAsync() const { + return sc_->isFunctionBox() && sc_->asFunctionBox()->isAsync(); + } + bool isArrowFunction() const { return sc_->isFunctionBox() && sc_->asFunctionBox()->function()->isArrow(); } @@ -940,7 +944,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter */ ObjectBox* newObjectBox(JSObject* obj); FunctionBox* newFunctionBox(Node fn, JSFunction* fun, Directives directives, - GeneratorKind generatorKind, bool tryAnnexB); + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + bool tryAnnexB); /* * Create a new function object given a name (which is optional if this is diff --git a/js/src/frontend/SharedContext.h b/js/src/frontend/SharedContext.h index 6c48a9b55637..39df47c20a94 100644 --- a/js/src/frontend/SharedContext.h +++ b/js/src/frontend/SharedContext.h @@ -453,6 +453,8 @@ class FunctionBox : public ObjectBox, public SharedContext uint16_t length; uint8_t generatorKindBits_; /* The GeneratorKind of this function. */ + uint8_t asyncKindBits_; /* The FunctionAsyncKing of this function. */ + bool isGenexpLambda:1; /* lambda from generator expression */ bool hasDestructuringArgs:1; /* parameter list contains destructuring expression */ bool hasParameterExprs:1; /* parameter list contains expressions */ @@ -473,7 +475,8 @@ class FunctionBox : public ObjectBox, public SharedContext FunctionContextFlags funCxFlags; FunctionBox(ExclusiveContext* cx, LifoAlloc& alloc, ObjectBox* traceListHead, JSFunction* fun, - Directives directives, bool extraWarnings, GeneratorKind generatorKind); + Directives directives, bool extraWarnings, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind); MutableHandle namedLambdaBindings() { MOZ_ASSERT(context->compartment()->runtimeFromAnyThread()->keepAtoms()); @@ -532,6 +535,8 @@ class FunctionBox : public ObjectBox, public SharedContext bool isGenerator() const { return generatorKind() != NotGenerator; } bool isLegacyGenerator() const { return generatorKind() == LegacyGenerator; } bool isStarGenerator() const { return generatorKind() == StarGenerator; } + FunctionAsyncKind asyncKind() const { return AsyncKindFromBits(asyncKindBits_); } + bool isAsync() const { return asyncKind() == AsyncFunction; } bool isArrow() const { return function()->isArrow(); } void setGeneratorKind(GeneratorKind kind) { diff --git a/js/src/jsfun.h b/js/src/jsfun.h index d4274f350e2c..76d9812d3132 100644 --- a/js/src/jsfun.h +++ b/js/src/jsfun.h @@ -301,6 +301,13 @@ class JSFunction : public js::NativeObject flags_ |= RESOLVED_NAME; } + void setAsyncKind(js::FunctionAsyncKind asyncKind) { + if (isInterpretedLazy()) + lazyScript()->setAsyncKind(asyncKind); + else + nonLazyScript()->setAsyncKind(asyncKind); + } + bool getUnresolvedLength(JSContext* cx, js::MutableHandleValue v); JSAtom* getUnresolvedName(JSContext* cx); @@ -469,6 +476,18 @@ class JSFunction : public js::NativeObject bool isStarGenerator() const { return generatorKind() == js::StarGenerator; } + js::FunctionAsyncKind asyncKind() const { + return isInterpretedLazy() ? lazyScript()->asyncKind() : nonLazyScript()->asyncKind(); + } + + bool isAsync() const { + if (isInterpretedLazy()) + return lazyScript()->asyncKind() == js::AsyncFunction; + if (hasScript()) + return nonLazyScript()->asyncKind() == js::AsyncFunction; + return false; + } + void setScript(JSScript* script_) { mutableScript() = script_; } diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index f6b45edcafeb..e27b2ea713f0 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -2615,6 +2615,7 @@ JSScript::initFromFunctionBox(ExclusiveContext* cx, HandleScript script, script->isGeneratorExp_ = funbox->isGenexpLambda; script->setGeneratorKind(funbox->generatorKind()); + script->setAsyncKind(funbox->asyncKind()); PositionalFormalParameterIter fi(script); while (fi && !fi.closedOver()) @@ -3272,6 +3273,7 @@ js::detail::CopyScript(JSContext* cx, HandleScript src, HandleScript dst, dst->isDerivedClassConstructor_ = src->isDerivedClassConstructor(); dst->needsHomeObject_ = src->needsHomeObject(); dst->isDefaultClassConstructor_ = src->isDefaultClassConstructor(); + dst->isAsync_ = src->asyncKind() == AsyncFunction; if (nconsts != 0) { GCPtrValue* vector = Rebase(dst, src, src->consts()->vector); @@ -4004,6 +4006,7 @@ LazyScript::Create(ExclusiveContext* cx, HandleFunction fun, p.version = version; p.shouldDeclareArguments = false; p.hasThisBinding = false; + p.isAsync = false; p.numClosedOverBindings = closedOverBindings.length(); p.numInnerFunctions = innerFunctions.length(); p.generatorKindBits = GeneratorKindAsBits(NotGenerator); diff --git a/js/src/jsscript.h b/js/src/jsscript.h index 610399c8e396..c7af3426ad99 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -640,6 +640,7 @@ class ScriptSourceObject : public NativeObject }; enum GeneratorKind { NotGenerator, LegacyGenerator, StarGenerator }; +enum FunctionAsyncKind { SyncFunction, AsyncFunction }; static inline unsigned GeneratorKindAsBits(GeneratorKind generatorKind) { @@ -652,6 +653,17 @@ GeneratorKindFromBits(unsigned val) { return static_cast(val); } +static inline unsigned +AsyncKindAsBits(FunctionAsyncKind asyncKind) { + return static_cast(asyncKind); +} + +static inline FunctionAsyncKind +AsyncKindFromBits(unsigned val) { + MOZ_ASSERT(val <= AsyncFunction); + return static_cast(val); +} + /* * NB: after a successful XDR_DECODE, XDRScript callers must do any required * subsequent set-up of owning function or script object and then call @@ -988,6 +1000,8 @@ class JSScript : public js::gc::TenuredCell bool isDerivedClassConstructor_:1; bool isDefaultClassConstructor_:1; + bool isAsync_:1; + // Add padding so JSScript is gc::Cell aligned. Make padding protected // instead of private to suppress -Wunused-private-field compiler warnings. protected: @@ -1276,6 +1290,14 @@ class JSScript : public js::gc::TenuredCell generatorKindBits_ = GeneratorKindAsBits(kind); } + js::FunctionAsyncKind asyncKind() const { + return isAsync_ ? js::AsyncFunction : js::SyncFunction; + } + + void setAsyncKind(js::FunctionAsyncKind kind) { + isAsync_ = kind == js::AsyncFunction; + } + void setNeedsHomeObject() { needsHomeObject_ = true; } @@ -1887,7 +1909,8 @@ class LazyScript : public gc::TenuredCell uint32_t shouldDeclareArguments : 1; uint32_t hasThisBinding : 1; - uint32_t numClosedOverBindings : 22; + uint32_t isAsync : 1; + uint32_t numClosedOverBindings : 21; uint32_t numInnerFunctions : 20; uint32_t generatorKindBits : 2; @@ -2024,6 +2047,14 @@ class LazyScript : public gc::TenuredCell p_.generatorKindBits = GeneratorKindAsBits(kind); } + FunctionAsyncKind asyncKind() const { + return p_.isAsync ? AsyncFunction : SyncFunction; + } + + void setAsyncKind(FunctionAsyncKind kind) { + p_.isAsync = kind == AsyncFunction; + } + bool strict() const { return p_.strict; } From 9dd768a3e20f4d454024f94762cd39ec14b9695d Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 20:42:39 +0900 Subject: [PATCH 06/61] Bug 1185106 - Part 2: Add FunctionAsyncKind parameter to Parser methods that receives GeneratorKind. r=efaust,till MozReview-Commit-ID: D1e6mpR2Ftz --- js/src/frontend/BytecodeCompiler.cpp | 5 +-- js/src/frontend/Parser.cpp | 50 ++++++++++++++++------------ js/src/frontend/Parser.h | 18 ++++++---- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/js/src/frontend/BytecodeCompiler.cpp b/js/src/frontend/BytecodeCompiler.cpp index df22f5bb69ae..ba287fc27ed4 100644 --- a/js/src/frontend/BytecodeCompiler.cpp +++ b/js/src/frontend/BytecodeCompiler.cpp @@ -454,7 +454,7 @@ BytecodeCompiler::compileFunctionBody(MutableHandleFunction fun, do { Directives newDirectives = directives; fn = parser->standaloneFunctionBody(fun, enclosingScope, formals, generatorKind, - directives, &newDirectives); + SyncFunction, directives, &newDirectives); if (!fn && !handleParseFailure(newDirectives)) return false; } while (!fn); @@ -646,7 +646,8 @@ frontend::CompileLazyFunction(JSContext* cx, Handle lazy, const cha Rooted fun(cx, lazy->functionNonDelazifying()); MOZ_ASSERT(!lazy->isLegacyGenerator()); - ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->strict(), lazy->generatorKind()); + ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->strict(), lazy->generatorKind(), + lazy->asyncKind()); if (!pn) return false; diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index edd322b3882c..27a35476cf5e 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2223,6 +2223,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, HandleScope enclosingScope, Handle formals, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives) { @@ -2238,7 +2239,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, fn->pn_body = argsbody; FunctionBox* funbox = newFunctionBox(fn, fun, inheritedDirectives, generatorKind, - SyncFunction, /* tryAnnexB = */ false); + asyncKind, /* tryAnnexB = */ false); if (!funbox) return null(); funbox->initStandaloneFunction(enclosingScope); @@ -2456,7 +2457,8 @@ Parser::functionBody(InHandling inHandling, YieldHandling yieldHan template JSFunction* Parser::newFunction(HandleAtom atom, FunctionSyntaxKind kind, - GeneratorKind generatorKind, HandleObject proto) + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + HandleObject proto) { MOZ_ASSERT_IF(kind == Statement, atom != nullptr); @@ -3032,7 +3034,8 @@ template typename ParseHandler::Node Parser::functionDefinition(InHandling inHandling, YieldHandling yieldHandling, HandleAtom funName, FunctionSyntaxKind kind, - GeneratorKind generatorKind, InvokedPrediction invoked) + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + InvokedPrediction invoked) { MOZ_ASSERT_IF(kind == Statement, funName); @@ -3067,7 +3070,7 @@ Parser::functionDefinition(InHandling inHandling, YieldHandling yi if (!proto) return null(); } - RootedFunction fun(context, newFunction(funName, kind, generatorKind, proto)); + RootedFunction fun(context, newFunction(funName, kind, generatorKind, asyncKind, proto)); if (!fun) return null(); @@ -3086,7 +3089,7 @@ Parser::functionDefinition(InHandling inHandling, YieldHandling yi // "use foo" directives. while (true) { if (trySyntaxParseInnerFunction(pn, fun, inHandling, yieldHandling, kind, generatorKind, - tryAnnexB, directives, &newDirectives)) + asyncKind, tryAnnexB, directives, &newDirectives)) { break; } @@ -3117,6 +3120,7 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct YieldHandling yieldHandling, FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, bool tryAnnexB, Directives inheritedDirectives, Directives* newDirectives) @@ -3146,7 +3150,7 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct // still expects a FunctionBox to be attached to it during BCE, and // the syntax parser cannot attach one to it. FunctionBox* funbox = newFunctionBox(pn, fun, inheritedDirectives, generatorKind, - SyncFunction, tryAnnexB); + asyncKind, tryAnnexB); if (!funbox) return false; funbox->initWithEnclosingParseContext(pc, kind); @@ -3178,8 +3182,8 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct } while (false); // We failed to do a syntax parse above, so do the full parse. - return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, tryAnnexB, - inheritedDirectives, newDirectives); + return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, asyncKind, + tryAnnexB, inheritedDirectives, newDirectives); } template <> @@ -3189,13 +3193,14 @@ Parser::trySyntaxParseInnerFunction(Node pn, HandleFunction YieldHandling yieldHandling, FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, bool tryAnnexB, Directives inheritedDirectives, Directives* newDirectives) { // This is already a syntax parser, so just parse the inner function. - return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, tryAnnexB, - inheritedDirectives, newDirectives); + return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, asyncKind, + tryAnnexB, inheritedDirectives, newDirectives); } template @@ -3225,9 +3230,10 @@ template bool Parser::innerFunction(Node pn, ParseContext* outerpc, HandleFunction fun, InHandling inHandling, YieldHandling yieldHandling, - FunctionSyntaxKind kind, GeneratorKind generatorKind, - bool tryAnnexB, Directives inheritedDirectives, - Directives* newDirectives) + FunctionSyntaxKind kind, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + bool tryAnnexB, + Directives inheritedDirectives, Directives* newDirectives) { // Note that it is possible for outerpc != this->pc, as we may be // attempting to syntax parse an inner function from an outer full @@ -3235,7 +3241,7 @@ Parser::innerFunction(Node pn, ParseContext* outerpc, HandleFuncti // instead of the current top of the stack of the syntax parser. FunctionBox* funbox = newFunctionBox(pn, fun, inheritedDirectives, generatorKind, - SyncFunction, tryAnnexB); + asyncKind, tryAnnexB); if (!funbox) return false; funbox->initWithEnclosingParseContext(outerpc, kind); @@ -3266,7 +3272,8 @@ Parser::appendToCallSiteObj(Node callSiteObj) template <> ParseNode* Parser::standaloneLazyFunction(HandleFunction fun, bool strict, - GeneratorKind generatorKind) + GeneratorKind generatorKind, + FunctionAsyncKind asyncKind) { MOZ_ASSERT(checkOptionsCalled); @@ -3275,7 +3282,7 @@ Parser::standaloneLazyFunction(HandleFunction fun, bool strict return null(); Directives directives(strict); - FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, SyncFunction, + FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, asyncKind, /* tryAnnexB = */ false); if (!funbox) return null(); @@ -3485,7 +3492,7 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling YieldHandling newYieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; Node fun = functionDefinition(InAllowed, newYieldHandling, name, Statement, generatorKind, - PredictUninvoked); + SyncFunction, PredictUninvoked); if (!fun) return null(); @@ -3528,7 +3535,8 @@ Parser::functionExpr(InvokedPrediction invoked) tokenStream.ungetToken(); } - return functionDefinition(InAllowed, yieldHandling, name, Expression, generatorKind, invoked); + return functionDefinition(InAllowed, yieldHandling, name, Expression, generatorKind, + SyncFunction, invoked); } /* @@ -7489,7 +7497,7 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl return null(); Node arrowFunc = functionDefinition(inHandling, yieldHandling, nullptr, - Arrow, NotGenerator); + Arrow, NotGenerator, SyncFunction); if (!arrowFunc) return null(); @@ -7815,7 +7823,7 @@ Parser::generatorComprehensionLambda(unsigned begin) return null(); RootedFunction fun(context, newFunction(/* atom = */ nullptr, Expression, - StarGenerator, proto)); + StarGenerator, SyncFunction, proto)); if (!fun) return null(); @@ -9047,7 +9055,7 @@ Parser::methodDefinition(PropertyType propType, HandleAtom funName FunctionSyntaxKind kind = FunctionSyntaxKindFromPropertyType(propType); GeneratorKind generatorKind = GeneratorKindFromPropertyType(propType); YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; - return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind); + return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind, SyncFunction); } template diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 36298487c451..a5d4676e4c07 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -951,7 +951,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter * Create a new function object given a name (which is optional if this is * a function expression). */ - JSFunction* newFunction(HandleAtom atom, FunctionSyntaxKind kind, GeneratorKind generatorKind, + JSFunction* newFunction(HandleAtom atom, FunctionSyntaxKind kind, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, HandleObject proto); void trace(JSTracer* trc); @@ -1010,12 +1011,14 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter // Parse a function, given only its body. Used for the Function and // Generator constructors. Node standaloneFunctionBody(HandleFunction fun, HandleScope enclosingScope, - Handle formals, GeneratorKind generatorKind, + Handle formals, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives); // Parse a function, given only its arguments and body. Used for lazily // parsed functions. - Node standaloneLazyFunction(HandleFunction fun, bool strict, GeneratorKind generatorKind); + Node standaloneLazyFunction(HandleFunction fun, bool strict, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind); // Parse an inner function given an enclosing ParseContext and a // FunctionBox for the inner function. @@ -1212,7 +1215,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter Node funcpn); Node functionDefinition(InHandling inHandling, YieldHandling yieldHandling, HandleAtom name, - FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionSyntaxKind kind, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, InvokedPrediction invoked = PredictUninvoked); // Parse a function body. Pass StatementListBody if the body is a list of @@ -1303,11 +1307,13 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter bool skipLazyInnerFunction(Node pn, FunctionSyntaxKind kind, bool tryAnnexB); bool innerFunction(Node pn, ParseContext* outerpc, HandleFunction fun, InHandling inHandling, YieldHandling yieldHandling, - FunctionSyntaxKind kind, GeneratorKind generatorKind, bool tryAnnexB, + FunctionSyntaxKind kind, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, bool tryAnnexB, Directives inheritedDirectives, Directives* newDirectives); bool trySyntaxParseInnerFunction(Node pn, HandleFunction fun, InHandling inHandling, YieldHandling yieldHandling, FunctionSyntaxKind kind, - GeneratorKind generatorKind, bool tryAnnexB, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + bool tryAnnexB, Directives inheritedDirectives, Directives* newDirectives); bool finishFunctionScopes(); bool finishFunction(); From b576773874ea7cdb24c9de17fef94f0bf72d01e6 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 20:42:39 +0900 Subject: [PATCH 07/61] Bug 1185106 - Part 3: Add await token. r=efaust,till MozReview-Commit-ID: 7O4SayIM9f9 --- js/src/frontend/TokenKind.h | 1 + js/src/frontend/TokenStream.cpp | 6 ++++++ js/src/frontend/TokenStream.h | 2 ++ js/src/vm/CommonPropertyNames.h | 1 + js/src/vm/Keywords.h | 1 + 5 files changed, 11 insertions(+) diff --git a/js/src/frontend/TokenKind.h b/js/src/frontend/TokenKind.h index 3bd8ddf5b4c7..6f22d78e5f58 100644 --- a/js/src/frontend/TokenKind.h +++ b/js/src/frontend/TokenKind.h @@ -107,6 +107,7 @@ macro(THROW, "keyword 'throw'") \ macro(DEBUGGER, "keyword 'debugger'") \ macro(YIELD, "keyword 'yield'") \ + macro(AWAIT, "keyword 'await'") \ macro(EXPORT, "keyword 'export'") \ macro(IMPORT, "keyword 'import'") \ macro(CLASS, "keyword 'class'") \ diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index 0593e7ed01a5..ea7e01bfaab1 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -965,6 +965,12 @@ TokenStream::putIdentInTokenbuf(const char16_t* identStart) bool TokenStream::checkForKeyword(const KeywordInfo* kw, TokenKind* ttp) { + if (!awaitIsKeyword && kw->tokentype == TOK_AWAIT) { + if (ttp) + *ttp = TOK_NAME; + return true; + } + if (kw->tokentype == TOK_RESERVED) return reportError(JSMSG_RESERVED_ID, kw->chars); diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index de5fa961ad3b..71253f3ff804 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -430,6 +430,8 @@ class MOZ_STACK_CLASS TokenStream {} }; + bool awaitIsKeyword = false; + public: typedef Token::Modifier Modifier; static constexpr Modifier None = Token::None; diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index a0345d6f64b8..7c3fa61b902e 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -29,6 +29,7 @@ macro(ArrayValuesAt, ArrayValuesAt, "ArrayValuesAt") \ macro(as, as, "as") \ macro(Async, Async, "Async") \ + macro(await, await, "await") \ macro(Bool8x16, Bool8x16, "Bool8x16") \ macro(Bool16x8, Bool16x8, "Bool16x8") \ macro(Bool32x4, Bool32x4, "Bool32x4") \ diff --git a/js/src/vm/Keywords.h b/js/src/vm/Keywords.h index 385434085424..ef37c44198d3 100644 --- a/js/src/vm/Keywords.h +++ b/js/src/vm/Keywords.h @@ -55,6 +55,7 @@ macro(private, private_, TOK_STRICT_RESERVED) \ macro(protected, protected_, TOK_STRICT_RESERVED) \ macro(public, public_, TOK_STRICT_RESERVED) \ + macro(await, await, TOK_AWAIT) \ /* \ * Yield is a token inside function*. Outside of a function*, it is a \ * future reserved keyword in strict mode, but a keyword in JS1.7 even \ From 75d14cbaf8cb8c9db8050e52e32d3a62d00acf73 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 20:42:39 +0900 Subject: [PATCH 08/61] Bug 1185106 - Part 4: Add AutoAwaitIsKeyword class to set TokenStream.awaitIsKeyword. r=till MozReview-Commit-ID: FeFWbzjrxYR --- js/src/frontend/TokenStream.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index 71253f3ff804..4d14c8515094 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -32,6 +32,8 @@ struct KeywordInfo; namespace js { namespace frontend { +class AutoAwaitIsKeyword; + struct TokenPos { uint32_t begin; // Offset of the token's first char. uint32_t end; // Offset of 1 past the token's last char. @@ -431,6 +433,7 @@ class MOZ_STACK_CLASS TokenStream }; bool awaitIsKeyword = false; + friend class AutoAwaitIsKeyword; public: typedef Token::Modifier Modifier; @@ -1017,6 +1020,25 @@ class MOZ_STACK_CLASS TokenStream StrictModeGetter* strictModeGetter; // used to test for strict mode }; +class MOZ_STACK_CLASS AutoAwaitIsKeyword +{ +private: + TokenStream* ts_; + bool oldAwaitIsKeyword_; + +public: + AutoAwaitIsKeyword(TokenStream* ts, bool awaitIsKeyword) { + ts_ = ts; + oldAwaitIsKeyword_ = ts_->awaitIsKeyword; + ts_->awaitIsKeyword = awaitIsKeyword; + } + + ~AutoAwaitIsKeyword() { + ts_->awaitIsKeyword = oldAwaitIsKeyword_; + ts_ = nullptr; + } +}; + extern const char* TokenKindToDesc(TokenKind tt); From f9e207ec4b51fc4265e78fb91b9e53a884118b21 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 20:42:40 +0900 Subject: [PATCH 09/61] Bug 1185106 - Part 5.1: Support async function declaration in Parser. r=efaust,jwalden,till MozReview-Commit-ID: FhRG1vzpHxb --- js/src/frontend/Parser.cpp | 58 +++++++++++++++++++++++---------- js/src/frontend/Parser.h | 9 +++-- js/src/js.msg | 1 + js/src/vm/CommonPropertyNames.h | 1 + 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 27a35476cf5e..d6c562e3a43e 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2217,6 +2217,16 @@ Parser::finishFunction() return true; } +static YieldHandling +GetYieldHandling(GeneratorKind generatorKind, FunctionAsyncKind asyncKind) +{ + if (asyncKind == AsyncFunction) + return YieldIsName; + if (generatorKind == NotGenerator) + return YieldIsName; + return YieldIsKeyword; +} + template <> ParseNode* Parser::standaloneFunctionBody(HandleFunction fun, @@ -2262,7 +2272,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, } funbox->hasDuplicateParameters = duplicatedParam; - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + YieldHandling yieldHandling = GetYieldHandling(generatorKind, asyncKind); ParseNode* pn = functionBody(InAllowed, yieldHandling, Statement, StatementListBody); if (!pn) return null(); @@ -3038,6 +3048,7 @@ Parser::functionDefinition(InHandling inHandling, YieldHandling yi InvokedPrediction invoked) { MOZ_ASSERT_IF(kind == Statement, funName); + MOZ_ASSERT_IF(asyncKind == AsyncFunction, generatorKind == StarGenerator); Node pn = handler.newFunctionDefinition(); if (!pn) @@ -3295,15 +3306,15 @@ Parser::standaloneLazyFunction(HandleFunction fun, bool strict // Our tokenStream has no current token, so pn's position is garbage. // Substitute the position of the first token in our source. If the function - // is an arrow, use TokenStream::Operand to keep verifyConsistentModifier - // from complaining (we will use TokenStream::Operand in functionArguments). - if (!tokenStream.peekTokenPos(&pn->pn_pos, - fun->isArrow() ? TokenStream::Operand : TokenStream::None)) - { + // is a not-async arrow, use TokenStream::Operand to keep + // verifyConsistentModifier from complaining (we will use + // TokenStream::Operand in functionArguments). + TokenStream::Modifier modifier = (fun->isArrow() && asyncKind == SyncFunction) + ? TokenStream::Operand : TokenStream::None; + if (!tokenStream.peekTokenPos(&pn->pn_pos, modifier)) return null(); - } - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + YieldHandling yieldHandling = GetYieldHandling(generatorKind, asyncKind); FunctionSyntaxKind syntaxKind = Statement; if (fun->isClassConstructor()) syntaxKind = ClassConstructor; @@ -3398,9 +3409,7 @@ Parser::functionFormalParametersAndBody(InHandling inHandling, // |yield| in the parameters is either a name or keyword, depending on // whether the arrow function is enclosed in a generator function or not. // Whereas the |yield| in the function body is always parsed as a name. - YieldHandling bodyYieldHandling = pc->isGenerator() ? YieldIsKeyword : YieldIsName; - MOZ_ASSERT_IF(yieldHandling != bodyYieldHandling, kind == Arrow); - + YieldHandling bodyYieldHandling = GetYieldHandling(pc->generatorKind(), pc->asyncKind()); Node body = functionBody(inHandling, bodyYieldHandling, kind, bodyType); if (!body) return false; @@ -3446,7 +3455,8 @@ Parser::functionFormalParametersAndBody(InHandling inHandling, template typename ParseHandler::Node -Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling) +Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling, + FunctionAsyncKind asyncKind) { MOZ_ASSERT(tokenStream.isCurrentTokenType(TOK_FUNCTION)); @@ -3466,12 +3476,16 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling } RootedPropertyName name(context); - GeneratorKind generatorKind = NotGenerator; + GeneratorKind generatorKind = asyncKind == AsyncFunction ? StarGenerator : NotGenerator; TokenKind tt; if (!tokenStream.getToken(&tt)) return null(); if (tt == TOK_MUL) { + if (asyncKind != SyncFunction) { + report(ParseError, false, null(), JSMSG_ASYNC_GENERATOR); + return null(); + } generatorKind = StarGenerator; if (!tokenStream.getToken(&tt)) return null(); @@ -3490,9 +3504,9 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling return null(); } - YieldHandling newYieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + YieldHandling newYieldHandling = GetYieldHandling(generatorKind, asyncKind); Node fun = functionDefinition(InAllowed, newYieldHandling, name, Statement, generatorKind, - SyncFunction, PredictUninvoked); + asyncKind, PredictUninvoked); if (!fun) return null(); @@ -3524,7 +3538,7 @@ Parser::functionExpr(InvokedPrediction invoked) return null(); } - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + YieldHandling yieldHandling = GetYieldHandling(generatorKind, SyncFunction); RootedPropertyName name(context); if (tt == TOK_NAME || tt == TOK_YIELD) { @@ -6950,6 +6964,16 @@ Parser::statementListItem(YieldHandling yieldHandling, return lexicalDeclaration(yieldHandling, /* isConst = */ false); } + if (tokenStream.currentName() == context->names().async) { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine)) + return null(); + if (nextSameLine == TOK_FUNCTION) { + tokenStream.consumeKnownToken(TOK_FUNCTION); + return functionStmt(yieldHandling, NameRequired, AsyncFunction); + } + } + if (next == TOK_COLON) return labeledStatement(yieldHandling); @@ -9054,7 +9078,7 @@ Parser::methodDefinition(PropertyType propType, HandleAtom funName { FunctionSyntaxKind kind = FunctionSyntaxKindFromPropertyType(propType); GeneratorKind generatorKind = GeneratorKindFromPropertyType(propType); - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + YieldHandling yieldHandling = GetYieldHandling(generatorKind, SyncFunction); return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind, SyncFunction); } diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index a5d4676e4c07..8099c9509345 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -502,6 +502,10 @@ class ParseContext : public Nestable return sc_->isFunctionBox() && sc_->asFunctionBox()->isAsync(); } + FunctionAsyncKind asyncKind() const { + return isAsync() ? AsyncFunction : SyncFunction; + } + bool isArrowFunction() const { return sc_->isFunctionBox() && sc_->asFunctionBox()->function()->isArrow(); } @@ -1035,7 +1039,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter // whether it's prohibited due to strictness, JS version, or occurrence // inside a star generator. bool yieldExpressionsSupported() { - return versionNumber() >= JSVERSION_1_7 || pc->isGenerator(); + return (versionNumber() >= JSVERSION_1_7 || pc->isGenerator()) && !pc->isAsync(); } // Match the current token against the BindingIdentifier production with @@ -1074,7 +1078,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter * Some parsers have two versions: an always-inlined version (with an 'i' * suffix) and a never-inlined version (with an 'n' suffix). */ - Node functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling); + Node functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling, + FunctionAsyncKind asyncKind = SyncFunction); Node functionExpr(InvokedPrediction invoked = PredictUninvoked); Node statementList(YieldHandling yieldHandling); diff --git a/js/src/js.msg b/js/src/js.msg index 0a686e5f02d7..21fe0d64d90f 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -181,6 +181,7 @@ MSG_DEF(JSMSG_ARRAY_COMP_LEFTSIDE, 0, JSEXN_SYNTAXERR, "invalid array compre MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 0, JSEXN_INTERNALERR, "array initializer too large") MSG_DEF(JSMSG_AS_AFTER_IMPORT_STAR, 0, JSEXN_SYNTAXERR, "missing keyword 'as' after import *") MSG_DEF(JSMSG_AS_AFTER_RESERVED_WORD, 1, JSEXN_SYNTAXERR, "missing keyword 'as' after reserved word '{0}'") +MSG_DEF(JSMSG_ASYNC_GENERATOR, 0, JSEXN_SYNTAXERR, "generator function or method can't be async") MSG_DEF(JSMSG_BAD_ANON_GENERATOR_RETURN, 0, JSEXN_TYPEERR, "anonymous generator function returns a value") MSG_DEF(JSMSG_BAD_ARROW_ARGS, 0, JSEXN_SYNTAXERR, "invalid arrow-function arguments (parentheses around the arrow-function may help)") MSG_DEF(JSMSG_BAD_BINDING, 1, JSEXN_SYNTAXERR, "redefining {0} is deprecated") diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 7c3fa61b902e..5999cdb5730a 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -29,6 +29,7 @@ macro(ArrayValuesAt, ArrayValuesAt, "ArrayValuesAt") \ macro(as, as, "as") \ macro(Async, Async, "Async") \ + macro(async, async, "async") \ macro(await, await, "await") \ macro(Bool8x16, Bool8x16, "Bool8x16") \ macro(Bool16x8, Bool16x8, "Bool16x8") \ From 5c5f21cb109a21ae9dfd4a6b909da2cc2805c72c Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 20:42:40 +0900 Subject: [PATCH 10/61] Bug 1185106 - Part 5.2: Support async function declaration in Reflect.parse. r=efaust,till MozReview-Commit-ID: Gbc8dmANx1v --- js/src/builtin/ReflectParse.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/js/src/builtin/ReflectParse.cpp b/js/src/builtin/ReflectParse.cpp index 6692783718cc..54d024bde870 100644 --- a/js/src/builtin/ReflectParse.cpp +++ b/js/src/builtin/ReflectParse.cpp @@ -466,7 +466,7 @@ class NodeBuilder MOZ_MUST_USE bool function(ASTType type, TokenPos* pos, HandleValue id, NodeVector& args, NodeVector& defaults, HandleValue body, HandleValue rest, GeneratorStyle generatorStyle, - bool isExpression, MutableHandleValue dst); + bool isAsync, bool isExpression, MutableHandleValue dst); MOZ_MUST_USE bool variableDeclarator(HandleValue id, HandleValue init, TokenPos* pos, MutableHandleValue dst); @@ -1590,7 +1590,7 @@ bool NodeBuilder::function(ASTType type, TokenPos* pos, HandleValue id, NodeVector& args, NodeVector& defaults, HandleValue body, HandleValue rest, - GeneratorStyle generatorStyle, bool isExpression, + GeneratorStyle generatorStyle, bool isAsync, bool isExpression, MutableHandleValue dst) { RootedValue array(cx), defarray(cx); @@ -1601,6 +1601,7 @@ NodeBuilder::function(ASTType type, TokenPos* pos, bool isGenerator = generatorStyle != GeneratorStyle::None; RootedValue isGeneratorVal(cx, BooleanValue(isGenerator)); + RootedValue isAsyncVal(cx, BooleanValue(isAsync)); RootedValue isExpressionVal(cx, BooleanValue(isExpression)); RootedValue cb(cx, callbacks[type]); @@ -1624,6 +1625,7 @@ NodeBuilder::function(ASTType type, TokenPos* pos, "body", body, "rest", rest, "generator", isGeneratorVal, + "async", isAsyncVal, "style", styleVal, "expression", isExpressionVal, dst); @@ -1636,6 +1638,7 @@ NodeBuilder::function(ASTType type, TokenPos* pos, "body", body, "rest", rest, "generator", isGeneratorVal, + "async", isAsyncVal, "expression", isExpressionVal, dst); } @@ -3396,6 +3399,7 @@ ASTSerializer::function(ParseNode* pn, ASTType type, MutableHandleValue dst) : GeneratorStyle::ES6) : GeneratorStyle::None; + bool isAsync = pn->pn_funbox->isAsync(); bool isExpression = #if JS_HAS_EXPR_CLOSURES func->isExprBody(); @@ -3417,8 +3421,8 @@ ASTSerializer::function(ParseNode* pn, ASTType type, MutableHandleValue dst) else rest.setNull(); return functionArgsAndBody(pn->pn_body, args, defaults, &body, &rest) && - builder.function(type, &pn->pn_pos, id, args, defaults, body, - rest, generatorStyle, isExpression, dst); + builder.function(type, &pn->pn_pos, id, args, defaults, body, + rest, generatorStyle, isAsync, isExpression, dst); } bool From 53a38b0e6f79f079b85ec9525543e74925643b4e Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 20:42:40 +0900 Subject: [PATCH 11/61] Bug 1185106 - Part 5.3: Support await expression in Parser. r=till MozReview-Commit-ID: BspiXPRu6SR --- js/src/frontend/BytecodeEmitter.cpp | 2 + js/src/frontend/FoldConstants.cpp | 2 + js/src/frontend/FullParseHandler.h | 5 ++ js/src/frontend/NameFunctions.cpp | 1 + js/src/frontend/ParseNode.cpp | 3 +- js/src/frontend/ParseNode.h | 4 +- js/src/frontend/Parser.cpp | 71 +++++++++++++++++++++------- js/src/frontend/Parser.h | 13 +++-- js/src/frontend/SyntaxParseHandler.h | 1 + js/src/js.msg | 2 + 10 files changed, 82 insertions(+), 22 deletions(-) diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 37223938e0d5..89eda16c58a4 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -2465,6 +2465,7 @@ BytecodeEmitter::checkSideEffects(ParseNode* pn, bool* answer) case PNK_YIELD_STAR: case PNK_YIELD: + case PNK_AWAIT: MOZ_ASSERT(pn->isArity(PN_BINARY)); *answer = true; return true; @@ -9252,6 +9253,7 @@ BytecodeEmitter::emitTree(ParseNode* pn, EmitLineNumberNote emitLineNote) break; case PNK_YIELD: + case PNK_AWAIT: if (!emitYield(pn)) return false; break; diff --git a/js/src/frontend/FoldConstants.cpp b/js/src/frontend/FoldConstants.cpp index a8e6074cf8f2..6f62ffac6876 100644 --- a/js/src/frontend/FoldConstants.cpp +++ b/js/src/frontend/FoldConstants.cpp @@ -311,6 +311,7 @@ ContainsHoistedDeclaration(ExclusiveContext* cx, ParseNode* node, bool* result) case PNK_CONDITIONAL: case PNK_TYPEOFNAME: case PNK_TYPEOFEXPR: + case PNK_AWAIT: case PNK_VOID: case PNK_NOT: case PNK_BITNOT: @@ -1783,6 +1784,7 @@ Fold(ExclusiveContext* cx, ParseNode** pnp, Parser& parser, bo return Fold(cx, &pn->pn_left, parser, inGenexpLambda); case PNK_YIELD: + case PNK_AWAIT: MOZ_ASSERT(pn->isArity(PN_BINARY)); MOZ_ASSERT(pn->pn_right->isKind(PNK_NAME) || (pn->pn_right->isKind(PNK_ASSIGN) && diff --git a/js/src/frontend/FullParseHandler.h b/js/src/frontend/FullParseHandler.h index ac3d8e441957..5f903762eaf7 100644 --- a/js/src/frontend/FullParseHandler.h +++ b/js/src/frontend/FullParseHandler.h @@ -432,6 +432,11 @@ class FullParseHandler return new_(PNK_YIELD_STAR, JSOP_NOP, pos, value, gen); } + ParseNode* newAwaitExpression(uint32_t begin, ParseNode* value, ParseNode* gen) { + TokenPos pos(begin, value ? value->pn_pos.end : begin + 1); + return new_(PNK_AWAIT, JSOP_YIELD, pos, value, gen); + } + // Statements ParseNode* newStatementList(const TokenPos& pos) { diff --git a/js/src/frontend/NameFunctions.cpp b/js/src/frontend/NameFunctions.cpp index cfe9c260b17c..ce1318f0b1ef 100644 --- a/js/src/frontend/NameFunctions.cpp +++ b/js/src/frontend/NameFunctions.cpp @@ -507,6 +507,7 @@ class NameResolver break; case PNK_YIELD: + case PNK_AWAIT: MOZ_ASSERT(cur->isArity(PN_BINARY)); if (cur->pn_left) { if (!resolve(cur->pn_left, prefix)) diff --git a/js/src/frontend/ParseNode.cpp b/js/src/frontend/ParseNode.cpp index 9855eabaedd5..f79baba9efdf 100644 --- a/js/src/frontend/ParseNode.cpp +++ b/js/src/frontend/ParseNode.cpp @@ -290,7 +290,8 @@ PushNodeChildren(ParseNode* pn, NodeStack* stack) // variable, or an assignment of a PNK_GENERATOR node to the '.generator' // local, for a synthesized, prepended initial yield. Yum! case PNK_YIELD_STAR: - case PNK_YIELD: { + case PNK_YIELD: + case PNK_AWAIT: { MOZ_ASSERT(pn->isArity(PN_BINARY)); MOZ_ASSERT(pn->pn_right); MOZ_ASSERT(pn->pn_right->isKind(PNK_NAME) || diff --git a/js/src/frontend/ParseNode.h b/js/src/frontend/ParseNode.h index e1df62d7f040..d37aaaae084a 100644 --- a/js/src/frontend/ParseNode.h +++ b/js/src/frontend/ParseNode.h @@ -120,6 +120,7 @@ class ObjectBox; F(VOID) \ F(NOT) \ F(BITNOT) \ + F(AWAIT) \ \ /* \ * Binary operators. \ @@ -350,7 +351,8 @@ IsTypeofKind(ParseNodeKind kind) * PNK_NEG * PNK_VOID, unary pn_kid: UNARY expr * PNK_NOT, - * PNK_BITNOT + * PNK_BITNOT, + * PNK_AWAIT * PNK_TYPEOFNAME, unary pn_kid: UNARY expr * PNK_TYPEOFEXPR * PNK_PREINCREMENT, unary pn_kid: MEMBER expr diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index d6c562e3a43e..e0d5852e64ac 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -857,7 +857,7 @@ Parser::isValidStrictBinding(PropertyName* name) name != context->names().arguments && name != context->names().let && name != context->names().static_ && - !IsKeyword(name); + !(IsKeyword(name) && name != context->names().await); } /* @@ -2734,10 +2734,9 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn funbox->hasDestructuringArgs = true; - Node destruct = destructuringDeclarationWithoutYield( + Node destruct = destructuringDeclarationWithoutYieldOrAwait( DeclarationKind::FormalParameter, - yieldHandling, tt, - JSMSG_YIELD_IN_DEFAULT); + yieldHandling, tt); if (!destruct) return false; @@ -2806,7 +2805,7 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn } funbox->hasParameterExprs = true; - Node def_expr = assignExprWithoutYield(yieldHandling, JSMSG_YIELD_IN_DEFAULT); + Node def_expr = assignExprWithoutYieldOrAwait(yieldHandling); if (!def_expr) return false; if (!handler.setLastFunctionFormalParameterDefault(funcpn, def_expr)) @@ -3351,6 +3350,7 @@ Parser::functionFormalParametersAndBody(InHandling inHandling, FunctionBox* funbox = pc->functionBox(); RootedFunction fun(context, funbox->function()); + AutoAwaitIsKeyword awaitIsKeyword(&tokenStream, funbox->isAsync()); if (!functionArguments(yieldHandling, kind, pn)) return false; @@ -4164,16 +4164,22 @@ Parser::destructuringDeclaration(DeclarationKind kind, YieldHandli template typename ParseHandler::Node -Parser::destructuringDeclarationWithoutYield(DeclarationKind kind, - YieldHandling yieldHandling, - TokenKind tt, unsigned msg) +Parser::destructuringDeclarationWithoutYieldOrAwait(DeclarationKind kind, + YieldHandling yieldHandling, + TokenKind tt) { uint32_t startYieldOffset = pc->lastYieldOffset; + uint32_t startAwaitOffset = pc->lastAwaitOffset; Node res = destructuringDeclaration(kind, yieldHandling, tt); - if (res && pc->lastYieldOffset != startYieldOffset) { - reportWithOffset(ParseError, false, pc->lastYieldOffset, - msg, js_yield_str); - return null(); + if (res) { + if (pc->lastYieldOffset != startYieldOffset) { + reportWithOffset(ParseError, false, pc->lastYieldOffset, JSMSG_YIELD_IN_DEFAULT); + return null(); + } + if (pc->lastAwaitOffset != startAwaitOffset) { + reportWithOffset(ParseError, false, pc->lastAwaitOffset, JSMSG_AWAIT_IN_DEFAULT); + return null(); + } } return res; } @@ -5870,6 +5876,16 @@ Parser::newYieldExpression(uint32_t begin, typename ParseHandler:: return handler.newYieldExpression(begin, expr, generator); } +template +typename ParseHandler::Node +Parser::newAwaitExpression(uint32_t begin, typename ParseHandler::Node expr) +{ + Node generator = newDotGeneratorName(); + if (!generator) + return null(); + return handler.newAwaitExpression(begin, expr, generator); +} + template typename ParseHandler::Node Parser::yieldExpression(InHandling inHandling) @@ -7790,6 +7806,21 @@ Parser::unaryExpr(YieldHandling yieldHandling, TripledotHandling t return handler.newDelete(begin, expr); } + case TOK_AWAIT: { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine, TokenStream::Operand)) + return null(); + if (nextSameLine != TOK_EOL) { + Node kid = unaryExpr(yieldHandling, tripledotHandling, possibleError, invoked); + if (!kid) + return null(); + pc->lastAwaitOffset = begin; + return newAwaitExpression(begin, kid); + } + report(ParseError, false, null(), JSMSG_LINE_BREAK_AFTER_AWAIT); + return null(); + } + default: { Node pn = memberExpr(yieldHandling, tripledotHandling, tt, /* allowCallSyntax = */ true, possibleError, invoked); @@ -8119,14 +8150,20 @@ Parser::generatorComprehension(uint32_t begin) template typename ParseHandler::Node -Parser::assignExprWithoutYield(YieldHandling yieldHandling, unsigned msg) +Parser::assignExprWithoutYieldOrAwait(YieldHandling yieldHandling) { uint32_t startYieldOffset = pc->lastYieldOffset; + uint32_t startAwaitOffset = pc->lastAwaitOffset; Node res = assignExpr(InAllowed, yieldHandling, TripledotProhibited); - if (res && pc->lastYieldOffset != startYieldOffset) { - reportWithOffset(ParseError, false, pc->lastYieldOffset, - msg, js_yield_str); - return null(); + if (res) { + if (pc->lastYieldOffset != startYieldOffset) { + reportWithOffset(ParseError, false, pc->lastYieldOffset, JSMSG_YIELD_IN_DEFAULT); + return null(); + } + if (pc->lastAwaitOffset != startAwaitOffset) { + reportWithOffset(ParseError, false, pc->lastAwaitOffset, JSMSG_AWAIT_IN_DEFAULT); + return null(); + } } return res; } diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 8099c9509345..879e6ea198b7 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -315,6 +315,11 @@ class ParseContext : public Nestable static const uint32_t NoYieldOffset = UINT32_MAX; uint32_t lastYieldOffset; + // lastAwaitOffset stores the offset of the last await that was parsed. + // NoAwaitOffset is its initial value. + static const uint32_t NoAwaitOffset = UINT32_MAX; + uint32_t lastAwaitOffset; + // All inner functions in this context. Only used when syntax parsing. Rooted> innerFunctionsForLazy; @@ -358,6 +363,7 @@ class ParseContext : public Nestable isStandaloneFunctionBody_(false), superScopeNeedsHomeObject_(false), lastYieldOffset(NoYieldOffset), + lastAwaitOffset(NoAwaitOffset), innerFunctionsForLazy(prs->context, GCVector(prs->context)), newDirectives(newDirectives), funHasReturnExpr(false), @@ -989,6 +995,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter inline Node newName(PropertyName* name); inline Node newName(PropertyName* name, TokenPos pos); inline Node newYieldExpression(uint32_t begin, Node expr, bool isYieldStar = false); + inline Node newAwaitExpression(uint32_t begin, Node expr); inline bool abortIfSyntaxParser(); @@ -1185,7 +1192,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter Node assignExpr(InHandling inHandling, YieldHandling yieldHandling, TripledotHandling tripledotHandling, PossibleError* possibleError = nullptr, InvokedPrediction invoked = PredictUninvoked); - Node assignExprWithoutYield(YieldHandling yieldHandling, unsigned err); + Node assignExprWithoutYieldOrAwait(YieldHandling yieldHandling); Node yieldExpression(InHandling inHandling); Node condExpr1(InHandling inHandling, YieldHandling yieldHandling, TripledotHandling tripledotHandling, @@ -1246,8 +1253,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter bool argumentList(YieldHandling yieldHandling, Node listNode, bool* isSpread); Node destructuringDeclaration(DeclarationKind kind, YieldHandling yieldHandling, TokenKind tt); - Node destructuringDeclarationWithoutYield(DeclarationKind kind, YieldHandling yieldHandling, - TokenKind tt, unsigned msg); + Node destructuringDeclarationWithoutYieldOrAwait(DeclarationKind kind, YieldHandling yieldHandling, + TokenKind tt); bool namedImportsOrNamespaceImport(TokenKind tt, Node importSpecSet); bool checkExportedName(JSAtom* exportName); diff --git a/js/src/frontend/SyntaxParseHandler.h b/js/src/frontend/SyntaxParseHandler.h index e9a2603143f7..61b76c3b077d 100644 --- a/js/src/frontend/SyntaxParseHandler.h +++ b/js/src/frontend/SyntaxParseHandler.h @@ -289,6 +289,7 @@ class SyntaxParseHandler MOZ_MUST_USE bool addClassMethodDefinition(Node literal, Node name, Node fn, JSOp op, bool isStatic) { return true; } Node newYieldExpression(uint32_t begin, Node value, Node gen) { return NodeGeneric; } Node newYieldStarExpression(uint32_t begin, Node value, Node gen) { return NodeGeneric; } + Node newAwaitExpression(uint32_t begin, Node value, Node gen) { return NodeGeneric; } // Statements diff --git a/js/src/js.msg b/js/src/js.msg index 21fe0d64d90f..be07455c76ed 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -182,6 +182,7 @@ MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 0, JSEXN_INTERNALERR, "array initializer MSG_DEF(JSMSG_AS_AFTER_IMPORT_STAR, 0, JSEXN_SYNTAXERR, "missing keyword 'as' after import *") MSG_DEF(JSMSG_AS_AFTER_RESERVED_WORD, 1, JSEXN_SYNTAXERR, "missing keyword 'as' after reserved word '{0}'") MSG_DEF(JSMSG_ASYNC_GENERATOR, 0, JSEXN_SYNTAXERR, "generator function or method can't be async") +MSG_DEF(JSMSG_AWAIT_IN_DEFAULT, 0, JSEXN_SYNTAXERR, "await can't be used in default expression") MSG_DEF(JSMSG_BAD_ANON_GENERATOR_RETURN, 0, JSEXN_TYPEERR, "anonymous generator function returns a value") MSG_DEF(JSMSG_BAD_ARROW_ARGS, 0, JSEXN_SYNTAXERR, "invalid arrow-function arguments (parentheses around the arrow-function may help)") MSG_DEF(JSMSG_BAD_BINDING, 1, JSEXN_SYNTAXERR, "redefining {0} is deprecated") @@ -263,6 +264,7 @@ MSG_DEF(JSMSG_LABEL_NOT_FOUND, 0, JSEXN_SYNTAXERR, "label not found") MSG_DEF(JSMSG_LET_COMP_BINDING, 0, JSEXN_SYNTAXERR, "'let' is not a valid name for a comprehension variable") MSG_DEF(JSMSG_LEXICAL_DECL_NOT_IN_BLOCK, 1, JSEXN_SYNTAXERR, "{0} declaration not directly within block") MSG_DEF(JSMSG_LEXICAL_DECL_LABEL, 1, JSEXN_SYNTAXERR, "{0} declarations cannot be labelled") +MSG_DEF(JSMSG_LINE_BREAK_AFTER_AWAIT, 0, JSEXN_SYNTAXERR, "no line break is allowed after 'await'") MSG_DEF(JSMSG_GENERATOR_LABEL, 0, JSEXN_SYNTAXERR, "generator functions cannot be labelled") MSG_DEF(JSMSG_FUNCTION_LABEL, 0, JSEXN_SYNTAXERR, "functions cannot be labelled") MSG_DEF(JSMSG_SLOPPY_FUNCTION_LABEL, 0, JSEXN_SYNTAXERR, "functions can only be labelled inside blocks") From 1ab333095c450031fca4309edf01145be1867fc0 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:57:33 +0900 Subject: [PATCH 12/61] Bug 1185106 - Part 5.4: Support await expression in Reflect.parse. r=efaust,till MozReview-Commit-ID: 7J8CeaYhP1X --- js/src/builtin/ReflectParse.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/js/src/builtin/ReflectParse.cpp b/js/src/builtin/ReflectParse.cpp index 54d024bde870..7e30de7b02c1 100644 --- a/js/src/builtin/ReflectParse.cpp +++ b/js/src/builtin/ReflectParse.cpp @@ -93,6 +93,7 @@ enum UnaryOperator { UNOP_BITNOT, UNOP_TYPEOF, UNOP_VOID, + UNOP_AWAIT, UNOP_LIMIT }; @@ -162,7 +163,8 @@ static const char* const unopNames[] = { "!", /* UNOP_NOT */ "~", /* UNOP_BITNOT */ "typeof", /* UNOP_TYPEOF */ - "void" /* UNOP_VOID */ + "void", /* UNOP_VOID */ + "await" /* UNOP_AWAIT */ }; static const char* const nodeTypeNames[] = { @@ -1883,6 +1885,9 @@ ASTSerializer::unop(ParseNodeKind kind, JSOp op) if (IsTypeofKind(kind)) return UNOP_TYPEOF; + if (kind == PNK_AWAIT) + return UNOP_AWAIT; + switch (op) { case JSOP_NEG: return UNOP_NEG; @@ -2910,7 +2915,7 @@ ASTSerializer::expression(ParseNode* pn, MutableHandleValue dst) return leftAssociate(pn, dst); case PNK_POW: - return rightAssociate(pn, dst); + return rightAssociate(pn, dst); case PNK_DELETENAME: case PNK_DELETEPROP: @@ -2922,6 +2927,7 @@ ASTSerializer::expression(ParseNode* pn, MutableHandleValue dst) case PNK_NOT: case PNK_BITNOT: case PNK_POS: + case PNK_AWAIT: case PNK_NEG: { MOZ_ASSERT(pn->pn_pos.encloses(pn->pn_kid->pn_pos)); From a6fc46cb199aead0f283d739fd8024f46d4d0bee Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:58:21 +0900 Subject: [PATCH 13/61] Bug 1185106 - Part 5.5: Add parser test for async function declaration. r=efaust,till MozReview-Commit-ID: I8gqeShK7ch --- js/src/jit-test/lib/syntax.js | 25 +++++- .../ecma_7/AsyncFunctions/EarlyErrors.js | 37 +++++++++ js/src/tests/ecma_7/AsyncFunctions/shell.js | 0 js/src/tests/ecma_7/AsyncFunctions/syntax.js | 77 +++++++++++++++++++ .../js1_8_5/reflect-parse/PatternBuilders.js | 28 +++++++ js/src/tests/js1_8_5/reflect-parse/async.js | 10 +++ 6 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js create mode 100644 js/src/tests/ecma_7/AsyncFunctions/shell.js create mode 100644 js/src/tests/ecma_7/AsyncFunctions/syntax.js create mode 100644 js/src/tests/js1_8_5/reflect-parse/async.js diff --git a/js/src/jit-test/lib/syntax.js b/js/src/jit-test/lib/syntax.js index a9d8e8fd4b4c..c51beaeb4c6b 100644 --- a/js/src/jit-test/lib/syntax.js +++ b/js/src/jit-test/lib/syntax.js @@ -1181,7 +1181,7 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("for each (let x in y "); test("for each (let x in y) "); - // asm.js + // ==== asm.js ==== test("(function() { 'use asm'; "); test("(function() { 'use asm'; var "); @@ -1208,4 +1208,27 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; } "); test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; }) "); test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; }); "); + + // ==== async/await ==== + + // async/await function decralation + + test("async "); + test("async function "); + test("async function A "); + test("async function A( "); + test("async function A() "); + test("async function A(a "); + test("async function A(a) "); + test("async function A(a) { "); + test("async function A(a) {} "); + test("async function A(a) { await "); + test("async function A(a) { await X "); + test("async function A(a) { await X; "); + test("async function A(a) { await X; } "); + test("async function A(a) { await await "); + test("async function A(a) { await await await "); + test("async function A(a) { await await await X "); + test("async function A(a) { await await await X; "); + test("async function A(a) { await await await X; } "); } diff --git a/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js b/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js new file mode 100644 index 000000000000..f6053ce40bcc --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js @@ -0,0 +1,37 @@ +var BUGNUMBER = 1185106; +var summary = "EarlyErrors for async function"; + +print(BUGNUMBER + ": " + summary); + +function assertThrowsSE(code) { + assertThrows(() => Reflect.parse(code), SyntaxError); +} + +if (typeof Reflect !== "undefined" && Reflect.parse) { + // If FormalParameters Contains AwaitExpression is true. + assertThrowsSE("async function a(k = await 3) {}"); + + // If BindingIdentifier is `eval` or `arguments`. + assertThrowsSE("'use strict'; async function eval() {}"); + + assertThrowsSE("'use strict'; async function arguments() {}"); + + // If any element of the BoundNames of FormalParameters also occurs in the + // LexicallyDeclaredNames of AsyncFunctionBody. + assertThrowsSE("async function a(x) { let x; }"); + + // If FormalParameters contains SuperProperty is true. + assertThrowsSE("async function a(k = super.prop) { }"); + + // If AsyncFunctionBody contains SuperProperty is true. + assertThrowsSE("async function a() { super.prop(); }"); + + // If FormalParameters contains SuperCall is true. + assertThrowsSE("async function a(k = super()) {}"); + + // If AsyncFunctionBody contains SuperCall is true. + assertThrowsSE("async function a() { super(); }"); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_7/AsyncFunctions/shell.js b/js/src/tests/ecma_7/AsyncFunctions/shell.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax.js b/js/src/tests/ecma_7/AsyncFunctions/syntax.js new file mode 100644 index 000000000000..7950773def7b --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax.js @@ -0,0 +1,77 @@ +var BUGNUMBER = 1185106; +var summary = "async/await syntax"; + +print(BUGNUMBER + ": " + summary); + +if (typeof Reflect !== "undefined" && Reflect.parse) { + assertEq(Reflect.parse("function a() {}").body[0].async, false); + assertEq(Reflect.parse("function* a() {}").body[0].async, false); + assertEq(Reflect.parse("async function a() {}").body[0].async, true); + + // Async generators are not allowed (with regards to spec) + assertThrows(() => Reflect.parse("async function* a() {}"), SyntaxError); + + // No line terminator after async + assertEq(Reflect.parse("async\nfunction a(){}").body[0].expression.name, "async"); + + // `await` handling for function declaration name inherits. + assertEq(Reflect.parse("async function await() {}").body[0].id.name, "await"); + assertThrows(() => Reflect.parse("async function f() { async function await() {} }"), SyntaxError); + + // Awaiting not directly inside an async function is not allowed + assertThrows(() => Reflect.parse("await 4;"), SyntaxError); + assertThrows(() => Reflect.parse("function a() { await 4; }"), SyntaxError); + assertThrows(() => Reflect.parse("function* a() { await 4; }"), SyntaxError); + assertThrows(() => Reflect.parse("async function k() { function a() { await 4; } }"), SyntaxError); + + // No line terminator after await is allowed + assertThrows(() => Reflect.parse("async function a() { await\n4; }"), SyntaxError); + + // Await is not allowed as a default expr. + assertThrows(() => Reflect.parse("async function a(k = await 3) {}"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { async function b(k = await 3) {} }"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { async function b(k = [await 3]) {} }"), SyntaxError); + + assertThrows(() => Reflect.parse("async function a() { async function b([k = await 3]) {} }"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { async function b([k = [await 3]]) {} }"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { async function b({k = await 3}) {} }"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { async function b({k = [await 3]}) {} }"), SyntaxError); + + // Await is not legal as an identifier in an async function. + assertThrows(() => Reflect.parse("async function a() { var await = 4; }"), SyntaxError); + assertThrows(() => Reflect.parse("async function a() { return await; }"), SyntaxError); + + // Await is still available as an identifier name in strict mode code. + Reflect.parse("function a() { 'use strict'; var await = 3; }"); + Reflect.parse("'use strict'; var await = 3;"); + + // Await is treated differently depending on context. Various cases. + Reflect.parse("var await = 3; async function a() { await 4; }"); + Reflect.parse("async function a() { await 4; } var await = 5"); + Reflect.parse("async function a() { function b() { return await; } }"); + + Reflect.parse("async function a() { var k = { async: 4 } }"); + + Reflect.parse("function a() { await: 4 }"); + + assertEq(Reflect.parse("async function a() { await 4; }") + .body[0].body.body[0].expression.operator, "await"); + + assertEq(Reflect.parse("async function a() { async function b() { await 4; } }") + .body[0].body.body[0].body.body[0].expression.operator, "await"); + + // operator priority test + assertEq(Reflect.parse("async function a() { await 2 + 3; }") + .body[0].body.body[0].expression.left.argument.value, 2); + assertEq(Reflect.parse("async function a() { await 2 + 3; }") + .body[0].body.body[0].expression.left.operator, "await"); + assertEq(Reflect.parse("async function a() { await 2 + 3; }") + .body[0].body.body[0].expression.right.value, 3); + + // blocks and other constructions + assertEq(Reflect.parse("{ async function a() { return 2; } }") + .body[0].body[0].async, true); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/js1_8_5/reflect-parse/PatternBuilders.js b/js/src/tests/js1_8_5/reflect-parse/PatternBuilders.js index 765fa3a9757c..be65bd76e720 100644 --- a/js/src/tests/js1_8_5/reflect-parse/PatternBuilders.js +++ b/js/src/tests/js1_8_5/reflect-parse/PatternBuilders.js @@ -47,6 +47,16 @@ function genFunDecl(style, id, params, body) { generator: true, style: style }); } +function asyncFunDecl(id, params, body) { + return Pattern({ type: "FunctionDeclaration", + id: id, + params: params, + defaults: [], + body: body, + generator: true, + async: true, + style: "es6" }); +} function varDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" }); } @@ -166,11 +176,29 @@ function genFunExpr(style, id, args, body) { generator: true, style: style }); } +function asyncFunExpr(id, args, body) { + return Pattern({ type: "FunctionExpression", + id: id, + params: args, + body: body, + generator: true, + async: true, + style: "es6" }); +} function arrowExpr(args, body) { return Pattern({ type: "ArrowFunctionExpression", params: args, body: body }); } +function asyncArrowExpr(isExpression, args, body) { + return Pattern({ type: "ArrowFunctionExpression", + params: args, + body: body, + generator: true, + async: true, + expression: isExpression, + style: "es6" }); +} function metaProperty(meta, property) { return Pattern({ type: "MetaProperty", diff --git a/js/src/tests/js1_8_5/reflect-parse/async.js b/js/src/tests/js1_8_5/reflect-parse/async.js new file mode 100644 index 000000000000..fb544da6a914 --- /dev/null +++ b/js/src/tests/js1_8_5/reflect-parse/async.js @@ -0,0 +1,10 @@ +// |reftest| skip-if(!xulRuntime.shell) + +// async function declaration. +assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([]))); + +// await expression. +assertDecl("async function foo() { await bar }", asyncFunDecl(ident("foo"), [], blockStmt([exprStmt(unExpr("await", ident("bar")))]))); + +if (typeof reportCompare === 'function') + reportCompare(true, true); From 3c26089d3ace38ea5830393ea6cf8c3f38dfabde Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:28 +0900 Subject: [PATCH 14/61] Bug 1185106 - Part 5.6: Add parser test for yield in async function declaration. r=till MozReview-Commit-ID: DsqGxUONwDr --- js/src/tests/ecma_7/AsyncFunctions/yield.js | 42 +++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/yield.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/yield.js b/js/src/tests/ecma_7/AsyncFunctions/yield.js new file mode 100644 index 000000000000..e72c88bf79ba --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/yield.js @@ -0,0 +1,42 @@ +var BUGNUMBER = 1185106; +var summary = "yield handling in async function"; + +print(BUGNUMBER + ": " + summary); + +function testPassArgsBody(argsbody) { + Reflect.parse(`async function a${argsbody}`); +} + +function testErrorArgsBody(argsbody, prefix="") { + assertThrows(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError); +} + +function testErrorArgsBodyStrict(argsbody) { + testErrorArgsBody(argsbody); + testErrorArgsBody(argsbody, "'use strict'; "); +} + +if (typeof Reflect !== "undefined" && Reflect.parse) { + // `yield` handling is inherited in async function declaration name. + Reflect.parse("async function yield() {}"); + Reflect.parse("function f() { async function yield() {} }"); + assertThrows(() => Reflect.parse("function* g() { async function yield() {} }"), SyntaxError); + assertThrows(() => Reflect.parse("'use strict'; async function yield() {}"), SyntaxError); + + // `yield` is treated as an identifier in an async function parameter + // `yield` is not allowed as an identifier in strict code. + testPassArgsBody("(yield) {}"); + testPassArgsBody("(yield = 1) {}"); + testPassArgsBody("(a = yield) {}"); + testErrorArgsBodyStrict("(yield 3) {}"); + testErrorArgsBodyStrict("(a = yield 3) {}"); + + // `yield` is treated as an identifier in an async function body + // `yield` is not allowed as an identifier in strict code. + testPassArgsBody("() { yield; }"); + testPassArgsBody("() { yield = 1; }"); + testErrorArgsBodyStrict("() { yield 3; }"); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); From cde768307ed041636afd6c6f7980934532f6f952 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:28 +0900 Subject: [PATCH 15/61] Bug 1185106 - Part 6.1: Support async function expression in Parser. r=till MozReview-Commit-ID: Ed7PAq3bNTX --- js/src/frontend/Parser.cpp | 24 ++++++++++++++++++++---- js/src/frontend/Parser.h | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index e0d5852e64ac..805a839c94bf 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -3523,22 +3523,27 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling template typename ParseHandler::Node -Parser::functionExpr(InvokedPrediction invoked) +Parser::functionExpr(InvokedPrediction invoked, FunctionAsyncKind asyncKind) { MOZ_ASSERT(tokenStream.isCurrentTokenType(TOK_FUNCTION)); - GeneratorKind generatorKind = NotGenerator; + AutoAwaitIsKeyword awaitIsKeyword(&tokenStream, asyncKind == AsyncFunction); + GeneratorKind generatorKind = asyncKind == AsyncFunction ? StarGenerator : NotGenerator; TokenKind tt; if (!tokenStream.getToken(&tt)) return null(); if (tt == TOK_MUL) { + if (asyncKind != SyncFunction) { + report(ParseError, false, null(), JSMSG_ASYNC_GENERATOR); + return null(); + } generatorKind = StarGenerator; if (!tokenStream.getToken(&tt)) return null(); } - YieldHandling yieldHandling = GetYieldHandling(generatorKind, SyncFunction); + YieldHandling yieldHandling = GetYieldHandling(generatorKind, asyncKind); RootedPropertyName name(context); if (tt == TOK_NAME || tt == TOK_YIELD) { @@ -3550,7 +3555,7 @@ Parser::functionExpr(InvokedPrediction invoked) } return functionDefinition(InAllowed, yieldHandling, name, Expression, generatorKind, - SyncFunction, invoked); + asyncKind, invoked); } /* @@ -9239,6 +9244,17 @@ Parser::primaryExpr(YieldHandling yieldHandling, TripledotHandling case TOK_YIELD: case TOK_NAME: { + if (tokenStream.currentName() == context->names().async) { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine)) + return null(); + + if (nextSameLine == TOK_FUNCTION) { + tokenStream.consumeKnownToken(TOK_FUNCTION); + return functionExpr(PredictUninvoked, AsyncFunction); + } + } + Rooted name(context, identifierReference(yieldHandling)); if (!name) return null(); diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 879e6ea198b7..9642611b92b6 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -1087,7 +1087,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter */ Node functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling, FunctionAsyncKind asyncKind = SyncFunction); - Node functionExpr(InvokedPrediction invoked = PredictUninvoked); + Node functionExpr(InvokedPrediction invoked = PredictUninvoked, + FunctionAsyncKind asyncKind = SyncFunction); Node statementList(YieldHandling yieldHandling); From a4d5557a25d81cfae75746bb0296e373ffb402ee Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:58:28 +0900 Subject: [PATCH 16/61] Bug 1185106 - Part 6.2: Add parser test for async function expression. r=efaust,till MozReview-Commit-ID: 4C5ePdMARoJ --- js/src/jit-test/lib/syntax.js | 29 +++++++++++++++++++ .../ecma_7/AsyncFunctions/EarlyErrors.js | 14 +++++++++ js/src/tests/ecma_7/AsyncFunctions/syntax.js | 11 +++++++ js/src/tests/js1_8_5/reflect-parse/async.js | 4 +++ 4 files changed, 58 insertions(+) diff --git a/js/src/jit-test/lib/syntax.js b/js/src/jit-test/lib/syntax.js index c51beaeb4c6b..2aa3ff28374c 100644 --- a/js/src/jit-test/lib/syntax.js +++ b/js/src/jit-test/lib/syntax.js @@ -1231,4 +1231,33 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("async function A(a) { await await await X "); test("async function A(a) { await await await X; "); test("async function A(a) { await await await X; } "); + + // async/await function expression + + test("(async "); + test("(async function "); + test("(async function A "); + test("(async function A( "); + test("(async function A() "); + test("(async function A(a "); + test("(async function A(a) "); + test("(async function A(a) { "); + test("(async function A(a) {} "); + test("(async function A(a) { await "); + test("(async function A(a) { await X "); + test("(async function A(a) { await X; "); + test("(async function A(a) { await X; } "); + test("(async function A(a) { await X; }) "); + + test("(async function ( "); + test("(async function () "); + test("(async function (a "); + test("(async function (a) "); + test("(async function (a) { "); + test("(async function (a) {} "); + test("(async function (a) { await "); + test("(async function (a) { await X "); + test("(async function (a) { await X; "); + test("(async function (a) { await X; } "); + test("(async function (a) { await X; }) "); } diff --git a/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js b/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js index f6053ce40bcc..cb28d104b479 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js +++ b/js/src/tests/ecma_7/AsyncFunctions/EarlyErrors.js @@ -10,27 +10,41 @@ function assertThrowsSE(code) { if (typeof Reflect !== "undefined" && Reflect.parse) { // If FormalParameters Contains AwaitExpression is true. assertThrowsSE("async function a(k = await 3) {}"); + assertThrowsSE("(async function(k = await 3) {})"); + assertThrowsSE("(async function a(k = await 3) {})"); // If BindingIdentifier is `eval` or `arguments`. assertThrowsSE("'use strict'; async function eval() {}"); + assertThrowsSE("'use strict'; (async function eval() {})"); assertThrowsSE("'use strict'; async function arguments() {}"); + assertThrowsSE("'use strict'; (async function arguments() {})"); // If any element of the BoundNames of FormalParameters also occurs in the // LexicallyDeclaredNames of AsyncFunctionBody. assertThrowsSE("async function a(x) { let x; }"); + assertThrowsSE("(async function(x) { let x; })"); + assertThrowsSE("(async function a(x) { let x; })"); // If FormalParameters contains SuperProperty is true. assertThrowsSE("async function a(k = super.prop) { }"); + assertThrowsSE("(async function(k = super.prop) {})"); + assertThrowsSE("(async function a(k = super.prop) {})"); // If AsyncFunctionBody contains SuperProperty is true. assertThrowsSE("async function a() { super.prop(); }"); + assertThrowsSE("(async function() { super.prop(); })"); + assertThrowsSE("(async function a() { super.prop(); })"); // If FormalParameters contains SuperCall is true. assertThrowsSE("async function a(k = super()) {}"); + assertThrowsSE("(async function(k = super()) {})"); + assertThrowsSE("(async function a(k = super()) {})"); // If AsyncFunctionBody contains SuperCall is true. assertThrowsSE("async function a() { super(); }"); + assertThrowsSE("(async function() { super(); })"); + assertThrowsSE("(async function a() { super(); })"); } if (typeof reportCompare === "function") diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax.js b/js/src/tests/ecma_7/AsyncFunctions/syntax.js index 7950773def7b..5e38902e3212 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/syntax.js +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax.js @@ -14,10 +14,18 @@ if (typeof Reflect !== "undefined" && Reflect.parse) { // No line terminator after async assertEq(Reflect.parse("async\nfunction a(){}").body[0].expression.name, "async"); + // Async function expressions + assertEq(Reflect.parse("(async function() {})()").body[0].expression.callee.async, true); + assertEq(Reflect.parse("var k = async function() {}").body[0].declarations[0].init.async, true); + assertEq(Reflect.parse("var nmd = async function named() {}").body[0].declarations[0].init.id.name, "named"); + // `await` handling for function declaration name inherits. assertEq(Reflect.parse("async function await() {}").body[0].id.name, "await"); assertThrows(() => Reflect.parse("async function f() { async function await() {} }"), SyntaxError); + // `await` is not allowed in function expression name. + assertThrows(() => Reflect.parse("(async function await() {})"), SyntaxError); + // Awaiting not directly inside an async function is not allowed assertThrows(() => Reflect.parse("await 4;"), SyntaxError); assertThrows(() => Reflect.parse("function a() { await 4; }"), SyntaxError); @@ -71,6 +79,9 @@ if (typeof Reflect !== "undefined" && Reflect.parse) { // blocks and other constructions assertEq(Reflect.parse("{ async function a() { return 2; } }") .body[0].body[0].async, true); + + // Async function expression is primary expression. + Reflect.parse("(async function a() {}.constructor)"); } if (typeof reportCompare === "function") diff --git a/js/src/tests/js1_8_5/reflect-parse/async.js b/js/src/tests/js1_8_5/reflect-parse/async.js index fb544da6a914..e28f5de59ab1 100644 --- a/js/src/tests/js1_8_5/reflect-parse/async.js +++ b/js/src/tests/js1_8_5/reflect-parse/async.js @@ -3,6 +3,10 @@ // async function declaration. assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([]))); +// async function expression. +assertExpr("(async function() {})", asyncFunExpr(null, [], blockStmt([]))); +assertExpr("(async function foo() {})", asyncFunExpr(ident("foo"), [], blockStmt([]))); + // await expression. assertDecl("async function foo() { await bar }", asyncFunDecl(ident("foo"), [], blockStmt([exprStmt(unExpr("await", ident("bar")))]))); From 03865c6e52a1a084ef3695ab3deaa3bb71d54d5a Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:28 +0900 Subject: [PATCH 17/61] Bug 1185106 - Part 6.3: Add parser test for yield in async function expression. r=till MozReview-Commit-ID: CovUsWjP1ER --- js/src/tests/ecma_7/AsyncFunctions/yield.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/js/src/tests/ecma_7/AsyncFunctions/yield.js b/js/src/tests/ecma_7/AsyncFunctions/yield.js index e72c88bf79ba..a0e54605df17 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/yield.js +++ b/js/src/tests/ecma_7/AsyncFunctions/yield.js @@ -5,10 +5,14 @@ print(BUGNUMBER + ": " + summary); function testPassArgsBody(argsbody) { Reflect.parse(`async function a${argsbody}`); + Reflect.parse(`(async function a${argsbody})`); + Reflect.parse(`(async function ${argsbody})`); } function testErrorArgsBody(argsbody, prefix="") { assertThrows(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError); + assertThrows(() => Reflect.parse(`${prefix} (async function a${argsbody})`), SyntaxError); + assertThrows(() => Reflect.parse(`${prefix} (async function ${argsbody})`), SyntaxError); } function testErrorArgsBodyStrict(argsbody) { @@ -23,6 +27,13 @@ if (typeof Reflect !== "undefined" && Reflect.parse) { assertThrows(() => Reflect.parse("function* g() { async function yield() {} }"), SyntaxError); assertThrows(() => Reflect.parse("'use strict'; async function yield() {}"), SyntaxError); + // `yield` is treated as an identifier in an async function expression name. + // `yield` is not allowed as an identifier in strict code. + Reflect.parse("(async function yield() {});"); + Reflect.parse("function f() { (async function yield() {}); }"); + Reflect.parse("function* g() { (async function yield() {}); }"); + assertThrows(() => Reflect.parse("'use strict'; (async function yield() {});"), SyntaxError); + // `yield` is treated as an identifier in an async function parameter // `yield` is not allowed as an identifier in strict code. testPassArgsBody("(yield) {}"); From d4f1a569f2bfe24ffa68b2e499ff5a4b564cf7c1 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:58:28 +0900 Subject: [PATCH 18/61] Bug 1185106 - Part 7.1: Support async method in Parser. r=efaust,jwalden,till MozReview-Commit-ID: IqaY6IwRiHr --- js/src/frontend/Parser.cpp | 51 +++++++++++++++++++++++++++++++++----- js/src/frontend/Parser.h | 1 + 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 805a839c94bf..8f1eafe6a079 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -6403,6 +6403,7 @@ JSOpFromPropertyType(PropertyType propType) case PropertyType::Normal: case PropertyType::Method: case PropertyType::GeneratorMethod: + case PropertyType::AsyncMethod: case PropertyType::Constructor: case PropertyType::DerivedConstructor: return JSOP_INITPROP; @@ -6424,8 +6425,8 @@ FunctionSyntaxKindFromPropertyType(PropertyType propType) case PropertyType::SetterNoExpressionClosure: return SetterNoExpressionClosure; case PropertyType::Method: - return Method; case PropertyType::GeneratorMethod: + case PropertyType::AsyncMethod: return Method; case PropertyType::Constructor: return ClassConstructor; @@ -6439,7 +6440,19 @@ FunctionSyntaxKindFromPropertyType(PropertyType propType) static GeneratorKind GeneratorKindFromPropertyType(PropertyType propType) { - return propType == PropertyType::GeneratorMethod ? StarGenerator : NotGenerator; + if (propType == PropertyType::GeneratorMethod) + return StarGenerator; + if (propType == PropertyType::AsyncMethod) + return StarGenerator; + return NotGenerator; +} + +static FunctionAsyncKind +AsyncKindFromPropertyType(PropertyType propType) +{ + if (propType == PropertyType::AsyncMethod) + return AsyncFunction; + return SyncFunction; } template @@ -6553,6 +6566,7 @@ Parser::classDefinition(YieldHandling yieldHandling, if (propType != PropertyType::Getter && propType != PropertyType::Setter && propType != PropertyType::Method && propType != PropertyType::GeneratorMethod && + propType != PropertyType::AsyncMethod && propType != PropertyType::Constructor && propType != PropertyType::DerivedConstructor) { report(ParseError, false, null(), JSMSG_BAD_METHOD_DEF); @@ -8742,12 +8756,31 @@ Parser::propertyName(YieldHandling yieldHandling, Node propList, MOZ_ASSERT(ltok != TOK_RC, "caller should have handled TOK_RC"); bool isGenerator = false; + bool isAsync = false; if (ltok == TOK_MUL) { isGenerator = true; if (!tokenStream.getToken(<ok, TokenStream::KeywordIsName)) return null(); } + if (ltok == TOK_NAME && tokenStream.currentName() == context->names().async) { + TokenKind tt; + if (!tokenStream.getToken(&tt, TokenStream::KeywordIsName)) + return null(); + if (tt != TOK_LP && tt != TOK_COLON) { + isAsync = true; + ltok = tt; + } else { + tokenStream.ungetToken(); + tokenStream.addModifierException(TokenStream::NoneIsKeywordIsName); + } + } + + if (isAsync && isGenerator) { + report(ParseError, false, null(), JSMSG_ASYNC_GENERATOR); + return null(); + } + propAtom.set(nullptr); Node propName; switch (ltok) { @@ -8769,7 +8802,7 @@ Parser::propertyName(YieldHandling yieldHandling, Node propList, case TOK_NAME: { propAtom.set(tokenStream.currentName()); // Do not look for accessor syntax on generators - if (isGenerator || + if (isGenerator || isAsync || !(propAtom.get() == context->names().get || propAtom.get() == context->names().set)) { @@ -8888,7 +8921,12 @@ Parser::propertyName(YieldHandling yieldHandling, Node propList, if (tt == TOK_LP) { tokenStream.ungetToken(); - *propType = isGenerator ? PropertyType::GeneratorMethod : PropertyType::Method; + if (isGenerator) + *propType = PropertyType::GeneratorMethod; + else if (isAsync) + *propType = PropertyType::AsyncMethod; + else + *propType = PropertyType::Method; return propName; } @@ -9120,8 +9158,9 @@ Parser::methodDefinition(PropertyType propType, HandleAtom funName { FunctionSyntaxKind kind = FunctionSyntaxKindFromPropertyType(propType); GeneratorKind generatorKind = GeneratorKindFromPropertyType(propType); - YieldHandling yieldHandling = GetYieldHandling(generatorKind, SyncFunction); - return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind, SyncFunction); + FunctionAsyncKind asyncKind = AsyncKindFromPropertyType(propType); + YieldHandling yieldHandling = GetYieldHandling(generatorKind, asyncKind); + return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind, asyncKind); } template diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 9642611b92b6..6597ae0ac3af 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -567,6 +567,7 @@ enum class PropertyType { SetterNoExpressionClosure, Method, GeneratorMethod, + AsyncMethod, Constructor, DerivedConstructor }; From 925b84ddb866a2fbb3e31802d9e9a8cd88f0deb4 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 19/61] Bug 1185106 - Part 7.2: Add parser test for async method. r=efaust,till MozReview-Commit-ID: Lv2sjpSILhz --- js/src/jit-test/lib/syntax.js | 24 +++++++++++++++++++++ js/src/tests/js1_8_5/reflect-parse/async.js | 6 ++++++ 2 files changed, 30 insertions(+) diff --git a/js/src/jit-test/lib/syntax.js b/js/src/jit-test/lib/syntax.js index 2aa3ff28374c..e7b687adf02c 100644 --- a/js/src/jit-test/lib/syntax.js +++ b/js/src/jit-test/lib/syntax.js @@ -1260,4 +1260,28 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("(async function (a) { await X; "); test("(async function (a) { await X; } "); test("(async function (a) { await X; }) "); + + // async/await method + + test("({ async "); + test("({ async m "); + test("({ async m( "); + test("({ async m() "); + test("({ async m() { "); + test("({ async m() {} "); + test("({ async m() {}, "); + + test("class X { async "); + test("class X { async m "); + test("class X { async m( "); + test("class X { async m() "); + test("class X { async m() { "); + test("class X { async m() {} "); + + test("class X { static async "); + test("class X { static async m "); + test("class X { static async m( "); + test("class X { static async m() "); + test("class X { static async m() { "); + test("class X { static async m() {} "); } diff --git a/js/src/tests/js1_8_5/reflect-parse/async.js b/js/src/tests/js1_8_5/reflect-parse/async.js index e28f5de59ab1..8be10d05b11b 100644 --- a/js/src/tests/js1_8_5/reflect-parse/async.js +++ b/js/src/tests/js1_8_5/reflect-parse/async.js @@ -7,6 +7,12 @@ assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([ assertExpr("(async function() {})", asyncFunExpr(null, [], blockStmt([]))); assertExpr("(async function foo() {})", asyncFunExpr(ident("foo"), [], blockStmt([]))); +// async method. +assertExpr("({ async foo() {} })", objExpr([{ key: ident("foo"), value: asyncFunExpr(ident("foo"), [], blockStmt([]))}])); + +assertStmt("class C { async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", false)])); +assertStmt("class C { static async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", true)])); + // await expression. assertDecl("async function foo() { await bar }", asyncFunDecl(ident("foo"), [], blockStmt([exprStmt(unExpr("await", ident("bar")))]))); From a557c2b0994d222487ced3210ce6af6426e72602 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 20/61] Bug 1185106 - Part 7.3: Add parser test for yield in async method. r=till MozReview-Commit-ID: EkJSBtUFijk --- js/src/tests/ecma_7/AsyncFunctions/yield.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/js/src/tests/ecma_7/AsyncFunctions/yield.js b/js/src/tests/ecma_7/AsyncFunctions/yield.js index a0e54605df17..f018c9b8ff00 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/yield.js +++ b/js/src/tests/ecma_7/AsyncFunctions/yield.js @@ -7,17 +7,21 @@ function testPassArgsBody(argsbody) { Reflect.parse(`async function a${argsbody}`); Reflect.parse(`(async function a${argsbody})`); Reflect.parse(`(async function ${argsbody})`); + Reflect.parse(`({ async m${argsbody} })`); } function testErrorArgsBody(argsbody, prefix="") { assertThrows(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError); assertThrows(() => Reflect.parse(`${prefix} (async function a${argsbody})`), SyntaxError); assertThrows(() => Reflect.parse(`${prefix} (async function ${argsbody})`), SyntaxError); + assertThrows(() => Reflect.parse(`${prefix} ({ async m${argsbody} })`), SyntaxError); } function testErrorArgsBodyStrict(argsbody) { testErrorArgsBody(argsbody); testErrorArgsBody(argsbody, "'use strict'; "); + assertThrows(() => Reflect.parse(`class X { async m${argsbody} }`), SyntaxError); + assertThrows(() => Reflect.parse(`class X { static async m${argsbody} }`), SyntaxError); } if (typeof Reflect !== "undefined" && Reflect.parse) { @@ -34,6 +38,19 @@ if (typeof Reflect !== "undefined" && Reflect.parse) { Reflect.parse("function* g() { (async function yield() {}); }"); assertThrows(() => Reflect.parse("'use strict'; (async function yield() {});"), SyntaxError); + // `yield` handling is inherited in async method name. + Reflect.parse("({ async yield() {} });"); + Reflect.parse("function f() { ({ async yield() {} }); }"); + Reflect.parse("function* g() { ({ async yield() {} }); }"); + Reflect.parse("'use strict'; ({ async yield() {} });"); + Reflect.parse("class X { async yield() {} }"); + + Reflect.parse("({ async [yield]() {} });"); + Reflect.parse("function f() { ({ async [yield]() {} }); }"); + Reflect.parse("function* g() { ({ async [yield]() {} }); }"); + assertThrows(() => Reflect.parse("'use strict'; ({ async [yield]() {} });"), SyntaxError); + assertThrows(() => Reflect.parse("class X { async [yield]() {} }"), SyntaxError); + // `yield` is treated as an identifier in an async function parameter // `yield` is not allowed as an identifier in strict code. testPassArgsBody("(yield) {}"); From 9e6bd2f04eb63a41e6580048a26c2b93bfc97134 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 31 Oct 2016 05:33:11 +0900 Subject: [PATCH 21/61] Bug 1185106 - Part 7.4: Fix property name parsing with async name. r=till --- js/src/frontend/Parser.cpp | 2 +- .../tests/ecma_7/AsyncFunctions/property.js | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/property.js diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 8f1eafe6a079..d072450caaff 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -8767,7 +8767,7 @@ Parser::propertyName(YieldHandling yieldHandling, Node propList, TokenKind tt; if (!tokenStream.getToken(&tt, TokenStream::KeywordIsName)) return null(); - if (tt != TOK_LP && tt != TOK_COLON) { + if (tt != TOK_LP && tt != TOK_COLON && tt != TOK_RC && tt != TOK_ASSIGN) { isAsync = true; ltok = tt; } else { diff --git a/js/src/tests/ecma_7/AsyncFunctions/property.js b/js/src/tests/ecma_7/AsyncFunctions/property.js new file mode 100644 index 000000000000..6c3a3697a6fd --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/property.js @@ -0,0 +1,39 @@ +var BUGNUMBER = 1185106; +var summary = "async name token in property and object destructuring pattern"; + +print(BUGNUMBER + ": " + summary); + +{ + let a = { async: 10 }; + assertEq(a.async, 10); +} + +{ + let a = { async() {} }; + assertEq(a.async instanceof Function, true); + assertEq(a.async.name, "async"); +} + +{ + let async = 11; + let a = { async }; + assertEq(a.async, 11); +} + +{ + let { async } = { async: 12 }; + assertEq(async, 12); +} + +{ + let { async = 13 } = {}; + assertEq(async, 13); +} + +{ + let { async: a = 14 } = {}; + assertEq(a, 14); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); From 2c2d7ff0f1b4c6c9de08642f0debaab26191638a Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 22/61] Bug 1185106 - Part 8.1: Treat await as keyword in module. r=efaust,till MozReview-Commit-ID: JnnXaIJvPGW --- js/src/frontend/Parser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index d072450caaff..7b5d3218e4e5 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -1969,6 +1969,7 @@ Parser::moduleBody(ModuleSharedContext* modulesc) if (!mn) return null(); + AutoAwaitIsKeyword awaitIsKeyword(&tokenStream, true); ParseNode* pn = statementList(YieldIsKeyword); if (!pn) return null(); From c5236c1dc96dd305349f40a4586d346282a3a73f Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 23/61] Bug 1185106 - Part 8.2: Add parser test for await in module. r=efaust,till MozReview-Commit-ID: JNEYt4Y3fo4 --- .../tests/ecma_7/AsyncFunctions/syntax-modules.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js b/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js new file mode 100644 index 000000000000..06958128027d --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js @@ -0,0 +1,15 @@ +var BUGNUMBER = 1185106; +var summary = "async/await syntax in module"; + +print(BUGNUMBER + ": " + summary); + +if (typeof parseModule === "function") { + parseModule("async function f() { await 3; }"); + parseModule("async function f() { await 3; }"); + assertThrows(() => parseModule("var await = 5;"), SyntaxError); + assertThrows(() => parseModule("export var await;"), SyntaxError); + assertThrows(() => parseModule("async function f() { function g() { await 3; } }"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); From 769d4cad22b697c26edd8245c7a25930d12b20d9 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 24/61] Bug 1185106 - Part 9.1: Support async function statement in export default in Parser. r=efaust,till MozReview-Commit-ID: 5oe1f3MRssu --- js/src/frontend/Parser.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 7b5d3218e4e5..81fc7ecafd48 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -5047,6 +5047,20 @@ Parser::exportDeclaration() return null(); break; default: { + if (tt == TOK_NAME && tokenStream.currentName() == context->names().async) { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine)) + return null(); + + if (nextSameLine == TOK_FUNCTION) { + tokenStream.consumeKnownToken(nextSameLine); + kid = functionStmt(YieldIsName, AllowDefaultName, AsyncFunction); + if (!kid) + return null(); + break; + } + } + tokenStream.ungetToken(); RootedPropertyName name(context, context->names().starDefaultStar); nameNode = newName(name); From 96c7fbc2eafa809c3f2f7b42a8f3f6ae267a74f5 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 25/61] Bug 1185106 - Part 9.2: Add parser test for async function statement in export default. r=efaust,till MozReview-Commit-ID: U7PXXOsEpA --- js/src/jit-test/lib/syntax.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/js/src/jit-test/lib/syntax.js b/js/src/jit-test/lib/syntax.js index e7b687adf02c..ede66137dc84 100644 --- a/js/src/jit-test/lib/syntax.js +++ b/js/src/jit-test/lib/syntax.js @@ -1232,6 +1232,20 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("async function A(a) { await await await X; "); test("async function A(a) { await await await X; } "); + opts = { no_fun: true, no_eval: true, module: true }; + test("export default async ", opts); + test("export default async function ", opts); + test("export default async function ( ", opts); + test("export default async function () ", opts); + test("export default async function (a ", opts); + test("export default async function (a) ", opts); + test("export default async function (a) { ", opts); + test("export default async function (a) {} ", opts); + test("export default async function (a) { await ", opts); + test("export default async function (a) { await X ", opts); + test("export default async function (a) { await X; ", opts); + test("export default async function (a) { await X; } ", opts); + // async/await function expression test("(async "); From 92cd9d396c86aacd7b2b5be87e0f40cdba10d2e0 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:29 +0900 Subject: [PATCH 26/61] Bug 1185106 - Part 9.3: Add parser test for yield in async function statement in export default. r=till MozReview-Commit-ID: 3OsdBSSyz64 --- js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js | 5 +++++ js/src/tests/ecma_7/AsyncFunctions/yield.js | 1 + 2 files changed, 6 insertions(+) diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js b/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js index 06958128027d..5fd17857703d 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax-modules.js @@ -9,6 +9,11 @@ if (typeof parseModule === "function") { assertThrows(() => parseModule("var await = 5;"), SyntaxError); assertThrows(() => parseModule("export var await;"), SyntaxError); assertThrows(() => parseModule("async function f() { function g() { await 3; } }"), SyntaxError); + + if (typeof Reflect !== "undefined" && Reflect.parse) { + assertThrows(() => Reflect.parse("export default async function() { yield; }", { target: "module" }), SyntaxError); + assertThrows(() => Reflect.parse("export default async function() { yield = 1; }", { target: "module" }), SyntaxError); + } } if (typeof reportCompare === "function") diff --git a/js/src/tests/ecma_7/AsyncFunctions/yield.js b/js/src/tests/ecma_7/AsyncFunctions/yield.js index f018c9b8ff00..348d11f3d252 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/yield.js +++ b/js/src/tests/ecma_7/AsyncFunctions/yield.js @@ -22,6 +22,7 @@ function testErrorArgsBodyStrict(argsbody) { testErrorArgsBody(argsbody, "'use strict'; "); assertThrows(() => Reflect.parse(`class X { async m${argsbody} }`), SyntaxError); assertThrows(() => Reflect.parse(`class X { static async m${argsbody} }`), SyntaxError); + assertThrows(() => Reflect.parse(`export default async function ${argsbody}`, { target: "module" }), SyntaxError); } if (typeof Reflect !== "undefined" && Reflect.parse) { From b5163f4e1a86c2230db052ea62323ed073b6ffb6 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:30 +0900 Subject: [PATCH 27/61] Bug 1185106 - Part 10.1: Support async arrow function in Parser. r=till MozReview-Commit-ID: CuMJ5qk2HVs --- js/src/frontend/Parser.cpp | 145 ++++++++++++++++++++++++++++++++----- 1 file changed, 128 insertions(+), 17 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 81fc7ecafd48..ecc53ebfd2b8 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2409,6 +2409,16 @@ Parser::functionBody(InHandling inHandling, YieldHandling yieldHan } else { MOZ_ASSERT(type == ExpressionBody); + // Async functions are implemented as star generators, and star + // generators are assumed to be statement lists, to prepend initial + // `yield`. + Node stmtList = null(); + if (pc->isAsync()) { + stmtList = handler.newStatementList(pos()); + if (!stmtList) + return null(); + } + Node kid = assignExpr(inHandling, yieldHandling, TripledotProhibited); if (!kid) return null(); @@ -2416,6 +2426,11 @@ Parser::functionBody(InHandling inHandling, YieldHandling yieldHan pn = handler.newReturnStatement(kid, handler.getPosition(kid)); if (!pn) return null(); + + if (pc->isAsync()) { + handler.addStatementToList(stmtList, pn); + pn = stmtList; + } } switch (pc->generatorKind()) { @@ -2436,13 +2451,13 @@ Parser::functionBody(InHandling inHandling, YieldHandling yieldHan break; case StarGenerator: - MOZ_ASSERT(kind != Arrow); - MOZ_ASSERT(type == StatementListBody); + MOZ_ASSERT_IF(!pc->isAsync(), kind != Arrow); + MOZ_ASSERT_IF(!pc->isAsync(), type == StatementListBody); break; } if (pc->isGenerator()) { - MOZ_ASSERT(type == StatementListBody); + MOZ_ASSERT_IF(!pc->isAsync(), type == StatementListBody); if (!declareDotGeneratorName()) return null(); Node generator = newDotGeneratorName(); @@ -2634,19 +2649,47 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn FunctionBox* funbox = pc->functionBox(); bool parenFreeArrow = false; - TokenStream::Modifier modifier = TokenStream::None; + // Modifier for the following tokens. + // TokenStream::None for the following cases: + // async a => 1 + // ^ + // + // (a) => 1 + // ^ + // + // async (a) => 1 + // ^ + // + // function f(a) {} + // ^ + // + // TokenStream::Operand for the following case: + // a => 1 + // ^ + TokenStream::Modifier firstTokenModifier = TokenStream::None; + + // Modifier for the the first token in each argument. + // can be changed to TokenStream::None for the following case: + // async a => 1 + // ^ + TokenStream::Modifier argModifier = TokenStream::Operand; if (kind == Arrow) { TokenKind tt; - if (!tokenStream.peekToken(&tt, TokenStream::Operand)) + // In async function, the first token after `async` is already gotten + // with TokenStream::None. + // In sync function, the first token is already gotten with + // TokenStream::Operand. + firstTokenModifier = funbox->isAsync() ? TokenStream::None : TokenStream::Operand; + if (!tokenStream.peekToken(&tt, firstTokenModifier)) return false; - if (tt == TOK_NAME || tt == TOK_YIELD) + if (tt == TOK_NAME || tt == TOK_YIELD) { parenFreeArrow = true; - else - modifier = TokenStream::Operand; + argModifier = firstTokenModifier; + } } if (!parenFreeArrow) { TokenKind tt; - if (!tokenStream.getToken(&tt, modifier)) + if (!tokenStream.getToken(&tt, firstTokenModifier)) return false; if (tt != TOK_LP) { report(ParseError, false, null(), @@ -2693,8 +2736,9 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn } TokenKind tt; - if (!tokenStream.getToken(&tt, TokenStream::Operand)) + if (!tokenStream.getToken(&tt, argModifier)) return false; + argModifier = TokenStream::Operand; MOZ_ASSERT_IF(parenFreeArrow, tt == TOK_NAME || tt == TOK_YIELD); if (tt == TOK_TRIPLEDOT) { @@ -2752,6 +2796,15 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn if (parenFreeArrow) funbox->setStart(tokenStream); + if (funbox->isAsync() && tokenStream.currentName() == context->names().await) { + // `await` is already gotten as TOK_NAME for the following + // case: + // + // async await => 1 + report(ParseError, false, null(), JSMSG_RESERVED_ID, "await"); + return false; + } + RootedPropertyName name(context, bindingIdentifier(yieldHandling)); if (!name) return false; @@ -3380,7 +3433,7 @@ Parser::functionFormalParametersAndBody(InHandling inHandling, if (!tokenStream.getToken(&tt, TokenStream::Operand)) return false; if (tt != TOK_LC) { - if (funbox->isStarGenerator() || kind == Method || + if ((funbox->isStarGenerator() && !funbox->isAsync()) || kind == Method || kind == GetterNoExpressionClosure || kind == SetterNoExpressionClosure || IsConstructorKind(kind)) { report(ParseError, false, null(), JSMSG_CURLY_BEFORE_BODY); @@ -7514,6 +7567,16 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl if (tt == TOK_YIELD && yieldExpressionsSupported()) return yieldExpression(inHandling); + bool maybeAsyncArrow = false; + if (tt == TOK_NAME && tokenStream.currentName() == context->names().async) { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine)) + return null(); + + if (nextSameLine == TOK_NAME || nextSameLine == TOK_YIELD) + maybeAsyncArrow = true; + } + tokenStream.ungetToken(); // Save the tokenizer state in case we find an arrow function and have to @@ -7522,9 +7585,35 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl tokenStream.tell(&start); PossibleError possibleErrorInner(*this); - Node lhs = condExpr1(inHandling, yieldHandling, tripledotHandling, &possibleErrorInner, invoked); - if (!lhs) - return null(); + Node lhs; + if (maybeAsyncArrow) { + tokenStream.consumeKnownToken(TOK_NAME, TokenStream::Operand); + MOZ_ASSERT(tokenStream.currentName() == context->names().async); + + TokenKind tt; + if (!tokenStream.getToken(&tt)) + return null(); + MOZ_ASSERT(tt == TOK_NAME || tt == TOK_YIELD); + + // Check yield validity here. + RootedPropertyName name(context, bindingIdentifier(yieldHandling)); + if (!name) + return null(); + + if (!tokenStream.getToken(&tt)) + return null(); + if (tt != TOK_ARROW) { + report(ParseError, false, null(), JSMSG_UNEXPECTED_TOKEN, + "'=>' after argument list", TokenKindToDesc(tt)); + + return null(); + } + } else { + lhs = condExpr1(inHandling, yieldHandling, tripledotHandling, &possibleErrorInner, invoked); + if (!lhs) { + return null(); + } + } ParseNodeKind kind; JSOp op; @@ -7566,12 +7655,33 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl tokenStream.seek(start); - TokenKind ignored; - if (!tokenStream.peekToken(&ignored, TokenStream::Operand)) + if (!tokenStream.peekToken(&next, TokenStream::Operand)) return null(); + GeneratorKind generatorKind = NotGenerator; + FunctionAsyncKind asyncKind = SyncFunction; + + if (next == TOK_NAME) { + tokenStream.consumeKnownToken(next, TokenStream::Operand); + + if (tokenStream.currentName() == context->names().async) { + TokenKind nextSameLine = TOK_EOF; + if (!tokenStream.peekTokenSameLine(&nextSameLine)) + return null(); + + if (nextSameLine == TOK_ARROW) { + tokenStream.ungetToken(); + } else { + generatorKind = StarGenerator; + asyncKind = AsyncFunction; + } + } else { + tokenStream.ungetToken(); + } + } + Node arrowFunc = functionDefinition(inHandling, yieldHandling, nullptr, - Arrow, NotGenerator, SyncFunction); + Arrow, generatorKind, asyncKind); if (!arrowFunc) return null(); @@ -7600,6 +7710,7 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl // has block body. An arrow function not ending in such, ends in // another AssignmentExpression that we can inductively assume was // peeked consistently. + TokenKind ignored; if (!tokenStream.peekToken(&ignored, TokenStream::Operand)) return null(); tokenStream.addModifierException(TokenStream::NoneIsOperand); From 949bd7632a429f3ec64a2e44c03bea8c0bb983ce Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:30 +0900 Subject: [PATCH 28/61] Bug 1185106 - Part 10.2: Support async arrow function in Reflect.parse. r=efaust,till MozReview-Commit-ID: LYJym1TTrQa --- js/src/builtin/ReflectParse.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/js/src/builtin/ReflectParse.cpp b/js/src/builtin/ReflectParse.cpp index 7e30de7b02c1..6df3c1fd19f0 100644 --- a/js/src/builtin/ReflectParse.cpp +++ b/js/src/builtin/ReflectParse.cpp @@ -1809,6 +1809,7 @@ class ASTSerializer bool function(ParseNode* pn, ASTType type, MutableHandleValue dst); bool functionArgsAndBody(ParseNode* pn, NodeVector& args, NodeVector& defaults, + bool isAsync, bool isExpression, MutableHandleValue body, MutableHandleValue rest); bool functionBody(ParseNode* pn, TokenPos* pos, MutableHandleValue dst); @@ -3426,13 +3427,14 @@ ASTSerializer::function(ParseNode* pn, ASTType type, MutableHandleValue dst) rest.setUndefined(); else rest.setNull(); - return functionArgsAndBody(pn->pn_body, args, defaults, &body, &rest) && + return functionArgsAndBody(pn->pn_body, args, defaults, isAsync, isExpression, &body, &rest) && builder.function(type, &pn->pn_pos, id, args, defaults, body, rest, generatorStyle, isAsync, isExpression, dst); } bool ASTSerializer::functionArgsAndBody(ParseNode* pn, NodeVector& args, NodeVector& defaults, + bool isAsync, bool isExpression, MutableHandleValue body, MutableHandleValue rest) { ParseNode* pnargs; @@ -3466,6 +3468,14 @@ ASTSerializer::functionArgsAndBody(ParseNode* pn, NodeVector& args, NodeVector& pnstart = pnstart->pn_next; } + // Async arrow with expression body is converted into STATEMENTLIST + // to insert initial yield. + if (isAsync && isExpression) { + MOZ_ASSERT(pnstart->getKind() == PNK_RETURN); + return functionArgs(pn, pnargs, args, defaults, rest) && + expression(pnstart->pn_kid, body); + } + return functionArgs(pn, pnargs, args, defaults, rest) && functionBody(pnstart, &pnbody->pn_pos, body); } From f7b54d0f8ef2628bd0b7d712eb2308d5f6c85716 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 28 Aug 2016 23:58:30 +0900 Subject: [PATCH 29/61] Bug 1185106 - Part 10.3: Add parser test for async arrow function. r=efaust,till MozReview-Commit-ID: 1HCDc8Z1BJU --- js/src/jit-test/lib/syntax.js | 55 +++++++++ .../ecma_7/AsyncFunctions/syntax-arrow.js | 104 ++++++++++++++++++ js/src/tests/ecma_7/AsyncFunctions/syntax.js | 1 + js/src/tests/js1_8_5/reflect-parse/async.js | 5 + 4 files changed, 165 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/syntax-arrow.js diff --git a/js/src/jit-test/lib/syntax.js b/js/src/jit-test/lib/syntax.js index ede66137dc84..9b7a94d1824d 100644 --- a/js/src/jit-test/lib/syntax.js +++ b/js/src/jit-test/lib/syntax.js @@ -1298,4 +1298,59 @@ function test_syntax(postfixes, check_error, ignore_opts) { test("class X { static async m() "); test("class X { static async m() { "); test("class X { static async m() {} "); + + // async/await arrow + + test("(async a "); + test("(async a => "); + test("(async a => b "); + test("(async a => b) "); + + test("(async a => { "); + test("(async a => { b "); + test("(async a => { b } "); + test("(async a => { b }) "); + + test("(async ( "); + test("(async (a "); + test("(async (a) "); + test("(async (a) => "); + test("(async (a) => b "); + test("(async (a) => b) "); + test("(async (a, "); + test("(async (a, b "); + test("(async (a, b) "); + test("(async (a, b) => "); + test("(async (a, b) => b "); + test("(async (a, b) => b) "); + + test("(async ([ "); + test("(async ([a "); + test("(async ([a] "); + test("(async ([a]) "); + test("(async ([a]) => "); + test("(async ([a]) => b "); + test("(async ([a]) => b) "); + test("(async ([a, "); + test("(async ([a, b "); + test("(async ([a, b] "); + test("(async ([a, b]) "); + test("(async ([a, b]) => "); + test("(async ([a, b]) => b "); + test("(async ([a, b]) => b) "); + + test("(async ({ "); + test("(async ({a "); + test("(async ({a} "); + test("(async ({a}) "); + test("(async ({a}) => "); + test("(async ({a}) => b "); + test("(async ({a}) => b) "); + test("(async ({a, "); + test("(async ({a, b "); + test("(async ({a, b} "); + test("(async ({a, b}) "); + test("(async ({a, b}) => "); + test("(async ({a, b}) => b "); + test("(async ({a, b}) => b) "); } diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax-arrow.js b/js/src/tests/ecma_7/AsyncFunctions/syntax-arrow.js new file mode 100644 index 000000000000..6dc8d8621cc8 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax-arrow.js @@ -0,0 +1,104 @@ +var BUGNUMBER = 1185106; +var summary = "async arrow function syntax"; + +print(BUGNUMBER + ": " + summary); + +if (typeof Reflect !== "undefined" && Reflect.parse) { + // Parameters. + Reflect.parse("async () => 1"); + Reflect.parse("async a => 1"); + Reflect.parse("async (a) => 1"); + Reflect.parse("async async => 1"); + Reflect.parse("async (async) => 1"); + Reflect.parse("async ([a]) => 1"); + Reflect.parse("async ([a, b]) => 1"); + Reflect.parse("async ({a}) => 1"); + Reflect.parse("async ({a, b}) => 1"); + + assertThrows(() => Reflect.parse("async await => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async (await) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ([await]) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ({await}) => 1"), SyntaxError); + + assertThrows(() => Reflect.parse("async (a=await) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ([a=await]) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ({a=await}) => 1"), SyntaxError); + + assertThrows(() => Reflect.parse("async (a=await 1) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ([a=await 1]) => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async ({a=await 1}) => 1"), SyntaxError); + + assertThrows(() => Reflect.parse("async [a] => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async [a, b] => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async {a} => 1"), SyntaxError); + assertThrows(() => Reflect.parse("async {a: b} => 1"), SyntaxError); + + // Expression body. + Reflect.parse("async a => a == b"); + + // Expression body with nested async function. + Reflect.parse("async a => async"); + Reflect.parse("async a => async b => c"); + Reflect.parse("async a => async function() {}"); + Reflect.parse("async a => async function b() {}"); + + assertThrows(() => Reflect.parse("async a => async b"), SyntaxError); + assertThrows(() => Reflect.parse("async a => async function"), SyntaxError); + assertThrows(() => Reflect.parse("async a => async function()"), SyntaxError); + + // Expression body with `await`. + Reflect.parse("async a => await 1"); + Reflect.parse("async a => await await 1"); + Reflect.parse("async a => await await await 1"); + + assertThrows(() => Reflect.parse("async a => await"), SyntaxError); + assertThrows(() => Reflect.parse("async a => await await"), SyntaxError); + + // `await` is Unary Expression and it cannot have `async` function as an + // operand. + assertThrows(() => Reflect.parse("async a => await async X => Y"), SyntaxError); + Reflect.parse("async a => await (async X => Y)"); + // But it can have `async` identifier as an operand. + Reflect.parse("async async => await async"); + + // Block body. + Reflect.parse("async X => {yield}"); + + // `yield` handling. + Reflect.parse("async X => yield"); + Reflect.parse("async yield => X"); + Reflect.parse("async yield => yield"); + Reflect.parse("async X => {yield}"); + + Reflect.parse("async X => {yield}"); + Reflect.parse("async yield => {X}"); + Reflect.parse("async yield => {yield}"); + Reflect.parse("function* g() { async X => yield }"); + + assertThrows(() => Reflect.parse("'use strict'; async yield => X"), SyntaxError); + assertThrows(() => Reflect.parse("'use strict'; async (yield) => X"), SyntaxError); + assertThrows(() => Reflect.parse("'use strict'; async X => yield"), SyntaxError); + assertThrows(() => Reflect.parse("'use strict'; async X => {yield}"), SyntaxError); + + assertThrows(() => Reflect.parse("function* g() { async yield => X }")); + assertThrows(() => Reflect.parse("function* g() { async (yield) => X }")); + assertThrows(() => Reflect.parse("function* g() { async ([yield]) => X }")); + assertThrows(() => Reflect.parse("function* g() { async ({yield}) => X }")); + + // Not async functions. + Reflect.parse("async ()"); + Reflect.parse("async (a)"); + Reflect.parse("async (async)"); + Reflect.parse("async ([a])"); + Reflect.parse("async ([a, b])"); + Reflect.parse("async ({a})"); + Reflect.parse("async ({a, b})"); + + // Async arrow function is assignment expression. + Reflect.parse("a ? async () => {1} : b"); + Reflect.parse("a ? b : async () => {1}"); + assertThrows(() => Reflect.parse("async () => {1} ? a : b"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_7/AsyncFunctions/syntax.js b/js/src/tests/ecma_7/AsyncFunctions/syntax.js index 5e38902e3212..d5d5524999fa 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/syntax.js +++ b/js/src/tests/ecma_7/AsyncFunctions/syntax.js @@ -7,6 +7,7 @@ if (typeof Reflect !== "undefined" && Reflect.parse) { assertEq(Reflect.parse("function a() {}").body[0].async, false); assertEq(Reflect.parse("function* a() {}").body[0].async, false); assertEq(Reflect.parse("async function a() {}").body[0].async, true); + assertEq(Reflect.parse("() => {}").body[0].async, undefined); // Async generators are not allowed (with regards to spec) assertThrows(() => Reflect.parse("async function* a() {}"), SyntaxError); diff --git a/js/src/tests/js1_8_5/reflect-parse/async.js b/js/src/tests/js1_8_5/reflect-parse/async.js index 8be10d05b11b..355f0356c5ee 100644 --- a/js/src/tests/js1_8_5/reflect-parse/async.js +++ b/js/src/tests/js1_8_5/reflect-parse/async.js @@ -7,6 +7,11 @@ assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([ assertExpr("(async function() {})", asyncFunExpr(null, [], blockStmt([]))); assertExpr("(async function foo() {})", asyncFunExpr(ident("foo"), [], blockStmt([]))); +// async arrow. +assertExpr("async a => 1", asyncArrowExpr(true, [ident("a")], literal(1))); +assertExpr("async a => { 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([exprStmt(literal(1))]))); +assertExpr("async a => { return 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([returnStmt(literal(1))]))); + // async method. assertExpr("({ async foo() {} })", objExpr([{ key: ident("foo"), value: asyncFunExpr(ident("foo"), [], blockStmt([]))}])); From 5d7377b42ead4b0e5c8492028b595a7b61df28f2 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 02:05:55 +0900 Subject: [PATCH 30/61] Bug 1185106 - Part 11.1: Implement async functions. r=till MozReview-Commit-ID: ChWpakqUlsi --- js/public/Class.h | 2 +- js/src/builtin/AsyncFunctions.js | 47 +++++++++++ js/src/builtin/Promise.cpp | 12 +-- js/src/builtin/Promise.h | 7 ++ js/src/builtin/SelfHostingDefines.h | 3 + js/src/frontend/BytecodeCompiler.cpp | 33 +++++--- js/src/frontend/BytecodeCompiler.h | 5 ++ js/src/frontend/BytecodeEmitter.cpp | 100 ++++++++++++++++++++++- js/src/frontend/BytecodeEmitter.h | 3 + js/src/frontend/Parser.cpp | 5 ++ js/src/jit/CodeGenerator.cpp | 3 +- js/src/jsfun.cpp | 37 +++++++-- js/src/jsfun.h | 3 + js/src/jsscript.cpp | 2 + js/src/moz.build | 2 + js/src/vm/AsyncFunction.cpp | 115 +++++++++++++++++++++++++++ js/src/vm/AsyncFunction.h | 30 +++++++ js/src/vm/CommonPropertyNames.h | 3 + js/src/vm/EnvironmentObject.cpp | 29 +++++-- js/src/vm/EnvironmentObject.h | 3 + js/src/vm/GeneratorObject.cpp | 4 +- js/src/vm/GlobalObject.h | 20 +++++ js/src/vm/SelfHosting.cpp | 24 ++++++ 23 files changed, 457 insertions(+), 35 deletions(-) create mode 100644 js/src/builtin/AsyncFunctions.js create mode 100644 js/src/vm/AsyncFunction.cpp create mode 100644 js/src/vm/AsyncFunction.h diff --git a/js/public/Class.h b/js/public/Class.h index f37c3af0fa72..d74fd1b3817d 100644 --- a/js/public/Class.h +++ b/js/public/Class.h @@ -785,7 +785,7 @@ struct JSClass { // application. #define JSCLASS_GLOBAL_APPLICATION_SLOTS 5 #define JSCLASS_GLOBAL_SLOT_COUNT \ - (JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 37) + (JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 39) #define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \ (JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n))) #define JSCLASS_GLOBAL_FLAGS \ diff --git a/js/src/builtin/AsyncFunctions.js b/js/src/builtin/AsyncFunctions.js new file mode 100644 index 000000000000..220faa672213 --- /dev/null +++ b/js/src/builtin/AsyncFunctions.js @@ -0,0 +1,47 @@ +/* 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/. */ + +// Called when creating async function. +// See the comment for js::CreateAsyncFunction what unwrapped, wrapped and the +// return value are. +function AsyncFunction_wrap(unwrapped) { + var wrapper = function() { + // The try block is required to handle throws in default arguments properly. + try { + return AsyncFunction_start(callFunction(std_Function_apply, unwrapped, this, arguments)); + } catch (e) { + var promiseCtor = GetBuiltinConstructor('Promise'); + return callFunction(Promise_static_reject, promiseCtor, e); + } + }; + return CreateAsyncFunction(wrapper, unwrapped); +} + +function AsyncFunction_start(generator) { + return AsyncFunction_resume(generator, undefined, generator.next); +} + +function AsyncFunction_resume(gen, v, method) { + var promiseCtor = GetBuiltinConstructor('Promise'); + let result; + try { + // get back into async function, run to next await point + result = callFunction(method, gen, v); + } catch (exc) { + // The async function itself failed. + return callFunction(Promise_static_reject, promiseCtor, exc); + } + + if (result.done) + return callFunction(Promise_static_resolve, promiseCtor, result.value); + + // If we get here, `await` occurred. `gen` is paused at a yield point. + return callFunction(Promise_then, + callFunction(Promise_static_resolve, promiseCtor, result.value), + function(val) { + return AsyncFunction_resume(gen, val, gen.next); + }, function (err) { + return AsyncFunction_resume(gen, err, gen.throw); + }); +} diff --git a/js/src/builtin/Promise.cpp b/js/src/builtin/Promise.cpp index 5ed64c0c0575..8b061b838f75 100644 --- a/js/src/builtin/Promise.cpp +++ b/js/src/builtin/Promise.cpp @@ -1919,8 +1919,8 @@ CommonStaticResolveRejectImpl(JSContext* cx, unsigned argc, Value* vp, Resolutio /** * ES2016, 25.4.4.4, Promise.reject. */ -static bool -Promise_reject(JSContext* cx, unsigned argc, Value* vp) +bool +js::Promise_reject(JSContext* cx, unsigned argc, Value* vp) { return CommonStaticResolveRejectImpl(cx, argc, vp, RejectMode); } @@ -1949,8 +1949,8 @@ PromiseObject::unforgeableReject(JSContext* cx, HandleValue value) /** * ES2016, 25.4.4.5, Promise.resolve. */ -static bool -Promise_static_resolve(JSContext* cx, unsigned argc, Value* vp) +bool +js::Promise_static_resolve(JSContext* cx, unsigned argc, Value* vp) { return CommonStaticResolveRejectImpl(cx, argc, vp, ResolveMode); } @@ -2051,8 +2051,8 @@ js::OriginalPromiseThen(JSContext* cx, Handle promise, HandleVal } // ES2016, 25.4.5.3. -static bool -Promise_then(JSContext* cx, unsigned argc, Value* vp) +bool +js::Promise_then(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); diff --git a/js/src/builtin/Promise.h b/js/src/builtin/Promise.h index ab96cd9d27d2..3c52907aa8a3 100644 --- a/js/src/builtin/Promise.h +++ b/js/src/builtin/Promise.h @@ -153,6 +153,13 @@ class PromiseTask : public JS::AsyncTask virtual void execute() = 0; }; +bool +Promise_static_resolve(JSContext* cx, unsigned argc, Value* vp); +bool +Promise_reject(JSContext* cx, unsigned argc, Value* vp); +bool +Promise_then(JSContext* cx, unsigned argc, Value* vp); + } // namespace js #endif /* builtin_Promise_h */ diff --git a/js/src/builtin/SelfHostingDefines.h b/js/src/builtin/SelfHostingDefines.h index b57c172691d5..ff4e36b06ecc 100644 --- a/js/src/builtin/SelfHostingDefines.h +++ b/js/src/builtin/SelfHostingDefines.h @@ -93,6 +93,9 @@ #define REGEXP_STICKY_FLAG 0x08 #define REGEXP_UNICODE_FLAG 0x10 +#define ASYNC_WRAPPED_SLOT 1 +#define ASYNC_UNWRAPPED_SLOT 1 + #define MODULE_OBJECT_ENVIRONMENT_SLOT 2 #define MODULE_STATE_FAILED 0 diff --git a/js/src/frontend/BytecodeCompiler.cpp b/js/src/frontend/BytecodeCompiler.cpp index ba287fc27ed4..6bd2770d355e 100644 --- a/js/src/frontend/BytecodeCompiler.cpp +++ b/js/src/frontend/BytecodeCompiler.cpp @@ -63,7 +63,7 @@ class MOZ_STACK_CLASS BytecodeCompiler JSScript* compileEvalScript(HandleObject environment, HandleScope enclosingScope); ModuleObject* compileModule(); bool compileFunctionBody(MutableHandleFunction fun, Handle formals, - GeneratorKind generatorKind); + GeneratorKind generatorKind, FunctionAsyncKind asyncKind); ScriptSourceObject* sourceObjectPtr() const; @@ -435,7 +435,8 @@ BytecodeCompiler::compileModule() bool BytecodeCompiler::compileFunctionBody(MutableHandleFunction fun, Handle formals, - GeneratorKind generatorKind) + GeneratorKind generatorKind, + FunctionAsyncKind asyncKind) { MOZ_ASSERT(fun); MOZ_ASSERT(fun->isTenured()); @@ -453,8 +454,8 @@ BytecodeCompiler::compileFunctionBody(MutableHandleFunction fun, ParseNode* fn; do { Directives newDirectives = directives; - fn = parser->standaloneFunctionBody(fun, enclosingScope, formals, generatorKind, - SyncFunction, directives, &newDirectives); + fn = parser->standaloneFunctionBody(fun, enclosingScope, formals, generatorKind, asyncKind, + directives, &newDirectives); if (!fn && !handleParseFailure(newDirectives)) return false; } while (!fn); @@ -680,7 +681,8 @@ frontend::CompileLazyFunction(JSContext* cx, Handle lazy, const cha static bool CompileFunctionBody(JSContext* cx, MutableHandleFunction fun, const ReadOnlyCompileOptions& options, Handle formals, SourceBufferHolder& srcBuf, - HandleScope enclosingScope, GeneratorKind generatorKind) + HandleScope enclosingScope, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind) { MOZ_ASSERT(!options.isRunOnce); @@ -690,7 +692,7 @@ CompileFunctionBody(JSContext* cx, MutableHandleFunction fun, const ReadOnlyComp BytecodeCompiler compiler(cx, cx->tempLifoAlloc(), options, srcBuf, enclosingScope, TraceLogger_ParserCompileFunction); compiler.setSourceArgumentsNotIncluded(); - return compiler.compileFunctionBody(fun, formals, generatorKind); + return compiler.compileFunctionBody(fun, formals, generatorKind, asyncKind); } bool @@ -699,7 +701,8 @@ frontend::CompileFunctionBody(JSContext* cx, MutableHandleFunction fun, Handle formals, JS::SourceBufferHolder& srcBuf, HandleScope enclosingScope) { - return CompileFunctionBody(cx, fun, options, formals, srcBuf, enclosingScope, NotGenerator); + return CompileFunctionBody(cx, fun, options, formals, srcBuf, enclosingScope, NotGenerator, + SyncFunction); } bool @@ -709,10 +712,9 @@ frontend::CompileFunctionBody(JSContext* cx, MutableHandleFunction fun, { RootedScope emptyGlobalScope(cx, &cx->global()->emptyGlobalScope()); return CompileFunctionBody(cx, fun, options, formals, srcBuf, emptyGlobalScope, - NotGenerator); + NotGenerator, SyncFunction); } - bool frontend::CompileStarGeneratorBody(JSContext* cx, MutableHandleFunction fun, const ReadOnlyCompileOptions& options, @@ -721,5 +723,16 @@ frontend::CompileStarGeneratorBody(JSContext* cx, MutableHandleFunction fun, { RootedScope emptyGlobalScope(cx, &cx->global()->emptyGlobalScope()); return CompileFunctionBody(cx, fun, options, formals, srcBuf, emptyGlobalScope, - StarGenerator); + StarGenerator, SyncFunction); +} + +bool +frontend::CompileAsyncFunctionBody(JSContext* cx, MutableHandleFunction fun, + const ReadOnlyCompileOptions& options, + Handle formals, + JS::SourceBufferHolder& srcBuf) +{ + RootedScope emptyGlobalScope(cx, &cx->global()->emptyGlobalScope()); + return CompileFunctionBody(cx, fun, options, formals, srcBuf, emptyGlobalScope, + StarGenerator, AsyncFunction); } diff --git a/js/src/frontend/BytecodeCompiler.h b/js/src/frontend/BytecodeCompiler.h index 5a7fbb5223f9..1d86f116073b 100644 --- a/js/src/frontend/BytecodeCompiler.h +++ b/js/src/frontend/BytecodeCompiler.h @@ -68,6 +68,11 @@ CompileStarGeneratorBody(JSContext* cx, MutableHandleFunction fun, const ReadOnlyCompileOptions& options, Handle formals, JS::SourceBufferHolder& srcBuf); +MOZ_MUST_USE bool +CompileAsyncFunctionBody(JSContext* cx, MutableHandleFunction fun, + const ReadOnlyCompileOptions& options, + Handle formals, JS::SourceBufferHolder& srcBuf); + ScriptSourceObject* CreateScriptSourceObject(ExclusiveContext* cx, const ReadOnlyCompileOptions& options); diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 89eda16c58a4..0b319c5e1055 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -6929,6 +6929,11 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) if (!pn->functionIsHoisted()) { /* JSOP_LAMBDA_ARROW is always preceded by a new.target */ MOZ_ASSERT(fun->isArrow() == (pn->getOp() == JSOP_LAMBDA_ARROW)); + if (funbox->isAsync()) { + MOZ_ASSERT(!needsProto); + return emitAsyncWrapper(index, funbox->needsHomeObject(), fun->isArrow()); + } + if (fun->isArrow()) { if (sc->allowNewTarget()) { if (!emit1(JSOP_NEWTARGET)) @@ -6980,8 +6985,13 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) MOZ_ASSERT(sc->isGlobalContext() || sc->isEvalContext()); MOZ_ASSERT(pn->getOp() == JSOP_NOP); switchToPrologue(); - if (!emitIndex32(JSOP_LAMBDA, index)) - return false; + if (funbox->isAsync()) { + if (!emitAsyncWrapper(index, fun->isMethod(), fun->isArrow())) + return false; + } else { + if (!emitIndex32(JSOP_LAMBDA, index)) + return false; + } if (!emit1(JSOP_DEFFUN)) return false; if (!updateSourceCoordNotes(pn->pn_pos.begin)) @@ -6992,7 +7002,12 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) // For functions nested within functions and blocks, make a lambda and // initialize the binding name of the function in the current scope. - auto emitLambda = [index](BytecodeEmitter* bce, const NameLocation&, bool) { + bool isAsync = funbox->isAsync(); + auto emitLambda = [index, isAsync](BytecodeEmitter* bce, const NameLocation&, bool) { + if (isAsync) { + return bce->emitAsyncWrapper(index, /* needsHomeObject = */ false, + /* isArrow = */ false); + } return bce->emitIndexOp(JSOP_LAMBDA, index); }; @@ -7005,6 +7020,74 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) return true; } +bool +BytecodeEmitter::emitAsyncWrapperLambda(unsigned index, bool isArrow) { + if (isArrow) { + if (sc->allowNewTarget()) { + if (!emit1(JSOP_NEWTARGET)) + return false; + } else { + if (!emit1(JSOP_NULL)) + return false; + } + if (!emitIndex32(JSOP_LAMBDA_ARROW, index)) + return false; + } else { + if (!emitIndex32(JSOP_LAMBDA, index)) + return false; + } + + return true; +} + +bool +BytecodeEmitter::emitAsyncWrapper(unsigned index, bool needsHomeObject, bool isArrow) { + // needsHomeObject can be true for propertyList for extended class. + // In that case push both unwrapped and wrapped function, in order to + // initialize home object of unwrapped function, and set wrapped function + // as a property. + // + // lambda // unwrapped + // getintrinsic // unwrapped AsyncFunction_wrap + // undefined // unwrapped AsyncFunction_wrap undefined + // dupat 2 // unwrapped AsyncFunction_wrap undefined unwrapped + // call 1 // unwrapped wrapped + // + // Emitted code is surrounded by the following code. + // + // // classObj classCtor classProto + // (emitted code) // classObj classCtor classProto unwrapped wrapped + // swap // classObj classCtor classProto wrapped unwrapped + // inithomeobject 1 // classObj classCtor classProto wrapped unwrapped + // // initialize the home object of unwrapped + // // with classProto here + // pop // classObj classCtor classProto wrapped + // inithiddenprop // classObj classCtor classProto wrapped + // // initialize the property of the classProto + // // with wrapped function here + // pop // classObj classCtor classProto + // + // needsHomeObject is false for other cases, push wrapped function only. + if (needsHomeObject) { + if (!emitAsyncWrapperLambda(index, isArrow)) + return false; + } + if (!emitAtomOp(cx->names().AsyncFunction_wrap, JSOP_GETINTRINSIC)) + return false; + if (!emit1(JSOP_UNDEFINED)) + return false; + if (needsHomeObject) { + if (!emitDupAt(2)) + return false; + } else { + if (!emitAsyncWrapperLambda(index, isArrow)) + return false; + } + if (!emitCall(JSOP_CALL, 1)) + return false; + return true; +} + bool BytecodeEmitter::emitDo(ParseNode* pn) { @@ -8386,8 +8469,17 @@ BytecodeEmitter::emitPropertyList(ParseNode* pn, MutableHandlePlainObject objp, propdef->pn_right->pn_funbox->needsHomeObject()) { MOZ_ASSERT(propdef->pn_right->pn_funbox->function()->allowSuperProperty()); - if (!emit2(JSOP_INITHOMEOBJECT, isIndex)) + bool isAsync = propdef->pn_right->pn_funbox->isAsync(); + if (isAsync) { + if (!emit1(JSOP_SWAP)) + return false; + } + if (!emit2(JSOP_INITHOMEOBJECT, isIndex + isAsync)) return false; + if (isAsync) { + if (!emit1(JSOP_POP)) + return false; + } } // Class methods are not enumerable. diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index 3e4def04c11b..1bb4191ee1ec 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -603,6 +603,9 @@ struct MOZ_STACK_CLASS BytecodeEmitter MOZ_MUST_USE bool emitPropOp(ParseNode* pn, JSOp op); MOZ_MUST_USE bool emitPropIncDec(ParseNode* pn); + MOZ_MUST_USE bool emitAsyncWrapperLambda(unsigned index, bool isArrow); + MOZ_MUST_USE bool emitAsyncWrapper(unsigned index, bool needsHomeObject, bool isArrow); + MOZ_MUST_USE bool emitComputedPropertyName(ParseNode* computedPropName); // Emit bytecode to put operands for a JSOP_GETELEM/CALLELEM/SETELEM/DELELEM diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index ecc53ebfd2b8..7f214907c13e 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2274,6 +2274,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, funbox->hasDuplicateParameters = duplicatedParam; YieldHandling yieldHandling = GetYieldHandling(generatorKind, asyncKind); + AutoAwaitIsKeyword awaitIsKeyword(&tokenStream, asyncKind == AsyncFunction); ParseNode* pn = functionBody(InAllowed, yieldHandling, Statement, StatementListBody); if (!pn) return null(); @@ -2540,6 +2541,10 @@ Parser::newFunction(HandleAtom atom, FunctionSyntaxKind kind, : JSFunction::INTERPRETED_GENERATOR); } + // We store the async wrapper in a slot for later access. + if (asyncKind == AsyncFunction) + allocKind = gc::AllocKind::FUNCTION_EXTENDED; + fun = NewFunctionWithProto(context, nullptr, 0, flags, nullptr, atom, proto, allocKind, TenuredObject); if (!fun) diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index 922260b2e06f..ece8edda2ccc 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -2434,7 +2434,8 @@ CodeGenerator::visitLambda(LLambda* lir) emitLambdaInit(output, envChain, info); if (info.flags & JSFunction::EXTENDED) { - MOZ_ASSERT(info.fun->allowSuperProperty() || info.fun->isSelfHostedBuiltin()); + MOZ_ASSERT(info.fun->allowSuperProperty() || info.fun->isSelfHostedBuiltin() || + info.fun->isAsync()); static_assert(FunctionExtended::NUM_EXTENDED_SLOTS == 2, "All slots must be initialized"); masm.storeValue(UndefinedValue(), Address(output, FunctionExtended::offsetOfExtendedSlot(0))); masm.storeValue(UndefinedValue(), Address(output, FunctionExtended::offsetOfExtendedSlot(1))); diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp index 62e1d5c02f63..0686fcff13be 100644 --- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -42,6 +42,7 @@ #include "vm/Debugger.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" +#include "vm/SelfHosting.h" #include "vm/Shape.h" #include "vm/SharedImmutableStringsCache.h" #include "vm/StringBuffer.h" @@ -1658,7 +1659,8 @@ const JSFunctionSpec js::function_methods[] = { }; static bool -FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind generatorKind) +FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind) { CallArgs args = CallArgsFromVp(argc, vp); @@ -1670,7 +1672,10 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener } bool isStarGenerator = generatorKind == StarGenerator; + bool isAsync = asyncKind == AsyncFunction; MOZ_ASSERT(generatorKind != LegacyGenerator); + MOZ_ASSERT_IF(isAsync, isStarGenerator); + MOZ_ASSERT_IF(!isStarGenerator, !isAsync); RootedScript maybeScript(cx); const char* filename; @@ -1681,7 +1686,9 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener &mutedErrors); const char* introductionType = "Function"; - if (generatorKind != NotGenerator) + if (isAsync) + introductionType = "AsyncFunction"; + else if (generatorKind != NotGenerator) introductionType = "GeneratorFunction"; const char* introducerFilename = filename; @@ -1775,6 +1782,8 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener RootedAtom anonymousAtom(cx, cx->names().anonymous); RootedObject proto(cx); if (isStarGenerator) { + // Unwrapped function of async function should use GeneratorFunction, + // while wrapped function isn't generator. proto = GlobalObject::getOrCreateStarGeneratorFunctionPrototype(cx, global); if (!proto) return false; @@ -1784,10 +1793,11 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener } RootedObject globalLexical(cx, &global->lexicalEnvironment()); + AllocKind allocKind = isAsync ? AllocKind::FUNCTION_EXTENDED : AllocKind::FUNCTION; RootedFunction fun(cx, NewFunctionWithProto(cx, nullptr, 0, JSFunction::INTERPRETED_LAMBDA, globalLexical, anonymousAtom, proto, - AllocKind::FUNCTION, TenuredObject)); + allocKind, TenuredObject)); if (!fun) return false; @@ -1875,7 +1885,9 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener : SourceBufferHolder::NoOwnership; bool ok; SourceBufferHolder srcBuf(chars.start().get(), chars.length(), ownership); - if (isStarGenerator) + if (isAsync) + ok = frontend::CompileAsyncFunctionBody(cx, &fun, options, formals, srcBuf); + else if (isStarGenerator) ok = frontend::CompileStarGeneratorBody(cx, &fun, options, formals, srcBuf); else ok = frontend::CompileFunctionBody(cx, &fun, options, formals, srcBuf); @@ -1886,13 +1898,26 @@ FunctionConstructor(JSContext* cx, unsigned argc, Value* vp, GeneratorKind gener bool js::Function(JSContext* cx, unsigned argc, Value* vp) { - return FunctionConstructor(cx, argc, vp, NotGenerator); + return FunctionConstructor(cx, argc, vp, NotGenerator, SyncFunction); } bool js::Generator(JSContext* cx, unsigned argc, Value* vp) { - return FunctionConstructor(cx, argc, vp, StarGenerator); + return FunctionConstructor(cx, argc, vp, StarGenerator, SyncFunction); +} + +bool +js::AsyncFunctionConstructor(JSContext* cx, unsigned argc, Value* vp) +{ + CallArgs args = CallArgsFromVp(argc, vp); + if (!FunctionConstructor(cx, argc, vp, StarGenerator, AsyncFunction)) + return false; + + FixedInvokeArgs<1> args2(cx); + args2[0].set(args.rval()); + return CallSelfHostedFunction(cx, cx->names().AsyncFunction_wrap, + NullHandleValue, args2, args.rval()); } bool diff --git a/js/src/jsfun.h b/js/src/jsfun.h index 76d9812d3132..027f9099267f 100644 --- a/js/src/jsfun.h +++ b/js/src/jsfun.h @@ -620,6 +620,9 @@ Function(JSContext* cx, unsigned argc, Value* vp); extern bool Generator(JSContext* cx, unsigned argc, Value* vp); +extern bool +AsyncFunctionConstructor(JSContext* cx, unsigned argc, Value* vp); + // Allocate a new function backed by a JSNative. Note that by default this // creates a singleton object. extern JSFunction* diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index e27b2ea713f0..3313979522ab 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -3105,6 +3105,8 @@ Rebase(JSScript* dst, JSScript* src, T* srcp) static JSObject* CloneInnerInterpretedFunction(JSContext* cx, HandleScope enclosingScope, HandleFunction srcFun) { + /* async function should not appear as inner function. */ + MOZ_ASSERT(!srcFun->isAsync()); /* NB: Keep this in sync with XDRInterpretedFunction. */ RootedObject cloneProto(cx); if (srcFun->isStarGenerator()) { diff --git a/js/src/moz.build b/js/src/moz.build index 114dc559ca67..b92af8b141df 100644 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -324,6 +324,7 @@ UNIFIED_SOURCES += [ 'threading/Mutex.cpp', 'vm/ArgumentsObject.cpp', 'vm/ArrayBufferObject.cpp', + 'vm/AsyncFunction.cpp', 'vm/Caches.cpp', 'vm/CallNonGenericMethod.cpp', 'vm/CharacterEncoding.cpp', @@ -749,6 +750,7 @@ selfhosted.inputs = [ 'builtin/SelfHostingDefines.h', 'builtin/Utilities.js', 'builtin/Array.js', + 'builtin/AsyncFunctions.js', 'builtin/Classes.js', 'builtin/Date.js', 'builtin/Error.js', diff --git a/js/src/vm/AsyncFunction.cpp b/js/src/vm/AsyncFunction.cpp new file mode 100644 index 000000000000..496b2750fc21 --- /dev/null +++ b/js/src/vm/AsyncFunction.cpp @@ -0,0 +1,115 @@ +/* -*- 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/. */ + +#include "vm/AsyncFunction.h" + +#include "jscompartment.h" + +#include "builtin/SelfHostingDefines.h" +#include "vm/GlobalObject.h" +#include "vm/SelfHosting.h" + +using namespace js; +using namespace js::gc; + +/* static */ bool +GlobalObject::initAsyncFunction(JSContext* cx, Handle global) +{ + if (global->getReservedSlot(ASYNC_FUNCTION_PROTO).isObject()) + return true; + + RootedObject asyncFunctionProto(cx, NewSingletonObjectWithFunctionPrototype(cx, global)); + if (!asyncFunctionProto) + return false; + + RootedValue function(cx, global->getConstructor(JSProto_Function)); + if (!function.toObjectOrNull()) + return false; + RootedObject proto(cx, &function.toObject()); + RootedAtom name(cx, cx->names().AsyncFunction); + RootedObject asyncFunction(cx, NewFunctionWithProto(cx, AsyncFunctionConstructor, 1, + JSFunction::NATIVE_CTOR, nullptr, name, + proto)); + if (!asyncFunction) + return false; + if (!LinkConstructorAndPrototype(cx, asyncFunction, asyncFunctionProto)) + return false; + + global->setReservedSlot(ASYNC_FUNCTION, ObjectValue(*asyncFunction)); + global->setReservedSlot(ASYNC_FUNCTION_PROTO, ObjectValue(*asyncFunctionProto)); + return true; +} + +JSFunction* +js::GetWrappedAsyncFunction(JSFunction* unwrapped) +{ + MOZ_ASSERT(unwrapped->isAsync()); + return &unwrapped->getExtendedSlot(ASYNC_WRAPPED_SLOT).toObject().as(); +} + +JSFunction* +js::GetUnwrappedAsyncFunction(JSFunction* wrapper) +{ + JSFunction* unwrapped = &wrapper->getExtendedSlot(ASYNC_UNWRAPPED_SLOT).toObject().as(); + MOZ_ASSERT(unwrapped->isAsync()); + return unwrapped; +} + +bool +js::IsWrappedAsyncFunction(JSContext* cx, JSFunction* wrapper) +{ + return IsSelfHostedFunctionWithName(wrapper, cx->names().AsyncWrapped); +} + +bool +js::CreateAsyncFunction(JSContext* cx, HandleFunction wrapper, HandleFunction unwrapped, + MutableHandleFunction result) +{ + // Create a new function with AsyncFunctionPrototype, reusing the script + // and the environment of `wrapper` function, and the name and the length + // of `unwrapped` function. + RootedObject proto(cx, GlobalObject::getOrCreateAsyncFunctionPrototype(cx, cx->global())); + RootedObject scope(cx, wrapper->environment()); + RootedAtom atom(cx, unwrapped->name()); + RootedFunction wrapped(cx, NewFunctionWithProto(cx, nullptr, 0, + JSFunction::INTERPRETED_LAMBDA, + scope, atom, proto, + AllocKind::FUNCTION_EXTENDED, TenuredObject)); + if (!wrapped) + return false; + + wrapped->initScript(wrapper->nonLazyScript()); + + // Link them each other to make GetWrappedAsyncFunction and + // GetUnwrappedAsyncFunction work. + unwrapped->setExtendedSlot(ASYNC_WRAPPED_SLOT, ObjectValue(*wrapped)); + wrapped->setExtendedSlot(ASYNC_UNWRAPPED_SLOT, ObjectValue(*unwrapped)); + + // The script of `wrapper` is self-hosted, so `wrapped` should also be + // set as self-hosted function. + wrapped->setIsSelfHostedBuiltin(); + + // Set LAZY_FUNCTION_NAME_SLOT to "AsyncWrapped" to make it detectable in + // IsWrappedAsyncFunction. + wrapped->setExtendedSlot(LAZY_FUNCTION_NAME_SLOT, StringValue(cx->names().AsyncWrapped)); + + // The length of the script of `wrapper` is different than the length of + // `unwrapped`. We should set actual length as resolved length, to avoid + // using the length of the script. + uint16_t length; + if (!unwrapped->getLength(cx, &length)) + return false; + + RootedValue lengthValue(cx, NumberValue(length)); + if (!DefineProperty(cx, wrapped, cx->names().length, lengthValue, + nullptr, nullptr, JSPROP_READONLY)) + { + return false; + } + + result.set(wrapped); + return true; +} diff --git a/js/src/vm/AsyncFunction.h b/js/src/vm/AsyncFunction.h new file mode 100644 index 000000000000..62fce6aa5ac8 --- /dev/null +++ b/js/src/vm/AsyncFunction.h @@ -0,0 +1,30 @@ +/* -*- 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 vm_AsyncFunction_h +#define vm_AsyncFunction_h + +#include "jscntxt.h" +#include "jsobj.h" + +namespace js { + +JSFunction* +GetWrappedAsyncFunction(JSFunction* unwrapped); + +JSFunction* +GetUnwrappedAsyncFunction(JSFunction* wrapper); + +bool +IsWrappedAsyncFunction(JSContext* cx, JSFunction* wrapper); + +bool +CreateAsyncFunction(JSContext* cx, HandleFunction wrapper, HandleFunction unwrapped, + MutableHandleFunction result); + +} // namespace js + +#endif /* vm_AsyncFunction_h */ diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 5999cdb5730a..b74cd755af8c 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -29,6 +29,9 @@ macro(ArrayValuesAt, ArrayValuesAt, "ArrayValuesAt") \ macro(as, as, "as") \ macro(Async, Async, "Async") \ + macro(AsyncFunction, AsyncFunction, "AsyncFunction") \ + macro(AsyncFunction_wrap, AsyncFunction_wrap, "AsyncFunction_wrap") \ + macro(AsyncWrapped, AsyncWrapped, "AsyncWrapped") \ macro(async, async, "async") \ macro(await, await, "await") \ macro(Bool8x16, Bool8x16, "Bool8x16") \ diff --git a/js/src/vm/EnvironmentObject.cpp b/js/src/vm/EnvironmentObject.cpp index 0c5ff8edcc0a..2133b12c54c9 100644 --- a/js/src/vm/EnvironmentObject.cpp +++ b/js/src/vm/EnvironmentObject.cpp @@ -17,6 +17,7 @@ #include "frontend/ParseNode.h" #include "gc/Policy.h" #include "vm/ArgumentsObject.h" +#include "vm/AsyncFunction.h" #include "vm/GlobalObject.h" #include "vm/ProxyObject.h" #include "vm/Shape.h" @@ -1023,7 +1024,9 @@ const Class LexicalEnvironmentObject::class_ = { }; /* static */ NamedLambdaObject* -NamedLambdaObject::create(JSContext* cx, HandleFunction callee, HandleObject enclosing, +NamedLambdaObject::create(JSContext* cx, HandleFunction callee, + HandleFunction func, + HandleObject enclosing, gc::InitialHeap heap) { MOZ_ASSERT(callee->isNamedLambda()); @@ -1045,14 +1048,14 @@ NamedLambdaObject::create(JSContext* cx, HandleFunction callee, HandleObject enc if (!obj) return nullptr; - obj->initFixedSlot(lambdaSlot(), ObjectValue(*callee)); + obj->initFixedSlot(lambdaSlot(), ObjectValue(*func)); return static_cast(obj); } /* static */ NamedLambdaObject* NamedLambdaObject::createTemplateObject(JSContext* cx, HandleFunction callee, gc::InitialHeap heap) { - return create(cx, callee, nullptr, heap); + return create(cx, callee, callee, nullptr, heap); } /* static */ NamedLambdaObject* @@ -1060,7 +1063,15 @@ NamedLambdaObject::create(JSContext* cx, AbstractFramePtr frame) { RootedFunction fun(cx, frame.callee()); RootedObject enclosing(cx, frame.environmentChain()); - return create(cx, fun, enclosing, gc::DefaultHeap); + return create(cx, fun, fun, enclosing, gc::DefaultHeap); +} + +/* static */ NamedLambdaObject* +NamedLambdaObject::create(JSContext* cx, AbstractFramePtr frame, HandleFunction replacement) +{ + RootedFunction fun(cx, frame.callee()); + RootedObject enclosing(cx, frame.environmentChain()); + return create(cx, fun, replacement, enclosing, gc::DefaultHeap); } /* static */ size_t @@ -3365,7 +3376,15 @@ js::InitFunctionEnvironmentObjects(JSContext* cx, AbstractFramePtr frame) // Named lambdas may have an environment that holds itself for recursion. if (callee->needsNamedLambdaEnvironment()) { - NamedLambdaObject* declEnv = NamedLambdaObject::create(cx, frame); + NamedLambdaObject* declEnv; + if (callee->isAsync()) { + // Named async function needs special environment to return + // wrapped function for the binding. + RootedFunction fun(cx, GetWrappedAsyncFunction(callee)); + declEnv = NamedLambdaObject::create(cx, frame, fun); + } else { + declEnv = NamedLambdaObject::create(cx, frame); + } if (!declEnv) return false; frame.pushOnEnvironmentChain(*declEnv); diff --git a/js/src/vm/EnvironmentObject.h b/js/src/vm/EnvironmentObject.h index f97ff1f9f586..6bdaac89e891 100644 --- a/js/src/vm/EnvironmentObject.h +++ b/js/src/vm/EnvironmentObject.h @@ -515,6 +515,7 @@ class LexicalEnvironmentObject : public EnvironmentObject class NamedLambdaObject : public LexicalEnvironmentObject { static NamedLambdaObject* create(JSContext* cx, HandleFunction callee, + HandleFunction replacement, HandleObject enclosing, gc::InitialHeap heap); public: @@ -522,6 +523,8 @@ class NamedLambdaObject : public LexicalEnvironmentObject gc::InitialHeap heap); static NamedLambdaObject* create(JSContext* cx, AbstractFramePtr frame); + static NamedLambdaObject* create(JSContext* cx, AbstractFramePtr frame, + HandleFunction replacement); // For JITs. static size_t lambdaSlot(); diff --git a/js/src/vm/GeneratorObject.cpp b/js/src/vm/GeneratorObject.cpp index c808fe5dd1fc..25cacd29478c 100644 --- a/js/src/vm/GeneratorObject.cpp +++ b/js/src/vm/GeneratorObject.cpp @@ -260,8 +260,8 @@ NewSingletonObjectWithObjectPrototype(JSContext* cx, Handle globa return NewObjectWithGivenProto(cx, proto, SingletonObject); } -static JSObject* -NewSingletonObjectWithFunctionPrototype(JSContext* cx, Handle global) +JSObject* +js::NewSingletonObjectWithFunctionPrototype(JSContext* cx, Handle global) { RootedObject proto(cx, global->getOrCreateFunctionPrototype(cx)); if (!proto) diff --git a/js/src/vm/GlobalObject.h b/js/src/vm/GlobalObject.h index 08baa47d6016..ab520803a009 100644 --- a/js/src/vm/GlobalObject.h +++ b/js/src/vm/GlobalObject.h @@ -97,6 +97,8 @@ class GlobalObject : public NativeObject STAR_GENERATOR_OBJECT_PROTO, STAR_GENERATOR_FUNCTION_PROTO, STAR_GENERATOR_FUNCTION, + ASYNC_FUNCTION_PROTO, + ASYNC_FUNCTION, MAP_ITERATOR_PROTO, SET_ITERATOR_PROTO, COLLATOR_PROTO, @@ -576,6 +578,19 @@ class GlobalObject : public NativeObject return global->getOrCreateObject(cx, STAR_GENERATOR_FUNCTION, initStarGenerators); } + static NativeObject* getOrCreateAsyncFunctionPrototype(JSContext* cx, + Handle global) + { + return MaybeNativeObject(global->getOrCreateObject(cx, ASYNC_FUNCTION_PROTO, + initAsyncFunction)); + } + + static JSObject* getOrCreateAsyncFunction(JSContext* cx, + Handle global) + { + return global->getOrCreateObject(cx, ASYNC_FUNCTION, initAsyncFunction); + } + static JSObject* getOrCreateMapIteratorPrototype(JSContext* cx, Handle global) { @@ -725,6 +740,8 @@ class GlobalObject : public NativeObject static bool initLegacyGeneratorProto(JSContext* cx, Handle global); static bool initStarGenerators(JSContext* cx, Handle global); + static bool initAsyncFunction(JSContext* cx, Handle global); + // Implemented in builtin/MapObject.cpp. static bool initMapIteratorProto(JSContext* cx, Handle global); static bool initSetIteratorProto(JSContext* cx, Handle global); @@ -985,6 +1002,9 @@ StandardProtoKeyOrNull(const JSObject* obj) return key; } +JSObject* +NewSingletonObjectWithFunctionPrototype(JSContext* cx, Handle global); + } // namespace js template<> diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp index a9b5fca4d6e9..7375ac0ad306 100644 --- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -38,6 +38,7 @@ #include "jit/InlinableNatives.h" #include "js/CharacterEncoding.h" #include "js/Date.h" +#include "vm/AsyncFunction.h" #include "vm/Compression.h" #include "vm/GeneratorObject.h" #include "vm/Interpreter.h" @@ -1831,6 +1832,23 @@ js::ReportIncompatibleSelfHostedMethod(JSContext* cx, const CallArgs& args) return false; } +bool +intrinsic_CreateAsyncFunction(JSContext* cx, unsigned argc, Value* vp) +{ + CallArgs args = CallArgsFromVp(argc, vp); + MOZ_ASSERT(args.length() == 2); + + RootedFunction wrapper(cx, &args[0].toObject().as()); + RootedFunction unwrapped(cx, &args[1].toObject().as()); + + RootedFunction wrapped(cx); + if (!CreateAsyncFunction(cx, wrapper, unwrapped, &wrapped)) + return false; + + args.rval().setObject(*wrapped); + return true; +} + /** * Returns the default locale as a well-formed, but not necessarily canonicalized, * BCP-47 language tag. @@ -2230,6 +2248,8 @@ static const JSFunctionSpec intrinsic_functions[] = { JS_FN("RuntimeDefaultLocale", intrinsic_RuntimeDefaultLocale, 0,0), JS_FN("AddContentTelemetry", intrinsic_AddContentTelemetry, 2,0), + JS_FN("CreateAsyncFunction", intrinsic_CreateAsyncFunction, 1,0), + JS_INLINABLE_FN("_IsConstructing", intrinsic_IsConstructing, 0,0, IntrinsicIsConstructing), JS_INLINABLE_FN("SubstringKernel", intrinsic_SubstringKernel, 3,0, @@ -2363,6 +2383,10 @@ static const JSFunctionSpec intrinsic_functions[] = { JS_FN("CallWeakSetMethodIfWrapped", CallNonGenericSelfhostedMethod>, 2, 0), + JS_FN("Promise_static_resolve", Promise_static_resolve, 1, 0), + JS_FN("Promise_static_reject", Promise_reject, 1, 0), + JS_FN("Promise_then", Promise_then, 2, 0), + // See builtin/TypedObject.h for descriptors of the typedobj functions. JS_FN("NewOpaqueTypedObject", js::NewOpaqueTypedObject, 1, 0), JS_FN("NewDerivedTypedObject", js::NewDerivedTypedObject, 3, 0), From 0cfe3ce610bf1f9e20b929b7fbef38ded3a8aef0 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 02:06:19 +0900 Subject: [PATCH 31/61] Bug 1185106 - Part 11.2: Add helper functions for async/await test. r=till MozReview-Commit-ID: B3lwv5ejz5g --- js/src/tests/ecma_7/AsyncFunctions/shell.js | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/js/src/tests/ecma_7/AsyncFunctions/shell.js b/js/src/tests/ecma_7/AsyncFunctions/shell.js index e69de29bb2d1..caee5ff7ef69 100644 --- a/js/src/tests/ecma_7/AsyncFunctions/shell.js +++ b/js/src/tests/ecma_7/AsyncFunctions/shell.js @@ -0,0 +1,26 @@ +(function(global) { + function getPromiseResult(promise) { + var result, error, caught = false; + promise.then(r => { result = r; }, + e => { caught = true; error = e; }); + drainJobQueue(); + if (caught) + throw error; + return result; + } + + function assertEventuallyEq(promise, expected) { + assertEq(getPromiseResult(promise), expected); + } + global.assertEventuallyEq = assertEventuallyEq; + + function assertEventuallyThrows(promise, expectedErrorType) { + assertThrowsInstanceOf(() => getPromiseResult(promise), expectedErrorType); + }; + global.assertEventuallyThrows = assertEventuallyThrows; + + function assertEventuallyDeepEq(promise, expected) { + assertDeepEq(getPromiseResult(promise), expected); + }; + global.assertEventuallyDeepEq = assertEventuallyDeepEq; +})(this); From ebcb47a21f5a494b08a709548046d43f047cea04 Mon Sep 17 00:00:00 2001 From: Mariusz Kierski Date: Mon, 29 Aug 2016 02:06:19 +0900 Subject: [PATCH 32/61] Bug 1185106 - Part 11.3: Add semantics test for async/await. r=efaust,till MozReview-Commit-ID: E1WPuMsz3Jk --- .../tests/ecma_7/AsyncFunctions/BoundNames.js | 21 +++ js/src/tests/ecma_7/AsyncFunctions/methods.js | 61 +++++++ .../tests/ecma_7/AsyncFunctions/semantics.js | 169 ++++++++++++++++++ 3 files changed, 251 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/BoundNames.js create mode 100644 js/src/tests/ecma_7/AsyncFunctions/methods.js create mode 100644 js/src/tests/ecma_7/AsyncFunctions/semantics.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/BoundNames.js b/js/src/tests/ecma_7/AsyncFunctions/BoundNames.js new file mode 100644 index 000000000000..743f4fdccd05 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/BoundNames.js @@ -0,0 +1,21 @@ +var BUGNUMBER = 1185106; +var summary = "Bound names of async functions"; + +print(BUGNUMBER + ": " + summary); + +async function test() {} +assertEq(test.name, "test"); + +var test2 = (async function test2() {}); +assertEq(test2.name, "test2"); + +var anon = async function() {}; +assertEq(anon.name, ""); + +if (typeof Reflect !== "undefined" && Reflect.parse) { + var tree = Reflect.parse("export default async function() {}", { target: "module" }); + assertEq(tree.body[0].declaration.id.name, "*default*"); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_7/AsyncFunctions/methods.js b/js/src/tests/ecma_7/AsyncFunctions/methods.js new file mode 100644 index 000000000000..061a0e82671f --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/methods.js @@ -0,0 +1,61 @@ +// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue +var BUGNUMBER = 1185106; +var summary = "async methods semantics"; + +print(BUGNUMBER + ": " + summary); + +class X { + constructor() { + this.value = 42; + } + async getValue() { + return this.value; + } + setValue(value) { + this.value = value; + } + async increment() { + var value = await this.getValue(); + this.setValue(value + 1); + return this.getValue(); + } + async getBaseClassName() { + return 'X'; + } + static async getStaticValue() { + return 44; + } + async 10() { + return 46; + } + async ["foo"]() { + return 47; + } +} + +class Y extends X { + async getBaseClassName() { + return super.getBaseClassName(); + } +} + +var objLiteral = { + async get() { + return 45; + }, + someStuff: 5 +}; + +var x = new X(); +var y = new Y(); + +assertEventuallyEq(x.getValue(), 42); +assertEventuallyEq(x.increment(), 43); +assertEventuallyEq(x[10](), 46); +assertEventuallyEq(x.foo(), 47); +assertEventuallyEq(X.getStaticValue(), 44); +assertEventuallyEq(objLiteral.get(), 45); +assertEventuallyEq(y.getBaseClassName(), 'X'); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_7/AsyncFunctions/semantics.js b/js/src/tests/ecma_7/AsyncFunctions/semantics.js new file mode 100644 index 000000000000..cb2a04c3ffa5 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/semantics.js @@ -0,0 +1,169 @@ +// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue +var BUGNUMBER = 1185106; +var summary = "async functions semantics"; + +print(BUGNUMBER + ": " + summary); + +async function empty() { +} +assertEventuallyEq(empty(), undefined); + +async function simpleReturn() { + return 1; +} +assertEventuallyEq(simpleReturn(), 1); + +async function simpleAwait() { + var result = await 2; + return result; +} +assertEventuallyEq(simpleAwait(), 2); + +async function simpleAwaitAsync() { + var result = await simpleReturn(); + return 2 + result; +} +assertEventuallyEq(simpleAwaitAsync(), 3); + +async function returnOtherAsync() { + return 1 + await simpleAwaitAsync(); +} +assertEventuallyEq(returnOtherAsync(), 4); + +async function simpleThrower() { + throw new Error(); +} +assertEventuallyThrows(simpleThrower(), Error); + +async function delegatedThrower() { + var val = await simpleThrower(); + return val; +} + +async function tryCatch() { + try { + await delegatedThrower(); + return 'FAILED'; + } catch (_) { + return 5; + } +} +assertEventuallyEq(tryCatch(), 5); + +async function tryCatchThrow() { + try { + await delegatedThrower(); + return 'FAILED'; + } catch (_) { + return delegatedThrower(); + } +} +assertEventuallyThrows(tryCatchThrow(), Error); + +async function wellFinally() { + try { + await delegatedThrower(); + } catch (_) { + return 'FAILED'; + } finally { + return 6; + } +} +assertEventuallyEq(wellFinally(), 6); + +async function finallyMayFail() { + try { + await delegatedThrower(); + } catch (_) { + return 5; + } finally { + return delegatedThrower(); + } +} +assertEventuallyThrows(finallyMayFail(), Error); + +async function embedded() { + async function inner() { + return 7; + } + return await inner(); +} +assertEventuallyEq(embedded(), 7); + +// recursion, it works! +async function fib(n) { + return (n == 0 || n == 1) ? n : await fib(n - 1) + await fib(n - 2); +} +assertEventuallyEq(fib(6), 8); + +// mutual recursion +async function isOdd(n) { + async function isEven(n) { + return n === 0 || await isOdd(n - 1); + } + return n !== 0 && await isEven(n - 1); +} +assertEventuallyEq(isOdd(12).then(v => v ? "oops" : 12), 12); + +// recursion, take three! +var hardcoreFib = async function fib2(n) { + return (n == 0 || n == 1) ? n : await fib2(n - 1) + await fib2(n - 2); +} +assertEventuallyEq(hardcoreFib(7), 13); + +var asyncExpr = async function() { + return 10; +} +assertEventuallyEq(asyncExpr(), 10); + +var namedAsyncExpr = async function simple() { + return 11; +} +assertEventuallyEq(namedAsyncExpr(), 11); + +async function executionOrder() { + var value = 0; + async function first() { + return (value = value === 0 ? 1 : value); + } + async function second() { + return (value = value === 0 ? 2 : value); + } + async function third() { + return (value = value === 0 ? 3 : value); + } + return await first() + await second() + await third() + 6; +} +assertEventuallyEq(executionOrder(), 9); + +async function miscellaneous() { + if (arguments.length === 3 && + arguments.callee.name === "miscellaneous") + return 14; +} +assertEventuallyEq(miscellaneous(1, 2, 3), 14); + +function thrower() { + throw 15; +} + +async function defaultArgs(arg = thrower()) { +} +assertEventuallyEq(defaultArgs().catch(e => e), 15); + +let arrowAwaitExpr = async () => await 2; +assertEventuallyEq(arrowAwaitExpr(), 2); + +let arrowAwaitBlock = async () => { return await 2; }; +assertEventuallyEq(arrowAwaitBlock(), 2); + +// Async functions are not constructible +assertThrows(() => { + async function Person() { + + } + new Person(); +}, TypeError); + +if (typeof reportCompare === "function") + reportCompare(true, true); From 75a6a457af48ce594a2fea3beae5c94438b030fe Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 02:06:19 +0900 Subject: [PATCH 33/61] Bug 1185106 - Part 11.4: Add function length test for async function. r=till MozReview-Commit-ID: BILq634dpL2 --- js/src/tests/ecma_7/AsyncFunctions/length.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/length.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/length.js b/js/src/tests/ecma_7/AsyncFunctions/length.js new file mode 100644 index 000000000000..da95e23b8949 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/length.js @@ -0,0 +1,12 @@ +var BUGNUMBER = 1185106; +var summary = "async function length"; + +print(BUGNUMBER + ": " + summary); + +assertEq(async function() {}.length, 0); +assertEq(async function(a) {}.length, 1); +assertEq(async function(a, b, c) {}.length, 3); +assertEq(async function(a, b, c, ...d) {}.length, 3); + +if (typeof reportCompare === "function") + reportCompare(true, true); From f76ad02048450945682aebc30baf9cd2a3c95938 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 02:06:19 +0900 Subject: [PATCH 34/61] Bug 1185106 - Part 11.5: Add async function constructor and prototype. r=till MozReview-Commit-ID: DKdeWuAdhrY --- .../ecma_7/AsyncFunctions/constructor.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/constructor.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/constructor.js b/js/src/tests/ecma_7/AsyncFunctions/constructor.js new file mode 100644 index 000000000000..ccacb4363a73 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/constructor.js @@ -0,0 +1,33 @@ +var BUGNUMBER = 1185106; +var summary = "async function constructor and prototype"; + +print(BUGNUMBER + ": " + summary); + +var f1 = async function() {}; + +var AsyncFunction = f1.constructor; +var AsyncFunctionPrototype = AsyncFunction.prototype; + +assertEq(AsyncFunction.name, "AsyncFunction"); +assertEq(AsyncFunction.length, 1); +assertEq(Object.getPrototypeOf(async function() {}), AsyncFunctionPrototype); + +assertEq(AsyncFunctionPrototype.constructor, AsyncFunction); + +var f2 = AsyncFunction("await 1"); +assertEq(f2.constructor, AsyncFunction); +assertEq(f2.length, 0); +assertEq(Object.getPrototypeOf(f2), AsyncFunctionPrototype); + +var f3 = new AsyncFunction("await 1"); +assertEq(f3.constructor, AsyncFunction); +assertEq(f3.length, 0); +assertEq(Object.getPrototypeOf(f3), AsyncFunctionPrototype); + +var f4 = AsyncFunction("a", "b", "c", "await 1"); +assertEq(f4.constructor, AsyncFunction); +assertEq(f4.length, 3); +assertEq(Object.getPrototypeOf(f4), AsyncFunctionPrototype); + +if (typeof reportCompare === "function") + reportCompare(true, true); From 965b052608f64ed964bc1a2336125fc6ff51f21e Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 14:51:10 +0900 Subject: [PATCH 35/61] Bug 1185106 - Part 11.6: Add test for async function expression binding identity. r=till MozReview-Commit-ID: J7YAj7XIh24 --- js/src/tests/ecma_7/AsyncFunctions/identity.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/identity.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/identity.js b/js/src/tests/ecma_7/AsyncFunctions/identity.js new file mode 100644 index 000000000000..f3876bf23311 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/identity.js @@ -0,0 +1,14 @@ +// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue + +var BUGNUMBER = 1185106; +var summary = "Named async function expression should get wrapped function for the name inside it"; + +print(BUGNUMBER + ": " + summary); + +var expr = async function foo() { + return foo; +}; +assertEventuallyEq(expr(), expr); + +if (typeof reportCompare === "function") + reportCompare(true, true); From 615088fefde93da5cee7901e098bb586e920eb45 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 14:51:39 +0900 Subject: [PATCH 36/61] Bug 1185106 - Part 12: Return wrapped function for arguments.callee. r=till MozReview-Commit-ID: JxID0houuqK --- .../ecma_7/AsyncFunctions/arguments_callee.js | 31 +++++++++++++++++++ js/src/vm/ArgumentsObject.cpp | 10 ++++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/arguments_callee.js diff --git a/js/src/tests/ecma_7/AsyncFunctions/arguments_callee.js b/js/src/tests/ecma_7/AsyncFunctions/arguments_callee.js new file mode 100644 index 000000000000..2a577e0b9d40 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/arguments_callee.js @@ -0,0 +1,31 @@ +// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue + +var BUGNUMBER = 1185106; +var summary = "arguments.callee in sloppy mode should return wrapped function"; + +print(BUGNUMBER + ": " + summary); + +async function decl1() { + return arguments.callee; +} +assertEventuallyEq(decl1(), decl1); + +var expr1 = async function foo() { + return arguments.callee; +}; +assertEventuallyEq(expr1(), expr1); + +var expr2 = async function() { + return arguments.callee; +}; +assertEventuallyEq(expr2(), expr2); + +var obj = { + async method1() { + return arguments.callee; + } +}; +assertEventuallyEq(obj.method1(), obj.method1); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/vm/ArgumentsObject.cpp b/js/src/vm/ArgumentsObject.cpp index 7a73fe233b40..d01121ef0493 100644 --- a/js/src/vm/ArgumentsObject.cpp +++ b/js/src/vm/ArgumentsObject.cpp @@ -9,6 +9,7 @@ #include "mozilla/PodOperations.h" #include "jit/JitFrames.h" +#include "vm/AsyncFunction.h" #include "vm/GlobalObject.h" #include "vm/Stack.h" @@ -446,8 +447,13 @@ MappedArgGetter(JSContext* cx, HandleObject obj, HandleId id, MutableHandleValue vp.setInt32(argsobj.initialLength()); } else { MOZ_ASSERT(JSID_IS_ATOM(id, cx->names().callee)); - if (!argsobj.hasOverriddenCallee()) - vp.setObject(argsobj.callee()); + if (!argsobj.hasOverriddenCallee()) { + RootedFunction callee(cx, &argsobj.callee()); + if (callee->isAsync()) + vp.setObject(*GetWrappedAsyncFunction(callee)); + else + vp.setObject(*callee); + } } return true; } From 8f486dc57ca0e15dd185325153feef9570b614e6 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 29 Aug 2016 02:06:19 +0900 Subject: [PATCH 37/61] Bug 1185106 - Part 13: Support async function in Function.prototype.toString. r=till MozReview-Commit-ID: 1CwKhHKOLhk --- js/src/jsfun.cpp | 18 +++++++++++++- .../tests/ecma_7/AsyncFunctions/toString.js | 24 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 js/src/tests/ecma_7/AsyncFunctions/toString.js diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp index 0686fcff13be..5e0983bca641 100644 --- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -39,6 +39,7 @@ #include "jit/JitFrameIterator.h" #include "js/CallNonGenericMethod.h" #include "js/Proxy.h" +#include "vm/AsyncFunction.h" #include "vm/Debugger.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" @@ -986,6 +987,11 @@ js::FunctionToString(JSContext* cx, HandleFunction fun, bool lambdaParen) if (IsAsmJSFunction(fun)) return AsmJSFunctionToString(cx, fun); + if (IsWrappedAsyncFunction(cx, fun)) { + RootedFunction unwrapped(cx, GetUnwrappedAsyncFunction(fun)); + return FunctionToString(cx, unwrapped, lambdaParen); + } + StringBuffer out(cx); RootedScript script(cx); @@ -1002,6 +1008,11 @@ js::FunctionToString(JSContext* cx, HandleFunction fun, bool lambdaParen) } } + if (fun->isAsync()) { + if (!out.append("async ")) + return nullptr; + } + bool funIsMethodOrNonArrowLambda = (fun->isLambda() && !fun->isArrow()) || fun->isMethod() || fun->isGetter() || fun->isSetter(); @@ -1013,7 +1024,12 @@ js::FunctionToString(JSContext* cx, HandleFunction fun, bool lambdaParen) return nullptr; } if (!fun->isArrow()) { - if (!(fun->isStarGenerator() ? out.append("function* ") : out.append("function "))) + bool ok; + if (fun->isStarGenerator() && !fun->isAsync()) + ok = out.append("function* "); + else + ok = out.append("function "); + if (!ok) return nullptr; } if (fun->name()) { diff --git a/js/src/tests/ecma_7/AsyncFunctions/toString.js b/js/src/tests/ecma_7/AsyncFunctions/toString.js new file mode 100644 index 000000000000..39ae938c3ee9 --- /dev/null +++ b/js/src/tests/ecma_7/AsyncFunctions/toString.js @@ -0,0 +1,24 @@ +var BUGNUMBER = 1185106; +var summary = "async function toString"; + +print(BUGNUMBER + ": " + summary); + +async function f1(a, b, c) { await a; } + +assertEq(f1.toString(), + "async function f1(a, b, c) { await a; }"); + +assertEq(async function (a, b, c) { await a; }.toString(), + "async function (a, b, c) { await a; }"); + +assertEq((async (a, b, c) => await a).toString(), + "async (a, b, c) => await a"); + +assertEq((async (a, b, c) => { await a; }).toString(), + "async (a, b, c) => { await a; }"); + +assertEq({ async foo(a, b, c) { await a; } }.foo.toString(), + "async function foo(a, b, c) { await a; }"); + +if (typeof reportCompare === "function") + reportCompare(true, true); From 98f303062331295342e308aa4ff956982d1ab0b1 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Mon, 31 Oct 2016 05:33:16 +0900 Subject: [PATCH 38/61] Bug 1185106 - Part 14: Add AsyncFunction.prototype[@@toStringTag]. r=till --- js/src/tests/ecma_6/Symbol/toStringTag.js | 3 +++ js/src/vm/AsyncFunction.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/js/src/tests/ecma_6/Symbol/toStringTag.js b/js/src/tests/ecma_6/Symbol/toStringTag.js index 9ff0d7fefa81..20aac2c42c48 100644 --- a/js/src/tests/ecma_6/Symbol/toStringTag.js +++ b/js/src/tests/ecma_6/Symbol/toStringTag.js @@ -149,4 +149,7 @@ testDefault(function* () {}().__proto__.__proto__, "Generator"); // ES6 25.4.5.4 Promise.prototype [ @@toStringTag ] testDefault(Promise.prototype, "Promise"); +// AsyncFunction.prototype [ @@toStringTag ] +testDefault(async function() {}.constructor.prototype, "AsyncFunction"); + reportCompare(true, true); diff --git a/js/src/vm/AsyncFunction.cpp b/js/src/vm/AsyncFunction.cpp index 496b2750fc21..a0a3cfac0763 100644 --- a/js/src/vm/AsyncFunction.cpp +++ b/js/src/vm/AsyncFunction.cpp @@ -25,6 +25,9 @@ GlobalObject::initAsyncFunction(JSContext* cx, Handle global) if (!asyncFunctionProto) return false; + if (!DefineToStringTag(cx, asyncFunctionProto, cx->names().AsyncFunction)) + return false; + RootedValue function(cx, global->getConstructor(JSProto_Function)); if (!function.toObjectOrNull()) return false; From 6371e88d46f6b5920dffda45c84e15dfc22dc659 Mon Sep 17 00:00:00 2001 From: Felipe Gomes Date: Sun, 30 Oct 2016 22:12:14 -0200 Subject: [PATCH 39/61] Backed out changeset 3b3de5c48e28 (bug 1301131) MozReview-Commit-ID: DCWfU99ki4r --- browser/extensions/e10srollout/bootstrap.js | 93 ------------------- browser/extensions/e10srollout/install.rdf.in | 2 +- .../telemetry/TelemetryEnvironment.jsm | 1 - 3 files changed, 1 insertion(+), 95 deletions(-) diff --git a/browser/extensions/e10srollout/bootstrap.js b/browser/extensions/e10srollout/bootstrap.js index 77756d3f5f05..1366490529fa 100644 --- a/browser/extensions/e10srollout/bootstrap.js +++ b/browser/extensions/e10srollout/bootstrap.js @@ -9,9 +9,6 @@ const {classes: Cc, interfaces: Ci, utils: Cu} = Components; Cu.import("resource://gre/modules/Preferences.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/UpdateUtils.jsm"); -Cu.import("resource://gre/modules/Task.jsm"); -Cu.import("resource://gre/modules/TelemetryArchive.jsm"); -Cu.import("resource://gre/modules/TelemetryController.jsm"); // The amount of people to be part of e10s const TEST_THRESHOLD = { @@ -33,9 +30,6 @@ const PREF_TOGGLE_E10S = "browser.tabs.remote.autostart.2"; const PREF_E10S_ADDON_POLICY = "extensions.e10s.rollout.policy"; const PREF_E10S_ADDON_BLOCKLIST = "extensions.e10s.rollout.blocklist"; const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon"; -const PREF_DISABLED_FOR_SPINNERS = "e10s.rollout.disabledByLongSpinners"; - -const LONG_SPINNER_HISTOGRAM = "FX_TAB_SWITCH_SPINNER_VISIBLE_LONG_MS"; function startup() { // In theory we only need to run this once (on install()), but @@ -47,8 +41,6 @@ function startup() { // to take effect, so we keep the data based on how it was when // the session started. defineCohort(); - - setUpSpinnerCheck(); } function install() { @@ -178,10 +170,6 @@ function optedOut() { * string must be returned. */ function getTemporaryDisqualification() { - if (Preferences.isSet(PREF_DISABLED_FOR_SPINNERS)) { - return "longspinner"; - } - let applicationLanguage = Cc["@mozilla.org/chrome/chrome-registry;1"] .getService(Ci.nsIXULChromeRegistry) @@ -194,84 +182,3 @@ function getTemporaryDisqualification() { return ""; } - -let performLongSpinnerCheck = Task.async(function*() { - if (!Services.appinfo.browserTabsRemoteAutostart) { - return; - } - - const DAYS_OLD = 3; - let thresholdDate = new Date(Date.now() - (1000 * 60 * 60 * 24 * DAYS_OLD)); - - let allPingsInfo = yield TelemetryArchive.promiseArchivedPingList(); - - let recentPingsInfo = allPingsInfo.filter(ping => { - let pingDate = new Date(ping.timestampCreated); - return pingDate > thresholdDate; - }); - - let pingList = []; - - for (let pingInfo of recentPingsInfo) { - pingList.push(yield TelemetryArchive.promiseArchivedPingById(pingInfo.id)); - } - - pingList.push(TelemetryController.getCurrentPingData(/* subsession = */ true)); - - let totalSessionTime = 0; - let totalSpinnerTime = 0; - - for (let ping of pingList) { - try { - if (ping.type != "main") { - continue; - } - - if (!ping.environment.settings.e10sEnabled) { - continue; - } - - totalSessionTime = ping.payload.info.subsessionLength; - - if (!(LONG_SPINNER_HISTOGRAM in ping.payload.histograms)) { - // The Histogram might not be defined in this ping if no data was recorded for it. - // In this case, we still add the session length because that was a valid session - // without a long spinner. - continue; - } - - let histogram = ping.payload.histograms[LONG_SPINNER_HISTOGRAM]; - - for (let spinnerTime of Object.keys(histogram.values)) { - // Only consider spinners that took more than 2 seconds. - // Note: the first bucket size that fits this criteria is - // 2297ms. And the largest bucket is 64000ms, meaning that - // any pause larger than that is only counted as a 64s pause. - // For reference, the bucket sizes are: - // 0, 1000, 2297, 5277, 12124, 27856, 64000 - if (spinnerTime >= 2000) { - totalSpinnerTime += spinnerTime * histogram.values[spinnerTime]; - } - } - } catch (e) { /* just in case there's a malformed ping, ignore it silently */ } - } - - totalSpinnerTime /= 1000; // session time is in seconds, but spinner time in ms - - const ACCEPTABLE_THRESHOLD = 20 / 3600; // 20 seconds per hour, per bug 1301131 - - if ((totalSpinnerTime / totalSessionTime) > ACCEPTABLE_THRESHOLD) { - Preferences.set(PREF_DISABLED_FOR_SPINNERS, true); - } else { - Preferences.reset(PREF_DISABLED_FOR_SPINNERS); - } -}); - -function setUpSpinnerCheck() { - let {setTimeout, setInterval} = Cu.import("resource://gre/modules/Timer.jsm"); - - // Perform an initial check after 5min (which should give good clearance from - // the startup process), and then a subsequent check every hour. - setTimeout(performLongSpinnerCheck, 1000 * 60 * 5); - setInterval(performLongSpinnerCheck, 1000 * 60 * 60); -} diff --git a/browser/extensions/e10srollout/install.rdf.in b/browser/extensions/e10srollout/install.rdf.in index 07b5a65c1ddd..ae4325b8049e 100644 --- a/browser/extensions/e10srollout/install.rdf.in +++ b/browser/extensions/e10srollout/install.rdf.in @@ -10,7 +10,7 @@ e10srollout@mozilla.org - 1.4 + 1.3 2 true true diff --git a/toolkit/components/telemetry/TelemetryEnvironment.jsm b/toolkit/components/telemetry/TelemetryEnvironment.jsm index 52b954731f92..2bce6ec5d381 100644 --- a/toolkit/components/telemetry/TelemetryEnvironment.jsm +++ b/toolkit/components/telemetry/TelemetryEnvironment.jsm @@ -153,7 +153,6 @@ const DEFAULT_ENVIRONMENT_PREFS = new Map([ ["dom.ipc.plugins.enabled", {what: RECORD_PREF_VALUE}], ["dom.ipc.processCount", {what: RECORD_PREF_VALUE, requiresRestart: true}], ["dom.max_script_run_time", {what: RECORD_PREF_VALUE}], - ["e10s.rollout.disabledByLongSpinners", {what: RECORD_PREF_VALUE}], ["experiments.manifest.uri", {what: RECORD_PREF_VALUE}], ["extensions.autoDisableScopes", {what: RECORD_PREF_VALUE}], ["extensions.enabledScopes", {what: RECORD_PREF_VALUE}], From 25230332e916a4bd400896c1a6aa92558e33d29b Mon Sep 17 00:00:00 2001 From: Felipe Gomes Date: Sat, 29 Oct 2016 16:32:14 -0200 Subject: [PATCH 40/61] Bug 1312779 - Enable e10s with all mpc=true addons. r=mconley MozReview-Commit-ID: 4VBIKxUTV2U --- browser/extensions/e10srollout/bootstrap.js | 2 +- browser/extensions/e10srollout/install.rdf.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/extensions/e10srollout/bootstrap.js b/browser/extensions/e10srollout/bootstrap.js index 1366490529fa..a58eefdb369b 100644 --- a/browser/extensions/e10srollout/bootstrap.js +++ b/browser/extensions/e10srollout/bootstrap.js @@ -18,7 +18,7 @@ const TEST_THRESHOLD = { const ADDON_ROLLOUT_POLICY = { "beta" : "50allmpc", // Any WebExtension or addon with mpc = true - "release" : "49a", // 10 tested add-ons + any WebExtension + "release" : "50allmpc", // Any WebExtension or addon with mpc = true }; const PREF_COHORT_SAMPLE = "e10s.rollout.cohortSample"; diff --git a/browser/extensions/e10srollout/install.rdf.in b/browser/extensions/e10srollout/install.rdf.in index ae4325b8049e..31b22bfe6626 100644 --- a/browser/extensions/e10srollout/install.rdf.in +++ b/browser/extensions/e10srollout/install.rdf.in @@ -10,7 +10,7 @@ e10srollout@mozilla.org - 1.3 + 1.5 2 true true From 685d64033889ff14a7f7b373990e6ff9fe6a317c Mon Sep 17 00:00:00 2001 From: Jordan Lund Date: Wed, 5 Oct 2016 14:25:48 -0700 Subject: [PATCH 41/61] Bug 1308010 - add adjust-sdk and adjust-sdk-beta tokens to builds via secret service, r=dustin MozReview-Commit-ID: IKCc2fzQ8Bn --HG-- extra : rebase_source : 484dc41992c1396e04137274107aff70ae942f46 --- .../configs/builds/releng_base_android_64_builds.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/testing/mozharness/configs/builds/releng_base_android_64_builds.py b/testing/mozharness/configs/builds/releng_base_android_64_builds.py index c7e6e794e3ec..0ffd929c3fb0 100644 --- a/testing/mozharness/configs/builds/releng_base_android_64_builds.py +++ b/testing/mozharness/configs/builds/releng_base_android_64_builds.py @@ -42,6 +42,12 @@ config = { {'filename': '/builds/mozilla-fennec-geoloc-api.key', 'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/mozilla-fennec-geoloc-api.key', 'min_scm_level': 2, 'default': 'try-build-has-no-secrets'}, + {'filename': '/builds/adjust-sdk.token', + 'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/adjust-sdk.token', + 'min_scm_level': 2, 'default': 'try-build-has-no-secrets'}, + {'filename': '/builds/adjust-sdk-beta.token', + 'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/adjust-sdk-beta.token', + 'min_scm_level': 2, 'default': 'try-build-has-no-secrets'}, ], 'enable_ccache': True, 'vcs_share_base': '/builds/hg-shared', From b979f289673f7b8a4b41fe804ce8d48018c047cd Mon Sep 17 00:00:00 2001 From: Jarda Snajdr Date: Tue, 18 Oct 2016 15:36:25 +0200 Subject: [PATCH 42/61] Bug 1310573 - Add reactjs/reselect to Devtools shared libraries r=Honza MozReview-Commit-ID: 1XGXxlA8HFp --HG-- extra : rebase_source : 527cb7c0857dcc24dd24791075e6ef512978c23d --- .../client/shared/vendor/RESELECT_LICENSE | 21 +++ .../client/shared/vendor/RESELECT_UPGRADING | 7 + devtools/client/shared/vendor/moz.build | 1 + devtools/client/shared/vendor/reselect.js | 136 ++++++++++++++++++ toolkit/content/license.html | 31 ++++ 5 files changed, 196 insertions(+) create mode 100644 devtools/client/shared/vendor/RESELECT_LICENSE create mode 100644 devtools/client/shared/vendor/RESELECT_UPGRADING create mode 100644 devtools/client/shared/vendor/reselect.js diff --git a/devtools/client/shared/vendor/RESELECT_LICENSE b/devtools/client/shared/vendor/RESELECT_LICENSE new file mode 100644 index 000000000000..1ca1e449f8b2 --- /dev/null +++ b/devtools/client/shared/vendor/RESELECT_LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016 Reselect Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/devtools/client/shared/vendor/RESELECT_UPGRADING b/devtools/client/shared/vendor/RESELECT_UPGRADING new file mode 100644 index 000000000000..b846d05be14d --- /dev/null +++ b/devtools/client/shared/vendor/RESELECT_UPGRADING @@ -0,0 +1,7 @@ +Follow these steps when adding/upgrading the reselect.js module: + +1. git clone https://github.com/reactjs/reselect - clone the repo +2. npm install - compile the sources to a compiled JS module file +3. cp dist/reselect.js $DEST_DIR - copy the compiled file to Firefox source tree + +The package version used it currently 2.5.4 (last update in bug 1310573) diff --git a/devtools/client/shared/vendor/moz.build b/devtools/client/shared/vendor/moz.build index 15990a42a218..491107f3f90c 100644 --- a/devtools/client/shared/vendor/moz.build +++ b/devtools/client/shared/vendor/moz.build @@ -20,6 +20,7 @@ modules += [ 'react-redux.js', 'react.js', 'redux.js', + 'reselect.js', 'seamless-immutable.js', ] diff --git a/devtools/client/shared/vendor/reselect.js b/devtools/client/shared/vendor/reselect.js new file mode 100644 index 000000000000..4d51d342cffc --- /dev/null +++ b/devtools/client/shared/vendor/reselect.js @@ -0,0 +1,136 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define('Reselect', ['exports'], factory); + } else if (typeof exports !== "undefined") { + factory(exports); + } else { + var mod = { + exports: {} + }; + factory(mod.exports); + global.Reselect = mod.exports; + } +})(this, function (exports) { + 'use strict'; + + exports.__esModule = true; + exports.defaultMemoize = defaultMemoize; + exports.createSelectorCreator = createSelectorCreator; + exports.createStructuredSelector = createStructuredSelector; + + function _toConsumableArray(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; + } + + return arr2; + } else { + return Array.from(arr); + } + } + + function defaultEqualityCheck(a, b) { + return a === b; + } + + function defaultMemoize(func) { + var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck; + + var lastArgs = null; + var lastResult = null; + var isEqualToLastArg = function isEqualToLastArg(value, index) { + return equalityCheck(value, lastArgs[index]); + }; + return function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (lastArgs === null || lastArgs.length !== args.length || !args.every(isEqualToLastArg)) { + lastResult = func.apply(undefined, args); + } + lastArgs = args; + return lastResult; + }; + } + + function getDependencies(funcs) { + var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs; + + if (!dependencies.every(function (dep) { + return typeof dep === 'function'; + })) { + var dependencyTypes = dependencies.map(function (dep) { + return typeof dep; + }).join(', '); + throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']')); + } + + return dependencies; + } + + function createSelectorCreator(memoize) { + for (var _len2 = arguments.length, memoizeOptions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + memoizeOptions[_key2 - 1] = arguments[_key2]; + } + + return function () { + for (var _len3 = arguments.length, funcs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + funcs[_key3] = arguments[_key3]; + } + + var recomputations = 0; + var resultFunc = funcs.pop(); + var dependencies = getDependencies(funcs); + + var memoizedResultFunc = memoize.apply(undefined, [function () { + recomputations++; + return resultFunc.apply(undefined, arguments); + }].concat(memoizeOptions)); + + var selector = function selector(state, props) { + for (var _len4 = arguments.length, args = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) { + args[_key4 - 2] = arguments[_key4]; + } + + var params = dependencies.map(function (dependency) { + return dependency.apply(undefined, [state, props].concat(args)); + }); + return memoizedResultFunc.apply(undefined, _toConsumableArray(params)); + }; + + selector.resultFunc = resultFunc; + selector.recomputations = function () { + return recomputations; + }; + selector.resetRecomputations = function () { + return recomputations = 0; + }; + return selector; + }; + } + + var createSelector = exports.createSelector = createSelectorCreator(defaultMemoize); + + function createStructuredSelector(selectors) { + var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector; + + if (typeof selectors !== 'object') { + throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors)); + } + var objectKeys = Object.keys(selectors); + return selectorCreator(objectKeys.map(function (key) { + return selectors[key]; + }), function () { + for (var _len5 = arguments.length, values = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + values[_key5] = arguments[_key5]; + } + + return values.reduce(function (composition, value, index) { + composition[objectKeys[index]] = value; + return composition; + }, {}); + }); + } +}); diff --git a/toolkit/content/license.html b/toolkit/content/license.html index 684bb56a1ead..606dca57c666 100644 --- a/toolkit/content/license.html +++ b/toolkit/content/license.html @@ -137,6 +137,7 @@
  • React-Redux License
  • Red Hat xdg_user_dir_lookup License
  • Redux License
  • +
  • Reselect License
  • Russian Spellchecking Dictionary License
  • SCTP Licenses
  • Skia License
  • @@ -4677,6 +4678,36 @@ furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +
    + +

    Reselect License

    + +

    This license applies to the file +devtools/client/shared/vendor/reselect.js.

    +
    +The MIT License (MIT)
    +
    +Copyright (c) 2015-2016 Reselect Contributors
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all
    +copies or substantial portions of the Software.
    +
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    
    From edd37374491275d2652016324268906a9bf9e9a1 Mon Sep 17 00:00:00 2001
    From: Bryce Van Dyk 
    Date: Mon, 31 Oct 2016 10:55:19 +1300
    Subject: [PATCH 43/61] Bug 1298027 - Relax decoder shutdown and mediakey
     removal on MediaElement suspension. r=cpearce
    
    This changeset relaxes the shutting down of decoders and removal of mediakeys
    when suspending HTMLMediaElements. This should now only happen for adobe
    primetime. This alleviates, for non-primetime CDMs, the issue of videos
    breaking when moving an EME protected video from a tab to a new window.
    
    These conditions can be relaxed as neither clearkey or widevine support
    secure stop. This means we don't need to shutdown their decoders and keys to
    signal a stoppage, as at this stage, doing so doesn't give us secure stop and
    instead means that playback is busted when we try to resume.
    
    MozReview-Commit-ID: 3MGNXGGDVLS
    
    --HG--
    extra : rebase_source : a13fd5fa570a6868af6c3ed7b3dbfab173a9ffef
    ---
     dom/html/HTMLMediaElement.cpp | 19 +++++++++++++------
     1 file changed, 13 insertions(+), 6 deletions(-)
    
    diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
    index f5c703932071..f634e1be0882 100644
    --- a/dom/html/HTMLMediaElement.cpp
    +++ b/dom/html/HTMLMediaElement.cpp
    @@ -12,6 +12,7 @@
     #include "mozilla/MathAlgorithms.h"
     #include "mozilla/AsyncEventDispatcher.h"
     #include "mozilla/dom/MediaEncryptedEvent.h"
    +#include "mozilla/EMEUtils.h"
     
     #include "base/basictypes.h"
     #include "nsIDOMHTMLMediaElement.h"
    @@ -5249,16 +5250,23 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE
           ReportTelemetry();
           ReportEMETelemetry();
     
    -      // For EME content, force destruction of the CDM client (and CDM
    +      // For EME content, we may force destruction of the CDM client (and CDM
           // instance if this is the last client for that CDM instance) and
           // the CDM's decoder. This ensures the CDM gets reliable and prompt
           // shutdown notifications, as it may have book-keeping it needs
           // to do on shutdown.
           if (mMediaKeys) {
    -        mMediaKeys->Shutdown();
    -        mMediaKeys = nullptr;
    -        if (mDecoder) {
    -          ShutdownDecoder();
    +        nsAutoString keySystem;
    +        mMediaKeys->GetKeySystem(keySystem);
    +        // If we're using Primetime we need to shutdown the key system and
    +        // decoder to preserve secure stop like behavior, other CDMs don't
    +        // implement this so we don't need to worry with them.
    +        if (IsPrimetimeKeySystem(keySystem)) {
    +          mMediaKeys->Shutdown();
    +          mMediaKeys = nullptr;
    +          if (mDecoder) {
    +            ShutdownDecoder();
    +          }
             }
           }
           if (mDecoder) {
    @@ -5267,7 +5275,6 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE
           }
           mEventDeliveryPaused = aSuspendEvents;
         } else {
    -      MOZ_ASSERT(!mMediaKeys);
           if (mDecoder) {
             mDecoder->Resume();
             if (!mPaused && !mDecoder->IsEnded()) {
    
    From e18aec90981721ff4f248dc6c7cd6db88e320798 Mon Sep 17 00:00:00 2001
    From: Sebastian Kaspari 
    Date: Fri, 28 Oct 2016 17:18:52 +0200
    Subject: [PATCH 44/61] Bug 1313363 - NotificationClient: Use BigTextStyle
     instead of InboxStyle. r=Grisha
    
    There's no reason to use InboxStyle here. We do not add any items to the list.
    Currently the content text is truncated aggressively showing only one line of
    text. With BigTextStyle we can show a lot more.
    
    MozReview-Commit-ID: 8CQZVHzc7b8
    
    --HG--
    extra : rebase_source : c717e0c532d7ee101fac89e12db7961e44e811f7
    ---
     .../org/mozilla/gecko/notifications/NotificationClient.java | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
    index 3f2cf1ed90ef..c46c0105078e 100644
    --- a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
    +++ b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
    @@ -147,9 +147,9 @@ public final class NotificationClient implements NotificationListener {
                     .setContentIntent(contentIntent)
                     .setDeleteIntent(deleteIntent)
                     .setAutoCancel(true)
    -                .setStyle(new NotificationCompat.InboxStyle()
    -                          .addLine(alertText)
    -                          .setSummaryText(host));
    +                .setStyle(new NotificationCompat.BigTextStyle()
    +                        .bigText(alertText)
    +                        .setSummaryText(host));
     
             // Fetch icon.
             if (!imageUrl.isEmpty()) {
    
    From 3a59c3192368a49893decf7db24056ff52ba147f Mon Sep 17 00:00:00 2001
    From: Kris Maglione 
    Date: Sun, 30 Oct 2016 19:17:13 -0700
    Subject: [PATCH 45/61] Backed out changeset 425c0602ccb4 (bug 1313716) for
     breaking mach mochitest. r=backout
    
    MozReview-Commit-ID: pTW1acQYLV
    ---
     testing/mach_commands.py                       |  2 +-
     testing/mochitest/mach_commands.py             |  6 +++---
     .../manifestparser/manifestparser.py           |  5 +++++
     .../tests/test_convert_directory.py            |  4 ++++
     .../tests/test_default_overrides.py            | 18 ------------------
     .../tests/test_manifestparser.py               |  6 ++++--
     6 files changed, 17 insertions(+), 24 deletions(-)
    
    diff --git a/testing/mach_commands.py b/testing/mach_commands.py
    index c5d53d94f492..0612d111b33b 100644
    --- a/testing/mach_commands.py
    +++ b/testing/mach_commands.py
    @@ -320,7 +320,7 @@ class Test(MachCommandBase):
     
             buckets = {}
             for test in run_tests:
    -            key = (test['flavor'], test.get('subsuite', ''))
    +            key = (test['flavor'], test['subsuite'])
                 buckets.setdefault(key, []).append(test)
     
             for (flavor, subsuite), tests in sorted(buckets.items()):
    diff --git a/testing/mochitest/mach_commands.py b/testing/mochitest/mach_commands.py
    index a19e26348dcf..55557e127922 100644
    --- a/testing/mochitest/mach_commands.py
    +++ b/testing/mochitest/mach_commands.py
    @@ -378,17 +378,17 @@ class MachCommands(MachCommandBase):
                 if test['flavor'] not in ALL_FLAVORS:
                     continue
     
    -            key = (test['flavor'], test.get('subsuite', ''))
    +            key = (test['flavor'], test['subsuite'])
                 if test['flavor'] not in flavors:
                     unsupported.add(key)
                     continue
     
                 if subsuite == 'default':
                     # "--subsuite default" means only run tests that don't have a subsuite
    -                if test.get('subsuite'):
    +                if test['subsuite']:
                         unsupported.add(key)
                         continue
    -            elif subsuite and test.get('subsuite', '') != subsuite:
    +            elif subsuite and test['subsuite'] != subsuite:
                     unsupported.add(key)
                     continue
     
    diff --git a/testing/mozbase/manifestparser/manifestparser/manifestparser.py b/testing/mozbase/manifestparser/manifestparser/manifestparser.py
    index 23f14d3f87f3..54656b292191 100644
    --- a/testing/mozbase/manifestparser/manifestparser/manifestparser.py
    +++ b/testing/mozbase/manifestparser/manifestparser/manifestparser.py
    @@ -152,6 +152,10 @@ class ManifestParser(object):
     
             # get the tests
             for section, data in sections:
    +            subsuite = ''
    +            if 'subsuite' in data:
    +                subsuite = data['subsuite']
    +
                 # In case of defaults only, no other section than parent: has to
                 # be processed.
                 if defaults_only and not section.startswith('parent:'):
    @@ -217,6 +221,7 @@ class ManifestParser(object):
                     else:
                         _relpath = relpath(path, rootdir)
     
    +            test['subsuite'] = subsuite
                 test['path'] = path
                 test['relpath'] = _relpath
     
    diff --git a/testing/mozbase/manifestparser/tests/test_convert_directory.py b/testing/mozbase/manifestparser/tests/test_convert_directory.py
    index 12776e4e4ffe..d3256d5fb268 100755
    --- a/testing/mozbase/manifestparser/tests/test_convert_directory.py
    +++ b/testing/mozbase/manifestparser/tests/test_convert_directory.py
    @@ -60,12 +60,16 @@ class TestDirectoryConversion(unittest.TestCase):
                 # Make a manifest for it
                 manifest = convert([stub])
                 out_tmpl = """[%(stub)s/bar]
    +subsuite = 
     
     [%(stub)s/fleem]
    +subsuite = 
     
     [%(stub)s/foo]
    +subsuite = 
     
     [%(stub)s/subdir/subfile]
    +subsuite = 
     
     """  # noqa
                 self.assertEqual(str(manifest), out_tmpl % dict(stub=stub))
    diff --git a/testing/mozbase/manifestparser/tests/test_default_overrides.py b/testing/mozbase/manifestparser/tests/test_default_overrides.py
    index 3341c4bd82bd..6790ec31acbc 100755
    --- a/testing/mozbase/manifestparser/tests/test_default_overrides.py
    +++ b/testing/mozbase/manifestparser/tests/test_default_overrides.py
    @@ -7,7 +7,6 @@
     import os
     import unittest
     from manifestparser import ManifestParser
    -from manifestparser import combine_fields
     
     here = os.path.dirname(os.path.abspath(__file__))
     
    @@ -94,22 +93,5 @@ class TestOmitDefaults(unittest.TestCase):
                     self.assertIn(key, actual_defaults)
                     self.assertEqual(value, actual_defaults[key])
     
    -
    -class TestSubsuiteDefaults(unittest.TestCase):
    -    """Test that subsuites are handled correctly when managing defaults
    -    outside of the manifest parser."""
    -    def test_subsuite_defaults(self):
    -        manifest = os.path.join(here, 'default-subsuite.ini')
    -        parser = ManifestParser(manifests=(manifest,), handle_defaults=False)
    -        expected_subsuites = {
    -            'test1': 'baz',
    -            'test2': 'foo',
    -        }
    -        defaults = parser.manifest_defaults[manifest]
    -        for test in parser.tests:
    -            value = combine_fields(defaults, test)
    -            self.assertEqual(expected_subsuites[value['name']],
    -                             value['subsuite'])
    -
     if __name__ == '__main__':
         unittest.main()
    diff --git a/testing/mozbase/manifestparser/tests/test_manifestparser.py b/testing/mozbase/manifestparser/tests/test_manifestparser.py
    index ca80911fb9b5..30f6fab24b34 100755
    --- a/testing/mozbase/manifestparser/tests/test_manifestparser.py
    +++ b/testing/mozbase/manifestparser/tests/test_manifestparser.py
    @@ -114,10 +114,12 @@ class TestManifestParser(unittest.TestCase):
     foo = bar
     
     [fleem]
    +subsuite = 
     
     [include/flowers]
     blue = ocean
     red = roses
    +subsuite = 
     yellow = submarine"""  # noqa
     
             self.assertEqual(buffer.getvalue().strip(),
    @@ -155,7 +157,7 @@ yellow = submarine"""  # noqa
             buffer = StringIO()
             parser.write(fp=buffer, global_kwargs={'x': 'level_1'})
             self.assertEqual(buffer.getvalue().strip(),
    -                         '[DEFAULT]\nx = level_1\n\n[test_3]')
    +                         '[DEFAULT]\nx = level_1\n\n[test_3]\nsubsuite =')
     
         def test_parent_defaults(self):
             """
    @@ -180,7 +182,7 @@ yellow = submarine"""  # noqa
             buffer = StringIO()
             parser.write(fp=buffer, global_kwargs={'x': 'level_3'})
             self.assertEqual(buffer.getvalue().strip(),
    -                         '[DEFAULT]\nx = level_3\n\n[test_3]')
    +                         '[DEFAULT]\nx = level_3\n\n[test_3]\nsubsuite =')
     
         def test_parent_defaults_include(self):
             parent_example = os.path.join(here, 'parent', 'include', 'manifest.ini')
    
    From 13f68529dbbbf1cb4b1f2470f4a929d8dc851e51 Mon Sep 17 00:00:00 2001
    From: Sotaro Ikeda 
    Date: Sun, 30 Oct 2016 19:40:35 -0700
    Subject: [PATCH 46/61] Bug 1313518- Handle width alignment of 32 r=nical
    
    ---
     gfx/layers/MacIOSurfaceHelpers.cpp | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gfx/layers/MacIOSurfaceHelpers.cpp b/gfx/layers/MacIOSurfaceHelpers.cpp
    index 8e4554bc22d7..46a5a203b4bb 100644
    --- a/gfx/layers/MacIOSurfaceHelpers.cpp
    +++ b/gfx/layers/MacIOSurfaceHelpers.cpp
    @@ -89,7 +89,7 @@ CreateSourceSurfaceFromLockedMacIOSurface(MacIOSurface* aSurface)
         libyuv::ConvertToARGB((uint8_t*)aSurface->GetBaseAddress(), 0 /* not used */,
                               mappedSurface.mData, mappedSurface.mStride,
                               0, 0,
    -                          size.width, size.height,
    +                          ALIGNED_32(size.width), size.height,
                               size.width, size.height,
                               libyuv::kRotate0, libyuv::FOURCC_UYVY);
       } else {
    
    From c0d229e060d8ae6b7339527a188931376300a99c Mon Sep 17 00:00:00 2001
    From: Bill McCloskey 
    Date: Sun, 16 Oct 2016 18:40:49 -0700
    Subject: [PATCH 47/61] Bug 1310547 - Allow LinkedList to hold RefPtr elements
     (r=froydnj)
    
    ---
     mfbt/LinkedList.h             | 127 ++++++++++++++++++++++++++--------
     mfbt/tests/TestLinkedList.cpp |  62 +++++++++++++++++
     2 files changed, 160 insertions(+), 29 deletions(-)
    
    diff --git a/mfbt/LinkedList.h b/mfbt/LinkedList.h
    index 70641699fb8f..2d450940db59 100644
    --- a/mfbt/LinkedList.h
    +++ b/mfbt/LinkedList.h
    @@ -68,17 +68,65 @@
     #include "mozilla/Attributes.h"
     #include "mozilla/MemoryReporting.h"
     #include "mozilla/Move.h"
    +#include "mozilla/RefPtr.h"
     
     #ifdef __cplusplus
     
     namespace mozilla {
     
    +template
    +class LinkedListElement;
    +
    +namespace detail {
    +
    +/**
    + * LinkedList supports refcounted elements using this adapter class. Clients
    + * using LinkedList> will get a data structure that holds a strong
    + * reference to T as long as T is in the list.
    + */
    +template
    +struct LinkedListElementTraits
    +{
    +  typedef T* RawType;
    +  typedef const T* ConstRawType;
    +  typedef T* ClientType;
    +  typedef const T* ConstClientType;
    +
    +  // These static methods are called when an element is added to or removed from
    +  // a linked list. It can be used to keep track ownership in lists that are
    +  // supposed to own their elements. If elements are transferred from one list
    +  // to another, no enter or exit calls happen since the elements still belong
    +  // to a list.
    +  static void enterList(LinkedListElement* elt) {}
    +  static void exitList(LinkedListElement* elt) {}
    +};
    +
    +template
    +struct LinkedListElementTraits>
    +{
    +  typedef T* RawType;
    +  typedef const T* ConstRawType;
    +  typedef RefPtr ClientType;
    +  typedef RefPtr ConstClientType;
    +
    +  static void enterList(LinkedListElement>* elt) { elt->asT()->AddRef(); }
    +  static void exitList(LinkedListElement>* elt) { elt->asT()->Release(); }
    +};
    +
    +} /* namespace detail */
    +
     template
     class LinkedList;
     
     template
     class LinkedListElement
     {
    +  typedef typename detail::LinkedListElementTraits Traits;
    +  typedef typename Traits::RawType RawType;
    +  typedef typename Traits::ConstRawType ConstRawType;
    +  typedef typename Traits::ClientType ClientType;
    +  typedef typename Traits::ConstClientType ConstClientType;
    +
       /*
        * It's convenient that we return nullptr when getNext() or getPrevious()
        * hits the end of the list, but doing so costs an extra word of storage in
    @@ -155,21 +203,21 @@ public:
        * Get the next element in the list, or nullptr if this is the last element
        * in the list.
        */
    -  T* getNext()             { return mNext->asT(); }
    -  const T* getNext() const { return mNext->asT(); }
    +  RawType getNext()            { return mNext->asT(); }
    +  ConstRawType getNext() const { return mNext->asT(); }
     
       /*
        * Get the previous element in the list, or nullptr if this is the first
        * element in the list.
        */
    -  T* getPrevious()             { return mPrev->asT(); }
    -  const T* getPrevious() const { return mPrev->asT(); }
    +  RawType getPrevious()            { return mPrev->asT(); }
    +  ConstRawType getPrevious() const { return mPrev->asT(); }
     
       /*
        * Insert aElem after this element in the list.  |this| must be part of a
        * linked list when you call setNext(); otherwise, this method will assert.
        */
    -  void setNext(T* aElem)
    +  void setNext(RawType aElem)
       {
         MOZ_ASSERT(isInList());
         setNextUnsafe(aElem);
    @@ -180,7 +228,7 @@ public:
        * linked list when you call setPrevious(); otherwise, this method will
        * assert.
        */
    -  void setPrevious(T* aElem)
    +  void setPrevious(RawType aElem)
       {
         MOZ_ASSERT(isInList());
         setPreviousUnsafe(aElem);
    @@ -198,6 +246,8 @@ public:
         mNext->mPrev = mPrev;
         mNext = this;
         mPrev = this;
    +
    +    Traits::exitList(this);
       }
     
       /*
    @@ -221,6 +271,7 @@ public:
     
     private:
       friend class LinkedList;
    +  friend struct detail::LinkedListElementTraits;
     
       enum class NodeKind {
         Normal,
    @@ -237,20 +288,20 @@ private:
        * Return |this| cast to T* if we're a normal node, or return nullptr if
        * we're a sentinel node.
        */
    -  T* asT()
    +  RawType asT()
       {
    -    return mIsSentinel ? nullptr : static_cast(this);
    +    return mIsSentinel ? nullptr : static_cast(this);
       }
    -  const T* asT() const
    +  ConstRawType asT() const
       {
    -    return mIsSentinel ? nullptr : static_cast(this);
    +    return mIsSentinel ? nullptr : static_cast(this);
       }
     
       /*
        * Insert aElem after this element, but don't check that this element is in
        * the list.  This is called by LinkedList::insertFront().
        */
    -  void setNextUnsafe(T* aElem)
    +  void setNextUnsafe(RawType aElem)
       {
         LinkedListElement *listElem = static_cast(aElem);
         MOZ_ASSERT(!listElem->isInList());
    @@ -259,13 +310,15 @@ private:
         listElem->mPrev = this;
         this->mNext->mPrev = listElem;
         this->mNext = listElem;
    +
    +    Traits::enterList(aElem);
       }
     
       /*
        * Insert aElem before this element, but don't check that this element is in
        * the list.  This is called by LinkedList::insertBack().
        */
    -  void setPreviousUnsafe(T* aElem)
    +  void setPreviousUnsafe(RawType aElem)
       {
         LinkedListElement* listElem = static_cast*>(aElem);
         MOZ_ASSERT(!listElem->isInList());
    @@ -274,6 +327,8 @@ private:
         listElem->mPrev = this->mPrev;
         this->mPrev->mNext = listElem;
         this->mPrev = listElem;
    +
    +    Traits::enterList(aElem);
       }
     
       /*
    @@ -288,6 +343,10 @@ private:
           return;
         }
     
    +    if (!mIsSentinel) {
    +      Traits::enterList(this);
    +    }
    +
         MOZ_ASSERT(aOther.mNext->mPrev == &aOther);
         MOZ_ASSERT(aOther.mPrev->mNext == &aOther);
     
    @@ -307,6 +366,10 @@ private:
          */
         aOther.mNext = &aOther;
         aOther.mPrev = &aOther;
    +
    +    if (!mIsSentinel) {
    +      Traits::exitList(&aOther);
    +    }
       }
     
       LinkedListElement& operator=(const LinkedListElement& aOther) = delete;
    @@ -317,16 +380,22 @@ template
     class LinkedList
     {
     private:
    +  typedef typename detail::LinkedListElementTraits Traits;
    +  typedef typename Traits::RawType RawType;
    +  typedef typename Traits::ConstRawType ConstRawType;
    +  typedef typename Traits::ClientType ClientType;
    +  typedef typename Traits::ConstClientType ConstClientType;
    +
       LinkedListElement sentinel;
     
     public:
       class Iterator {
    -    T* mCurrent;
    +    RawType mCurrent;
     
       public:
    -    explicit Iterator(T* aCurrent) : mCurrent(aCurrent) {}
    +    explicit Iterator(RawType aCurrent) : mCurrent(aCurrent) {}
     
    -    T* operator *() const {
    +    RawType operator *() const {
           return mCurrent;
         }
     
    @@ -363,7 +432,7 @@ public:
       /*
        * Add aElem to the front of the list.
        */
    -  void insertFront(T* aElem)
    +  void insertFront(RawType aElem)
       {
         /* Bypass setNext()'s this->isInList() assertion. */
         sentinel.setNextUnsafe(aElem);
    @@ -372,7 +441,7 @@ public:
       /*
        * Add aElem to the back of the list.
        */
    -  void insertBack(T* aElem)
    +  void insertBack(RawType aElem)
       {
         sentinel.setPreviousUnsafe(aElem);
       }
    @@ -380,24 +449,24 @@ public:
       /*
        * Get the first element of the list, or nullptr if the list is empty.
        */
    -  T* getFirst()             { return sentinel.getNext(); }
    -  const T* getFirst() const { return sentinel.getNext(); }
    +  RawType getFirst()            { return sentinel.getNext(); }
    +  ConstRawType getFirst() const { return sentinel.getNext(); }
     
       /*
        * Get the last element of the list, or nullptr if the list is empty.
        */
    -  T* getLast()             { return sentinel.getPrevious(); }
    -  const T* getLast() const { return sentinel.getPrevious(); }
    +  RawType getLast()            { return sentinel.getPrevious(); }
    +  ConstRawType getLast() const { return sentinel.getPrevious(); }
     
       /*
        * Get and remove the first element of the list.  If the list is empty,
        * return nullptr.
        */
    -  T* popFirst()
    +  ClientType popFirst()
       {
    -    T* ret = sentinel.getNext();
    +    ClientType ret = sentinel.getNext();
         if (ret) {
    -      static_cast*>(ret)->remove();
    +      static_cast*>(RawType(ret))->remove();
         }
         return ret;
       }
    @@ -406,11 +475,11 @@ public:
        * Get and remove the last element of the list.  If the list is empty,
        * return nullptr.
        */
    -  T* popLast()
    +  ClientType popLast()
       {
    -    T* ret = sentinel.getPrevious();
    +    ClientType ret = sentinel.getPrevious();
         if (ret) {
    -      static_cast*>(ret)->remove();
    +      static_cast*>(RawType(ret))->remove();
         }
         return ret;
       }
    @@ -531,10 +600,10 @@ public:
     private:
       friend class LinkedListElement;
     
    -  void assertContains(const T* aValue) const
    +  void assertContains(const RawType aValue) const
       {
     #ifdef DEBUG
    -    for (const T* elem = getFirst(); elem; elem = elem->getNext()) {
    +    for (ConstRawType elem = getFirst(); elem; elem = elem->getNext()) {
           if (elem == aValue) {
             return;
           }
    diff --git a/mfbt/tests/TestLinkedList.cpp b/mfbt/tests/TestLinkedList.cpp
    index 519b34c56636..aa373ed2f371 100644
    --- a/mfbt/tests/TestLinkedList.cpp
    +++ b/mfbt/tests/TestLinkedList.cpp
    @@ -177,11 +177,73 @@ TestPrivate()
       MOZ_RELEASE_ASSERT(count == 2);
     }
     
    +struct CountedClass : public LinkedListElement>
    +{
    +  int mCount;
    +  void AddRef() { mCount++; }
    +  void Release() { mCount--; }
    +
    +  CountedClass() : mCount(0) {}
    +  ~CountedClass() { MOZ_RELEASE_ASSERT(mCount == 0); }
    +};
    +
    +static void
    +TestRefPtrList()
    +{
    +  LinkedList> list;
    +  CountedClass* elt1 = new CountedClass;
    +  CountedClass* elt2 = new CountedClass;
    +
    +  list.insertBack(elt1);
    +  list.insertBack(elt2);
    +
    +  MOZ_RELEASE_ASSERT(elt1->mCount == 1);
    +  MOZ_RELEASE_ASSERT(elt2->mCount == 1);
    +
    +  for (RefPtr p : list) {
    +    MOZ_RELEASE_ASSERT(p->mCount == 2);
    +  }
    +
    +  RefPtr ptr = list.getFirst();
    +  while (ptr) {
    +    MOZ_RELEASE_ASSERT(ptr->mCount == 2);
    +    RefPtr next = ptr->getNext();
    +    ptr->remove();
    +    ptr = Move(next);
    +  }
    +  ptr = nullptr;
    +
    +  MOZ_RELEASE_ASSERT(elt1->mCount == 0);
    +  MOZ_RELEASE_ASSERT(elt2->mCount == 0);
    +
    +  list.insertBack(elt1);
    +  elt1->setNext(elt2);
    +
    +  MOZ_RELEASE_ASSERT(elt1->mCount == 1);
    +  MOZ_RELEASE_ASSERT(elt2->mCount == 1);
    +
    +  RefPtr first = list.popFirst();
    +
    +  MOZ_RELEASE_ASSERT(elt1->mCount == 1);
    +  MOZ_RELEASE_ASSERT(elt2->mCount == 1);
    +
    +  RefPtr second = list.popFirst();
    +
    +  MOZ_RELEASE_ASSERT(elt1->mCount == 1);
    +  MOZ_RELEASE_ASSERT(elt2->mCount == 1);
    +
    +  first = second = nullptr;
    +
    +  delete elt1;
    +  delete elt2;
    +}
    +
     int
     main()
     {
       TestList();
       TestPrivate();
       TestMove();
    +  TestRefPtrList();
       return 0;
     }
    
    From 4c8471eb1535f8fca32270d82eec1ff9f0efa14f Mon Sep 17 00:00:00 2001
    From: Bill McCloskey 
    Date: Mon, 24 Oct 2016 12:49:21 -0700
    Subject: [PATCH 48/61] Bug 1310547 - Add removeAndGetNext/Previous methods to
     LinkedList (r=froydnj)
    
    ---
     mfbt/LinkedList.h             | 24 ++++++++++++++++++++++++
     mfbt/tests/TestLinkedList.cpp | 19 +++++++++++++++++++
     2 files changed, 43 insertions(+)
    
    diff --git a/mfbt/LinkedList.h b/mfbt/LinkedList.h
    index 2d450940db59..6e14aa162962 100644
    --- a/mfbt/LinkedList.h
    +++ b/mfbt/LinkedList.h
    @@ -250,6 +250,30 @@ public:
         Traits::exitList(this);
       }
     
    +  /*
    +   * Remove this element from the list containing it.  Returns a pointer to the
    +   * element that follows this element (before it was removed).  This method
    +   * asserts if the element does not belong to a list.
    +   */
    +  ClientType removeAndGetNext()
    +  {
    +    ClientType r = getNext();
    +    remove();
    +    return r;
    +  }
    +
    +  /*
    +   * Remove this element from the list containing it.  Returns a pointer to the
    +   * previous element in the containing list (before the removal).  This method
    +   * asserts if the element does not belong to a list.
    +   */
    +  ClientType removeAndGetPrevious()
    +  {
    +    ClientType r = getPrevious();
    +    remove();
    +    return r;
    +  }
    +
       /*
        * Identical to remove(), but also asserts in debug builds that this element
        * is in aList.
    diff --git a/mfbt/tests/TestLinkedList.cpp b/mfbt/tests/TestLinkedList.cpp
    index aa373ed2f371..0421668b97c5 100644
    --- a/mfbt/tests/TestLinkedList.cpp
    +++ b/mfbt/tests/TestLinkedList.cpp
    @@ -156,6 +156,24 @@ TestMove()
       list3.clear();
     }
     
    +static void
    +TestRemoveAndGet()
    +{
    +  LinkedList list;
    +
    +  SomeClass one(1), two(2), three(3);
    +  list.insertBack(&one);
    +  list.insertBack(&two);
    +  list.insertBack(&three);
    +  { unsigned int check[] { 1, 2, 3 }; CheckListValues(list, check); }
    +
    +  MOZ_RELEASE_ASSERT(two.removeAndGetNext() == &three);
    +  { unsigned int check[] { 1, 3 }; CheckListValues(list, check); }
    +
    +  MOZ_RELEASE_ASSERT(three.removeAndGetPrevious() == &one);
    +  { unsigned int check[] { 1 }; CheckListValues(list, check); }
    +}
    +
     struct PrivateClass : private LinkedListElement {
       friend class mozilla::LinkedList;
       friend class mozilla::LinkedListElement;
    @@ -244,6 +262,7 @@ main()
       TestList();
       TestPrivate();
       TestMove();
    +  TestRemoveAndGet();
       TestRefPtrList();
       return 0;
     }
    
    From 9244a5787d1a38429f9bdf1c434ec60c8b51dbb3 Mon Sep 17 00:00:00 2001
    From: Bill McCloskey 
    Date: Sat, 15 Oct 2016 11:54:56 -0700
    Subject: [PATCH 49/61] Bug 1312960 - Use CancelableRunnable for
     mOnChannelConnectedTask (r=dvander)
    
    ---
     ipc/glue/MessageChannel.cpp | 6 +++---
     ipc/glue/MessageChannel.h   | 2 +-
     2 files changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/ipc/glue/MessageChannel.cpp b/ipc/glue/MessageChannel.cpp
    index 90fc4383d8cc..117022d4e174 100644
    --- a/ipc/glue/MessageChannel.cpp
    +++ b/ipc/glue/MessageChannel.cpp
    @@ -512,8 +512,8 @@ MessageChannel::MessageChannel(MessageListener *aListener)
             NewNonOwningCancelableRunnableMethod(this, &MessageChannel::OnMaybeDequeueOne);
         mDequeueOneTask = new RefCountedTask(runnable.forget());
     
    -    runnable = NewNonOwningCancelableRunnableMethod(this, &MessageChannel::DispatchOnChannelConnected);
    -    mOnChannelConnectedTask = new RefCountedTask(runnable.forget());
    +    mOnChannelConnectedTask =
    +        NewNonOwningCancelableRunnableMethod(this, &MessageChannel::DispatchOnChannelConnected);
     
     #ifdef OS_WIN
         mEvent = CreateEventW(nullptr, TRUE, FALSE, nullptr);
    @@ -1943,7 +1943,7 @@ MessageChannel::OnChannelConnected(int32_t peer_id)
         MOZ_RELEASE_ASSERT(!mPeerPidSet);
         mPeerPidSet = true;
         mPeerPid = peer_id;
    -    RefPtr task = new DequeueTask(mOnChannelConnectedTask);
    +    RefPtr task = mOnChannelConnectedTask;
         mWorkerLoop->PostTask(task.forget());
     }
     
    diff --git a/ipc/glue/MessageChannel.h b/ipc/glue/MessageChannel.h
    index 81e18500c145..6a4f6e20a683 100644
    --- a/ipc/glue/MessageChannel.h
    +++ b/ipc/glue/MessageChannel.h
    @@ -788,7 +788,7 @@ class MessageChannel : HasResultCodes
         // Task and state used to asynchronously notify channel has been connected
         // safely.  This is necessary to be able to cancel notification if we are
         // closed at the same time.
    -    RefPtr mOnChannelConnectedTask;
    +    RefPtr mOnChannelConnectedTask;
         bool mPeerPidSet;
         int32_t mPeerPid;
     };
    
    From a054d4a461697de8fa903b52e1eaa1e82be32b44 Mon Sep 17 00:00:00 2001
    From: Bill McCloskey 
    Date: Sun, 16 Oct 2016 21:35:45 -0700
    Subject: [PATCH 50/61] Bug 1312960 - Remove FlushPendingInterruptQueue
     (r=dvander)
    
    ---
     ipc/glue/BackgroundImpl.cpp |  4 ----
     ipc/glue/MessageChannel.cpp | 22 ----------------------
     ipc/glue/MessageChannel.h   |  2 --
     ipc/ipdl/ipdl/lower.py      |  7 +------
     4 files changed, 1 insertion(+), 34 deletions(-)
    
    diff --git a/ipc/glue/BackgroundImpl.cpp b/ipc/glue/BackgroundImpl.cpp
    index da2e047ecb00..2f8e073f8397 100644
    --- a/ipc/glue/BackgroundImpl.cpp
    +++ b/ipc/glue/BackgroundImpl.cpp
    @@ -1737,10 +1737,6 @@ ChildImpl::CloseForCurrentThread()
       threadLocalInfo->mClosed = true;
     #endif
     
    -  if (threadLocalInfo->mActor) {
    -    threadLocalInfo->mActor->FlushPendingInterruptQueue();
    -  }
    -
       // Clearing the thread local will synchronously close the actor.
       DebugOnly status = PR_SetThreadPrivate(sThreadLocalIndex, nullptr);
       MOZ_ASSERT(status == PR_SUCCESS);
    diff --git a/ipc/glue/MessageChannel.cpp b/ipc/glue/MessageChannel.cpp
    index 117022d4e174..4b37687adf5d 100644
    --- a/ipc/glue/MessageChannel.cpp
    +++ b/ipc/glue/MessageChannel.cpp
    @@ -1783,28 +1783,6 @@ MessageChannel::MaybeUndeferIncall()
         mPending.push_back(Move(call));
     }
     
    -void
    -MessageChannel::FlushPendingInterruptQueue()
    -{
    -    AssertWorkerThread();
    -    mMonitor->AssertNotCurrentThreadOwns();
    -
    -    {
    -        MonitorAutoLock lock(*mMonitor);
    -
    -        if (mDeferred.empty()) {
    -            if (mPending.empty())
    -                return;
    -
    -            const Message& last = mPending.back();
    -            if (!last.is_interrupt() || last.is_reply())
    -                return;
    -        }
    -    }
    -
    -    while (OnMaybeDequeueOne());
    -}
    -
     void
     MessageChannel::ExitedCxxStack()
     {
    diff --git a/ipc/glue/MessageChannel.h b/ipc/glue/MessageChannel.h
    index 6a4f6e20a683..e770a18547d2 100644
    --- a/ipc/glue/MessageChannel.h
    +++ b/ipc/glue/MessageChannel.h
    @@ -183,8 +183,6 @@ class MessageChannel : HasResultCodes
          */
         int32_t GetTopmostMessageRoutingId() const;
     
    -    void FlushPendingInterruptQueue();
    -
         // Unsound_IsClosed and Unsound_NumQueuedMessages are safe to call from any
         // thread, but they make no guarantees about whether you'll get an
         // up-to-date value; the values are written on one thread and read without
    diff --git a/ipc/ipdl/ipdl/lower.py b/ipc/ipdl/ipdl/lower.py
    index 4d8b873c7636..0bab0412c334 100644
    --- a/ipc/ipdl/ipdl/lower.py
    +++ b/ipc/ipdl/ipdl/lower.py
    @@ -3334,14 +3334,9 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
                 onstack.addstmt(StmtReturn(ExprCall(
                     ExprSelect(p.channelVar(), '.', p.onCxxStackVar().name))))
     
    -            # void ProcessIncomingRacingInterruptCall
    -            processincoming = MethodDefn(
    -                MethodDecl('FlushPendingInterruptQueue', ret=Type.VOID))
    -            processincoming.addstmt(StmtExpr(ExprCall(ExprSelect(_actorChannel(ExprVar.THIS), '.', 'FlushPendingInterruptQueue'))))
    -
                 self.cls.addstmts([ onentered, onexited,
                                     onenteredcall, onexitedcall,
    -                                onstack, processincoming, Whitespace.NL ])
    +                                onstack, Whitespace.NL ])
     
             # OnChannelClose()
             onclose = MethodDefn(MethodDecl('OnChannelClose'))
    
    From 50e4d05346b149941fde0250da22e2539cb6ab52 Mon Sep 17 00:00:00 2001
    From: Bill McCloskey 
    Date: Sat, 15 Oct 2016 11:47:14 -0700
    Subject: [PATCH 51/61] Bug 1312960 - Associate each message in IPC queue with
     the runnable that will run it (r=dvander)
    
    ---
     ipc/glue/MessageChannel.cpp | 370 +++++++++++++++++++++---------------
     ipc/glue/MessageChannel.h   | 151 ++++-----------
     2 files changed, 253 insertions(+), 268 deletions(-)
    
    diff --git a/ipc/glue/MessageChannel.cpp b/ipc/glue/MessageChannel.cpp
    index 4b37687adf5d..cc2897a6cc34 100644
    --- a/ipc/glue/MessageChannel.cpp
    +++ b/ipc/glue/MessageChannel.cpp
    @@ -489,10 +489,7 @@ MessageChannel::MessageChannel(MessageListener *aListener)
         mTransactionStack(nullptr),
         mTimedOutMessageSeqno(0),
         mTimedOutMessageNestedLevel(0),
    -#if defined(MOZ_CRASHREPORTER) && defined(OS_WIN)
    -    mPending(AnnotateAllocator(*this)),
    -#endif
    -    mRemoteStackDepthGuess(false),
    +    mRemoteStackDepthGuess(0),
         mSawInterruptOutMsg(false),
         mIsWaitingForIncoming(false),
         mAbortOnError(false),
    @@ -508,10 +505,6 @@ MessageChannel::MessageChannel(MessageListener *aListener)
         mIsSyncWaitingOnNonMainThread = false;
     #endif
     
    -    RefPtr runnable =
    -        NewNonOwningCancelableRunnableMethod(this, &MessageChannel::OnMaybeDequeueOne);
    -    mDequeueOneTask = new RefCountedTask(runnable.forget());
    -
         mOnChannelConnectedTask =
             NewNonOwningCancelableRunnableMethod(this, &MessageChannel::DispatchOnChannelConnected);
     
    @@ -635,8 +628,6 @@ MessageChannel::Clear()
             gParentProcessBlocker = nullptr;
         }
     
    -    mDequeueOneTask->Cancel();
    -
         mWorkerLoop = nullptr;
         delete mLink;
         mLink = nullptr;
    @@ -649,7 +640,11 @@ MessageChannel::Clear()
         }
     
         // Free up any memory used by pending messages.
    +    for (RefPtr task : mPending) {
    +        task->Clear();
    +    }
         mPending.clear();
    +
         mOutOfTurnReplies.clear();
         while (!mDeferred.empty()) {
             mDeferred.pop();
    @@ -879,19 +874,6 @@ MessageChannel::ShouldDeferMessage(const Message& aMsg)
         return mSide == ParentSide && aMsg.transaction_id() != CurrentNestedInsideSyncTransaction();
     }
     
    -// Predicate that is true for messages that should be consolidated if 'compress' is set.
    -class MatchingKinds {
    -    typedef IPC::Message Message;
    -    Message::msgid_t mType;
    -    int32_t mRoutingId;
    -public:
    -    MatchingKinds(Message::msgid_t aType, int32_t aRoutingId) :
    -        mType(aType), mRoutingId(aRoutingId) {}
    -    bool operator()(const Message &msg) {
    -        return msg.type() == mType && msg.routing_id() == mRoutingId;
    -    }
    -};
    -
     void
     MessageChannel::OnMessageReceivedFromLink(Message&& aMsg)
     {
    @@ -925,31 +907,34 @@ MessageChannel::OnMessageReceivedFromLink(Message&& aMsg)
         MOZ_RELEASE_ASSERT(aMsg.compress_type() == IPC::Message::COMPRESSION_NONE ||
                            aMsg.nested_level() == IPC::Message::NOT_NESTED);
     
    -    bool compress = false;
    +    bool reuseTask = false;
         if (aMsg.compress_type() == IPC::Message::COMPRESSION_ENABLED) {
    -        compress = (!mPending.empty() &&
    -                    mPending.back().type() == aMsg.type() &&
    -                    mPending.back().routing_id() == aMsg.routing_id());
    +        bool compress = (!mPending.isEmpty() &&
    +                         mPending.getLast()->Msg().type() == aMsg.type() &&
    +                         mPending.getLast()->Msg().routing_id() == aMsg.routing_id());
             if (compress) {
                 // This message type has compression enabled, and the back of the
                 // queue was the same message type and routed to the same destination.
                 // Replace it with the newer message.
    -            MOZ_RELEASE_ASSERT(mPending.back().compress_type() ==
    -                                  IPC::Message::COMPRESSION_ENABLED);
    -            mPending.pop_back();
    +            MOZ_RELEASE_ASSERT(mPending.getLast()->Msg().compress_type() ==
    +                               IPC::Message::COMPRESSION_ENABLED);
    +            mPending.getLast()->Msg() = Move(aMsg);
    +
    +            reuseTask = true;
             }
    -    } else if (aMsg.compress_type() == IPC::Message::COMPRESSION_ALL) {
    -        // Check the message queue for another message with this type/destination.
    -        auto it = std::find_if(mPending.rbegin(), mPending.rend(),
    -                               MatchingKinds(aMsg.type(), aMsg.routing_id()));
    -        if (it != mPending.rend()) {
    -            // This message type has compression enabled, and the queue holds
    -            // a message with the same message type and routed to the same destination.
    -            // Erase it.  Note that, since we always compress these redundancies, There Can
    -            // Be Only One.
    -            compress = true;
    -            MOZ_RELEASE_ASSERT((*it).compress_type() == IPC::Message::COMPRESSION_ALL);
    -            mPending.erase((++it).base());
    +    } else if (aMsg.compress_type() == IPC::Message::COMPRESSION_ALL && !mPending.isEmpty()) {
    +        for (RefPtr p = mPending.getLast(); p; p = p->getPrevious()) {
    +            if (p->Msg().type() == aMsg.type() &&
    +                p->Msg().routing_id() == aMsg.routing_id())
    +            {
    +                // This message type has compression enabled, and the queue
    +                // holds a message with the same message type and routed to the
    +                // same destination. Erase it. Note that, since we always
    +                // compress these redundancies, There Can Be Only One.
    +                MOZ_RELEASE_ASSERT(p->Msg().compress_type() == IPC::Message::COMPRESSION_ALL);
    +                p->remove();
    +                break;
    +            }
             }
         }
     
    @@ -959,7 +944,7 @@ MessageChannel::OnMessageReceivedFromLink(Message&& aMsg)
                             wakeUpSyncSend ||
                             AwaitingIncomingMessage();
     
    -    // Although we usually don't need to post an OnMaybeDequeueOne task if
    +    // Although we usually don't need to post a message task if
         // shouldWakeUp is true, it's easier to post anyway than to have to
         // guarantee that every Send call processes everything it's supposed to
         // before returning.
    @@ -968,6 +953,10 @@ MessageChannel::OnMessageReceivedFromLink(Message&& aMsg)
         IPC_LOG("Receive on link thread; seqno=%d, xid=%d, shouldWakeUp=%d",
                 aMsg.seqno(), aMsg.transaction_id(), shouldWakeUp);
     
    +    if (reuseTask) {
    +        return;
    +    }
    +
         // There are three cases we're concerned about, relating to the state of the
         // main thread:
         //
    @@ -990,29 +979,26 @@ MessageChannel::OnMessageReceivedFromLink(Message&& aMsg)
         // blocked. This is okay, since we always check for pending events before
         // blocking again.
     
    -    mPending.push_back(Move(aMsg));
    +    RefPtr task = new MessageTask(this, Move(aMsg));
    +    mPending.insertBack(task);
     
         if (shouldWakeUp) {
             NotifyWorkerThread();
         }
     
         if (shouldPostTask) {
    -        if (!compress) {
    -            // If we compressed away the previous message, we'll re-use
    -            // its pending task.
    -            RefPtr task = new DequeueTask(mDequeueOneTask);
    -            mWorkerLoop->PostTask(task.forget());
    -        }
    +        task->Post();
         }
     }
     
     void
     MessageChannel::PeekMessages(mozilla::function aInvoke)
     {
    +    // FIXME: We shouldn't be holding the lock for aInvoke!
         MonitorAutoLock lock(*mMonitor);
     
    -    for (MessageQueue::iterator it = mPending.begin(); it != mPending.end(); it++) {
    -        Message &msg = *it;
    +    for (RefPtr it : mPending) {
    +        const Message &msg = it->Msg();
             if (!aInvoke(msg)) {
                 break;
             }
    @@ -1022,6 +1008,8 @@ MessageChannel::PeekMessages(mozilla::function aInvok
     void
     MessageChannel::ProcessPendingRequests(AutoEnterTransaction& aTransaction)
     {
    +    mMonitor->AssertCurrentThreadOwns();
    +
         IPC_LOG("ProcessPendingRequests for seqno=%d, xid=%d",
                 aTransaction.SequenceNumber(), aTransaction.TransactionID());
     
    @@ -1038,8 +1026,8 @@ MessageChannel::ProcessPendingRequests(AutoEnterTransaction& aTransaction)
     
             mozilla::Vector toProcess;
     
    -        for (MessageQueue::iterator it = mPending.begin(); it != mPending.end(); ) {
    -            Message &msg = *it;
    +        for (RefPtr p = mPending.getFirst(); p; ) {
    +            Message &msg = p->Msg();
     
                 MOZ_RELEASE_ASSERT(!aTransaction.IsCanceled(),
                                    "Calling ShouldDeferMessage when cancelled");
    @@ -1053,10 +1041,11 @@ MessageChannel::ProcessPendingRequests(AutoEnterTransaction& aTransaction)
                 if (!defer) {
                     if (!toProcess.append(Move(msg)))
                         MOZ_CRASH();
    -                it = mPending.erase(it);
    +
    +                p = p->removeAndGetNext();
                     continue;
                 }
    -            it++;
    +            p = p->getNext();
             }
     
             if (toProcess.empty()) {
    @@ -1358,9 +1347,9 @@ MessageChannel::Call(Message* aMsg, Message* aReply)
             {
                 recvd = Move(it->second);
                 mOutOfTurnReplies.erase(it);
    -        } else if (!mPending.empty()) {
    -            recvd = Move(mPending.front());
    -            mPending.pop_front();
    +        } else if (!mPending.isEmpty()) {
    +            RefPtr task = mPending.popFirst();
    +            recvd = Move(task->Msg());
             } else {
                 // because of subtleties with nested event loops, it's possible
                 // that we got here and nothing happened.  or, we might have a
    @@ -1449,18 +1438,19 @@ MessageChannel::WaitForIncomingMessage()
         NeuteredWindowRegion neuteredRgn(mFlags & REQUIRE_DEFERRED_MESSAGE_PROTECTION);
     #endif
     
    -    { // Scope for lock
    -        MonitorAutoLock lock(*mMonitor);
    -        AutoEnterWaitForIncoming waitingForIncoming(*this);
    -        if (mChannelState != ChannelConnected) {
    -            return false;
    -        }
    -        if (!HasPendingEvents()) {
    -            return WaitForInterruptNotify();
    -        }
    +    MonitorAutoLock lock(*mMonitor);
    +    AutoEnterWaitForIncoming waitingForIncoming(*this);
    +    if (mChannelState != ChannelConnected) {
    +        return false;
    +    }
    +    if (!HasPendingEvents()) {
    +        return WaitForInterruptNotify();
         }
     
    -    return OnMaybeDequeueOne();
    +    MOZ_RELEASE_ASSERT(!mPending.isEmpty());
    +    RefPtr task = mPending.getFirst();
    +    RunMessage(*task);
    +    return true;
     }
     
     bool
    @@ -1468,7 +1458,7 @@ MessageChannel::HasPendingEvents()
     {
         AssertWorkerThread();
         mMonitor->AssertCurrentThreadOwns();
    -    return Connected() && !mPending.empty();
    +    return Connected() && !mPending.isEmpty();
     }
     
     bool
    @@ -1479,7 +1469,7 @@ MessageChannel::InterruptEventOccurred()
         IPC_ASSERT(InterruptStackDepth() > 0, "not in wait loop");
     
         return (!Connected() ||
    -            !mPending.empty() ||
    +            !mPending.isEmpty() ||
                 (!mOutOfTurnReplies.empty() &&
                  mOutOfTurnReplies.find(mInterruptStack.top().seqno()) !=
                  mOutOfTurnReplies.end()));
    @@ -1503,19 +1493,12 @@ MessageChannel::ProcessPendingRequest(Message &&aUrgent)
     }
     
     bool
    -MessageChannel::DequeueOne(Message *recvd)
    +MessageChannel::ShouldRunMessage(const Message& aMsg)
     {
    -    AssertWorkerThread();
    -    mMonitor->AssertCurrentThreadOwns();
    -
    -    if (!Connected()) {
    -        ReportConnectionError("OnMaybeDequeueOne");
    -        return false;
    +    if (!mTimedOutMessageSeqno) {
    +        return true;
         }
     
    -    if (!mDeferred.empty())
    -        MaybeUndeferIncall();
    -
         // If we've timed out a message and we're awaiting the reply to the timed
         // out message, we have to be careful what messages we process. Here's what
         // can go wrong:
    @@ -1532,56 +1515,131 @@ MessageChannel::DequeueOne(Message *recvd)
         // message unless the child would need the response to that message in order
         // to process M. Those messages are the ones that have a higher nested level
         // than M or that are part of the same transaction as M.
    -    if (mTimedOutMessageSeqno) {
    -        for (MessageQueue::iterator it = mPending.begin(); it != mPending.end(); it++) {
    -            Message &msg = *it;
    -            if (msg.nested_level() > mTimedOutMessageNestedLevel ||
    -                (msg.nested_level() == mTimedOutMessageNestedLevel
    -                 && msg.transaction_id() == mTimedOutMessageSeqno))
    -            {
    -                *recvd = Move(msg);
    -                mPending.erase(it);
    -                return true;
    -            }
    -        }
    +    if (aMsg.nested_level() < mTimedOutMessageNestedLevel ||
    +        (aMsg.nested_level() == mTimedOutMessageNestedLevel
    +         && aMsg.transaction_id() != mTimedOutMessageSeqno))
    +    {
             return false;
         }
     
    -    if (mPending.empty())
    -        return false;
    -
    -    *recvd = Move(mPending.front());
    -    mPending.pop_front();
    -    return true;
    -}
    -
    -bool
    -MessageChannel::OnMaybeDequeueOne()
    -{
    -    AssertWorkerThread();
    -    mMonitor->AssertNotCurrentThreadOwns();
    -
    -    Message recvd;
    -
    -    MonitorAutoLock lock(*mMonitor);
    -    if (!DequeueOne(&recvd))
    -        return false;
    -
    -    if (IsOnCxxStack() && recvd.is_interrupt() && recvd.is_reply()) {
    -        // We probably just received a reply in a nested loop for an
    -        // Interrupt call sent before entering that loop.
    -        mOutOfTurnReplies[recvd.seqno()] = Move(recvd);
    -        return false;
    -    }
    -
    -    DispatchMessage(Move(recvd));
    -
         return true;
     }
     
    +void
    +MessageChannel::RunMessage(MessageTask& aTask)
    +{
    +    AssertWorkerThread();
    +    mMonitor->AssertCurrentThreadOwns();
    +
    +    Message& msg = aTask.Msg();
    +
    +    if (!Connected()) {
    +        ReportConnectionError("RunMessage");
    +        return;
    +    }
    +
    +    // Check that we're going to run the first message that's valid to run.
    +#ifdef DEBUG
    +    for (RefPtr task : mPending) {
    +        if (task == &aTask) {
    +            break;
    +        }
    +        MOZ_ASSERT(!ShouldRunMessage(task->Msg()));
    +    }
    +#endif
    +
    +    if (!mDeferred.empty()) {
    +        MaybeUndeferIncall();
    +    }
    +
    +    if (!ShouldRunMessage(msg)) {
    +        return;
    +    }
    +
    +    MOZ_RELEASE_ASSERT(aTask.isInList());
    +    aTask.remove();
    +
    +    if (IsOnCxxStack() && msg.is_interrupt() && msg.is_reply()) {
    +        // We probably just received a reply in a nested loop for an
    +        // Interrupt call sent before entering that loop.
    +        mOutOfTurnReplies[msg.seqno()] = Move(msg);
    +        return;
    +    }
    +
    +    DispatchMessage(Move(msg));
    +}
    +
    +nsresult
    +MessageChannel::MessageTask::Run()
    +{
    +    if (!mChannel) {
    +        return NS_OK;
    +    }
    +
    +    mChannel->AssertWorkerThread();
    +    mChannel->mMonitor->AssertNotCurrentThreadOwns();
    +
    +    MonitorAutoLock lock(*mChannel->mMonitor);
    +
    +    // In case we choose not to run this message, we may need to be able to Post
    +    // it again.
    +    mScheduled = false;
    +
    +    if (!isInList()) {
    +        return NS_OK;
    +    }
    +
    +    mChannel->RunMessage(*this);
    +    return NS_OK;
    +}
    +
    +// Warning: This method removes the receiver from whatever list it might be in.
    +nsresult
    +MessageChannel::MessageTask::Cancel()
    +{
    +    if (!mChannel) {
    +        return NS_OK;
    +    }
    +
    +    mChannel->AssertWorkerThread();
    +    mChannel->mMonitor->AssertNotCurrentThreadOwns();
    +
    +    MonitorAutoLock lock(*mChannel->mMonitor);
    +
    +    if (!isInList()) {
    +        return NS_OK;
    +    }
    +    remove();
    +
    +    return NS_OK;
    +}
    +
    +void
    +MessageChannel::MessageTask::Post()
    +{
    +    MOZ_RELEASE_ASSERT(!mScheduled);
    +    MOZ_RELEASE_ASSERT(isInList());
    +
    +    mScheduled = true;
    +
    +    RefPtr self = this;
    +    mChannel->mWorkerLoop->PostTask(self.forget());
    +}
    +
    +void
    +MessageChannel::MessageTask::Clear()
    +{
    +    mChannel->AssertWorkerThread();
    +
    +    mChannel = nullptr;
    +}
    +
     void
     MessageChannel::DispatchMessage(Message &&aMsg)
     {
    +    AssertWorkerThread();
    +    mMonitor->AssertCurrentThreadOwns();
    +
         Maybe nojsapi;
         if (ScriptSettingsInitialized() && NS_IsMainThread())
             nojsapi.emplace();
    @@ -1780,7 +1838,9 @@ MessageChannel::MaybeUndeferIncall()
         --mRemoteStackDepthGuess;
     
         MOZ_RELEASE_ASSERT(call.nested_level() == IPC::Message::NOT_NESTED);
    -    mPending.push_back(Move(call));
    +    RefPtr task = new MessageTask(this, Move(call));
    +    mPending.insertBack(task);
    +    task->Post();
     }
     
     void
    @@ -1803,18 +1863,10 @@ MessageChannel::EnqueuePendingMessages()
     
         MaybeUndeferIncall();
     
    -    for (size_t i = 0; i < mDeferred.size(); ++i) {
    -        RefPtr task = new DequeueTask(mDequeueOneTask);
    -        mWorkerLoop->PostTask(task.forget());
    -    }
    -
         // XXX performance tuning knob: could process all or k pending
         // messages here, rather than enqueuing for later processing
     
    -    for (size_t i = 0; i < mPending.size(); ++i) {
    -        RefPtr task = new DequeueTask(mDequeueOneTask);
    -        mWorkerLoop->PostTask(task.forget());
    -    }
    +    RepostAllMessages();
     }
     
     static inline bool
    @@ -2269,16 +2321,14 @@ MessageChannel::DebugAbort(const char* file, int line, const char* cond,
                       mDeferred.size());
         printf_stderr("  out-of-turn Interrupt replies stack size: %" PRIuSIZE "\n",
                       mOutOfTurnReplies.size());
    -    printf_stderr("  Pending queue size: %" PRIuSIZE ", front to back:\n",
    -                  mPending.size());
     
         MessageQueue pending = Move(mPending);
    -    while (!pending.empty()) {
    +    while (!pending.isEmpty()) {
             printf_stderr("    [ %s%s ]\n",
    -                      pending.front().is_interrupt() ? "intr" :
    -                      (pending.front().is_sync() ? "sync" : "async"),
    -                      pending.front().is_reply() ? "reply" : "");
    -        pending.pop_front();
    +                      pending.getFirst()->Msg().is_interrupt() ? "intr" :
    +                      (pending.getFirst()->Msg().is_sync() ? "sync" : "async"),
    +                      pending.getFirst()->Msg().is_reply() ? "reply" : "");
    +        pending.popFirst();
         }
     
         NS_RUNTIMEABORT(why);
    @@ -2326,13 +2376,33 @@ MessageChannel::EndTimeout()
         mTimedOutMessageSeqno = 0;
         mTimedOutMessageNestedLevel = 0;
     
    -    for (size_t i = 0; i < mPending.size(); i++) {
    -        // There may be messages in the queue that we expected to process from
    -        // OnMaybeDequeueOne. But during the timeout, that function will skip
    -        // some messages. Now they're ready to be processed, so we enqueue more
    -        // tasks.
    -        RefPtr task = new DequeueTask(mDequeueOneTask);
    -        mWorkerLoop->PostTask(task.forget());
    +    RepostAllMessages();
    +}
    +
    +void
    +MessageChannel::RepostAllMessages()
    +{
    +    bool needRepost = false;
    +    for (RefPtr task : mPending) {
    +        if (!task->IsScheduled()) {
    +            needRepost = true;
    +        }
    +    }
    +    if (!needRepost) {
    +        // If everything is already scheduled to run, do nothing.
    +        return;
    +    }
    +
    +    // In some cases we may have deferred dispatch of some messages in the
    +    // queue. Now we want to run them again. However, we can't just re-post
    +    // those messages since the messages after them in mPending would then be
    +    // before them in the event queue. So instead we cancel everything and
    +    // re-post all messages in the correct order.
    +    MessageQueue queue = Move(mPending);
    +    while (RefPtr task = queue.popFirst()) {
    +        RefPtr newTask = new MessageTask(this, Move(task->Msg()));
    +        mPending.insertBack(newTask);
    +        newTask->Post();
         }
     }
     
    @@ -2375,8 +2445,8 @@ MessageChannel::CancelTransaction(int transaction)
         }
     
         bool foundSync = false;
    -    for (MessageQueue::iterator it = mPending.begin(); it != mPending.end(); ) {
    -        Message &msg = *it;
    +    for (RefPtr p = mPending.getFirst(); p; ) {
    +        Message &msg = p->Msg();
     
             // If there was a race between the parent and the child, then we may
             // have a queued sync message. We want to drop this message from the
    @@ -2387,11 +2457,11 @@ MessageChannel::CancelTransaction(int transaction)
                 MOZ_RELEASE_ASSERT(msg.transaction_id() != transaction);
                 IPC_LOG("Removing msg from queue seqno=%d xid=%d", msg.seqno(), msg.transaction_id());
                 foundSync = true;
    -            it = mPending.erase(it);
    +            p = p->removeAndGetNext();
                 continue;
             }
     
    -        it++;
    +        p = p->getNext();
         }
     }
     
    diff --git a/ipc/glue/MessageChannel.h b/ipc/glue/MessageChannel.h
    index e770a18547d2..d335a70d0c48 100644
    --- a/ipc/glue/MessageChannel.h
    +++ b/ipc/glue/MessageChannel.h
    @@ -274,10 +274,6 @@ class MessageChannel : HasResultCodes
         void MaybeUndeferIncall();
         void EnqueuePendingMessages();
     
    -    // Executed on the worker thread. Dequeues one pending message.
    -    bool OnMaybeDequeueOne();
    -    bool DequeueOne(Message *recvd);
    -
         // Dispatches an incoming message to its appropriate handler.
         void DispatchMessage(Message &&aMsg);
     
    @@ -309,6 +305,8 @@ class MessageChannel : HasResultCodes
         void EndTimeout();
         void CancelTransaction(int transaction);
     
    +    void RepostAllMessages();
    +
         // The "remote view of stack depth" can be different than the
         // actual stack depth when there are out-of-turn replies.  When we
         // receive one, our actual Interrupt stack depth doesn't decrease, but
    @@ -454,119 +452,41 @@ class MessageChannel : HasResultCodes
         }
     
       private:
    -#if defined(MOZ_CRASHREPORTER) && defined(OS_WIN)
    -    // TODO: Remove the condition OS_WIN above once we move to GCC 5 or higher,
    -    // the code will be able to get compiled as std::deque will meet C++11
    -    // allocator requirements.
    -    template
    -    struct AnnotateAllocator
    +    class MessageTask :
    +        public CancelableRunnable,
    +        public LinkedListElement>
         {
    -      typedef T value_type;
    -      AnnotateAllocator(MessageChannel& channel) : mChannel(channel) {}
    -      template AnnotateAllocator(const AnnotateAllocator& other) :
    -        mChannel(other.mChannel) {}
    -      template bool operator==(const AnnotateAllocator&) { return true; }
    -      template bool operator!=(const AnnotateAllocator&) { return false; }
    -      T* allocate(size_t n) {
    -        void* p = ::operator new(n * sizeof(T), std::nothrow);
    -        if (!p && n) {
    -          // Sort the pending messages by its type, note the sorting algorithm
    -          // has to be in-place to avoid memory allocation.
    -          MessageQueue& q = mChannel.mPending;
    -          std::sort(q.begin(), q.end(), [](const Message& a, const Message& b) {
    -            return a.type() < b.type();
    -          });
    +    public:
    +        explicit MessageTask(MessageChannel* aChannel, Message&& aMessage)
    +          : mChannel(aChannel), mMessage(Move(aMessage)), mScheduled(false)
    +        {}
     
    -          // Iterate over the sorted queue to find the message that has the
    -          // highest number of count.
    -          const char* topName = nullptr;
    -          const char* curName = nullptr;
    -          msgid_t topType = 0, curType = 0;
    -          uint32_t topCount = 0, curCount = 0;
    -          for (MessageQueue::iterator it = q.begin(); it != q.end(); ++it) {
    -            Message &msg = *it;
    -            if (msg.type() == curType) {
    -              ++curCount;
    -            } else {
    -              if (curCount > topCount) {
    -                topName = curName;
    -                topType = curType;
    -                topCount = curCount;
    -              }
    -              curName = StringFromIPCMessageType(msg.type());
    -              curType = msg.type();
    -              curCount = 1;
    -            }
    -          }
    -          // In case the last type is the top one.
    -          if (curCount > topCount) {
    -            topName = curName;
    -            topType = curType;
    -            topCount = curCount;
    -          }
    +        NS_IMETHOD Run() override;
    +        nsresult Cancel() override;
    +        void Post();
    +        void Clear();
     
    -          CrashReporter::AnnotatePendingIPC(q.size(), topCount, topName, topType);
    +        bool IsScheduled() const { return mScheduled; }
     
    -          mozalloc_handle_oom(n * sizeof(T));
    -        }
    -        return static_cast(p);
    -      }
    -      void deallocate(T* p, size_t n) {
    -        ::operator delete(p);
    -      }
    -      MessageChannel& mChannel;
    +        Message& Msg() { return mMessage; }
    +        const Message& Msg() const { return mMessage; }
    +
    +    private:
    +        MessageTask() = delete;
    +        MessageTask(const MessageTask&) = delete;
    +
    +        MessageChannel* mChannel;
    +        Message mMessage;
    +        bool mScheduled : 1;
         };
    -    typedef std::deque> MessageQueue;
    -#else
    -    typedef std::deque MessageQueue;
    -#endif
    +
    +    bool ShouldRunMessage(const Message& aMsg);
    +    void RunMessage(MessageTask& aTask);
    +
    +    typedef LinkedList> MessageQueue;
         typedef std::map MessageMap;
         typedef IPC::Message::msgid_t msgid_t;
     
    -    // XXXkhuey this can almost certainly die.
    -    // All dequeuing tasks require a single point of cancellation,
    -    // which is handled via a reference-counted task.
    -    class RefCountedTask
    -    {
    -      public:
    -        explicit RefCountedTask(already_AddRefed aTask)
    -          : mTask(aTask)
    -        { }
    -      private:
    -        ~RefCountedTask() { }
    -      public:
    -        void Run() { mTask->Run(); }
    -        void Cancel() { mTask->Cancel(); }
    -
    -        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RefCountedTask)
    -
    -      private:
    -        RefPtr mTask;
    -    };
    -
    -    // Wrap an existing task which can be cancelled at any time
    -    // without the wrapper's knowledge.
    -    class DequeueTask : public CancelableRunnable
    -    {
    -      public:
    -        explicit DequeueTask(RefCountedTask* aTask)
    -          : mTask(aTask)
    -        { }
    -        NS_IMETHOD Run() override {
    -          if (mTask) {
    -            mTask->Run();
    -          }
    -          return NS_OK;
    -        }
    -        nsresult Cancel() override {
    -          mTask = nullptr;
    -          return NS_OK;
    -        }
    -
    -      private:
    -        RefPtr mTask;
    -    };
    -
       private:
         // Based on presumption the listener owns and overlives the channel,
         // this is never nullified.
    @@ -582,9 +502,6 @@ class MessageChannel : HasResultCodes
         // during channel shutdown.
         int mWorkerLoopID;
     
    -    // A task encapsulating dequeuing one pending message.
    -    RefPtr mDequeueOneTask;
    -
         // Timeout periods are broken up in two to prevent system suspension from
         // triggering an abort. This method (called by WaitForEvent with a 'did
         // timeout' flag) decides if we should wait again for half of mTimeoutMs
    @@ -671,9 +588,7 @@ class MessageChannel : HasResultCodes
         int32_t mTimedOutMessageSeqno;
         int mTimedOutMessageNestedLevel;
     
    -    // Queue of all incoming messages, except for replies to sync and urgent
    -    // messages, which are delivered directly to mRecvd, and any pending urgent
    -    // incall, which is stored in mPendingUrgentRequest.
    +    // Queue of all incoming messages.
         //
         // If both this side and the other side are functioning correctly, the queue
         // can only be in certain configurations.  Let
    @@ -685,7 +600,7 @@ class MessageChannel : HasResultCodes
         //
         // The queue can only match this configuration
         //
    -    //  A<* (S< | C< | R< (?{mStack.size() == 1} A<* (S< | C<)))
    +    //  A<* (S< | C< | R< (?{mInterruptStack.size() == 1} A<* (S< | C<)))
         //
         // The other side can send as many async messages |A<*| as it wants before
         // sending us a blocking message.
    @@ -700,7 +615,7 @@ class MessageChannel : HasResultCodes
         // |mRemoteStackDepth|, and races don't matter to the queue.)
         //
         // Final case, the other side replied to our most recent out-call |R<|.
    -    // If that was the *only* out-call on our stack, |?{mStack.size() == 1}|,
    +    // If that was the *only* out-call on our stack, |?{mInterruptStack.size() == 1}|,
         // then other side "finished with us," and went back to its own business.
         // That business might have included sending any number of async message
         // |A<*| until sending a blocking message |(S< | C<)|.  If we had more than
    @@ -725,7 +640,7 @@ class MessageChannel : HasResultCodes
         //
         // Then when processing an in-call |c|, it must be true that
         //
    -    //   mStack.size() == c.remoteDepth
    +    //   mInterruptStack.size() == c.remoteDepth
         //
         // I.e., my depth is actually the same as what the other side thought it
         // was when it sent in-call |c|.  If this fails to hold, we have detected
    
    From ea1b39856a286126c02f9781e114827aca1f300c Mon Sep 17 00:00:00 2001
    From: David Anderson 
    Date: Sun, 30 Oct 2016 22:35:56 -0700
    Subject: [PATCH 53/61] Ensure we start the Telemetry singleton in the GPU
     process. (bug 1304494 part 1, r=gfritzsche)
    
    ---
     gfx/ipc/GPUParent.cpp                      |  2 ++
     toolkit/components/telemetry/Telemetry.cpp | 19 +++++++++++++------
     xpcom/build/XPCOMInit.cpp                  |  1 +
     3 files changed, 16 insertions(+), 6 deletions(-)
    
    diff --git a/gfx/ipc/GPUParent.cpp b/gfx/ipc/GPUParent.cpp
    index cbbc7d3525c8..d40750b76b7b 100644
    --- a/gfx/ipc/GPUParent.cpp
    +++ b/gfx/ipc/GPUParent.cpp
    @@ -97,9 +97,11 @@ GPUParent::Init(base::ProcessId aParentPid,
       DeviceManagerDx::Init();
       DeviceManagerD3D9::Init();
     #endif
    +
       if (NS_FAILED(NS_InitMinimalXPCOM())) {
         return false;
       }
    +
       CompositorThreadHolder::Start();
       APZThreadUtils::SetControllerThread(CompositorThreadHolder::Loop());
       APZCTreeManager::InitializeGlobalState();
    diff --git a/toolkit/components/telemetry/Telemetry.cpp b/toolkit/components/telemetry/Telemetry.cpp
    index 4be53e31b0af..312e5b68a653 100644
    --- a/toolkit/components/telemetry/Telemetry.cpp
    +++ b/toolkit/components/telemetry/Telemetry.cpp
    @@ -1908,10 +1908,16 @@ TelemetryImpl::CreateTelemetryInstance()
     {
       MOZ_ASSERT(sTelemetry == nullptr, "CreateTelemetryInstance may only be called once, via GetService()");
     
    +  bool useTelemetry = false;
    +  if (XRE_IsParentProcess() ||
    +      XRE_IsContentProcess() ||
    +      XRE_IsGPUProcess())
    +  {
    +    useTelemetry = true;
    +  }
    +
       // First, initialize the TelemetryHistogram and TelemetryScalar global states.
    -  TelemetryHistogram::InitializeGlobalState(
    -                        XRE_IsParentProcess() || XRE_IsContentProcess(),
    -                        XRE_IsParentProcess() || XRE_IsContentProcess());
    +  TelemetryHistogram::InitializeGlobalState(useTelemetry, useTelemetry);
     
       // Only record scalars from the parent process.
       TelemetryScalar::InitializeGlobalState(XRE_IsParentProcess(), XRE_IsParentProcess());
    @@ -2263,12 +2269,12 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsITelemetry, TelemetryImpl::CreateTele
     NS_DEFINE_NAMED_CID(NS_TELEMETRY_CID);
     
     const Module::CIDEntry kTelemetryCIDs[] = {
    -  { &kNS_TELEMETRY_CID, false, nullptr, nsITelemetryConstructor },
    +  { &kNS_TELEMETRY_CID, false, nullptr, nsITelemetryConstructor, Module::ALLOW_IN_GPU_PROCESS },
       { nullptr }
     };
     
     const Module::ContractIDEntry kTelemetryContracts[] = {
    -  { "@mozilla.org/base/telemetry;1", &kNS_TELEMETRY_CID },
    +  { "@mozilla.org/base/telemetry;1", &kNS_TELEMETRY_CID, Module::ALLOW_IN_GPU_PROCESS },
       { nullptr }
     };
     
    @@ -2279,7 +2285,8 @@ const Module kTelemetryModule = {
       nullptr,
       nullptr,
       nullptr,
    -  TelemetryImpl::ShutdownTelemetry
    +  TelemetryImpl::ShutdownTelemetry,
    +  Module::ALLOW_IN_GPU_PROCESS
     };
     
     NS_IMETHODIMP
    diff --git a/xpcom/build/XPCOMInit.cpp b/xpcom/build/XPCOMInit.cpp
    index 66fa899d7315..c4b57bdfd083 100644
    --- a/xpcom/build/XPCOMInit.cpp
    +++ b/xpcom/build/XPCOMInit.cpp
    @@ -802,6 +802,7 @@ NS_InitMinimalXPCOM()
     
       AbstractThread::InitStatics();
       SharedThreadPool::InitStatics();
    +  mozilla::Telemetry::Init();
       mozilla::HangMonitor::Startup();
       mozilla::BackgroundHangMonitor::Startup();
     
    
    From fb068517dabd0a060c84135e027f78e44631212e Mon Sep 17 00:00:00 2001
    From: David Anderson 
    Date: Sun, 30 Oct 2016 22:35:57 -0700
    Subject: [PATCH 54/61] Refactor TelemetryHistogram to support multiple child
     process types. (bug 1304494 part 2, r=gfritzsche)
    
    ---
     dom/ipc/ContentParent.cpp                     |   4 +-
     toolkit/components/telemetry/Telemetry.cpp    |  10 +-
     toolkit/components/telemetry/Telemetry.h      |   9 +-
     .../telemetry/TelemetryHistogram.cpp          | 177 ++++++++++++------
     .../components/telemetry/TelemetryHistogram.h |   7 +-
     5 files changed, 135 insertions(+), 72 deletions(-)
    
    diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp
    index ad796cfa7a17..e34882cd5c7d 100644
    --- a/dom/ipc/ContentParent.cpp
    +++ b/dom/ipc/ContentParent.cpp
    @@ -5244,7 +5244,7 @@ bool
     ContentParent::RecvAccumulateChildHistogram(
                     InfallibleTArray&& aAccumulations)
     {
    -  Telemetry::AccumulateChild(aAccumulations);
    +  Telemetry::AccumulateChild(GeckoProcessType_Content, aAccumulations);
       return true;
     }
     
    @@ -5252,6 +5252,6 @@ bool
     ContentParent::RecvAccumulateChildKeyedHistogram(
                     InfallibleTArray&& aAccumulations)
     {
    -  Telemetry::AccumulateChildKeyed(aAccumulations);
    +  Telemetry::AccumulateChildKeyed(GeckoProcessType_Content, aAccumulations);
       return true;
     }
    diff --git a/toolkit/components/telemetry/Telemetry.cpp b/toolkit/components/telemetry/Telemetry.cpp
    index 312e5b68a653..bb8e06581cf8 100644
    --- a/toolkit/components/telemetry/Telemetry.cpp
    +++ b/toolkit/components/telemetry/Telemetry.cpp
    @@ -2836,15 +2836,17 @@ AccumulateTimeDelta(ID aHistogram, TimeStamp start, TimeStamp end)
     }
     
     void
    -AccumulateChild(const nsTArray& aAccumulations)
    +AccumulateChild(GeckoProcessType aProcessType,
    +                const nsTArray& aAccumulations)
     {
    -  TelemetryHistogram::AccumulateChild(aAccumulations);
    +  TelemetryHistogram::AccumulateChild(aProcessType, aAccumulations);
     }
     
     void
    -AccumulateChildKeyed(const nsTArray& aAccumulations)
    +AccumulateChildKeyed(GeckoProcessType aProcessType,
    +                     const nsTArray& aAccumulations)
     {
    -  TelemetryHistogram::AccumulateChildKeyed(aAccumulations);
    +  TelemetryHistogram::AccumulateChildKeyed(aProcessType, aAccumulations);
     }
     
     const char*
    diff --git a/toolkit/components/telemetry/Telemetry.h b/toolkit/components/telemetry/Telemetry.h
    index a8abf9f7142a..64f50013ab98 100644
    --- a/toolkit/components/telemetry/Telemetry.h
    +++ b/toolkit/components/telemetry/Telemetry.h
    @@ -11,6 +11,7 @@
     #include "mozilla/StartupTimeline.h"
     #include "nsTArray.h"
     #include "nsStringGlue.h"
    +#include "nsXULAppAPI.h"
     
     #include "mozilla/TelemetryHistogramEnums.h"
     #include "mozilla/TelemetryScalarEnums.h"
    @@ -129,18 +130,18 @@ void AccumulateCategorical(ID id, const nsCString& label);
     void AccumulateTimeDelta(ID id, TimeStamp start, TimeStamp end = TimeStamp::Now());
     
     /**
    - * Accumulate child data into child histograms
    + * Accumulate child process data into histograms for the given process type.
      *
      * @param aAccumulations - accumulation actions to perform
      */
    -void AccumulateChild(const nsTArray& aAccumulations);
    +void AccumulateChild(GeckoProcessType aProcessType, const nsTArray& aAccumulations);
     
     /**
    - * Accumulate child data into child keyed histograms
    + * Accumulate child process data into keyed histograms for the given process type.
      *
      * @param aAccumulations - accumulation actions to perform
      */
    -void AccumulateChildKeyed(const nsTArray& aAccumulations);
    +void AccumulateChildKeyed(GeckoProcessType aProcessType, const nsTArray& aAccumulations);
     
     /**
      * Enable/disable recording for this histogram at runtime.
    diff --git a/toolkit/components/telemetry/TelemetryHistogram.cpp b/toolkit/components/telemetry/TelemetryHistogram.cpp
    index 759367d7f737..5a34b5524050 100644
    --- a/toolkit/components/telemetry/TelemetryHistogram.cpp
    +++ b/toolkit/components/telemetry/TelemetryHistogram.cpp
    @@ -99,7 +99,7 @@ using mozilla::Telemetry::KeyedAccumulation;
     #define EXPIRED_ID "__expired__"
     #define SUBSESSION_HISTOGRAM_PREFIX "sub#"
     #define KEYED_HISTOGRAM_NAME_SEPARATOR "#"
    -#define CHILD_HISTOGRAM_SUFFIX "#content"
    +#define CONTENT_HISTOGRAM_SUFFIX "#content"
     
     namespace {
     
    @@ -340,16 +340,6 @@ HistogramInfo::label_id(const char* label, uint32_t* labelId) const
       return NS_ERROR_FAILURE;
     }
     
    -bool
    -StringEndsWith(const std::string& name, const std::string& suffix)
    -{
    -  if (name.size() < suffix.size()) {
    -    return false;
    -  }
    -
    -  return name.compare(name.size() - suffix.size(), suffix.size(), suffix) == 0;
    -}
    -
     struct TelemetryShutdownObserver : public nsIObserver
     {
       NS_DECL_ISUPPORTS
    @@ -455,15 +445,49 @@ internal_HistogramGet(const char *name, const char *expiration,
       return NS_OK;
     }
     
    -CharPtrEntryType*
    -internal_GetHistogramMapEntry(const char* name)
    +// Read the process type from the given histogram name. The process type, if
    +// one exists, is embedded in a suffix.
    +GeckoProcessType
    +GetProcessFromName(const nsACString& aString)
     {
    -  nsDependentCString histogramName(name);
    -  NS_NAMED_LITERAL_CSTRING(suffix, CHILD_HISTOGRAM_SUFFIX);
    -  if (!StringEndsWith(histogramName, suffix)) {
    -    return gHistogramMap.GetEntry(name);
    +  if (StringEndsWith(aString, NS_LITERAL_CSTRING(CONTENT_HISTOGRAM_SUFFIX))) {
    +    return GeckoProcessType_Content;
       }
    -  auto root = Substring(histogramName, 0, histogramName.Length() - suffix.Length());
    +  return GeckoProcessType_Default;
    +}
    +
    +GeckoProcessType
    +GetProcessFromName(const std::string& aString)
    +{
    +  nsDependentCString string(aString.c_str(), aString.length());
    +  return GetProcessFromName(string);
    +}
    +
    +const char*
    +SuffixForProcessType(GeckoProcessType aProcessType)
    +{
    +  switch (aProcessType) {
    +    case GeckoProcessType_Default:
    +      return nullptr;
    +    case GeckoProcessType_Content:
    +      return CONTENT_HISTOGRAM_SUFFIX;
    +    default:
    +      MOZ_ASSERT_UNREACHABLE("unknown process type");
    +      return nullptr;
    +  }
    +}
    +
    +CharPtrEntryType*
    +internal_GetHistogramMapEntry(const char* aName)
    +{
    +  nsDependentCString name(aName);
    +  GeckoProcessType process = GetProcessFromName(name);
    +  const char* suffix = SuffixForProcessType(process);
    +  if (!suffix) {
    +    return gHistogramMap.GetEntry(aName);
    +  }
    +
    +  auto root = Substring(name, 0, name.Length() - strlen(suffix));
       return gHistogramMap.GetEntry(PromiseFlatCString(root).get());
     }
     
    @@ -484,12 +508,26 @@ internal_GetHistogramEnumId(const char *name, mozilla::Telemetry::ID *id)
     
     // O(1) histogram lookup by numeric id
     nsresult
    -internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret,
    -                              bool child = false)
    +internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret, GeckoProcessType aProcessType)
     {
       static Histogram* knownHistograms[mozilla::Telemetry::HistogramCount] = {0};
    -  static Histogram* knownChildHistograms[mozilla::Telemetry::HistogramCount] = {0};
    -  Histogram *h = child ? knownChildHistograms[id] : knownHistograms[id];
    +  static Histogram* knownContentHistograms[mozilla::Telemetry::HistogramCount] = {0};
    +
    +  Histogram** knownList = nullptr;
    +
    +  switch (aProcessType) {
    +  case GeckoProcessType_Default:
    +    knownList = knownHistograms;
    +    break;
    +  case GeckoProcessType_Content:
    +    knownList = knownContentHistograms;
    +    break;
    +  default:
    +    MOZ_ASSERT_UNREACHABLE("unknown process type");
    +    return NS_ERROR_FAILURE;
    +  }
    +
    +  Histogram* h = knownList[id];
       if (h) {
         *ret = h;
         return NS_OK;
    @@ -502,8 +540,8 @@ internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret,
     
       nsCString histogramName;
       histogramName.Append(p.id());
    -  if (child) {
    -    histogramName.AppendLiteral(CHILD_HISTOGRAM_SUFFIX);
    +  if (const char* suffix = SuffixForProcessType(aProcessType)) {
    +    histogramName.AppendASCII(suffix);
       }
     
       nsresult rv = internal_HistogramGet(histogramName.get(), p.expiration(),
    @@ -528,11 +566,8 @@ internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret,
       }
     #endif
     
    -  if (child) {
    -    *ret = knownChildHistograms[id] = h;
    -  } else {
    -    *ret = knownHistograms[id] = h;
    -  }
    +  knownList[id] = h;
    +  *ret = h;
       return NS_OK;
     }
     
    @@ -546,9 +581,8 @@ internal_GetHistogramByName(const nsACString &name, Histogram **ret)
         return rv;
       }
     
    -  bool isChild = StringEndsWith(name,
    -                                NS_LITERAL_CSTRING(CHILD_HISTOGRAM_SUFFIX));
    -  rv = internal_GetHistogramByEnumId(id, ret, isChild);
    +  GeckoProcessType process = GetProcessFromName(name);
    +  rv = internal_GetHistogramByEnumId(id, ret, process);
       if (NS_FAILED(rv))
         return rv;
     
    @@ -595,7 +629,7 @@ internal_CloneHistogram(const nsACString& newName,
                             mozilla::Telemetry::ID existingId)
     {
       Histogram *existing = nullptr;
    -  nsresult rv = internal_GetHistogramByEnumId(existingId, &existing);
    +  nsresult rv = internal_GetHistogramByEnumId(existingId, &existing, GeckoProcessType_Default);
       if (NS_FAILED(rv)) {
         return nullptr;
       }
    @@ -615,13 +649,25 @@ internal_GetSubsessionHistogram(Histogram& existing)
         return nullptr;
       }
     
    -  bool isChild = StringEndsWith(existing.histogram_name(),
    -                                CHILD_HISTOGRAM_SUFFIX);
    -
       static Histogram* subsession[mozilla::Telemetry::HistogramCount] = {};
    -  static Histogram* subsessionChild[mozilla::Telemetry::HistogramCount] = {};
    -  Histogram* cached = isChild ? subsessionChild[id] : subsession[id];
    -  if (cached) {
    +  static Histogram* subsessionContent[mozilla::Telemetry::HistogramCount] = {};
    +
    +  Histogram** cache = nullptr;
    +
    +  GeckoProcessType process = GetProcessFromName(existing.histogram_name());
    +  switch (process) {
    +  case GeckoProcessType_Default:
    +    cache = subsession;
    +    break;
    +  case GeckoProcessType_Content:
    +    cache = subsessionContent;
    +    break;
    +  default:
    +    MOZ_ASSERT_UNREACHABLE("unknown process type");
    +    return nullptr;
    +  }
    +
    +  if (Histogram* cached = cache[id]) {
         return cached;
       }
     
    @@ -635,11 +681,7 @@ internal_GetSubsessionHistogram(Histogram& existing)
       subsessionName.Append(existing.histogram_name().c_str());
     
       Histogram* clone = internal_CloneHistogram(subsessionName, id, existing);
    -  if (isChild) {
    -    subsessionChild[id] = clone;
    -  } else {
    -    subsession[id] = clone;
    -  }
    +  cache[id] = clone;
       return clone;
     }
     #endif
    @@ -1291,7 +1333,7 @@ internal_SetHistogramRecordingEnabled(mozilla::Telemetry::ID aID, bool aEnabled)
         }
       } else {
         Histogram *h;
    -    nsresult rv = internal_GetHistogramByEnumId(aID, &h);
    +    nsresult rv = internal_GetHistogramByEnumId(aID, &h, GeckoProcessType_Default);
         if (NS_SUCCEEDED(rv)) {
           h->SetRecordingEnabled(aEnabled);
           return;
    @@ -1383,7 +1425,7 @@ void internal_Accumulate(mozilla::Telemetry::ID aHistogram, uint32_t aSample)
         return;
       }
       Histogram *h;
    -  nsresult rv = internal_GetHistogramByEnumId(aHistogram, &h);
    +  nsresult rv = internal_GetHistogramByEnumId(aHistogram, &h, GeckoProcessType_Default);
       if (NS_SUCCEEDED(rv)) {
         internal_HistogramAdd(*h, aSample, gHistograms[aHistogram].dataset);
       }
    @@ -1437,13 +1479,13 @@ internal_Accumulate(KeyedHistogram& aKeyed,
     }
     
     void
    -internal_AccumulateChild(mozilla::Telemetry::ID aId, uint32_t aSample)
    +internal_AccumulateChild(GeckoProcessType aProcessType, mozilla::Telemetry::ID aId, uint32_t aSample)
     {
       if (!internal_CanRecordBase()) {
         return;
       }
       Histogram* h;
    -  nsresult rv = internal_GetHistogramByEnumId(aId, &h, true);
    +  nsresult rv = internal_GetHistogramByEnumId(aId, &h, aProcessType);
       if (NS_SUCCEEDED(rv)) {
         internal_HistogramAdd(*h, aSample, gHistograms[aId].dataset);
       } else {
    @@ -1452,16 +1494,25 @@ internal_AccumulateChild(mozilla::Telemetry::ID aId, uint32_t aSample)
     }
     
     void
    -internal_AccumulateChildKeyed(mozilla::Telemetry::ID aId,
    +internal_AccumulateChildKeyed(GeckoProcessType aProcessType, mozilla::Telemetry::ID aId,
                                   const nsCString& aKey, uint32_t aSample)
     {
       if (!gInitDone || !internal_CanRecordBase()) {
         return;
       }
    +
    +  const char* suffix = SuffixForProcessType(aProcessType);
    +  if (!suffix) {
    +    MOZ_ASSERT_UNREACHABLE("suffix should not be null");
    +    return;
    +  }
    +
       const HistogramInfo& th = gHistograms[aId];
    +
       nsCString id;
       id.Append(th.id());
    -  id.AppendLiteral(CHILD_HISTOGRAM_SUFFIX);
    +  id.AppendASCII(suffix);
    +
       KeyedHistogram* keyed = internal_GetKeyedHistogramById(id);
       MOZ_ASSERT(keyed);
       keyed->Add(aKey, aSample);
    @@ -2028,9 +2079,9 @@ void TelemetryHistogram::InitializeGlobalState(bool canRecordBase,
           // We must create registered child keyed histograms as well or else the
           // same code in TelemetrySession.jsm that fails without parent keyed
           // histograms will fail without child keyed histograms.
    -      nsCString childId(id);
    -      childId.AppendLiteral(CHILD_HISTOGRAM_SUFFIX);
    -      gKeyedHistograms.Put(childId,
    +      nsCString contentId(id);
    +      contentId.AppendLiteral(CONTENT_HISTOGRAM_SUFFIX);
    +      gKeyedHistograms.Put(contentId,
                                new KeyedHistogram(id, expiration, h.histogramType,
                                                   h.min, h.max, h.bucketCount, h.dataset));
         }
    @@ -2212,7 +2263,8 @@ TelemetryHistogram::AccumulateCategorical(mozilla::Telemetry::ID aId,
     }
     
     void
    -TelemetryHistogram::AccumulateChild(const nsTArray& aAccumulations)
    +TelemetryHistogram::AccumulateChild(GeckoProcessType aProcessType,
    +                                    const nsTArray& aAccumulations)
     {
       MOZ_ASSERT(XRE_IsParentProcess());
       StaticMutexAutoLock locker(gTelemetryHistogramMutex);
    @@ -2225,12 +2277,13 @@ TelemetryHistogram::AccumulateChild(const nsTArray& aAccumulations
         if (!isValid) {
           continue;
         }
    -    internal_AccumulateChild(aAccumulations[i].mId, aAccumulations[i].mSample);
    +    internal_AccumulateChild(aProcessType, aAccumulations[i].mId, aAccumulations[i].mSample);
       }
     }
     
     void
    -TelemetryHistogram::AccumulateChildKeyed(const nsTArray& aAccumulations)
    +TelemetryHistogram::AccumulateChildKeyed(GeckoProcessType aProcessType,
    +                                         const nsTArray& aAccumulations)
     {
       MOZ_ASSERT(XRE_IsParentProcess());
       StaticMutexAutoLock locker(gTelemetryHistogramMutex);
    @@ -2243,7 +2296,8 @@ TelemetryHistogram::AccumulateChildKeyed(const nsTArray& aAcc
         if (!isValid) {
           continue;
         }
    -    internal_AccumulateChildKeyed(aAccumulations[i].mId,
    +    internal_AccumulateChildKeyed(aProcessType,
    +                                  aAccumulations[i].mId,
                                       aAccumulations[i].mKey,
                                       aAccumulations[i].mSample);
       }
    @@ -2337,10 +2391,13 @@ TelemetryHistogram::CreateHistogramSnapshots(JSContext *cx,
         if (type == nsITelemetry::HISTOGRAM_FLAG ||
             type == nsITelemetry::HISTOGRAM_COUNT) {
           Histogram *h;
    -      mozilla::DebugOnly rv
    -         = internal_GetHistogramByEnumId(mozilla::Telemetry::ID(i), &h);
    +      mozilla::DebugOnly rv;
    +      mozilla::Telemetry::ID id = mozilla::Telemetry::ID(i);
    +
    +      rv = internal_GetHistogramByEnumId(id, &h, GeckoProcessType_Default);
           MOZ_ASSERT(NS_SUCCEEDED(rv));
    -      rv = internal_GetHistogramByEnumId(mozilla::Telemetry::ID(i), &h, true);
    +
    +      rv = internal_GetHistogramByEnumId(id, &h, GeckoProcessType_Content);
           MOZ_ASSERT(NS_SUCCEEDED(rv));
         }
       }
    diff --git a/toolkit/components/telemetry/TelemetryHistogram.h b/toolkit/components/telemetry/TelemetryHistogram.h
    index 372b4668d463..39a487466565 100644
    --- a/toolkit/components/telemetry/TelemetryHistogram.h
    +++ b/toolkit/components/telemetry/TelemetryHistogram.h
    @@ -9,6 +9,7 @@
     #include "mozilla/TelemetryHistogramEnums.h"
     
     #include "mozilla/TelemetryComms.h"
    +#include "nsXULAppAPI.h"
     
     // This module is internal to Telemetry.  It encapsulates Telemetry's
     // histogram accumulation and storage logic.  It should only be used by
    @@ -44,8 +45,10 @@ void Accumulate(const char* name, const nsCString& key, uint32_t sample);
     
     void AccumulateCategorical(mozilla::Telemetry::ID aId, const nsCString& aLabel);
     
    -void AccumulateChild(const nsTArray& aAccumulations);
    -void AccumulateChildKeyed(const nsTArray& aAccumulations);
    +void AccumulateChild(GeckoProcessType aProcessType,
    +                     const nsTArray& aAccumulations);
    +void AccumulateChildKeyed(GeckoProcessType aProcessType,
    +                          const nsTArray& aAccumulations);
     
     nsresult
     GetHistogramById(const nsACString &name, JSContext *cx,
    
    From ec2b48ff8b12e6f9f2552e1f04540d54f3bc3ad2 Mon Sep 17 00:00:00 2001
    From: David Anderson 
    Date: Sun, 30 Oct 2016 22:35:57 -0700
    Subject: [PATCH 55/61] Send accumulated GPU process telemetry to the UI
     process. (bug 1304494 part 3, r=gfritzsche)
    
    ---
     gfx/ipc/GPUChild.cpp                          | 14 +++
     gfx/ipc/GPUChild.h                            |  2 +
     gfx/ipc/GPUProcessManager.h                   |  5 ++
     gfx/ipc/PGPU.ipdl                             |  6 ++
     .../telemetry/TelemetryHistogram.cpp          | 86 +++++++++++++++----
     5 files changed, 97 insertions(+), 16 deletions(-)
    
    diff --git a/gfx/ipc/GPUChild.cpp b/gfx/ipc/GPUChild.cpp
    index a0aee498067f..736813156614 100644
    --- a/gfx/ipc/GPUChild.cpp
    +++ b/gfx/ipc/GPUChild.cpp
    @@ -137,6 +137,20 @@ GPUChild::RecvNotifyUiObservers(const nsCString& aTopic)
       return true;
     }
     
    +bool
    +GPUChild::RecvAccumulateChildHistogram(InfallibleTArray&& aAccumulations)
    +{
    +  Telemetry::AccumulateChild(GeckoProcessType_GPU, aAccumulations);
    +  return true;
    +}
    +
    +bool
    +GPUChild::RecvAccumulateChildKeyedHistogram(InfallibleTArray&& aAccumulations)
    +{
    +  Telemetry::AccumulateChildKeyed(GeckoProcessType_GPU, aAccumulations);
    +  return true;
    +}
    +
     void
     GPUChild::ActorDestroy(ActorDestroyReason aWhy)
     {
    diff --git a/gfx/ipc/GPUChild.h b/gfx/ipc/GPUChild.h
    index dd43f08579d4..3515dfe06366 100644
    --- a/gfx/ipc/GPUChild.h
    +++ b/gfx/ipc/GPUChild.h
    @@ -38,6 +38,8 @@ public:
       bool RecvInitComplete(const GPUDeviceData& aData) override;
       bool RecvReportCheckerboard(const uint32_t& aSeverity, const nsCString& aLog) override;
       bool RecvInitCrashReporter(Shmem&& shmem) override;
    +  bool RecvAccumulateChildHistogram(InfallibleTArray&& aAccumulations) override;
    +  bool RecvAccumulateChildKeyedHistogram(InfallibleTArray&& aAccumulations) override;
       void ActorDestroy(ActorDestroyReason aWhy) override;
       bool RecvGraphicsError(const nsCString& aError) override;
       bool RecvNotifyUiObservers(const nsCString& aTopic) override;
    diff --git a/gfx/ipc/GPUProcessManager.h b/gfx/ipc/GPUProcessManager.h
    index cd0275151b05..adf1dc501e46 100644
    --- a/gfx/ipc/GPUProcessManager.h
    +++ b/gfx/ipc/GPUProcessManager.h
    @@ -137,6 +137,11 @@ public:
         return mGPUChild;
       }
     
    +  // Returns whether or not a GPU process was ever launched.
    +  bool AttemptedGPUProcess() const {
    +    return mNumProcessAttempts > 0;
    +  }
    +
     private:
       // Called from our xpcom-shutdown observer.
       void OnXPCOMShutdown();
    diff --git a/gfx/ipc/PGPU.ipdl b/gfx/ipc/PGPU.ipdl
    index 374f15d73975..87c91478e507 100644
    --- a/gfx/ipc/PGPU.ipdl
    +++ b/gfx/ipc/PGPU.ipdl
    @@ -14,6 +14,8 @@ using base::ProcessId from "base/process.h";
     using mozilla::TimeDuration from "mozilla/TimeStamp.h";
     using mozilla::CSSToLayoutDeviceScale from "Units.h";
     using mozilla::gfx::IntSize from "mozilla/gfx/2D.h";
    +using mozilla::Telemetry::Accumulation from "mozilla/TelemetryComms.h";
    +using mozilla::Telemetry::KeyedAccumulation from "mozilla/TelemetryComms.h";
     
     namespace mozilla {
     namespace gfx {
    @@ -88,6 +90,10 @@ child:
       // Have a message be broadcasted to the UI process by the UI process
       // observer service.
       async NotifyUiObservers(nsCString aTopic);
    +
    +  // Messages for reporting telemetry to the UI process.
    +  async AccumulateChildHistogram(Accumulation[] accumulations);
    +  async AccumulateChildKeyedHistogram(KeyedAccumulation[] accumulations);
     };
     
     } // namespace gfx
    diff --git a/toolkit/components/telemetry/TelemetryHistogram.cpp b/toolkit/components/telemetry/TelemetryHistogram.cpp
    index 5a34b5524050..d26936eab295 100644
    --- a/toolkit/components/telemetry/TelemetryHistogram.cpp
    +++ b/toolkit/components/telemetry/TelemetryHistogram.cpp
    @@ -16,6 +16,8 @@
     
     #include "mozilla/dom/ContentChild.h"
     #include "mozilla/dom/ToJSValue.h"
    +#include "mozilla/gfx/GPUParent.h"
    +#include "mozilla/gfx/GPUProcessManager.h"
     #include "mozilla/Atomics.h"
     #include "mozilla/StartupTimeline.h"
     #include "mozilla/StaticMutex.h"
    @@ -100,6 +102,7 @@ using mozilla::Telemetry::KeyedAccumulation;
     #define SUBSESSION_HISTOGRAM_PREFIX "sub#"
     #define KEYED_HISTOGRAM_NAME_SEPARATOR "#"
     #define CONTENT_HISTOGRAM_SUFFIX "#content"
    +#define GPU_HISTOGRAM_SUFFIX "#gpu"
     
     namespace {
     
    @@ -453,16 +456,12 @@ GetProcessFromName(const nsACString& aString)
       if (StringEndsWith(aString, NS_LITERAL_CSTRING(CONTENT_HISTOGRAM_SUFFIX))) {
         return GeckoProcessType_Content;
       }
    +  if (StringEndsWith(aString, NS_LITERAL_CSTRING(GPU_HISTOGRAM_SUFFIX))) {
    +    return GeckoProcessType_GPU;
    +  }
       return GeckoProcessType_Default;
     }
     
    -GeckoProcessType
    -GetProcessFromName(const std::string& aString)
    -{
    -  nsDependentCString string(aString.c_str(), aString.length());
    -  return GetProcessFromName(string);
    -}
    -
     const char*
     SuffixForProcessType(GeckoProcessType aProcessType)
     {
    @@ -471,6 +470,8 @@ SuffixForProcessType(GeckoProcessType aProcessType)
           return nullptr;
         case GeckoProcessType_Content:
           return CONTENT_HISTOGRAM_SUFFIX;
    +    case GeckoProcessType_GPU:
    +      return GPU_HISTOGRAM_SUFFIX;
         default:
           MOZ_ASSERT_UNREACHABLE("unknown process type");
           return nullptr;
    @@ -512,6 +513,7 @@ internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret, GeckoP
     {
       static Histogram* knownHistograms[mozilla::Telemetry::HistogramCount] = {0};
       static Histogram* knownContentHistograms[mozilla::Telemetry::HistogramCount] = {0};
    +  static Histogram* knownGPUHistograms[mozilla::Telemetry::HistogramCount] = {0};
     
       Histogram** knownList = nullptr;
     
    @@ -522,6 +524,9 @@ internal_GetHistogramByEnumId(mozilla::Telemetry::ID id, Histogram **ret, GeckoP
       case GeckoProcessType_Content:
         knownList = knownContentHistograms;
         break;
    +  case GeckoProcessType_GPU:
    +    knownList = knownGPUHistograms;
    +    break;
       default:
         MOZ_ASSERT_UNREACHABLE("unknown process type");
         return NS_ERROR_FAILURE;
    @@ -639,6 +644,13 @@ internal_CloneHistogram(const nsACString& newName,
     
     #if !defined(MOZ_WIDGET_GONK) && !defined(MOZ_WIDGET_ANDROID)
     
    +GeckoProcessType
    +GetProcessFromName(const std::string& aString)
    +{
    +  nsDependentCString string(aString.c_str(), aString.length());
    +  return GetProcessFromName(string);
    +}
    +
     Histogram*
     internal_GetSubsessionHistogram(Histogram& existing)
     {
    @@ -651,6 +663,7 @@ internal_GetSubsessionHistogram(Histogram& existing)
     
       static Histogram* subsession[mozilla::Telemetry::HistogramCount] = {};
       static Histogram* subsessionContent[mozilla::Telemetry::HistogramCount] = {};
    +  static Histogram* subsessionGPU[mozilla::Telemetry::HistogramCount] = {};
     
       Histogram** cache = nullptr;
     
    @@ -662,6 +675,9 @@ internal_GetSubsessionHistogram(Histogram& existing)
       case GeckoProcessType_Content:
         cache = subsessionContent;
         break;
    +  case GeckoProcessType_GPU:
    +    cache = subsessionGPU;
    +    break;
       default:
         MOZ_ASSERT_UNREACHABLE("unknown process type");
         return nullptr;
    @@ -2084,6 +2100,13 @@ void TelemetryHistogram::InitializeGlobalState(bool canRecordBase,
           gKeyedHistograms.Put(contentId,
                                new KeyedHistogram(id, expiration, h.histogramType,
                                                   h.min, h.max, h.bucketCount, h.dataset));
    +
    +
    +      nsCString gpuId(id);
    +      gpuId.AppendLiteral(GPU_HISTOGRAM_SUFFIX);
    +      gKeyedHistograms.Put(gpuId,
    +                           new KeyedHistogram(id, expiration, h.histogramType,
    +                                              h.min, h.max, h.bucketCount, h.dataset));
         }
       }
     
    @@ -2381,6 +2404,13 @@ TelemetryHistogram::CreateHistogramSnapshots(JSContext *cx,
         return NS_ERROR_FAILURE;
       ret.setObject(*root_obj);
     
    +  // Include the GPU process in histogram snapshots only if we actually tried
    +  // to launch a process for it.
    +  bool includeGPUProcess = false;
    +  if (auto gpm = mozilla::gfx::GPUProcessManager::Get()) {
    +    includeGPUProcess = gpm->AttemptedGPUProcess();
    +  }
    +
       // Ensure that all the HISTOGRAM_FLAG & HISTOGRAM_COUNT histograms have
       // been created, so that their values are snapshotted.
       for (size_t i = 0; i < mozilla::Telemetry::HistogramCount; ++i) {
    @@ -2399,6 +2429,11 @@ TelemetryHistogram::CreateHistogramSnapshots(JSContext *cx,
     
           rv = internal_GetHistogramByEnumId(id, &h, GeckoProcessType_Content);
           MOZ_ASSERT(NS_SUCCEEDED(rv));
    +
    +      if (includeGPUProcess) {
    +        rv = internal_GetHistogramByEnumId(id, &h, GeckoProcessType_GPU);
    +        MOZ_ASSERT(NS_SUCCEEDED(rv));
    +      }
         }
       }
     
    @@ -2687,17 +2722,36 @@ TelemetryHistogram::IPCTimerFired(nsITimer* aTimer, void* aClosure)
         }
       }
     
    -  mozilla::dom::ContentChild* contentChild = mozilla::dom::ContentChild::GetSingleton();
    -  mozilla::Unused << NS_WARN_IF(!contentChild);
    -  if (contentChild) {
    -    if (accumulationsToSend.Length()) {
    -      mozilla::Unused <<
    -        NS_WARN_IF(!contentChild->SendAccumulateChildHistogram(accumulationsToSend));
    +  switch (XRE_GetProcessType()) {
    +    case GeckoProcessType_Content: {
    +      mozilla::dom::ContentChild* contentChild = mozilla::dom::ContentChild::GetSingleton();
    +      mozilla::Unused << NS_WARN_IF(!contentChild);
    +      if (contentChild) {
    +        if (accumulationsToSend.Length()) {
    +          mozilla::Unused <<
    +            NS_WARN_IF(!contentChild->SendAccumulateChildHistogram(accumulationsToSend));
    +        }
    +        if (keyedAccumulationsToSend.Length()) {
    +          mozilla::Unused <<
    +            NS_WARN_IF(!contentChild->SendAccumulateChildKeyedHistogram(keyedAccumulationsToSend));
    +        }
    +      }
    +      break;
         }
    -    if (keyedAccumulationsToSend.Length()) {
    -      mozilla::Unused <<
    -        NS_WARN_IF(!contentChild->SendAccumulateChildKeyedHistogram(keyedAccumulationsToSend));
    +    case GeckoProcessType_GPU: {
    +      if (mozilla::gfx::GPUParent* gpu = mozilla::gfx::GPUParent::GetSingleton()) {
    +        if (accumulationsToSend.Length()) {
    +          mozilla::Unused << gpu->SendAccumulateChildHistogram(accumulationsToSend);
    +        }
    +        if (keyedAccumulationsToSend.Length()) {
    +          mozilla::Unused << gpu->SendAccumulateChildKeyedHistogram(keyedAccumulationsToSend);
    +        }
    +      }
    +      break;
         }
    +    default:
    +      MOZ_ASSERT_UNREACHABLE("Unsupported process type");
    +      break;
       }
     
       gIPCTimerArmed = false;
    
    From df46d270bd6a42d0a04e2f51b4bdec4ba05d2d68 Mon Sep 17 00:00:00 2001
    From: David Anderson 
    Date: Sun, 30 Oct 2016 22:35:57 -0700
    Subject: [PATCH 56/61] Add GPU process histograms to Telemetry pings. (bug
     1304494 part 4, r=gfritzsche)
    
    ---
     toolkit/components/telemetry/TelemetrySession.jsm | 11 +++++++++++
     1 file changed, 11 insertions(+)
    
    diff --git a/toolkit/components/telemetry/TelemetrySession.jsm b/toolkit/components/telemetry/TelemetrySession.jsm
    index 18acea27fa67..2268c913968c 100644
    --- a/toolkit/components/telemetry/TelemetrySession.jsm
    +++ b/toolkit/components/telemetry/TelemetrySession.jsm
    @@ -44,6 +44,7 @@ const REASON_SHUTDOWN = "shutdown";
     const HISTOGRAM_SUFFIXES = {
       PARENT: "",
       CONTENT: "#content",
    +  GPU: "#gpu",
     }
     
     const ENVIRONMENT_CHANGE_LISTENER = "TelemetrySession::onEnvironmentChange";
    @@ -1315,6 +1316,16 @@ var Impl = {
           },
         };
     
    +    // Only include the GPU process if we've accumulated data for it.
    +    if (HISTOGRAM_SUFFIXES.GPU in histograms ||
    +        HISTOGRAM_SUFFIXES.GPU in keyedHistograms)
    +    {
    +      payloadObj.processes.gpu = {
    +        histograms: histograms[HISTOGRAM_SUFFIXES.GPU],
    +        keyedHistograms: keyedHistograms[HISTOGRAM_SUFFIXES.GPU],
    +      };
    +    }
    +
         payloadObj.info = info;
     
         // Add extended set measurements for chrome process.
    
    From 31df59e394a2fa2a9130704185bdedab95924fed Mon Sep 17 00:00:00 2001
    From: Jan de Mooij 
    Date: Mon, 31 Oct 2016 10:05:13 +0100
    Subject: [PATCH 57/61] Bug 1311996 - Fix code using pkix::Result to not
     conflict with the new mozilla::Result type. r=keeler
    
    ---
     security/apps/AppSignatureVerification.cpp            |  5 +++--
     security/certverifier/CTSerialization.cpp             |  2 ++
     security/certverifier/CertVerifier.h                  |  2 ++
     security/certverifier/OCSPCache.cpp                   |  2 ++
     security/certverifier/OCSPVerificationTrustDomain.cpp |  4 ++++
     security/certverifier/OCSPVerificationTrustDomain.h   |  2 ++
     security/manager/ssl/ContentSignatureVerifier.cpp     |  2 +-
     security/manager/ssl/nsDataSignatureVerifier.cpp      | 11 ++++++-----
     security/manager/ssl/nsNSSCallbacks.cpp               | 10 +++++-----
     security/manager/ssl/tests/gtest/OCSPCacheTest.cpp    |  3 +--
     10 files changed, 28 insertions(+), 15 deletions(-)
    
    diff --git a/security/apps/AppSignatureVerification.cpp b/security/apps/AppSignatureVerification.cpp
    index 20f3f4823939..c728949dd619 100644
    --- a/security/apps/AppSignatureVerification.cpp
    +++ b/security/apps/AppSignatureVerification.cpp
    @@ -643,7 +643,8 @@ VerifyCertificate(CERTCertificate* signerCert, void* voidContext, void* pinArg)
         return MapSECStatus(SECFailure);
       }
       Input certDER;
    -  Result rv = certDER.Init(signerCert->derCert.data, signerCert->derCert.len);
    +  mozilla::pkix::Result rv = certDER.Init(signerCert->derCert.data,
    +                                          signerCert->derCert.len);
       if (rv != Success) {
         return mozilla::psm::GetXPCOMFromNSSError(MapResultToPRErrorCode(rv));
       }
    @@ -654,7 +655,7 @@ VerifyCertificate(CERTCertificate* signerCert, void* voidContext, void* pinArg)
                           KeyPurposeId::id_kp_codeSigning,
                           CertPolicyId::anyPolicy,
                           nullptr/*stapledOCSPResponse*/);
    -  if (rv == Result::ERROR_EXPIRED_CERTIFICATE) {
    +  if (rv == mozilla::pkix::Result::ERROR_EXPIRED_CERTIFICATE) {
         // For code-signing you normally need trusted 3rd-party timestamps to
         // handle expiration properly. The signer could always mess with their
         // system clock so you can't trust the certificate was un-expired when
    diff --git a/security/certverifier/CTSerialization.cpp b/security/certverifier/CTSerialization.cpp
    index bf79de4dcb85..c15d0303e8a2 100644
    --- a/security/certverifier/CTSerialization.cpp
    +++ b/security/certverifier/CTSerialization.cpp
    @@ -16,6 +16,8 @@ namespace mozilla { namespace ct {
     
     using namespace mozilla::pkix;
     
    +typedef mozilla::pkix::Result Result;
    +
     // Note: length is always specified in bytes.
     // Signed Certificate Timestamp (SCT) Version length
     static const size_t kVersionLength = 1;
    diff --git a/security/certverifier/CertVerifier.h b/security/certverifier/CertVerifier.h
    index b68a7409cc2d..de3aee28270c 100644
    --- a/security/certverifier/CertVerifier.h
    +++ b/security/certverifier/CertVerifier.h
    @@ -26,6 +26,8 @@ class MultiLogCTVerifier;
     
     namespace mozilla { namespace psm {
     
    +typedef mozilla::pkix::Result Result;
    +
     // These values correspond to the CERT_CHAIN_KEY_SIZE_STATUS telemetry.
     enum class KeySizeStatus {
       NeverChecked = 0,
    diff --git a/security/certverifier/OCSPCache.cpp b/security/certverifier/OCSPCache.cpp
    index 45ec589abe6d..c859e1a6074b 100644
    --- a/security/certverifier/OCSPCache.cpp
    +++ b/security/certverifier/OCSPCache.cpp
    @@ -38,6 +38,8 @@ using namespace mozilla::pkix;
     
     namespace mozilla { namespace psm {
     
    +typedef mozilla::pkix::Result Result;
    +
     static SECStatus
     DigestLength(UniquePK11Context& context, uint32_t length)
     {
    diff --git a/security/certverifier/OCSPVerificationTrustDomain.cpp b/security/certverifier/OCSPVerificationTrustDomain.cpp
    index b610690d2ed1..fa018458c75a 100644
    --- a/security/certverifier/OCSPVerificationTrustDomain.cpp
    +++ b/security/certverifier/OCSPVerificationTrustDomain.cpp
    @@ -9,6 +9,8 @@
     using namespace mozilla;
     using namespace mozilla::pkix;
     
    +namespace mozilla { namespace psm {
    +
     OCSPVerificationTrustDomain::OCSPVerificationTrustDomain(
       NSSCertDBTrustDomain& certDBTrustDomain)
       : mCertDBTrustDomain(certDBTrustDomain)
    @@ -122,3 +124,5 @@ OCSPVerificationTrustDomain::DigestBuf(
     {
       return mCertDBTrustDomain.DigestBuf(item, digestAlg, digestBuf, digestBufLen);
     }
    +
    +} } // namespace mozilla::psm
    diff --git a/security/certverifier/OCSPVerificationTrustDomain.h b/security/certverifier/OCSPVerificationTrustDomain.h
    index c32dbe41b2d9..bf25e3804e65 100644
    --- a/security/certverifier/OCSPVerificationTrustDomain.h
    +++ b/security/certverifier/OCSPVerificationTrustDomain.h
    @@ -12,6 +12,8 @@
     
     namespace mozilla { namespace psm {
     
    +typedef mozilla::pkix::Result Result;
    +
     class OCSPVerificationTrustDomain : public mozilla::pkix::TrustDomain
     {
     public:
    diff --git a/security/manager/ssl/ContentSignatureVerifier.cpp b/security/manager/ssl/ContentSignatureVerifier.cpp
    index fcea0d17b4a4..22d041166759 100644
    --- a/security/manager/ssl/ContentSignatureVerifier.cpp
    +++ b/security/manager/ssl/ContentSignatureVerifier.cpp
    @@ -164,7 +164,7 @@ ContentSignatureVerifier::CreateContextInternal(const nsACString& aData,
       SECItem* certSecItem = &node->cert->derCert;
     
       Input certDER;
    -  Result result =
    +  mozilla::pkix::Result result =
         certDER.Init(BitwiseCast(certSecItem->data),
                      certSecItem->len);
       if (result != Success) {
    diff --git a/security/manager/ssl/nsDataSignatureVerifier.cpp b/security/manager/ssl/nsDataSignatureVerifier.cpp
    index 48cfa23eb276..7f2ae93e5b61 100644
    --- a/security/manager/ssl/nsDataSignatureVerifier.cpp
    +++ b/security/manager/ssl/nsDataSignatureVerifier.cpp
    @@ -257,11 +257,12 @@ VerifyCertificate(CERTCertificate* cert, void* voidContext, void* pinArg)
       RefPtr certVerifier(GetDefaultCertVerifier());
       NS_ENSURE_TRUE(certVerifier, NS_ERROR_UNEXPECTED);
     
    -  Result result = certVerifier->VerifyCert(cert,
    -                                           certificateUsageObjectSigner,
    -                                           Now(), pinArg,
    -                                           nullptr, // hostname
    -                                           context->builtChain);
    +  mozilla::pkix::Result result =
    +    certVerifier->VerifyCert(cert,
    +                             certificateUsageObjectSigner,
    +                             Now(), pinArg,
    +                             nullptr, // hostname
    +                             context->builtChain);
       if (result != Success) {
         return GetXPCOMFromNSSError(MapResultToPRErrorCode(result));
       }
    diff --git a/security/manager/ssl/nsNSSCallbacks.cpp b/security/manager/ssl/nsNSSCallbacks.cpp
    index c7f7b39fd4b1..13c0d3f4c3ee 100644
    --- a/security/manager/ssl/nsNSSCallbacks.cpp
    +++ b/security/manager/ssl/nsNSSCallbacks.cpp
    @@ -189,7 +189,7 @@ struct nsCancelHTTPDownloadEvent : Runnable {
       }
     };
     
    -Result
    +mozilla::pkix::Result
     nsNSSHttpServerSession::createSessionFcn(const char* host,
                                              uint16_t portnum,
                                      /*out*/ nsNSSHttpServerSession** pSession)
    @@ -210,7 +210,7 @@ nsNSSHttpServerSession::createSessionFcn(const char* host,
       return Success;
     }
     
    -Result
    +mozilla::pkix::Result
     nsNSSHttpRequestSession::createFcn(const nsNSSHttpServerSession* session,
                                        const char* http_protocol_variant,
                                        const char* path_and_query_string,
    @@ -250,7 +250,7 @@ nsNSSHttpRequestSession::createFcn(const nsNSSHttpServerSession* session,
       return Success;
     }
     
    -Result
    +mozilla::pkix::Result
     nsNSSHttpRequestSession::setPostDataFcn(const char* http_data,
                                             const uint32_t http_data_len,
                                             const char* http_content_type)
    @@ -262,7 +262,7 @@ nsNSSHttpRequestSession::setPostDataFcn(const char* http_data,
       return Success;
     }
     
    -Result
    +mozilla::pkix::Result
     nsNSSHttpRequestSession::trySendAndReceiveFcn(PRPollDesc** pPollDesc,
                                                   uint16_t* http_response_code,
                                                   const char** http_response_content_type,
    @@ -353,7 +353,7 @@ nsNSSHttpRequestSession::Release()
       }
     }
     
    -Result
    +mozilla::pkix::Result
     nsNSSHttpRequestSession::internal_send_receive_attempt(bool &retryable_error,
                                                            PRPollDesc **pPollDesc,
                                                            uint16_t *http_response_code,
    diff --git a/security/manager/ssl/tests/gtest/OCSPCacheTest.cpp b/security/manager/ssl/tests/gtest/OCSPCacheTest.cpp
    index 05076fe09d21..9cdd4da25d76 100644
    --- a/security/manager/ssl/tests/gtest/OCSPCacheTest.cpp
    +++ b/security/manager/ssl/tests/gtest/OCSPCacheTest.cpp
    @@ -17,7 +17,6 @@
     
     using namespace mozilla::pkix;
     using namespace mozilla::pkix::test;
    -using namespace mozilla::psm;
     
     template 
     inline Input
    @@ -46,7 +45,7 @@ protected:
     };
     
     static void
    -PutAndGet(OCSPCache& cache, const CertID& certID, Result result,
    +PutAndGet(mozilla::psm::OCSPCache& cache, const CertID& certID, Result result,
               Time time, const char* firstPartyDomain = nullptr)
     {
       // The first time is thisUpdate. The second is validUntil.
    
    From fc603eada8cef306e8ab7a02a1ac337674848d86 Mon Sep 17 00:00:00 2001
    From: Sebastian Hengst 
    Date: Mon, 31 Oct 2016 10:18:56 +0100
    Subject: [PATCH 58/61] Backed out changeset 9b5b04d1a15a (bug 1313518) for
     failing gl tests test_conformance__textures__misc__texture-npot-video.html
     and test_2_conformance__textures__video__tex-2d-rgb-rgb-unsigned_byte.html,
     and dom/media/test/test_bug879717.html. r=backout
    
    ---
     gfx/layers/MacIOSurfaceHelpers.cpp | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gfx/layers/MacIOSurfaceHelpers.cpp b/gfx/layers/MacIOSurfaceHelpers.cpp
    index 46a5a203b4bb..8e4554bc22d7 100644
    --- a/gfx/layers/MacIOSurfaceHelpers.cpp
    +++ b/gfx/layers/MacIOSurfaceHelpers.cpp
    @@ -89,7 +89,7 @@ CreateSourceSurfaceFromLockedMacIOSurface(MacIOSurface* aSurface)
         libyuv::ConvertToARGB((uint8_t*)aSurface->GetBaseAddress(), 0 /* not used */,
                               mappedSurface.mData, mappedSurface.mStride,
                               0, 0,
    -                          ALIGNED_32(size.width), size.height,
    +                          size.width, size.height,
                               size.width, size.height,
                               libyuv::kRotate0, libyuv::FOURCC_UYVY);
       } else {
    
    From cd6a7d7a594af8ef20a40a02388ae06c950a5730 Mon Sep 17 00:00:00 2001
    From: ffxbld 
    Date: Mon, 31 Oct 2016 06:17:00 -0700
    Subject: [PATCH 59/61] No bug, Automated HSTS preload list update from host
     bld-linux64-spot-1051 - a=hsts-update
    
    ---
     security/manager/ssl/nsSTSPreloadList.errors |   166 +-
     security/manager/ssl/nsSTSPreloadList.inc    | 24602 ++++++++---------
     2 files changed, 12373 insertions(+), 12395 deletions(-)
    
    diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors
    index 0005e4ec2576..02e0d7817d33 100644
    --- a/security/manager/ssl/nsSTSPreloadList.errors
    +++ b/security/manager/ssl/nsSTSPreloadList.errors
    @@ -48,9 +48,6 @@
     9point6.com: could not connect to host
     a-plus.space: could not connect to host
     a9c.co: could not connect to host
    -aaeblog.com: could not connect to host
    -aaeblog.net: could not connect to host
    -aaeblog.org: could not connect to host
     aapp.space: could not connect to host
     aaronkimmig.de: could not connect to host
     abearofsoap.com: did not receive HSTS header
    @@ -114,6 +111,7 @@ aircomms.com: did not receive HSTS header
     aishnair.com: could not connect to host
     aiticon.de: did not receive HSTS header
     aiw-thkoeln.online: could not connect to host
    +ajmahal.com: could not connect to host
     akclinics.org: did not receive HSTS header
     akselimedia.fi: did not receive HSTS header
     akutun.cl: did not receive HSTS header
    @@ -131,7 +129,10 @@ alessandro.pw: did not receive HSTS header
     alethearose.com: did not receive HSTS header
     alexandre.sh: did not receive HSTS header
     alexisabarca.com: did not receive HSTS header
    +alexmerkel.me: could not connect to host
     alfredxing.com: did not receive HSTS header
    +alienstat.com: did not receive HSTS header
    +aljaspod.net: could not connect to host
     alkami.com: did not receive HSTS header
     all-subtitles.com: did not receive HSTS header
     allforyou.at: could not connect to host
    @@ -141,7 +142,6 @@ alpha.irccloud.com: could not connect to host
     alphabit-secure.com: could not connect to host
     alphabuild.io: did not receive HSTS header
     alphalabs.xyz: could not connect to host
    -alterbaum.net: did not receive HSTS header
     altfire.ca: could not connect to host
     altmv.com: max-age too low: 7776000
     am3.se: could not connect to host
    @@ -155,6 +155,7 @@ amilx.org: could not connect to host
     amitube.com: could not connect to host
     amri.nl: did not receive HSTS header
     anakros.me: did not receive HSTS header
    +analytic-s.ml: did not receive HSTS header
     anarchistischegroepnijmegen.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 121"  data: no]
     anassiriphotography.com: could not connect to host
     ancientkarma.com: could not connect to host
    @@ -162,10 +163,10 @@ andere-gedanken.net: max-age too low: 10
     andreasbreitenlohner.de: did not receive HSTS header
     andreasolsson.se: could not connect to host
     andreigec.net: could not connect to host
    -andrewimeson.com: could not connect to host
     andrewmichaud.beer: could not connect to host
     andreypopp.com: could not connect to host
     androoz.se: did not receive HSTS header
    +andsat.org: could not connect to host
     andymartin.cc: did not receive HSTS header
     anfsanchezo.me: could not connect to host
     anghami.com: did not receive HSTS header
    @@ -220,6 +221,7 @@ arlen.se: could not connect to host
     armory.consulting: could not connect to host
     armory.supplies: could not connect to host
     armytricka.cz: did not receive HSTS header
    +arne-petersen.net: could not connect to host
     arrayify.com: could not connect to host
     ars-design.net: could not connect to host
     ars.toscana.it: max-age too low: 0
    @@ -238,11 +240,13 @@ astrolpost.com: could not connect to host
     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
     athenelive.com: could not connect to host
     athul.xyz: did not receive HSTS header
     atlex.nl: did not receive HSTS header
     atomik.pro: could not connect to host
     atop.io: could not connect to host
    +attilagyorffy.com: could not connect to host
     attimidesigns.com: did not receive HSTS header
     au.search.yahoo.com: max-age too low: 172800
     aubiosales.com: did not receive HSTS header
    @@ -268,8 +272,8 @@ awg-mode.de: did not receive HSTS header
     axado.com.br: did not receive HSTS header
     axeny.com: did not receive HSTS header
     az.search.yahoo.com: did not receive HSTS header
    +azazy.net: could not connect to host
     azprep.us: could not connect to host
    -azuxul.fr: could not connect to host
     b3orion.com: max-age too low: 0
     babak.de: did not receive HSTS header
     babelfisch.eu: could not connect to host
    @@ -279,7 +283,6 @@ babyhouse.xyz: could not connect to host
     babysaying.me: could not connect to host
     back-bone.nl: did not receive HSTS header
     badcronjob.com: could not connect to host
    -badhusky.com: could not connect to host
     baff.lu: did not receive HSTS header
     baiduaccount.com: could not connect to host
     bakkerdesignandbuild.com: did not receive HSTS header
    @@ -296,7 +299,6 @@ bazarstupava.sk: did not receive HSTS header
     bbb1991.me: could not connect to host
     bcbsmagentprofile.com: could not connect to host
     bccx.com: could not connect to host
    -bcheng.cf: could not connect to host
     bckp.de: could not connect to host
     bcm.com.au: max-age too low: 0
     bcnx.de: max-age too low: 0
    @@ -317,6 +319,7 @@ belairsewvac.com: did not receive HSTS header
     belics.com: did not receive HSTS header
     belliash.eu.org: could not connect to host
     belltower.io: could not connect to host
    +belwederczykow.eu: could not connect to host
     beneffy.com: did not receive HSTS header
     benk.press: could not connect to host
     benny003.de: did not receive HSTS header
    @@ -408,6 +411,7 @@ boosterlearnpro.com: did not receive HSTS header
     bootjp.me: did not receive HSTS header
     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
     bouwbedrijfpurmerend.nl: did not receive HSTS header
     bowlroll.net: max-age too low: 0
    @@ -415,6 +419,7 @@ boxcryptor.com: did not receive HSTS header
     br3in.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 121"  data: no]
     braineet.com: did not receive HSTS header
     brainfork.ml: could not connect to host
    +brainlag.org: could not connect to host
     braintreegateway.com: did not receive HSTS header
     braintreepayments.com: did not receive HSTS header
     brainvation.de: did not receive HSTS header
    @@ -450,7 +455,7 @@ business.lookout.com: could not connect to host
     businesshosting.nl: did not receive HSTS header
     busold.ws: could not connect to host
     bustimes.org: could not connect to host
    -butchersworkshop.com: did not receive HSTS header
    +butchersworkshop.com: could not connect to host
     buttercoin.com: could not connect to host
     buybaby.eu: did not receive HSTS header
     buyfox.de: did not receive HSTS header
    @@ -467,7 +472,7 @@ cabarave.com: could not connect to host
     cabusar.fr: could not connect to host
     caconnect.org: could not connect to host
     cadao.me: did not receive HSTS header
    -cadusilva.com: did not receive HSTS header
    +cadusilva.com: could not connect to host
     cafe-scientifique.org.ec: could not connect to host
     caim.cz: did not receive HSTS header
     caizx.com: did not receive HSTS header
    @@ -475,6 +480,7 @@ cajapopcorn.com: did not receive HSTS header
     cake.care: could not connect to host
     calgaryconstructionjobs.com: could not connect to host
     calix.com: max-age too low: 0
    +call.me: did not receive HSTS header
     calltrackingreports.com: could not connect to host
     calvin.me: max-age too low: 2592000
     calvinallen.net: could not connect to host
    @@ -510,7 +516,7 @@ cd.search.yahoo.com: did not receive HSTS header
     cd0.us: could not connect to host
     cdnb.co: could not connect to host
     cdndepo.com: could not connect to host
    -cdreporting.co.uk: did not receive HSTS header
    +cdreporting.co.uk: could not connect to host
     cejhon.cz: could not connect to host
     ceml.ch: did not receive HSTS header
     centralvacsunlimited.net: did not receive HSTS header
    @@ -528,12 +534,11 @@ championsofregnum.com: did not receive HSTS header
     changelab.cc: max-age too low: 0
     chaos.fail: did not receive HSTS header
     chargejuice.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 121"  data: no]
    -charmyadesara.com: did not receive HSTS header
    +charmyadesara.com: could not connect to host
     charnleyhouse.co.uk: max-age too low: 604800
     chartpen.com: did not receive HSTS header
     chartstoffarm.de: max-age too low: 10
     chatbot.me: did not receive HSTS header
    -chateau-belvoir.com: did not receive HSTS header
     chateauconstellation.ch: did not receive HSTS header
     chatup.cf: could not connect to host
     chaulootz.com: could not connect to host
    @@ -551,6 +556,7 @@ chirgui.eu: could not connect to host
     chiru.no: could not connect to host
     chm.vn: did not receive HSTS header
     chontalpa.pw: could not connect to host
    +chorpinkpoemps.de: could not connect to host
     chotu.net: could not connect to host
     chris-web.info: could not connect to host
     chriskyrouac.com: could not connect to host
    @@ -564,6 +570,7 @@ chrome.google.com: did not receive HSTS header (error ignored - included regardl
     chroniclesofgeorge.com: did not receive HSTS header
     chua.cf: could not connect to host
     cidr.ml: could not connect to host
    +cigarblogs.net: could not connect to host
     cip.md: did not receive HSTS header
     ciplanutrition.com: did not receive HSTS header
     citiagent.cz: could not connect to host
    @@ -618,6 +625,7 @@ coffeestrategies.com: max-age too low: 2592000
     coiffeurschnittstelle.ch: did not receive HSTS header
     coindam.com: could not connect to host
     colisfrais.com: did not receive HSTS header
    +collada.org: could not connect to host
     collies.eu: did not receive HSTS header
     collins.kg: did not receive HSTS header
     colmexpro.com: max-age too low: 2592000
    @@ -631,7 +639,7 @@ compalytics.com: could not connect to host
     completionist.audio: could not connect to host
     computeremergency.com.au: did not receive HSTS header
     concord-group.co.jp: did not receive HSTS header
    -condesaelectronics.com: could not connect to host
    +condesaelectronics.com: max-age too low: 0
     confirm365.com: could not connect to host
     conformal.com: could not connect to host
     consciousandglamorous.com: could not connect to host
    @@ -676,7 +684,6 @@ crestoncottage.com: could not connect to host
     criena.net: could not connect to host
     crizk.com: could not connect to host
     crosssec.com: did not receive HSTS header
    -crow.tw: could not connect to host
     crowd.supply: could not connect to host
     crowdcurity.com: did not receive HSTS header
     crowdjuris.com: could not connect to host
    @@ -686,8 +693,9 @@ crypt.guru: could not connect to host
     cryptify.eu: did not receive HSTS header
     cryptobells.com: did not receive HSTS header
     cryptobin.org: could not connect to host
    -cryptoisnotacrime.org: could not connect to host
     cryptojar.io: did not receive HSTS header
    +cryptolab.pro: could not connect to host
    +cryptolab.tk: could not connect to host
     cryptoparty.dk: did not receive HSTS header
     crysadm.com: max-age too low: 1
     crystalchandelierservices.com: could not connect to host
    @@ -735,6 +743,7 @@ dark-x.cf: could not connect to host
     darkengine.io: could not connect to host
     darkhole.cn: could not connect to host
     darknebula.space: could not connect to host
    +darknode.in: could not connect to host
     dashburst.com: did not receive HSTS header
     dashnimorad.com: could not connect to host
     data-abundance.com: could not connect to host
    @@ -757,7 +766,6 @@ dbx.ovh: did not receive HSTS header
     dccode.gov: could not connect to host
     dcurt.is: did not receive HSTS header
     dden.ca: could not connect to host
    -deaktualisierung.org: did not receive HSTS header
     debank.tv: did not receive HSTS header
     debtkit.co.uk: did not receive HSTS header
     decafu.co: could not connect to host
    @@ -765,7 +773,6 @@ decibelios.li: could not connect to host
     deco.me: could not connect to host
     dedicatutiempo.es: could not connect to host
     deepcovelabs.net: could not connect to host
    -deepserve.info: could not connect to host
     degroetenvanrosaline.nl: did not receive HSTS header
     deight.co: could not connect to host
     dekasan.ru: could not connect to host
    @@ -785,7 +792,6 @@ dequehablamos.es: could not connect to host
     derevtsov.com: did not receive HSTS header
     derwolfe.net: did not receive HSTS header
     desiccantpackets.com: did not receive HSTS header
    -designed-cybersecurity.com: could not connect to host
     destinationbijoux.fr: could not connect to host
     detector.exposed: could not connect to host
     detutorial.com: max-age too low: 0
    @@ -835,6 +841,7 @@ dominique-mueller.de: did not receive HSTS header
     donzelot.co.uk: max-age too low: 3600
     doomleika.com: could not connect to host
     dopost.it: could not connect to host
    +dorianmuthig.com: could not connect to host
     doridian.com: could not connect to host
     doridian.de: could not connect to host
     doridian.net: did not receive HSTS header
    @@ -906,6 +913,7 @@ egit.co: could not connect to host
     ego-world.org: could not connect to host
     ehrenamt-skpfcw.de: could not connect to host
     eicfood.com: could not connect to host
    +einaros.is: could not connect to host
     elaintehtaat.fi: did not receive HSTS header
     elanguest.pl: could not connect to host
     electricianforum.co.uk: could not connect to host
    @@ -933,6 +941,7 @@ encoder.pw: could not connect to host
     encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
     endzeit-architekten.com: did not receive HSTS header
     engelwerbung.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 121"  data: no]
    +englishforums.com: could not connect to host
     enigmail.net: did not receive HSTS header
     enteente.club: could not connect to host
     enteente.space: could not connect to host
    @@ -962,8 +971,9 @@ erotische-aanbiedingen.nl: could not connect to host
     errlytics.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 121"  data: no]
     errolz.com: could not connect to host
     errors.zenpayroll.com: could not connect to host
    +eru.me: could not connect to host
     esclear.de: did not receive HSTS header
    -escotour.com: could not connect to host
    +escotour.com: did not receive HSTS header
     esec.rs: did not receive HSTS header
     espra.com: could not connect to host
     essexcosmeticdentists.co.uk: did not receive HSTS header
    @@ -985,9 +995,9 @@ euroshop24.net: could not connect to host
     evantage.org: could not connect to host
     evdenevenakliyatankara.pw: could not connect to host
     everybooks.com: max-age too low: 60
    +everylab.org: could not connect to host
     evi.be: did not receive HSTS header
     evin.ml: could not connect to host
    -evites.me: could not connect to host
     evomon.com: could not connect to host
     evossd.tk: could not connect to host
     exceltobarcode.com: did not receive HSTS header
    @@ -995,7 +1005,6 @@ exfiles.cz: did not receive HSTS header
     exgravitus.com: could not connect to host
     exitus.jp: max-age too low: 0
     exno.co: could not connect to host
    -exousiakaidunamis.xyz: did not receive HSTS header
     expertmile.com: did not receive HSTS header
     expoundite.net: did not receive HSTS header
     expressfinance.co.za: did not receive HSTS header
    @@ -1020,6 +1029,7 @@ fail4free.de: did not receive HSTS header
     fairlyoddtreasures.com: did not receive HSTS header
     faizan.net: did not receive HSTS header
     faizan.xyz: could not connect to host
    +fakeletters.org: did not receive HSTS header
     falconfrag.com: could not connect to host
     falkena.net: max-age too low: 5184000
     falkp.no: did not receive HSTS header
    @@ -1067,7 +1077,7 @@ fish2.me: did not receive HSTS header
     fit4medien.de: did not receive HSTS header
     fitnesswerk.de: could not connect to host
     fivestarsitters.com: did not receive HSTS header
    -fixatom.com: max-age too low: 604800
    +fixatom.com: did not receive HSTS header
     fixingdns.com: did not receive HSTS header
     fj.search.yahoo.com: did not receive HSTS header
     flags.ninja: could not connect to host
    @@ -1102,6 +1112,7 @@ fotiu.com: could not connect to host
     fotm.net: did not receive HSTS header
     fotografosexpertos.com: did not receive HSTS header
     fotopasja.info: could not connect to host
    +fourchin.net: could not connect to host
     foxdev.io: could not connect to host
     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 121"  data: no]
     foxtrot.pw: could not connect to host
    @@ -1149,6 +1160,7 @@ gafachi.com: could not connect to host
     gakkainavi4.com: could not connect to host
     galenskap.eu: did not receive HSTS header
     gallery44.org: did not receive HSTS header
    +galoisvpn.xyz: could not connect to host
     gamecave.de: could not connect to host
     gamechasm.com: could not connect to host
     gamehacks.me: could not connect to host
    @@ -1168,7 +1180,6 @@ geli-graphics.com: did not receive HSTS header
     gem-indonesia.net: could not connect to host
     genuu.com: could not connect to host
     genuxation.com: could not connect to host
    -genuxtsg.com: could not connect to host
     genyaa.com: could not connect to host
     gerencianet.com.br: did not receive HSTS header
     get.zenpayroll.com: did not receive HSTS header
    @@ -1187,8 +1198,10 @@ gfhgiro.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
     gfm.tech: could not connect to host
     gfournier.ca: could not connect to host
     gfwsb.ml: could not connect to host
    +ggx.us: could not connect to host
     gheorghesarcov.ga: could not connect to host
     gheorghesarcov.tk: could not connect to host
    +ghostblog.info: could not connect to host
     giakki.eu: could not connect to host
     gigacloud.org: did not receive HSTS header
     gilgaz.com: did not receive HSTS header
    @@ -1234,7 +1247,6 @@ goodwin43.ru: did not receive HSTS header
     google: could not connect to host (error ignored - included regardless)
     googlemail.com: did not receive HSTS header (error ignored - included regardless)
     googleplex.com: could not connect to host (error ignored - included regardless)
    -goolok.com: did not receive HSTS header
     gorilla-gym.site: could not connect to host
     goto.google.com: did not receive HSTS header (error ignored - included regardless)
     gottcode.org: did not receive HSTS header
    @@ -1260,7 +1272,6 @@ grunex.com: did not receive HSTS header
     gryffin.ga: could not connect to host
     gryffin.ml: could not connect to host
     gryffin.tk: could not connect to host
    -gs-net.at: could not connect to host
     gsm-map.com: could not connect to host
     gtanda.tk: could not connect to host
     gtlfsonlinepay.com: did not receive HSTS header
    @@ -1338,6 +1349,7 @@ helpmebuild.com: did not receive HSTS header
     hemdal.se: could not connect to host
     hencagon.com: could not connect to host
     henriknoerr.com: could not connect to host
    +hepteract.us: could not connect to host
     hermes-net.de: did not receive HSTS header
     herpaderp.net: did not receive HSTS header
     herzbotschaft.de: did not receive HSTS header
    @@ -1396,7 +1408,6 @@ humblefinances.com: could not connect to host
     humeurs.net: could not connect to host
     humpteedumptee.in: did not receive HSTS header
     hurricanelabs.com: did not receive HSTS header
    -huskyinc.us: could not connect to host
     hydra.ws: could not connect to host
     hyper69.com: did not receive HSTS header
     i-jp.net: could not connect to host
    @@ -1424,6 +1435,7 @@ ies-italia.it: did not receive HSTS header
     ies.id.lv: could not connect to host
     ifad.org: did not receive HSTS header
     ifleurs.com: could not connect to host
    +ifoss.me: could not connect to host
     ignatisd.gr: did not receive HSTS header
     igule.net: could not connect to host
     ihrlotto.de: could not connect to host
    @@ -1519,6 +1531,7 @@ iskaz.rs: did not receive HSTS header
     isogram.nl: could not connect to host
     ispire.me: max-age too low: 0
     istaspirtslietas.lv: did not receive HSTS header
    +istorrent.is: could not connect to host
     it-go.net: did not receive HSTS header
     itechgeek.com: max-age too low: 0
     itfh.eu: could not connect to host
    @@ -1541,7 +1554,7 @@ jabber.at: could not connect to host
     jackalworks.com: could not connect to host
     jacobparry.ca: did not receive HSTS header
     jahliveradio.com: could not connect to host
    -jakenbake.com: could not connect to host
    +jakenbake.com: did not receive HSTS header
     jakubtopic.cz: could not connect to host
     jamesbradach.com: did not receive HSTS header
     jamesburton.london: could not connect to host
    @@ -1563,10 +1576,11 @@ jaredeberle.org: did not receive HSTS header
     jaroslavtrsek.cz: did not receive HSTS header
     jartza.org: could not connect to host
     jasmineconseil.com: did not receive HSTS header
    -jasonrobinson.me: [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 121"  data: no]
    +jasonrobinson.me: could not connect to host
     jasonroe.me: did not receive HSTS header
     jastoria.pl: did not receive HSTS header
     jayblock.com: did not receive HSTS header
    +jayharris.ca: could not connect to host
     jayscoaching.com: could not connect to host
     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 121"  data: no]
     jbbd.fr: could not connect to host
    @@ -1574,6 +1588,7 @@ jbfp.dk: could not connect to host
     jbn.mx: could not connect to host
     jcch.de: could not connect to host
     jcor.me: could not connect to host
    +jcoscia.com: could not connect to host
     jctf.io: could not connect to host
     jeff393.com: could not connect to host
     jenjoit.de: could not connect to host
    @@ -1599,13 +1614,14 @@ jkbuster.com: could not connect to host
     jmdekker.it: could not connect to host
     joakimalgroy.com: could not connect to host
     jobmedic.com: did not receive HSTS header
    +jodyboucher.com: did not receive HSTS header
     joedavison.me: could not connect to host
    -jogi-server.de: could not connect to host
     johnbrownphotography.ch: did not receive HSTS header
     johners.me: could not connect to host
     johners.tech: did not receive HSTS header
     johnrom.com: did not receive HSTS header
     jonas-keidel.de: did not receive HSTS header
    +jonas-thelemann.de: could not connect to host
     jonasgroth.se: max-age too low: 2592000
     jonathan.ir: could not connect to host
     jonathancarter.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 121"  data: no]
    @@ -1625,7 +1641,7 @@ jsanders.us: did not receive HSTS header
     jualautoclave.com: did not receive HSTS header
     jualssh.com: could not connect to host
     juliamweber.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 121"  data: no]
    -julian-kipka.de: could not connect to host
    +julian-kipka.de: did not receive HSTS header
     jumbox.xyz: could not connect to host
     junaos.xyz: did not receive HSTS header
     junge-selbsthilfe.info: could not connect to host
    @@ -1646,7 +1662,6 @@ kahopoon.net: could not connect to host
     kaisers.de: did not receive HSTS header
     kalami.nl: did not receive HSTS header
     kamikano.com: could not connect to host
    -kanehusky.com: could not connect to host
     kaplatz.is: could not connect to host
     kapucini.si: max-age too low: 0
     karaoketonight.com: could not connect to host
    @@ -1671,6 +1686,7 @@ kerksanders.nl: did not receive HSTS header
     kermadec.net: could not connect to host
     kernl.us: did not receive HSTS header
     kevinapease.com: could not connect to host
    +keycdn.com: did not receive HSTS header
     keymaster.lookout.com: did not receive HSTS header
     kg-rating.com: did not receive HSTS header
     kgxtech.com: max-age too low: 2592000
    @@ -1680,7 +1696,6 @@ kiel-media.de: did not receive HSTS header
     kimpost.org: could not connect to host
     kinderwagen-test24.de: could not connect to host
     kingmanhall.org: could not connect to host
    -kini24.ru: could not connect to host
     kinnon.enterprises: could not connect to host
     kinogb.net: max-age too low: 0
     kionetworks.com: did not receive HSTS header
    @@ -1689,6 +1704,7 @@ kirkforsenate.com: did not receive HSTS header
     kirkpatrickdavis.com: could not connect to host
     kissart.net: did not receive HSTS header
     kisun.co.jp: did not receive HSTS header
    +kita.id: 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 121"  data: no]
     kitk.at: could not connect to host
    @@ -1738,6 +1754,7 @@ kurehun.org: could not connect to host
     kurz.pw: did not receive HSTS header
     kusaka-abacus.jp: max-age too low: 0
     kuschku.de: did not receive HSTS header
    +kwbresidential.com: could not connect to host
     kweddingplanning.com: did not receive HSTS header
     kwok.tv: did not receive HSTS header
     kyanite.co: could not connect to host
    @@ -1764,14 +1781,14 @@ langhun.me: did not receive HSTS header
     laobox.fr: did not receive HSTS header
     laozhu.me: could not connect to host
     laserfuchs.de: did not receive HSTS header
    -lask.in: could not connect to host
    +lask.in: did not receive HSTS header
     latinred.com: did not receive HSTS header
    +latitude42technology.com: did not receive HSTS header
     latus.xyz: could not connect to host
     lauftrainer-ausbildung.com: did not receive HSTS header
     lavval.com: could not connect to host
     laxatus.com: did not receive HSTS header
     laxiongames.es: could not connect to host
    -laylo.nl: did not receive HSTS header
     lbrt.xyz: could not connect to host
     ldarby.me.uk: could not connect to host
     leadership9.com: could not connect to host
    @@ -1779,6 +1796,7 @@ leardev.de: did not receive HSTS header
     learnfrenchfluently.com: did not receive HSTS header
     learningorder.com: could not connect to host
     ledgerscope.net: could not connect to host
    +leermotorrijden.nl: could not connect to host
     legarage.org: did not receive HSTS header
     leinir.dk: max-age too low: 86400
     leitner.com.au: did not receive HSTS header
    @@ -1796,8 +1814,10 @@ 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 121"  data: no]
     lepont.pl: could not connect to host
     lerner.moscow: did not receive HSTS header
    +lerp.me: could not connect to host
     les-corsaires.net: could not connect to host
     lesdouceursdeliyana.com: could not connect to host
    +let-go.cc: did not receive HSTS header
     letras.mus.br: did not receive HSTS header
     letustravel.tk: could not connect to host
     lfullerdesign.com: did not receive HSTS header
    @@ -1885,9 +1905,7 @@ lustrumxi.nl: could not connect to host
     luxus-russen.de: did not receive HSTS header
     luxwatch.com: could not connect to host
     lv.search.yahoo.com: did not receive HSTS header
    -lwl.moe: could not connect to host
     lzkill.com: did not receive HSTS header
    -lzzr.me: could not connect to host
     m-ali.xyz: did not receive HSTS header
     m.gparent.org: could not connect to host
     m3-gmbh.de: did not receive HSTS header
    @@ -1897,12 +1915,12 @@ maartenvandekamp.nl: did not receive HSTS header
     macbolo.com: could not connect to host
     macchaberrycream.com: could not connect to host
     macchedil.com: did not receive HSTS header
    -machon.biz: could not connect to host
    +mach-politik.ch: could not connect to host
     macker.io: could not connect to host
     madars.org: did not receive HSTS header
     maddin.ga: could not connect to host
     madebymagnitude.com: did not receive HSTS header
    -maderwin.com: did not receive HSTS header
    +maderwin.com: could not connect to host
     madusecurity.com: could not connect to host
     mafamane.com: could not connect to host
     mafiareturns.com: max-age too low: 2592000
    @@ -1911,7 +1929,6 @@ mahamed91.pw: 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
    -mainlywrenches.co: could not connect to host
     makeitdynamic.com: could not connect to host
     makerstuff.net: did not receive HSTS header
     malerversand.de: did not receive HSTS header
    @@ -1928,7 +1945,6 @@ marchagen.nl: did not receive HSTS header
     marcontrol.com: did not receive HSTS header
     marcuskoh.com: could not connect to host
     marie-curie.fr: could not connect to host
    -marinazarza.es: could not connect to host
     markaconnor.com: could not connect to host
     markayapilandirma.com: did not receive HSTS header
     markepps.com: could not connect to host
    @@ -1973,7 +1989,7 @@ media-courses.com: did not receive HSTS header
     mediacru.sh: could not connect to host
     mediastorm.us: could not connect to host
     mediawikicn.org: could not connect to host
    -medwayindia.com: did not receive HSTS header
    +medwayindia.com: could not connect to host
     meetings2.com: did not receive HSTS header
     meetscompany.jp: did not receive HSTS header
     megashur.se: did not receive HSTS header
    @@ -2007,6 +2023,7 @@ mia.to: could not connect to host
     michaelfitzpatrickruth.com: could not connect to host
     michal-kral.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 121"  data: no]
     michalborka.cz: could not connect to host
    +michalwiglasz.cz: could not connect to host
     micro-dv.ru: could not connect to host
     micro-rain-systems.com: did not receive HSTS header
     microme.ga: could not connect to host
    @@ -2101,7 +2118,7 @@ mtcgf.com: did not receive HSTS header
     mtg-esport.de: did not receive HSTS header
     mu.search.yahoo.com: did not receive HSTS header
     mudcrab.us: did not receive HSTS header
    -munich-rage.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 121"  data: no]
    +munich-rage.de: could not connect to host
     munzee.com: did not receive HSTS header
     muriburi.land: could not connect to host
     muriburiland.com: could not connect to host
    @@ -2146,8 +2163,6 @@ nanogeneinc.com: could not connect to host
     nargileh.nl: could not connect to host
     natalia.io: could not connect to host
     natalt.org: did not receive HSTS header
    -natenom.com: could not connect to host
    -natenom.name: could not connect to host
     nathanmfarrugia.com: did not receive HSTS header
     naturesystems.cz: max-age too low: 0
     natuurbehangnederland.nl: could not connect to host
    @@ -2201,7 +2216,7 @@ nicestresser.fr: could not connect to host
     nicky.io: did not receive HSTS header
     nicolasbettag.me: did not receive HSTS header
     niconiconi.xyz: could not connect to host
    -niconode.com: did not receive HSTS header
    +niconode.com: could not connect to host
     nien.chat: could not connect to host
     nightx.uk: could not connect to host
     niho.jp: [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 121"  data: no]
    @@ -2258,6 +2273,7 @@ nutleyef.org: did not receive HSTS header
     nutrienti.eu: did not receive HSTS header
     nutritionculture.com: could not connect to host
     nutsandboltsmedia.com: did not receive HSTS header
    +nuxer.fr: could not connect to host
     nwgh.org: max-age too low: 86400
     nyantec.com: did not receive HSTS header
     nysepho.pw: could not connect to host
    @@ -2310,6 +2326,7 @@ ookjesprookje.nl: could not connect to host
     ooonja.de: could not connect to host
     oopsmycase.com: could not connect to host
     oost.io: could not connect to host
    +open-future.be: could not connect to host
     open-mx.de: could not connect to host
     open-to-repair.fr: did not receive HSTS header
     opendesk.cc: did not receive HSTS header
    @@ -2343,7 +2360,6 @@ otherstuff.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ER
     otichi.com: did not receive HSTS header
     ottospora.nl: could not connect to host
     ourbank.com: did not receive HSTS header
    -ourcloud.at: could not connect to host
     outetc.com: could not connect to host
     outreachbuddy.com: could not connect to host
     outsider.im: could not connect to host
    @@ -2368,8 +2384,6 @@ paku.me: could not connect to host
     pamsoft.pl: max-age too low: 0
     panaceallc.net: could not connect to host
     panelomix.net: could not connect to host
    -paneu.de: could not connect to host
    -pants-off.xyz: did not receive HSTS header
     pantsu.cat: did not receive HSTS header
     papeda.net: did not receive HSTS header
     papercard.co.uk: did not receive HSTS header
    @@ -2405,10 +2419,10 @@ pbapp.net: did not receive HSTS header
     pbprint.ru: max-age too low: 0
     pc-nf.de: could not connect to host
     pchax.net: did not receive HSTS header
    -peervpn.net: could not connect to host
     peissen.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 121"  data: no]
     pekkapikkarainen.fi: could not connect to host
     pekkarik.ru: could not connect to host
    +peliculasaudiolatinoonline.com: could not connect to host
     pentagram.me: could not connect to host
     pepperhead.com: could not connect to host
     pepperworldhotshop.de: did not receive HSTS header
    @@ -2429,6 +2443,7 @@ petravdbos.nl: did not receive HSTS header
     petrolplus.ru: did not receive HSTS header
     pettsy.com: could not connect to host
     pewboards.com: could not connect to host
    +pgmann.cf: could not connect to host
     pgpm.io: could not connect to host
     philadelphia.com.mx: could not connect to host
     phongmay24h.com: could not connect to host
    @@ -2451,7 +2466,7 @@ pixel.google.com: did not receive HSTS header (error ignored - included regardle
     pixelcode.com.au: max-age too low: 0
     pixelhero.co.uk: did not receive HSTS header
     pixi.me: could not connect to host
    -pj83.duckdns.org: could not connect to host
    +pj83.duckdns.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 121"  data: no]
     pk.search.yahoo.com: did not receive HSTS header
     placollection.org: could not connect to host
     platform.lookout.com: could not connect to host
    @@ -2477,10 +2492,10 @@ poolsandstuff.com: did not receive HSTS header
     poris.web.id: did not receive HSTS header
     portalplatform.net: did not receive HSTS header
     poshpak.com: did not receive HSTS header
    -post4me.at: could not connect to host
     posterspy.com: did not receive HSTS header
     postscheduler.org: could not connect to host
     posylka.de: did not receive HSTS header
    +potatofrom.space: could not connect to host
     poussinooz.fr: could not connect to host
     povitria.net: could not connect to host
     powerplannerapp.com: did not receive HSTS header
    @@ -2659,6 +2674,7 @@ rotterdamjazz.info: [Exception... "Component returned failure code: 0x80004005 (
     roundtheme.com: did not receive HSTS header
     rout0r.org: did not receive HSTS header
     rouvray.org: could not connect to host
    +royalpub.net: did not receive HSTS header
     rr.in.th: could not connect to host
     rrke.cc: did not receive HSTS header
     rsajeey.info: could not connect to host
    @@ -2689,6 +2705,7 @@ rxprep.com: did not receive HSTS header
     rxv.cc: could not connect to host
     ryansmithphotography.com: did not receive HSTS header
     ryanteck.uk: did not receive HSTS header
    +saba-piserver.info: could not connect to host
     safematix.com: could not connect to host
     sageth.com: max-age too low: 0
     sah3.net: could not connect to host
    @@ -2767,6 +2784,7 @@ selecadm.name: could not connect to host
     selectruckscalltrackingreports.com: could not connect to host
     self-injury.net: could not connect to host
     selfcarecentral.com: did not receive HSTS header
    +selfici.com: could not connect to host
     selfie-france.fr: could not connect to host
     selldorado.com: did not receive HSTS header
     sello.com: did not receive HSTS header
    @@ -2787,12 +2805,11 @@ servercode.ca: did not receive HSTS header
     serverdensity.io: did not receive HSTS header
     servergno.me: did not receive HSTS header
     seryo.moe: could not connect to host
    +setfix.de: could not connect to host
     setphaserstostun.org: could not connect to host
     setuid.de: could not connect to host
     setuid.io: did not receive HSTS header
     seyahatsagliksigortalari.com: could not connect to host
    -seyr.it: could not connect to host
    -seyr.me: could not connect to host
     shadoom.com: did not receive HSTS header
     shadowmorph.info: did not receive HSTS header
     shadowsocks.net: could not connect to host
    @@ -2813,6 +2830,7 @@ shiinko.com: could not connect to host
     shinju.moe: could not connect to host
     shiona.xyz: did not receive HSTS header
     shocksrv.com: did not receive HSTS header
    +shome.de: could not connect to host
     shooshosha.com: did not receive HSTS header
     shopontarget.com: did not receive HSTS header
     shoprose.ru: could not connect to host
    @@ -2883,6 +2901,8 @@ snapappts.com: could not connect to host
     snapworks.net: did not receive HSTS header
     sneberger.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 121"  data: no]
     snel4u.nl: could not connect to host
    +snelshops.nl: could not connect to host
    +snelwebshop.nl: could not connect to host
     snelwerk.be: did not receive HSTS header
     sng.my: could not connect to host
     snoqualmiefiber.org: did not receive HSTS header
    @@ -2940,7 +2960,7 @@ spencerbaer.com: could not connect to host
     sperohub.io: could not connect to host
     spherenix.org: could not connect to host
     spideroak.com: did not receive HSTS header
    -spiegels.nl: did not receive HSTS header
    +spiegels.nl: could not connect to host
     spilsbury.io: could not connect to host
     spitefultowel.com: could not connect to host
     spongepowered.org: did not receive HSTS header
    @@ -2956,7 +2976,6 @@ square.gs: could not connect to host
     squatldf.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 121"  data: no]
     sqzryang.com: max-age too low: 604800
     srevilak.net: did not receive HSTS header
    -sritest.io: did not receive HSTS header
     srna.sk: could not connect to host
     srrr.ca: could not connect to host
     ss.wtf: did not receive HSTS header
    @@ -3008,7 +3027,6 @@ student-scientist.org: did not receive HSTS header
     studentresearcher.org: did not receive HSTS header
     studentskydenik.cz: could not connect to host
     studenttravel.cz: did not receive HSTS header
    -studio-panic.com: could not connect to host
     studydrive.net: did not receive HSTS header
     stugb.de: did not receive HSTS header
     stupendous.net: could not connect to host
    @@ -3036,6 +3054,7 @@ surfone-leucate.com: did not receive HSTS header
     sushi101tempe.com: did not receive HSTS header
     suzukikenichi.com: did not receive HSTS header
     sv.search.yahoo.com: did not receive HSTS header
    +svallee.fr: did not receive HSTS header
     sweep-me.net: did not receive HSTS header
     swimming.ca: did not receive HSTS header
     swimturk.com.tr: did not receive HSTS header
    @@ -3054,6 +3073,7 @@ sysmike.de: could not connect to host
     syso.name: could not connect to host
     szaszm.tk: max-age too low: 0
     szaydon.me: could not connect to host
    +t-complex.space: could not connect to host
     t.facebook.com: did not receive HSTS header
     taabe.xyz: did not receive HSTS header
     tablet.facebook.com: did not receive HSTS header
    @@ -3068,6 +3088,7 @@ talktwincities.com: could not connect to host
     tallr.se: could not connect to host
     tallshoe.com: could not connect to host
     tandarts-haarlem.nl: did not receive HSTS header
    +tanze-jetzt.de: did not receive HSTS header
     tanzhijun.com: did not receive HSTS header
     tapfinder.ca: could not connect to host
     tapka.cz: did not receive HSTS header
    @@ -3105,7 +3126,6 @@ tempcraft.net: could not connect to host
     tendertool.nl: could not connect to host
     tenni.xyz: could not connect to host
     tensionup.com: could not connect to host
    -tepid.org: could not connect to host
     terrax.berlin: could not connect to host
     terrax.info: could not connect to host
     testandroid.xyz: could not connect to host
    @@ -3149,23 +3169,23 @@ thestagchorleywood.co.uk: did not receive HSTS header
     thetomharling.com: max-age too low: 86400
     theurbanyoga.com: did not receive HSTS header
     thevintagenews.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 121"  data: no]
    -thezero.org: could not connect to host
     thezonders.com: did not receive HSTS header
     thierfreund.de: could not connect to host
     thierryhayoz.ch: could not connect to host
    -thijsalders.nl: did not receive HSTS header
    +thijsalders.nl: max-age too low: 300
     thinkcoding.de: could not connect to host
    -thinkcoding.org: could not connect to host
     thinlyveiledcontempt.com: could not connect to host
     thirdpartytrade.com: did not receive HSTS header
     thirty5.net: did not receive HSTS header
     thomasschweizer.net: could not connect to host
     thomaswoo.com: could not connect to host
     thorncreek.net: did not receive HSTS header
    +throughthelookingglasslens.co.uk: could not connect to host
     thumbtack.com: did not receive HSTS header
     tickopa.co.uk: could not connect to host
     tickreport.com: did not receive HSTS header
     tictactux.de: could not connect to host
    +tiens-ib.cz: could not connect to host
     tiensnet.com: did not receive HSTS header
     tikutiku.pl: max-age too low: 0
     timbeilby.com: could not connect to host
    @@ -3196,10 +3216,10 @@ todobazar.es: could not connect to host
     tokyopopline.com: did not receive HSTS header
     tollmanz.com: did not receive HSTS header
     tomeara.net: could not connect to host
    -tomend.es: could not connect to host
     tomharling.co.uk: max-age too low: 86400
     tomharling.uk: max-age too low: 86400
     tommsy.com: did not receive HSTS header
    +tommyads.com: could not connect to host
     tonburi.jp: did not receive HSTS header
     tonyfantjr.com: could not connect to host
     toomanypillows.com: could not connect to host
    @@ -3211,6 +3231,7 @@ topshelfguild.com: could not connect to host
     topyx.com: did not receive HSTS header
     torahanytime.com: did not receive HSTS header
     torprojects.com: could not connect to host
    +torrent.is: could not connect to host
     tosecure.link: could not connect to host
     toshnix.com: could not connect to host
     totem-eshop.cz: could not connect to host
    @@ -3227,11 +3248,12 @@ trakfusion.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
     trendberry.ru: did not receive HSTS header
    +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 121"  data: no]
     trinityaffirmations.com: max-age too low: 0
     trinitycore.org: max-age too low: 2592000
     tripdelta.com: did not receive HSTS header
     trixies-wish.nz: could not connect to host
    -trusitio.com: could not connect to host
    +trusitio.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 121"  data: no]
     trustmeimfancy.com: could not connect to host
     trybind.com: could not connect to host
     ts2.se: did not receive HSTS header
    @@ -3316,7 +3338,7 @@ ustr.gov: max-age too low: 86400
     utumno.ch: could not connect to host
     uy.search.yahoo.com: did not receive HSTS header
     uz.search.yahoo.com: did not receive HSTS header
    -uzmandroid.com: did not receive HSTS header
    +uzmandroid.com: could not connect to host
     uzmandroid.net: did not receive HSTS header
     uzmandroid.top: could not connect to host
     vaddder.com: could not connect to host
    @@ -3326,6 +3348,7 @@ valkyrja.xyz: did not receive HSTS header
     valleyridgepta.org: could not connect to host
     vallis.net: could not connect to host
     vanderkley.it: could not connect to host
    +vanestack.com: could not connect to host
     vanetv.com: could not connect to host
     vanitas.xyz: could not connect to host
     vanitynailworkz.com: could not connect to host
    @@ -3334,7 +3357,7 @@ vasanth.org: did not receive HSTS header
     vbh2o.com: did not receive HSTS header
     vbulletin-russia.com: could not connect to host
     vbulletinrussia.com: could not connect to host
    -vcdove.com: could not connect to host
    +vcdove.com: did not receive HSTS header
     vcr.re: could not connect to host
     vdcomp.cz: could not connect to host
     veblen.com: could not connect to host
    @@ -3377,10 +3400,10 @@ vox.vg: did not receive HSTS header
     vpl.me: did not receive HSTS header
     vpn-byen.dk: did not receive HSTS header
     vratny.space: could not connect to host
    -vvl.me: did not receive HSTS header
    +vvl.me: could not connect to host
     vxstream-sandbox.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 121"  data: no]
     vyncke.org: max-age too low: 2678400
    -vyskocil.eu: did not receive HSTS header
    +vyskocil.eu: could not connect to host
     vzk.io: could not connect to host
     w4a.fr: max-age too low: 0
     w4xzr.top: could not connect to host
    @@ -3406,7 +3429,7 @@ wave.is: could not connect to host
     wavefrontsystemstech.com: could not connect to host
     wealthfactory.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 121"  data: no]
     wear2work.nl: did not receive HSTS header
    -weaverhairextensions.nl: did not receive HSTS header
    +weaverhairextensions.nl: could not connect to host
     web4all.fr: max-age too low: 0
     web4pro.fr: could not connect to host
     webassadors.com: could not connect to host
    @@ -3444,7 +3467,6 @@ wetttipps.de: did not receive HSTS header
     wevahoo.com: could not connect to host
     whats.io: could not connect to host
     whatsstalk.me: could not connect to host
    -whatwg.org: could not connect to host
     when-release.com: did not receive HSTS header
     whiterabbitcakery.com: could not connect to host
     whitestagforge.com: could not connect to host
    @@ -3461,7 +3483,6 @@ wikidsystems.com: could not connect to host
     wilf1rst.com: could not connect to host
     william.si: did not receive HSTS header
     willosagiede.com: did not receive HSTS header
    -wills.co.tt: could not connect to host
     winclient.cn: did not receive HSTS header
     windhaven.nl: could not connect to host
     winecodeavocado.com: did not receive HSTS header
    @@ -3492,9 +3513,7 @@ workfone.io: did not receive HSTS header
     workwithgo.com: could not connect to host
     wowapi.org: could not connect to host
     wphostingspot.com: did not receive HSTS header
    -wpinfos.de: could not connect to host
     wpmetadatastandardsproject.org: could not connect to host
    -wql.zj.cn: [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 121"  data: no]
     writeapp.me: did not receive HSTS header
     wsscompany.com.ve: could not connect to host
     wufu.org: did not receive HSTS header
    @@ -3565,6 +3584,7 @@ xtream-hosting.com: could not connect to host
     xtream-hosting.de: could not connect to host
     xtream-hosting.eu: could not connect to host
     xtreamhosting.eu: could not connect to host
    +xtremegaming.it: could not connect to host
     xuri.me: max-age too low: 2592000
     xuyh0120.win: did not receive HSTS header
     xxbase.com: could not connect to host
    @@ -3591,6 +3611,7 @@ 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
    +yosemo.de: could not connect to host
     youcontrol.ru: could not connect to host
     yourstrongbox.com: could not connect to host
     yout.com: max-age too low: 60000
    @@ -3622,6 +3643,7 @@ zentraler-kreditausschuss.de: did not receive HSTS header
     zentralwolke.de: did not receive HSTS header
     zera.com.au: could not connect to host
     zett4.me: did not receive HSTS header
    +zeytin.pro: could not connect to host
     zh.search.yahoo.com: did not receive HSTS header
     zhaojin97.cn: max-age too low: 604800
     zhendingresources.com: max-age too low: 0
    diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc
    index c4682a772f3b..10ab15dc2615 100644
    --- a/security/manager/ssl/nsSTSPreloadList.inc
    +++ b/security/manager/ssl/nsSTSPreloadList.inc
    @@ -8,7 +8,7 @@
     /*****************************************************************************/
     
     #include 
    -const PRTime gPreloadListExpirationTime = INT64_C(1488719159983000);
    +const PRTime gPreloadListExpirationTime = INT64_C(1488806079253000);
     
     static const char kSTSHostTable[] = {
       /* "007sascha.de", true */ '0', '0', '7', 's', 'a', 's', 'c', 'h', 'a', '.', 'd', 'e', '\0',
    @@ -194,6 +194,9 @@ static const char kSTSHostTable[] = {
       /* "a200k.xyz", true */ 'a', '2', '0', '0', 'k', '.', 'x', 'y', 'z', '\0',
       /* "a2nutrition.com.au", true */ 'a', '2', 'n', 'u', 't', 'r', 'i', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
       /* "aa-tour.ru", true */ 'a', 'a', '-', 't', 'o', 'u', 'r', '.', 'r', 'u', '\0',
    +  /* "aaeblog.com", true */ 'a', 'a', 'e', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '\0',
    +  /* "aaeblog.net", true */ 'a', 'a', 'e', 'b', 'l', 'o', 'g', '.', 'n', 'e', 't', '\0',
    +  /* "aaeblog.org", true */ 'a', 'a', 'e', 'b', 'l', 'o', 'g', '.', 'o', 'r', 'g', '\0',
       /* "aanmpc.com", true */ 'a', 'a', 'n', 'm', 'p', 'c', '.', 'c', 'o', 'm', '\0',
       /* "aaoo.net", true */ 'a', 'a', 'o', 'o', '.', 'n', 'e', 't', '\0',
       /* "aapas.org.ar", true */ 'a', 'a', 'p', 'a', 's', '.', 'o', 'r', 'g', '.', 'a', 'r', '\0',
    @@ -409,7 +412,6 @@ static const char kSTSHostTable[] = {
       /* "aiticon.com", true */ 'a', 'i', 't', 'i', 'c', 'o', 'n', '.', 'c', 'o', 'm', '\0',
       /* "aivd.lol", true */ 'a', 'i', 'v', 'd', '.', 'l', 'o', 'l', '\0',
       /* "aiwdirect.com", true */ 'a', 'i', 'w', 'd', 'i', 'r', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0',
    -  /* "ajmahal.com", true */ 'a', 'j', 'm', 'a', 'h', 'a', 'l', '.', 'c', 'o', 'm', '\0',
       /* "ajouin.com", true */ 'a', 'j', 'o', 'u', 'i', 'n', '.', 'c', 'o', 'm', '\0',
       /* "akachanikuji.com", true */ 'a', 'k', 'a', 'c', 'h', 'a', 'n', 'i', 'k', 'u', 'j', 'i', '.', 'c', 'o', 'm', '\0',
       /* "akaoma.com", true */ 'a', 'k', 'a', 'o', 'm', 'a', '.', 'c', 'o', 'm', '\0',
    @@ -469,7 +471,6 @@ static const char kSTSHostTable[] = {
       /* "alexismeza.com.mx", true */ 'a', 'l', 'e', 'x', 'i', 's', 'm', 'e', 'z', 'a', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0',
       /* "alexismeza.dk", true */ 'a', 'l', 'e', 'x', 'i', 's', 'm', 'e', 'z', 'a', '.', 'd', 'k', '\0',
       /* "alexmerkel.com", true */ 'a', 'l', 'e', 'x', 'm', 'e', 'r', 'k', 'e', 'l', '.', 'c', 'o', 'm', '\0',
    -  /* "alexmerkel.me", true */ 'a', 'l', 'e', 'x', 'm', 'e', 'r', 'k', 'e', 'l', '.', 'm', 'e', '\0',
       /* "alexmerkel.xyz", true */ 'a', 'l', 'e', 'x', 'm', 'e', 'r', 'k', 'e', 'l', '.', 'x', 'y', 'z', '\0',
       /* "alexn.org", true */ 'a', 'l', 'e', 'x', 'n', '.', 'o', 'r', 'g', '\0',
       /* "alexpavel.com", true */ 'a', 'l', 'e', 'x', 'p', 'a', 'v', 'e', 'l', '.', 'c', 'o', 'm', '\0',
    @@ -481,13 +482,11 @@ static const char kSTSHostTable[] = {
       /* "alexyang.me", true */ 'a', 'l', 'e', 'x', 'y', 'a', 'n', 'g', '.', 'm', 'e', '\0',
       /* "algolia.com", true */ 'a', 'l', 'g', 'o', 'l', 'i', 'a', '.', 'c', 'o', 'm', '\0',
       /* "alicestudio.it", true */ 'a', 'l', 'i', 'c', 'e', 's', 't', 'u', 'd', 'i', 'o', '.', 'i', 't', '\0',
    -  /* "alienstat.com", true */ 'a', 'l', 'i', 'e', 'n', 's', 't', 'a', 't', '.', 'c', 'o', 'm', '\0',
       /* "alinasmusicstudio.com", true */ 'a', 'l', 'i', 'n', 'a', 's', 'm', 'u', 's', 'i', 'c', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', 'm', '\0',
       /* "alisonlitchfield.com", true */ 'a', 'l', 'i', 's', 'o', 'n', 'l', 'i', 't', 'c', 'h', 'f', 'i', 'e', 'l', 'd', '.', 'c', 'o', 'm', '\0',
       /* "alittlebitcheeky.com", false */ 'a', 'l', 'i', 't', 't', 'l', 'e', 'b', 'i', 't', 'c', 'h', 'e', 'e', 'k', 'y', '.', 'c', 'o', 'm', '\0',
       /* "aljaspod.com", true */ 'a', 'l', 'j', 'a', 's', 'p', 'o', 'd', '.', 'c', 'o', 'm', '\0',
       /* "aljaspod.hu", true */ 'a', 'l', 'j', 'a', 's', 'p', 'o', 'd', '.', 'h', 'u', '\0',
    -  /* "aljaspod.net", true */ 'a', 'l', 'j', 'a', 's', 'p', 'o', 'd', '.', 'n', 'e', 't', '\0',
       /* "alkamitech.com", true */ 'a', 'l', 'k', 'a', 'm', 'i', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
       /* "alkel.info", true */ 'a', 'l', 'k', 'e', 'l', '.', 'i', 'n', 'f', 'o', '\0',
       /* "all-connect.net", true */ 'a', 'l', 'l', '-', 'c', 'o', 'n', 'n', 'e', 'c', 't', '.', 'n', 'e', 't', '\0',
    @@ -524,6 +523,7 @@ static const char kSTSHostTable[] = {
       /* "alt-three.com", true */ 'a', 'l', 't', '-', 't', 'h', 'r', 'e', 'e', '.', 'c', 'o', 'm', '\0',
       /* "alt.org", true */ 'a', 'l', 't', '.', 'o', 'r', 'g', '\0',
       /* "altedirect.com", true */ 'a', 'l', 't', 'e', 'd', 'i', 'r', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0',
    +  /* "alterbaum.net", true */ 'a', 'l', 't', 'e', 'r', 'b', 'a', 'u', 'm', '.', 'n', 'e', 't', '\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',
    @@ -575,7 +575,6 @@ static const char kSTSHostTable[] = {
       /* "anadoluefessk.org", true */ 'a', 'n', 'a', 'd', 'o', 'l', 'u', 'e', 'f', 'e', 's', 's', 'k', '.', 'o', 'r', 'g', '\0',
       /* "anadoluefessporkulubu.org", true */ 'a', 'n', 'a', 'd', 'o', 'l', 'u', 'e', 'f', 'e', 's', 's', 'p', 'o', 'r', 'k', 'u', 'l', 'u', 'b', 'u', '.', 'o', 'r', 'g', '\0',
       /* "anagra.ms", true */ 'a', 'n', 'a', 'g', 'r', 'a', '.', 'm', 's', '\0',
    -  /* "analytic-s.ml", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', '-', 's', '.', 'm', 'l', '\0',
       /* "analyticsinmotion.net", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'i', 'n', 'm', 'o', 't', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
       /* "analyticum.at", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'a', 't', '\0',
       /* "analyticum.com", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'c', 'o', 'm', '\0',
    @@ -602,6 +601,7 @@ static const char kSTSHostTable[] = {
       /* "andrepicard.de", true */ 'a', 'n', 'd', 'r', 'e', 'p', 'i', 'c', 'a', 'r', 'd', '.', 'd', 'e', '\0',
       /* "andrewbroekman.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'b', 'r', 'o', 'e', 'k', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
       /* "andrewhowden.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'h', 'o', 'w', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0',
    +  /* "andrewimeson.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'i', 'm', 'e', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
       /* "andrewmichaud.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'm', 'i', 'c', 'h', 'a', 'u', 'd', '.', 'c', 'o', 'm', '\0',
       /* "andrewmichaud.me", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'm', 'i', 'c', 'h', 'a', 'u', 'd', '.', 'm', 'e', '\0',
       /* "andrewregan.me", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'r', 'e', 'g', 'a', 'n', '.', 'm', 'e', '\0',
    @@ -612,7 +612,6 @@ static const char kSTSHostTable[] = {
       /* "andrewx.net", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'x', '.', 'n', 'e', 't', '\0',
       /* "androide.com", true */ 'a', 'n', 'd', 'r', 'o', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
       /* "andromedacenter.com", true */ 'a', 'n', 'd', 'r', 'o', 'm', 'e', 'd', 'a', 'c', 'e', 'n', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
    -  /* "andsat.org", true */ 'a', 'n', 'd', 's', 'a', 't', '.', 'o', 'r', 'g', '\0',
       /* "anduril.de", true */ 'a', 'n', 'd', 'u', 'r', 'i', 'l', '.', 'd', 'e', '\0',
       /* "anduril.eu", true */ 'a', 'n', 'd', 'u', 'r', 'i', 'l', '.', 'e', 'u', '\0',
       /* "andyuk.org", true */ 'a', 'n', 'd', 'y', 'u', 'k', '.', 'o', 'r', 'g', '\0',
    @@ -777,7 +776,6 @@ static const char kSTSHostTable[] = {
       /* "army24.cz", true */ 'a', 'r', 'm', 'y', '2', '4', '.', 'c', 'z', '\0',
       /* "armyprodej.cz", true */ 'a', 'r', 'm', 'y', 'p', 'r', 'o', 'd', 'e', 'j', '.', 'c', 'z', '\0',
       /* "arnaudfeld.de", true */ 'a', 'r', 'n', 'a', 'u', 'd', 'f', 'e', 'l', 'd', '.', 'd', 'e', '\0',
    -  /* "arne-petersen.net", true */ 'a', 'r', 'n', 'e', '-', 'p', 'e', 't', 'e', 'r', 's', 'e', 'n', '.', 'n', 'e', 't', '\0',
       /* "arnesolutions.com", true */ 'a', 'r', 'n', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
       /* "arnetdigital.eu", true */ 'a', 'r', 'n', 'e', 't', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'e', 'u', '\0',
       /* "arnor.org", true */ 'a', 'r', 'n', 'o', 'r', '.', 'o', 'r', 'g', '\0',
    @@ -857,7 +855,6 @@ static const char kSTSHostTable[] = {
       /* "asun.co", true */ 'a', 's', 'u', 'n', '.', 'c', 'o', '\0',
       /* "asurepay.cc", true */ 'a', 's', 'u', 'r', 'e', 'p', 'a', 'y', '.', 'c', 'c', '\0',
       /* "at.search.yahoo.com", false */ 'a', 't', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
    -  /* "atbeckett.com", true */ 'a', 't', 'b', 'e', 'c', 'k', 'e', 't', 't', '.', 'c', 'o', 'm', '\0',
       /* "atc.io", true */ 'a', 't', 'c', '.', 'i', 'o', '\0',
       /* "atchleyjazz.com", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'c', 'o', 'm', '\0',
       /* "atchleyjazz.org", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'o', 'r', 'g', '\0',
    @@ -891,7 +888,6 @@ static const char kSTSHostTable[] = {
       /* "atrinik.org", true */ 'a', 't', 'r', 'i', 'n', 'i', 'k', '.', 'o', 'r', 'g', '\0',
       /* "atte.fi", true */ 'a', 't', 't', 'e', '.', 'f', 'i', '\0',
       /* "attic118.com", true */ 'a', 't', 't', 'i', 'c', '1', '1', '8', '.', 'c', 'o', 'm', '\0',
    -  /* "attilagyorffy.com", true */ 'a', 't', 't', 'i', 'l', 'a', 'g', 'y', 'o', 'r', 'f', 'f', 'y', '.', 'c', 'o', 'm', '\0',
       /* "attogproductions.com", true */ 'a', 't', 't', 'o', 'g', 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
       /* "attogtech.com", true */ 'a', 't', 't', 'o', 'g', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
       /* "attorney.org.il", true */ 'a', 't', 't', 'o', 'r', 'n', 'e', 'y', '.', 'o', 'r', 'g', '.', 'i', 'l', '\0',
    @@ -971,13 +967,13 @@ static const char kSTSHostTable[] = {
       /* "aymericlagier.com", true */ 'a', 'y', 'm', 'e', 'r', 'i', 'c', 'l', 'a', 'g', 'i', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "ayurveda101.com", false */ 'a', 'y', 'u', 'r', 'v', 'e', 'd', 'a', '1', '0', '1', '.', 'c', 'o', 'm', '\0',
       /* "azabani.com", true */ 'a', 'z', 'a', 'b', 'a', 'n', 'i', '.', 'c', 'o', 'm', '\0',
    -  /* "azazy.net", true */ 'a', 'z', 'a', 'z', 'y', '.', 'n', 'e', 't', '\0',
       /* "azimut.fr", true */ 'a', 'z', 'i', 'm', 'u', 't', '.', 'f', 'r', '\0',
       /* "azino777.ru", true */ 'a', 'z', 'i', 'n', 'o', '7', '7', '7', '.', 'r', 'u', '\0',
       /* "azirevpn.com", true */ 'a', 'z', 'i', 'r', 'e', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0',
       /* "azlk-team.ru", true */ 'a', 'z', 'l', 'k', '-', 't', 'e', 'a', 'm', '.', 'r', 'u', '\0',
       /* "azort.com", true */ 'a', 'z', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
       /* "aztrix.me", true */ 'a', 'z', 't', 'r', 'i', 'x', '.', 'm', 'e', '\0',
    +  /* "azuxul.fr", true */ 'a', 'z', 'u', 'x', 'u', 'l', '.', 'f', 'r', '\0',
       /* "azzag.co.uk", true */ 'a', 'z', 'z', 'a', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "azzorti.com", false */ 'a', 'z', 'z', 'o', 'r', 't', 'i', '.', 'c', 'o', 'm', '\0',
       /* "b-root-force.de", true */ 'b', '-', 'r', 'o', 'o', 't', '-', 'f', 'o', 'r', 'c', 'e', '.', 'd', 'e', '\0',
    @@ -1005,6 +1001,7 @@ static const char kSTSHostTable[] = {
       /* "badf00d.de", true */ 'b', 'a', 'd', 'f', '0', '0', 'd', '.', 'd', 'e', '\0',
       /* "badges.fedoraproject.org", true */ 'b', 'a', 'd', 'g', 'e', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
       /* "badges.stg.fedoraproject.org", true */ 'b', 'a', 'd', 'g', 'e', 's', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
    +  /* "badhusky.com", true */ 'b', 'a', 'd', 'h', 'u', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
       /* "badkamergigant.com", true */ 'b', 'a', 'd', 'k', 'a', 'm', 'e', 'r', 'g', 'i', 'g', 'a', 'n', 't', '.', 'c', 'o', 'm', '\0',
       /* "badlink.org", true */ 'b', 'a', 'd', 'l', 'i', 'n', 'k', '.', 'o', 'r', 'g', '\0',
       /* "badoo.com", true */ 'b', 'a', 'd', 'o', 'o', '.', 'c', 'o', 'm', '\0',
    @@ -1104,6 +1101,7 @@ static const char kSTSHostTable[] = {
       /* "bc-bd.org", true */ 'b', 'c', '-', 'b', 'd', '.', 'o', 'r', 'g', '\0',
       /* "bcchack.com", true */ 'b', 'c', 'c', 'h', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
       /* "bcdonadio.com", true */ 'b', 'c', 'd', 'o', 'n', 'a', 'd', 'i', 'o', '.', 'c', 'o', 'm', '\0',
    +  /* "bcheng.cf", true */ 'b', 'c', 'h', 'e', 'n', 'g', '.', 'c', 'f', '\0',
       /* "bchep.com", true */ 'b', 'c', 'h', 'e', 'p', '.', 'c', 'o', 'm', '\0',
       /* "bcmlu.org", true */ 'b', 'c', 'm', 'l', 'u', '.', 'o', 'r', 'g', '\0',
       /* "bcrook.com", false */ 'b', 'c', 'r', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
    @@ -1156,7 +1154,6 @@ static const char kSTSHostTable[] = {
       /* "belmontgoessolar.org", true */ 'b', 'e', 'l', 'm', 'o', 'n', 't', 'g', 'o', 'e', 's', 's', 'o', 'l', 'a', 'r', '.', 'o', 'r', 'g', '\0',
       /* "belmontprom.com", true */ 'b', 'e', 'l', 'm', 'o', 'n', 't', 'p', 'r', 'o', 'm', '.', 'c', 'o', 'm', '\0',
       /* "belt.black", true */ 'b', 'e', 'l', 't', '.', 'b', 'l', 'a', 'c', 'k', '\0',
    -  /* "belwederczykow.eu", true */ 'b', 'e', 'l', 'w', 'e', 'd', 'e', 'r', 'c', 'z', 'y', 'k', 'o', 'w', '.', 'e', 'u', '\0',
       /* "bely-mishka.by", true */ 'b', 'e', 'l', 'y', '-', 'm', 'i', 's', 'h', 'k', 'a', '.', 'b', 'y', '\0',
       /* "bemsoft.pl", true */ 'b', 'e', 'm', 's', 'o', 'f', 't', '.', 'p', 'l', '\0',
       /* "bemyvictim.com", true */ 'b', 'e', 'm', 'y', 'v', 'i', 'c', 't', 'i', 'm', '.', 'c', 'o', 'm', '\0',
    @@ -1517,7 +1514,6 @@ static const char kSTSHostTable[] = {
       /* "borderlinegroup.com", true */ 'b', 'o', 'r', 'd', 'e', 'r', 'l', 'i', 'n', 'e', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '\0',
       /* "boringsmith.com", true */ 'b', 'o', 'r', 'i', 'n', 'g', 's', 'm', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0',
       /* "boris64.net", true */ 'b', 'o', 'r', 'i', 's', '6', '4', '.', 'n', 'e', 't', '\0',
    -  /* "borisbesemer.com", true */ 'b', 'o', 'r', 'i', 's', 'b', 'e', 's', 'e', 'm', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "borrelioz.com", true */ 'b', 'o', 'r', 'r', 'e', 'l', 'i', 'o', 'z', '.', 'c', 'o', 'm', '\0',
       /* "borysek.net", true */ 'b', 'o', 'r', 'y', 's', 'e', 'k', '.', 'n', 'e', 't', '\0',
       /* "bostadsportal.se", true */ 'b', 'o', 's', 't', 'a', 'd', 's', 'p', 'o', 'r', 't', 'a', 'l', '.', 's', 'e', '\0',
    @@ -1558,7 +1554,6 @@ static const char kSTSHostTable[] = {
       /* "brage.info", true */ 'b', 'r', 'a', 'g', 'e', '.', 'i', 'n', 'f', 'o', '\0',
       /* "brain-e.co", true */ 'b', 'r', 'a', 'i', 'n', '-', 'e', '.', 'c', 'o', '\0',
       /* "brainhub.nl", true */ 'b', 'r', 'a', 'i', 'n', 'h', 'u', 'b', '.', 'n', 'l', '\0',
    -  /* "brainlag.org", true */ 'b', 'r', 'a', 'i', 'n', 'l', 'a', 'g', '.', 'o', 'r', 'g', '\0',
       /* "brainster.co", false */ 'b', 'r', 'a', 'i', 'n', 's', 't', 'e', 'r', '.', 'c', 'o', '\0',
       /* "brakemanpro.com", true */ 'b', 'r', 'a', 'k', 'e', 'm', 'a', 'n', 'p', 'r', 'o', '.', 'c', 'o', 'm', '\0',
       /* "brakstad.org", true */ 'b', 'r', 'a', 'k', 's', 't', 'a', 'd', '.', 'o', 'r', 'g', '\0',
    @@ -1786,7 +1781,6 @@ static const char kSTSHostTable[] = {
       /* "calgoty.com", true */ 'c', 'a', 'l', 'g', 'o', 't', 'y', '.', 'c', 'o', 'm', '\0',
       /* "calibreapp.com", false */ 'c', 'a', 'l', 'i', 'b', 'r', 'e', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
       /* "calibso.net", true */ 'c', 'a', 'l', 'i', 'b', 's', 'o', '.', 'n', 'e', 't', '\0',
    -  /* "call.me", false */ 'c', 'a', 'l', 'l', '.', 'm', 'e', '\0',
       /* "callcap.com", false */ 'c', 'a', 'l', 'l', 'c', 'a', 'p', '.', 'c', 'o', 'm', '\0',
       /* "callear.org", true */ 'c', 'a', 'l', 'l', 'e', 'a', 'r', '.', 'o', 'r', 'g', '\0',
       /* "callhub.io", true */ 'c', 'a', 'l', 'l', 'h', 'u', 'b', '.', 'i', 'o', '\0',
    @@ -2002,6 +1996,7 @@ static const char kSTSHostTable[] = {
       /* "chat-porc.eu", true */ 'c', 'h', 'a', 't', '-', 'p', 'o', 'r', 'c', '.', 'e', 'u', '\0',
       /* "chatbelgie.eu", true */ 'c', 'h', 'a', 't', 'b', 'e', 'l', 'g', 'i', 'e', '.', 'e', 'u', '\0',
       /* "chatear.social", true */ 'c', 'h', 'a', 't', 'e', 'a', 'r', '.', 's', 'o', 'c', 'i', 'a', 'l', '\0',
    +  /* "chateau-belvoir.com", true */ 'c', 'h', 'a', 't', 'e', 'a', 'u', '-', 'b', 'e', 'l', 'v', 'o', 'i', 'r', '.', 'c', 'o', 'm', '\0',
       /* "chatme.im", false */ 'c', 'h', 'a', 't', 'm', 'e', '.', 'i', 'm', '\0',
       /* "chatnederland.eu", true */ 'c', 'h', 'a', 't', 'n', 'e', 'd', 'e', 'r', 'l', 'a', 'n', 'd', '.', 'e', 'u', '\0',
       /* "chaz6.com", true */ 'c', 'h', 'a', 'z', '6', '.', 'c', 'o', 'm', '\0',
    @@ -2057,7 +2052,6 @@ static const char kSTSHostTable[] = {
       /* "chocotough.nl", false */ 'c', 'h', 'o', 'c', 'o', 't', 'o', 'u', 'g', 'h', '.', 'n', 'l', '\0',
       /* "choiralberta.ca", true */ 'c', 'h', 'o', 'i', 'r', 'a', 'l', 'b', 'e', 'r', 't', 'a', '.', 'c', 'a', '\0',
       /* "choosemypc.net", true */ 'c', 'h', 'o', 'o', 's', 'e', 'm', 'y', 'p', 'c', '.', 'n', 'e', 't', '\0',
    -  /* "chorpinkpoemps.de", true */ 'c', 'h', 'o', 'r', 'p', 'i', 'n', 'k', 'p', 'o', 'e', 'm', 'p', 's', '.', 'd', 'e', '\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',
       /* "chris-edwards.net", true */ 'c', 'h', 'r', 'i', 's', '-', 'e', 'd', 'w', 'a', 'r', 'd', 's', '.', 'n', 'e', 't', '\0',
       /* "chrisandsarahinasia.com", true */ 'c', 'h', 'r', 'i', 's', 'a', 'n', 'd', 's', 'a', 'r', 'a', 'h', 'i', 'n', 'a', 's', 'i', 'a', '.', 'c', 'o', 'm', '\0',
    @@ -2101,7 +2095,6 @@ static const char kSTSHostTable[] = {
       /* "cidbot.com", true */ 'c', 'i', 'd', 'b', 'o', 't', '.', 'c', 'o', 'm', '\0',
       /* "cienbeaute-lidl.fr", true */ 'c', 'i', 'e', 'n', 'b', 'e', 'a', 'u', 't', 'e', '-', 'l', 'i', 'd', 'l', '.', 'f', 'r', '\0',
       /* "cig-dem.com", true */ 'c', 'i', 'g', '-', 'd', 'e', 'm', '.', 'c', 'o', 'm', '\0',
    -  /* "cigarblogs.net", true */ 'c', 'i', 'g', 'a', 'r', 'b', 'l', 'o', 'g', 's', '.', 'n', 'e', 't', '\0',
       /* "cigarterminal.com", false */ 'c', 'i', 'g', 'a', 'r', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0',
       /* "cigi.site", true */ 'c', 'i', 'g', 'i', '.', 's', 'i', 't', 'e', '\0',
       /* "cigoteket.se", true */ 'c', 'i', 'g', 'o', 't', 'e', 'k', 'e', 't', '.', 's', 'e', '\0',
    @@ -2299,7 +2292,6 @@ static const char kSTSHostTable[] = {
       /* "collabornation.net", true */ 'c', 'o', 'l', 'l', 'a', 'b', 'o', 'r', 'n', 'a', 't', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
       /* "collabra.email", true */ 'c', 'o', 'l', 'l', 'a', 'b', 'r', 'a', '.', 'e', 'm', 'a', 'i', 'l', '\0',
       /* "collaction.hk", true */ 'c', 'o', 'l', 'l', 'a', 'c', 't', 'i', 'o', 'n', '.', 'h', 'k', '\0',
    -  /* "collada.org", true */ 'c', 'o', 'l', 'l', 'a', 'd', 'a', '.', 'o', 'r', 'g', '\0',
       /* "collectfood.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'f', 'o', 'o', 'd', '.', 'c', 'o', 'm', '\0',
       /* "collectiblebeans.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'b', 'l', 'e', 'b', 'e', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
       /* "collectosaurus.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 's', 'a', 'u', 'r', 'u', 's', '.', 'c', 'o', 'm', '\0',
    @@ -2498,6 +2490,7 @@ static const char kSTSHostTable[] = {
       /* "crosscom.ch", true */ 'c', 'r', 'o', 's', 's', 'c', 'o', 'm', '.', 'c', 'h', '\0',
       /* "crossfitblackwater.com", true */ 'c', 'r', 'o', 's', 's', 'f', 'i', 't', 'b', 'l', 'a', 'c', 'k', 'w', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "crosssellguide.com", true */ 'c', 'r', 'o', 's', 's', 's', 'e', 'l', 'l', 'g', 'u', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
    +  /* "crow.tw", true */ 'c', 'r', 'o', 'w', '.', 't', 'w', '\0',
       /* "crowdsupply.com", true */ 'c', 'r', 'o', 'w', 'd', 's', 'u', 'p', 'p', 'l', 'y', '.', 'c', 'o', 'm', '\0',
       /* "crownruler.com", true */ 'c', 'r', 'o', 'w', 'n', 'r', 'u', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "crstat.ru", true */ 'c', 'r', 's', 't', 'a', 't', '.', 'r', 'u', '\0',
    @@ -2517,9 +2510,8 @@ static const char kSTSHostTable[] = {
       /* "cryptocon.org", true */ 'c', 'r', 'y', 'p', 't', 'o', 'c', 'o', 'n', '.', 'o', 'r', 'g', '\0',
       /* "cryptodash.net", true */ 'c', 'r', 'y', 'p', 't', 'o', 'd', 'a', 's', 'h', '.', 'n', 'e', 't', '\0',
       /* "cryptography.io", true */ 'c', 'r', 'y', 'p', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'i', 'o', '\0',
    +  /* "cryptoisnotacrime.org", true */ 'c', 'r', 'y', 'p', 't', 'o', 'i', 's', 'n', 'o', 't', 'a', 'c', 'r', 'i', 'm', 'e', '.', 'o', 'r', 'g', '\0',
       /* "cryptoki.fr", true */ 'c', 'r', 'y', 'p', 't', 'o', 'k', 'i', '.', 'f', 'r', '\0',
    -  /* "cryptolab.pro", true */ 'c', 'r', 'y', 'p', 't', 'o', 'l', 'a', 'b', '.', 'p', 'r', 'o', '\0',
    -  /* "cryptolab.tk", true */ 'c', 'r', 'y', 'p', 't', 'o', 'l', 'a', 'b', '.', 't', 'k', '\0',
       /* "cryptonit.net", true */ 'c', 'r', 'y', 'p', 't', 'o', 'n', 'i', 't', '.', 'n', 'e', 't', '\0',
       /* "cryptonym.com", true */ 'c', 'r', 'y', 'p', 't', 'o', 'n', 'y', 'm', '.', 'c', 'o', 'm', '\0',
       /* "cryptoparty.at", true */ 'c', 'r', 'y', 'p', 't', 'o', 'p', 'a', 'r', 't', 'y', '.', 'a', 't', '\0',
    @@ -2717,7 +2709,6 @@ static const char kSTSHostTable[] = {
       /* "darkdestiny.ch", true */ 'd', 'a', 'r', 'k', 'd', 'e', 's', 't', 'i', 'n', 'y', '.', 'c', 'h', '\0',
       /* "darkishgreen.com", true */ 'd', 'a', 'r', 'k', 'i', 's', 'h', 'g', 'r', 'e', 'e', 'n', '.', 'c', 'o', 'm', '\0',
       /* "darkkeepers.dk", true */ 'd', 'a', 'r', 'k', 'k', 'e', 'e', 'p', 'e', 'r', 's', '.', 'd', 'k', '\0',
    -  /* "darknode.in", true */ 'd', 'a', 'r', 'k', 'n', 'o', 'd', 'e', '.', 'i', 'n', '\0',
       /* "darkpony.ru", true */ 'd', 'a', 'r', 'k', 'p', 'o', 'n', 'y', '.', 'r', 'u', '\0',
       /* "darkserver.fedoraproject.org", true */ 'd', 'a', 'r', 'k', 's', 'e', 'r', 'v', 'e', 'r', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
       /* "darkserver.stg.fedoraproject.org", true */ 'd', 'a', 'r', 'k', 's', 'e', 'r', 'v', 'e', 'r', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
    @@ -2809,6 +2800,7 @@ static const char kSTSHostTable[] = {
       /* "deadbeef.ninja", true */ 'd', 'e', 'a', 'd', 'b', 'e', 'e', 'f', '.', 'n', 'i', 'n', 'j', 'a', '\0',
       /* "deadsoul.net", true */ 'd', 'e', 'a', 'd', 's', 'o', 'u', 'l', '.', 'n', 'e', 't', '\0',
       /* "deaf.dating", true */ 'd', 'e', 'a', 'f', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
    +  /* "deaktualisierung.org", true */ 'd', 'e', 'a', 'k', 't', 'u', 'a', 'l', 'i', 's', 'i', 'e', 'r', 'u', 'n', 'g', '.', 'o', 'r', 'g', '\0',
       /* "dealbanana.at", true */ 'd', 'e', 'a', 'l', 'b', 'a', 'n', 'a', 'n', 'a', '.', 'a', 't', '\0',
       /* "dealbanana.be", true */ 'd', 'e', 'a', 'l', 'b', 'a', 'n', 'a', 'n', 'a', '.', 'b', 'e', '\0',
       /* "dealbanana.co.uk", true */ 'd', 'e', 'a', 'l', 'b', 'a', 'n', 'a', 'n', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0',
    @@ -2843,6 +2835,7 @@ static const char kSTSHostTable[] = {
       /* "deeprecce.com", true */ 'd', 'e', 'e', 'p', 'r', 'e', 'c', 'c', 'e', '.', 'c', 'o', 'm', '\0',
       /* "deeprecce.link", true */ 'd', 'e', 'e', 'p', 'r', 'e', 'c', 'c', 'e', '.', 'l', 'i', 'n', 'k', '\0',
       /* "deeprecce.tech", true */ 'd', 'e', 'e', 'p', 'r', 'e', 'c', 'c', 'e', '.', 't', 'e', 'c', 'h', '\0',
    +  /* "deepserve.info", true */ 'd', 'e', 'e', 'p', 's', 'e', 'r', 'v', 'e', '.', 'i', 'n', 'f', 'o', '\0',
       /* "deepzz.com", true */ 'd', 'e', 'e', 'p', 'z', 'z', '.', 'c', 'o', 'm', '\0',
       /* "deer.team", true */ 'd', 'e', 'e', 'r', '.', 't', 'e', 'a', 'm', '\0',
       /* "deetzen.de", true */ 'd', 'e', 'e', 't', 'z', 'e', 'n', '.', 'd', 'e', '\0',
    @@ -2899,6 +2892,7 @@ static const char kSTSHostTable[] = {
       /* "derp.army", true */ 'd', 'e', 'r', 'p', '.', 'a', 'r', 'm', 'y', '\0',
       /* "derreichesack.com", true */ 'd', 'e', 'r', 'r', 'e', 'i', 'c', 'h', 'e', 's', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
       /* "dersoundhunter.de", true */ 'd', 'e', 'r', 's', 'o', 'u', 'n', 'd', 'h', 'u', 'n', 't', 'e', 'r', '.', 'd', 'e', '\0',
    +  /* "designed-cybersecurity.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'e', 'd', '-', 'c', 'y', 'b', 'e', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
       /* "designgears.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'g', 'e', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0',
       /* "designhotel-kronjuwel.de", true */ 'd', 'e', 's', 'i', 'g', 'n', 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0',
       /* "designsbyjanith.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 's', 'b', 'y', 'j', 'a', 'n', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0',
    @@ -3178,7 +3172,6 @@ static const char kSTSHostTable[] = {
       /* "dopesoft.de", true */ 'd', 'o', 'p', 'e', 's', 'o', 'f', 't', '.', 'd', 'e', '\0',
       /* "doppenpost.nl", true */ 'd', 'o', 'p', 'p', 'e', 'n', 'p', 'o', 's', 't', '.', 'n', 'l', '\0',
       /* "dorianharmans.nl", true */ 'd', 'o', 'r', 'i', 'a', 'n', 'h', 'a', 'r', 'm', 'a', 'n', 's', '.', 'n', 'l', '\0',
    -  /* "dorianmuthig.com", true */ 'd', 'o', 'r', 'i', 'a', 'n', 'm', 'u', 't', 'h', 'i', 'g', '.', 'c', 'o', 'm', '\0',
       /* "dot.ro", true */ 'd', 'o', 't', '.', 'r', 'o', '\0',
       /* "dot42.no", true */ 'd', 'o', 't', '4', '2', '.', 'n', 'o', '\0',
       /* "dotbigbang.com", true */ 'd', 'o', 't', 'b', 'i', 'g', 'b', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0',
    @@ -3442,7 +3435,6 @@ static const char kSTSHostTable[] = {
       /* "eighty-aid.com", true */ 'e', 'i', 'g', 'h', 't', 'y', '-', 'a', 'i', 'd', '.', 'c', 'o', 'm', '\0',
       /* "eimacs.com", true */ 'e', 'i', 'm', 'a', 'c', 's', '.', 'c', 'o', 'm', '\0',
       /* "eimanavicius.lt", true */ 'e', 'i', 'm', 'a', 'n', 'a', 'v', 'i', 'c', 'i', 'u', 's', '.', 'l', 't', '\0',
    -  /* "einaros.is", true */ 'e', 'i', 'n', 'a', 'r', 'o', 's', '.', 'i', 's', '\0',
       /* "einheizpreis.de", true */ 'e', 'i', 'n', 'h', 'e', 'i', 'z', 'p', 'r', 'e', 'i', 's', '.', 'd', 'e', '\0',
       /* "einsatzstellenverwaltung.de", true */ 'e', 'i', 'n', 's', 'a', 't', 'z', 's', 't', 'e', 'l', 'l', 'e', 'n', 'v', 'e', 'r', 'w', 'a', 'l', 't', 'u', 'n', 'g', '.', 'd', 'e', '\0',
       /* "eintageinzug.de", true */ 'e', 'i', 'n', 't', 'a', 'g', 'e', 'i', 'n', 'z', 'u', 'g', '.', 'd', 'e', '\0',
    @@ -3584,7 +3576,6 @@ static const char kSTSHostTable[] = {
       /* "englerts.de", true */ 'e', 'n', 'g', 'l', 'e', 'r', 't', 's', '.', 'd', 'e', '\0',
       /* "englishbulgaria.net", true */ 'e', 'n', 'g', 'l', 'i', 's', 'h', 'b', 'u', 'l', 'g', 'a', 'r', 'i', 'a', '.', 'n', 'e', 't', '\0',
       /* "englishclub.com", true */ 'e', 'n', 'g', 'l', 'i', 's', 'h', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0',
    -  /* "englishforums.com", true */ 'e', 'n', 'g', 'l', 'i', 's', 'h', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0',
       /* "enigmacpt.com", true */ 'e', 'n', 'i', 'g', 'm', 'a', 'c', 'p', 't', '.', 'c', 'o', 'm', '\0',
       /* "enjen.net", true */ 'e', 'n', 'j', 'e', 'n', '.', 'n', 'e', 't', '\0',
       /* "enjoy-nepal.de", true */ 'e', 'n', 'j', 'o', 'y', '-', 'n', 'e', 'p', 'a', 'l', '.', 'd', 'e', '\0',
    @@ -3659,7 +3650,6 @@ static const char kSTSHostTable[] = {
       /* "erpband.ru", true */ 'e', 'r', 'p', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0',
       /* "erpcargo.com", false */ 'e', 'r', 'p', 'c', 'a', 'r', 'g', 'o', '.', 'c', 'o', 'm', '\0',
       /* "ersindemirtas.com", true */ 'e', 'r', 's', 'i', 'n', 'd', 'e', 'm', 'i', 'r', 't', 'a', 's', '.', 'c', 'o', 'm', '\0',
    -  /* "eru.me", true */ 'e', 'r', 'u', '.', 'm', 'e', '\0',
       /* "erudikum.cz", true */ 'e', 'r', 'u', 'd', 'i', 'k', 'u', 'm', '.', 'c', 'z', '\0',
       /* "erwanlepape.com", true */ 'e', 'r', 'w', 'a', 'n', 'l', 'e', 'p', 'a', 'p', 'e', '.', 'c', 'o', 'm', '\0',
       /* "erwinwensveen.nl", true */ 'e', 'r', 'w', 'i', 'n', 'w', 'e', 'n', 's', 'v', 'e', 'e', 'n', '.', 'n', 'l', '\0',
    @@ -3753,13 +3743,13 @@ static const char kSTSHostTable[] = {
       /* "everhome.de", true */ 'e', 'v', 'e', 'r', 'h', 'o', 'm', 'e', '.', 'd', 'e', '\0',
       /* "everling.lu", true */ 'e', 'v', 'e', 'r', 'l', 'i', 'n', 'g', '.', 'l', 'u', '\0',
       /* "everwaking.com", false */ 'e', 'v', 'e', 'r', 'w', 'a', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
    -  /* "everylab.org", true */ 'e', 'v', 'e', 'r', 'y', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0',
       /* "everymove.org", true */ 'e', 'v', 'e', 'r', 'y', 'm', 'o', 'v', 'e', '.', 'o', 'r', 'g', '\0',
       /* "everywhere.cloud", true */ 'e', 'v', 'e', 'r', 'y', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'l', 'o', 'u', 'd', '\0',
       /* "eveseat.net", true */ 'e', 'v', 'e', 's', 'e', 'a', 't', '.', 'n', 'e', 't', '\0',
       /* "eveshamglass.co.uk", true */ 'e', 'v', 'e', 's', 'h', 'a', 'm', 'g', 'l', 'a', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "evilized.de", true */ 'e', 'v', 'i', 'l', 'i', 'z', 'e', 'd', '.', 'd', 'e', '\0',
       /* "evilsay.com", true */ 'e', 'v', 'i', 'l', 's', 'a', 'y', '.', 'c', 'o', 'm', '\0',
    +  /* "evites.me", true */ 'e', 'v', 'i', 't', 'e', 's', '.', 'm', 'e', '\0',
       /* "evlear.com", true */ 'e', 'v', 'l', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0',
       /* "evodation.com", true */ 'e', 'v', 'o', 'd', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
       /* "evolutionlending.co.uk", true */ 'e', 'v', 'o', 'l', 'u', 't', 'i', 'o', 'n', 'l', 'e', 'n', 'd', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
    @@ -3781,6 +3771,7 @@ static const char kSTSHostTable[] = {
       /* "exon.io", true */ 'e', 'x', 'o', 'n', '.', 'i', 'o', '\0',
       /* "exoscale.ch", true */ 'e', 'x', 'o', 's', 'c', 'a', 'l', 'e', '.', 'c', 'h', '\0',
       /* "exoticads.com", true */ 'e', 'x', 'o', 't', 'i', 'c', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
    +  /* "exousiakaidunamis.xyz", true */ 'e', 'x', 'o', 'u', 's', 'i', 'a', 'k', 'a', 'i', 'd', 'u', 'n', 'a', 'm', 'i', 's', '.', 'x', 'y', 'z', '\0',
       /* "exp.de", true */ 'e', 'x', 'p', '.', 'd', 'e', '\0',
       /* "expatads.com", true */ 'e', 'x', 'p', 'a', 't', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
       /* "experienceoz.com.au", true */ 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'o', 'z', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
    @@ -3847,7 +3838,6 @@ static const char kSTSHostTable[] = {
       /* "fairbill.com", true */ 'f', 'a', 'i', 'r', 'b', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0',
       /* "faircom.co.za", true */ 'f', 'a', 'i', 'r', 'c', 'o', 'm', '.', 'c', 'o', '.', 'z', 'a', '\0',
       /* "faithwatch.org", true */ 'f', 'a', 'i', 't', 'h', 'w', 'a', 't', 'c', 'h', '.', 'o', 'r', 'g', '\0',
    -  /* "fakeletters.org", true */ 'f', 'a', 'k', 'e', 'l', 'e', 't', 't', 'e', 'r', 's', '.', 'o', 'r', 'g', '\0',
       /* "faktura.pl", true */ 'f', 'a', 'k', 't', 'u', 'r', 'a', '.', 'p', 'l', '\0',
       /* "fakturi.com", true */ 'f', 'a', 'k', 't', 'u', 'r', 'i', '.', 'c', 'o', 'm', '\0',
       /* "fakturoid.cz", true */ 'f', 'a', 'k', 't', 'u', 'r', 'o', 'i', 'd', '.', 'c', 'z', '\0',
    @@ -4160,7 +4150,6 @@ static const char kSTSHostTable[] = {
       /* "fotostudio-schweiz.ch", true */ 'f', 'o', 't', 'o', 's', 't', 'u', 'd', 'i', 'o', '-', 's', 'c', 'h', 'w', 'e', 'i', 'z', '.', 'c', 'h', '\0',
       /* "fotowettbewerb.co", true */ 'f', 'o', 't', 'o', 'w', 'e', 't', 't', 'b', 'e', 'w', 'e', 'r', 'b', '.', 'c', 'o', '\0',
       /* "fotowolfy.com", true */ 'f', 'o', 't', 'o', 'w', 'o', 'l', 'f', 'y', '.', 'c', 'o', 'm', '\0',
    -  /* "fourchin.net", true */ 'f', 'o', 'u', 'r', 'c', 'h', 'i', 'n', '.', 'n', 'e', 't', '\0',
       /* "foxbnc.co.uk", true */ 'f', 'o', 'x', 'b', 'n', 'c', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "foxdev.co", true */ 'f', 'o', 'x', 'd', 'e', 'v', '.', 'c', 'o', '\0',
       /* "foxley-farm.co.uk", true */ 'f', 'o', 'x', 'l', 'e', 'y', '-', 'f', 'a', 'r', 'm', '.', 'c', 'o', '.', 'u', 'k', '\0',
    @@ -4341,7 +4330,6 @@ static const char kSTSHostTable[] = {
       /* "galactic-crew.org", true */ 'g', 'a', 'l', 'a', 'c', 't', 'i', 'c', '-', 'c', 'r', 'e', 'w', '.', 'o', 'r', 'g', '\0',
       /* "galardi.org", true */ 'g', 'a', 'l', 'a', 'r', 'd', 'i', '.', 'o', 'r', 'g', '\0',
       /* "galena.io", true */ 'g', 'a', 'l', 'e', 'n', 'a', '.', 'i', 'o', '\0',
    -  /* "galoisvpn.xyz", true */ 'g', 'a', 'l', 'o', 'i', 's', 'v', 'p', 'n', '.', 'x', 'y', 'z', '\0',
       /* "gam3rs.de", true */ 'g', 'a', 'm', '3', 'r', 's', '.', 'd', 'e', '\0',
       /* "gamajo.com", true */ 'g', 'a', 'm', 'a', 'j', 'o', '.', 'c', 'o', 'm', '\0',
       /* "gamberorosso.menu", true */ 'g', 'a', 'm', 'b', 'e', 'r', 'o', 'r', 'o', 's', 's', 'o', '.', 'm', 'e', 'n', 'u', '\0',
    @@ -4452,6 +4440,7 @@ static const char kSTSHostTable[] = {
       /* "genshiken.org", true */ 'g', 'e', 'n', 's', 'h', 'i', 'k', 'e', 'n', '.', 'o', 'r', 'g', '\0',
       /* "genslerapps.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0',
       /* "genslerwisp.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'w', 'i', 's', 'p', '.', 'c', 'o', 'm', '\0',
    +  /* "genuxtsg.com", true */ 'g', 'e', 'n', 'u', 'x', 't', 's', 'g', '.', 'c', 'o', 'm', '\0',
       /* "genxbeats.com", true */ 'g', 'e', 'n', 'x', 'b', 'e', 'a', 't', 's', '.', 'c', 'o', 'm', '\0',
       /* "genxnotes.com", true */ 'g', 'e', 'n', 'x', 'n', 'o', 't', 'e', 's', '.', 'c', 'o', 'm', '\0',
       /* "genyhitch.com", true */ 'g', 'e', 'n', 'y', 'h', 'i', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0',
    @@ -4518,12 +4507,10 @@ static const char kSTSHostTable[] = {
       /* "ggservers.com", true */ 'g', 'g', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
       /* "ggss.cf", true */ 'g', 'g', 's', 's', '.', 'c', 'f', '\0',
       /* "ggss.ml", true */ 'g', 'g', 's', 's', '.', 'm', 'l', '\0',
    -  /* "ggx.us", true */ 'g', 'g', 'x', '.', 'u', 's', '\0',
       /* "gh16.com.ar", true */ 'g', 'h', '1', '6', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
       /* "gha.st", true */ 'g', 'h', 'a', '.', 's', 't', '\0',
       /* "ghcif.de", true */ 'g', 'h', 'c', 'i', 'f', '.', 'd', 'e', '\0',
       /* "gheorghe-sarcov.ga", true */ 'g', 'h', 'e', 'o', 'r', 'g', 'h', 'e', '-', 's', 'a', 'r', 'c', 'o', 'v', '.', 'g', 'a', '\0',
    -  /* "ghostblog.info", true */ 'g', 'h', 'o', 's', 't', 'b', 'l', 'o', 'g', '.', 'i', 'n', 'f', 'o', '\0',
       /* "ghostwritershigh.com", true */ 'g', 'h', 'o', 's', 't', 'w', 'r', 'i', 't', 'e', 'r', 's', 'h', 'i', 'g', 'h', '.', 'c', 'o', 'm', '\0',
       /* "ghrelinblocker.info", true */ 'g', 'h', 'r', 'e', 'l', 'i', 'n', 'b', 'l', 'o', 'c', 'k', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0',
       /* "giacomodrago.com", true */ 'g', 'i', 'a', 'c', 'o', 'm', 'o', 'd', 'r', 'a', 'g', 'o', '.', 'c', 'o', 'm', '\0',
    @@ -4638,6 +4625,7 @@ static const char kSTSHostTable[] = {
       /* "googlemail.com", false */ 'g', 'o', 'o', 'g', 'l', 'e', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0',
       /* "googleplex.com", true */ 'g', 'o', 'o', 'g', 'l', 'e', 'p', 'l', 'e', 'x', '.', 'c', 'o', 'm', '\0',
       /* "googlesource.com", true */ 'g', 'o', 'o', 'g', 'l', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'c', 'o', 'm', '\0',
    +  /* "goolok.com", true */ 'g', 'o', 'o', 'l', 'o', 'k', '.', 'c', 'o', 'm', '\0',
       /* "goozz.nl", true */ 'g', 'o', 'o', 'z', 'z', '.', 'n', 'l', '\0',
       /* "gopay.cz", true */ 'g', 'o', 'p', 'a', 'y', '.', 'c', 'z', '\0',
       /* "gopokego.cz", true */ 'g', 'o', 'p', 'o', 'k', 'e', 'g', 'o', '.', 'c', 'z', '\0',
    @@ -4778,6 +4766,7 @@ static const char kSTSHostTable[] = {
       /* "grunwasser.fr", true */ 'g', 'r', 'u', 'n', 'w', 'a', 's', 's', 'e', 'r', '.', 'f', 'r', '\0',
       /* "grusig-geil.ch", true */ 'g', 'r', 'u', 's', 'i', 'g', '-', 'g', 'e', 'i', 'l', '.', 'c', 'h', '\0',
       /* "grytics.com", true */ 'g', 'r', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
    +  /* "gs-net.at", true */ 'g', 's', '-', 'n', 'e', 't', '.', 'a', 't', '\0',
       /* "gsimagebank.co.uk", true */ 'g', 's', 'i', 'm', 'a', 'g', 'e', 'b', 'a', 'n', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "gsnort.com", true */ 'g', 's', 'n', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
       /* "gsrc.io", true */ 'g', 's', 'r', 'c', '.', 'i', 'o', '\0',
    @@ -5036,7 +5025,6 @@ static const char kSTSHostTable[] = {
       /* "hentschke-bau.de", true */ 'h', 'e', 'n', 't', 's', 'c', 'h', 'k', 'e', '-', 'b', 'a', 'u', '.', 'd', 'e', '\0',
       /* "hentschke-invest.de", true */ 'h', 'e', 'n', 't', 's', 'c', 'h', 'k', 'e', '-', 'i', 'n', 'v', 'e', 's', 't', '.', 'd', 'e', '\0',
       /* "heppler.net", true */ 'h', 'e', 'p', 'p', 'l', 'e', 'r', '.', 'n', 'e', 't', '\0',
    -  /* "hepteract.us", true */ 'h', 'e', 'p', 't', 'e', 'r', 'a', 'c', 't', '.', 'u', 's', '\0',
       /* "herbandpat.org", true */ 'h', 'e', 'r', 'b', 'a', 'n', 'd', 'p', 'a', 't', '.', 'o', 'r', 'g', '\0',
       /* "herbert.io", true */ 'h', 'e', 'r', 'b', 'e', 'r', 't', '.', 'i', 'o', '\0',
       /* "herbertmouwen.nl", true */ 'h', 'e', 'r', 'b', 'e', 'r', 't', 'm', 'o', 'u', 'w', 'e', 'n', '.', 'n', 'l', '\0',
    @@ -5251,6 +5239,7 @@ static const char kSTSHostTable[] = {
       /* "husic.net", true */ 'h', 'u', 's', 'i', 'c', '.', 'n', 'e', 't', '\0',
       /* "husky.xyz", true */ 'h', 'u', 's', 'k', 'y', '.', 'x', 'y', 'z', '\0',
       /* "huskybutt.dog", true */ 'h', 'u', 's', 'k', 'y', 'b', 'u', 't', 't', '.', 'd', 'o', 'g', '\0',
    +  /* "huskyinc.us", true */ 'h', 'u', 's', 'k', 'y', 'i', 'n', 'c', '.', 'u', 's', '\0',
       /* "hussam.eu.org", true */ 'h', 'u', 's', 's', 'a', 'm', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0',
       /* "huutonauru.net", true */ 'h', 'u', 'u', 't', 'o', 'n', 'a', 'u', 'r', 'u', '.', 'n', 'e', 't', '\0',
       /* "hwag-pb.de", true */ 'h', 'w', 'a', 'g', '-', 'p', 'b', '.', 'd', 'e', '\0',
    @@ -5340,7 +5329,6 @@ static const char kSTSHostTable[] = {
       /* "ifconfig.co", true */ 'i', 'f', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', '\0',
       /* "iflare.de", true */ 'i', 'f', 'l', 'a', 'r', 'e', '.', 'd', 'e', '\0',
       /* "iformbuilder.com", false */ 'i', 'f', 'o', 'r', 'm', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
    -  /* "ifoss.me", true */ 'i', 'f', 'o', 's', 's', '.', 'm', 'e', '\0',
       /* "ifsac.org", true */ 'i', 'f', 's', 'a', 'c', '.', 'o', 'r', 'g', '\0',
       /* "ifsr.de", true */ 'i', 'f', 's', 'r', '.', 'd', 'e', '\0',
       /* "iftrue.de", true */ 'i', 'f', 't', 'r', 'u', 'e', '.', 'd', 'e', '\0',
    @@ -5653,7 +5641,6 @@ static const char kSTSHostTable[] = {
       /* "istheapplestoredown.com", true */ 'i', 's', 't', 'h', 'e', 'a', 'p', 'p', 'l', 'e', 's', 't', 'o', 'r', 'e', 'd', 'o', 'w', 'n', '.', 'c', 'o', 'm', '\0',
       /* "istheapplestoredown.de", true */ 'i', 's', 't', 'h', 'e', 'a', 'p', 'p', 'l', 'e', 's', 't', 'o', 'r', 'e', 'd', 'o', 'w', 'n', '.', 'd', 'e', '\0',
       /* "istherrienstillcoach.com", true */ 'i', 's', 't', 'h', 'e', 'r', 'r', 'i', 'e', 'n', 's', 't', 'i', 'l', 'l', 'c', 'o', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0',
    -  /* "istorrent.is", true */ 'i', 's', 't', 'o', 'r', 'r', 'e', 'n', 't', '.', 'i', 's', '\0',
       /* "isvbscriptdead.com", true */ 'i', 's', 'v', 'b', 's', 'c', 'r', 'i', 'p', 't', 'd', 'e', 'a', 'd', '.', 'c', 'o', 'm', '\0',
       /* "it-adminio.ru", true */ 'i', 't', '-', 'a', 'd', 'm', 'i', 'n', 'i', 'o', '.', 'r', 'u', '\0',
       /* "it-rotter.de", true */ 'i', 't', '-', 'r', 'o', 't', 't', 'e', 'r', '.', 'd', 'e', '\0',
    @@ -5805,7 +5792,6 @@ static const char kSTSHostTable[] = {
       /* "javalestari.com", true */ 'j', 'a', 'v', 'a', 'l', 'e', 's', 't', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0',
       /* "javelinsms.com", true */ 'j', 'a', 'v', 'e', 'l', 'i', 'n', 's', 'm', 's', '.', 'c', 'o', 'm', '\0',
       /* "jayf.de", true */ 'j', 'a', 'y', 'f', '.', 'd', 'e', '\0',
    -  /* "jayharris.ca", true */ 'j', 'a', 'y', 'h', 'a', 'r', 'r', 'i', 's', '.', 'c', 'a', '\0',
       /* "jaylen.com.ar", true */ 'j', 'a', 'y', 'l', 'e', 'n', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
       /* "jaymecd.rocks", true */ 'j', 'a', 'y', 'm', 'e', 'c', 'd', '.', 'r', 'o', 'c', 'k', 's', '\0',
       /* "jayschulman.com", true */ 'j', 'a', 'y', 's', 'c', 'h', 'u', 'l', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
    @@ -5819,7 +5805,6 @@ static const char kSTSHostTable[] = {
       /* "jbradaric.me", true */ 'j', 'b', 'r', 'a', 'd', 'a', 'r', 'i', 'c', '.', 'm', 'e', '\0',
       /* "jcaicedo.tk", true */ 'j', 'c', 'a', 'i', 'c', 'e', 'd', 'o', '.', 't', 'k', '\0',
       /* "jccrew.org", true */ 'j', 'c', 'c', 'r', 'e', 'w', '.', 'o', 'r', 'g', '\0',
    -  /* "jcoscia.com", true */ 'j', 'c', 'o', 's', 'c', 'i', 'a', '.', 'c', 'o', 'm', '\0',
       /* "jcraft.us", true */ 'j', 'c', 'r', 'a', 'f', 't', '.', 'u', 's', '\0',
       /* "jcyz.cf", true */ 'j', 'c', 'y', 'z', '.', 'c', 'f', '\0',
       /* "jdav-leipzig.de", true */ 'j', 'd', 'a', 'v', '-', 'l', 'e', 'i', 'p', 'z', 'i', 'g', '.', 'd', 'e', '\0',
    @@ -5902,13 +5887,13 @@ static const char kSTSHostTable[] = {
       /* "jobss.co.uk", true */ 'j', 'o', 'b', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "jodlajodla.si", true */ 'j', 'o', 'd', 'l', 'a', 'j', 'o', 'd', 'l', 'a', '.', 's', 'i', '\0',
       /* "joduska.me", true */ 'j', 'o', 'd', 'u', 's', 'k', 'a', '.', 'm', 'e', '\0',
    -  /* "jodyboucher.com", true */ 'j', 'o', 'd', 'y', 'b', 'o', 'u', 'c', 'h', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "joe-pagan.com", true */ 'j', 'o', 'e', '-', 'p', 'a', 'g', 'a', 'n', '.', 'c', 'o', 'm', '\0',
       /* "joehenry.co.uk", true */ 'j', 'o', 'e', 'h', 'e', 'n', 'r', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "joelj.org", true */ 'j', 'o', 'e', 'l', 'j', '.', 'o', 'r', 'g', '\0',
       /* "joepitt.co.uk", false */ 'j', 'o', 'e', 'p', 'i', 't', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "joerss.at", true */ 'j', 'o', 'e', 'r', 's', 's', '.', 'a', 't', '\0',
       /* "joestead.codes", true */ 'j', 'o', 'e', 's', 't', 'e', 'a', 'd', '.', 'c', 'o', 'd', 'e', 's', '\0',
    +  /* "jogi-server.de", true */ 'j', 'o', 'g', 'i', '-', 's', 'e', 'r', 'v', 'e', 'r', '.', 'd', 'e', '\0',
       /* "jogorama.com.br", false */ 'j', 'o', 'g', 'o', 'r', 'a', 'm', 'a', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
       /* "johannes-sprink.de", true */ 'j', 'o', 'h', 'a', 'n', 'n', 'e', 's', '-', 's', 'p', 'r', 'i', 'n', 'k', '.', 'd', 'e', '\0',
       /* "johannes.io", true */ 'j', 'o', 'h', 'a', 'n', 'n', 'e', 's', '.', 'i', 'o', '\0',
    @@ -5929,7 +5914,6 @@ static const char kSTSHostTable[] = {
       /* "jokewignand.nl", true */ 'j', 'o', 'k', 'e', 'w', 'i', 'g', 'n', 'a', 'n', 'd', '.', 'n', 'l', '\0',
       /* "jollausers.de", true */ 'j', 'o', 'l', 'l', 'a', 'u', 's', 'e', 'r', 's', '.', 'd', 'e', '\0',
       /* "jonarcher.info", true */ 'j', 'o', 'n', 'a', 'r', 'c', 'h', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0',
    -  /* "jonas-thelemann.de", true */ 'j', 'o', 'n', 'a', 's', '-', 't', 'h', 'e', 'l', 'e', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
       /* "jonaskjodt.com", true */ 'j', 'o', 'n', 'a', 's', 'k', 'j', 'o', 'd', 't', '.', 'c', 'o', 'm', '\0',
       /* "jonaswitmer.ch", true */ 'j', 'o', 'n', 'a', 's', 'w', 'i', 't', 'm', 'e', 'r', '.', 'c', 'h', '\0',
       /* "jonathan-apps.com", true */ 'j', 'o', 'n', 'a', 't', 'h', 'a', 'n', '-', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0',
    @@ -6070,6 +6054,7 @@ static const char kSTSHostTable[] = {
       /* "kana.me", true */ 'k', 'a', 'n', 'a', '.', 'm', 'e', '\0',
       /* "kanar.nl", true */ 'k', 'a', 'n', 'a', 'r', '.', 'n', 'l', '\0',
       /* "kandalife.com", true */ 'k', 'a', 'n', 'd', 'a', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '\0',
    +  /* "kanehusky.com", true */ 'k', 'a', 'n', 'e', 'h', 'u', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
       /* "kaneo-gmbh.de", true */ 'k', 'a', 'n', 'e', 'o', '-', 'g', 'm', 'b', 'h', '.', 'd', 'e', '\0',
       /* "kangarooislandholidayaccommodation.com.au", true */ 'k', 'a', 'n', 'g', 'a', 'r', 'o', 'o', 'i', 's', 'l', 'a', 'n', 'd', 'h', 'o', 'l', 'i', 'd', 'a', 'y', 'a', 'c', 'c', 'o', 'm', 'm', 'o', 'd', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
       /* "kaniklani.co.za", true */ 'k', 'a', 'n', 'i', 'k', 'l', 'a', 'n', 'i', '.', 'c', 'o', '.', 'z', 'a', '\0',
    @@ -6188,7 +6173,6 @@ static const char kSTSHostTable[] = {
       /* "kevindekoninck.com", false */ 'k', 'e', 'v', 'i', 'n', 'd', 'e', 'k', 'o', 'n', 'i', 'n', 'c', 'k', '.', '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',
    -  /* "keycdn.com", true */ 'k', 'e', 'y', 'c', 'd', 'n', '.', 'c', 'o', 'm', '\0',
       /* "keyerror.com", true */ 'k', 'e', 'y', 'e', 'r', 'r', 'o', 'r', '.', 'c', 'o', 'm', '\0',
       /* "keys.fedoraproject.org", true */ 'k', 'e', 'y', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
       /* "kfbrussels.be", true */ 'k', 'f', 'b', 'r', 'u', 's', 's', 'e', 'l', 's', '.', 'b', 'e', '\0',
    @@ -6236,6 +6220,7 @@ static const char kSTSHostTable[] = {
       /* "kinganywhere.eu", true */ 'k', 'i', 'n', 'g', 'a', 'n', 'y', 'w', 'h', 'e', 'r', 'e', '.', 'e', 'u', '\0',
       /* "kingbird.me", true */ 'k', 'i', 'n', 'g', 'b', 'i', 'r', 'd', '.', 'm', 'e', '\0',
       /* "kingqueen.org.uk", true */ 'k', 'i', 'n', 'g', 'q', 'u', 'e', 'e', 'n', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
    +  /* "kini24.ru", true */ 'k', 'i', 'n', 'i', '2', '4', '.', 'r', 'u', '\0',
       /* "kinkdr.com", true */ 'k', 'i', 'n', 'k', 'd', 'r', '.', 'c', 'o', 'm', '\0',
       /* "kinkenonline.com", true */ 'k', 'i', 'n', 'k', 'e', 'n', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
       /* "kinomoto.me", true */ 'k', 'i', 'n', 'o', 'm', 'o', 't', 'o', '.', 'm', 'e', '\0',
    @@ -6265,7 +6250,6 @@ static const char kSTSHostTable[] = {
       /* "kissflow.com", true */ 'k', 'i', 's', 's', 'f', 'l', 'o', 'w', '.', 'c', 'o', 'm', '\0',
       /* "kisskiss.ch", true */ 'k', 'i', 's', 's', 'k', 'i', 's', 's', '.', 'c', 'h', '\0',
       /* "kisstyle.ru", true */ 'k', 'i', 's', 's', 't', 'y', 'l', 'e', '.', 'r', 'u', '\0',
    -  /* "kita.id", true */ 'k', 'i', 't', 'a', '.', 'i', 'd', '\0',
       /* "kitabgaul.com", true */ 'k', 'i', 't', 'a', 'b', 'g', 'a', 'u', 'l', '.', 'c', 'o', 'm', '\0',
       /* "kitsostech.com", true */ 'k', 'i', 't', 's', 'o', 's', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
       /* "kittmedia.com", true */ 'k', 'i', 't', 't', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
    @@ -6462,7 +6446,6 @@ static const char kSTSHostTable[] = {
       /* "kutukupret.com", true */ 'k', 'u', 't', 'u', 'k', 'u', 'p', 'r', 'e', 't', '.', 'c', 'o', 'm', '\0',
       /* "kuwago.io", true */ 'k', 'u', 'w', 'a', 'g', 'o', '.', 'i', 'o', '\0',
       /* "kvalita-1a.cz", true */ 'k', 'v', 'a', 'l', 'i', 't', 'a', '-', '1', 'a', '.', 'c', 'z', '\0',
    -  /* "kwbresidential.com", true */ 'k', 'w', 'b', 'r', 'e', 's', 'i', 'd', 'e', 'n', 't', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0',
       /* "kwidz.fr", true */ 'k', 'w', 'i', 'd', 'z', '.', 'f', 'r', '\0',
       /* "kwikmed.eu", false */ 'k', 'w', 'i', 'k', 'm', 'e', 'd', '.', 'e', 'u', '\0',
       /* "kwmr.me", true */ 'k', 'w', 'm', 'r', '.', 'm', 'e', '\0',
    @@ -6558,7 +6541,6 @@ static const char kSTSHostTable[] = {
       /* "lathamlabs.org", true */ 'l', 'a', 't', 'h', 'a', 'm', 'l', 'a', 'b', 's', '.', 'o', 'r', 'g', '\0',
       /* "latino.dating", true */ 'l', 'a', 't', 'i', 'n', 'o', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
       /* "latinphone.com", true */ 'l', 'a', 't', 'i', 'n', 'p', 'h', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
    -  /* "latitude42technology.com", true */ 'l', 'a', 't', 'i', 't', 'u', 'd', 'e', '4', '2', 't', 'e', 'c', 'h', 'n', 'o', 'l', 'o', 'g', 'y', '.', 'c', 'o', 'm', '\0',
       /* "latrine.cz", true */ 'l', 'a', 't', 'r', 'i', 'n', 'e', '.', 'c', 'z', '\0',
       /* "lattyware.co.uk", true */ 'l', 'a', 't', 't', 'y', 'w', 'a', 'r', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "lattyware.com", true */ 'l', 'a', 't', 't', 'y', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
    @@ -6581,6 +6563,7 @@ static const char kSTSHostTable[] = {
       /* "lawly.org", true */ 'l', 'a', 'w', 'l', 'y', '.', 'o', 'r', 'g', '\0',
       /* "lawrencemurgatroyd.com", true */ 'l', 'a', 'w', 'r', 'e', 'n', 'c', 'e', 'm', 'u', 'r', 'g', 'a', 't', 'r', 'o', 'y', 'd', '.', 'c', 'o', 'm', '\0',
       /* "layer8.tk", true */ 'l', 'a', 'y', 'e', 'r', '8', '.', 't', 'k', '\0',
    +  /* "laylo.nl", true */ 'l', 'a', 'y', 'l', 'o', '.', 'n', 'l', '\0',
       /* "lazerus.net", true */ 'l', 'a', 'z', 'e', 'r', 'u', 's', '.', 'n', 'e', 't', '\0',
       /* "lazurit.com", true */ 'l', 'a', 'z', 'u', 'r', 'i', 't', '.', 'c', 'o', 'm', '\0',
       /* "lb-toner.de", true */ 'l', 'b', '-', 't', 'o', 'n', 'e', 'r', '.', 'd', 'e', '\0',
    @@ -6616,7 +6599,6 @@ static const char kSTSHostTable[] = {
       /* "leedev.org", true */ 'l', 'e', 'e', 'd', 'e', 'v', '.', 'o', 'r', 'g', '\0',
       /* "leen.io", true */ 'l', 'e', 'e', 'n', '.', 'i', 'o', '\0',
       /* "leerliga.de", true */ 'l', 'e', 'e', 'r', 'l', 'i', 'g', 'a', '.', 'd', 'e', '\0',
    -  /* "leermotorrijden.nl", true */ 'l', 'e', 'e', 'r', 'm', 'o', 't', 'o', 'r', 'r', 'i', 'j', 'd', 'e', 'n', '.', 'n', 'l', '\0',
       /* "leertipp.de", true */ 'l', 'e', 'e', 'r', 't', 'i', 'p', 'p', '.', 'd', 'e', '\0',
       /* "leesilvey.com", true */ 'l', 'e', 'e', 's', 'i', 'l', 'v', 'e', 'y', '.', 'c', 'o', 'm', '\0',
       /* "lefebvristes.com", true */ 'l', 'e', 'f', 'e', 'b', 'v', 'r', 'i', 's', 't', 'e', 's', '.', 'c', 'o', 'm', '\0',
    @@ -6654,14 +6636,12 @@ static const char kSTSHostTable[] = {
       /* "lernorteuropa.com", true */ 'l', 'e', 'r', 'n', 'o', 'r', 't', 'e', 'u', 'r', 'o', 'p', 'a', '.', 'c', 'o', 'm', '\0',
       /* "lernorteuropa.de", true */ 'l', 'e', 'r', 'n', 'o', 'r', 't', 'e', 'u', 'r', 'o', 'p', 'a', '.', 'd', 'e', '\0',
       /* "lernorteuropa.eu", true */ 'l', 'e', 'r', 'n', 'o', 'r', 't', 'e', 'u', 'r', 'o', 'p', 'a', '.', 'e', 'u', '\0',
    -  /* "lerp.me", true */ 'l', 'e', 'r', 'p', '.', 'm', 'e', '\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',
       /* "lesharris.com", true */ 'l', 'e', 's', 'h', 'a', 'r', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
       /* "lesnet.co.uk", true */ 'l', 'e', 's', 'n', 'e', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "lesperlesdunet.fr", true */ 'l', 'e', 's', 'p', 'e', 'r', 'l', 'e', 's', 'd', 'u', 'n', 'e', 't', '.', 'f', 'r', '\0',
       /* "lesscloud.com", true */ 'l', 'e', 's', 's', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0',
       /* "lessing.consulting", true */ 'l', 'e', 's', 's', 'i', 'n', 'g', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0',
    -  /* "let-go.cc", true */ 'l', 'e', 't', '-', 'g', 'o', '.', 'c', 'c', '\0',
       /* "letsgame.nl", true */ 'l', 'e', 't', 's', 'g', 'a', 'm', 'e', '.', 'n', 'l', '\0',
       /* "letsmultiplayerplay.com", true */ 'l', 'e', 't', 's', 'm', 'u', 'l', 't', 'i', 'p', 'l', 'a', 'y', 'e', 'r', 'p', 'l', 'a', 'y', '.', 'c', 'o', 'm', '\0',
       /* "letstox.com", true */ 'l', 'e', 't', 's', 't', 'o', 'x', '.', 'c', 'o', 'm', '\0',
    @@ -6965,6 +6945,7 @@ static const char kSTSHostTable[] = {
       /* "lv0.it", true */ 'l', 'v', '0', '.', 'i', 't', '\0',
       /* "lvrsystems.com", true */ 'l', 'v', 'r', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0',
       /* "lwl-foej-bewerbung.de", true */ 'l', 'w', 'l', '-', 'f', 'o', 'e', 'j', '-', 'b', 'e', 'w', 'e', 'r', 'b', 'u', 'n', 'g', '.', 'd', 'e', '\0',
    +  /* "lwl.moe", true */ 'l', 'w', 'l', '.', 'm', 'o', 'e', '\0',
       /* "lwl12.com", true */ 'l', 'w', 'l', '1', '2', '.', 'c', 'o', 'm', '\0',
       /* "lyfbits.com", true */ 'l', 'y', 'f', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0',
       /* "lymia.moe", true */ 'l', 'y', 'm', 'i', 'a', '.', 'm', 'o', 'e', '\0',
    @@ -6977,6 +6958,7 @@ static const char kSTSHostTable[] = {
       /* "lyonl.com", true */ 'l', 'y', 'o', 'n', 'l', '.', 'c', 'o', 'm', '\0',
       /* "lyst.co.uk", true */ 'l', 'y', 's', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "lyx.dk", true */ 'l', 'y', 'x', '.', 'd', 'k', '\0',
    +  /* "lzzr.me", true */ 'l', 'z', 'z', 'r', '.', 'm', 'e', '\0',
       /* "m-edmondson.co.uk", true */ 'm', '-', 'e', 'd', 'm', 'o', 'n', 'd', 's', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "m-plan.com", true */ 'm', '-', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
       /* "m.facebook.com", false */ 'm', '.', 'f', 'a', 'c', 'e', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
    @@ -6992,8 +6974,8 @@ static const char kSTSHostTable[] = {
       /* "macaque.io", false */ 'm', 'a', 'c', 'a', 'q', 'u', 'e', '.', 'i', 'o', '\0',
       /* "macdj.tk", true */ 'm', 'a', 'c', 'd', 'j', '.', 't', 'k', '\0',
       /* "macgeneral.de", true */ 'm', 'a', 'c', 'g', 'e', 'n', 'e', 'r', 'a', 'l', '.', 'd', 'e', '\0',
    -  /* "mach-politik.ch", true */ 'm', 'a', 'c', 'h', '-', 'p', 'o', 'l', 'i', 't', 'i', 'k', '.', 'c', 'h', '\0',
       /* "machbach.com", true */ 'm', 'a', 'c', 'h', 'b', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0',
    +  /* "machon.biz", false */ 'm', 'a', 'c', 'h', 'o', 'n', '.', 'b', 'i', 'z', '\0',
       /* "machtweb.de", true */ 'm', 'a', 'c', 'h', 't', 'w', 'e', 'b', '.', 'd', 'e', '\0',
       /* "macinyasha.net", true */ 'm', 'a', 'c', 'i', 'n', 'y', 'a', 's', 'h', 'a', '.', 'n', 'e', 't', '\0',
       /* "maclemon.at", true */ 'm', 'a', 'c', 'l', 'e', 'm', 'o', 'n', '.', 'a', 't', '\0',
    @@ -7044,6 +7026,7 @@ static const char kSTSHostTable[] = {
       /* "mailpenny.com", true */ 'm', 'a', 'i', 'l', 'p', 'e', 'n', 'n', 'y', '.', 'c', 'o', 'm', '\0',
       /* "mainframeserver.space", true */ 'm', 'a', 'i', 'n', 'f', 'r', 'a', 'm', 'e', 's', 'e', 'r', 'v', 'e', 'r', '.', 's', 'p', 'a', 'c', 'e', '\0',
       /* "mainlined.org", true */ 'm', 'a', 'i', 'n', 'l', 'i', 'n', 'e', 'd', '.', 'o', 'r', 'g', '\0',
    +  /* "mainlywrenches.co", true */ 'm', 'a', 'i', 'n', 'l', 'y', 'w', 'r', 'e', 'n', 'c', 'h', 'e', 's', '.', 'c', 'o', '\0',
       /* "mainzelmaennchen.net", true */ 'm', 'a', 'i', 'n', 'z', 'e', 'l', 'm', 'a', 'e', 'n', 'n', 'c', 'h', 'e', 'n', '.', 'n', 'e', 't', '\0',
       /* "maisgasolina.com", true */ 'm', 'a', 'i', 's', 'g', 'a', 's', 'o', 'l', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
       /* "majaweb.cz", true */ 'm', 'a', 'j', 'a', 'w', 'e', 'b', '.', 'c', 'z', '\0',
    @@ -7132,6 +7115,7 @@ static const char kSTSHostTable[] = {
       /* "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',
       /* "marilsnijders.nl", true */ 'm', 'a', 'r', 'i', 'l', 's', 'n', 'i', 'j', 'd', 'e', 'r', 's', '.', 'n', 'l', '\0',
    +  /* "marinazarza.es", true */ 'm', 'a', 'r', 'i', 'n', 'a', 'z', 'a', 'r', 'z', 'a', '.', 'e', 's', '\0',
       /* "marinelausa.com", true */ 'm', 'a', 'r', 'i', 'n', 'e', 'l', 'a', 'u', 's', 'a', '.', 'c', 'o', 'm', '\0',
       /* "marines-shop.com", true */ 'm', 'a', 'r', 'i', 'n', 'e', 's', '-', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0',
       /* "mariviolin.com", true */ 'm', 'a', 'r', 'i', 'v', 'i', 'o', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0',
    @@ -7422,7 +7406,6 @@ static const char kSTSHostTable[] = {
       /* "michaelwaite.org", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', 'w', 'a', 'i', 't', 'e', '.', 'o', 'r', 'g', '\0',
       /* "michalkral.tk", true */ 'm', 'i', 'c', 'h', 'a', 'l', 'k', 'r', 'a', 'l', '.', 't', 'k', '\0',
       /* "michalspacek.cz", true */ 'm', 'i', 'c', 'h', 'a', 'l', 's', 'p', 'a', 'c', 'e', 'k', '.', 'c', 'z', '\0',
    -  /* "michalwiglasz.cz", true */ 'm', 'i', 'c', 'h', 'a', 'l', 'w', 'i', 'g', 'l', 'a', 's', 'z', '.', 'c', 'z', '\0',
       /* "michasfahrschule.com", true */ 'm', 'i', 'c', 'h', 'a', 's', 'f', 'a', 'h', 'r', 's', 'c', 'h', 'u', 'l', 'e', '.', 'c', 'o', 'm', '\0',
       /* "michel-wein.de", true */ 'm', 'i', 'c', 'h', 'e', 'l', '-', 'w', 'e', 'i', 'n', '.', 'd', 'e', '\0',
       /* "michelchouinard.ca", true */ 'm', 'i', 'c', 'h', 'e', 'l', 'c', 'h', 'o', 'u', 'i', 'n', 'a', 'r', 'd', '.', 'c', 'a', '\0',
    @@ -7918,6 +7901,8 @@ static const char kSTSHostTable[] = {
       /* "nassi.me", true */ 'n', 'a', 's', 's', 'i', '.', 'm', 'e', '\0',
       /* "natalia-fadeeva.ru", true */ 'n', 'a', 't', 'a', 'l', 'i', 'a', '-', 'f', 'a', 'd', 'e', 'e', 'v', 'a', '.', 'r', 'u', '\0',
       /* "natanaelys.com", true */ 'n', 'a', 't', 'a', 'n', 'a', 'e', 'l', 'y', 's', '.', 'c', 'o', 'm', '\0',
    +  /* "natenom.com", true */ 'n', 'a', 't', 'e', 'n', 'o', 'm', '.', 'c', 'o', 'm', '\0',
    +  /* "natenom.name", true */ 'n', 'a', 't', 'e', 'n', 'o', 'm', '.', 'n', 'a', 'm', 'e', '\0',
       /* "nathan.io", true */ 'n', 'a', 't', 'h', 'a', 'n', '.', 'i', 'o', '\0',
       /* "nathankonopinski.com", true */ 'n', 'a', 't', 'h', 'a', 'n', 'k', 'o', 'n', 'o', 'p', 'i', 'n', 's', 'k', 'i', '.', 'c', 'o', 'm', '\0',
       /* "nathansmetana.com", true */ 'n', 'a', 't', 'h', 'a', 'n', 's', 'm', 'e', 't', 'a', 'n', 'a', '.', 'c', 'o', 'm', '\0',
    @@ -8280,7 +8265,6 @@ static const char kSTSHostTable[] = {
       /* "nuttyveg.com", true */ 'n', 'u', 't', 't', 'y', 'v', 'e', 'g', '.', 'c', 'o', 'm', '\0',
       /* "nuvechtdal.nl", true */ 'n', 'u', 'v', 'e', 'c', 'h', 't', 'd', 'a', 'l', '.', 'n', 'l', '\0',
       /* "nuvini.com", true */ 'n', 'u', 'v', 'i', 'n', 'i', '.', 'c', 'o', 'm', '\0',
    -  /* "nuxer.fr", true */ 'n', 'u', 'x', 'e', 'r', '.', 'f', 'r', '\0',
       /* "nvlop.xyz", true */ 'n', 'v', 'l', 'o', 'p', '.', 'x', 'y', 'z', '\0',
       /* "nvr.bz", true */ 'n', 'v', 'r', '.', 'b', 'z', '\0',
       /* "nwa.xyz", true */ 'n', 'w', 'a', '.', 'x', 'y', 'z', '\0',
    @@ -8439,7 +8423,6 @@ static const char kSTSHostTable[] = {
       /* "open-bs.com", true */ 'o', 'p', 'e', 'n', '-', 'b', 's', '.', 'c', 'o', 'm', '\0',
       /* "open-bs.ru", true */ 'o', 'p', 'e', 'n', '-', 'b', 's', '.', 'r', 'u', '\0',
       /* "open-coding.org", true */ 'o', 'p', 'e', 'n', '-', 'c', 'o', 'd', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0',
    -  /* "open-future.be", true */ 'o', 'p', 'e', 'n', '-', 'f', 'u', 't', 'u', 'r', 'e', '.', 'b', 'e', '\0',
       /* "open-infrastructure.net", true */ 'o', 'p', 'e', 'n', '-', 'i', 'n', 'f', 'r', 'a', 's', 't', 'r', 'u', 'c', 't', 'u', 'r', 'e', '.', 'n', 'e', 't', '\0',
       /* "open-mesh.org", true */ 'o', 'p', 'e', 'n', '-', 'm', 'e', 's', 'h', '.', 'o', 'r', 'g', '\0',
       /* "open.gl", true */ 'o', 'p', 'e', 'n', '.', 'g', 'l', '\0',
    @@ -8527,6 +8510,7 @@ static const char kSTSHostTable[] = {
       /* "otvaracie-hodiny.sk", true */ 'o', 't', 'v', 'a', 'r', 'a', 'c', 'i', 'e', '-', 'h', 'o', 'd', 'i', 'n', 'y', '.', 's', 'k', '\0',
       /* "otya.me", true */ 'o', 't', 'y', 'a', '.', 'm', 'e', '\0',
       /* "ouaibe.qc.ca", true */ 'o', 'u', 'a', 'i', 'b', 'e', '.', 'q', 'c', '.', 'c', 'a', '\0',
    +  /* "ourcloud.at", true */ 'o', 'u', 'r', 'c', 'l', 'o', 'u', 'd', '.', 'a', 't', '\0',
       /* "ourcodinglives.com", true */ 'o', 'u', 'r', 'c', 'o', 'd', 'i', 'n', 'g', 'l', 'i', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0',
       /* "ourevents.net", true */ 'o', 'u', 'r', 'e', 'v', 'e', 'n', 't', 's', '.', 'n', 'e', 't', '\0',
       /* "outdoorproducts.com", true */ 'o', 'u', 't', 'd', 'o', 'o', 'r', 'p', 'r', 'o', 'd', 'u', 'c', 't', 's', '.', 'c', 'o', 'm', '\0',
    @@ -8585,12 +8569,14 @@ static const char kSTSHostTable[] = {
       /* "panamateakforestry.com", true */ 'p', 'a', 'n', 'a', 'm', 'a', 't', 'e', 'a', 'k', 'f', 'o', 'r', 'e', 's', 't', 'r', 'y', '.', 'c', 'o', 'm', '\0',
       /* "panaxis.ch", true */ 'p', 'a', 'n', 'a', 'x', 'i', 's', '.', 'c', 'h', '\0',
       /* "pandymic.com", true */ 'p', 'a', 'n', 'd', 'y', 'm', 'i', 'c', '.', 'c', 'o', 'm', '\0',
    +  /* "paneu.de", true */ 'p', 'a', 'n', 'e', 'u', '.', 'd', 'e', '\0',
       /* "panmetro.com", true */ 'p', 'a', 'n', 'm', 'e', 't', 'r', 'o', '.', 'c', 'o', 'm', '\0',
       /* "panni.me", false */ 'p', 'a', 'n', 'n', 'i', '.', 'm', 'e', '\0',
       /* "panoti.com", false */ 'p', 'a', 'n', 'o', 't', 'i', '.', 'c', 'o', 'm', '\0',
       /* "pansu.space", true */ 'p', 'a', 'n', 's', 'u', '.', 's', 'p', 'a', 'c', 'e', '\0',
       /* "panthur.com.au", false */ 'p', 'a', 'n', 't', 'h', 'u', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
       /* "pantou.org", false */ 'p', 'a', 'n', 't', 'o', 'u', '.', 'o', 'r', 'g', '\0',
    +  /* "pants-off.xyz", true */ 'p', 'a', 'n', 't', 's', '-', 'o', 'f', 'f', '.', 'x', 'y', 'z', '\0',
       /* "pap.la", false */ 'p', 'a', 'p', '.', 'l', 'a', '\0',
       /* "papa-webzeit.de", true */ 'p', 'a', 'p', 'a', '-', 'w', 'e', 'b', 'z', 'e', 'i', 't', '.', 'd', 'e', '\0',
       /* "papayapythons.com", true */ 'p', 'a', 'p', 'a', 'y', 'a', 'p', 'y', 't', 'h', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
    @@ -8728,12 +8714,12 @@ static const char kSTSHostTable[] = {
       /* "peercraft.com", true */ 'p', 'e', 'e', 'r', 'c', 'r', 'a', 'f', 't', '.', 'c', 'o', 'm', '\0',
       /* "peerherrmann.de", true */ 'p', 'e', 'e', 'r', 'h', 'e', 'r', 'r', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
       /* "peername.com", true */ 'p', 'e', 'e', 'r', 'n', 'a', 'm', 'e', '.', 'c', 'o', 'm', '\0',
    +  /* "peervpn.net", true */ 'p', 'e', 'e', 'r', 'v', 'p', 'n', '.', 'n', 'e', 't', '\0',
       /* "peetah.com", true */ 'p', 'e', 'e', 't', 'a', 'h', '.', 'c', 'o', 'm', '\0',
       /* "pegas-studio.net", true */ 'p', 'e', 'g', 'a', 's', '-', 's', 't', 'u', 'd', 'i', 'o', '.', 'n', 'e', 't', '\0',
       /* "peifi.de", true */ 'p', 'e', 'i', 'f', 'i', '.', 'd', 'e', '\0',
       /* "pekoe.se", true */ 'p', 'e', 'k', 'o', 'e', '.', 's', 'e', '\0',
       /* "pelanucto.cz", true */ 'p', 'e', 'l', 'a', 'n', 'u', 'c', 't', 'o', '.', 'c', 'z', '\0',
    -  /* "peliculasaudiolatinoonline.com", true */ 'p', 'e', 'l', 'i', 'c', 'u', 'l', 'a', 's', 'a', 'u', 'd', 'i', 'o', 'l', 'a', 't', 'i', 'n', 'o', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
       /* "penablog.com", true */ 'p', 'e', 'n', 'a', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '\0',
       /* "pencepay.com", true */ 'p', 'e', 'n', 'c', 'e', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0',
       /* "penfold.fr", true */ 'p', 'e', 'n', 'f', 'o', 'l', 'd', '.', 'f', 'r', '\0',
    @@ -8800,7 +8786,6 @@ static const char kSTSHostTable[] = {
       /* "pfd-nz.com", false */ 'p', 'f', 'd', '-', 'n', 'z', '.', 'c', 'o', 'm', '\0',
       /* "pfo.io", true */ 'p', 'f', 'o', '.', 'i', 'o', '\0',
       /* "pfolta.net", true */ 'p', 'f', 'o', 'l', 't', 'a', '.', 'n', 'e', 't', '\0',
    -  /* "pgmann.cf", true */ 'p', 'g', 'm', 'a', 'n', 'n', '.', 'c', 'f', '\0',
       /* "pgmsource.com", true */ 'p', 'g', 'm', 's', 'o', 'u', 'r', 'c', 'e', '.', 'c', 'o', 'm', '\0',
       /* "pgnetwork.net", true */ 'p', 'g', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0',
       /* "pgpmail.cc", true */ 'p', 'g', 'p', 'm', 'a', 'i', 'l', '.', 'c', 'c', '\0',
    @@ -9052,6 +9037,7 @@ static const char kSTSHostTable[] = {
       /* "porybox.com", true */ 'p', 'o', 'r', 'y', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
       /* "positivesobrietyinstitute.com", true */ 'p', 'o', 's', 'i', 't', 'i', 'v', 'e', 's', 'o', 'b', 'r', 'i', 'e', 't', 'y', 'i', 'n', 's', 't', 'i', 't', 'u', 't', 'e', '.', 'c', 'o', 'm', '\0',
       /* "posobota.cz", true */ 'p', 'o', 's', 'o', 'b', 'o', 't', 'a', '.', 'c', 'z', '\0',
    +  /* "post4me.at", true */ 'p', 'o', 's', 't', '4', 'm', 'e', '.', 'a', 't', '\0',
       /* "postal.dk", true */ 'p', 'o', 's', 't', 'a', 'l', '.', 'd', 'k', '\0',
       /* "postblue.info", true */ 'p', 'o', 's', 't', 'b', 'l', 'u', 'e', '.', 'i', 'n', 'f', 'o', '\0',
       /* "postbox.life", true */ 'p', 'o', 's', 't', 'b', 'o', 'x', '.', 'l', 'i', 'f', 'e', '\0',
    @@ -9061,7 +9047,6 @@ static const char kSTSHostTable[] = {
       /* "postfinance.ch", true */ 'p', 'o', 's', 't', 'f', 'i', 'n', 'a', 'n', 'c', 'e', '.', 'c', 'h', '\0',
       /* "postn.eu", true */ 'p', 'o', 's', 't', 'n', '.', 'e', 'u', '\0',
       /* "posttigo.com", true */ 'p', 'o', 's', 't', 't', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
    -  /* "potatofrom.space", false */ 'p', 'o', 't', 'a', 't', 'o', 'f', 'r', 'o', 'm', '.', 's', 'p', 'a', 'c', 'e', '\0',
       /* "potatoheads.net", true */ 'p', 'o', 't', 'a', 't', 'o', 'h', 'e', 'a', 'd', 's', '.', 'n', 'e', 't', '\0',
       /* "potbar.com", true */ 'p', 'o', 't', 'b', 'a', 'r', '.', 'c', 'o', 'm', '\0',
       /* "potbox.com", true */ 'p', 'o', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
    @@ -9810,7 +9795,6 @@ static const char kSTSHostTable[] = {
       /* "royalhop.co", true */ 'r', 'o', 'y', 'a', 'l', 'h', 'o', 'p', '.', 'c', 'o', '\0',
       /* "royalmarinesassociation.org.uk", true */ 'r', 'o', 'y', 'a', 'l', 'm', 'a', 'r', 'i', 'n', 'e', 's', 'a', 's', 's', 'o', 'c', 'i', 'a', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
       /* "royalpalacenogent.fr", true */ 'r', 'o', 'y', 'a', 'l', 'p', 'a', 'l', 'a', 'c', 'e', 'n', 'o', 'g', 'e', 'n', 't', '.', 'f', 'r', '\0',
    -  /* "royalpub.net", true */ 'r', 'o', 'y', 'a', 'l', 'p', 'u', 'b', '.', 'n', 'e', 't', '\0',
       /* "royalvisiongroup.com", true */ 'r', 'o', 'y', 'a', 'l', 'v', 'i', 's', 'i', 'o', 'n', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '\0',
       /* "royzez.com", true */ 'r', 'o', 'y', 'z', 'e', 'z', '.', 'c', 'o', 'm', '\0',
       /* "rozalisbengal.ro", true */ 'r', 'o', 'z', 'a', 'l', 'i', 's', 'b', 'e', 'n', 'g', 'a', 'l', '.', 'r', 'o', '\0',
    @@ -9881,7 +9865,6 @@ static const char kSTSHostTable[] = {
       /* "s13d.fr", true */ 's', '1', '3', 'd', '.', 'f', 'r', '\0',
       /* "s16e.no", true */ 's', '1', '6', 'e', '.', 'n', 'o', '\0',
       /* "saamhorigheidsfonds.nl", false */ 's', 'a', 'a', 'm', 'h', 'o', 'r', 'i', 'g', 'h', 'e', 'i', 'd', 's', 'f', 'o', 'n', 'd', 's', '.', 'n', 'l', '\0',
    -  /* "saba-piserver.info", true */ 's', 'a', 'b', 'a', '-', 'p', 'i', 's', 'e', 'r', 'v', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0',
       /* "sabahattin-gucukoglu.com", true */ 's', 'a', 'b', 'a', 'h', 'a', 't', 't', 'i', 'n', '-', 'g', 'u', 'c', 'u', 'k', 'o', 'g', 'l', 'u', '.', 'c', 'o', 'm', '\0',
       /* "sacaentradas.com", true */ 's', 'a', 'c', 'a', 'e', 'n', 't', 'r', 'a', 'd', 'a', 's', '.', 'c', 'o', 'm', '\0',
       /* "saccani.net", true */ 's', 'a', 'c', 'c', 'a', 'n', 'i', '.', 'n', 'e', 't', '\0',
    @@ -10188,7 +10171,6 @@ static const char kSTSHostTable[] = {
       /* "selectorders.com", true */ 's', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'd', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
       /* "selent.me", true */ 's', 'e', 'l', 'e', 'n', 't', '.', 'm', 'e', '\0',
       /* "self-signed.com", true */ 's', 'e', 'l', 'f', '-', 's', 'i', 'g', 'n', 'e', 'd', '.', 'c', 'o', 'm', '\0',
    -  /* "selfici.com", true */ 's', 'e', 'l', 'f', 'i', 'c', 'i', '.', 'c', 'o', 'm', '\0',
       /* "selfici.cz", true */ 's', 'e', 'l', 'f', 'i', 'c', 'i', '.', 'c', 'z', '\0',
       /* "selfserverx.com", false */ 's', 'e', 'l', 'f', 's', 'e', 'r', 'v', 'e', 'r', 'x', '.', 'c', 'o', 'm', '\0',
       /* "sellme.biz", true */ 's', 'e', 'l', 'l', 'm', 'e', '.', 'b', 'i', 'z', '\0',
    @@ -10255,7 +10237,6 @@ static const char kSTSHostTable[] = {
       /* "seryovpn.com", true */ 's', 'e', 'r', 'y', 'o', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0',
       /* "sesha.co.za", true */ 's', 'e', 's', 'h', 'a', '.', 'c', 'o', '.', 'z', 'a', '\0',
       /* "sessionslogning.dk", true */ 's', 'e', 's', 's', 'i', 'o', 'n', 's', 'l', 'o', 'g', 'n', 'i', 'n', 'g', '.', 'd', 'k', '\0',
    -  /* "setfix.de", true */ 's', 'e', 't', 'f', 'i', 'x', '.', 'd', 'e', '\0',
       /* "sethcaplan.com", true */ 's', 'e', 't', 'h', 'c', 'a', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
       /* "seti-germany.de", true */ 's', 'e', 't', 'i', '-', 'g', 'e', 'r', 'm', 'a', 'n', 'y', '.', 'd', 'e', '\0',
       /* "settberg.de", true */ 's', 'e', 't', 't', 'b', 'e', 'r', 'g', '.', 'd', 'e', '\0',
    @@ -10266,6 +10247,8 @@ static const char kSTSHostTable[] = {
       /* "sevsopr.ru", true */ 's', 'e', 'v', 's', 'o', 'p', 'r', '.', 'r', 'u', '\0',
       /* "sexwork.net", true */ 's', 'e', 'x', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0',
       /* "sexy-store.nl", true */ 's', 'e', 'x', 'y', '-', 's', 't', 'o', 'r', 'e', '.', 'n', 'l', '\0',
    +  /* "seyr.it", true */ 's', 'e', 'y', 'r', '.', 'i', 't', '\0',
    +  /* "seyr.me", true */ 's', 'e', 'y', 'r', '.', 'm', 'e', '\0',
       /* "sfsltd.com", true */ 's', 'f', 's', 'l', 't', 'd', '.', 'c', 'o', 'm', '\0',
       /* "sftool.gov", true */ 's', 'f', 't', 'o', 'o', 'l', '.', 'g', 'o', 'v', '\0',
       /* "sg.search.yahoo.com", false */ 's', 'g', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
    @@ -10331,7 +10314,6 @@ static const char kSTSHostTable[] = {
       /* "shitproductions.org", true */ 's', 'h', 'i', 't', 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', 's', '.', 'o', 'r', 'g', '\0',
       /* "shitsta.in", true */ 's', 'h', 'i', 't', 's', 't', 'a', '.', 'i', 'n', '\0',
       /* "shodan.io", true */ 's', 'h', 'o', 'd', 'a', 'n', '.', 'i', 'o', '\0',
    -  /* "shome.de", true */ 's', 'h', 'o', 'm', 'e', '.', 'd', 'e', '\0',
       /* "shopapi.cz", true */ 's', 'h', 'o', 'p', 'a', 'p', 'i', '.', 'c', 'z', '\0',
       /* "shopbakersnook.com", true */ 's', 'h', 'o', 'p', 'b', 'a', 'k', 'e', 'r', 's', 'n', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
       /* "shoplandia.co", true */ 's', 'h', 'o', 'p', 'l', 'a', 'n', 'd', 'i', 'a', '.', 'c', 'o', '\0',
    @@ -10595,8 +10577,6 @@ static const char kSTSHostTable[] = {
       /* "sneedit.com", true */ 's', 'n', 'e', 'e', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
       /* "sneedit.de", true */ 's', 'n', 'e', 'e', 'd', 'i', 't', '.', 'd', 'e', '\0',
       /* "sneezry.com", true */ 's', 'n', 'e', 'e', 'z', 'r', 'y', '.', 'c', 'o', 'm', '\0',
    -  /* "snelshops.nl", true */ 's', 'n', 'e', 'l', 's', 'h', 'o', 'p', 's', '.', 'n', 'l', '\0',
    -  /* "snelwebshop.nl", true */ 's', 'n', 'e', 'l', 'w', 'e', 'b', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0',
       /* "snelxboxlivegold.nl", true */ 's', 'n', 'e', 'l', 'x', 'b', 'o', 'x', 'l', 'i', 'v', 'e', 'g', 'o', 'l', 'd', '.', 'n', 'l', '\0',
       /* "snfdata.com", true */ 's', 'n', 'f', 'd', 'a', 't', 'a', '.', 'c', 'o', 'm', '\0',
       /* "sniderman.eu.org", true */ 's', 'n', 'i', 'd', 'e', 'r', 'm', 'a', 'n', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0',
    @@ -10806,6 +10786,7 @@ static const char kSTSHostTable[] = {
       /* "squeezemetrics.com", true */ 's', 'q', 'u', 'e', 'e', 'z', 'e', 'm', 'e', 't', 'r', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
       /* "src.fedoraproject.org", true */ 's', 'r', 'c', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
       /* "srchub.org", true */ 's', 'r', 'c', 'h', 'u', 'b', '.', 'o', 'r', 'g', '\0',
    +  /* "sritest.io", true */ 's', 'r', 'i', 't', 'e', 's', 't', '.', 'i', 'o', '\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',
       /* "srv47.de", true */ 's', 'r', 'v', '4', '7', '.', 'd', 'e', '\0',
    @@ -10999,6 +10980,7 @@ static const char kSTSHostTable[] = {
       /* "studer.su", true */ 's', 't', 'u', 'd', 'e', 'r', '.', 's', 'u', '\0',
       /* "studienportal.eu", true */ 's', 't', 'u', 'd', 'i', 'e', 'n', 'p', 'o', 'r', 't', 'a', 'l', '.', 'e', 'u', '\0',
       /* "studinf.xyz", true */ 's', 't', 'u', 'd', 'i', 'n', 'f', '.', 'x', 'y', 'z', '\0',
    +  /* "studio-panic.com", true */ 's', 't', 'u', 'd', 'i', 'o', '-', 'p', 'a', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0',
       /* "studiomarcella.com", true */ 's', 't', 'u', 'd', 'i', 'o', 'm', 'a', 'r', 'c', 'e', 'l', 'l', 'a', '.', 'c', 'o', 'm', '\0',
       /* "studiostawki.com", true */ 's', 't', 'u', 'd', 'i', 'o', 's', 't', 'a', 'w', 'k', 'i', '.', 'c', 'o', 'm', '\0',
       /* "studiostudio.net", true */ 's', 't', 'u', 'd', 'i', 'o', 's', 't', 'u', 'd', 'i', 'o', '.', 'n', 'e', 't', '\0',
    @@ -11083,7 +11065,6 @@ static const char kSTSHostTable[] = {
       /* "suwalls.com", true */ 's', 'u', 'w', 'a', 'l', 'l', 's', '.', 'c', 'o', 'm', '\0',
       /* "sv-turm-hohenlimburg.de", true */ 's', 'v', '-', 't', 'u', 'r', 'm', '-', 'h', 'o', 'h', 'e', 'n', 'l', 'i', 'm', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0',
       /* "svager.cz", true */ 's', 'v', 'a', 'g', 'e', 'r', '.', 'c', 'z', '\0',
    -  /* "svallee.fr", false */ 's', 'v', 'a', 'l', 'l', 'e', 'e', '.', 'f', 'r', '\0',
       /* "svarovani.tk", true */ 's', 'v', 'a', 'r', 'o', 'v', 'a', 'n', 'i', '.', 't', 'k', '\0',
       /* "svatba-frantovi.cz", true */ 's', 'v', 'a', 't', 'b', 'a', '-', 'f', 'r', 'a', 'n', 't', 'o', 'v', 'i', '.', 'c', 'z', '\0',
       /* "svendubbeld.nl", true */ 's', 'v', 'e', 'n', 'd', 'u', 'b', 'b', 'e', 'l', 'd', '.', 'n', 'l', '\0',
    @@ -11155,7 +11136,6 @@ static const char kSTSHostTable[] = {
       /* "szechenyi2020.hu", true */ 's', 'z', 'e', 'c', 'h', 'e', 'n', 'y', 'i', '2', '0', '2', '0', '.', 'h', 'u', '\0',
       /* "szentistvanpt.sk", true */ 's', 'z', 'e', 'n', 't', 'i', 's', 't', 'v', 'a', 'n', 'p', 't', '.', 's', 'k', '\0',
       /* "szongott.net", true */ 's', 'z', 'o', 'n', 'g', 'o', 't', 't', '.', 'n', 'e', 't', '\0',
    -  /* "t-complex.space", true */ 't', '-', 'c', 'o', 'm', 'p', 'l', 'e', 'x', '.', 's', 'p', 'a', 'c', 'e', '\0',
       /* "t-hawk.com", true */ 't', '-', 'h', 'a', 'w', 'k', '.', 'c', 'o', 'm', '\0',
       /* "t-point.eu", true */ 't', '-', 'p', 'o', 'i', 'n', 't', '.', 'e', 'u', '\0',
       /* "t-shirts4less.nl", true */ 't', '-', 's', 'h', 'i', 'r', 't', 's', '4', 'l', 'e', 's', 's', '.', 'n', 'l', '\0',
    @@ -11210,7 +11190,6 @@ static const char kSTSHostTable[] = {
       /* "tantalos.nl", true */ 't', 'a', 'n', 't', 'a', 'l', 'o', 's', '.', 'n', 'l', '\0',
       /* "tante-bugil.net", false */ 't', 'a', 'n', 't', 'e', '-', 'b', 'u', 'g', 'i', 'l', '.', 'n', 'e', 't', '\0',
       /* "tantotiempo.de", true */ 't', 'a', 'n', 't', 'o', 't', 'i', 'e', 'm', 'p', 'o', '.', 'd', 'e', '\0',
    -  /* "tanze-jetzt.de", true */ 't', 'a', 'n', 'z', 'e', '-', 'j', 'e', 't', 'z', 't', '.', 'd', 'e', '\0',
       /* "tappublisher.com", true */ 't', 'a', 'p', 'p', 'u', 'b', 'l', 'i', 's', 'h', 'e', 'r', '.', 'c', 'o', 'm', '\0',
       /* "taquilla.com", true */ 't', 'a', 'q', 'u', 'i', 'l', 'l', 'a', '.', 'c', 'o', 'm', '\0',
       /* "tartaneagle.org.uk", false */ 't', 'a', 'r', 't', 'a', 'n', 'e', 'a', 'g', 'l', 'e', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
    @@ -11338,6 +11317,7 @@ static const char kSTSHostTable[] = {
       /* "teodio.cl", true */ 't', 'e', 'o', 'd', 'i', 'o', '.', 'c', 'l', '\0',
       /* "teos.online", true */ 't', 'e', 'o', 's', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\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',
       /* "teracloud.at", true */ 't', 'e', 'r', 'a', 'c', 'l', 'o', 'u', 'd', '.', 'a', 't', '\0',
       /* "teriiphotography.com", true */ 't', 'e', 'r', 'i', 'i', 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'c', 'o', 'm', '\0',
       /* "terrab.de", true */ 't', 'e', 'r', 'r', 'a', 'b', '.', 'd', 'e', '\0',
    @@ -11496,9 +11476,11 @@ static const char kSTSHostTable[] = {
       /* "theworldsend.eu", true */ 't', 'h', 'e', 'w', 'o', 'r', 'l', 'd', 's', 'e', 'n', 'd', '.', 'e', 'u', '\0',
       /* "thexme.de", true */ 't', 'h', 'e', 'x', 'm', 'e', '.', 'd', 'e', '\0',
       /* "theyosh.nl", true */ 't', 'h', 'e', 'y', 'o', 's', 'h', '.', 'n', 'l', '\0',
    +  /* "thezero.org", true */ 't', 'h', 'e', 'z', 'e', 'r', 'o', '.', 'o', 'r', 'g', '\0',
       /* "thibautcharles.net", true */ 't', 'h', 'i', 'b', 'a', 'u', 't', 'c', 'h', 'a', 'r', 'l', 'e', 's', '.', 'n', 'e', 't', '\0',
       /* "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',
    +  /* "thinkcoding.org", true */ 't', 'h', 'i', 'n', 'k', 'c', 'o', 'd', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\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',
    @@ -11534,7 +11516,6 @@ static const char kSTSHostTable[] = {
       /* "threedpro.me", true */ 't', 'h', 'r', 'e', 'e', 'd', 'p', 'r', 'o', '.', 'm', 'e', '\0',
       /* "threelions.ch", true */ 't', 'h', 'r', 'e', 'e', 'l', 'i', 'o', 'n', 's', '.', 'c', 'h', '\0',
       /* "thriveapproach.co.uk", true */ 't', 'h', 'r', 'i', 'v', 'e', 'a', 'p', 'p', 'r', 'o', 'a', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
    -  /* "throughthelookingglasslens.co.uk", true */ 't', 'h', 'r', 'o', 'u', 'g', 'h', 't', 'h', 'e', 'l', 'o', 'o', 'k', 'i', 'n', 'g', 'g', 'l', 'a', 's', 's', 'l', 'e', 'n', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
       /* "throwaway.link", true */ 't', 'h', 'r', 'o', 'w', 'a', 'w', 'a', 'y', '.', 'l', 'i', 'n', 'k', '\0',
       /* "throwpass.com", true */ 't', 'h', 'r', 'o', 'w', 'p', 'a', 's', 's', '.', 'c', 'o', 'm', '\0',
       /* "thrx.net", true */ 't', 'h', 'r', 'x', '.', 'n', 'e', 't', '\0',
    @@ -11557,7 +11538,6 @@ static const char kSTSHostTable[] = {
       /* "tidycustoms.net", true */ 't', 'i', 'd', 'y', 'c', 'u', 's', 't', 'o', 'm', 's', '.', 'n', 'e', 't', '\0',
       /* "tiendavertigo.com", true */ 't', 'i', 'e', 'n', 'd', 'a', 'v', 'e', 'r', 't', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
       /* "tiendschuurstraat.nl", true */ 't', 'i', 'e', 'n', 'd', 's', 'c', 'h', 'u', 'u', 'r', 's', 't', 'r', 'a', 'a', 't', '.', 'n', 'l', '\0',
    -  /* "tiens-ib.cz", true */ 't', 'i', 'e', 'n', 's', '-', 'i', 'b', '.', 'c', 'z', '\0',
       /* "tierarztpraxis-bogenhausen.de", true */ 't', 'i', 'e', 'r', 'a', 'r', 'z', 't', 'p', 'r', 'a', 'x', 'i', 's', '-', 'b', 'o', 'g', 'e', 'n', 'h', 'a', 'u', 's', 'e', 'n', '.', 'd', 'e', '\0',
       /* "tiernanx.com", true */ 't', 'i', 'e', 'r', 'n', 'a', 'n', 'x', '.', 'c', 'o', 'm', '\0',
       /* "tifan.net", true */ 't', 'i', 'f', 'a', 'n', '.', 'n', 'e', 't', '\0',
    @@ -11667,10 +11647,10 @@ static const char kSTSHostTable[] = {
       /* "tombaker.me", true */ 't', 'o', 'm', 'b', 'a', 'k', 'e', 'r', '.', 'm', 'e', '\0',
       /* "tombrossman.com", true */ 't', 'o', 'm', 'b', 'r', 'o', 's', 's', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
       /* "tomcort.com", true */ 't', 'o', 'm', 'c', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
    +  /* "tomend.es", true */ 't', 'o', 'm', 'e', 'n', 'd', '.', 'e', 's', '\0',
       /* "tomfisher.eu", true */ 't', 'o', 'm', 'f', 'i', 's', 'h', 'e', 'r', '.', 'e', 'u', '\0',
       /* "tomlankhorst.nl", true */ 't', 'o', 'm', 'l', 'a', 'n', 'k', 'h', 'o', 'r', 's', 't', '.', 'n', 'l', '\0',
       /* "tomli.me", true */ 't', 'o', 'm', 'l', 'i', '.', 'm', 'e', '\0',
    -  /* "tommyads.com", true */ 't', 'o', 'm', 'm', 'y', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
       /* "tomo.gr", false */ 't', 'o', 'm', 'o', '.', 'g', 'r', '\0',
       /* "tomrei.com", true */ 't', 'o', 'm', 'r', 'e', 'i', '.', 'c', 'o', 'm', '\0',
       /* "tomrichards.net", false */ 't', 'o', 'm', 'r', 'i', 'c', 'h', 'a', 'r', 'd', 's', '.', 'n', 'e', 't', '\0',
    @@ -11725,7 +11705,6 @@ static const char kSTSHostTable[] = {
       /* "torproject.org", false */ 't', 'o', 'r', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
       /* "torquato.de", false */ 't', 'o', 'r', 'q', 'u', 'a', 't', 'o', '.', 'd', 'e', '\0',
       /* "torrent.fedoraproject.org", true */ 't', 'o', 'r', 'r', 'e', 'n', 't', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
    -  /* "torrent.is", true */ 't', 'o', 'r', 'r', 'e', 'n', 't', '.', 'i', 's', '\0',
       /* "torrentdownloads.bid", true */ 't', 'o', 'r', 'r', 'e', 'n', 't', 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 's', '.', 'b', 'i', 'd', '\0',
       /* "torrenttop100.net", true */ 't', 'o', 'r', 'r', 'e', 'n', 't', 't', 'o', 'p', '1', '0', '0', '.', 'n', 'e', 't', '\0',
       /* "torrentz.website", true */ 't', 'o', 'r', 'r', 'e', 'n', 't', 'z', '.', 'w', 'e', 'b', 's', 'i', 't', 'e', '\0',
    @@ -11835,7 +11814,6 @@ static const char kSTSHostTable[] = {
       /* "tribut.de", true */ 't', 'r', 'i', 'b', 'u', 't', '.', 'd', 'e', '\0',
       /* "tributh.net", true */ 't', 'r', 'i', 'b', 'u', 't', 'h', '.', 'n', 'e', 't', '\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',
       /* "trineco.com", true */ 't', 'r', 'i', 'n', 'e', 'c', 'o', '.', 'c', 'o', 'm', '\0',
    @@ -12180,7 +12158,6 @@ static const char kSTSHostTable[] = {
       /* "vandalfsen.me", true */ 'v', 'a', 'n', 'd', 'a', 'l', 'f', 's', 'e', 'n', '.', 'm', 'e', '\0',
       /* "vande-walle.eu", true */ 'v', 'a', 'n', 'd', 'e', '-', 'w', 'a', 'l', 'l', 'e', '.', 'e', 'u', '\0',
       /* "vanderziel.org", true */ 'v', 'a', 'n', 'd', 'e', 'r', 'z', 'i', 'e', 'l', '.', 'o', 'r', 'g', '\0',
    -  /* "vanestack.com", true */ 'v', 'a', 'n', 'e', 's', 't', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
       /* "vangeluwedeberlaere.be", true */ 'v', 'a', 'n', 'g', 'e', 'l', 'u', 'w', 'e', 'd', 'e', 'b', 'e', 'r', 'l', 'a', 'e', 'r', 'e', '.', 'b', 'e', '\0',
       /* "vanhoutte.be", false */ 'v', 'a', 'n', 'h', 'o', 'u', 't', 't', 'e', '.', 'b', 'e', '\0',
       /* "vanlaanen.com", false */ 'v', 'a', 'n', 'l', 'a', 'a', 'n', 'e', 'n', '.', 'c', 'o', 'm', '\0',
    @@ -12621,6 +12598,7 @@ static const char kSTSHostTable[] = {
       /* "whatsmychaincert.com", true */ 'w', 'h', 'a', 't', 's', 'm', 'y', 'c', 'h', 'a', 'i', 'n', 'c', 'e', 'r', 't', '.', 'c', 'o', 'm', '\0',
       /* "whatsupgold.com.tw", true */ 'w', 'h', 'a', 't', 's', 'u', 'p', 'g', 'o', 'l', 'd', '.', 'c', 'o', 'm', '.', 't', 'w', '\0',
       /* "whatwebcando.today", true */ 'w', 'h', 'a', 't', 'w', 'e', 'b', 'c', 'a', 'n', 'd', 'o', '.', 't', 'o', 'd', 'a', 'y', '\0',
    +  /* "whatwg.org", true */ 'w', 'h', 'a', 't', 'w', 'g', '.', 'o', 'r', 'g', '\0',
       /* "whd-guide.de", true */ 'w', 'h', 'd', '-', 'g', 'u', 'i', 'd', 'e', '.', 'd', 'e', '\0',
       /* "wheeler.kiwi.nz", true */ 'w', 'h', 'e', 'e', 'l', 'e', 'r', '.', 'k', 'i', 'w', 'i', '.', 'n', 'z', '\0',
       /* "when-release.ru", false */ 'w', 'h', 'e', 'n', '-', 'r', 'e', 'l', 'e', 'a', 's', 'e', '.', 'r', 'u', '\0',
    @@ -12685,6 +12663,7 @@ static const char kSTSHostTable[] = {
       /* "williamsapiens.com", true */ 'w', 'i', 'l', 'l', 'i', 'a', 'm', 's', 'a', 'p', 'i', 'e', 'n', 's', '.', 'c', 'o', 'm', '\0',
       /* "williamsonshore.com", true */ 'w', 'i', 'l', 'l', 'i', 'a', 'm', 's', 'o', 'n', 's', 'h', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
       /* "willnorris.com", true */ 'w', 'i', 'l', 'l', 'n', 'o', 'r', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
    +  /* "wills.co.tt", true */ 'w', 'i', 'l', 'l', 's', '.', 'c', 'o', '.', 't', 't', '\0',
       /* "wilsonovi.com", true */ 'w', 'i', 'l', 's', 'o', 'n', 'o', 'v', 'i', '.', 'c', 'o', 'm', '\0',
       /* "wimake.solutions", true */ 'w', 'i', 'm', 'a', 'k', 'e', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
       /* "winaes.com", true */ 'w', 'i', 'n', 'a', 'e', 's', '.', 'c', 'o', 'm', '\0',
    @@ -12795,12 +12774,14 @@ static const char kSTSHostTable[] = {
       /* "wpdublin.com", true */ 'w', 'p', 'd', 'u', 'b', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0',
       /* "wpfortify.com", true */ 'w', 'p', 'f', 'o', 'r', 't', 'i', 'f', 'y', '.', 'c', 'o', 'm', '\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',
       /* "wpletter.de", false */ 'w', 'p', 'l', 'e', 't', 't', 'e', 'r', '.', 'd', 'e', '\0',
       /* "wpmeetup-berlin.de", true */ 'w', 'p', 'm', 'e', 'e', 't', 'u', 'p', '-', 'b', 'e', 'r', 'l', 'i', 'n', '.', 'd', 'e', '\0',
       /* "wpostats.com", true */ 'w', 'p', 'o', 's', 't', 'a', 't', 's', '.', 'c', 'o', 'm', '\0',
       /* "wpserp.com", true */ 'w', 'p', 's', 'e', 'r', 'p', '.', 'c', 'o', 'm', '\0',
       /* "wpvulndb.com", true */ 'w', 'p', 'v', 'u', 'l', 'n', 'd', 'b', '.', 'c', 'o', 'm', '\0',
       /* "wpzhiku.com", true */ 'w', 'p', 'z', 'h', 'i', 'k', 'u', '.', 'c', 'o', 'm', '\0',
    +  /* "wql.zj.cn", true */ 'w', 'q', 'l', '.', 'z', 'j', '.', 'c', 'n', '\0',
       /* "wrara.org", true */ 'w', 'r', 'a', 'r', 'a', '.', 'o', 'r', 'g', '\0',
       /* "wrgms.com", true */ 'w', 'r', 'g', 'm', 's', '.', 'c', 'o', 'm', '\0',
       /* "wrightdoumawedding.com", true */ 'w', 'r', 'i', 'g', 'h', 't', 'd', 'o', 'u', 'm', 'a', 'w', 'e', 'd', 'd', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
    @@ -12988,7 +12969,6 @@ static const char kSTSHostTable[] = {
       /* "xscapers.com", true */ 'x', 's', 'c', 'a', 'p', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
       /* "xss.ht", true */ 'x', 's', 's', '.', 'h', 't', '\0',
       /* "xss.sk", true */ 'x', 's', 's', '.', 's', 'k', '\0',
    -  /* "xtremegaming.it", true */ 'x', 't', 'r', 'e', 'm', 'e', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'i', 't', '\0',
       /* "xtrim.ru", true */ 'x', 't', 'r', 'i', 'm', '.', 'r', 'u', '\0',
       /* "xtronics.com", true */ 'x', 't', 'r', 'o', 'n', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
       /* "xuc.me", true */ 'x', 'u', 'c', '.', 'm', 'e', '\0',
    @@ -13061,7 +13041,6 @@ static const char kSTSHostTable[] = {
       /* "yoramvandevelde.net", true */ 'y', 'o', 'r', 'a', 'm', 'v', 'a', 'n', 'd', 'e', 'v', 'e', 'l', 'd', 'e', '.', 'n', 'e', 't', '\0',
       /* "yorcom.nl", true */ 'y', 'o', 'r', 'c', 'o', 'm', '.', 'n', 'l', '\0',
       /* "yorname.ml", true */ 'y', 'o', 'r', 'n', 'a', 'm', 'e', '.', 'm', 'l', '\0',
    -  /* "yosemo.de", true */ 'y', 'o', 's', 'e', 'm', 'o', '.', 'd', 'e', '\0',
       /* "youcancraft.de", true */ 'y', 'o', 'u', 'c', 'a', 'n', 'c', 'r', 'a', 'f', 't', '.', 'd', 'e', '\0',
       /* "youdowell.com", true */ 'y', 'o', 'u', 'd', 'o', 'w', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0',
       /* "youkaryote.com", true */ 'y', 'o', 'u', 'k', 'a', 'r', 'y', 'o', 't', 'e', '.', 'c', 'o', 'm', '\0',
    @@ -13170,7 +13149,6 @@ static const char kSTSHostTable[] = {
       /* "zetorzeszow.pl", true */ 'z', 'e', 't', 'o', 'r', 'z', 'e', 's', 'z', 'o', 'w', '.', 'p', 'l', '\0',
       /* "zettaplan.ru", true */ 'z', 'e', 't', 't', 'a', 'p', 'l', 'a', 'n', '.', 'r', 'u', '\0',
       /* "zewtie.com", true */ 'z', 'e', 'w', 't', 'i', 'e', '.', 'c', 'o', 'm', '\0',
    -  /* "zeytin.pro", true */ 'z', 'e', 'y', 't', 'i', 'n', '.', 'p', 'r', 'o', '\0',
       /* "zgrep.org", true */ 'z', 'g', 'r', 'e', 'p', '.', 'o', 'r', 'g', '\0',
       /* "zhang-hao.com", true */ 'z', 'h', 'a', 'n', 'g', '-', 'h', 'a', 'o', '.', 'c', 'o', 'm', '\0',
       /* "zhanghao.me", true */ 'z', 'h', 'a', 'n', 'g', 'h', 'a', 'o', '.', 'm', 'e', '\0',
    @@ -13441,412 +13419,412 @@ static const nsSTSPreload kSTSPreloadList[] = {
       { 2132, true },
       { 2151, true },
       { 2162, true },
    -  { 2173, true },
    -  { 2182, true },
    -  { 2195, true },
    -  { 2215, true },
    -  { 2230, true },
    -  { 2238, true },
    -  { 2248, true },
    -  { 2265, true },
    -  { 2280, true },
    -  { 2287, false },
    -  { 2298, true },
    -  { 2313, false },
    -  { 2328, true },
    -  { 2347, true },
    -  { 2357, true },
    -  { 2368, true },
    -  { 2386, true },
    -  { 2400, true },
    -  { 2412, true },
    -  { 2428, true },
    -  { 2439, false },
    -  { 2455, false },
    -  { 2467, true },
    -  { 2480, true },
    -  { 2493, false },
    -  { 2501, true },
    -  { 2525, true },
    -  { 2540, true },
    -  { 2559, true },
    -  { 2572, true },
    -  { 2584, true },
    +  { 2174, true },
    +  { 2186, true },
    +  { 2198, true },
    +  { 2209, true },
    +  { 2218, true },
    +  { 2231, true },
    +  { 2251, true },
    +  { 2266, true },
    +  { 2274, true },
    +  { 2284, true },
    +  { 2301, true },
    +  { 2316, true },
    +  { 2323, false },
    +  { 2334, true },
    +  { 2349, false },
    +  { 2364, true },
    +  { 2383, true },
    +  { 2393, true },
    +  { 2404, true },
    +  { 2422, true },
    +  { 2436, true },
    +  { 2448, true },
    +  { 2464, true },
    +  { 2475, false },
    +  { 2491, false },
    +  { 2503, true },
    +  { 2516, true },
    +  { 2529, false },
    +  { 2537, true },
    +  { 2561, true },
    +  { 2576, true },
       { 2595, true },
    -  { 2619, true },
    -  { 2632, true },
    -  { 2641, true },
    -  { 2658, true },
    -  { 2670, true },
    -  { 2689, true },
    -  { 2712, true },
    -  { 2728, true },
    -  { 2745, true },
    -  { 2765, true },
    -  { 2786, true },
    -  { 2806, true },
    -  { 2818, true },
    -  { 2829, true },
    -  { 2836, true },
    -  { 2848, true },
    -  { 2869, true },
    -  { 2881, true },
    -  { 2898, true },
    -  { 2911, true },
    -  { 2927, true },
    -  { 2939, true },
    -  { 2952, false },
    -  { 2961, true },
    -  { 2976, true },
    -  { 2993, true },
    -  { 3007, true },
    -  { 3023, true },
    -  { 3034, true },
    -  { 3046, true },
    -  { 3067, true },
    -  { 3084, false },
    -  { 3094, true },
    -  { 3109, true },
    -  { 3123, false },
    -  { 3136, true },
    +  { 2608, true },
    +  { 2620, true },
    +  { 2631, true },
    +  { 2655, true },
    +  { 2668, true },
    +  { 2677, true },
    +  { 2694, true },
    +  { 2706, true },
    +  { 2725, true },
    +  { 2748, true },
    +  { 2764, true },
    +  { 2781, true },
    +  { 2801, true },
    +  { 2822, true },
    +  { 2842, true },
    +  { 2854, true },
    +  { 2865, true },
    +  { 2872, true },
    +  { 2884, true },
    +  { 2905, true },
    +  { 2917, true },
    +  { 2934, true },
    +  { 2947, true },
    +  { 2963, true },
    +  { 2975, true },
    +  { 2988, false },
    +  { 2997, true },
    +  { 3012, true },
    +  { 3029, true },
    +  { 3043, true },
    +  { 3059, true },
    +  { 3070, true },
    +  { 3082, true },
    +  { 3103, true },
    +  { 3120, false },
    +  { 3130, true },
       { 3145, true },
    -  { 3159, true },
    -  { 3171, true },
    -  { 3186, true },
    -  { 3199, true },
    -  { 3211, true },
    -  { 3223, true },
    +  { 3159, false },
    +  { 3172, true },
    +  { 3181, true },
    +  { 3195, true },
    +  { 3207, true },
    +  { 3222, true },
       { 3235, true },
       { 3247, true },
       { 3259, true },
    -  { 3270, true },
    -  { 3287, true },
    -  { 3301, true },
    -  { 3317, true },
    -  { 3330, true },
    -  { 3347, true },
    -  { 3363, true },
    -  { 3378, true },
    -  { 3393, true },
    -  { 3411, true },
    -  { 3420, true },
    -  { 3433, true },
    -  { 3454, true },
    -  { 3463, true },
    -  { 3473, true },
    -  { 3498, true },
    +  { 3271, true },
    +  { 3283, true },
    +  { 3295, true },
    +  { 3306, true },
    +  { 3323, true },
    +  { 3337, true },
    +  { 3353, true },
    +  { 3366, true },
    +  { 3383, true },
    +  { 3399, true },
    +  { 3414, true },
    +  { 3429, true },
    +  { 3447, true },
    +  { 3456, true },
    +  { 3469, true },
    +  { 3490, true },
    +  { 3499, true },
       { 3509, true },
    -  { 3528, true },
    -  { 3540, true },
    -  { 3559, true },
    -  { 3578, true },
    -  { 3597, true },
    -  { 3616, true },
    -  { 3631, true },
    -  { 3642, true },
    -  { 3655, true },
    +  { 3534, true },
    +  { 3545, true },
    +  { 3564, true },
    +  { 3576, true },
    +  { 3595, true },
    +  { 3614, true },
    +  { 3633, true },
    +  { 3652, true },
       { 3667, true },
    -  { 3680, true },
    -  { 3694, true },
    -  { 3705, true },
    -  { 3714, true },
    -  { 3728, true },
    -  { 3740, true },
    -  { 3767, true },
    -  { 3793, true },
    -  { 3804, true },
    -  { 3817, true },
    -  { 3828, true },
    -  { 3852, true },
    -  { 3869, true },
    -  { 3897, true },
    -  { 3913, true },
    -  { 3922, true },
    -  { 3932, true },
    -  { 3946, true },
    -  { 3956, true },
    -  { 3970, false },
    -  { 3991, true },
    -  { 4009, true },
    -  { 4017, true },
    -  { 4026, true },
    +  { 3678, true },
    +  { 3691, true },
    +  { 3703, true },
    +  { 3716, true },
    +  { 3730, true },
    +  { 3741, true },
    +  { 3750, true },
    +  { 3764, true },
    +  { 3776, true },
    +  { 3803, true },
    +  { 3829, true },
    +  { 3840, true },
    +  { 3853, true },
    +  { 3864, true },
    +  { 3888, true },
    +  { 3905, true },
    +  { 3933, true },
    +  { 3949, true },
    +  { 3958, true },
    +  { 3968, true },
    +  { 3982, true },
    +  { 3992, true },
    +  { 4006, false },
    +  { 4027, true },
       { 4045, true },
    -  { 4064, true },
    -  { 4077, true },
    -  { 4088, true },
    -  { 4108, true },
    -  { 4126, false },
    -  { 4145, true },
    -  { 4159, true },
    -  { 4169, true },
    -  { 4190, true },
    -  { 4206, true },
    -  { 4216, true },
    -  { 4229, true },
    +  { 4053, true },
    +  { 4062, true },
    +  { 4081, true },
    +  { 4100, true },
    +  { 4113, true },
    +  { 4124, true },
    +  { 4144, true },
    +  { 4162, false },
    +  { 4181, true },
    +  { 4195, true },
    +  { 4205, true },
    +  { 4226, true },
       { 4242, true },
    -  { 4256, true },
    -  { 4270, true },
    -  { 4280, true },
    -  { 4290, true },
    -  { 4300, true },
    -  { 4310, true },
    -  { 4320, true },
    -  { 4330, true },
    -  { 4347, false },
    -  { 4355, true },
    +  { 4252, true },
    +  { 4265, true },
    +  { 4278, true },
    +  { 4292, true },
    +  { 4306, true },
    +  { 4316, true },
    +  { 4326, true },
    +  { 4336, true },
    +  { 4346, true },
    +  { 4356, true },
       { 4366, true },
    -  { 4385, true },
    -  { 4396, true },
    -  { 4407, true },
    -  { 4416, true },
    -  { 4436, true },
    -  { 4447, true },
    -  { 4471, true },
    -  { 4485, true },
    -  { 4501, true },
    -  { 4513, true },
    -  { 4529, true },
    -  { 4540, true },
    -  { 4554, true },
    -  { 4570, true },
    -  { 4578, true },
    -  { 4595, false },
    -  { 4619, true },
    -  { 4636, true },
    -  { 4644, true },
    -  { 4660, true },
    -  { 4668, true },
    -  { 4682, true },
    -  { 4694, false },
    -  { 4707, true },
    -  { 4719, true },
    -  { 4731, true },
    +  { 4383, false },
    +  { 4391, true },
    +  { 4402, true },
    +  { 4421, true },
    +  { 4432, true },
    +  { 4443, true },
    +  { 4452, true },
    +  { 4472, true },
    +  { 4483, true },
    +  { 4507, true },
    +  { 4521, true },
    +  { 4537, true },
    +  { 4549, true },
    +  { 4565, true },
    +  { 4576, true },
    +  { 4590, true },
    +  { 4606, true },
    +  { 4614, true },
    +  { 4631, false },
    +  { 4655, true },
    +  { 4672, true },
    +  { 4680, true },
    +  { 4696, true },
    +  { 4704, true },
    +  { 4718, true },
    +  { 4730, false },
       { 4743, true },
    -  { 4753, true },
    -  { 4761, true },
    -  { 4775, true },
    -  { 4788, true },
    -  { 4800, true },
    -  { 4819, true },
    -  { 4838, true },
    -  { 4871, true },
    -  { 4881, true },
    -  { 4888, true },
    -  { 4905, true },
    -  { 4920, true },
    -  { 4929, true },
    -  { 4936, true },
    -  { 4950, true },
    -  { 4958, true },
    -  { 4969, true },
    -  { 4984, true },
    -  { 4999, true },
    -  { 5009, true },
    +  { 4755, true },
    +  { 4767, true },
    +  { 4779, true },
    +  { 4789, true },
    +  { 4797, true },
    +  { 4811, true },
    +  { 4824, true },
    +  { 4836, true },
    +  { 4855, true },
    +  { 4874, true },
    +  { 4907, true },
    +  { 4917, true },
    +  { 4924, true },
    +  { 4941, true },
    +  { 4956, true },
    +  { 4965, true },
    +  { 4972, true },
    +  { 4986, true },
    +  { 4994, true },
    +  { 5005, true },
       { 5020, true },
       { 5035, true },
    -  { 5047, true },
    -  { 5058, true },
    -  { 5078, true },
    -  { 5089, true },
    -  { 5102, true },
    -  { 5113, true },
    -  { 5124, true },
    -  { 5137, true },
    -  { 5155, true },
    -  { 5167, true },
    -  { 5176, true },
    -  { 5190, true },
    -  { 5202, true },
    -  { 5213, true },
    -  { 5230, true },
    -  { 5241, true },
    -  { 5249, true },
    -  { 5258, true },
    -  { 5284, true },
    -  { 5295, true },
    -  { 5305, false },
    -  { 5322, true },
    -  { 5332, true },
    +  { 5045, true },
    +  { 5056, true },
    +  { 5071, true },
    +  { 5083, true },
    +  { 5094, true },
    +  { 5114, true },
    +  { 5125, true },
    +  { 5138, true },
    +  { 5149, true },
    +  { 5160, true },
    +  { 5173, true },
    +  { 5191, true },
    +  { 5203, true },
    +  { 5212, true },
    +  { 5226, true },
    +  { 5237, true },
    +  { 5254, true },
    +  { 5265, true },
    +  { 5273, true },
    +  { 5282, true },
    +  { 5308, true },
    +  { 5319, true },
    +  { 5329, false },
       { 5346, true },
    -  { 5359, true },
    -  { 5371, true },
    -  { 5380, true },
    -  { 5397, true },
    +  { 5356, true },
    +  { 5370, true },
    +  { 5383, true },
    +  { 5395, true },
    +  { 5404, true },
       { 5421, true },
    -  { 5437, true },
    -  { 5457, true },
    -  { 5482, true },
    -  { 5507, true },
    -  { 5532, true },
    -  { 5544, true },
    +  { 5445, true },
    +  { 5461, true },
    +  { 5481, true },
    +  { 5506, true },
    +  { 5531, true },
       { 5556, true },
    -  { 5565, true },
    -  { 5576, true },
    -  { 5603, true },
    -  { 5616, true },
    -  { 5632, true },
    -  { 5648, true },
    -  { 5660, true },
    -  { 5674, true },
    -  { 5694, true },
    -  { 5709, true },
    -  { 5730, true },
    -  { 5742, true },
    -  { 5752, true },
    -  { 5764, true },
    +  { 5568, true },
    +  { 5580, true },
    +  { 5589, true },
    +  { 5600, true },
    +  { 5627, true },
    +  { 5640, true },
    +  { 5656, true },
    +  { 5672, true },
    +  { 5684, true },
    +  { 5698, true },
    +  { 5718, true },
    +  { 5733, true },
    +  { 5754, true },
    +  { 5766, true },
       { 5776, true },
    -  { 5785, true },
    -  { 5797, true },
    -  { 5816, true },
    -  { 5829, true },
    +  { 5788, true },
    +  { 5800, true },
    +  { 5809, true },
    +  { 5821, true },
       { 5840, true },
    -  { 5849, true },
    -  { 5860, true },
    -  { 5874, true },
    -  { 5890, true },
    -  { 5910, true },
    -  { 5931, true },
    -  { 5945, true },
    -  { 5958, true },
    -  { 5968, true },
    -  { 5983, true },
    -  { 6001, true },
    -  { 6011, true },
    -  { 6026, true },
    -  { 6044, true },
    -  { 6058, true },
    -  { 6073, true },
    -  { 6087, true },
    -  { 6102, true },
    +  { 5853, true },
    +  { 5864, true },
    +  { 5873, true },
    +  { 5884, true },
    +  { 5898, true },
    +  { 5914, true },
    +  { 5934, true },
    +  { 5955, true },
    +  { 5969, true },
    +  { 5982, true },
    +  { 5992, true },
    +  { 6007, true },
    +  { 6025, true },
    +  { 6035, true },
    +  { 6050, true },
    +  { 6068, true },
    +  { 6082, true },
    +  { 6097, true },
       { 6112, true },
    -  { 6126, true },
    -  { 6143, true },
    -  { 6158, true },
    -  { 6172, true },
    -  { 6186, true },
    -  { 6202, true },
    -  { 6214, true },
    -  { 6226, true },
    -  { 6241, true },
    -  { 6255, true },
    -  { 6277, true },
    -  { 6298, false },
    -  { 6319, true },
    -  { 6332, true },
    -  { 6344, true },
    -  { 6357, true },
    -  { 6372, true },
    -  { 6383, true },
    -  { 6399, false },
    -  { 6406, true },
    -  { 6417, true },
    -  { 6429, true },
    -  { 6442, true },
    -  { 6462, true },
    -  { 6483, true },
    -  { 6496, true },
    +  { 6122, true },
    +  { 6136, true },
    +  { 6153, true },
    +  { 6168, true },
    +  { 6182, true },
    +  { 6196, true },
    +  { 6212, true },
    +  { 6224, true },
    +  { 6236, true },
    +  { 6251, true },
    +  { 6273, true },
    +  { 6294, false },
    +  { 6315, true },
    +  { 6328, true },
    +  { 6340, true },
    +  { 6355, true },
    +  { 6366, true },
    +  { 6382, false },
    +  { 6389, true },
    +  { 6400, true },
    +  { 6412, true },
    +  { 6425, true },
    +  { 6445, true },
    +  { 6466, true },
    +  { 6479, true },
    +  { 6497, true },
       { 6514, true },
    -  { 6531, true },
    -  { 6555, true },
    -  { 6574, true },
    -  { 6585, true },
    -  { 6599, true },
    -  { 6615, true },
    -  { 6634, true },
    -  { 6655, true },
    -  { 6675, true },
    -  { 6695, true },
    -  { 6708, false },
    -  { 6721, true },
    -  { 6733, true },
    -  { 6743, true },
    -  { 6756, true },
    -  { 6770, true },
    -  { 6786, true },
    -  { 6800, true },
    -  { 6816, true },
    -  { 6828, true },
    -  { 6842, true },
    -  { 6855, true },
    -  { 6869, true },
    -  { 6877, true },
    -  { 6892, true },
    -  { 6911, true },
    -  { 6923, true },
    -  { 6937, true },
    -  { 6951, true },
    -  { 6963, true },
    -  { 6974, true },
    -  { 6985, true },
    -  { 6999, true },
    -  { 7007, true },
    -  { 7018, true },
    -  { 7026, true },
    -  { 7034, true },
    -  { 7042, true },
    -  { 7050, true },
    -  { 7063, true },
    -  { 7073, true },
    -  { 7086, true },
    -  { 7098, true },
    -  { 7111, true },
    -  { 7131, true },
    -  { 7143, true },
    -  { 7154, true },
    -  { 7172, true },
    -  { 7185, true },
    -  { 7194, true },
    -  { 7206, true },
    -  { 7220, true },
    -  { 7233, true },
    -  { 7242, true },
    -  { 7258, true },
    -  { 7286, true },
    -  { 7305, true },
    -  { 7320, true },
    -  { 7340, true },
    -  { 7352, true },
    -  { 7364, true },
    -  { 7375, true },
    -  { 7386, true },
    -  { 7406, true },
    -  { 7424, true },
    -  { 7434, false },
    -  { 7445, true },
    -  { 7455, true },
    -  { 7466, true },
    -  { 7475, true },
    -  { 7486, true },
    -  { 7505, true },
    -  { 7516, true },
    -  { 7534, true },
    -  { 7560, true },
    -  { 7570, true },
    -  { 7584, true },
    -  { 7606, true },
    -  { 7620, true },
    -  { 7635, true },
    -  { 7649, true },
    -  { 7663, true },
    -  { 7678, true },
    -  { 7699, true },
    -  { 7709, true },
    -  { 7720, true },
    -  { 7741, true },
    -  { 7759, true },
    -  { 7772, true },
    -  { 7780, true },
    -  { 7794, true },
    -  { 7810, true },
    -  { 7828, true },
    -  { 7850, true },
    +  { 6538, true },
    +  { 6557, true },
    +  { 6568, true },
    +  { 6582, true },
    +  { 6598, true },
    +  { 6617, true },
    +  { 6638, true },
    +  { 6658, true },
    +  { 6678, true },
    +  { 6691, false },
    +  { 6704, true },
    +  { 6716, true },
    +  { 6726, true },
    +  { 6739, true },
    +  { 6753, true },
    +  { 6769, true },
    +  { 6783, true },
    +  { 6799, true },
    +  { 6811, true },
    +  { 6825, true },
    +  { 6838, true },
    +  { 6852, true },
    +  { 6860, true },
    +  { 6875, true },
    +  { 6889, true },
    +  { 6908, true },
    +  { 6920, true },
    +  { 6934, true },
    +  { 6948, true },
    +  { 6960, true },
    +  { 6971, true },
    +  { 6982, true },
    +  { 6996, true },
    +  { 7004, true },
    +  { 7015, true },
    +  { 7023, true },
    +  { 7031, true },
    +  { 7039, true },
    +  { 7047, true },
    +  { 7060, true },
    +  { 7070, true },
    +  { 7083, true },
    +  { 7095, true },
    +  { 7108, true },
    +  { 7128, true },
    +  { 7140, true },
    +  { 7151, true },
    +  { 7169, true },
    +  { 7182, true },
    +  { 7191, true },
    +  { 7203, true },
    +  { 7217, true },
    +  { 7230, true },
    +  { 7239, true },
    +  { 7255, true },
    +  { 7283, true },
    +  { 7302, true },
    +  { 7317, true },
    +  { 7337, true },
    +  { 7349, true },
    +  { 7361, true },
    +  { 7372, true },
    +  { 7383, true },
    +  { 7403, true },
    +  { 7421, true },
    +  { 7431, false },
    +  { 7442, true },
    +  { 7452, true },
    +  { 7463, true },
    +  { 7472, true },
    +  { 7483, true },
    +  { 7502, true },
    +  { 7513, true },
    +  { 7531, true },
    +  { 7557, true },
    +  { 7567, true },
    +  { 7589, true },
    +  { 7603, true },
    +  { 7618, true },
    +  { 7632, true },
    +  { 7646, true },
    +  { 7661, true },
    +  { 7682, true },
    +  { 7692, true },
    +  { 7703, true },
    +  { 7724, true },
    +  { 7742, true },
    +  { 7755, true },
    +  { 7763, true },
    +  { 7777, true },
    +  { 7793, true },
    +  { 7811, true },
    +  { 7833, true },
    +  { 7848, true },
       { 7865, true },
    -  { 7882, true },
    -  { 7898, true },
    +  { 7881, true },
    +  { 7897, true },
       { 7914, true },
    -  { 7931, true },
    -  { 7950, true },
    -  { 7965, true },
    +  { 7933, true },
    +  { 7948, true },
    +  { 7967, true },
       { 7984, true },
       { 8001, true },
       { 8019, true },
    @@ -13864,12634 +13842,12612 @@ static const nsSTSPreload kSTSPreloadList[] = {
       { 8193, true },
       { 8204, true },
       { 8215, true },
    -  { 8226, true },
    -  { 8238, true },
    -  { 8253, true },
    -  { 8266, true },
    +  { 8227, true },
    +  { 8242, true },
    +  { 8255, true },
    +  { 8274, true },
       { 8285, true },
    -  { 8296, true },
    -  { 8309, true },
    -  { 8323, false },
    -  { 8336, false },
    -  { 8345, true },
    -  { 8362, true },
    +  { 8298, true },
    +  { 8312, false },
    +  { 8325, false },
    +  { 8334, true },
    +  { 8351, true },
    +  { 8371, true },
       { 8382, true },
    -  { 8393, true },
    -  { 8411, false },
    -  { 8444, true },
    -  { 8476, true },
    -  { 8503, true },
    -  { 8513, true },
    -  { 8531, true },
    -  { 8546, true },
    -  { 8558, true },
    -  { 8570, true },
    -  { 8590, true },
    -  { 8609, true },
    -  { 8629, true },
    -  { 8652, true },
    -  { 8676, true },
    +  { 8400, false },
    +  { 8433, true },
    +  { 8465, true },
    +  { 8492, true },
    +  { 8502, true },
    +  { 8520, true },
    +  { 8535, true },
    +  { 8547, true },
    +  { 8559, true },
    +  { 8579, true },
    +  { 8598, true },
    +  { 8618, true },
    +  { 8641, true },
    +  { 8665, true },
    +  { 8677, true },
       { 8688, true },
    -  { 8699, true },
    -  { 8711, true },
    -  { 8723, true },
    -  { 8739, true },
    -  { 8756, true },
    -  { 8775, true },
    +  { 8700, true },
    +  { 8712, true },
    +  { 8728, true },
    +  { 8745, true },
    +  { 8764, true },
    +  { 8778, true },
       { 8789, true },
    -  { 8800, true },
    +  { 8822, true },
       { 8833, true },
    -  { 8844, true },
    -  { 8857, true },
    -  { 8869, false },
    -  { 8893, true },
    -  { 8909, true },
    -  { 8925, true },
    -  { 8937, true },
    -  { 8952, true },
    -  { 8968, true },
    -  { 8985, true },
    -  { 9003, true },
    -  { 9019, true },
    -  { 9040, true },
    -  { 9050, true },
    -  { 9067, true },
    -  { 9080, true },
    -  { 9093, true },
    +  { 8846, true },
    +  { 8858, false },
    +  { 8882, true },
    +  { 8898, true },
    +  { 8914, true },
    +  { 8926, true },
    +  { 8941, true },
    +  { 8957, true },
    +  { 8974, true },
    +  { 8992, true },
    +  { 9008, true },
    +  { 9029, true },
    +  { 9039, true },
    +  { 9056, true },
    +  { 9069, true },
    +  { 9082, true },
    +  { 9098, true },
       { 9109, true },
    -  { 9120, true },
    +  { 9121, true },
       { 9132, true },
    -  { 9143, true },
    -  { 9150, true },
    -  { 9158, true },
    -  { 9171, false },
    -  { 9179, true },
    -  { 9189, true },
    -  { 9203, false },
    -  { 9217, true },
    -  { 9233, true },
    -  { 9263, true },
    -  { 9286, true },
    -  { 9299, true },
    -  { 9318, true },
    -  { 9331, false },
    -  { 9350, true },
    -  { 9366, true },
    -  { 9382, false },
    -  { 9397, false },
    -  { 9410, true },
    +  { 9139, true },
    +  { 9147, true },
    +  { 9160, false },
    +  { 9168, true },
    +  { 9178, true },
    +  { 9192, false },
    +  { 9206, true },
    +  { 9222, true },
    +  { 9252, true },
    +  { 9275, true },
    +  { 9288, true },
    +  { 9307, true },
    +  { 9320, false },
    +  { 9339, true },
    +  { 9355, true },
    +  { 9371, false },
    +  { 9386, false },
    +  { 9399, true },
    +  { 9415, true },
       { 9426, true },
    -  { 9437, true },
    -  { 9449, true },
    -  { 9468, true },
    -  { 9487, true },
    -  { 9502, true },
    -  { 9523, false },
    -  { 9538, true },
    -  { 9551, true },
    +  { 9438, true },
    +  { 9457, true },
    +  { 9476, true },
    +  { 9491, true },
    +  { 9512, false },
    +  { 9527, true },
    +  { 9540, true },
    +  { 9550, true },
       { 9561, true },
       { 9572, true },
    -  { 9583, true },
    -  { 9597, true },
    -  { 9613, true },
    -  { 9630, false },
    -  { 9647, true },
    -  { 9673, true },
    -  { 9686, true },
    -  { 9700, true },
    -  { 9719, true },
    -  { 9740, true },
    -  { 9752, true },
    -  { 9766, true },
    -  { 9790, true },
    -  { 9803, true },
    -  { 9816, true },
    +  { 9586, true },
    +  { 9602, true },
    +  { 9619, false },
    +  { 9636, true },
    +  { 9662, true },
    +  { 9675, true },
    +  { 9689, true },
    +  { 9708, true },
    +  { 9729, true },
    +  { 9741, true },
    +  { 9755, true },
    +  { 9779, true },
    +  { 9792, true },
    +  { 9805, true },
    +  { 9819, true },
       { 9830, true },
    -  { 9841, true },
    -  { 9850, true },
    -  { 9863, true },
    -  { 9876, true },
    -  { 9888, false },
    -  { 9906, true },
    -  { 9929, true },
    -  { 9956, true },
    -  { 9975, true },
    -  { 9987, true },
    -  { 10000, true },
    +  { 9839, true },
    +  { 9852, true },
    +  { 9865, true },
    +  { 9877, false },
    +  { 9895, true },
    +  { 9918, true },
    +  { 9945, true },
    +  { 9964, true },
    +  { 9976, true },
    +  { 9989, true },
    +  { 10009, true },
       { 10020, true },
    -  { 10031, true },
    -  { 10043, true },
    -  { 10057, true },
    -  { 10065, true },
    -  { 10082, true },
    -  { 10094, true },
    -  { 10112, true },
    -  { 10135, false },
    -  { 10151, true },
    -  { 10157, true },
    -  { 10169, true },
    -  { 10180, false },
    -  { 10197, true },
    -  { 10216, true },
    -  { 10228, true },
    -  { 10257, true },
    -  { 10273, true },
    -  { 10286, true },
    -  { 10302, true },
    +  { 10032, true },
    +  { 10046, true },
    +  { 10054, true },
    +  { 10071, true },
    +  { 10083, true },
    +  { 10101, true },
    +  { 10124, false },
    +  { 10140, true },
    +  { 10146, true },
    +  { 10158, true },
    +  { 10169, false },
    +  { 10186, true },
    +  { 10205, true },
    +  { 10217, true },
    +  { 10246, true },
    +  { 10262, true },
    +  { 10275, true },
    +  { 10291, true },
    +  { 10304, true },
       { 10315, true },
    -  { 10326, true },
    -  { 10338, true },
    -  { 10354, true },
    -  { 10368, true },
    -  { 10384, true },
    -  { 10398, true },
    -  { 10406, true },
    -  { 10420, true },
    -  { 10440, true },
    -  { 10452, true },
    -  { 10468, true },
    -  { 10482, false },
    -  { 10495, true },
    -  { 10510, true },
    -  { 10524, true },
    -  { 10533, true },
    -  { 10545, true },
    -  { 10563, true },
    -  { 10578, true },
    -  { 10588, true },
    -  { 10602, true },
    -  { 10628, true },
    -  { 10638, true },
    -  { 10652, true },
    -  { 10666, true },
    -  { 10684, true },
    -  { 10702, true },
    -  { 10718, true },
    -  { 10728, true },
    -  { 10739, true },
    -  { 10755, true },
    +  { 10327, true },
    +  { 10343, true },
    +  { 10357, true },
    +  { 10373, true },
    +  { 10387, true },
    +  { 10395, true },
    +  { 10409, true },
    +  { 10429, true },
    +  { 10441, true },
    +  { 10457, true },
    +  { 10471, false },
    +  { 10484, true },
    +  { 10499, true },
    +  { 10513, true },
    +  { 10522, true },
    +  { 10534, true },
    +  { 10552, true },
    +  { 10567, true },
    +  { 10577, true },
    +  { 10591, true },
    +  { 10617, true },
    +  { 10627, true },
    +  { 10641, true },
    +  { 10655, true },
    +  { 10673, true },
    +  { 10689, true },
    +  { 10699, true },
    +  { 10710, true },
    +  { 10726, true },
    +  { 10734, true },
    +  { 10742, true },
    +  { 10753, true },
       { 10763, true },
    -  { 10771, true },
    -  { 10782, true },
    -  { 10792, true },
    -  { 10807, true },
    -  { 10826, true },
    -  { 10839, true },
    -  { 10854, true },
    -  { 10869, true },
    -  { 10889, true },
    -  { 10900, true },
    -  { 10913, true },
    -  { 10933, false },
    -  { 10947, true },
    -  { 10960, true },
    -  { 10978, true },
    -  { 10992, true },
    -  { 11005, true },
    -  { 11019, true },
    -  { 11033, true },
    -  { 11045, true },
    -  { 11056, true },
    -  { 11067, true },
    -  { 11080, true },
    -  { 11095, true },
    -  { 11106, true },
    -  { 11117, true },
    -  { 11128, true },
    -  { 11138, true },
    -  { 11159, true },
    -  { 11170, true },
    -  { 11179, true },
    -  { 11186, true },
    -  { 11200, false },
    +  { 10778, true },
    +  { 10797, true },
    +  { 10810, true },
    +  { 10825, true },
    +  { 10840, true },
    +  { 10860, true },
    +  { 10871, true },
    +  { 10884, true },
    +  { 10904, false },
    +  { 10918, true },
    +  { 10931, true },
    +  { 10949, true },
    +  { 10963, true },
    +  { 10976, true },
    +  { 10990, true },
    +  { 11004, true },
    +  { 11016, true },
    +  { 11027, true },
    +  { 11038, true },
    +  { 11051, true },
    +  { 11066, true },
    +  { 11077, true },
    +  { 11088, true },
    +  { 11099, true },
    +  { 11109, true },
    +  { 11130, true },
    +  { 11141, true },
    +  { 11150, true },
    +  { 11157, true },
    +  { 11171, false },
    +  { 11184, true },
    +  { 11194, true },
    +  { 11200, true },
       { 11213, true },
    -  { 11223, true },
    -  { 11229, true },
    -  { 11242, true },
    -  { 11255, true },
    -  { 11266, true },
    -  { 11278, true },
    -  { 11292, true },
    -  { 11302, true },
    -  { 11320, true },
    -  { 11330, true },
    -  { 11342, true },
    -  { 11356, true },
    -  { 11366, true },
    -  { 11382, true },
    -  { 11393, true },
    -  { 11410, true },
    -  { 11429, true },
    -  { 11443, true },
    -  { 11465, true },
    -  { 11491, true },
    +  { 11226, true },
    +  { 11237, true },
    +  { 11249, true },
    +  { 11263, true },
    +  { 11273, true },
    +  { 11291, true },
    +  { 11301, true },
    +  { 11313, true },
    +  { 11327, true },
    +  { 11337, true },
    +  { 11353, true },
    +  { 11364, true },
    +  { 11381, true },
    +  { 11400, true },
    +  { 11414, true },
    +  { 11436, true },
    +  { 11462, true },
    +  { 11472, true },
    +  { 11490, true },
       { 11501, true },
    -  { 11519, true },
    -  { 11530, true },
    -  { 11540, true },
    +  { 11511, true },
    +  { 11521, true },
    +  { 11531, true },
       { 11550, true },
    -  { 11560, true },
    -  { 11579, true },
    -  { 11599, true },
    -  { 11613, true },
    -  { 11620, true },
    -  { 11630, true },
    -  { 11639, true },
    -  { 11657, true },
    +  { 11570, true },
    +  { 11584, true },
    +  { 11591, true },
    +  { 11601, true },
    +  { 11610, true },
    +  { 11628, true },
    +  { 11650, true },
    +  { 11663, true },
       { 11679, true },
    -  { 11692, true },
    -  { 11708, true },
    -  { 11716, true },
    -  { 11728, false },
    -  { 11748, true },
    -  { 11762, true },
    -  { 11769, true },
    -  { 11785, true },
    +  { 11687, true },
    +  { 11699, false },
    +  { 11719, true },
    +  { 11726, true },
    +  { 11742, true },
    +  { 11758, true },
    +  { 11773, true },
    +  { 11783, true },
       { 11801, true },
    -  { 11816, true },
    -  { 11826, true },
    -  { 11844, true },
    +  { 11828, true },
    +  { 11845, true },
    +  { 11863, true },
       { 11871, true },
    -  { 11888, true },
    -  { 11906, true },
    -  { 11914, true },
    -  { 11928, true },
    -  { 11939, true },
    -  { 11948, true },
    -  { 11975, true },
    +  { 11885, true },
    +  { 11896, true },
    +  { 11905, true },
    +  { 11932, true },
    +  { 11942, true },
    +  { 11958, true },
    +  { 11970, true },
       { 11985, true },
    -  { 12001, true },
    -  { 12013, true },
    -  { 12028, true },
    -  { 12040, true },
    -  { 12055, true },
    -  { 12070, true },
    -  { 12082, true },
    +  { 11997, true },
    +  { 12012, true },
    +  { 12027, true },
    +  { 12039, true },
    +  { 12060, true },
    +  { 12077, true },
    +  { 12091, true },
       { 12103, true },
    -  { 12120, true },
    -  { 12134, true },
    -  { 12146, true },
    -  { 12156, true },
    -  { 12166, true },
    -  { 12181, true },
    -  { 12196, true },
    -  { 12208, true },
    -  { 12216, true },
    -  { 12229, true },
    +  { 12113, true },
    +  { 12123, true },
    +  { 12138, true },
    +  { 12153, true },
    +  { 12165, true },
    +  { 12173, true },
    +  { 12186, true },
    +  { 12207, true },
    +  { 12221, true },
    +  { 12237, true },
       { 12247, true },
    -  { 12268, true },
    -  { 12282, true },
    -  { 12298, true },
    -  { 12308, true },
    -  { 12320, true },
    -  { 12333, true },
    -  { 12352, true },
    -  { 12378, true },
    -  { 12390, true },
    -  { 12402, true },
    +  { 12259, true },
    +  { 12272, true },
    +  { 12291, true },
    +  { 12317, true },
    +  { 12329, true },
    +  { 12341, true },
    +  { 12360, true },
    +  { 12386, true },
    +  { 12399, true },
    +  { 12410, true },
       { 12421, true },
    -  { 12447, true },
    -  { 12460, true },
    -  { 12471, true },
    -  { 12482, true },
    -  { 12500, true },
    -  { 12530, true },
    -  { 12553, true },
    -  { 12566, false },
    +  { 12439, true },
    +  { 12469, true },
    +  { 12492, true },
    +  { 12505, false },
    +  { 12513, true },
    +  { 12525, true },
    +  { 12541, true },
    +  { 12556, true },
       { 12574, true },
    -  { 12586, true },
    -  { 12602, true },
    -  { 12617, true },
    -  { 12635, true },
    +  { 12584, true },
    +  { 12600, true },
    +  { 12629, true },
       { 12645, true },
       { 12661, true },
    -  { 12690, true },
    -  { 12706, true },
    -  { 12722, true },
    -  { 12733, true },
    -  { 12745, true },
    -  { 12768, true },
    -  { 12786, true },
    -  { 12804, true },
    -  { 12825, true },
    -  { 12850, true },
    -  { 12864, true },
    -  { 12877, true },
    -  { 12890, true },
    -  { 12901, true },
    -  { 12927, true },
    -  { 12943, true },
    -  { 12953, true },
    +  { 12672, true },
    +  { 12684, true },
    +  { 12707, true },
    +  { 12725, true },
    +  { 12743, true },
    +  { 12764, true },
    +  { 12789, true },
    +  { 12803, true },
    +  { 12816, true },
    +  { 12829, true },
    +  { 12840, true },
    +  { 12866, true },
    +  { 12882, true },
    +  { 12892, true },
    +  { 12904, true },
    +  { 12921, true },
    +  { 12933, true },
    +  { 12946, true },
    +  { 12954, true },
       { 12965, true },
    -  { 12982, true },
    +  { 12976, true },
       { 12994, true },
    -  { 13007, true },
    -  { 13015, true },
    -  { 13026, true },
    -  { 13037, true },
    -  { 13055, true },
    -  { 13070, true },
    -  { 13088, true },
    -  { 13097, true },
    -  { 13108, true },
    -  { 13122, true },
    -  { 13133, true },
    -  { 13141, true },
    -  { 13151, true },
    -  { 13162, true },
    -  { 13170, true },
    -  { 13180, true },
    -  { 13195, true },
    -  { 13203, true },
    -  { 13228, true },
    -  { 13244, true },
    -  { 13251, true },
    -  { 13259, true },
    -  { 13268, false },
    -  { 13277, true },
    -  { 13293, true },
    -  { 13306, true },
    -  { 13315, true },
    -  { 13324, true },
    -  { 13334, true },
    -  { 13346, true },
    -  { 13364, false },
    -  { 13380, true },
    -  { 13392, true },
    -  { 13402, true },
    -  { 13412, true },
    -  { 13424, true },
    -  { 13437, true },
    -  { 13450, true },
    -  { 13460, true },
    +  { 13009, true },
    +  { 13027, true },
    +  { 13036, true },
    +  { 13047, true },
    +  { 13061, true },
    +  { 13072, true },
    +  { 13080, true },
    +  { 13090, true },
    +  { 13101, true },
    +  { 13109, true },
    +  { 13119, true },
    +  { 13134, true },
    +  { 13142, true },
    +  { 13167, true },
    +  { 13183, true },
    +  { 13190, true },
    +  { 13198, true },
    +  { 13207, false },
    +  { 13216, true },
    +  { 13232, true },
    +  { 13245, true },
    +  { 13254, true },
    +  { 13263, true },
    +  { 13273, true },
    +  { 13285, true },
    +  { 13303, false },
    +  { 13319, true },
    +  { 13331, true },
    +  { 13341, true },
    +  { 13353, true },
    +  { 13366, true },
    +  { 13379, true },
    +  { 13389, true },
    +  { 13399, true },
    +  { 13409, true },
    +  { 13421, false },
    +  { 13433, true },
    +  { 13449, true },
    +  { 13460, false },
       { 13470, true },
    -  { 13482, false },
    -  { 13494, true },
    -  { 13510, true },
    -  { 13521, false },
    -  { 13531, true },
    -  { 13539, true },
    -  { 13548, true },
    -  { 13562, true },
    -  { 13577, true },
    -  { 13591, true },
    -  { 13602, true },
    -  { 13626, true },
    -  { 13639, true },
    -  { 13651, true },
    -  { 13668, true },
    -  { 13679, true },
    -  { 13699, true },
    -  { 13717, true },
    -  { 13732, true },
    -  { 13753, true },
    -  { 13777, true },
    -  { 13787, true },
    -  { 13797, true },
    -  { 13807, true },
    -  { 13818, true },
    +  { 13478, true },
    +  { 13487, true },
    +  { 13501, true },
    +  { 13516, true },
    +  { 13530, true },
    +  { 13541, true },
    +  { 13565, true },
    +  { 13578, true },
    +  { 13590, true },
    +  { 13607, true },
    +  { 13618, true },
    +  { 13638, true },
    +  { 13656, true },
    +  { 13671, true },
    +  { 13692, true },
    +  { 13716, true },
    +  { 13726, true },
    +  { 13736, true },
    +  { 13746, true },
    +  { 13757, true },
    +  { 13782, true },
    +  { 13811, true },
    +  { 13824, true },
       { 13843, true },
    -  { 13872, true },
    -  { 13891, true },
    -  { 13903, true },
    +  { 13855, true },
    +  { 13865, true },
    +  { 13873, true },
    +  { 13882, true },
    +  { 13896, true },
       { 13913, true },
    -  { 13921, true },
    -  { 13930, true },
    -  { 13944, true },
    -  { 13961, true },
    -  { 13973, true },
    -  { 13988, true },
    +  { 13925, true },
    +  { 13940, true },
    +  { 13947, true },
    +  { 13960, true },
    +  { 13972, true },
    +  { 13980, true },
       { 13995, true },
    -  { 14008, true },
    -  { 14020, true },
    -  { 14028, true },
    -  { 14043, true },
    +  { 14004, true },
    +  { 14016, true },
    +  { 14027, true },
    +  { 14037, true },
       { 14052, true },
    -  { 14064, true },
    +  { 14065, true },
       { 14075, true },
    -  { 14085, true },
    -  { 14100, true },
    -  { 14113, true },
    -  { 14123, true },
    -  { 14136, true },
    -  { 14150, true },
    -  { 14164, true },
    -  { 14176, true },
    -  { 14191, true },
    -  { 14207, true },
    -  { 14222, true },
    -  { 14236, true },
    -  { 14252, true },
    -  { 14264, true },
    -  { 14278, true },
    -  { 14290, true },
    -  { 14302, true },
    -  { 14318, true },
    -  { 14333, false },
    -  { 14349, true },
    -  { 14367, true },
    -  { 14384, true },
    -  { 14402, true },
    -  { 14413, true },
    -  { 14426, true },
    -  { 14443, true },
    -  { 14461, false },
    -  { 14477, true },
    -  { 14493, true },
    -  { 14513, true },
    -  { 14528, true },
    -  { 14542, true },
    -  { 14553, true },
    -  { 14565, true },
    -  { 14578, true },
    -  { 14591, true },
    -  { 14609, true },
    -  { 14627, true },
    -  { 14645, true },
    -  { 14662, true },
    -  { 14672, true },
    -  { 14681, true },
    -  { 14696, true },
    -  { 14707, false },
    +  { 14088, true },
    +  { 14102, true },
    +  { 14116, true },
    +  { 14128, true },
    +  { 14143, true },
    +  { 14159, true },
    +  { 14174, true },
    +  { 14188, true },
    +  { 14204, true },
    +  { 14216, true },
    +  { 14230, true },
    +  { 14242, true },
    +  { 14254, true },
    +  { 14270, true },
    +  { 14285, false },
    +  { 14301, true },
    +  { 14319, true },
    +  { 14336, true },
    +  { 14354, true },
    +  { 14365, true },
    +  { 14378, true },
    +  { 14395, true },
    +  { 14413, false },
    +  { 14429, true },
    +  { 14445, true },
    +  { 14465, true },
    +  { 14480, true },
    +  { 14494, true },
    +  { 14505, true },
    +  { 14517, true },
    +  { 14530, true },
    +  { 14543, true },
    +  { 14561, true },
    +  { 14579, true },
    +  { 14597, true },
    +  { 14614, true },
    +  { 14624, true },
    +  { 14633, true },
    +  { 14648, true },
    +  { 14659, false },
    +  { 14669, true },
    +  { 14680, true },
    +  { 14694, true },
    +  { 14707, true },
       { 14717, true },
    -  { 14728, true },
    -  { 14742, true },
    +  { 14730, true },
    +  { 14744, true },
       { 14755, true },
       { 14765, true },
    -  { 14778, true },
    -  { 14792, true },
    -  { 14803, true },
    -  { 14813, true },
    -  { 14831, true },
    -  { 14843, true },
    -  { 14860, true },
    -  { 14880, true },
    +  { 14783, true },
    +  { 14795, true },
    +  { 14812, true },
    +  { 14832, true },
    +  { 14851, true },
    +  { 14866, true },
    +  { 14884, true },
       { 14899, true },
    -  { 14914, true },
    -  { 14932, true },
    -  { 14947, true },
    -  { 14958, true },
    -  { 14972, true },
    -  { 14983, true },
    +  { 14910, true },
    +  { 14924, true },
    +  { 14935, true },
    +  { 14946, true },
    +  { 14957, true },
    +  { 14984, true },
       { 14994, true },
    -  { 15005, true },
    -  { 15032, true },
    -  { 15042, true },
    -  { 15054, true },
    -  { 15066, true },
    -  { 15075, true },
    -  { 15084, true },
    -  { 15093, true },
    -  { 15108, true },
    -  { 15117, true },
    -  { 15129, true },
    -  { 15138, true },
    -  { 15148, true },
    -  { 15159, true },
    -  { 15169, true },
    -  { 15181, true },
    -  { 15195, true },
    -  { 15205, true },
    -  { 15215, false },
    -  { 15226, true },
    -  { 15244, true },
    -  { 15254, true },
    -  { 15273, true },
    -  { 15285, true },
    -  { 15306, true },
    -  { 15319, true },
    -  { 15333, true },
    -  { 15346, false },
    -  { 15360, false },
    -  { 15375, true },
    -  { 15387, true },
    -  { 15401, true },
    -  { 15419, true },
    +  { 15006, true },
    +  { 15018, true },
    +  { 15027, true },
    +  { 15036, true },
    +  { 15045, true },
    +  { 15060, true },
    +  { 15069, true },
    +  { 15081, true },
    +  { 15090, true },
    +  { 15100, true },
    +  { 15111, true },
    +  { 15121, true },
    +  { 15133, true },
    +  { 15147, true },
    +  { 15157, true },
    +  { 15167, true },
    +  { 15177, false },
    +  { 15188, true },
    +  { 15206, true },
    +  { 15216, true },
    +  { 15235, true },
    +  { 15247, true },
    +  { 15268, true },
    +  { 15281, true },
    +  { 15295, true },
    +  { 15308, false },
    +  { 15322, false },
    +  { 15337, true },
    +  { 15349, true },
    +  { 15363, true },
    +  { 15381, true },
    +  { 15394, true },
    +  { 15403, true },
    +  { 15421, true },
       { 15432, true },
    -  { 15441, true },
    -  { 15459, true },
    -  { 15470, true },
    -  { 15482, true },
    -  { 15496, true },
    -  { 15509, true },
    -  { 15523, true },
    -  { 15536, true },
    -  { 15550, true },
    -  { 15566, true },
    -  { 15577, true },
    -  { 15592, true },
    -  { 15605, true },
    -  { 15618, true },
    -  { 15634, true },
    -  { 15646, true },
    -  { 15659, true },
    -  { 15671, true },
    -  { 15687, true },
    +  { 15444, true },
    +  { 15458, true },
    +  { 15471, true },
    +  { 15485, true },
    +  { 15498, true },
    +  { 15512, true },
    +  { 15528, true },
    +  { 15539, true },
    +  { 15554, true },
    +  { 15567, true },
    +  { 15580, true },
    +  { 15596, true },
    +  { 15608, true },
    +  { 15621, true },
    +  { 15633, true },
    +  { 15649, true },
    +  { 15662, true },
    +  { 15672, true },
       { 15700, true },
    -  { 15710, true },
    -  { 15738, true },
    +  { 15715, true },
    +  { 15731, true },
    +  { 15742, true },
       { 15753, true },
    -  { 15769, true },
    -  { 15780, true },
    -  { 15791, true },
    -  { 15801, true },
    -  { 15811, false },
    -  { 15825, true },
    -  { 15837, false },
    -  { 15856, true },
    -  { 15883, true },
    -  { 15904, true },
    -  { 15920, true },
    -  { 15931, true },
    +  { 15763, true },
    +  { 15773, false },
    +  { 15787, true },
    +  { 15799, false },
    +  { 15818, true },
    +  { 15845, true },
    +  { 15866, true },
    +  { 15882, true },
    +  { 15893, true },
    +  { 15908, true },
    +  { 15919, true },
    +  { 15934, false },
       { 15949, true },
    -  { 15964, true },
    -  { 15975, true },
    -  { 15990, false },
    -  { 16005, true },
    -  { 16015, true },
    -  { 16029, true },
    -  { 16051, true },
    -  { 16066, true },
    -  { 16081, true },
    -  { 16102, true },
    -  { 16112, true },
    -  { 16126, true },
    -  { 16141, true },
    -  { 16153, true },
    -  { 16171, true },
    -  { 16189, true },
    -  { 16203, true },
    -  { 16222, true },
    -  { 16236, true },
    -  { 16246, true },
    -  { 16256, true },
    -  { 16269, true },
    -  { 16284, true },
    -  { 16298, true },
    -  { 16311, true },
    -  { 16324, true },
    -  { 16341, true },
    -  { 16357, true },
    -  { 16370, true },
    -  { 16387, true },
    -  { 16399, true },
    -  { 16417, true },
    -  { 16430, true },
    -  { 16450, true },
    -  { 16466, true },
    -  { 16482, true },
    +  { 15959, true },
    +  { 15973, true },
    +  { 15995, true },
    +  { 16010, true },
    +  { 16025, true },
    +  { 16046, true },
    +  { 16056, true },
    +  { 16070, true },
    +  { 16085, true },
    +  { 16097, true },
    +  { 16115, true },
    +  { 16133, true },
    +  { 16147, true },
    +  { 16166, true },
    +  { 16180, true },
    +  { 16190, true },
    +  { 16200, true },
    +  { 16213, true },
    +  { 16228, true },
    +  { 16242, true },
    +  { 16255, true },
    +  { 16268, true },
    +  { 16285, true },
    +  { 16301, true },
    +  { 16314, true },
    +  { 16331, true },
    +  { 16343, true },
    +  { 16361, true },
    +  { 16374, true },
    +  { 16394, true },
    +  { 16410, true },
    +  { 16426, true },
    +  { 16435, true },
    +  { 16443, true },
    +  { 16452, true },
    +  { 16461, true },
    +  { 16478, true },
       { 16491, true },
    -  { 16499, true },
    -  { 16508, true },
    -  { 16517, true },
    -  { 16534, true },
    -  { 16547, true },
    -  { 16557, true },
    -  { 16567, true },
    +  { 16501, true },
    +  { 16511, true },
    +  { 16521, true },
    +  { 16539, true },
    +  { 16563, true },
       { 16577, true },
    -  { 16595, true },
    -  { 16619, true },
    -  { 16633, true },
    -  { 16648, true },
    -  { 16666, true },
    -  { 16678, true },
    -  { 16701, true },
    -  { 16723, true },
    -  { 16749, true },
    -  { 16767, true },
    -  { 16789, true },
    -  { 16802, true },
    -  { 16814, true },
    -  { 16826, false },
    -  { 16842, true },
    -  { 16856, true },
    -  { 16871, true },
    -  { 16883, true },
    -  { 16905, true },
    -  { 16922, true },
    -  { 16937, true },
    -  { 16958, true },
    -  { 16972, true },
    -  { 16991, true },
    -  { 17008, true },
    -  { 17022, true },
    -  { 17043, true },
    -  { 17059, true },
    -  { 17072, true },
    -  { 17091, true },
    -  { 17108, true },
    -  { 17126, true },
    -  { 17144, true },
    -  { 17153, true },
    -  { 17169, true },
    -  { 17185, true },
    -  { 17204, true },
    -  { 17222, true },
    -  { 17238, true },
    -  { 17252, true },
    -  { 17264, true },
    -  { 17277, true },
    -  { 17287, true },
    -  { 17297, true },
    -  { 17311, true },
    -  { 17321, true },
    -  { 17332, true },
    -  { 17341, false },
    -  { 17350, true },
    -  { 17364, true },
    -  { 17378, true },
    -  { 17390, true },
    -  { 17405, true },
    -  { 17415, true },
    -  { 17428, true },
    -  { 17439, true },
    -  { 17451, true },
    +  { 16592, true },
    +  { 16610, true },
    +  { 16622, true },
    +  { 16645, true },
    +  { 16667, true },
    +  { 16693, true },
    +  { 16711, true },
    +  { 16733, true },
    +  { 16746, true },
    +  { 16758, true },
    +  { 16770, false },
    +  { 16786, true },
    +  { 16800, true },
    +  { 16815, true },
    +  { 16827, true },
    +  { 16849, true },
    +  { 16866, true },
    +  { 16881, true },
    +  { 16902, true },
    +  { 16916, true },
    +  { 16935, true },
    +  { 16952, true },
    +  { 16966, true },
    +  { 16987, true },
    +  { 17003, true },
    +  { 17016, true },
    +  { 17035, true },
    +  { 17052, true },
    +  { 17070, true },
    +  { 17088, true },
    +  { 17097, true },
    +  { 17113, true },
    +  { 17129, true },
    +  { 17148, true },
    +  { 17166, true },
    +  { 17182, true },
    +  { 17196, true },
    +  { 17208, true },
    +  { 17221, true },
    +  { 17231, true },
    +  { 17241, true },
    +  { 17255, true },
    +  { 17265, true },
    +  { 17276, true },
    +  { 17285, false },
    +  { 17294, true },
    +  { 17308, true },
    +  { 17322, true },
    +  { 17334, true },
    +  { 17349, true },
    +  { 17359, true },
    +  { 17372, true },
    +  { 17383, true },
    +  { 17395, true },
    +  { 17410, true },
    +  { 17426, true },
    +  { 17435, true },
    +  { 17450, true },
       { 17466, true },
    -  { 17482, true },
    -  { 17491, true },
    -  { 17506, true },
    -  { 17522, true },
    -  { 17537, true },
    -  { 17550, true },
    -  { 17563, true },
    -  { 17582, true },
    -  { 17592, true },
    -  { 17602, true },
    -  { 17614, true },
    -  { 17629, true },
    -  { 17644, true },
    -  { 17659, false },
    -  { 17672, true },
    +  { 17481, true },
    +  { 17494, true },
    +  { 17507, true },
    +  { 17526, true },
    +  { 17536, true },
    +  { 17546, true },
    +  { 17558, true },
    +  { 17573, true },
    +  { 17588, true },
    +  { 17603, false },
    +  { 17616, true },
    +  { 17632, true },
    +  { 17651, true },
    +  { 17660, true },
    +  { 17673, true },
       { 17688, true },
    -  { 17707, true },
    -  { 17716, true },
    -  { 17729, true },
    -  { 17744, true },
    -  { 17759, true },
    -  { 17769, true },
    -  { 17779, true },
    -  { 17794, true },
    -  { 17816, true },
    -  { 17831, true },
    -  { 17844, true },
    -  { 17871, true },
    -  { 17885, true },
    -  { 17897, true },
    -  { 17912, true },
    -  { 17922, true },
    -  { 17943, true },
    -  { 17965, true },
    -  { 17983, false },
    -  { 18002, true },
    -  { 18016, true },
    -  { 18028, true },
    -  { 18045, true },
    -  { 18060, true },
    +  { 17703, true },
    +  { 17713, true },
    +  { 17723, true },
    +  { 17738, true },
    +  { 17760, true },
    +  { 17775, true },
    +  { 17788, true },
    +  { 17815, true },
    +  { 17829, true },
    +  { 17841, true },
    +  { 17856, true },
    +  { 17866, true },
    +  { 17887, true },
    +  { 17909, true },
    +  { 17927, false },
    +  { 17946, true },
    +  { 17960, true },
    +  { 17972, true },
    +  { 17989, true },
    +  { 18004, true },
    +  { 18015, true },
    +  { 18031, true },
    +  { 18049, true },
    +  { 18061, true },
       { 18071, true },
    -  { 18087, true },
    -  { 18105, true },
    -  { 18117, true },
    +  { 18083, true },
    +  { 18097, false },
    +  { 18110, true },
       { 18127, true },
    -  { 18139, true },
    -  { 18153, false },
    -  { 18166, true },
    -  { 18183, true },
    -  { 18196, true },
    -  { 18208, true },
    -  { 18231, true },
    -  { 18244, true },
    -  { 18252, false },
    -  { 18263, true },
    -  { 18281, true },
    -  { 18293, true },
    -  { 18314, true },
    -  { 18328, true },
    -  { 18345, true },
    +  { 18140, true },
    +  { 18152, true },
    +  { 18175, true },
    +  { 18188, true },
    +  { 18196, false },
    +  { 18207, true },
    +  { 18225, true },
    +  { 18237, true },
    +  { 18258, true },
    +  { 18272, true },
    +  { 18289, true },
    +  { 18300, true },
    +  { 18309, true },
    +  { 18321, true },
    +  { 18332, true },
    +  { 18342, false },
       { 18356, true },
    -  { 18365, true },
    -  { 18377, true },
    -  { 18388, true },
    -  { 18398, false },
    +  { 18374, true },
    +  { 18387, true },
    +  { 18398, true },
       { 18412, true },
    -  { 18430, true },
    -  { 18443, true },
    -  { 18454, true },
    -  { 18468, true },
    -  { 18480, true },
    -  { 18491, true },
    -  { 18502, true },
    -  { 18515, true },
    -  { 18527, true },
    -  { 18538, true },
    -  { 18557, true },
    -  { 18573, true },
    -  { 18587, true },
    -  { 18606, true },
    -  { 18618, true },
    -  { 18633, true },
    -  { 18642, true },
    -  { 18657, true },
    -  { 18671, true },
    -  { 18684, true },
    -  { 18696, true },
    -  { 18708, true },
    -  { 18722, true },
    +  { 18424, true },
    +  { 18435, true },
    +  { 18446, true },
    +  { 18459, true },
    +  { 18471, true },
    +  { 18482, true },
    +  { 18501, true },
    +  { 18517, true },
    +  { 18531, true },
    +  { 18550, true },
    +  { 18562, true },
    +  { 18577, true },
    +  { 18586, true },
    +  { 18601, true },
    +  { 18615, true },
    +  { 18628, true },
    +  { 18640, true },
    +  { 18652, true },
    +  { 18666, true },
    +  { 18677, true },
    +  { 18691, true },
    +  { 18702, true },
    +  { 18713, false },
    +  { 18723, true },
       { 18733, true },
    -  { 18747, true },
    -  { 18758, true },
    -  { 18769, false },
    -  { 18779, true },
    +  { 18743, true },
    +  { 18754, true },
    +  { 18765, true },
    +  { 18776, true },
       { 18789, true },
    -  { 18799, true },
    -  { 18810, true },
    -  { 18821, true },
    -  { 18832, true },
    -  { 18845, true },
    -  { 18859, true },
    -  { 18871, true },
    -  { 18885, true },
    -  { 18910, true },
    -  { 18922, true },
    -  { 18939, true },
    -  { 18950, true },
    -  { 18961, true },
    -  { 18980, true },
    -  { 18996, true },
    -  { 19007, true },
    -  { 19019, true },
    -  { 19034, true },
    -  { 19053, true },
    -  { 19070, true },
    -  { 19078, true },
    -  { 19091, true },
    -  { 19103, true },
    +  { 18803, true },
    +  { 18815, true },
    +  { 18829, true },
    +  { 18854, true },
    +  { 18866, true },
    +  { 18883, true },
    +  { 18894, true },
    +  { 18905, true },
    +  { 18924, true },
    +  { 18940, true },
    +  { 18951, true },
    +  { 18963, true },
    +  { 18978, true },
    +  { 18997, true },
    +  { 19014, true },
    +  { 19022, true },
    +  { 19035, true },
    +  { 19047, true },
    +  { 19059, true },
    +  { 19073, true },
    +  { 19086, true },
    +  { 19099, true },
       { 19115, true },
       { 19129, true },
    -  { 19142, true },
    -  { 19155, true },
    -  { 19171, true },
    -  { 19185, true },
    +  { 19146, true },
    +  { 19163, true },
    +  { 19176, true },
    +  { 19189, true },
       { 19202, true },
    -  { 19219, true },
    -  { 19232, true },
    -  { 19245, true },
    -  { 19258, true },
    -  { 19271, true },
    -  { 19284, true },
    -  { 19297, true },
    -  { 19310, true },
    -  { 19323, true },
    -  { 19336, true },
    -  { 19349, true },
    +  { 19215, true },
    +  { 19228, true },
    +  { 19241, true },
    +  { 19254, true },
    +  { 19267, true },
    +  { 19280, true },
    +  { 19293, true },
    +  { 19306, true },
    +  { 19319, true },
    +  { 19332, true },
    +  { 19345, true },
       { 19362, true },
    -  { 19375, true },
    -  { 19388, true },
    -  { 19401, true },
    -  { 19418, true },
    -  { 19430, true },
    -  { 19452, true },
    -  { 19464, true },
    -  { 19487, true },
    -  { 19511, true },
    -  { 19529, false },
    -  { 19550, true },
    -  { 19563, true },
    -  { 19578, true },
    -  { 19594, true },
    -  { 19620, true },
    -  { 19630, true },
    -  { 19647, true },
    -  { 19662, true },
    -  { 19681, true },
    -  { 19698, true },
    -  { 19714, true },
    -  { 19726, true },
    -  { 19736, true },
    -  { 19746, true },
    -  { 19767, true },
    -  { 19789, true },
    -  { 19801, true },
    +  { 19374, true },
    +  { 19396, true },
    +  { 19408, true },
    +  { 19431, true },
    +  { 19455, true },
    +  { 19473, false },
    +  { 19494, true },
    +  { 19507, true },
    +  { 19522, true },
    +  { 19538, true },
    +  { 19564, true },
    +  { 19574, true },
    +  { 19591, true },
    +  { 19606, true },
    +  { 19625, true },
    +  { 19642, true },
    +  { 19658, true },
    +  { 19670, true },
    +  { 19680, true },
    +  { 19690, true },
    +  { 19711, true },
    +  { 19733, true },
    +  { 19745, true },
    +  { 19756, true },
    +  { 19771, true },
    +  { 19782, true },
    +  { 19797, true },
       { 19812, true },
    -  { 19827, true },
    -  { 19838, true },
    -  { 19853, true },
    -  { 19868, true },
    -  { 19880, true },
    -  { 19899, true },
    -  { 19912, true },
    -  { 19926, true },
    -  { 19948, true },
    -  { 19967, true },
    -  { 19987, true },
    -  { 19995, true },
    -  { 20008, true },
    -  { 20022, true },
    -  { 20036, true },
    -  { 20047, true },
    -  { 20060, true },
    -  { 20076, true },
    -  { 20096, true },
    -  { 20110, true },
    -  { 20122, true },
    -  { 20139, false },
    -  { 20155, false },
    -  { 20175, true },
    -  { 20188, true },
    -  { 20204, true },
    -  { 20217, true },
    -  { 20230, true },
    -  { 20241, true },
    -  { 20257, true },
    -  { 20271, true },
    -  { 20287, true },
    -  { 20298, true },
    -  { 20311, true },
    -  { 20326, true },
    -  { 20340, true },
    -  { 20352, true },
    -  { 20372, true },
    -  { 20384, true },
    -  { 20397, true },
    -  { 20410, true },
    -  { 20431, true },
    -  { 20451, true },
    -  { 20465, true },
    -  { 20480, true },
    -  { 20489, true },
    -  { 20500, true },
    -  { 20510, true },
    -  { 20520, true },
    -  { 20538, true },
    -  { 20563, true },
    -  { 20574, true },
    -  { 20596, true },
    -  { 20608, true },
    -  { 20621, true },
    -  { 20634, true },
    -  { 20642, true },
    -  { 20661, true },
    -  { 20671, true },
    +  { 19824, true },
    +  { 19843, true },
    +  { 19856, true },
    +  { 19870, true },
    +  { 19892, true },
    +  { 19911, true },
    +  { 19931, true },
    +  { 19939, true },
    +  { 19952, true },
    +  { 19966, true },
    +  { 19980, true },
    +  { 19991, true },
    +  { 20004, true },
    +  { 20020, true },
    +  { 20040, true },
    +  { 20054, true },
    +  { 20066, true },
    +  { 20083, false },
    +  { 20099, false },
    +  { 20119, true },
    +  { 20132, true },
    +  { 20148, true },
    +  { 20161, true },
    +  { 20174, true },
    +  { 20185, true },
    +  { 20201, true },
    +  { 20215, true },
    +  { 20231, true },
    +  { 20242, true },
    +  { 20255, true },
    +  { 20270, true },
    +  { 20284, true },
    +  { 20296, true },
    +  { 20316, true },
    +  { 20328, true },
    +  { 20341, true },
    +  { 20354, true },
    +  { 20375, true },
    +  { 20395, true },
    +  { 20409, true },
    +  { 20424, true },
    +  { 20433, true },
    +  { 20444, true },
    +  { 20454, true },
    +  { 20464, true },
    +  { 20482, true },
    +  { 20507, true },
    +  { 20518, true },
    +  { 20540, true },
    +  { 20552, true },
    +  { 20565, true },
    +  { 20578, true },
    +  { 20586, true },
    +  { 20605, true },
    +  { 20615, true },
    +  { 20630, true },
    +  { 20647, true },
    +  { 20663, true },
    +  { 20675, true },
       { 20686, true },
    -  { 20703, true },
    -  { 20719, true },
    -  { 20731, true },
    -  { 20742, true },
    -  { 20766, true },
    -  { 20781, true },
    -  { 20796, true },
    -  { 20818, true },
    -  { 20829, true },
    +  { 20710, true },
    +  { 20725, true },
    +  { 20740, true },
    +  { 20762, true },
    +  { 20773, true },
    +  { 20786, true },
    +  { 20806, true },
    +  { 20817, true },
    +  { 20825, true },
       { 20842, true },
    -  { 20862, true },
    -  { 20873, true },
    -  { 20881, true },
    -  { 20898, true },
    -  { 20916, true },
    -  { 20935, true },
    -  { 20949, true },
    -  { 20964, true },
    -  { 20979, true },
    -  { 20989, true },
    -  { 20998, true },
    -  { 21013, true },
    -  { 21027, true },
    +  { 20860, true },
    +  { 20879, true },
    +  { 20893, true },
    +  { 20908, true },
    +  { 20923, true },
    +  { 20933, true },
    +  { 20942, true },
    +  { 20957, true },
    +  { 20971, true },
    +  { 20983, true },
    +  { 21009, true },
    +  { 21024, true },
       { 21039, true },
    -  { 21065, true },
    -  { 21080, true },
    -  { 21095, true },
    -  { 21107, true },
    -  { 21125, true },
    -  { 21145, true },
    -  { 21161, true },
    -  { 21173, true },
    -  { 21190, true },
    -  { 21204, true },
    -  { 21216, true },
    +  { 21051, true },
    +  { 21069, true },
    +  { 21089, true },
    +  { 21105, true },
    +  { 21117, true },
    +  { 21131, true },
    +  { 21143, true },
    +  { 21160, true },
    +  { 21169, true },
    +  { 21181, true },
    +  { 21203, true },
    +  { 21217, true },
       { 21233, true },
    -  { 21242, true },
    -  { 21254, true },
    -  { 21276, true },
    -  { 21290, true },
    -  { 21306, true },
    -  { 21323, true },
    -  { 21335, true },
    -  { 21357, true },
    -  { 21382, true },
    -  { 21406, true },
    +  { 21250, true },
    +  { 21262, true },
    +  { 21284, true },
    +  { 21309, true },
    +  { 21333, true },
    +  { 21345, true },
    +  { 21355, true },
    +  { 21368, true },
    +  { 21378, true },
    +  { 21388, true },
    +  { 21398, true },
    +  { 21408, true },
       { 21418, true },
       { 21428, true },
    -  { 21441, true },
    -  { 21451, true },
    -  { 21461, true },
    -  { 21471, true },
    -  { 21481, true },
    -  { 21491, true },
    -  { 21501, true },
    +  { 21438, true },
    +  { 21452, true },
    +  { 21470, true },
    +  { 21485, true },
    +  { 21499, true },
       { 21511, true },
    -  { 21525, true },
    -  { 21543, true },
    -  { 21558, true },
    -  { 21572, true },
    -  { 21584, true },
    -  { 21596, true },
    -  { 21607, true },
    -  { 21621, true },
    -  { 21636, true },
    -  { 21650, true },
    -  { 21664, false },
    -  { 21684, true },
    -  { 21703, true },
    -  { 21718, true },
    -  { 21729, true },
    -  { 21740, true },
    -  { 21752, true },
    -  { 21765, false },
    -  { 21778, true },
    -  { 21794, true },
    -  { 21807, true },
    -  { 21819, true },
    -  { 21834, true },
    +  { 21523, true },
    +  { 21534, true },
    +  { 21548, true },
    +  { 21563, true },
    +  { 21577, true },
    +  { 21591, false },
    +  { 21611, true },
    +  { 21630, true },
    +  { 21645, true },
    +  { 21656, true },
    +  { 21667, true },
    +  { 21679, false },
    +  { 21692, true },
    +  { 21708, true },
    +  { 21721, true },
    +  { 21733, true },
    +  { 21748, true },
    +  { 21758, true },
    +  { 21773, true },
    +  { 21798, true },
    +  { 21814, true },
    +  { 21831, true },
       { 21844, true },
       { 21859, true },
    -  { 21884, true },
    -  { 21900, true },
    -  { 21917, true },
    -  { 21930, true },
    -  { 21945, true },
    -  { 21965, true },
    -  { 21977, true },
    -  { 21993, true },
    -  { 22021, false },
    -  { 22033, true },
    -  { 22046, true },
    -  { 22055, true },
    -  { 22065, true },
    -  { 22074, true },
    -  { 22083, true },
    -  { 22090, false },
    -  { 22106, true },
    -  { 22120, true },
    -  { 22130, true },
    -  { 22150, true },
    -  { 22161, true },
    -  { 22175, true },
    -  { 22190, true },
    -  { 22203, true },
    -  { 22218, true },
    -  { 22235, true },
    -  { 22243, true },
    -  { 22257, true },
    -  { 22269, true },
    -  { 22286, false },
    -  { 22307, false },
    -  { 22329, false },
    -  { 22348, false },
    -  { 22366, true },
    -  { 22382, true },
    -  { 22406, true },
    -  { 22434, true },
    -  { 22445, true },
    -  { 22460, true },
    -  { 22479, true },
    -  { 22502, true },
    -  { 22519, true },
    -  { 22533, true },
    +  { 21879, true },
    +  { 21891, true },
    +  { 21907, true },
    +  { 21935, false },
    +  { 21947, true },
    +  { 21960, true },
    +  { 21969, true },
    +  { 21979, true },
    +  { 21988, true },
    +  { 21997, true },
    +  { 22004, false },
    +  { 22020, true },
    +  { 22034, true },
    +  { 22044, true },
    +  { 22064, true },
    +  { 22075, true },
    +  { 22089, true },
    +  { 22104, true },
    +  { 22117, true },
    +  { 22132, true },
    +  { 22149, true },
    +  { 22157, true },
    +  { 22171, true },
    +  { 22183, true },
    +  { 22200, false },
    +  { 22221, false },
    +  { 22243, false },
    +  { 22262, false },
    +  { 22280, true },
    +  { 22296, true },
    +  { 22320, true },
    +  { 22348, true },
    +  { 22359, true },
    +  { 22374, true },
    +  { 22393, true },
    +  { 22416, true },
    +  { 22433, true },
    +  { 22447, true },
    +  { 22458, true },
    +  { 22476, true },
    +  { 22491, true },
    +  { 22504, true },
    +  { 22517, true },
    +  { 22532, true },
       { 22544, true },
    -  { 22562, true },
    -  { 22577, true },
    -  { 22590, true },
    -  { 22603, true },
    -  { 22618, true },
    -  { 22630, true },
    -  { 22645, true },
    -  { 22664, true },
    -  { 22682, true },
    -  { 22690, true },
    -  { 22698, true },
    -  { 22710, true },
    -  { 22728, true },
    -  { 22743, true },
    -  { 22758, true },
    -  { 22773, true },
    -  { 22790, true },
    +  { 22559, true },
    +  { 22578, true },
    +  { 22596, true },
    +  { 22604, true },
    +  { 22612, true },
    +  { 22624, true },
    +  { 22642, true },
    +  { 22657, true },
    +  { 22672, true },
    +  { 22687, true },
    +  { 22704, true },
    +  { 22713, true },
    +  { 22726, true },
    +  { 22736, true },
    +  { 22749, false },
    +  { 22763, true },
    +  { 22776, true },
    +  { 22792, false },
       { 22799, true },
    -  { 22812, true },
    -  { 22822, true },
    -  { 22835, false },
    -  { 22849, true },
    -  { 22862, true },
    -  { 22878, false },
    -  { 22885, true },
    -  { 22895, true },
    +  { 22809, true },
    +  { 22823, true },
    +  { 22838, true },
    +  { 22846, true },
    +  { 22856, true },
    +  { 22874, true },
    +  { 22887, true },
    +  { 22900, true },
       { 22909, true },
    -  { 22924, true },
    -  { 22932, true },
    -  { 22942, true },
    -  { 22960, true },
    -  { 22973, true },
    -  { 22986, true },
    -  { 22995, true },
    -  { 23005, true },
    -  { 23020, true },
    -  { 23049, true },
    -  { 23066, true },
    +  { 22919, true },
    +  { 22934, true },
    +  { 22963, true },
    +  { 22980, true },
    +  { 22990, true },
    +  { 23004, true },
    +  { 23015, true },
    +  { 23029, true },
    +  { 23051, true },
       { 23076, true },
    -  { 23090, true },
    -  { 23101, true },
    -  { 23115, true },
    +  { 23089, true },
    +  { 23102, true },
    +  { 23119, true },
       { 23137, true },
    -  { 23162, true },
    -  { 23175, true },
    -  { 23188, true },
    -  { 23205, true },
    -  { 23223, true },
    -  { 23238, true },
    -  { 23250, true },
    -  { 23260, true },
    -  { 23281, true },
    -  { 23291, false },
    -  { 23310, true },
    -  { 23322, true },
    -  { 23351, true },
    -  { 23372, true },
    -  { 23386, true },
    -  { 23412, true },
    +  { 23152, true },
    +  { 23164, true },
    +  { 23174, true },
    +  { 23195, true },
    +  { 23205, false },
    +  { 23224, true },
    +  { 23236, true },
    +  { 23265, true },
    +  { 23286, true },
    +  { 23300, true },
    +  { 23326, true },
    +  { 23334, true },
    +  { 23347, true },
    +  { 23359, true },
    +  { 23375, true },
    +  { 23394, true },
    +  { 23407, true },
       { 23420, true },
    -  { 23433, true },
    -  { 23445, true },
    -  { 23461, true },
    -  { 23480, true },
    -  { 23493, true },
    -  { 23506, true },
    -  { 23525, true },
    -  { 23538, false },
    -  { 23548, true },
    +  { 23439, true },
    +  { 23452, false },
    +  { 23462, true },
    +  { 23484, true },
    +  { 23498, true },
    +  { 23514, true },
    +  { 23529, true },
    +  { 23546, false },
    +  { 23554, true },
       { 23570, true },
    -  { 23584, true },
    -  { 23600, true },
    -  { 23615, true },
    -  { 23632, false },
    -  { 23640, true },
    -  { 23656, true },
    -  { 23676, true },
    -  { 23690, true },
    -  { 23705, true },
    -  { 23716, true },
    -  { 23729, true },
    -  { 23741, true },
    -  { 23753, true },
    -  { 23766, true },
    -  { 23779, false },
    -  { 23801, true },
    -  { 23825, true },
    -  { 23848, true },
    -  { 23866, true },
    -  { 23892, true },
    -  { 23919, true },
    -  { 23942, true },
    -  { 23958, true },
    -  { 23987, true },
    -  { 23999, true },
    -  { 24012, true },
    -  { 24021, true },
    -  { 24030, true },
    -  { 24047, true },
    -  { 24060, true },
    -  { 24069, true },
    -  { 24086, true },
    +  { 23590, true },
    +  { 23604, true },
    +  { 23619, true },
    +  { 23630, true },
    +  { 23643, true },
    +  { 23655, true },
    +  { 23667, true },
    +  { 23680, true },
    +  { 23693, false },
    +  { 23715, true },
    +  { 23739, true },
    +  { 23762, true },
    +  { 23780, true },
    +  { 23806, true },
    +  { 23833, true },
    +  { 23856, true },
    +  { 23872, true },
    +  { 23901, true },
    +  { 23913, true },
    +  { 23926, true },
    +  { 23935, true },
    +  { 23944, true },
    +  { 23961, true },
    +  { 23974, true },
    +  { 23983, true },
    +  { 24000, true },
    +  { 24009, true },
    +  { 24017, true },
    +  { 24027, true },
    +  { 24051, true },
    +  { 24061, true },
    +  { 24070, true },
    +  { 24083, true },
       { 24095, true },
    -  { 24103, true },
    -  { 24113, true },
    -  { 24137, true },
    -  { 24147, true },
    +  { 24109, true },
    +  { 24123, true },
    +  { 24141, true },
       { 24156, true },
    -  { 24169, true },
    -  { 24181, true },
    -  { 24195, true },
    -  { 24209, true },
    -  { 24227, true },
    -  { 24242, true },
    -  { 24256, true },
    -  { 24268, true },
    -  { 24284, true },
    -  { 24297, true },
    -  { 24312, true },
    -  { 24324, true },
    -  { 24339, true },
    -  { 24353, true },
    -  { 24362, true },
    -  { 24371, true },
    -  { 24385, true },
    -  { 24394, true },
    -  { 24408, true },
    -  { 24417, true },
    -  { 24430, true },
    -  { 24440, true },
    -  { 24455, true },
    -  { 24470, true },
    -  { 24484, true },
    -  { 24499, true },
    -  { 24512, true },
    -  { 24531, true },
    -  { 24547, true },
    -  { 24561, true },
    +  { 24170, true },
    +  { 24182, true },
    +  { 24198, true },
    +  { 24211, true },
    +  { 24226, true },
    +  { 24238, true },
    +  { 24253, true },
    +  { 24267, true },
    +  { 24276, true },
    +  { 24285, true },
    +  { 24299, true },
    +  { 24308, true },
    +  { 24322, true },
    +  { 24331, true },
    +  { 24344, true },
    +  { 24354, true },
    +  { 24369, true },
    +  { 24384, true },
    +  { 24398, true },
    +  { 24413, true },
    +  { 24426, true },
    +  { 24445, true },
    +  { 24461, true },
    +  { 24475, true },
    +  { 24486, true },
    +  { 24500, true },
    +  { 24510, true },
    +  { 24522, true },
    +  { 24538, true },
    +  { 24552, true },
    +  { 24557, true },
    +  { 24565, true },
       { 24572, true },
    -  { 24586, true },
    -  { 24596, true },
    -  { 24608, true },
    -  { 24624, true },
    -  { 24638, true },
    -  { 24643, true },
    -  { 24651, true },
    -  { 24658, true },
    -  { 24667, true },
    -  { 24682, false },
    -  { 24702, true },
    -  { 24712, true },
    -  { 24725, true },
    -  { 24743, true },
    -  { 24756, true },
    -  { 24772, true },
    -  { 24784, true },
    +  { 24581, true },
    +  { 24596, false },
    +  { 24616, true },
    +  { 24626, true },
    +  { 24639, true },
    +  { 24657, true },
    +  { 24670, true },
    +  { 24686, true },
    +  { 24698, true },
    +  { 24711, true },
    +  { 24722, true },
    +  { 24733, true },
    +  { 24751, true },
    +  { 24764, true },
    +  { 24777, true },
       { 24797, true },
    -  { 24808, true },
    -  { 24819, true },
    -  { 24837, true },
    -  { 24850, true },
    -  { 24863, true },
    -  { 24883, true },
    -  { 24899, true },
    -  { 24907, true },
    -  { 24918, true },
    -  { 24930, true },
    -  { 24944, true },
    -  { 24963, true },
    -  { 24971, true },
    -  { 24990, true },
    -  { 25004, false },
    -  { 25020, true },
    -  { 25032, false },
    +  { 24813, true },
    +  { 24821, true },
    +  { 24832, true },
    +  { 24844, true },
    +  { 24858, true },
    +  { 24877, true },
    +  { 24885, true },
    +  { 24904, true },
    +  { 24918, false },
    +  { 24934, true },
    +  { 24946, false },
    +  { 24961, true },
    +  { 24973, false },
    +  { 24985, true },
    +  { 24997, true },
    +  { 25008, true },
    +  { 25022, true },
    +  { 25035, true },
       { 25047, true },
    -  { 25059, false },
    -  { 25067, false },
    -  { 25079, true },
    -  { 25091, true },
    -  { 25102, true },
    -  { 25116, true },
    -  { 25129, true },
    -  { 25141, true },
    -  { 25154, true },
    -  { 25174, true },
    -  { 25184, true },
    -  { 25203, true },
    -  { 25214, true },
    -  { 25226, true },
    +  { 25060, true },
    +  { 25080, true },
    +  { 25090, true },
    +  { 25109, true },
    +  { 25120, true },
    +  { 25132, true },
    +  { 25155, true },
    +  { 25178, true },
    +  { 25189, true },
    +  { 25204, true },
    +  { 25217, true },
    +  { 25233, true },
       { 25249, true },
    -  { 25272, true },
    -  { 25283, true },
    -  { 25298, true },
    -  { 25311, true },
    -  { 25327, true },
    -  { 25343, true },
    -  { 25361, false },
    +  { 25267, false },
    +  { 25290, true },
    +  { 25310, true },
    +  { 25324, true },
    +  { 25347, true },
    +  { 25366, true },
       { 25384, true },
    -  { 25404, true },
    -  { 25418, true },
    -  { 25441, true },
    -  { 25460, true },
    -  { 25478, true },
    -  { 25495, true },
    -  { 25521, true },
    -  { 25540, true },
    -  { 25556, true },
    -  { 25570, true },
    -  { 25591, true },
    -  { 25607, true },
    -  { 25632, true },
    -  { 25646, true },
    -  { 25655, true },
    -  { 25667, true },
    -  { 25680, true },
    -  { 25693, true },
    -  { 25705, true },
    -  { 25718, true },
    -  { 25732, true },
    -  { 25742, true },
    -  { 25755, true },
    +  { 25401, true },
    +  { 25427, true },
    +  { 25446, true },
    +  { 25462, true },
    +  { 25476, true },
    +  { 25497, true },
    +  { 25513, true },
    +  { 25538, true },
    +  { 25552, true },
    +  { 25561, true },
    +  { 25573, true },
    +  { 25586, true },
    +  { 25599, true },
    +  { 25611, true },
    +  { 25624, true },
    +  { 25638, true },
    +  { 25648, true },
    +  { 25661, true },
    +  { 25669, true },
    +  { 25676, true },
    +  { 25688, true },
    +  { 25700, true },
    +  { 25715, true },
    +  { 25741, true },
       { 25763, true },
    -  { 25770, true },
    -  { 25782, true },
    -  { 25794, true },
    -  { 25809, true },
    -  { 25835, true },
    -  { 25857, true },
    -  { 25871, true },
    -  { 25883, true },
    -  { 25893, true },
    -  { 25906, true },
    -  { 25914, true },
    -  { 25928, true },
    -  { 25952, true },
    -  { 25966, true },
    -  { 25990, true },
    -  { 26010, true },
    -  { 26021, true },
    -  { 26030, true },
    -  { 26052, true },
    -  { 26075, true },
    -  { 26099, true },
    -  { 26122, false },
    -  { 26153, false },
    -  { 26168, true },
    -  { 26180, true },
    -  { 26200, true },
    -  { 26215, true },
    -  { 26231, true },
    -  { 26242, true },
    -  { 26257, true },
    -  { 26269, true },
    -  { 26285, true },
    +  { 25777, true },
    +  { 25789, true },
    +  { 25799, true },
    +  { 25812, true },
    +  { 25820, true },
    +  { 25834, true },
    +  { 25858, true },
    +  { 25872, true },
    +  { 25896, true },
    +  { 25916, true },
    +  { 25927, true },
    +  { 25936, true },
    +  { 25958, true },
    +  { 25981, true },
    +  { 26005, true },
    +  { 26028, false },
    +  { 26059, false },
    +  { 26074, true },
    +  { 26086, true },
    +  { 26106, true },
    +  { 26121, true },
    +  { 26137, true },
    +  { 26148, true },
    +  { 26163, true },
    +  { 26175, true },
    +  { 26191, true },
    +  { 26202, true },
    +  { 26216, true },
    +  { 26226, true },
    +  { 26235, false },
    +  { 26248, true },
    +  { 26265, true },
    +  { 26277, true },
       { 26296, true },
    -  { 26310, true },
    -  { 26320, true },
    -  { 26329, false },
    -  { 26342, true },
    -  { 26359, true },
    -  { 26371, true },
    -  { 26390, true },
    -  { 26407, true },
    -  { 26420, true },
    -  { 26440, true },
    -  { 26462, true },
    -  { 26475, true },
    -  { 26486, true },
    -  { 26509, true },
    -  { 26520, true },
    -  { 26536, true },
    +  { 26313, true },
    +  { 26326, true },
    +  { 26346, true },
    +  { 26368, true },
    +  { 26381, true },
    +  { 26392, true },
    +  { 26415, true },
    +  { 26426, true },
    +  { 26442, true },
    +  { 26457, true },
    +  { 26471, true },
    +  { 26487, true },
    +  { 26500, true },
    +  { 26513, true },
    +  { 26525, true },
    +  { 26538, true },
       { 26551, true },
    -  { 26565, true },
    -  { 26581, true },
    -  { 26594, true },
    +  { 26563, true },
    +  { 26576, true },
    +  { 26588, true },
       { 26607, true },
    -  { 26619, true },
    -  { 26632, true },
    -  { 26645, true },
    -  { 26657, true },
    -  { 26670, true },
    -  { 26682, true },
    -  { 26701, true },
    -  { 26716, true },
    -  { 26729, true },
    -  { 26745, true },
    -  { 26763, true },
    -  { 26774, true },
    -  { 26782, false },
    -  { 26805, true },
    -  { 26820, true },
    -  { 26833, true },
    -  { 26844, true },
    -  { 26856, false },
    -  { 26866, true },
    -  { 26882, true },
    -  { 26893, true },
    -  { 26902, true },
    -  { 26913, true },
    -  { 26923, true },
    -  { 26934, true },
    -  { 26946, true },
    -  { 26963, true },
    -  { 26979, true },
    -  { 26989, true },
    -  { 26997, false },
    -  { 27005, true },
    -  { 27020, true },
    -  { 27034, true },
    -  { 27048, true },
    -  { 27058, true },
    -  { 27066, true },
    -  { 27080, true },
    -  { 27096, true },
    -  { 27111, false },
    -  { 27124, true },
    -  { 27137, true },
    -  { 27155, true },
    -  { 27171, true },
    -  { 27182, true },
    -  { 27200, true },
    -  { 27222, false },
    -  { 27239, true },
    -  { 27254, true },
    -  { 27270, true },
    -  { 27286, true },
    -  { 27305, true },
    -  { 27322, true },
    +  { 26622, true },
    +  { 26635, true },
    +  { 26651, true },
    +  { 26669, true },
    +  { 26680, true },
    +  { 26688, false },
    +  { 26711, true },
    +  { 26726, true },
    +  { 26739, true },
    +  { 26750, true },
    +  { 26762, false },
    +  { 26772, true },
    +  { 26788, true },
    +  { 26799, true },
    +  { 26808, true },
    +  { 26819, true },
    +  { 26829, true },
    +  { 26840, true },
    +  { 26852, true },
    +  { 26869, true },
    +  { 26885, true },
    +  { 26895, true },
    +  { 26903, false },
    +  { 26911, true },
    +  { 26926, true },
    +  { 26940, true },
    +  { 26954, true },
    +  { 26964, true },
    +  { 26972, true },
    +  { 26986, true },
    +  { 27002, true },
    +  { 27017, false },
    +  { 27030, true },
    +  { 27043, true },
    +  { 27061, true },
    +  { 27077, true },
    +  { 27088, true },
    +  { 27106, true },
    +  { 27128, false },
    +  { 27145, true },
    +  { 27160, true },
    +  { 27176, true },
    +  { 27192, true },
    +  { 27211, true },
    +  { 27228, true },
    +  { 27243, true },
    +  { 27258, true },
    +  { 27273, true },
    +  { 27294, true },
    +  { 27312, true },
    +  { 27324, true },
       { 27337, true },
    -  { 27352, true },
    -  { 27367, true },
    -  { 27388, true },
    -  { 27406, true },
    -  { 27418, true },
    -  { 27431, true },
    -  { 27444, true },
    -  { 27458, false },
    -  { 27474, true },
    -  { 27489, true },
    -  { 27503, true },
    -  { 27516, true },
    -  { 27527, true },
    -  { 27537, true },
    -  { 27554, true },
    -  { 27570, true },
    -  { 27586, true },
    -  { 27601, true },
    -  { 27613, true },
    -  { 27624, false },
    +  { 27350, true },
    +  { 27364, false },
    +  { 27380, true },
    +  { 27395, true },
    +  { 27409, true },
    +  { 27422, true },
    +  { 27433, true },
    +  { 27443, true },
    +  { 27460, true },
    +  { 27476, true },
    +  { 27492, true },
    +  { 27507, true },
    +  { 27519, true },
    +  { 27530, false },
    +  { 27538, true },
    +  { 27559, true },
    +  { 27567, true },
    +  { 27580, true },
    +  { 27598, true },
    +  { 27606, true },
    +  { 27614, true },
       { 27632, true },
    -  { 27653, true },
    -  { 27661, true },
    -  { 27674, true },
    -  { 27692, true },
    -  { 27700, true },
    -  { 27708, true },
    -  { 27726, true },
    -  { 27740, true },
    -  { 27754, true },
    -  { 27762, true },
    -  { 27776, true },
    -  { 27796, true },
    +  { 27646, true },
    +  { 27660, true },
    +  { 27668, true },
    +  { 27682, true },
    +  { 27702, true },
    +  { 27710, true },
    +  { 27719, false },
    +  { 27739, true },
    +  { 27757, true },
    +  { 27768, true },
    +  { 27786, true },
       { 27804, true },
    -  { 27813, false },
    -  { 27833, true },
    -  { 27851, true },
    -  { 27862, true },
    -  { 27880, true },
    -  { 27898, true },
    -  { 27918, true },
    -  { 27930, true },
    -  { 27942, true },
    -  { 27962, true },
    +  { 27824, true },
    +  { 27836, true },
    +  { 27848, true },
    +  { 27868, true },
    +  { 27882, true },
    +  { 27895, true },
    +  { 27912, true },
    +  { 27925, true },
    +  { 27939, true },
    +  { 27952, true },
    +  { 27966, true },
       { 27976, true },
    -  { 27989, true },
    -  { 28006, true },
    -  { 28019, true },
    -  { 28033, true },
    -  { 28046, true },
    -  { 28060, true },
    -  { 28070, true },
    -  { 28087, true },
    -  { 28107, true },
    -  { 28116, true },
    +  { 27993, true },
    +  { 28013, true },
    +  { 28022, true },
    +  { 28039, true },
    +  { 28059, true },
    +  { 28077, true },
    +  { 28091, true },
    +  { 28106, true },
    +  { 28119, true },
       { 28133, true },
    -  { 28153, true },
    -  { 28171, true },
    -  { 28185, true },
    -  { 28200, true },
    -  { 28213, true },
    -  { 28227, true },
    -  { 28242, false },
    -  { 28252, true },
    -  { 28269, true },
    -  { 28279, true },
    -  { 28290, true },
    -  { 28305, true },
    -  { 28313, true },
    -  { 28334, true },
    -  { 28355, true },
    -  { 28376, false },
    -  { 28392, true },
    -  { 28405, true },
    -  { 28420, true },
    -  { 28432, false },
    -  { 28453, true },
    -  { 28473, true },
    -  { 28487, true },
    -  { 28505, true },
    -  { 28525, true },
    -  { 28538, true },
    -  { 28552, true },
    -  { 28568, true },
    -  { 28586, true },
    -  { 28597, true },
    -  { 28610, true },
    -  { 28622, true },
    -  { 28636, true },
    -  { 28651, true },
    -  { 28670, false },
    -  { 28692, true },
    -  { 28700, true },
    -  { 28715, true },
    -  { 28732, true },
    -  { 28746, true },
    -  { 28763, true },
    -  { 28781, true },
    -  { 28792, true },
    -  { 28816, true },
    -  { 28832, true },
    -  { 28848, true },
    -  { 28863, true },
    -  { 28872, true },
    -  { 28887, true },
    -  { 28900, false },
    -  { 28910, true },
    +  { 28148, true },
    +  { 28168, false },
    +  { 28178, true },
    +  { 28195, true },
    +  { 28205, true },
    +  { 28216, true },
    +  { 28231, true },
    +  { 28239, true },
    +  { 28260, true },
    +  { 28281, true },
    +  { 28302, false },
    +  { 28318, true },
    +  { 28331, true },
    +  { 28346, true },
    +  { 28358, false },
    +  { 28379, true },
    +  { 28399, true },
    +  { 28413, true },
    +  { 28431, true },
    +  { 28451, true },
    +  { 28464, true },
    +  { 28478, true },
    +  { 28494, true },
    +  { 28512, true },
    +  { 28523, true },
    +  { 28536, true },
    +  { 28548, true },
    +  { 28562, true },
    +  { 28577, true },
    +  { 28596, false },
    +  { 28618, true },
    +  { 28626, true },
    +  { 28641, true },
    +  { 28658, true },
    +  { 28672, true },
    +  { 28689, true },
    +  { 28707, true },
    +  { 28718, true },
    +  { 28742, true },
    +  { 28758, true },
    +  { 28774, true },
    +  { 28789, true },
    +  { 28798, true },
    +  { 28813, true },
    +  { 28826, false },
    +  { 28836, true },
    +  { 28855, true },
    +  { 28869, true },
    +  { 28889, true },
    +  { 28907, false },
       { 28929, true },
    -  { 28943, true },
    -  { 28963, true },
    -  { 28981, false },
    +  { 28938, true },
    +  { 28957, false },
    +  { 28973, false },
    +  { 28987, true },
       { 29003, true },
    -  { 29012, true },
    -  { 29031, false },
    -  { 29047, false },
    -  { 29061, true },
    -  { 29077, true },
    -  { 29092, true },
    -  { 29110, true },
    -  { 29132, true },
    -  { 29150, true },
    -  { 29174, true },
    -  { 29191, true },
    -  { 29206, true },
    -  { 29223, false },
    -  { 29239, true },
    +  { 29018, true },
    +  { 29040, true },
    +  { 29058, true },
    +  { 29082, true },
    +  { 29099, true },
    +  { 29114, true },
    +  { 29131, false },
    +  { 29147, true },
    +  { 29161, true },
    +  { 29175, true },
    +  { 29194, true },
    +  { 29211, true },
    +  { 29226, true },
       { 29253, true },
    -  { 29267, true },
    -  { 29286, true },
    -  { 29303, true },
    +  { 29275, true },
    +  { 29298, true },
       { 29318, true },
    -  { 29345, true },
    -  { 29367, true },
    -  { 29390, true },
    -  { 29410, true },
    -  { 29428, true },
    -  { 29450, true },
    -  { 29469, true },
    -  { 29489, true },
    -  { 29512, true },
    -  { 29529, true },
    -  { 29543, true },
    -  { 29580, false },
    -  { 29591, true },
    -  { 29609, true },
    -  { 29629, true },
    -  { 29652, true },
    -  { 29677, false },
    -  { 29708, true },
    -  { 29722, true },
    -  { 29731, true },
    -  { 29742, true },
    -  { 29754, true },
    -  { 29766, true },
    -  { 29775, true },
    -  { 29787, true },
    -  { 29804, true },
    -  { 29822, false },
    -  { 29830, true },
    -  { 29841, true },
    -  { 29860, true },
    -  { 29872, true },
    -  { 29887, false },
    -  { 29905, true },
    -  { 29915, true },
    -  { 29928, true },
    -  { 29937, false },
    -  { 29950, true },
    +  { 29336, true },
    +  { 29358, true },
    +  { 29377, true },
    +  { 29397, true },
    +  { 29420, true },
    +  { 29437, true },
    +  { 29451, true },
    +  { 29488, false },
    +  { 29499, true },
    +  { 29517, true },
    +  { 29537, true },
    +  { 29560, true },
    +  { 29585, false },
    +  { 29616, true },
    +  { 29630, true },
    +  { 29639, true },
    +  { 29650, true },
    +  { 29662, true },
    +  { 29674, true },
    +  { 29683, true },
    +  { 29695, true },
    +  { 29712, true },
    +  { 29730, false },
    +  { 29738, true },
    +  { 29749, true },
    +  { 29768, true },
    +  { 29780, false },
    +  { 29798, true },
    +  { 29808, true },
    +  { 29821, true },
    +  { 29830, false },
    +  { 29843, true },
    +  { 29856, true },
    +  { 29873, true },
    +  { 29889, true },
    +  { 29900, true },
    +  { 29914, true },
    +  { 29926, true },
    +  { 29941, true },
    +  { 29949, true },
       { 29963, true },
    -  { 29980, true },
    -  { 29996, true },
    -  { 30007, true },
    -  { 30021, true },
    -  { 30033, true },
    -  { 30048, true },
    -  { 30056, true },
    -  { 30070, true },
    -  { 30082, true },
    -  { 30094, true },
    -  { 30106, true },
    -  { 30116, true },
    -  { 30127, true },
    -  { 30138, true },
    +  { 29975, true },
    +  { 29987, true },
    +  { 29999, true },
    +  { 30009, true },
    +  { 30020, true },
    +  { 30031, true },
    +  { 30045, true },
    +  { 30068, true },
    +  { 30084, true },
    +  { 30092, true },
    +  { 30107, true },
    +  { 30126, true },
    +  { 30142, true },
       { 30152, true },
    -  { 30175, true },
    -  { 30191, true },
    -  { 30199, true },
    -  { 30214, true },
    +  { 30171, true },
    +  { 30184, true },
    +  { 30192, true },
    +  { 30207, true },
    +  { 30219, true },
    +  { 30227, true },
       { 30233, true },
    -  { 30249, true },
    -  { 30259, true },
    -  { 30278, true },
    -  { 30291, true },
    -  { 30299, true },
    -  { 30314, true },
    -  { 30326, true },
    -  { 30334, true },
    -  { 30340, true },
    -  { 30353, true },
    -  { 30362, true },
    -  { 30376, true },
    -  { 30390, true },
    -  { 30403, false },
    +  { 30246, true },
    +  { 30255, true },
    +  { 30269, true },
    +  { 30283, true },
    +  { 30296, false },
    +  { 30316, true },
    +  { 30332, true },
    +  { 30344, true },
    +  { 30360, true },
    +  { 30373, true },
    +  { 30393, true },
    +  { 30407, true },
       { 30423, true },
    -  { 30439, true },
    -  { 30451, true },
    -  { 30467, true },
    -  { 30480, true },
    -  { 30500, true },
    -  { 30514, true },
    -  { 30530, true },
    -  { 30544, true },
    -  { 30564, true },
    -  { 30578, true },
    -  { 30601, true },
    -  { 30616, true },
    -  { 30630, true },
    -  { 30643, true },
    -  { 30652, true },
    -  { 30662, false },
    +  { 30437, true },
    +  { 30457, true },
    +  { 30471, true },
    +  { 30494, true },
    +  { 30509, true },
    +  { 30523, true },
    +  { 30536, true },
    +  { 30545, true },
    +  { 30555, false },
    +  { 30565, true },
    +  { 30581, true },
    +  { 30603, true },
    +  { 30635, true },
    +  { 30651, true },
       { 30672, true },
    -  { 30688, true },
    -  { 30710, true },
    +  { 30692, true },
    +  { 30705, true },
    +  { 30722, true },
       { 30742, true },
    -  { 30758, true },
    -  { 30779, true },
    -  { 30799, true },
    -  { 30812, true },
    -  { 30829, true },
    -  { 30849, true },
    -  { 30868, true },
    -  { 30887, true },
    -  { 30902, true },
    -  { 30915, true },
    -  { 30930, true },
    +  { 30761, true },
    +  { 30780, true },
    +  { 30795, true },
    +  { 30808, true },
    +  { 30823, true },
    +  { 30839, true },
    +  { 30851, true },
    +  { 30866, true },
    +  { 30889, true },
    +  { 30905, true },
    +  { 30917, false },
    +  { 30938, true },
       { 30946, true },
    -  { 30958, true },
    -  { 30973, true },
    -  { 30996, true },
    -  { 31012, true },
    -  { 31024, false },
    -  { 31045, true },
    -  { 31053, true },
    -  { 31062, true },
    -  { 31076, true },
    -  { 31085, true },
    -  { 31097, true },
    -  { 31113, true },
    -  { 31130, false },
    -  { 31140, true },
    -  { 31151, true },
    +  { 30955, true },
    +  { 30969, true },
    +  { 30978, true },
    +  { 30990, true },
    +  { 31006, true },
    +  { 31023, false },
    +  { 31033, true },
    +  { 31044, true },
    +  { 31056, true },
    +  { 31069, true },
    +  { 31087, true },
    +  { 31104, true },
    +  { 31121, false },
    +  { 31131, true },
    +  { 31149, true },
       { 31163, true },
    -  { 31176, true },
    -  { 31194, true },
    -  { 31211, true },
    -  { 31228, false },
    -  { 31238, true },
    +  { 31185, true },
    +  { 31198, true },
    +  { 31213, true },
    +  { 31234, true },
       { 31256, true },
    -  { 31270, true },
    -  { 31292, true },
    -  { 31305, true },
    -  { 31320, true },
    -  { 31341, true },
    -  { 31363, true },
    -  { 31379, true },
    -  { 31394, true },
    -  { 31408, true },
    -  { 31434, true },
    -  { 31459, true },
    -  { 31479, true },
    -  { 31493, true },
    -  { 31508, true },
    -  { 31521, true },
    -  { 31533, true },
    -  { 31543, true },
    -  { 31558, true },
    -  { 31568, true },
    -  { 31582, true },
    -  { 31593, true },
    -  { 31604, true },
    -  { 31619, true },
    -  { 31631, true },
    -  { 31645, true },
    -  { 31658, true },
    -  { 31674, true },
    -  { 31692, true },
    -  { 31702, true },
    -  { 31712, true },
    -  { 31732, true },
    -  { 31741, true },
    -  { 31753, true },
    -  { 31764, true },
    -  { 31773, true },
    -  { 31789, true },
    -  { 31804, true },
    -  { 31814, false },
    -  { 31834, true },
    -  { 31858, true },
    -  { 31879, true },
    -  { 31887, true },
    -  { 31897, true },
    -  { 31911, false },
    -  { 31921, true },
    -  { 31939, false },
    -  { 31953, true },
    -  { 31972, true },
    -  { 31989, true },
    -  { 32003, false },
    -  { 32021, true },
    -  { 32037, true },
    -  { 32048, true },
    -  { 32061, true },
    -  { 32076, true },
    -  { 32096, false },
    -  { 32111, true },
    -  { 32123, true },
    -  { 32136, true },
    -  { 32148, true },
    -  { 32161, true },
    -  { 32173, true },
    -  { 32188, true },
    -  { 32201, true },
    -  { 32214, false },
    -  { 32237, false },
    -  { 32261, true },
    -  { 32278, true },
    -  { 32291, true },
    -  { 32302, true },
    -  { 32314, true },
    -  { 32328, true },
    -  { 32339, true },
    -  { 32358, true },
    -  { 32375, true },
    +  { 31272, true },
    +  { 31287, true },
    +  { 31301, true },
    +  { 31327, true },
    +  { 31352, true },
    +  { 31372, true },
    +  { 31386, true },
    +  { 31401, true },
    +  { 31414, true },
    +  { 31426, true },
    +  { 31436, true },
    +  { 31451, true },
    +  { 31461, true },
    +  { 31475, true },
    +  { 31486, true },
    +  { 31497, true },
    +  { 31512, true },
    +  { 31524, true },
    +  { 31538, true },
    +  { 31551, true },
    +  { 31567, true },
    +  { 31585, true },
    +  { 31595, true },
    +  { 31605, true },
    +  { 31625, true },
    +  { 31634, true },
    +  { 31646, true },
    +  { 31657, true },
    +  { 31666, true },
    +  { 31682, true },
    +  { 31697, true },
    +  { 31707, false },
    +  { 31727, true },
    +  { 31751, true },
    +  { 31772, true },
    +  { 31780, true },
    +  { 31790, true },
    +  { 31804, false },
    +  { 31814, true },
    +  { 31832, false },
    +  { 31846, true },
    +  { 31865, true },
    +  { 31882, true },
    +  { 31896, false },
    +  { 31914, true },
    +  { 31930, true },
    +  { 31941, true },
    +  { 31954, true },
    +  { 31969, true },
    +  { 31989, false },
    +  { 32004, true },
    +  { 32016, true },
    +  { 32029, true },
    +  { 32041, true },
    +  { 32054, true },
    +  { 32066, true },
    +  { 32081, true },
    +  { 32094, true },
    +  { 32107, false },
    +  { 32130, false },
    +  { 32154, true },
    +  { 32171, true },
    +  { 32184, true },
    +  { 32195, true },
    +  { 32207, true },
    +  { 32221, true },
    +  { 32232, true },
    +  { 32251, true },
    +  { 32268, true },
    +  { 32290, true },
    +  { 32304, true },
    +  { 32323, true },
    +  { 32333, true },
    +  { 32347, true },
    +  { 32368, true },
    +  { 32383, true },
       { 32397, true },
    -  { 32411, true },
    -  { 32430, true },
    -  { 32440, true },
    -  { 32454, true },
    -  { 32475, true },
    -  { 32490, true },
    -  { 32504, true },
    -  { 32515, true },
    -  { 32529, true },
    -  { 32542, true },
    -  { 32555, true },
    -  { 32575, true },
    -  { 32583, true },
    -  { 32595, false },
    -  { 32607, true },
    -  { 32618, true },
    -  { 32635, true },
    -  { 32657, true },
    +  { 32408, true },
    +  { 32422, true },
    +  { 32435, true },
    +  { 32448, true },
    +  { 32468, true },
    +  { 32476, true },
    +  { 32488, false },
    +  { 32500, true },
    +  { 32511, true },
    +  { 32528, true },
    +  { 32550, true },
    +  { 32562, true },
    +  { 32574, true },
    +  { 32592, true },
    +  { 32606, true },
    +  { 32621, true },
    +  { 32640, true },
    +  { 32655, true },
       { 32669, true },
    -  { 32681, true },
    -  { 32699, true },
    -  { 32713, true },
    -  { 32728, true },
    -  { 32747, true },
    -  { 32762, true },
    -  { 32776, true },
    +  { 32685, true },
    +  { 32706, true },
    +  { 32725, true },
    +  { 32742, true },
    +  { 32769, false },
       { 32788, true },
    -  { 32804, true },
    -  { 32825, true },
    -  { 32844, true },
    -  { 32861, true },
    -  { 32888, false },
    -  { 32907, true },
    -  { 32921, true },
    -  { 32941, true },
    -  { 32955, true },
    -  { 32975, true },
    -  { 32988, true },
    +  { 32802, true },
    +  { 32822, true },
    +  { 32836, true },
    +  { 32856, true },
    +  { 32869, true },
    +  { 32890, true },
    +  { 32911, true },
    +  { 32924, true },
    +  { 32931, true },
    +  { 32943, true },
    +  { 32965, true },
    +  { 32981, true },
    +  { 32996, true },
       { 33009, true },
    -  { 33030, true },
    -  { 33043, true },
    -  { 33050, true },
    -  { 33062, true },
    -  { 33084, true },
    -  { 33100, true },
    -  { 33115, true },
    -  { 33128, true },
    -  { 33148, true },
    -  { 33163, true },
    +  { 33029, true },
    +  { 33044, true },
    +  { 33054, true },
    +  { 33066, true },
    +  { 33078, true },
    +  { 33096, true },
    +  { 33111, true },
    +  { 33132, false },
    +  { 33153, true },
       { 33173, true },
    -  { 33185, true },
    -  { 33197, true },
    +  { 33205, true },
       { 33215, true },
    -  { 33230, true },
    -  { 33251, false },
    -  { 33272, true },
    -  { 33292, true },
    -  { 33324, true },
    +  { 33228, true },
    +  { 33247, true },
    +  { 33264, false },
    +  { 33288, false },
    +  { 33310, true },
       { 33334, true },
    -  { 33347, true },
    -  { 33366, true },
    -  { 33383, false },
    -  { 33407, false },
    -  { 33429, true },
    -  { 33453, true },
    -  { 33482, true },
    -  { 33512, true },
    -  { 33536, true },
    -  { 33553, true },
    -  { 33571, true },
    -  { 33586, true },
    -  { 33603, true },
    -  { 33617, true },
    -  { 33639, true },
    -  { 33664, true },
    -  { 33677, true },
    -  { 33696, true },
    -  { 33711, true },
    -  { 33735, true },
    -  { 33756, true },
    -  { 33770, true },
    -  { 33785, true },
    -  { 33801, true },
    -  { 33818, true },
    -  { 33836, true },
    -  { 33860, false },
    -  { 33882, true },
    -  { 33895, true },
    -  { 33906, true },
    -  { 33918, true },
    -  { 33933, false },
    -  { 33944, true },
    -  { 33972, true },
    +  { 33363, true },
    +  { 33393, true },
    +  { 33417, true },
    +  { 33434, true },
    +  { 33452, true },
    +  { 33467, true },
    +  { 33484, true },
    +  { 33498, true },
    +  { 33520, true },
    +  { 33545, true },
    +  { 33558, true },
    +  { 33577, true },
    +  { 33592, true },
    +  { 33616, true },
    +  { 33637, true },
    +  { 33651, true },
    +  { 33666, true },
    +  { 33682, true },
    +  { 33699, true },
    +  { 33717, true },
    +  { 33741, false },
    +  { 33763, true },
    +  { 33776, true },
    +  { 33787, true },
    +  { 33799, true },
    +  { 33814, false },
    +  { 33825, true },
    +  { 33853, true },
    +  { 33868, true },
    +  { 33891, true },
    +  { 33904, true },
    +  { 33915, true },
    +  { 33928, true },
    +  { 33947, true },
    +  { 33965, true },
       { 33987, true },
    -  { 34010, true },
    -  { 34023, true },
    -  { 34034, true },
    -  { 34047, true },
    -  { 34066, true },
    -  { 34084, true },
    +  { 34012, true },
    +  { 34035, true },
    +  { 34049, true },
    +  { 34065, true },
    +  { 34078, true },
    +  { 34096, true },
       { 34106, true },
    -  { 34131, true },
    -  { 34154, true },
    -  { 34168, true },
    -  { 34184, true },
    -  { 34197, true },
    -  { 34215, true },
    -  { 34225, true },
    -  { 34238, true },
    -  { 34259, true },
    -  { 34274, true },
    -  { 34298, true },
    -  { 34312, true },
    -  { 34337, true },
    -  { 34352, true },
    -  { 34375, true },
    -  { 34384, true },
    -  { 34405, true },
    -  { 34422, true },
    -  { 34433, true },
    -  { 34446, true },
    -  { 34459, false },
    -  { 34498, true },
    -  { 34511, true },
    -  { 34527, true },
    -  { 34541, false },
    -  { 34556, true },
    -  { 34576, false },
    -  { 34592, true },
    -  { 34611, true },
    -  { 34622, true },
    -  { 34635, true },
    -  { 34658, true },
    -  { 34670, true },
    -  { 34679, true },
    -  { 34689, true },
    -  { 34703, true },
    -  { 34718, true },
    -  { 34732, true },
    -  { 34743, true },
    -  { 34759, true },
    -  { 34776, true },
    -  { 34788, true },
    -  { 34811, true },
    -  { 34836, true },
    +  { 34119, true },
    +  { 34140, true },
    +  { 34155, true },
    +  { 34179, true },
    +  { 34193, true },
    +  { 34218, true },
    +  { 34233, true },
    +  { 34256, true },
    +  { 34265, true },
    +  { 34286, true },
    +  { 34303, true },
    +  { 34314, true },
    +  { 34327, true },
    +  { 34340, false },
    +  { 34379, true },
    +  { 34392, true },
    +  { 34408, true },
    +  { 34422, false },
    +  { 34437, true },
    +  { 34457, false },
    +  { 34473, true },
    +  { 34492, true },
    +  { 34503, true },
    +  { 34516, true },
    +  { 34539, true },
    +  { 34551, true },
    +  { 34560, true },
    +  { 34570, true },
    +  { 34584, true },
    +  { 34599, true },
    +  { 34613, true },
    +  { 34624, true },
    +  { 34640, true },
    +  { 34657, true },
    +  { 34669, true },
    +  { 34692, true },
    +  { 34717, true },
    +  { 34736, true },
    +  { 34749, true },
    +  { 34761, true },
    +  { 34783, true },
    +  { 34795, true },
    +  { 34819, true },
    +  { 34842, true },
       { 34855, true },
    -  { 34868, true },
    -  { 34880, true },
    -  { 34902, true },
    -  { 34914, true },
    -  { 34938, true },
    -  { 34961, true },
    -  { 34974, true },
    -  { 34997, true },
    +  { 34878, true },
    +  { 34897, true },
    +  { 34908, true },
    +  { 34922, true },
    +  { 34934, true },
    +  { 34952, true },
    +  { 34968, true },
    +  { 34986, true },
    +  { 35003, true },
       { 35016, true },
       { 35027, true },
    -  { 35041, true },
    -  { 35053, true },
    -  { 35071, true },
    -  { 35087, true },
    -  { 35105, true },
    -  { 35122, true },
    -  { 35135, true },
    -  { 35146, true },
    +  { 35045, true },
    +  { 35063, true },
    +  { 35086, true },
    +  { 35103, false },
    +  { 35118, true },
    +  { 35130, true },
    +  { 35142, true },
    +  { 35155, true },
       { 35164, true },
    -  { 35182, true },
    -  { 35205, true },
    -  { 35222, false },
    -  { 35237, true },
    -  { 35249, true },
    -  { 35261, true },
    -  { 35274, true },
    -  { 35283, true },
    -  { 35298, true },
    -  { 35317, true },
    -  { 35331, true },
    -  { 35346, true },
    -  { 35358, true },
    -  { 35370, true },
    -  { 35384, false },
    -  { 35401, true },
    -  { 35412, true },
    -  { 35425, true },
    -  { 35444, true },
    -  { 35457, true },
    -  { 35475, true },
    -  { 35501, true },
    -  { 35514, true },
    -  { 35533, true },
    -  { 35548, true },
    -  { 35562, true },
    -  { 35579, true },
    -  { 35596, true },
    -  { 35612, true },
    -  { 35631, true },
    -  { 35650, true },
    -  { 35670, true },
    -  { 35686, true },
    -  { 35702, true },
    -  { 35716, false },
    -  { 35726, true },
    -  { 35734, true },
    -  { 35760, true },
    -  { 35777, true },
    +  { 35179, true },
    +  { 35198, true },
    +  { 35212, true },
    +  { 35227, true },
    +  { 35239, true },
    +  { 35251, true },
    +  { 35265, false },
    +  { 35282, true },
    +  { 35293, true },
    +  { 35306, true },
    +  { 35325, true },
    +  { 35338, true },
    +  { 35356, true },
    +  { 35382, true },
    +  { 35395, true },
    +  { 35414, true },
    +  { 35429, true },
    +  { 35443, true },
    +  { 35460, true },
    +  { 35477, true },
    +  { 35493, true },
    +  { 35512, true },
    +  { 35531, true },
    +  { 35551, true },
    +  { 35567, true },
    +  { 35583, true },
    +  { 35597, false },
    +  { 35607, true },
    +  { 35615, true },
    +  { 35641, true },
    +  { 35658, true },
    +  { 35679, true },
    +  { 35697, true },
    +  { 35713, false },
    +  { 35732, true },
    +  { 35741, true },
    +  { 35755, true },
    +  { 35770, true },
    +  { 35787, true },
       { 35798, true },
    -  { 35816, true },
    -  { 35832, false },
    -  { 35851, true },
    -  { 35860, true },
    -  { 35874, true },
    -  { 35889, true },
    -  { 35906, true },
    -  { 35917, true },
    -  { 35936, true },
    -  { 35949, true },
    -  { 35964, true },
    -  { 35980, true },
    -  { 36002, true },
    -  { 36016, false },
    -  { 36030, true },
    -  { 36045, true },
    -  { 36057, true },
    -  { 36069, true },
    -  { 36092, true },
    -  { 36111, true },
    -  { 36127, true },
    -  { 36142, true },
    -  { 36152, true },
    -  { 36159, false },
    -  { 36172, true },
    -  { 36183, true },
    -  { 36200, true },
    -  { 36214, true },
    -  { 36223, true },
    -  { 36231, true },
    -  { 36245, true },
    -  { 36264, false },
    -  { 36275, true },
    -  { 36291, false },
    -  { 36301, true },
    -  { 36314, true },
    -  { 36328, true },
    -  { 36343, true },
    -  { 36359, true },
    -  { 36371, true },
    -  { 36385, true },
    -  { 36398, true },
    -  { 36412, true },
    -  { 36426, true },
    -  { 36441, true },
    +  { 35817, true },
    +  { 35830, true },
    +  { 35845, true },
    +  { 35861, true },
    +  { 35883, true },
    +  { 35897, false },
    +  { 35911, true },
    +  { 35926, true },
    +  { 35938, true },
    +  { 35950, true },
    +  { 35973, true },
    +  { 35992, true },
    +  { 36000, true },
    +  { 36016, true },
    +  { 36031, true },
    +  { 36041, true },
    +  { 36048, false },
    +  { 36061, true },
    +  { 36072, true },
    +  { 36089, true },
    +  { 36103, true },
    +  { 36112, true },
    +  { 36120, true },
    +  { 36134, true },
    +  { 36153, false },
    +  { 36164, true },
    +  { 36180, false },
    +  { 36190, true },
    +  { 36203, true },
    +  { 36217, true },
    +  { 36232, true },
    +  { 36248, true },
    +  { 36270, true },
    +  { 36282, true },
    +  { 36296, true },
    +  { 36310, true },
    +  { 36325, true },
    +  { 36344, true },
    +  { 36369, true },
    +  { 36389, true },
    +  { 36405, true },
    +  { 36420, true },
    +  { 36433, true },
    +  { 36445, true },
       { 36460, true },
    -  { 36485, true },
    -  { 36505, true },
    -  { 36521, true },
    -  { 36536, true },
    +  { 36476, true },
    +  { 36484, false },
    +  { 36496, true },
    +  { 36507, true },
    +  { 36516, true },
    +  { 36533, true },
       { 36549, true },
    -  { 36561, true },
    -  { 36576, true },
    -  { 36592, true },
    -  { 36600, false },
    -  { 36612, true },
    -  { 36623, true },
    +  { 36562, true },
    +  { 36579, true },
    +  { 36587, true },
    +  { 36598, true },
    +  { 36607, true },
    +  { 36618, true },
       { 36632, true },
    -  { 36649, true },
    -  { 36665, true },
    -  { 36678, true },
    -  { 36695, true },
    -  { 36703, true },
    -  { 36714, true },
    -  { 36723, true },
    -  { 36734, true },
    -  { 36748, true },
    -  { 36761, true },
    -  { 36769, true },
    -  { 36787, true },
    -  { 36796, true },
    +  { 36645, true },
    +  { 36653, true },
    +  { 36671, true },
    +  { 36680, true },
    +  { 36689, true },
    +  { 36697, true },
    +  { 36705, true },
    +  { 36724, true },
    +  { 36743, true },
    +  { 36752, true },
    +  { 36772, true },
    +  { 36795, true },
       { 36805, true },
    -  { 36813, true },
    -  { 36821, true },
    -  { 36840, true },
    -  { 36859, true },
    -  { 36868, true },
    -  { 36888, true },
    -  { 36911, true },
    -  { 36921, true },
    +  { 36815, true },
    +  { 36833, true },
    +  { 36853, true },
    +  { 36867, true },
    +  { 36883, true },
    +  { 36893, true },
    +  { 36904, true },
    +  { 36914, true },
       { 36931, true },
       { 36949, true },
    -  { 36969, true },
    -  { 36983, true },
    -  { 36999, true },
    -  { 37009, true },
    -  { 37020, true },
    -  { 37030, true },
    -  { 37047, true },
    -  { 37065, true },
    -  { 37080, true },
    -  { 37091, true },
    -  { 37098, true },
    +  { 36964, true },
    +  { 36975, true },
    +  { 36982, true },
    +  { 36993, true },
    +  { 37004, true },
    +  { 37012, true },
    +  { 37032, true },
    +  { 37053, true },
    +  { 37072, true },
    +  { 37087, true },
       { 37109, true },
    -  { 37120, true },
    -  { 37128, true },
    -  { 37148, true },
    -  { 37169, true },
    -  { 37188, true },
    -  { 37203, true },
    -  { 37225, true },
    -  { 37237, false },
    -  { 37259, true },
    -  { 37278, true },
    -  { 37293, true },
    -  { 37312, true },
    -  { 37324, true },
    -  { 37338, true },
    -  { 37347, true },
    -  { 37359, true },
    +  { 37121, false },
    +  { 37143, true },
    +  { 37162, true },
    +  { 37177, true },
    +  { 37196, true },
    +  { 37208, true },
    +  { 37222, true },
    +  { 37231, true },
    +  { 37243, true },
    +  { 37253, true },
    +  { 37262, true },
    +  { 37271, true },
    +  { 37280, true },
    +  { 37289, true },
    +  { 37299, true },
    +  { 37309, true },
    +  { 37318, true },
    +  { 37327, true },
    +  { 37345, true },
    +  { 37361, true },
       { 37369, true },
    -  { 37378, true },
    -  { 37387, true },
    -  { 37396, true },
    -  { 37405, true },
    -  { 37415, true },
    -  { 37425, true },
    -  { 37434, true },
    -  { 37443, true },
    -  { 37461, true },
    -  { 37477, true },
    -  { 37485, true },
    -  { 37492, true },
    -  { 37505, true },
    -  { 37522, true },
    -  { 37536, true },
    -  { 37547, true },
    -  { 37564, true },
    -  { 37584, true },
    -  { 37603, true },
    -  { 37617, true },
    +  { 37376, true },
    +  { 37389, true },
    +  { 37406, true },
    +  { 37420, true },
    +  { 37431, true },
    +  { 37448, true },
    +  { 37468, true },
    +  { 37487, true },
    +  { 37501, true },
    +  { 37519, true },
    +  { 37532, true },
    +  { 37546, true },
    +  { 37572, true },
    +  { 37587, true },
    +  { 37601, true },
    +  { 37612, true },
    +  { 37625, true },
       { 37635, true },
    -  { 37648, true },
    -  { 37662, true },
    -  { 37688, true },
    -  { 37703, true },
    -  { 37717, true },
    -  { 37728, true },
    -  { 37741, true },
    -  { 37751, true },
    -  { 37762, true },
    -  { 37781, true },
    -  { 37796, true },
    -  { 37811, true },
    -  { 37838, true },
    -  { 37848, true },
    -  { 37860, true },
    -  { 37872, true },
    -  { 37880, true },
    -  { 37891, true },
    +  { 37646, true },
    +  { 37665, true },
    +  { 37680, true },
    +  { 37695, true },
    +  { 37722, true },
    +  { 37732, true },
    +  { 37744, true },
    +  { 37756, true },
    +  { 37764, true },
    +  { 37775, true },
    +  { 37784, true },
    +  { 37792, true },
    +  { 37803, true },
    +  { 37830, true },
    +  { 37840, true },
    +  { 37851, true },
    +  { 37861, true },
    +  { 37875, true },
    +  { 37889, true },
       { 37900, true },
    -  { 37908, true },
    -  { 37919, true },
    -  { 37946, true },
    -  { 37956, true },
    +  { 37907, true },
    +  { 37915, true },
    +  { 37923, true },
    +  { 37939, true },
    +  { 37953, true },
       { 37967, true },
    -  { 37977, true },
    -  { 37991, true },
    -  { 38005, true },
    -  { 38016, true },
    -  { 38023, true },
    -  { 38031, true },
    -  { 38039, true },
    -  { 38055, true },
    -  { 38069, true },
    -  { 38083, true },
    -  { 38092, true },
    -  { 38104, true },
    -  { 38111, true },
    -  { 38118, true },
    -  { 38134, true },
    -  { 38146, true },
    -  { 38160, true },
    -  { 38182, true },
    -  { 38200, true },
    -  { 38211, true },
    -  { 38222, true },
    -  { 38233, true },
    +  { 37976, true },
    +  { 37988, true },
    +  { 37995, true },
    +  { 38002, true },
    +  { 38018, true },
    +  { 38030, true },
    +  { 38044, true },
    +  { 38066, true },
    +  { 38084, true },
    +  { 38095, true },
    +  { 38106, true },
    +  { 38117, true },
    +  { 38133, true },
    +  { 38150, true },
    +  { 38176, false },
    +  { 38199, true },
    +  { 38215, true },
    +  { 38225, true },
    +  { 38238, true },
       { 38249, true },
    -  { 38266, true },
    -  { 38292, false },
    -  { 38315, true },
    -  { 38331, true },
    -  { 38341, true },
    -  { 38354, true },
    -  { 38365, true },
    -  { 38380, true },
    -  { 38398, false },
    +  { 38264, true },
    +  { 38282, false },
    +  { 38294, true },
    +  { 38308, true },
    +  { 38319, true },
    +  { 38333, true },
    +  { 38350, true },
    +  { 38368, true },
    +  { 38381, true },
    +  { 38400, true },
       { 38410, true },
    -  { 38424, true },
    -  { 38435, true },
    -  { 38449, true },
    +  { 38423, true },
    +  { 38439, true },
    +  { 38448, true },
       { 38466, true },
    -  { 38484, true },
    -  { 38497, true },
    -  { 38516, true },
    -  { 38526, true },
    -  { 38539, true },
    -  { 38555, true },
    -  { 38564, true },
    -  { 38582, true },
    -  { 38596, true },
    -  { 38614, true },
    -  { 38629, true },
    -  { 38644, true },
    -  { 38665, true },
    +  { 38480, true },
    +  { 38498, true },
    +  { 38513, true },
    +  { 38528, true },
    +  { 38549, true },
    +  { 38570, true },
    +  { 38586, true },
    +  { 38605, true },
    +  { 38626, true },
    +  { 38646, true },
    +  { 38666, true },
       { 38686, true },
       { 38702, true },
    -  { 38721, true },
    -  { 38742, true },
    -  { 38762, true },
    -  { 38782, true },
    -  { 38802, true },
    -  { 38818, true },
    -  { 38835, true },
    +  { 38719, true },
    +  { 38738, true },
    +  { 38756, true },
    +  { 38776, true },
    +  { 38792, true },
    +  { 38803, false },
    +  { 38813, true },
    +  { 38822, true },
    +  { 38840, true },
       { 38854, true },
       { 38872, true },
    -  { 38892, true },
    -  { 38908, true },
    -  { 38919, false },
    -  { 38929, true },
    -  { 38938, true },
    -  { 38956, true },
    -  { 38970, true },
    -  { 38988, true },
    -  { 39001, true },
    -  { 39016, true },
    -  { 39031, true },
    -  { 39039, true },
    -  { 39073, true },
    -  { 39084, false },
    -  { 39098, true },
    -  { 39116, true },
    -  { 39134, true },
    -  { 39145, true },
    -  { 39159, true },
    -  { 39174, true },
    -  { 39191, true },
    -  { 39206, true },
    -  { 39218, true },
    -  { 39230, true },
    -  { 39259, true },
    -  { 39292, true },
    -  { 39304, true },
    -  { 39316, true },
    -  { 39330, true },
    -  { 39347, true },
    -  { 39359, true },
    -  { 39374, false },
    +  { 38885, true },
    +  { 38900, true },
    +  { 38915, true },
    +  { 38923, true },
    +  { 38957, true },
    +  { 38968, false },
    +  { 38982, true },
    +  { 39000, true },
    +  { 39018, true },
    +  { 39029, true },
    +  { 39043, true },
    +  { 39058, true },
    +  { 39075, true },
    +  { 39090, true },
    +  { 39102, true },
    +  { 39131, true },
    +  { 39164, true },
    +  { 39176, true },
    +  { 39188, true },
    +  { 39202, true },
    +  { 39219, true },
    +  { 39231, true },
    +  { 39246, false },
    +  { 39258, true },
    +  { 39267, true },
    +  { 39283, true },
    +  { 39295, true },
    +  { 39312, true },
    +  { 39327, false },
    +  { 39341, true },
    +  { 39361, false },
    +  { 39375, true },
       { 39386, true },
    -  { 39395, true },
    -  { 39411, true },
    -  { 39423, true },
    -  { 39440, true },
    -  { 39455, false },
    -  { 39469, true },
    -  { 39489, false },
    -  { 39503, true },
    -  { 39514, true },
    -  { 39527, true },
    -  { 39537, false },
    -  { 39553, true },
    -  { 39567, true },
    -  { 39581, true },
    -  { 39595, true },
    -  { 39606, true },
    -  { 39622, true },
    -  { 39633, true },
    -  { 39650, true },
    -  { 39676, true },
    -  { 39696, true },
    -  { 39710, true },
    -  { 39727, true },
    -  { 39741, true },
    -  { 39755, false },
    -  { 39773, false },
    -  { 39790, true },
    -  { 39801, true },
    -  { 39816, true },
    -  { 39828, true },
    -  { 39843, true },
    -  { 39865, true },
    -  { 39883, true },
    -  { 39899, true },
    -  { 39919, true },
    -  { 39933, true },
    -  { 39949, true },
    -  { 39967, true },
    -  { 39980, true },
    -  { 39997, true },
    -  { 40010, true },
    -  { 40025, true },
    -  { 40040, true },
    -  { 40056, true },
    -  { 40075, true },
    -  { 40096, true },
    -  { 40111, true },
    -  { 40123, true },
    -  { 40136, true },
    -  { 40162, true },
    -  { 40182, true },
    -  { 40193, true },
    -  { 40211, true },
    -  { 40230, true },
    -  { 40244, true },
    -  { 40253, true },
    -  { 40270, true },
    -  { 40281, true },
    -  { 40293, true },
    -  { 40303, true },
    -  { 40314, true },
    -  { 40335, true },
    -  { 40347, true },
    -  { 40355, true },
    -  { 40363, true },
    -  { 40374, true },
    -  { 40390, true },
    -  { 40400, true },
    -  { 40411, true },
    -  { 40420, true },
    -  { 40433, true },
    -  { 40448, true },
    -  { 40465, true },
    -  { 40487, true },
    -  { 40508, true },
    -  { 40521, true },
    -  { 40532, false },
    -  { 40552, true },
    -  { 40567, true },
    -  { 40580, true },
    -  { 40592, true },
    -  { 40606, true },
    -  { 40620, true },
    -  { 40637, true },
    -  { 40652, true },
    -  { 40666, true },
    -  { 40680, true },
    -  { 40694, true },
    -  { 40708, true },
    -  { 40722, true },
    -  { 40737, true },
    -  { 40749, true },
    -  { 40763, true },
    -  { 40778, true },
    +  { 39399, true },
    +  { 39409, false },
    +  { 39425, true },
    +  { 39439, true },
    +  { 39453, true },
    +  { 39467, true },
    +  { 39478, true },
    +  { 39494, true },
    +  { 39505, true },
    +  { 39522, true },
    +  { 39548, true },
    +  { 39568, true },
    +  { 39582, true },
    +  { 39599, true },
    +  { 39613, true },
    +  { 39627, false },
    +  { 39645, false },
    +  { 39662, true },
    +  { 39673, true },
    +  { 39688, true },
    +  { 39700, true },
    +  { 39715, true },
    +  { 39737, true },
    +  { 39755, true },
    +  { 39771, true },
    +  { 39791, true },
    +  { 39805, true },
    +  { 39821, true },
    +  { 39839, true },
    +  { 39852, true },
    +  { 39869, true },
    +  { 39882, true },
    +  { 39897, true },
    +  { 39912, true },
    +  { 39928, true },
    +  { 39947, true },
    +  { 39968, true },
    +  { 39983, true },
    +  { 39995, true },
    +  { 40008, true },
    +  { 40034, true },
    +  { 40054, true },
    +  { 40065, true },
    +  { 40083, true },
    +  { 40102, true },
    +  { 40116, true },
    +  { 40125, true },
    +  { 40142, true },
    +  { 40153, true },
    +  { 40165, true },
    +  { 40175, true },
    +  { 40186, true },
    +  { 40207, true },
    +  { 40219, true },
    +  { 40227, true },
    +  { 40235, true },
    +  { 40246, true },
    +  { 40262, true },
    +  { 40272, true },
    +  { 40283, true },
    +  { 40292, true },
    +  { 40305, true },
    +  { 40320, true },
    +  { 40337, true },
    +  { 40359, true },
    +  { 40380, true },
    +  { 40393, true },
    +  { 40404, false },
    +  { 40424, true },
    +  { 40439, true },
    +  { 40452, true },
    +  { 40464, true },
    +  { 40485, true },
    +  { 40499, true },
    +  { 40513, true },
    +  { 40530, true },
    +  { 40545, true },
    +  { 40559, true },
    +  { 40573, true },
    +  { 40587, true },
    +  { 40601, true },
    +  { 40615, true },
    +  { 40630, true },
    +  { 40642, true },
    +  { 40656, true },
    +  { 40671, true },
    +  { 40681, true },
    +  { 40697, true },
    +  { 40718, true },
    +  { 40733, true },
    +  { 40746, true },
    +  { 40761, true },
    +  { 40773, true },
       { 40788, true },
    -  { 40804, true },
    -  { 40825, true },
    -  { 40840, true },
    -  { 40853, true },
    -  { 40868, true },
    -  { 40880, true },
    -  { 40895, true },
    +  { 40805, true },
    +  { 40822, true },
    +  { 40834, true },
    +  { 40843, true },
    +  { 40863, true },
    +  { 40874, true },
    +  { 40889, true },
    +  { 40905, true },
       { 40912, true },
    -  { 40929, true },
    -  { 40941, true },
    -  { 40950, true },
    -  { 40970, true },
    -  { 40981, true },
    -  { 40996, true },
    -  { 41012, true },
    -  { 41019, true },
    -  { 41042, true },
    -  { 41056, true },
    -  { 41071, true },
    +  { 40935, true },
    +  { 40949, true },
    +  { 40964, true },
    +  { 40979, true },
    +  { 40994, true },
    +  { 41005, true },
    +  { 41015, true },
    +  { 41026, true },
    +  { 41037, true },
    +  { 41048, true },
    +  { 41061, true },
    +  { 41074, true },
       { 41086, true },
    -  { 41097, true },
    -  { 41107, true },
    -  { 41118, true },
    -  { 41129, true },
    +  { 41114, true },
    +  { 41126, true },
       { 41140, true },
    -  { 41153, true },
    -  { 41166, true },
    -  { 41178, true },
    +  { 41156, true },
    +  { 41175, true },
    +  { 41186, true },
       { 41206, true },
    -  { 41218, true },
    -  { 41232, true },
    -  { 41248, true },
    -  { 41267, true },
    -  { 41278, true },
    -  { 41298, true },
    -  { 41319, true },
    -  { 41334, true },
    -  { 41348, true },
    -  { 41358, true },
    -  { 41377, true },
    -  { 41394, true },
    -  { 41407, true },
    -  { 41421, false },
    +  { 41227, true },
    +  { 41242, true },
    +  { 41256, true },
    +  { 41266, true },
    +  { 41285, true },
    +  { 41302, true },
    +  { 41315, true },
    +  { 41329, false },
    +  { 41342, true },
    +  { 41354, true },
    +  { 41367, true },
    +  { 41379, true },
    +  { 41392, true },
    +  { 41405, true },
    +  { 41416, true },
       { 41434, true },
    -  { 41446, true },
    -  { 41459, true },
    -  { 41471, true },
    -  { 41484, true },
    -  { 41497, true },
    -  { 41508, true },
    -  { 41526, true },
    -  { 41544, true },
    -  { 41556, true },
    -  { 41570, true },
    -  { 41584, true },
    -  { 41613, true },
    -  { 41632, true },
    -  { 41645, true },
    -  { 41670, true },
    -  { 41687, true },
    -  { 41707, true },
    -  { 41728, true },
    -  { 41740, true },
    -  { 41764, true },
    -  { 41797, true },
    -  { 41809, true },
    -  { 41826, true },
    -  { 41841, true },
    -  { 41855, true },
    -  { 41881, true },
    -  { 41891, true },
    -  { 41904, true },
    -  { 41914, true },
    -  { 41924, true },
    -  { 41942, true },
    -  { 41960, true },
    -  { 41976, true },
    -  { 42001, true },
    -  { 42021, false },
    -  { 42042, true },
    -  { 42057, true },
    -  { 42072, true },
    -  { 42093, true },
    -  { 42104, true },
    -  { 42128, true },
    -  { 42141, true },
    -  { 42151, false },
    -  { 42165, true },
    -  { 42176, true },
    -  { 42190, true },
    -  { 42209, true },
    -  { 42224, true },
    -  { 42233, true },
    -  { 42243, true },
    -  { 42258, true },
    -  { 42270, true },
    -  { 42288, true },
    -  { 42299, true },
    -  { 42307, true },
    -  { 42317, true },
    -  { 42327, true },
    -  { 42337, true },
    -  { 42351, false },
    -  { 42376, true },
    -  { 42394, false },
    -  { 42418, true },
    -  { 42432, true },
    -  { 42451, true },
    -  { 42478, true },
    -  { 42487, true },
    +  { 41452, true },
    +  { 41464, true },
    +  { 41478, true },
    +  { 41492, true },
    +  { 41521, true },
    +  { 41540, true },
    +  { 41553, true },
    +  { 41578, true },
    +  { 41595, true },
    +  { 41615, true },
    +  { 41636, true },
    +  { 41648, true },
    +  { 41672, true },
    +  { 41705, true },
    +  { 41717, true },
    +  { 41734, true },
    +  { 41749, true },
    +  { 41763, true },
    +  { 41789, true },
    +  { 41799, true },
    +  { 41812, true },
    +  { 41822, true },
    +  { 41832, true },
    +  { 41850, true },
    +  { 41868, true },
    +  { 41895, true },
    +  { 41911, true },
    +  { 41936, true },
    +  { 41956, false },
    +  { 41977, true },
    +  { 41992, true },
    +  { 42007, true },
    +  { 42028, true },
    +  { 42039, true },
    +  { 42063, true },
    +  { 42076, true },
    +  { 42086, false },
    +  { 42100, true },
    +  { 42111, true },
    +  { 42125, true },
    +  { 42144, true },
    +  { 42159, true },
    +  { 42168, true },
    +  { 42178, true },
    +  { 42193, true },
    +  { 42205, true },
    +  { 42223, true },
    +  { 42234, true },
    +  { 42242, true },
    +  { 42252, true },
    +  { 42262, true },
    +  { 42272, true },
    +  { 42286, false },
    +  { 42311, true },
    +  { 42329, false },
    +  { 42353, true },
    +  { 42367, true },
    +  { 42386, true },
    +  { 42413, true },
    +  { 42422, true },
    +  { 42436, true },
    +  { 42453, true },
    +  { 42469, true },
    +  { 42484, true },
       { 42501, true },
    -  { 42518, true },
    -  { 42534, true },
    -  { 42549, true },
    -  { 42566, true },
    -  { 42578, true },
    -  { 42590, true },
    -  { 42600, true },
    -  { 42611, true },
    -  { 42623, true },
    -  { 42636, true },
    -  { 42650, true },
    -  { 42667, true },
    -  { 42678, true },
    -  { 42696, false },
    -  { 42716, true },
    -  { 42728, true },
    -  { 42739, true },
    -  { 42751, true },
    -  { 42764, true },
    -  { 42786, true },
    -  { 42800, true },
    -  { 42809, true },
    -  { 42821, true },
    -  { 42833, true },
    -  { 42842, true },
    +  { 42513, true },
    +  { 42525, true },
    +  { 42535, true },
    +  { 42546, true },
    +  { 42558, true },
    +  { 42571, true },
    +  { 42585, true },
    +  { 42602, true },
    +  { 42613, true },
    +  { 42631, false },
    +  { 42651, true },
    +  { 42663, true },
    +  { 42674, true },
    +  { 42686, true },
    +  { 42699, true },
    +  { 42721, true },
    +  { 42735, true },
    +  { 42744, true },
    +  { 42756, true },
    +  { 42768, true },
    +  { 42777, true },
    +  { 42787, true },
    +  { 42801, true },
    +  { 42818, true },
    +  { 42829, true },
    +  { 42843, true },
       { 42852, true },
    -  { 42866, true },
    -  { 42883, true },
    -  { 42894, true },
    -  { 42908, true },
    -  { 42917, true },
    -  { 42926, true },
    -  { 42941, true },
    -  { 42953, true },
    -  { 42969, true },
    -  { 42986, true },
    -  { 43008, true },
    -  { 43017, true },
    -  { 43029, true },
    -  { 43043, true },
    -  { 43076, true },
    -  { 43101, true },
    -  { 43110, true },
    -  { 43126, true },
    -  { 43138, true },
    -  { 43149, true },
    -  { 43174, true },
    -  { 43189, true },
    -  { 43211, true },
    -  { 43236, true },
    -  { 43267, true },
    -  { 43278, true },
    -  { 43294, true },
    -  { 43308, true },
    -  { 43326, true },
    -  { 43340, true },
    -  { 43355, false },
    -  { 43372, true },
    -  { 43390, true },
    -  { 43403, true },
    +  { 42861, true },
    +  { 42876, true },
    +  { 42888, true },
    +  { 42904, true },
    +  { 42921, true },
    +  { 42943, true },
    +  { 42952, true },
    +  { 42964, true },
    +  { 42978, true },
    +  { 43011, true },
    +  { 43036, true },
    +  { 43045, true },
    +  { 43061, true },
    +  { 43073, true },
    +  { 43084, true },
    +  { 43109, true },
    +  { 43124, true },
    +  { 43146, true },
    +  { 43171, true },
    +  { 43202, true },
    +  { 43213, true },
    +  { 43229, true },
    +  { 43243, true },
    +  { 43261, true },
    +  { 43275, true },
    +  { 43290, false },
    +  { 43307, true },
    +  { 43325, true },
    +  { 43338, true },
    +  { 43348, true },
    +  { 43360, true },
    +  { 43375, true },
    +  { 43386, true },
    +  { 43400, true },
       { 43413, true },
       { 43425, true },
    -  { 43440, true },
    -  { 43451, true },
    -  { 43465, true },
    -  { 43478, true },
    -  { 43490, true },
    -  { 43502, true },
    -  { 43515, true },
    -  { 43531, true },
    -  { 43544, true },
    -  { 43556, false },
    -  { 43573, true },
    -  { 43593, true },
    -  { 43610, true },
    -  { 43625, true },
    -  { 43648, true },
    -  { 43674, true },
    -  { 43694, false },
    -  { 43712, true },
    -  { 43731, true },
    -  { 43748, true },
    -  { 43761, true },
    -  { 43778, true },
    -  { 43788, false },
    -  { 43805, true },
    -  { 43824, true },
    -  { 43841, true },
    -  { 43855, true },
    -  { 43872, true },
    -  { 43880, true },
    -  { 43892, true },
    -  { 43902, true },
    -  { 43913, true },
    -  { 43927, true },
    -  { 43938, true },
    -  { 43951, true },
    -  { 43970, true },
    -  { 43981, true },
    -  { 43994, true },
    -  { 44007, true },
    -  { 44026, true },
    -  { 44042, true },
    -  { 44054, true },
    -  { 44068, true },
    -  { 44082, true },
    -  { 44094, true },
    -  { 44106, true },
    -  { 44121, true },
    -  { 44139, true },
    -  { 44154, true },
    -  { 44169, true },
    -  { 44185, true },
    -  { 44199, true },
    -  { 44220, true },
    -  { 44233, true },
    -  { 44249, true },
    -  { 44268, true },
    -  { 44287, true },
    -  { 44304, false },
    -  { 44324, true },
    -  { 44354, true },
    +  { 43437, true },
    +  { 43450, true },
    +  { 43466, true },
    +  { 43479, true },
    +  { 43491, false },
    +  { 43508, true },
    +  { 43528, true },
    +  { 43545, true },
    +  { 43560, true },
    +  { 43583, true },
    +  { 43609, true },
    +  { 43629, false },
    +  { 43647, true },
    +  { 43666, true },
    +  { 43683, true },
    +  { 43696, true },
    +  { 43713, true },
    +  { 43723, false },
    +  { 43740, true },
    +  { 43759, true },
    +  { 43776, true },
    +  { 43790, true },
    +  { 43807, true },
    +  { 43815, true },
    +  { 43827, true },
    +  { 43837, true },
    +  { 43848, true },
    +  { 43862, true },
    +  { 43873, true },
    +  { 43886, true },
    +  { 43905, true },
    +  { 43916, true },
    +  { 43929, true },
    +  { 43942, true },
    +  { 43961, true },
    +  { 43977, true },
    +  { 43989, true },
    +  { 44003, true },
    +  { 44017, true },
    +  { 44029, true },
    +  { 44041, true },
    +  { 44056, true },
    +  { 44074, true },
    +  { 44089, true },
    +  { 44104, true },
    +  { 44120, true },
    +  { 44134, true },
    +  { 44155, true },
    +  { 44168, true },
    +  { 44184, true },
    +  { 44203, true },
    +  { 44222, true },
    +  { 44239, false },
    +  { 44259, true },
    +  { 44289, true },
    +  { 44315, true },
    +  { 44327, true },
    +  { 44347, true },
    +  { 44361, true },
       { 44380, true },
    -  { 44392, true },
    -  { 44412, true },
    -  { 44426, true },
    +  { 44398, true },
    +  { 44413, true },
    +  { 44424, true },
    +  { 44435, true },
       { 44445, true },
       { 44463, true },
    -  { 44478, true },
    -  { 44489, true },
    -  { 44500, true },
    +  { 44482, true },
    +  { 44492, true },
       { 44510, true },
    -  { 44528, true },
    -  { 44547, true },
    -  { 44557, true },
    -  { 44575, true },
    -  { 44584, false },
    -  { 44595, false },
    -  { 44615, true },
    -  { 44623, true },
    -  { 44637, true },
    -  { 44650, true },
    -  { 44666, true },
    -  { 44677, true },
    +  { 44519, false },
    +  { 44530, false },
    +  { 44550, true },
    +  { 44558, true },
    +  { 44572, true },
    +  { 44585, true },
    +  { 44601, true },
    +  { 44612, true },
    +  { 44621, true },
    +  { 44634, true },
    +  { 44654, false },
    +  { 44669, false },
       { 44686, true },
    -  { 44699, true },
    -  { 44719, false },
    -  { 44734, false },
    -  { 44751, true },
    -  { 44760, true },
    -  { 44769, true },
    -  { 44785, true },
    -  { 44802, true },
    -  { 44811, true },
    -  { 44818, true },
    -  { 44826, true },
    -  { 44838, true },
    -  { 44847, true },
    -  { 44857, true },
    -  { 44874, true },
    -  { 44884, true },
    -  { 44892, true },
    -  { 44899, true },
    -  { 44910, true },
    -  { 44923, true },
    +  { 44695, true },
    +  { 44704, true },
    +  { 44720, true },
    +  { 44737, true },
    +  { 44746, true },
    +  { 44753, true },
    +  { 44761, true },
    +  { 44773, true },
    +  { 44782, true },
    +  { 44792, true },
    +  { 44809, true },
    +  { 44819, true },
    +  { 44827, true },
    +  { 44834, true },
    +  { 44845, true },
    +  { 44858, true },
    +  { 44865, true },
    +  { 44875, true },
    +  { 44890, true },
    +  { 44905, true },
    +  { 44918, true },
       { 44930, true },
    -  { 44940, true },
    -  { 44955, true },
    -  { 44970, true },
    +  { 44945, true },
    +  { 44956, true },
    +  { 44966, true },
    +  { 44974, true },
       { 44983, true },
       { 44995, true },
       { 45010, true },
    -  { 45021, true },
    -  { 45031, true },
    -  { 45039, true },
    -  { 45048, true },
    -  { 45060, true },
    -  { 45075, true },
    -  { 45085, true },
    -  { 45102, true },
    -  { 45111, true },
    +  { 45020, true },
    +  { 45037, true },
    +  { 45046, true },
    +  { 45056, true },
    +  { 45072, true },
    +  { 45088, true },
    +  { 45107, true },
       { 45121, true },
       { 45137, true },
    -  { 45153, true },
    -  { 45172, true },
    -  { 45186, true },
    -  { 45202, true },
    -  { 45215, true },
    -  { 45230, true },
    -  { 45243, true },
    -  { 45255, true },
    -  { 45280, false },
    -  { 45289, true },
    -  { 45302, true },
    +  { 45150, true },
    +  { 45165, true },
    +  { 45178, true },
    +  { 45190, true },
    +  { 45215, false },
    +  { 45224, true },
    +  { 45237, true },
    +  { 45246, true },
    +  { 45262, true },
    +  { 45283, true },
    +  { 45297, true },
       { 45311, true },
    -  { 45327, true },
    -  { 45348, true },
    -  { 45362, true },
    -  { 45376, true },
    -  { 45388, true },
    -  { 45410, false },
    -  { 45421, true },
    -  { 45433, true },
    -  { 45444, true },
    -  { 45458, true },
    -  { 45478, true },
    -  { 45492, true },
    -  { 45515, true },
    -  { 45529, true },
    -  { 45546, true },
    -  { 45560, true },
    -  { 45579, true },
    -  { 45595, true },
    -  { 45606, true },
    -  { 45617, true },
    -  { 45629, true },
    -  { 45650, false },
    -  { 45666, true },
    -  { 45683, true },
    -  { 45701, true },
    -  { 45716, true },
    -  { 45744, false },
    -  { 45754, false },
    -  { 45764, true },
    -  { 45783, true },
    -  { 45795, true },
    -  { 45809, true },
    -  { 45822, true },
    -  { 45841, true },
    -  { 45857, true },
    -  { 45872, true },
    -  { 45895, true },
    -  { 45914, true },
    -  { 45927, true },
    -  { 45944, true },
    +  { 45323, true },
    +  { 45345, false },
    +  { 45356, true },
    +  { 45368, true },
    +  { 45379, true },
    +  { 45393, true },
    +  { 45413, true },
    +  { 45427, true },
    +  { 45450, true },
    +  { 45464, true },
    +  { 45481, true },
    +  { 45495, true },
    +  { 45514, true },
    +  { 45530, true },
    +  { 45541, true },
    +  { 45552, true },
    +  { 45564, true },
    +  { 45585, false },
    +  { 45601, true },
    +  { 45618, true },
    +  { 45636, true },
    +  { 45651, true },
    +  { 45679, false },
    +  { 45689, false },
    +  { 45699, true },
    +  { 45718, true },
    +  { 45730, true },
    +  { 45744, true },
    +  { 45757, true },
    +  { 45776, true },
    +  { 45792, true },
    +  { 45807, true },
    +  { 45830, true },
    +  { 45849, true },
    +  { 45862, true },
    +  { 45879, true },
    +  { 45888, true },
    +  { 45909, true },
    +  { 45924, true },
    +  { 45940, true },
       { 45953, true },
    -  { 45974, true },
    -  { 45989, true },
    -  { 46005, true },
    -  { 46018, true },
    -  { 46031, true },
    -  { 46043, true },
    -  { 46057, true },
    -  { 46074, true },
    -  { 46091, true },
    -  { 46098, true },
    +  { 45966, true },
    +  { 45978, true },
    +  { 45992, true },
    +  { 46009, true },
    +  { 46016, true },
    +  { 46025, true },
    +  { 46040, true },
    +  { 46051, true },
    +  { 46075, true },
    +  { 46086, true },
    +  { 46096, true },
       { 46107, true },
    -  { 46122, true },
    -  { 46133, true },
    -  { 46157, true },
    -  { 46168, true },
    -  { 46178, true },
    -  { 46189, true },
    +  { 46119, true },
    +  { 46140, true },
    +  { 46154, true },
    +  { 46169, true },
    +  { 46186, true },
       { 46201, true },
    -  { 46222, true },
    -  { 46236, true },
    -  { 46251, true },
    -  { 46268, true },
    -  { 46283, true },
    -  { 46295, true },
    -  { 46312, true },
    -  { 46328, true },
    -  { 46344, true },
    -  { 46361, true },
    -  { 46390, true },
    -  { 46401, false },
    -  { 46415, true },
    -  { 46424, true },
    -  { 46439, true },
    -  { 46456, true },
    -  { 46473, true },
    -  { 46484, true },
    -  { 46502, true },
    -  { 46525, true },
    -  { 46539, true },
    -  { 46558, true },
    -  { 46577, true },
    -  { 46591, true },
    -  { 46602, true },
    -  { 46612, true },
    -  { 46625, true },
    -  { 46641, true },
    -  { 46652, true },
    -  { 46661, true },
    -  { 46681, true },
    -  { 46700, true },
    -  { 46729, true },
    -  { 46745, true },
    -  { 46761, true },
    -  { 46771, true },
    -  { 46780, true },
    -  { 46795, true },
    +  { 46213, true },
    +  { 46230, true },
    +  { 46246, true },
    +  { 46262, true },
    +  { 46279, true },
    +  { 46308, true },
    +  { 46319, false },
    +  { 46333, true },
    +  { 46342, true },
    +  { 46357, true },
    +  { 46374, true },
    +  { 46391, true },
    +  { 46402, true },
    +  { 46420, true },
    +  { 46443, true },
    +  { 46457, true },
    +  { 46476, true },
    +  { 46495, true },
    +  { 46509, true },
    +  { 46520, true },
    +  { 46530, true },
    +  { 46543, true },
    +  { 46559, true },
    +  { 46570, true },
    +  { 46579, true },
    +  { 46599, true },
    +  { 46618, true },
    +  { 46647, true },
    +  { 46663, true },
    +  { 46679, true },
    +  { 46689, true },
    +  { 46698, true },
    +  { 46713, true },
    +  { 46725, true },
    +  { 46739, true },
    +  { 46754, true },
    +  { 46767, false },
    +  { 46777, true },
    +  { 46794, true },
       { 46807, true },
    -  { 46821, true },
    -  { 46836, true },
    -  { 46849, false },
    -  { 46859, true },
    -  { 46876, true },
    -  { 46889, true },
    -  { 46907, true },
    -  { 46929, true },
    -  { 46940, true },
    -  { 46949, false },
    -  { 46962, true },
    -  { 46974, true },
    -  { 46987, true },
    -  { 47002, true },
    -  { 47014, true },
    -  { 47029, true },
    -  { 47061, true },
    -  { 47073, true },
    -  { 47087, true },
    -  { 47103, true },
    -  { 47113, true },
    -  { 47123, true },
    -  { 47138, true },
    -  { 47152, true },
    -  { 47162, true },
    +  { 46825, true },
    +  { 46847, true },
    +  { 46858, true },
    +  { 46867, false },
    +  { 46880, true },
    +  { 46892, true },
    +  { 46905, true },
    +  { 46920, true },
    +  { 46932, true },
    +  { 46947, true },
    +  { 46979, true },
    +  { 46991, true },
    +  { 47005, true },
    +  { 47021, true },
    +  { 47031, true },
    +  { 47041, true },
    +  { 47056, true },
    +  { 47070, true },
    +  { 47080, true },
    +  { 47091, true },
    +  { 47107, true },
    +  { 47125, true },
    +  { 47144, true },
    +  { 47158, true },
       { 47173, true },
    -  { 47189, true },
    -  { 47207, true },
    -  { 47226, true },
    -  { 47240, true },
    -  { 47255, true },
    -  { 47263, true },
    -  { 47272, true },
    -  { 47295, true },
    -  { 47306, true },
    -  { 47321, true },
    +  { 47181, true },
    +  { 47190, true },
    +  { 47213, true },
    +  { 47224, true },
    +  { 47239, true },
    +  { 47257, true },
    +  { 47269, true },
    +  { 47285, true },
    +  { 47300, true },
    +  { 47313, true },
    +  { 47324, true },
       { 47339, true },
    -  { 47351, true },
    +  { 47356, true },
       { 47367, true },
    -  { 47382, true },
    -  { 47395, true },
    -  { 47406, true },
    -  { 47421, true },
    -  { 47438, true },
    -  { 47449, true },
    -  { 47458, true },
    -  { 47470, true },
    -  { 47486, true },
    +  { 47376, true },
    +  { 47388, true },
    +  { 47404, true },
    +  { 47414, true },
    +  { 47428, true },
    +  { 47436, true },
    +  { 47445, true },
    +  { 47455, true },
    +  { 47476, true },
    +  { 47485, true },
       { 47496, true },
    -  { 47510, true },
    -  { 47518, true },
    -  { 47527, true },
    -  { 47537, true },
    -  { 47558, true },
    -  { 47567, true },
    -  { 47578, true },
    -  { 47594, true },
    -  { 47604, true },
    -  { 47623, true },
    -  { 47637, true },
    -  { 47650, true },
    -  { 47668, true },
    -  { 47688, true },
    -  { 47708, true },
    -  { 47716, true },
    -  { 47729, true },
    -  { 47740, true },
    -  { 47758, true },
    +  { 47512, true },
    +  { 47522, true },
    +  { 47541, true },
    +  { 47555, true },
    +  { 47568, true },
    +  { 47586, true },
    +  { 47606, true },
    +  { 47626, true },
    +  { 47634, true },
    +  { 47647, true },
    +  { 47658, true },
    +  { 47676, true },
    +  { 47686, true },
    +  { 47695, true },
    +  { 47704, true },
    +  { 47715, true },
    +  { 47722, true },
    +  { 47732, true },
    +  { 47744, true },
    +  { 47754, true },
       { 47768, true },
    -  { 47777, true },
    -  { 47786, true },
    -  { 47797, true },
    -  { 47804, true },
    -  { 47814, true },
    -  { 47826, true },
    -  { 47836, true },
    -  { 47850, true },
    -  { 47865, true },
    -  { 47872, true },
    -  { 47885, false },
    +  { 47783, true },
    +  { 47790, true },
    +  { 47803, false },
    +  { 47818, true },
    +  { 47838, true },
    +  { 47855, true },
    +  { 47870, true },
    +  { 47886, true },
       { 47900, true },
    -  { 47920, true },
    -  { 47937, true },
    +  { 47921, true },
    +  { 47930, true },
    +  { 47939, true },
       { 47952, true },
    -  { 47968, true },
    -  { 47982, true },
    -  { 48003, true },
    -  { 48012, true },
    -  { 48021, true },
    -  { 48034, true },
    -  { 48044, true },
    +  { 47962, true },
    +  { 47974, true },
    +  { 47983, true },
    +  { 47993, true },
    +  { 48005, true },
    +  { 48016, true },
    +  { 48024, true },
    +  { 48031, true },
       { 48056, true },
    -  { 48065, true },
    -  { 48075, true },
    -  { 48087, true },
    -  { 48098, true },
    +  { 48074, true },
    +  { 48092, true },
       { 48106, true },
    -  { 48113, true },
    -  { 48138, true },
    -  { 48156, true },
    +  { 48115, true },
    +  { 48128, true },
    +  { 48145, true },
    +  { 48158, true },
       { 48174, true },
    -  { 48188, true },
    -  { 48197, true },
    -  { 48210, true },
    -  { 48227, true },
    -  { 48240, true },
    -  { 48256, true },
    -  { 48266, true },
    -  { 48284, false },
    -  { 48297, true },
    -  { 48313, true },
    -  { 48329, true },
    -  { 48342, true },
    -  { 48355, true },
    -  { 48365, false },
    -  { 48383, true },
    -  { 48396, true },
    -  { 48409, true },
    -  { 48425, true },
    -  { 48444, true },
    -  { 48459, true },
    -  { 48466, true },
    -  { 48479, true },
    -  { 48508, true },
    -  { 48530, true },
    -  { 48551, true },
    -  { 48578, true },
    -  { 48598, true },
    -  { 48606, true },
    -  { 48617, true },
    -  { 48637, true },
    -  { 48656, true },
    -  { 48672, true },
    -  { 48688, false },
    -  { 48703, true },
    -  { 48718, true },
    -  { 48737, true },
    -  { 48751, true },
    -  { 48769, true },
    -  { 48778, true },
    -  { 48788, true },
    -  { 48804, true },
    -  { 48818, true },
    -  { 48832, true },
    +  { 48184, true },
    +  { 48202, false },
    +  { 48215, true },
    +  { 48231, true },
    +  { 48247, true },
    +  { 48260, true },
    +  { 48273, true },
    +  { 48283, false },
    +  { 48301, true },
    +  { 48314, true },
    +  { 48327, true },
    +  { 48343, true },
    +  { 48362, true },
    +  { 48377, true },
    +  { 48384, true },
    +  { 48397, true },
    +  { 48426, true },
    +  { 48448, true },
    +  { 48469, true },
    +  { 48496, true },
    +  { 48516, true },
    +  { 48524, true },
    +  { 48535, true },
    +  { 48555, true },
    +  { 48574, true },
    +  { 48590, true },
    +  { 48606, false },
    +  { 48621, true },
    +  { 48636, true },
    +  { 48655, true },
    +  { 48669, true },
    +  { 48687, true },
    +  { 48696, true },
    +  { 48706, true },
    +  { 48722, true },
    +  { 48736, true },
    +  { 48750, true },
    +  { 48783, true },
    +  { 48797, true },
    +  { 48811, true },
    +  { 48820, true },
    +  { 48830, true },
    +  { 48841, true },
       { 48865, true },
    -  { 48879, true },
    -  { 48893, true },
    -  { 48902, true },
    -  { 48912, true },
    -  { 48923, true },
    -  { 48947, true },
    -  { 48959, true },
    -  { 48970, false },
    -  { 48983, true },
    -  { 48989, true },
    -  { 48999, true },
    -  { 49008, true },
    -  { 49022, true },
    -  { 49032, true },
    -  { 49048, true },
    -  { 49061, true },
    +  { 48877, true },
    +  { 48888, false },
    +  { 48901, true },
    +  { 48907, true },
    +  { 48917, true },
    +  { 48926, true },
    +  { 48940, true },
    +  { 48950, true },
    +  { 48966, true },
    +  { 48979, true },
    +  { 48991, true },
    +  { 49007, true },
    +  { 49018, true },
    +  { 49030, true },
    +  { 49045, true },
    +  { 49062, true },
       { 49073, true },
    -  { 49089, true },
    -  { 49100, true },
    -  { 49112, true },
    -  { 49127, true },
    -  { 49144, true },
    -  { 49155, true },
    -  { 49167, true },
    -  { 49183, false },
    -  { 49198, true },
    -  { 49208, true },
    -  { 49224, true },
    -  { 49236, true },
    -  { 49258, true },
    -  { 49269, true },
    -  { 49288, true },
    -  { 49311, true },
    -  { 49328, true },
    -  { 49337, false },
    -  { 49346, true },
    -  { 49357, true },
    -  { 49374, true },
    -  { 49390, true },
    -  { 49404, true },
    -  { 49418, true },
    -  { 49436, false },
    -  { 49444, true },
    -  { 49453, true },
    -  { 49466, true },
    -  { 49478, true },
    -  { 49488, true },
    -  { 49497, true },
    -  { 49505, true },
    -  { 49515, true },
    -  { 49521, true },
    -  { 49529, true },
    -  { 49546, true },
    -  { 49558, true },
    -  { 49567, true },
    -  { 49582, true },
    -  { 49592, true },
    -  { 49601, true },
    -  { 49613, true },
    -  { 49634, true },
    -  { 49645, true },
    +  { 49085, true },
    +  { 49101, false },
    +  { 49116, true },
    +  { 49126, true },
    +  { 49142, true },
    +  { 49154, true },
    +  { 49176, true },
    +  { 49187, true },
    +  { 49206, true },
    +  { 49229, true },
    +  { 49246, true },
    +  { 49255, false },
    +  { 49264, true },
    +  { 49275, true },
    +  { 49292, true },
    +  { 49308, true },
    +  { 49322, true },
    +  { 49336, true },
    +  { 49354, false },
    +  { 49362, true },
    +  { 49371, true },
    +  { 49384, true },
    +  { 49396, true },
    +  { 49406, true },
    +  { 49415, true },
    +  { 49423, true },
    +  { 49433, true },
    +  { 49439, true },
    +  { 49447, true },
    +  { 49464, true },
    +  { 49476, true },
    +  { 49485, true },
    +  { 49500, true },
    +  { 49510, true },
    +  { 49519, true },
    +  { 49531, true },
    +  { 49552, true },
    +  { 49563, true },
    +  { 49577, true },
    +  { 49594, true },
    +  { 49606, true },
    +  { 49629, true },
    +  { 49643, false },
       { 49659, true },
    -  { 49676, true },
    -  { 49688, true },
    -  { 49711, true },
    -  { 49725, false },
    -  { 49741, true },
    -  { 49756, true },
    -  { 49767, true },
    -  { 49783, true },
    -  { 49794, true },
    -  { 49810, true },
    -  { 49838, true },
    -  { 49854, true },
    -  { 49866, false },
    +  { 49674, true },
    +  { 49685, true },
    +  { 49701, true },
    +  { 49717, true },
    +  { 49745, true },
    +  { 49761, true },
    +  { 49773, false },
    +  { 49791, true },
    +  { 49802, true },
    +  { 49812, true },
    +  { 49833, true },
    +  { 49843, false },
    +  { 49855, true },
    +  { 49870, true },
       { 49884, true },
    -  { 49895, true },
    -  { 49905, true },
    -  { 49926, true },
    -  { 49936, false },
    -  { 49948, true },
    +  { 49897, true },
    +  { 49907, true },
    +  { 49922, true },
    +  { 49933, true },
    +  { 49945, true },
       { 49963, true },
    -  { 49977, true },
    -  { 49990, true },
    -  { 50000, true },
    -  { 50015, true },
    -  { 50026, true },
    -  { 50038, true },
    -  { 50056, true },
    -  { 50069, true },
    -  { 50082, true },
    -  { 50091, true },
    -  { 50100, true },
    -  { 50112, true },
    -  { 50128, true },
    -  { 50141, true },
    -  { 50152, true },
    -  { 50168, true },
    -  { 50187, true },
    -  { 50203, true },
    -  { 50218, true },
    -  { 50249, true },
    -  { 50273, true },
    -  { 50292, true },
    -  { 50312, true },
    -  { 50329, true },
    -  { 50345, true },
    -  { 50360, true },
    -  { 50379, true },
    -  { 50401, true },
    -  { 50413, true },
    -  { 50430, true },
    -  { 50445, true },
    -  { 50464, true },
    -  { 50477, true },
    -  { 50492, true },
    -  { 50507, true },
    -  { 50520, true },
    -  { 50536, true },
    -  { 50548, true },
    -  { 50561, true },
    -  { 50571, false },
    -  { 50580, true },
    -  { 50602, true },
    -  { 50622, true },
    -  { 50643, true },
    -  { 50658, true },
    -  { 50669, true },
    -  { 50690, true },
    +  { 49976, true },
    +  { 49989, true },
    +  { 49998, true },
    +  { 50007, true },
    +  { 50019, true },
    +  { 50035, true },
    +  { 50048, true },
    +  { 50059, true },
    +  { 50075, true },
    +  { 50094, true },
    +  { 50110, true },
    +  { 50125, true },
    +  { 50156, true },
    +  { 50180, true },
    +  { 50199, true },
    +  { 50219, true },
    +  { 50236, true },
    +  { 50252, true },
    +  { 50267, true },
    +  { 50286, true },
    +  { 50308, true },
    +  { 50320, true },
    +  { 50337, true },
    +  { 50352, true },
    +  { 50371, true },
    +  { 50384, true },
    +  { 50399, true },
    +  { 50414, true },
    +  { 50427, true },
    +  { 50443, true },
    +  { 50455, true },
    +  { 50468, true },
    +  { 50478, false },
    +  { 50487, true },
    +  { 50509, true },
    +  { 50529, true },
    +  { 50550, true },
    +  { 50565, true },
    +  { 50576, true },
    +  { 50597, true },
    +  { 50613, true },
    +  { 50637, false },
    +  { 50654, true },
    +  { 50667, true },
    +  { 50680, true },
    +  { 50693, true },
       { 50706, true },
    -  { 50730, false },
    -  { 50747, true },
    -  { 50760, true },
    -  { 50773, true },
    -  { 50786, true },
    -  { 50799, true },
    -  { 50810, true },
    -  { 50819, true },
    -  { 50837, true },
    +  { 50717, true },
    +  { 50726, true },
    +  { 50744, true },
    +  { 50753, true },
    +  { 50766, true },
    +  { 50775, true },
    +  { 50791, true },
    +  { 50818, true },
    +  { 50829, true },
       { 50846, true },
       { 50859, true },
    -  { 50868, true },
    -  { 50884, true },
    -  { 50911, true },
    -  { 50922, true },
    -  { 50939, true },
    -  { 50952, true },
    -  { 50966, true },
    -  { 50983, true },
    -  { 50998, true },
    -  { 51021, true },
    -  { 51031, true },
    -  { 51049, true },
    -  { 51064, true },
    -  { 51089, true },
    -  { 51113, true },
    -  { 51122, true },
    -  { 51143, true },
    -  { 51163, true },
    -  { 51175, true },
    -  { 51188, true },
    -  { 51202, true },
    -  { 51219, false },
    -  { 51231, false },
    +  { 50873, true },
    +  { 50890, true },
    +  { 50905, true },
    +  { 50928, true },
    +  { 50938, true },
    +  { 50956, true },
    +  { 50971, true },
    +  { 50996, true },
    +  { 51020, true },
    +  { 51029, true },
    +  { 51050, true },
    +  { 51070, true },
    +  { 51082, true },
    +  { 51095, true },
    +  { 51109, true },
    +  { 51126, false },
    +  { 51138, false },
    +  { 51151, true },
    +  { 51165, true },
    +  { 51174, true },
    +  { 51185, true },
    +  { 51205, true },
    +  { 51219, true },
    +  { 51230, true },
       { 51244, true },
    -  { 51258, true },
    -  { 51267, true },
    -  { 51278, true },
    +  { 51261, false },
    +  { 51289, true },
       { 51298, true },
    -  { 51312, true },
    -  { 51323, true },
    -  { 51337, true },
    -  { 51354, false },
    -  { 51382, true },
    -  { 51391, true },
    -  { 51400, true },
    +  { 51307, true },
    +  { 51317, true },
    +  { 51333, true },
    +  { 51343, true },
    +  { 51357, false },
    +  { 51371, false },
    +  { 51386, true },
       { 51410, true },
    -  { 51426, true },
    -  { 51436, true },
    -  { 51450, false },
    -  { 51464, false },
    -  { 51479, true },
    -  { 51503, true },
    -  { 51524, true },
    -  { 51546, true },
    -  { 51560, true },
    -  { 51570, true },
    -  { 51580, true },
    -  { 51592, true },
    -  { 51608, true },
    -  { 51622, true },
    -  { 51641, true },
    -  { 51657, true },
    -  { 51670, true },
    -  { 51682, true },
    -  { 51695, true },
    -  { 51707, true },
    -  { 51719, true },
    -  { 51732, true },
    -  { 51742, true },
    -  { 51761, true },
    -  { 51785, true },
    -  { 51801, true },
    -  { 51811, true },
    -  { 51827, true },
    +  { 51431, true },
    +  { 51453, true },
    +  { 51467, true },
    +  { 51477, true },
    +  { 51487, true },
    +  { 51499, true },
    +  { 51515, true },
    +  { 51529, true },
    +  { 51548, true },
    +  { 51564, true },
    +  { 51577, true },
    +  { 51589, true },
    +  { 51602, true },
    +  { 51614, true },
    +  { 51626, true },
    +  { 51639, true },
    +  { 51649, true },
    +  { 51668, true },
    +  { 51692, true },
    +  { 51708, true },
    +  { 51718, true },
    +  { 51734, true },
    +  { 51753, true },
    +  { 51771, true },
    +  { 51788, true },
    +  { 51814, true },
    +  { 51826, true },
       { 51846, true },
    -  { 51864, true },
    -  { 51881, true },
    -  { 51907, true },
    -  { 51919, true },
    -  { 51939, true },
    -  { 51955, true },
    -  { 51973, true },
    -  { 51987, true },
    -  { 51997, true },
    -  { 52012, true },
    -  { 52024, true },
    -  { 52039, true },
    -  { 52057, true },
    -  { 52076, true },
    -  { 52090, true },
    -  { 52100, true },
    -  { 52111, true },
    -  { 52130, true },
    -  { 52146, true },
    -  { 52165, true },
    -  { 52175, true },
    -  { 52194, true },
    -  { 52206, true },
    -  { 52217, true },
    +  { 51862, true },
    +  { 51876, true },
    +  { 51886, true },
    +  { 51901, true },
    +  { 51913, true },
    +  { 51928, true },
    +  { 51946, true },
    +  { 51965, true },
    +  { 51979, true },
    +  { 51989, true },
    +  { 52000, true },
    +  { 52019, true },
    +  { 52035, true },
    +  { 52054, true },
    +  { 52064, true },
    +  { 52083, true },
    +  { 52095, true },
    +  { 52106, true },
    +  { 52119, true },
    +  { 52132, true },
    +  { 52156, false },
    +  { 52173, true },
    +  { 52193, true },
    +  { 52206, false },
    +  { 52218, true },
       { 52230, true },
    -  { 52243, true },
    -  { 52267, false },
    -  { 52284, true },
    -  { 52304, true },
    -  { 52317, false },
    -  { 52329, true },
    +  { 52245, true },
    +  { 52265, true },
    +  { 52275, true },
    +  { 52285, false },
    +  { 52302, true },
    +  { 52310, true },
    +  { 52326, true },
       { 52341, true },
    -  { 52356, true },
    -  { 52376, true },
    -  { 52386, true },
    -  { 52396, false },
    -  { 52413, true },
    -  { 52421, true },
    -  { 52437, true },
    +  { 52357, true },
    +  { 52373, true },
    +  { 52387, true },
    +  { 52399, true },
    +  { 52419, true },
    +  { 52435, true },
       { 52452, true },
    -  { 52468, true },
    -  { 52484, true },
    -  { 52498, true },
    -  { 52510, true },
    -  { 52530, true },
    -  { 52546, true },
    -  { 52563, true },
    -  { 52573, true },
    -  { 52586, true },
    -  { 52600, true },
    -  { 52613, true },
    -  { 52623, true },
    -  { 52637, true },
    -  { 52649, true },
    -  { 52665, true },
    -  { 52689, true },
    -  { 52714, true },
    -  { 52727, true },
    -  { 52740, true },
    +  { 52462, true },
    +  { 52475, true },
    +  { 52489, true },
    +  { 52502, true },
    +  { 52512, true },
    +  { 52526, true },
    +  { 52538, true },
    +  { 52554, true },
    +  { 52578, true },
    +  { 52603, true },
    +  { 52616, true },
    +  { 52629, true },
    +  { 52641, true },
    +  { 52660, true },
    +  { 52673, true },
    +  { 52686, true },
    +  { 52699, true },
    +  { 52719, true },
    +  { 52734, true },
       { 52752, true },
    -  { 52771, true },
    -  { 52784, true },
    +  { 52761, true },
    +  { 52772, true },
    +  { 52783, true },
       { 52797, true },
    -  { 52810, true },
    -  { 52830, true },
    -  { 52845, true },
    -  { 52863, true },
    -  { 52872, true },
    -  { 52883, true },
    -  { 52894, true },
    -  { 52908, true },
    -  { 52920, true },
    -  { 52930, true },
    -  { 52944, true },
    -  { 52954, true },
    -  { 52965, true },
    -  { 52977, true },
    -  { 52986, true },
    -  { 52997, false },
    -  { 53010, true },
    -  { 53028, true },
    -  { 53035, true },
    -  { 53047, true },
    -  { 53063, true },
    -  { 53080, true },
    -  { 53093, false },
    -  { 53113, true },
    -  { 53125, true },
    -  { 53138, true },
    -  { 53157, true },
    -  { 53178, true },
    -  { 53187, true },
    -  { 53202, true },
    +  { 52809, true },
    +  { 52819, true },
    +  { 52833, true },
    +  { 52843, true },
    +  { 52854, true },
    +  { 52866, true },
    +  { 52875, true },
    +  { 52886, false },
    +  { 52899, true },
    +  { 52917, true },
    +  { 52929, true },
    +  { 52945, true },
    +  { 52962, true },
    +  { 52975, false },
    +  { 52995, true },
    +  { 53007, true },
    +  { 53020, true },
    +  { 53039, true },
    +  { 53060, true },
    +  { 53069, true },
    +  { 53084, true },
    +  { 53097, true },
    +  { 53108, true },
    +  { 53117, true },
    +  { 53130, true },
    +  { 53143, true },
    +  { 53152, true },
    +  { 53164, true },
    +  { 53173, true },
    +  { 53182, true },
    +  { 53201, true },
       { 53215, true },
    -  { 53226, true },
    -  { 53235, true },
    -  { 53248, true },
    -  { 53261, true },
    -  { 53270, true },
    -  { 53282, true },
    -  { 53291, true },
    -  { 53300, true },
    -  { 53319, true },
    -  { 53333, true },
    -  { 53351, true },
    -  { 53373, false },
    -  { 53398, true },
    -  { 53407, true },
    -  { 53417, true },
    -  { 53430, true },
    -  { 53442, true },
    -  { 53467, true },
    -  { 53483, true },
    -  { 53496, true },
    -  { 53510, true },
    -  { 53528, true },
    -  { 53538, true },
    -  { 53556, true },
    -  { 53567, false },
    -  { 53582, true },
    -  { 53591, true },
    -  { 53600, true },
    -  { 53614, false },
    -  { 53625, true },
    -  { 53633, true },
    -  { 53641, true },
    -  { 53650, true },
    -  { 53665, true },
    -  { 53677, true },
    -  { 53691, true },
    -  { 53705, true },
    -  { 53717, true },
    -  { 53735, true },
    -  { 53757, true },
    -  { 53773, true },
    +  { 53233, true },
    +  { 53255, false },
    +  { 53280, true },
    +  { 53289, true },
    +  { 53299, true },
    +  { 53312, true },
    +  { 53324, true },
    +  { 53349, true },
    +  { 53365, true },
    +  { 53378, true },
    +  { 53392, true },
    +  { 53410, true },
    +  { 53420, true },
    +  { 53438, true },
    +  { 53449, false },
    +  { 53464, true },
    +  { 53473, true },
    +  { 53482, true },
    +  { 53496, false },
    +  { 53507, true },
    +  { 53515, true },
    +  { 53523, true },
    +  { 53532, true },
    +  { 53547, true },
    +  { 53559, true },
    +  { 53573, true },
    +  { 53587, true },
    +  { 53599, true },
    +  { 53617, true },
    +  { 53639, true },
    +  { 53655, true },
    +  { 53669, true },
    +  { 53686, true },
    +  { 53699, true },
    +  { 53709, true },
    +  { 53723, true },
    +  { 53737, true },
    +  { 53750, true },
    +  { 53763, true },
    +  { 53776, true },
       { 53787, true },
    -  { 53804, true },
    -  { 53817, true },
    -  { 53827, true },
    +  { 53797, true },
    +  { 53806, true },
    +  { 53813, true },
    +  { 53822, true },
       { 53841, true },
       { 53855, true },
    -  { 53868, true },
    -  { 53881, true },
    -  { 53894, true },
    -  { 53905, true },
    -  { 53915, true },
    -  { 53924, true },
    -  { 53931, true },
    -  { 53940, true },
    -  { 53959, true },
    -  { 53973, true },
    +  { 53869, true },
    +  { 53882, true },
    +  { 53898, true },
    +  { 53921, true },
    +  { 53941, true },
    +  { 53953, true },
    +  { 53968, true },
       { 53987, true },
    -  { 54000, true },
    -  { 54016, true },
    -  { 54039, true },
    -  { 54059, true },
    -  { 54071, true },
    -  { 54086, true },
    -  { 54105, true },
    -  { 54119, true },
    -  { 54137, true },
    -  { 54155, true },
    -  { 54162, true },
    -  { 54174, true },
    +  { 54001, true },
    +  { 54019, true },
    +  { 54037, true },
    +  { 54044, true },
    +  { 54056, true },
    +  { 54073, true },
    +  { 54092, true },
    +  { 54102, true },
    +  { 54122, true },
    +  { 54135, true },
    +  { 54149, true },
    +  { 54166, true },
    +  { 54179, true },
       { 54191, true },
    -  { 54210, true },
    -  { 54220, true },
    -  { 54240, true },
    -  { 54253, true },
    -  { 54267, true },
    -  { 54284, true },
    -  { 54297, true },
    -  { 54309, true },
    -  { 54321, false },
    -  { 54336, true },
    -  { 54349, true },
    -  { 54363, true },
    -  { 54380, true },
    -  { 54392, true },
    -  { 54411, true },
    -  { 54423, true },
    -  { 54435, true },
    -  { 54446, true },
    -  { 54460, true },
    -  { 54483, false },
    -  { 54493, true },
    -  { 54504, true },
    -  { 54517, true },
    -  { 54528, true },
    -  { 54537, true },
    -  { 54547, true },
    -  { 54558, true },
    -  { 54570, true },
    -  { 54588, true },
    -  { 54605, true },
    -  { 54619, true },
    -  { 54642, true },
    -  { 54652, true },
    -  { 54667, true },
    -  { 54680, true },
    -  { 54688, true },
    -  { 54700, true },
    -  { 54714, true },
    -  { 54721, true },
    -  { 54734, true },
    -  { 54754, true },
    -  { 54772, true },
    -  { 54794, true },
    -  { 54807, true },
    -  { 54818, true },
    -  { 54832, true },
    -  { 54845, true },
    -  { 54864, true },
    -  { 54880, true },
    -  { 54899, true },
    -  { 54918, true },
    -  { 54933, true },
    -  { 54945, true },
    -  { 54961, true },
    -  { 54980, true },
    -  { 55001, true },
    -  { 55020, true },
    -  { 55038, true },
    -  { 55056, true },
    -  { 55065, true },
    -  { 55088, true },
    -  { 55102, true },
    -  { 55115, true },
    -  { 55127, true },
    -  { 55138, false },
    -  { 55148, true },
    -  { 55168, true },
    -  { 55181, true },
    -  { 55196, true },
    -  { 55205, true },
    -  { 55217, true },
    -  { 55227, true },
    -  { 55234, true },
    -  { 55243, true },
    -  { 55256, true },
    -  { 55269, true },
    -  { 55289, true },
    -  { 55305, true },
    -  { 55321, true },
    -  { 55335, true },
    -  { 55352, true },
    -  { 55362, true },
    -  { 55389, true },
    -  { 55424, true },
    -  { 55450, false },
    +  { 54203, false },
    +  { 54218, true },
    +  { 54232, true },
    +  { 54249, true },
    +  { 54261, true },
    +  { 54280, true },
    +  { 54292, true },
    +  { 54304, true },
    +  { 54314, true },
    +  { 54325, true },
    +  { 54339, true },
    +  { 54362, false },
    +  { 54372, true },
    +  { 54383, true },
    +  { 54396, true },
    +  { 54407, true },
    +  { 54416, true },
    +  { 54426, true },
    +  { 54437, true },
    +  { 54449, true },
    +  { 54467, true },
    +  { 54484, true },
    +  { 54498, true },
    +  { 54521, true },
    +  { 54531, true },
    +  { 54546, true },
    +  { 54559, true },
    +  { 54567, true },
    +  { 54579, true },
    +  { 54593, true },
    +  { 54615, true },
    +  { 54622, true },
    +  { 54635, true },
    +  { 54655, true },
    +  { 54673, true },
    +  { 54695, true },
    +  { 54708, true },
    +  { 54719, true },
    +  { 54733, true },
    +  { 54746, true },
    +  { 54765, true },
    +  { 54781, true },
    +  { 54800, true },
    +  { 54819, true },
    +  { 54834, true },
    +  { 54846, true },
    +  { 54862, true },
    +  { 54881, true },
    +  { 54902, true },
    +  { 54921, true },
    +  { 54939, true },
    +  { 54957, true },
    +  { 54966, true },
    +  { 54989, true },
    +  { 55003, true },
    +  { 55016, true },
    +  { 55028, true },
    +  { 55039, false },
    +  { 55049, true },
    +  { 55069, true },
    +  { 55082, true },
    +  { 55097, true },
    +  { 55106, true },
    +  { 55118, true },
    +  { 55128, true },
    +  { 55135, true },
    +  { 55144, true },
    +  { 55157, true },
    +  { 55170, true },
    +  { 55190, true },
    +  { 55206, true },
    +  { 55222, true },
    +  { 55236, true },
    +  { 55253, true },
    +  { 55263, true },
    +  { 55290, true },
    +  { 55325, true },
    +  { 55351, false },
    +  { 55364, true },
    +  { 55377, true },
    +  { 55396, true },
    +  { 55421, true },
    +  { 55436, false },
    +  { 55446, true },
       { 55463, true },
    -  { 55476, true },
    -  { 55495, true },
    -  { 55520, true },
    -  { 55535, false },
    -  { 55545, true },
    -  { 55562, true },
    -  { 55579, true },
    -  { 55589, true },
    -  { 55599, true },
    +  { 55480, true },
    +  { 55490, true },
    +  { 55500, true },
    +  { 55513, true },
    +  { 55528, true },
    +  { 55541, true },
    +  { 55556, true },
    +  { 55572, true },
    +  { 55585, true },
    +  { 55598, true },
       { 55612, true },
       { 55627, true },
    -  { 55640, true },
    -  { 55655, true },
    -  { 55671, true },
    -  { 55684, true },
    -  { 55697, true },
    -  { 55711, true },
    -  { 55726, true },
    -  { 55742, true },
    -  { 55753, true },
    -  { 55765, true },
    -  { 55778, true },
    +  { 55638, true },
    +  { 55650, true },
    +  { 55663, true },
    +  { 55682, true },
    +  { 55706, true },
    +  { 55728, true },
    +  { 55749, true },
    +  { 55774, true },
       { 55797, true },
    -  { 55821, true },
    -  { 55843, true },
    -  { 55864, true },
    -  { 55889, true },
    -  { 55912, true },
    -  { 55934, true },
    -  { 55954, true },
    -  { 55965, true },
    -  { 55985, true },
    -  { 56002, true },
    -  { 56023, true },
    +  { 55819, true },
    +  { 55839, true },
    +  { 55850, true },
    +  { 55870, true },
    +  { 55887, true },
    +  { 55908, true },
    +  { 55926, true },
    +  { 55948, true },
    +  { 55971, true },
    +  { 55987, true },
    +  { 56007, true },
    +  { 56020, true },
    +  { 56030, true },
       { 56041, true },
    -  { 56063, true },
    -  { 56086, true },
    -  { 56102, true },
    -  { 56122, true },
    -  { 56135, true },
    -  { 56145, true },
    -  { 56156, true },
    -  { 56175, true },
    -  { 56185, true },
    -  { 56195, true },
    -  { 56203, true },
    -  { 56216, true },
    -  { 56229, true },
    -  { 56238, true },
    -  { 56245, false },
    -  { 56261, true },
    -  { 56278, true },
    +  { 56060, true },
    +  { 56070, true },
    +  { 56080, true },
    +  { 56088, true },
    +  { 56101, true },
    +  { 56114, true },
    +  { 56123, true },
    +  { 56130, false },
    +  { 56146, true },
    +  { 56163, true },
    +  { 56177, true },
    +  { 56196, true },
    +  { 56208, true },
    +  { 56231, true },
    +  { 56247, true },
    +  { 56259, true },
    +  { 56275, true },
       { 56292, true },
    -  { 56311, true },
    -  { 56323, true },
    -  { 56346, true },
    -  { 56362, true },
    -  { 56374, true },
    -  { 56390, true },
    -  { 56407, true },
    -  { 56425, true },
    -  { 56446, true },
    +  { 56310, true },
    +  { 56331, true },
    +  { 56348, true },
    +  { 56365, true },
    +  { 56382, true },
    +  { 56399, true },
    +  { 56416, true },
    +  { 56433, true },
    +  { 56449, true },
       { 56463, true },
    -  { 56480, true },
    -  { 56497, true },
    -  { 56514, true },
    -  { 56531, true },
    -  { 56548, true },
    -  { 56564, true },
    -  { 56578, true },
    -  { 56603, true },
    -  { 56614, true },
    -  { 56630, true },
    -  { 56646, false },
    -  { 56659, true },
    -  { 56676, false },
    -  { 56692, true },
    -  { 56706, true },
    -  { 56716, true },
    +  { 56488, true },
    +  { 56499, true },
    +  { 56515, true },
    +  { 56531, false },
    +  { 56544, true },
    +  { 56561, false },
    +  { 56577, true },
    +  { 56591, true },
    +  { 56601, true },
    +  { 56612, true },
    +  { 56626, true },
    +  { 56640, true },
    +  { 56650, false },
    +  { 56660, false },
    +  { 56669, true },
    +  { 56688, true },
    +  { 56698, true },
    +  { 56707, false },
       { 56727, true },
    -  { 56741, true },
    -  { 56755, true },
    -  { 56765, false },
    -  { 56775, false },
    -  { 56784, true },
    +  { 56750, true },
    +  { 56767, true },
    +  { 56786, true },
       { 56803, true },
    -  { 56813, true },
    -  { 56822, false },
    -  { 56842, true },
    -  { 56865, true },
    -  { 56882, true },
    -  { 56901, true },
    -  { 56918, true },
    -  { 56929, false },
    -  { 56941, true },
    -  { 56952, true },
    -  { 56967, true },
    -  { 56977, true },
    -  { 56985, true },
    -  { 56999, true },
    -  { 57012, false },
    -  { 57025, true },
    -  { 57040, true },
    -  { 57054, true },
    -  { 57066, true },
    -  { 57080, true },
    -  { 57090, true },
    -  { 57106, true },
    +  { 56814, false },
    +  { 56826, true },
    +  { 56837, true },
    +  { 56852, true },
    +  { 56862, true },
    +  { 56870, true },
    +  { 56884, true },
    +  { 56897, false },
    +  { 56910, true },
    +  { 56925, true },
    +  { 56939, true },
    +  { 56951, true },
    +  { 56965, true },
    +  { 56975, true },
    +  { 56991, true },
    +  { 57007, true },
    +  { 57026, false },
    +  { 57055, true },
    +  { 57069, true },
    +  { 57083, true },
    +  { 57104, true },
       { 57122, true },
    -  { 57141, false },
    -  { 57170, true },
    -  { 57184, true },
    +  { 57137, true },
    +  { 57153, true },
    +  { 57166, true },
    +  { 57186, true },
       { 57198, true },
    -  { 57219, true },
    -  { 57237, true },
    -  { 57252, true },
    -  { 57268, true },
    -  { 57281, true },
    -  { 57301, true },
    -  { 57313, true },
    -  { 57325, true },
    -  { 57340, true },
    -  { 57364, true },
    -  { 57388, true },
    -  { 57398, true },
    -  { 57420, true },
    -  { 57452, true },
    -  { 57463, true },
    -  { 57475, true },
    -  { 57485, true },
    -  { 57500, true },
    -  { 57514, false },
    -  { 57534, true },
    -  { 57552, true },
    -  { 57561, true },
    -  { 57568, true },
    -  { 57579, true },
    -  { 57588, true },
    -  { 57601, true },
    -  { 57624, true },
    -  { 57639, false },
    -  { 57650, false },
    +  { 57210, true },
    +  { 57225, true },
    +  { 57249, true },
    +  { 57273, true },
    +  { 57283, true },
    +  { 57305, true },
    +  { 57337, true },
    +  { 57348, true },
    +  { 57360, true },
    +  { 57370, true },
    +  { 57385, true },
    +  { 57399, false },
    +  { 57419, true },
    +  { 57437, true },
    +  { 57446, true },
    +  { 57453, true },
    +  { 57464, true },
    +  { 57473, true },
    +  { 57486, true },
    +  { 57509, true },
    +  { 57524, false },
    +  { 57535, false },
    +  { 57547, false },
    +  { 57558, true },
    +  { 57584, false },
    +  { 57600, true },
    +  { 57610, true },
    +  { 57618, true },
    +  { 57627, true },
    +  { 57639, true },
    +  { 57650, true },
       { 57662, false },
    -  { 57673, true },
    -  { 57699, false },
    -  { 57715, true },
    -  { 57725, true },
    -  { 57733, true },
    -  { 57742, true },
    -  { 57754, true },
    -  { 57765, true },
    -  { 57777, false },
    -  { 57789, true },
    -  { 57802, true },
    -  { 57814, true },
    -  { 57831, true },
    -  { 57851, true },
    -  { 57862, true },
    -  { 57878, true },
    +  { 57674, true },
    +  { 57687, true },
    +  { 57699, true },
    +  { 57716, true },
    +  { 57736, true },
    +  { 57747, true },
    +  { 57763, true },
    +  { 57775, true },
    +  { 57784, true },
    +  { 57808, true },
    +  { 57821, true },
    +  { 57834, true },
    +  { 57848, true },
    +  { 57865, true },
    +  { 57880, true },
       { 57890, true },
    -  { 57899, true },
    -  { 57923, true },
    -  { 57936, true },
    -  { 57949, true },
    -  { 57963, true },
    -  { 57980, true },
    -  { 57995, true },
    -  { 58005, true },
    -  { 58017, true },
    -  { 58032, true },
    -  { 58040, true },
    +  { 57902, true },
    +  { 57917, true },
    +  { 57925, true },
    +  { 57937, true },
    +  { 57947, true },
    +  { 57966, true },
    +  { 57983, true },
    +  { 58000, true },
    +  { 58015, true },
    +  { 58027, true },
       { 58052, true },
    -  { 58062, true },
    -  { 58081, true },
    -  { 58098, true },
    -  { 58115, true },
    -  { 58130, true },
    -  { 58142, true },
    -  { 58167, true },
    -  { 58180, false },
    -  { 58192, true },
    -  { 58212, true },
    -  { 58225, true },
    -  { 58238, true },
    -  { 58250, true },
    +  { 58065, false },
    +  { 58077, true },
    +  { 58097, true },
    +  { 58110, true },
    +  { 58123, true },
    +  { 58135, true },
    +  { 58159, true },
    +  { 58172, true },
    +  { 58191, true },
    +  { 58203, true },
    +  { 58215, true },
    +  { 58239, true },
    +  { 58260, true },
       { 58274, true },
    -  { 58287, true },
    -  { 58306, true },
    -  { 58318, true },
    -  { 58330, true },
    +  { 58299, true },
    +  { 58313, true },
    +  { 58326, false },
    +  { 58342, true },
       { 58354, true },
    -  { 58375, true },
    -  { 58389, true },
    -  { 58414, true },
    -  { 58428, true },
    -  { 58441, false },
    -  { 58457, true },
    -  { 58469, true },
    -  { 58482, true },
    -  { 58494, true },
    -  { 58506, true },
    -  { 58517, true },
    -  { 58528, true },
    -  { 58540, true },
    -  { 58549, true },
    -  { 58563, true },
    -  { 58575, true },
    -  { 58591, true },
    -  { 58613, true },
    -  { 58623, false },
    -  { 58637, true },
    -  { 58647, true },
    -  { 58660, true },
    -  { 58673, true },
    +  { 58367, true },
    +  { 58379, true },
    +  { 58391, true },
    +  { 58402, true },
    +  { 58413, true },
    +  { 58425, true },
    +  { 58434, true },
    +  { 58448, true },
    +  { 58460, true },
    +  { 58476, true },
    +  { 58498, true },
    +  { 58508, false },
    +  { 58522, true },
    +  { 58532, true },
    +  { 58545, true },
    +  { 58558, true },
    +  { 58571, true },
    +  { 58579, false },
    +  { 58596, true },
    +  { 58610, true },
    +  { 58626, false },
    +  { 58645, true },
    +  { 58664, true },
    +  { 58674, true },
       { 58686, true },
    -  { 58694, false },
    -  { 58711, true },
    -  { 58725, true },
    -  { 58741, false },
    -  { 58760, true },
    -  { 58779, true },
    -  { 58789, true },
    -  { 58801, true },
    +  { 58700, true },
    +  { 58708, true },
    +  { 58727, false },
    +  { 58745, true },
    +  { 58754, true },
    +  { 58767, true },
    +  { 58782, true },
    +  { 58802, false },
       { 58815, true },
    -  { 58823, true },
    -  { 58842, false },
    -  { 58860, true },
    -  { 58869, true },
    +  { 58832, true },
    +  { 58845, true },
    +  { 58858, true },
       { 58882, true },
    -  { 58897, true },
    -  { 58917, false },
    -  { 58930, true },
    -  { 58947, true },
    -  { 58960, true },
    +  { 58909, true },
    +  { 58922, false },
    +  { 58936, true },
    +  { 58948, true },
    +  { 58961, false },
       { 58973, true },
    -  { 58997, true },
    -  { 59024, true },
    -  { 59037, false },
    -  { 59051, true },
    -  { 59063, true },
    -  { 59076, false },
    -  { 59088, true },
    -  { 59100, true },
    -  { 59115, true },
    -  { 59133, true },
    -  { 59146, true },
    -  { 59169, false },
    -  { 59180, true },
    -  { 59196, true },
    -  { 59214, true },
    -  { 59236, true },
    -  { 59252, true },
    -  { 59269, true },
    +  { 58985, true },
    +  { 59000, true },
    +  { 59018, true },
    +  { 59031, true },
    +  { 59054, false },
    +  { 59065, true },
    +  { 59081, true },
    +  { 59099, true },
    +  { 59121, true },
    +  { 59137, true },
    +  { 59154, true },
    +  { 59171, true },
    +  { 59189, true },
    +  { 59202, true },
    +  { 59219, true },
    +  { 59233, true },
    +  { 59249, true },
    +  { 59257, true },
    +  { 59276, true },
       { 59286, true },
    -  { 59304, true },
    -  { 59317, true },
    -  { 59334, true },
    -  { 59348, true },
    -  { 59364, true },
    -  { 59372, true },
    -  { 59391, true },
    -  { 59401, true },
    -  { 59409, true },
    -  { 59418, true },
    -  { 59433, true },
    -  { 59451, false },
    -  { 59462, true },
    -  { 59478, true },
    -  { 59492, true },
    -  { 59501, true },
    -  { 59517, true },
    -  { 59523, true },
    +  { 59294, true },
    +  { 59303, true },
    +  { 59318, true },
    +  { 59336, false },
    +  { 59347, true },
    +  { 59363, true },
    +  { 59377, true },
    +  { 59386, true },
    +  { 59402, true },
    +  { 59408, true },
    +  { 59420, true },
    +  { 59442, true },
    +  { 59456, true },
    +  { 59471, true },
    +  { 59482, true },
    +  { 59495, true },
    +  { 59511, false },
    +  { 59524, true },
       { 59535, true },
    -  { 59557, true },
    -  { 59571, true },
    -  { 59586, true },
    +  { 59543, true },
    +  { 59560, true },
    +  { 59569, true },
    +  { 59578, true },
       { 59597, true },
    -  { 59610, true },
    -  { 59626, false },
    -  { 59639, true },
    -  { 59650, true },
    -  { 59658, true },
    +  { 59608, true },
    +  { 59624, true },
    +  { 59645, true },
    +  { 59662, true },
       { 59675, true },
    -  { 59684, true },
    -  { 59693, true },
    -  { 59712, true },
    -  { 59723, true },
    -  { 59739, true },
    -  { 59760, true },
    -  { 59777, true },
    -  { 59790, true },
    -  { 59801, true },
    -  { 59818, true },
    -  { 59843, true },
    -  { 59862, true },
    -  { 59877, true },
    -  { 59889, true },
    -  { 59900, true },
    +  { 59686, true },
    +  { 59703, true },
    +  { 59728, true },
    +  { 59747, true },
    +  { 59762, true },
    +  { 59774, true },
    +  { 59785, true },
    +  { 59799, true },
    +  { 59816, true },
    +  { 59836, true },
    +  { 59845, true },
    +  { 59859, true },
    +  { 59870, true },
    +  { 59890, false },
       { 59914, true },
    -  { 59931, true },
    -  { 59951, true },
    -  { 59960, true },
    -  { 59974, true },
    -  { 59985, true },
    -  { 60005, false },
    -  { 60029, true },
    -  { 60047, true },
    -  { 60062, false },
    -  { 60070, true },
    -  { 60088, true },
    -  { 60106, true },
    -  { 60128, true },
    -  { 60150, true },
    -  { 60166, true },
    -  { 60178, true },
    -  { 60190, true },
    -  { 60204, true },
    -  { 60217, false },
    -  { 60234, true },
    -  { 60256, true },
    -  { 60276, true },
    -  { 60303, true },
    -  { 60322, true },
    -  { 60342, true },
    -  { 60351, false },
    -  { 60366, true },
    -  { 60381, true },
    -  { 60410, true },
    -  { 60432, true },
    -  { 60450, true },
    -  { 60464, true },
    -  { 60477, true },
    -  { 60490, true },
    -  { 60500, true },
    -  { 60518, true },
    -  { 60537, true },
    -  { 60555, true },
    -  { 60562, false },
    -  { 60582, true },
    -  { 60591, true },
    -  { 60606, true },
    -  { 60624, true },
    -  { 60636, true },
    -  { 60645, false },
    -  { 60655, true },
    -  { 60663, true },
    -  { 60684, true },
    -  { 60701, true },
    +  { 59932, true },
    +  { 59947, false },
    +  { 59955, true },
    +  { 59973, true },
    +  { 59991, true },
    +  { 60013, true },
    +  { 60035, true },
    +  { 60051, true },
    +  { 60063, true },
    +  { 60075, true },
    +  { 60089, true },
    +  { 60102, false },
    +  { 60119, true },
    +  { 60141, true },
    +  { 60161, true },
    +  { 60188, true },
    +  { 60207, true },
    +  { 60227, true },
    +  { 60236, false },
    +  { 60251, true },
    +  { 60266, true },
    +  { 60295, true },
    +  { 60317, true },
    +  { 60335, true },
    +  { 60349, true },
    +  { 60362, true },
    +  { 60372, true },
    +  { 60390, true },
    +  { 60409, true },
    +  { 60427, true },
    +  { 60434, false },
    +  { 60454, true },
    +  { 60463, true },
    +  { 60478, true },
    +  { 60496, true },
    +  { 60508, true },
    +  { 60517, false },
    +  { 60527, true },
    +  { 60535, true },
    +  { 60556, true },
    +  { 60573, true },
    +  { 60584, true },
    +  { 60594, true },
    +  { 60611, true },
    +  { 60633, true },
    +  { 60648, true },
    +  { 60665, true },
    +  { 60675, true },
    +  { 60688, true },
    +  { 60699, true },
       { 60712, true },
    -  { 60722, true },
    +  { 60728, true },
       { 60739, true },
    -  { 60761, true },
    -  { 60776, true },
    -  { 60793, true },
    -  { 60803, true },
    -  { 60816, true },
    -  { 60827, true },
    -  { 60840, true },
    -  { 60856, true },
    -  { 60867, true },
    -  { 60879, true },
    -  { 60901, true },
    -  { 60914, true },
    -  { 60925, true },
    +  { 60751, true },
    +  { 60773, true },
    +  { 60786, true },
    +  { 60797, true },
    +  { 60813, true },
    +  { 60829, true },
    +  { 60839, true },
    +  { 60851, true },
    +  { 60859, true },
    +  { 60878, true },
    +  { 60897, true },
    +  { 60910, true },
    +  { 60924, true },
       { 60941, true },
    -  { 60957, true },
    +  { 60953, true },
       { 60967, true },
    -  { 60979, true },
    -  { 60987, true },
    -  { 61006, true },
    -  { 61025, true },
    -  { 61038, true },
    -  { 61052, true },
    -  { 61069, true },
    -  { 61081, true },
    -  { 61095, true },
    -  { 61107, false },
    -  { 61121, true },
    -  { 61135, true },
    -  { 61157, true },
    -  { 61176, true },
    -  { 61189, true },
    +  { 60979, false },
    +  { 60993, true },
    +  { 61007, true },
    +  { 61029, true },
    +  { 61048, true },
    +  { 61061, true },
    +  { 61076, true },
    +  { 61091, true },
    +  { 61110, true },
    +  { 61123, true },
    +  { 61148, true },
    +  { 61171, true },
    +  { 61188, true },
       { 61204, true },
    -  { 61219, true },
    -  { 61238, true },
    -  { 61251, true },
    -  { 61276, true },
    -  { 61299, true },
    -  { 61316, true },
    -  { 61332, true },
    -  { 61345, true },
    -  { 61357, true },
    -  { 61368, true },
    -  { 61382, true },
    -  { 61395, true },
    -  { 61413, true },
    -  { 61432, true },
    +  { 61217, true },
    +  { 61229, true },
    +  { 61240, true },
    +  { 61254, true },
    +  { 61267, true },
    +  { 61285, true },
    +  { 61304, true },
    +  { 61318, true },
    +  { 61331, true },
    +  { 61347, true },
    +  { 61359, true },
    +  { 61375, true },
    +  { 61388, true },
    +  { 61404, true },
    +  { 61416, true },
    +  { 61431, true },
       { 61446, true },
    -  { 61459, true },
    -  { 61475, true },
    -  { 61487, true },
    -  { 61503, true },
    -  { 61516, true },
    -  { 61532, true },
    -  { 61544, true },
    -  { 61559, true },
    -  { 61574, true },
    -  { 61588, true },
    -  { 61601, true },
    -  { 61613, true },
    -  { 61623, true },
    -  { 61639, true },
    -  { 61647, true },
    -  { 61655, true },
    -  { 61668, true },
    -  { 61679, true },
    -  { 61689, true },
    +  { 61460, true },
    +  { 61473, true },
    +  { 61485, true },
    +  { 61495, true },
    +  { 61511, true },
    +  { 61519, true },
    +  { 61527, true },
    +  { 61540, true },
    +  { 61551, true },
    +  { 61561, true },
    +  { 61578, true },
    +  { 61596, true },
    +  { 61609, true },
    +  { 61622, true },
    +  { 61631, true },
    +  { 61649, true },
    +  { 61663, true },
    +  { 61681, true },
    +  { 61697, true },
       { 61706, true },
    -  { 61724, true },
    -  { 61737, true },
    +  { 61715, true },
    +  { 61730, true },
    +  { 61740, true },
       { 61750, true },
    -  { 61759, true },
    -  { 61777, true },
    -  { 61791, true },
    -  { 61809, true },
    -  { 61825, true },
    -  { 61834, true },
    -  { 61843, true },
    -  { 61858, true },
    -  { 61868, true },
    -  { 61878, true },
    -  { 61892, true },
    +  { 61764, true },
    +  { 61776, true },
    +  { 61793, true },
    +  { 61807, true },
    +  { 61815, true },
    +  { 61823, true },
    +  { 61832, true },
    +  { 61844, true },
    +  { 61857, false },
    +  { 61865, true },
    +  { 61891, true },
       { 61904, true },
    -  { 61921, true },
    -  { 61935, true },
    +  { 61918, true },
    +  { 61928, true },
       { 61943, true },
    -  { 61951, true },
    -  { 61960, true },
    -  { 61972, true },
    -  { 61985, false },
    +  { 61952, true },
    +  { 61963, true },
    +  { 61981, true },
       { 61993, true },
    -  { 62019, true },
    -  { 62032, true },
    -  { 62046, true },
    -  { 62056, true },
    -  { 62071, true },
    -  { 62080, true },
    -  { 62091, true },
    -  { 62109, true },
    -  { 62121, true },
    -  { 62134, true },
    -  { 62142, false },
    -  { 62156, true },
    -  { 62177, true },
    -  { 62202, true },
    -  { 62213, true },
    -  { 62227, true },
    -  { 62245, true },
    -  { 62256, true },
    -  { 62270, true },
    -  { 62283, true },
    -  { 62294, true },
    -  { 62313, true },
    -  { 62327, true },
    -  { 62336, true },
    -  { 62350, true },
    -  { 62361, true },
    -  { 62370, true },
    -  { 62388, true },
    -  { 62407, true },
    -  { 62427, true },
    -  { 62437, true },
    -  { 62450, true },
    -  { 62461, true },
    -  { 62470, true },
    -  { 62490, true },
    -  { 62504, true },
    -  { 62512, true },
    -  { 62519, true },
    -  { 62532, true },
    -  { 62543, true },
    -  { 62557, true },
    -  { 62571, true },
    -  { 62585, true },
    +  { 62006, true },
    +  { 62014, false },
    +  { 62028, true },
    +  { 62049, true },
    +  { 62074, true },
    +  { 62085, true },
    +  { 62099, true },
    +  { 62117, true },
    +  { 62128, true },
    +  { 62142, true },
    +  { 62155, true },
    +  { 62166, true },
    +  { 62185, true },
    +  { 62199, true },
    +  { 62208, true },
    +  { 62222, true },
    +  { 62233, true },
    +  { 62242, true },
    +  { 62260, true },
    +  { 62279, true },
    +  { 62299, true },
    +  { 62309, true },
    +  { 62322, true },
    +  { 62333, true },
    +  { 62342, true },
    +  { 62362, true },
    +  { 62376, true },
    +  { 62384, true },
    +  { 62391, true },
    +  { 62404, true },
    +  { 62415, true },
    +  { 62429, true },
    +  { 62443, true },
    +  { 62457, true },
    +  { 62467, true },
    +  { 62477, true },
    +  { 62484, true },
    +  { 62494, true },
    +  { 62503, true },
    +  { 62518, true },
    +  { 62525, true },
    +  { 62535, true },
    +  { 62547, true },
    +  { 62558, true },
    +  { 62565, true },
    +  { 62574, true },
    +  { 62586, true },
       { 62595, true },
    -  { 62605, true },
    -  { 62612, true },
    +  { 62609, true },
       { 62622, true },
       { 62631, true },
    -  { 62646, true },
    -  { 62653, true },
    -  { 62663, true },
    -  { 62675, true },
    -  { 62686, true },
    -  { 62693, true },
    -  { 62702, true },
    -  { 62714, true },
    -  { 62723, true },
    -  { 62737, true },
    -  { 62750, true },
    -  { 62759, true },
    -  { 62771, false },
    -  { 62784, true },
    -  { 62806, true },
    -  { 62829, true },
    -  { 62843, true },
    -  { 62858, true },
    -  { 62873, true },
    -  { 62889, true },
    -  { 62907, true },
    -  { 62919, true },
    -  { 62929, true },
    -  { 62943, true },
    -  { 62953, true },
    -  { 62964, true },
    -  { 62982, true },
    -  { 62994, true },
    -  { 63005, true },
    -  { 63021, true },
    -  { 63038, true },
    -  { 63053, true },
    -  { 63069, true },
    +  { 62643, false },
    +  { 62656, true },
    +  { 62678, true },
    +  { 62701, true },
    +  { 62715, true },
    +  { 62730, true },
    +  { 62745, true },
    +  { 62761, true },
    +  { 62779, true },
    +  { 62791, true },
    +  { 62801, true },
    +  { 62811, true },
    +  { 62822, true },
    +  { 62840, true },
    +  { 62852, true },
    +  { 62863, true },
    +  { 62879, true },
    +  { 62896, true },
    +  { 62911, true },
    +  { 62927, true },
    +  { 62942, true },
    +  { 62958, true },
    +  { 62966, true },
    +  { 62975, true },
    +  { 62992, true },
    +  { 63009, true },
    +  { 63027, true },
    +  { 63039, true },
    +  { 63056, true },
    +  { 63070, true },
       { 63084, true },
    -  { 63100, true },
    -  { 63108, true },
    -  { 63117, true },
    -  { 63134, true },
    -  { 63151, true },
    -  { 63169, true },
    -  { 63181, true },
    -  { 63198, true },
    -  { 63212, true },
    -  { 63226, true },
    -  { 63241, true },
    -  { 63252, true },
    -  { 63266, true },
    +  { 63099, true },
    +  { 63110, true },
    +  { 63124, true },
    +  { 63138, true },
    +  { 63152, true },
    +  { 63167, true },
    +  { 63182, true },
    +  { 63197, true },
    +  { 63219, true },
    +  { 63237, true },
    +  { 63258, true },
       { 63280, true },
    -  { 63294, true },
    -  { 63309, true },
    -  { 63324, true },
    -  { 63339, true },
    -  { 63361, true },
    -  { 63379, true },
    -  { 63400, true },
    -  { 63422, true },
    -  { 63434, true },
    -  { 63447, true },
    -  { 63462, true },
    -  { 63478, true },
    -  { 63492, true },
    +  { 63292, true },
    +  { 63305, true },
    +  { 63320, true },
    +  { 63336, true },
    +  { 63350, true },
    +  { 63363, true },
    +  { 63381, false },
    +  { 63402, true },
    +  { 63420, true },
    +  { 63436, true },
    +  { 63452, true },
    +  { 63465, true },
    +  { 63480, true },
    +  { 63494, true },
       { 63505, true },
    -  { 63523, false },
    -  { 63544, true },
    -  { 63562, true },
    -  { 63578, true },
    -  { 63594, true },
    -  { 63607, true },
    -  { 63622, true },
    -  { 63636, true },
    -  { 63647, true },
    -  { 63672, true },
    -  { 63688, true },
    -  { 63705, true },
    -  { 63717, true },
    -  { 63729, true },
    -  { 63742, true },
    -  { 63753, true },
    -  { 63768, true },
    -  { 63780, true },
    -  { 63791, true },
    -  { 63805, true },
    -  { 63815, true },
    -  { 63824, true },
    -  { 63831, true },
    -  { 63840, true },
    -  { 63857, true },
    -  { 63869, true },
    -  { 63878, true },
    -  { 63889, true },
    -  { 63901, true },
    -  { 63908, false },
    -  { 63915, false },
    -  { 63924, true },
    -  { 63936, true },
    -  { 63948, true },
    -  { 63958, true },
    -  { 63967, true },
    -  { 63976, true },
    -  { 63983, true },
    -  { 63995, true },
    -  { 64007, true },
    -  { 64015, true },
    -  { 64027, true },
    -  { 64040, true },
    -  { 64054, true },
    -  { 64069, true },
    -  { 64082, true },
    -  { 64094, true },
    -  { 64105, true },
    -  { 64120, true },
    -  { 64130, true },
    -  { 64138, true },
    -  { 64150, true },
    +  { 63530, true },
    +  { 63546, true },
    +  { 63563, true },
    +  { 63575, true },
    +  { 63587, true },
    +  { 63600, true },
    +  { 63611, true },
    +  { 63626, true },
    +  { 63638, true },
    +  { 63649, true },
    +  { 63663, true },
    +  { 63673, true },
    +  { 63682, true },
    +  { 63689, true },
    +  { 63698, true },
    +  { 63715, true },
    +  { 63727, true },
    +  { 63736, true },
    +  { 63747, true },
    +  { 63759, true },
    +  { 63766, false },
    +  { 63773, false },
    +  { 63782, true },
    +  { 63794, true },
    +  { 63806, true },
    +  { 63816, true },
    +  { 63825, true },
    +  { 63834, true },
    +  { 63841, true },
    +  { 63853, true },
    +  { 63865, true },
    +  { 63873, true },
    +  { 63885, true },
    +  { 63898, true },
    +  { 63912, true },
    +  { 63927, true },
    +  { 63940, true },
    +  { 63952, true },
    +  { 63963, true },
    +  { 63978, true },
    +  { 63988, true },
    +  { 63996, true },
    +  { 64008, true },
    +  { 64019, true },
    +  { 64031, false },
    +  { 64049, true },
    +  { 64067, true },
    +  { 64089, true },
    +  { 64111, true },
    +  { 64122, true },
    +  { 64134, true },
    +  { 64145, true },
       { 64161, true },
    -  { 64173, false },
    -  { 64191, true },
    -  { 64209, true },
    +  { 64184, true },
    +  { 64202, true },
    +  { 64213, true },
       { 64231, true },
    -  { 64253, true },
    -  { 64264, true },
    -  { 64276, true },
    -  { 64287, true },
    -  { 64303, true },
    -  { 64326, true },
    -  { 64344, true },
    -  { 64355, true },
    -  { 64373, true },
    -  { 64400, true },
    -  { 64412, true },
    -  { 64430, true },
    -  { 64444, true },
    -  { 64460, true },
    -  { 64476, true },
    -  { 64490, true },
    -  { 64504, true },
    -  { 64518, true },
    -  { 64542, true },
    -  { 64570, false },
    -  { 64581, true },
    -  { 64599, true },
    -  { 64617, true },
    -  { 64641, true },
    -  { 64662, true },
    -  { 64683, true },
    -  { 64704, true },
    -  { 64718, true },
    -  { 64731, true },
    -  { 64750, true },
    -  { 64768, true },
    -  { 64778, true },
    -  { 64796, true },
    -  { 64814, true },
    -  { 64835, true },
    -  { 64848, true },
    -  { 64868, true },
    -  { 64878, true },
    -  { 64894, true },
    +  { 64258, true },
    +  { 64270, true },
    +  { 64288, true },
    +  { 64302, true },
    +  { 64318, true },
    +  { 64334, true },
    +  { 64347, true },
    +  { 64361, true },
    +  { 64375, true },
    +  { 64389, true },
    +  { 64413, true },
    +  { 64441, false },
    +  { 64452, true },
    +  { 64470, true },
    +  { 64488, true },
    +  { 64512, true },
    +  { 64533, true },
    +  { 64554, true },
    +  { 64575, true },
    +  { 64589, true },
    +  { 64602, true },
    +  { 64621, true },
    +  { 64639, true },
    +  { 64649, true },
    +  { 64667, true },
    +  { 64685, true },
    +  { 64706, true },
    +  { 64719, true },
    +  { 64739, true },
    +  { 64749, true },
    +  { 64765, true },
    +  { 64779, true },
    +  { 64795, true },
    +  { 64806, true },
    +  { 64816, true },
    +  { 64831, true },
    +  { 64841, true },
    +  { 64858, true },
    +  { 64872, false },
    +  { 64885, true },
    +  { 64897, true },
       { 64908, true },
    -  { 64924, true },
    +  { 64925, true },
       { 64935, true },
    -  { 64945, true },
    -  { 64960, true },
    -  { 64970, true },
    -  { 64987, true },
    -  { 65001, false },
    -  { 65014, true },
    -  { 65026, true },
    -  { 65037, true },
    -  { 65054, true },
    -  { 65064, true },
    -  { 65078, true },
    -  { 65097, true },
    -  { 65115, true },
    +  { 64949, true },
    +  { 64968, true },
    +  { 64986, true },
    +  { 64997, true },
    +  { 65008, true },
    +  { 65019, true },
    +  { 65030, true },
    +  { 65041, true },
    +  { 65052, true },
    +  { 65072, true },
    +  { 65085, true },
    +  { 65103, true },
    +  { 65116, true },
       { 65126, true },
    -  { 65137, true },
    -  { 65148, true },
    -  { 65159, true },
    -  { 65170, true },
    -  { 65181, true },
    -  { 65201, true },
    -  { 65214, true },
    -  { 65232, true },
    -  { 65245, true },
    -  { 65255, true },
    -  { 65270, true },
    -  { 65284, true },
    -  { 65302, true },
    -  { 65319, true },
    -  { 65336, true },
    -  { 65349, true },
    -  { 65363, true },
    -  { 65372, true },
    -  { 65391, true },
    -  { 65402, true },
    -  { 65419, true },
    -  { 65428, true },
    -  { 65442, true },
    +  { 65141, true },
    +  { 65155, true },
    +  { 65173, true },
    +  { 65190, true },
    +  { 65207, true },
    +  { 65220, true },
    +  { 65234, true },
    +  { 65243, true },
    +  { 65262, true },
    +  { 65273, true },
    +  { 65290, true },
    +  { 65299, true },
    +  { 65313, true },
    +  { 65321, true },
    +  { 65329, true },
    +  { 65341, true },
    +  { 65348, true },
    +  { 65357, true },
    +  { 65376, true },
    +  { 65397, true },
    +  { 65417, true },
    +  { 65434, true },
       { 65450, true },
    -  { 65458, true },
    -  { 65465, true },
    -  { 65477, true },
    -  { 65484, true },
    -  { 65493, true },
    -  { 65512, true },
    -  { 65527, true },
    -  { 65548, true },
    -  { 65568, true },
    -  { 65585, true },
    -  { 65601, true },
    -  { 65621, true },
    -  { 65640, true },
    +  { 65470, true },
    +  { 65489, true },
    +  { 65510, true },
    +  { 65523, true },
    +  { 65538, true },
    +  { 65554, false },
    +  { 65568, false },
    +  { 65581, false },
    +  { 65588, true },
    +  { 65596, true },
    +  { 65608, true },
    +  { 65618, true },
    +  { 65633, true },
    +  { 65646, true },
       { 65661, true },
    -  { 65674, true },
    -  { 65689, true },
    -  { 65705, false },
    -  { 65719, false },
    -  { 65732, false },
    -  { 65739, true },
    -  { 65747, true },
    -  { 65759, true },
    -  { 65769, true },
    -  { 65784, true },
    -  { 65797, true },
    -  { 65812, true },
    -  { 65834, true },
    -  { 65846, true },
    -  { 65857, true },
    -  { 65886, true },
    -  { 65902, true },
    -  { 65918, true },
    -  { 65929, true },
    -  { 65943, true },
    -  { 65953, true },
    -  { 65960, true },
    -  { 65971, true },
    -  { 65983, false },
    -  { 66003, false },
    -  { 66019, true },
    -  { 66030, true },
    -  { 66045, true },
    -  { 66058, true },
    -  { 66071, true },
    -  { 66083, true },
    -  { 66100, false },
    -  { 66110, true },
    -  { 66121, true },
    +  { 65683, true },
    +  { 65695, true },
    +  { 65706, true },
    +  { 65735, true },
    +  { 65751, true },
    +  { 65767, true },
    +  { 65778, true },
    +  { 65792, true },
    +  { 65802, true },
    +  { 65809, true },
    +  { 65820, true },
    +  { 65832, false },
    +  { 65852, false },
    +  { 65868, true },
    +  { 65879, true },
    +  { 65894, true },
    +  { 65907, true },
    +  { 65920, true },
    +  { 65932, true },
    +  { 65949, false },
    +  { 65959, true },
    +  { 65970, true },
    +  { 65985, true },
    +  { 66001, true },
    +  { 66020, true },
    +  { 66034, true },
    +  { 66051, true },
    +  { 66077, true },
    +  { 66092, true },
    +  { 66107, true },
    +  { 66122, true },
       { 66136, true },
    -  { 66152, true },
    -  { 66171, true },
    -  { 66185, true },
    -  { 66202, true },
    -  { 66228, true },
    -  { 66243, true },
    -  { 66258, true },
    -  { 66273, true },
    -  { 66287, true },
    -  { 66306, true },
    -  { 66331, true },
    -  { 66345, true },
    -  { 66361, true },
    -  { 66382, true },
    -  { 66416, true },
    -  { 66440, true },
    -  { 66469, false },
    -  { 66484, true },
    -  { 66500, true },
    -  { 66511, true },
    -  { 66536, true },
    -  { 66548, true },
    -  { 66562, true },
    -  { 66571, true },
    -  { 66591, false },
    -  { 66601, true },
    -  { 66616, true },
    -  { 66624, true },
    -  { 66633, true },
    -  { 66641, true },
    -  { 66657, true },
    -  { 66679, true },
    -  { 66691, true },
    -  { 66703, true },
    -  { 66714, true },
    -  { 66724, false },
    -  { 66736, true },
    +  { 66155, true },
    +  { 66180, true },
    +  { 66194, true },
    +  { 66210, true },
    +  { 66231, true },
    +  { 66265, true },
    +  { 66289, true },
    +  { 66318, false },
    +  { 66333, true },
    +  { 66349, true },
    +  { 66360, true },
    +  { 66385, true },
    +  { 66397, true },
    +  { 66411, true },
    +  { 66420, true },
    +  { 66440, false },
    +  { 66450, true },
    +  { 66465, true },
    +  { 66473, true },
    +  { 66482, true },
    +  { 66490, true },
    +  { 66506, true },
    +  { 66528, true },
    +  { 66540, true },
    +  { 66552, true },
    +  { 66563, true },
    +  { 66573, false },
    +  { 66585, true },
    +  { 66594, true },
    +  { 66610, true },
    +  { 66626, true },
    +  { 66640, true },
    +  { 66655, true },
    +  { 66669, true },
    +  { 66684, true },
    +  { 66699, true },
    +  { 66710, false },
    +  { 66722, true },
    +  { 66731, true },
       { 66745, true },
    -  { 66761, true },
    -  { 66777, true },
    -  { 66791, true },
    -  { 66806, true },
    -  { 66820, true },
    -  { 66835, true },
    -  { 66850, true },
    -  { 66861, false },
    -  { 66873, true },
    -  { 66882, true },
    +  { 66756, true },
    +  { 66766, true },
    +  { 66783, true },
    +  { 66801, true },
    +  { 66811, true },
    +  { 66834, true },
    +  { 66848, true },
    +  { 66864, true },
    +  { 66877, true },
       { 66896, true },
    -  { 66907, true },
    -  { 66917, true },
    -  { 66934, true },
    -  { 66952, true },
    -  { 66962, true },
    -  { 66985, true },
    -  { 66999, true },
    -  { 67015, true },
    -  { 67028, true },
    -  { 67047, true },
    -  { 67060, true },
    -  { 67077, true },
    -  { 67095, true },
    -  { 67108, true },
    +  { 66909, true },
    +  { 66926, true },
    +  { 66944, true },
    +  { 66957, true },
    +  { 66971, true },
    +  { 66981, true },
    +  { 66990, true },
    +  { 67006, true },
    +  { 67013, true },
    +  { 67034, false },
    +  { 67049, true },
    +  { 67064, true },
    +  { 67081, true },
    +  { 67092, true },
    +  { 67101, true },
    +  { 67110, true },
       { 67122, true },
    -  { 67132, true },
    -  { 67141, true },
    -  { 67157, true },
    -  { 67164, true },
    -  { 67185, false },
    +  { 67140, true },
    +  { 67150, true },
    +  { 67163, true },
    +  { 67174, true },
    +  { 67189, true },
       { 67200, true },
    -  { 67215, true },
    -  { 67232, true },
    -  { 67241, true },
    -  { 67250, true },
    -  { 67262, true },
    -  { 67280, true },
    -  { 67290, true },
    +  { 67216, true },
    +  { 67226, true },
    +  { 67242, true },
    +  { 67264, true },
    +  { 67276, true },
    +  { 67289, true },
       { 67303, true },
    -  { 67314, true },
    -  { 67329, true },
    -  { 67340, true },
    -  { 67356, true },
    -  { 67366, true },
    -  { 67382, true },
    -  { 67404, true },
    -  { 67416, true },
    -  { 67429, true },
    -  { 67443, true },
    -  { 67456, true },
    -  { 67471, true },
    -  { 67487, true },
    -  { 67498, false },
    -  { 67511, true },
    -  { 67523, false },
    -  { 67536, true },
    -  { 67548, true },
    -  { 67565, true },
    -  { 67572, true },
    -  { 67588, true },
    -  { 67600, true },
    -  { 67613, true },
    -  { 67624, true },
    -  { 67644, false },
    -  { 67652, true },
    -  { 67664, true },
    -  { 67675, true },
    -  { 67694, false },
    -  { 67714, true },
    +  { 67316, true },
    +  { 67331, true },
    +  { 67347, true },
    +  { 67358, false },
    +  { 67371, true },
    +  { 67383, false },
    +  { 67396, true },
    +  { 67408, true },
    +  { 67425, true },
    +  { 67432, true },
    +  { 67448, true },
    +  { 67460, true },
    +  { 67473, true },
    +  { 67484, true },
    +  { 67504, false },
    +  { 67512, true },
    +  { 67524, true },
    +  { 67535, true },
    +  { 67554, false },
    +  { 67574, true },
    +  { 67583, true },
    +  { 67594, true },
    +  { 67625, true },
    +  { 67639, true },
    +  { 67653, true },
    +  { 67673, true },
    +  { 67692, true },
    +  { 67708, true },
       { 67723, true },
    -  { 67734, true },
    -  { 67765, true },
    -  { 67779, true },
    -  { 67793, true },
    -  { 67813, true },
    -  { 67832, true },
    -  { 67848, true },
    -  { 67863, true },
    -  { 67877, true },
    -  { 67899, true },
    -  { 67911, true },
    -  { 67923, true },
    -  { 67939, true },
    -  { 67950, true },
    -  { 67975, true },
    -  { 67991, true },
    +  { 67737, true },
    +  { 67759, true },
    +  { 67771, true },
    +  { 67783, true },
    +  { 67799, true },
    +  { 67810, true },
    +  { 67835, true },
    +  { 67851, true },
    +  { 67867, true },
    +  { 67883, true },
    +  { 67902, true },
    +  { 67926, true },
    +  { 67942, true },
    +  { 67958, true },
    +  { 67968, true },
    +  { 67980, true },
    +  { 67992, true },
       { 68007, true },
    -  { 68023, true },
    -  { 68042, true },
    -  { 68066, true },
    -  { 68082, true },
    -  { 68098, true },
    -  { 68108, true },
    -  { 68120, true },
    -  { 68132, true },
    -  { 68147, true },
    -  { 68167, true },
    -  { 68187, true },
    -  { 68208, false },
    -  { 68224, true },
    -  { 68242, true },
    -  { 68253, true },
    -  { 68268, true },
    -  { 68280, false },
    -  { 68288, true },
    -  { 68302, true },
    -  { 68316, true },
    -  { 68328, true },
    -  { 68342, true },
    -  { 68354, true },
    -  { 68368, true },
    -  { 68384, true },
    -  { 68404, true },
    -  { 68435, true },
    -  { 68466, true },
    -  { 68488, true },
    -  { 68506, true },
    +  { 68027, true },
    +  { 68047, true },
    +  { 68068, false },
    +  { 68084, true },
    +  { 68102, true },
    +  { 68113, true },
    +  { 68128, true },
    +  { 68140, false },
    +  { 68148, true },
    +  { 68162, true },
    +  { 68176, true },
    +  { 68188, true },
    +  { 68202, true },
    +  { 68214, true },
    +  { 68228, true },
    +  { 68244, true },
    +  { 68264, true },
    +  { 68295, true },
    +  { 68326, true },
    +  { 68348, true },
    +  { 68366, true },
    +  { 68380, true },
    +  { 68402, true },
    +  { 68417, true },
    +  { 68436, true },
    +  { 68445, true },
    +  { 68460, true },
    +  { 68475, true },
    +  { 68490, true },
    +  { 68507, true },
       { 68520, true },
    -  { 68542, true },
    -  { 68557, true },
    -  { 68576, true },
    -  { 68585, true },
    -  { 68600, true },
    -  { 68615, true },
    -  { 68630, true },
    -  { 68647, true },
    -  { 68660, true },
    -  { 68672, true },
    -  { 68685, true },
    -  { 68695, true },
    -  { 68705, true },
    -  { 68728, true },
    -  { 68739, true },
    -  { 68756, true },
    -  { 68771, true },
    -  { 68778, true },
    +  { 68532, true },
    +  { 68545, true },
    +  { 68555, true },
    +  { 68565, true },
    +  { 68588, true },
    +  { 68599, true },
    +  { 68616, true },
    +  { 68631, true },
    +  { 68638, true },
    +  { 68650, true },
    +  { 68663, true },
    +  { 68680, true },
    +  { 68690, true },
    +  { 68699, true },
    +  { 68718, true },
    +  { 68736, true },
    +  { 68757, true },
    +  { 68777, true },
       { 68790, true },
    -  { 68803, true },
    -  { 68820, true },
    -  { 68830, true },
    -  { 68839, true },
    -  { 68858, true },
    -  { 68876, true },
    -  { 68897, true },
    -  { 68917, true },
    +  { 68812, true },
    +  { 68824, true },
    +  { 68840, true },
    +  { 68850, true },
    +  { 68863, true },
    +  { 68877, true },
    +  { 68899, true },
    +  { 68916, true },
       { 68930, true },
    -  { 68952, true },
    -  { 68964, true },
    -  { 68980, true },
    -  { 68990, true },
    -  { 69003, true },
    -  { 69017, true },
    -  { 69039, true },
    -  { 69056, true },
    -  { 69070, true },
    -  { 69078, true },
    -  { 69090, true },
    -  { 69105, true },
    -  { 69115, true },
    -  { 69126, true },
    -  { 69138, true },
    -  { 69151, true },
    -  { 69162, true },
    +  { 68938, true },
    +  { 68950, true },
    +  { 68965, true },
    +  { 68975, true },
    +  { 68986, true },
    +  { 68998, true },
    +  { 69011, true },
    +  { 69022, true },
    +  { 69031, true },
    +  { 69041, true },
    +  { 69063, true },
    +  { 69081, true },
    +  { 69092, true },
    +  { 69107, true },
    +  { 69120, true },
    +  { 69134, true },
    +  { 69149, true },
    +  { 69161, true },
       { 69171, true },
    -  { 69181, true },
    -  { 69203, true },
    -  { 69221, true },
    -  { 69232, true },
    -  { 69247, true },
    -  { 69260, true },
    -  { 69274, true },
    -  { 69289, true },
    +  { 69189, true },
    +  { 69200, true },
    +  { 69208, true },
    +  { 69222, true },
    +  { 69237, true },
    +  { 69250, true },
    +  { 69261, true },
    +  { 69272, false },
    +  { 69288, true },
       { 69301, true },
    -  { 69319, true },
    -  { 69330, true },
    -  { 69338, true },
    -  { 69352, true },
    -  { 69367, true },
    -  { 69380, true },
    -  { 69391, true },
    -  { 69402, false },
    -  { 69418, true },
    -  { 69431, true },
    -  { 69452, true },
    -  { 69467, true },
    -  { 69478, true },
    -  { 69494, true },
    -  { 69515, true },
    -  { 69527, true },
    -  { 69536, true },
    -  { 69554, true },
    -  { 69563, true },
    -  { 69574, false },
    -  { 69592, true },
    -  { 69611, true },
    -  { 69630, true },
    -  { 69644, true },
    -  { 69664, true },
    -  { 69677, true },
    -  { 69689, true },
    -  { 69708, true },
    -  { 69720, true },
    -  { 69733, true },
    -  { 69748, true },
    +  { 69322, true },
    +  { 69337, true },
    +  { 69348, true },
    +  { 69364, true },
    +  { 69385, true },
    +  { 69397, true },
    +  { 69406, true },
    +  { 69424, true },
    +  { 69433, true },
    +  { 69444, false },
    +  { 69462, true },
    +  { 69481, true },
    +  { 69500, true },
    +  { 69514, true },
    +  { 69534, true },
    +  { 69547, true },
    +  { 69559, true },
    +  { 69578, true },
    +  { 69590, true },
    +  { 69603, true },
    +  { 69618, true },
    +  { 69632, true },
    +  { 69642, true },
    +  { 69652, true },
    +  { 69662, true },
    +  { 69674, true },
    +  { 69683, true },
    +  { 69698, true },
    +  { 69713, true },
    +  { 69726, true },
    +  { 69735, true },
       { 69762, true },
    -  { 69772, true },
    -  { 69782, true },
    -  { 69792, true },
    -  { 69804, true },
    -  { 69813, true },
    -  { 69828, true },
    -  { 69843, true },
    -  { 69856, true },
    -  { 69865, true },
    -  { 69892, true },
    +  { 69770, true },
    +  { 69791, true },
    +  { 69805, true },
    +  { 69815, true },
    +  { 69823, true },
    +  { 69832, true },
    +  { 69841, true },
    +  { 69854, true },
    +  { 69871, true },
    +  { 69879, true },
       { 69900, true },
    -  { 69921, true },
    -  { 69935, true },
    -  { 69945, true },
    -  { 69953, true },
    -  { 69962, true },
    -  { 69971, true },
    -  { 69984, true },
    -  { 70001, true },
    -  { 70009, true },
    +  { 69919, true },
    +  { 69931, true },
    +  { 69949, true },
    +  { 69961, true },
    +  { 69972, true },
    +  { 69981, true },
    +  { 69990, true },
    +  { 69997, true },
    +  { 70005, true },
    +  { 70019, true },
       { 70030, true },
    -  { 70049, true },
    -  { 70061, true },
    -  { 70079, true },
    -  { 70091, true },
    -  { 70102, true },
    -  { 70111, true },
    -  { 70120, true },
    -  { 70127, true },
    -  { 70135, true },
    +  { 70046, true },
    +  { 70057, true },
    +  { 70072, true },
    +  { 70083, true },
    +  { 70096, false },
    +  { 70106, true },
    +  { 70114, true },
    +  { 70134, true },
       { 70149, true },
    -  { 70160, true },
    -  { 70176, true },
    -  { 70187, true },
    +  { 70162, true },
    +  { 70174, true },
    +  { 70189, true },
       { 70202, true },
    -  { 70213, true },
    -  { 70226, false },
    -  { 70236, true },
    -  { 70244, true },
    -  { 70264, true },
    -  { 70279, true },
    -  { 70292, true },
    -  { 70304, true },
    -  { 70319, true },
    -  { 70332, true },
    -  { 70359, true },
    -  { 70373, true },
    -  { 70388, true },
    -  { 70400, true },
    -  { 70410, true },
    -  { 70423, true },
    -  { 70440, true },
    -  { 70453, true },
    -  { 70463, true },
    -  { 70490, true },
    -  { 70506, true },
    -  { 70516, true },
    -  { 70532, true },
    -  { 70543, true },
    -  { 70554, true },
    -  { 70568, true },
    -  { 70579, true },
    -  { 70589, true },
    -  { 70610, true },
    -  { 70618, true },
    -  { 70630, true },
    -  { 70653, true },
    -  { 70672, true },
    -  { 70680, true },
    -  { 70690, true },
    -  { 70699, true },
    -  { 70717, true },
    -  { 70749, true },
    -  { 70765, true },
    -  { 70786, true },
    -  { 70806, true },
    -  { 70819, true },
    -  { 70840, true },
    -  { 70854, true },
    -  { 70864, true },
    -  { 70883, true },
    -  { 70901, true },
    -  { 70912, true },
    -  { 70920, true },
    -  { 70934, true },
    -  { 70946, true },
    -  { 70959, true },
    -  { 70968, true },
    -  { 70978, true },
    -  { 71001, true },
    -  { 71016, true },
    -  { 71032, true },
    -  { 71051, true },
    -  { 71069, true },
    -  { 71083, true },
    -  { 71097, true },
    +  { 70229, true },
    +  { 70243, true },
    +  { 70258, true },
    +  { 70270, true },
    +  { 70280, true },
    +  { 70293, true },
    +  { 70310, true },
    +  { 70323, true },
    +  { 70333, true },
    +  { 70360, true },
    +  { 70376, true },
    +  { 70386, true },
    +  { 70402, true },
    +  { 70413, true },
    +  { 70424, true },
    +  { 70438, true },
    +  { 70449, true },
    +  { 70459, true },
    +  { 70480, true },
    +  { 70488, true },
    +  { 70500, true },
    +  { 70523, true },
    +  { 70542, true },
    +  { 70550, true },
    +  { 70560, true },
    +  { 70569, true },
    +  { 70587, true },
    +  { 70619, true },
    +  { 70635, true },
    +  { 70656, true },
    +  { 70676, true },
    +  { 70689, true },
    +  { 70710, true },
    +  { 70724, true },
    +  { 70734, true },
    +  { 70753, true },
    +  { 70771, true },
    +  { 70782, true },
    +  { 70790, true },
    +  { 70804, true },
    +  { 70816, true },
    +  { 70829, true },
    +  { 70838, true },
    +  { 70848, true },
    +  { 70871, true },
    +  { 70886, true },
    +  { 70902, true },
    +  { 70921, true },
    +  { 70939, true },
    +  { 70953, true },
    +  { 70967, true },
    +  { 70980, true },
    +  { 70997, true },
    +  { 71009, true },
    +  { 71023, true },
    +  { 71039, true },
    +  { 71054, true },
    +  { 71063, true },
    +  { 71076, true },
    +  { 71095, true },
       { 71110, true },
    -  { 71127, true },
    +  { 71123, true },
       { 71139, true },
    -  { 71153, true },
    -  { 71169, true },
    -  { 71184, true },
    -  { 71193, true },
    -  { 71206, true },
    -  { 71225, true },
    -  { 71240, true },
    -  { 71253, true },
    -  { 71269, true },
    -  { 71286, false },
    -  { 71303, true },
    -  { 71325, true },
    -  { 71347, true },
    -  { 71359, true },
    -  { 71373, false },
    -  { 71386, true },
    -  { 71395, true },
    -  { 71411, true },
    -  { 71428, true },
    -  { 71442, true },
    +  { 71156, false },
    +  { 71173, true },
    +  { 71195, true },
    +  { 71217, true },
    +  { 71229, true },
    +  { 71243, false },
    +  { 71256, true },
    +  { 71265, true },
    +  { 71281, true },
    +  { 71298, true },
    +  { 71312, true },
    +  { 71326, true },
    +  { 71338, true },
    +  { 71351, true },
    +  { 71364, true },
    +  { 71374, true },
    +  { 71388, true },
    +  { 71401, true },
    +  { 71423, true },
    +  { 71445, true },
       { 71456, true },
    -  { 71468, true },
    -  { 71481, true },
    -  { 71494, true },
    -  { 71504, true },
    -  { 71518, true },
    -  { 71531, true },
    -  { 71553, true },
    -  { 71575, true },
    -  { 71586, true },
    -  { 71601, true },
    -  { 71612, true },
    -  { 71632, true },
    -  { 71655, true },
    -  { 71672, true },
    -  { 71691, false },
    -  { 71718, true },
    -  { 71737, true },
    -  { 71749, true },
    +  { 71471, true },
    +  { 71482, true },
    +  { 71502, true },
    +  { 71525, true },
    +  { 71542, true },
    +  { 71561, false },
    +  { 71588, true },
    +  { 71607, true },
    +  { 71619, true },
    +  { 71640, true },
    +  { 71659, true },
    +  { 71674, true },
    +  { 71694, false },
    +  { 71702, true },
    +  { 71713, true },
    +  { 71723, true },
    +  { 71736, true },
    +  { 71754, true },
       { 71770, true },
    -  { 71789, true },
    -  { 71804, true },
    -  { 71824, false },
    -  { 71832, true },
    -  { 71843, true },
    +  { 71785, true },
    +  { 71799, true },
    +  { 71815, true },
    +  { 71822, true },
    +  { 71829, true },
    +  { 71840, true },
       { 71853, true },
    -  { 71866, true },
    +  { 71867, true },
       { 71884, true },
    -  { 71900, true },
    -  { 71915, true },
    -  { 71929, true },
    -  { 71945, true },
    -  { 71952, true },
    -  { 71959, true },
    -  { 71970, true },
    -  { 71983, true },
    -  { 71997, true },
    -  { 72014, true },
    -  { 72028, true },
    -  { 72044, true },
    +  { 71898, true },
    +  { 71914, true },
    +  { 71925, true },
    +  { 71946, true },
    +  { 71953, true },
    +  { 71962, false },
    +  { 71977, true },
    +  { 72005, true },
    +  { 72020, true },
    +  { 72041, true },
       { 72055, true },
       { 72076, true },
    -  { 72083, true },
    -  { 72092, false },
    -  { 72107, true },
    -  { 72135, true },
    -  { 72150, true },
    -  { 72171, true },
    -  { 72185, true },
    -  { 72206, true },
    +  { 72092, true },
    +  { 72102, true },
    +  { 72112, true },
    +  { 72125, true },
    +  { 72138, true },
    +  { 72155, true },
    +  { 72174, true },
    +  { 72193, true },
    +  { 72211, true },
       { 72222, true },
    -  { 72232, true },
    -  { 72242, true },
    -  { 72255, true },
    -  { 72268, true },
    +  { 72234, true },
    +  { 72246, true },
    +  { 72257, true },
    +  { 72272, true },
       { 72285, true },
    -  { 72304, true },
    -  { 72323, true },
    -  { 72341, true },
    -  { 72352, true },
    -  { 72364, true },
    -  { 72376, true },
    -  { 72387, true },
    -  { 72402, true },
    -  { 72415, true },
    -  { 72424, true },
    -  { 72437, true },
    -  { 72444, false },
    -  { 72452, true },
    -  { 72460, true },
    -  { 72475, true },
    -  { 72488, true },
    -  { 72499, false },
    -  { 72511, true },
    -  { 72535, true },
    -  { 72550, true },
    -  { 72563, true },
    -  { 72577, true },
    -  { 72585, true },
    -  { 72610, true },
    -  { 72630, true },
    -  { 72654, true },
    -  { 72666, true },
    -  { 72682, true },
    -  { 72691, true },
    -  { 72706, true },
    -  { 72726, true },
    -  { 72739, true },
    -  { 72755, true },
    -  { 72769, true },
    -  { 72785, true },
    -  { 72804, true },
    -  { 72824, true },
    -  { 72842, true },
    -  { 72861, true },
    +  { 72294, true },
    +  { 72307, true },
    +  { 72314, false },
    +  { 72322, true },
    +  { 72330, true },
    +  { 72345, true },
    +  { 72358, true },
    +  { 72369, false },
    +  { 72381, true },
    +  { 72405, true },
    +  { 72420, true },
    +  { 72433, true },
    +  { 72447, true },
    +  { 72455, true },
    +  { 72480, true },
    +  { 72500, true },
    +  { 72524, true },
    +  { 72536, true },
    +  { 72552, true },
    +  { 72561, true },
    +  { 72576, true },
    +  { 72596, true },
    +  { 72609, true },
    +  { 72625, true },
    +  { 72639, true },
    +  { 72655, true },
    +  { 72674, true },
    +  { 72694, true },
    +  { 72712, true },
    +  { 72731, true },
    +  { 72748, true },
    +  { 72777, true },
    +  { 72797, true },
    +  { 72814, true },
    +  { 72830, true },
    +  { 72839, true },
    +  { 72852, true },
    +  { 72864, false },
       { 72878, true },
    -  { 72907, true },
    +  { 72895, true },
    +  { 72915, true },
       { 72927, true },
    -  { 72944, true },
    -  { 72960, true },
    -  { 72969, true },
    -  { 72982, true },
    -  { 72994, false },
    -  { 73008, true },
    -  { 73025, true },
    -  { 73045, true },
    -  { 73057, true },
    +  { 72942, true },
    +  { 72953, true },
    +  { 72970, true },
    +  { 72979, true },
    +  { 73000, true },
    +  { 73015, true },
    +  { 73033, true },
    +  { 73049, true },
       { 73070, true },
    -  { 73085, true },
    -  { 73096, true },
    -  { 73113, true },
    -  { 73122, true },
    -  { 73143, true },
    -  { 73158, true },
    -  { 73176, true },
    -  { 73192, true },
    -  { 73213, true },
    -  { 73227, true },
    -  { 73241, true },
    -  { 73252, true },
    -  { 73263, true },
    -  { 73279, true },
    -  { 73291, true },
    -  { 73302, true },
    -  { 73316, true },
    -  { 73325, true },
    -  { 73340, true },
    -  { 73349, true },
    -  { 73357, true },
    -  { 73368, true },
    -  { 73382, true },
    -  { 73397, true },
    -  { 73415, true },
    +  { 73084, true },
    +  { 73098, true },
    +  { 73109, true },
    +  { 73120, true },
    +  { 73136, true },
    +  { 73148, true },
    +  { 73159, true },
    +  { 73173, true },
    +  { 73182, true },
    +  { 73197, true },
    +  { 73206, true },
    +  { 73214, true },
    +  { 73225, true },
    +  { 73239, true },
    +  { 73254, true },
    +  { 73272, true },
    +  { 73286, true },
    +  { 73296, true },
    +  { 73306, true },
    +  { 73315, true },
    +  { 73327, true },
    +  { 73347, true },
    +  { 73370, true },
    +  { 73385, true },
    +  { 73408, true },
    +  { 73416, true },
       { 73429, true },
    -  { 73439, true },
    -  { 73449, true },
    -  { 73458, true },
    -  { 73470, true },
    +  { 73441, true },
    +  { 73453, true },
    +  { 73463, false },
    +  { 73472, false },
    +  { 73481, false },
       { 73490, true },
    -  { 73513, true },
    -  { 73528, true },
    -  { 73551, true },
    -  { 73559, true },
    -  { 73572, true },
    -  { 73584, true },
    -  { 73596, true },
    -  { 73606, false },
    -  { 73615, false },
    -  { 73624, false },
    -  { 73633, true },
    -  { 73652, true },
    -  { 73675, true },
    -  { 73690, true },
    -  { 73704, true },
    -  { 73717, true },
    -  { 73733, true },
    -  { 73746, true },
    -  { 73761, true },
    -  { 73777, false },
    -  { 73796, true },
    -  { 73815, true },
    -  { 73823, true },
    -  { 73837, false },
    -  { 73857, true },
    -  { 73869, true },
    -  { 73884, true },
    -  { 73902, true },
    -  { 73913, true },
    -  { 73923, true },
    -  { 73937, true },
    -  { 73950, true },
    -  { 73965, true },
    -  { 73991, true },
    -  { 74006, true },
    -  { 74018, true },
    -  { 74043, false },
    -  { 74052, true },
    -  { 74059, true },
    -  { 74073, true },
    -  { 74087, true },
    -  { 74103, true },
    -  { 74130, true },
    -  { 74144, true },
    -  { 74153, true },
    -  { 74166, true },
    +  { 73509, true },
    +  { 73532, true },
    +  { 73547, true },
    +  { 73561, true },
    +  { 73574, true },
    +  { 73590, true },
    +  { 73603, true },
    +  { 73618, true },
    +  { 73634, false },
    +  { 73653, true },
    +  { 73672, true },
    +  { 73680, true },
    +  { 73694, false },
    +  { 73714, true },
    +  { 73726, true },
    +  { 73741, true },
    +  { 73759, true },
    +  { 73770, true },
    +  { 73780, true },
    +  { 73794, true },
    +  { 73807, true },
    +  { 73822, true },
    +  { 73848, true },
    +  { 73863, true },
    +  { 73875, true },
    +  { 73900, false },
    +  { 73909, true },
    +  { 73916, true },
    +  { 73930, true },
    +  { 73944, true },
    +  { 73960, true },
    +  { 73987, true },
    +  { 74001, true },
    +  { 74010, true },
    +  { 74023, true },
    +  { 74046, true },
    +  { 74066, true },
    +  { 74085, true },
    +  { 74107, false },
    +  { 74118, true },
    +  { 74132, true },
    +  { 74152, true },
    +  { 74177, true },
       { 74189, true },
    -  { 74209, true },
    -  { 74228, true },
    -  { 74250, false },
    -  { 74261, true },
    -  { 74275, true },
    -  { 74295, true },
    +  { 74211, true },
    +  { 74226, true },
    +  { 74241, true },
    +  { 74258, true },
    +  { 74273, true },
    +  { 74290, true },
    +  { 74305, true },
       { 74320, true },
       { 74332, true },
    -  { 74354, true },
    -  { 74369, true },
    -  { 74384, true },
    -  { 74401, true },
    +  { 74346, false },
    +  { 74356, true },
    +  { 74373, true },
    +  { 74384, false },
    +  { 74399, true },
       { 74416, true },
    -  { 74433, true },
    -  { 74448, true },
    -  { 74463, true },
    -  { 74475, true },
    -  { 74489, false },
    -  { 74499, true },
    -  { 74516, true },
    -  { 74527, false },
    -  { 74542, true },
    -  { 74559, true },
    -  { 74573, true },
    -  { 74586, true },
    -  { 74598, true },
    -  { 74608, true },
    -  { 74620, true },
    -  { 74635, true },
    -  { 74646, true },
    -  { 74666, true },
    -  { 74678, true },
    -  { 74690, true },
    +  { 74430, true },
    +  { 74443, true },
    +  { 74455, true },
    +  { 74465, true },
    +  { 74477, true },
    +  { 74492, true },
    +  { 74503, true },
    +  { 74523, true },
    +  { 74535, true },
    +  { 74547, true },
    +  { 74558, true },
    +  { 74583, true },
    +  { 74592, true },
    +  { 74600, true },
    +  { 74611, true },
    +  { 74627, false },
    +  { 74639, true },
    +  { 74654, true },
    +  { 74662, true },
    +  { 74672, true },
    +  { 74687, true },
       { 74701, true },
    -  { 74726, true },
    -  { 74735, true },
    -  { 74743, true },
    -  { 74754, true },
    -  { 74770, false },
    -  { 74782, true },
    -  { 74797, true },
    -  { 74805, true },
    -  { 74815, true },
    -  { 74830, true },
    -  { 74844, true },
    -  { 74854, true },
    -  { 74872, true },
    +  { 74711, true },
    +  { 74729, true },
    +  { 74741, true },
    +  { 74769, true },
    +  { 74781, true },
    +  { 74795, true },
    +  { 74823, true },
    +  { 74837, true },
    +  { 74853, true },
    +  { 74870, true },
       { 74884, true },
    -  { 74912, true },
    -  { 74924, true },
    -  { 74938, true },
    -  { 74966, true },
    -  { 74980, true },
    -  { 74996, true },
    -  { 75013, true },
    -  { 75027, true },
    -  { 75044, true },
    -  { 75066, true },
    -  { 75076, true },
    -  { 75094, true },
    -  { 75113, true },
    -  { 75132, true },
    -  { 75157, true },
    -  { 75176, true },
    -  { 75190, true },
    -  { 75203, true },
    -  { 75232, true },
    -  { 75262, true },
    -  { 75274, true },
    -  { 75283, true },
    -  { 75296, true },
    -  { 75307, true },
    -  { 75317, true },
    -  { 75334, true },
    -  { 75357, true },
    -  { 75380, true },
    -  { 75394, true },
    -  { 75408, true },
    -  { 75432, false },
    -  { 75442, true },
    -  { 75458, true },
    -  { 75466, true },
    +  { 74901, true },
    +  { 74923, true },
    +  { 74933, true },
    +  { 74951, true },
    +  { 74970, true },
    +  { 74989, true },
    +  { 75014, true },
    +  { 75033, true },
    +  { 75047, true },
    +  { 75060, true },
    +  { 75089, true },
    +  { 75119, true },
    +  { 75131, true },
    +  { 75140, true },
    +  { 75153, true },
    +  { 75164, true },
    +  { 75174, true },
    +  { 75191, true },
    +  { 75214, true },
    +  { 75237, true },
    +  { 75251, true },
    +  { 75265, true },
    +  { 75289, false },
    +  { 75299, true },
    +  { 75315, true },
    +  { 75323, true },
    +  { 75342, true },
    +  { 75354, true },
    +  { 75365, true },
    +  { 75381, true },
    +  { 75395, true },
    +  { 75407, true },
    +  { 75420, true },
    +  { 75439, true },
    +  { 75450, true },
    +  { 75462, true },
    +  { 75475, true },
       { 75485, true },
    -  { 75497, true },
    -  { 75508, true },
    -  { 75524, true },
    -  { 75538, true },
    -  { 75550, true },
    -  { 75563, true },
    -  { 75582, true },
    -  { 75593, true },
    -  { 75605, true },
    -  { 75618, true },
    -  { 75628, true },
    -  { 75641, true },
    -  { 75653, true },
    -  { 75669, true },
    -  { 75677, false },
    -  { 75685, true },
    -  { 75707, true },
    -  { 75728, true },
    -  { 75752, true },
    -  { 75768, true },
    -  { 75782, true },
    -  { 75799, true },
    -  { 75811, true },
    -  { 75821, true },
    -  { 75836, true },
    -  { 75846, true },
    -  { 75869, true },
    -  { 75891, true },
    -  { 75905, true },
    -  { 75920, true },
    -  { 75932, true },
    -  { 75945, true },
    -  { 75960, true },
    -  { 75974, true },
    -  { 75986, true },
    -  { 76001, false },
    -  { 76018, true },
    -  { 76029, true },
    -  { 76040, true },
    -  { 76050, true },
    -  { 76064, false },
    -  { 76073, true },
    +  { 75498, true },
    +  { 75510, true },
    +  { 75526, true },
    +  { 75534, false },
    +  { 75542, true },
    +  { 75564, true },
    +  { 75585, true },
    +  { 75609, true },
    +  { 75625, true },
    +  { 75639, true },
    +  { 75656, true },
    +  { 75668, true },
    +  { 75678, true },
    +  { 75693, true },
    +  { 75703, true },
    +  { 75726, true },
    +  { 75748, true },
    +  { 75762, true },
    +  { 75777, true },
    +  { 75789, true },
    +  { 75802, true },
    +  { 75817, true },
    +  { 75831, true },
    +  { 75843, true },
    +  { 75858, false },
    +  { 75875, true },
    +  { 75886, true },
    +  { 75897, true },
    +  { 75907, true },
    +  { 75921, false },
    +  { 75930, true },
    +  { 75938, true },
    +  { 75963, true },
    +  { 75972, true },
    +  { 75980, true },
    +  { 75988, true },
    +  { 75997, true },
    +  { 76009, true },
    +  { 76021, true },
    +  { 76031, true },
    +  { 76041, true },
    +  { 76055, true },
    +  { 76067, true },
       { 76081, true },
    -  { 76106, true },
    +  { 76096, true },
    +  { 76107, true },
       { 76115, true },
    -  { 76123, true },
    -  { 76131, true },
    -  { 76140, true },
    -  { 76152, true },
    -  { 76164, true },
    -  { 76174, true },
    -  { 76184, true },
    -  { 76198, true },
    -  { 76212, true },
    -  { 76227, true },
    -  { 76238, true },
    -  { 76246, true },
    -  { 76257, true },
    -  { 76272, true },
    -  { 76285, true },
    -  { 76292, true },
    -  { 76312, true },
    +  { 76126, true },
    +  { 76141, true },
    +  { 76154, true },
    +  { 76161, true },
    +  { 76181, true },
    +  { 76190, true },
    +  { 76203, true },
    +  { 76220, true },
    +  { 76235, true },
    +  { 76255, true },
    +  { 76264, true },
    +  { 76273, true },
    +  { 76285, false },
    +  { 76294, true },
    +  { 76304, true },
    +  { 76314, false },
       { 76321, true },
    -  { 76334, true },
    -  { 76351, true },
    -  { 76366, true },
    -  { 76386, true },
    -  { 76395, true },
    -  { 76404, true },
    -  { 76416, false },
    -  { 76425, true },
    -  { 76435, true },
    -  { 76445, false },
    -  { 76452, true },
    -  { 76463, true },
    -  { 76476, true },
    -  { 76491, true },
    -  { 76512, true },
    +  { 76332, true },
    +  { 76345, true },
    +  { 76360, true },
    +  { 76381, true },
    +  { 76388, true },
    +  { 76408, true },
    +  { 76418, true },
    +  { 76429, true },
    +  { 76442, true },
    +  { 76456, true },
    +  { 76465, true },
    +  { 76481, true },
    +  { 76490, false },
    +  { 76499, true },
    +  { 76507, true },
       { 76519, true },
    -  { 76539, true },
    -  { 76549, true },
    -  { 76560, true },
    -  { 76573, true },
    -  { 76587, true },
    -  { 76596, true },
    -  { 76612, true },
    -  { 76621, false },
    -  { 76630, true },
    -  { 76638, true },
    -  { 76650, true },
    -  { 76657, true },
    -  { 76675, true },
    -  { 76687, true },
    -  { 76700, true },
    -  { 76716, true },
    -  { 76729, true },
    -  { 76738, true },
    -  { 76747, true },
    -  { 76758, true },
    -  { 76778, true },
    -  { 76793, true },
    -  { 76809, false },
    -  { 76824, true },
    -  { 76843, true },
    -  { 76854, true },
    -  { 76871, false },
    -  { 76892, false },
    -  { 76908, false },
    -  { 76928, true },
    +  { 76526, true },
    +  { 76544, true },
    +  { 76556, true },
    +  { 76569, true },
    +  { 76585, true },
    +  { 76598, true },
    +  { 76607, true },
    +  { 76616, true },
    +  { 76627, true },
    +  { 76647, true },
    +  { 76662, true },
    +  { 76678, false },
    +  { 76693, true },
    +  { 76712, true },
    +  { 76723, true },
    +  { 76740, false },
    +  { 76761, false },
    +  { 76777, false },
    +  { 76797, true },
    +  { 76809, true },
    +  { 76832, true },
    +  { 76844, true },
    +  { 76857, true },
    +  { 76869, true },
    +  { 76881, true },
    +  { 76892, true },
    +  { 76902, true },
    +  { 76911, true },
    +  { 76922, true },
       { 76940, true },
    -  { 76963, true },
    -  { 76975, true },
    -  { 76988, true },
    -  { 77000, true },
    -  { 77012, true },
    -  { 77023, true },
    -  { 77033, true },
    +  { 76967, true },
    +  { 76977, true },
    +  { 76991, true },
    +  { 77006, true },
    +  { 77021, true },
    +  { 77031, true },
       { 77042, true },
    -  { 77053, true },
    -  { 77071, true },
    -  { 77098, true },
    -  { 77108, true },
    +  { 77051, true },
    +  { 77065, true },
    +  { 77084, true },
    +  { 77097, true },
    +  { 77107, true },
    +  { 77115, true },
       { 77122, true },
    -  { 77137, true },
    -  { 77152, true },
    -  { 77162, true },
    +  { 77135, true },
    +  { 77145, true },
    +  { 77154, false },
    +  { 77164, true },
       { 77173, true },
    -  { 77182, true },
    -  { 77196, true },
    -  { 77215, true },
    -  { 77228, true },
    -  { 77238, true },
    -  { 77246, true },
    -  { 77253, true },
    -  { 77266, true },
    -  { 77276, true },
    -  { 77285, false },
    -  { 77295, true },
    -  { 77304, true },
    -  { 77316, true },
    -  { 77326, false },
    -  { 77343, true },
    -  { 77352, true },
    -  { 77362, true },
    -  { 77370, true },
    +  { 77185, true },
    +  { 77195, false },
    +  { 77212, true },
    +  { 77222, true },
    +  { 77230, true },
    +  { 77240, true },
    +  { 77250, true },
    +  { 77263, true },
    +  { 77278, true },
    +  { 77290, true },
    +  { 77306, true },
    +  { 77320, true },
    +  { 77327, true },
    +  { 77339, true },
    +  { 77355, true },
    +  { 77369, true },
       { 77380, true },
    -  { 77390, true },
    -  { 77403, true },
    -  { 77418, true },
    -  { 77430, true },
    -  { 77446, true },
    -  { 77460, true },
    -  { 77467, true },
    +  { 77389, true },
    +  { 77401, true },
    +  { 77411, true },
    +  { 77423, true },
    +  { 77433, true },
    +  { 77451, true },
    +  { 77466, true },
       { 77479, true },
    -  { 77495, true },
    -  { 77509, true },
    -  { 77520, true },
    -  { 77529, true },
    -  { 77541, true },
    -  { 77551, true },
    -  { 77563, true },
    -  { 77573, true },
    -  { 77591, true },
    -  { 77606, true },
    -  { 77619, true },
    -  { 77626, true },
    -  { 77643, true },
    -  { 77654, true },
    -  { 77664, true },
    -  { 77674, true },
    -  { 77683, true },
    -  { 77705, true },
    -  { 77724, true },
    -  { 77738, true },
    -  { 77753, true },
    -  { 77777, true },
    -  { 77799, true },
    -  { 77813, true },
    -  { 77826, true },
    -  { 77840, true },
    -  { 77851, true },
    -  { 77860, true },
    -  { 77871, true },
    +  { 77486, true },
    +  { 77503, true },
    +  { 77514, true },
    +  { 77524, true },
    +  { 77534, true },
    +  { 77543, true },
    +  { 77565, true },
    +  { 77584, true },
    +  { 77598, true },
    +  { 77613, true },
    +  { 77637, true },
    +  { 77659, true },
    +  { 77673, true },
    +  { 77686, true },
    +  { 77700, true },
    +  { 77711, true },
    +  { 77720, true },
    +  { 77731, true },
    +  { 77750, true },
    +  { 77764, true },
    +  { 77775, true },
    +  { 77787, true },
    +  { 77806, true },
    +  { 77819, true },
    +  { 77828, true },
    +  { 77844, true },
    +  { 77857, true },
    +  { 77869, true },
    +  { 77882, true },
       { 77890, true },
    -  { 77904, true },
    -  { 77915, true },
    -  { 77927, true },
    -  { 77946, true },
    -  { 77959, true },
    -  { 77968, true },
    -  { 77984, true },
    -  { 77997, true },
    -  { 78009, true },
    -  { 78022, true },
    -  { 78030, true },
    -  { 78042, true },
    -  { 78051, true },
    -  { 78066, true },
    -  { 78075, true },
    -  { 78087, true },
    -  { 78097, true },
    -  { 78112, true },
    -  { 78120, true },
    +  { 77902, true },
    +  { 77911, true },
    +  { 77926, true },
    +  { 77935, true },
    +  { 77947, true },
    +  { 77957, true },
    +  { 77972, true },
    +  { 77980, true },
    +  { 77995, true },
    +  { 78006, true },
    +  { 78017, true },
    +  { 78026, true },
    +  { 78040, true },
    +  { 78054, true },
    +  { 78077, true },
    +  { 78102, true },
    +  { 78121, true },
       { 78135, true },
    -  { 78146, true },
    -  { 78157, true },
    -  { 78166, true },
    -  { 78180, true },
    -  { 78194, true },
    -  { 78217, true },
    -  { 78242, true },
    -  { 78261, true },
    -  { 78275, true },
    -  { 78291, true },
    -  { 78305, true },
    -  { 78321, true },
    -  { 78339, true },
    -  { 78356, true },
    -  { 78371, true },
    -  { 78386, true },
    -  { 78395, true },
    -  { 78408, true },
    -  { 78425, true },
    -  { 78438, true },
    -  { 78448, true },
    -  { 78459, true },
    -  { 78470, true },
    -  { 78480, true },
    -  { 78492, true },
    +  { 78151, true },
    +  { 78165, true },
    +  { 78181, true },
    +  { 78199, true },
    +  { 78216, true },
    +  { 78231, true },
    +  { 78246, true },
    +  { 78255, true },
    +  { 78268, true },
    +  { 78285, true },
    +  { 78298, true },
    +  { 78308, true },
    +  { 78319, true },
    +  { 78330, true },
    +  { 78340, true },
    +  { 78352, true },
    +  { 78373, true },
    +  { 78387, false },
    +  { 78407, false },
    +  { 78419, true },
    +  { 78432, true },
    +  { 78442, true },
    +  { 78455, true },
    +  { 78468, true },
    +  { 78484, true },
    +  { 78501, true },
       { 78513, true },
    -  { 78527, false },
    -  { 78547, false },
    -  { 78559, true },
    -  { 78572, true },
    -  { 78582, true },
    -  { 78595, true },
    -  { 78608, true },
    +  { 78533, true },
    +  { 78547, true },
    +  { 78561, true },
    +  { 78577, true },
    +  { 78589, true },
    +  { 78610, false },
       { 78624, true },
    -  { 78641, true },
    -  { 78653, true },
    -  { 78673, true },
    -  { 78687, true },
    -  { 78701, true },
    -  { 78717, true },
    -  { 78729, true },
    -  { 78750, false },
    -  { 78764, true },
    +  { 78642, true },
    +  { 78654, true },
    +  { 78674, true },
    +  { 78690, true },
    +  { 78712, true },
    +  { 78734, true },
    +  { 78753, true },
    +  { 78770, true },
       { 78782, true },
    -  { 78794, true },
    -  { 78814, true },
    -  { 78830, true },
    -  { 78852, true },
    -  { 78874, true },
    -  { 78893, true },
    -  { 78910, true },
    -  { 78922, true },
    -  { 78935, true },
    -  { 78948, false },
    -  { 78961, true },
    -  { 78972, true },
    -  { 78988, true },
    -  { 79003, true },
    -  { 79023, true },
    -  { 79048, true },
    -  { 79064, true },
    -  { 79081, true },
    -  { 79092, true },
    -  { 79106, true },
    -  { 79119, true },
    -  { 79132, true },
    -  { 79144, true },
    -  { 79161, true },
    -  { 79173, false },
    -  { 79182, false },
    +  { 78795, true },
    +  { 78808, false },
    +  { 78821, true },
    +  { 78832, true },
    +  { 78848, true },
    +  { 78863, true },
    +  { 78883, true },
    +  { 78908, true },
    +  { 78924, true },
    +  { 78941, true },
    +  { 78952, true },
    +  { 78966, true },
    +  { 78979, true },
    +  { 78992, true },
    +  { 79004, true },
    +  { 79021, true },
    +  { 79033, false },
    +  { 79042, false },
    +  { 79052, true },
    +  { 79063, true },
    +  { 79076, false },
    +  { 79089, true },
    +  { 79100, true },
    +  { 79114, true },
    +  { 79137, true },
    +  { 79151, true },
    +  { 79166, true },
    +  { 79179, true },
       { 79192, true },
    -  { 79203, true },
    -  { 79216, false },
    -  { 79229, true },
    -  { 79240, true },
    -  { 79254, true },
    -  { 79277, true },
    -  { 79291, true },
    -  { 79306, true },
    -  { 79319, true },
    -  { 79332, true },
    -  { 79351, true },
    +  { 79211, true },
    +  { 79223, true },
    +  { 79239, true },
    +  { 79255, true },
    +  { 79272, true },
    +  { 79285, true },
    +  { 79297, true },
    +  { 79310, true },
    +  { 79322, true },
    +  { 79337, true },
    +  { 79354, true },
       { 79363, true },
    -  { 79379, true },
    -  { 79395, true },
    -  { 79412, true },
    -  { 79425, true },
    -  { 79437, true },
    -  { 79450, true },
    -  { 79462, true },
    -  { 79477, true },
    -  { 79494, true },
    -  { 79503, true },
    -  { 79530, true },
    -  { 79551, true },
    -  { 79568, true },
    -  { 79579, false },
    -  { 79597, true },
    -  { 79609, true },
    -  { 79621, true },
    -  { 79633, true },
    -  { 79652, true },
    -  { 79678, true },
    -  { 79701, true },
    -  { 79718, true },
    -  { 79731, true },
    -  { 79743, true },
    -  { 79760, false },
    -  { 79779, true },
    -  { 79797, true },
    -  { 79828, true },
    -  { 79843, true },
    -  { 79862, true },
    -  { 79884, true },
    -  { 79896, true },
    -  { 79913, true },
    -  { 79930, true },
    -  { 79949, true },
    -  { 79961, true },
    -  { 79976, true },
    -  { 79993, true },
    -  { 80010, true },
    -  { 80026, true },
    -  { 80042, true },
    -  { 80066, true },
    -  { 80091, true },
    -  { 80113, true },
    -  { 80140, true },
    -  { 80158, true },
    -  { 80175, true },
    -  { 80190, true },
    +  { 79390, true },
    +  { 79411, true },
    +  { 79428, true },
    +  { 79439, false },
    +  { 79457, true },
    +  { 79469, true },
    +  { 79481, true },
    +  { 79493, true },
    +  { 79512, true },
    +  { 79538, true },
    +  { 79561, true },
    +  { 79578, true },
    +  { 79591, true },
    +  { 79603, true },
    +  { 79620, false },
    +  { 79639, true },
    +  { 79657, true },
    +  { 79688, true },
    +  { 79703, true },
    +  { 79722, true },
    +  { 79744, true },
    +  { 79756, true },
    +  { 79773, true },
    +  { 79790, true },
    +  { 79809, true },
    +  { 79821, true },
    +  { 79836, true },
    +  { 79853, true },
    +  { 79870, true },
    +  { 79886, true },
    +  { 79902, true },
    +  { 79926, true },
    +  { 79951, true },
    +  { 79973, true },
    +  { 80000, true },
    +  { 80018, true },
    +  { 80035, true },
    +  { 80050, true },
    +  { 80068, true },
    +  { 80089, true },
    +  { 80117, true },
    +  { 80141, true },
    +  { 80165, true },
    +  { 80178, true },
    +  { 80191, true },
       { 80208, true },
    -  { 80229, true },
    -  { 80257, true },
    -  { 80281, true },
    -  { 80305, true },
    -  { 80318, true },
    +  { 80223, true },
    +  { 80248, false },
    +  { 80262, true },
    +  { 80272, true },
    +  { 80291, true },
    +  { 80307, true },
       { 80331, true },
    -  { 80348, true },
    +  { 80346, true },
       { 80363, true },
    -  { 80388, false },
    -  { 80402, true },
    -  { 80412, true },
    -  { 80431, true },
    -  { 80447, true },
    -  { 80471, true },
    -  { 80486, true },
    -  { 80503, true },
    -  { 80513, true },
    -  { 80525, true },
    -  { 80538, true },
    -  { 80556, true },
    -  { 80569, true },
    -  { 80583, true },
    -  { 80596, true },
    +  { 80373, true },
    +  { 80385, true },
    +  { 80398, true },
    +  { 80416, true },
    +  { 80429, true },
    +  { 80443, true },
    +  { 80456, true },
    +  { 80469, true },
    +  { 80488, true },
    +  { 80506, true },
    +  { 80520, true },
    +  { 80530, false },
    +  { 80542, true },
    +  { 80550, true },
    +  { 80560, true },
    +  { 80570, true },
    +  { 80582, true },
    +  { 80596, false },
       { 80609, true },
    +  { 80617, true },
       { 80628, true },
    -  { 80646, true },
    -  { 80660, true },
    -  { 80670, false },
    +  { 80644, true },
    +  { 80654, true },
    +  { 80666, true },
       { 80682, true },
    -  { 80690, true },
    -  { 80700, true },
    -  { 80710, true },
    -  { 80722, true },
    -  { 80736, false },
    -  { 80749, true },
    -  { 80757, true },
    -  { 80768, true },
    -  { 80784, true },
    -  { 80794, true },
    -  { 80806, true },
    -  { 80822, true },
    -  { 80829, true },
    -  { 80837, true },
    -  { 80847, true },
    -  { 80859, true },
    -  { 80873, true },
    -  { 80882, true },
    -  { 80898, true },
    -  { 80908, false },
    -  { 80926, true },
    -  { 80938, true },
    -  { 80950, false },
    -  { 80961, true },
    -  { 80974, true },
    -  { 80984, true },
    -  { 80994, true },
    -  { 81004, true },
    -  { 81014, true },
    -  { 81024, true },
    +  { 80689, true },
    +  { 80697, true },
    +  { 80707, true },
    +  { 80719, true },
    +  { 80733, true },
    +  { 80742, true },
    +  { 80758, true },
    +  { 80768, false },
    +  { 80786, true },
    +  { 80798, true },
    +  { 80810, false },
    +  { 80821, true },
    +  { 80834, true },
    +  { 80844, true },
    +  { 80854, true },
    +  { 80864, true },
    +  { 80874, true },
    +  { 80884, true },
    +  { 80903, true },
    +  { 80912, true },
    +  { 80923, true },
    +  { 80932, true },
    +  { 80948, true },
    +  { 80964, true },
    +  { 80981, true },
    +  { 80992, true },
    +  { 81007, true },
    +  { 81017, true },
    +  { 81026, true },
       { 81043, true },
       { 81052, true },
    -  { 81063, true },
    -  { 81072, true },
    -  { 81088, true },
    -  { 81104, true },
    -  { 81121, true },
    -  { 81132, true },
    -  { 81147, true },
    -  { 81157, true },
    -  { 81166, true },
    -  { 81183, true },
    -  { 81192, true },
    -  { 81210, true },
    -  { 81226, true },
    -  { 81254, true },
    -  { 81263, true },
    -  { 81278, true },
    -  { 81295, true },
    -  { 81318, true },
    -  { 81337, true },
    -  { 81355, true },
    -  { 81370, true },
    -  { 81384, true },
    -  { 81407, true },
    -  { 81423, true },
    -  { 81439, true },
    -  { 81447, true },
    +  { 81070, true },
    +  { 81086, true },
    +  { 81114, true },
    +  { 81123, true },
    +  { 81138, true },
    +  { 81155, true },
    +  { 81178, true },
    +  { 81197, true },
    +  { 81215, true },
    +  { 81230, true },
    +  { 81244, true },
    +  { 81267, true },
    +  { 81283, true },
    +  { 81299, true },
    +  { 81307, true },
    +  { 81319, true },
    +  { 81336, true },
    +  { 81353, true },
    +  { 81371, true },
    +  { 81385, true },
    +  { 81399, true },
    +  { 81411, true },
    +  { 81429, true },
    +  { 81448, true },
       { 81459, true },
    -  { 81476, true },
    -  { 81493, true },
    -  { 81511, true },
    -  { 81525, true },
    -  { 81539, true },
    -  { 81551, true },
    -  { 81569, true },
    -  { 81588, true },
    +  { 81470, true },
    +  { 81488, true },
    +  { 81501, true },
    +  { 81512, true },
    +  { 81524, true },
    +  { 81535, true },
    +  { 81546, true },
    +  { 81556, true },
    +  { 81565, false },
    +  { 81580, true },
       { 81599, true },
    -  { 81610, true },
    -  { 81628, true },
    -  { 81641, true },
    -  { 81652, true },
    -  { 81664, true },
    -  { 81675, true },
    +  { 81612, true },
    +  { 81625, true },
    +  { 81644, true },
    +  { 81661, true },
       { 81686, true },
    -  { 81696, true },
    -  { 81705, false },
    -  { 81720, true },
    -  { 81739, true },
    -  { 81752, true },
    -  { 81765, true },
    -  { 81784, true },
    -  { 81801, true },
    -  { 81826, true },
    -  { 81858, true },
    -  { 81872, true },
    -  { 81884, true },
    -  { 81908, true },
    -  { 81931, true },
    -  { 81956, true },
    -  { 81969, true },
    -  { 81988, true },
    -  { 82002, true },
    -  { 82015, true },
    -  { 82030, false },
    -  { 82050, true },
    +  { 81718, true },
    +  { 81732, true },
    +  { 81744, true },
    +  { 81768, true },
    +  { 81791, true },
    +  { 81816, true },
    +  { 81835, true },
    +  { 81849, true },
    +  { 81862, true },
    +  { 81877, false },
    +  { 81897, true },
    +  { 81910, true },
    +  { 81927, true },
    +  { 81942, true },
    +  { 81959, true },
    +  { 81968, true },
    +  { 81984, true },
    +  { 82004, true },
    +  { 82023, true },
    +  { 82032, true },
    +  { 82043, true },
    +  { 82052, true },
       { 82063, true },
    -  { 82080, true },
    -  { 82095, true },
    -  { 82112, true },
    +  { 82076, true },
    +  { 82085, true },
    +  { 82098, true },
    +  { 82108, true },
       { 82121, true },
    -  { 82137, true },
    -  { 82157, true },
    -  { 82176, true },
    -  { 82185, true },
    -  { 82196, true },
    -  { 82205, true },
    -  { 82216, true },
    -  { 82229, true },
    +  { 82132, true },
    +  { 82143, true },
    +  { 82152, true },
    +  { 82166, true },
    +  { 82183, true },
    +  { 82200, true },
    +  { 82209, true },
    +  { 82223, true },
       { 82238, true },
    -  { 82251, true },
    -  { 82261, true },
    -  { 82274, true },
    -  { 82285, true },
    -  { 82296, true },
    -  { 82305, true },
    -  { 82319, true },
    -  { 82336, true },
    -  { 82353, true },
    -  { 82362, true },
    -  { 82376, true },
    -  { 82391, true },
    -  { 82403, true },
    -  { 82416, true },
    -  { 82428, true },
    -  { 82441, true },
    -  { 82450, true },
    -  { 82464, true },
    -  { 82487, true },
    -  { 82499, true },
    -  { 82510, true },
    -  { 82527, true },
    -  { 82541, true },
    -  { 82558, true },
    -  { 82579, true },
    -  { 82590, true },
    -  { 82601, true },
    -  { 82608, true },
    -  { 82619, true },
    -  { 82626, true },
    -  { 82636, true },
    -  { 82648, true },
    -  { 82657, true },
    +  { 82250, true },
    +  { 82263, true },
    +  { 82275, true },
    +  { 82288, true },
    +  { 82297, true },
    +  { 82311, true },
    +  { 82334, true },
    +  { 82346, true },
    +  { 82357, true },
    +  { 82374, true },
    +  { 82388, true },
    +  { 82405, true },
    +  { 82426, true },
    +  { 82437, true },
    +  { 82448, true },
    +  { 82455, true },
    +  { 82466, true },
    +  { 82473, true },
    +  { 82483, true },
    +  { 82495, true },
    +  { 82504, true },
    +  { 82517, true },
    +  { 82529, true },
    +  { 82546, true },
    +  { 82560, true },
    +  { 82574, true },
    +  { 82581, true },
    +  { 82588, true },
    +  { 82597, true },
    +  { 82605, true },
    +  { 82615, true },
    +  { 82633, true },
    +  { 82647, true },
    +  { 82659, true },
       { 82670, true },
    -  { 82682, true },
    -  { 82699, true },
    -  { 82713, true },
    -  { 82727, true },
    -  { 82734, true },
    -  { 82741, true },
    -  { 82750, true },
    -  { 82758, true },
    -  { 82768, true },
    -  { 82786, true },
    -  { 82800, true },
    -  { 82812, true },
    -  { 82823, true },
    -  { 82834, true },
    -  { 82845, true },
    -  { 82858, true },
    -  { 82869, true },
    -  { 82878, false },
    -  { 82890, true },
    -  { 82900, true },
    -  { 82917, true },
    -  { 82928, true },
    -  { 82935, true },
    -  { 82942, true },
    -  { 82956, true },
    -  { 82964, true },
    +  { 82681, true },
    +  { 82692, true },
    +  { 82705, true },
    +  { 82716, true },
    +  { 82725, false },
    +  { 82737, true },
    +  { 82747, true },
    +  { 82764, true },
    +  { 82775, true },
    +  { 82782, true },
    +  { 82789, true },
    +  { 82803, true },
    +  { 82811, true },
    +  { 82818, true },
    +  { 82829, true },
    +  { 82842, true },
    +  { 82857, true },
    +  { 82870, true },
    +  { 82879, true },
    +  { 82898, false },
    +  { 82910, true },
    +  { 82924, true },
    +  { 82937, true },
    +  { 82952, true },
       { 82971, true },
    -  { 82982, true },
    -  { 82995, true },
    -  { 83010, true },
    -  { 83023, true },
    -  { 83032, true },
    -  { 83051, false },
    -  { 83063, true },
    -  { 83077, true },
    -  { 83090, true },
    -  { 83105, true },
    -  { 83124, true },
    -  { 83137, true },
    -  { 83152, true },
    -  { 83165, true },
    -  { 83175, true },
    -  { 83188, true },
    -  { 83205, true },
    -  { 83219, false },
    -  { 83238, true },
    -  { 83252, true },
    -  { 83268, true },
    -  { 83284, true },
    -  { 83304, true },
    -  { 83320, true },
    -  { 83335, true },
    -  { 83344, true },
    -  { 83363, true },
    -  { 83380, false },
    -  { 83396, true },
    -  { 83407, true },
    -  { 83427, true },
    -  { 83440, true },
    -  { 83454, false },
    -  { 83467, true },
    -  { 83483, true },
    +  { 82984, true },
    +  { 82999, true },
    +  { 83012, true },
    +  { 83022, true },
    +  { 83035, true },
    +  { 83052, true },
    +  { 83066, false },
    +  { 83085, true },
    +  { 83099, true },
    +  { 83115, true },
    +  { 83131, true },
    +  { 83151, true },
    +  { 83167, true },
    +  { 83182, true },
    +  { 83191, true },
    +  { 83210, true },
    +  { 83227, false },
    +  { 83243, true },
    +  { 83254, true },
    +  { 83274, true },
    +  { 83287, true },
    +  { 83301, false },
    +  { 83314, true },
    +  { 83330, true },
    +  { 83347, true },
    +  { 83362, true },
    +  { 83385, true },
    +  { 83398, true },
    +  { 83415, true },
    +  { 83430, true },
    +  { 83447, true },
    +  { 83461, true },
    +  { 83476, true },
    +  { 83485, true },
       { 83500, true },
    -  { 83515, true },
    -  { 83538, true },
    -  { 83551, true },
    -  { 83568, true },
    -  { 83583, true },
    -  { 83600, true },
    -  { 83614, true },
    -  { 83629, true },
    -  { 83638, true },
    -  { 83653, true },
    -  { 83671, true },
    -  { 83685, true },
    -  { 83695, true },
    -  { 83710, true },
    -  { 83724, true },
    -  { 83737, true },
    -  { 83748, true },
    -  { 83762, true },
    -  { 83772, true },
    -  { 83790, true },
    -  { 83804, true },
    -  { 83816, true },
    -  { 83835, false },
    -  { 83850, true },
    -  { 83869, true },
    -  { 83882, true },
    -  { 83899, true },
    -  { 83916, true },
    -  { 83933, true },
    -  { 83951, true },
    +  { 83518, true },
    +  { 83532, true },
    +  { 83542, true },
    +  { 83557, true },
    +  { 83571, true },
    +  { 83584, true },
    +  { 83595, true },
    +  { 83609, true },
    +  { 83619, true },
    +  { 83637, true },
    +  { 83651, true },
    +  { 83663, true },
    +  { 83682, false },
    +  { 83697, true },
    +  { 83716, true },
    +  { 83729, true },
    +  { 83746, true },
    +  { 83763, true },
    +  { 83780, true },
    +  { 83798, true },
    +  { 83820, true },
    +  { 83839, true },
    +  { 83855, true },
    +  { 83870, true },
    +  { 83878, true },
    +  { 83892, true },
    +  { 83906, true },
    +  { 83922, true },
    +  { 83934, true },
    +  { 83945, true },
    +  { 83955, true },
       { 83973, true },
    -  { 83992, true },
    -  { 84008, true },
    -  { 84023, true },
    -  { 84031, true },
    -  { 84044, true },
    -  { 84058, true },
    -  { 84072, true },
    -  { 84088, true },
    -  { 84100, true },
    -  { 84111, true },
    -  { 84121, true },
    -  { 84139, true },
    -  { 84157, true },
    -  { 84170, true },
    -  { 84186, true },
    -  { 84199, true },
    -  { 84211, true },
    -  { 84222, true },
    -  { 84234, true },
    -  { 84244, true },
    -  { 84252, true },
    -  { 84268, true },
    -  { 84284, true },
    -  { 84293, true },
    -  { 84305, true },
    -  { 84318, true },
    -  { 84332, true },
    -  { 84351, true },
    -  { 84365, true },
    -  { 84378, true },
    +  { 83991, true },
    +  { 84004, true },
    +  { 84020, true },
    +  { 84033, true },
    +  { 84045, true },
    +  { 84056, true },
    +  { 84066, true },
    +  { 84074, true },
    +  { 84090, true },
    +  { 84106, true },
    +  { 84115, true },
    +  { 84127, true },
    +  { 84140, true },
    +  { 84154, true },
    +  { 84173, true },
    +  { 84187, true },
    +  { 84200, true },
    +  { 84216, false },
    +  { 84233, true },
    +  { 84254, true },
    +  { 84273, true },
    +  { 84292, true },
    +  { 84311, false },
    +  { 84327, true },
    +  { 84342, true },
    +  { 84352, true },
    +  { 84362, true },
    +  { 84371, true },
    +  { 84384, true },
       { 84394, false },
    -  { 84411, true },
    -  { 84432, true },
    +  { 84412, true },
    +  { 84434, true },
       { 84451, true },
    -  { 84470, true },
    -  { 84489, false },
    -  { 84505, true },
    -  { 84520, true },
    -  { 84530, true },
    -  { 84540, true },
    -  { 84549, true },
    -  { 84562, true },
    -  { 84572, false },
    -  { 84590, true },
    -  { 84612, true },
    -  { 84629, true },
    -  { 84645, false },
    -  { 84663, true },
    -  { 84674, true },
    -  { 84692, true },
    -  { 84707, true },
    -  { 84721, true },
    -  { 84738, true },
    -  { 84756, true },
    +  { 84467, false },
    +  { 84485, true },
    +  { 84496, true },
    +  { 84514, true },
    +  { 84529, true },
    +  { 84543, true },
    +  { 84560, true },
    +  { 84578, true },
    +  { 84594, true },
    +  { 84611, true },
    +  { 84627, true },
    +  { 84645, true },
    +  { 84662, true },
    +  { 84684, true },
    +  { 84701, true },
    +  { 84718, true },
    +  { 84734, true },
    +  { 84748, true },
    +  { 84760, true },
       { 84772, true },
    -  { 84789, true },
    -  { 84805, true },
    -  { 84823, true },
    -  { 84840, true },
    -  { 84862, true },
    -  { 84879, true },
    +  { 84782, true },
    +  { 84790, true },
    +  { 84803, true },
    +  { 84818, true },
    +  { 84833, true },
    +  { 84845, true },
    +  { 84854, true },
    +  { 84864, true },
    +  { 84874, true },
    +  { 84888, true },
       { 84896, true },
    -  { 84912, true },
    -  { 84926, true },
    -  { 84938, true },
    +  { 84905, true },
    +  { 84915, true },
    +  { 84924, false },
    +  { 84934, true },
       { 84950, true },
    -  { 84960, true },
    -  { 84968, true },
    -  { 84981, true },
    +  { 84963, true },
    +  { 84970, true },
    +  { 84983, true },
       { 84996, true },
    -  { 85011, true },
    -  { 85023, true },
    -  { 85032, true },
    -  { 85042, true },
    -  { 85052, true },
    -  { 85066, true },
    -  { 85074, true },
    -  { 85083, true },
    -  { 85093, true },
    -  { 85102, false },
    -  { 85112, true },
    -  { 85128, true },
    -  { 85141, true },
    -  { 85148, true },
    -  { 85161, true },
    +  { 85009, true },
    +  { 85024, true },
    +  { 85036, true },
    +  { 85043, true },
    +  { 85050, true },
    +  { 85059, true },
    +  { 85068, true },
    +  { 85077, true },
    +  { 85088, true },
    +  { 85102, true },
    +  { 85115, true },
    +  { 85123, true },
    +  { 85135, true },
    +  { 85149, true },
    +  { 85160, true },
       { 85174, true },
    -  { 85187, true },
    -  { 85202, true },
    -  { 85214, true },
    -  { 85221, true },
    -  { 85228, true },
    -  { 85237, true },
    -  { 85246, true },
    -  { 85255, true },
    -  { 85266, true },
    -  { 85280, true },
    -  { 85293, true },
    -  { 85301, true },
    +  { 85189, true },
    +  { 85199, false },
    +  { 85213, true },
    +  { 85223, true },
    +  { 85238, true },
    +  { 85253, false },
    +  { 85269, true },
    +  { 85288, true },
    +  { 85300, true },
       { 85313, true },
    -  { 85327, true },
    -  { 85338, true },
    -  { 85354, true },
    -  { 85368, true },
    -  { 85383, true },
    -  { 85393, false },
    +  { 85332, true },
    +  { 85345, true },
    +  { 85361, true },
    +  { 85375, true },
    +  { 85390, true },
       { 85407, true },
    -  { 85417, true },
    -  { 85432, false },
    -  { 85448, true },
    -  { 85467, true },
    -  { 85479, true },
    +  { 85424, true },
    +  { 85434, true },
    +  { 85449, true },
    +  { 85463, true },
    +  { 85476, true },
       { 85492, true },
    -  { 85511, true },
    -  { 85524, true },
    -  { 85540, true },
    -  { 85554, true },
    -  { 85569, true },
    -  { 85586, true },
    -  { 85603, true },
    -  { 85613, true },
    -  { 85628, true },
    -  { 85642, true },
    -  { 85655, true },
    -  { 85671, true },
    -  { 85685, true },
    -  { 85700, true },
    -  { 85714, true },
    -  { 85729, true },
    -  { 85748, true },
    -  { 85763, true },
    -  { 85778, true },
    -  { 85796, true },
    -  { 85815, true },
    -  { 85828, true },
    -  { 85841, true },
    -  { 85864, true },
    -  { 85880, true },
    -  { 85891, true },
    -  { 85906, true },
    -  { 85921, true },
    -  { 85937, true },
    -  { 85952, true },
    -  { 85968, true },
    -  { 85985, true },
    -  { 85997, true },
    -  { 86007, true },
    -  { 86025, true },
    -  { 86035, true },
    -  { 86046, true },
    -  { 86064, true },
    -  { 86077, true },
    -  { 86105, true },
    -  { 86116, true },
    -  { 86127, true },
    -  { 86144, true },
    -  { 86158, false },
    -  { 86175, true },
    -  { 86184, true },
    -  { 86201, true },
    -  { 86218, true },
    -  { 86227, true },
    -  { 86239, true },
    -  { 86253, true },
    -  { 86265, true },
    -  { 86281, true },
    -  { 86307, true },
    -  { 86317, true },
    -  { 86330, true },
    -  { 86340, true },
    -  { 86353, true },
    -  { 86361, true },
    +  { 85506, true },
    +  { 85521, true },
    +  { 85535, true },
    +  { 85550, true },
    +  { 85565, true },
    +  { 85580, true },
    +  { 85598, true },
    +  { 85617, true },
    +  { 85630, true },
    +  { 85643, true },
    +  { 85666, true },
    +  { 85682, true },
    +  { 85693, true },
    +  { 85708, true },
    +  { 85723, true },
    +  { 85739, true },
    +  { 85754, true },
    +  { 85770, true },
    +  { 85787, true },
    +  { 85799, true },
    +  { 85809, true },
    +  { 85827, true },
    +  { 85837, true },
    +  { 85848, true },
    +  { 85866, true },
    +  { 85879, true },
    +  { 85907, true },
    +  { 85918, true },
    +  { 85929, true },
    +  { 85946, true },
    +  { 85960, false },
    +  { 85977, true },
    +  { 85986, true },
    +  { 86003, true },
    +  { 86020, true },
    +  { 86029, true },
    +  { 86041, true },
    +  { 86055, true },
    +  { 86067, true },
    +  { 86083, true },
    +  { 86109, true },
    +  { 86119, true },
    +  { 86132, true },
    +  { 86142, true },
    +  { 86155, true },
    +  { 86163, true },
    +  { 86174, true },
    +  { 86189, true },
    +  { 86207, true },
    +  { 86223, true },
    +  { 86231, true },
    +  { 86245, true },
    +  { 86262, true },
    +  { 86282, true },
    +  { 86292, true },
    +  { 86308, true },
    +  { 86321, true },
    +  { 86331, false },
    +  { 86345, true },
    +  { 86356, true },
       { 86372, true },
    -  { 86387, true },
    +  { 86380, true },
    +  { 86390, true },
       { 86405, true },
       { 86421, true },
    -  { 86429, true },
    -  { 86443, true },
    -  { 86460, true },
    -  { 86480, true },
    -  { 86490, true },
    +  { 86440, true },
    +  { 86453, true },
    +  { 86473, true },
    +  { 86488, true },
       { 86506, true },
       { 86519, true },
    -  { 86529, false },
    -  { 86543, true },
    -  { 86554, true },
    -  { 86570, true },
    -  { 86578, true },
    -  { 86588, true },
    -  { 86603, true },
    -  { 86619, true },
    +  { 86529, true },
    +  { 86546, true },
    +  { 86561, true },
    +  { 86572, true },
    +  { 86583, true },
    +  { 86596, true },
    +  { 86604, true },
    +  { 86613, true },
    +  { 86624, true },
       { 86638, true },
    -  { 86651, true },
    -  { 86671, true },
    +  { 86661, true },
    +  { 86674, true },
       { 86686, true },
    -  { 86704, true },
    -  { 86717, true },
    -  { 86727, true },
    -  { 86744, true },
    -  { 86759, true },
    -  { 86770, true },
    -  { 86781, true },
    -  { 86794, true },
    +  { 86697, true },
    +  { 86711, true },
    +  { 86739, true },
    +  { 86754, true },
    +  { 86769, true },
    +  { 86789, true },
       { 86802, true },
    -  { 86811, true },
    -  { 86822, true },
    -  { 86836, true },
    -  { 86859, true },
    -  { 86872, true },
    -  { 86884, true },
    -  { 86895, true },
    -  { 86909, true },
    -  { 86937, true },
    -  { 86952, true },
    +  { 86818, true },
    +  { 86833, true },
    +  { 86846, true },
    +  { 86860, true },
    +  { 86871, true },
    +  { 86882, true },
    +  { 86894, true },
    +  { 86911, true },
    +  { 86924, true },
    +  { 86939, true },
    +  { 86947, true },
       { 86967, true },
    -  { 86987, true },
    -  { 87000, true },
    -  { 87016, true },
    +  { 86978, true },
    +  { 86988, true },
    +  { 86998, true },
    +  { 87009, true },
    +  { 87019, true },
       { 87031, true },
    -  { 87044, true },
    -  { 87058, true },
    +  { 87046, true },
    +  { 87055, true },
       { 87069, true },
    -  { 87080, true },
    +  { 87082, true },
       { 87092, true },
    -  { 87109, true },
    -  { 87122, true },
    -  { 87137, true },
    -  { 87145, true },
    -  { 87165, true },
    -  { 87176, true },
    -  { 87186, true },
    +  { 87107, true },
    +  { 87121, true },
    +  { 87132, true },
    +  { 87145, false },
    +  { 87155, true },
    +  { 87174, true },
    +  { 87187, true },
       { 87196, true },
       { 87207, true },
    -  { 87217, true },
    -  { 87229, true },
    -  { 87244, true },
    -  { 87253, true },
    -  { 87267, true },
    -  { 87280, true },
    -  { 87290, true },
    -  { 87305, true },
    -  { 87319, true },
    -  { 87330, true },
    -  { 87343, false },
    -  { 87353, true },
    -  { 87372, true },
    +  { 87221, true },
    +  { 87241, true },
    +  { 87257, true },
    +  { 87268, true },
    +  { 87284, true },
    +  { 87301, true },
    +  { 87316, true },
    +  { 87329, true },
    +  { 87346, true },
    +  { 87356, true },
    +  { 87366, true },
    +  { 87374, true },
       { 87385, true },
    -  { 87394, true },
    -  { 87405, true },
    -  { 87419, true },
    -  { 87439, true },
    -  { 87455, true },
    -  { 87466, true },
    -  { 87482, true },
    -  { 87499, true },
    -  { 87514, true },
    -  { 87527, true },
    -  { 87544, true },
    -  { 87554, true },
    -  { 87564, true },
    -  { 87572, true },
    -  { 87583, true },
    -  { 87593, true },
    -  { 87606, true },
    +  { 87395, true },
    +  { 87408, true },
    +  { 87422, true },
    +  { 87434, true },
    +  { 87444, true },
    +  { 87452, true },
    +  { 87461, true },
    +  { 87475, true },
    +  { 87489, true },
    +  { 87503, true },
    +  { 87545, true },
    +  { 87561, true },
    +  { 87570, true },
    +  { 87582, true },
    +  { 87594, true },
    +  { 87607, true },
       { 87620, true },
    -  { 87632, true },
    -  { 87642, true },
    -  { 87650, true },
    +  { 87638, true },
    +  { 87646, true },
       { 87659, true },
    -  { 87673, true },
    -  { 87687, true },
    -  { 87729, true },
    -  { 87745, true },
    -  { 87754, true },
    -  { 87766, true },
    -  { 87778, true },
    -  { 87791, true },
    -  { 87804, true },
    -  { 87822, true },
    -  { 87830, true },
    -  { 87843, true },
    -  { 87853, true },
    +  { 87669, true },
    +  { 87681, true },
    +  { 87692, true },
    +  { 87707, true },
    +  { 87719, true },
    +  { 87732, true },
    +  { 87744, true },
    +  { 87759, true },
    +  { 87772, true },
    +  { 87784, true },
    +  { 87800, true },
    +  { 87818, true },
    +  { 87833, true },
    +  { 87847, true },
       { 87865, true },
    -  { 87876, true },
    -  { 87891, true },
    -  { 87903, true },
    -  { 87916, true },
    -  { 87928, true },
    -  { 87943, true },
    -  { 87956, true },
    -  { 87968, true },
    -  { 87984, true },
    -  { 88002, true },
    -  { 88017, true },
    -  { 88031, true },
    -  { 88049, true },
    -  { 88067, true },
    -  { 88079, true },
    -  { 88097, true },
    -  { 88108, true },
    -  { 88122, true },
    -  { 88142, true },
    -  { 88155, true },
    -  { 88167, true },
    -  { 88187, true },
    -  { 88198, true },
    -  { 88207, true },
    -  { 88216, true },
    -  { 88223, true },
    -  { 88238, true },
    -  { 88253, true },
    -  { 88267, true },
    -  { 88286, true },
    -  { 88297, true },
    -  { 88311, true },
    +  { 87883, true },
    +  { 87895, true },
    +  { 87913, true },
    +  { 87924, true },
    +  { 87938, true },
    +  { 87958, true },
    +  { 87971, true },
    +  { 87983, true },
    +  { 88003, true },
    +  { 88014, true },
    +  { 88023, true },
    +  { 88032, true },
    +  { 88039, true },
    +  { 88054, true },
    +  { 88069, true },
    +  { 88083, true },
    +  { 88102, true },
    +  { 88113, true },
    +  { 88127, true },
    +  { 88139, true },
    +  { 88152, true },
    +  { 88165, true },
    +  { 88176, true },
    +  { 88189, true },
    +  { 88201, true },
    +  { 88224, true },
    +  { 88233, true },
    +  { 88250, true },
    +  { 88265, true },
    +  { 88279, true },
    +  { 88287, true },
    +  { 88301, true },
    +  { 88315, true },
       { 88323, true },
       { 88336, true },
    -  { 88349, true },
    -  { 88360, true },
    -  { 88373, true },
    -  { 88385, true },
    -  { 88408, true },
    -  { 88417, true },
    -  { 88434, true },
    +  { 88347, true },
    +  { 88359, false },
    +  { 88372, true },
    +  { 88386, true },
    +  { 88394, true },
    +  { 88404, true },
    +  { 88414, true },
    +  { 88431, true },
       { 88449, true },
    -  { 88463, true },
    -  { 88471, true },
    -  { 88485, true },
    -  { 88499, true },
    -  { 88507, true },
    -  { 88520, true },
    -  { 88531, true },
    -  { 88543, false },
    -  { 88556, true },
    -  { 88570, true },
    -  { 88578, true },
    -  { 88588, true },
    -  { 88598, true },
    -  { 88615, true },
    +  { 88467, true },
    +  { 88481, true },
    +  { 88491, true },
    +  { 88515, true },
    +  { 88529, true },
    +  { 88548, true },
    +  { 88560, true },
    +  { 88579, true },
    +  { 88596, true },
    +  { 88606, true },
    +  { 88621, true },
       { 88633, true },
    -  { 88651, true },
    -  { 88665, true },
    -  { 88675, true },
    -  { 88699, true },
    -  { 88713, true },
    -  { 88732, true },
    -  { 88744, true },
    +  { 88645, true },
    +  { 88658, true },
    +  { 88667, true },
    +  { 88676, true },
    +  { 88695, true },
    +  { 88707, true },
    +  { 88714, true },
    +  { 88724, true },
    +  { 88733, true },
    +  { 88748, true },
       { 88763, true },
    -  { 88780, true },
    -  { 88790, true },
    -  { 88805, true },
    -  { 88817, true },
    -  { 88829, true },
    -  { 88842, true },
    -  { 88851, true },
    -  { 88860, true },
    -  { 88879, true },
    -  { 88891, true },
    -  { 88898, true },
    -  { 88908, true },
    +  { 88781, true },
    +  { 88792, true },
    +  { 88804, true },
    +  { 88820, true },
    +  { 88834, true },
    +  { 88850, true },
    +  { 88876, true },
    +  { 88887, true },
    +  { 88902, true },
       { 88917, true },
       { 88932, true },
       { 88947, true },
    -  { 88965, true },
    +  { 88960, true },
       { 88976, true },
    -  { 88988, true },
    -  { 89004, true },
    -  { 89018, true },
    -  { 89034, true },
    -  { 89060, true },
    -  { 89071, true },
    +  { 88999, true },
    +  { 89012, true },
    +  { 89025, true },
    +  { 89038, true },
    +  { 89057, true },
    +  { 89072, true },
       { 89086, true },
    -  { 89101, true },
    -  { 89116, true },
    -  { 89131, true },
    -  { 89144, true },
    -  { 89160, true },
    -  { 89183, true },
    -  { 89196, true },
    -  { 89209, true },
    -  { 89222, true },
    -  { 89241, true },
    -  { 89256, true },
    -  { 89270, true },
    -  { 89282, false },
    +  { 89098, false },
    +  { 89117, true },
    +  { 89128, true },
    +  { 89140, true },
    +  { 89153, true },
    +  { 89176, true },
    +  { 89190, true },
    +  { 89201, true },
    +  { 89217, true },
    +  { 89230, true },
    +  { 89240, true },
    +  { 89251, true },
    +  { 89259, true },
    +  { 89269, true },
    +  { 89286, true },
       { 89301, true },
    -  { 89312, true },
    -  { 89324, true },
    -  { 89335, true },
    -  { 89348, true },
    -  { 89371, true },
    -  { 89385, true },
    -  { 89396, true },
    -  { 89412, true },
    -  { 89425, true },
    -  { 89435, true },
    -  { 89446, true },
    -  { 89454, true },
    -  { 89464, true },
    -  { 89481, true },
    -  { 89496, true },
    -  { 89506, true },
    -  { 89516, true },
    -  { 89527, true },
    -  { 89538, true },
    +  { 89311, true },
    +  { 89321, true },
    +  { 89332, true },
    +  { 89343, true },
    +  { 89363, true },
    +  { 89378, true },
    +  { 89395, true },
    +  { 89409, true },
    +  { 89419, true },
    +  { 89430, true },
    +  { 89441, true },
    +  { 89463, true },
    +  { 89475, true },
    +  { 89489, true },
    +  { 89500, false },
    +  { 89513, true },
    +  { 89523, true },
    +  { 89541, true },
       { 89558, true },
    -  { 89573, true },
    -  { 89590, true },
    -  { 89604, true },
    +  { 89572, true },
    +  { 89584, true },
    +  { 89600, true },
       { 89614, true },
       { 89625, true },
    -  { 89636, true },
    -  { 89658, true },
    -  { 89670, true },
    -  { 89684, true },
    -  { 89695, false },
    -  { 89708, true },
    -  { 89718, true },
    -  { 89736, true },
    +  { 89635, true },
    +  { 89655, true },
    +  { 89682, true },
    +  { 89697, true },
    +  { 89713, true },
    +  { 89728, true },
    +  { 89741, true },
       { 89753, true },
    -  { 89767, true },
    -  { 89779, true },
    -  { 89795, true },
    -  { 89809, true },
    -  { 89820, true },
    -  { 89830, true },
    -  { 89850, true },
    -  { 89877, true },
    -  { 89892, true },
    -  { 89908, true },
    -  { 89923, true },
    -  { 89936, true },
    -  { 89948, true },
    -  { 89964, true },
    -  { 89976, true },
    -  { 89993, true },
    -  { 90004, true },
    -  { 90021, true },
    -  { 90033, true },
    -  { 90046, false },
    -  { 90060, true },
    -  { 90074, true },
    -  { 90086, true },
    +  { 89769, true },
    +  { 89781, true },
    +  { 89798, true },
    +  { 89808, true },
    +  { 89819, true },
    +  { 89836, true },
    +  { 89848, true },
    +  { 89861, false },
    +  { 89875, true },
    +  { 89889, true },
    +  { 89901, true },
    +  { 89912, true },
    +  { 89924, true },
    +  { 89942, true },
    +  { 89955, true },
    +  { 89970, true },
    +  { 89981, true },
    +  { 89991, true },
    +  { 90003, true },
    +  { 90013, true },
    +  { 90022, true },
    +  { 90034, true },
    +  { 90048, true },
    +  { 90069, true },
    +  { 90083, true },
       { 90097, true },
    -  { 90109, true },
    -  { 90127, true },
    -  { 90140, true },
    -  { 90155, true },
    -  { 90166, true },
    +  { 90115, true },
    +  { 90133, true },
    +  { 90141, true },
    +  { 90151, true },
    +  { 90164, true },
       { 90176, true },
       { 90188, true },
    -  { 90198, true },
    -  { 90207, true },
    -  { 90219, true },
    -  { 90233, true },
    -  { 90254, true },
    -  { 90268, true },
    -  { 90282, true },
    +  { 90202, true },
    +  { 90217, true },
    +  { 90231, true },
    +  { 90240, true },
    +  { 90250, true },
    +  { 90262, true },
    +  { 90277, true },
       { 90300, true },
    -  { 90318, true },
    -  { 90326, true },
    +  { 90308, true },
    +  { 90319, true },
    +  { 90328, true },
       { 90336, true },
       { 90349, true },
    -  { 90361, true },
    -  { 90373, true },
    -  { 90381, true },
    -  { 90395, true },
    -  { 90410, true },
    -  { 90424, true },
    -  { 90433, true },
    -  { 90443, true },
    -  { 90455, true },
    -  { 90470, true },
    -  { 90493, true },
    -  { 90501, true },
    -  { 90512, true },
    -  { 90521, true },
    -  { 90529, true },
    -  { 90542, true },
    -  { 90565, true },
    -  { 90577, true },
    +  { 90372, true },
    +  { 90384, true },
    +  { 90400, true },
    +  { 90423, true },
    +  { 90434, true },
    +  { 90450, true },
    +  { 90466, true },
    +  { 90481, true },
    +  { 90494, true },
    +  { 90504, true },
    +  { 90511, true },
    +  { 90524, true },
    +  { 90547, true },
    +  { 90564, true },
       { 90593, true },
    -  { 90616, true },
    -  { 90627, true },
    -  { 90643, true },
    -  { 90659, true },
    -  { 90674, true },
    -  { 90687, true },
    -  { 90697, true },
    -  { 90704, true },
    -  { 90717, true },
    -  { 90740, true },
    -  { 90757, true },
    -  { 90786, true },
    -  { 90803, true },
    -  { 90813, true },
    -  { 90827, true },
    +  { 90610, true },
    +  { 90620, true },
    +  { 90634, true },
    +  { 90646, true },
    +  { 90655, true },
    +  { 90669, true },
    +  { 90685, true },
    +  { 90700, true },
    +  { 90718, true },
    +  { 90736, true },
    +  { 90746, true },
    +  { 90754, true },
    +  { 90764, true },
    +  { 90774, true },
    +  { 90782, true },
    +  { 90796, true },
    +  { 90805, true },
    +  { 90816, true },
    +  { 90831, true },
       { 90839, true },
    -  { 90848, true },
    -  { 90862, true },
    -  { 90878, true },
    -  { 90893, true },
    -  { 90911, true },
    -  { 90929, true },
    -  { 90939, true },
    -  { 90947, true },
    -  { 90957, true },
    -  { 90967, true },
    -  { 90975, true },
    -  { 90989, true },
    -  { 90998, true },
    -  { 91009, true },
    -  { 91024, true },
    -  { 91032, true },
    -  { 91047, true },
    -  { 91065, true },
    -  { 91083, true },
    -  { 91095, true },
    -  { 91105, true },
    -  { 91116, true },
    -  { 91128, true },
    -  { 91139, true },
    -  { 91147, true },
    -  { 91164, false },
    -  { 91180, false },
    -  { 91201, true },
    -  { 91218, true },
    -  { 91236, true },
    -  { 91253, true },
    -  { 91270, true },
    -  { 91284, true },
    -  { 91292, true },
    -  { 91305, true },
    -  { 91323, true },
    -  { 91350, true },
    -  { 91374, true },
    -  { 91391, true },
    -  { 91406, true },
    -  { 91420, true },
    -  { 91432, true },
    -  { 91443, true },
    -  { 91454, true },
    -  { 91464, true },
    -  { 91475, false },
    -  { 91496, true },
    -  { 91507, true },
    -  { 91521, true },
    -  { 91533, true },
    -  { 91547, true },
    -  { 91565, true },
    -  { 91579, true },
    -  { 91590, true },
    -  { 91607, true },
    -  { 91618, true },
    -  { 91628, true },
    -  { 91642, true },
    -  { 91656, true },
    -  { 91669, true },
    -  { 91680, true },
    -  { 91699, true },
    -  { 91712, true },
    -  { 91729, true },
    +  { 90854, true },
    +  { 90872, true },
    +  { 90890, true },
    +  { 90902, true },
    +  { 90912, true },
    +  { 90923, true },
    +  { 90935, true },
    +  { 90946, true },
    +  { 90954, true },
    +  { 90971, false },
    +  { 90987, false },
    +  { 91008, true },
    +  { 91025, true },
    +  { 91043, true },
    +  { 91060, true },
    +  { 91077, true },
    +  { 91091, true },
    +  { 91099, true },
    +  { 91112, true },
    +  { 91130, true },
    +  { 91157, true },
    +  { 91181, true },
    +  { 91198, true },
    +  { 91213, true },
    +  { 91227, true },
    +  { 91239, true },
    +  { 91250, true },
    +  { 91261, true },
    +  { 91271, true },
    +  { 91282, false },
    +  { 91303, true },
    +  { 91314, true },
    +  { 91328, true },
    +  { 91340, true },
    +  { 91354, true },
    +  { 91372, true },
    +  { 91386, true },
    +  { 91397, true },
    +  { 91414, true },
    +  { 91425, true },
    +  { 91435, true },
    +  { 91449, true },
    +  { 91463, true },
    +  { 91476, true },
    +  { 91487, true },
    +  { 91506, true },
    +  { 91519, true },
    +  { 91536, true },
    +  { 91550, true },
    +  { 91558, true },
    +  { 91572, true },
    +  { 91585, true },
    +  { 91597, true },
    +  { 91610, true },
    +  { 91622, true },
    +  { 91634, true },
    +  { 91649, true },
    +  { 91659, true },
    +  { 91674, true },
    +  { 91688, true },
    +  { 91701, true },
    +  { 91711, false },
    +  { 91722, true },
    +  { 91732, true },
       { 91743, true },
    -  { 91751, true },
    +  { 91754, true },
       { 91765, true },
       { 91778, true },
       { 91790, true },
    -  { 91803, true },
    -  { 91815, true },
    -  { 91827, true },
    -  { 91842, true },
    -  { 91852, true },
    -  { 91867, true },
    -  { 91881, true },
    -  { 91894, true },
    -  { 91904, false },
    -  { 91915, true },
    -  { 91925, true },
    -  { 91936, true },
    -  { 91947, true },
    -  { 91958, true },
    -  { 91971, true },
    -  { 91983, true },
    -  { 91995, true },
    -  { 92005, true },
    -  { 92027, true },
    -  { 92039, true },
    -  { 92048, true },
    -  { 92057, true },
    -  { 92069, true },
    -  { 92081, true },
    -  { 92091, true },
    -  { 92102, true },
    -  { 92112, true },
    -  { 92125, false },
    -  { 92136, true },
    -  { 92149, true },
    -  { 92174, true },
    -  { 92186, true },
    -  { 92196, true },
    +  { 91802, true },
    +  { 91812, true },
    +  { 91834, true },
    +  { 91846, true },
    +  { 91855, true },
    +  { 91864, true },
    +  { 91876, true },
    +  { 91888, true },
    +  { 91898, true },
    +  { 91909, true },
    +  { 91919, true },
    +  { 91932, false },
    +  { 91943, true },
    +  { 91956, true },
    +  { 91981, true },
    +  { 91993, true },
    +  { 92003, true },
    +  { 92012, true },
    +  { 92029, true },
    +  { 92047, true },
    +  { 92059, true },
    +  { 92067, true },
    +  { 92086, true },
    +  { 92099, true },
    +  { 92113, true },
    +  { 92123, true },
    +  { 92135, true },
    +  { 92159, true },
    +  { 92173, true },
    +  { 92191, true },
       { 92205, true },
    -  { 92222, true },
    -  { 92240, true },
    +  { 92223, true },
    +  { 92242, true },
       { 92252, true },
    -  { 92260, true },
    -  { 92279, true },
    -  { 92292, true },
    -  { 92306, true },
    -  { 92316, true },
    -  { 92328, true },
    +  { 92265, true },
    +  { 92275, true },
    +  { 92288, true },
    +  { 92297, true },
    +  { 92308, true },
    +  { 92320, true },
    +  { 92331, true },
    +  { 92344, true },
       { 92352, true },
    -  { 92366, true },
    -  { 92384, true },
    -  { 92398, true },
    -  { 92416, true },
    -  { 92435, true },
    -  { 92445, true },
    -  { 92458, true },
    -  { 92468, true },
    -  { 92481, true },
    -  { 92490, true },
    -  { 92501, true },
    -  { 92513, true },
    -  { 92524, true },
    -  { 92537, true },
    -  { 92545, true },
    +  { 92364, true },
    +  { 92377, true },
    +  { 92389, true },
    +  { 92404, true },
    +  { 92412, true },
    +  { 92424, true },
    +  { 92439, true },
    +  { 92448, true },
    +  { 92461, true },
    +  { 92467, false },
    +  { 92482, true },
    +  { 92491, true },
    +  { 92504, true },
    +  { 92518, true },
    +  { 92530, true },
    +  { 92544, true },
       { 92557, true },
    -  { 92570, true },
    -  { 92582, true },
    -  { 92597, true },
    -  { 92605, true },
    -  { 92617, true },
    -  { 92632, true },
    -  { 92641, true },
    -  { 92654, true },
    -  { 92660, false },
    -  { 92675, true },
    -  { 92684, true },
    -  { 92697, true },
    -  { 92711, true },
    -  { 92723, true },
    -  { 92737, true },
    -  { 92750, true },
    -  { 92761, true },
    -  { 92771, true },
    -  { 92779, true },
    -  { 92792, true },
    -  { 92804, true },
    -  { 92817, true },
    -  { 92837, true },
    -  { 92856, true },
    -  { 92873, true },
    -  { 92891, true },
    -  { 92906, true },
    -  { 92919, true },
    -  { 92931, true },
    -  { 92950, true },
    -  { 92967, true },
    -  { 92986, true },
    -  { 93001, true },
    -  { 93011, true },
    -  { 93025, true },
    -  { 93044, true },
    -  { 93053, false },
    -  { 93064, true },
    -  { 93072, true },
    +  { 92568, true },
    +  { 92578, true },
    +  { 92586, true },
    +  { 92599, true },
    +  { 92611, true },
    +  { 92624, true },
    +  { 92644, true },
    +  { 92663, true },
    +  { 92680, true },
    +  { 92698, true },
    +  { 92713, true },
    +  { 92726, true },
    +  { 92738, true },
    +  { 92757, true },
    +  { 92774, true },
    +  { 92793, true },
    +  { 92808, true },
    +  { 92818, true },
    +  { 92832, true },
    +  { 92841, false },
    +  { 92852, true },
    +  { 92860, true },
    +  { 92868, true },
    +  { 92876, true },
    +  { 92888, true },
    +  { 92900, true },
    +  { 92914, true },
    +  { 92928, true },
    +  { 92939, true },
    +  { 92955, true },
    +  { 92977, true },
    +  { 92988, true },
    +  { 93000, true },
    +  { 93007, true },
    +  { 93018, true },
    +  { 93030, true },
    +  { 93040, true },
    +  { 93050, true },
    +  { 93062, true },
       { 93080, true },
    -  { 93088, true },
    -  { 93100, true },
    -  { 93112, true },
    -  { 93126, true },
    -  { 93140, true },
    -  { 93151, true },
    -  { 93167, true },
    -  { 93189, true },
    -  { 93200, true },
    -  { 93212, true },
    -  { 93219, true },
    -  { 93230, true },
    -  { 93242, true },
    -  { 93252, true },
    -  { 93262, true },
    -  { 93274, true },
    -  { 93292, true },
    -  { 93315, true },
    -  { 93370, true },
    -  { 93385, true },
    -  { 93395, true },
    -  { 93413, true },
    -  { 93428, true },
    -  { 93441, false },
    -  { 93455, true },
    -  { 93469, false },
    -  { 93485, true },
    -  { 93503, true },
    -  { 93522, true },
    -  { 93532, true },
    -  { 93545, true },
    -  { 93556, true },
    -  { 93578, true },
    -  { 93601, true },
    -  { 93611, true },
    -  { 93621, true },
    -  { 93639, true },
    -  { 93650, true },
    -  { 93661, true },
    -  { 93677, true },
    -  { 93690, true },
    -  { 93704, true },
    -  { 93717, true },
    -  { 93746, true },
    -  { 93759, true },
    -  { 93771, true },
    -  { 93783, true },
    -  { 93802, true },
    -  { 93812, true },
    -  { 93826, true },
    -  { 93836, true },
    -  { 93853, true },
    -  { 93864, true },
    -  { 93880, true },
    -  { 93899, true },
    -  { 93914, true },
    -  { 93926, true },
    -  { 93935, true },
    -  { 93951, true },
    -  { 93965, true },
    -  { 93978, true },
    -  { 93993, true },
    -  { 94005, true },
    -  { 94015, true },
    -  { 94029, true },
    -  { 94044, true },
    -  { 94062, true },
    -  { 94074, true },
    -  { 94088, true },
    -  { 94100, true },
    -  { 94112, true },
    -  { 94133, true },
    -  { 94149, true },
    -  { 94162, true },
    -  { 94179, true },
    -  { 94194, true },
    -  { 94207, true },
    -  { 94221, true },
    -  { 94235, true },
    -  { 94248, true },
    -  { 94267, true },
    -  { 94290, false },
    -  { 94303, false },
    -  { 94321, true },
    -  { 94341, true },
    -  { 94354, true },
    -  { 94369, true },
    -  { 94384, true },
    -  { 94399, true },
    -  { 94413, true },
    -  { 94428, true },
    -  { 94453, true },
    -  { 94464, true },
    -  { 94480, true },
    -  { 94494, true },
    -  { 94519, true },
    -  { 94533, true },
    -  { 94547, true },
    -  { 94561, true },
    -  { 94585, true },
    -  { 94596, true },
    -  { 94607, true },
    -  { 94619, true },
    -  { 94647, true },
    -  { 94657, false },
    -  { 94669, true },
    +  { 93103, true },
    +  { 93158, true },
    +  { 93173, true },
    +  { 93183, true },
    +  { 93201, true },
    +  { 93216, true },
    +  { 93229, false },
    +  { 93243, true },
    +  { 93257, false },
    +  { 93273, true },
    +  { 93291, true },
    +  { 93310, true },
    +  { 93320, true },
    +  { 93333, true },
    +  { 93344, true },
    +  { 93366, true },
    +  { 93389, true },
    +  { 93399, true },
    +  { 93409, true },
    +  { 93427, true },
    +  { 93438, true },
    +  { 93449, true },
    +  { 93465, true },
    +  { 93478, true },
    +  { 93492, true },
    +  { 93505, true },
    +  { 93534, true },
    +  { 93547, true },
    +  { 93559, true },
    +  { 93571, true },
    +  { 93590, true },
    +  { 93600, true },
    +  { 93614, true },
    +  { 93624, true },
    +  { 93641, true },
    +  { 93652, true },
    +  { 93668, true },
    +  { 93687, true },
    +  { 93702, true },
    +  { 93714, true },
    +  { 93723, true },
    +  { 93739, true },
    +  { 93753, true },
    +  { 93766, true },
    +  { 93781, true },
    +  { 93793, true },
    +  { 93803, true },
    +  { 93817, true },
    +  { 93832, true },
    +  { 93850, true },
    +  { 93862, true },
    +  { 93876, true },
    +  { 93888, true },
    +  { 93900, true },
    +  { 93921, true },
    +  { 93937, true },
    +  { 93950, true },
    +  { 93967, true },
    +  { 93982, true },
    +  { 93995, true },
    +  { 94009, true },
    +  { 94023, true },
    +  { 94036, true },
    +  { 94055, true },
    +  { 94078, false },
    +  { 94091, false },
    +  { 94109, true },
    +  { 94129, true },
    +  { 94142, true },
    +  { 94157, true },
    +  { 94172, true },
    +  { 94187, true },
    +  { 94201, true },
    +  { 94216, true },
    +  { 94227, true },
    +  { 94243, true },
    +  { 94257, true },
    +  { 94282, true },
    +  { 94296, true },
    +  { 94310, true },
    +  { 94324, true },
    +  { 94348, true },
    +  { 94359, true },
    +  { 94370, true },
    +  { 94382, true },
    +  { 94410, true },
    +  { 94420, false },
    +  { 94432, true },
    +  { 94442, true },
    +  { 94452, true },
    +  { 94469, true },
    +  { 94486, true },
    +  { 94499, true },
    +  { 94509, true },
    +  { 94532, true },
    +  { 94542, true },
    +  { 94551, true },
    +  { 94563, true },
    +  { 94575, true },
    +  { 94587, true },
    +  { 94598, true },
    +  { 94613, true },
    +  { 94623, true },
    +  { 94632, true },
    +  { 94650, false },
    +  { 94661, true },
    +  { 94671, true },
       { 94679, true },
    -  { 94689, true },
    -  { 94706, true },
    -  { 94723, true },
    -  { 94736, true },
    -  { 94746, true },
    -  { 94769, true },
    -  { 94779, true },
    -  { 94791, true },
    -  { 94803, true },
    -  { 94815, true },
    +  { 94693, true },
    +  { 94705, true },
    +  { 94717, true },
    +  { 94735, true },
    +  { 94755, true },
    +  { 94770, true },
    +  { 94787, true },
    +  { 94800, true },
    +  { 94811, true },
       { 94826, true },
       { 94841, true },
    -  { 94851, true },
    -  { 94860, true },
    -  { 94878, false },
    -  { 94889, true },
    -  { 94899, true },
    -  { 94907, true },
    -  { 94921, true },
    -  { 94933, true },
    -  { 94945, true },
    -  { 94963, true },
    -  { 94983, true },
    -  { 94998, true },
    -  { 95015, true },
    -  { 95028, true },
    -  { 95039, true },
    -  { 95054, true },
    -  { 95069, true },
    -  { 95085, true },
    -  { 95098, true },
    -  { 95123, true },
    -  { 95139, true },
    -  { 95159, true },
    -  { 95174, true },
    -  { 95185, true },
    -  { 95201, true },
    -  { 95213, true },
    -  { 95230, true },
    -  { 95241, true },
    -  { 95249, true },
    -  { 95261, true },
    -  { 95280, true },
    -  { 95292, true },
    -  { 95306, true },
    -  { 95323, true },
    -  { 95339, true },
    -  { 95355, true },
    -  { 95367, true },
    -  { 95384, false },
    -  { 95404, true },
    -  { 95424, true },
    -  { 95445, true },
    -  { 95466, false },
    -  { 95483, true },
    -  { 95502, true },
    +  { 94857, true },
    +  { 94870, true },
    +  { 94895, true },
    +  { 94911, true },
    +  { 94931, true },
    +  { 94946, true },
    +  { 94957, true },
    +  { 94973, true },
    +  { 94985, true },
    +  { 95002, true },
    +  { 95013, true },
    +  { 95021, true },
    +  { 95033, true },
    +  { 95045, true },
    +  { 95059, true },
    +  { 95076, true },
    +  { 95092, true },
    +  { 95108, true },
    +  { 95120, true },
    +  { 95137, false },
    +  { 95157, true },
    +  { 95177, true },
    +  { 95198, true },
    +  { 95219, false },
    +  { 95236, true },
    +  { 95255, true },
    +  { 95270, true },
    +  { 95287, true },
    +  { 95314, true },
    +  { 95325, true },
    +  { 95335, true },
    +  { 95350, true },
    +  { 95362, true },
    +  { 95383, true },
    +  { 95392, true },
    +  { 95401, true },
    +  { 95409, false },
    +  { 95426, true },
    +  { 95437, true },
    +  { 95455, true },
    +  { 95466, true },
    +  { 95482, true },
    +  { 95504, true },
       { 95517, true },
    -  { 95534, true },
    -  { 95561, true },
    -  { 95572, true },
    -  { 95582, true },
    -  { 95597, true },
    -  { 95609, true },
    -  { 95630, true },
    -  { 95639, true },
    -  { 95648, true },
    -  { 95656, false },
    -  { 95673, true },
    -  { 95684, true },
    -  { 95702, true },
    -  { 95713, true },
    -  { 95729, true },
    -  { 95751, true },
    -  { 95764, true },
    -  { 95776, true },
    -  { 95793, true },
    -  { 95803, true },
    -  { 95821, true },
    -  { 95838, true },
    -  { 95855, true },
    -  { 95863, true },
    -  { 95887, true },
    -  { 95901, true },
    -  { 95914, true },
    -  { 95932, true },
    -  { 95946, true },
    -  { 95965, true },
    -  { 95975, true },
    -  { 95987, true },
    -  { 96011, true },
    -  { 96023, true },
    +  { 95529, true },
    +  { 95546, true },
    +  { 95556, true },
    +  { 95574, true },
    +  { 95591, true },
    +  { 95608, true },
    +  { 95632, true },
    +  { 95646, true },
    +  { 95659, true },
    +  { 95677, true },
    +  { 95691, true },
    +  { 95710, true },
    +  { 95722, true },
    +  { 95746, true },
    +  { 95758, true },
    +  { 95771, true },
    +  { 95778, true },
    +  { 95798, true },
    +  { 95814, true },
    +  { 95824, true },
    +  { 95835, true },
    +  { 95842, true },
    +  { 95851, true },
    +  { 95870, true },
    +  { 95883, true },
    +  { 95893, true },
    +  { 95903, true },
    +  { 95916, true },
    +  { 95928, true },
    +  { 95939, true },
    +  { 95951, true },
    +  { 95966, true },
    +  { 95981, true },
    +  { 95999, true },
    +  { 96010, false },
       { 96036, true },
    -  { 96043, true },
    -  { 96063, true },
    -  { 96079, true },
    -  { 96089, true },
    -  { 96100, true },
    -  { 96107, true },
    -  { 96116, true },
    -  { 96135, true },
    -  { 96148, true },
    -  { 96158, true },
    -  { 96168, true },
    -  { 96181, true },
    -  { 96193, true },
    -  { 96204, true },
    -  { 96216, true },
    -  { 96231, true },
    -  { 96246, true },
    -  { 96264, true },
    -  { 96275, false },
    -  { 96301, true },
    -  { 96315, true },
    +  { 96050, true },
    +  { 96064, true },
    +  { 96077, true },
    +  { 96090, true },
    +  { 96101, true },
    +  { 96115, true },
    +  { 96128, true },
    +  { 96140, true },
    +  { 96153, false },
    +  { 96167, true },
    +  { 96177, true },
    +  { 96188, true },
    +  { 96199, true },
    +  { 96210, true },
    +  { 96223, true },
    +  { 96235, true },
    +  { 96256, true },
    +  { 96269, true },
    +  { 96277, true },
    +  { 96291, true },
    +  { 96306, true },
       { 96329, true },
    -  { 96342, true },
    +  { 96340, false },
       { 96355, true },
    -  { 96366, true },
    -  { 96380, true },
    -  { 96393, true },
    -  { 96405, true },
    -  { 96418, false },
    -  { 96432, true },
    -  { 96442, true },
    -  { 96453, true },
    +  { 96368, true },
    +  { 96384, true },
    +  { 96396, true },
    +  { 96410, true },
    +  { 96424, true },
    +  { 96437, true },
    +  { 96451, true },
       { 96464, true },
    -  { 96475, true },
    -  { 96488, true },
    -  { 96500, true },
    -  { 96521, true },
    -  { 96534, true },
    -  { 96542, true },
    -  { 96556, true },
    -  { 96571, true },
    -  { 96594, true },
    -  { 96605, false },
    -  { 96620, true },
    +  { 96482, true },
    +  { 96510, true },
    +  { 96538, true },
    +  { 96548, true },
    +  { 96564, true },
    +  { 96577, false },
    +  { 96592, true },
    +  { 96610, true },
    +  { 96618, true },
       { 96633, true },
    -  { 96649, true },
    +  { 96646, true },
       { 96661, true },
    -  { 96675, true },
    -  { 96689, true },
    -  { 96702, true },
    -  { 96716, true },
    -  { 96729, true },
    -  { 96747, true },
    -  { 96775, true },
    +  { 96677, true },
    +  { 96691, true },
    +  { 96701, true },
    +  { 96710, false },
    +  { 96721, true },
    +  { 96732, true },
    +  { 96742, true },
    +  { 96754, true },
    +  { 96765, true },
    +  { 96792, true },
       { 96803, true },
    -  { 96813, true },
    -  { 96829, true },
    -  { 96842, false },
    -  { 96857, true },
    +  { 96812, true },
    +  { 96821, true },
    +  { 96838, true },
    +  { 96852, true },
       { 96875, true },
    -  { 96883, true },
    -  { 96898, true },
    -  { 96911, true },
    -  { 96926, true },
    -  { 96942, true },
    -  { 96956, true },
    -  { 96966, true },
    -  { 96975, false },
    -  { 96986, true },
    +  { 96891, true },
    +  { 96912, true },
    +  { 96928, true },
    +  { 96948, true },
    +  { 96970, true },
    +  { 96980, true },
    +  { 96988, true },
       { 96997, true },
    -  { 97007, true },
    -  { 97019, true },
    -  { 97030, true },
    +  { 97008, true },
    +  { 97022, true },
    +  { 97032, true },
    +  { 97047, true },
       { 97057, true },
    -  { 97068, true },
       { 97077, true },
    -  { 97086, true },
    -  { 97103, true },
    -  { 97117, true },
    -  { 97140, true },
    -  { 97156, true },
    -  { 97177, true },
    -  { 97193, true },
    -  { 97213, true },
    -  { 97235, true },
    -  { 97245, true },
    -  { 97253, true },
    -  { 97262, true },
    -  { 97273, true },
    -  { 97287, true },
    -  { 97297, true },
    -  { 97312, true },
    -  { 97322, true },
    -  { 97342, true },
    +  { 97087, true },
    +  { 97101, true },
    +  { 97114, true },
    +  { 97126, true },
    +  { 97145, true },
    +  { 97158, true },
    +  { 97182, false },
    +  { 97201, true },
    +  { 97229, true },
    +  { 97243, true },
    +  { 97257, true },
    +  { 97269, false },
    +  { 97283, true },
    +  { 97293, true },
    +  { 97315, true },
    +  { 97333, true },
    +  { 97341, true },
       { 97352, true },
    -  { 97366, true },
    -  { 97379, true },
    -  { 97391, true },
    -  { 97410, true },
    -  { 97423, true },
    -  { 97447, false },
    -  { 97466, true },
    -  { 97494, true },
    -  { 97508, true },
    -  { 97522, true },
    -  { 97534, false },
    -  { 97548, true },
    -  { 97558, true },
    -  { 97580, true },
    -  { 97598, true },
    -  { 97606, true },
    -  { 97617, true },
    -  { 97633, true },
    +  { 97368, true },
    +  { 97382, true },
    +  { 97398, true },
    +  { 97413, true },
    +  { 97428, true },
    +  { 97440, true },
    +  { 97452, true },
    +  { 97471, true },
    +  { 97487, false },
    +  { 97512, true },
    +  { 97529, true },
    +  { 97539, true },
    +  { 97550, true },
    +  { 97565, true },
    +  { 97572, true },
    +  { 97583, true },
    +  { 97597, true },
    +  { 97610, true },
    +  { 97623, true },
    +  { 97636, true },
       { 97647, true },
    -  { 97663, true },
    -  { 97678, true },
    -  { 97693, true },
    -  { 97705, true },
    -  { 97717, true },
    -  { 97736, true },
    -  { 97752, false },
    -  { 97777, true },
    -  { 97794, true },
    -  { 97804, true },
    -  { 97815, true },
    -  { 97830, true },
    -  { 97837, true },
    -  { 97848, true },
    -  { 97862, true },
    -  { 97875, true },
    -  { 97888, true },
    -  { 97901, true },
    -  { 97912, true },
    -  { 97925, true },
    -  { 97935, true },
    -  { 97945, true },
    -  { 97957, true },
    -  { 97969, true },
    -  { 97978, true },
    -  { 97985, true },
    -  { 97995, false },
    -  { 98011, true },
    +  { 97660, true },
    +  { 97670, true },
    +  { 97680, true },
    +  { 97692, true },
    +  { 97704, true },
    +  { 97713, true },
    +  { 97720, true },
    +  { 97730, false },
    +  { 97746, true },
    +  { 97757, true },
    +  { 97775, true },
    +  { 97793, true },
    +  { 97807, true },
    +  { 97821, true },
    +  { 97844, true },
    +  { 97854, true },
    +  { 97869, true },
    +  { 97887, true },
    +  { 97904, true },
    +  { 97918, true },
    +  { 97932, true },
    +  { 97944, true },
    +  { 97956, true },
    +  { 97969, false },
    +  { 97980, true },
    +  { 97994, true },
    +  { 98007, true },
       { 98022, true },
    -  { 98040, true },
    -  { 98058, true },
    -  { 98072, true },
    -  { 98086, true },
    -  { 98109, true },
    -  { 98119, true },
    -  { 98134, true },
    -  { 98152, true },
    -  { 98169, true },
    -  { 98183, true },
    -  { 98197, true },
    -  { 98209, true },
    -  { 98221, true },
    -  { 98234, false },
    -  { 98245, true },
    -  { 98259, true },
    -  { 98272, true },
    -  { 98287, true },
    -  { 98306, true },
    -  { 98321, true },
    -  { 98345, false },
    -  { 98360, true },
    -  { 98371, true },
    -  { 98394, true },
    -  { 98405, true },
    -  { 98416, true },
    -  { 98428, true },
    +  { 98041, true },
    +  { 98056, true },
    +  { 98080, false },
    +  { 98095, true },
    +  { 98106, true },
    +  { 98129, true },
    +  { 98140, true },
    +  { 98151, true },
    +  { 98163, true },
    +  { 98177, true },
    +  { 98190, true },
    +  { 98203, true },
    +  { 98216, true },
    +  { 98238, true },
    +  { 98248, true },
    +  { 98268, true },
    +  { 98286, true },
    +  { 98300, true },
    +  { 98317, false },
    +  { 98332, false },
    +  { 98348, true },
    +  { 98365, true },
    +  { 98376, true },
    +  { 98398, true },
    +  { 98412, true },
    +  { 98432, true },
       { 98442, true },
    -  { 98455, true },
    -  { 98468, true },
    -  { 98481, true },
    -  { 98503, true },
    -  { 98513, true },
    -  { 98533, true },
    -  { 98551, true },
    -  { 98565, true },
    -  { 98582, false },
    -  { 98597, false },
    -  { 98613, true },
    -  { 98630, true },
    -  { 98641, true },
    -  { 98663, true },
    -  { 98677, true },
    +  { 98453, true },
    +  { 98462, true },
    +  { 98473, true },
    +  { 98485, true },
    +  { 98495, true },
    +  { 98508, true },
    +  { 98525, true },
    +  { 98546, true },
    +  { 98560, true },
    +  { 98587, true },
    +  { 98602, true },
    +  { 98622, true },
    +  { 98637, true },
    +  { 98648, true },
    +  { 98660, true },
    +  { 98673, true },
    +  { 98684, true },
       { 98697, true },
    -  { 98707, true },
    -  { 98718, true },
    -  { 98727, true },
    -  { 98738, true },
    -  { 98750, true },
    -  { 98760, true },
    -  { 98773, true },
    -  { 98790, true },
    -  { 98811, true },
    -  { 98825, true },
    -  { 98852, true },
    -  { 98867, true },
    -  { 98887, true },
    +  { 98711, true },
    +  { 98724, true },
    +  { 98744, true },
    +  { 98767, true },
    +  { 98777, true },
    +  { 98787, true },
    +  { 98800, true },
    +  { 98810, true },
    +  { 98827, true },
    +  { 98843, true },
    +  { 98858, true },
    +  { 98878, true },
    +  { 98888, true },
       { 98902, true },
    -  { 98913, true },
    -  { 98925, true },
    -  { 98938, true },
    -  { 98949, true },
    -  { 98962, true },
    -  { 98976, true },
    -  { 98989, true },
    +  { 98914, true },
    +  { 98939, true },
    +  { 98953, true },
    +  { 98967, true },
    +  { 98981, true },
    +  { 98995, true },
       { 99009, true },
    -  { 99032, true },
    -  { 99042, true },
    +  { 99024, true },
    +  { 99038, true },
       { 99052, true },
    -  { 99065, true },
    -  { 99075, true },
    -  { 99092, true },
    -  { 99108, true },
    -  { 99123, true },
    +  { 99066, true },
    +  { 99086, true },
    +  { 99098, true },
    +  { 99115, true },
    +  { 99130, true },
       { 99143, true },
    -  { 99153, true },
    -  { 99167, true },
    -  { 99179, true },
    +  { 99161, true },
    +  { 99176, true },
    +  { 99192, true },
       { 99204, true },
    -  { 99218, true },
    -  { 99232, true },
    -  { 99246, true },
    -  { 99260, true },
    -  { 99274, true },
    -  { 99289, true },
    -  { 99303, true },
    -  { 99317, true },
    -  { 99331, true },
    -  { 99351, true },
    -  { 99363, true },
    -  { 99380, true },
    -  { 99395, true },
    +  { 99231, true },
    +  { 99248, true },
    +  { 99263, true },
    +  { 99272, false },
    +  { 99287, true },
    +  { 99298, true },
    +  { 99310, true },
    +  { 99319, true },
    +  { 99336, false },
    +  { 99346, true },
    +  { 99362, true },
    +  { 99372, true },
    +  { 99388, true },
       { 99408, true },
    -  { 99426, true },
    -  { 99441, true },
    -  { 99457, true },
    -  { 99469, true },
    -  { 99496, true },
    -  { 99513, true },
    -  { 99528, true },
    -  { 99537, false },
    -  { 99552, true },
    -  { 99563, true },
    -  { 99575, true },
    +  { 99422, true },
    +  { 99436, true },
    +  { 99455, true },
    +  { 99475, true },
    +  { 99485, true },
    +  { 99500, true },
    +  { 99510, true },
    +  { 99524, true },
    +  { 99545, true },
    +  { 99555, true },
    +  { 99570, true },
       { 99584, true },
    -  { 99601, false },
    -  { 99611, true },
    -  { 99627, true },
    -  { 99637, true },
    -  { 99653, true },
    -  { 99673, true },
    -  { 99687, true },
    -  { 99701, true },
    -  { 99720, true },
    -  { 99740, true },
    -  { 99750, true },
    -  { 99765, true },
    -  { 99775, true },
    -  { 99789, true },
    -  { 99810, true },
    -  { 99820, true },
    -  { 99835, true },
    -  { 99849, true },
    -  { 99863, true },
    -  { 99878, true },
    -  { 99894, true },
    -  { 99910, true },
    -  { 99922, true },
    +  { 99598, true },
    +  { 99613, true },
    +  { 99629, true },
    +  { 99645, true },
    +  { 99657, true },
    +  { 99669, true },
    +  { 99681, true },
    +  { 99694, true },
    +  { 99707, true },
    +  { 99721, true },
    +  { 99736, true },
    +  { 99750, false },
    +  { 99776, true },
    +  { 99787, true },
    +  { 99795, true },
    +  { 99803, true },
    +  { 99811, true },
    +  { 99819, true },
    +  { 99829, true },
    +  { 99838, true },
    +  { 99850, true },
    +  { 99862, true },
    +  { 99873, true },
    +  { 99883, true },
    +  { 99900, true },
    +  { 99913, true },
    +  { 99923, true },
       { 99934, true },
    -  { 99946, true },
    -  { 99959, true },
    -  { 99972, true },
    -  { 99986, true },
    -  { 100001, true },
    -  { 100015, false },
    -  { 100041, true },
    +  { 99948, true },
    +  { 99958, true },
    +  { 99965, true },
    +  { 99980, true },
    +  { 100002, true },
    +  { 100010, true },
    +  { 100020, true },
    +  { 100032, true },
    +  { 100042, true },
       { 100052, true },
    -  { 100060, true },
    -  { 100068, true },
    -  { 100076, true },
    -  { 100084, true },
    +  { 100062, true },
    +  { 100073, true },
    +  { 100086, true },
       { 100094, true },
    -  { 100103, true },
    -  { 100115, true },
    -  { 100127, true },
    -  { 100138, true },
    -  { 100148, true },
    -  { 100165, true },
    -  { 100178, true },
    +  { 100108, true },
    +  { 100118, true },
    +  { 100129, true },
    +  { 100136, true },
    +  { 100144, true },
    +  { 100162, true },
    +  { 100173, false },
       { 100188, true },
    -  { 100199, true },
    -  { 100213, true },
    +  { 100198, true },
    +  { 100203, true },
    +  { 100212, true },
       { 100223, true },
    -  { 100230, true },
    -  { 100245, true },
    -  { 100267, true },
    -  { 100277, true },
    -  { 100289, true },
    -  { 100299, true },
    -  { 100309, true },
    +  { 100231, true },
    +  { 100240, true },
    +  { 100260, true },
    +  { 100276, true },
    +  { 100285, false },
    +  { 100296, true },
    +  { 100305, true },
       { 100319, true },
    -  { 100330, true },
    +  { 100332, false },
       { 100343, true },
    -  { 100351, true },
    -  { 100365, true },
    -  { 100375, true },
    -  { 100386, true },
    +  { 100355, true },
    +  { 100370, true },
    +  { 100382, true },
       { 100393, true },
    -  { 100411, true },
    -  { 100422, false },
    -  { 100437, true },
    -  { 100447, true },
    -  { 100452, true },
    -  { 100461, true },
    -  { 100472, true },
    +  { 100404, true },
    +  { 100416, true },
    +  { 100439, true },
    +  { 100449, true },
    +  { 100465, true },
       { 100480, true },
    -  { 100489, true },
    -  { 100509, true },
    -  { 100525, true },
    -  { 100534, false },
    -  { 100545, true },
    -  { 100554, true },
    +  { 100493, true },
    +  { 100502, true },
    +  { 100517, true },
    +  { 100530, true },
    +  { 100543, true },
    +  { 100558, true },
       { 100568, true },
    -  { 100584, true },
    -  { 100597, true },
    -  { 100609, true },
    -  { 100624, true },
    -  { 100636, true },
    -  { 100647, true },
    -  { 100658, true },
    -  { 100670, true },
    -  { 100693, true },
    -  { 100703, true },
    -  { 100719, true },
    +  { 100584, false },
    +  { 100594, true },
    +  { 100608, true },
    +  { 100619, true },
    +  { 100629, true },
    +  { 100643, true },
    +  { 100654, true },
    +  { 100667, true },
    +  { 100680, true },
    +  { 100692, true },
    +  { 100710, true },
    +  { 100721, true },
       { 100734, true },
    -  { 100747, true },
    -  { 100756, true },
    -  { 100771, true },
    +  { 100745, true },
    +  { 100769, true },
       { 100784, true },
    -  { 100797, true },
    -  { 100812, true },
    -  { 100822, true },
    -  { 100838, false },
    +  { 100809, true },
    +  { 100817, true },
    +  { 100833, false },
       { 100848, true },
    -  { 100862, true },
    -  { 100873, true },
    -  { 100883, true },
    -  { 100897, true },
    -  { 100908, true },
    -  { 100921, true },
    -  { 100934, true },
    -  { 100946, true },
    -  { 100964, true },
    -  { 100975, true },
    -  { 100988, true },
    -  { 100999, true },
    -  { 101023, true },
    -  { 101038, true },
    -  { 101063, true },
    -  { 101071, true },
    -  { 101087, false },
    -  { 101102, true },
    -  { 101114, true },
    -  { 101126, true },
    -  { 101140, true },
    -  { 101154, true },
    -  { 101168, true },
    -  { 101182, true },
    -  { 101194, true },
    -  { 101211, true },
    -  { 101228, true },
    -  { 101240, true },
    -  { 101254, true },
    -  { 101276, true },
    -  { 101290, true },
    -  { 101311, true },
    -  { 101328, true },
    -  { 101339, true },
    -  { 101352, true },
    -  { 101368, true },
    -  { 101380, true },
    -  { 101394, true },
    -  { 101410, true },
    -  { 101427, true },
    -  { 101441, true },
    -  { 101453, false },
    -  { 101478, true },
    -  { 101488, false },
    -  { 101514, true },
    -  { 101531, true },
    -  { 101542, true },
    -  { 101572, false },
    -  { 101586, true },
    -  { 101603, true },
    -  { 101617, true },
    -  { 101632, true },
    -  { 101640, true },
    -  { 101648, true },
    -  { 101656, true },
    -  { 101664, true },
    -  { 101672, true },
    -  { 101683, true },
    +  { 100860, true },
    +  { 100872, true },
    +  { 100886, true },
    +  { 100900, true },
    +  { 100914, true },
    +  { 100928, true },
    +  { 100940, true },
    +  { 100957, true },
    +  { 100974, true },
    +  { 100986, true },
    +  { 101000, true },
    +  { 101022, true },
    +  { 101036, true },
    +  { 101054, true },
    +  { 101075, true },
    +  { 101092, true },
    +  { 101103, true },
    +  { 101116, true },
    +  { 101132, true },
    +  { 101144, true },
    +  { 101158, true },
    +  { 101174, true },
    +  { 101191, true },
    +  { 101205, true },
    +  { 101217, false },
    +  { 101242, true },
    +  { 101252, false },
    +  { 101278, true },
    +  { 101295, true },
    +  { 101306, true },
    +  { 101336, false },
    +  { 101350, true },
    +  { 101367, true },
    +  { 101381, true },
    +  { 101396, true },
    +  { 101404, true },
    +  { 101412, true },
    +  { 101420, true },
    +  { 101428, true },
    +  { 101436, true },
    +  { 101447, true },
    +  { 101457, true },
    +  { 101472, true },
    +  { 101486, true },
    +  { 101502, true },
    +  { 101513, true },
    +  { 101538, true },
    +  { 101547, false },
    +  { 101563, true },
    +  { 101573, false },
    +  { 101595, true },
    +  { 101610, true },
    +  { 101624, true },
    +  { 101637, true },
    +  { 101654, true },
    +  { 101670, true },
       { 101693, true },
    -  { 101708, true },
    -  { 101722, true },
    -  { 101738, true },
    -  { 101749, true },
    -  { 101774, true },
    -  { 101783, false },
    -  { 101799, true },
    -  { 101809, false },
    -  { 101831, true },
    -  { 101846, true },
    -  { 101860, true },
    -  { 101873, true },
    -  { 101890, true },
    -  { 101906, true },
    -  { 101929, true },
    +  { 101715, true },
    +  { 101734, false },
    +  { 101753, true },
    +  { 101766, true },
    +  { 101779, true },
    +  { 101803, true },
    +  { 101814, true },
    +  { 101833, true },
    +  { 101861, true },
    +  { 101882, true },
    +  { 101895, true },
    +  { 101911, true },
    +  { 101931, true },
       { 101951, true },
    -  { 101970, false },
    -  { 101989, true },
    -  { 102002, true },
    -  { 102015, true },
    -  { 102039, true },
    -  { 102050, true },
    -  { 102069, true },
    -  { 102097, true },
    -  { 102118, true },
    -  { 102131, true },
    -  { 102147, true },
    -  { 102167, true },
    -  { 102187, true },
    -  { 102207, true },
    -  { 102221, true },
    -  { 102242, false },
    -  { 102253, true },
    -  { 102272, true },
    -  { 102283, true },
    -  { 102295, true },
    +  { 101971, true },
    +  { 101985, true },
    +  { 102006, false },
    +  { 102017, true },
    +  { 102036, true },
    +  { 102047, true },
    +  { 102059, true },
    +  { 102070, true },
    +  { 102085, true },
    +  { 102115, true },
    +  { 102129, true },
    +  { 102141, true },
    +  { 102152, true },
    +  { 102176, true },
    +  { 102197, true },
    +  { 102210, true },
    +  { 102227, true },
    +  { 102243, true },
    +  { 102261, true },
    +  { 102278, true },
    +  { 102292, true },
       { 102306, true },
    -  { 102321, true },
    -  { 102351, true },
    -  { 102365, true },
    -  { 102377, true },
    -  { 102388, true },
    -  { 102412, true },
    -  { 102433, true },
    -  { 102446, true },
    -  { 102463, true },
    -  { 102479, true },
    -  { 102497, true },
    -  { 102514, true },
    -  { 102528, true },
    -  { 102542, true },
    -  { 102558, true },
    -  { 102573, true },
    -  { 102593, true },
    -  { 102608, true },
    -  { 102627, true },
    -  { 102638, true },
    +  { 102322, true },
    +  { 102337, true },
    +  { 102357, true },
    +  { 102372, true },
    +  { 102391, true },
    +  { 102402, true },
    +  { 102419, true },
    +  { 102435, true },
    +  { 102452, true },
    +  { 102467, true },
    +  { 102483, true },
    +  { 102500, true },
    +  { 102515, true },
    +  { 102534, true },
    +  { 102550, true },
    +  { 102560, true },
    +  { 102579, true },
    +  { 102599, true },
    +  { 102611, true },
    +  { 102628, false },
    +  { 102643, true },
       { 102655, true },
    -  { 102671, true },
    -  { 102688, true },
    -  { 102704, true },
    -  { 102721, true },
    -  { 102736, true },
    -  { 102755, true },
    +  { 102668, true },
    +  { 102678, true },
    +  { 102695, true },
    +  { 102707, true },
    +  { 102717, true },
    +  { 102740, true },
    +  { 102754, true },
       { 102771, true },
    -  { 102781, true },
    -  { 102800, true },
    -  { 102820, true },
    -  { 102832, true },
    -  { 102849, false },
    -  { 102864, true },
    -  { 102876, true },
    -  { 102889, true },
    +  { 102786, true },
    +  { 102805, true },
    +  { 102838, true },
    +  { 102848, true },
    +  { 102864, false },
    +  { 102887, true },
       { 102899, true },
    -  { 102916, true },
    -  { 102928, true },
    -  { 102938, true },
    -  { 102961, true },
    -  { 102975, true },
    -  { 102992, true },
    -  { 103007, true },
    -  { 103026, true },
    -  { 103059, true },
    -  { 103069, true },
    -  { 103085, false },
    -  { 103108, true },
    -  { 103120, true },
    -  { 103135, true },
    -  { 103155, true },
    -  { 103167, true },
    -  { 103180, true },
    -  { 103198, true },
    -  { 103212, true },
    -  { 103225, true },
    -  { 103238, true },
    -  { 103251, true },
    -  { 103262, true },
    -  { 103277, true },
    -  { 103291, true },
    -  { 103305, true },
    -  { 103324, true },
    -  { 103346, true },
    -  { 103359, true },
    -  { 103369, false },
    -  { 103381, true },
    -  { 103395, true },
    -  { 103410, true },
    -  { 103429, true },
    -  { 103443, true },
    -  { 103468, true },
    -  { 103482, true },
    -  { 103501, true },
    -  { 103518, true },
    -  { 103531, true },
    -  { 103548, true },
    -  { 103564, true },
    -  { 103583, true },
    -  { 103600, true },
    +  { 102914, true },
    +  { 102934, true },
    +  { 102946, true },
    +  { 102959, true },
    +  { 102977, true },
    +  { 102991, true },
    +  { 103004, true },
    +  { 103017, true },
    +  { 103030, true },
    +  { 103041, true },
    +  { 103056, true },
    +  { 103070, true },
    +  { 103084, true },
    +  { 103103, true },
    +  { 103125, true },
    +  { 103138, true },
    +  { 103148, false },
    +  { 103160, true },
    +  { 103174, true },
    +  { 103189, true },
    +  { 103208, true },
    +  { 103222, true },
    +  { 103247, true },
    +  { 103261, true },
    +  { 103280, true },
    +  { 103297, true },
    +  { 103310, true },
    +  { 103327, true },
    +  { 103343, true },
    +  { 103362, true },
    +  { 103379, true },
    +  { 103387, true },
    +  { 103403, true },
    +  { 103419, false },
    +  { 103436, true },
    +  { 103449, true },
    +  { 103469, true },
    +  { 103483, true },
    +  { 103500, true },
    +  { 103517, true },
    +  { 103536, true },
    +  { 103554, true },
    +  { 103567, true },
    +  { 103585, true },
    +  { 103594, true },
       { 103608, true },
    -  { 103624, true },
    -  { 103640, false },
    +  { 103625, true },
    +  { 103648, true },
       { 103657, true },
    -  { 103670, true },
    -  { 103690, true },
    -  { 103704, true },
    -  { 103721, true },
    +  { 103673, true },
    +  { 103691, true },
    +  { 103703, true },
    +  { 103712, true },
    +  { 103725, true },
       { 103738, true },
    -  { 103757, true },
    -  { 103775, true },
    -  { 103788, true },
    -  { 103806, true },
    -  { 103815, true },
    -  { 103829, true },
    -  { 103846, true },
    -  { 103869, true },
    -  { 103878, true },
    -  { 103894, true },
    -  { 103912, true },
    -  { 103924, true },
    -  { 103933, true },
    -  { 103946, true },
    -  { 103959, true },
    -  { 103975, true },
    -  { 103983, true },
    -  { 103995, true },
    -  { 104005, true },
    -  { 104024, true },
    -  { 104039, true },
    -  { 104054, true },
    -  { 104076, true },
    -  { 104095, true },
    -  { 104109, true },
    -  { 104121, true },
    +  { 103754, true },
    +  { 103762, true },
    +  { 103774, true },
    +  { 103784, true },
    +  { 103803, true },
    +  { 103818, true },
    +  { 103833, true },
    +  { 103855, true },
    +  { 103874, true },
    +  { 103888, true },
    +  { 103900, true },
    +  { 103914, true },
    +  { 103927, false },
    +  { 103949, true },
    +  { 103962, true },
    +  { 103976, true },
    +  { 103987, true },
    +  { 104001, false },
    +  { 104021, true },
    +  { 104032, false },
    +  { 104041, false },
    +  { 104057, true },
    +  { 104072, false },
    +  { 104090, true },
    +  { 104100, true },
    +  { 104111, false },
    +  { 104126, true },
       { 104135, true },
    -  { 104148, false },
    -  { 104170, true },
    -  { 104183, true },
    -  { 104197, true },
    -  { 104208, true },
    -  { 104222, false },
    -  { 104242, true },
    -  { 104253, false },
    -  { 104262, false },
    +  { 104147, true },
    +  { 104156, true },
    +  { 104169, true },
    +  { 104182, true },
    +  { 104193, true },
    +  { 104207, true },
    +  { 104220, true },
    +  { 104237, true },
    +  { 104254, true },
    +  { 104261, true },
    +  { 104269, true },
       { 104278, true },
    -  { 104293, false },
    -  { 104311, true },
    -  { 104321, true },
    -  { 104332, false },
    -  { 104347, true },
    -  { 104356, true },
    -  { 104368, true },
    -  { 104377, true },
    -  { 104390, true },
    -  { 104403, true },
    -  { 104414, true },
    -  { 104428, true },
    -  { 104441, true },
    -  { 104458, true },
    +  { 104290, true },
    +  { 104313, true },
    +  { 104327, true },
    +  { 104341, true },
    +  { 104358, true },
    +  { 104374, true },
    +  { 104388, true },
    +  { 104395, true },
    +  { 104406, true },
    +  { 104421, true },
    +  { 104433, true },
    +  { 104441, false },
    +  { 104451, true },
    +  { 104463, true },
       { 104475, true },
    -  { 104482, true },
       { 104490, true },
    -  { 104499, true },
    -  { 104511, true },
    -  { 104534, true },
    -  { 104548, true },
    -  { 104562, true },
    +  { 104504, true },
    +  { 104512, true },
    +  { 104520, true },
    +  { 104533, true },
    +  { 104541, true },
    +  { 104552, true },
    +  { 104563, true },
    +  { 104570, true },
       { 104579, true },
    -  { 104595, true },
    +  { 104589, true },
       { 104609, true },
    -  { 104616, true },
    -  { 104627, true },
    -  { 104642, true },
    -  { 104654, true },
    -  { 104662, false },
    -  { 104672, true },
    -  { 104684, true },
    -  { 104696, true },
    -  { 104711, true },
    -  { 104725, true },
    -  { 104733, true },
    -  { 104741, true },
    -  { 104754, true },
    -  { 104762, true },
    -  { 104773, true },
    -  { 104784, true },
    -  { 104791, true },
    -  { 104800, true },
    -  { 104810, true },
    -  { 104830, true },
    -  { 104842, true },
    -  { 104853, true },
    -  { 104862, false },
    -  { 104871, false },
    -  { 104892, true },
    -  { 104903, true },
    -  { 104912, true },
    -  { 104926, true },
    -  { 104943, true },
    +  { 104621, true },
    +  { 104632, true },
    +  { 104641, false },
    +  { 104650, false },
    +  { 104671, true },
    +  { 104682, true },
    +  { 104691, true },
    +  { 104705, true },
    +  { 104722, true },
    +  { 104738, true },
    +  { 104755, true },
    +  { 104767, true },
    +  { 104781, true },
    +  { 104799, true },
    +  { 104813, true },
    +  { 104829, false },
    +  { 104847, true },
    +  { 104864, true },
    +  { 104886, true },
    +  { 104897, true },
    +  { 104909, true },
    +  { 104923, true },
    +  { 104934, true },
    +  { 104948, true },
       { 104959, true },
    -  { 104976, true },
    -  { 104988, true },
    -  { 105002, true },
    -  { 105020, true },
    -  { 105034, true },
    -  { 105050, false },
    -  { 105068, true },
    -  { 105085, true },
    -  { 105107, true },
    +  { 104970, true },
    +  { 104984, true },
    +  { 104995, true },
    +  { 105024, true },
    +  { 105043, true },
    +  { 105062, true },
    +  { 105078, true },
    +  { 105104, true },
       { 105118, true },
    -  { 105130, true },
    -  { 105144, true },
    -  { 105155, true },
    -  { 105169, true },
    -  { 105180, true },
    -  { 105191, true },
    -  { 105205, true },
    -  { 105216, true },
    -  { 105245, true },
    -  { 105264, true },
    -  { 105283, true },
    -  { 105299, true },
    -  { 105325, true },
    -  { 105339, true },
    -  { 105356, true },
    -  { 105375, true },
    -  { 105392, true },
    -  { 105403, true },
    -  { 105411, true },
    -  { 105423, true },
    -  { 105436, true },
    -  { 105451, true },
    -  { 105464, true },
    -  { 105477, true },
    +  { 105135, true },
    +  { 105154, true },
    +  { 105171, true },
    +  { 105182, true },
    +  { 105190, true },
    +  { 105202, true },
    +  { 105215, true },
    +  { 105230, true },
    +  { 105243, true },
    +  { 105256, true },
    +  { 105270, true },
    +  { 105282, true },
    +  { 105294, true },
    +  { 105307, true },
    +  { 105322, true },
    +  { 105335, true },
    +  { 105347, true },
    +  { 105361, true },
    +  { 105372, true },
    +  { 105395, true },
    +  { 105413, true },
    +  { 105432, true },
    +  { 105443, true },
    +  { 105465, true },
    +  { 105473, true },
       { 105491, true },
    -  { 105503, true },
    -  { 105515, true },
    -  { 105528, true },
    -  { 105543, true },
    -  { 105556, true },
    -  { 105568, true },
    -  { 105582, true },
    -  { 105593, true },
    -  { 105616, true },
    -  { 105634, true },
    -  { 105653, true },
    -  { 105664, true },
    -  { 105686, true },
    -  { 105694, true },
    -  { 105712, true },
    -  { 105728, true },
    -  { 105740, true },
    -  { 105758, true },
    -  { 105768, true },
    -  { 105782, true },
    -  { 105798, true },
    -  { 105824, false },
    -  { 105853, true },
    -  { 105864, true },
    -  { 105879, true },
    -  { 105895, true },
    -  { 105910, true },
    -  { 105924, true },
    -  { 105951, true },
    -  { 105969, false },
    -  { 105980, true },
    -  { 105990, true },
    -  { 106005, true },
    -  { 106016, true },
    -  { 106034, true },
    -  { 106057, true },
    -  { 106075, true },
    -  { 106088, false },
    -  { 106102, true },
    -  { 106124, true },
    -  { 106143, true },
    -  { 106157, true },
    -  { 106169, false },
    -  { 106189, true },
    -  { 106205, true },
    +  { 105507, true },
    +  { 105519, true },
    +  { 105537, true },
    +  { 105547, true },
    +  { 105561, true },
    +  { 105577, true },
    +  { 105603, false },
    +  { 105632, true },
    +  { 105643, true },
    +  { 105658, true },
    +  { 105674, true },
    +  { 105689, true },
    +  { 105703, true },
    +  { 105730, true },
    +  { 105748, false },
    +  { 105759, true },
    +  { 105769, true },
    +  { 105784, true },
    +  { 105795, true },
    +  { 105813, true },
    +  { 105836, true },
    +  { 105854, true },
    +  { 105867, false },
    +  { 105881, true },
    +  { 105903, true },
    +  { 105922, true },
    +  { 105936, true },
    +  { 105948, false },
    +  { 105968, true },
    +  { 105984, true },
    +  { 105994, true },
    +  { 106008, true },
    +  { 106029, true },
    +  { 106047, true },
    +  { 106059, true },
    +  { 106069, true },
    +  { 106077, true },
    +  { 106091, true },
    +  { 106103, true },
    +  { 106115, true },
    +  { 106127, true },
    +  { 106139, true },
    +  { 106151, true },
    +  { 106163, true },
    +  { 106175, true },
    +  { 106187, true },
    +  { 106199, true },
       { 106215, true },
    -  { 106229, true },
    -  { 106250, true },
    -  { 106268, true },
    -  { 106280, true },
    +  { 106224, true },
    +  { 106238, true },
    +  { 106254, true },
    +  { 106267, true },
       { 106290, true },
    -  { 106298, true },
    -  { 106312, true },
    -  { 106324, true },
    -  { 106336, true },
    -  { 106348, true },
    -  { 106360, true },
    -  { 106372, true },
    -  { 106384, true },
    -  { 106396, true },
    -  { 106408, true },
    -  { 106420, true },
    -  { 106436, true },
    -  { 106445, true },
    -  { 106459, true },
    -  { 106475, true },
    -  { 106488, true },
    -  { 106511, true },
    -  { 106524, true },
    -  { 106532, false },
    -  { 106548, true },
    -  { 106566, true },
    -  { 106580, true },
    -  { 106590, true },
    -  { 106599, true },
    -  { 106612, true },
    -  { 106628, true },
    -  { 106645, false },
    -  { 106659, true },
    -  { 106679, true },
    -  { 106695, false },
    -  { 106707, true },
    +  { 106303, true },
    +  { 106311, false },
    +  { 106327, true },
    +  { 106345, true },
    +  { 106359, true },
    +  { 106369, true },
    +  { 106378, true },
    +  { 106391, true },
    +  { 106407, true },
    +  { 106424, false },
    +  { 106438, true },
    +  { 106458, true },
    +  { 106474, false },
    +  { 106486, true },
    +  { 106493, true },
    +  { 106508, true },
    +  { 106523, true },
    +  { 106535, true },
    +  { 106553, true },
    +  { 106572, true },
    +  { 106594, true },
    +  { 106614, true },
    +  { 106631, true },
    +  { 106649, true },
    +  { 106667, true },
    +  { 106684, true },
    +  { 106698, true },
       { 106714, true },
    -  { 106729, true },
    -  { 106744, true },
    -  { 106756, true },
    -  { 106774, true },
    +  { 106735, true },
    +  { 106750, true },
    +  { 106769, true },
       { 106793, true },
    -  { 106815, true },
    -  { 106835, true },
    -  { 106852, true },
    -  { 106870, true },
    -  { 106888, true },
    -  { 106905, true },
    -  { 106919, true },
    -  { 106935, true },
    -  { 106952, true },
    -  { 106973, true },
    -  { 106988, true },
    -  { 107007, true },
    -  { 107031, true },
    -  { 107048, true },
    -  { 107061, true },
    -  { 107072, true },
    -  { 107085, true },
    -  { 107098, true },
    -  { 107112, true },
    -  { 107124, true },
    -  { 107134, true },
    -  { 107145, true },
    -  { 107156, true },
    +  { 106810, true },
    +  { 106823, true },
    +  { 106834, true },
    +  { 106847, true },
    +  { 106860, true },
    +  { 106874, true },
    +  { 106886, true },
    +  { 106896, true },
    +  { 106907, true },
    +  { 106918, true },
    +  { 106930, true },
    +  { 106939, true },
    +  { 106948, true },
    +  { 106959, true },
    +  { 106984, true },
    +  { 106995, true },
    +  { 107018, true },
    +  { 107039, true },
    +  { 107057, true },
    +  { 107076, false },
    +  { 107090, true },
    +  { 107101, true },
    +  { 107114, true },
    +  { 107129, true },
    +  { 107140, true },
    +  { 107154, true },
       { 107168, true },
    -  { 107177, true },
    -  { 107186, true },
    -  { 107197, true },
    -  { 107222, true },
    -  { 107233, true },
    -  { 107256, true },
    -  { 107277, true },
    -  { 107295, true },
    -  { 107314, false },
    -  { 107328, true },
    -  { 107339, true },
    -  { 107352, true },
    -  { 107367, true },
    -  { 107378, true },
    -  { 107392, true },
    -  { 107406, true },
    -  { 107419, true },
    -  { 107433, true },
    -  { 107446, true },
    -  { 107457, true },
    -  { 107470, true },
    -  { 107484, true },
    -  { 107493, false },
    -  { 107508, true },
    -  { 107521, true },
    -  { 107534, true },
    -  { 107553, true },
    -  { 107571, true },
    -  { 107587, true },
    -  { 107600, true },
    -  { 107615, true },
    -  { 107625, true },
    -  { 107639, true },
    -  { 107666, true },
    -  { 107680, true },
    -  { 107688, true },
    -  { 107710, true },
    -  { 107724, true },
    -  { 107738, true },
    -  { 107757, true },
    -  { 107776, true },
    -  { 107795, true },
    -  { 107814, true },
    -  { 107834, true },
    -  { 107854, true },
    -  { 107874, true },
    -  { 107892, true },
    -  { 107911, true },
    -  { 107930, true },
    +  { 107181, true },
    +  { 107195, true },
    +  { 107208, true },
    +  { 107219, true },
    +  { 107232, true },
    +  { 107246, true },
    +  { 107255, false },
    +  { 107270, true },
    +  { 107283, true },
    +  { 107296, true },
    +  { 107315, true },
    +  { 107333, true },
    +  { 107349, true },
    +  { 107362, true },
    +  { 107377, true },
    +  { 107387, true },
    +  { 107401, true },
    +  { 107428, true },
    +  { 107442, true },
    +  { 107450, true },
    +  { 107472, true },
    +  { 107486, true },
    +  { 107500, true },
    +  { 107519, true },
    +  { 107538, true },
    +  { 107557, true },
    +  { 107576, true },
    +  { 107596, true },
    +  { 107616, true },
    +  { 107636, true },
    +  { 107654, true },
    +  { 107673, true },
    +  { 107692, true },
    +  { 107711, true },
    +  { 107730, true },
    +  { 107744, true },
    +  { 107756, true },
    +  { 107768, true },
    +  { 107781, false },
    +  { 107803, true },
    +  { 107815, true },
    +  { 107840, true },
    +  { 107856, true },
    +  { 107865, true },
    +  { 107879, true },
    +  { 107896, true },
    +  { 107909, true },
    +  { 107924, true },
    +  { 107937, true },
       { 107949, true },
    -  { 107968, true },
    -  { 107982, true },
    -  { 107994, true },
    -  { 108006, true },
    -  { 108019, false },
    -  { 108041, true },
    -  { 108053, true },
    -  { 108078, true },
    -  { 108094, true },
    -  { 108103, true },
    -  { 108117, true },
    -  { 108134, true },
    -  { 108147, true },
    -  { 108162, true },
    -  { 108175, true },
    -  { 108187, true },
    +  { 107960, true },
    +  { 107974, true },
    +  { 107989, true },
    +  { 108002, true },
    +  { 108013, true },
    +  { 108027, true },
    +  { 108042, true },
    +  { 108051, true },
    +  { 108064, true },
    +  { 108083, true },
    +  { 108097, true },
    +  { 108112, true },
    +  { 108123, true },
    +  { 108133, true },
    +  { 108148, true },
    +  { 108163, true },
    +  { 108184, true },
       { 108198, true },
    -  { 108212, true },
    -  { 108227, true },
    -  { 108240, true },
    +  { 108216, true },
    +  { 108228, true },
    +  { 108238, true },
       { 108251, true },
    -  { 108265, true },
    -  { 108280, true },
    -  { 108289, true },
    -  { 108302, true },
    -  { 108321, true },
    -  { 108335, true },
    -  { 108350, true },
    -  { 108361, true },
    -  { 108371, true },
    -  { 108386, true },
    +  { 108266, true },
    +  { 108278, true },
    +  { 108293, true },
    +  { 108305, true },
    +  { 108313, true },
    +  { 108331, false },
    +  { 108341, true },
    +  { 108356, true },
    +  { 108373, true },
    +  { 108388, true },
       { 108401, true },
    -  { 108422, true },
    -  { 108436, true },
    -  { 108454, true },
    -  { 108466, true },
    -  { 108476, true },
    -  { 108489, true },
    -  { 108504, true },
    -  { 108516, true },
    -  { 108531, true },
    -  { 108543, true },
    -  { 108551, true },
    -  { 108569, false },
    -  { 108579, true },
    -  { 108594, true },
    -  { 108611, true },
    -  { 108626, true },
    -  { 108639, true },
    -  { 108655, true },
    -  { 108675, true },
    -  { 108690, true },
    +  { 108417, true },
    +  { 108437, true },
    +  { 108452, true },
    +  { 108468, true },
    +  { 108482, true },
    +  { 108494, true },
    +  { 108507, true },
    +  { 108528, true },
    +  { 108547, true },
    +  { 108557, true },
    +  { 108571, true },
    +  { 108581, true },
    +  { 108601, true },
    +  { 108610, true },
    +  { 108620, true },
    +  { 108631, false },
    +  { 108640, true },
    +  { 108653, true },
    +  { 108672, true },
    +  { 108682, true },
    +  { 108693, true },
       { 108706, true },
    -  { 108720, true },
    -  { 108732, true },
    -  { 108745, true },
    -  { 108766, true },
    -  { 108785, true },
    +  { 108713, true },
    +  { 108729, true },
    +  { 108740, true },
    +  { 108747, true },
    +  { 108756, true },
    +  { 108764, true },
    +  { 108774, true },
       { 108795, true },
    -  { 108809, true },
    -  { 108819, true },
    -  { 108839, true },
    +  { 108807, true },
    +  { 108816, true },
    +  { 108827, true },
    +  { 108837, true },
       { 108848, true },
    -  { 108858, true },
    -  { 108869, false },
    -  { 108878, true },
    -  { 108891, true },
    -  { 108910, true },
    -  { 108920, true },
    -  { 108931, true },
    -  { 108944, true },
    -  { 108951, true },
    -  { 108967, true },
    -  { 108978, true },
    -  { 108985, true },
    -  { 108994, true },
    -  { 109002, true },
    -  { 109012, true },
    -  { 109033, true },
    -  { 109045, true },
    -  { 109054, true },
    -  { 109065, true },
    -  { 109075, true },
    -  { 109086, true },
    -  { 109093, true },
    -  { 109102, true },
    -  { 109110, true },
    -  { 109121, true },
    -  { 109133, true },
    -  { 109141, true },
    -  { 109149, true },
    -  { 109163, true },
    +  { 108855, true },
    +  { 108864, true },
    +  { 108872, true },
    +  { 108883, true },
    +  { 108895, true },
    +  { 108903, true },
    +  { 108911, true },
    +  { 108925, true },
    +  { 108935, true },
    +  { 108947, true },
    +  { 108961, true },
    +  { 108991, true },
    +  { 109011, true },
    +  { 109025, false },
    +  { 109043, false },
    +  { 109059, true },
    +  { 109074, true },
    +  { 109095, true },
    +  { 109114, true },
    +  { 109127, true },
    +  { 109138, true },
    +  { 109148, true },
    +  { 109159, true },
       { 109173, true },
    -  { 109185, true },
    -  { 109199, true },
    -  { 109229, true },
    -  { 109249, true },
    -  { 109263, false },
    -  { 109281, false },
    +  { 109186, true },
    +  { 109196, false },
    +  { 109212, true },
    +  { 109231, true },
    +  { 109257, true },
    +  { 109280, true },
       { 109297, true },
    -  { 109312, true },
    +  { 109313, true },
    +  { 109326, true },
       { 109333, true },
    -  { 109352, true },
    -  { 109365, true },
    -  { 109376, true },
    -  { 109386, true },
    -  { 109397, true },
    -  { 109411, true },
    -  { 109424, true },
    -  { 109434, false },
    -  { 109450, true },
    -  { 109469, true },
    -  { 109495, true },
    -  { 109518, true },
    -  { 109535, true },
    -  { 109551, true },
    -  { 109564, true },
    -  { 109571, true },
    -  { 109583, true },
    -  { 109595, true },
    -  { 109605, false },
    -  { 109623, true },
    -  { 109636, true },
    -  { 109647, true },
    -  { 109657, false },
    -  { 109673, true },
    -  { 109684, true },
    -  { 109693, true },
    -  { 109701, true },
    -  { 109712, true },
    -  { 109728, true },
    -  { 109740, true },
    -  { 109755, true },
    -  { 109770, true },
    -  { 109785, true },
    -  { 109800, true },
    -  { 109819, true },
    -  { 109839, true },
    -  { 109850, true },
    -  { 109864, true },
    -  { 109879, true },
    -  { 109895, true },
    -  { 109917, true },
    -  { 109930, true },
    -  { 109949, true },
    +  { 109345, true },
    +  { 109357, true },
    +  { 109367, false },
    +  { 109385, true },
    +  { 109398, true },
    +  { 109409, true },
    +  { 109419, false },
    +  { 109435, true },
    +  { 109446, true },
    +  { 109455, true },
    +  { 109463, true },
    +  { 109474, true },
    +  { 109490, true },
    +  { 109502, true },
    +  { 109517, true },
    +  { 109532, true },
    +  { 109547, true },
    +  { 109562, true },
    +  { 109581, true },
    +  { 109601, true },
    +  { 109612, true },
    +  { 109626, true },
    +  { 109641, true },
    +  { 109657, true },
    +  { 109679, true },
    +  { 109692, true },
    +  { 109711, true },
    +  { 109724, true },
    +  { 109733, true },
    +  { 109748, true },
    +  { 109761, true },
    +  { 109773, true },
    +  { 109790, true },
    +  { 109814, true },
    +  { 109831, true },
    +  { 109843, true },
    +  { 109856, true },
    +  { 109871, true },
    +  { 109878, true },
    +  { 109891, true },
    +  { 109904, true },
    +  { 109918, true },
    +  { 109935, true },
    +  { 109950, true },
       { 109962, true },
    -  { 109971, true },
    -  { 109986, true },
    -  { 109999, true },
    -  { 110011, true },
    -  { 110028, true },
    -  { 110052, true },
    -  { 110069, true },
    -  { 110081, true },
    -  { 110094, true },
    -  { 110109, true },
    -  { 110116, true },
    -  { 110129, true },
    -  { 110142, true },
    -  { 110156, true },
    -  { 110173, true },
    -  { 110188, true },
    -  { 110200, true },
    -  { 110208, true },
    -  { 110223, true },
    -  { 110238, true },
    -  { 110253, true },
    -  { 110272, true },
    -  { 110291, true },
    -  { 110310, true },
    -  { 110325, true },
    -  { 110335, true },
    -  { 110348, true },
    +  { 109970, true },
    +  { 109985, true },
    +  { 110000, true },
    +  { 110015, true },
    +  { 110034, true },
    +  { 110053, true },
    +  { 110072, true },
    +  { 110087, true },
    +  { 110097, true },
    +  { 110110, true },
    +  { 110124, true },
    +  { 110135, true },
    +  { 110150, true },
    +  { 110166, true },
    +  { 110179, true },
    +  { 110192, true },
    +  { 110212, true },
    +  { 110221, true },
    +  { 110237, true },
    +  { 110250, true },
    +  { 110265, true },
    +  { 110274, true },
    +  { 110287, true },
    +  { 110305, true },
    +  { 110313, true },
    +  { 110326, true },
    +  { 110344, true },
       { 110362, true },
    -  { 110373, true },
    -  { 110388, true },
    -  { 110404, true },
    -  { 110417, true },
    -  { 110430, true },
    -  { 110450, true },
    -  { 110459, true },
    -  { 110475, true },
    -  { 110488, true },
    -  { 110503, true },
    -  { 110512, true },
    -  { 110525, true },
    -  { 110543, true },
    -  { 110551, true },
    -  { 110564, true },
    -  { 110582, true },
    -  { 110600, true },
    +  { 110393, true },
    +  { 110415, true },
    +  { 110431, true },
    +  { 110442, false },
    +  { 110455, true },
    +  { 110467, true },
    +  { 110482, true },
    +  { 110499, false },
    +  { 110518, true },
    +  { 110534, true },
    +  { 110544, true },
    +  { 110554, true },
    +  { 110570, true },
    +  { 110581, true },
    +  { 110598, true },
    +  { 110611, true },
       { 110631, true },
    -  { 110653, true },
    -  { 110669, true },
    -  { 110680, false },
    -  { 110693, true },
    -  { 110705, true },
    -  { 110720, true },
    -  { 110737, false },
    -  { 110756, true },
    -  { 110772, true },
    -  { 110782, true },
    -  { 110792, true },
    -  { 110808, true },
    -  { 110819, true },
    +  { 110641, true },
    +  { 110652, true },
    +  { 110662, true },
    +  { 110677, true },
    +  { 110692, true },
    +  { 110709, true },
    +  { 110724, true },
    +  { 110735, true },
    +  { 110748, true },
    +  { 110761, true },
    +  { 110774, true },
    +  { 110791, true },
    +  { 110803, true },
    +  { 110816, true },
    +  { 110825, true },
       { 110836, true },
    -  { 110849, true },
    -  { 110869, true },
    +  { 110846, true },
    +  { 110860, true },
    +  { 110871, true },
       { 110879, true },
    -  { 110890, true },
    -  { 110900, true },
    -  { 110915, true },
    -  { 110930, true },
    -  { 110947, true },
    -  { 110962, true },
    -  { 110973, true },
    -  { 110986, true },
    -  { 110999, true },
    -  { 111012, true },
    +  { 110888, true },
    +  { 110902, true },
    +  { 110912, true },
    +  { 110924, true },
    +  { 110934, true },
    +  { 110943, true },
    +  { 110956, true },
    +  { 110967, true },
    +  { 110975, true },
    +  { 110982, true },
    +  { 110993, false },
    +  { 111013, false },
       { 111029, true },
    -  { 111041, true },
    -  { 111054, true },
    -  { 111063, true },
    +  { 111049, true },
    +  { 111063, false },
       { 111074, true },
    -  { 111084, true },
    -  { 111098, true },
    -  { 111109, true },
    -  { 111117, true },
    -  { 111126, true },
    -  { 111140, true },
    -  { 111150, true },
    -  { 111162, true },
    -  { 111172, true },
    -  { 111181, true },
    +  { 111090, true },
    +  { 111103, true },
    +  { 111121, true },
    +  { 111135, true },
    +  { 111152, true },
    +  { 111171, true },
       { 111194, true },
    -  { 111205, true },
    -  { 111213, true },
    -  { 111220, true },
    -  { 111231, false },
    -  { 111251, false },
    -  { 111267, true },
    -  { 111287, true },
    -  { 111301, false },
    -  { 111312, true },
    -  { 111328, true },
    -  { 111341, true },
    -  { 111359, true },
    -  { 111373, true },
    -  { 111390, true },
    -  { 111409, true },
    -  { 111432, true },
    -  { 111444, true },
    -  { 111454, true },
    -  { 111468, true },
    -  { 111478, true },
    -  { 111489, true },
    -  { 111498, true },
    -  { 111507, true },
    +  { 111206, true },
    +  { 111216, true },
    +  { 111230, true },
    +  { 111240, true },
    +  { 111251, true },
    +  { 111260, true },
    +  { 111269, true },
    +  { 111282, true },
    +  { 111299, true },
    +  { 111315, true },
    +  { 111329, true },
    +  { 111337, true },
    +  { 111351, true },
    +  { 111370, true },
    +  { 111386, true },
    +  { 111399, true },
    +  { 111414, true },
    +  { 111425, true },
    +  { 111436, true },
    +  { 111450, true },
    +  { 111465, true },
    +  { 111486, true },
    +  { 111502, true },
       { 111520, true },
    -  { 111537, true },
    -  { 111553, true },
    -  { 111567, true },
    -  { 111575, true },
    -  { 111589, true },
    -  { 111608, true },
    -  { 111624, true },
    -  { 111637, true },
    -  { 111652, true },
    -  { 111663, true },
    -  { 111674, true },
    -  { 111688, true },
    -  { 111703, true },
    -  { 111724, true },
    -  { 111740, true },
    -  { 111758, true },
    -  { 111776, true },
    -  { 111789, true },
    -  { 111801, true },
    +  { 111538, true },
    +  { 111551, true },
    +  { 111563, true },
    +  { 111579, true },
    +  { 111603, true },
    +  { 111620, true },
    +  { 111631, true },
    +  { 111650, true },
    +  { 111658, true },
    +  { 111672, true },
    +  { 111681, true },
    +  { 111688, false },
    +  { 111698, false },
    +  { 111718, true },
    +  { 111728, false },
    +  { 111747, false },
    +  { 111760, false },
    +  { 111771, false },
    +  { 111783, true },
    +  { 111804, true },
       { 111817, true },
    -  { 111841, true },
    -  { 111858, true },
    -  { 111869, true },
    -  { 111888, true },
    -  { 111896, true },
    -  { 111910, true },
    -  { 111919, true },
    -  { 111926, false },
    -  { 111936, false },
    +  { 111830, true },
    +  { 111848, true },
    +  { 111857, true },
    +  { 111873, true },
    +  { 111886, true },
    +  { 111910, false },
    +  { 111926, true },
    +  { 111944, true },
       { 111956, true },
    -  { 111966, false },
    -  { 111985, false },
    -  { 111998, false },
    -  { 112009, false },
    -  { 112021, true },
    -  { 112042, true },
    -  { 112055, true },
    -  { 112068, true },
    -  { 112086, true },
    -  { 112095, true },
    -  { 112111, true },
    -  { 112124, true },
    -  { 112148, false },
    -  { 112164, true },
    -  { 112182, true },
    -  { 112194, true },
    -  { 112211, true },
    -  { 112225, true },
    -  { 112240, true },
    -  { 112254, true },
    +  { 111973, true },
    +  { 111987, true },
    +  { 112002, true },
    +  { 112016, true },
    +  { 112034, true },
    +  { 112044, false },
    +  { 112073, true },
    +  { 112097, true },
    +  { 112107, true },
    +  { 112118, true },
    +  { 112131, true },
    +  { 112146, true },
    +  { 112160, true },
    +  { 112175, true },
    +  { 112193, true },
    +  { 112203, false },
    +  { 112218, true },
    +  { 112231, false },
    +  { 112245, true },
    +  { 112256, true },
    +  { 112264, true },
       { 112272, true },
    -  { 112282, false },
    -  { 112311, true },
    -  { 112335, true },
    -  { 112345, true },
    -  { 112356, true },
    -  { 112369, true },
    -  { 112384, true },
    -  { 112398, true },
    -  { 112413, true },
    -  { 112431, true },
    -  { 112441, false },
    -  { 112456, true },
    -  { 112469, false },
    -  { 112483, true },
    -  { 112494, true },
    -  { 112502, true },
    -  { 112510, true },
    -  { 112522, true },
    -  { 112534, true },
    -  { 112554, true },
    -  { 112577, true },
    -  { 112596, true },
    -  { 112615, true },
    +  { 112284, true },
    +  { 112296, true },
    +  { 112316, true },
    +  { 112339, true },
    +  { 112358, true },
    +  { 112377, true },
    +  { 112396, true },
    +  { 112415, true },
    +  { 112434, true },
    +  { 112453, true },
    +  { 112472, true },
    +  { 112489, true },
    +  { 112507, true },
    +  { 112524, true },
    +  { 112537, true },
    +  { 112551, true },
    +  { 112566, true },
    +  { 112579, false },
    +  { 112593, true },
    +  { 112617, true },
       { 112634, true },
    -  { 112653, true },
    -  { 112672, true },
    -  { 112691, true },
    -  { 112710, true },
    -  { 112727, true },
    +  { 112652, true },
    +  { 112668, true },
    +  { 112686, true },
    +  { 112703, true },
    +  { 112719, true },
    +  { 112732, true },
       { 112745, true },
       { 112762, true },
    -  { 112775, true },
    -  { 112789, true },
    -  { 112804, true },
    -  { 112817, false },
    -  { 112831, true },
    -  { 112855, true },
    -  { 112872, true },
    -  { 112890, true },
    -  { 112906, true },
    -  { 112924, true },
    +  { 112794, true },
    +  { 112811, true },
    +  { 112819, true },
    +  { 112832, true },
    +  { 112859, true },
    +  { 112875, true },
    +  { 112891, true },
    +  { 112905, true },
    +  { 112918, true },
    +  { 112931, true },
       { 112941, true },
    -  { 112957, true },
    -  { 112970, true },
    -  { 112983, true },
    -  { 113000, true },
    -  { 113032, true },
    -  { 113049, true },
    +  { 112954, true },
    +  { 112964, true },
    +  { 112979, true },
    +  { 112994, false },
    +  { 113004, false },
    +  { 113014, true },
    +  { 113026, true },
    +  { 113037, false },
    +  { 113044, true },
       { 113057, true },
    -  { 113070, true },
    -  { 113097, true },
    -  { 113113, true },
    -  { 113129, true },
    -  { 113143, true },
    +  { 113069, true },
    +  { 113089, true },
    +  { 113100, true },
    +  { 113121, true },
    +  { 113137, true },
       { 113156, true },
    -  { 113169, true },
    -  { 113179, true },
    -  { 113192, true },
    -  { 113202, true },
    -  { 113217, true },
    -  { 113232, false },
    -  { 113242, false },
    -  { 113252, true },
    -  { 113264, true },
    -  { 113275, false },
    -  { 113282, true },
    -  { 113295, true },
    -  { 113307, true },
    -  { 113327, true },
    -  { 113338, true },
    -  { 113359, true },
    -  { 113375, true },
    -  { 113394, true },
    -  { 113404, true },
    -  { 113415, true },
    -  { 113424, true },
    +  { 113166, true },
    +  { 113177, true },
    +  { 113186, true },
    +  { 113195, true },
    +  { 113212, true },
    +  { 113241, true },
    +  { 113260, true },
    +  { 113277, true },
    +  { 113300, true },
    +  { 113308, true },
    +  { 113326, false },
    +  { 113340, true },
    +  { 113355, false },
    +  { 113366, true },
    +  { 113379, true },
    +  { 113390, true },
    +  { 113403, true },
    +  { 113420, true },
       { 113433, true },
    -  { 113450, true },
    -  { 113479, true },
    -  { 113498, true },
    -  { 113515, true },
    -  { 113538, true },
    -  { 113546, true },
    -  { 113564, false },
    -  { 113578, true },
    -  { 113593, false },
    -  { 113604, true },
    -  { 113617, true },
    -  { 113628, true },
    -  { 113641, true },
    -  { 113658, true },
    -  { 113671, true },
    -  { 113682, false },
    -  { 113694, true },
    -  { 113703, true },
    -  { 113713, true },
    -  { 113722, true },
    -  { 113732, true },
    -  { 113745, true },
    -  { 113755, true },
    -  { 113768, true },
    -  { 113778, true },
    -  { 113787, true },
    -  { 113800, true },
    -  { 113811, true },
    -  { 113825, true },
    -  { 113840, true },
    -  { 113854, true },
    -  { 113865, true },
    -  { 113877, true },
    -  { 113885, true },
    -  { 113899, true },
    -  { 113914, false },
    -  { 113928, true },
    -  { 113940, true },
    -  { 113955, true },
    -  { 113969, true },
    -  { 113978, true },
    +  { 113444, false },
    +  { 113456, true },
    +  { 113465, true },
    +  { 113475, true },
    +  { 113484, true },
    +  { 113494, true },
    +  { 113507, true },
    +  { 113517, true },
    +  { 113530, true },
    +  { 113540, true },
    +  { 113549, true },
    +  { 113562, true },
    +  { 113573, true },
    +  { 113587, true },
    +  { 113602, true },
    +  { 113616, true },
    +  { 113627, true },
    +  { 113639, true },
    +  { 113647, true },
    +  { 113661, true },
    +  { 113676, false },
    +  { 113690, true },
    +  { 113702, true },
    +  { 113717, true },
    +  { 113731, true },
    +  { 113740, true },
    +  { 113759, true },
    +  { 113774, true },
    +  { 113786, true },
    +  { 113799, true },
    +  { 113809, true },
    +  { 113830, true },
    +  { 113848, true },
    +  { 113869, true },
    +  { 113895, true },
    +  { 113918, true },
    +  { 113937, true },
    +  { 113962, true },
    +  { 113986, true },
       { 113997, true },
    -  { 114012, true },
    -  { 114022, true },
    -  { 114043, true },
    -  { 114061, true },
    -  { 114082, true },
    -  { 114108, true },
    -  { 114131, true },
    +  { 114008, true },
    +  { 114019, true },
    +  { 114033, true },
    +  { 114044, true },
    +  { 114054, true },
    +  { 114062, true },
    +  { 114069, true },
    +  { 114080, true },
    +  { 114091, true },
    +  { 114106, true },
    +  { 114121, true },
    +  { 114132, true },
    +  { 114141, true },
       { 114150, true },
    -  { 114175, true },
    -  { 114199, true },
    -  { 114210, true },
    -  { 114221, true },
    -  { 114232, true },
    -  { 114246, true },
    -  { 114257, true },
    -  { 114267, true },
    -  { 114275, true },
    -  { 114282, true },
    -  { 114293, true },
    -  { 114304, true },
    -  { 114319, true },
    -  { 114334, true },
    -  { 114345, true },
    -  { 114354, true },
    -  { 114363, true },
    -  { 114374, true },
    -  { 114385, true },
    -  { 114399, true },
    -  { 114408, true },
    -  { 114416, true },
    -  { 114428, true },
    -  { 114440, true },
    -  { 114456, true },
    -  { 114466, true },
    -  { 114485, true },
    -  { 114493, true },
    -  { 114501, true },
    +  { 114161, true },
    +  { 114172, true },
    +  { 114186, true },
    +  { 114195, true },
    +  { 114203, true },
    +  { 114215, true },
    +  { 114227, true },
    +  { 114243, true },
    +  { 114253, true },
    +  { 114272, true },
    +  { 114280, true },
    +  { 114288, true },
    +  { 114301, true },
    +  { 114310, true },
    +  { 114331, true },
    +  { 114350, true },
    +  { 114366, true },
    +  { 114381, true },
    +  { 114394, true },
    +  { 114410, true },
    +  { 114418, true },
    +  { 114432, true },
    +  { 114451, false },
    +  { 114460, true },
    +  { 114470, true },
    +  { 114492, true },
       { 114514, true },
    -  { 114523, true },
    -  { 114544, true },
    -  { 114563, true },
    -  { 114579, true },
    -  { 114594, true },
    -  { 114607, true },
    -  { 114623, true },
    +  { 114529, true },
    +  { 114542, false },
    +  { 114556, true },
    +  { 114570, true },
    +  { 114578, true },
    +  { 114590, true },
    +  { 114601, true },
    +  { 114613, true },
       { 114631, true },
    -  { 114645, true },
    -  { 114664, false },
    -  { 114673, true },
    -  { 114683, true },
    -  { 114705, true },
    -  { 114727, true },
    -  { 114742, true },
    -  { 114755, false },
    -  { 114769, true },
    -  { 114783, true },
    -  { 114791, true },
    -  { 114803, true },
    -  { 114814, true },
    -  { 114826, true },
    -  { 114844, true },
    -  { 114857, true },
    -  { 114870, true },
    -  { 114882, true },
    +  { 114644, true },
    +  { 114657, true },
    +  { 114669, true },
    +  { 114679, true },
    +  { 114688, true },
    +  { 114698, true },
    +  { 114708, true },
    +  { 114718, true },
    +  { 114733, true },
    +  { 114745, true },
    +  { 114758, true },
    +  { 114768, true },
    +  { 114781, true },
    +  { 114792, true },
    +  { 114815, false },
    +  { 114829, true },
    +  { 114841, true },
    +  { 114854, true },
    +  { 114867, true },
    +  { 114878, true },
       { 114892, true },
    -  { 114901, true },
    -  { 114911, true },
    -  { 114921, true },
    -  { 114931, true },
    -  { 114946, true },
    -  { 114958, true },
    -  { 114971, true },
    -  { 114981, true },
    -  { 114994, true },
    +  { 114906, true },
    +  { 114916, true },
    +  { 114925, true },
    +  { 114935, true },
    +  { 114950, true },
    +  { 114962, true },
    +  { 114974, true },
    +  { 114988, true },
       { 115005, true },
    -  { 115028, false },
    -  { 115042, true },
    -  { 115054, true },
    -  { 115067, true },
    -  { 115080, true },
    -  { 115091, true },
    -  { 115105, true },
    -  { 115119, true },
    -  { 115129, true },
    -  { 115138, true },
    -  { 115148, true },
    -  { 115163, true },
    -  { 115175, true },
    -  { 115187, true },
    -  { 115201, true },
    -  { 115218, true },
    -  { 115228, false },
    -  { 115237, false },
    -  { 115256, true },
    -  { 115272, true },
    -  { 115287, true },
    -  { 115302, true },
    -  { 115314, true },
    -  { 115327, true },
    -  { 115339, true },
    -  { 115352, true },
    -  { 115370, true },
    -  { 115385, true },
    -  { 115400, false },
    -  { 115416, true },
    -  { 115428, true },
    -  { 115440, true },
    -  { 115451, true },
    -  { 115464, false },
    -  { 115479, true },
    -  { 115494, true },
    -  { 115504, true },
    -  { 115524, true },
    -  { 115534, true },
    +  { 115015, false },
    +  { 115024, false },
    +  { 115043, true },
    +  { 115059, true },
    +  { 115074, true },
    +  { 115089, true },
    +  { 115101, true },
    +  { 115114, true },
    +  { 115126, true },
    +  { 115139, true },
    +  { 115157, true },
    +  { 115172, true },
    +  { 115187, false },
    +  { 115203, true },
    +  { 115215, true },
    +  { 115227, true },
    +  { 115238, true },
    +  { 115251, false },
    +  { 115266, true },
    +  { 115281, true },
    +  { 115291, true },
    +  { 115311, true },
    +  { 115321, true },
    +  { 115335, true },
    +  { 115349, true },
    +  { 115360, true },
    +  { 115376, true },
    +  { 115387, true },
    +  { 115405, true },
    +  { 115423, true },
    +  { 115436, true },
    +  { 115457, false },
    +  { 115476, true },
    +  { 115496, true },
    +  { 115518, true },
    +  { 115530, true },
       { 115548, true },
    -  { 115562, true },
    -  { 115573, true },
    -  { 115589, true },
    -  { 115600, true },
    -  { 115618, true },
    -  { 115636, true },
    -  { 115649, true },
    -  { 115670, false },
    -  { 115689, true },
    -  { 115709, true },
    -  { 115731, true },
    -  { 115743, true },
    -  { 115761, true },
    -  { 115776, true },
    -  { 115788, true },
    -  { 115804, true },
    -  { 115819, true },
    -  { 115835, true },
    -  { 115851, true },
    -  { 115868, true },
    +  { 115563, true },
    +  { 115575, true },
    +  { 115591, true },
    +  { 115606, true },
    +  { 115622, true },
    +  { 115638, true },
    +  { 115655, true },
    +  { 115677, true },
    +  { 115688, true },
    +  { 115704, true },
    +  { 115717, true },
    +  { 115737, true },
    +  { 115752, true },
    +  { 115775, true },
    +  { 115790, true },
    +  { 115815, true },
    +  { 115830, true },
    +  { 115846, true },
    +  { 115861, true },
       { 115890, true },
    -  { 115901, true },
    -  { 115917, true },
    -  { 115930, true },
    -  { 115950, true },
    -  { 115965, true },
    -  { 115988, true },
    -  { 116003, true },
    -  { 116028, true },
    -  { 116043, true },
    -  { 116059, true },
    -  { 116074, true },
    -  { 116103, true },
    -  { 116128, true },
    -  { 116150, true },
    -  { 116168, true },
    -  { 116182, true },
    -  { 116195, true },
    -  { 116210, true },
    -  { 116217, true },
    -  { 116233, true },
    -  { 116244, true },
    -  { 116255, true },
    -  { 116265, true },
    -  { 116279, true },
    -  { 116293, true },
    -  { 116305, true },
    -  { 116317, true },
    -  { 116328, true },
    -  { 116343, true },
    -  { 116358, true },
    -  { 116365, true },
    -  { 116375, true },
    -  { 116385, true },
    -  { 116394, true },
    -  { 116410, true },
    -  { 116419, true },
    -  { 116428, true },
    -  { 116443, true },
    -  { 116452, true },
    -  { 116464, true },
    -  { 116480, true },
    -  { 116499, true },
    -  { 116511, false },
    -  { 116528, true },
    -  { 116548, true },
    -  { 116563, true },
    -  { 116576, true },
    +  { 115915, true },
    +  { 115937, true },
    +  { 115955, true },
    +  { 115969, true },
    +  { 115982, true },
    +  { 115997, true },
    +  { 116004, true },
    +  { 116020, true },
    +  { 116031, true },
    +  { 116042, true },
    +  { 116052, true },
    +  { 116066, true },
    +  { 116080, true },
    +  { 116092, true },
    +  { 116104, true },
    +  { 116115, true },
    +  { 116130, true },
    +  { 116145, true },
    +  { 116152, true },
    +  { 116162, true },
    +  { 116172, true },
    +  { 116181, true },
    +  { 116197, true },
    +  { 116206, true },
    +  { 116215, true },
    +  { 116230, true },
    +  { 116239, true },
    +  { 116251, true },
    +  { 116267, true },
    +  { 116286, true },
    +  { 116298, false },
    +  { 116315, true },
    +  { 116335, true },
    +  { 116350, true },
    +  { 116363, true },
    +  { 116381, true },
    +  { 116396, true },
    +  { 116405, true },
    +  { 116421, true },
    +  { 116436, true },
    +  { 116450, true },
    +  { 116466, true },
    +  { 116481, true },
    +  { 116500, true },
    +  { 116516, true },
    +  { 116527, true },
    +  { 116536, true },
    +  { 116546, true },
    +  { 116565, true },
    +  { 116580, true },
       { 116594, true },
    -  { 116609, true },
    -  { 116618, true },
    -  { 116634, true },
    -  { 116649, true },
    -  { 116663, true },
    -  { 116679, true },
    -  { 116694, true },
    -  { 116713, true },
    -  { 116729, true },
    -  { 116740, true },
    -  { 116749, true },
    -  { 116759, true },
    -  { 116778, true },
    -  { 116793, true },
    -  { 116807, true },
    -  { 116820, true },
    -  { 116828, true },
    -  { 116837, true },
    -  { 116849, true },
    -  { 116858, true },
    +  { 116607, true },
    +  { 116615, true },
    +  { 116624, true },
    +  { 116636, true },
    +  { 116645, true },
    +  { 116657, true },
    +  { 116665, true },
    +  { 116677, true },
    +  { 116703, true },
    +  { 116726, false },
    +  { 116742, true },
    +  { 116763, true },
    +  { 116782, true },
    +  { 116796, true },
    +  { 116810, true },
    +  { 116827, true },
    +  { 116841, true },
    +  { 116855, false },
       { 116870, true },
       { 116878, true },
    -  { 116890, true },
    -  { 116916, true },
    -  { 116939, false },
    -  { 116955, true },
    -  { 116976, true },
    -  { 116995, true },
    -  { 117009, true },
    -  { 117023, true },
    -  { 117040, true },
    -  { 117054, true },
    -  { 117068, false },
    -  { 117083, true },
    -  { 117091, true },
    -  { 117106, true },
    -  { 117117, true },
    -  { 117131, true },
    -  { 117142, true },
    -  { 117160, true },
    -  { 117177, true },
    -  { 117197, true },
    -  { 117221, true },
    +  { 116893, true },
    +  { 116904, true },
    +  { 116918, true },
    +  { 116929, true },
    +  { 116947, true },
    +  { 116964, true },
    +  { 116984, true },
    +  { 117008, true },
    +  { 117015, true },
    +  { 117026, true },
    +  { 117039, true },
    +  { 117051, true },
    +  { 117072, false },
    +  { 117087, true },
    +  { 117100, true },
    +  { 117110, true },
    +  { 117125, false },
    +  { 117134, true },
    +  { 117148, true },
    +  { 117163, true },
    +  { 117173, true },
    +  { 117185, true },
    +  { 117195, true },
    +  { 117208, true },
    +  { 117220, true },
       { 117228, true },
    -  { 117239, true },
    -  { 117252, true },
    -  { 117264, true },
    -  { 117285, false },
    -  { 117300, true },
    -  { 117313, true },
    -  { 117323, true },
    -  { 117338, false },
    -  { 117347, true },
    -  { 117361, true },
    +  { 117238, true },
    +  { 117249, true },
    +  { 117270, true },
    +  { 117280, true },
    +  { 117290, false },
    +  { 117310, true },
    +  { 117321, true },
    +  { 117328, true },
    +  { 117338, true },
    +  { 117348, true },
    +  { 117356, false },
       { 117376, true },
    -  { 117386, true },
    -  { 117398, true },
    -  { 117408, true },
    -  { 117421, true },
    -  { 117433, true },
    -  { 117441, true },
    -  { 117451, true },
    -  { 117462, true },
    -  { 117483, true },
    +  { 117385, true },
    +  { 117394, true },
    +  { 117402, true },
    +  { 117416, true },
    +  { 117431, true },
    +  { 117443, true },
    +  { 117456, true },
    +  { 117474, true },
    +  { 117485, true },
       { 117493, true },
    -  { 117503, false },
    -  { 117523, true },
    -  { 117534, true },
    -  { 117541, true },
    -  { 117551, true },
    -  { 117561, true },
    -  { 117569, false },
    -  { 117589, true },
    -  { 117598, true },
    -  { 117607, true },
    -  { 117615, true },
    -  { 117629, true },
    -  { 117644, true },
    -  { 117656, true },
    -  { 117669, true },
    -  { 117687, true },
    -  { 117698, true },
    -  { 117706, true },
    -  { 117716, true },
    -  { 117725, true },
    -  { 117738, true },
    -  { 117753, true },
    -  { 117765, true },
    -  { 117777, true },
    -  { 117791, true },
    -  { 117807, true },
    -  { 117825, true },
    -  { 117838, true },
    -  { 117851, false },
    +  { 117503, true },
    +  { 117512, true },
    +  { 117525, true },
    +  { 117540, true },
    +  { 117552, true },
    +  { 117564, true },
    +  { 117578, true },
    +  { 117594, true },
    +  { 117612, true },
    +  { 117625, true },
    +  { 117638, false },
    +  { 117651, true },
    +  { 117665, true },
    +  { 117684, true },
    +  { 117692, true },
    +  { 117704, true },
    +  { 117724, true },
    +  { 117737, true },
    +  { 117749, true },
    +  { 117775, true },
    +  { 117793, true },
    +  { 117810, true },
    +  { 117821, true },
    +  { 117834, true },
    +  { 117850, true },
       { 117864, true },
    -  { 117878, true },
    -  { 117897, true },
    -  { 117905, true },
    -  { 117917, true },
    -  { 117937, true },
    -  { 117950, true },
    -  { 117962, true },
    -  { 117988, true },
    -  { 118006, true },
    -  { 118023, true },
    -  { 118034, true },
    -  { 118047, true },
    -  { 118063, true },
    -  { 118077, true },
    -  { 118095, true },
    -  { 118111, true },
    -  { 118134, true },
    -  { 118153, true },
    -  { 118167, true },
    -  { 118183, true },
    -  { 118200, true },
    -  { 118231, true },
    -  { 118261, false },
    -  { 118277, true },
    -  { 118289, true },
    -  { 118300, true },
    -  { 118313, true },
    -  { 118327, true },
    -  { 118344, true },
    -  { 118359, true },
    -  { 118374, true },
    -  { 118385, true },
    -  { 118403, true },
    -  { 118419, true },
    -  { 118431, true },
    +  { 117882, true },
    +  { 117898, true },
    +  { 117921, true },
    +  { 117940, true },
    +  { 117954, true },
    +  { 117970, true },
    +  { 117987, true },
    +  { 118018, true },
    +  { 118048, false },
    +  { 118064, true },
    +  { 118076, true },
    +  { 118087, true },
    +  { 118100, true },
    +  { 118114, true },
    +  { 118131, true },
    +  { 118146, true },
    +  { 118161, true },
    +  { 118172, true },
    +  { 118190, true },
    +  { 118206, true },
    +  { 118218, true },
    +  { 118228, true },
    +  { 118245, true },
    +  { 118261, true },
    +  { 118273, false },
    +  { 118287, true },
    +  { 118301, true },
    +  { 118311, true },
    +  { 118325, true },
    +  { 118337, true },
    +  { 118351, true },
    +  { 118367, true },
    +  { 118382, true },
    +  { 118393, true },
    +  { 118404, true },
    +  { 118416, true },
    +  { 118425, true },
    +  { 118434, true },
       { 118441, true },
    -  { 118458, true },
    -  { 118474, true },
    -  { 118486, false },
    -  { 118500, true },
    +  { 118452, true },
    +  { 118460, true },
    +  { 118467, true },
    +  { 118477, true },
    +  { 118485, true },
    +  { 118493, true },
    +  { 118501, true },
       { 118514, true },
    -  { 118524, true },
    -  { 118538, true },
    -  { 118550, true },
    -  { 118564, true },
    -  { 118580, true },
    -  { 118595, true },
    -  { 118606, true },
    -  { 118617, true },
    +  { 118529, true },
    +  { 118539, true },
    +  { 118546, true },
    +  { 118558, true },
    +  { 118574, true },
    +  { 118586, true },
    +  { 118598, true },
    +  { 118610, true },
    +  { 118621, true },
       { 118629, true },
    -  { 118638, true },
    -  { 118647, true },
    -  { 118654, true },
    -  { 118665, true },
    -  { 118673, true },
    -  { 118680, true },
    -  { 118690, true },
    -  { 118698, true },
    -  { 118706, true },
    -  { 118714, true },
    -  { 118727, true },
    -  { 118742, true },
    -  { 118752, true },
    -  { 118759, true },
    -  { 118771, true },
    -  { 118787, true },
    -  { 118799, true },
    -  { 118811, true },
    +  { 118640, true },
    +  { 118651, true },
    +  { 118667, true },
    +  { 118679, false },
    +  { 118689, true },
    +  { 118710, true },
    +  { 118731, true },
    +  { 118753, true },
    +  { 118768, true },
    +  { 118785, true },
    +  { 118798, true },
    +  { 118812, true },
       { 118823, true },
    -  { 118834, true },
    -  { 118842, true },
    -  { 118853, true },
    -  { 118864, true },
    -  { 118880, true },
    -  { 118892, false },
    -  { 118902, true },
    -  { 118923, true },
    -  { 118944, true },
    -  { 118966, true },
    -  { 118981, true },
    -  { 118998, true },
    -  { 119011, true },
    -  { 119025, true },
    -  { 119036, true },
    -  { 119045, true },
    -  { 119055, true },
    -  { 119062, true },
    -  { 119070, true },
    -  { 119082, true },
    -  { 119091, true },
    -  { 119100, true },
    -  { 119108, true },
    -  { 119123, true },
    -  { 119131, true },
    -  { 119143, false },
    -  { 119153, true },
    -  { 119163, true },
    -  { 119174, true },
    -  { 119183, true },
    -  { 119201, true },
    -  { 119211, false },
    -  { 119222, true },
    -  { 119230, true },
    -  { 119238, false },
    -  { 119246, true },
    -  { 119262, true },
    -  { 119275, true },
    -  { 119286, true },
    -  { 119298, true },
    -  { 119317, true },
    -  { 119329, true },
    -  { 119355, true },
    -  { 119369, true },
    -  { 119383, false },
    -  { 119401, true },
    -  { 119417, true },
    -  { 119432, true },
    -  { 119443, true },
    -  { 119462, true },
    -  { 119478, true },
    -  { 119490, true },
    -  { 119502, true },
    -  { 119515, true },
    -  { 119527, true },
    -  { 119540, true },
    -  { 119557, true },
    -  { 119579, true },
    -  { 119589, true },
    -  { 119599, true },
    -  { 119611, false },
    -  { 119622, true },
    -  { 119636, true },
    -  { 119645, true },
    -  { 119656, true },
    +  { 118833, true },
    +  { 118840, true },
    +  { 118848, true },
    +  { 118860, true },
    +  { 118869, true },
    +  { 118878, true },
    +  { 118886, true },
    +  { 118901, true },
    +  { 118909, true },
    +  { 118921, false },
    +  { 118931, true },
    +  { 118941, true },
    +  { 118952, true },
    +  { 118961, true },
    +  { 118979, true },
    +  { 118989, false },
    +  { 119000, true },
    +  { 119008, true },
    +  { 119016, false },
    +  { 119024, true },
    +  { 119040, true },
    +  { 119053, true },
    +  { 119064, true },
    +  { 119076, true },
    +  { 119095, true },
    +  { 119107, true },
    +  { 119133, true },
    +  { 119147, true },
    +  { 119161, false },
    +  { 119179, true },
    +  { 119195, true },
    +  { 119210, true },
    +  { 119221, true },
    +  { 119240, true },
    +  { 119256, true },
    +  { 119268, true },
    +  { 119280, true },
    +  { 119293, true },
    +  { 119305, true },
    +  { 119318, true },
    +  { 119335, true },
    +  { 119357, true },
    +  { 119367, true },
    +  { 119377, true },
    +  { 119389, false },
    +  { 119400, true },
    +  { 119414, true },
    +  { 119423, true },
    +  { 119434, true },
    +  { 119450, true },
    +  { 119463, true },
    +  { 119479, true },
    +  { 119506, true },
    +  { 119518, true },
    +  { 119532, true },
    +  { 119542, true },
    +  { 119565, true },
    +  { 119582, true },
    +  { 119591, true },
    +  { 119603, true },
    +  { 119617, true },
    +  { 119626, true },
    +  { 119634, true },
    +  { 119647, true },
       { 119672, true },
    -  { 119685, true },
    -  { 119701, true },
    -  { 119728, true },
    -  { 119740, true },
    +  { 119683, true },
    +  { 119696, true },
    +  { 119710, true },
    +  { 119723, false },
    +  { 119734, true },
    +  { 119742, true },
       { 119754, true },
    -  { 119764, true },
    -  { 119787, true },
    -  { 119804, true },
    -  { 119813, true },
    -  { 119825, true },
    -  { 119839, true },
    -  { 119848, true },
    -  { 119856, true },
    -  { 119869, true },
    -  { 119894, true },
    -  { 119905, true },
    -  { 119918, true },
    -  { 119932, true },
    -  { 119945, false },
    -  { 119956, true },
    -  { 119964, true },
    -  { 119976, true },
    -  { 119987, true },
    +  { 119765, true },
    +  { 119780, true },
    +  { 119800, true },
    +  { 119808, true },
    +  { 119822, true },
    +  { 119840, false },
    +  { 119853, true },
    +  { 119874, true },
    +  { 119884, true },
    +  { 119897, true },
    +  { 119928, true },
    +  { 119945, true },
    +  { 119958, true },
    +  { 119973, true },
    +  { 119985, true },
    +  { 119995, true },
       { 120002, true },
    -  { 120022, true },
    -  { 120030, true },
    -  { 120044, true },
    -  { 120062, false },
    -  { 120075, true },
    -  { 120096, true },
    +  { 120019, true },
    +  { 120035, true },
    +  { 120047, true },
    +  { 120061, true },
    +  { 120073, true },
    +  { 120088, true },
       { 120106, true },
       { 120119, true },
    -  { 120150, true },
    -  { 120167, true },
    -  { 120180, true },
    -  { 120195, true },
    -  { 120207, true },
    -  { 120217, true },
    -  { 120224, true },
    -  { 120241, true },
    -  { 120257, true },
    -  { 120269, true },
    -  { 120283, true },
    -  { 120295, true },
    -  { 120310, true },
    -  { 120328, true },
    -  { 120341, true },
    +  { 120129, true },
    +  { 120140, true },
    +  { 120151, true },
    +  { 120162, true },
    +  { 120177, true },
    +  { 120189, false },
    +  { 120201, true },
    +  { 120218, true },
    +  { 120232, true },
    +  { 120249, true },
    +  { 120259, true },
    +  { 120272, false },
    +  { 120290, true },
    +  { 120301, true },
    +  { 120317, true },
    +  { 120334, true },
       { 120351, true },
    -  { 120362, true },
    -  { 120373, true },
    -  { 120384, true },
    -  { 120399, true },
    -  { 120411, false },
    -  { 120423, true },
    -  { 120440, true },
    -  { 120454, true },
    -  { 120471, true },
    -  { 120481, true },
    -  { 120494, false },
    -  { 120512, true },
    -  { 120523, true },
    -  { 120539, true },
    -  { 120556, true },
    -  { 120573, true },
    -  { 120590, true },
    -  { 120600, true },
    -  { 120615, true },
    -  { 120625, true },
    -  { 120640, true },
    -  { 120657, true },
    -  { 120675, true },
    -  { 120690, true },
    -  { 120715, true },
    -  { 120732, true },
    -  { 120751, true },
    -  { 120768, true },
    -  { 120788, true },
    -  { 120809, true },
    -  { 120823, true },
    -  { 120848, true },
    -  { 120869, true },
    -  { 120891, true },
    -  { 120921, true },
    -  { 120945, true },
    -  { 120960, true },
    -  { 120970, true },
    -  { 120993, true },
    -  { 121004, true },
    -  { 121011, true },
    -  { 121025, true },
    -  { 121044, true },
    -  { 121051, true },
    -  { 121071, true },
    -  { 121090, true },
    -  { 121106, true },
    -  { 121116, true },
    -  { 121127, true },
    -  { 121137, true },
    -  { 121148, true },
    -  { 121162, true },
    -  { 121174, true },
    -  { 121190, true },
    -  { 121198, true },
    -  { 121208, true },
    +  { 120368, true },
    +  { 120378, true },
    +  { 120393, true },
    +  { 120403, true },
    +  { 120418, true },
    +  { 120435, true },
    +  { 120453, true },
    +  { 120468, true },
    +  { 120493, true },
    +  { 120510, true },
    +  { 120529, true },
    +  { 120546, true },
    +  { 120566, true },
    +  { 120587, true },
    +  { 120601, true },
    +  { 120626, true },
    +  { 120647, true },
    +  { 120669, true },
    +  { 120699, true },
    +  { 120723, true },
    +  { 120738, true },
    +  { 120748, true },
    +  { 120771, true },
    +  { 120782, true },
    +  { 120789, true },
    +  { 120803, true },
    +  { 120822, true },
    +  { 120829, true },
    +  { 120849, true },
    +  { 120868, true },
    +  { 120884, true },
    +  { 120894, true },
    +  { 120905, true },
    +  { 120915, true },
    +  { 120926, true },
    +  { 120940, true },
    +  { 120952, true },
    +  { 120968, true },
    +  { 120976, true },
    +  { 120986, true },
    +  { 120996, true },
    +  { 121008, true },
    +  { 121019, true },
    +  { 121035, true },
    +  { 121059, true },
    +  { 121073, true },
    +  { 121081, true },
    +  { 121099, true },
    +  { 121110, true },
    +  { 121123, true },
    +  { 121134, true },
    +  { 121153, true },
    +  { 121164, true },
    +  { 121179, true },
    +  { 121194, false },
    +  { 121206, true },
       { 121218, true },
    -  { 121230, true },
    -  { 121241, true },
    -  { 121257, true },
    -  { 121272, true },
    -  { 121296, true },
    -  { 121310, true },
    -  { 121318, true },
    -  { 121336, true },
    +  { 121236, true },
    +  { 121256, true },
    +  { 121268, true },
    +  { 121285, true },
    +  { 121300, true },
    +  { 121314, true },
    +  { 121328, true },
    +  { 121339, true },
       { 121347, true },
    -  { 121360, true },
    -  { 121371, true },
    -  { 121390, true },
    -  { 121401, true },
    -  { 121416, true },
    -  { 121431, false },
    -  { 121443, true },
    -  { 121455, true },
    -  { 121473, true },
    -  { 121493, true },
    -  { 121505, true },
    -  { 121522, true },
    -  { 121537, true },
    -  { 121551, true },
    -  { 121565, true },
    -  { 121576, true },
    -  { 121584, true },
    -  { 121593, true },
    -  { 121611, true },
    -  { 121622, true },
    -  { 121636, true },
    -  { 121643, true },
    -  { 121660, false },
    -  { 121686, false },
    -  { 121698, true },
    -  { 121711, true },
    -  { 121725, true },
    -  { 121736, true },
    -  { 121753, true },
    -  { 121763, true },
    -  { 121778, true },
    -  { 121799, true },
    -  { 121820, true },
    -  { 121844, true },
    -  { 121858, true },
    -  { 121869, true },
    -  { 121883, true },
    -  { 121895, true },
    +  { 121356, true },
    +  { 121374, true },
    +  { 121385, true },
    +  { 121399, true },
    +  { 121406, true },
    +  { 121423, false },
    +  { 121449, false },
    +  { 121461, true },
    +  { 121474, true },
    +  { 121488, true },
    +  { 121499, true },
    +  { 121516, true },
    +  { 121526, true },
    +  { 121541, true },
    +  { 121562, true },
    +  { 121583, true },
    +  { 121607, true },
    +  { 121621, true },
    +  { 121632, true },
    +  { 121646, true },
    +  { 121658, true },
    +  { 121673, true },
    +  { 121683, true },
    +  { 121706, true },
    +  { 121726, true },
    +  { 121748, true },
    +  { 121762, true },
    +  { 121777, false },
    +  { 121790, true },
    +  { 121805, true },
    +  { 121816, true },
    +  { 121836, true },
    +  { 121847, true },
    +  { 121866, true },
    +  { 121874, true },
    +  { 121890, true },
    +  { 121899, true },
       { 121910, true },
       { 121920, true },
    -  { 121943, true },
    -  { 121963, true },
    -  { 121985, true },
    -  { 121999, true },
    -  { 122014, false },
    -  { 122027, true },
    -  { 122042, true },
    -  { 122053, true },
    -  { 122073, true },
    -  { 122084, true },
    -  { 122103, true },
    -  { 122111, true },
    -  { 122127, true },
    -  { 122136, true },
    -  { 122147, true },
    -  { 122157, true },
    -  { 122167, true },
    +  { 121930, true },
    +  { 121941, true },
    +  { 121959, true },
    +  { 121966, true },
    +  { 121984, true },
    +  { 121996, true },
    +  { 122003, true },
    +  { 122014, true },
    +  { 122036, true },
    +  { 122050, true },
    +  { 122069, true },
    +  { 122089, true },
    +  { 122097, true },
    +  { 122116, true },
    +  { 122125, true },
    +  { 122137, true },
    +  { 122155, true },
    +  { 122169, true },
       { 122178, true },
    -  { 122196, true },
    -  { 122203, true },
    -  { 122221, true },
    -  { 122233, true },
    -  { 122240, true },
    -  { 122251, true },
    -  { 122273, true },
    -  { 122287, true },
    -  { 122306, true },
    -  { 122326, true },
    -  { 122334, true },
    -  { 122353, true },
    -  { 122362, true },
    -  { 122374, true },
    -  { 122392, true },
    -  { 122406, true },
    -  { 122415, true },
    -  { 122431, true },
    -  { 122439, true },
    -  { 122451, true },
    -  { 122466, true },
    +  { 122194, true },
    +  { 122202, true },
    +  { 122214, true },
    +  { 122229, true },
    +  { 122249, true },
    +  { 122257, true },
    +  { 122270, true },
    +  { 122282, true },
    +  { 122301, true },
    +  { 122315, true },
    +  { 122335, true },
    +  { 122348, true },
    +  { 122372, true },
    +  { 122388, true },
    +  { 122402, true },
    +  { 122416, true },
    +  { 122433, true },
    +  { 122445, true },
    +  { 122461, true },
    +  { 122478, true },
       { 122486, true },
    -  { 122494, true },
    -  { 122507, true },
    -  { 122526, true },
    -  { 122540, true },
    -  { 122560, true },
    -  { 122573, true },
    -  { 122597, true },
    -  { 122613, true },
    -  { 122627, true },
    -  { 122641, true },
    -  { 122658, true },
    -  { 122670, true },
    -  { 122686, true },
    -  { 122703, true },
    -  { 122711, true },
    -  { 122720, true },
    -  { 122738, true },
    -  { 122747, false },
    -  { 122756, true },
    -  { 122770, true },
    -  { 122780, true },
    +  { 122495, true },
    +  { 122513, true },
    +  { 122522, false },
    +  { 122531, true },
    +  { 122545, true },
    +  { 122555, true },
    +  { 122566, true },
    +  { 122575, true },
    +  { 122598, true },
    +  { 122610, true },
    +  { 122620, false },
    +  { 122629, true },
    +  { 122636, true },
    +  { 122645, true },
    +  { 122653, true },
    +  { 122662, true },
    +  { 122674, false },
    +  { 122688, true },
    +  { 122698, true },
    +  { 122708, true },
    +  { 122718, true },
    +  { 122730, false },
    +  { 122743, true },
    +  { 122761, true },
    +  { 122771, true },
    +  { 122782, true },
       { 122791, true },
    -  { 122800, true },
    -  { 122823, true },
    -  { 122835, true },
    -  { 122845, false },
    -  { 122854, true },
    -  { 122861, true },
    -  { 122870, true },
    -  { 122878, true },
    -  { 122887, true },
    -  { 122899, false },
    -  { 122913, true },
    -  { 122923, true },
    -  { 122933, true },
    -  { 122943, true },
    -  { 122955, false },
    -  { 122968, true },
    -  { 122986, true },
    -  { 122996, true },
    -  { 123007, true },
    -  { 123016, true },
    -  { 123029, true },
    -  { 123044, true },
    -  { 123057, true },
    -  { 123067, true },
    -  { 123078, true },
    -  { 123087, true },
    -  { 123104, true },
    -  { 123113, true },
    -  { 123126, true },
    -  { 123137, true },
    -  { 123155, true },
    -  { 123165, true },
    -  { 123177, true },
    -  { 123189, false },
    -  { 123206, true },
    +  { 122804, true },
    +  { 122819, true },
    +  { 122832, true },
    +  { 122842, true },
    +  { 122853, true },
    +  { 122862, true },
    +  { 122879, true },
    +  { 122888, true },
    +  { 122901, true },
    +  { 122912, true },
    +  { 122930, true },
    +  { 122940, true },
    +  { 122952, true },
    +  { 122964, false },
    +  { 122981, true },
    +  { 123004, true },
    +  { 123015, true },
    +  { 123028, true },
    +  { 123037, true },
    +  { 123050, false },
    +  { 123059, false },
    +  { 123070, true },
    +  { 123082, false },
    +  { 123097, false },
    +  { 123108, true },
    +  { 123122, false },
    +  { 123129, true },
    +  { 123145, true },
    +  { 123163, true },
    +  { 123182, true },
    +  { 123199, true },
    +  { 123213, true },
       { 123229, true },
    -  { 123240, true },
    -  { 123253, true },
    -  { 123266, false },
    -  { 123275, false },
    -  { 123286, true },
    -  { 123298, false },
    -  { 123313, false },
    -  { 123324, false },
    -  { 123331, true },
    -  { 123347, true },
    -  { 123365, true },
    -  { 123384, true },
    -  { 123401, true },
    -  { 123415, true },
    -  { 123431, true },
    -  { 123444, true },
    -  { 123458, true },
    -  { 123475, true },
    -  { 123494, true },
    -  { 123509, false },
    -  { 123523, true },
    -  { 123537, true },
    -  { 123550, true },
    -  { 123571, true },
    -  { 123583, true },
    -  { 123596, true },
    +  { 123242, true },
    +  { 123256, true },
    +  { 123273, true },
    +  { 123292, true },
    +  { 123307, false },
    +  { 123321, true },
    +  { 123335, true },
    +  { 123348, true },
    +  { 123369, true },
    +  { 123381, true },
    +  { 123394, true },
    +  { 123404, true },
    +  { 123424, true },
    +  { 123437, true },
    +  { 123449, true },
    +  { 123467, true },
    +  { 123486, true },
    +  { 123504, true },
    +  { 123518, true },
    +  { 123530, true },
    +  { 123544, true },
    +  { 123567, true },
    +  { 123581, true },
    +  { 123591, true },
       { 123606, true },
    -  { 123626, true },
    -  { 123639, true },
    -  { 123651, true },
    -  { 123669, true },
    -  { 123688, true },
    -  { 123706, true },
    -  { 123720, true },
    -  { 123732, true },
    +  { 123622, true },
    +  { 123646, true },
    +  { 123662, true },
    +  { 123672, true },
    +  { 123686, true },
    +  { 123698, true },
    +  { 123710, true },
    +  { 123728, true },
       { 123746, true },
    -  { 123769, true },
    -  { 123783, true },
    -  { 123793, true },
    -  { 123808, true },
    -  { 123824, true },
    -  { 123848, true },
    -  { 123864, true },
    -  { 123874, true },
    -  { 123888, true },
    -  { 123900, true },
    -  { 123912, true },
    -  { 123930, true },
    -  { 123948, true },
    -  { 123963, true },
    -  { 123986, true },
    -  { 124003, true },
    -  { 124022, true },
    -  { 124042, true },
    -  { 124065, true },
    -  { 124084, true },
    -  { 124103, true },
    -  { 124122, true },
    -  { 124141, true },
    -  { 124152, true },
    -  { 124162, true },
    +  { 123761, true },
    +  { 123784, true },
    +  { 123801, true },
    +  { 123820, true },
    +  { 123840, true },
    +  { 123863, true },
    +  { 123882, true },
    +  { 123901, true },
    +  { 123920, true },
    +  { 123939, true },
    +  { 123950, true },
    +  { 123960, true },
    +  { 123975, true },
    +  { 123996, true },
    +  { 124016, true },
    +  { 124035, true },
    +  { 124049, true },
    +  { 124061, true },
    +  { 124071, true },
    +  { 124083, true },
    +  { 124101, true },
    +  { 124117, true },
    +  { 124138, true },
    +  { 124148, false },
    +  { 124160, true },
       { 124177, true },
    -  { 124198, true },
    -  { 124218, true },
    -  { 124237, true },
    -  { 124251, true },
    -  { 124263, true },
    -  { 124273, true },
    -  { 124285, true },
    -  { 124303, true },
    -  { 124319, true },
    -  { 124340, true },
    -  { 124350, false },
    -  { 124362, true },
    -  { 124379, true },
    -  { 124397, true },
    -  { 124417, true },
    -  { 124432, true },
    -  { 124443, true },
    -  { 124455, true },
    -  { 124467, true },
    -  { 124484, true },
    -  { 124497, true },
    -  { 124515, true },
    -  { 124530, true },
    -  { 124550, true },
    -  { 124562, true },
    -  { 124576, true },
    -  { 124594, true },
    -  { 124607, true },
    -  { 124623, true },
    +  { 124195, true },
    +  { 124215, true },
    +  { 124230, true },
    +  { 124241, true },
    +  { 124253, true },
    +  { 124265, true },
    +  { 124282, true },
    +  { 124295, true },
    +  { 124313, true },
    +  { 124328, true },
    +  { 124348, true },
    +  { 124360, true },
    +  { 124374, true },
    +  { 124392, true },
    +  { 124405, true },
    +  { 124421, true },
    +  { 124436, true },
    +  { 124448, true },
    +  { 124464, true },
    +  { 124474, true },
    +  { 124489, true },
    +  { 124509, true },
    +  { 124522, true },
    +  { 124533, true },
    +  { 124546, true },
    +  { 124555, true },
    +  { 124575, true },
    +  { 124595, true },
    +  { 124618, true },
       { 124638, true },
       { 124650, true },
    -  { 124666, true },
    -  { 124676, true },
    -  { 124691, true },
    -  { 124711, true },
    -  { 124724, true },
    -  { 124735, true },
    -  { 124748, true },
    -  { 124757, true },
    -  { 124777, true },
    -  { 124797, true },
    -  { 124820, true },
    -  { 124840, true },
    -  { 124852, true },
    -  { 124863, true },
    -  { 124874, false },
    -  { 124885, true },
    -  { 124896, false },
    -  { 124906, false },
    -  { 124923, true },
    -  { 124935, true },
    -  { 124951, true },
    -  { 124964, true },
    -  { 124973, true },
    -  { 124987, true },
    -  { 124998, true },
    -  { 125016, true },
    -  { 125030, true },
    -  { 125043, true },
    -  { 125052, true },
    -  { 125067, true },
    -  { 125078, true },
    -  { 125088, true },
    -  { 125108, true },
    -  { 125118, true },
    -  { 125129, true },
    -  { 125162, true },
    -  { 125174, true },
    -  { 125193, true },
    +  { 124661, true },
    +  { 124672, false },
    +  { 124683, true },
    +  { 124694, false },
    +  { 124704, false },
    +  { 124721, true },
    +  { 124733, true },
    +  { 124749, true },
    +  { 124762, true },
    +  { 124771, true },
    +  { 124785, true },
    +  { 124796, true },
    +  { 124814, true },
    +  { 124828, true },
    +  { 124841, true },
    +  { 124850, true },
    +  { 124865, true },
    +  { 124876, true },
    +  { 124886, true },
    +  { 124906, true },
    +  { 124916, true },
    +  { 124927, true },
    +  { 124960, true },
    +  { 124972, true },
    +  { 124991, true },
    +  { 125002, true },
    +  { 125009, true },
    +  { 125023, true },
    +  { 125037, false },
    +  { 125057, true },
    +  { 125074, true },
    +  { 125085, true },
    +  { 125098, true },
    +  { 125116, true },
    +  { 125132, true },
    +  { 125149, true },
    +  { 125163, true },
    +  { 125179, true },
    +  { 125192, true },
       { 125204, true },
    -  { 125211, true },
    -  { 125225, true },
    -  { 125239, false },
    -  { 125259, true },
    +  { 125215, true },
    +  { 125232, true },
    +  { 125241, true },
    +  { 125250, true },
    +  { 125263, true },
       { 125276, true },
    -  { 125287, true },
    +  { 125289, true },
       { 125300, true },
    -  { 125318, true },
    -  { 125334, true },
    -  { 125351, true },
    -  { 125365, true },
    -  { 125381, true },
    -  { 125394, true },
    -  { 125405, true },
    -  { 125422, true },
    -  { 125431, true },
    -  { 125440, true },
    -  { 125453, true },
    -  { 125484, true },
    -  { 125497, true },
    -  { 125510, true },
    -  { 125521, true },
    -  { 125530, true },
    -  { 125554, true },
    -  { 125569, true },
    -  { 125581, true },
    -  { 125597, true },
    +  { 125309, true },
    +  { 125333, true },
    +  { 125348, true },
    +  { 125360, true },
    +  { 125376, true },
    +  { 125393, true },
    +  { 125407, true },
    +  { 125419, true },
    +  { 125430, true },
    +  { 125447, true },
    +  { 125458, true },
    +  { 125476, false },
    +  { 125488, true },
    +  { 125524, true },
    +  { 125537, true },
    +  { 125551, true },
    +  { 125560, true },
    +  { 125570, true },
    +  { 125582, true },
    +  { 125600, true },
       { 125614, true },
    -  { 125628, true },
    -  { 125640, true },
    -  { 125651, true },
    -  { 125668, true },
    -  { 125679, true },
    -  { 125697, false },
    -  { 125709, true },
    -  { 125745, true },
    -  { 125758, true },
    -  { 125772, true },
    -  { 125781, true },
    -  { 125791, true },
    -  { 125803, true },
    -  { 125821, true },
    -  { 125835, true },
    -  { 125853, true },
    -  { 125874, true },
    -  { 125894, true },
    -  { 125917, true },
    -  { 125933, true },
    -  { 125947, true },
    -  { 125963, true },
    -  { 125977, true },
    -  { 125990, true },
    -  { 126011, true },
    -  { 126031, true },
    -  { 126040, true },
    -  { 126057, true },
    -  { 126068, true },
    -  { 126079, true },
    -  { 126098, true },
    -  { 126110, true },
    -  { 126123, true },
    -  { 126139, true },
    -  { 126158, true },
    -  { 126173, false },
    -  { 126188, true },
    -  { 126208, true },
    -  { 126219, true },
    -  { 126230, true },
    +  { 125632, true },
    +  { 125653, true },
    +  { 125673, true },
    +  { 125696, true },
    +  { 125712, true },
    +  { 125726, true },
    +  { 125742, true },
    +  { 125756, true },
    +  { 125769, true },
    +  { 125790, true },
    +  { 125810, true },
    +  { 125819, true },
    +  { 125836, true },
    +  { 125847, true },
    +  { 125858, true },
    +  { 125877, true },
    +  { 125889, true },
    +  { 125902, true },
    +  { 125918, true },
    +  { 125937, true },
    +  { 125952, false },
    +  { 125967, true },
    +  { 125987, true },
    +  { 125998, true },
    +  { 126009, true },
    +  { 126029, true },
    +  { 126038, true },
    +  { 126049, true },
    +  { 126061, true },
    +  { 126075, true },
    +  { 126093, true },
    +  { 126105, true },
    +  { 126128, true },
    +  { 126143, true },
    +  { 126156, true },
    +  { 126173, true },
    +  { 126183, true },
    +  { 126204, true },
    +  { 126232, false },
    +  { 126243, true },
       { 126250, true },
    -  { 126259, true },
    -  { 126270, true },
    -  { 126282, true },
    -  { 126296, true },
    -  { 126314, true },
    -  { 126326, true },
    -  { 126349, true },
    -  { 126364, true },
    -  { 126377, true },
    -  { 126394, true },
    -  { 126404, true },
    -  { 126425, true },
    -  { 126453, false },
    -  { 126464, true },
    -  { 126471, true },
    -  { 126482, true },
    +  { 126261, true },
    +  { 126275, true },
    +  { 126289, true },
    +  { 126300, false },
    +  { 126311, true },
    +  { 126319, false },
    +  { 126339, true },
    +  { 126354, true },
    +  { 126367, true },
    +  { 126383, true },
    +  { 126398, true },
    +  { 126411, true },
    +  { 126424, true },
    +  { 126440, true },
    +  { 126460, true },
    +  { 126473, true },
       { 126492, true },
    -  { 126506, true },
    -  { 126520, true },
    -  { 126531, false },
    -  { 126542, true },
    -  { 126550, false },
    -  { 126570, true },
    -  { 126585, true },
    +  { 126510, true },
    +  { 126524, true },
    +  { 126532, true },
    +  { 126564, true },
    +  { 126579, true },
       { 126598, true },
    -  { 126614, true },
    -  { 126629, true },
    -  { 126642, true },
    -  { 126655, true },
    -  { 126671, true },
    -  { 126691, true },
    -  { 126704, true },
    -  { 126723, true },
    -  { 126741, true },
    -  { 126755, true },
    -  { 126763, true },
    -  { 126795, true },
    -  { 126810, true },
    -  { 126829, true },
    -  { 126844, true },
    -  { 126859, true },
    -  { 126880, true },
    -  { 126901, true },
    -  { 126915, true },
    -  { 126937, true },
    -  { 126953, true },
    -  { 126965, true },
    -  { 126978, true },
    -  { 126989, true },
    -  { 127006, true },
    -  { 127030, true },
    -  { 127052, true },
    -  { 127066, true },
    +  { 126613, true },
    +  { 126628, true },
    +  { 126649, true },
    +  { 126670, true },
    +  { 126684, true },
    +  { 126706, true },
    +  { 126722, true },
    +  { 126734, true },
    +  { 126747, true },
    +  { 126758, true },
    +  { 126775, true },
    +  { 126799, true },
    +  { 126821, true },
    +  { 126835, true },
    +  { 126847, true },
    +  { 126860, true },
    +  { 126878, true },
    +  { 126898, true },
    +  { 126923, true },
    +  { 126936, true },
    +  { 126950, true },
    +  { 126964, true },
    +  { 126981, true },
    +  { 127001, true },
    +  { 127017, true },
    +  { 127035, true },
    +  { 127050, true },
    +  { 127065, true },
       { 127078, true },
    -  { 127091, true },
    -  { 127109, true },
    -  { 127129, true },
    -  { 127154, true },
    -  { 127167, true },
    -  { 127181, true },
    -  { 127195, true },
    -  { 127212, true },
    -  { 127232, true },
    -  { 127248, true },
    -  { 127266, true },
    -  { 127281, true },
    -  { 127296, true },
    -  { 127309, true },
    -  { 127324, true },
    -  { 127332, false },
    -  { 127345, true },
    -  { 127357, true },
    -  { 127371, true },
    -  { 127393, true },
    -  { 127407, true },
    -  { 127421, true },
    -  { 127429, true },
    -  { 127445, true },
    +  { 127093, true },
    +  { 127101, false },
    +  { 127114, true },
    +  { 127126, true },
    +  { 127140, true },
    +  { 127162, true },
    +  { 127176, true },
    +  { 127190, true },
    +  { 127198, true },
    +  { 127214, true },
    +  { 127224, true },
    +  { 127237, true },
    +  { 127250, true },
    +  { 127264, true },
    +  { 127280, true },
    +  { 127293, true },
    +  { 127307, true },
    +  { 127318, true },
    +  { 127328, true },
    +  { 127348, true },
    +  { 127362, true },
    +  { 127377, true },
    +  { 127389, true },
    +  { 127403, true },
    +  { 127411, true },
    +  { 127423, true },
    +  { 127434, true },
       { 127455, true },
    -  { 127468, true },
    -  { 127481, true },
    -  { 127495, true },
    -  { 127511, true },
    +  { 127474, true },
    +  { 127492, true },
    +  { 127512, true },
       { 127524, true },
    -  { 127538, true },
    -  { 127549, true },
    -  { 127559, true },
    -  { 127579, true },
    -  { 127593, true },
    -  { 127608, true },
    -  { 127620, true },
    -  { 127634, true },
    -  { 127642, true },
    -  { 127654, true },
    -  { 127665, true },
    +  { 127542, true },
    +  { 127558, true },
    +  { 127571, true },
    +  { 127591, true },
    +  { 127605, true },
    +  { 127624, true },
    +  { 127637, true },
    +  { 127649, true },
    +  { 127661, true },
    +  { 127672, true },
       { 127686, true },
    -  { 127705, true },
    -  { 127723, true },
    +  { 127700, false },
    +  { 127715, true },
    +  { 127732, true },
       { 127743, true },
    -  { 127755, true },
    -  { 127773, true },
    +  { 127754, true },
    +  { 127768, true },
       { 127789, true },
    -  { 127802, true },
    -  { 127822, true },
    -  { 127836, true },
    -  { 127855, true },
    -  { 127868, true },
    -  { 127880, true },
    -  { 127892, true },
    -  { 127903, true },
    -  { 127917, true },
    -  { 127931, false },
    -  { 127946, true },
    -  { 127963, true },
    -  { 127974, true },
    -  { 127985, true },
    -  { 127999, true },
    -  { 128020, true },
    -  { 128039, true },
    -  { 128055, true },
    -  { 128073, true },
    -  { 128096, true },
    -  { 128108, true },
    +  { 127808, true },
    +  { 127824, true },
    +  { 127842, true },
    +  { 127865, true },
    +  { 127877, true },
    +  { 127890, true },
    +  { 127908, true },
    +  { 127923, true },
    +  { 127941, true },
    +  { 127956, true },
    +  { 127972, true },
    +  { 127987, true },
    +  { 128002, true },
    +  { 128017, true },
    +  { 128033, true },
    +  { 128048, true },
    +  { 128063, true },
    +  { 128078, true },
    +  { 128088, true },
    +  { 128101, true },
    +  { 128111, true },
       { 128121, true },
    -  { 128139, true },
    -  { 128154, true },
    -  { 128172, true },
    -  { 128187, true },
    +  { 128133, false },
    +  { 128144, true },
    +  { 128158, true },
    +  { 128167, false },
    +  { 128186, true },
       { 128203, true },
    -  { 128218, true },
    -  { 128233, true },
    -  { 128248, true },
    -  { 128264, true },
    -  { 128279, true },
    -  { 128294, true },
    -  { 128309, true },
    -  { 128319, true },
    -  { 128332, true },
    -  { 128342, true },
    +  { 128216, true },
    +  { 128232, true },
    +  { 128242, false },
    +  { 128255, false },
    +  { 128265, true },
    +  { 128278, true },
    +  { 128288, false },
    +  { 128297, false },
    +  { 128305, false },
    +  { 128325, true },
    +  { 128339, true },
       { 128352, true },
    -  { 128364, false },
    -  { 128375, true },
    -  { 128389, true },
    -  { 128398, false },
    -  { 128417, true },
    -  { 128434, true },
    -  { 128447, true },
    -  { 128463, true },
    -  { 128473, false },
    -  { 128486, false },
    -  { 128496, true },
    -  { 128509, true },
    -  { 128519, false },
    -  { 128528, false },
    -  { 128536, false },
    -  { 128556, true },
    -  { 128570, true },
    -  { 128583, true },
    -  { 128595, true },
    -  { 128613, false },
    +  { 128364, true },
    +  { 128382, false },
    +  { 128394, true },
    +  { 128411, true },
    +  { 128425, true },
    +  { 128442, true },
    +  { 128458, true },
    +  { 128477, false },
    +  { 128494, true },
    +  { 128508, true },
    +  { 128522, true },
    +  { 128536, true },
    +  { 128552, false },
    +  { 128566, true },
    +  { 128577, true },
    +  { 128592, true },
    +  { 128606, true },
       { 128625, true },
    -  { 128642, true },
    -  { 128656, true },
    -  { 128673, true },
    -  { 128689, true },
    -  { 128708, false },
    -  { 128725, true },
    -  { 128739, true },
    -  { 128753, true },
    -  { 128767, true },
    -  { 128783, false },
    -  { 128797, true },
    -  { 128808, true },
    -  { 128823, true },
    -  { 128837, true },
    -  { 128856, true },
    -  { 128878, true },
    -  { 128893, true },
    -  { 128906, true },
    -  { 128916, true },
    -  { 128924, true },
    -  { 128936, true },
    -  { 128949, true },
    -  { 128962, true },
    -  { 128972, true },
    -  { 128985, false },
    +  { 128647, true },
    +  { 128662, true },
    +  { 128675, true },
    +  { 128685, true },
    +  { 128693, true },
    +  { 128705, true },
    +  { 128718, true },
    +  { 128731, true },
    +  { 128741, true },
    +  { 128754, false },
    +  { 128763, true },
    +  { 128774, false },
    +  { 128785, true },
    +  { 128800, true },
    +  { 128811, true },
    +  { 128820, true },
    +  { 128829, false },
    +  { 128843, true },
    +  { 128861, true },
    +  { 128879, true },
    +  { 128896, true },
    +  { 128908, false },
    +  { 128924, false },
    +  { 128948, true },
    +  { 128975, true },
       { 128994, true },
    -  { 129005, false },
    -  { 129016, true },
    -  { 129031, true },
    -  { 129042, true },
    -  { 129051, true },
    -  { 129060, false },
    -  { 129074, true },
    -  { 129092, true },
    -  { 129110, true },
    -  { 129127, true },
    -  { 129139, false },
    -  { 129155, false },
    -  { 129179, true },
    -  { 129206, true },
    -  { 129225, true },
    -  { 129233, true },
    -  { 129242, true },
    -  { 129254, true },
    -  { 129266, true },
    -  { 129291, true },
    -  { 129308, true },
    -  { 129325, true },
    +  { 129002, true },
    +  { 129011, true },
    +  { 129023, true },
    +  { 129035, true },
    +  { 129060, true },
    +  { 129077, true },
    +  { 129094, true },
    +  { 129109, true },
    +  { 129121, true },
    +  { 129134, true },
    +  { 129152, true },
    +  { 129161, false },
    +  { 129169, true },
    +  { 129190, true },
    +  { 129204, true },
    +  { 129226, true },
    +  { 129239, true },
    +  { 129252, true },
    +  { 129264, true },
    +  { 129277, true },
    +  { 129293, true },
    +  { 129307, true },
    +  { 129328, true },
       { 129340, true },
    -  { 129352, true },
    -  { 129365, true },
    -  { 129383, true },
    -  { 129392, false },
    -  { 129400, true },
    -  { 129421, true },
    -  { 129435, true },
    -  { 129457, true },
    -  { 129470, true },
    +  { 129361, true },
    +  { 129380, true },
    +  { 129393, true },
    +  { 129405, true },
    +  { 129417, true },
    +  { 129429, true },
    +  { 129447, true },
    +  { 129459, false },
    +  { 129468, true },
       { 129483, true },
    -  { 129495, true },
    -  { 129508, true },
    -  { 129524, true },
    -  { 129538, true },
    -  { 129559, true },
    -  { 129571, true },
    -  { 129592, true },
    -  { 129611, true },
    -  { 129624, true },
    -  { 129636, true },
    -  { 129648, true },
    -  { 129660, true },
    -  { 129678, true },
    -  { 129690, false },
    -  { 129699, true },
    -  { 129714, true },
    +  { 129505, true },
    +  { 129519, true },
    +  { 129533, true },
    +  { 129546, true },
    +  { 129568, true },
    +  { 129583, true },
    +  { 129598, true },
    +  { 129609, true },
    +  { 129634, true },
    +  { 129651, true },
    +  { 129663, true },
    +  { 129679, false },
    +  { 129694, false },
    +  { 129718, true },
    +  { 129726, true },
       { 129736, true },
    -  { 129750, true },
    -  { 129764, true },
    -  { 129777, true },
    -  { 129799, true },
    -  { 129814, true },
    -  { 129829, true },
    -  { 129840, true },
    -  { 129865, true },
    -  { 129882, true },
    -  { 129894, true },
    -  { 129910, false },
    -  { 129925, false },
    -  { 129949, true },
    -  { 129957, true },
    -  { 129967, true },
    -  { 129979, true },
    -  { 129992, true },
    -  { 130005, true },
    -  { 130017, true },
    -  { 130033, true },
    -  { 130048, true },
    -  { 130067, true },
    -  { 130081, true },
    -  { 130095, true },
    -  { 130115, true },
    -  { 130131, true },
    -  { 130150, true },
    -  { 130170, true },
    +  { 129748, true },
    +  { 129761, true },
    +  { 129774, true },
    +  { 129786, true },
    +  { 129802, true },
    +  { 129817, true },
    +  { 129836, true },
    +  { 129850, true },
    +  { 129864, true },
    +  { 129884, true },
    +  { 129900, true },
    +  { 129919, true },
    +  { 129939, true },
    +  { 129951, true },
    +  { 129981, true },
    +  { 129993, true },
    +  { 130004, true },
    +  { 130014, true },
    +  { 130028, true },
    +  { 130041, true },
    +  { 130059, true },
    +  { 130078, false },
    +  { 130088, true },
    +  { 130103, true },
    +  { 130112, true },
    +  { 130125, true },
    +  { 130141, true },
    +  { 130152, true },
    +  { 130163, true },
    +  { 130173, true },
       { 130182, true },
    -  { 130212, true },
    -  { 130224, true },
    -  { 130234, true },
    -  { 130248, true },
    -  { 130261, true },
    -  { 130279, true },
    -  { 130298, false },
    -  { 130308, true },
    -  { 130323, true },
    -  { 130332, true },
    -  { 130345, false },
    -  { 130362, true },
    -  { 130378, true },
    -  { 130389, true },
    -  { 130400, true },
    -  { 130410, true },
    -  { 130419, true },
    -  { 130433, true },
    -  { 130454, true },
    -  { 130465, true },
    -  { 130480, true },
    -  { 130502, true },
    -  { 130519, true },
    -  { 130529, true },
    -  { 130551, true },
    -  { 130573, true },
    -  { 130590, true },
    -  { 130604, true },
    -  { 130617, true },
    +  { 130196, true },
    +  { 130217, true },
    +  { 130228, true },
    +  { 130243, true },
    +  { 130265, true },
    +  { 130282, true },
    +  { 130292, true },
    +  { 130314, true },
    +  { 130336, true },
    +  { 130353, true },
    +  { 130367, true },
    +  { 130380, true },
    +  { 130397, true },
    +  { 130422, true },
    +  { 130438, true },
    +  { 130448, true },
    +  { 130459, true },
    +  { 130468, false },
    +  { 130477, true },
    +  { 130486, true },
    +  { 130496, true },
    +  { 130510, true },
    +  { 130528, true },
    +  { 130537, true },
    +  { 130558, true },
    +  { 130578, true },
    +  { 130596, true },
    +  { 130613, true },
       { 130634, true },
    -  { 130659, true },
    -  { 130675, true },
    -  { 130685, true },
    -  { 130696, true },
    -  { 130705, false },
    -  { 130714, true },
    -  { 130723, true },
    -  { 130733, true },
    -  { 130747, true },
    -  { 130765, true },
    -  { 130774, true },
    -  { 130795, true },
    -  { 130815, true },
    -  { 130833, true },
    -  { 130850, true },
    -  { 130871, true },
    -  { 130889, true },
    -  { 130901, true },
    -  { 130923, false },
    -  { 130942, true },
    -  { 130953, true },
    -  { 130966, true },
    +  { 130652, true },
    +  { 130664, true },
    +  { 130686, false },
    +  { 130705, true },
    +  { 130716, true },
    +  { 130729, true },
    +  { 130750, true },
    +  { 130761, true },
    +  { 130776, true },
    +  { 130793, true },
    +  { 130819, true },
    +  { 130836, false },
    +  { 130854, false },
    +  { 130873, true },
    +  { 130893, true },
    +  { 130915, true },
    +  { 130937, true },
    +  { 130950, true },
    +  { 130973, true },
       { 130987, true },
    -  { 130998, true },
    -  { 131013, true },
    +  { 131010, true },
    +  { 131020, true },
       { 131030, true },
    -  { 131056, true },
    -  { 131073, false },
    -  { 131091, false },
    -  { 131110, true },
    -  { 131130, true },
    -  { 131152, true },
    -  { 131174, true },
    -  { 131187, true },
    -  { 131210, true },
    -  { 131224, true },
    -  { 131247, true },
    -  { 131257, true },
    -  { 131267, true },
    -  { 131286, true },
    -  { 131299, true },
    -  { 131314, false },
    -  { 131326, true },
    -  { 131346, true },
    -  { 131356, true },
    -  { 131375, true },
    -  { 131387, true },
    -  { 131408, true },
    -  { 131434, true },
    -  { 131455, true },
    -  { 131467, true },
    -  { 131481, true },
    -  { 131493, true },
    -  { 131505, true },
    -  { 131528, true },
    -  { 131544, true },
    -  { 131556, true },
    -  { 131581, true },
    -  { 131596, true },
    -  { 131617, true },
    -  { 131634, true },
    -  { 131655, false },
    +  { 131049, true },
    +  { 131062, true },
    +  { 131077, false },
    +  { 131089, true },
    +  { 131109, true },
    +  { 131119, true },
    +  { 131138, true },
    +  { 131150, true },
    +  { 131171, true },
    +  { 131197, true },
    +  { 131218, true },
    +  { 131230, true },
    +  { 131244, true },
    +  { 131256, true },
    +  { 131268, true },
    +  { 131291, true },
    +  { 131307, true },
    +  { 131319, true },
    +  { 131344, true },
    +  { 131359, true },
    +  { 131380, true },
    +  { 131397, true },
    +  { 131418, false },
    +  { 131435, true },
    +  { 131453, true },
    +  { 131463, true },
    +  { 131477, true },
    +  { 131491, true },
    +  { 131501, true },
    +  { 131513, true },
    +  { 131525, true },
    +  { 131539, true },
    +  { 131551, true },
    +  { 131580, true },
    +  { 131595, true },
    +  { 131609, true },
    +  { 131625, true },
    +  { 131640, true },
    +  { 131652, true },
       { 131672, true },
    -  { 131690, true },
    -  { 131700, true },
    -  { 131714, true },
    -  { 131728, true },
    -  { 131738, true },
    -  { 131750, true },
    -  { 131762, true },
    -  { 131776, true },
    -  { 131788, true },
    -  { 131817, true },
    -  { 131832, true },
    -  { 131846, true },
    -  { 131862, true },
    -  { 131877, true },
    +  { 131686, true },
    +  { 131699, true },
    +  { 131711, true },
    +  { 131724, true },
    +  { 131737, true },
    +  { 131749, true },
    +  { 131768, true },
    +  { 131794, true },
    +  { 131818, true },
    +  { 131841, true },
    +  { 131853, true },
    +  { 131869, true },
       { 131889, true },
    -  { 131909, true },
    -  { 131923, true },
    -  { 131936, true },
    -  { 131948, true },
    -  { 131961, true },
    +  { 131907, true },
    +  { 131927, true },
    +  { 131941, true },
    +  { 131954, true },
       { 131974, true },
    -  { 131986, true },
    -  { 132005, true },
    -  { 132031, true },
    -  { 132055, true },
    -  { 132078, true },
    -  { 132090, true },
    -  { 132106, true },
    -  { 132126, true },
    -  { 132144, true },
    -  { 132164, true },
    -  { 132178, true },
    -  { 132191, true },
    -  { 132211, true },
    -  { 132219, true },
    -  { 132238, true },
    -  { 132257, true },
    -  { 132271, true },
    -  { 132289, true },
    -  { 132305, false },
    -  { 132324, true },
    -  { 132345, true },
    -  { 132364, true },
    -  { 132378, true },
    -  { 132387, true },
    +  { 131982, true },
    +  { 132001, true },
    +  { 132020, true },
    +  { 132034, true },
    +  { 132052, true },
    +  { 132068, false },
    +  { 132087, true },
    +  { 132108, true },
    +  { 132127, true },
    +  { 132141, true },
    +  { 132150, true },
    +  { 132168, true },
    +  { 132185, true },
    +  { 132201, true },
    +  { 132223, true },
    +  { 132240, true },
    +  { 132258, true },
    +  { 132275, true },
    +  { 132288, true },
    +  { 132298, true },
    +  { 132306, true },
    +  { 132334, true },
    +  { 132351, true },
    +  { 132365, true },
    +  { 132380, true },
    +  { 132393, true },
       { 132405, true },
    -  { 132422, true },
    -  { 132438, true },
    -  { 132460, true },
    -  { 132477, true },
    -  { 132495, true },
    -  { 132512, true },
    -  { 132525, true },
    -  { 132535, true },
    -  { 132543, true },
    -  { 132571, true },
    -  { 132588, true },
    -  { 132602, true },
    -  { 132617, true },
    -  { 132630, true },
    -  { 132642, true },
    -  { 132652, true },
    -  { 132665, true },
    -  { 132680, true },
    -  { 132692, true },
    +  { 132415, true },
    +  { 132428, true },
    +  { 132443, true },
    +  { 132455, true },
    +  { 132467, true },
    +  { 132479, true },
    +  { 132491, true },
    +  { 132504, true },
    +  { 132517, true },
    +  { 132529, true },
    +  { 132545, true },
    +  { 132557, true },
    +  { 132570, true },
    +  { 132580, true },
    +  { 132590, true },
    +  { 132605, true },
    +  { 132616, true },
    +  { 132627, true },
    +  { 132645, true },
    +  { 132653, true },
    +  { 132661, true },
    +  { 132673, true },
    +  { 132687, true },
       { 132704, true },
    -  { 132716, true },
    -  { 132728, true },
    -  { 132741, true },
    -  { 132754, true },
    -  { 132766, true },
    -  { 132782, true },
    -  { 132794, true },
    -  { 132807, true },
    -  { 132817, true },
    -  { 132827, true },
    -  { 132842, true },
    -  { 132853, true },
    -  { 132864, true },
    -  { 132882, true },
    -  { 132890, true },
    -  { 132898, true },
    -  { 132910, true },
    -  { 132924, true },
    -  { 132941, true },
    -  { 132956, true },
    -  { 132972, true },
    -  { 132987, true },
    -  { 133002, true },
    -  { 133017, true },
    -  { 133025, true },
    -  { 133040, true },
    -  { 133053, true },
    +  { 132719, true },
    +  { 132735, true },
    +  { 132750, true },
    +  { 132765, true },
    +  { 132780, true },
    +  { 132788, true },
    +  { 132803, true },
    +  { 132816, true },
    +  { 132824, true },
    +  { 132834, true },
    +  { 132855, true },
    +  { 132868, true },
    +  { 132880, true },
    +  { 132888, true },
    +  { 132905, true },
    +  { 132921, true },
    +  { 132929, false },
    +  { 132953, true },
    +  { 132985, true },
    +  { 133005, true },
    +  { 133029, true },
    +  { 133046, true },
       { 133061, true },
    -  { 133071, true },
    -  { 133092, true },
    +  { 133072, true },
    +  { 133083, true },
    +  { 133093, true },
       { 133105, true },
    -  { 133117, true },
    -  { 133125, true },
    -  { 133142, true },
    -  { 133158, true },
    -  { 133166, false },
    -  { 133190, true },
    -  { 133222, true },
    -  { 133242, true },
    -  { 133266, true },
    -  { 133283, true },
    -  { 133298, true },
    -  { 133309, true },
    -  { 133320, true },
    -  { 133330, true },
    -  { 133342, true },
    -  { 133350, true },
    -  { 133362, false },
    -  { 133374, false },
    -  { 133382, false },
    -  { 133407, true },
    -  { 133420, true },
    -  { 133435, true },
    -  { 133449, true },
    -  { 133462, true },
    -  { 133474, true },
    -  { 133487, true },
    -  { 133504, true },
    -  { 133518, true },
    -  { 133532, true },
    -  { 133547, true },
    -  { 133562, true },
    -  { 133573, true },
    -  { 133580, true },
    -  { 133594, true },
    -  { 133602, true },
    -  { 133610, false },
    -  { 133625, true },
    -  { 133637, true },
    -  { 133651, true },
    -  { 133659, true },
    -  { 133670, true },
    +  { 133113, true },
    +  { 133125, false },
    +  { 133137, false },
    +  { 133145, false },
    +  { 133170, true },
    +  { 133183, true },
    +  { 133198, true },
    +  { 133212, true },
    +  { 133225, true },
    +  { 133237, true },
    +  { 133250, true },
    +  { 133267, true },
    +  { 133281, true },
    +  { 133295, true },
    +  { 133310, true },
    +  { 133325, true },
    +  { 133336, true },
    +  { 133343, true },
    +  { 133357, true },
    +  { 133365, true },
    +  { 133373, false },
    +  { 133388, true },
    +  { 133400, true },
    +  { 133414, true },
    +  { 133422, true },
    +  { 133433, true },
    +  { 133443, true },
    +  { 133453, true },
    +  { 133460, true },
    +  { 133473, true },
    +  { 133482, true },
    +  { 133490, true },
    +  { 133498, true },
    +  { 133507, true },
    +  { 133523, true },
    +  { 133534, false },
    +  { 133545, true },
    +  { 133553, true },
    +  { 133574, true },
    +  { 133599, true },
    +  { 133615, true },
    +  { 133627, true },
    +  { 133639, true },
    +  { 133652, true },
    +  { 133660, false },
       { 133680, true },
    -  { 133690, true },
    -  { 133697, true },
    -  { 133710, true },
    -  { 133719, true },
    -  { 133727, true },
    -  { 133735, true },
    -  { 133744, true },
    -  { 133760, true },
    -  { 133771, false },
    -  { 133782, true },
    -  { 133790, true },
    +  { 133699, true },
    +  { 133713, true },
    +  { 133732, true },
    +  { 133752, true },
    +  { 133772, true },
    +  { 133792, true },
       { 133811, true },
    -  { 133836, true },
    -  { 133852, true },
    -  { 133864, true },
    -  { 133876, true },
    -  { 133889, true },
    -  { 133897, false },
    -  { 133917, true },
    -  { 133936, true },
    -  { 133950, true },
    -  { 133969, true },
    -  { 133989, true },
    -  { 134009, true },
    -  { 134029, true },
    -  { 134048, true },
    -  { 134067, true },
    -  { 134078, true },
    -  { 134088, true },
    -  { 134097, true },
    -  { 134110, true },
    -  { 134120, true },
    -  { 134133, true },
    -  { 134145, false },
    -  { 134156, true },
    -  { 134167, true },
    -  { 134175, true },
    -  { 134188, true },
    -  { 134198, true },
    -  { 134207, true },
    -  { 134227, true },
    -  { 134250, true },
    -  { 134269, false },
    -  { 134280, true },
    -  { 134302, true },
    -  { 134311, true },
    -  { 134318, true },
    -  { 134329, true },
    -  { 134336, true },
    -  { 134348, true },
    +  { 133830, true },
    +  { 133841, true },
    +  { 133851, true },
    +  { 133860, true },
    +  { 133873, true },
    +  { 133883, true },
    +  { 133896, true },
    +  { 133908, false },
    +  { 133919, true },
    +  { 133930, true },
    +  { 133938, true },
    +  { 133951, true },
    +  { 133961, true },
    +  { 133970, true },
    +  { 133990, true },
    +  { 134013, true },
    +  { 134032, false },
    +  { 134043, true },
    +  { 134065, true },
    +  { 134074, true },
    +  { 134081, true },
    +  { 134092, true },
    +  { 134099, true },
    +  { 134111, true },
    +  { 134128, true },
    +  { 134135, true },
    +  { 134143, true },
    +  { 134154, true },
    +  { 134168, true },
    +  { 134180, true },
    +  { 134192, true },
    +  { 134201, true },
    +  { 134210, true },
    +  { 134222, false },
    +  { 134233, true },
    +  { 134246, true },
    +  { 134272, true },
    +  { 134295, true },
    +  { 134315, true },
    +  { 134332, true },
    +  { 134347, true },
       { 134365, true },
    -  { 134372, true },
    -  { 134380, true },
    -  { 134391, true },
    -  { 134405, true },
    -  { 134417, true },
    -  { 134429, true },
    -  { 134438, true },
    -  { 134447, true },
    -  { 134459, false },
    -  { 134470, true },
    -  { 134483, true },
    -  { 134509, true },
    -  { 134532, true },
    -  { 134552, true },
    +  { 134379, true },
    +  { 134397, true },
    +  { 134416, true },
    +  { 134427, true },
    +  { 134445, true },
    +  { 134460, true },
    +  { 134480, true },
    +  { 134495, true },
    +  { 134504, true },
    +  { 134524, true },
    +  { 134539, true },
    +  { 134554, true },
       { 134569, true },
    -  { 134584, true },
    -  { 134602, true },
    -  { 134616, true },
    -  { 134634, true },
    -  { 134653, true },
    -  { 134664, true },
    -  { 134682, true },
    -  { 134697, true },
    -  { 134717, true },
    -  { 134732, true },
    -  { 134741, true },
    -  { 134761, true },
    -  { 134776, true },
    +  { 134583, true },
    +  { 134597, true },
    +  { 134606, true },
    +  { 134621, true },
    +  { 134629, true },
    +  { 134642, true },
    +  { 134660, true },
    +  { 134671, true },
    +  { 134681, true },
    +  { 134690, true },
    +  { 134701, true },
    +  { 134711, true },
    +  { 134721, true },
    +  { 134734, true },
    +  { 134745, true },
    +  { 134755, true },
    +  { 134766, true },
    +  { 134777, true },
       { 134791, true },
    -  { 134806, true },
    -  { 134820, true },
    -  { 134834, true },
    -  { 134843, true },
    -  { 134858, true },
    -  { 134866, true },
    -  { 134879, true },
    -  { 134897, true },
    -  { 134908, true },
    -  { 134918, true },
    -  { 134927, true },
    -  { 134938, true },
    -  { 134948, true },
    -  { 134958, true },
    -  { 134971, true },
    -  { 134982, true },
    -  { 134992, true },
    -  { 135003, true },
    -  { 135014, true },
    -  { 135028, true },
    -  { 135035, true },
    -  { 135046, true },
    -  { 135054, true },
    -  { 135072, true },
    -  { 135085, true },
    +  { 134798, true },
    +  { 134809, true },
    +  { 134817, true },
    +  { 134835, true },
    +  { 134848, true },
    +  { 134860, true },
    +  { 134868, true },
    +  { 134888, false },
    +  { 134904, true },
    +  { 134923, true },
    +  { 134946, true },
    +  { 134965, true },
    +  { 134976, true },
    +  { 134998, true },
    +  { 135011, true },
    +  { 135020, true },
    +  { 135043, true },
    +  { 135059, true },
    +  { 135075, true },
       { 135097, true },
    -  { 135105, true },
    -  { 135125, false },
    -  { 135141, true },
    -  { 135160, true },
    -  { 135183, true },
    -  { 135202, true },
    -  { 135213, true },
    -  { 135235, true },
    -  { 135248, true },
    -  { 135257, true },
    -  { 135280, true },
    -  { 135296, true },
    -  { 135312, true },
    -  { 135334, true },
    -  { 135361, true },
    -  { 135375, true },
    -  { 135385, true },
    -  { 135395, true },
    -  { 135414, true },
    -  { 135428, true },
    -  { 135442, true },
    -  { 135458, true },
    +  { 135124, true },
    +  { 135138, true },
    +  { 135148, true },
    +  { 135158, true },
    +  { 135177, true },
    +  { 135191, true },
    +  { 135205, true },
    +  { 135221, true },
    +  { 135232, true },
    +  { 135247, true },
    +  { 135270, true },
    +  { 135293, true },
    +  { 135311, true },
    +  { 135328, true },
    +  { 135338, true },
    +  { 135363, true },
    +  { 135381, true },
    +  { 135391, true },
    +  { 135403, true },
    +  { 135416, true },
    +  { 135427, true },
    +  { 135444, true },
    +  { 135454, true },
       { 135469, true },
    -  { 135484, true },
    -  { 135507, true },
    -  { 135530, true },
    -  { 135548, true },
    -  { 135565, true },
    -  { 135575, true },
    -  { 135600, true },
    -  { 135618, true },
    -  { 135628, true },
    -  { 135640, true },
    +  { 135485, true },
    +  { 135506, true },
    +  { 135528, false },
    +  { 135546, true },
    +  { 135557, true },
    +  { 135571, true },
    +  { 135584, true },
    +  { 135595, true },
    +  { 135608, true },
    +  { 135619, true },
    +  { 135629, true },
    +  { 135643, true },
       { 135653, true },
    -  { 135664, true },
    -  { 135681, true },
    -  { 135691, true },
    -  { 135706, true },
    -  { 135722, true },
    -  { 135743, true },
    -  { 135765, false },
    -  { 135783, true },
    -  { 135794, true },
    -  { 135808, true },
    -  { 135821, true },
    -  { 135832, true },
    -  { 135845, true },
    -  { 135856, true },
    -  { 135866, true },
    -  { 135880, true },
    -  { 135890, true },
    -  { 135903, true },
    -  { 135921, true },
    -  { 135930, true },
    -  { 135945, true },
    -  { 135961, false },
    -  { 135974, false },
    -  { 135987, false },
    -  { 135999, true },
    -  { 136010, true },
    -  { 136025, true },
    -  { 136037, true },
    -  { 136054, true },
    -  { 136068, true },
    -  { 136081, true },
    -  { 136090, true },
    -  { 136101, true },
    -  { 136112, true },
    -  { 136124, true },
    -  { 136137, true },
    +  { 135666, true },
    +  { 135684, true },
    +  { 135693, true },
    +  { 135708, true },
    +  { 135724, false },
    +  { 135737, false },
    +  { 135750, false },
    +  { 135762, true },
    +  { 135773, true },
    +  { 135788, true },
    +  { 135800, true },
    +  { 135817, true },
    +  { 135831, true },
    +  { 135844, true },
    +  { 135853, true },
    +  { 135864, true },
    +  { 135875, true },
    +  { 135887, true },
    +  { 135900, true },
    +  { 135913, true },
    +  { 135922, true },
    +  { 135933, true },
    +  { 135949, true },
    +  { 135961, true },
    +  { 135973, true },
    +  { 135990, true },
    +  { 136002, true },
    +  { 136016, true },
    +  { 136029, true },
    +  { 136046, true },
    +  { 136060, true },
    +  { 136075, true },
    +  { 136091, true },
    +  { 136107, true },
    +  { 136116, true },
    +  { 136123, true },
    +  { 136139, true },
       { 136150, true },
    -  { 136159, true },
    -  { 136170, true },
    -  { 136186, true },
    -  { 136198, true },
    -  { 136210, true },
    -  { 136227, true },
    +  { 136167, true },
    +  { 136180, true },
    +  { 136195, true },
    +  { 136205, true },
    +  { 136216, true },
       { 136239, true },
    -  { 136253, true },
    -  { 136266, true },
    -  { 136283, true },
    -  { 136297, true },
    -  { 136312, true },
    -  { 136328, true },
    -  { 136344, true },
    -  { 136353, true },
    -  { 136360, true },
    -  { 136376, true },
    -  { 136387, true },
    -  { 136404, true },
    +  { 136251, false },
    +  { 136265, true },
    +  { 136276, true },
    +  { 136292, false },
    +  { 136311, true },
    +  { 136330, true },
    +  { 136341, true },
    +  { 136362, true },
    +  { 136378, true },
    +  { 136392, true },
    +  { 136406, true },
       { 136417, true },
    -  { 136432, true },
    -  { 136442, true },
    -  { 136453, true },
    -  { 136476, true },
    -  { 136488, false },
    -  { 136502, true },
    -  { 136513, true },
    -  { 136529, false },
    -  { 136548, true },
    -  { 136567, true },
    -  { 136578, true },
    -  { 136599, true },
    -  { 136615, true },
    -  { 136629, true },
    +  { 136438, true },
    +  { 136451, true },
    +  { 136461, true },
    +  { 136472, true },
    +  { 136489, true },
    +  { 136509, true },
    +  { 136524, true },
    +  { 136543, false },
    +  { 136560, true },
    +  { 136583, true },
    +  { 136598, true },
    +  { 136614, true },
    +  { 136625, true },
    +  { 136635, true },
       { 136643, true },
    -  { 136654, true },
    -  { 136675, true },
    -  { 136688, true },
    -  { 136698, true },
    -  { 136709, true },
    -  { 136726, true },
    -  { 136746, true },
    -  { 136761, true },
    -  { 136780, false },
    -  { 136797, true },
    -  { 136820, true },
    -  { 136835, true },
    -  { 136851, true },
    +  { 136666, true },
    +  { 136678, true },
    +  { 136686, true },
    +  { 136712, true },
    +  { 136730, true },
    +  { 136743, true },
    +  { 136751, true },
    +  { 136763, true },
    +  { 136790, true },
    +  { 136821, true },
    +  { 136837, true },
    +  { 136847, true },
       { 136862, true },
    -  { 136872, true },
    -  { 136880, true },
    -  { 136903, true },
    -  { 136915, true },
    -  { 136923, true },
    -  { 136949, true },
    -  { 136967, true },
    -  { 136980, true },
    -  { 136988, true },
    -  { 137000, true },
    -  { 137027, true },
    -  { 137058, true },
    -  { 137074, true },
    -  { 137084, true },
    +  { 136873, true },
    +  { 136884, false },
    +  { 136897, true },
    +  { 136906, true },
    +  { 136919, true },
    +  { 136947, true },
    +  { 136968, true },
    +  { 136982, true },
    +  { 137004, true },
    +  { 137014, true },
    +  { 137026, true },
    +  { 137042, true },
    +  { 137056, true },
    +  { 137067, true },
    +  { 137081, true },
       { 137099, true },
    -  { 137110, true },
    -  { 137121, false },
    -  { 137134, true },
    -  { 137143, true },
    -  { 137156, true },
    -  { 137184, true },
    -  { 137205, true },
    -  { 137219, true },
    -  { 137241, true },
    -  { 137251, true },
    -  { 137263, true },
    -  { 137279, true },
    -  { 137293, true },
    -  { 137304, true },
    -  { 137318, true },
    -  { 137336, true },
    -  { 137353, true },
    -  { 137373, true },
    -  { 137384, true },
    -  { 137395, false },
    -  { 137402, true },
    -  { 137429, true },
    -  { 137449, true },
    -  { 137467, true },
    -  { 137482, false },
    -  { 137493, true },
    -  { 137509, true },
    -  { 137526, true },
    -  { 137543, true },
    -  { 137565, true },
    -  { 137579, true },
    -  { 137595, false },
    -  { 137612, true },
    -  { 137628, true },
    -  { 137638, true },
    -  { 137659, true },
    -  { 137677, true },
    -  { 137695, true },
    -  { 137709, true },
    -  { 137720, true },
    -  { 137737, true },
    +  { 137116, true },
    +  { 137136, true },
    +  { 137147, true },
    +  { 137158, false },
    +  { 137165, true },
    +  { 137192, true },
    +  { 137212, true },
    +  { 137230, true },
    +  { 137245, false },
    +  { 137256, true },
    +  { 137272, true },
    +  { 137289, true },
    +  { 137306, true },
    +  { 137328, true },
    +  { 137342, true },
    +  { 137358, false },
    +  { 137375, true },
    +  { 137391, true },
    +  { 137401, true },
    +  { 137422, true },
    +  { 137440, true },
    +  { 137458, true },
    +  { 137472, true },
    +  { 137483, true },
    +  { 137500, true },
    +  { 137520, true },
    +  { 137534, true },
    +  { 137551, true },
    +  { 137568, true },
    +  { 137585, true },
    +  { 137606, true },
    +  { 137622, true },
    +  { 137645, true },
    +  { 137662, true },
    +  { 137680, true },
    +  { 137687, true },
    +  { 137697, true },
    +  { 137713, true },
    +  { 137724, false },
    +  { 137744, true },
       { 137757, true },
    -  { 137771, true },
    -  { 137788, true },
    -  { 137805, true },
    -  { 137822, true },
    -  { 137843, true },
    -  { 137859, true },
    -  { 137882, true },
    -  { 137899, true },
    -  { 137917, true },
    -  { 137924, true },
    -  { 137934, true },
    -  { 137950, true },
    -  { 137961, false },
    -  { 137981, true },
    -  { 137994, true },
    -  { 138007, true },
    -  { 138017, true },
    -  { 138034, true },
    -  { 138054, true },
    -  { 138069, true },
    -  { 138086, true },
    -  { 138100, true },
    -  { 138114, true },
    -  { 138135, true },
    -  { 138149, false },
    -  { 138163, true },
    -  { 138180, true },
    -  { 138197, true },
    -  { 138213, true },
    -  { 138233, true },
    -  { 138256, true },
    -  { 138265, false },
    -  { 138273, true },
    -  { 138285, true },
    -  { 138304, false },
    -  { 138326, true },
    -  { 138341, true },
    -  { 138355, true },
    -  { 138369, true },
    -  { 138382, true },
    -  { 138397, true },
    +  { 137770, true },
    +  { 137780, true },
    +  { 137797, true },
    +  { 137817, true },
    +  { 137832, true },
    +  { 137849, true },
    +  { 137863, true },
    +  { 137877, true },
    +  { 137898, true },
    +  { 137912, false },
    +  { 137926, true },
    +  { 137943, true },
    +  { 137960, true },
    +  { 137976, true },
    +  { 137996, true },
    +  { 138019, true },
    +  { 138028, false },
    +  { 138036, true },
    +  { 138048, true },
    +  { 138067, false },
    +  { 138089, true },
    +  { 138104, true },
    +  { 138118, true },
    +  { 138132, true },
    +  { 138145, true },
    +  { 138160, true },
    +  { 138174, true },
    +  { 138195, true },
    +  { 138205, true },
    +  { 138213, false },
    +  { 138235, true },
    +  { 138247, true },
    +  { 138272, true },
    +  { 138282, true },
    +  { 138307, true },
    +  { 138320, false },
    +  { 138345, true },
    +  { 138362, true },
    +  { 138379, true },
    +  { 138392, true },
    +  { 138403, true },
       { 138411, true },
    -  { 138432, true },
    -  { 138442, true },
    -  { 138450, false },
    -  { 138472, true },
    -  { 138484, true },
    -  { 138509, true },
    -  { 138519, true },
    -  { 138544, true },
    -  { 138557, false },
    -  { 138582, true },
    -  { 138599, true },
    -  { 138616, true },
    -  { 138629, true },
    -  { 138640, true },
    -  { 138648, true },
    -  { 138657, true },
    -  { 138671, true },
    -  { 138684, true },
    -  { 138700, true },
    -  { 138716, true },
    +  { 138420, true },
    +  { 138434, true },
    +  { 138447, true },
    +  { 138463, true },
    +  { 138479, true },
    +  { 138490, true },
    +  { 138501, true },
    +  { 138517, true },
    +  { 138527, false },
    +  { 138539, true },
    +  { 138551, true },
    +  { 138566, true },
    +  { 138584, true },
    +  { 138596, true },
    +  { 138606, true },
    +  { 138622, true },
    +  { 138646, true },
    +  { 138653, true },
    +  { 138660, true },
    +  { 138677, true },
    +  { 138691, true },
    +  { 138703, true },
    +  { 138715, true },
       { 138727, true },
    -  { 138738, true },
    -  { 138754, true },
    -  { 138764, false },
    -  { 138776, true },
    -  { 138788, true },
    +  { 138741, true },
    +  { 138762, true },
    +  { 138775, true },
    +  { 138786, true },
       { 138803, true },
    -  { 138821, true },
    -  { 138833, true },
    +  { 138818, true },
       { 138843, true },
    -  { 138859, true },
    -  { 138883, true },
    -  { 138890, true },
    +  { 138858, true },
    +  { 138868, true },
    +  { 138879, true },
    +  { 138888, true },
       { 138897, true },
    -  { 138914, true },
    -  { 138928, true },
    -  { 138940, true },
    -  { 138952, true },
    -  { 138964, true },
    -  { 138978, true },
    -  { 138999, true },
    -  { 139012, true },
    -  { 139023, true },
    -  { 139040, true },
    -  { 139055, true },
    -  { 139080, true },
    -  { 139095, true },
    -  { 139105, true },
    -  { 139116, true },
    -  { 139125, true },
    -  { 139134, true },
    -  { 139149, true },
    -  { 139159, true },
    -  { 139175, true },
    -  { 139188, true },
    -  { 139200, true },
    -  { 139217, true },
    -  { 139238, true },
    -  { 139259, true },
    -  { 139276, true },
    -  { 139294, true },
    -  { 139306, true },
    +  { 138912, true },
    +  { 138922, true },
    +  { 138938, true },
    +  { 138951, true },
    +  { 138963, true },
    +  { 138980, true },
    +  { 139001, true },
    +  { 139022, true },
    +  { 139039, true },
    +  { 139057, true },
    +  { 139069, true },
    +  { 139084, true },
    +  { 139100, true },
    +  { 139114, true },
    +  { 139126, true },
    +  { 139140, true },
    +  { 139152, true },
    +  { 139171, true },
    +  { 139187, true },
    +  { 139203, true },
    +  { 139219, true },
    +  { 139237, true },
    +  { 139254, true },
    +  { 139272, true },
    +  { 139286, true },
    +  { 139304, true },
       { 139321, true },
    -  { 139337, true },
    +  { 139340, true },
       { 139351, true },
    -  { 139363, true },
    -  { 139377, true },
    -  { 139389, true },
    -  { 139408, true },
    -  { 139424, true },
    -  { 139440, true },
    -  { 139456, true },
    -  { 139474, true },
    -  { 139491, true },
    -  { 139509, true },
    -  { 139523, true },
    -  { 139541, true },
    -  { 139558, true },
    -  { 139577, true },
    -  { 139588, true },
    -  { 139608, true },
    -  { 139625, true },
    -  { 139641, true },
    -  { 139659, false },
    -  { 139672, true },
    -  { 139689, false },
    -  { 139710, true },
    -  { 139727, true },
    -  { 139742, true },
    -  { 139755, true },
    -  { 139766, true },
    -  { 139784, true },
    -  { 139796, true },
    -  { 139820, true },
    -  { 139829, true },
    -  { 139844, true },
    -  { 139871, true },
    -  { 139889, true },
    -  { 139898, true },
    -  { 139908, true },
    -  { 139919, true },
    -  { 139929, true },
    -  { 139942, true },
    -  { 139950, true },
    -  { 139957, true },
    -  { 139976, true },
    -  { 139983, true },
    -  { 139998, true },
    -  { 140007, true },
    +  { 139371, true },
    +  { 139388, true },
    +  { 139404, true },
    +  { 139422, false },
    +  { 139435, true },
    +  { 139452, false },
    +  { 139473, true },
    +  { 139490, true },
    +  { 139505, true },
    +  { 139518, true },
    +  { 139529, true },
    +  { 139547, true },
    +  { 139559, true },
    +  { 139583, true },
    +  { 139592, true },
    +  { 139607, true },
    +  { 139634, true },
    +  { 139652, true },
    +  { 139661, true },
    +  { 139671, true },
    +  { 139682, true },
    +  { 139692, true },
    +  { 139705, true },
    +  { 139713, true },
    +  { 139720, true },
    +  { 139739, true },
    +  { 139746, true },
    +  { 139761, true },
    +  { 139770, true },
    +  { 139782, true },
    +  { 139794, false },
    +  { 139814, true },
    +  { 139828, true },
    +  { 139838, true },
    +  { 139855, true },
    +  { 139873, true },
    +  { 139890, true },
    +  { 139912, true },
    +  { 139925, true },
    +  { 139944, true },
    +  { 139956, true },
    +  { 139969, true },
    +  { 139988, true },
    +  { 140003, true },
       { 140019, true },
    -  { 140031, false },
    -  { 140051, true },
    +  { 140039, true },
    +  { 140053, true },
       { 140065, true },
    -  { 140075, true },
    -  { 140092, true },
    -  { 140110, true },
    -  { 140127, true },
    -  { 140149, true },
    +  { 140076, true },
    +  { 140087, true },
    +  { 140098, true },
    +  { 140109, true },
    +  { 140128, true },
    +  { 140145, true },
       { 140162, true },
    -  { 140181, true },
    -  { 140193, true },
    -  { 140206, true },
    -  { 140225, true },
    -  { 140240, true },
    -  { 140256, true },
    -  { 140276, true },
    -  { 140290, true },
    -  { 140302, true },
    -  { 140313, true },
    -  { 140324, true },
    -  { 140335, true },
    +  { 140174, true },
    +  { 140191, true },
    +  { 140202, true },
    +  { 140226, true },
    +  { 140236, true },
    +  { 140248, true },
    +  { 140258, true },
    +  { 140289, true },
    +  { 140298, true },
    +  { 140315, true },
    +  { 140327, true },
       { 140346, true },
    -  { 140365, true },
    -  { 140382, true },
    -  { 140399, true },
    -  { 140411, true },
    -  { 140428, true },
    -  { 140439, true },
    -  { 140463, true },
    -  { 140473, true },
    -  { 140485, true },
    -  { 140495, true },
    -  { 140526, true },
    -  { 140535, true },
    -  { 140552, true },
    -  { 140564, true },
    -  { 140583, true },
    -  { 140599, true },
    -  { 140612, true },
    -  { 140625, true },
    -  { 140635, true },
    -  { 140649, true },
    -  { 140658, true },
    -  { 140668, true },
    -  { 140683, true },
    -  { 140693, true },
    -  { 140707, true },
    -  { 140723, true },
    +  { 140362, true },
    +  { 140375, true },
    +  { 140388, true },
    +  { 140398, true },
    +  { 140412, true },
    +  { 140421, true },
    +  { 140431, true },
    +  { 140446, true },
    +  { 140456, true },
    +  { 140470, true },
    +  { 140486, true },
    +  { 140501, true },
    +  { 140511, true },
    +  { 140529, true },
    +  { 140546, true },
    +  { 140562, true },
    +  { 140579, true },
    +  { 140601, true },
    +  { 140613, false },
    +  { 140631, true },
    +  { 140645, false },
    +  { 140660, true },
    +  { 140673, true },
    +  { 140686, true },
    +  { 140698, true },
    +  { 140710, true },
    +  { 140721, true },
       { 140738, true },
    -  { 140748, true },
    -  { 140766, true },
    -  { 140783, true },
    -  { 140799, true },
    +  { 140750, true },
    +  { 140769, true },
    +  { 140778, true },
    +  { 140793, false },
    +  { 140800, true },
       { 140816, true },
    -  { 140838, true },
    -  { 140850, false },
    -  { 140868, true },
    -  { 140882, false },
    -  { 140897, true },
    -  { 140910, true },
    -  { 140923, true },
    -  { 140935, true },
    -  { 140947, true },
    -  { 140958, true },
    -  { 140975, true },
    -  { 140987, true },
    -  { 141006, true },
    -  { 141015, true },
    -  { 141030, false },
    -  { 141037, true },
    -  { 141053, true },
    -  { 141068, true },
    -  { 141090, true },
    -  { 141106, true },
    -  { 141124, true },
    -  { 141138, true },
    -  { 141148, true },
    -  { 141163, true },
    -  { 141173, true },
    -  { 141185, true },
    +  { 140831, true },
    +  { 140853, true },
    +  { 140869, true },
    +  { 140887, true },
    +  { 140901, true },
    +  { 140911, true },
    +  { 140926, true },
    +  { 140936, true },
    +  { 140948, true },
    +  { 140966, true },
    +  { 140982, true },
    +  { 140997, true },
    +  { 141012, false },
    +  { 141035, true },
    +  { 141043, true },
    +  { 141059, true },
    +  { 141070, true },
    +  { 141087, true },
    +  { 141107, true },
    +  { 141119, true },
    +  { 141150, true },
    +  { 141171, true },
    +  { 141192, true },
       { 141203, true },
    -  { 141219, true },
    -  { 141234, true },
    -  { 141249, false },
    -  { 141272, true },
    -  { 141280, true },
    -  { 141296, true },
    -  { 141307, true },
    -  { 141324, true },
    -  { 141344, true },
    -  { 141356, true },
    -  { 141387, true },
    -  { 141408, true },
    -  { 141421, true },
    -  { 141442, true },
    -  { 141453, true },
    -  { 141470, true },
    +  { 141220, true },
    +  { 141232, true },
    +  { 141240, true },
    +  { 141251, true },
    +  { 141260, true },
    +  { 141269, true },
    +  { 141283, true },
    +  { 141295, false },
    +  { 141302, true },
    +  { 141310, true },
    +  { 141319, true },
    +  { 141328, true },
    +  { 141339, true },
    +  { 141347, true },
    +  { 141361, true },
    +  { 141380, false },
    +  { 141400, true },
    +  { 141410, true },
    +  { 141431, true },
    +  { 141442, false },
    +  { 141454, true },
    +  { 141471, true },
       { 141482, true },
    -  { 141490, true },
    -  { 141501, true },
    -  { 141510, true },
    -  { 141519, true },
    -  { 141533, true },
    -  { 141545, false },
    -  { 141552, true },
    -  { 141560, true },
    -  { 141569, true },
    -  { 141578, true },
    -  { 141589, true },
    -  { 141597, true },
    -  { 141611, true },
    -  { 141630, false },
    -  { 141650, true },
    -  { 141660, true },
    -  { 141681, true },
    -  { 141692, false },
    -  { 141704, true },
    -  { 141721, true },
    -  { 141732, true },
    -  { 141761, true },
    -  { 141775, true },
    -  { 141789, true },
    -  { 141806, true },
    -  { 141818, true },
    -  { 141833, true },
    -  { 141841, true },
    -  { 141855, true },
    -  { 141872, true },
    -  { 141890, true },
    -  { 141903, true },
    -  { 141912, false },
    +  { 141511, true },
    +  { 141525, true },
    +  { 141539, true },
    +  { 141556, true },
    +  { 141568, true },
    +  { 141583, true },
    +  { 141591, true },
    +  { 141605, true },
    +  { 141622, true },
    +  { 141640, true },
    +  { 141653, true },
    +  { 141662, false },
    +  { 141680, true },
    +  { 141692, true },
    +  { 141705, true },
    +  { 141714, true },
    +  { 141737, true },
    +  { 141751, true },
    +  { 141764, true },
    +  { 141780, true },
    +  { 141797, true },
    +  { 141810, true },
    +  { 141828, true },
    +  { 141840, true },
    +  { 141859, false },
    +  { 141875, true },
    +  { 141898, true },
    +  { 141907, true },
    +  { 141922, true },
       { 141930, true },
    -  { 141942, true },
    -  { 141955, true },
    -  { 141964, true },
    -  { 141987, true },
    -  { 142001, true },
    -  { 142014, true },
    -  { 142030, true },
    -  { 142047, true },
    -  { 142060, true },
    -  { 142078, true },
    -  { 142090, true },
    -  { 142109, false },
    -  { 142125, true },
    -  { 142148, true },
    -  { 142157, true },
    -  { 142172, true },
    -  { 142180, true },
    -  { 142199, true },
    -  { 142213, true },
    -  { 142229, true },
    -  { 142249, true },
    -  { 142259, true },
    -  { 142277, true },
    -  { 142284, true },
    -  { 142296, true },
    -  { 142309, true },
    -  { 142319, true },
    -  { 142325, true },
    -  { 142333, true },
    -  { 142341, true },
    -  { 142349, false },
    -  { 142372, true },
    -  { 142391, true },
    +  { 141949, true },
    +  { 141963, true },
    +  { 141979, true },
    +  { 141999, true },
    +  { 142009, true },
    +  { 142027, true },
    +  { 142034, true },
    +  { 142046, true },
    +  { 142059, true },
    +  { 142069, true },
    +  { 142075, true },
    +  { 142083, true },
    +  { 142091, true },
    +  { 142099, false },
    +  { 142122, true },
    +  { 142147, true },
    +  { 142164, true },
    +  { 142176, true },
    +  { 142188, true },
    +  { 142203, true },
    +  { 142212, true },
    +  { 142226, true },
    +  { 142239, true },
    +  { 142261, true },
    +  { 142271, true },
    +  { 142292, true },
    +  { 142313, true },
    +  { 142330, true },
    +  { 142346, true },
    +  { 142359, true },
    +  { 142369, true },
    +  { 142379, true },
    +  { 142392, true },
       { 142416, true },
    -  { 142433, true },
    -  { 142445, true },
    -  { 142457, true },
    -  { 142472, true },
    -  { 142481, true },
    +  { 142435, true },
    +  { 142447, true },
    +  { 142465, true },
    +  { 142482, false },
       { 142495, true },
    -  { 142508, true },
    -  { 142530, true },
    -  { 142540, true },
    -  { 142561, true },
    -  { 142582, true },
    -  { 142599, true },
    -  { 142615, true },
    -  { 142628, true },
    -  { 142638, true },
    -  { 142648, true },
    -  { 142661, true },
    -  { 142685, true },
    -  { 142704, true },
    -  { 142716, true },
    -  { 142734, true },
    -  { 142751, false },
    -  { 142764, true },
    -  { 142777, false },
    -  { 142798, true },
    -  { 142808, true },
    -  { 142827, true },
    -  { 142840, true },
    -  { 142855, true },
    -  { 142875, true },
    -  { 142886, true },
    -  { 142898, true },
    -  { 142911, true },
    -  { 142926, true },
    -  { 142941, true },
    -  { 142954, false },
    -  { 142963, true },
    -  { 142982, true },
    -  { 142999, false },
    -  { 143014, true },
    -  { 143024, true },
    -  { 143037, true },
    -  { 143053, true },
    +  { 142508, false },
    +  { 142529, true },
    +  { 142539, true },
    +  { 142558, true },
    +  { 142571, true },
    +  { 142586, true },
    +  { 142606, true },
    +  { 142617, true },
    +  { 142629, true },
    +  { 142642, true },
    +  { 142657, true },
    +  { 142672, true },
    +  { 142685, false },
    +  { 142694, true },
    +  { 142713, true },
    +  { 142730, false },
    +  { 142745, true },
    +  { 142755, true },
    +  { 142768, true },
    +  { 142784, true },
    +  { 142802, true },
    +  { 142812, true },
    +  { 142824, true },
    +  { 142837, true },
    +  { 142850, true },
    +  { 142859, true },
    +  { 142883, false },
    +  { 142896, true },
    +  { 142907, true },
    +  { 142919, true },
    +  { 142935, true },
    +  { 142952, true },
    +  { 142962, true },
    +  { 142979, true },
    +  { 142998, false },
    +  { 143007, true },
    +  { 143029, true },
    +  { 143043, true },
    +  { 143056, false },
       { 143071, true },
    -  { 143081, true },
    -  { 143093, true },
    -  { 143106, true },
    -  { 143119, true },
    +  { 143086, true },
    +  { 143105, false },
       { 143128, true },
    -  { 143152, false },
    -  { 143165, true },
    -  { 143176, true },
    -  { 143188, true },
    -  { 143204, true },
    -  { 143221, true },
    -  { 143231, true },
    -  { 143248, true },
    -  { 143267, false },
    -  { 143276, true },
    -  { 143298, true },
    -  { 143312, true },
    -  { 143325, false },
    +  { 143144, true },
    +  { 143160, false },
    +  { 143180, true },
    +  { 143193, true },
    +  { 143209, true },
    +  { 143220, true },
    +  { 143239, true },
    +  { 143253, true },
    +  { 143264, true },
    +  { 143274, true },
    +  { 143291, true },
    +  { 143303, true },
    +  { 143321, true },
       { 143340, true },
    -  { 143355, true },
    -  { 143374, false },
    -  { 143397, true },
    -  { 143413, true },
    -  { 143429, false },
    -  { 143449, true },
    -  { 143462, true },
    -  { 143478, true },
    -  { 143489, true },
    -  { 143508, true },
    -  { 143522, true },
    -  { 143533, true },
    -  { 143543, true },
    -  { 143560, true },
    -  { 143572, true },
    -  { 143590, true },
    -  { 143609, true },
    -  { 143621, true },
    -  { 143632, true },
    -  { 143651, true },
    -  { 143664, true },
    -  { 143680, true },
    -  { 143704, false },
    -  { 143722, true },
    -  { 143740, false },
    -  { 143760, true },
    +  { 143352, true },
    +  { 143363, true },
    +  { 143382, true },
    +  { 143395, true },
    +  { 143411, true },
    +  { 143435, false },
    +  { 143453, true },
    +  { 143471, false },
    +  { 143491, true },
    +  { 143507, true },
    +  { 143525, true },
    +  { 143537, true },
    +  { 143554, true },
    +  { 143573, true },
    +  { 143593, true },
    +  { 143606, true },
    +  { 143618, true },
    +  { 143641, true },
    +  { 143649, true },
    +  { 143669, true },
    +  { 143677, true },
    +  { 143693, true },
    +  { 143707, true },
    +  { 143716, true },
    +  { 143728, true },
    +  { 143738, true },
    +  { 143747, true },
    +  { 143764, true },
       { 143776, true },
    -  { 143794, true },
    -  { 143806, true },
    -  { 143823, true },
    -  { 143842, true },
    +  { 143787, true },
    +  { 143797, true },
    +  { 143808, true },
    +  { 143821, true },
    +  { 143834, true },
    +  { 143851, true },
       { 143862, true },
    -  { 143875, true },
    -  { 143887, true },
    -  { 143910, true },
    -  { 143918, true },
    -  { 143938, true },
    -  { 143946, true },
    +  { 143872, true },
    +  { 143889, true },
    +  { 143917, true },
    +  { 143931, true },
    +  { 143943, true },
       { 143962, true },
    -  { 143976, true },
    -  { 143985, true },
    -  { 143997, true },
    -  { 144007, true },
    -  { 144016, true },
    -  { 144033, true },
    -  { 144045, true },
    -  { 144056, true },
    -  { 144066, true },
    -  { 144077, true },
    -  { 144090, true },
    +  { 143972, true },
    +  { 143994, true },
    +  { 144008, true },
    +  { 144023, true },
    +  { 144037, true },
    +  { 144046, true },
    +  { 144052, true },
    +  { 144060, true },
    +  { 144072, true },
    +  { 144093, true },
       { 144103, true },
    -  { 144120, true },
    -  { 144131, true },
    -  { 144141, true },
    -  { 144158, true },
    -  { 144186, true },
    -  { 144200, true },
    -  { 144212, true },
    -  { 144231, true },
    -  { 144241, true },
    -  { 144263, true },
    -  { 144277, true },
    -  { 144292, true },
    -  { 144306, true },
    +  { 144121, true },
    +  { 144132, true },
    +  { 144150, true },
    +  { 144163, true },
    +  { 144182, true },
    +  { 144198, true },
    +  { 144211, true },
    +  { 144222, true },
    +  { 144235, true },
    +  { 144249, true },
    +  { 144266, true },
    +  { 144276, true },
    +  { 144284, true },
    +  { 144301, true },
       { 144315, true },
    -  { 144321, true },
       { 144329, true },
    -  { 144341, true },
    -  { 144362, true },
    -  { 144372, true },
    -  { 144390, true },
    -  { 144401, true },
    -  { 144419, true },
    +  { 144343, false },
    +  { 144356, true },
    +  { 144368, true },
    +  { 144380, true },
    +  { 144399, true },
    +  { 144418, true },
       { 144432, true },
    -  { 144451, true },
    -  { 144467, true },
    -  { 144480, true },
    -  { 144491, true },
    -  { 144504, true },
    -  { 144518, true },
    -  { 144535, true },
    -  { 144545, true },
    +  { 144444, true },
    +  { 144457, true },
    +  { 144473, true },
    +  { 144486, true },
    +  { 144499, true },
    +  { 144514, true },
    +  { 144542, true },
       { 144553, true },
    -  { 144570, true },
    -  { 144584, true },
    +  { 144566, true },
    +  { 144585, true },
       { 144598, true },
    -  { 144612, false },
    -  { 144625, true },
    -  { 144637, true },
    +  { 144623, true },
    +  { 144635, true },
       { 144649, true },
    -  { 144668, true },
    -  { 144687, true },
    -  { 144701, true },
    -  { 144713, true },
    -  { 144726, true },
    -  { 144742, true },
    -  { 144755, true },
    -  { 144768, true },
    -  { 144783, true },
    -  { 144811, true },
    -  { 144822, true },
    -  { 144835, true },
    -  { 144854, true },
    -  { 144867, true },
    -  { 144892, true },
    -  { 144904, true },
    -  { 144918, true },
    -  { 144932, true },
    -  { 144947, true },
    -  { 144961, true },
    -  { 144975, true },
    -  { 144989, true },
    -  { 145005, true },
    -  { 145028, true },
    -  { 145044, true },
    -  { 145059, true },
    -  { 145083, true },
    -  { 145102, true },
    -  { 145115, true },
    -  { 145145, true },
    -  { 145165, true },
    -  { 145183, true },
    +  { 144663, true },
    +  { 144678, true },
    +  { 144692, true },
    +  { 144706, true },
    +  { 144720, true },
    +  { 144736, true },
    +  { 144759, true },
    +  { 144775, true },
    +  { 144790, true },
    +  { 144814, true },
    +  { 144833, true },
    +  { 144846, true },
    +  { 144876, true },
    +  { 144896, true },
    +  { 144914, true },
    +  { 144927, true },
    +  { 144948, true },
    +  { 144966, true },
    +  { 144982, true },
    +  { 144995, true },
    +  { 145008, true },
    +  { 145025, true },
    +  { 145045, true },
    +  { 145058, true },
    +  { 145073, true },
    +  { 145085, true },
    +  { 145104, true },
    +  { 145123, true },
    +  { 145137, true },
    +  { 145152, true },
    +  { 145164, true },
    +  { 145181, true },
       { 145196, true },
    -  { 145217, true },
    -  { 145235, true },
    +  { 145214, true },
    +  { 145226, true },
    +  { 145240, true },
       { 145251, true },
    -  { 145264, true },
    -  { 145277, true },
    +  { 145273, true },
    +  { 145282, true },
       { 145294, true },
    -  { 145314, true },
    -  { 145327, true },
    -  { 145342, true },
    -  { 145354, true },
    -  { 145373, true },
    -  { 145392, true },
    -  { 145406, true },
    -  { 145421, true },
    -  { 145433, true },
    -  { 145450, true },
    -  { 145465, true },
    -  { 145483, true },
    -  { 145495, true },
    -  { 145509, true },
    -  { 145520, true },
    -  { 145542, true },
    -  { 145551, true },
    -  { 145563, true },
    -  { 145579, true },
    -  { 145594, true },
    -  { 145617, true },
    -  { 145628, true },
    -  { 145646, true },
    -  { 145662, true },
    -  { 145678, true },
    -  { 145695, true },
    -  { 145714, true },
    +  { 145310, true },
    +  { 145325, true },
    +  { 145348, true },
    +  { 145359, true },
    +  { 145377, true },
    +  { 145393, true },
    +  { 145409, true },
    +  { 145426, true },
    +  { 145445, true },
    +  { 145463, true },
    +  { 145469, true },
    +  { 145487, false },
    +  { 145507, true },
    +  { 145524, true },
    +  { 145538, true },
    +  { 145550, true },
    +  { 145569, false },
    +  { 145586, true },
    +  { 145605, true },
    +  { 145616, true },
    +  { 145635, true },
    +  { 145658, true },
    +  { 145676, true },
    +  { 145696, true },
    +  { 145713, true },
       { 145732, true },
    -  { 145738, true },
    -  { 145756, false },
    -  { 145776, true },
    -  { 145793, true },
    -  { 145807, true },
    -  { 145819, true },
    -  { 145838, false },
    -  { 145855, true },
    -  { 145874, true },
    -  { 145885, true },
    -  { 145904, true },
    -  { 145927, true },
    +  { 145750, true },
    +  { 145759, true },
    +  { 145766, true },
    +  { 145773, true },
    +  { 145785, false },
    +  { 145805, true },
    +  { 145813, true },
    +  { 145824, true },
    +  { 145847, true },
    +  { 145871, true },
    +  { 145894, true },
    +  { 145917, true },
       { 145945, true },
    -  { 145965, true },
    -  { 145982, true },
    -  { 146001, true },
    -  { 146019, true },
    -  { 146028, true },
    -  { 146035, true },
    -  { 146042, true },
    -  { 146054, false },
    -  { 146074, true },
    -  { 146082, true },
    -  { 146093, true },
    -  { 146116, true },
    -  { 146140, true },
    -  { 146163, true },
    +  { 145974, true },
    +  { 145989, true },
    +  { 146008, true },
    +  { 146021, true },
    +  { 146039, true },
    +  { 146062, true },
    +  { 146079, true },
    +  { 146090, true },
    +  { 146101, true },
    +  { 146119, true },
    +  { 146145, true },
    +  { 146174, true },
       { 146186, true },
    -  { 146214, true },
    -  { 146243, true },
    -  { 146258, true },
    -  { 146277, true },
    -  { 146290, true },
    -  { 146308, true },
    -  { 146331, true },
    +  { 146199, false },
    +  { 146219, true },
    +  { 146231, true },
    +  { 146249, false },
    +  { 146264, false },
    +  { 146280, true },
    +  { 146298, true },
    +  { 146314, true },
    +  { 146332, true },
       { 146348, true },
    -  { 146359, true },
    -  { 146370, true },
    -  { 146388, true },
    -  { 146414, true },
    -  { 146443, true },
    -  { 146455, true },
    -  { 146468, false },
    -  { 146488, true },
    -  { 146500, true },
    -  { 146518, false },
    +  { 146360, true },
    +  { 146380, true },
    +  { 146402, true },
    +  { 146422, true },
    +  { 146440, true },
    +  { 146459, true },
    +  { 146479, true },
    +  { 146498, true },
    +  { 146515, true },
       { 146533, false },
    -  { 146549, true },
    -  { 146567, true },
    -  { 146583, true },
    -  { 146601, true },
    -  { 146617, true },
    -  { 146629, true },
    -  { 146649, true },
    -  { 146671, true },
    -  { 146691, true },
    -  { 146709, true },
    -  { 146728, true },
    -  { 146748, true },
    -  { 146767, true },
    -  { 146784, true },
    -  { 146802, false },
    -  { 146820, true },
    -  { 146839, true },
    -  { 146851, true },
    -  { 146865, true },
    -  { 146880, true },
    -  { 146899, true },
    -  { 146913, true },
    -  { 146928, true },
    -  { 146938, true },
    -  { 146951, true },
    -  { 146971, true },
    -  { 146980, true },
    -  { 146990, false },
    -  { 147007, true },
    -  { 147016, true },
    -  { 147029, true },
    -  { 147046, true },
    -  { 147060, true },
    -  { 147074, true },
    -  { 147086, true },
    -  { 147103, true },
    -  { 147113, true },
    -  { 147129, true },
    -  { 147141, true },
    -  { 147152, false },
    -  { 147168, true },
    +  { 146551, true },
    +  { 146570, true },
    +  { 146582, true },
    +  { 146596, true },
    +  { 146611, true },
    +  { 146630, true },
    +  { 146644, true },
    +  { 146659, true },
    +  { 146669, true },
    +  { 146682, true },
    +  { 146702, true },
    +  { 146711, true },
    +  { 146721, false },
    +  { 146738, true },
    +  { 146747, true },
    +  { 146760, true },
    +  { 146777, true },
    +  { 146791, true },
    +  { 146805, true },
    +  { 146817, true },
    +  { 146834, true },
    +  { 146844, true },
    +  { 146860, true },
    +  { 146871, false },
    +  { 146887, true },
    +  { 146898, true },
    +  { 146914, true },
    +  { 146923, true },
    +  { 146936, true },
    +  { 146953, true },
    +  { 146965, true },
    +  { 146977, true },
    +  { 146989, true },
    +  { 146998, true },
    +  { 147010, true },
    +  { 147025, true },
    +  { 147039, true },
    +  { 147049, true },
    +  { 147070, true },
    +  { 147088, true },
    +  { 147100, true },
    +  { 147115, true },
    +  { 147125, true },
    +  { 147140, true },
    +  { 147152, true },
    +  { 147164, true },
       { 147179, true },
    -  { 147195, true },
    -  { 147204, true },
    -  { 147217, true },
    -  { 147234, true },
    -  { 147246, true },
    -  { 147258, true },
    -  { 147270, true },
    -  { 147279, true },
    -  { 147291, true },
    -  { 147306, true },
    -  { 147320, true },
    -  { 147330, true },
    -  { 147351, true },
    -  { 147369, true },
    -  { 147381, true },
    -  { 147396, true },
    -  { 147406, true },
    +  { 147190, true },
    +  { 147201, true },
    +  { 147209, true },
    +  { 147222, true },
    +  { 147235, true },
    +  { 147244, true },
    +  { 147261, true },
    +  { 147271, true },
    +  { 147284, true },
    +  { 147301, true },
    +  { 147315, true },
    +  { 147324, true },
    +  { 147339, true },
    +  { 147353, true },
    +  { 147366, true },
    +  { 147380, true },
    +  { 147394, true },
    +  { 147413, true },
       { 147421, true },
    -  { 147433, true },
    -  { 147445, true },
    -  { 147460, true },
    -  { 147471, true },
    +  { 147438, true },
    +  { 147453, true },
    +  { 147468, true },
       { 147482, true },
    -  { 147490, true },
    -  { 147503, true },
    -  { 147516, true },
    -  { 147525, true },
    -  { 147542, true },
    -  { 147552, true },
    -  { 147565, true },
    -  { 147582, true },
    -  { 147596, true },
    -  { 147605, true },
    -  { 147620, true },
    -  { 147634, true },
    -  { 147647, true },
    -  { 147661, true },
    -  { 147675, true },
    -  { 147694, true },
    -  { 147702, true },
    -  { 147719, true },
    -  { 147734, true },
    -  { 147749, true },
    -  { 147763, true },
    -  { 147779, true },
    -  { 147795, true },
    -  { 147809, true },
    -  { 147825, true },
    -  { 147842, true },
    -  { 147855, true },
    -  { 147869, false },
    -  { 147887, true },
    -  { 147902, true },
    +  { 147498, true },
    +  { 147514, true },
    +  { 147528, true },
    +  { 147544, true },
    +  { 147561, true },
    +  { 147574, true },
    +  { 147588, false },
    +  { 147606, true },
    +  { 147621, true },
    +  { 147638, true },
    +  { 147655, false },
    +  { 147681, true },
    +  { 147696, true },
    +  { 147714, true },
    +  { 147727, true },
    +  { 147737, true },
    +  { 147750, true },
    +  { 147762, true },
    +  { 147781, true },
    +  { 147796, true },
    +  { 147812, true },
    +  { 147824, true },
    +  { 147837, true },
    +  { 147848, true },
    +  { 147865, true },
    +  { 147896, true },
    +  { 147907, true },
       { 147919, true },
    -  { 147936, false },
    -  { 147962, true },
    -  { 147977, true },
    -  { 147995, true },
    -  { 148008, true },
    -  { 148018, true },
    -  { 148031, true },
    -  { 148043, true },
    -  { 148062, true },
    -  { 148072, true },
    -  { 148087, true },
    -  { 148103, true },
    -  { 148115, true },
    -  { 148128, true },
    -  { 148139, true },
    -  { 148156, true },
    -  { 148187, true },
    -  { 148198, true },
    -  { 148210, true },
    -  { 148224, true },
    -  { 148235, true },
    -  { 148246, false },
    -  { 148266, true },
    -  { 148284, true },
    -  { 148299, false },
    -  { 148313, true },
    -  { 148333, true },
    -  { 148344, true },
    +  { 147933, true },
    +  { 147941, true },
    +  { 147949, true },
    +  { 147960, true },
    +  { 147971, false },
    +  { 147991, true },
    +  { 148009, true },
    +  { 148024, false },
    +  { 148038, true },
    +  { 148058, true },
    +  { 148069, true },
    +  { 148094, true },
    +  { 148112, true },
    +  { 148127, true },
    +  { 148144, true },
    +  { 148160, true },
    +  { 148185, true },
    +  { 148196, true },
    +  { 148207, true },
    +  { 148220, true },
    +  { 148232, true },
    +  { 148245, false },
    +  { 148253, true },
    +  { 148263, true },
    +  { 148278, true },
    +  { 148296, true },
    +  { 148315, true },
    +  { 148328, true },
    +  { 148341, true },
    +  { 148356, true },
       { 148369, true },
    -  { 148387, true },
    +  { 148382, true },
       { 148402, true },
    -  { 148419, true },
    -  { 148435, true },
    -  { 148460, true },
    -  { 148471, true },
    -  { 148482, true },
    -  { 148495, true },
    -  { 148507, true },
    -  { 148520, false },
    -  { 148528, true },
    -  { 148538, true },
    -  { 148553, true },
    -  { 148571, true },
    -  { 148590, true },
    -  { 148603, true },
    -  { 148616, true },
    -  { 148631, true },
    -  { 148644, true },
    -  { 148657, true },
    +  { 148420, true },
    +  { 148434, true },
    +  { 148445, true },
    +  { 148456, true },
    +  { 148473, true },
    +  { 148488, true },
    +  { 148501, true },
    +  { 148526, true },
    +  { 148562, true },
    +  { 148575, true },
    +  { 148585, true },
    +  { 148600, true },
    +  { 148613, true },
    +  { 148635, true },
    +  { 148653, true },
    +  { 148666, true },
       { 148677, true },
    -  { 148695, true },
    -  { 148709, true },
    -  { 148720, true },
    -  { 148731, true },
    -  { 148748, true },
    -  { 148763, true },
    -  { 148776, true },
    -  { 148801, true },
    -  { 148837, true },
    -  { 148850, true },
    -  { 148860, true },
    -  { 148875, true },
    -  { 148888, true },
    -  { 148910, true },
    -  { 148928, true },
    -  { 148941, true },
    -  { 148952, true },
    -  { 148964, true },
    -  { 148972, true },
    -  { 149005, true },
    -  { 149012, true },
    -  { 149029, true },
    -  { 149047, true },
    -  { 149066, false },
    -  { 149084, true },
    -  { 149102, true },
    -  { 149114, true },
    -  { 149126, true },
    -  { 149139, true },
    -  { 149155, true },
    -  { 149169, true },
    -  { 149189, true },
    -  { 149209, true },
    -  { 149220, true },
    -  { 149230, true },
    -  { 149239, true },
    -  { 149250, true },
    -  { 149269, true },
    -  { 149283, true },
    -  { 149297, true },
    -  { 149320, true },
    -  { 149334, true },
    -  { 149348, true },
    -  { 149360, true },
    -  { 149374, true },
    -  { 149388, true },
    -  { 149397, true },
    -  { 149409, true },
    -  { 149421, true },
    -  { 149432, true },
    -  { 149441, true },
    -  { 149450, true },
    -  { 149462, true },
    -  { 149476, true },
    -  { 149488, true },
    -  { 149503, false },
    -  { 149530, true },
    -  { 149550, true },
    -  { 149560, true },
    -  { 149573, true },
    -  { 149586, true },
    -  { 149602, true },
    -  { 149623, true },
    -  { 149642, true },
    -  { 149652, true },
    -  { 149664, true },
    -  { 149676, true },
    -  { 149687, false },
    +  { 148689, true },
    +  { 148697, true },
    +  { 148730, true },
    +  { 148737, true },
    +  { 148754, true },
    +  { 148772, true },
    +  { 148791, false },
    +  { 148809, true },
    +  { 148827, true },
    +  { 148839, true },
    +  { 148851, true },
    +  { 148864, true },
    +  { 148880, true },
    +  { 148894, true },
    +  { 148914, true },
    +  { 148934, true },
    +  { 148945, true },
    +  { 148955, true },
    +  { 148966, true },
    +  { 148985, true },
    +  { 148999, true },
    +  { 149013, true },
    +  { 149036, true },
    +  { 149050, true },
    +  { 149064, true },
    +  { 149076, true },
    +  { 149090, true },
    +  { 149104, true },
    +  { 149113, true },
    +  { 149125, true },
    +  { 149137, true },
    +  { 149148, true },
    +  { 149157, true },
    +  { 149166, true },
    +  { 149178, true },
    +  { 149192, true },
    +  { 149204, true },
    +  { 149219, false },
    +  { 149246, true },
    +  { 149266, true },
    +  { 149276, true },
    +  { 149289, true },
    +  { 149302, true },
    +  { 149318, true },
    +  { 149339, true },
    +  { 149358, true },
    +  { 149368, true },
    +  { 149380, true },
    +  { 149392, true },
    +  { 149403, false },
    +  { 149411, true },
    +  { 149426, true },
    +  { 149440, true },
    +  { 149449, true },
    +  { 149461, true },
    +  { 149474, true },
    +  { 149484, true },
    +  { 149505, true },
    +  { 149517, true },
    +  { 149528, true },
    +  { 149548, true },
    +  { 149567, true },
    +  { 149578, true },
    +  { 149593, true },
    +  { 149618, false },
    +  { 149646, false },
    +  { 149658, true },
    +  { 149669, true },
    +  { 149680, true },
       { 149695, true },
       { 149710, true },
    -  { 149724, true },
    -  { 149733, true },
    -  { 149745, true },
    -  { 149758, true },
    -  { 149768, true },
    -  { 149789, true },
    -  { 149801, true },
    -  { 149812, true },
    +  { 149722, false },
    +  { 149739, true },
    +  { 149755, true },
    +  { 149769, true },
    +  { 149784, true },
    +  { 149799, true },
    +  { 149815, true },
       { 149832, true },
    -  { 149851, true },
    -  { 149862, true },
    -  { 149877, true },
    -  { 149902, false },
    -  { 149930, false },
    -  { 149942, true },
    -  { 149953, true },
    -  { 149964, true },
    -  { 149979, true },
    -  { 149994, true },
    -  { 150006, false },
    -  { 150023, true },
    -  { 150039, true },
    -  { 150053, true },
    -  { 150068, true },
    -  { 150083, true },
    -  { 150099, true },
    -  { 150116, true },
    -  { 150139, true },
    -  { 150158, true },
    -  { 150179, true },
    -  { 150199, true },
    -  { 150217, true },
    -  { 150236, true },
    -  { 150254, true },
    -  { 150272, true },
    -  { 150287, false },
    +  { 149855, true },
    +  { 149874, true },
    +  { 149895, true },
    +  { 149915, true },
    +  { 149933, true },
    +  { 149952, true },
    +  { 149970, true },
    +  { 149988, true },
    +  { 150003, false },
    +  { 150018, false },
    +  { 150032, true },
    +  { 150043, true },
    +  { 150054, true },
    +  { 150069, true },
    +  { 150087, true },
    +  { 150109, true },
    +  { 150123, true },
    +  { 150137, true },
    +  { 150156, true },
    +  { 150174, true },
    +  { 150188, true },
    +  { 150203, true },
    +  { 150219, true },
    +  { 150237, true },
    +  { 150247, true },
    +  { 150259, false },
    +  { 150270, true },
    +  { 150283, true },
       { 150302, false },
    -  { 150316, true },
    -  { 150327, true },
    -  { 150338, true },
    -  { 150353, true },
    -  { 150371, true },
    -  { 150393, true },
    -  { 150407, true },
    -  { 150421, true },
    -  { 150440, true },
    -  { 150458, true },
    +  { 150321, true },
    +  { 150336, true },
    +  { 150349, false },
    +  { 150368, true },
    +  { 150379, true },
    +  { 150397, true },
    +  { 150422, true },
    +  { 150437, true },
    +  { 150455, true },
       { 150472, true },
    -  { 150487, true },
    -  { 150503, true },
    -  { 150521, true },
    -  { 150531, true },
    -  { 150543, false },
    -  { 150554, true },
    -  { 150567, true },
    -  { 150586, false },
    -  { 150605, true },
    -  { 150620, true },
    -  { 150633, false },
    -  { 150652, true },
    -  { 150663, true },
    -  { 150681, true },
    -  { 150706, true },
    -  { 150721, true },
    -  { 150739, true },
    -  { 150756, true },
    -  { 150767, true },
    +  { 150483, true },
    +  { 150493, true },
    +  { 150508, true },
    +  { 150517, true },
    +  { 150527, true },
    +  { 150542, false },
    +  { 150555, true },
    +  { 150571, true },
    +  { 150592, true },
    +  { 150611, true },
    +  { 150623, true },
    +  { 150634, true },
    +  { 150646, true },
    +  { 150661, true },
    +  { 150675, true },
    +  { 150695, true },
    +  { 150718, true },
    +  { 150731, true },
    +  { 150749, true },
    +  { 150757, true },
    +  { 150765, true },
       { 150777, true },
    -  { 150792, true },
    -  { 150801, true },
    +  { 150794, true },
       { 150811, true },
    -  { 150826, false },
    +  { 150822, false },
       { 150839, true },
    -  { 150855, true },
    +  { 150852, true },
    +  { 150863, false },
       { 150876, true },
    -  { 150895, true },
    -  { 150907, true },
    -  { 150918, true },
    -  { 150930, true },
    -  { 150945, true },
    -  { 150959, true },
    -  { 150979, true },
    -  { 151002, true },
    -  { 151015, true },
    -  { 151033, true },
    +  { 150891, false },
    +  { 150915, false },
    +  { 150927, true },
    +  { 150952, true },
    +  { 150961, true },
    +  { 150973, true },
    +  { 150993, true },
    +  { 151010, true },
    +  { 151020, true },
       { 151041, true },
    -  { 151049, true },
    -  { 151061, true },
    -  { 151078, true },
    -  { 151095, true },
    -  { 151106, false },
    -  { 151123, true },
    -  { 151136, true },
    -  { 151147, false },
    -  { 151160, true },
    -  { 151175, false },
    -  { 151199, false },
    -  { 151211, true },
    -  { 151236, true },
    -  { 151245, true },
    -  { 151257, true },
    -  { 151277, true },
    -  { 151294, true },
    -  { 151304, true },
    -  { 151325, true },
    -  { 151334, true },
    -  { 151353, true },
    -  { 151371, true },
    -  { 151387, true },
    -  { 151402, true },
    -  { 151417, true },
    -  { 151432, true },
    -  { 151452, true },
    -  { 151465, true },
    -  { 151478, true },
    -  { 151487, true },
    -  { 151501, true },
    -  { 151524, true },
    -  { 151546, true },
    -  { 151572, true },
    -  { 151587, true },
    -  { 151602, true },
    -  { 151616, true },
    -  { 151628, true },
    -  { 151651, true },
    -  { 151661, true },
    -  { 151669, true },
    -  { 151685, true },
    -  { 151699, true },
    -  { 151712, false },
    -  { 151730, true },
    -  { 151741, true },
    -  { 151754, true },
    -  { 151765, true },
    -  { 151778, true },
    -  { 151788, true },
    -  { 151803, true },
    -  { 151819, true },
    -  { 151829, false },
    -  { 151839, true },
    -  { 151852, true },
    -  { 151867, true },
    -  { 151877, true },
    -  { 151889, true },
    -  { 151898, true },
    -  { 151909, true },
    -  { 151921, true },
    -  { 151941, true },
    -  { 151957, true },
    +  { 151050, true },
    +  { 151069, true },
    +  { 151087, true },
    +  { 151103, true },
    +  { 151118, true },
    +  { 151133, true },
    +  { 151148, true },
    +  { 151168, true },
    +  { 151181, true },
    +  { 151194, true },
    +  { 151203, true },
    +  { 151217, true },
    +  { 151240, true },
    +  { 151262, true },
    +  { 151288, true },
    +  { 151303, true },
    +  { 151318, true },
    +  { 151332, true },
    +  { 151344, true },
    +  { 151367, true },
    +  { 151377, true },
    +  { 151385, true },
    +  { 151401, true },
    +  { 151415, true },
    +  { 151428, false },
    +  { 151446, true },
    +  { 151457, true },
    +  { 151470, true },
    +  { 151481, true },
    +  { 151494, true },
    +  { 151504, true },
    +  { 151519, true },
    +  { 151535, true },
    +  { 151545, false },
    +  { 151555, true },
    +  { 151568, true },
    +  { 151583, true },
    +  { 151593, true },
    +  { 151605, true },
    +  { 151614, true },
    +  { 151625, true },
    +  { 151637, true },
    +  { 151657, true },
    +  { 151673, true },
    +  { 151690, true },
    +  { 151700, true },
    +  { 151710, true },
    +  { 151724, true },
    +  { 151736, true },
    +  { 151749, true },
    +  { 151766, true },
    +  { 151781, true },
    +  { 151798, true },
    +  { 151815, true },
    +  { 151829, true },
    +  { 151845, true },
    +  { 151858, true },
    +  { 151873, false },
    +  { 151885, true },
    +  { 151895, true },
    +  { 151904, true },
    +  { 151916, true },
    +  { 151924, true },
    +  { 151932, true },
    +  { 151940, true },
    +  { 151946, true },
    +  { 151959, true },
       { 151974, true },
    -  { 151984, true },
    -  { 151994, true },
    +  { 151993, true },
       { 152008, true },
    -  { 152020, true },
    -  { 152033, true },
    -  { 152050, true },
    -  { 152065, true },
    -  { 152082, true },
    -  { 152099, true },
    -  { 152113, true },
    -  { 152129, true },
    -  { 152142, true },
    -  { 152157, false },
    -  { 152169, true },
    -  { 152179, true },
    -  { 152188, true },
    -  { 152200, true },
    -  { 152208, true },
    -  { 152216, true },
    -  { 152224, true },
    -  { 152230, true },
    -  { 152243, true },
    -  { 152258, true },
    -  { 152277, true },
    -  { 152292, true },
    -  { 152316, true },
    -  { 152326, true },
    -  { 152342, true },
    -  { 152365, true },
    -  { 152386, true },
    -  { 152399, true },
    -  { 152412, true },
    -  { 152429, true },
    -  { 152443, true },
    -  { 152455, false },
    +  { 152032, true },
    +  { 152042, true },
    +  { 152058, true },
    +  { 152081, true },
    +  { 152102, true },
    +  { 152115, true },
    +  { 152128, true },
    +  { 152145, true },
    +  { 152159, true },
    +  { 152171, false },
    +  { 152184, true },
    +  { 152203, true },
    +  { 152221, true },
    +  { 152245, false },
    +  { 152272, true },
    +  { 152298, true },
    +  { 152313, true },
    +  { 152328, true },
    +  { 152345, true },
    +  { 152361, true },
    +  { 152378, true },
    +  { 152391, true },
    +  { 152402, true },
    +  { 152413, true },
    +  { 152423, true },
    +  { 152432, true },
    +  { 152445, true },
    +  { 152458, true },
       { 152468, true },
    -  { 152487, true },
    -  { 152505, true },
    -  { 152529, false },
    -  { 152556, true },
    -  { 152582, true },
    -  { 152597, true },
    -  { 152612, true },
    -  { 152629, true },
    -  { 152645, true },
    -  { 152662, true },
    -  { 152675, true },
    -  { 152686, true },
    -  { 152697, true },
    -  { 152707, true },
    -  { 152716, true },
    -  { 152729, true },
    -  { 152742, true },
    -  { 152752, true },
    -  { 152763, true },
    -  { 152772, true },
    -  { 152793, true },
    -  { 152807, true },
    -  { 152816, true },
    -  { 152823, true },
    -  { 152831, true },
    -  { 152854, true },
    -  { 152868, true },
    -  { 152877, true },
    -  { 152886, true },
    -  { 152894, true },
    -  { 152907, true },
    -  { 152915, true },
    -  { 152926, false },
    -  { 152942, true },
    -  { 152958, true },
    -  { 152971, true },
    -  { 152982, true },
    -  { 152994, true },
    -  { 153009, true },
    -  { 153018, true },
    -  { 153030, true },
    -  { 153041, true },
    -  { 153053, true },
    -  { 153066, true },
    -  { 153081, true },
    -  { 153101, true },
    -  { 153113, true },
    -  { 153130, true },
    +  { 152479, true },
    +  { 152488, true },
    +  { 152509, true },
    +  { 152523, true },
    +  { 152532, true },
    +  { 152539, true },
    +  { 152547, true },
    +  { 152570, true },
    +  { 152584, true },
    +  { 152593, true },
    +  { 152602, true },
    +  { 152610, true },
    +  { 152623, true },
    +  { 152631, true },
    +  { 152642, false },
    +  { 152658, true },
    +  { 152674, true },
    +  { 152687, true },
    +  { 152698, true },
    +  { 152710, true },
    +  { 152725, true },
    +  { 152734, true },
    +  { 152746, true },
    +  { 152757, true },
    +  { 152769, true },
    +  { 152789, true },
    +  { 152801, true },
    +  { 152818, true },
    +  { 152828, true },
    +  { 152839, true },
    +  { 152849, true },
    +  { 152856, true },
    +  { 152866, true },
    +  { 152880, true },
    +  { 152892, true },
    +  { 152908, true },
    +  { 152923, true },
    +  { 152932, true },
    +  { 152946, true },
    +  { 152966, true },
    +  { 152984, true },
    +  { 152991, true },
    +  { 153008, true },
    +  { 153025, true },
    +  { 153045, true },
    +  { 153064, false },
    +  { 153082, true },
    +  { 153109, true },
    +  { 153126, true },
       { 153140, true },
    -  { 153151, true },
    -  { 153161, true },
    -  { 153168, true },
    -  { 153178, true },
    -  { 153192, true },
    -  { 153204, true },
    -  { 153220, true },
    -  { 153235, true },
    -  { 153244, true },
    -  { 153258, true },
    -  { 153278, true },
    +  { 153155, false },
    +  { 153174, true },
    +  { 153195, true },
    +  { 153214, true },
    +  { 153225, true },
    +  { 153233, true },
    +  { 153248, true },
    +  { 153263, true },
    +  { 153274, true },
       { 153296, true },
    -  { 153303, true },
    -  { 153320, true },
    -  { 153337, true },
    -  { 153357, true },
    -  { 153376, false },
    -  { 153394, true },
    -  { 153421, true },
    -  { 153438, true },
    +  { 153309, true },
    +  { 153328, true },
    +  { 153354, true },
    +  { 153370, true },
    +  { 153380, true },
    +  { 153398, true },
    +  { 153416, true },
    +  { 153431, true },
    +  { 153439, true },
       { 153452, true },
    -  { 153467, false },
    -  { 153486, true },
    -  { 153507, true },
    +  { 153460, true },
    +  { 153474, true },
    +  { 153490, true },
    +  { 153499, true },
    +  { 153516, true },
       { 153526, true },
    -  { 153537, true },
    -  { 153545, true },
    -  { 153560, true },
    -  { 153575, true },
    -  { 153586, true },
    -  { 153608, true },
    -  { 153621, true },
    -  { 153640, true },
    -  { 153666, true },
    -  { 153682, true },
    -  { 153692, true },
    -  { 153710, true },
    -  { 153728, true },
    -  { 153743, true },
    -  { 153751, true },
    -  { 153764, true },
    -  { 153772, true },
    -  { 153786, true },
    -  { 153802, true },
    -  { 153811, true },
    -  { 153828, true },
    -  { 153838, true },
    -  { 153851, true },
    -  { 153869, true },
    -  { 153882, true },
    -  { 153901, false },
    -  { 153911, true },
    -  { 153928, true },
    -  { 153944, true },
    -  { 153967, true },
    -  { 153992, true },
    -  { 154006, true },
    -  { 154019, true },
    -  { 154030, true },
    -  { 154045, true },
    -  { 154057, true },
    -  { 154075, true },
    -  { 154100, true },
    -  { 154112, true },
    -  { 154124, true },
    -  { 154136, true },
    -  { 154154, true },
    -  { 154175, true },
    -  { 154191, true },
    -  { 154203, true },
    -  { 154217, true },
    -  { 154232, true },
    -  { 154245, true },
    -  { 154265, true },
    -  { 154275, false },
    -  { 154286, true },
    -  { 154294, true },
    -  { 154306, true },
    -  { 154323, true },
    -  { 154333, true },
    -  { 154344, true },
    -  { 154351, true },
    -  { 154362, true },
    -  { 154382, true },
    -  { 154397, true },
    -  { 154406, true },
    -  { 154413, true },
    -  { 154423, true },
    -  { 154434, true },
    -  { 154443, true },
    -  { 154453, true },
    -  { 154474, true },
    -  { 154483, false },
    -  { 154496, true },
    +  { 153539, true },
    +  { 153557, true },
    +  { 153570, true },
    +  { 153589, false },
    +  { 153599, true },
    +  { 153616, true },
    +  { 153632, true },
    +  { 153655, true },
    +  { 153680, true },
    +  { 153694, true },
    +  { 153707, true },
    +  { 153718, true },
    +  { 153733, true },
    +  { 153745, true },
    +  { 153763, true },
    +  { 153788, true },
    +  { 153800, true },
    +  { 153812, true },
    +  { 153824, true },
    +  { 153842, true },
    +  { 153863, true },
    +  { 153879, true },
    +  { 153891, true },
    +  { 153905, true },
    +  { 153920, true },
    +  { 153933, true },
    +  { 153953, true },
    +  { 153963, false },
    +  { 153974, true },
    +  { 153982, true },
    +  { 153994, true },
    +  { 154011, true },
    +  { 154021, true },
    +  { 154032, true },
    +  { 154039, true },
    +  { 154050, true },
    +  { 154070, true },
    +  { 154085, true },
    +  { 154094, true },
    +  { 154101, true },
    +  { 154111, true },
    +  { 154122, true },
    +  { 154131, true },
    +  { 154141, true },
    +  { 154162, true },
    +  { 154171, false },
    +  { 154184, true },
    +  { 154200, true },
    +  { 154220, true },
    +  { 154234, true },
    +  { 154250, true },
    +  { 154264, true },
    +  { 154279, true },
    +  { 154292, true },
    +  { 154308, true },
    +  { 154321, true },
    +  { 154334, true },
    +  { 154348, true },
    +  { 154370, true },
    +  { 154391, true },
    +  { 154410, true },
    +  { 154438, true },
    +  { 154459, true },
    +  { 154478, true },
    +  { 154502, true },
       { 154512, true },
    -  { 154532, true },
    -  { 154546, true },
    -  { 154562, true },
    -  { 154576, true },
    -  { 154591, true },
    -  { 154604, true },
    +  { 154521, true },
    +  { 154534, true },
    +  { 154540, true },
    +  { 154552, true },
    +  { 154566, true },
    +  { 154580, true },
    +  { 154594, false },
    +  { 154607, true },
       { 154620, true },
    -  { 154633, true },
    -  { 154646, true },
    -  { 154660, true },
    -  { 154682, true },
    -  { 154703, true },
    -  { 154722, true },
    -  { 154750, true },
    -  { 154771, true },
    -  { 154790, true },
    -  { 154814, true },
    -  { 154824, true },
    -  { 154833, true },
    -  { 154846, true },
    -  { 154852, true },
    -  { 154864, true },
    -  { 154878, true },
    +  { 154631, true },
    +  { 154641, true },
    +  { 154654, true },
    +  { 154673, true },
    +  { 154692, true },
    +  { 154704, true },
    +  { 154724, true },
    +  { 154733, true },
    +  { 154744, true },
    +  { 154753, true },
    +  { 154772, false },
    +  { 154788, false },
    +  { 154801, true },
    +  { 154812, true },
    +  { 154822, true },
    +  { 154837, true },
    +  { 154848, true },
    +  { 154867, true },
    +  { 154880, true },
       { 154892, true },
    -  { 154906, false },
    -  { 154919, true },
    -  { 154932, true },
    -  { 154943, true },
    -  { 154953, true },
    -  { 154966, true },
    +  { 154905, true },
    +  { 154920, true },
    +  { 154929, true },
    +  { 154942, true },
    +  { 154954, true },
    +  { 154969, true },
       { 154985, true },
    -  { 155004, true },
    -  { 155016, true },
    -  { 155036, true },
    -  { 155045, true },
    -  { 155056, true },
    -  { 155065, true },
    -  { 155084, false },
    -  { 155100, false },
    -  { 155113, true },
    -  { 155124, true },
    +  { 155002, true },
    +  { 155011, true },
    +  { 155023, true },
    +  { 155037, true },
    +  { 155051, true },
    +  { 155075, true },
    +  { 155090, true },
    +  { 155106, true },
    +  { 155121, true },
       { 155134, true },
    -  { 155149, true },
    -  { 155160, true },
    -  { 155179, true },
    -  { 155192, true },
    -  { 155204, true },
    -  { 155217, true },
    -  { 155232, true },
    -  { 155241, true },
    -  { 155254, true },
    -  { 155266, true },
    -  { 155281, true },
    -  { 155297, true },
    -  { 155314, true },
    -  { 155323, true },
    -  { 155335, true },
    -  { 155349, true },
    -  { 155363, true },
    -  { 155387, true },
    -  { 155402, true },
    -  { 155418, true },
    -  { 155433, true },
    -  { 155446, true },
    -  { 155469, true },
    -  { 155482, true },
    +  { 155157, true },
    +  { 155170, true },
    +  { 155183, true },
    +  { 155203, true },
    +  { 155214, true },
    +  { 155228, true },
    +  { 155237, true },
    +  { 155246, true },
    +  { 155264, true },
    +  { 155278, true },
    +  { 155294, true },
    +  { 155306, true },
    +  { 155320, true },
    +  { 155345, true },
    +  { 155361, true },
    +  { 155378, true },
    +  { 155393, true },
    +  { 155403, true },
    +  { 155427, true },
    +  { 155439, true },
    +  { 155452, true },
    +  { 155466, true },
       { 155495, true },
    -  { 155515, true },
    -  { 155526, true },
    -  { 155540, true },
    -  { 155549, true },
    -  { 155558, true },
    -  { 155576, true },
    -  { 155590, true },
    -  { 155606, true },
    -  { 155618, true },
    -  { 155632, true },
    -  { 155657, true },
    -  { 155673, true },
    -  { 155690, true },
    -  { 155705, true },
    -  { 155715, true },
    -  { 155739, true },
    -  { 155751, true },
    -  { 155764, true },
    -  { 155778, true },
    -  { 155807, true },
    -  { 155832, true },
    -  { 155857, true },
    +  { 155520, true },
    +  { 155545, true },
    +  { 155574, true },
    +  { 155586, true },
    +  { 155602, true },
    +  { 155611, true },
    +  { 155623, true },
    +  { 155637, true },
    +  { 155651, true },
    +  { 155665, true },
    +  { 155678, true },
    +  { 155697, true },
    +  { 155710, true },
    +  { 155727, true },
    +  { 155736, true },
    +  { 155754, true },
    +  { 155768, false },
    +  { 155779, false },
    +  { 155792, true },
    +  { 155802, true },
    +  { 155821, true },
    +  { 155843, true },
    +  { 155854, true },
    +  { 155865, true },
    +  { 155876, true },
       { 155886, true },
    -  { 155898, true },
    -  { 155914, true },
    -  { 155923, true },
    -  { 155935, true },
    -  { 155949, true },
    +  { 155895, true },
    +  { 155903, false },
    +  { 155909, false },
    +  { 155917, true },
    +  { 155926, true },
    +  { 155934, true },
    +  { 155944, true },
       { 155963, true },
    -  { 155977, true },
    -  { 155990, true },
    -  { 156009, true },
    +  { 155988, true },
    +  { 155995, true },
    +  { 156008, true },
       { 156022, true },
    -  { 156039, true },
    -  { 156048, true },
    -  { 156066, true },
    -  { 156080, false },
    -  { 156091, false },
    -  { 156104, true },
    -  { 156114, true },
    -  { 156133, true },
    -  { 156155, true },
    -  { 156166, true },
    -  { 156177, true },
    -  { 156187, true },
    -  { 156196, true },
    -  { 156204, false },
    -  { 156210, false },
    -  { 156218, true },
    -  { 156227, true },
    -  { 156235, true },
    -  { 156245, true },
    -  { 156264, true },
    -  { 156289, true },
    -  { 156296, true },
    -  { 156309, true },
    -  { 156323, true },
    -  { 156333, true },
    -  { 156343, true },
    -  { 156362, true },
    -  { 156374, true },
    -  { 156389, true },
    -  { 156401, true },
    +  { 156032, true },
    +  { 156042, true },
    +  { 156061, true },
    +  { 156073, true },
    +  { 156088, true },
    +  { 156100, true },
    +  { 156113, true },
    +  { 156126, true },
    +  { 156138, true },
    +  { 156157, true },
    +  { 156168, false },
    +  { 156179, true },
    +  { 156194, true },
    +  { 156210, true },
    +  { 156232, true },
    +  { 156246, true },
    +  { 156259, true },
    +  { 156272, true },
    +  { 156291, true },
    +  { 156307, true },
    +  { 156320, true },
    +  { 156340, false },
    +  { 156367, false },
    +  { 156383, true },
    +  { 156399, true },
       { 156414, true },
    -  { 156427, true },
    -  { 156439, true },
    -  { 156458, true },
    -  { 156469, false },
    -  { 156480, true },
    -  { 156495, true },
    -  { 156511, true },
    -  { 156533, true },
    -  { 156547, true },
    -  { 156560, true },
    -  { 156573, true },
    -  { 156592, true },
    -  { 156608, true },
    -  { 156621, true },
    -  { 156641, false },
    -  { 156668, false },
    +  { 156430, true },
    +  { 156448, true },
    +  { 156467, true },
    +  { 156477, true },
    +  { 156486, true },
    +  { 156499, true },
    +  { 156516, true },
    +  { 156535, true },
    +  { 156548, true },
    +  { 156564, true },
    +  { 156577, true },
    +  { 156596, true },
    +  { 156613, true },
    +  { 156631, true },
    +  { 156648, true },
    +  { 156666, true },
       { 156684, true },
    -  { 156700, true },
    -  { 156715, true },
    -  { 156731, true },
    -  { 156749, true },
    -  { 156768, true },
    -  { 156778, true },
    -  { 156787, true },
    -  { 156800, true },
    -  { 156817, true },
    -  { 156836, true },
    -  { 156849, true },
    -  { 156865, true },
    -  { 156878, true },
    -  { 156897, true },
    -  { 156914, true },
    -  { 156932, true },
    -  { 156949, true },
    -  { 156967, true },
    -  { 156985, true },
    +  { 156697, true },
    +  { 156713, true },
    +  { 156734, true },
    +  { 156744, true },
    +  { 156765, true },
    +  { 156774, true },
    +  { 156785, true },
    +  { 156798, false },
    +  { 156811, true },
    +  { 156824, true },
    +  { 156840, true },
    +  { 156854, false },
    +  { 156869, true },
    +  { 156883, true },
    +  { 156898, true },
    +  { 156915, true },
    +  { 156931, true },
    +  { 156950, true },
    +  { 156966, true },
    +  { 156979, true },
    +  { 156988, true },
       { 156998, true },
    -  { 157014, true },
    -  { 157035, true },
    -  { 157045, true },
    -  { 157066, true },
    -  { 157075, true },
    -  { 157086, true },
    -  { 157099, false },
    -  { 157112, true },
    -  { 157125, true },
    -  { 157141, true },
    -  { 157155, false },
    +  { 157007, true },
    +  { 157034, false },
    +  { 157051, true },
    +  { 157069, true },
    +  { 157093, true },
    +  { 157117, true },
    +  { 157131, true },
    +  { 157142, true },
       { 157170, true },
       { 157184, true },
    -  { 157199, true },
    -  { 157216, true },
    -  { 157232, true },
    -  { 157251, true },
    -  { 157267, true },
    -  { 157280, true },
    -  { 157289, true },
    -  { 157299, true },
    -  { 157308, true },
    -  { 157335, false },
    -  { 157352, true },
    -  { 157370, true },
    -  { 157394, true },
    -  { 157418, true },
    -  { 157432, true },
    +  { 157193, true },
    +  { 157203, true },
    +  { 157223, true },
    +  { 157237, true },
    +  { 157250, true },
    +  { 157270, true },
    +  { 157288, true },
    +  { 157300, true },
    +  { 157315, true },
    +  { 157330, true },
    +  { 157346, true },
    +  { 157361, false },
    +  { 157378, true },
    +  { 157390, false },
    +  { 157413, true },
    +  { 157430, true },
       { 157443, true },
    -  { 157471, true },
    -  { 157485, true },
    -  { 157494, true },
    -  { 157504, true },
    -  { 157524, true },
    -  { 157538, true },
    -  { 157551, true },
    -  { 157571, true },
    -  { 157589, true },
    -  { 157601, true },
    -  { 157616, true },
    -  { 157631, true },
    -  { 157647, true },
    -  { 157662, false },
    -  { 157679, true },
    -  { 157691, false },
    -  { 157714, true },
    -  { 157731, true },
    -  { 157744, true },
    -  { 157767, true },
    -  { 157785, true },
    -  { 157806, true },
    -  { 157828, true },
    -  { 157849, true },
    -  { 157870, true },
    -  { 157880, false },
    -  { 157894, true },
    -  { 157911, true },
    -  { 157928, true },
    -  { 157938, true },
    -  { 157951, true },
    -  { 157966, true },
    -  { 157984, true },
    -  { 158001, true },
    -  { 158017, true },
    -  { 158054, true },
    -  { 158073, true },
    -  { 158088, true },
    -  { 158103, true },
    +  { 157466, true },
    +  { 157484, true },
    +  { 157505, true },
    +  { 157527, true },
    +  { 157548, true },
    +  { 157569, true },
    +  { 157579, false },
    +  { 157593, true },
    +  { 157610, true },
    +  { 157627, true },
    +  { 157637, true },
    +  { 157650, true },
    +  { 157665, true },
    +  { 157683, true },
    +  { 157700, true },
    +  { 157716, true },
    +  { 157753, true },
    +  { 157772, true },
    +  { 157787, true },
    +  { 157802, true },
    +  { 157814, true },
    +  { 157831, true },
    +  { 157848, false },
    +  { 157863, true },
    +  { 157884, false },
    +  { 157896, false },
    +  { 157913, true },
    +  { 157930, true },
    +  { 157947, true },
    +  { 157960, true },
    +  { 157976, true },
    +  { 157992, true },
    +  { 158005, true },
    +  { 158023, true },
    +  { 158033, false },
    +  { 158047, false },
    +  { 158059, true },
    +  { 158070, true },
    +  { 158086, true },
    +  { 158096, true },
       { 158115, true },
    -  { 158132, true },
    -  { 158149, false },
    -  { 158164, true },
    -  { 158185, false },
    -  { 158197, false },
    +  { 158128, true },
    +  { 158142, true },
    +  { 158157, true },
    +  { 158168, true },
    +  { 158188, true },
    +  { 158201, true },
       { 158214, true },
    -  { 158231, true },
    -  { 158248, true },
    -  { 158261, true },
    -  { 158277, true },
    -  { 158293, true },
    -  { 158306, true },
    -  { 158324, true },
    -  { 158334, false },
    -  { 158348, false },
    -  { 158360, true },
    -  { 158371, true },
    -  { 158387, true },
    -  { 158397, true },
    -  { 158416, true },
    -  { 158429, true },
    -  { 158443, true },
    -  { 158458, true },
    -  { 158469, true },
    -  { 158489, true },
    -  { 158502, true },
    -  { 158515, true },
    -  { 158527, true },
    -  { 158546, true },
    -  { 158559, true },
    -  { 158570, true },
    -  { 158581, true },
    -  { 158601, true },
    -  { 158611, true },
    -  { 158621, true },
    -  { 158643, true },
    -  { 158663, true },
    +  { 158226, true },
    +  { 158245, true },
    +  { 158258, true },
    +  { 158269, true },
    +  { 158280, true },
    +  { 158300, true },
    +  { 158310, true },
    +  { 158320, true },
    +  { 158342, true },
    +  { 158362, true },
    +  { 158375, true },
    +  { 158384, true },
    +  { 158395, true },
    +  { 158411, true },
    +  { 158427, true },
    +  { 158449, true },
    +  { 158465, true },
    +  { 158481, true },
    +  { 158505, true },
    +  { 158520, true },
    +  { 158533, true },
    +  { 158552, true },
    +  { 158562, true },
    +  { 158576, true },
    +  { 158587, true },
    +  { 158605, true },
    +  { 158622, true },
    +  { 158634, true },
    +  { 158647, true },
    +  { 158664, true },
       { 158676, true },
    -  { 158685, true },
    -  { 158696, true },
    -  { 158712, true },
    -  { 158728, true },
    -  { 158750, true },
    -  { 158766, true },
    -  { 158782, true },
    -  { 158806, true },
    -  { 158821, true },
    +  { 158693, true },
    +  { 158702, true },
    +  { 158722, false },
    +  { 158742, true },
    +  { 158759, true },
    +  { 158769, true },
    +  { 158786, true },
    +  { 158798, true },
    +  { 158815, true },
       { 158834, true },
    -  { 158853, true },
    -  { 158863, true },
    -  { 158877, true },
    -  { 158888, true },
    -  { 158906, true },
    -  { 158923, true },
    -  { 158935, true },
    -  { 158948, true },
    +  { 158851, true },
    +  { 158868, true },
    +  { 158885, true },
    +  { 158896, true },
    +  { 158909, true },
    +  { 158921, true },
    +  { 158933, true },
    +  { 158943, true },
    +  { 158952, true },
       { 158965, true },
    -  { 158977, true },
    -  { 158994, true },
    -  { 159003, true },
    -  { 159023, false },
    -  { 159043, true },
    -  { 159060, true },
    -  { 159070, true },
    -  { 159087, true },
    -  { 159099, true },
    -  { 159118, true },
    -  { 159135, true },
    -  { 159152, true },
    -  { 159169, true },
    -  { 159180, true },
    -  { 159193, true },
    -  { 159205, true },
    -  { 159217, true },
    -  { 159227, true },
    -  { 159236, true },
    +  { 158975, true },
    +  { 158987, true },
    +  { 159001, false },
    +  { 159010, true },
    +  { 159022, true },
    +  { 159033, true },
    +  { 159046, true },
    +  { 159056, true },
    +  { 159066, true },
    +  { 159077, true },
    +  { 159086, true },
    +  { 159098, false },
    +  { 159111, true },
    +  { 159122, true },
    +  { 159136, false },
    +  { 159147, false },
    +  { 159158, true },
    +  { 159168, true },
    +  { 159191, true },
    +  { 159201, true },
    +  { 159213, true },
    +  { 159226, true },
    +  { 159234, true },
       { 159249, true },
    -  { 159259, true },
    -  { 159271, true },
    -  { 159285, false },
    +  { 159258, true },
    +  { 159270, true },
    +  { 159285, true },
       { 159294, true },
    -  { 159306, true },
    -  { 159317, true },
    -  { 159330, true },
    -  { 159340, true },
    +  { 159313, true },
    +  { 159328, true },
       { 159350, true },
    -  { 159361, true },
    -  { 159370, true },
    -  { 159382, false },
    -  { 159395, true },
    -  { 159406, true },
    -  { 159420, false },
    -  { 159431, false },
    -  { 159442, true },
    -  { 159452, true },
    -  { 159475, true },
    -  { 159485, true },
    -  { 159497, true },
    -  { 159510, true },
    -  { 159518, true },
    -  { 159533, true },
    -  { 159542, true },
    -  { 159554, true },
    -  { 159569, true },
    -  { 159578, true },
    -  { 159597, true },
    -  { 159612, true },
    -  { 159634, true },
    -  { 159650, true },
    -  { 159662, true },
    -  { 159678, true },
    -  { 159692, true },
    -  { 159705, true },
    -  { 159716, true },
    -  { 159724, true },
    -  { 159738, true },
    -  { 159749, true },
    -  { 159766, true },
    -  { 159779, true },
    -  { 159792, true },
    -  { 159808, true },
    -  { 159825, true },
    -  { 159841, true },
    -  { 159854, true },
    -  { 159868, true },
    -  { 159895, true },
    +  { 159366, true },
    +  { 159378, true },
    +  { 159394, true },
    +  { 159408, true },
    +  { 159421, true },
    +  { 159432, true },
    +  { 159440, true },
    +  { 159454, true },
    +  { 159465, true },
    +  { 159482, true },
    +  { 159495, true },
    +  { 159508, true },
    +  { 159524, true },
    +  { 159541, true },
    +  { 159557, true },
    +  { 159570, true },
    +  { 159584, true },
    +  { 159611, true },
    +  { 159635, true },
    +  { 159658, true },
    +  { 159680, true },
    +  { 159693, false },
    +  { 159706, true },
    +  { 159720, true },
    +  { 159734, false },
    +  { 159755, true },
    +  { 159765, true },
    +  { 159777, true },
    +  { 159803, true },
    +  { 159816, true },
    +  { 159830, true },
    +  { 159849, true },
    +  { 159866, true },
    +  { 159884, true },
    +  { 159905, true },
       { 159919, true },
    -  { 159942, true },
    -  { 159964, true },
    -  { 159977, false },
    -  { 159990, true },
    -  { 160004, true },
    -  { 160018, false },
    -  { 160039, true },
    -  { 160049, true },
    -  { 160061, true },
    -  { 160087, true },
    -  { 160100, true },
    -  { 160114, true },
    +  { 159941, true },
    +  { 159960, true },
    +  { 159972, true },
    +  { 159984, true },
    +  { 160008, true },
    +  { 160018, true },
    +  { 160031, true },
    +  { 160050, true },
    +  { 160065, true },
    +  { 160082, true },
    +  { 160098, true },
    +  { 160116, true },
       { 160133, true },
    -  { 160150, true },
    -  { 160168, true },
    -  { 160189, true },
    -  { 160203, true },
    -  { 160225, true },
    -  { 160244, true },
    -  { 160256, true },
    -  { 160268, true },
    -  { 160292, true },
    -  { 160302, false },
    -  { 160313, true },
    -  { 160326, true },
    +  { 160148, true },
    +  { 160164, true },
    +  { 160191, true },
    +  { 160205, true },
    +  { 160221, true },
    +  { 160236, true },
    +  { 160249, true },
    +  { 160258, true },
    +  { 160274, true },
    +  { 160289, true },
    +  { 160300, true },
    +  { 160316, true },
    +  { 160328, true },
       { 160345, true },
    -  { 160360, true },
    -  { 160377, true },
    -  { 160393, true },
    -  { 160411, true },
    -  { 160428, true },
    -  { 160443, true },
    -  { 160459, true },
    -  { 160486, true },
    -  { 160500, true },
    +  { 160356, true },
    +  { 160367, true },
    +  { 160390, true },
    +  { 160400, true },
    +  { 160414, true },
    +  { 160423, true },
    +  { 160430, true },
    +  { 160444, false },
    +  { 160464, true },
    +  { 160475, true },
    +  { 160489, true },
    +  { 160502, true },
       { 160516, true },
    -  { 160531, true },
    -  { 160544, true },
    +  { 160524, true },
    +  { 160535, true },
       { 160553, true },
    -  { 160569, true },
    +  { 160563, true },
    +  { 160573, true },
       { 160584, true },
    -  { 160595, true },
    -  { 160611, true },
    +  { 160609, true },
       { 160623, true },
    -  { 160640, true },
    -  { 160651, true },
    -  { 160662, true },
    -  { 160685, true },
    -  { 160695, true },
    -  { 160709, true },
    -  { 160718, true },
    -  { 160725, true },
    -  { 160739, false },
    -  { 160759, true },
    -  { 160770, true },
    -  { 160784, true },
    -  { 160797, true },
    -  { 160811, true },
    -  { 160819, true },
    -  { 160830, true },
    -  { 160848, true },
    -  { 160858, true },
    -  { 160868, true },
    -  { 160879, true },
    -  { 160904, true },
    -  { 160918, true },
    -  { 160929, true },
    -  { 160940, true },
    -  { 160955, true },
    -  { 160971, false },
    -  { 160982, true },
    +  { 160634, true },
    +  { 160645, true },
    +  { 160660, true },
    +  { 160676, false },
    +  { 160687, true },
    +  { 160702, true },
    +  { 160721, true },
    +  { 160732, true },
    +  { 160742, true },
    +  { 160762, true },
    +  { 160776, true },
    +  { 160790, true },
    +  { 160801, true },
    +  { 160808, true },
    +  { 160821, false },
    +  { 160831, true },
    +  { 160840, true },
    +  { 160850, true },
    +  { 160862, true },
    +  { 160870, true },
    +  { 160880, true },
    +  { 160897, true },
    +  { 160914, true },
    +  { 160933, true },
    +  { 160944, true },
    +  { 160963, true },
    +  { 160980, true },
       { 160997, true },
    -  { 161016, true },
    -  { 161027, true },
    -  { 161037, true },
    -  { 161057, true },
    -  { 161071, true },
    -  { 161085, true },
    -  { 161096, true },
    -  { 161103, true },
    -  { 161116, false },
    -  { 161126, true },
    -  { 161135, true },
    -  { 161145, true },
    +  { 161010, true },
    +  { 161021, true },
    +  { 161032, true },
    +  { 161049, true },
    +  { 161058, false },
    +  { 161066, false },
    +  { 161079, true },
    +  { 161090, true },
    +  { 161097, true },
    +  { 161111, true },
    +  { 161125, true },
    +  { 161145, false },
       { 161157, true },
    -  { 161165, true },
    -  { 161175, true },
    -  { 161192, true },
    -  { 161209, true },
    +  { 161173, true },
    +  { 161185, true },
    +  { 161204, true },
       { 161228, true },
    -  { 161239, true },
    -  { 161258, true },
    -  { 161275, true },
    -  { 161292, true },
    -  { 161305, true },
    -  { 161321, true },
    -  { 161332, true },
    -  { 161343, true },
    -  { 161360, true },
    -  { 161369, false },
    -  { 161377, false },
    -  { 161390, true },
    -  { 161401, true },
    -  { 161408, true },
    -  { 161422, true },
    -  { 161436, true },
    -  { 161456, false },
    -  { 161468, true },
    -  { 161484, true },
    -  { 161496, true },
    -  { 161515, true },
    -  { 161539, true },
    -  { 161556, true },
    -  { 161572, true },
    -  { 161588, true },
    -  { 161597, true },
    +  { 161245, true },
    +  { 161261, true },
    +  { 161277, true },
    +  { 161286, true },
    +  { 161298, true },
    +  { 161311, true },
    +  { 161325, true },
    +  { 161341, false },
    +  { 161356, true },
    +  { 161365, true },
    +  { 161385, true },
    +  { 161393, true },
    +  { 161407, true },
    +  { 161418, true },
    +  { 161428, false },
    +  { 161438, true },
    +  { 161452, true },
    +  { 161464, true },
    +  { 161474, false },
    +  { 161487, true },
    +  { 161503, true },
    +  { 161525, true },
    +  { 161542, true },
    +  { 161551, true },
    +  { 161560, true },
    +  { 161575, true },
    +  { 161589, true },
    +  { 161599, true },
       { 161609, true },
    -  { 161622, true },
    -  { 161636, true },
    -  { 161652, false },
    -  { 161667, true },
    -  { 161676, true },
    -  { 161696, true },
    -  { 161704, true },
    -  { 161718, true },
    -  { 161729, true },
    -  { 161739, false },
    -  { 161749, true },
    -  { 161763, true },
    -  { 161775, true },
    -  { 161785, false },
    -  { 161798, true },
    -  { 161814, true },
    -  { 161836, true },
    -  { 161853, true },
    -  { 161862, true },
    -  { 161871, true },
    -  { 161886, true },
    -  { 161900, true },
    -  { 161910, true },
    +  { 161627, true },
    +  { 161648, true },
    +  { 161663, true },
    +  { 161677, true },
    +  { 161697, true },
    +  { 161713, true },
    +  { 161725, false },
    +  { 161741, true },
    +  { 161756, true },
    +  { 161773, true },
    +  { 161786, false },
    +  { 161805, false },
    +  { 161817, true },
    +  { 161833, true },
    +  { 161861, true },
    +  { 161893, true },
    +  { 161908, true },
       { 161920, true },
    -  { 161938, true },
    -  { 161959, true },
    -  { 161974, true },
    -  { 161988, true },
    -  { 162008, true },
    -  { 162024, true },
    -  { 162036, false },
    -  { 162052, true },
    -  { 162067, true },
    -  { 162082, true },
    -  { 162099, true },
    -  { 162112, false },
    -  { 162131, false },
    -  { 162143, true },
    -  { 162159, true },
    -  { 162187, true },
    -  { 162219, true },
    +  { 161934, false },
    +  { 161947, true },
    +  { 161965, true },
    +  { 161973, true },
    +  { 161987, true },
    +  { 162001, true },
    +  { 162013, true },
    +  { 162034, true },
    +  { 162049, true },
    +  { 162064, true },
    +  { 162080, false },
    +  { 162088, false },
    +  { 162100, true },
    +  { 162109, true },
    +  { 162119, true },
    +  { 162130, true },
    +  { 162142, true },
    +  { 162155, true },
    +  { 162166, true },
    +  { 162175, true },
    +  { 162191, true },
    +  { 162201, true },
    +  { 162212, true },
    +  { 162224, true },
       { 162234, true },
    -  { 162246, true },
    -  { 162260, false },
    -  { 162273, true },
    -  { 162291, true },
    -  { 162299, true },
    -  { 162313, true },
    -  { 162327, true },
    -  { 162339, true },
    -  { 162360, true },
    -  { 162375, true },
    -  { 162390, true },
    -  { 162406, false },
    -  { 162414, false },
    -  { 162426, true },
    -  { 162435, true },
    -  { 162445, true },
    -  { 162456, true },
    -  { 162468, true },
    -  { 162481, true },
    -  { 162492, true },
    -  { 162501, true },
    -  { 162517, true },
    -  { 162527, true },
    -  { 162538, true },
    -  { 162550, true },
    -  { 162560, true },
    -  { 162569, true },
    -  { 162588, true },
    -  { 162616, true },
    +  { 162243, true },
    +  { 162262, true },
    +  { 162290, true },
    +  { 162306, true },
    +  { 162321, true },
    +  { 162334, true },
    +  { 162350, false },
    +  { 162363, true },
    +  { 162377, true },
    +  { 162389, true },
    +  { 162404, true },
    +  { 162424, true },
    +  { 162443, true },
    +  { 162462, true },
    +  { 162475, true },
    +  { 162491, true },
    +  { 162504, true },
    +  { 162519, true },
    +  { 162535, true },
    +  { 162552, true },
    +  { 162568, true },
    +  { 162585, true },
    +  { 162598, true },
    +  { 162613, true },
       { 162632, true },
    -  { 162647, true },
    -  { 162660, true },
    -  { 162676, false },
    -  { 162689, true },
    -  { 162703, true },
    -  { 162715, true },
    -  { 162730, true },
    -  { 162750, true },
    -  { 162769, true },
    -  { 162788, true },
    -  { 162801, true },
    -  { 162817, true },
    +  { 162645, true },
    +  { 162661, true },
    +  { 162673, true },
    +  { 162684, true },
    +  { 162697, true },
    +  { 162711, true },
    +  { 162725, true },
    +  { 162739, false },
    +  { 162755, true },
    +  { 162774, true },
    +  { 162794, true },
    +  { 162814, false },
       { 162830, true },
    -  { 162845, true },
    -  { 162861, true },
    -  { 162878, true },
    -  { 162894, true },
    -  { 162911, true },
    -  { 162924, true },
    -  { 162939, true },
    -  { 162958, true },
    -  { 162971, true },
    -  { 162987, true },
    -  { 162999, true },
    -  { 163010, true },
    -  { 163023, true },
    -  { 163037, true },
    +  { 162846, true },
    +  { 162862, true },
    +  { 162877, true },
    +  { 162892, true },
    +  { 162913, false },
    +  { 162932, true },
    +  { 162943, true },
    +  { 162959, true },
    +  { 162973, true },
    +  { 162989, true },
    +  { 163002, true },
    +  { 163015, true },
    +  { 163031, true },
    +  { 163042, true },
       { 163051, true },
    -  { 163065, false },
    -  { 163081, true },
    -  { 163100, true },
    -  { 163120, true },
    -  { 163140, false },
    -  { 163156, true },
    -  { 163172, true },
    -  { 163188, true },
    -  { 163203, true },
    -  { 163218, true },
    -  { 163239, false },
    -  { 163258, true },
    -  { 163269, true },
    -  { 163285, true },
    -  { 163299, true },
    -  { 163315, true },
    -  { 163328, true },
    -  { 163341, true },
    -  { 163357, true },
    -  { 163368, true },
    -  { 163377, true },
    -  { 163387, true },
    -  { 163398, true },
    -  { 163412, true },
    -  { 163421, true },
    -  { 163434, true },
    -  { 163453, true },
    -  { 163470, false },
    -  { 163485, true },
    -  { 163501, false },
    -  { 163513, true },
    -  { 163533, true },
    -  { 163546, true },
    -  { 163566, true },
    -  { 163587, true },
    -  { 163609, true },
    -  { 163632, true },
    -  { 163650, true },
    -  { 163666, true },
    -  { 163679, true },
    -  { 163693, true },
    -  { 163707, true },
    -  { 163715, true },
    -  { 163733, true },
    +  { 163061, true },
    +  { 163072, true },
    +  { 163086, true },
    +  { 163095, true },
    +  { 163108, true },
    +  { 163127, true },
    +  { 163144, false },
    +  { 163159, true },
    +  { 163175, false },
    +  { 163187, true },
    +  { 163207, true },
    +  { 163220, true },
    +  { 163240, true },
    +  { 163261, true },
    +  { 163283, true },
    +  { 163306, true },
    +  { 163324, true },
    +  { 163340, true },
    +  { 163353, true },
    +  { 163367, true },
    +  { 163381, true },
    +  { 163389, true },
    +  { 163407, true },
    +  { 163417, true },
    +  { 163437, true },
    +  { 163454, true },
    +  { 163465, true },
    +  { 163478, true },
    +  { 163490, true },
    +  { 163506, true },
    +  { 163519, true },
    +  { 163536, true },
    +  { 163557, true },
    +  { 163565, true },
    +  { 163575, true },
    +  { 163598, true },
    +  { 163607, true },
    +  { 163617, true },
    +  { 163629, true },
    +  { 163642, true },
    +  { 163652, true },
    +  { 163665, true },
    +  { 163686, true },
    +  { 163696, true },
    +  { 163710, true },
    +  { 163730, true },
       { 163743, true },
    -  { 163763, true },
    -  { 163780, true },
    -  { 163791, true },
    -  { 163804, true },
    -  { 163816, true },
    -  { 163832, true },
    -  { 163845, true },
    -  { 163862, true },
    -  { 163883, true },
    -  { 163891, true },
    -  { 163901, true },
    -  { 163924, true },
    -  { 163933, true },
    -  { 163943, true },
    -  { 163955, true },
    -  { 163968, true },
    -  { 163981, true },
    -  { 164002, true },
    +  { 163763, false },
    +  { 163786, true },
    +  { 163799, true },
    +  { 163810, true },
    +  { 163821, true },
    +  { 163831, true },
    +  { 163856, true },
    +  { 163866, true },
    +  { 163880, true },
    +  { 163894, false },
    +  { 163909, true },
    +  { 163923, true },
    +  { 163948, true },
    +  { 163962, true },
    +  { 163974, true },
    +  { 163988, true },
    +  { 163998, true },
       { 164012, true },
    -  { 164026, true },
    +  { 164031, true },
       { 164046, true },
       { 164059, true },
    -  { 164079, false },
    -  { 164102, true },
    -  { 164115, true },
    -  { 164126, true },
    -  { 164137, true },
    -  { 164147, true },
    -  { 164172, true },
    -  { 164182, true },
    -  { 164196, true },
    -  { 164210, false },
    -  { 164225, true },
    -  { 164239, true },
    -  { 164264, true },
    -  { 164278, true },
    -  { 164290, true },
    -  { 164304, true },
    -  { 164314, true },
    -  { 164328, true },
    -  { 164347, true },
    -  { 164362, true },
    -  { 164375, true },
    -  { 164390, true },
    -  { 164400, true },
    -  { 164414, true },
    -  { 164423, true },
    -  { 164438, true },
    -  { 164449, true },
    -  { 164460, true },
    -  { 164471, true },
    -  { 164481, true },
    -  { 164490, false },
    -  { 164510, true },
    -  { 164525, true },
    -  { 164537, true },
    -  { 164556, true },
    -  { 164576, true },
    -  { 164593, true },
    -  { 164603, true },
    -  { 164617, true },
    -  { 164634, true },
    -  { 164649, true },
    +  { 164074, true },
    +  { 164084, true },
    +  { 164098, true },
    +  { 164107, true },
    +  { 164122, true },
    +  { 164133, true },
    +  { 164144, true },
    +  { 164155, true },
    +  { 164165, true },
    +  { 164174, false },
    +  { 164194, true },
    +  { 164209, true },
    +  { 164221, true },
    +  { 164240, true },
    +  { 164260, true },
    +  { 164277, true },
    +  { 164287, true },
    +  { 164301, true },
    +  { 164318, true },
    +  { 164333, true },
    +  { 164341, true },
    +  { 164359, true },
    +  { 164380, false },
    +  { 164398, true },
    +  { 164410, true },
    +  { 164426, true },
    +  { 164441, true },
    +  { 164457, true },
    +  { 164468, true },
    +  { 164493, true },
    +  { 164515, true },
    +  { 164529, true },
    +  { 164550, true },
    +  { 164564, true },
    +  { 164581, true },
    +  { 164600, true },
    +  { 164619, true },
    +  { 164644, true },
       { 164657, true },
    -  { 164675, true },
    -  { 164696, false },
    -  { 164714, true },
    -  { 164726, true },
    -  { 164742, true },
    -  { 164757, true },
    -  { 164773, true },
    -  { 164784, true },
    -  { 164809, true },
    -  { 164831, true },
    -  { 164845, true },
    +  { 164673, true },
    +  { 164699, true },
    +  { 164720, true },
    +  { 164738, true },
    +  { 164762, true },
    +  { 164778, true },
    +  { 164803, true },
    +  { 164829, true },
    +  { 164840, true },
       { 164866, true },
    -  { 164880, true },
    -  { 164897, true },
    -  { 164916, true },
    -  { 164935, true },
    -  { 164960, true },
    -  { 164973, true },
    -  { 164989, true },
    -  { 165015, true },
    -  { 165036, true },
    -  { 165054, true },
    -  { 165078, true },
    -  { 165094, true },
    -  { 165119, true },
    -  { 165145, true },
    -  { 165156, true },
    -  { 165182, true },
    -  { 165204, true },
    -  { 165225, true },
    -  { 165242, true },
    -  { 165260, true },
    -  { 165270, false },
    -  { 165288, true },
    -  { 165303, false },
    -  { 165322, true },
    -  { 165344, true },
    -  { 165367, true },
    -  { 165386, true },
    -  { 165404, true },
    -  { 165427, true },
    -  { 165440, true },
    -  { 165456, true },
    -  { 165474, true },
    -  { 165490, true },
    -  { 165504, true },
    -  { 165522, true },
    -  { 165537, true },
    -  { 165554, true },
    +  { 164888, true },
    +  { 164909, true },
    +  { 164926, true },
    +  { 164944, true },
    +  { 164954, false },
    +  { 164972, true },
    +  { 164987, false },
    +  { 165006, true },
    +  { 165028, true },
    +  { 165051, true },
    +  { 165070, true },
    +  { 165088, true },
    +  { 165111, true },
    +  { 165124, true },
    +  { 165140, true },
    +  { 165158, true },
    +  { 165174, true },
    +  { 165188, true },
    +  { 165206, true },
    +  { 165221, true },
    +  { 165238, true },
    +  { 165252, true },
    +  { 165266, false },
    +  { 165283, true },
    +  { 165301, true },
    +  { 165317, true },
    +  { 165333, true },
    +  { 165346, true },
    +  { 165366, true },
    +  { 165384, true },
    +  { 165403, true },
    +  { 165416, true },
    +  { 165439, true },
    +  { 165454, true },
    +  { 165470, true },
    +  { 165481, true },
    +  { 165511, true },
    +  { 165527, true },
    +  { 165542, true },
    +  { 165557, true },
       { 165568, true },
    -  { 165582, false },
    -  { 165599, true },
    -  { 165617, true },
    -  { 165633, true },
    -  { 165649, true },
    -  { 165662, true },
    -  { 165682, true },
    -  { 165700, true },
    -  { 165719, true },
    -  { 165732, true },
    -  { 165755, true },
    -  { 165770, true },
    -  { 165786, true },
    -  { 165797, true },
    -  { 165827, true },
    -  { 165843, true },
    -  { 165858, true },
    -  { 165873, true },
    -  { 165884, true },
    -  { 165898, true },
    -  { 165920, true },
    -  { 165935, true },
    -  { 165958, true },
    -  { 165967, true },
    -  { 165989, true },
    -  { 166008, true },
    -  { 166026, true },
    -  { 166050, true },
    -  { 166061, true },
    -  { 166078, true },
    -  { 166092, true },
    -  { 166105, true },
    -  { 166121, true },
    -  { 166140, true },
    -  { 166157, true },
    -  { 166168, true },
    -  { 166183, true },
    -  { 166202, true },
    -  { 166222, true },
    -  { 166239, false },
    -  { 166254, true },
    +  { 165582, true },
    +  { 165604, true },
    +  { 165619, true },
    +  { 165642, true },
    +  { 165651, true },
    +  { 165673, true },
    +  { 165692, true },
    +  { 165710, true },
    +  { 165734, true },
    +  { 165745, true },
    +  { 165762, true },
    +  { 165776, true },
    +  { 165789, true },
    +  { 165805, true },
    +  { 165824, true },
    +  { 165841, true },
    +  { 165852, true },
    +  { 165867, true },
    +  { 165886, true },
    +  { 165906, true },
    +  { 165923, false },
    +  { 165938, true },
    +  { 165956, true },
    +  { 165978, true },
    +  { 165994, true },
    +  { 166006, true },
    +  { 166018, true },
    +  { 166030, true },
    +  { 166046, true },
    +  { 166065, true },
    +  { 166081, true },
    +  { 166100, false },
    +  { 166114, true },
    +  { 166131, true },
    +  { 166152, true },
    +  { 166172, true },
    +  { 166186, true },
    +  { 166204, true },
    +  { 166220, true },
    +  { 166230, true },
    +  { 166241, true },
    +  { 166253, true },
       { 166272, true },
    -  { 166294, true },
    -  { 166310, true },
    -  { 166322, true },
    -  { 166334, true },
    -  { 166346, true },
    -  { 166362, true },
    -  { 166381, true },
    -  { 166397, true },
    -  { 166416, false },
    -  { 166430, true },
    -  { 166447, true },
    -  { 166468, true },
    -  { 166488, true },
    -  { 166502, true },
    +  { 166286, true },
    +  { 166299, true },
    +  { 166315, true },
    +  { 166326, true },
    +  { 166347, true },
    +  { 166375, true },
    +  { 166391, true },
    +  { 166404, true },
    +  { 166427, true },
    +  { 166445, true },
    +  { 166460, true },
    +  { 166485, false },
    +  { 166501, true },
    +  { 166510, true },
       { 166520, true },
    -  { 166536, true },
    -  { 166546, true },
    -  { 166557, true },
    -  { 166576, true },
    -  { 166590, true },
    -  { 166603, true },
    -  { 166614, true },
    -  { 166635, true },
    -  { 166663, true },
    -  { 166679, true },
    -  { 166692, true },
    -  { 166715, true },
    -  { 166733, true },
    -  { 166748, true },
    -  { 166773, false },
    -  { 166789, true },
    -  { 166798, true },
    -  { 166808, true },
    -  { 166820, true },
    -  { 166839, true },
    -  { 166856, true },
    -  { 166873, true },
    -  { 166889, false },
    -  { 166907, false },
    -  { 166927, true },
    -  { 166944, true },
    -  { 166957, true },
    -  { 166981, true },
    -  { 166999, true },
    -  { 167020, true },
    -  { 167035, true },
    -  { 167050, true },
    -  { 167062, true },
    -  { 167087, true },
    +  { 166532, true },
    +  { 166551, true },
    +  { 166568, true },
    +  { 166585, true },
    +  { 166601, false },
    +  { 166619, false },
    +  { 166639, true },
    +  { 166656, true },
    +  { 166669, true },
    +  { 166693, true },
    +  { 166711, true },
    +  { 166732, true },
    +  { 166747, true },
    +  { 166762, true },
    +  { 166774, true },
    +  { 166799, true },
    +  { 166812, true },
    +  { 166834, true },
    +  { 166844, true },
    +  { 166861, true },
    +  { 166874, true },
    +  { 166888, true },
    +  { 166909, true },
    +  { 166924, true },
    +  { 166938, true },
    +  { 166947, true },
    +  { 166956, true },
    +  { 166966, true },
    +  { 166977, false },
    +  { 166991, true },
    +  { 167000, true },
    +  { 167011, true },
    +  { 167022, true },
    +  { 167040, true },
    +  { 167053, true },
    +  { 167068, true },
    +  { 167081, true },
       { 167100, true },
    -  { 167122, true },
    -  { 167132, true },
    -  { 167149, true },
    -  { 167162, true },
    -  { 167176, true },
    -  { 167197, true },
    -  { 167230, true },
    -  { 167245, true },
    -  { 167259, true },
    -  { 167268, true },
    -  { 167277, true },
    -  { 167287, true },
    -  { 167298, false },
    -  { 167312, true },
    -  { 167321, true },
    -  { 167332, true },
    -  { 167343, true },
    -  { 167361, true },
    -  { 167374, true },
    -  { 167389, true },
    -  { 167402, true },
    -  { 167421, true },
    -  { 167441, true },
    -  { 167458, true },
    -  { 167465, true },
    -  { 167476, true },
    -  { 167492, true },
    -  { 167510, true },
    -  { 167531, true },
    -  { 167543, true },
    -  { 167573, true },
    -  { 167586, true },
    -  { 167596, true },
    -  { 167608, true },
    -  { 167622, true },
    -  { 167636, true },
    -  { 167661, true },
    +  { 167120, true },
    +  { 167137, true },
    +  { 167144, true },
    +  { 167155, true },
    +  { 167171, true },
    +  { 167189, true },
    +  { 167210, true },
    +  { 167240, true },
    +  { 167253, true },
    +  { 167263, true },
    +  { 167275, true },
    +  { 167289, true },
    +  { 167303, true },
    +  { 167328, true },
    +  { 167341, true },
    +  { 167352, true },
    +  { 167366, true },
    +  { 167380, true },
    +  { 167399, true },
    +  { 167418, true },
    +  { 167433, true },
    +  { 167445, true },
    +  { 167456, true },
    +  { 167471, true },
    +  { 167483, true },
    +  { 167499, true },
    +  { 167515, true },
    +  { 167524, true },
    +  { 167538, true },
    +  { 167549, false },
    +  { 167564, true },
    +  { 167578, true },
    +  { 167594, true },
    +  { 167607, true },
    +  { 167627, true },
    +  { 167640, false },
    +  { 167660, true },
       { 167674, true },
       { 167685, true },
    -  { 167699, true },
    -  { 167713, true },
    -  { 167732, true },
    -  { 167751, true },
    +  { 167702, true },
    +  { 167716, true },
    +  { 167728, true },
    +  { 167742, true },
    +  { 167754, true },
       { 167766, true },
       { 167778, true },
    -  { 167789, true },
    -  { 167804, true },
    -  { 167816, true },
    -  { 167832, true },
    -  { 167848, true },
    -  { 167857, true },
    -  { 167871, true },
    -  { 167882, false },
    -  { 167897, true },
    -  { 167911, true },
    -  { 167927, true },
    -  { 167940, true },
    -  { 167960, true },
    -  { 167973, false },
    -  { 167993, true },
    -  { 168007, true },
    -  { 168018, true },
    -  { 168035, true },
    -  { 168049, true },
    -  { 168061, true },
    -  { 168075, true },
    -  { 168087, true },
    -  { 168099, true },
    -  { 168111, true },
    -  { 168121, true },
    -  { 168134, true },
    -  { 168151, true },
    -  { 168178, true },
    -  { 168191, true },
    -  { 168199, true },
    -  { 168211, true },
    -  { 168225, true },
    -  { 168238, true },
    -  { 168265, false },
    -  { 168276, true },
    -  { 168294, true },
    -  { 168302, true },
    -  { 168311, true },
    -  { 168320, true },
    -  { 168328, true },
    -  { 168341, true },
    -  { 168350, true },
    -  { 168362, true },
    -  { 168374, true },
    -  { 168381, true },
    -  { 168397, true },
    -  { 168414, true },
    -  { 168427, true },
    -  { 168434, true },
    -  { 168448, true },
    -  { 168465, true },
    -  { 168477, true },
    -  { 168485, true },
    -  { 168492, true },
    -  { 168501, true },
    -  { 168521, true },
    -  { 168537, true },
    -  { 168553, true },
    -  { 168572, true },
    -  { 168590, true },
    +  { 167788, true },
    +  { 167801, true },
    +  { 167818, true },
    +  { 167845, true },
    +  { 167858, true },
    +  { 167866, true },
    +  { 167878, true },
    +  { 167892, true },
    +  { 167905, true },
    +  { 167932, false },
    +  { 167943, true },
    +  { 167961, true },
    +  { 167969, true },
    +  { 167978, true },
    +  { 167987, true },
    +  { 167995, true },
    +  { 168008, true },
    +  { 168017, true },
    +  { 168029, true },
    +  { 168041, true },
    +  { 168048, true },
    +  { 168064, true },
    +  { 168081, true },
    +  { 168094, true },
    +  { 168101, true },
    +  { 168115, true },
    +  { 168132, true },
    +  { 168144, true },
    +  { 168152, true },
    +  { 168159, true },
    +  { 168168, true },
    +  { 168188, true },
    +  { 168204, true },
    +  { 168220, true },
    +  { 168239, true },
    +  { 168257, true },
    +  { 168272, true },
    +  { 168290, true },
    +  { 168300, true },
    +  { 168312, true },
    +  { 168331, true },
    +  { 168346, true },
    +  { 168361, true },
    +  { 168373, true },
    +  { 168381, false },
    +  { 168406, true },
    +  { 168416, true },
    +  { 168431, true },
    +  { 168443, true },
    +  { 168457, true },
    +  { 168466, false },
    +  { 168478, true },
    +  { 168491, true },
    +  { 168524, true },
    +  { 168547, true },
    +  { 168560, true },
    +  { 168571, true },
    +  { 168585, true },
       { 168605, true },
    -  { 168623, true },
    -  { 168633, true },
    -  { 168645, true },
    -  { 168664, true },
    -  { 168679, true },
    -  { 168694, true },
    -  { 168706, true },
    -  { 168714, false },
    -  { 168739, true },
    -  { 168749, true },
    -  { 168764, true },
    -  { 168776, true },
    -  { 168790, true },
    -  { 168799, false },
    -  { 168811, true },
    -  { 168824, true },
    -  { 168857, true },
    -  { 168880, true },
    -  { 168893, true },
    -  { 168904, true },
    -  { 168918, true },
    -  { 168938, true },
    -  { 168951, true },
    -  { 168961, true },
    -  { 168979, true },
    -  { 168993, true },
    -  { 169005, true },
    -  { 169020, true },
    -  { 169042, true },
    -  { 169052, true },
    -  { 169064, true },
    +  { 168618, true },
    +  { 168628, true },
    +  { 168646, true },
    +  { 168660, true },
    +  { 168672, true },
    +  { 168687, true },
    +  { 168709, true },
    +  { 168719, true },
    +  { 168731, true },
    +  { 168747, true },
    +  { 168759, true },
    +  { 168769, true },
    +  { 168782, true },
    +  { 168798, true },
    +  { 168807, false },
    +  { 168815, true },
    +  { 168826, false },
    +  { 168842, true },
    +  { 168853, true },
    +  { 168866, true },
    +  { 168878, false },
    +  { 168892, true },
    +  { 168905, true },
    +  { 168916, true },
    +  { 168926, true },
    +  { 168940, true },
    +  { 168959, true },
    +  { 168970, true },
    +  { 168984, true },
    +  { 168995, true },
    +  { 169006, true },
    +  { 169017, true },
    +  { 169028, true },
    +  { 169039, true },
    +  { 169053, true },
    +  { 169065, true },
       { 169080, true },
    -  { 169092, true },
    -  { 169105, true },
    -  { 169121, true },
    -  { 169130, true },
    -  { 169143, false },
    -  { 169151, true },
    -  { 169162, false },
    -  { 169178, true },
    -  { 169189, true },
    -  { 169202, true },
    -  { 169214, false },
    -  { 169228, true },
    -  { 169241, true },
    -  { 169252, true },
    -  { 169262, true },
    -  { 169276, true },
    -  { 169295, true },
    +  { 169094, true },
    +  { 169109, true },
    +  { 169122, true },
    +  { 169138, true },
    +  { 169147, true },
    +  { 169156, true },
    +  { 169170, true },
    +  { 169181, true },
    +  { 169192, false },
    +  { 169208, true },
    +  { 169219, true },
    +  { 169230, true },
    +  { 169246, false },
    +  { 169260, true },
    +  { 169269, true },
    +  { 169282, true },
    +  { 169292, true },
       { 169306, true },
    -  { 169320, true },
    -  { 169331, true },
    -  { 169342, true },
    -  { 169353, true },
    -  { 169364, true },
    -  { 169375, true },
    -  { 169389, true },
    -  { 169401, true },
    -  { 169416, true },
    -  { 169430, true },
    -  { 169445, true },
    -  { 169458, true },
    -  { 169474, true },
    -  { 169483, true },
    -  { 169492, true },
    -  { 169506, true },
    -  { 169517, true },
    -  { 169528, false },
    -  { 169544, true },
    -  { 169555, true },
    -  { 169566, true },
    -  { 169582, false },
    -  { 169596, true },
    -  { 169605, true },
    -  { 169618, true },
    -  { 169628, true },
    -  { 169642, true },
    -  { 169652, true },
    -  { 169665, true },
    -  { 169679, true },
    -  { 169693, true },
    -  { 169714, true },
    -  { 169728, true },
    +  { 169316, true },
    +  { 169329, true },
    +  { 169343, true },
    +  { 169357, true },
    +  { 169378, true },
    +  { 169392, true },
    +  { 169407, true },
    +  { 169426, true },
    +  { 169438, true },
    +  { 169457, true },
    +  { 169466, false },
    +  { 169481, false },
    +  { 169493, true },
    +  { 169519, true },
    +  { 169540, true },
    +  { 169558, true },
    +  { 169575, true },
    +  { 169590, true },
    +  { 169610, true },
    +  { 169621, true },
    +  { 169633, true },
    +  { 169646, true },
    +  { 169664, true },
    +  { 169684, true },
    +  { 169703, true },
    +  { 169722, true },
       { 169743, true },
    -  { 169762, true },
    -  { 169774, true },
    -  { 169793, true },
    -  { 169802, false },
    -  { 169817, false },
    -  { 169829, true },
    -  { 169855, true },
    -  { 169866, true },
    -  { 169887, true },
    -  { 169905, true },
    +  { 169752, true },
    +  { 169776, false },
    +  { 169795, true },
    +  { 169809, true },
    +  { 169827, true },
    +  { 169844, true },
    +  { 169864, true },
    +  { 169878, true },
    +  { 169888, true },
    +  { 169901, true },
       { 169922, true },
    -  { 169937, true },
    -  { 169957, true },
    -  { 169968, true },
    -  { 169980, true },
    -  { 169993, true },
    -  { 170011, true },
    -  { 170031, true },
    -  { 170050, true },
    -  { 170069, true },
    -  { 170090, true },
    -  { 170099, true },
    -  { 170123, false },
    -  { 170142, true },
    -  { 170156, true },
    -  { 170174, true },
    -  { 170191, true },
    -  { 170211, true },
    -  { 170225, true },
    -  { 170235, true },
    -  { 170248, true },
    -  { 170269, true },
    -  { 170281, true },
    -  { 170292, true },
    -  { 170307, true },
    -  { 170328, true },
    -  { 170347, true },
    -  { 170376, true },
    -  { 170383, true },
    -  { 170395, true },
    +  { 169934, true },
    +  { 169945, true },
    +  { 169960, true },
    +  { 169981, true },
    +  { 170000, true },
    +  { 170029, true },
    +  { 170036, true },
    +  { 170048, true },
    +  { 170063, true },
    +  { 170079, true },
    +  { 170096, true },
    +  { 170118, true },
    +  { 170128, true },
    +  { 170140, true },
    +  { 170152, true },
    +  { 170169, false },
    +  { 170182, false },
    +  { 170202, true },
    +  { 170212, true },
    +  { 170224, true },
    +  { 170241, true },
    +  { 170257, true },
    +  { 170272, true },
    +  { 170287, true },
    +  { 170300, true },
    +  { 170316, true },
    +  { 170334, true },
    +  { 170346, true },
    +  { 170360, true },
    +  { 170371, true },
    +  { 170391, true },
       { 170410, true },
    -  { 170426, true },
    -  { 170443, true },
    +  { 170429, true },
    +  { 170440, true },
    +  { 170452, true },
       { 170465, true },
    -  { 170475, true },
    -  { 170487, true },
    -  { 170499, true },
    -  { 170516, false },
    -  { 170529, false },
    -  { 170549, true },
    +  { 170478, true },
    +  { 170491, true },
    +  { 170504, true },
    +  { 170517, true },
    +  { 170527, true },
    +  { 170540, true },
       { 170559, true },
    -  { 170571, true },
    -  { 170588, true },
    -  { 170604, true },
    -  { 170619, true },
    -  { 170634, true },
    -  { 170647, true },
    -  { 170663, true },
    -  { 170681, true },
    -  { 170693, true },
    -  { 170707, true },
    -  { 170718, true },
    -  { 170738, true },
    -  { 170757, true },
    -  { 170776, true },
    -  { 170787, true },
    -  { 170799, true },
    -  { 170812, true },
    -  { 170825, true },
    -  { 170838, true },
    -  { 170851, true },
    -  { 170864, true },
    -  { 170874, true },
    -  { 170887, true },
    -  { 170906, true },
    -  { 170919, true },
    -  { 170937, true },
    -  { 170959, true },
    -  { 170972, true },
    -  { 170989, true },
    -  { 171005, true },
    -  { 171033, true },
    -  { 171058, true },
    -  { 171090, true },
    -  { 171109, true },
    -  { 171124, true },
    -  { 171144, true },
    -  { 171157, true },
    -  { 171173, true },
    -  { 171190, true },
    -  { 171207, true },
    -  { 171219, true },
    -  { 171232, true },
    -  { 171245, true },
    +  { 170572, true },
    +  { 170590, true },
    +  { 170612, true },
    +  { 170625, true },
    +  { 170642, true },
    +  { 170658, true },
    +  { 170686, true },
    +  { 170711, true },
    +  { 170743, true },
    +  { 170762, true },
    +  { 170777, true },
    +  { 170797, true },
    +  { 170810, true },
    +  { 170826, true },
    +  { 170843, true },
    +  { 170860, true },
    +  { 170872, true },
    +  { 170885, true },
    +  { 170898, true },
    +  { 170920, true },
    +  { 170938, true },
    +  { 170952, true },
    +  { 170973, true },
    +  { 170985, true },
    +  { 171000, true },
    +  { 171017, true },
    +  { 171029, true },
    +  { 171044, true },
    +  { 171055, true },
    +  { 171069, true },
    +  { 171088, true },
    +  { 171105, true },
    +  { 171117, true },
    +  { 171137, true },
    +  { 171151, true },
    +  { 171164, true },
    +  { 171183, true },
    +  { 171197, true },
    +  { 171211, true },
    +  { 171221, true },
    +  { 171233, true },
    +  { 171251, true },
       { 171267, true },
    -  { 171285, true },
    -  { 171299, true },
    -  { 171320, true },
    -  { 171332, true },
    -  { 171347, true },
    -  { 171364, true },
    +  { 171279, true },
    +  { 171291, true },
    +  { 171302, true },
    +  { 171314, true },
    +  { 171323, true },
    +  { 171337, true },
    +  { 171351, true },
    +  { 171365, true },
       { 171376, true },
    -  { 171391, true },
    -  { 171402, true },
    -  { 171416, true },
    -  { 171435, true },
    -  { 171452, true },
    +  { 171384, true },
    +  { 171400, true },
    +  { 171411, true },
    +  { 171426, true },
    +  { 171444, true },
       { 171464, true },
    -  { 171484, true },
    +  { 171477, true },
       { 171498, true },
    -  { 171511, true },
    -  { 171530, true },
    -  { 171544, true },
    -  { 171558, true },
    -  { 171568, true },
    +  { 171509, false },
    +  { 171527, false },
    +  { 171548, true },
    +  { 171557, true },
       { 171580, true },
    -  { 171598, false },
    -  { 171606, true },
    -  { 171622, true },
    -  { 171634, true },
    -  { 171646, true },
    -  { 171657, true },
    -  { 171669, true },
    -  { 171678, true },
    -  { 171692, true },
    -  { 171706, true },
    -  { 171720, true },
    -  { 171731, true },
    -  { 171739, true },
    -  { 171755, true },
    -  { 171766, true },
    -  { 171781, true },
    -  { 171799, true },
    -  { 171819, true },
    -  { 171832, true },
    -  { 171853, true },
    -  { 171864, false },
    -  { 171882, false },
    -  { 171903, true },
    -  { 171912, true },
    +  { 171603, true },
    +  { 171620, true },
    +  { 171632, true },
    +  { 171653, true },
    +  { 171670, true },
    +  { 171690, true },
    +  { 171703, true },
    +  { 171716, true },
    +  { 171730, true },
    +  { 171752, true },
    +  { 171767, true },
    +  { 171784, true },
    +  { 171801, true },
    +  { 171821, true },
    +  { 171846, true },
    +  { 171871, true },
    +  { 171884, true },
    +  { 171900, true },
    +  { 171911, true },
    +  { 171926, true },
       { 171935, true },
    +  { 171946, true },
       { 171958, true },
    -  { 171975, true },
    -  { 171987, true },
    -  { 172008, true },
    -  { 172025, true },
    +  { 171972, true },
    +  { 171981, true },
    +  { 172003, true },
    +  { 172015, true },
    +  { 172023, true },
    +  { 172037, true },
       { 172045, true },
    -  { 172058, true },
    -  { 172071, true },
    -  { 172085, true },
    -  { 172107, true },
    -  { 172122, true },
    -  { 172139, true },
    -  { 172156, true },
    -  { 172176, true },
    -  { 172201, true },
    -  { 172226, true },
    -  { 172239, true },
    -  { 172255, true },
    -  { 172266, true },
    -  { 172281, true },
    -  { 172290, true },
    -  { 172301, true },
    -  { 172313, true },
    -  { 172327, true },
    +  { 172055, true },
    +  { 172062, true },
    +  { 172072, true },
    +  { 172079, true },
    +  { 172096, true },
    +  { 172108, true },
    +  { 172119, true },
    +  { 172129, true },
    +  { 172142, true },
    +  { 172152, true },
    +  { 172163, true },
    +  { 172174, true },
    +  { 172182, true },
    +  { 172194, true },
    +  { 172205, true },
    +  { 172219, true },
    +  { 172228, true },
    +  { 172241, true },
    +  { 172267, true },
    +  { 172283, true },
    +  { 172299, true },
    +  { 172312, true },
    +  { 172324, true },
       { 172336, true },
    -  { 172358, true },
    -  { 172370, true },
    -  { 172378, true },
    -  { 172392, true },
    -  { 172400, true },
    -  { 172410, true },
    -  { 172417, true },
    -  { 172427, true },
    -  { 172434, true },
    -  { 172451, true },
    -  { 172463, true },
    -  { 172474, true },
    -  { 172484, true },
    -  { 172497, true },
    -  { 172507, true },
    -  { 172518, true },
    -  { 172529, true },
    -  { 172537, true },
    -  { 172549, true },
    -  { 172560, true },
    -  { 172574, true },
    -  { 172583, true },
    -  { 172596, true },
    -  { 172622, true },
    -  { 172638, true },
    -  { 172654, true },
    -  { 172667, true },
    -  { 172679, true },
    -  { 172691, true },
    -  { 172712, true },
    -  { 172722, true },
    -  { 172744, true },
    -  { 172762, true },
    -  { 172775, true },
    -  { 172786, false },
    +  { 172357, true },
    +  { 172367, true },
    +  { 172389, true },
    +  { 172407, true },
    +  { 172420, true },
    +  { 172431, false },
    +  { 172442, true },
    +  { 172452, true },
    +  { 172464, true },
    +  { 172473, true },
    +  { 172487, true },
    +  { 172498, true },
    +  { 172511, false },
    +  { 172531, true },
    +  { 172541, true },
    +  { 172549, false },
    +  { 172558, true },
    +  { 172571, true },
    +  { 172617, true },
    +  { 172630, true },
    +  { 172643, true },
    +  { 172666, true },
    +  { 172682, true },
    +  { 172695, true },
    +  { 172711, true },
    +  { 172721, false },
    +  { 172733, true },
    +  { 172750, true },
    +  { 172768, true },
    +  { 172779, true },
    +  { 172787, true },
       { 172797, true },
    -  { 172807, true },
    -  { 172819, true },
    -  { 172828, true },
    -  { 172842, true },
    -  { 172853, true },
    -  { 172866, false },
    -  { 172886, true },
    -  { 172896, true },
    -  { 172904, false },
    -  { 172913, true },
    -  { 172926, true },
    -  { 172972, true },
    -  { 172985, true },
    -  { 172998, true },
    -  { 173021, true },
    -  { 173037, true },
    -  { 173050, true },
    -  { 173066, true },
    -  { 173076, false },
    -  { 173088, true },
    -  { 173105, true },
    -  { 173123, true },
    -  { 173134, true },
    -  { 173142, true },
    -  { 173152, true },
    -  { 173159, true },
    -  { 173168, true },
    -  { 173175, true },
    -  { 173184, true },
    -  { 173200, true },
    -  { 173219, true },
    -  { 173232, true },
    -  { 173246, true },
    -  { 173258, true },
    -  { 173272, true },
    -  { 173287, true },
    -  { 173299, true },
    -  { 173312, true },
    -  { 173323, true },
    -  { 173344, true },
    -  { 173354, true },
    -  { 173363, true },
    -  { 173370, true },
    -  { 173378, true },
    -  { 173402, true },
    -  { 173416, true },
    -  { 173426, true },
    -  { 173443, false },
    -  { 173458, true },
    -  { 173472, true },
    -  { 173484, true },
    -  { 173498, true },
    -  { 173515, true },
    -  { 173526, true },
    -  { 173538, true },
    -  { 173550, true },
    -  { 173560, true },
    +  { 172804, true },
    +  { 172813, true },
    +  { 172820, true },
    +  { 172829, true },
    +  { 172845, true },
    +  { 172864, true },
    +  { 172877, true },
    +  { 172891, true },
    +  { 172903, true },
    +  { 172917, true },
    +  { 172932, true },
    +  { 172944, true },
    +  { 172957, true },
    +  { 172968, true },
    +  { 172989, true },
    +  { 172999, true },
    +  { 173008, true },
    +  { 173015, true },
    +  { 173023, true },
    +  { 173047, true },
    +  { 173061, true },
    +  { 173071, true },
    +  { 173088, false },
    +  { 173103, true },
    +  { 173117, true },
    +  { 173129, true },
    +  { 173143, true },
    +  { 173160, true },
    +  { 173171, true },
    +  { 173183, true },
    +  { 173195, true },
    +  { 173205, true },
    +  { 173215, true },
    +  { 173226, true },
    +  { 173236, true },
    +  { 173255, true },
    +  { 173267, true },
    +  { 173283, true },
    +  { 173298, true },
    +  { 173321, true },
    +  { 173328, true },
    +  { 173341, true },
    +  { 173352, true },
    +  { 173362, true },
    +  { 173369, true },
    +  { 173381, true },
    +  { 173392, true },
    +  { 173402, false },
    +  { 173422, true },
    +  { 173445, true },
    +  { 173469, true },
    +  { 173490, true },
    +  { 173509, true },
    +  { 173519, true },
    +  { 173532, true },
    +  { 173546, true },
    +  { 173559, true },
       { 173570, true },
       { 173581, true },
       { 173591, true },
    -  { 173610, true },
    -  { 173622, true },
    -  { 173638, true },
    -  { 173653, true },
    -  { 173676, true },
    -  { 173683, true },
    -  { 173696, true },
    -  { 173707, true },
    -  { 173717, true },
    -  { 173724, true },
    -  { 173736, true },
    -  { 173747, true },
    -  { 173757, false },
    -  { 173777, true },
    -  { 173800, true },
    -  { 173824, true },
    -  { 173845, true },
    -  { 173864, true },
    -  { 173874, true },
    -  { 173887, true },
    -  { 173901, true },
    -  { 173914, true },
    -  { 173925, true },
    -  { 173936, true },
    +  { 173601, true },
    +  { 173612, true },
    +  { 173627, true },
    +  { 173641, true },
    +  { 173652, true },
    +  { 173666, true },
    +  { 173686, true },
    +  { 173700, true },
    +  { 173715, true },
    +  { 173728, true },
    +  { 173751, true },
    +  { 173766, true },
    +  { 173782, true },
    +  { 173797, true },
    +  { 173811, true },
    +  { 173827, true },
    +  { 173841, true },
    +  { 173855, true },
    +  { 173873, true },
    +  { 173891, true },
    +  { 173911, true },
    +  { 173930, true },
       { 173946, true },
    -  { 173956, true },
    -  { 173967, true },
    -  { 173982, true },
    -  { 173996, true },
    -  { 174007, true },
    -  { 174021, true },
    -  { 174041, true },
    -  { 174055, true },
    -  { 174070, true },
    -  { 174083, true },
    -  { 174106, true },
    -  { 174121, true },
    -  { 174137, true },
    -  { 174152, true },
    -  { 174166, true },
    -  { 174182, true },
    -  { 174196, true },
    -  { 174210, true },
    -  { 174228, true },
    -  { 174246, true },
    -  { 174266, true },
    -  { 174285, true },
    -  { 174301, true },
    -  { 174316, true },
    -  { 174330, true },
    -  { 174350, true },
    -  { 174366, true },
    -  { 174381, true },
    -  { 174395, true },
    -  { 174426, true },
    -  { 174442, true },
    -  { 174453, true },
    -  { 174463, false },
    -  { 174487, true },
    -  { 174501, true },
    -  { 174515, true },
    -  { 174525, true },
    -  { 174542, true },
    -  { 174555, true },
    -  { 174568, true },
    -  { 174585, true },
    -  { 174602, false },
    -  { 174619, true },
    -  { 174632, true },
    -  { 174649, true },
    -  { 174670, true },
    +  { 173961, true },
    +  { 173975, true },
    +  { 173995, true },
    +  { 174011, true },
    +  { 174026, true },
    +  { 174040, true },
    +  { 174071, true },
    +  { 174087, true },
    +  { 174098, true },
    +  { 174108, false },
    +  { 174132, true },
    +  { 174146, true },
    +  { 174160, true },
    +  { 174170, true },
    +  { 174187, true },
    +  { 174200, true },
    +  { 174213, true },
    +  { 174230, true },
    +  { 174247, false },
    +  { 174264, true },
    +  { 174277, true },
    +  { 174294, true },
    +  { 174315, true },
    +  { 174328, true },
    +  { 174341, true },
    +  { 174361, true },
    +  { 174379, true },
    +  { 174389, true },
    +  { 174402, true },
    +  { 174421, true },
    +  { 174435, true },
    +  { 174449, false },
    +  { 174460, true },
    +  { 174477, true },
    +  { 174490, true },
    +  { 174513, true },
    +  { 174541, true },
    +  { 174553, true },
    +  { 174567, true },
    +  { 174580, true },
    +  { 174592, true },
    +  { 174608, true },
    +  { 174621, true },
    +  { 174637, true },
    +  { 174647, true },
    +  { 174660, true },
    +  { 174675, true },
       { 174683, true },
    -  { 174696, true },
    -  { 174716, true },
    -  { 174734, true },
    -  { 174744, true },
    -  { 174757, true },
    -  { 174776, true },
    -  { 174790, true },
    -  { 174804, false },
    -  { 174815, true },
    -  { 174832, true },
    -  { 174845, true },
    -  { 174868, true },
    -  { 174896, true },
    -  { 174908, true },
    +  { 174698, true },
    +  { 174715, true },
    +  { 174722, true },
    +  { 174732, true },
    +  { 174742, true },
    +  { 174763, true },
    +  { 174779, true },
    +  { 174798, true },
    +  { 174811, true },
    +  { 174831, true },
    +  { 174846, true },
    +  { 174854, true },
    +  { 174873, false },
    +  { 174881, true },
    +  { 174888, true },
    +  { 174903, true },
    +  { 174911, true },
       { 174922, true },
    -  { 174935, true },
    -  { 174947, true },
    -  { 174963, true },
    -  { 174976, true },
    -  { 174992, true },
    -  { 175002, true },
    -  { 175015, true },
    -  { 175030, true },
    -  { 175038, true },
    -  { 175053, true },
    -  { 175070, true },
    -  { 175077, true },
    -  { 175087, true },
    +  { 174933, true },
    +  { 174948, false },
    +  { 174968, true },
    +  { 174983, true },
    +  { 174998, true },
    +  { 175008, true },
    +  { 175020, true },
    +  { 175044, true },
    +  { 175057, true },
    +  { 175069, true },
    +  { 175082, true },
       { 175097, true },
    -  { 175118, true },
    -  { 175134, true },
    -  { 175153, true },
    +  { 175111, true },
    +  { 175127, true },
    +  { 175146, true },
       { 175166, true },
    -  { 175186, true },
    -  { 175201, true },
    -  { 175209, true },
    -  { 175228, false },
    -  { 175236, true },
    -  { 175243, true },
    +  { 175177, true },
    +  { 175188, true },
    +  { 175196, true },
    +  { 175203, true },
    +  { 175216, true },
    +  { 175230, true },
    +  { 175240, true },
       { 175258, true },
    -  { 175266, true },
    -  { 175277, true },
    -  { 175288, true },
    -  { 175303, false },
    -  { 175323, true },
    -  { 175338, true },
    -  { 175353, true },
    -  { 175363, true },
    -  { 175375, true },
    -  { 175399, true },
    +  { 175285, true },
    +  { 175298, false },
    +  { 175321, true },
    +  { 175343, true },
    +  { 175356, true },
    +  { 175371, true },
    +  { 175378, true },
    +  { 175385, true },
    +  { 175396, true },
       { 175412, true },
       { 175424, true },
       { 175437, true },
    -  { 175452, true },
    -  { 175466, true },
    -  { 175482, true },
    -  { 175501, true },
    -  { 175521, true },
    -  { 175532, true },
    -  { 175543, true },
    +  { 175449, true },
    +  { 175459, true },
    +  { 175476, true },
    +  { 175491, true },
    +  { 175500, true },
    +  { 175511, true },
    +  { 175529, true },
    +  { 175541, true },
       { 175551, true },
    -  { 175558, true },
    -  { 175571, true },
    -  { 175585, true },
    -  { 175595, true },
    -  { 175613, true },
    -  { 175640, true },
    -  { 175653, false },
    -  { 175676, true },
    -  { 175698, true },
    -  { 175711, true },
    -  { 175726, true },
    -  { 175733, true },
    -  { 175740, true },
    -  { 175751, true },
    -  { 175767, true },
    -  { 175779, true },
    -  { 175792, true },
    -  { 175804, true },
    +  { 175563, true },
    +  { 175576, true },
    +  { 175591, true },
    +  { 175608, true },
    +  { 175618, true },
    +  { 175637, true },
    +  { 175656, true },
    +  { 175674, true },
    +  { 175686, true },
    +  { 175705, false },
    +  { 175720, true },
    +  { 175734, false },
    +  { 175744, false },
    +  { 175754, true },
    +  { 175760, true },
    +  { 175769, true },
    +  { 175781, true },
    +  { 175800, true },
       { 175814, true },
    -  { 175831, true },
    -  { 175846, true },
    -  { 175855, true },
    -  { 175866, true },
    -  { 175884, true },
    -  { 175896, true },
    -  { 175906, true },
    -  { 175918, true },
    -  { 175931, true },
    -  { 175946, true },
    -  { 175963, true },
    -  { 175973, true },
    -  { 175992, true },
    -  { 176011, true },
    -  { 176029, true },
    -  { 176041, true },
    -  { 176060, false },
    -  { 176075, true },
    -  { 176089, false },
    -  { 176099, false },
    -  { 176109, true },
    -  { 176115, true },
    -  { 176124, true },
    -  { 176136, true },
    -  { 176155, true },
    -  { 176169, true },
    -  { 176187, true },
    +  { 175832, true },
    +  { 175844, true },
    +  { 175854, true },
    +  { 175878, true },
    +  { 175901, true },
    +  { 175914, true },
    +  { 175930, true },
    +  { 175942, true },
    +  { 175956, false },
    +  { 175969, true },
    +  { 175988, true },
    +  { 175998, true },
    +  { 176020, true },
    +  { 176033, true },
    +  { 176042, true },
    +  { 176053, true },
    +  { 176066, true },
    +  { 176079, true },
    +  { 176090, true },
    +  { 176104, true },
    +  { 176119, true },
    +  { 176134, true },
    +  { 176157, false },
    +  { 176170, false },
    +  { 176184, true },
       { 176199, true },
    -  { 176209, true },
    -  { 176233, true },
    -  { 176256, true },
    -  { 176269, true },
    -  { 176285, true },
    -  { 176297, true },
    -  { 176311, false },
    -  { 176324, true },
    -  { 176343, true },
    -  { 176353, true },
    -  { 176375, true },
    -  { 176388, true },
    -  { 176397, true },
    -  { 176408, true },
    -  { 176421, true },
    -  { 176434, true },
    -  { 176445, true },
    -  { 176459, true },
    -  { 176474, true },
    -  { 176489, true },
    -  { 176503, true },
    -  { 176526, false },
    -  { 176539, false },
    -  { 176553, true },
    -  { 176568, true },
    -  { 176580, true },
    -  { 176590, true },
    -  { 176604, true },
    -  { 176617, false },
    -  { 176631, true },
    -  { 176643, true },
    -  { 176655, true },
    -  { 176671, true },
    -  { 176697, true },
    -  { 176715, false },
    -  { 176728, true },
    +  { 176211, true },
    +  { 176221, true },
    +  { 176235, true },
    +  { 176248, false },
    +  { 176262, true },
    +  { 176274, true },
    +  { 176286, true },
    +  { 176302, true },
    +  { 176328, true },
    +  { 176346, false },
    +  { 176359, true },
    +  { 176369, true },
    +  { 176379, true },
    +  { 176390, true },
    +  { 176405, true },
    +  { 176417, true },
    +  { 176433, true },
    +  { 176441, true },
    +  { 176451, true },
    +  { 176461, true },
    +  { 176471, true },
    +  { 176482, true },
    +  { 176502, false },
    +  { 176523, true },
    +  { 176536, true },
    +  { 176550, true },
    +  { 176563, true },
    +  { 176579, true },
    +  { 176590, false },
    +  { 176610, true },
    +  { 176620, true },
    +  { 176630, true },
    +  { 176647, true },
    +  { 176663, true },
    +  { 176674, true },
    +  { 176704, true },
    +  { 176730, true },
       { 176738, true },
    -  { 176748, true },
    -  { 176759, true },
    -  { 176774, true },
    -  { 176786, true },
    -  { 176802, true },
    -  { 176810, true },
    -  { 176820, true },
    -  { 176830, true },
    -  { 176840, true },
    -  { 176851, true },
    -  { 176871, false },
    -  { 176892, true },
    -  { 176905, true },
    -  { 176919, true },
    -  { 176932, true },
    -  { 176948, true },
    -  { 176959, false },
    -  { 176979, true },
    -  { 176989, true },
    -  { 176999, true },
    -  { 177016, true },
    -  { 177032, true },
    -  { 177043, true },
    -  { 177073, true },
    -  { 177099, true },
    -  { 177107, true },
    -  { 177126, true },
    -  { 177140, true },
    +  { 176757, true },
    +  { 176771, true },
    +  { 176790, true },
    +  { 176811, true },
    +  { 176821, true },
    +  { 176836, true },
    +  { 176852, true },
    +  { 176869, true },
    +  { 176880, true },
    +  { 176897, true },
    +  { 176913, true },
    +  { 176933, true },
    +  { 176955, true },
    +  { 176968, true },
    +  { 176978, true },
    +  { 177000, true },
    +  { 177021, true },
    +  { 177034, true },
    +  { 177058, true },
    +  { 177070, true },
    +  { 177082, true },
    +  { 177092, true },
    +  { 177110, false },
    +  { 177127, true },
       { 177159, true },
    +  { 177170, true },
       { 177180, true },
    -  { 177190, true },
    -  { 177205, true },
    -  { 177221, true },
    -  { 177238, true },
    -  { 177249, true },
    -  { 177266, true },
    -  { 177282, true },
    -  { 177302, true },
    -  { 177324, true },
    -  { 177337, true },
    -  { 177347, true },
    -  { 177369, true },
    -  { 177390, true },
    -  { 177403, true },
    -  { 177427, true },
    -  { 177439, true },
    -  { 177451, true },
    -  { 177461, true },
    -  { 177479, false },
    -  { 177496, true },
    -  { 177528, true },
    -  { 177539, true },
    -  { 177549, true },
    -  { 177562, true },
    -  { 177575, true },
    -  { 177586, true },
    -  { 177596, true },
    -  { 177603, true },
    -  { 177615, true },
    -  { 177628, false },
    -  { 177640, true },
    -  { 177660, true },
    -  { 177670, true },
    -  { 177691, true },
    -  { 177708, true },
    -  { 177725, true },
    -  { 177743, true },
    -  { 177761, true },
    -  { 177779, true },
    +  { 177193, true },
    +  { 177206, true },
    +  { 177217, true },
    +  { 177227, true },
    +  { 177234, true },
    +  { 177246, true },
    +  { 177259, false },
    +  { 177271, true },
    +  { 177291, true },
    +  { 177301, true },
    +  { 177322, true },
    +  { 177339, true },
    +  { 177356, true },
    +  { 177374, true },
    +  { 177392, true },
    +  { 177410, true },
    +  { 177428, true },
    +  { 177445, true },
    +  { 177467, true },
    +  { 177480, true },
    +  { 177493, false },
    +  { 177508, false },
    +  { 177518, false },
    +  { 177532, true },
    +  { 177547, true },
    +  { 177559, true },
    +  { 177577, true },
    +  { 177592, true },
    +  { 177610, true },
    +  { 177622, true },
    +  { 177638, true },
    +  { 177648, true },
    +  { 177658, true },
    +  { 177686, true },
    +  { 177701, true },
    +  { 177712, true },
    +  { 177722, false },
    +  { 177740, true },
    +  { 177755, true },
    +  { 177767, true },
    +  { 177780, true },
       { 177797, true },
    -  { 177814, true },
    -  { 177836, true },
    -  { 177849, true },
    -  { 177862, false },
    -  { 177877, false },
    -  { 177887, false },
    -  { 177901, true },
    -  { 177916, true },
    -  { 177928, true },
    -  { 177946, true },
    -  { 177961, true },
    +  { 177807, true },
    +  { 177818, false },
    +  { 177833, true },
    +  { 177851, true },
    +  { 177866, true },
    +  { 177884, true },
    +  { 177907, true },
    +  { 177921, true },
    +  { 177937, true },
    +  { 177955, true },
       { 177979, true },
    -  { 177991, true },
    -  { 178007, true },
    -  { 178017, true },
    -  { 178027, true },
    +  { 178012, false },
    +  { 178035, true },
       { 178055, true },
    -  { 178070, true },
    -  { 178081, true },
    -  { 178091, false },
    -  { 178109, true },
    -  { 178124, true },
    -  { 178136, true },
    -  { 178149, true },
    +  { 178072, true },
    +  { 178090, true },
    +  { 178103, true },
    +  { 178116, true },
    +  { 178133, true },
    +  { 178144, true },
       { 178166, true },
    -  { 178176, true },
    -  { 178187, false },
    -  { 178202, true },
    -  { 178220, true },
    -  { 178235, true },
    -  { 178253, true },
    -  { 178276, true },
    -  { 178290, true },
    +  { 178184, false },
    +  { 178198, true },
    +  { 178217, true },
    +  { 178231, true },
    +  { 178252, true },
    +  { 178270, true },
    +  { 178284, true },
    +  { 178293, true },
       { 178306, true },
       { 178324, true },
    -  { 178348, true },
    -  { 178381, false },
    +  { 178336, true },
    +  { 178352, true },
    +  { 178367, true },
    +  { 178380, true },
    +  { 178392, true },
       { 178404, true },
    -  { 178424, true },
    -  { 178441, true },
    -  { 178459, true },
    -  { 178472, true },
    -  { 178485, true },
    -  { 178502, true },
    +  { 178415, true },
    +  { 178426, true },
    +  { 178435, true },
    +  { 178448, true },
    +  { 178462, true },
    +  { 178473, true },
    +  { 178486, true },
    +  { 178500, false },
       { 178513, true },
    -  { 178535, true },
    -  { 178553, false },
    -  { 178567, true },
    -  { 178586, true },
    -  { 178600, true },
    -  { 178621, true },
    -  { 178639, true },
    -  { 178653, true },
    -  { 178662, true },
    -  { 178675, true },
    -  { 178693, true },
    -  { 178705, true },
    -  { 178721, true },
    -  { 178736, true },
    -  { 178749, true },
    -  { 178761, true },
    -  { 178773, true },
    -  { 178784, true },
    -  { 178795, true },
    -  { 178804, true },
    -  { 178817, true },
    -  { 178831, true },
    -  { 178842, true },
    -  { 178855, true },
    -  { 178869, false },
    -  { 178882, true },
    -  { 178891, true },
    -  { 178901, true },
    +  { 178522, true },
    +  { 178532, true },
    +  { 178545, true },
    +  { 178554, true },
    +  { 178564, true },
    +  { 178575, true },
    +  { 178585, true },
    +  { 178593, false },
    +  { 178607, false },
    +  { 178627, true },
    +  { 178637, true },
    +  { 178651, true },
    +  { 178661, true },
    +  { 178672, true },
    +  { 178684, true },
    +  { 178696, true },
    +  { 178706, true },
    +  { 178715, true },
    +  { 178727, true },
    +  { 178738, true },
    +  { 178750, true },
    +  { 178766, true },
    +  { 178781, true },
    +  { 178791, true },
    +  { 178806, true },
    +  { 178821, true },
    +  { 178833, true },
    +  { 178840, true },
    +  { 178851, true },
    +  { 178861, true },
    +  { 178876, true },
    +  { 178887, true },
    +  { 178900, true },
       { 178914, true },
    -  { 178923, true },
    -  { 178933, true },
    -  { 178944, true },
    +  { 178928, true },
    +  { 178939, true },
       { 178954, true },
    -  { 178962, false },
    -  { 178976, false },
    -  { 178996, true },
    -  { 179006, true },
    -  { 179020, true },
    -  { 179030, true },
    -  { 179041, true },
    -  { 179053, true },
    -  { 179065, true },
    -  { 179075, true },
    -  { 179084, true },
    -  { 179096, true },
    -  { 179107, true },
    -  { 179119, true },
    -  { 179135, true },
    -  { 179150, true },
    -  { 179160, true },
    -  { 179175, true },
    -  { 179190, true },
    -  { 179202, true },
    -  { 179209, true },
    -  { 179220, true },
    -  { 179230, true },
    -  { 179245, true },
    -  { 179256, true },
    -  { 179269, true },
    -  { 179283, true },
    -  { 179297, true },
    -  { 179308, true },
    -  { 179323, true },
    -  { 179332, true },
    -  { 179342, true },
    -  { 179349, true },
    -  { 179360, true },
    +  { 178963, true },
    +  { 178973, true },
    +  { 178980, true },
    +  { 178991, true },
    +  { 179003, true },
    +  { 179025, true },
    +  { 179048, false },
    +  { 179059, true },
    +  { 179072, true },
    +  { 179082, true },
    +  { 179109, true },
    +  { 179118, true },
    +  { 179127, true },
    +  { 179144, true },
    +  { 179156, true },
    +  { 179169, true },
    +  { 179196, true },
    +  { 179203, true },
    +  { 179214, true },
    +  { 179231, true },
    +  { 179247, true },
    +  { 179258, true },
    +  { 179271, true },
    +  { 179295, true },
    +  { 179302, true },
    +  { 179312, true },
    +  { 179319, true },
    +  { 179339, true },
    +  { 179351, true },
       { 179372, true },
    -  { 179394, true },
    -  { 179417, false },
    -  { 179428, true },
    -  { 179441, true },
    +  { 179383, true },
    +  { 179395, true },
    +  { 179405, true },
    +  { 179414, true },
    +  { 179423, true },
    +  { 179432, true },
       { 179451, true },
    -  { 179478, true },
    -  { 179487, true },
    -  { 179496, true },
    -  { 179513, true },
    -  { 179525, true },
    -  { 179538, true },
    -  { 179565, true },
    -  { 179572, true },
    -  { 179583, true },
    -  { 179600, true },
    -  { 179616, true },
    -  { 179627, true },
    -  { 179640, true },
    -  { 179664, true },
    -  { 179671, true },
    -  { 179681, true },
    -  { 179688, true },
    +  { 179471, true },
    +  { 179485, true },
    +  { 179506, true },
    +  { 179519, true },
    +  { 179531, true },
    +  { 179555, true },
    +  { 179573, false },
    +  { 179587, true },
    +  { 179602, true },
    +  { 179617, true },
    +  { 179626, false },
    +  { 179643, false },
    +  { 179653, true },
    +  { 179663, true },
    +  { 179677, true },
    +  { 179692, true },
       { 179708, true },
    -  { 179720, true },
    -  { 179741, true },
    -  { 179752, true },
    -  { 179764, true },
    -  { 179774, true },
    -  { 179783, true },
    -  { 179792, true },
    -  { 179801, true },
    -  { 179820, true },
    -  { 179840, true },
    -  { 179854, true },
    -  { 179875, true },
    -  { 179888, true },
    -  { 179900, true },
    -  { 179924, true },
    -  { 179942, false },
    -  { 179956, true },
    -  { 179971, true },
    -  { 179986, true },
    -  { 179995, false },
    -  { 180012, false },
    -  { 180022, true },
    -  { 180032, true },
    +  { 179724, true },
    +  { 179734, true },
    +  { 179745, true },
    +  { 179756, true },
    +  { 179768, true },
    +  { 179780, true },
    +  { 179791, true },
    +  { 179805, true },
    +  { 179821, true },
    +  { 179833, true },
    +  { 179852, true },
    +  { 179867, true },
    +  { 179877, true },
    +  { 179895, true },
    +  { 179906, true },
    +  { 179926, true },
    +  { 179943, true },
    +  { 179959, true },
    +  { 179978, true },
    +  { 179993, true },
    +  { 180009, true },
    +  { 180026, true },
       { 180046, true },
    -  { 180061, true },
    -  { 180077, true },
    -  { 180093, true },
    -  { 180103, true },
    -  { 180114, true },
    -  { 180125, true },
    -  { 180137, true },
    -  { 180149, true },
    -  { 180160, true },
    -  { 180174, true },
    +  { 180058, true },
    +  { 180073, true },
    +  { 180092, true },
    +  { 180101, true },
    +  { 180118, true },
    +  { 180130, true },
    +  { 180142, true },
    +  { 180154, true },
    +  { 180163, true },
    +  { 180173, true },
       { 180190, true },
    -  { 180202, true },
    -  { 180221, true },
    -  { 180236, true },
    -  { 180246, true },
    -  { 180264, true },
    -  { 180275, true },
    -  { 180295, true },
    -  { 180312, true },
    -  { 180328, true },
    -  { 180347, true },
    -  { 180362, true },
    -  { 180378, true },
    -  { 180395, true },
    -  { 180415, true },
    -  { 180427, true },
    -  { 180442, true },
    -  { 180461, true },
    -  { 180470, true },
    -  { 180487, true },
    -  { 180499, true },
    -  { 180511, true },
    -  { 180523, true },
    -  { 180532, true },
    -  { 180542, true },
    -  { 180559, true },
    -  { 180577, true },
    -  { 180588, true },
    -  { 180598, true },
    -  { 180613, true },
    -  { 180623, true },
    -  { 180633, false },
    +  { 180208, true },
    +  { 180219, true },
    +  { 180229, true },
    +  { 180244, true },
    +  { 180254, true },
    +  { 180264, false },
    +  { 180271, true },
    +  { 180281, true },
    +  { 180302, true },
    +  { 180322, true },
    +  { 180345, true },
    +  { 180365, true },
    +  { 180381, true },
    +  { 180396, true },
    +  { 180414, true },
    +  { 180425, false },
    +  { 180449, true },
    +  { 180468, true },
    +  { 180481, true },
    +  { 180497, false },
    +  { 180513, true },
    +  { 180527, true },
    +  { 180534, true },
    +  { 180546, false },
    +  { 180560, true },
    +  { 180579, true },
    +  { 180597, true },
    +  { 180610, true },
    +  { 180624, false },
       { 180640, true },
    -  { 180650, true },
    -  { 180671, true },
    -  { 180691, true },
    -  { 180714, true },
    -  { 180734, true },
    -  { 180750, true },
    -  { 180765, true },
    -  { 180783, true },
    -  { 180794, false },
    -  { 180818, true },
    -  { 180837, true },
    -  { 180850, true },
    -  { 180866, false },
    -  { 180882, true },
    -  { 180896, true },
    -  { 180903, true },
    -  { 180915, false },
    -  { 180929, true },
    -  { 180948, true },
    -  { 180966, true },
    -  { 180979, true },
    -  { 180993, false },
    -  { 181009, true },
    -  { 181027, true },
    -  { 181050, true },
    -  { 181063, true },
    -  { 181075, true },
    -  { 181086, true },
    -  { 181097, true },
    -  { 181112, true },
    -  { 181126, true },
    -  { 181151, true },
    -  { 181184, true },
    -  { 181210, true },
    -  { 181244, true },
    -  { 181267, true },
    -  { 181279, true },
    -  { 181291, true },
    -  { 181307, false },
    -  { 181327, true },
    -  { 181340, false },
    -  { 181358, false },
    -  { 181381, true },
    -  { 181401, true },
    -  { 181417, true },
    -  { 181431, true },
    -  { 181452, true },
    -  { 181467, false },
    -  { 181480, true },
    -  { 181494, true },
    -  { 181506, true },
    -  { 181518, true },
    -  { 181534, false },
    +  { 180658, true },
    +  { 180681, true },
    +  { 180694, true },
    +  { 180706, true },
    +  { 180717, true },
    +  { 180728, true },
    +  { 180743, true },
    +  { 180757, true },
    +  { 180782, true },
    +  { 180815, true },
    +  { 180841, true },
    +  { 180875, true },
    +  { 180898, true },
    +  { 180910, true },
    +  { 180922, true },
    +  { 180938, false },
    +  { 180958, true },
    +  { 180971, false },
    +  { 180989, false },
    +  { 181012, true },
    +  { 181032, true },
    +  { 181048, true },
    +  { 181062, true },
    +  { 181083, true },
    +  { 181098, false },
    +  { 181111, true },
    +  { 181125, true },
    +  { 181137, true },
    +  { 181149, true },
    +  { 181165, false },
    +  { 181187, true },
    +  { 181207, true },
    +  { 181219, true },
    +  { 181235, true },
    +  { 181247, true },
    +  { 181260, true },
    +  { 181276, true },
    +  { 181294, true },
    +  { 181306, true },
    +  { 181320, true },
    +  { 181334, true },
    +  { 181351, true },
    +  { 181365, true },
    +  { 181375, true },
    +  { 181389, true },
    +  { 181399, true },
    +  { 181420, true },
    +  { 181433, true },
    +  { 181449, true },
    +  { 181462, true },
    +  { 181473, true },
    +  { 181486, true },
    +  { 181507, true },
    +  { 181527, true },
    +  { 181544, true },
       { 181556, true },
    -  { 181576, true },
    -  { 181588, true },
    -  { 181604, true },
    -  { 181616, true },
    -  { 181629, true },
    -  { 181645, true },
    -  { 181663, true },
    -  { 181675, true },
    -  { 181689, true },
    +  { 181570, true },
    +  { 181580, true },
    +  { 181590, true },
    +  { 181598, true },
    +  { 181614, true },
    +  { 181630, true },
    +  { 181646, true },
    +  { 181667, true },
    +  { 181678, true },
    +  { 181690, true },
       { 181703, true },
    -  { 181720, true },
    -  { 181734, true },
    -  { 181744, true },
    -  { 181758, true },
    -  { 181768, true },
    -  { 181789, true },
    -  { 181802, true },
    -  { 181818, true },
    -  { 181831, true },
    -  { 181842, true },
    -  { 181855, true },
    -  { 181876, true },
    -  { 181896, true },
    -  { 181913, true },
    -  { 181925, true },
    -  { 181939, true },
    -  { 181949, true },
    -  { 181959, true },
    -  { 181967, true },
    -  { 181983, true },
    -  { 181999, true },
    -  { 182015, true },
    -  { 182036, true },
    -  { 182047, true },
    -  { 182059, true },
    -  { 182072, true },
    -  { 182097, true },
    -  { 182112, true },
    -  { 182132, true },
    -  { 182146, true },
    -  { 182160, true },
    -  { 182175, true },
    -  { 182197, true },
    -  { 182213, true },
    -  { 182233, true },
    -  { 182248, true },
    -  { 182258, true },
    -  { 182276, true },
    -  { 182291, true },
    -  { 182307, true },
    -  { 182323, true },
    -  { 182332, false },
    -  { 182342, true },
    -  { 182354, true },
    -  { 182366, true },
    +  { 181728, true },
    +  { 181743, true },
    +  { 181763, true },
    +  { 181777, true },
    +  { 181791, true },
    +  { 181806, true },
    +  { 181828, true },
    +  { 181844, true },
    +  { 181864, true },
    +  { 181879, true },
    +  { 181889, true },
    +  { 181907, true },
    +  { 181922, true },
    +  { 181938, true },
    +  { 181954, true },
    +  { 181963, false },
    +  { 181973, true },
    +  { 181985, true },
    +  { 181997, true },
    +  { 182013, true },
    +  { 182029, true },
    +  { 182050, true },
    +  { 182062, true },
    +  { 182081, false },
    +  { 182093, true },
    +  { 182103, true },
    +  { 182118, true },
    +  { 182130, true },
    +  { 182154, true },
    +  { 182166, true },
    +  { 182187, true },
    +  { 182218, true },
    +  { 182243, true },
    +  { 182266, true },
    +  { 182277, true },
    +  { 182289, true },
    +  { 182304, true },
    +  { 182317, true },
    +  { 182330, true },
    +  { 182359, true },
       { 182382, true },
    -  { 182398, true },
    -  { 182419, true },
    -  { 182431, true },
    -  { 182450, false },
    -  { 182462, true },
    -  { 182472, true },
    -  { 182487, true },
    -  { 182499, true },
    -  { 182523, true },
    -  { 182535, true },
    -  { 182556, true },
    -  { 182587, true },
    -  { 182612, true },
    -  { 182635, true },
    -  { 182646, true },
    -  { 182658, true },
    -  { 182673, true },
    -  { 182686, true },
    -  { 182699, true },
    -  { 182728, true },
    -  { 182751, true },
    -  { 182775, true },
    -  { 182802, true },
    +  { 182406, true },
    +  { 182433, true },
    +  { 182447, true },
    +  { 182470, true },
    +  { 182496, true },
    +  { 182524, true },
    +  { 182555, true },
    +  { 182580, true },
    +  { 182588, true },
    +  { 182595, true },
    +  { 182605, true },
    +  { 182617, true },
    +  { 182629, true },
    +  { 182642, true },
    +  { 182663, true },
    +  { 182680, true },
    +  { 182693, true },
    +  { 182714, true },
    +  { 182733, true },
    +  { 182752, true },
    +  { 182763, true },
    +  { 182776, true },
    +  { 182792, false },
    +  { 182808, true },
       { 182816, true },
    -  { 182839, true },
    -  { 182865, true },
    -  { 182893, true },
    +  { 182831, true },
    +  { 182848, false },
    +  { 182863, true },
    +  { 182879, true },
    +  { 182889, true },
    +  { 182905, true },
       { 182924, true },
    -  { 182949, true },
    -  { 182957, true },
    -  { 182964, true },
    -  { 182974, true },
    -  { 182986, true },
    -  { 182998, true },
    -  { 183011, true },
    -  { 183032, true },
    -  { 183049, true },
    -  { 183062, true },
    -  { 183083, true },
    -  { 183102, true },
    -  { 183121, true },
    -  { 183134, true },
    -  { 183150, false },
    -  { 183166, true },
    -  { 183174, true },
    -  { 183189, true },
    -  { 183206, false },
    -  { 183221, true },
    +  { 182938, true },
    +  { 182947, true },
    +  { 182959, true },
    +  { 182972, true },
    +  { 182987, true },
    +  { 183009, true },
    +  { 183026, true },
    +  { 183040, true },
    +  { 183047, true },
    +  { 183060, true },
    +  { 183073, true },
    +  { 183099, true },
    +  { 183111, true },
    +  { 183122, true },
    +  { 183148, true },
    +  { 183158, false },
    +  { 183175, true },
    +  { 183187, true },
    +  { 183202, true },
    +  { 183212, true },
    +  { 183225, true },
       { 183237, true },
       { 183247, true },
    -  { 183263, true },
    -  { 183282, true },
    -  { 183296, true },
    -  { 183305, true },
    -  { 183317, true },
    -  { 183330, true },
    -  { 183345, true },
    -  { 183367, true },
    -  { 183384, true },
    -  { 183398, true },
    -  { 183405, true },
    -  { 183418, true },
    -  { 183431, true },
    -  { 183457, true },
    +  { 183260, false },
    +  { 183276, true },
    +  { 183292, true },
    +  { 183306, false },
    +  { 183321, true },
    +  { 183334, true },
    +  { 183348, true },
    +  { 183362, true },
    +  { 183376, true },
    +  { 183400, true },
    +  { 183413, true },
    +  { 183426, true },
    +  { 183440, true },
    +  { 183454, true },
       { 183469, true },
    -  { 183480, true },
    -  { 183506, true },
    -  { 183516, false },
    -  { 183533, true },
    -  { 183545, true },
    -  { 183560, true },
    -  { 183570, true },
    -  { 183583, true },
    -  { 183595, true },
    -  { 183605, true },
    -  { 183618, false },
    -  { 183634, true },
    -  { 183650, true },
    -  { 183664, false },
    -  { 183679, true },
    -  { 183692, true },
    -  { 183706, true },
    -  { 183720, true },
    -  { 183734, true },
    -  { 183758, true },
    +  { 183483, true },
    +  { 183499, true },
    +  { 183514, true },
    +  { 183529, true },
    +  { 183547, true },
    +  { 183559, true },
    +  { 183571, true },
    +  { 183587, true },
    +  { 183604, true },
    +  { 183628, true },
    +  { 183645, true },
    +  { 183663, true },
    +  { 183682, true },
    +  { 183702, true },
    +  { 183717, true },
    +  { 183729, true },
    +  { 183743, true },
    +  { 183760, true },
       { 183771, true },
    -  { 183784, true },
    -  { 183798, true },
    -  { 183812, true },
    -  { 183827, true },
    -  { 183841, true },
    -  { 183857, true },
    -  { 183872, true },
    -  { 183887, true },
    -  { 183905, true },
    -  { 183917, true },
    -  { 183929, true },
    -  { 183945, true },
    -  { 183962, true },
    -  { 183986, true },
    -  { 184003, true },
    -  { 184021, true },
    -  { 184040, true },
    -  { 184060, true },
    -  { 184075, true },
    -  { 184089, true },
    -  { 184106, true },
    -  { 184117, true },
    -  { 184126, true },
    -  { 184140, true },
    -  { 184155, true },
    +  { 183780, true },
    +  { 183794, true },
    +  { 183809, true },
    +  { 183821, true },
    +  { 183831, true },
    +  { 183844, true },
    +  { 183856, true },
    +  { 183877, true },
    +  { 183891, true },
    +  { 183904, true },
    +  { 183916, false },
    +  { 183935, true },
    +  { 183957, true },
    +  { 183972, true },
    +  { 183991, true },
    +  { 184005, false },
    +  { 184016, true },
    +  { 184031, true },
    +  { 184045, true },
    +  { 184057, true },
    +  { 184074, true },
    +  { 184092, true },
    +  { 184099, true },
    +  { 184112, true },
    +  { 184124, true },
    +  { 184132, true },
    +  { 184142, true },
    +  { 184152, true },
       { 184167, true },
    -  { 184177, true },
    -  { 184190, true },
    -  { 184202, true },
    -  { 184223, true },
    -  { 184237, true },
    -  { 184250, true },
    -  { 184262, false },
    -  { 184281, true },
    -  { 184303, true },
    -  { 184318, true },
    -  { 184337, true },
    -  { 184351, false },
    -  { 184362, true },
    -  { 184377, true },
    -  { 184391, true },
    +  { 184186, true },
    +  { 184198, true },
    +  { 184214, true },
    +  { 184229, false },
    +  { 184239, false },
    +  { 184251, true },
    +  { 184260, true },
    +  { 184274, true },
    +  { 184286, true },
    +  { 184294, true },
    +  { 184304, true },
    +  { 184314, true },
    +  { 184333, true },
    +  { 184341, false },
    +  { 184353, true },
    +  { 184366, true },
    +  { 184381, true },
       { 184403, true },
    -  { 184420, true },
    -  { 184438, true },
    -  { 184445, true },
    +  { 184417, true },
    +  { 184428, true },
    +  { 184440, true },
       { 184458, true },
    -  { 184470, true },
    -  { 184478, true },
    -  { 184488, true },
    -  { 184498, true },
    -  { 184513, true },
    -  { 184532, true },
    -  { 184544, true },
    -  { 184560, true },
    -  { 184575, false },
    -  { 184585, false },
    -  { 184597, true },
    -  { 184606, true },
    -  { 184620, true },
    -  { 184632, true },
    -  { 184640, true },
    -  { 184650, true },
    -  { 184660, true },
    +  { 184474, true },
    +  { 184483, false },
    +  { 184500, true },
    +  { 184521, true },
    +  { 184542, true },
    +  { 184554, true },
    +  { 184579, true },
    +  { 184605, true },
    +  { 184631, true },
    +  { 184643, true },
    +  { 184656, true },
    +  { 184669, true },
       { 184679, true },
    -  { 184687, false },
    -  { 184699, true },
    -  { 184712, true },
    -  { 184727, true },
    -  { 184749, true },
    -  { 184763, true },
    -  { 184774, true },
    -  { 184786, true },
    -  { 184804, true },
    -  { 184820, true },
    -  { 184829, false },
    -  { 184846, true },
    -  { 184867, true },
    -  { 184888, true },
    -  { 184900, true },
    -  { 184925, true },
    +  { 184688, true },
    +  { 184702, true },
    +  { 184718, true },
    +  { 184738, true },
    +  { 184753, true },
    +  { 184769, true },
    +  { 184779, true },
    +  { 184791, true },
    +  { 184811, true },
    +  { 184833, true },
    +  { 184850, true },
    +  { 184863, true },
    +  { 184882, true },
    +  { 184896, true },
    +  { 184920, true },
    +  { 184937, false },
       { 184951, true },
    +  { 184964, true },
       { 184977, true },
    -  { 184989, true },
    -  { 185002, true },
    -  { 185015, true },
    -  { 185025, true },
    -  { 185034, true },
    -  { 185048, true },
    -  { 185064, true },
    -  { 185084, true },
    -  { 185099, true },
    -  { 185115, true },
    -  { 185125, true },
    -  { 185137, true },
    -  { 185157, true },
    -  { 185179, true },
    -  { 185196, true },
    -  { 185209, true },
    -  { 185228, true },
    -  { 185242, true },
    -  { 185266, true },
    -  { 185283, false },
    -  { 185297, true },
    -  { 185310, true },
    -  { 185323, true },
    -  { 185342, true },
    -  { 185364, true },
    -  { 185376, true },
    -  { 185391, true },
    -  { 185412, true },
    -  { 185437, true },
    -  { 185453, true },
    -  { 185479, true },
    -  { 185495, true },
    -  { 185508, true },
    +  { 184996, true },
    +  { 185018, true },
    +  { 185030, true },
    +  { 185045, true },
    +  { 185066, true },
    +  { 185091, true },
    +  { 185107, true },
    +  { 185133, true },
    +  { 185149, true },
    +  { 185162, true },
    +  { 185180, true },
    +  { 185194, true },
    +  { 185213, true },
    +  { 185224, true },
    +  { 185236, true },
    +  { 185246, true },
    +  { 185255, true },
    +  { 185269, true },
    +  { 185280, true },
    +  { 185291, true },
    +  { 185299, true },
    +  { 185312, true },
    +  { 185326, true },
    +  { 185343, true },
    +  { 185354, false },
    +  { 185366, true },
    +  { 185385, true },
    +  { 185398, true },
    +  { 185409, true },
    +  { 185422, true },
    +  { 185434, true },
    +  { 185444, true },
    +  { 185454, true },
    +  { 185464, true },
    +  { 185487, true },
    +  { 185499, true },
    +  { 185518, true },
       { 185526, true },
       { 185540, true },
    -  { 185559, true },
    -  { 185570, true },
    -  { 185582, true },
    -  { 185592, true },
    -  { 185601, true },
    -  { 185615, true },
    +  { 185552, false },
    +  { 185565, true },
    +  { 185578, true },
    +  { 185589, true },
    +  { 185600, true },
    +  { 185616, true },
       { 185626, true },
    -  { 185637, true },
    -  { 185645, true },
    -  { 185658, true },
    -  { 185672, true },
    -  { 185689, false },
    -  { 185701, true },
    -  { 185720, true },
    -  { 185733, true },
    -  { 185744, true },
    -  { 185757, true },
    -  { 185769, true },
    -  { 185779, true },
    -  { 185789, true },
    -  { 185812, true },
    -  { 185824, true },
    -  { 185843, true },
    -  { 185851, true },
    -  { 185865, true },
    -  { 185877, false },
    -  { 185890, true },
    -  { 185903, true },
    -  { 185914, true },
    -  { 185925, true },
    -  { 185941, true },
    -  { 185951, true },
    -  { 185965, true },
    -  { 185972, true },
    -  { 185985, true },
    -  { 186002, true },
    -  { 186012, true },
    -  { 186028, true },
    -  { 186043, true },
    -  { 186053, true },
    -  { 186065, false },
    -  { 186076, false },
    -  { 186094, false },
    -  { 186107, true },
    -  { 186122, false },
    -  { 186140, false },
    -  { 186163, false },
    -  { 186184, false },
    -  { 186203, true },
    -  { 186219, false },
    -  { 186235, false },
    -  { 186251, true },
    -  { 186273, true },
    -  { 186286, false },
    -  { 186303, false },
    -  { 186320, true },
    -  { 186337, false },
    -  { 186354, false },
    -  { 186368, false },
    +  { 185640, true },
    +  { 185647, true },
    +  { 185660, true },
    +  { 185677, true },
    +  { 185687, true },
    +  { 185703, true },
    +  { 185718, true },
    +  { 185728, true },
    +  { 185740, false },
    +  { 185751, false },
    +  { 185769, false },
    +  { 185782, true },
    +  { 185797, false },
    +  { 185815, false },
    +  { 185838, false },
    +  { 185859, false },
    +  { 185878, true },
    +  { 185894, false },
    +  { 185910, false },
    +  { 185926, true },
    +  { 185948, true },
    +  { 185961, false },
    +  { 185978, false },
    +  { 185995, true },
    +  { 186012, false },
    +  { 186029, false },
    +  { 186043, false },
    +  { 186062, false },
    +  { 186073, false },
    +  { 186085, false },
    +  { 186097, false },
    +  { 186116, true },
    +  { 186134, false },
    +  { 186148, false },
    +  { 186165, false },
    +  { 186182, false },
    +  { 186197, false },
    +  { 186213, true },
    +  { 186234, false },
    +  { 186253, false },
    +  { 186271, false },
    +  { 186291, true },
    +  { 186307, false },
    +  { 186322, true },
    +  { 186337, true },
    +  { 186361, true },
    +  { 186368, true },
       { 186387, false },
    -  { 186398, false },
    -  { 186410, false },
    -  { 186422, false },
    -  { 186441, true },
    -  { 186459, false },
    -  { 186473, false },
    -  { 186490, false },
    -  { 186507, false },
    -  { 186522, false },
    -  { 186538, true },
    +  { 186405, false },
    +  { 186420, true },
    +  { 186441, false },
    +  { 186465, false },
    +  { 186484, false },
    +  { 186500, false },
    +  { 186515, false },
    +  { 186528, true },
    +  { 186544, false },
       { 186559, false },
    -  { 186578, false },
    -  { 186596, false },
    -  { 186616, true },
    -  { 186632, false },
    -  { 186647, true },
    -  { 186662, true },
    +  { 186573, false },
    +  { 186591, true },
    +  { 186602, true },
    +  { 186613, true },
    +  { 186621, true },
    +  { 186636, true },
    +  { 186649, true },
    +  { 186666, true },
    +  { 186678, true },
       { 186686, true },
    -  { 186693, true },
    -  { 186712, false },
    -  { 186730, false },
    -  { 186745, true },
    -  { 186766, false },
    -  { 186790, false },
    -  { 186809, false },
    -  { 186825, false },
    -  { 186840, false },
    -  { 186853, true },
    -  { 186869, false },
    -  { 186884, false },
    -  { 186898, false },
    -  { 186916, true },
    -  { 186927, true },
    -  { 186938, true },
    -  { 186946, true },
    -  { 186961, true },
    -  { 186974, true },
    -  { 186991, true },
    +  { 186697, true },
    +  { 186713, true },
    +  { 186718, true },
    +  { 186723, true },
    +  { 186733, true },
    +  { 186741, true },
    +  { 186761, true },
    +  { 186768, true },
    +  { 186787, true },
    +  { 186794, true },
    +  { 186801, true },
    +  { 186810, true },
    +  { 186831, true },
    +  { 186851, true },
    +  { 186875, true },
    +  { 186882, true },
    +  { 186892, true },
    +  { 186909, true },
    +  { 186929, true },
    +  { 186935, true },
    +  { 186942, true },
    +  { 186954, true },
    +  { 186967, true },
    +  { 186977, true },
    +  { 186992, false },
       { 187003, true },
    -  { 187011, true },
    -  { 187022, true },
    -  { 187038, true },
    -  { 187043, true },
    -  { 187048, true },
    -  { 187058, true },
    -  { 187066, true },
    -  { 187086, true },
    -  { 187093, true },
    -  { 187112, true },
    -  { 187119, true },
    -  { 187126, true },
    -  { 187135, true },
    -  { 187156, true },
    -  { 187176, true },
    -  { 187200, true },
    +  { 187014, true },
    +  { 187026, true },
    +  { 187034, false },
    +  { 187053, true },
    +  { 187064, true },
    +  { 187075, true },
    +  { 187082, true },
    +  { 187101, true },
    +  { 187117, true },
    +  { 187129, true },
    +  { 187140, true },
    +  { 187153, true },
    +  { 187167, true },
    +  { 187182, true },
    +  { 187197, true },
       { 187207, true },
    -  { 187217, true },
    -  { 187234, true },
    -  { 187254, true },
    -  { 187260, true },
    +  { 187217, false },
    +  { 187227, true },
    +  { 187237, true },
    +  { 187248, true },
    +  { 187258, true },
       { 187267, true },
    -  { 187279, true },
    -  { 187292, true },
    -  { 187302, true },
    -  { 187317, false },
    -  { 187328, true },
    -  { 187339, true },
    -  { 187351, true },
    -  { 187359, false },
    -  { 187378, true },
    -  { 187389, true },
    -  { 187400, true },
    -  { 187407, true },
    -  { 187426, true },
    -  { 187442, true },
    -  { 187454, true },
    -  { 187465, true },
    -  { 187478, true },
    -  { 187492, true },
    -  { 187507, true },
    -  { 187522, true },
    -  { 187532, true },
    -  { 187542, false },
    -  { 187552, true },
    -  { 187562, true },
    -  { 187573, true },
    -  { 187583, true },
    -  { 187592, true },
    -  { 187602, true },
    -  { 187610, true },
    -  { 187622, true },
    -  { 187633, true },
    -  { 187644, true },
    -  { 187656, true },
    -  { 187666, true },
    -  { 187674, true },
    -  { 187688, true },
    -  { 187695, true },
    -  { 187702, true },
    -  { 187720, true },
    -  { 187746, true },
    -  { 187772, true },
    -  { 187795, true },
    -  { 187826, true },
    -  { 187842, true },
    -  { 187854, true },
    -  { 187873, true },
    -  { 187906, true },
    -  { 187932, true },
    -  { 187957, true },
    -  { 187982, true },
    -  { 188012, true },
    -  { 188023, true },
    -  { 188042, true },
    -  { 188073, true },
    -  { 188084, false },
    -  { 188105, true },
    -  { 188128, true },
    -  { 188143, true },
    -  { 188157, true },
    -  { 188199, true },
    -  { 188222, true },
    -  { 188238, true },
    -  { 188264, true },
    -  { 188298, true },
    -  { 188322, false },
    -  { 188332, true },
    -  { 188338, true },
    -  { 188347, false },
    -  { 188357, true },
    -  { 188368, true },
    -  { 188378, true },
    -  { 188385, true },
    -  { 188392, true },
    -  { 188405, true },
    -  { 188412, true },
    -  { 188419, true },
    -  { 188433, true },
    +  { 187277, true },
    +  { 187285, true },
    +  { 187297, true },
    +  { 187308, true },
    +  { 187319, true },
    +  { 187331, true },
    +  { 187341, true },
    +  { 187349, true },
    +  { 187363, true },
    +  { 187370, true },
    +  { 187377, true },
    +  { 187395, true },
    +  { 187421, true },
    +  { 187447, true },
    +  { 187470, true },
    +  { 187501, true },
    +  { 187517, true },
    +  { 187529, true },
    +  { 187548, true },
    +  { 187581, true },
    +  { 187607, true },
    +  { 187632, true },
    +  { 187657, true },
    +  { 187687, true },
    +  { 187698, true },
    +  { 187717, true },
    +  { 187748, true },
    +  { 187759, false },
    +  { 187780, true },
    +  { 187803, true },
    +  { 187818, true },
    +  { 187832, true },
    +  { 187874, true },
    +  { 187897, true },
    +  { 187913, true },
    +  { 187939, true },
    +  { 187973, true },
    +  { 187997, false },
    +  { 188007, true },
    +  { 188013, true },
    +  { 188022, false },
    +  { 188032, true },
    +  { 188043, true },
    +  { 188053, true },
    +  { 188060, true },
    +  { 188067, true },
    +  { 188080, true },
    +  { 188087, true },
    +  { 188094, true },
    +  { 188108, true },
    +  { 188117, true },
    +  { 188131, true },
    +  { 188141, true },
    +  { 188151, true },
    +  { 188164, true },
    +  { 188171, true },
    +  { 188178, true },
    +  { 188187, true },
    +  { 188200, true },
    +  { 188207, true },
    +  { 188217, true },
    +  { 188225, true },
    +  { 188236, true },
    +  { 188246, true },
    +  { 188261, true },
    +  { 188271, true },
    +  { 188283, true },
    +  { 188303, true },
    +  { 188314, true },
    +  { 188325, true },
    +  { 188339, true },
    +  { 188355, true },
    +  { 188362, true },
    +  { 188374, true },
    +  { 188384, true },
    +  { 188391, true },
    +  { 188403, false },
    +  { 188415, true },
    +  { 188429, true },
       { 188442, true },
    -  { 188456, true },
    -  { 188466, true },
    -  { 188476, true },
    +  { 188452, true },
    +  { 188467, true },
    +  { 188479, true },
       { 188489, true },
    -  { 188496, true },
    -  { 188503, true },
    -  { 188519, true },
    -  { 188528, true },
    -  { 188541, true },
    -  { 188548, true },
    -  { 188558, true },
    -  { 188566, true },
    -  { 188577, true },
    -  { 188587, true },
    -  { 188602, true },
    -  { 188612, true },
    -  { 188624, true },
    -  { 188644, true },
    -  { 188655, true },
    -  { 188666, true },
    -  { 188680, true },
    -  { 188696, true },
    -  { 188703, true },
    -  { 188715, true },
    -  { 188725, true },
    -  { 188732, true },
    -  { 188744, false },
    -  { 188756, true },
    -  { 188770, true },
    -  { 188783, true },
    -  { 188793, true },
    -  { 188808, true },
    +  { 188501, true },
    +  { 188514, true },
    +  { 188526, true },
    +  { 188534, true },
    +  { 188546, true },
    +  { 188556, true },
    +  { 188564, true },
    +  { 188574, true },
    +  { 188581, true },
    +  { 188590, true },
    +  { 188610, true },
    +  { 188625, true },
    +  { 188640, true },
    +  { 188653, true },
    +  { 188665, true },
    +  { 188679, true },
    +  { 188689, false },
    +  { 188698, true },
    +  { 188714, true },
    +  { 188724, true },
    +  { 188733, true },
    +  { 188744, true },
    +  { 188755, true },
    +  { 188765, true },
    +  { 188776, true },
    +  { 188798, true },
    +  { 188813, true },
       { 188820, true },
    -  { 188830, true },
    -  { 188842, true },
    -  { 188855, true },
    -  { 188867, true },
    -  { 188875, true },
    -  { 188887, true },
    -  { 188897, true },
    -  { 188905, true },
    -  { 188915, true },
    -  { 188922, true },
    -  { 188931, true },
    -  { 188951, true },
    -  { 188966, true },
    +  { 188831, true },
    +  { 188839, true },
    +  { 188849, true },
    +  { 188862, false },
    +  { 188871, true },
    +  { 188885, true },
    +  { 188901, true },
    +  { 188925, true },
    +  { 188943, true },
    +  { 188954, true },
    +  { 188966, false },
       { 188981, true },
    -  { 188994, true },
    -  { 189006, true },
    -  { 189020, true },
    -  { 189030, false },
    -  { 189039, true },
    -  { 189055, true },
    -  { 189065, true },
    -  { 189074, true },
    -  { 189085, true },
    -  { 189096, true },
    -  { 189106, true },
    -  { 189117, true },
    -  { 189139, true },
    -  { 189154, true },
    -  { 189161, true },
    -  { 189172, true },
    -  { 189180, true },
    -  { 189190, true },
    -  { 189203, false },
    +  { 188991, true },
    +  { 189003, true },
    +  { 189023, true },
    +  { 189033, true },
    +  { 189044, true },
    +  { 189059, true },
    +  { 189073, true },
    +  { 189088, true },
    +  { 189103, true },
    +  { 189115, true },
    +  { 189127, true },
    +  { 189145, true },
    +  { 189156, true },
    +  { 189166, true },
    +  { 189178, true },
    +  { 189193, true },
       { 189212, true },
    -  { 189226, true },
    -  { 189242, true },
    -  { 189266, true },
    -  { 189284, true },
    -  { 189295, true },
    -  { 189307, false },
    -  { 189322, true },
    -  { 189332, true },
    -  { 189344, true },
    -  { 189364, true },
    -  { 189374, true },
    -  { 189385, true },
    -  { 189395, true },
    -  { 189410, true },
    -  { 189424, true },
    -  { 189439, true },
    -  { 189454, true },
    -  { 189466, true },
    -  { 189478, true },
    -  { 189496, true },
    -  { 189507, true },
    -  { 189517, true },
    -  { 189529, true },
    -  { 189544, true },
    -  { 189563, true },
    -  { 189578, true },
    -  { 189590, true },
    -  { 189601, true },
    -  { 189623, true },
    -  { 189639, true },
    -  { 189648, true },
    -  { 189656, true },
    -  { 189664, true },
    -  { 189677, true },
    -  { 189689, true },
    -  { 189701, true },
    -  { 189709, true },
    -  { 189724, true },
    -  { 189734, true },
    -  { 189742, true },
    -  { 189751, true },
    -  { 189760, true },
    -  { 189769, true },
    -  { 189782, true },
    -  { 189791, true },
    -  { 189802, true },
    -  { 189816, true },
    -  { 189828, true },
    -  { 189841, true },
    -  { 189849, false },
    -  { 189861, true },
    -  { 189875, true },
    -  { 189887, true },
    -  { 189894, true },
    -  { 189902, true },
    -  { 189912, true },
    -  { 189921, true },
    -  { 189934, true },
    -  { 189939, true },
    -  { 189949, true },
    -  { 189956, true },
    -  { 189963, false },
    -  { 189982, true },
    +  { 189227, true },
    +  { 189239, true },
    +  { 189250, true },
    +  { 189272, true },
    +  { 189288, true },
    +  { 189297, true },
    +  { 189305, true },
    +  { 189313, true },
    +  { 189326, true },
    +  { 189338, true },
    +  { 189350, true },
    +  { 189358, true },
    +  { 189373, true },
    +  { 189383, true },
    +  { 189391, true },
    +  { 189400, true },
    +  { 189409, true },
    +  { 189418, true },
    +  { 189431, true },
    +  { 189440, true },
    +  { 189451, true },
    +  { 189465, true },
    +  { 189477, true },
    +  { 189490, true },
    +  { 189498, false },
    +  { 189510, true },
    +  { 189524, true },
    +  { 189536, true },
    +  { 189543, true },
    +  { 189551, true },
    +  { 189561, true },
    +  { 189570, true },
    +  { 189583, true },
    +  { 189588, true },
    +  { 189598, true },
    +  { 189605, true },
    +  { 189612, false },
    +  { 189631, true },
    +  { 189647, true },
    +  { 189662, true },
    +  { 189678, true },
    +  { 189693, true },
    +  { 189706, true },
    +  { 189719, true },
    +  { 189727, true },
    +  { 189740, true },
    +  { 189753, false },
    +  { 189770, true },
    +  { 189778, true },
    +  { 189787, true },
    +  { 189800, true },
    +  { 189812, true },
    +  { 189842, true },
    +  { 189853, true },
    +  { 189871, true },
    +  { 189879, true },
    +  { 189903, true },
    +  { 189915, true },
    +  { 189933, true },
    +  { 189942, true },
    +  { 189954, true },
    +  { 189962, true },
    +  { 189969, true },
    +  { 189977, true },
    +  { 189988, true },
       { 189998, true },
    -  { 190013, true },
    -  { 190029, true },
    -  { 190044, true },
    -  { 190057, true },
    -  { 190070, true },
    -  { 190078, true },
    -  { 190091, true },
    -  { 190104, false },
    -  { 190121, true },
    -  { 190129, true },
    -  { 190138, true },
    -  { 190151, true },
    -  { 190163, true },
    -  { 190193, true },
    -  { 190204, true },
    -  { 190222, true },
    +  { 190007, true },
    +  { 190019, true },
    +  { 190027, true },
    +  { 190052, true },
    +  { 190064, true },
    +  { 190084, true },
    +  { 190106, true },
    +  { 190117, true },
    +  { 190128, false },
    +  { 190143, true },
    +  { 190161, true },
    +  { 190174, true },
    +  { 190190, true },
    +  { 190208, true },
    +  { 190218, true },
       { 190230, true },
    +  { 190242, true },
       { 190254, true },
    -  { 190266, true },
    -  { 190284, true },
    -  { 190293, true },
    -  { 190305, true },
    -  { 190313, true },
    -  { 190320, true },
    -  { 190328, true },
    -  { 190339, true },
    -  { 190349, true },
    -  { 190358, true },
    -  { 190370, true },
    -  { 190378, true },
    -  { 190403, true },
    -  { 190415, true },
    -  { 190435, true },
    -  { 190457, true },
    -  { 190468, true },
    -  { 190479, false },
    -  { 190494, true },
    -  { 190512, true },
    +  { 190265, true },
    +  { 190277, true },
    +  { 190290, true },
    +  { 190303, true },
    +  { 190315, true },
    +  { 190327, true },
    +  { 190338, false },
    +  { 190348, true },
    +  { 190359, true },
    +  { 190374, true },
    +  { 190387, true },
    +  { 190398, true },
    +  { 190408, true },
    +  { 190422, true },
    +  { 190434, true },
    +  { 190450, true },
    +  { 190465, true },
    +  { 190478, true },
    +  { 190490, true },
    +  { 190503, true },
    +  { 190510, true },
       { 190525, true },
    -  { 190541, true },
    -  { 190559, true },
    -  { 190569, true },
    -  { 190581, true },
    -  { 190593, true },
    -  { 190605, true },
    -  { 190616, true },
    -  { 190628, true },
    -  { 190641, true },
    -  { 190654, true },
    -  { 190666, true },
    -  { 190678, true },
    -  { 190689, false },
    -  { 190699, true },
    -  { 190710, true },
    -  { 190725, true },
    -  { 190738, true },
    -  { 190749, true },
    -  { 190760, true },
    -  { 190770, true },
    -  { 190784, true },
    -  { 190796, true },
    -  { 190812, true },
    -  { 190827, true },
    -  { 190840, true },
    -  { 190852, true },
    -  { 190865, true },
    +  { 190537, true },
    +  { 190546, true },
    +  { 190558, true },
    +  { 190566, true },
    +  { 190575, false },
    +  { 190583, true },
    +  { 190594, true },
    +  { 190602, true },
    +  { 190613, true },
    +  { 190624, true },
    +  { 190639, true },
    +  { 190656, false },
    +  { 190668, true },
    +  { 190687, true },
    +  { 190705, true },
    +  { 190717, true },
    +  { 190731, true },
    +  { 190741, true },
    +  { 190748, true },
    +  { 190759, true },
    +  { 190769, true },
    +  { 190775, true },
    +  { 190790, true },
    +  { 190805, true },
    +  { 190817, true },
    +  { 190824, true },
    +  { 190835, true },
    +  { 190848, true },
       { 190872, true },
    -  { 190887, true },
    -  { 190899, true },
    -  { 190908, true },
    -  { 190920, true },
    -  { 190928, true },
    -  { 190937, false },
    -  { 190945, true },
    -  { 190956, true },
    -  { 190964, true },
    -  { 190975, true },
    -  { 190986, true },
    -  { 191001, true },
    -  { 191018, false },
    -  { 191030, true },
    -  { 191049, true },
    -  { 191067, true },
    -  { 191079, true },
    -  { 191093, true },
    -  { 191103, true },
    -  { 191110, true },
    -  { 191121, true },
    -  { 191131, true },
    +  { 190879, true },
    +  { 190890, true },
    +  { 190901, true },
    +  { 190919, true },
    +  { 190932, true },
    +  { 190947, true },
    +  { 190963, true },
    +  { 190974, true },
    +  { 190990, true },
    +  { 191014, true },
    +  { 191029, true },
    +  { 191039, true },
    +  { 191047, true },
    +  { 191066, true },
    +  { 191077, true },
    +  { 191087, true },
    +  { 191102, true },
    +  { 191112, true },
    +  { 191123, true },
       { 191137, true },
    -  { 191152, true },
    -  { 191167, true },
    -  { 191179, true },
    -  { 191186, true },
    -  { 191197, true },
    -  { 191210, true },
    -  { 191234, true },
    -  { 191241, true },
    -  { 191252, true },
    +  { 191149, true },
    +  { 191163, true },
    +  { 191172, true },
    +  { 191180, true },
    +  { 191193, true },
    +  { 191207, true },
    +  { 191228, true },
    +  { 191238, true },
    +  { 191245, true },
    +  { 191255, true },
       { 191263, true },
    -  { 191281, true },
    -  { 191294, true },
    +  { 191272, true },
    +  { 191285, true },
    +  { 191298, true },
       { 191309, true },
    -  { 191325, true },
    -  { 191336, true },
    -  { 191352, true },
    -  { 191376, true },
    -  { 191391, true },
    -  { 191401, true },
    -  { 191409, true },
    -  { 191428, true },
    -  { 191439, true },
    -  { 191449, true },
    -  { 191464, true },
    -  { 191474, true },
    -  { 191485, true },
    -  { 191499, true },
    -  { 191511, true },
    -  { 191525, true },
    -  { 191534, true },
    -  { 191542, true },
    -  { 191555, true },
    -  { 191569, true },
    -  { 191590, true },
    -  { 191600, true },
    -  { 191607, true },
    -  { 191617, true },
    -  { 191625, true },
    -  { 191634, true },
    -  { 191647, true },
    -  { 191660, true },
    -  { 191671, true },
    -  { 191680, true },
    -  { 191690, true },
    +  { 191318, true },
    +  { 191328, true },
     };
    
    From af354e2cd2c8843b1b34e27fe29c630222ff175c Mon Sep 17 00:00:00 2001
    From: ffxbld 
    Date: Mon, 31 Oct 2016 06:17:02 -0700
    Subject: [PATCH 60/61] No bug, Automated HPKP preload list update from host
     bld-linux64-spot-1051 - a=hpkp-update
    
    ---
     security/manager/ssl/StaticHPKPins.h | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h
    index 88870400b7fb..3f9d7e57d595 100644
    --- a/security/manager/ssl/StaticHPKPins.h
    +++ b/security/manager/ssl/StaticHPKPins.h
    @@ -1164,4 +1164,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
     
     static const int32_t kUnknownId = -1;
     
    -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1486299968306000);
    +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1486386888034000);
    
    From 3d28d5a97460cedb0590b622b954d5646f1d95cb Mon Sep 17 00:00:00 2001
    From: ffxbld 
    Date: Mon, 31 Oct 2016 06:17:04 -0700
    Subject: [PATCH 61/61] No bug, Automated blocklist update from host
     bld-linux64-spot-1051 - a=blocklist-update
    
    ---
     browser/app/blocklist.xml | 224 +++++++++++++++++++-------------------
     1 file changed, 112 insertions(+), 112 deletions(-)
    
    diff --git a/browser/app/blocklist.xml b/browser/app/blocklist.xml
    index 1c6bf152c0f8..ef147f2395bf 100644
    --- a/browser/app/blocklist.xml
    +++ b/browser/app/blocklist.xml
    @@ -1,5 +1,5 @@
     
    -
    +
       
         
           
    @@ -145,10 +145,6 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -157,6 +153,10 @@
             
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -181,11 +181,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -307,14 +307,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -416,14 +416,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -456,6 +456,10 @@
             
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -464,14 +468,6 @@
           
           
         
    -    
    -      
    -      
    -    
    -    
    -      
    -      
    -    
         
           
             browser.startup.homepage
    @@ -479,6 +475,10 @@
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -529,6 +529,10 @@
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -545,10 +549,6 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -678,17 +678,17 @@
           
           
         
    -    
    +    
           
    -      
    +      
         
         
           
           
         
    -    
    +    
           
    -      
    +      
         
         
           
    @@ -714,11 +714,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -750,14 +750,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -818,14 +818,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -859,6 +859,14 @@
           
           
         
    +    
    +      
    +      
    +        
    +          
    +        
    +      
    +    
         
           
             browser.startup.homepage
    @@ -872,14 +880,6 @@
         
           
         
    -    
    -      
    -      
    -        
    -          
    -        
    -      
    -    
         
           
           
    @@ -888,14 +888,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -916,6 +916,11 @@
           
           
         
    +    
    +      
    +      
    +      
    +    
         
           
           
    @@ -924,11 +929,6 @@
           
           
         
    -    
    -      
    -      
    -      
    -    
         
           
           
    @@ -956,11 +956,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1006,14 +1006,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
         
    @@ -1037,11 +1037,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1069,6 +1069,10 @@
           
           
         
    +    
    +      
    +      
    +    
         
           
         
    @@ -1076,10 +1080,6 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -1095,18 +1095,22 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1115,10 +1119,6 @@
             
           
         
    -    
    -      
    -      
    -    
         
           
             browser.startup.homepage
    @@ -1301,14 +1301,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1368,10 +1368,6 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -1384,6 +1380,10 @@
             
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1392,11 +1392,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1450,14 +1450,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1548,11 +1548,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1592,14 +1592,14 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1663,11 +1663,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1675,11 +1675,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1687,11 +1687,11 @@
           
           
         
    -    
    +    
           
           
         
    -    
    +    
           
           
         
    @@ -1801,6 +1801,10 @@
             
           
         
    +    
    +      
    +      
    +    
         
           
           
    @@ -1809,10 +1813,6 @@
             
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -1901,10 +1901,6 @@
           
           
         
    -    
    -      
    -      
    -    
         
           
           
    @@ -1913,6 +1909,10 @@
             
           
         
    +    
    +      
    +      
    +