From 5e5a8867b604ab25e267f7f0a1633502cf08dc55 Mon Sep 17 00:00:00 2001 From: Reminiscent Date: Fri, 10 Apr 2026 17:39:47 +0800 Subject: [PATCH] planner: support rewrite join to apply --- pkg/executor/adapter.go | 2 +- pkg/parser/hintparser.go | 1364 +++++++++-------- pkg/parser/hintparser.y | 3 + pkg/parser/hintparser_test.go | 5 +- pkg/parser/misc.go | 1 + pkg/planner/core/optimizer.go | 1 + pkg/planner/core/planbuilder.go | 3 + pkg/planner/core/rule/logical_rules.go | 1 + pkg/planner/core/rule_join_to_apply.go | 365 +++++ pkg/util/hint/hint.go | 19 +- .../core/casetest/hint/join_to_apply.result | 261 ++++ .../core/casetest/hint/join_to_apply.test | 128 ++ 12 files changed, 1471 insertions(+), 682 deletions(-) create mode 100644 pkg/planner/core/rule_join_to_apply.go create mode 100644 tests/integrationtest/r/planner/core/casetest/hint/join_to_apply.result create mode 100644 tests/integrationtest/t/planner/core/casetest/hint/join_to_apply.test diff --git a/pkg/executor/adapter.go b/pkg/executor/adapter.go index 125ae712a7847..121472220502d 100644 --- a/pkg/executor/adapter.go +++ b/pkg/executor/adapter.go @@ -1923,7 +1923,7 @@ func getEncodedPlan(stmtCtx *stmtctx.StatementContext, genHint bool) (encodedPla switch tableHint.HintName.L { case hint.HintMemoryQuota, hint.HintUseToja, hint.HintNoIndexMerge, hint.HintMaxExecutionTime, hint.HintIgnoreIndex, hint.HintReadFromStorage, - hint.HintMerge, hint.HintSemiJoinRewrite, hint.HintNoDecorrelate: + hint.HintMerge, hint.HintSemiJoinRewrite, hint.HintJoinToApply, hint.HintNoDecorrelate: hints = append(hints, tableHint) } } diff --git a/pkg/parser/hintparser.go b/pkg/parser/hintparser.go index e0b63b234b239..fc8ccab5b5de6 100644 --- a/pkg/parser/hintparser.go +++ b/pkg/parser/hintparser.go @@ -41,18 +41,18 @@ type yyhintXError struct { } const ( - yyhintDefault = 57437 + yyhintDefault = 57438 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57380 hintBCJoin = 57403 hintBKA = 57355 hintBNL = 57357 - hintDupsWeedOut = 57433 - hintFalse = 57429 - hintFirstMatch = 57434 + hintDupsWeedOut = 57434 + hintFalse = 57430 + hintFirstMatch = 57435 hintForceIndex = 57419 - hintGB = 57432 + hintGB = 57433 hintHashAgg = 57383 hintHashJoin = 57359 hintHashJoinBuild = 57360 @@ -75,12 +75,13 @@ const ( hintJoinOrder = 57352 hintJoinPrefix = 57353 hintJoinSuffix = 57354 + hintJoinToApply = 57423 hintLeading = 57421 hintLimitToCop = 57418 - hintLooseScan = 57435 - hintMB = 57431 + hintLooseScan = 57436 + hintMB = 57432 hintMRR = 57367 - hintMaterialization = 57436 + hintMaterialization = 57437 hintMaxExecutionTime = 57375 hintMemoryQuota = 57396 hintMerge = 57363 @@ -88,7 +89,7 @@ const ( hintMpp2PhaseAgg = 57385 hintNoBKA = 57356 hintNoBNL = 57358 - hintNoDecorrelate = 57423 + hintNoDecorrelate = 57424 hintNoHashJoin = 57362 hintNoICP = 57369 hintNoIndexHashJoin = 57391 @@ -105,10 +106,10 @@ const ( hintNoSkipScan = 57372 hintNoSwapJoinInputs = 57397 hintNthPlan = 57417 - hintOLAP = 57424 - hintOLTP = 57425 + hintOLAP = 57425 + hintOLTP = 57426 hintOrderIndex = 57409 - hintPartition = 57426 + hintPartition = 57427 hintQBName = 57378 hintQueryType = 57398 hintReadConsistentReplica = 57399 @@ -125,10 +126,10 @@ const ( hintStreamAgg = 57405 hintStringLit = 57350 hintSwapJoinInputs = 57406 - hintTiFlash = 57428 - hintTiKV = 57427 + hintTiFlash = 57429 + hintTiKV = 57428 hintTimeRange = 57415 - hintTrue = 57430 + hintTrue = 57431 hintUseCascades = 57416 hintUseIndex = 57408 hintUseIndexMerge = 57407 @@ -137,149 +138,150 @@ const ( hintWriteSlowLog = 57382 yyhintMaxDepth = 200 - yyhintTabOfs = -225 + yyhintTabOfs = -227 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (166x) - 57380: 1, // hintAggToCop (156x) - 57403: 2, // hintBCJoin (156x) - 57355: 3, // hintBKA (156x) - 57357: 4, // hintBNL (156x) - 57419: 5, // hintForceIndex (156x) - 57383: 6, // hintHashAgg (156x) - 57359: 7, // hintHashJoin (156x) - 57360: 8, // hintHashJoinBuild (156x) - 57361: 9, // hintHashJoinProbe (156x) - 57379: 10, // hintHypoIndex (156x) - 57347: 11, // hintIdentifier (156x) - 57386: 12, // hintIgnoreIndex (156x) - 57381: 13, // hintIgnorePlanCache (156x) - 57390: 14, // hintIndexHashJoin (156x) - 57387: 15, // hintIndexJoin (156x) - 57411: 16, // hintIndexLookUpPushDown (156x) - 57365: 17, // hintIndexMerge (156x) - 57394: 18, // hintIndexMergeJoin (156x) - 57389: 19, // hintInlHashJoin (156x) - 57392: 20, // hintInlJoin (156x) - 57393: 21, // hintInlMergeJoin (156x) - 57351: 22, // hintJoinFixedOrder (156x) - 57352: 23, // hintJoinOrder (156x) - 57353: 24, // hintJoinPrefix (156x) - 57354: 25, // hintJoinSuffix (156x) - 57421: 26, // hintLeading (156x) - 57418: 27, // hintLimitToCop (156x) - 57375: 28, // hintMaxExecutionTime (156x) - 57396: 29, // hintMemoryQuota (156x) - 57363: 30, // hintMerge (156x) - 57384: 31, // hintMpp1PhaseAgg (156x) - 57385: 32, // hintMpp2PhaseAgg (156x) - 57367: 33, // hintMRR (156x) - 57356: 34, // hintNoBKA (156x) - 57358: 35, // hintNoBNL (156x) - 57423: 36, // hintNoDecorrelate (156x) - 57362: 37, // hintNoHashJoin (156x) - 57369: 38, // hintNoICP (156x) - 57391: 39, // hintNoIndexHashJoin (156x) - 57388: 40, // hintNoIndexJoin (156x) - 57412: 41, // hintNoIndexLookUpPushDown (156x) - 57366: 42, // hintNoIndexMerge (156x) - 57395: 43, // hintNoIndexMergeJoin (156x) - 57364: 44, // hintNoMerge (156x) - 57368: 45, // hintNoMRR (156x) - 57410: 46, // hintNoOrderIndex (156x) - 57370: 47, // hintNoRangeOptimization (156x) - 57374: 48, // hintNoSemijoin (156x) - 57372: 49, // hintNoSkipScan (156x) - 57402: 50, // hintNoSMJoin (156x) - 57397: 51, // hintNoSwapJoinInputs (156x) - 57417: 52, // hintNthPlan (156x) - 57409: 53, // hintOrderIndex (156x) - 57378: 54, // hintQBName (156x) - 57398: 55, // hintQueryType (156x) - 57399: 56, // hintReadConsistentReplica (156x) - 57400: 57, // hintReadFromStorage (156x) - 57377: 58, // hintResourceGroup (156x) - 57373: 59, // hintSemijoin (156x) - 57422: 60, // hintSemiJoinRewrite (156x) - 57376: 61, // hintSetVar (156x) - 57404: 62, // hintShuffleJoin (156x) - 57371: 63, // hintSkipScan (156x) - 57401: 64, // hintSMJoin (156x) - 57420: 65, // hintStraightJoin (156x) - 57405: 66, // hintStreamAgg (156x) - 57406: 67, // hintSwapJoinInputs (156x) - 57415: 68, // hintTimeRange (156x) - 57416: 69, // hintUseCascades (156x) - 57408: 70, // hintUseIndex (156x) - 57407: 71, // hintUseIndexMerge (156x) - 57413: 72, // hintUsePlanCache (156x) - 57414: 73, // hintUseToja (156x) - 57382: 74, // hintWriteSlowLog (156x) - 44: 75, // ',' (150x) - 57433: 76, // hintDupsWeedOut (128x) - 57434: 77, // hintFirstMatch (128x) - 57435: 78, // hintLooseScan (128x) - 57436: 79, // hintMaterialization (128x) - 57428: 80, // hintTiFlash (128x) - 57427: 81, // hintTiKV (128x) - 57429: 82, // hintFalse (127x) - 57424: 83, // hintOLAP (127x) - 57425: 84, // hintOLTP (127x) - 57430: 85, // hintTrue (127x) - 57432: 86, // hintGB (126x) - 57431: 87, // hintMB (126x) - 57349: 88, // hintSingleAtIdentifier (107x) - 57346: 89, // hintIntLit (104x) - 93: 90, // ']' (97x) - 46: 91, // '.' (96x) - 57426: 92, // hintPartition (91x) - 61: 93, // '=' (88x) - 40: 94, // '(' (82x) - 57344: 95, // $end (30x) - 57457: 96, // QueryBlockOpt (21x) - 57449: 97, // Identifier (18x) - 57350: 98, // hintStringLit (6x) - 57439: 99, // CommaOpt (5x) - 57445: 100, // HintTable (4x) - 57446: 101, // HintTableList (4x) - 91: 102, // '[' (3x) - 43: 103, // '+' (2x) - 45: 104, // '-' (2x) - 57438: 105, // BooleanHintName (2x) - 57440: 106, // HintIndexList (2x) - 57442: 107, // HintStorageType (2x) - 57443: 108, // HintStorageTypeAndTable (2x) - 57447: 109, // HintTableListOpt (2x) - 57452: 110, // JoinOrderOptimizerHintName (2x) - 57453: 111, // NullaryHintName (2x) - 57455: 112, // PartitionList (2x) - 57456: 113, // PartitionListOpt (2x) - 57459: 114, // StorageOptimizerHintOpt (2x) - 57460: 115, // SubqueryOptimizerHintName (2x) - 57463: 116, // SubqueryStrategy (2x) - 57464: 117, // SupportedIndexLevelOptimizerHintName (2x) - 57465: 118, // SupportedTableLevelOptimizerHintName (2x) - 57466: 119, // TableOptimizerHintOpt (2x) - 57468: 120, // UnsupportedIndexLevelOptimizerHintName (2x) - 57469: 121, // UnsupportedTableLevelOptimizerHintName (2x) - 57470: 122, // Value (2x) - 57471: 123, // ViewName (2x) - 57441: 124, // HintQueryType (1x) - 57444: 125, // HintStorageTypeAndTableList (1x) - 57448: 126, // HintTrueOrFalse (1x) - 57450: 127, // IndexNameList (1x) - 57451: 128, // IndexNameListOpt (1x) - 57454: 129, // OptimizerHintList (1x) - 57458: 130, // Start (1x) - 57461: 131, // SubqueryStrategies (1x) - 57462: 132, // SubqueryStrategiesOpt (1x) - 57467: 133, // UnitOfBytes (1x) - 57472: 134, // ViewNameList (1x) - 57437: 135, // $default (0x) - 57345: 136, // error (0x) - 57348: 137, // hintInvalid (0x) + 41: 0, // ')' (167x) + 57380: 1, // hintAggToCop (157x) + 57403: 2, // hintBCJoin (157x) + 57355: 3, // hintBKA (157x) + 57357: 4, // hintBNL (157x) + 57419: 5, // hintForceIndex (157x) + 57383: 6, // hintHashAgg (157x) + 57359: 7, // hintHashJoin (157x) + 57360: 8, // hintHashJoinBuild (157x) + 57361: 9, // hintHashJoinProbe (157x) + 57379: 10, // hintHypoIndex (157x) + 57347: 11, // hintIdentifier (157x) + 57386: 12, // hintIgnoreIndex (157x) + 57381: 13, // hintIgnorePlanCache (157x) + 57390: 14, // hintIndexHashJoin (157x) + 57387: 15, // hintIndexJoin (157x) + 57411: 16, // hintIndexLookUpPushDown (157x) + 57365: 17, // hintIndexMerge (157x) + 57394: 18, // hintIndexMergeJoin (157x) + 57389: 19, // hintInlHashJoin (157x) + 57392: 20, // hintInlJoin (157x) + 57393: 21, // hintInlMergeJoin (157x) + 57351: 22, // hintJoinFixedOrder (157x) + 57352: 23, // hintJoinOrder (157x) + 57353: 24, // hintJoinPrefix (157x) + 57354: 25, // hintJoinSuffix (157x) + 57423: 26, // hintJoinToApply (157x) + 57421: 27, // hintLeading (157x) + 57418: 28, // hintLimitToCop (157x) + 57375: 29, // hintMaxExecutionTime (157x) + 57396: 30, // hintMemoryQuota (157x) + 57363: 31, // hintMerge (157x) + 57384: 32, // hintMpp1PhaseAgg (157x) + 57385: 33, // hintMpp2PhaseAgg (157x) + 57367: 34, // hintMRR (157x) + 57356: 35, // hintNoBKA (157x) + 57358: 36, // hintNoBNL (157x) + 57424: 37, // hintNoDecorrelate (157x) + 57362: 38, // hintNoHashJoin (157x) + 57369: 39, // hintNoICP (157x) + 57391: 40, // hintNoIndexHashJoin (157x) + 57388: 41, // hintNoIndexJoin (157x) + 57412: 42, // hintNoIndexLookUpPushDown (157x) + 57366: 43, // hintNoIndexMerge (157x) + 57395: 44, // hintNoIndexMergeJoin (157x) + 57364: 45, // hintNoMerge (157x) + 57368: 46, // hintNoMRR (157x) + 57410: 47, // hintNoOrderIndex (157x) + 57370: 48, // hintNoRangeOptimization (157x) + 57374: 49, // hintNoSemijoin (157x) + 57372: 50, // hintNoSkipScan (157x) + 57402: 51, // hintNoSMJoin (157x) + 57397: 52, // hintNoSwapJoinInputs (157x) + 57417: 53, // hintNthPlan (157x) + 57409: 54, // hintOrderIndex (157x) + 57378: 55, // hintQBName (157x) + 57398: 56, // hintQueryType (157x) + 57399: 57, // hintReadConsistentReplica (157x) + 57400: 58, // hintReadFromStorage (157x) + 57377: 59, // hintResourceGroup (157x) + 57373: 60, // hintSemijoin (157x) + 57422: 61, // hintSemiJoinRewrite (157x) + 57376: 62, // hintSetVar (157x) + 57404: 63, // hintShuffleJoin (157x) + 57371: 64, // hintSkipScan (157x) + 57401: 65, // hintSMJoin (157x) + 57420: 66, // hintStraightJoin (157x) + 57405: 67, // hintStreamAgg (157x) + 57406: 68, // hintSwapJoinInputs (157x) + 57415: 69, // hintTimeRange (157x) + 57416: 70, // hintUseCascades (157x) + 57408: 71, // hintUseIndex (157x) + 57407: 72, // hintUseIndexMerge (157x) + 57413: 73, // hintUsePlanCache (157x) + 57414: 74, // hintUseToja (157x) + 57382: 75, // hintWriteSlowLog (157x) + 44: 76, // ',' (151x) + 57434: 77, // hintDupsWeedOut (129x) + 57435: 78, // hintFirstMatch (129x) + 57436: 79, // hintLooseScan (129x) + 57437: 80, // hintMaterialization (129x) + 57429: 81, // hintTiFlash (129x) + 57428: 82, // hintTiKV (129x) + 57430: 83, // hintFalse (128x) + 57425: 84, // hintOLAP (128x) + 57426: 85, // hintOLTP (128x) + 57431: 86, // hintTrue (128x) + 57433: 87, // hintGB (127x) + 57432: 88, // hintMB (127x) + 57349: 89, // hintSingleAtIdentifier (108x) + 57346: 90, // hintIntLit (105x) + 93: 91, // ']' (98x) + 46: 92, // '.' (97x) + 57427: 93, // hintPartition (92x) + 61: 94, // '=' (89x) + 40: 95, // '(' (83x) + 57344: 96, // $end (30x) + 57458: 97, // QueryBlockOpt (21x) + 57450: 98, // Identifier (18x) + 57350: 99, // hintStringLit (6x) + 57440: 100, // CommaOpt (5x) + 57446: 101, // HintTable (4x) + 57447: 102, // HintTableList (4x) + 91: 103, // '[' (3x) + 43: 104, // '+' (2x) + 45: 105, // '-' (2x) + 57439: 106, // BooleanHintName (2x) + 57441: 107, // HintIndexList (2x) + 57443: 108, // HintStorageType (2x) + 57444: 109, // HintStorageTypeAndTable (2x) + 57448: 110, // HintTableListOpt (2x) + 57453: 111, // JoinOrderOptimizerHintName (2x) + 57454: 112, // NullaryHintName (2x) + 57456: 113, // PartitionList (2x) + 57457: 114, // PartitionListOpt (2x) + 57460: 115, // StorageOptimizerHintOpt (2x) + 57461: 116, // SubqueryOptimizerHintName (2x) + 57464: 117, // SubqueryStrategy (2x) + 57465: 118, // SupportedIndexLevelOptimizerHintName (2x) + 57466: 119, // SupportedTableLevelOptimizerHintName (2x) + 57467: 120, // TableOptimizerHintOpt (2x) + 57469: 121, // UnsupportedIndexLevelOptimizerHintName (2x) + 57470: 122, // UnsupportedTableLevelOptimizerHintName (2x) + 57471: 123, // Value (2x) + 57472: 124, // ViewName (2x) + 57442: 125, // HintQueryType (1x) + 57445: 126, // HintStorageTypeAndTableList (1x) + 57449: 127, // HintTrueOrFalse (1x) + 57451: 128, // IndexNameList (1x) + 57452: 129, // IndexNameListOpt (1x) + 57455: 130, // OptimizerHintList (1x) + 57459: 131, // Start (1x) + 57462: 132, // SubqueryStrategies (1x) + 57463: 133, // SubqueryStrategiesOpt (1x) + 57468: 134, // UnitOfBytes (1x) + 57473: 135, // ViewNameList (1x) + 57438: 136, // $default (0x) + 57345: 137, // error (0x) + 57348: 138, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -309,6 +311,7 @@ var ( "hintJoinOrder", "hintJoinPrefix", "hintJoinSuffix", + "hintJoinToApply", "hintLeading", "hintLimitToCop", "hintMaxExecutionTime", @@ -425,77 +428,106 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, + {131, 1}, {130, 1}, - {129, 1}, - {129, 3}, - {129, 1}, - {129, 3}, - {119, 4}, - {119, 4}, - {119, 4}, - {119, 4}, - {119, 4}, - {119, 4}, - {119, 5}, - {119, 5}, - {119, 5}, - {119, 6}, - {119, 4}, - {119, 4}, - {119, 6}, - {119, 6}, - {119, 6}, - {119, 5}, - {119, 4}, - {119, 1}, - {119, 5}, - {119, 5}, - {119, 4}, - {119, 6}, - {119, 6}, - {114, 5}, - {125, 1}, - {125, 3}, - {108, 4}, - {96, 0}, - {96, 1}, - {99, 0}, - {99, 1}, - {113, 0}, - {113, 4}, - {112, 1}, - {112, 3}, - {109, 1}, - {109, 1}, - {101, 2}, + {130, 3}, + {130, 1}, + {130, 3}, + {120, 4}, + {120, 4}, + {120, 4}, + {120, 4}, + {120, 4}, + {120, 4}, + {120, 5}, + {120, 5}, + {120, 5}, + {120, 6}, + {120, 4}, + {120, 4}, + {120, 6}, + {120, 6}, + {120, 6}, + {120, 5}, + {120, 4}, + {120, 1}, + {120, 5}, + {120, 5}, + {120, 4}, + {120, 6}, + {120, 6}, + {115, 5}, + {126, 1}, + {126, 3}, + {109, 4}, + {97, 0}, + {97, 1}, + {100, 0}, + {100, 1}, + {114, 0}, + {114, 4}, + {113, 1}, + {113, 3}, + {110, 1}, + {110, 1}, + {102, 2}, + {102, 3}, {101, 3}, - {100, 3}, - {100, 5}, - {134, 3}, - {134, 1}, - {123, 2}, - {123, 1}, - {106, 4}, - {128, 0}, + {101, 5}, + {135, 3}, + {135, 1}, + {124, 2}, + {124, 1}, + {107, 4}, + {129, 0}, + {129, 1}, {128, 1}, - {127, 1}, - {127, 3}, - {132, 0}, + {128, 3}, + {133, 0}, + {133, 1}, {132, 1}, - {131, 1}, - {131, 3}, + {132, 3}, + {123, 1}, + {123, 1}, + {123, 1}, + {123, 2}, + {123, 2}, + {134, 1}, + {134, 1}, + {127, 1}, + {127, 1}, + {111, 1}, + {111, 1}, + {111, 1}, {122, 1}, {122, 1}, {122, 1}, - {122, 2}, - {122, 2}, - {133, 1}, - {133, 1}, - {126, 1}, - {126, 1}, - {110, 1}, - {110, 1}, - {110, 1}, + {122, 1}, + {122, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {119, 1}, + {121, 1}, + {121, 1}, {121, 1}, {121, 1}, {121, 1}, @@ -509,540 +541,516 @@ var ( {118, 1}, {118, 1}, {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {118, 1}, - {120, 1}, - {120, 1}, - {120, 1}, - {120, 1}, - {120, 1}, - {120, 1}, - {120, 1}, - {117, 1}, - {117, 1}, - {117, 1}, - {117, 1}, + {116, 1}, + {116, 1}, {117, 1}, {117, 1}, {117, 1}, {117, 1}, - {115, 1}, - {115, 1}, - {116, 1}, - {116, 1}, - {116, 1}, - {116, 1}, - {105, 1}, - {105, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {124, 1}, - {124, 1}, - {107, 1}, - {107, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, + {106, 1}, + {106, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {125, 1}, + {125, 1}, + {108, 1}, + {108, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [324][]uint16{ + yyhintParseTab = [326][]uint16{ // 0 - {1: 304, 260, 253, 255, 290, 300, 274, 276, 277, 279, 248, 288, 308, 267, 263, 293, 280, 272, 266, 262, 271, 230, 250, 251, 252, 278, 305, 237, 242, 265, 301, 302, 281, 254, 256, 311, 275, 283, 268, 264, 294, 306, 273, 257, 282, 292, 284, 296, 286, 259, 270, 238, 291, 241, 247, 307, 249, 240, 295, 310, 239, 261, 285, 258, 309, 303, 269, 243, 298, 287, 289, 299, 297, 246, 105: 244, 110: 231, 245, 114: 229, 236, 117: 235, 233, 228, 234, 232, 129: 227, 226}, - {95: 225}, - {1: 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 420, 95: 224, 99: 546}, - {1: 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 95: 223}, - {1: 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 95: 221}, + {1: 306, 262, 255, 257, 292, 302, 276, 278, 279, 281, 250, 290, 310, 269, 265, 295, 282, 274, 268, 264, 273, 232, 252, 253, 254, 313, 280, 307, 239, 244, 267, 303, 304, 283, 256, 258, 314, 277, 285, 270, 266, 296, 308, 275, 259, 284, 294, 286, 298, 288, 261, 272, 240, 293, 243, 249, 309, 251, 242, 297, 312, 241, 263, 287, 260, 311, 305, 271, 245, 300, 289, 291, 301, 299, 248, 106: 246, 111: 233, 247, 115: 231, 238, 118: 237, 235, 230, 236, 234, 130: 229, 228}, + {96: 227}, + {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 424, 96: 226, 100: 550}, + {1: 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 96: 225}, + {1: 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 96: 223}, // 5 - {94: 543}, - {94: 540}, - {94: 537}, - {94: 532}, - {94: 529}, + {95: 547}, + {95: 544}, + {95: 541}, + {95: 536}, + {95: 533}, // 10 - {94: 518}, - {94: 506}, - {94: 502}, - {94: 498}, - {94: 493}, + {95: 522}, + {95: 510}, + {95: 506}, + {95: 502}, + {95: 497}, // 15 - {94: 490}, - {94: 478}, - {94: 471}, - {94: 466}, - {94: 460}, + {95: 494}, + {95: 482}, + {95: 475}, + {95: 470}, + {95: 464}, // 20 - {94: 457}, - {1: 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 95: 202}, - {94: 451}, - {94: 431}, - {94: 312}, + {95: 461}, + {1: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 96: 204}, + {95: 455}, + {95: 435}, + {95: 315}, // 25 - {94: 156}, - {94: 155}, - {94: 154}, - {94: 153}, - {94: 152}, + {95: 158}, + {95: 157}, + {95: 156}, + {95: 155}, + {95: 154}, // 30 - {94: 151}, - {94: 150}, - {94: 149}, - {94: 148}, - {94: 147}, + {95: 153}, + {95: 152}, + {95: 151}, + {95: 150}, + {95: 149}, // 35 - {94: 146}, - {94: 145}, - {94: 144}, - {94: 143}, - {94: 142}, + {95: 148}, + {95: 147}, + {95: 146}, + {95: 145}, + {95: 144}, // 40 - {94: 141}, - {94: 140}, - {94: 139}, - {94: 138}, - {94: 137}, + {95: 143}, + {95: 142}, + {95: 141}, + {95: 140}, + {95: 139}, // 45 - {94: 136}, - {94: 135}, - {94: 134}, - {94: 133}, - {94: 132}, + {95: 138}, + {95: 137}, + {95: 136}, + {95: 135}, + {95: 134}, // 50 - {94: 131}, - {94: 130}, - {94: 129}, - {94: 128}, - {94: 127}, + {95: 133}, + {95: 132}, + {95: 131}, + {95: 130}, + {95: 129}, // 55 - {94: 126}, - {94: 125}, - {94: 124}, - {94: 123}, - {94: 122}, + {95: 128}, + {95: 127}, + {95: 126}, + {95: 125}, + {95: 124}, // 60 - {94: 121}, - {94: 120}, - {94: 119}, - {94: 118}, - {94: 117}, + {95: 123}, + {95: 122}, + {95: 121}, + {95: 120}, + {95: 119}, // 65 - {94: 116}, - {94: 115}, - {94: 114}, - {94: 113}, - {94: 112}, + {95: 118}, + {95: 117}, + {95: 116}, + {95: 115}, + {95: 114}, // 70 - {94: 111}, - {94: 110}, - {94: 105}, - {94: 104}, - {94: 103}, + {95: 113}, + {95: 112}, + {95: 107}, + {95: 106}, + {95: 105}, // 75 - {94: 102}, - {94: 101}, - {94: 100}, - {94: 99}, - {94: 98}, + {95: 104}, + {95: 103}, + {95: 102}, + {95: 101}, + {95: 100}, // 80 - {94: 97}, - {94: 96}, - {94: 95}, - {94: 94}, - {94: 93}, + {95: 99}, + {95: 98}, + {95: 97}, + {95: 96}, + {95: 95}, // 85 - {94: 92}, - {94: 91}, - {80: 192, 192, 88: 314, 96: 313}, - {80: 319, 318, 107: 317, 316, 125: 315}, - {191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 89: 191, 191, 191, 191}, + {95: 94}, + {95: 93}, + {95: 92}, + {81: 194, 194, 89: 317, 97: 316}, + {81: 322, 321, 108: 320, 319, 126: 318}, // 90 - {428, 75: 429}, - {195, 75: 195}, - {102: 320}, - {102: 88}, - {102: 87}, + {193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 90: 193, 193, 193, 193}, + {432, 76: 433}, + {197, 76: 197}, + {103: 323}, + {103: 89}, // 95 - {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 322, 101: 321}, - {75: 426, 90: 425}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 324, 100: 323}, - {182, 75: 182, 90: 182}, - {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 90: 192, 412, 192, 96: 411}, + {103: 88}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 325, 102: 324}, + {76: 430, 91: 429}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 327, 101: 326}, + {184, 76: 184, 91: 184}, // 100 - {86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86}, - {85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85}, - {84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84}, - {83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83}, - {82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82}, + {194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 91: 194, 416, 194, 97: 415}, + {87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87}, + {86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86}, + {85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85}, + {84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84}, // 105 - {81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81}, - {80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, - {79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, - {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78}, - {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77}, + {83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83}, + {82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82}, + {81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81}, + {80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, + {79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, // 110 - {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76}, - {75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75}, - {74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}, - {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, - {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, + {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78}, + {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77}, + {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76}, + {75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75}, + {74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}, // 115 - {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, - {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, - {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, - {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, - {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, + {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, + {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, // 120 - {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, // 125 - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, // 130 - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, // 135 - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, // 140 - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, // 145 - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, // 150 - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, // 155 - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, // 160 - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, // 165 - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, // 170 - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, // 175 - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, // 180 - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, // 185 - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 90: 188, 92: 415, 113: 424}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 413}, - {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 90: 192, 92: 192, 96: 414}, - {188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 90: 188, 92: 415, 113: 416}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 91: 190, 93: 419, 114: 428}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 417}, // 190 - {94: 417}, - {179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 90: 179}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 419, 112: 418}, - {421, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 420, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 99: 422}, - {186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186}, + {194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 91: 194, 93: 194, 97: 418}, + {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 91: 190, 93: 419, 114: 420}, + {95: 421}, + {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 91: 181}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 423, 113: 422}, // 195 - {189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 76: 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 89: 189, 98: 189}, - {187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 90: 187}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 423}, - {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 89: 185}, - {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 90: 180}, + {425, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 424, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 100: 426}, + {188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188}, + {191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 77: 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 90: 191, 99: 191}, + {189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 91: 189}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 427}, // 200 - {193, 75: 193}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 324, 100: 427}, - {181, 75: 181, 90: 181}, - {1: 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 95: 196}, - {80: 319, 318, 107: 317, 430}, + {187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 90: 187}, + {182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 91: 182}, + {195, 76: 195}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 327, 101: 431}, + {183, 76: 183, 91: 183}, // 205 - {194, 75: 194}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 314, 192, 96: 432, 434, 112: 433}, - {89: 449}, - {445, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 420, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 89: 190, 99: 446}, - {186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 89: 186, 93: 435}, + {1: 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 96: 198}, + {81: 322, 321, 108: 320, 434}, + {196, 76: 196}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 317, 194, 97: 436, 438, 113: 437}, + {90: 453}, // 210 - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 89: 439, 97: 438, 437, 103: 440, 441, 122: 436}, - {444}, + {449, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 424, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 90: 192, 100: 450}, + {188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 90: 188, 94: 439}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 90: 443, 98: 442, 441, 104: 444, 445, 123: 440}, + {448}, + {167}, + // 215 + {166}, {165}, - {164}, + {90: 447}, + {90: 446}, {163}, - // 215 - {89: 443}, - {89: 442}, - {161}, - {162}, - {1: 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 95: 197}, // 220 - {1: 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 95: 199}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 89: 447, 97: 423}, - {448}, - {1: 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 95: 198}, - {450}, + {164}, + {1: 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 96: 199}, + {1: 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 96: 201}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 90: 451, 98: 427}, + {452}, // 225 - {1: 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 95: 200}, - {83: 192, 192, 88: 314, 96: 452}, - {83: 454, 455, 124: 453}, - {456}, - {90}, + {1: 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 96: 200}, + {454}, + {1: 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 96: 202}, + {84: 194, 194, 89: 317, 97: 456}, + {84: 458, 459, 125: 457}, // 230 - {89}, - {1: 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 95: 201}, - {192, 88: 314, 96: 458}, - {459}, - {1: 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 95: 203}, + {460}, + {91}, + {90}, + {1: 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 96: 203}, + {194, 89: 317, 97: 462}, // 235 - {82: 192, 85: 192, 88: 314, 96: 461}, - {82: 464, 85: 463, 126: 462}, - {465}, - {158}, - {157}, + {463}, + {1: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 96: 205}, + {83: 194, 86: 194, 89: 317, 97: 465}, + {83: 468, 86: 467, 127: 466}, + {469}, // 240 - {1: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 95: 204}, - {98: 467}, - {75: 420, 98: 190, 468}, - {98: 469}, - {470}, - // 245 - {1: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 95: 205}, - {88: 314, 192, 96: 472}, - {89: 473}, - {86: 476, 475, 133: 474}, - {477}, - // 250 {160}, {159}, - {1: 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 95: 206}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 479}, - {480, 75: 481}, + {1: 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 96: 206}, + {99: 471}, + {76: 424, 99: 192, 472}, + // 245 + {99: 473}, + {474}, + {1: 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 96: 207}, + {89: 317, 194, 97: 476}, + {90: 477}, + // 250 + {87: 480, 479, 134: 478}, + {481}, + {162}, + {161}, + {1: 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 96: 208}, // 255 - {1: 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 95: 208}, - {192, 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 314, 91: 192, 96: 485, 484, 123: 483, 134: 482}, - {487, 91: 488}, - {177, 91: 177}, - {192, 88: 314, 91: 192, 96: 486}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 483}, + {484, 76: 485}, + {1: 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 96: 210}, + {194, 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 317, 92: 194, 97: 489, 488, 124: 487, 135: 486}, + {491, 92: 492}, // 260 - {175, 91: 175}, - {176, 91: 176}, - {1: 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 95: 207}, - {192, 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 314, 91: 192, 96: 485, 484, 123: 489}, - {178, 91: 178}, + {179, 92: 179}, + {194, 89: 317, 92: 194, 97: 490}, + {177, 92: 177}, + {178, 92: 178}, + {1: 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 96: 209}, // 265 - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 491}, - {492}, - {1: 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 95: 209}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 494}, - {93: 495}, + {194, 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 317, 92: 194, 97: 489, 488, 124: 493}, + {180, 92: 180}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 495}, + {496}, + {1: 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 96: 211}, // 270 - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 89: 439, 97: 438, 437, 103: 440, 441, 122: 496}, - {497}, - {1: 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 95: 210}, - {88: 314, 192, 96: 499}, - {89: 500}, - // 275 + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 498}, + {94: 499}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 90: 443, 98: 442, 441, 104: 444, 445, 123: 500}, {501}, - {1: 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 95: 211}, - {88: 314, 192, 96: 503}, - {89: 504}, + {1: 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 96: 212}, + // 275 + {89: 317, 194, 97: 503}, + {90: 504}, {505}, + {1: 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 96: 213}, + {89: 317, 194, 97: 507}, // 280 - {1: 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 95: 212}, - {192, 76: 192, 192, 192, 192, 88: 314, 96: 507}, - {169, 76: 511, 512, 513, 514, 116: 510, 131: 509, 508}, - {517}, - {168, 75: 515}, + {90: 508}, + {509}, + {1: 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 96: 214}, + {194, 77: 194, 194, 194, 194, 89: 317, 97: 511}, + {171, 77: 515, 516, 517, 518, 117: 514, 132: 513, 512}, // 285 - {167, 75: 167}, - {109, 75: 109}, - {108, 75: 108}, - {107, 75: 107}, - {106, 75: 106}, + {521}, + {170, 76: 519}, + {169, 76: 169}, + {111, 76: 111}, + {110, 76: 110}, // 290 - {76: 511, 512, 513, 514, 116: 516}, - {166, 75: 166}, - {1: 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 95: 213}, - {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 520, 106: 519}, - {528}, + {109, 76: 109}, + {108, 76: 108}, + {77: 515, 516, 517, 518, 117: 520}, + {168, 76: 168}, + {1: 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 96: 215}, // 295 - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 324, 100: 521}, - {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 420, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 99: 522}, - {173, 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 525, 127: 524, 523}, - {174}, - {172, 75: 526}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 524, 107: 523}, + {532}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 327, 101: 525}, + {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 424, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 100: 526}, + {175, 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 529, 128: 528, 527}, // 300 - {171, 75: 171}, - {1: 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 527}, - {170, 75: 170}, - {1: 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 95: 214}, - {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 520, 106: 530}, + {176}, + {174, 76: 530}, + {173, 76: 173}, + {1: 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 531}, + {172, 76: 172}, // 305 - {531}, - {1: 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 95: 215}, - {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 535, 101: 534, 109: 533}, - {536}, - {184, 75: 426}, + {1: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 96: 216}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 524, 107: 534}, + {535}, + {1: 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 96: 217}, + {194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 539, 102: 538, 110: 537}, // 310 - {183, 355, 379, 330, 332, 394, 359, 334, 335, 336, 354, 325, 362, 357, 364, 367, 387, 340, 370, 363, 366, 369, 326, 327, 328, 329, 396, 356, 350, 372, 338, 360, 361, 342, 331, 333, 398, 337, 344, 365, 368, 388, 341, 371, 339, 343, 386, 345, 349, 347, 378, 373, 393, 385, 353, 374, 375, 376, 352, 348, 397, 351, 380, 346, 377, 395, 381, 382, 391, 392, 384, 383, 389, 390, 358, 76: 407, 408, 409, 410, 402, 401, 403, 399, 400, 404, 406, 405, 97: 324, 100: 323}, - {1: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 95: 216}, - {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 535, 101: 534, 109: 538}, - {539}, - {1: 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 95: 217}, + {540}, + {186, 76: 430}, + {185, 358, 382, 333, 335, 397, 362, 337, 338, 339, 357, 328, 365, 360, 367, 370, 390, 343, 373, 366, 369, 372, 329, 330, 331, 332, 401, 399, 359, 353, 375, 341, 363, 364, 345, 334, 336, 402, 340, 347, 368, 371, 391, 344, 374, 342, 346, 389, 348, 352, 350, 381, 376, 396, 388, 356, 377, 378, 379, 355, 351, 400, 354, 383, 349, 380, 398, 384, 385, 394, 395, 387, 386, 392, 393, 361, 77: 411, 412, 413, 414, 406, 405, 407, 403, 404, 408, 410, 409, 98: 327, 101: 326}, + {1: 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 96: 218}, + {194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 539, 102: 538, 110: 542}, // 315 - {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 76: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 314, 96: 322, 101: 541}, - {542, 75: 426}, - {1: 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 95: 218}, - {192, 88: 314, 96: 544}, - {545}, + {543}, + {1: 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 96: 219}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 77: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 317, 97: 325, 102: 545}, + {546, 76: 430}, + {1: 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 96: 220}, // 320 - {1: 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 95: 219}, - {1: 304, 260, 253, 255, 290, 300, 274, 276, 277, 279, 248, 288, 308, 267, 263, 293, 280, 272, 266, 262, 271, 230, 250, 251, 252, 278, 305, 237, 242, 265, 301, 302, 281, 254, 256, 311, 275, 283, 268, 264, 294, 306, 273, 257, 282, 292, 284, 296, 286, 259, 270, 238, 291, 241, 247, 307, 249, 240, 295, 310, 239, 261, 285, 258, 309, 303, 269, 243, 298, 287, 289, 299, 297, 246, 105: 244, 110: 231, 245, 114: 548, 236, 117: 235, 233, 547, 234, 232}, - {1: 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 95: 222}, - {1: 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 95: 220}, + {194, 89: 317, 97: 548}, + {549}, + {1: 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 96: 221}, + {1: 306, 262, 255, 257, 292, 302, 276, 278, 279, 281, 250, 290, 310, 269, 265, 295, 282, 274, 268, 264, 273, 232, 252, 253, 254, 313, 280, 307, 239, 244, 267, 303, 304, 283, 256, 258, 314, 277, 285, 270, 266, 296, 308, 275, 259, 284, 294, 286, 298, 288, 261, 272, 240, 293, 243, 249, 309, 251, 242, 297, 312, 241, 263, 287, 260, 311, 305, 271, 245, 300, 289, 291, 301, 299, 248, 106: 246, 111: 233, 247, 115: 552, 238, 118: 237, 235, 551, 236, 234}, + {1: 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 96: 224}, + // 325 + {1: 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 96: 222}, } ) @@ -1082,7 +1090,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 136 + const yyError = 137 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/pkg/parser/hintparser.y b/pkg/parser/hintparser.y index bac8064baa875..2daf639fc8bb5 100644 --- a/pkg/parser/hintparser.y +++ b/pkg/parser/hintparser.y @@ -126,6 +126,7 @@ import ( hintStraightJoin "STRAIGHT_JOIN" hintLeading "LEADING" hintSemiJoinRewrite "SEMI_JOIN_REWRITE" + hintJoinToApply "JOIN_TO_APPLY" hintNoDecorrelate "NO_DECORRELATE" /* Other keywords */ @@ -705,6 +706,7 @@ NullaryHintName: | "IGNORE_PLAN_CACHE" | "STRAIGHT_JOIN" | "SEMI_JOIN_REWRITE" +| "JOIN_TO_APPLY" | "NO_DECORRELATE" HintQueryType: @@ -791,6 +793,7 @@ Identifier: | "STRAIGHT_JOIN" | "LEADING" | "SEMI_JOIN_REWRITE" +| "JOIN_TO_APPLY" | "NO_DECORRELATE" /* other keywords */ | "OLAP" diff --git a/pkg/parser/hintparser_test.go b/pkg/parser/hintparser_test.go index 1ecbea8cfc50a..51a9543533bd3 100644 --- a/pkg/parser/hintparser_test.go +++ b/pkg/parser/hintparser_test.go @@ -270,7 +270,7 @@ func TestParseHint(t *testing.T) { }, }, { - input: "READ_FROM_STORAGE(@foo TIKV[a, b], TIFLASH[c, d]) HASH_AGG() SEMI_JOIN_REWRITE() READ_FROM_STORAGE(TIKV[e])", + input: "READ_FROM_STORAGE(@foo TIKV[a, b], TIFLASH[c, d]) HASH_AGG() SEMI_JOIN_REWRITE() JOIN_TO_APPLY() READ_FROM_STORAGE(TIKV[e])", output: []*ast.TableOptimizerHint{ { HintName: model.NewCIStr("READ_FROM_STORAGE"), @@ -296,6 +296,9 @@ func TestParseHint(t *testing.T) { { HintName: model.NewCIStr("SEMI_JOIN_REWRITE"), }, + { + HintName: model.NewCIStr("JOIN_TO_APPLY"), + }, { HintName: model.NewCIStr("READ_FROM_STORAGE"), HintData: model.NewCIStr("TIKV"), diff --git a/pkg/parser/misc.go b/pkg/parser/misc.go index f1883a820d3a5..8e307ff8d92da 100644 --- a/pkg/parser/misc.go +++ b/pkg/parser/misc.go @@ -1082,6 +1082,7 @@ var hintTokenMap = map[string]int{ "STRAIGHT_JOIN": hintStraightJoin, "LEADING": hintLeading, "SEMI_JOIN_REWRITE": hintSemiJoinRewrite, + "JOIN_TO_APPLY": hintJoinToApply, "NO_DECORRELATE": hintNoDecorrelate, // TiDB hint aliases diff --git a/pkg/planner/core/optimizer.go b/pkg/planner/core/optimizer.go index f2517c8d4b045..9a4fca4e88609 100644 --- a/pkg/planner/core/optimizer.go +++ b/pkg/planner/core/optimizer.go @@ -88,6 +88,7 @@ var optRuleList = []base.LogicalOptRule{ &MaxMinEliminator{}, &rule.ConstantPropagationSolver{}, &ConvertOuterToInnerJoin{}, + &JoinToApplyRule{}, &PPDSolver{}, &OuterJoinEliminator{}, &PartitionProcessor{}, diff --git a/pkg/planner/core/planbuilder.go b/pkg/planner/core/planbuilder.go index fd4354ac9c525..9b3d934165eef 100644 --- a/pkg/planner/core/planbuilder.go +++ b/pkg/planner/core/planbuilder.go @@ -484,6 +484,9 @@ func (b *PlanBuilder) Init(sctx base.PlanContext, is infoschema.InfoSchema, proc b.hintProcessor = processor b.isForUpdateRead = sctx.GetSessionVars().IsPessimisticReadConsistency() b.noDecorrelate = sctx.GetSessionVars().EnableNoDecorrelateInSelect + if sctx.GetSessionVars().StmtCtx.EnableJoinToApply { + b.optFlag |= rule.FlagJoinToApply + } if savedBlockNames == nil { return b, nil } diff --git a/pkg/planner/core/rule/logical_rules.go b/pkg/planner/core/rule/logical_rules.go index 0d84115b4a87d..1264dfec83ec2 100644 --- a/pkg/planner/core/rule/logical_rules.go +++ b/pkg/planner/core/rule/logical_rules.go @@ -29,6 +29,7 @@ const ( FlagMaxMinEliminate FlagConstantPropagation FlagConvertOuterToInnerJoin + FlagJoinToApply FlagPredicatePushDown FlagEliminateOuterJoin FlagPartitionProcessor diff --git a/pkg/planner/core/rule_join_to_apply.go b/pkg/planner/core/rule_join_to_apply.go new file mode 100644 index 0000000000000..c4f816851d7f0 --- /dev/null +++ b/pkg/planner/core/rule_join_to_apply.go @@ -0,0 +1,365 @@ +// Copyright 2026 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package core + +import ( + "context" + + "github.com/pingcap/tidb/pkg/expression" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/planner/core/base" + "github.com/pingcap/tidb/pkg/planner/core/operator/logicalop" + ruleutil "github.com/pingcap/tidb/pkg/planner/core/rule/util" + planutil "github.com/pingcap/tidb/pkg/planner/util" + "github.com/pingcap/tidb/pkg/planner/util/optimizetrace" + "github.com/pingcap/tidb/pkg/types" +) + +// JoinToApplyRule rewrites a left outer join into apply when a correlated +// predicate can bypass a window barrier on the inner side. +type JoinToApplyRule struct{} + +// correlatableJoinKey keeps the same join key in three coordinate systems: +// at the join boundary, at the window boundary, and at the datasource boundary. +type correlatableJoinKey struct { + eq *expression.ScalarFunction + outerCol *expression.Column + innerCol *expression.Column + resolvedCol *expression.Column + accessCol *expression.Column +} + +type windowBypassPath struct { + window *logicalop.LogicalWindow + partitionCol *expression.Column + accessCol *expression.Column + dataSource *logicalop.DataSource +} + +// Optimize implements base.LogicalOptRule. +func (*JoinToApplyRule) Optimize(_ context.Context, p base.LogicalPlan, _ *optimizetrace.LogicalOptimizeOp) (base.LogicalPlan, bool, error) { + return rewriteJoinToApply(p) +} + +// Name implements base.LogicalOptRule. +func (*JoinToApplyRule) Name() string { + return "join_to_apply" +} + +func rewriteJoinToApply(p base.LogicalPlan) (base.LogicalPlan, bool, error) { + if _, ok := p.(*logicalop.LogicalCTE); ok { + return p, false, nil + } + + // Rewrite bottom-up so child joins are already stabilized when the parent + // checks its own right subtree shape. + planChanged := false + if len(p.Children()) > 0 { + newChildren := make([]base.LogicalPlan, 0, len(p.Children())) + for _, child := range p.Children() { + newChild, childChanged, err := rewriteJoinToApply(child) + if err != nil { + return nil, false, err + } + planChanged = planChanged || childChanged + newChildren = append(newChildren, newChild) + } + p.SetChildren(newChildren...) + } + + join, ok := p.(*logicalop.LogicalJoin) + if !ok { + return p, planChanged, nil + } + + newPlan, changed := tryRewriteJoinToApply(join) + return newPlan, planChanged || changed, nil +} + +func tryRewriteJoinToApply(join *logicalop.LogicalJoin) (base.LogicalPlan, bool) { + if join.JoinType != logicalop.LeftOuterJoin || !join.SCtx().GetSessionVars().StmtCtx.EnableJoinToApply { + return join, false + } + + if containsLogicalCTE(join.Children()[1]) { + // Apply under CTE needs extra builder-time CTE bookkeeping that this + // rule intentionally does not reproduce in the first rollout. + join.SCtx().GetSessionVars().StmtCtx.SetHintWarning("JOIN_TO_APPLY() is inapplicable because the right subtree contains a CTE.") + return join, false + } + + var ( + window *logicalop.LogicalWindow + dataSource *logicalop.DataSource + ) + correlatableKeys := make([]correlatableJoinKey, 0, len(join.EqualConditions)) + remainingKeys := make([]*expression.ScalarFunction, 0, len(join.EqualConditions)) + for _, eq := range join.EqualConditions { + outerCol, innerCol := extractJoinKeyCols(eq, join.Children()[0].Schema(), join.Children()[1].Schema()) + if outerCol == nil || innerCol == nil { + remainingKeys = append(remainingKeys, eq) + continue + } + + trace, ok := traceWindowBypassPath(join.Children()[1], innerCol, false) + if !ok { + remainingKeys = append(remainingKeys, eq) + continue + } + if window == nil { + window = trace.window + dataSource = trace.dataSource + } else if window != trace.window || dataSource != trace.dataSource { + remainingKeys = append(remainingKeys, eq) + continue + } + correlatableKeys = append(correlatableKeys, correlatableJoinKey{ + eq: eq, + outerCol: outerCol, + innerCol: innerCol, + resolvedCol: trace.partitionCol, + accessCol: trace.accessCol, + }) + } + + if len(correlatableKeys) == 0 { + join.SCtx().GetSessionVars().StmtCtx.SetHintWarning("JOIN_TO_APPLY() is inapplicable because no join key matches the window partition columns.") + return join, false + } + if !dataSourceHasUsableTiKVAccessPath(dataSource, correlatableKeys) { + join.SCtx().GetSessionVars().StmtCtx.SetHintWarning("JOIN_TO_APPLY() is inapplicable because the inner datasource has no usable TiKV access path on the correlated key.") + return join, false + } + + apply := logicalop.LogicalApply{ + LogicalJoin: *join, + CorCols: make([]*expression.CorrelatedColumn, 0, len(correlatableKeys)), + }.Init(join.SCtx(), join.QueryBlockOffset()) + apply.SetChildren(join.Children()[0], join.Children()[1]) + // The correlated keys stop being regular join equalities. They will be + // re-attached as right-side correlated filters below. + apply.EqualConditions = remainingKeys + + correlatedConds := make([]expression.Expression, 0, len(correlatableKeys)) + for _, key := range correlatableKeys { + corCol := &expression.CorrelatedColumn{ + Column: *key.outerCol, + Data: new(types.Datum), + } + apply.CorCols = append(apply.CorCols, corCol) + correlatedConds = append(correlatedConds, + expression.NewFunctionInternal(join.SCtx().GetExprCtx(), ast.EQ, types.NewFieldType(mysql.TypeTiny), key.innerCol, corCol)) + } + apply.AttachOnConds(correlatedConds) + ruleutil.BuildKeyInfoPortal(apply) + return apply, true +} + +// traceWindowBypassPath follows an inner-side column through the currently +// supported transparent operators and proves whether it can bypass exactly one +// Window barrier down to a datasource access column. +// +// Stage 1 intentionally keeps the operator set narrow: +// +// Selection / passthrough Projection / Window / DataSource +// +// Future extensions can add more transparent operators here, and can introduce +// more barrier types such as Aggregation or DISTINCT with their own safety +// checks, without changing the rewrite logic above. +func traceWindowBypassPath(p base.LogicalPlan, col *expression.Column, windowSeen bool) (windowBypassPath, bool) { + switch node := p.(type) { + case *logicalop.LogicalSelection: + nextCol := resolveColumnThroughTransparentNode(col, node.Children()[0]) + if nextCol == nil { + return windowBypassPath{}, false + } + return traceWindowBypassPath(node.Children()[0], nextCol, windowSeen) + case *logicalop.LogicalProjection: + nextCol := resolveColumnThroughProjection(col, node) + if nextCol == nil { + return windowBypassPath{}, false + } + return traceWindowBypassPath(node.Children()[0], nextCol, windowSeen) + case *logicalop.LogicalWindow: + // Only one validated barrier is supported in the first stage. + if windowSeen { + return windowBypassPath{}, false + } + partitionSchema := expression.NewSchema(node.GetPartitionByCols()...) + if !partitionSchema.Contains(col) { + return windowBypassPath{}, false + } + nextCol := resolveColumnThroughTransparentNode(col, node.Children()[0]) + if nextCol == nil { + return windowBypassPath{}, false + } + trace, ok := traceWindowBypassPath(node.Children()[0], nextCol, true) + if !ok { + return windowBypassPath{}, false + } + trace.window = node + trace.partitionCol = col + return trace, true + case *logicalop.DataSource: + if !windowSeen { + return windowBypassPath{}, false + } + accessCol := resolveColumnThroughTransparentNode(col, node) + if accessCol == nil { + return windowBypassPath{}, false + } + return windowBypassPath{ + accessCol: accessCol, + dataSource: node, + }, true + default: + // Future extension points: + // - schema-preserving transparent operators such as LogicalSort + // - additional validated barriers such as LogicalAggregation + return windowBypassPath{}, false + } +} + +func containsLogicalCTE(p base.LogicalPlan) bool { + if _, ok := p.(*logicalop.LogicalCTE); ok { + return true + } + for _, child := range p.Children() { + if containsLogicalCTE(child) { + return true + } + } + return false +} + +func extractJoinKeyCols(eq *expression.ScalarFunction, leftSchema, rightSchema *expression.Schema) (*expression.Column, *expression.Column) { + leftCol, leftOK := eq.GetArgs()[0].(*expression.Column) + rightCol, rightOK := eq.GetArgs()[1].(*expression.Column) + if !leftOK || !rightOK { + return nil, nil + } + switch { + case leftSchema.Contains(leftCol) && rightSchema.Contains(rightCol): + return leftCol, rightCol + case leftSchema.Contains(rightCol) && rightSchema.Contains(leftCol): + return rightCol, leftCol + default: + return nil, nil + } +} + +// resolveColumnThroughTransparentNode rebinds a column to the child's schema +// for operators that preserve columns 1:1. +func resolveColumnThroughTransparentNode(col *expression.Column, child base.LogicalPlan) *expression.Column { + return child.Schema().RetrieveColumn(col) +} + +// resolveColumnThroughProjection follows a column through a pure passthrough +// projection. Any computed expression means this key cannot be correlated by +// the current rule. +func resolveColumnThroughProjection(col *expression.Column, proj *logicalop.LogicalProjection) *expression.Column { + idx := proj.Schema().ColumnIndex(col) + if idx < 0 { + return nil + } + nextCol, ok := proj.Exprs[idx].(*expression.Column) + if !ok { + return nil + } + return nextCol +} + +// dataSourceHasUsableTiKVAccessPath checks the already-pruned possible access +// paths instead of raw table metadata, so query-level index hints are respected. +func dataSourceHasUsableTiKVAccessPath(ds *logicalop.DataSource, keys []correlatableJoinKey) bool { + candidateCols := make([]*expression.Column, 0, len(keys)) + for _, key := range keys { + duplicated := false + for _, col := range candidateCols { + if col.EqualColumn(key.accessCol) { + duplicated = true + break + } + } + if !duplicated { + candidateCols = append(candidateCols, key.accessCol) + } + } + for _, path := range ds.PossibleAccessPaths { + if path.StoreType != kv.TiKV { + continue + } + if path.IsTiKVTablePath() && hasHandleAccessPrefix(ds.HandleCols, candidateCols) { + return true + } + if path.Index != nil && hasIndexAccessPrefix(path, candidateCols) { + return true + } + } + return false +} + +func hasHandleAccessPrefix(handleCols planutil.HandleCols, candidateCols []*expression.Column) bool { + if handleCols == nil { + return false + } + for i := 0; i < handleCols.NumCols(); i++ { + if !containsEqualColumn(candidateCols, handleCols.GetCol(i)) { + return false + } + } + return handleCols.NumCols() > 0 +} + +// hasIndexAccessPrefix requires at least one leading index column to be +// constrained by correlated equality before the rewrite is considered. +func hasIndexAccessPrefix(path *planutil.AccessPath, candidateCols []*expression.Column) bool { + idxCols := path.IdxCols + if len(idxCols) == 0 { + idxCols = path.FullIdxCols + } + matchedPrefix := 0 + for _, idxCol := range idxCols { + if idxCol == nil { + break + } + if !containsEqualColumn(candidateCols, idxCol) { + break + } + matchedPrefix++ + } + return matchedPrefix > 0 +} + +func containsEqualColumn(cols []*expression.Column, target *expression.Column) bool { + for _, col := range cols { + if col.EqualColumn(target) { + return true + } + if col.ID > 0 && target.ID > 0 && col.ID == target.ID { + return true + } + // Some logical columns cloned through projection/window expansion no longer + // share UniqueID with the datasource path columns. Restrict the fallback to + // exact OrigName equality against already-pruned PossibleAccessPaths so it + // cannot bypass query-level USE/IGNORE INDEX restrictions. + if col.OrigName != "" && target.OrigName != "" && col.OrigName == target.OrigName { + return true + } + } + return false +} diff --git a/pkg/util/hint/hint.go b/pkg/util/hint/hint.go index 75543d014f67e..3968e3ab013c9 100644 --- a/pkg/util/hint/hint.go +++ b/pkg/util/hint/hint.go @@ -117,6 +117,8 @@ const ( HintMerge = "merge" // HintSemiJoinRewrite is a hint to force we rewrite the semi join operator as much as possible. HintSemiJoinRewrite = "semi_join_rewrite" + // HintJoinToApply is a hint to enable the JoinToApply rewrite for the current statement. + HintJoinToApply = "join_to_apply" // HintNoDecorrelate indicates a LogicalApply not to be decorrelated. HintNoDecorrelate = "no_decorrelate" @@ -217,6 +219,7 @@ type StmtHints struct { AllowInSubqToJoinAndAgg bool NoIndexMergeHint bool StraightJoinOrder bool + EnableJoinToApply bool // EnableCascadesPlanner is use cascades planner for a single query only. EnableCascadesPlanner bool // ForceNthPlan indicates the PlanCounterTp number for finding physical plan. @@ -269,6 +272,7 @@ func (sh *StmtHints) Clone() *StmtHints { AllowInSubqToJoinAndAgg: sh.AllowInSubqToJoinAndAgg, NoIndexMergeHint: sh.NoIndexMergeHint, StraightJoinOrder: sh.StraightJoinOrder, + EnableJoinToApply: sh.EnableJoinToApply, EnableCascadesPlanner: sh.EnableCascadesPlanner, ForceNthPlan: sh.ForceNthPlan, ResourceGroup: sh.ResourceGroup, @@ -308,7 +312,7 @@ func ParseStmtHints(hints []*ast.TableOptimizerHint, } hintOffs := make(map[string]int, len(hints)) var forceNthPlan *ast.TableOptimizerHint - var memoryQuotaHintCnt, useToJAHintCnt, useCascadesHintCnt, noIndexMergeHintCnt, readReplicaHintCnt, maxExecutionTimeCnt, forceNthPlanCnt, straightJoinHintCnt, resourceGroupHintCnt int + var memoryQuotaHintCnt, useToJAHintCnt, useCascadesHintCnt, noIndexMergeHintCnt, readReplicaHintCnt, maxExecutionTimeCnt, forceNthPlanCnt, straightJoinHintCnt, joinToApplyHintCnt, resourceGroupHintCnt int setVars := make(map[string]string) setVarsOffs := make([]int, 0, len(hints)) for i, hint := range hints { @@ -340,6 +344,9 @@ func ParseStmtHints(hints []*ast.TableOptimizerHint, case "straight_join": hintOffs[hint.HintName.L] = i straightJoinHintCnt++ + case HintJoinToApply: + hintOffs[hint.HintName.L] = i + joinToApplyHintCnt++ case HintWriteSlowLog: stmtHints.WriteSlowLog = true case "hypo_index": @@ -464,6 +471,14 @@ func ParseStmtHints(hints []*ast.TableOptimizerHint, } stmtHints.StraightJoinOrder = true } + // Handle JOIN_TO_APPLY + if joinToApplyHintCnt != 0 { + if joinToApplyHintCnt > 1 { + warn := errors.NewNoStackError("JOIN_TO_APPLY() is defined more than once, only the last definition takes effect") + warns = append(warns, warn) + } + stmtHints.EnableJoinToApply = true + } // Handle READ_CONSISTENT_REPLICA if readReplicaHintCnt != 0 { if readReplicaHintCnt > 1 { @@ -520,7 +535,7 @@ func ParseStmtHints(hints []*ast.TableOptimizerHint, // isStmtHint checks whether this hint is a statement-level hint. func isStmtHint(h *ast.TableOptimizerHint) bool { switch h.HintName.L { - case "max_execution_time", "memory_quota", "resource_group": + case "max_execution_time", "memory_quota", "resource_group", HintJoinToApply: return true default: return false diff --git a/tests/integrationtest/r/planner/core/casetest/hint/join_to_apply.result b/tests/integrationtest/r/planner/core/casetest/hint/join_to_apply.result new file mode 100644 index 0000000000000..03869d22e7bbe --- /dev/null +++ b/tests/integrationtest/r/planner/core/casetest/hint/join_to_apply.result @@ -0,0 +1,261 @@ +set tidb_cost_model_version=2; +drop table if exists jt_outer, jt_inner, jt_outer_multi, jt_inner_multi; +create table jt_outer(a int, b int); +create table jt_inner(k int, ts int, v int, index idx_k_ts(k, ts)); +create table jt_outer_multi(a int, b int); +create table jt_inner_multi(a int, b int, ts int, v int, index idx_ab_ts(a, b, ts)); +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.v +└─Apply 10000.00 root CARTESIAN left outer join + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo + └─Selection(Probe) 80000.00 root eq(Column#9, 1) + └─Shuffle 100000.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 100000.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 100000.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 10.00 root + └─IndexLookUp 100000.00 root + ├─IndexRangeScan(Build) 100000.00 cop[tikv] table:i, index:idx_k_ts(k, ts) range: decided by [eq(planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_outer.a)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 100000.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.k)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─Selection(Probe) 7992.00 root eq(Column#9, 1) + └─Shuffle 9990.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 9990.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 9990.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 9990.00 root + └─IndexLookUp 9990.00 root + ├─IndexFullScan(Build) 9990.00 cop[tikv] table:i, index:idx_k_ts(k, ts) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn <= 2 and f.v > 0; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.v +└─Apply 10000.00 root CARTESIAN left outer join + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo + └─Selection(Probe) 80000.00 root gt(planner__core__casetest__hint__join_to_apply.jt_inner.v, 0), le(Column#9, 2) + └─Shuffle 100000.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 100000.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 100000.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 10.00 root + └─IndexLookUp 100000.00 root + ├─IndexRangeScan(Build) 100000.00 cop[tikv] table:i, index:idx_k_ts(k, ts) range: decided by [eq(planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_outer.a)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 100000.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn <= 2 and f.v > 0; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.k)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─Selection(Probe) 7992.00 root gt(planner__core__casetest__hint__join_to_apply.jt_inner.v, 0), le(Column#9, 2) + └─Shuffle 9990.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 9990.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 9990.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 9990.00 root + └─IndexLookUp 9990.00 root + ├─IndexFullScan(Build) 9990.00 cop[tikv] table:i, index:idx_k_ts(k, ts) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +where i.v > 0 +) f on o.a = f.fk and f.rn = 1; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.v +└─Apply 10000.00 root CARTESIAN left outer join + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo + └─Selection(Probe) 26666.67 root eq(Column#9, 1) + └─Shuffle 33333.33 root execution info: concurrency:2, data sources:[IndexLookUp] + └─Window 33333.33 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 33333.33 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 3.33 root + └─IndexLookUp 33333.33 root + ├─IndexRangeScan(Build) 100000.00 cop[tikv] table:i, index:idx_k_ts(k, ts) range: decided by [eq(planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_outer.a)], keep order:false, stats:pseudo + └─Selection(Probe) 33333.33 cop[tikv] gt(planner__core__casetest__hint__join_to_apply.jt_inner.v, 0) + └─TableRowIDScan 100000.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i use index(idx_k_ts) +where i.v > 0 +) f on o.a = f.fk and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.k)] +├─Selection(Build) 2664.00 root eq(Column#9, 1) +│ └─Shuffle 3330.00 root execution info: concurrency:5, data sources:[IndexLookUp] +│ └─Window 3330.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) +│ └─Sort 3330.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc +│ └─ShuffleReceiver 3330.00 root +│ └─IndexLookUp 3330.00 root +│ ├─IndexFullScan(Build) 9990.00 cop[tikv] table:i, index:idx_k_ts(k, ts) keep order:false, stats:pseudo +│ └─Selection(Probe) 3330.00 cop[tikv] gt(planner__core__casetest__hint__join_to_apply.jt_inner.v, 0) +│ └─TableRowIDScan 9990.00 cop[tikv] table:i keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i +) f on o.b = f.v and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer.b, planner__core__casetest__hint__join_to_apply.jt_inner.v)] +├─Selection(Build) 8000.00 root eq(Column#9, 1), not(isnull(planner__core__casetest__hint__join_to_apply.jt_inner.v)) +│ └─Shuffle 10000.00 root execution info: concurrency:5, data sources:[TableReader] +│ └─Window 10000.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) +│ └─Sort 10000.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc +│ └─ShuffleReceiver 10000.00 root +│ └─TableReader 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:i keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1815 JOIN_TO_APPLY() is inapplicable because no join key matches the window partition columns. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( +select i.k as fk, i.v, +row_number() over (partition by i.k order by i.ts desc) as rn +from jt_inner i ignore index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.k)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─Selection(Probe) 7992.00 root eq(Column#9, 1) + └─Shuffle 9990.00 root execution info: concurrency:5, data sources:[TableReader] + └─Window 9990.00 root row_number()->Column#9 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner.k order by planner__core__casetest__hint__join_to_apply.jt_inner.ts desc rows between current row and current row) + └─Sort 9990.00 root planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_inner.ts:desc + └─ShuffleReceiver 9990.00 root + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__hint__join_to_apply.jt_inner.k)) + └─TableFullScan 10000.00 cop[tikv] table:i keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1815 JOIN_TO_APPLY() is inapplicable because the inner datasource has no usable TiKV access path on the correlated key. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer_multi o +left join ( +select i.a as fa, i.b as fb, i.v, +row_number() over (partition by i.a, i.b order by i.ts desc) as rn +from jt_inner_multi i use index(idx_ab_ts) +) f on o.a = f.fa and f.rn = 1; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__hint__join_to_apply.jt_outer_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.v +└─Apply 10000.00 root CARTESIAN left outer join + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo + └─Selection(Probe) 80000.00 root eq(Column#10, 1) + └─Shuffle 100000.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 100000.00 root row_number()->Column#10 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b order by planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts desc rows between current row and current row) + └─Sort 100000.00 root planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b, planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts:desc + └─ShuffleReceiver 10.00 root + └─IndexLookUp 100000.00 root + ├─IndexRangeScan(Build) 100000.00 cop[tikv] table:i, index:idx_ab_ts(a, b, ts) range: decided by [eq(planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_outer_multi.a)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 100000.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select o.a, f.v +from jt_outer_multi o +left join ( +select i.a as fa, i.b as fb, i.v, +row_number() over (partition by i.a, i.b order by i.ts desc) as rn +from jt_inner_multi i use index(idx_ab_ts) +) f on o.a = f.fa and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.a)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─Selection(Probe) 7992.00 root eq(Column#10, 1) + └─Shuffle 9990.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 9990.00 root row_number()->Column#10 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b order by planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts desc rows between current row and current row) + └─Sort 9990.00 root planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b, planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts:desc + └─ShuffleReceiver 9990.00 root + └─IndexLookUp 9990.00 root + ├─IndexFullScan(Build) 9990.00 cop[tikv] table:i, index:idx_ab_ts(a, b, ts) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:i keep order:false, stats:pseudo +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.b, f.v +from jt_outer_multi o +left join ( +select i.a as fa, i.b as fb, i.v, +row_number() over (partition by i.a, i.b order by i.ts desc) as rn +from jt_inner_multi i use index(idx_ab_ts) +) f on o.b = f.fb and f.rn = 1; +id estRows task access object operator info +HashJoin 10000.00 root left outer join, equal:[eq(planner__core__casetest__hint__join_to_apply.jt_outer_multi.b, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─Selection(Probe) 7992.00 root eq(Column#10, 1) + └─Shuffle 9990.00 root execution info: concurrency:5, data sources:[IndexLookUp] + └─Window 9990.00 root row_number()->Column#10 over(partition by planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b order by planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts desc rows between current row and current row) + └─Sort 9990.00 root planner__core__casetest__hint__join_to_apply.jt_inner_multi.a, planner__core__casetest__hint__join_to_apply.jt_inner_multi.b, planner__core__casetest__hint__join_to_apply.jt_inner_multi.ts:desc + └─ShuffleReceiver 9990.00 root + └─IndexLookUp 9990.00 root + ├─Selection(Build) 9990.00 cop[tikv] not(isnull(planner__core__casetest__hint__join_to_apply.jt_inner_multi.b)) + │ └─IndexFullScan 10000.00 cop[tikv] table:i, index:idx_ab_ts(a, b, ts) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:i keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1815 JOIN_TO_APPLY() is inapplicable because the inner datasource has no usable TiKV access path on the correlated key. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.mx +from jt_outer o +left join ( +select i.k as fk, max(i.v) as mx +from jt_inner i use index(idx_k_ts) +group by i.k +) f on o.a = f.fk; +id estRows task access object operator info +IndexJoin 10000.00 root left outer join, inner:HashAgg, outer key:planner__core__casetest__hint__join_to_apply.jt_outer.a, inner key:planner__core__casetest__hint__join_to_apply.jt_inner.k, equal cond:eq(planner__core__casetest__hint__join_to_apply.jt_outer.a, planner__core__casetest__hint__join_to_apply.jt_inner.k) +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:o keep order:false, stats:pseudo +└─HashAgg(Probe) 9990.00 root group by:planner__core__casetest__hint__join_to_apply.jt_inner.k, funcs:max(Column#11)->Column#8, funcs:firstrow(planner__core__casetest__hint__join_to_apply.jt_inner.k)->planner__core__casetest__hint__join_to_apply.jt_inner.k + └─IndexLookUp 9990.00 root + ├─Selection(Build) 9990.00 cop[tikv] not(isnull(planner__core__casetest__hint__join_to_apply.jt_inner.k)) + │ └─IndexRangeScan 10000.00 cop[tikv] table:i, index:idx_k_ts(k, ts) range: decided by [eq(planner__core__casetest__hint__join_to_apply.jt_inner.k, planner__core__casetest__hint__join_to_apply.jt_outer.a)], keep order:false, stats:pseudo + └─HashAgg(Probe) 9990.00 cop[tikv] group by:planner__core__casetest__hint__join_to_apply.jt_inner.k, funcs:max(planner__core__casetest__hint__join_to_apply.jt_inner.v)->Column#11 + └─TableRowIDScan 9990.00 cop[tikv] table:i keep order:false, stats:pseudo diff --git a/tests/integrationtest/t/planner/core/casetest/hint/join_to_apply.test b/tests/integrationtest/t/planner/core/casetest/hint/join_to_apply.test new file mode 100644 index 0000000000000..8bd91364c6396 --- /dev/null +++ b/tests/integrationtest/t/planner/core/casetest/hint/join_to_apply.test @@ -0,0 +1,128 @@ +# TestJoinToApplyHint +set tidb_cost_model_version=2; +drop table if exists jt_outer, jt_inner, jt_outer_multi, jt_inner_multi; +create table jt_outer(a int, b int); +create table jt_inner(k int, ts int, v int, index idx_k_ts(k, ts)); +create table jt_outer_multi(a int, b int); +create table jt_inner_multi(a int, b int, ts int, v int, index idx_ab_ts(a, b, ts)); + +# Eligible window shape: with hint rewrites to Apply; without hint stays as Join. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; + +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; + +# The rewrite does not depend on rn = 1 specifically. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn <= 2 and f.v > 0; + +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) +) f on o.a = f.fk and f.rn <= 2 and f.v > 0; + +# Transparent operators below Window should not block the rewrite. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) + where i.v > 0 +) f on o.a = f.fk and f.rn = 1; + +explain format = 'brief' +select o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i use index(idx_k_ts) + where i.v > 0 +) f on o.a = f.fk and f.rn = 1; + +# Join key does not map to the partition columns, so rewrite is unsafe. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i +) f on o.b = f.v and f.rn = 1; +show warnings; + +# Join key matches the partition column, but IGNORE INDEX removes the usable access path. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer o +left join ( + select i.k as fk, i.v, + row_number() over (partition by i.k order by i.ts desc) as rn + from jt_inner i ignore index(idx_k_ts) +) f on o.a = f.fk and f.rn = 1; +show warnings; + +# Partial partition coverage is still safe when the correlated key hits a leading index prefix. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.v +from jt_outer_multi o +left join ( + select i.a as fa, i.b as fb, i.v, + row_number() over (partition by i.a, i.b order by i.ts desc) as rn + from jt_inner_multi i use index(idx_ab_ts) +) f on o.a = f.fa and f.rn = 1; + +explain format = 'brief' +select o.a, f.v +from jt_outer_multi o +left join ( + select i.a as fa, i.b as fb, i.v, + row_number() over (partition by i.a, i.b order by i.ts desc) as rn + from jt_inner_multi i use index(idx_ab_ts) +) f on o.a = f.fa and f.rn = 1; + +# Safe on semantics, but b alone is not a usable leading access prefix for idx_ab_ts(a, b, ts). +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.b, f.v +from jt_outer_multi o +left join ( + select i.a as fa, i.b as fb, i.v, + row_number() over (partition by i.a, i.b order by i.ts desc) as rn + from jt_inner_multi i use index(idx_ab_ts) +) f on o.b = f.fb and f.rn = 1; +show warnings; + +# Aggregation is a future barrier type; Phase 1 should leave it unchanged. +explain format = 'brief' +select /*+ JOIN_TO_APPLY() */ o.a, f.mx +from jt_outer o +left join ( + select i.k as fk, max(i.v) as mx + from jt_inner i use index(idx_k_ts) + group by i.k +) f on o.a = f.fk;