You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2026/05/16 23:57:32 UTC

(hbase-site) branch asf-site updated: Published site at e45818ee9aeb2c8fb1be72ecf17a5d8584011147.

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 17e7b54da79 Published site at e45818ee9aeb2c8fb1be72ecf17a5d8584011147.
17e7b54da79 is described below

commit 17e7b54da79b8c600a2b5b40ecfdc22bfefb5311
Author: HBase <de...@hbase.apache.org>
AuthorDate: Sat May 16 23:54:11 2026 +0000

    Published site at e45818ee9aeb2c8fb1be72ecf17a5d8584011147.
---
 __spa-fallback.html                                |    4 +-
 acid-semantics/index.html                          |    4 +-
 apidocs/index-all.html                             |   34 +
 apidocs/member-search-index.js                     |    2 +-
 .../org/apache/hadoop/hbase/class-use/Cell.html    |  262 +-
 .../hadoop/hbase/filter/ColumnPrefixFilter.html    |   36 +-
 .../hadoop/hbase/filter/ColumnRangeFilter.html     |   42 +-
 .../hadoop/hbase/filter/Filter.ReturnCode.html     |  216 +-
 .../org/apache/hadoop/hbase/filter/Filter.html     |  216 +-
 .../hadoop/hbase/filter/FilterList.Operator.html   |   58 +-
 .../org/apache/hadoop/hbase/filter/FilterList.html |   58 +-
 .../hadoop/hbase/filter/FilterListWithAND.html     |  692 ++--
 .../hadoop/hbase/filter/FilterListWithOR.html      |   88 +-
 .../hbase/filter/MultipleColumnPrefixFilter.html   |  117 +-
 .../org/apache/hadoop/hbase/filter/SkipFilter.html |   28 +-
 .../hadoop/hbase/filter/WhileMatchFilter.html      |   28 +-
 books/apache-hbase-reference-guide-dark-mode.pdf   |  Bin 38899979 -> 38899979 bytes
 books/apache-hbase-reference-guide.pdf             |  Bin 38790049 -> 38790045 bytes
 checkstyle-aggregate.html                          |  278 +-
 code-of-conduct/index.html                         |    4 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/index-all.html                          |   38 +
 devapidocs/member-search-index.js                  |    2 +-
 .../org/apache/hadoop/hbase/class-use/Cell.html    |  284 +-
 .../hadoop/hbase/filter/ColumnPrefixFilter.html    |   96 +-
 .../hadoop/hbase/filter/ColumnRangeFilter.html     |  106 +-
 .../org/apache/hadoop/hbase/filter/Filter.html     |   34 +-
 .../org/apache/hadoop/hbase/filter/FilterBase.html |   18 +-
 .../org/apache/hadoop/hbase/filter/FilterList.html |  152 +-
 .../hadoop/hbase/filter/FilterListWithAND.html     |  124 +-
 .../hadoop/hbase/filter/FilterListWithOR.html      |   73 +-
 .../apache/hadoop/hbase/filter/FilterWrapper.html  |   18 +-
 .../hbase/filter/MultipleColumnPrefixFilter.html   |  106 +-
 .../org/apache/hadoop/hbase/filter/SkipFilter.html |  140 +-
 .../hadoop/hbase/filter/WhileMatchFilter.html      |  140 +-
 .../hadoop/hbase/filter/ColumnPrefixFilter.html    |   36 +-
 .../hadoop/hbase/filter/ColumnRangeFilter.html     |   42 +-
 .../hadoop/hbase/filter/Filter.ReturnCode.html     |  216 +-
 .../org/apache/hadoop/hbase/filter/Filter.html     |  216 +-
 .../hadoop/hbase/filter/FilterList.Operator.html   |   58 +-
 .../org/apache/hadoop/hbase/filter/FilterList.html |   58 +-
 .../hadoop/hbase/filter/FilterListWithAND.html     |  692 ++--
 .../hadoop/hbase/filter/FilterListWithOR.html      |   88 +-
 .../hbase/filter/MultipleColumnPrefixFilter.html   |  117 +-
 .../org/apache/hadoop/hbase/filter/SkipFilter.html |   28 +-
 .../hadoop/hbase/filter/WhileMatchFilter.html      |   28 +-
 docs/acl-matrix/index.html                         |    6 +-
 docs/amv2/index.html                               |    6 +-
 docs/architecture/bulk-loading/index.html          |    6 +-
 docs/architecture/catalog-tables/index.html        |    6 +-
 .../architecture/client-request-filters/index.html |    6 +-
 docs/architecture/client/index.html                |    6 +-
 docs/architecture/hbase-mob/index.html             |    6 +-
 docs/architecture/hdfs/index.html                  |    6 +-
 docs/architecture/index.html                       |    6 +-
 docs/architecture/master/index.html                |    6 +-
 docs/architecture/overview/index.html              |    6 +-
 docs/architecture/regions/index.html               |    6 +-
 docs/architecture/regionserver/index.html          |    6 +-
 docs/architecture/snapshot-scanner/index.html      |    6 +-
 .../timeline-consistent-reads/index.html           |    6 +-
 docs/asf/index.html                                |    6 +-
 docs/backup-restore/additional-topics/index.html   |    6 +-
 docs/backup-restore/administration/index.html      |    6 +-
 docs/backup-restore/commands/index.html            |    6 +-
 docs/backup-restore/index.html                     |    6 +-
 docs/backup-restore/overview/index.html            |    6 +-
 docs/building-and-developing/announcing/index.html |    6 +-
 docs/building-and-developing/building/index.html   |    6 +-
 .../developer-guidelines/index.html                |    6 +-
 .../generating-documentation/index.html            |    6 +-
 .../getting-involved/index.html                    |    6 +-
 docs/building-and-developing/ides/index.html       |    6 +-
 docs/building-and-developing/index.html            |    6 +-
 docs/building-and-developing/releasing/index.html  |    6 +-
 .../repositories/index.html                        |    6 +-
 docs/building-and-developing/tests/index.html      |    6 +-
 .../updating-landing/index.html                    |    6 +-
 docs/building-and-developing/voting/index.html     |    6 +-
 docs/bulk-data-generator-tool/index.html           |    6 +-
 docs/case-studies/index.html                       |    6 +-
 docs/community/index.html                          |    6 +-
 docs/compression/index.html                        |    6 +-
 docs/configuration/basic-prerequisites/index.html  |    6 +-
 docs/configuration/confirm/index.html              |    6 +-
 docs/configuration/default/index.html              |    6 +-
 docs/configuration/dynamic/index.html              |    6 +-
 docs/configuration/example/index.html              |    6 +-
 docs/configuration/hbase-run-models/index.html     |    6 +-
 docs/configuration/important/index.html            |    6 +-
 docs/configuration/index.html                      |    6 +-
 docs/contributing-to-documentation/index.html      |    6 +-
 docs/cp/index.html                                 |    6 +-
 docs/datamodel/index.html                          |    6 +-
 docs/external-apis/index.html                      |    6 +-
 docs/faq/index.html                                |    6 +-
 docs/getting-started/index.html                    |    6 +-
 docs/hbase-apis/index.html                         |    6 +-
 docs/hbase-history/index.html                      |    6 +-
 docs/hbase-incompatibilities/index.html            |    6 +-
 docs/hbtop/index.html                              |    6 +-
 docs/hfile-format/index.html                       |    6 +-
 docs/index.html                                    |    6 +-
 docs/inmemory-compaction/index.html                |    6 +-
 docs/mapreduce/index.html                          |    6 +-
 docs/offheap-read-write/index.html                 |    6 +-
 .../backup-and-snapshots/index.html                |    6 +-
 .../cluster-replication/index.html                 |    6 +-
 docs/operational-management/index.html             |    6 +-
 .../metrics-and-monitoring/index.html              |    6 +-
 docs/operational-management/node/index.html        |    6 +-
 .../region-and-capacity/index.html                 |    6 +-
 .../index.html                                     |    6 +-
 .../operational-management/table-rename/index.html |    6 +-
 docs/operational-management/tools/index.html       |    6 +-
 docs/orca/index.html                               |    6 +-
 docs/other-info/index.html                         |    6 +-
 docs/performance/index.html                        |    6 +-
 docs/profiler/index.html                           |    6 +-
 docs/protobuf/index.html                           |    6 +-
 docs/pv2/index.html                                |    6 +-
 docs/regionserver-sizing/index.html                |    6 +-
 docs/rpc/index.html                                |    6 +-
 docs/schema-design/index.html                      |    6 +-
 docs/security/client-access/index.html             |    6 +-
 docs/security/data-access/index.html               |    6 +-
 docs/security/example/index.html                   |    6 +-
 docs/security/hdfs-and-zookeeper-access/index.html |    6 +-
 docs/security/index.html                           |    6 +-
 docs/security/tls/index.html                       |    6 +-
 docs/security/user-access/index.html               |    6 +-
 docs/security/web-ui/index.html                    |    6 +-
 docs/shell/index.html                              |    6 +-
 docs/single-page/index.html                        |    6 +-
 docs/spark/index.html                              |    6 +-
 docs/sql/index.html                                |    6 +-
 docs/store-file-tracking/index.html                |    6 +-
 docs/sync-replication/index.html                   |    6 +-
 docs/thrift-filter-language/index.html             |    6 +-
 docs/tracing/index.html                            |    6 +-
 docs/troubleshooting/index.html                    |    6 +-
 docs/unit-testing/index.html                       |    6 +-
 docs/upgrading/index.html                          |    6 +-
 docs/upgrading/paths/index.html                    |    6 +-
 docs/upgrading/rollback/index.html                 |    6 +-
 docs/upgrading/rolling/index.html                  |    6 +-
 docs/upgrading/version-number/index.html           |    6 +-
 docs/ycsb/index.html                               |    6 +-
 docs/zookeeper/index.html                          |    6 +-
 downloads/index.html                               |    4 +-
 export-control/index.html                          |    4 +-
 hbase-website/dependency-convergence.html          |    2 +-
 hbase-website/dependency-info.html                 |    2 +-
 hbase-website/dependency-management.html           |    2 +-
 hbase-website/index.html                           |    2 +-
 hbase-website/issue-management.html                |    2 +-
 hbase-website/licenses.html                        |    2 +-
 hbase-website/mailing-lists.html                   |    2 +-
 hbase-website/plugin-management.html               |    2 +-
 hbase-website/plugins.html                         |    2 +-
 hbase-website/project-info.html                    |    2 +-
 hbase-website/scm.html                             |    2 +-
 hbase-website/summary.html                         |    2 +-
 hbase-website/team.html                            |    2 +-
 index.html                                         |    4 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 mailing-lists/index.html                           |    4 +-
 news/index.html                                    |    4 +-
 other-resources/index.html                         |    4 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 powered-by-hbase/index.html                        |    4 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 scm.html                                           |    2 +-
 security-model/index.html                          |    4 +-
 source-repository/index.html                       |    4 +-
 sponsors/index.html                                |    4 +-
 summary.html                                       |    2 +-
 team.html                                          |    2 +-
 team/index.html                                    |    4 +-
 testapidocs/allclasses-index.html                  | 1653 +++++-----
 testapidocs/index-all.html                         |  865 ++---
 testapidocs/member-search-index.js                 |    2 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |  514 +--
 .../class-use/HBaseParameterizedTestTemplate.html  |  135 +-
 .../hadoop/hbase/class-use/HBaseTestingUtil.html   |    6 +-
 .../hbase/class-use/TableNameTestExtension.html    |   29 +-
 .../hadoop/hbase/class-use/TableNameTestRule.html  |   27 +-
 ...html => SnapshotCloneIndependenceTestBase.html} |   17 +-
 ...Client.html => SnapshotFromClientTestBase.html} |   19 +-
 ...tml => SnapshotTemporaryDirectoryTestBase.html} |   19 +-
 .../class-use/TestSnapshotCloneIndependence.html   |   29 +-
 .../client/class-use/TestSnapshotFromClient.html   |   32 +-
 .../class-use/TestSnapshotTemporaryDirectory.html  |   33 +-
 .../hadoop/hbase/client/package-summary.html       |  962 +++---
 .../apache/hadoop/hbase/client/package-tree.html   |   37 +-
 .../apache/hadoop/hbase/client/package-use.html    |   50 +-
 .../class-use/TestFilterListHintDelegation.html    |   37 +-
 .../hadoop/hbase/filter/package-summary.html       |   93 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    1 +
 .../org/apache/hadoop/hbase/package-use.html       |   50 +-
 testapidocs/overview-tree.html                     |   38 +-
 ...ncTableRegionReplicasRead.FailPrimaryGetCP.html |  356 +-
 .../AbstractTestAsyncTableRegionReplicasRead.html  |  356 +-
 .../client/AbstractTestCIOperationTimeout.html     |   10 +-
 .../hbase/client/AbstractTestCIRpcTimeout.html     |   10 +-
 ...bstractTestCITimeout.SleepAndFailFirstTime.html |   30 +-
 .../AbstractTestCITimeout.SleepCoprocessor.html    |   30 +-
 .../hadoop/hbase/client/AbstractTestCITimeout.html |   30 +-
 .../hbase/client/AbstractTestRegionLocator.html    |   10 +-
 .../client/AbstractTestResultScannerCursor.html    |    8 +-
 .../AbstractTestScanCursor.SparseFilter.html       |  198 +-
 .../hbase/client/AbstractTestScanCursor.html       |  198 +-
 ...tConnectionRegistriesTestBase.RegistryImpl.html |    4 +-
 ...eWithDifferentConnectionRegistriesTestBase.html |    4 +-
 .../hbase/client/ClientPushbackTestBase.html       |   40 +-
 .../hadoop/hbase/client/FromClientSideTest4.html   |    4 +-
 .../hbase/client/FromClientSideTestBase.html       |    6 +-
 .../hbase/client/MetaWithReplicasTestBase.html     |   22 +-
 .../hbase/client/RegionReplicaTestHelper.html      |    6 +-
 .../client/SnapshotCloneIndependenceTestBase.html  |  443 +++
 .../hbase/client/SnapshotFromClientTestBase.html   |  537 ++++
 .../client/SnapshotTemporaryDirectoryTestBase.html |  530 +++
 .../hbase/client/SnapshotWithAclTestBase.html      |  100 +-
 .../org/apache/hadoop/hbase/client/TestAdmin.html  | 1041 +++---
 .../org/apache/hadoop/hbase/client/TestAdmin1.html | 1243 ++++---
 .../org/apache/hadoop/hbase/client/TestAdmin2.html | 1555 +++++----
 .../org/apache/hadoop/hbase/client/TestAdmin3.html | 1023 +++---
 .../org/apache/hadoop/hbase/client/TestAdmin4.html |  130 +-
 .../apache/hadoop/hbase/client/TestAdminBase.html  |   84 +-
 .../client/TestAllowPartialScanResultCache.html    |  137 +-
 .../hbase/client/TestAlwaysSetScannerId.html       |  195 +-
 .../hbase/client/TestAppendFromClientSide.html     |  129 +-
 ...syncAdminBuilder.TestMaxRetriesCoprocessor.html |  390 ++-
 ...minBuilder.TestOperationTimeoutCoprocessor.html |  390 ++-
 ...syncAdminBuilder.TestRpcTimeoutCoprocessor.html |  390 ++-
 .../hadoop/hbase/client/TestAsyncAdminBuilder.html |  390 ++-
 .../hbase/client/TestAsyncBufferMutator.html       |  547 ++--
 ...cThrottling.ThrottlingRSRpcServicesForTest.html |  676 ++--
 ...pcThrottling.ThrottlingRegionServerForTest.html |  676 ++--
 .../TestAsyncClientPauseForRpcThrottling.html      |  676 ++--
 ...ntPauseForServerOverloaded.OverloadedQueue.html |  413 ++-
 ...ForServerOverloaded.OverloadedRpcScheduler.html |  413 ++-
 ...erOverloaded.OverloadedRpcSchedulerFactory.html |  413 ++-
 .../TestAsyncClientPauseForServerOverloaded.html   |  413 ++-
 .../hbase/client/TestAsyncClientPushback.html      |  119 +-
 .../client/TestAsyncNonMetaRegionLocator.html      |  974 +++---
 ...atorConcurrenyLimit.CountingRegionObserver.html |  269 +-
 ...stAsyncNonMetaRegionLocatorConcurrenyLimit.html |  269 +-
 ...TestAsyncRegionLocator.SleepRegionObserver.html |  243 +-
 .../hbase/client/TestAsyncRegionLocator.html       |  243 +-
 .../hbase/client/TestAsyncResultScannerCursor.html |   61 +-
 .../TestAsyncSingleRequestRpcRetryingCaller.html   |  307 +-
 .../apache/hadoop/hbase/client/TestAsyncTable.html | 3386 ++++++++++----------
 .../hbase/client/TestAsyncTableAdminApi.html       |  752 ++---
 .../hbase/client/TestAsyncTableAdminApi2.html      |  505 ++-
 .../TestAsyncTableBatch.ErrorInjectObserver.html   |  940 +++---
 .../hadoop/hbase/client/TestAsyncTableBatch.html   |  940 +++---
 .../TestAsyncTableBatchRetryImmediately.html       |  157 +-
 .../client/TestAsyncTableGetMultiThreaded.html     |  364 ++-
 ...ncTableGetMultiThreadedWithBasicCompaction.html |   41 +-
 ...ncTableGetMultiThreadedWithEagerCompaction.html |   41 +-
 .../hbase/client/TestAsyncTableLocatePrefetch.html |  119 +-
 .../TestAsyncTableLocateRegionForDeletedTable.html |  163 +-
 .../TestAsyncTableNoncedRetry.SleepOnceCP.html     |  683 ++--
 .../hbase/client/TestAsyncTableNoncedRetry.html    |  683 ++--
 .../hbase/client/TestAsyncTableQueryMetrics.html   |  418 ++-
 .../hbase/client/TestAsyncTableRSCrashPublish.html |  143 +-
 .../hbase/client/TestAsyncTableRegionLocator.html  |  133 +-
 .../client/TestAsyncTableRegionReplicasGet.html    |   69 +-
 .../client/TestAsyncTableRegionReplicasScan.html   |  109 +-
 .../TestAsyncTableScanException.ErrorCP.html       |  299 +-
 .../hbase/client/TestAsyncTableScanException.html  |  299 +-
 ...AsyncTableScanMetricsWithScannerSuspending.html |  243 +-
 .../hbase/client/TestAsyncTableScanRenewLease.html |  257 +-
 .../TestAsyncTableScannerCloseWhileSuspending.html |  195 +-
 ...TableUseMetaReplicas.FailPrimaryMetaScanCp.html |  200 +-
 .../client/TestAsyncTableUseMetaReplicas.html      |  200 +-
 ...sIntoShippedBlocks.CompactorRegionObserver.html |  839 +++--
 .../TestAvoidCellReferencesIntoShippedBlocks.html  |  839 +++--
 .../hbase/client/TestBatchScanResultCache.html     |  179 +-
 ...ictionFromClient.CustomInnerRegionObserver.html | 3162 +++++++++---------
 ...romClient.CustomInnerRegionObserverWrapper.html | 3162 +++++++++---------
 .../hbase/client/TestBlockEvictionFromClient.html  | 3162 +++++++++---------
 .../hbase/client/TestBootstrapNodeUpdate.html      |  153 +-
 .../hadoop/hbase/client/TestBufferedMutator.html   |  219 +-
 .../hbase/client/TestCIDeleteOperationTimeout.html |   31 +-
 .../hbase/client/TestCIDeleteRpcTimeout.html       |   31 +-
 .../hbase/client/TestCIGetOperationTimeout.html    |   31 +-
 .../hadoop/hbase/client/TestCIGetRpcTimeout.html   |   31 +-
 .../hbase/client/TestCIIncrementRpcTimeout.html    |   31 +-
 .../hbase/client/TestCIPutOperationTimeout.html    |   31 +-
 .../hadoop/hbase/client/TestCIPutRpcTimeout.html   |   31 +-
 .../apache/hadoop/hbase/client/TestCISleep.html    |  117 +-
 ...estCatalogReplicaLoadBalanceSimpleSelector.html |  205 +-
 .../hadoop/hbase/client/TestCheckAndMutate.html    | 1430 ++++-----
 ...utateWithByteBuff.TestCheckAndMutateRegion.html |  220 +-
 .../client/TestCheckAndMutateWithByteBuff.html     |  220 +-
 .../hbase/client/TestCleanupMetaReplica.html       |   61 +-
 .../TestCleanupMetaReplicaThroughConfig.html       |   87 +-
 ...stClientOperationInterrupt.TestCoprocessor.html |  307 +-
 .../hbase/client/TestClientOperationInterrupt.html |  307 +-
 .../hbase/client/TestClientScannerTimeouts.html    |  814 +++--
 .../hbase/client/TestClientSideRegionScanner.html  |  680 ++--
 .../hbase/client/TestClientTableMetrics.html       |  234 +-
 .../TestClientTimeouts.RandomTimeoutRpcClient.html |  297 +-
 .../hadoop/hbase/client/TestClientTimeouts.html    |  297 +-
 .../client/TestCompleteResultScanResultCache.html  |  321 +-
 .../apache/hadoop/hbase/client/TestConnection.html |  216 +-
 ...ConnectionAttributes.AttributesCoprocessor.html |  177 +-
 .../hbase/client/TestConnectionAttributes.html     |  177 +-
 .../hadoop/hbase/client/TestConnectionUtils.html   |  111 +-
 ...meoutRequest.SleepLongerAtFirstCoprocessor.html |  195 +-
 .../hbase/client/TestDropTimeoutRequest.html       |  195 +-
 .../client/TestEnableTable.MasterSyncObserver.html |  327 +-
 .../hadoop/hbase/client/TestEnableTable.html       |  327 +-
 ...ssigment.BrokenMasterMetaAssignmentManager.html |  275 +-
 ...taReplicaAssigment.BrokenMetaReplicaMaster.html |  275 +-
 ...ssigment.BrokenTransitRegionStateProcedure.html |  275 +-
 .../client/TestFailedMetaReplicaAssigment.html     |  275 +-
 .../hbase/client/TestFallbackToUseReplay.html      |  173 +-
 .../hadoop/hbase/client/TestFlushFromClient.html   |  420 ++-
 ...tFlushFromClientWithDisabledFlushProcedure.html |  185 +-
 .../TestGetProcedureResult.DummyProcedure.html     |  199 +-
 .../hbase/client/TestGetProcedureResult.html       |  199 +-
 .../TestGetScanColumnsWithNewVersionBehavior.html  |  151 +-
 .../hbase/client/TestGetScanPartialResult.html     |  155 +-
 ...FailingMergeAfterMetaUpdatedMasterObserver.html |  714 ++---
 ...FailingSplitAfterMetaUpdatedMasterObserver.html |  714 ++---
 .../hbase/client/TestHbck.SuspendProcedure.html    |  714 ++---
 .../org/apache/hadoop/hbase/client/TestHbck.html   |  714 ++---
 .../hbase/client/TestIllegalTableDescriptor.html   |  421 ++-
 .../TestIncreaseMetaReplicaThroughConfig.html      |   89 +-
 ...TestIncrementFromClientSideWithCoprocessor.html |   46 +-
 .../hbase/client/TestIncrementsFromClientSide.html | 1047 +++---
 .../hbase/client/TestIntraRowPagination.html       |  171 +-
 .../TestInvalidMutationDurabilityException.html    |  246 +-
 .../hbase/client/TestLimitedScanWithFilter.html    |  309 +-
 .../hbase/client/TestMalformedCellFromClient.html  |  620 ++--
 .../hadoop/hbase/client/TestMasterRegistry.html    |  324 +-
 ...MetaCache.CallQueueTooBigExceptionInjector.html |  835 +++--
 .../client/TestMetaCache.ExceptionInjector.html    |  835 +++--
 .../client/TestMetaCache.FakeRSRpcServices.html    |  835 +++--
 ...tMetaCache.RegionServerWithFakeRpcServices.html |  835 +++--
 .../TestMetaCache.RoundRobinExceptionInjector.html |  835 +++--
 .../apache/hadoop/hbase/client/TestMetaCache.html  |  835 +++--
 .../hbase/client/TestMetaRegionLocationCache.html  |  339 +-
 .../client/TestMetaReplicasAddressChange.html      |  127 +-
 .../client/TestMetaTableAccessorNoCluster.html     |  117 +-
 .../hbase/client/TestMetaWithReplicasBasic.html    |  131 +-
 .../TestMetaWithReplicasShutdownHandling.html      |  273 +-
 .../client/TestMobSnapshotCloneIndependence.html   |   88 +-
 .../hbase/client/TestMobSnapshotFromClient.html    |   72 +-
 .../client/TestMultiActionMetricsFromClient.html   |  113 +-
 .../client/TestMultiParallel.MyMasterObserver.html | 1241 ++++---
 .../hadoop/hbase/client/TestMultiParallel.html     | 1241 ++++---
 .../hbase/client/TestMultiRespectsLimits.html      |  385 ++-
 .../hbase/client/TestMultipleTimestamps.html       |  930 +++---
 .../hbase/client/TestMutationGetCellBuilder.html   |  155 +-
 .../hbase/client/TestMvccConsistentScanner.html    |  210 +-
 .../hbase/client/TestPreadReversedScanner.html     |  241 +-
 .../client/TestPutDeleteEtcCellIteration.html      |  256 +-
 .../hadoop/hbase/client/TestPutWithDelete.html     |  170 +-
 .../hbase/client/TestRawAsyncScanCursor.html       |  285 +-
 .../TestRawAsyncTableLimitedScanWithFilter.html    |  305 +-
 .../hbase/client/TestRawAsyncTablePartialScan.html |  185 +-
 .../hbase/client/TestRegionLocationCaching.html    |  415 ++-
 .../hadoop/hbase/client/TestRegionLocator.html     |  147 +-
 ...rverHostingPrimayMetaRegionSlowOrStopCopro.html | 1250 ++++----
 ...eplicaWithCluster.RegionServerStoppedCopro.html | 1250 ++++----
 .../client/TestReplicaWithCluster.SlowMeCopro.html | 1250 ++++----
 .../hbase/client/TestReplicaWithCluster.html       | 1250 ++++----
 .../client/TestReplicasClient.SlowMeCopro.html     | 1333 ++++----
 .../hadoop/hbase/client/TestReplicasClient.html    | 1333 ++++----
 ...estRequestAttributes.AttributesCoprocessor.html |  637 ++--
 ...ontrollerFactory.RequestMetadataController.html |  637 ++--
 ...ttributes.RequestMetadataControllerFactory.html |  637 ++--
 .../hadoop/hbase/client/TestRequestAttributes.html |  637 ++--
 .../hbase/client/TestRequestTooBigException.html   |  113 +-
 .../org/apache/hadoop/hbase/client/TestResult.html |  990 +++---
 .../TestResultFromCoprocessor.MyObserver.html      |  215 +-
 .../hbase/client/TestResultFromCoprocessor.html    |  215 +-
 .../hbase/client/TestResultScannerCursor.html      |   43 +-
 .../hbase/client/TestResultSizeEstimation.html     |  211 +-
 .../hbase/client/TestRpcConnectionRegistry.html    |  253 +-
 .../hadoop/hbase/client/TestScanAttributes.html    |   58 +-
 .../hbase/client/TestScanWithoutFetchingData.html  |  239 +-
 .../hadoop/hbase/client/TestScannerTimeout.html    |  363 ++-
 .../hbase/client/TestScannersFromClientSide2.html  |  450 ++-
 .../hbase/client/TestSeparateClientZKCluster.html  |  535 ++--
 .../TestServerBusyException.SleepCoprocessor.html  |  401 ++-
 ...usyException.SleepLongerAtFirstCoprocessor.html |  401 ++-
 .../hbase/client/TestServerBusyException.html      |  401 ++-
 .../hbase/client/TestServerLoadDurability.html     |  189 +-
 .../client/TestShutdownOfMetaReplicaHolder.html    |   89 +-
 .../hadoop/hbase/client/TestSizeFailures.html      |  280 +-
 .../client/TestSnapshotCloneIndependence.html      |  390 +--
 .../client/TestSnapshotDFSTemporaryDirectory.html  |   36 +-
 .../hbase/client/TestSnapshotFromClient.html       |  487 +--
 .../TestSnapshotFromClientWithRegionReplicas.html  |   49 +-
 .../hadoop/hbase/client/TestSnapshotMetadata.html  |  545 ++--
 .../client/TestSnapshotTemporaryDirectory.html     |  477 +--
 ...apshotTemporaryDirectoryWithRegionReplicas.html |   44 +-
 .../hadoop/hbase/client/TestSnapshotWithAcl.html   |   53 +-
 .../client/TestSnapshotWithAclAsyncAdmin.html      |   75 +-
 .../client/TestSnapshotWithTTLFromClient.html      |  413 ++-
 .../hbase/client/TestSplitOrMergeAtTableLevel.html |  497 ++-
 .../hbase/client/TestSplitOrMergeStatus.html       |  388 ++-
 .../hadoop/hbase/client/TestTableFavoredNodes.html |  672 ++--
 ...tion.ThrowDoNotRetryIOExceptionCoprocessor.html |  322 +-
 ...ationException.ThrowIOExceptionCoprocessor.html |  322 +-
 .../hbase/client/TestTableOperationException.html  |  322 +-
 .../hbase/client/TestTableSnapshotScanner.html     | 1196 ++++---
 .../client/TestTableSnapshotScannerWithSFT.html    |   39 +-
 .../hadoop/hbase/client/TestTimestampsFilter.html  |  664 ++--
 .../hbase/client/TestUpdateConfiguration.html      |  180 +-
 .../hbase/client/TestZKConnectionRegistry.html     |  195 +-
 .../hbase/client/locking/TestEntityLocks.html      |  335 +-
 .../client/replication/TestBadReplicationPeer.html |  135 +-
 .../TestReplicationAdminForSyncReplication.html    |  183 +-
 .../hbase/filter/TestFilterHintForRejectedRow.html | 1971 ++++++++----
 .../hbase/filter/TestFilterListHintDelegation.html |  787 +++++
 testapidocs/type-search-index.js                   |    2 +-
 testdevapidocs/allclasses-index.html               | 2369 +++++++-------
 testdevapidocs/constant-values.html                |   90 +-
 testdevapidocs/index-all.html                      | 1000 +++---
 testdevapidocs/member-search-index.js              |    2 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |  522 +--
 .../class-use/HBaseParameterizedTestTemplate.html  |  135 +-
 .../hadoop/hbase/class-use/HBaseTestingUtil.html   |   70 +-
 .../hbase/class-use/TableNameTestExtension.html    |   19 +-
 .../hadoop/hbase/class-use/TableNameTestRule.html  |   27 +-
 ...ncTableRegionReplicasRead.FailPrimaryGetCP.html |   12 +-
 .../AbstractTestAsyncTableRegionReplicasRead.html  |   99 +-
 .../client/AbstractTestCIOperationTimeout.html     |    6 +-
 .../hbase/client/AbstractTestCIRpcTimeout.html     |    6 +-
 .../hadoop/hbase/client/AbstractTestCITimeout.html |   11 +-
 .../hbase/client/AbstractTestRegionLocator.html    |   18 +-
 .../client/AbstractTestResultScannerCursor.html    |   11 +-
 .../AbstractTestScanCursor.SparseFilter.html       |   12 +-
 .../hbase/client/AbstractTestScanCursor.html       |   66 +-
 .../hbase/client/ClientPushbackTestBase.html       |   12 +-
 .../hbase/client/MetaWithReplicasTestBase.html     |   10 +-
 ...html => SnapshotCloneIndependenceTestBase.html} |  258 +-
 ...Client.html => SnapshotFromClientTestBase.html} |  205 +-
 ...tml => SnapshotTemporaryDirectoryTestBase.html} |  192 +-
 .../hbase/client/SnapshotWithAclTestBase.html      |   23 +-
 .../org/apache/hadoop/hbase/client/TestAdmin.html  |   75 +-
 .../org/apache/hadoop/hbase/client/TestAdmin1.html |   72 +-
 .../org/apache/hadoop/hbase/client/TestAdmin2.html |  130 +-
 .../org/apache/hadoop/hbase/client/TestAdmin3.html |   73 +-
 .../org/apache/hadoop/hbase/client/TestAdmin4.html |   40 +-
 .../apache/hadoop/hbase/client/TestAdminBase.html  |   39 +-
 .../client/TestAllowPartialScanResultCache.html    |   31 +-
 .../hbase/client/TestAlwaysSetScannerId.html       |   69 +-
 .../hbase/client/TestAppendFromClientSide.html     |   48 +-
 ...syncAdminBuilder.TestMaxRetriesCoprocessor.html |   10 +-
 ...minBuilder.TestOperationTimeoutCoprocessor.html |   10 +-
 ...syncAdminBuilder.TestRpcTimeoutCoprocessor.html |    8 +-
 .../hadoop/hbase/client/TestAsyncAdminBuilder.html |   80 +-
 ...yncBufferMutator.AsyncBufferMutatorForTest.html |    8 +-
 .../hbase/client/TestAsyncBufferMutator.html       |   94 +-
 ...cThrottling.ThrottlingRSRpcServicesForTest.html |   14 +-
 ...pcThrottling.ThrottlingRegionServerForTest.html |    6 +-
 .../TestAsyncClientPauseForRpcThrottling.html      |  122 +-
 ...yncClientPauseForServerOverloaded.FailMode.html |   16 +-
 ...ntPauseForServerOverloaded.OverloadedQueue.html |    6 +-
 ...ForServerOverloaded.OverloadedRpcScheduler.html |    6 +-
 ...erOverloaded.OverloadedRpcSchedulerFactory.html |    6 +-
 .../TestAsyncClientPauseForServerOverloaded.html   |   83 +-
 .../hbase/client/TestAsyncClientPushback.html      |   44 +-
 .../client/TestAsyncNonMetaRegionLocator.html      |  152 +-
 ...atorConcurrenyLimit.CountingRegionObserver.html |   10 +-
 ...stAsyncNonMetaRegionLocatorConcurrenyLimit.html |   79 +-
 ...TestAsyncRegionLocator.SleepRegionObserver.html |    8 +-
 .../hbase/client/TestAsyncRegionLocator.html       |   65 +-
 .../hbase/client/TestAsyncResultScannerCursor.html |   28 +-
 .../TestAsyncSingleRequestRpcRetryingCaller.html   |   72 +-
 .../apache/hadoop/hbase/client/TestAsyncTable.html |  221 +-
 .../hbase/client/TestAsyncTableAdminApi.html       |   67 +-
 .../hbase/client/TestAsyncTableAdminApi2.html      |   28 +-
 .../TestAsyncTableBatch.ErrorInjectObserver.html   |    8 +-
 .../hadoop/hbase/client/TestAsyncTableBatch.html   |  136 +-
 .../TestAsyncTableBatchRetryImmediately.html       |   71 +-
 .../client/TestAsyncTableGetMultiThreaded.html     |   81 +-
 ...ncTableGetMultiThreadedWithBasicCompaction.html |   42 +-
 ...ncTableGetMultiThreadedWithEagerCompaction.html |   42 +-
 .../hbase/client/TestAsyncTableLocatePrefetch.html |   53 +-
 .../TestAsyncTableLocateRegionForDeletedTable.html |   53 +-
 .../TestAsyncTableNoncedRetry.SleepOnceCP.html     |    8 +-
 .../hbase/client/TestAsyncTableNoncedRetry.html    |  135 +-
 .../hbase/client/TestAsyncTableQueryMetrics.html   |   84 +-
 .../hbase/client/TestAsyncTableRSCrashPublish.html |   41 +-
 .../hbase/client/TestAsyncTableRegionLocator.html  |   40 +-
 .../client/TestAsyncTableRegionReplicasGet.html    |   43 +-
 .../client/TestAsyncTableRegionReplicasScan.html   |   37 +-
 .../TestAsyncTableScanException.ErrorCP.html       |    8 +-
 .../hbase/client/TestAsyncTableScanException.html  |   93 +-
 ...AsyncTableScanMetricsWithScannerSuspending.html |   55 +-
 ...syncTableScanRenewLease.RenewLeaseConsumer.html |   20 +-
 .../hbase/client/TestAsyncTableScanRenewLease.html |   63 +-
 .../TestAsyncTableScannerCloseWhileSuspending.html |   59 +-
 ...TableUseMetaReplicas.FailPrimaryMetaScanCp.html |    8 +-
 .../client/TestAsyncTableUseMetaReplicas.html      |   67 +-
 ...IntoShippedBlocks.CompactorInternalScanner.html |    6 +-
 ...sIntoShippedBlocks.CompactorRegionObserver.html |    8 +-
 ...lReferencesIntoShippedBlocks.ScannerThread.html |   10 +-
 .../TestAvoidCellReferencesIntoShippedBlocks.html  |  157 +-
 .../hbase/client/TestBatchScanResultCache.html     |   37 +-
 ...ictionFromClient.CustomInnerRegionObserver.html |   24 +-
 ...romClient.CustomInnerRegionObserverWrapper.html |    6 +-
 .../TestBlockEvictionFromClient.CustomScanner.html |   30 +-
 .../TestBlockEvictionFromClient.GetThread.html     |   14 +-
 ...TestBlockEvictionFromClient.MultiGetThread.html |   10 +-
 .../TestBlockEvictionFromClient.ScanThread.html    |   12 +-
 .../hbase/client/TestBlockEvictionFromClient.html  |  213 +-
 .../hbase/client/TestBootstrapNodeUpdate.html      |   35 +-
 .../hadoop/hbase/client/TestBufferedMutator.html   |   60 +-
 .../hbase/client/TestCIDeleteOperationTimeout.html |   32 +-
 .../hbase/client/TestCIDeleteRpcTimeout.html       |   32 +-
 .../hbase/client/TestCIGetOperationTimeout.html    |   32 +-
 .../hadoop/hbase/client/TestCIGetRpcTimeout.html   |   32 +-
 .../hbase/client/TestCIIncrementRpcTimeout.html    |   32 +-
 .../hbase/client/TestCIPutOperationTimeout.html    |   32 +-
 .../hadoop/hbase/client/TestCIPutRpcTimeout.html   |   32 +-
 .../apache/hadoop/hbase/client/TestCISleep.html    |   32 +-
 ...estCatalogReplicaLoadBalanceSimpleSelector.html |   61 +-
 .../hadoop/hbase/client/TestCheckAndMutate.html    |  233 +-
 ...utateWithByteBuff.TestCheckAndMutateRegion.html |    8 +-
 .../client/TestCheckAndMutateWithByteBuff.html     |   72 +-
 .../hbase/client/TestCleanupMetaReplica.html       |   36 +-
 .../TestCleanupMetaReplicaThroughConfig.html       |   36 +-
 ...stClientOperationInterrupt.TestCoprocessor.html |    8 +-
 .../hbase/client/TestClientOperationInterrupt.html |   65 +-
 ...annerTimeouts.RSRpcServicesWithScanTimeout.html |   28 +-
 ...cannerTimeouts.RegionServerWithScanTimeout.html |    6 +-
 .../hbase/client/TestClientScannerTimeouts.html    |  185 +-
 ...ientSideRegionScanner.FiltersRowsLessThan5.html |    8 +-
 .../hbase/client/TestClientSideRegionScanner.html  |  125 +-
 .../hbase/client/TestClientTableMetrics.html       |   68 +-
 ...ntTimeouts.RandomTimeoutBlockingRpcChannel.html |    6 +-
 ...TestClientTimeouts.RandomTimeoutRpcChannel.html |    6 +-
 .../TestClientTimeouts.RandomTimeoutRpcClient.html |    8 +-
 .../hadoop/hbase/client/TestClientTimeouts.html    |   45 +-
 .../client/TestCompleteResultScanResultCache.html  |   59 +-
 .../apache/hadoop/hbase/client/TestConnection.html |  172 +-
 ...ConnectionAttributes.AttributesCoprocessor.html |    8 +-
 .../hbase/client/TestConnectionAttributes.html     |   53 +-
 .../hadoop/hbase/client/TestConnectionUtils.html   |   44 +-
 ...meoutRequest.SleepLongerAtFirstCoprocessor.html |   12 +-
 .../hbase/client/TestDropTimeoutRequest.html       |   63 +-
 .../client/TestEnableTable.MasterSyncObserver.html |   14 +-
 .../hadoop/hbase/client/TestEnableTable.html       |   54 +-
 ...ssigment.BrokenMasterMetaAssignmentManager.html |    8 +-
 ...taReplicaAssigment.BrokenMetaReplicaMaster.html |    6 +-
 ...ssigment.BrokenTransitRegionStateProcedure.html |    8 +-
 .../client/TestFailedMetaReplicaAssigment.html     |   29 +-
 .../hbase/client/TestFallbackToUseReplay.html      |   49 +-
 .../hadoop/hbase/client/TestFlushFromClient.html   |  111 +-
 ...tFlushFromClientWithDisabledFlushProcedure.html |   62 +-
 .../TestGetProcedureResult.DummyProcedure.html     |   22 +-
 .../hbase/client/TestGetProcedureResult.html       |   31 +-
 .../TestGetScanColumnsWithNewVersionBehavior.html  |   61 +-
 .../hbase/client/TestGetScanPartialResult.html     |   57 +-
 ...FailingMergeAfterMetaUpdatedMasterObserver.html |   14 +-
 ...FailingSplitAfterMetaUpdatedMasterObserver.html |   14 +-
 .../hbase/client/TestHbck.SuspendProcedure.html    |   10 +-
 .../org/apache/hadoop/hbase/client/TestHbck.html   |   86 +-
 .../hbase/client/TestIllegalTableDescriptor.html   |   86 +-
 .../TestIncreaseMetaReplicaThroughConfig.html      |   36 +-
 ...TestIncrementFromClientSideWithCoprocessor.html |   35 +-
 .../hbase/client/TestIncrementsFromClientSide.html |  148 +-
 .../hbase/client/TestIntraRowPagination.html       |   23 +-
 .../TestInvalidMutationDurabilityException.html    |   90 +-
 .../hbase/client/TestLimitedScanWithFilter.html    |   65 +-
 .../hbase/client/TestMalformedCellFromClient.html  |   71 +-
 .../hadoop/hbase/client/TestMasterRegistry.html    |   40 +-
 ...MetaCache.CallQueueTooBigExceptionInjector.html |   10 +-
 .../client/TestMetaCache.ExceptionInjector.html    |   12 +-
 .../client/TestMetaCache.FakeRSRpcServices.html    |   14 +-
 ...tMetaCache.RegionServerWithFakeRpcServices.html |   10 +-
 .../TestMetaCache.RoundRobinExceptionInjector.html |   18 +-
 .../apache/hadoop/hbase/client/TestMetaCache.html  |   89 +-
 .../hbase/client/TestMetaRegionLocationCache.html  |   48 +-
 .../client/TestMetaReplicasAddressChange.html      |   26 +-
 .../client/TestMetaTableAccessorNoCluster.html     |   29 +-
 .../hbase/client/TestMetaWithReplicasBasic.html    |   42 +-
 .../TestMetaWithReplicasShutdownHandling.html      |   28 +-
 .../client/TestMobSnapshotCloneIndependence.html   |   64 +-
 .../hbase/client/TestMobSnapshotFromClient.html    |   55 +-
 .../client/TestMultiActionMetricsFromClient.html   |   45 +-
 .../client/TestMultiParallel.MyMasterObserver.html |   14 +-
 .../hadoop/hbase/client/TestMultiParallel.html     |  129 +-
 .../hbase/client/TestMultiRespectsLimits.html      |   90 +-
 .../hbase/client/TestMultipleTimestamps.html       |  148 +-
 .../hbase/client/TestMutationGetCellBuilder.html   |   38 +-
 .../hbase/client/TestMvccConsistentScanner.html    |   76 +-
 .../hbase/client/TestPreadReversedScanner.html     |   61 +-
 .../client/TestPutDeleteEtcCellIteration.html      |   48 +-
 .../hadoop/hbase/client/TestPutWithDelete.html     |   38 +-
 .../hbase/client/TestRawAsyncScanCursor.html       |   37 +-
 .../TestRawAsyncTableLimitedScanWithFilter.html    |   77 +-
 .../hbase/client/TestRawAsyncTablePartialScan.html |   68 +-
 .../hbase/client/TestRegionLocationCaching.html    |   66 +-
 .../hadoop/hbase/client/TestRegionLocator.html     |   50 +-
 ...rverHostingPrimayMetaRegionSlowOrStopCopro.html |   14 +-
 ...eplicaWithCluster.RegionServerStoppedCopro.html |   10 +-
 .../client/TestReplicaWithCluster.SlowMeCopro.html |   12 +-
 .../hbase/client/TestReplicaWithCluster.html       |   85 +-
 .../client/TestReplicasClient.SlowMeCopro.html     |   28 +-
 .../hadoop/hbase/client/TestReplicasClient.html    |  133 +-
 ...estRequestAttributes.AttributesCoprocessor.html |   16 +-
 ...ontrollerFactory.RequestMetadataController.html |    8 +-
 ...ttributes.RequestMetadataControllerFactory.html |   14 +-
 .../hadoop/hbase/client/TestRequestAttributes.html |  139 +-
 .../hbase/client/TestRequestTooBigException.html   |   47 +-
 .../org/apache/hadoop/hbase/client/TestResult.html |   94 +-
 .../TestResultFromCoprocessor.MyObserver.html      |   14 +-
 .../hbase/client/TestResultFromCoprocessor.html    |   78 +-
 .../hbase/client/TestResultScannerCursor.html      |   66 +-
 .../hbase/client/TestResultSizeEstimation.html     |   78 +-
 .../hbase/client/TestRpcConnectionRegistry.html    |   46 +-
 .../hadoop/hbase/client/TestScanAttributes.html    |   41 +-
 .../hbase/client/TestScanWithoutFetchingData.html  |   71 +-
 .../hadoop/hbase/client/TestScannerTimeout.html    |   76 +-
 .../hbase/client/TestScannersFromClientSide2.html  |  108 +-
 .../hbase/client/TestSeparateClientZKCluster.html  |  106 +-
 .../TestServerBusyException.SleepCoprocessor.html  |   16 +-
 ...usyException.SleepLongerAtFirstCoprocessor.html |   12 +-
 .../TestServerBusyException.TestGetThread.html     |   10 +-
 .../TestServerBusyException.TestPutThread.html     |   10 +-
 .../hbase/client/TestServerBusyException.html      |   48 +-
 .../hbase/client/TestServerLoadDurability.html     |   74 +-
 .../client/TestShutdownOfMetaReplicaHolder.html    |   26 +-
 .../hadoop/hbase/client/TestSizeFailures.html      |   68 +-
 .../client/TestSnapshotCloneIndependence.html      |  566 +---
 .../client/TestSnapshotDFSTemporaryDirectory.html  |   55 +-
 .../hbase/client/TestSnapshotFromClient.html       |  375 +--
 .../TestSnapshotFromClientWithRegionReplicas.html  |   70 +-
 .../hadoop/hbase/client/TestSnapshotMetadata.html  |  164 +-
 .../client/TestSnapshotTemporaryDirectory.html     |  332 +-
 ...apshotTemporaryDirectoryWithRegionReplicas.html |   70 +-
 .../hadoop/hbase/client/TestSnapshotWithAcl.html   |   36 +-
 .../client/TestSnapshotWithAclAsyncAdmin.html      |   36 +-
 .../client/TestSnapshotWithTTLFromClient.html      |   94 +-
 .../hbase/client/TestSplitOrMergeAtTableLevel.html |  108 +-
 .../hbase/client/TestSplitOrMergeStatus.html       |   65 +-
 .../hadoop/hbase/client/TestTableFavoredNodes.html |  123 +-
 ...tion.ThrowDoNotRetryIOExceptionCoprocessor.html |   16 +-
 ...ationException.ThrowIOExceptionCoprocessor.html |   16 +-
 .../hbase/client/TestTableOperationException.html  |   84 +-
 .../hbase/client/TestTableSnapshotScanner.html     |  136 +-
 .../client/TestTableSnapshotScannerWithSFT.html    |   36 +-
 .../hadoop/hbase/client/TestTimestampsFilter.html  |  104 +-
 .../hbase/client/TestUpdateConfiguration.html      |   69 +-
 .../hbase/client/TestZKConnectionRegistry.html     |   47 +-
 ...html => SnapshotCloneIndependenceTestBase.html} |   17 +-
 ...Client.html => SnapshotFromClientTestBase.html} |   19 +-
 ...tml => SnapshotTemporaryDirectoryTestBase.html} |   19 +-
 .../class-use/TestSnapshotCloneIndependence.html   |   29 +-
 .../client/class-use/TestSnapshotFromClient.html   |   32 +-
 .../class-use/TestSnapshotTemporaryDirectory.html  |   33 +-
 .../hbase/client/locking/TestEntityLocks.html      |   80 +-
 .../hadoop/hbase/client/package-summary.html       | 1024 +++---
 .../apache/hadoop/hbase/client/package-tree.html   |   37 +-
 .../apache/hadoop/hbase/client/package-use.html    |   70 +-
 .../client/replication/TestBadReplicationPeer.html |   48 +-
 .../TestReplicationAdminForSyncReplication.html    |   43 +-
 .../hbase/filter/TestFilterHintForRejectedRow.html |  255 +-
 .../hbase/filter/TestFilterListHintDelegation.html |  839 +++++
 .../class-use/TestFilterListHintDelegation.html}   |   37 +-
 .../hadoop/hbase/filter/package-summary.html       |   99 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    1 +
 .../org/apache/hadoop/hbase/package-use.html       |  231 +-
 testdevapidocs/overview-tree.html                  |   38 +-
 ...ncTableRegionReplicasRead.FailPrimaryGetCP.html |  356 +-
 .../AbstractTestAsyncTableRegionReplicasRead.html  |  356 +-
 .../client/AbstractTestCIOperationTimeout.html     |   10 +-
 .../hbase/client/AbstractTestCIRpcTimeout.html     |   10 +-
 ...bstractTestCITimeout.SleepAndFailFirstTime.html |   30 +-
 .../AbstractTestCITimeout.SleepCoprocessor.html    |   30 +-
 .../hadoop/hbase/client/AbstractTestCITimeout.html |   30 +-
 .../hbase/client/AbstractTestRegionLocator.html    |   10 +-
 .../client/AbstractTestResultScannerCursor.html    |    8 +-
 .../AbstractTestScanCursor.SparseFilter.html       |  198 +-
 .../hbase/client/AbstractTestScanCursor.html       |  198 +-
 ...tConnectionRegistriesTestBase.RegistryImpl.html |    4 +-
 ...eWithDifferentConnectionRegistriesTestBase.html |    4 +-
 .../hbase/client/ClientPushbackTestBase.html       |   40 +-
 .../hadoop/hbase/client/FromClientSideTest4.html   |    4 +-
 .../hbase/client/FromClientSideTestBase.html       |    6 +-
 .../hbase/client/MetaWithReplicasTestBase.html     |   22 +-
 .../client/RegionReplicaTestHelper.Locator.html    |    6 +-
 .../hbase/client/RegionReplicaTestHelper.html      |    6 +-
 .../client/SnapshotCloneIndependenceTestBase.html  |  443 +++
 .../hbase/client/SnapshotFromClientTestBase.html   |  537 ++++
 .../client/SnapshotTemporaryDirectoryTestBase.html |  530 +++
 .../SnapshotWithAclTestBase.AccessReadAction.html  |  100 +-
 ...apshotWithAclTestBase.AccessSnapshotAction.html |  100 +-
 .../SnapshotWithAclTestBase.AccessWriteAction.html |  100 +-
 .../hbase/client/SnapshotWithAclTestBase.html      |  100 +-
 .../org/apache/hadoop/hbase/client/TestAdmin.html  | 1041 +++---
 .../org/apache/hadoop/hbase/client/TestAdmin1.html | 1243 ++++---
 .../org/apache/hadoop/hbase/client/TestAdmin2.html | 1555 +++++----
 .../org/apache/hadoop/hbase/client/TestAdmin3.html | 1023 +++---
 .../org/apache/hadoop/hbase/client/TestAdmin4.html |  130 +-
 .../apache/hadoop/hbase/client/TestAdminBase.html  |   84 +-
 .../client/TestAllowPartialScanResultCache.html    |  137 +-
 .../hbase/client/TestAlwaysSetScannerId.html       |  195 +-
 .../hbase/client/TestAppendFromClientSide.html     |  129 +-
 ...syncAdminBuilder.TestMaxRetriesCoprocessor.html |  390 ++-
 ...minBuilder.TestOperationTimeoutCoprocessor.html |  390 ++-
 ...syncAdminBuilder.TestRpcTimeoutCoprocessor.html |  390 ++-
 .../hadoop/hbase/client/TestAsyncAdminBuilder.html |  390 ++-
 ...yncBufferMutator.AsyncBufferMutatorForTest.html |  547 ++--
 .../hbase/client/TestAsyncBufferMutator.html       |  547 ++--
 ...cThrottling.ThrottlingRSRpcServicesForTest.html |  676 ++--
 ...pcThrottling.ThrottlingRegionServerForTest.html |  676 ++--
 .../TestAsyncClientPauseForRpcThrottling.html      |  676 ++--
 ...yncClientPauseForServerOverloaded.FailMode.html |  413 ++-
 ...ntPauseForServerOverloaded.OverloadedQueue.html |  413 ++-
 ...ForServerOverloaded.OverloadedRpcScheduler.html |  413 ++-
 ...erOverloaded.OverloadedRpcSchedulerFactory.html |  413 ++-
 .../TestAsyncClientPauseForServerOverloaded.html   |  413 ++-
 .../hbase/client/TestAsyncClientPushback.html      |  119 +-
 .../client/TestAsyncNonMetaRegionLocator.html      |  974 +++---
 ...atorConcurrenyLimit.CountingRegionObserver.html |  269 +-
 ...stAsyncNonMetaRegionLocatorConcurrenyLimit.html |  269 +-
 ...TestAsyncRegionLocator.SleepRegionObserver.html |  243 +-
 .../hbase/client/TestAsyncRegionLocator.html       |  243 +-
 .../hbase/client/TestAsyncResultScannerCursor.html |   61 +-
 .../TestAsyncSingleRequestRpcRetryingCaller.html   |  307 +-
 .../apache/hadoop/hbase/client/TestAsyncTable.html | 3386 ++++++++++----------
 .../hbase/client/TestAsyncTableAdminApi.html       |  752 ++---
 .../hbase/client/TestAsyncTableAdminApi2.html      |  505 ++-
 .../TestAsyncTableBatch.ErrorInjectObserver.html   |  940 +++---
 .../hadoop/hbase/client/TestAsyncTableBatch.html   |  940 +++---
 .../TestAsyncTableBatchRetryImmediately.html       |  157 +-
 .../client/TestAsyncTableGetMultiThreaded.html     |  364 ++-
 ...ncTableGetMultiThreadedWithBasicCompaction.html |   41 +-
 ...ncTableGetMultiThreadedWithEagerCompaction.html |   41 +-
 .../hbase/client/TestAsyncTableLocatePrefetch.html |  119 +-
 .../TestAsyncTableLocateRegionForDeletedTable.html |  163 +-
 .../TestAsyncTableNoncedRetry.SleepOnceCP.html     |  683 ++--
 .../hbase/client/TestAsyncTableNoncedRetry.html    |  683 ++--
 .../hbase/client/TestAsyncTableQueryMetrics.html   |  418 ++-
 .../hbase/client/TestAsyncTableRSCrashPublish.html |  143 +-
 .../hbase/client/TestAsyncTableRegionLocator.html  |  133 +-
 .../client/TestAsyncTableRegionReplicasGet.html    |   69 +-
 .../client/TestAsyncTableRegionReplicasScan.html   |  109 +-
 .../TestAsyncTableScanException.ErrorCP.html       |  299 +-
 .../hbase/client/TestAsyncTableScanException.html  |  299 +-
 ...AsyncTableScanMetricsWithScannerSuspending.html |  243 +-
 ...syncTableScanRenewLease.RenewLeaseConsumer.html |  257 +-
 .../hbase/client/TestAsyncTableScanRenewLease.html |  257 +-
 .../TestAsyncTableScannerCloseWhileSuspending.html |  195 +-
 ...TableUseMetaReplicas.FailPrimaryMetaScanCp.html |  200 +-
 .../client/TestAsyncTableUseMetaReplicas.html      |  200 +-
 ...IntoShippedBlocks.CompactorInternalScanner.html |  839 +++--
 ...sIntoShippedBlocks.CompactorRegionObserver.html |  839 +++--
 ...lReferencesIntoShippedBlocks.ScannerThread.html |  839 +++--
 .../TestAvoidCellReferencesIntoShippedBlocks.html  |  839 +++--
 .../hbase/client/TestBatchScanResultCache.html     |  179 +-
 ...ictionFromClient.CustomInnerRegionObserver.html | 3162 +++++++++---------
 ...romClient.CustomInnerRegionObserverWrapper.html | 3162 +++++++++---------
 .../TestBlockEvictionFromClient.CustomScanner.html | 3162 +++++++++---------
 .../TestBlockEvictionFromClient.GetThread.html     | 3162 +++++++++---------
 ...TestBlockEvictionFromClient.MultiGetThread.html | 3162 +++++++++---------
 .../TestBlockEvictionFromClient.ScanThread.html    | 3162 +++++++++---------
 .../hbase/client/TestBlockEvictionFromClient.html  | 3162 +++++++++---------
 .../hbase/client/TestBootstrapNodeUpdate.html      |  153 +-
 .../hadoop/hbase/client/TestBufferedMutator.html   |  219 +-
 .../hbase/client/TestCIDeleteOperationTimeout.html |   31 +-
 .../hbase/client/TestCIDeleteRpcTimeout.html       |   31 +-
 .../hbase/client/TestCIGetOperationTimeout.html    |   31 +-
 .../hadoop/hbase/client/TestCIGetRpcTimeout.html   |   31 +-
 .../hbase/client/TestCIIncrementRpcTimeout.html    |   31 +-
 .../hbase/client/TestCIPutOperationTimeout.html    |   31 +-
 .../hadoop/hbase/client/TestCIPutRpcTimeout.html   |   31 +-
 .../apache/hadoop/hbase/client/TestCISleep.html    |  117 +-
 ...estCatalogReplicaLoadBalanceSimpleSelector.html |  205 +-
 .../hadoop/hbase/client/TestCheckAndMutate.html    | 1430 ++++-----
 ...utateWithByteBuff.TestCheckAndMutateRegion.html |  220 +-
 .../client/TestCheckAndMutateWithByteBuff.html     |  220 +-
 .../hbase/client/TestCleanupMetaReplica.html       |   61 +-
 .../TestCleanupMetaReplicaThroughConfig.html       |   87 +-
 ...stClientOperationInterrupt.TestCoprocessor.html |  307 +-
 .../hbase/client/TestClientOperationInterrupt.html |  307 +-
 ...annerTimeouts.RSRpcServicesWithScanTimeout.html |  814 +++--
 ...cannerTimeouts.RegionServerWithScanTimeout.html |  814 +++--
 .../hbase/client/TestClientScannerTimeouts.html    |  814 +++--
 ...ientSideRegionScanner.FiltersRowsLessThan5.html |  680 ++--
 .../hbase/client/TestClientSideRegionScanner.html  |  680 ++--
 .../hbase/client/TestClientTableMetrics.html       |  234 +-
 ...ntTimeouts.RandomTimeoutBlockingRpcChannel.html |  297 +-
 ...TestClientTimeouts.RandomTimeoutRpcChannel.html |  297 +-
 .../TestClientTimeouts.RandomTimeoutRpcClient.html |  297 +-
 .../hadoop/hbase/client/TestClientTimeouts.html    |  297 +-
 .../client/TestCompleteResultScanResultCache.html  |  321 +-
 .../apache/hadoop/hbase/client/TestConnection.html |  216 +-
 ...ConnectionAttributes.AttributesCoprocessor.html |  177 +-
 .../hbase/client/TestConnectionAttributes.html     |  177 +-
 .../hadoop/hbase/client/TestConnectionUtils.html   |  111 +-
 ...meoutRequest.SleepLongerAtFirstCoprocessor.html |  195 +-
 .../hbase/client/TestDropTimeoutRequest.html       |  195 +-
 .../client/TestEnableTable.MasterSyncObserver.html |  327 +-
 .../hadoop/hbase/client/TestEnableTable.html       |  327 +-
 ...ssigment.BrokenMasterMetaAssignmentManager.html |  275 +-
 ...taReplicaAssigment.BrokenMetaReplicaMaster.html |  275 +-
 ...ssigment.BrokenTransitRegionStateProcedure.html |  275 +-
 .../client/TestFailedMetaReplicaAssigment.html     |  275 +-
 .../hbase/client/TestFallbackToUseReplay.html      |  173 +-
 .../hadoop/hbase/client/TestFlushFromClient.html   |  420 ++-
 ...tFlushFromClientWithDisabledFlushProcedure.html |  185 +-
 .../TestGetProcedureResult.DummyProcedure.html     |  199 +-
 .../hbase/client/TestGetProcedureResult.html       |  199 +-
 .../TestGetScanColumnsWithNewVersionBehavior.html  |  151 +-
 .../hbase/client/TestGetScanPartialResult.html     |  155 +-
 ...FailingMergeAfterMetaUpdatedMasterObserver.html |  714 ++---
 ...FailingSplitAfterMetaUpdatedMasterObserver.html |  714 ++---
 .../hbase/client/TestHbck.SuspendProcedure.html    |  714 ++---
 .../org/apache/hadoop/hbase/client/TestHbck.html   |  714 ++---
 .../hbase/client/TestIllegalTableDescriptor.html   |  421 ++-
 .../TestIncreaseMetaReplicaThroughConfig.html      |   89 +-
 ...TestIncrementFromClientSideWithCoprocessor.html |   46 +-
 .../hbase/client/TestIncrementsFromClientSide.html | 1047 +++---
 .../hbase/client/TestIntraRowPagination.html       |  171 +-
 .../TestInvalidMutationDurabilityException.html    |  246 +-
 .../hbase/client/TestLimitedScanWithFilter.html    |  309 +-
 .../hbase/client/TestMalformedCellFromClient.html  |  620 ++--
 .../hadoop/hbase/client/TestMasterRegistry.html    |  324 +-
 ...MetaCache.CallQueueTooBigExceptionInjector.html |  835 +++--
 .../client/TestMetaCache.ExceptionInjector.html    |  835 +++--
 .../client/TestMetaCache.FakeRSRpcServices.html    |  835 +++--
 ...tMetaCache.RegionServerWithFakeRpcServices.html |  835 +++--
 .../TestMetaCache.RoundRobinExceptionInjector.html |  835 +++--
 .../apache/hadoop/hbase/client/TestMetaCache.html  |  835 +++--
 .../hbase/client/TestMetaRegionLocationCache.html  |  339 +-
 .../client/TestMetaReplicasAddressChange.html      |  127 +-
 .../client/TestMetaTableAccessorNoCluster.html     |  117 +-
 .../hbase/client/TestMetaWithReplicasBasic.html    |  131 +-
 .../TestMetaWithReplicasShutdownHandling.html      |  273 +-
 .../client/TestMobSnapshotCloneIndependence.html   |   88 +-
 .../hbase/client/TestMobSnapshotFromClient.html    |   72 +-
 .../client/TestMultiActionMetricsFromClient.html   |  113 +-
 .../client/TestMultiParallel.MyMasterObserver.html | 1241 ++++---
 .../hadoop/hbase/client/TestMultiParallel.html     | 1241 ++++---
 .../hbase/client/TestMultiRespectsLimits.html      |  385 ++-
 .../hbase/client/TestMultipleTimestamps.html       |  930 +++---
 .../hbase/client/TestMutationGetCellBuilder.html   |  155 +-
 .../hbase/client/TestMvccConsistentScanner.html    |  210 +-
 .../hbase/client/TestPreadReversedScanner.html     |  241 +-
 .../client/TestPutDeleteEtcCellIteration.html      |  256 +-
 .../hadoop/hbase/client/TestPutWithDelete.html     |  170 +-
 .../hbase/client/TestRawAsyncScanCursor.html       |  285 +-
 .../TestRawAsyncTableLimitedScanWithFilter.html    |  305 +-
 .../hbase/client/TestRawAsyncTablePartialScan.html |  185 +-
 .../hbase/client/TestRegionLocationCaching.html    |  415 ++-
 .../hadoop/hbase/client/TestRegionLocator.html     |  147 +-
 ...rverHostingPrimayMetaRegionSlowOrStopCopro.html | 1250 ++++----
 ...eplicaWithCluster.RegionServerStoppedCopro.html | 1250 ++++----
 .../client/TestReplicaWithCluster.SlowMeCopro.html | 1250 ++++----
 .../hbase/client/TestReplicaWithCluster.html       | 1250 ++++----
 .../client/TestReplicasClient.SlowMeCopro.html     | 1333 ++++----
 .../hadoop/hbase/client/TestReplicasClient.html    | 1333 ++++----
 ...estRequestAttributes.AttributesCoprocessor.html |  637 ++--
 ...ontrollerFactory.RequestMetadataController.html |  637 ++--
 ...ttributes.RequestMetadataControllerFactory.html |  637 ++--
 .../hadoop/hbase/client/TestRequestAttributes.html |  637 ++--
 .../hbase/client/TestRequestTooBigException.html   |  113 +-
 .../org/apache/hadoop/hbase/client/TestResult.html |  990 +++---
 .../TestResultFromCoprocessor.MyObserver.html      |  215 +-
 .../hbase/client/TestResultFromCoprocessor.html    |  215 +-
 .../hbase/client/TestResultScannerCursor.html      |   43 +-
 .../hbase/client/TestResultSizeEstimation.html     |  211 +-
 .../hbase/client/TestRpcConnectionRegistry.html    |  253 +-
 .../hadoop/hbase/client/TestScanAttributes.html    |   58 +-
 .../hbase/client/TestScanWithoutFetchingData.html  |  239 +-
 .../hadoop/hbase/client/TestScannerTimeout.html    |  363 ++-
 .../hbase/client/TestScannersFromClientSide2.html  |  450 ++-
 .../hbase/client/TestSeparateClientZKCluster.html  |  535 ++--
 .../TestServerBusyException.SleepCoprocessor.html  |  401 ++-
 ...usyException.SleepLongerAtFirstCoprocessor.html |  401 ++-
 .../TestServerBusyException.TestGetThread.html     |  401 ++-
 .../TestServerBusyException.TestPutThread.html     |  401 ++-
 .../hbase/client/TestServerBusyException.html      |  401 ++-
 .../hbase/client/TestServerLoadDurability.html     |  189 +-
 .../client/TestShutdownOfMetaReplicaHolder.html    |   89 +-
 .../hadoop/hbase/client/TestSizeFailures.html      |  280 +-
 .../client/TestSnapshotCloneIndependence.html      |  390 +--
 .../client/TestSnapshotDFSTemporaryDirectory.html  |   36 +-
 .../hbase/client/TestSnapshotFromClient.html       |  487 +--
 .../TestSnapshotFromClientWithRegionReplicas.html  |   49 +-
 .../hadoop/hbase/client/TestSnapshotMetadata.html  |  545 ++--
 .../client/TestSnapshotTemporaryDirectory.html     |  477 +--
 ...apshotTemporaryDirectoryWithRegionReplicas.html |   44 +-
 .../hadoop/hbase/client/TestSnapshotWithAcl.html   |   53 +-
 .../client/TestSnapshotWithAclAsyncAdmin.html      |   75 +-
 .../client/TestSnapshotWithTTLFromClient.html      |  413 ++-
 .../hbase/client/TestSplitOrMergeAtTableLevel.html |  497 ++-
 .../hbase/client/TestSplitOrMergeStatus.html       |  388 ++-
 .../hadoop/hbase/client/TestTableFavoredNodes.html |  672 ++--
 ...tion.ThrowDoNotRetryIOExceptionCoprocessor.html |  322 +-
 ...ationException.ThrowIOExceptionCoprocessor.html |  322 +-
 .../hbase/client/TestTableOperationException.html  |  322 +-
 .../hbase/client/TestTableSnapshotScanner.html     | 1196 ++++---
 .../client/TestTableSnapshotScannerWithSFT.html    |   39 +-
 .../hadoop/hbase/client/TestTimestampsFilter.html  |  664 ++--
 .../hbase/client/TestUpdateConfiguration.html      |  180 +-
 .../hbase/client/TestZKConnectionRegistry.html     |  195 +-
 .../hbase/client/locking/TestEntityLocks.html      |  335 +-
 .../client/replication/TestBadReplicationPeer.html |  135 +-
 .../TestReplicationAdminForSyncReplication.html    |  183 +-
 .../hbase/filter/TestFilterHintForRejectedRow.html | 1971 ++++++++----
 .../hbase/filter/TestFilterListHintDelegation.html |  787 +++++
 testdevapidocs/type-search-index.js                |    2 +-
 921 files changed, 120307 insertions(+), 119821 deletions(-)

diff --git a/__spa-fallback.html b/__spa-fallback.html
index 3774adf10b3..19ffdb1cdb9 100644
--- a/__spa-fallback.html
+++ b/__spa-fallback.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -19,7 +19,7 @@
                 "functions. Check out https://reactrouter.com/start/framework/route-module#hydratefallback " +
                 "for more information."
               );
-            </script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeTh [...]
+            </script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeTh [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
   
   window.__reactRouterRouteModules = {"root":route0};
diff --git a/acid-semantics/index.html b/acid-semantics/index.html
index 41cd986bf25..724e38b612f 100644
--- a/acid-semantics/index.html
+++ b/acid-semantics/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><title>ACID Semantics - Apache HBase</title><meta name="description" content="Apache HBase ACID properties and guarantees specification."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-l [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><title>ACID Semantics - Apache HBase</title><meta name="description" content="Apache HBase ACID properties and guarantees specification."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-l [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -133,7 +133,7 @@ an update is considered visible if any subsequent read will see the update as ha
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/landing-layout-By78yIYe.js";
 import * as route2 from "/assets/acid-semantics-BoTYVlwm.js";
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index efda800ae7d..614babc5848 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -25635,12 +25635,26 @@ loadScripts(document, 'script');</script>
 <div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
  implementation.</div>
 </dd>
+<dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterList</dt>
+<dd>&nbsp;</dd>
+<dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterListWithAND</dt>
+<dd>
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</dd>
+<dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterListWithOR</dt>
+<dd>
+<div class="block">Minimal step: return the nearest hint.</div>
+</dd>
 <dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterWrapper</dt>
 <dd>
 <div class="block">Delegates to the wrapped filter's <code>Filter.getHintForRejectedRow(Cell)</code> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </dd>
+<dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.SkipFilter</dt>
+<dd>&nbsp;</dd>
+<dt>getHintForRejectedRow(Cell) - Method in class org.apache.hadoop.hbase.filter.WhileMatchFilter</dt>
+<dd>&nbsp;</dd>
 <dt>getHistogram() - Method in interface org.apache.hadoop.hbase.metrics.Timer</dt>
 <dd>&nbsp;</dd>
 <dt>getHistogramReport(Histogram) - Static method in class org.apache.hadoop.hbase.util.YammerHistogramUtils</dt>
@@ -33172,6 +33186,10 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>getSkipBadLines() - Method in class org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper</dt>
 <dd>&nbsp;</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.ColumnPrefixFilter</dt>
+<dd>&nbsp;</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.ColumnRangeFilter</dt>
+<dd>&nbsp;</dd>
 <dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.Filter</dt>
 <dd>
 <div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
@@ -33181,11 +33199,27 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
 </dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterList</dt>
+<dd>&nbsp;</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterListWithAND</dt>
+<dd>
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterListWithOR</dt>
+<dd>
+<div class="block">Minimal step: return the nearest skip hint.</div>
+</dd>
 <dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.FilterWrapper</dt>
 <dd>
 <div class="block">Delegates to the wrapped filter's <code>Filter.getSkipHint(Cell)</code> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter</dt>
+<dd>&nbsp;</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.SkipFilter</dt>
+<dd>&nbsp;</dd>
+<dt>getSkipHint(Cell) - Method in class org.apache.hadoop.hbase.filter.WhileMatchFilter</dt>
+<dd>&nbsp;</dd>
 <dt>getSkippingRow() - Method in class org.apache.hadoop.hbase.regionserver.ScannerContext</dt>
 <dd>
 <div class="block">In this mode, only block size progress is tracked, and limits are ignored.</div>
diff --git a/apidocs/member-search-index.js b/apidocs/member-search-index.js
index 2c2daf88a92..c132fd0f0b4 100644
--- a/apidocs/member-search-index.js
+++ b/apidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hdfs","c":"DummyDFSOutputStream","l":"abort()"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abo [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hdfs","c":"DummyDFSOutputStream","l":"abort()"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abo [...]
\ No newline at end of file
diff --git a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
index aee5f1eb4ba..92e767fb06b 100644
--- a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
+++ b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
@@ -1377,72 +1377,110 @@ service.</div>
  implementation.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color">
+<div class="block">Minimal step: return the nearest hint.</div>
+</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Delegates to the wrapped filter's <code>Filter.getHintForRejectedRow(Cell)</code> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </div>
-<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentKV)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentKV)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">PrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">PrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TimestampsFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TimestampsFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Pick the next cell that the scanner should seek to.</div>
+<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <code>Filter.filterCell(Cell)</code> is ever reached.</div>
 </div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
- <em>before</em> <code>Filter.filterCell(Cell)</code> is ever reached.</div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+<div class="block">Minimal step: return the nearest skip hint.</div>
 </div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
@@ -1450,36 +1488,45 @@ service.</div>
 <div class="block">Delegates to the wrapped filter's <code>Filter.getSkipHint(Cell)</code> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </div>
-<div class="col-first even-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Give the filter a chance to transform the passed Cell.</div>
-</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+<div class="block">Give the filter a chance to transform the passed Cell.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
-<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-last even-row-color">
+<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
+<div class="col-last even-row-color">
 <div class="block">For FilterList, we can consider a filter list as a node in a tree.</div>
 </div>
-<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
-<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <div class="caption"><span>Methods in <a href="../filter/package-summary.html">org.apache.hadoop.hbase.filter</a> with parameters of type org.apache.hadoop.hbase.Cell in  in </span></div>
 <div class="summary-table three-column-summary">
@@ -1698,72 +1745,110 @@ service.</div>
  implementation.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color">
+<div class="block">Minimal step: return the nearest hint.</div>
+</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Delegates to the wrapped filter's <code>Filter.getHintForRejectedRow(Cell)</code> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>getHintForRejectedRow<wbr>(org.apache.hadoop.hbase.Cell&nbsp;firstRowCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </div>
-<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentKV)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentKV)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">PrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">PrefixFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TimestampsFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TimestampsFilter.</span><code>getNextCellHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Pick the next cell that the scanner should seek to.</div>
+<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <code>Filter.filterCell(Cell)</code> is ever reached.</div>
 </div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
- <em>before</em> <code>Filter.filterCell(Cell)</code> is ever reached.</div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+<div class="block">Minimal step: return the nearest skip hint.</div>
 </div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
@@ -1771,36 +1856,45 @@ service.</div>
 <div class="block">Delegates to the wrapped filter's <code>Filter.getSkipHint(Cell)</code> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </div>
-<div class="col-first even-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Give the filter a chance to transform the passed Cell.</div>
-</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>getSkipHint<wbr>(org.apache.hadoop.hbase.Cell&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>abstract org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+<div class="block">Give the filter a chance to transform the passed Cell.</div>
 </div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
-<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-last even-row-color">
+<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListBase.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;c)</code></div>
+<div class="col-last even-row-color">
 <div class="block">For FilterList, we can consider a filter list as a node in a tree.</div>
 </div>
-<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
-<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.Cell</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code>transformCell<wbr>(org.apache.hadoop.hbase.Cell&nbsp;v)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <div class="caption"><span>Method parameters in <a href="../filter/package-summary.html">org.apache.hadoop.hbase.filter</a> with type arguments of type org.apache.hadoop.hbase.Cell in  in </span></div>
 <div class="summary-table three-column-summary">
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
index e23e4d9d48e..09d92770cbc 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
@@ -162,20 +162,28 @@
 <span class="source-line-no">149</span><span id="line-149">  }</span>
 <span class="source-line-no">150</span><span id="line-150"></span>
 <span class="source-line-no">151</span><span id="line-151">  @Override</span>
-<span class="source-line-no">152</span><span id="line-152">  public String toString() {</span>
-<span class="source-line-no">153</span><span id="line-153">    return this.getClass().getSimpleName() + " " + Bytes.toStringBinary(this.prefix);</span>
-<span class="source-line-no">154</span><span id="line-154">  }</span>
-<span class="source-line-no">155</span><span id="line-155"></span>
-<span class="source-line-no">156</span><span id="line-156">  @Override</span>
-<span class="source-line-no">157</span><span id="line-157">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">158</span><span id="line-158">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">159</span><span id="line-159">  }</span>
-<span class="source-line-no">160</span><span id="line-160"></span>
-<span class="source-line-no">161</span><span id="line-161">  @Override</span>
-<span class="source-line-no">162</span><span id="line-162">  public int hashCode() {</span>
-<span class="source-line-no">163</span><span id="line-163">    return Bytes.hashCode(this.getPrefix());</span>
-<span class="source-line-no">164</span><span id="line-164">  }</span>
-<span class="source-line-no">165</span><span id="line-165">}</span>
+<span class="source-line-no">152</span><span id="line-152">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">153</span><span id="line-153">    if (this.prefix == null) {</span>
+<span class="source-line-no">154</span><span id="line-154">      return null;</span>
+<span class="source-line-no">155</span><span id="line-155">    }</span>
+<span class="source-line-no">156</span><span id="line-156">    return getNextCellHint(skippedCell);</span>
+<span class="source-line-no">157</span><span id="line-157">  }</span>
+<span class="source-line-no">158</span><span id="line-158"></span>
+<span class="source-line-no">159</span><span id="line-159">  @Override</span>
+<span class="source-line-no">160</span><span id="line-160">  public String toString() {</span>
+<span class="source-line-no">161</span><span id="line-161">    return this.getClass().getSimpleName() + " " + Bytes.toStringBinary(this.prefix);</span>
+<span class="source-line-no">162</span><span id="line-162">  }</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Override</span>
+<span class="source-line-no">165</span><span id="line-165">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">166</span><span id="line-166">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">167</span><span id="line-167">  }</span>
+<span class="source-line-no">168</span><span id="line-168"></span>
+<span class="source-line-no">169</span><span id="line-169">  @Override</span>
+<span class="source-line-no">170</span><span id="line-170">  public int hashCode() {</span>
+<span class="source-line-no">171</span><span id="line-171">    return Bytes.hashCode(this.getPrefix());</span>
+<span class="source-line-no">172</span><span id="line-172">  }</span>
+<span class="source-line-no">173</span><span id="line-173">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
index 5c4892d91f3..ad3a0ca9cfc 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
@@ -214,23 +214,31 @@
 <span class="source-line-no">201</span><span id="line-201">  }</span>
 <span class="source-line-no">202</span><span id="line-202"></span>
 <span class="source-line-no">203</span><span id="line-203">  @Override</span>
-<span class="source-line-no">204</span><span id="line-204">  public String toString() {</span>
-<span class="source-line-no">205</span><span id="line-205">    return this.getClass().getSimpleName() + " " + (this.minColumnInclusive ? "[" : "(")</span>
-<span class="source-line-no">206</span><span id="line-206">      + Bytes.toStringBinary(this.minColumn) + ", " + Bytes.toStringBinary(this.maxColumn)</span>
-<span class="source-line-no">207</span><span id="line-207">      + (this.maxColumnInclusive ? "]" : ")");</span>
-<span class="source-line-no">208</span><span id="line-208">  }</span>
-<span class="source-line-no">209</span><span id="line-209"></span>
-<span class="source-line-no">210</span><span id="line-210">  @Override</span>
-<span class="source-line-no">211</span><span id="line-211">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">212</span><span id="line-212">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">213</span><span id="line-213">  }</span>
-<span class="source-line-no">214</span><span id="line-214"></span>
-<span class="source-line-no">215</span><span id="line-215">  @Override</span>
-<span class="source-line-no">216</span><span id="line-216">  public int hashCode() {</span>
-<span class="source-line-no">217</span><span id="line-217">    return Objects.hash(Bytes.hashCode(getMinColumn()), getMinColumnInclusive(),</span>
-<span class="source-line-no">218</span><span id="line-218">      Bytes.hashCode(getMaxColumn()), getMaxColumnInclusive());</span>
-<span class="source-line-no">219</span><span id="line-219">  }</span>
-<span class="source-line-no">220</span><span id="line-220">}</span>
+<span class="source-line-no">204</span><span id="line-204">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">205</span><span id="line-205">    if (this.minColumn == null) {</span>
+<span class="source-line-no">206</span><span id="line-206">      return null;</span>
+<span class="source-line-no">207</span><span id="line-207">    }</span>
+<span class="source-line-no">208</span><span id="line-208">    return getNextCellHint(skippedCell);</span>
+<span class="source-line-no">209</span><span id="line-209">  }</span>
+<span class="source-line-no">210</span><span id="line-210"></span>
+<span class="source-line-no">211</span><span id="line-211">  @Override</span>
+<span class="source-line-no">212</span><span id="line-212">  public String toString() {</span>
+<span class="source-line-no">213</span><span id="line-213">    return this.getClass().getSimpleName() + " " + (this.minColumnInclusive ? "[" : "(")</span>
+<span class="source-line-no">214</span><span id="line-214">      + Bytes.toStringBinary(this.minColumn) + ", " + Bytes.toStringBinary(this.maxColumn)</span>
+<span class="source-line-no">215</span><span id="line-215">      + (this.maxColumnInclusive ? "]" : ")");</span>
+<span class="source-line-no">216</span><span id="line-216">  }</span>
+<span class="source-line-no">217</span><span id="line-217"></span>
+<span class="source-line-no">218</span><span id="line-218">  @Override</span>
+<span class="source-line-no">219</span><span id="line-219">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">220</span><span id="line-220">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">221</span><span id="line-221">  }</span>
+<span class="source-line-no">222</span><span id="line-222"></span>
+<span class="source-line-no">223</span><span id="line-223">  @Override</span>
+<span class="source-line-no">224</span><span id="line-224">  public int hashCode() {</span>
+<span class="source-line-no">225</span><span id="line-225">    return Objects.hash(Bytes.hashCode(getMinColumn()), getMinColumnInclusive(),</span>
+<span class="source-line-no">226</span><span id="line-226">      Bytes.hashCode(getMaxColumn()), getMaxColumnInclusive());</span>
+<span class="source-line-no">227</span><span id="line-227">  }</span>
+<span class="source-line-no">228</span><span id="line-228">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
index d4ec9c51692..fb335c4f5ae 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
@@ -229,112 +229,118 @@
 <span class="source-line-no">216</span><span id="line-216">   * must point to a &lt;em&gt;smaller&lt;/em&gt; row key (earlier in reverse-scan direction). The scanner</span>
 <span class="source-line-no">217</span><span id="line-217">   * validates hint direction and falls back to {@code nextRow()} if the hint does not advance in</span>
 <span class="source-line-no">218</span><span id="line-218">   * the scan direction.&lt;/li&gt;</span>
-<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">220</span><span id="line-220">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">221</span><span id="line-221">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">222</span><span id="line-222">   * &lt;/ul&gt;</span>
-<span class="source-line-no">223</span><span id="line-223">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
-<span class="source-line-no">224</span><span id="line-224">   *                     was passed to {@code filterRowKey}</span>
-<span class="source-line-no">225</span><span id="line-225">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">226</span><span id="line-226">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
-<span class="source-line-no">227</span><span id="line-227">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">228</span><span id="line-228">   * @see #filterRowKey(Cell)</span>
-<span class="source-line-no">229</span><span id="line-229">   */</span>
-<span class="source-line-no">230</span><span id="line-230">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">231</span><span id="line-231">    return null;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  /**</span>
-<span class="source-line-no">235</span><span id="line-235">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
-<span class="source-line-no">236</span><span id="line-236">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
-<span class="source-line-no">237</span><span id="line-237">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
-<span class="source-line-no">238</span><span id="line-238">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
-<span class="source-line-no">239</span><span id="line-239">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
-<span class="source-line-no">240</span><span id="line-240">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
-<span class="source-line-no">241</span><span id="line-241">   * ahead instead of advancing one cell at a time.</span>
-<span class="source-line-no">242</span><span id="line-242">   * &lt;p&gt;</span>
-<span class="source-line-no">243</span><span id="line-243">   * Contract:</span>
-<span class="source-line-no">244</span><span id="line-244">   * &lt;ul&gt;</span>
-<span class="source-line-no">245</span><span id="line-245">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
-<span class="source-line-no">246</span><span id="line-246">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
-<span class="source-line-no">247</span><span id="line-247">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
-<span class="source-line-no">248</span><span id="line-248">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
-<span class="source-line-no">249</span><span id="line-249">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
-<span class="source-line-no">250</span><span id="line-250">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
-<span class="source-line-no">251</span><span id="line-251">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
-<span class="source-line-no">252</span><span id="line-252">   * side.&lt;/li&gt;</span>
-<span class="source-line-no">253</span><span id="line-253">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
-<span class="source-line-no">254</span><span id="line-254">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
-<span class="source-line-no">255</span><span id="line-255">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
-<span class="source-line-no">256</span><span id="line-256">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
-<span class="source-line-no">257</span><span id="line-257">   * direction are silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">258</span><span id="line-258">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">259</span><span id="line-259">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">260</span><span id="line-260">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">261</span><span id="line-261">   * &lt;/ul&gt;</span>
-<span class="source-line-no">262</span><span id="line-262">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
-<span class="source-line-no">263</span><span id="line-263">   *                    {@code filterCell} could be consulted</span>
-<span class="source-line-no">264</span><span id="line-264">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">265</span><span id="line-265">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
-<span class="source-line-no">266</span><span id="line-266">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">267</span><span id="line-267">   * @see #filterCell(Cell)</span>
-<span class="source-line-no">268</span><span id="line-268">   * @see #getNextCellHint(Cell)</span>
-<span class="source-line-no">269</span><span id="line-269">   */</span>
-<span class="source-line-no">270</span><span id="line-270">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
-<span class="source-line-no">271</span><span id="line-271">    return null;</span>
-<span class="source-line-no">272</span><span id="line-272">  }</span>
-<span class="source-line-no">273</span><span id="line-273"></span>
-<span class="source-line-no">274</span><span id="line-274">  /**</span>
-<span class="source-line-no">275</span><span id="line-275">   * Check that given column family is essential for filter to check row. Most filters always return</span>
-<span class="source-line-no">276</span><span id="line-276">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
-<span class="source-line-no">277</span><span id="line-277">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
-<span class="source-line-no">278</span><span id="line-278">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">279</span><span id="line-279">   * {@link IOException}.</span>
-<span class="source-line-no">280</span><span id="line-280">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
-<span class="source-line-no">283</span><span id="line-283"></span>
-<span class="source-line-no">284</span><span id="line-284">  /**</span>
-<span class="source-line-no">285</span><span id="line-285">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">286</span><span id="line-286">   * {@link IOException}.</span>
-<span class="source-line-no">287</span><span id="line-287">   * @return The filter serialized using pb</span>
-<span class="source-line-no">288</span><span id="line-288">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  abstract public byte[] toByteArray() throws IOException;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">  /**</span>
-<span class="source-line-no">293</span><span id="line-293">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">294</span><span id="line-294">   * {@link IOException}.</span>
-<span class="source-line-no">295</span><span id="line-295">   * @param pbBytes A pb serialized {@link Filter} instance</span>
-<span class="source-line-no">296</span><span id="line-296">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
-<span class="source-line-no">297</span><span id="line-297">   * @throws DeserializationException if an error occurred</span>
-<span class="source-line-no">298</span><span id="line-298">   * @see #toByteArray</span>
-<span class="source-line-no">299</span><span id="line-299">   */</span>
-<span class="source-line-no">300</span><span id="line-300">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
-<span class="source-line-no">301</span><span id="line-301">    throw new DeserializationException(</span>
-<span class="source-line-no">302</span><span id="line-302">      "parseFrom called on base Filter, but should be called on derived type");</span>
-<span class="source-line-no">303</span><span id="line-303">  }</span>
-<span class="source-line-no">304</span><span id="line-304"></span>
-<span class="source-line-no">305</span><span id="line-305">  /**</span>
-<span class="source-line-no">306</span><span id="line-306">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">307</span><span id="line-307">   * {@link IOException}.</span>
-<span class="source-line-no">308</span><span id="line-308">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
-<span class="source-line-no">309</span><span id="line-309">   *         corresponding fields in other. Used for testing.</span>
-<span class="source-line-no">310</span><span id="line-310">   */</span>
-<span class="source-line-no">311</span><span id="line-311">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
-<span class="source-line-no">312</span><span id="line-312"></span>
-<span class="source-line-no">313</span><span id="line-313">  /**</span>
-<span class="source-line-no">314</span><span id="line-314">   * alter the reversed scan flag</span>
-<span class="source-line-no">315</span><span id="line-315">   * @param reversed flag</span>
+<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">220</span><span id="line-220">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">221</span><span id="line-221">   * method to their sub-filters and merge the results. For AND ({@code MUST_PASS_ALL}), only</span>
+<span class="source-line-no">222</span><span id="line-222">   * sub-filters whose {@code filterRowKey} individually returned {@code true} are consulted, and</span>
+<span class="source-line-no">223</span><span id="line-223">   * the farthest (maximal-step) hint among them is returned. For OR ({@code MUST_PASS_ONE}), the</span>
+<span class="source-line-no">224</span><span id="line-224">   * nearest hint is returned only when every non-terminated sub-filter provides one — any null</span>
+<span class="source-line-no">225</span><span id="line-225">   * collapses the OR result to null.&lt;/li&gt;</span>
+<span class="source-line-no">226</span><span id="line-226">   * &lt;/ul&gt;</span>
+<span class="source-line-no">227</span><span id="line-227">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
+<span class="source-line-no">228</span><span id="line-228">   *                     was passed to {@code filterRowKey}</span>
+<span class="source-line-no">229</span><span id="line-229">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">230</span><span id="line-230">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
+<span class="source-line-no">231</span><span id="line-231">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">232</span><span id="line-232">   * @see #filterRowKey(Cell)</span>
+<span class="source-line-no">233</span><span id="line-233">   */</span>
+<span class="source-line-no">234</span><span id="line-234">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">235</span><span id="line-235">    return null;</span>
+<span class="source-line-no">236</span><span id="line-236">  }</span>
+<span class="source-line-no">237</span><span id="line-237"></span>
+<span class="source-line-no">238</span><span id="line-238">  /**</span>
+<span class="source-line-no">239</span><span id="line-239">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
+<span class="source-line-no">240</span><span id="line-240">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
+<span class="source-line-no">241</span><span id="line-241">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
+<span class="source-line-no">242</span><span id="line-242">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
+<span class="source-line-no">243</span><span id="line-243">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
+<span class="source-line-no">244</span><span id="line-244">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
+<span class="source-line-no">245</span><span id="line-245">   * ahead instead of advancing one cell at a time.</span>
+<span class="source-line-no">246</span><span id="line-246">   * &lt;p&gt;</span>
+<span class="source-line-no">247</span><span id="line-247">   * Contract:</span>
+<span class="source-line-no">248</span><span id="line-248">   * &lt;ul&gt;</span>
+<span class="source-line-no">249</span><span id="line-249">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
+<span class="source-line-no">250</span><span id="line-250">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
+<span class="source-line-no">251</span><span id="line-251">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
+<span class="source-line-no">252</span><span id="line-252">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
+<span class="source-line-no">253</span><span id="line-253">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
+<span class="source-line-no">254</span><span id="line-254">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
+<span class="source-line-no">255</span><span id="line-255">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
+<span class="source-line-no">256</span><span id="line-256">   * side.&lt;/li&gt;</span>
+<span class="source-line-no">257</span><span id="line-257">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
+<span class="source-line-no">258</span><span id="line-258">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
+<span class="source-line-no">259</span><span id="line-259">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
+<span class="source-line-no">260</span><span id="line-260">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
+<span class="source-line-no">261</span><span id="line-261">   * direction are silently ignored.&lt;/li&gt;</span>
+<span class="source-line-no">262</span><span id="line-262">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">263</span><span id="line-263">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">264</span><span id="line-264">   * method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest</span>
+<span class="source-line-no">265</span><span id="line-265">   * hint is returned only when every non-terminated sub-filter provides one — any null collapses</span>
+<span class="source-line-no">266</span><span id="line-266">   * the OR result to null).&lt;/li&gt;</span>
+<span class="source-line-no">267</span><span id="line-267">   * &lt;/ul&gt;</span>
+<span class="source-line-no">268</span><span id="line-268">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
+<span class="source-line-no">269</span><span id="line-269">   *                    {@code filterCell} could be consulted</span>
+<span class="source-line-no">270</span><span id="line-270">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">271</span><span id="line-271">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
+<span class="source-line-no">272</span><span id="line-272">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">273</span><span id="line-273">   * @see #filterCell(Cell)</span>
+<span class="source-line-no">274</span><span id="line-274">   * @see #getNextCellHint(Cell)</span>
+<span class="source-line-no">275</span><span id="line-275">   */</span>
+<span class="source-line-no">276</span><span id="line-276">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">277</span><span id="line-277">    return null;</span>
+<span class="source-line-no">278</span><span id="line-278">  }</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">  /**</span>
+<span class="source-line-no">281</span><span id="line-281">   * Check that given column family is essential for filter to check row. Most filters always return</span>
+<span class="source-line-no">282</span><span id="line-282">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
+<span class="source-line-no">283</span><span id="line-283">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
+<span class="source-line-no">284</span><span id="line-284">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">285</span><span id="line-285">   * {@link IOException}.</span>
+<span class="source-line-no">286</span><span id="line-286">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">287</span><span id="line-287">   */</span>
+<span class="source-line-no">288</span><span id="line-288">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">292</span><span id="line-292">   * {@link IOException}.</span>
+<span class="source-line-no">293</span><span id="line-293">   * @return The filter serialized using pb</span>
+<span class="source-line-no">294</span><span id="line-294">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">295</span><span id="line-295">   */</span>
+<span class="source-line-no">296</span><span id="line-296">  abstract public byte[] toByteArray() throws IOException;</span>
+<span class="source-line-no">297</span><span id="line-297"></span>
+<span class="source-line-no">298</span><span id="line-298">  /**</span>
+<span class="source-line-no">299</span><span id="line-299">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link IOException}.</span>
+<span class="source-line-no">301</span><span id="line-301">   * @param pbBytes A pb serialized {@link Filter} instance</span>
+<span class="source-line-no">302</span><span id="line-302">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
+<span class="source-line-no">303</span><span id="line-303">   * @throws DeserializationException if an error occurred</span>
+<span class="source-line-no">304</span><span id="line-304">   * @see #toByteArray</span>
+<span class="source-line-no">305</span><span id="line-305">   */</span>
+<span class="source-line-no">306</span><span id="line-306">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
+<span class="source-line-no">307</span><span id="line-307">    throw new DeserializationException(</span>
+<span class="source-line-no">308</span><span id="line-308">      "parseFrom called on base Filter, but should be called on derived type");</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  /**</span>
+<span class="source-line-no">312</span><span id="line-312">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">313</span><span id="line-313">   * {@link IOException}.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
+<span class="source-line-no">315</span><span id="line-315">   *         corresponding fields in other. Used for testing.</span>
 <span class="source-line-no">316</span><span id="line-316">   */</span>
-<span class="source-line-no">317</span><span id="line-317">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">318</span><span id="line-318">    this.reversed = reversed;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  public boolean isReversed() {</span>
-<span class="source-line-no">322</span><span id="line-322">    return this.reversed;</span>
-<span class="source-line-no">323</span><span id="line-323">  }</span>
-<span class="source-line-no">324</span><span id="line-324">}</span>
+<span class="source-line-no">317</span><span id="line-317">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">  /**</span>
+<span class="source-line-no">320</span><span id="line-320">   * alter the reversed scan flag</span>
+<span class="source-line-no">321</span><span id="line-321">   * @param reversed flag</span>
+<span class="source-line-no">322</span><span id="line-322">   */</span>
+<span class="source-line-no">323</span><span id="line-323">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">324</span><span id="line-324">    this.reversed = reversed;</span>
+<span class="source-line-no">325</span><span id="line-325">  }</span>
+<span class="source-line-no">326</span><span id="line-326"></span>
+<span class="source-line-no">327</span><span id="line-327">  public boolean isReversed() {</span>
+<span class="source-line-no">328</span><span id="line-328">    return this.reversed;</span>
+<span class="source-line-no">329</span><span id="line-329">  }</span>
+<span class="source-line-no">330</span><span id="line-330">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
index 2f33d98eb0f..aeb5a0847b5 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
@@ -229,112 +229,118 @@
 <span class="source-line-no">216</span><span id="line-216">   * must point to a &lt;em&gt;smaller&lt;/em&gt; row key (earlier in reverse-scan direction). The scanner</span>
 <span class="source-line-no">217</span><span id="line-217">   * validates hint direction and falls back to {@code nextRow()} if the hint does not advance in</span>
 <span class="source-line-no">218</span><span id="line-218">   * the scan direction.&lt;/li&gt;</span>
-<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">220</span><span id="line-220">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">221</span><span id="line-221">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">222</span><span id="line-222">   * &lt;/ul&gt;</span>
-<span class="source-line-no">223</span><span id="line-223">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
-<span class="source-line-no">224</span><span id="line-224">   *                     was passed to {@code filterRowKey}</span>
-<span class="source-line-no">225</span><span id="line-225">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">226</span><span id="line-226">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
-<span class="source-line-no">227</span><span id="line-227">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">228</span><span id="line-228">   * @see #filterRowKey(Cell)</span>
-<span class="source-line-no">229</span><span id="line-229">   */</span>
-<span class="source-line-no">230</span><span id="line-230">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">231</span><span id="line-231">    return null;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  /**</span>
-<span class="source-line-no">235</span><span id="line-235">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
-<span class="source-line-no">236</span><span id="line-236">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
-<span class="source-line-no">237</span><span id="line-237">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
-<span class="source-line-no">238</span><span id="line-238">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
-<span class="source-line-no">239</span><span id="line-239">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
-<span class="source-line-no">240</span><span id="line-240">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
-<span class="source-line-no">241</span><span id="line-241">   * ahead instead of advancing one cell at a time.</span>
-<span class="source-line-no">242</span><span id="line-242">   * &lt;p&gt;</span>
-<span class="source-line-no">243</span><span id="line-243">   * Contract:</span>
-<span class="source-line-no">244</span><span id="line-244">   * &lt;ul&gt;</span>
-<span class="source-line-no">245</span><span id="line-245">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
-<span class="source-line-no">246</span><span id="line-246">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
-<span class="source-line-no">247</span><span id="line-247">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
-<span class="source-line-no">248</span><span id="line-248">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
-<span class="source-line-no">249</span><span id="line-249">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
-<span class="source-line-no">250</span><span id="line-250">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
-<span class="source-line-no">251</span><span id="line-251">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
-<span class="source-line-no">252</span><span id="line-252">   * side.&lt;/li&gt;</span>
-<span class="source-line-no">253</span><span id="line-253">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
-<span class="source-line-no">254</span><span id="line-254">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
-<span class="source-line-no">255</span><span id="line-255">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
-<span class="source-line-no">256</span><span id="line-256">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
-<span class="source-line-no">257</span><span id="line-257">   * direction are silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">258</span><span id="line-258">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">259</span><span id="line-259">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">260</span><span id="line-260">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">261</span><span id="line-261">   * &lt;/ul&gt;</span>
-<span class="source-line-no">262</span><span id="line-262">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
-<span class="source-line-no">263</span><span id="line-263">   *                    {@code filterCell} could be consulted</span>
-<span class="source-line-no">264</span><span id="line-264">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">265</span><span id="line-265">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
-<span class="source-line-no">266</span><span id="line-266">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">267</span><span id="line-267">   * @see #filterCell(Cell)</span>
-<span class="source-line-no">268</span><span id="line-268">   * @see #getNextCellHint(Cell)</span>
-<span class="source-line-no">269</span><span id="line-269">   */</span>
-<span class="source-line-no">270</span><span id="line-270">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
-<span class="source-line-no">271</span><span id="line-271">    return null;</span>
-<span class="source-line-no">272</span><span id="line-272">  }</span>
-<span class="source-line-no">273</span><span id="line-273"></span>
-<span class="source-line-no">274</span><span id="line-274">  /**</span>
-<span class="source-line-no">275</span><span id="line-275">   * Check that given column family is essential for filter to check row. Most filters always return</span>
-<span class="source-line-no">276</span><span id="line-276">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
-<span class="source-line-no">277</span><span id="line-277">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
-<span class="source-line-no">278</span><span id="line-278">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">279</span><span id="line-279">   * {@link IOException}.</span>
-<span class="source-line-no">280</span><span id="line-280">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
-<span class="source-line-no">283</span><span id="line-283"></span>
-<span class="source-line-no">284</span><span id="line-284">  /**</span>
-<span class="source-line-no">285</span><span id="line-285">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">286</span><span id="line-286">   * {@link IOException}.</span>
-<span class="source-line-no">287</span><span id="line-287">   * @return The filter serialized using pb</span>
-<span class="source-line-no">288</span><span id="line-288">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  abstract public byte[] toByteArray() throws IOException;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">  /**</span>
-<span class="source-line-no">293</span><span id="line-293">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">294</span><span id="line-294">   * {@link IOException}.</span>
-<span class="source-line-no">295</span><span id="line-295">   * @param pbBytes A pb serialized {@link Filter} instance</span>
-<span class="source-line-no">296</span><span id="line-296">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
-<span class="source-line-no">297</span><span id="line-297">   * @throws DeserializationException if an error occurred</span>
-<span class="source-line-no">298</span><span id="line-298">   * @see #toByteArray</span>
-<span class="source-line-no">299</span><span id="line-299">   */</span>
-<span class="source-line-no">300</span><span id="line-300">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
-<span class="source-line-no">301</span><span id="line-301">    throw new DeserializationException(</span>
-<span class="source-line-no">302</span><span id="line-302">      "parseFrom called on base Filter, but should be called on derived type");</span>
-<span class="source-line-no">303</span><span id="line-303">  }</span>
-<span class="source-line-no">304</span><span id="line-304"></span>
-<span class="source-line-no">305</span><span id="line-305">  /**</span>
-<span class="source-line-no">306</span><span id="line-306">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">307</span><span id="line-307">   * {@link IOException}.</span>
-<span class="source-line-no">308</span><span id="line-308">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
-<span class="source-line-no">309</span><span id="line-309">   *         corresponding fields in other. Used for testing.</span>
-<span class="source-line-no">310</span><span id="line-310">   */</span>
-<span class="source-line-no">311</span><span id="line-311">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
-<span class="source-line-no">312</span><span id="line-312"></span>
-<span class="source-line-no">313</span><span id="line-313">  /**</span>
-<span class="source-line-no">314</span><span id="line-314">   * alter the reversed scan flag</span>
-<span class="source-line-no">315</span><span id="line-315">   * @param reversed flag</span>
+<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">220</span><span id="line-220">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">221</span><span id="line-221">   * method to their sub-filters and merge the results. For AND ({@code MUST_PASS_ALL}), only</span>
+<span class="source-line-no">222</span><span id="line-222">   * sub-filters whose {@code filterRowKey} individually returned {@code true} are consulted, and</span>
+<span class="source-line-no">223</span><span id="line-223">   * the farthest (maximal-step) hint among them is returned. For OR ({@code MUST_PASS_ONE}), the</span>
+<span class="source-line-no">224</span><span id="line-224">   * nearest hint is returned only when every non-terminated sub-filter provides one — any null</span>
+<span class="source-line-no">225</span><span id="line-225">   * collapses the OR result to null.&lt;/li&gt;</span>
+<span class="source-line-no">226</span><span id="line-226">   * &lt;/ul&gt;</span>
+<span class="source-line-no">227</span><span id="line-227">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
+<span class="source-line-no">228</span><span id="line-228">   *                     was passed to {@code filterRowKey}</span>
+<span class="source-line-no">229</span><span id="line-229">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">230</span><span id="line-230">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
+<span class="source-line-no">231</span><span id="line-231">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">232</span><span id="line-232">   * @see #filterRowKey(Cell)</span>
+<span class="source-line-no">233</span><span id="line-233">   */</span>
+<span class="source-line-no">234</span><span id="line-234">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">235</span><span id="line-235">    return null;</span>
+<span class="source-line-no">236</span><span id="line-236">  }</span>
+<span class="source-line-no">237</span><span id="line-237"></span>
+<span class="source-line-no">238</span><span id="line-238">  /**</span>
+<span class="source-line-no">239</span><span id="line-239">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
+<span class="source-line-no">240</span><span id="line-240">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
+<span class="source-line-no">241</span><span id="line-241">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
+<span class="source-line-no">242</span><span id="line-242">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
+<span class="source-line-no">243</span><span id="line-243">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
+<span class="source-line-no">244</span><span id="line-244">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
+<span class="source-line-no">245</span><span id="line-245">   * ahead instead of advancing one cell at a time.</span>
+<span class="source-line-no">246</span><span id="line-246">   * &lt;p&gt;</span>
+<span class="source-line-no">247</span><span id="line-247">   * Contract:</span>
+<span class="source-line-no">248</span><span id="line-248">   * &lt;ul&gt;</span>
+<span class="source-line-no">249</span><span id="line-249">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
+<span class="source-line-no">250</span><span id="line-250">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
+<span class="source-line-no">251</span><span id="line-251">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
+<span class="source-line-no">252</span><span id="line-252">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
+<span class="source-line-no">253</span><span id="line-253">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
+<span class="source-line-no">254</span><span id="line-254">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
+<span class="source-line-no">255</span><span id="line-255">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
+<span class="source-line-no">256</span><span id="line-256">   * side.&lt;/li&gt;</span>
+<span class="source-line-no">257</span><span id="line-257">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
+<span class="source-line-no">258</span><span id="line-258">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
+<span class="source-line-no">259</span><span id="line-259">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
+<span class="source-line-no">260</span><span id="line-260">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
+<span class="source-line-no">261</span><span id="line-261">   * direction are silently ignored.&lt;/li&gt;</span>
+<span class="source-line-no">262</span><span id="line-262">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">263</span><span id="line-263">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">264</span><span id="line-264">   * method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest</span>
+<span class="source-line-no">265</span><span id="line-265">   * hint is returned only when every non-terminated sub-filter provides one — any null collapses</span>
+<span class="source-line-no">266</span><span id="line-266">   * the OR result to null).&lt;/li&gt;</span>
+<span class="source-line-no">267</span><span id="line-267">   * &lt;/ul&gt;</span>
+<span class="source-line-no">268</span><span id="line-268">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
+<span class="source-line-no">269</span><span id="line-269">   *                    {@code filterCell} could be consulted</span>
+<span class="source-line-no">270</span><span id="line-270">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">271</span><span id="line-271">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
+<span class="source-line-no">272</span><span id="line-272">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">273</span><span id="line-273">   * @see #filterCell(Cell)</span>
+<span class="source-line-no">274</span><span id="line-274">   * @see #getNextCellHint(Cell)</span>
+<span class="source-line-no">275</span><span id="line-275">   */</span>
+<span class="source-line-no">276</span><span id="line-276">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">277</span><span id="line-277">    return null;</span>
+<span class="source-line-no">278</span><span id="line-278">  }</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">  /**</span>
+<span class="source-line-no">281</span><span id="line-281">   * Check that given column family is essential for filter to check row. Most filters always return</span>
+<span class="source-line-no">282</span><span id="line-282">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
+<span class="source-line-no">283</span><span id="line-283">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
+<span class="source-line-no">284</span><span id="line-284">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">285</span><span id="line-285">   * {@link IOException}.</span>
+<span class="source-line-no">286</span><span id="line-286">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">287</span><span id="line-287">   */</span>
+<span class="source-line-no">288</span><span id="line-288">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">292</span><span id="line-292">   * {@link IOException}.</span>
+<span class="source-line-no">293</span><span id="line-293">   * @return The filter serialized using pb</span>
+<span class="source-line-no">294</span><span id="line-294">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">295</span><span id="line-295">   */</span>
+<span class="source-line-no">296</span><span id="line-296">  abstract public byte[] toByteArray() throws IOException;</span>
+<span class="source-line-no">297</span><span id="line-297"></span>
+<span class="source-line-no">298</span><span id="line-298">  /**</span>
+<span class="source-line-no">299</span><span id="line-299">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link IOException}.</span>
+<span class="source-line-no">301</span><span id="line-301">   * @param pbBytes A pb serialized {@link Filter} instance</span>
+<span class="source-line-no">302</span><span id="line-302">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
+<span class="source-line-no">303</span><span id="line-303">   * @throws DeserializationException if an error occurred</span>
+<span class="source-line-no">304</span><span id="line-304">   * @see #toByteArray</span>
+<span class="source-line-no">305</span><span id="line-305">   */</span>
+<span class="source-line-no">306</span><span id="line-306">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
+<span class="source-line-no">307</span><span id="line-307">    throw new DeserializationException(</span>
+<span class="source-line-no">308</span><span id="line-308">      "parseFrom called on base Filter, but should be called on derived type");</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  /**</span>
+<span class="source-line-no">312</span><span id="line-312">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">313</span><span id="line-313">   * {@link IOException}.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
+<span class="source-line-no">315</span><span id="line-315">   *         corresponding fields in other. Used for testing.</span>
 <span class="source-line-no">316</span><span id="line-316">   */</span>
-<span class="source-line-no">317</span><span id="line-317">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">318</span><span id="line-318">    this.reversed = reversed;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  public boolean isReversed() {</span>
-<span class="source-line-no">322</span><span id="line-322">    return this.reversed;</span>
-<span class="source-line-no">323</span><span id="line-323">  }</span>
-<span class="source-line-no">324</span><span id="line-324">}</span>
+<span class="source-line-no">317</span><span id="line-317">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">  /**</span>
+<span class="source-line-no">320</span><span id="line-320">   * alter the reversed scan flag</span>
+<span class="source-line-no">321</span><span id="line-321">   * @param reversed flag</span>
+<span class="source-line-no">322</span><span id="line-322">   */</span>
+<span class="source-line-no">323</span><span id="line-323">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">324</span><span id="line-324">    this.reversed = reversed;</span>
+<span class="source-line-no">325</span><span id="line-325">  }</span>
+<span class="source-line-no">326</span><span id="line-326"></span>
+<span class="source-line-no">327</span><span id="line-327">  public boolean isReversed() {</span>
+<span class="source-line-no">328</span><span id="line-328">    return this.reversed;</span>
+<span class="source-line-no">329</span><span id="line-329">  }</span>
+<span class="source-line-no">330</span><span id="line-330">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
index 70b43734f06..e61377ab5e4 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
@@ -256,37 +256,47 @@
 <span class="source-line-no">243</span><span id="line-243">  }</span>
 <span class="source-line-no">244</span><span id="line-244"></span>
 <span class="source-line-no">245</span><span id="line-245">  @Override</span>
-<span class="source-line-no">246</span><span id="line-246">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">246</span><span id="line-246">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">248</span><span id="line-248">  }</span>
 <span class="source-line-no">249</span><span id="line-249"></span>
 <span class="source-line-no">250</span><span id="line-250">  @Override</span>
-<span class="source-line-no">251</span><span id="line-251">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">252</span><span id="line-252">    this.reversed = reversed;</span>
-<span class="source-line-no">253</span><span id="line-253">    this.filterListBase.setReversed(reversed);</span>
-<span class="source-line-no">254</span><span id="line-254">  }</span>
-<span class="source-line-no">255</span><span id="line-255"></span>
-<span class="source-line-no">256</span><span id="line-256">  @Override</span>
-<span class="source-line-no">257</span><span id="line-257">  public boolean isReversed() {</span>
-<span class="source-line-no">258</span><span id="line-258">    assert this.reversed == this.filterListBase.isReversed();</span>
-<span class="source-line-no">259</span><span id="line-259">    return this.reversed;</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  @Override</span>
-<span class="source-line-no">263</span><span id="line-263">  public String toString() {</span>
-<span class="source-line-no">264</span><span id="line-264">    return this.filterListBase.toString();</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  @Override</span>
-<span class="source-line-no">268</span><span id="line-268">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">269</span><span id="line-269">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">251</span><span id="line-251">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">252</span><span id="line-252">    return this.filterListBase.getSkipHint(skippedCell);</span>
+<span class="source-line-no">253</span><span id="line-253">  }</span>
+<span class="source-line-no">254</span><span id="line-254"></span>
+<span class="source-line-no">255</span><span id="line-255">  @Override</span>
+<span class="source-line-no">256</span><span id="line-256">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">257</span><span id="line-257">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">258</span><span id="line-258">  }</span>
+<span class="source-line-no">259</span><span id="line-259"></span>
+<span class="source-line-no">260</span><span id="line-260">  @Override</span>
+<span class="source-line-no">261</span><span id="line-261">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">262</span><span id="line-262">    this.reversed = reversed;</span>
+<span class="source-line-no">263</span><span id="line-263">    this.filterListBase.setReversed(reversed);</span>
+<span class="source-line-no">264</span><span id="line-264">  }</span>
+<span class="source-line-no">265</span><span id="line-265"></span>
+<span class="source-line-no">266</span><span id="line-266">  @Override</span>
+<span class="source-line-no">267</span><span id="line-267">  public boolean isReversed() {</span>
+<span class="source-line-no">268</span><span id="line-268">    assert this.reversed == this.filterListBase.isReversed();</span>
+<span class="source-line-no">269</span><span id="line-269">    return this.reversed;</span>
 <span class="source-line-no">270</span><span id="line-270">  }</span>
 <span class="source-line-no">271</span><span id="line-271"></span>
 <span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public int hashCode() {</span>
-<span class="source-line-no">274</span><span id="line-274">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">273</span><span id="line-273">  public String toString() {</span>
+<span class="source-line-no">274</span><span id="line-274">    return this.filterListBase.toString();</span>
 <span class="source-line-no">275</span><span id="line-275">  }</span>
-<span class="source-line-no">276</span><span id="line-276">}</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">  @Override</span>
+<span class="source-line-no">278</span><span id="line-278">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">279</span><span id="line-279">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">280</span><span id="line-280">  }</span>
+<span class="source-line-no">281</span><span id="line-281"></span>
+<span class="source-line-no">282</span><span id="line-282">  @Override</span>
+<span class="source-line-no">283</span><span id="line-283">  public int hashCode() {</span>
+<span class="source-line-no">284</span><span id="line-284">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">285</span><span id="line-285">  }</span>
+<span class="source-line-no">286</span><span id="line-286">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
index b412fb227e6..d931cb8b1a9 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
@@ -256,37 +256,47 @@
 <span class="source-line-no">243</span><span id="line-243">  }</span>
 <span class="source-line-no">244</span><span id="line-244"></span>
 <span class="source-line-no">245</span><span id="line-245">  @Override</span>
-<span class="source-line-no">246</span><span id="line-246">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">246</span><span id="line-246">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">248</span><span id="line-248">  }</span>
 <span class="source-line-no">249</span><span id="line-249"></span>
 <span class="source-line-no">250</span><span id="line-250">  @Override</span>
-<span class="source-line-no">251</span><span id="line-251">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">252</span><span id="line-252">    this.reversed = reversed;</span>
-<span class="source-line-no">253</span><span id="line-253">    this.filterListBase.setReversed(reversed);</span>
-<span class="source-line-no">254</span><span id="line-254">  }</span>
-<span class="source-line-no">255</span><span id="line-255"></span>
-<span class="source-line-no">256</span><span id="line-256">  @Override</span>
-<span class="source-line-no">257</span><span id="line-257">  public boolean isReversed() {</span>
-<span class="source-line-no">258</span><span id="line-258">    assert this.reversed == this.filterListBase.isReversed();</span>
-<span class="source-line-no">259</span><span id="line-259">    return this.reversed;</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  @Override</span>
-<span class="source-line-no">263</span><span id="line-263">  public String toString() {</span>
-<span class="source-line-no">264</span><span id="line-264">    return this.filterListBase.toString();</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  @Override</span>
-<span class="source-line-no">268</span><span id="line-268">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">269</span><span id="line-269">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">251</span><span id="line-251">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">252</span><span id="line-252">    return this.filterListBase.getSkipHint(skippedCell);</span>
+<span class="source-line-no">253</span><span id="line-253">  }</span>
+<span class="source-line-no">254</span><span id="line-254"></span>
+<span class="source-line-no">255</span><span id="line-255">  @Override</span>
+<span class="source-line-no">256</span><span id="line-256">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">257</span><span id="line-257">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">258</span><span id="line-258">  }</span>
+<span class="source-line-no">259</span><span id="line-259"></span>
+<span class="source-line-no">260</span><span id="line-260">  @Override</span>
+<span class="source-line-no">261</span><span id="line-261">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">262</span><span id="line-262">    this.reversed = reversed;</span>
+<span class="source-line-no">263</span><span id="line-263">    this.filterListBase.setReversed(reversed);</span>
+<span class="source-line-no">264</span><span id="line-264">  }</span>
+<span class="source-line-no">265</span><span id="line-265"></span>
+<span class="source-line-no">266</span><span id="line-266">  @Override</span>
+<span class="source-line-no">267</span><span id="line-267">  public boolean isReversed() {</span>
+<span class="source-line-no">268</span><span id="line-268">    assert this.reversed == this.filterListBase.isReversed();</span>
+<span class="source-line-no">269</span><span id="line-269">    return this.reversed;</span>
 <span class="source-line-no">270</span><span id="line-270">  }</span>
 <span class="source-line-no">271</span><span id="line-271"></span>
 <span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public int hashCode() {</span>
-<span class="source-line-no">274</span><span id="line-274">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">273</span><span id="line-273">  public String toString() {</span>
+<span class="source-line-no">274</span><span id="line-274">    return this.filterListBase.toString();</span>
 <span class="source-line-no">275</span><span id="line-275">  }</span>
-<span class="source-line-no">276</span><span id="line-276">}</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">  @Override</span>
+<span class="source-line-no">278</span><span id="line-278">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">279</span><span id="line-279">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">280</span><span id="line-280">  }</span>
+<span class="source-line-no">281</span><span id="line-281"></span>
+<span class="source-line-no">282</span><span id="line-282">  @Override</span>
+<span class="source-line-no">283</span><span id="line-283">  public int hashCode() {</span>
+<span class="source-line-no">284</span><span id="line-284">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">285</span><span id="line-285">  }</span>
+<span class="source-line-no">286</span><span id="line-286">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
index 9c3806904af..94ed173060a 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
@@ -32,322 +32,388 @@
 <span class="source-line-no">019</span><span id="line-19"></span>
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
 <span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.Collections;</span>
-<span class="source-line-no">023</span><span id="line-23">import java.util.List;</span>
-<span class="source-line-no">024</span><span id="line-24">import java.util.Objects;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.Cell;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.yetus.audience.InterfaceAudience;</span>
-<span class="source-line-no">027</span><span id="line-27"></span>
-<span class="source-line-no">028</span><span id="line-28">/**</span>
-<span class="source-line-no">029</span><span id="line-29"> * FilterListWithAND represents an ordered list of filters which will be evaluated with an AND</span>
-<span class="source-line-no">030</span><span id="line-30"> * operator.</span>
-<span class="source-line-no">031</span><span id="line-31"> */</span>
-<span class="source-line-no">032</span><span id="line-32">@InterfaceAudience.Private</span>
-<span class="source-line-no">033</span><span id="line-33">public class FilterListWithAND extends FilterListBase {</span>
-<span class="source-line-no">034</span><span id="line-34"></span>
-<span class="source-line-no">035</span><span id="line-35">  private List&lt;Filter&gt; seekHintFilters = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">036</span><span id="line-36">  private boolean[] hintingFilters;</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">  public FilterListWithAND(List&lt;Filter&gt; filters) {</span>
-<span class="source-line-no">039</span><span id="line-39">    super(filters);</span>
-<span class="source-line-no">040</span><span id="line-40">    // For FilterList with AND, when call FL's transformCell(), we should transform cell for all</span>
-<span class="source-line-no">041</span><span id="line-41">    // sub-filters (because all sub-filters return INCLUDE*). So here, fill this array with true. we</span>
-<span class="source-line-no">042</span><span id="line-42">    // keep this in FilterListWithAND for abstracting the transformCell() in FilterListBase.</span>
-<span class="source-line-no">043</span><span id="line-43">    subFiltersIncludedCell = new ArrayList&lt;&gt;(Collections.nCopies(filters.size(), true));</span>
-<span class="source-line-no">044</span><span id="line-44">    cacheHintingFilters();</span>
-<span class="source-line-no">045</span><span id="line-45">  }</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">  @Override</span>
-<span class="source-line-no">048</span><span id="line-48">  public void addFilterLists(List&lt;Filter&gt; filters) {</span>
-<span class="source-line-no">049</span><span id="line-49">    if (checkAndGetReversed(filters, isReversed()) != isReversed()) {</span>
-<span class="source-line-no">050</span><span id="line-50">      throw new IllegalArgumentException("Filters in the list must have the same reversed flag");</span>
-<span class="source-line-no">051</span><span id="line-51">    }</span>
-<span class="source-line-no">052</span><span id="line-52">    this.filters.addAll(filters);</span>
-<span class="source-line-no">053</span><span id="line-53">    this.subFiltersIncludedCell.addAll(Collections.nCopies(filters.size(), true));</span>
-<span class="source-line-no">054</span><span id="line-54">    this.cacheHintingFilters();</span>
-<span class="source-line-no">055</span><span id="line-55">  }</span>
-<span class="source-line-no">056</span><span id="line-56"></span>
-<span class="source-line-no">057</span><span id="line-57">  @Override</span>
-<span class="source-line-no">058</span><span id="line-58">  protected String formatLogFilters(List&lt;Filter&gt; logFilters) {</span>
-<span class="source-line-no">059</span><span id="line-59">    return String.format("FilterList AND (%d/%d): %s", logFilters.size(), this.size(),</span>
-<span class="source-line-no">060</span><span id="line-60">      logFilters.toString());</span>
-<span class="source-line-no">061</span><span id="line-61">  }</span>
-<span class="source-line-no">062</span><span id="line-62"></span>
-<span class="source-line-no">063</span><span id="line-63">  /**</span>
-<span class="source-line-no">064</span><span id="line-64">   * As checks for this are in the hot path, we want them as fast as possible, so we are caching the</span>
-<span class="source-line-no">065</span><span id="line-65">   * status in an array.</span>
-<span class="source-line-no">066</span><span id="line-66">   */</span>
-<span class="source-line-no">067</span><span id="line-67">  private void cacheHintingFilters() {</span>
-<span class="source-line-no">068</span><span id="line-68">    int filtersSize = filters.size();</span>
-<span class="source-line-no">069</span><span id="line-69">    hintingFilters = new boolean[filtersSize];</span>
-<span class="source-line-no">070</span><span id="line-70">    for (int i = 0; i &lt; filtersSize; i++) {</span>
-<span class="source-line-no">071</span><span id="line-71">      if (filters.get(i) instanceof HintingFilter) {</span>
-<span class="source-line-no">072</span><span id="line-72">        hintingFilters[i] = true;</span>
-<span class="source-line-no">073</span><span id="line-73">      }</span>
-<span class="source-line-no">074</span><span id="line-74">    }</span>
-<span class="source-line-no">075</span><span id="line-75">  }</span>
-<span class="source-line-no">076</span><span id="line-76"></span>
-<span class="source-line-no">077</span><span id="line-77">  /**</span>
-<span class="source-line-no">078</span><span id="line-78">   * FilterList with MUST_PASS_ALL choose the maximal forward step among sub-filters in filter list.</span>
-<span class="source-line-no">079</span><span id="line-79">   * Let's call it: The Maximal Step Rule. So if filter-A in filter list return INCLUDE and filter-B</span>
-<span class="source-line-no">080</span><span id="line-80">   * in filter list return INCLUDE_AND_NEXT_COL, then the filter list should return</span>
-<span class="source-line-no">081</span><span id="line-81">   * INCLUDE_AND_NEXT_COL. For SEEK_NEXT_USING_HINT, it's more special, and in method</span>
-<span class="source-line-no">082</span><span id="line-82">   * filterCellWithMustPassAll(), if any sub-filter return SEEK_NEXT_USING_HINT, then our filter</span>
-<span class="source-line-no">083</span><span id="line-83">   * list will return SEEK_NEXT_USING_HINT. so we don't care about the SEEK_NEXT_USING_HINT here.</span>
-<span class="source-line-no">084</span><span id="line-84">   * &lt;br/&gt;</span>
-<span class="source-line-no">085</span><span id="line-85">   * &lt;br/&gt;</span>
-<span class="source-line-no">086</span><span id="line-86">   * The jump step will be:</span>
-<span class="source-line-no">087</span><span id="line-87">   *</span>
-<span class="source-line-no">088</span><span id="line-88">   * &lt;pre&gt;</span>
-<span class="source-line-no">089</span><span id="line-89">   * INCLUDE &amp;lt; SKIP &amp;lt; INCLUDE_AND_NEXT_COL &amp;lt; NEXT_COL &amp;lt; INCLUDE_AND_SEEK_NEXT_ROW &amp;lt; NEXT_ROW</span>
-<span class="source-line-no">090</span><span id="line-90">   *     &amp;lt; SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">091</span><span id="line-91">   * &lt;/pre&gt;</span>
-<span class="source-line-no">092</span><span id="line-92">   *</span>
-<span class="source-line-no">093</span><span id="line-93">   * Here, we have the following map to describe The Maximal Step Rule. if current return code (for</span>
-<span class="source-line-no">094</span><span id="line-94">   * previous sub-filters in filter list) is &lt;strong&gt;ReturnCode&lt;/strong&gt;, and current filter returns</span>
-<span class="source-line-no">095</span><span id="line-95">   * &lt;strong&gt;localRC&lt;/strong&gt;, then we should return map[ReturnCode][localRC] for the merged result,</span>
-<span class="source-line-no">096</span><span id="line-96">   * according to The Maximal Step Rule. &lt;br/&gt;</span>
-<span class="source-line-no">097</span><span id="line-97">   *</span>
-<span class="source-line-no">098</span><span id="line-98">   * &lt;pre&gt;</span>
-<span class="source-line-no">099</span><span id="line-99">   * LocalCode\ReturnCode       INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">100</span><span id="line-100">   * INCLUDE                    INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">101</span><span id="line-101">   * INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">102</span><span id="line-102">   * INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW INCLUDE_AND_SEEK_NEXT_ROW  NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">103</span><span id="line-103">   * SKIP                       SKIP                       NEXT_COL                  NEXT_ROW                   SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">104</span><span id="line-104">   * NEXT_COL                   NEXT_COL                   NEXT_COL                  NEXT_ROW                   NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">105</span><span id="line-105">   * NEXT_ROW                   NEXT_ROW                   NEXT_ROW                  NEXT_ROW                   NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">106</span><span id="line-106">   * SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT      SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">107</span><span id="line-107">   * &lt;/pre&gt;</span>
-<span class="source-line-no">108</span><span id="line-108">   *</span>
-<span class="source-line-no">109</span><span id="line-109">   * @param rc      Return code which is calculated by previous sub-filter(s) in filter list.</span>
-<span class="source-line-no">110</span><span id="line-110">   * @param localRC Return code of the current sub-filter in filter list.</span>
-<span class="source-line-no">111</span><span id="line-111">   * @return Return code which is merged by the return code of previous sub-filter(s) and the return</span>
-<span class="source-line-no">112</span><span id="line-112">   *         code of current sub-filter.</span>
-<span class="source-line-no">113</span><span id="line-113">   */</span>
-<span class="source-line-no">114</span><span id="line-114">  private ReturnCode mergeReturnCode(ReturnCode rc, ReturnCode localRC) {</span>
-<span class="source-line-no">115</span><span id="line-115">    if (rc == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">116</span><span id="line-116">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">117</span><span id="line-117">    }</span>
-<span class="source-line-no">118</span><span id="line-118">    switch (localRC) {</span>
-<span class="source-line-no">119</span><span id="line-119">      case SEEK_NEXT_USING_HINT:</span>
-<span class="source-line-no">120</span><span id="line-120">        return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">121</span><span id="line-121">      case INCLUDE:</span>
-<span class="source-line-no">122</span><span id="line-122">        return rc;</span>
-<span class="source-line-no">123</span><span id="line-123">      case INCLUDE_AND_NEXT_COL:</span>
-<span class="source-line-no">124</span><span id="line-124">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL)) {</span>
-<span class="source-line-no">125</span><span id="line-125">          return ReturnCode.INCLUDE_AND_NEXT_COL;</span>
-<span class="source-line-no">126</span><span id="line-126">        }</span>
-<span class="source-line-no">127</span><span id="line-127">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)) {</span>
-<span class="source-line-no">128</span><span id="line-128">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
-<span class="source-line-no">129</span><span id="line-129">        }</span>
-<span class="source-line-no">130</span><span id="line-130">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL)) {</span>
-<span class="source-line-no">131</span><span id="line-131">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">132</span><span id="line-132">        }</span>
-<span class="source-line-no">133</span><span id="line-133">        if (isInReturnCodes(rc, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">134</span><span id="line-134">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">022</span><span id="line-22">import java.util.Arrays;</span>
+<span class="source-line-no">023</span><span id="line-23">import java.util.Collections;</span>
+<span class="source-line-no">024</span><span id="line-24">import java.util.List;</span>
+<span class="source-line-no">025</span><span id="line-25">import java.util.Objects;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.Cell;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.apache.yetus.audience.InterfaceAudience;</span>
+<span class="source-line-no">028</span><span id="line-28"></span>
+<span class="source-line-no">029</span><span id="line-29">/**</span>
+<span class="source-line-no">030</span><span id="line-30"> * FilterListWithAND represents an ordered list of filters which will be evaluated with an AND</span>
+<span class="source-line-no">031</span><span id="line-31"> * operator.</span>
+<span class="source-line-no">032</span><span id="line-32"> */</span>
+<span class="source-line-no">033</span><span id="line-33">@InterfaceAudience.Private</span>
+<span class="source-line-no">034</span><span id="line-34">public class FilterListWithAND extends FilterListBase {</span>
+<span class="source-line-no">035</span><span id="line-35"></span>
+<span class="source-line-no">036</span><span id="line-36">  private List&lt;Filter&gt; seekHintFilters = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">037</span><span id="line-37">  private boolean[] hintingFilters;</span>
+<span class="source-line-no">038</span><span id="line-38">  /**</span>
+<span class="source-line-no">039</span><span id="line-39">   * Tracks which sub-filters returned {@code true} from {@link Filter#filterRowKey(Cell)}. Set in</span>
+<span class="source-line-no">040</span><span id="line-40">   * {@code filterRowKey()}, consumed by {@code getHintForRejectedRow()}, cleared only by</span>
+<span class="source-line-no">041</span><span id="line-41">   * {@code reset()} — callers must invoke {@code reset()} between rows to avoid stale state.</span>
+<span class="source-line-no">042</span><span id="line-42">   */</span>
+<span class="source-line-no">043</span><span id="line-43">  private boolean[] rejectedByFilterRowKey;</span>
+<span class="source-line-no">044</span><span id="line-44"></span>
+<span class="source-line-no">045</span><span id="line-45">  public FilterListWithAND(List&lt;Filter&gt; filters) {</span>
+<span class="source-line-no">046</span><span id="line-46">    super(filters);</span>
+<span class="source-line-no">047</span><span id="line-47">    // For FilterList with AND, when call FL's transformCell(), we should transform cell for all</span>
+<span class="source-line-no">048</span><span id="line-48">    // sub-filters (because all sub-filters return INCLUDE*). So here, fill this array with true. we</span>
+<span class="source-line-no">049</span><span id="line-49">    // keep this in FilterListWithAND for abstracting the transformCell() in FilterListBase.</span>
+<span class="source-line-no">050</span><span id="line-50">    subFiltersIncludedCell = new ArrayList&lt;&gt;(Collections.nCopies(filters.size(), true));</span>
+<span class="source-line-no">051</span><span id="line-51">    rejectedByFilterRowKey = new boolean[filters.size()];</span>
+<span class="source-line-no">052</span><span id="line-52">    cacheHintingFilters();</span>
+<span class="source-line-no">053</span><span id="line-53">  }</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">  @Override</span>
+<span class="source-line-no">056</span><span id="line-56">  public void addFilterLists(List&lt;Filter&gt; filters) {</span>
+<span class="source-line-no">057</span><span id="line-57">    if (checkAndGetReversed(filters, isReversed()) != isReversed()) {</span>
+<span class="source-line-no">058</span><span id="line-58">      throw new IllegalArgumentException("Filters in the list must have the same reversed flag");</span>
+<span class="source-line-no">059</span><span id="line-59">    }</span>
+<span class="source-line-no">060</span><span id="line-60">    this.filters.addAll(filters);</span>
+<span class="source-line-no">061</span><span id="line-61">    this.subFiltersIncludedCell.addAll(Collections.nCopies(filters.size(), true));</span>
+<span class="source-line-no">062</span><span id="line-62">    this.rejectedByFilterRowKey = Arrays.copyOf(this.rejectedByFilterRowKey, this.filters.size());</span>
+<span class="source-line-no">063</span><span id="line-63">    this.cacheHintingFilters();</span>
+<span class="source-line-no">064</span><span id="line-64">  }</span>
+<span class="source-line-no">065</span><span id="line-65"></span>
+<span class="source-line-no">066</span><span id="line-66">  @Override</span>
+<span class="source-line-no">067</span><span id="line-67">  protected String formatLogFilters(List&lt;Filter&gt; logFilters) {</span>
+<span class="source-line-no">068</span><span id="line-68">    return String.format("FilterList AND (%d/%d): %s", logFilters.size(), this.size(),</span>
+<span class="source-line-no">069</span><span id="line-69">      logFilters.toString());</span>
+<span class="source-line-no">070</span><span id="line-70">  }</span>
+<span class="source-line-no">071</span><span id="line-71"></span>
+<span class="source-line-no">072</span><span id="line-72">  /**</span>
+<span class="source-line-no">073</span><span id="line-73">   * As checks for this are in the hot path, we want them as fast as possible, so we are caching the</span>
+<span class="source-line-no">074</span><span id="line-74">   * status in an array.</span>
+<span class="source-line-no">075</span><span id="line-75">   */</span>
+<span class="source-line-no">076</span><span id="line-76">  private void cacheHintingFilters() {</span>
+<span class="source-line-no">077</span><span id="line-77">    int filtersSize = filters.size();</span>
+<span class="source-line-no">078</span><span id="line-78">    hintingFilters = new boolean[filtersSize];</span>
+<span class="source-line-no">079</span><span id="line-79">    for (int i = 0; i &lt; filtersSize; i++) {</span>
+<span class="source-line-no">080</span><span id="line-80">      if (filters.get(i) instanceof HintingFilter) {</span>
+<span class="source-line-no">081</span><span id="line-81">        hintingFilters[i] = true;</span>
+<span class="source-line-no">082</span><span id="line-82">      }</span>
+<span class="source-line-no">083</span><span id="line-83">    }</span>
+<span class="source-line-no">084</span><span id="line-84">  }</span>
+<span class="source-line-no">085</span><span id="line-85"></span>
+<span class="source-line-no">086</span><span id="line-86">  /**</span>
+<span class="source-line-no">087</span><span id="line-87">   * FilterList with MUST_PASS_ALL choose the maximal forward step among sub-filters in filter list.</span>
+<span class="source-line-no">088</span><span id="line-88">   * Let's call it: The Maximal Step Rule. So if filter-A in filter list return INCLUDE and filter-B</span>
+<span class="source-line-no">089</span><span id="line-89">   * in filter list return INCLUDE_AND_NEXT_COL, then the filter list should return</span>
+<span class="source-line-no">090</span><span id="line-90">   * INCLUDE_AND_NEXT_COL. For SEEK_NEXT_USING_HINT, it's more special, and in method</span>
+<span class="source-line-no">091</span><span id="line-91">   * filterCellWithMustPassAll(), if any sub-filter return SEEK_NEXT_USING_HINT, then our filter</span>
+<span class="source-line-no">092</span><span id="line-92">   * list will return SEEK_NEXT_USING_HINT. so we don't care about the SEEK_NEXT_USING_HINT here.</span>
+<span class="source-line-no">093</span><span id="line-93">   * &lt;br/&gt;</span>
+<span class="source-line-no">094</span><span id="line-94">   * &lt;br/&gt;</span>
+<span class="source-line-no">095</span><span id="line-95">   * The jump step will be:</span>
+<span class="source-line-no">096</span><span id="line-96">   *</span>
+<span class="source-line-no">097</span><span id="line-97">   * &lt;pre&gt;</span>
+<span class="source-line-no">098</span><span id="line-98">   * INCLUDE &amp;lt; SKIP &amp;lt; INCLUDE_AND_NEXT_COL &amp;lt; NEXT_COL &amp;lt; INCLUDE_AND_SEEK_NEXT_ROW &amp;lt; NEXT_ROW</span>
+<span class="source-line-no">099</span><span id="line-99">   *     &amp;lt; SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">100</span><span id="line-100">   * &lt;/pre&gt;</span>
+<span class="source-line-no">101</span><span id="line-101">   *</span>
+<span class="source-line-no">102</span><span id="line-102">   * Here, we have the following map to describe The Maximal Step Rule. if current return code (for</span>
+<span class="source-line-no">103</span><span id="line-103">   * previous sub-filters in filter list) is &lt;strong&gt;ReturnCode&lt;/strong&gt;, and current filter returns</span>
+<span class="source-line-no">104</span><span id="line-104">   * &lt;strong&gt;localRC&lt;/strong&gt;, then we should return map[ReturnCode][localRC] for the merged result,</span>
+<span class="source-line-no">105</span><span id="line-105">   * according to The Maximal Step Rule. &lt;br/&gt;</span>
+<span class="source-line-no">106</span><span id="line-106">   *</span>
+<span class="source-line-no">107</span><span id="line-107">   * &lt;pre&gt;</span>
+<span class="source-line-no">108</span><span id="line-108">   * LocalCode\ReturnCode       INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">109</span><span id="line-109">   * INCLUDE                    INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">110</span><span id="line-110">   * INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">111</span><span id="line-111">   * INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW INCLUDE_AND_SEEK_NEXT_ROW  NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">112</span><span id="line-112">   * SKIP                       SKIP                       NEXT_COL                  NEXT_ROW                   SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">113</span><span id="line-113">   * NEXT_COL                   NEXT_COL                   NEXT_COL                  NEXT_ROW                   NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">114</span><span id="line-114">   * NEXT_ROW                   NEXT_ROW                   NEXT_ROW                  NEXT_ROW                   NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">115</span><span id="line-115">   * SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT      SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">116</span><span id="line-116">   * &lt;/pre&gt;</span>
+<span class="source-line-no">117</span><span id="line-117">   *</span>
+<span class="source-line-no">118</span><span id="line-118">   * @param rc      Return code which is calculated by previous sub-filter(s) in filter list.</span>
+<span class="source-line-no">119</span><span id="line-119">   * @param localRC Return code of the current sub-filter in filter list.</span>
+<span class="source-line-no">120</span><span id="line-120">   * @return Return code which is merged by the return code of previous sub-filter(s) and the return</span>
+<span class="source-line-no">121</span><span id="line-121">   *         code of current sub-filter.</span>
+<span class="source-line-no">122</span><span id="line-122">   */</span>
+<span class="source-line-no">123</span><span id="line-123">  private ReturnCode mergeReturnCode(ReturnCode rc, ReturnCode localRC) {</span>
+<span class="source-line-no">124</span><span id="line-124">    if (rc == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">125</span><span id="line-125">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">126</span><span id="line-126">    }</span>
+<span class="source-line-no">127</span><span id="line-127">    switch (localRC) {</span>
+<span class="source-line-no">128</span><span id="line-128">      case SEEK_NEXT_USING_HINT:</span>
+<span class="source-line-no">129</span><span id="line-129">        return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">130</span><span id="line-130">      case INCLUDE:</span>
+<span class="source-line-no">131</span><span id="line-131">        return rc;</span>
+<span class="source-line-no">132</span><span id="line-132">      case INCLUDE_AND_NEXT_COL:</span>
+<span class="source-line-no">133</span><span id="line-133">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL)) {</span>
+<span class="source-line-no">134</span><span id="line-134">          return ReturnCode.INCLUDE_AND_NEXT_COL;</span>
 <span class="source-line-no">135</span><span id="line-135">        }</span>
-<span class="source-line-no">136</span><span id="line-136">        break;</span>
-<span class="source-line-no">137</span><span id="line-137">      case INCLUDE_AND_SEEK_NEXT_ROW:</span>
-<span class="source-line-no">138</span><span id="line-138">        if (</span>
-<span class="source-line-no">139</span><span id="line-139">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
-<span class="source-line-no">140</span><span id="line-140">            ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)</span>
-<span class="source-line-no">141</span><span id="line-141">        ) {</span>
-<span class="source-line-no">142</span><span id="line-142">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
-<span class="source-line-no">143</span><span id="line-143">        }</span>
-<span class="source-line-no">144</span><span id="line-144">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">145</span><span id="line-145">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">146</span><span id="line-146">        }</span>
-<span class="source-line-no">147</span><span id="line-147">        break;</span>
-<span class="source-line-no">148</span><span id="line-148">      case SKIP:</span>
-<span class="source-line-no">149</span><span id="line-149">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.SKIP)) {</span>
-<span class="source-line-no">150</span><span id="line-150">          return ReturnCode.SKIP;</span>
-<span class="source-line-no">151</span><span id="line-151">        }</span>
-<span class="source-line-no">152</span><span id="line-152">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.NEXT_COL)) {</span>
-<span class="source-line-no">153</span><span id="line-153">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">154</span><span id="line-154">        }</span>
-<span class="source-line-no">155</span><span id="line-155">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">156</span><span id="line-156">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">157</span><span id="line-157">        }</span>
-<span class="source-line-no">158</span><span id="line-158">        break;</span>
-<span class="source-line-no">159</span><span id="line-159">      case NEXT_COL:</span>
-<span class="source-line-no">160</span><span id="line-160">        if (</span>
-<span class="source-line-no">161</span><span id="line-161">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.SKIP,</span>
-<span class="source-line-no">162</span><span id="line-162">            ReturnCode.NEXT_COL)</span>
-<span class="source-line-no">163</span><span id="line-163">        ) {</span>
-<span class="source-line-no">164</span><span id="line-164">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">165</span><span id="line-165">        }</span>
-<span class="source-line-no">166</span><span id="line-166">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">167</span><span id="line-167">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">168</span><span id="line-168">        }</span>
-<span class="source-line-no">169</span><span id="line-169">        break;</span>
-<span class="source-line-no">170</span><span id="line-170">      case NEXT_ROW:</span>
-<span class="source-line-no">171</span><span id="line-171">        return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">172</span><span id="line-172">    }</span>
-<span class="source-line-no">173</span><span id="line-173">    throw new IllegalStateException(</span>
-<span class="source-line-no">174</span><span id="line-174">      "Received code is not valid. rc: " + rc + ", localRC: " + localRC);</span>
-<span class="source-line-no">175</span><span id="line-175">  }</span>
-<span class="source-line-no">176</span><span id="line-176"></span>
-<span class="source-line-no">177</span><span id="line-177">  private boolean isIncludeRelatedReturnCode(ReturnCode rc) {</span>
-<span class="source-line-no">178</span><span id="line-178">    return isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
-<span class="source-line-no">179</span><span id="line-179">      ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW);</span>
-<span class="source-line-no">180</span><span id="line-180">  }</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">  @Override</span>
-<span class="source-line-no">183</span><span id="line-183">  public ReturnCode filterCell(Cell c) throws IOException {</span>
-<span class="source-line-no">184</span><span id="line-184">    if (isEmpty()) {</span>
-<span class="source-line-no">185</span><span id="line-185">      return ReturnCode.INCLUDE;</span>
-<span class="source-line-no">186</span><span id="line-186">    }</span>
-<span class="source-line-no">187</span><span id="line-187">    ReturnCode rc = ReturnCode.INCLUDE;</span>
-<span class="source-line-no">188</span><span id="line-188">    this.seekHintFilters.clear();</span>
-<span class="source-line-no">189</span><span id="line-189">    int i = 0;</span>
-<span class="source-line-no">190</span><span id="line-190">    int n = filters.size();</span>
-<span class="source-line-no">191</span><span id="line-191">    for (; i &lt; n; i++) {</span>
-<span class="source-line-no">192</span><span id="line-192">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">193</span><span id="line-193">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">194</span><span id="line-194">        rc = ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">195</span><span id="line-195">        // See comment right after this loop</span>
-<span class="source-line-no">196</span><span id="line-196">        break;</span>
-<span class="source-line-no">197</span><span id="line-197">      }</span>
-<span class="source-line-no">198</span><span id="line-198">      ReturnCode localRC;</span>
-<span class="source-line-no">199</span><span id="line-199">      localRC = filter.filterCell(c);</span>
-<span class="source-line-no">200</span><span id="line-200">      if (localRC == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">201</span><span id="line-201">        seekHintFilters.add(filter);</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      rc = mergeReturnCode(rc, localRC);</span>
-<span class="source-line-no">204</span><span id="line-204">      // Only when rc is INCLUDE* case, we should pass the cell to the following sub-filters.</span>
-<span class="source-line-no">205</span><span id="line-205">      // otherwise we may mess up the global state (such as offset, count..) in the following</span>
-<span class="source-line-no">206</span><span id="line-206">      // sub-filters. (HBASE-20565)</span>
-<span class="source-line-no">207</span><span id="line-207">      if (!isIncludeRelatedReturnCode(rc)) {</span>
-<span class="source-line-no">208</span><span id="line-208">        // See comment right after this loop</span>
-<span class="source-line-no">209</span><span id="line-209">        break;</span>
-<span class="source-line-no">210</span><span id="line-210">      }</span>
-<span class="source-line-no">211</span><span id="line-211">    }</span>
-<span class="source-line-no">212</span><span id="line-212">    // We have the preliminary return code. However, if there are remaining uncalled hintingFilters,</span>
-<span class="source-line-no">213</span><span id="line-213">    // they may return hints that allow us to seek ahead and skip reading and processing a lot of</span>
-<span class="source-line-no">214</span><span id="line-214">    // cells.</span>
-<span class="source-line-no">215</span><span id="line-215">    // Process the remaining hinting filters so that we can get all seek hints.</span>
-<span class="source-line-no">216</span><span id="line-216">    // The farthest key is computed in getNextCellHint()</span>
-<span class="source-line-no">217</span><span id="line-217">    if (++i &lt; n) {</span>
-<span class="source-line-no">218</span><span id="line-218">      for (; i &lt; n; i++) {</span>
-<span class="source-line-no">219</span><span id="line-219">        if (hintingFilters[i]) {</span>
-<span class="source-line-no">220</span><span id="line-220">          Filter filter = filters.get(i);</span>
-<span class="source-line-no">221</span><span id="line-221">          if (filter.filterCell(c) == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">222</span><span id="line-222">            seekHintFilters.add(filter);</span>
-<span class="source-line-no">223</span><span id="line-223">          }</span>
-<span class="source-line-no">224</span><span id="line-224">        }</span>
-<span class="source-line-no">225</span><span id="line-225">      }</span>
-<span class="source-line-no">226</span><span id="line-226">    }</span>
-<span class="source-line-no">227</span><span id="line-227"></span>
-<span class="source-line-no">228</span><span id="line-228">    if (!seekHintFilters.isEmpty()) {</span>
-<span class="source-line-no">229</span><span id="line-229">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">230</span><span id="line-230">    }</span>
-<span class="source-line-no">231</span><span id="line-231">    return rc;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  @Override</span>
-<span class="source-line-no">235</span><span id="line-235">  public void reset() throws IOException {</span>
-<span class="source-line-no">236</span><span id="line-236">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">237</span><span id="line-237">      filters.get(i).reset();</span>
-<span class="source-line-no">238</span><span id="line-238">    }</span>
-<span class="source-line-no">239</span><span id="line-239">    seekHintFilters.clear();</span>
-<span class="source-line-no">240</span><span id="line-240">  }</span>
-<span class="source-line-no">241</span><span id="line-241"></span>
-<span class="source-line-no">242</span><span id="line-242">  @Override</span>
-<span class="source-line-no">243</span><span id="line-243">  public boolean filterRowKey(Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">244</span><span id="line-244">    if (isEmpty()) {</span>
-<span class="source-line-no">245</span><span id="line-245">      return super.filterRowKey(firstRowCell);</span>
-<span class="source-line-no">246</span><span id="line-246">    }</span>
-<span class="source-line-no">247</span><span id="line-247">    boolean anyRowKeyFiltered = false;</span>
-<span class="source-line-no">248</span><span id="line-248">    boolean anyHintingPassed = false;</span>
-<span class="source-line-no">249</span><span id="line-249">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">250</span><span id="line-250">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">251</span><span id="line-251">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">252</span><span id="line-252">        // We don't need to care about any later filters, as we end the scan immediately.</span>
-<span class="source-line-no">253</span><span id="line-253">        // TODO HBASE-28633 in the normal code path, filterAllRemaining() always gets checked</span>
-<span class="source-line-no">254</span><span id="line-254">        // before filterRowKey(). We should be able to remove this check.</span>
-<span class="source-line-no">255</span><span id="line-255">        return true;</span>
-<span class="source-line-no">256</span><span id="line-256">      } else if (filter.filterRowKey(firstRowCell)) {</span>
-<span class="source-line-no">257</span><span id="line-257">        // Can't just return true here, because there are some filters (such as PrefixFilter) which</span>
-<span class="source-line-no">258</span><span id="line-258">        // will catch the row changed event by filterRowKey(). If we return early here, those</span>
-<span class="source-line-no">259</span><span id="line-259">        // filters will have no chance to update their row state.</span>
-<span class="source-line-no">260</span><span id="line-260">        anyRowKeyFiltered = true;</span>
-<span class="source-line-no">261</span><span id="line-261">      } else if (hintingFilters[i]) {</span>
-<span class="source-line-no">262</span><span id="line-262">        // If filterRowKey returns false and this is a hinting filter, then we must not filter this</span>
-<span class="source-line-no">263</span><span id="line-263">        // rowkey.</span>
-<span class="source-line-no">264</span><span id="line-264">        // Otherwise this sub-filter doesn't get a chance to provide a seek hint, and the scan may</span>
-<span class="source-line-no">265</span><span id="line-265">        // regress into a full scan.</span>
-<span class="source-line-no">266</span><span id="line-266">        anyHintingPassed = true;</span>
-<span class="source-line-no">267</span><span id="line-267">      }</span>
-<span class="source-line-no">268</span><span id="line-268">    }</span>
-<span class="source-line-no">269</span><span id="line-269">    return anyRowKeyFiltered &amp;&amp; !anyHintingPassed;</span>
-<span class="source-line-no">270</span><span id="line-270">  }</span>
-<span class="source-line-no">271</span><span id="line-271"></span>
-<span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public boolean filterAllRemaining() throws IOException {</span>
-<span class="source-line-no">274</span><span id="line-274">    if (isEmpty()) {</span>
-<span class="source-line-no">275</span><span id="line-275">      return super.filterAllRemaining();</span>
-<span class="source-line-no">276</span><span id="line-276">    }</span>
-<span class="source-line-no">277</span><span id="line-277">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">278</span><span id="line-278">      if (filters.get(i).filterAllRemaining()) {</span>
-<span class="source-line-no">279</span><span id="line-279">        return true;</span>
-<span class="source-line-no">280</span><span id="line-280">      }</span>
-<span class="source-line-no">281</span><span id="line-281">    }</span>
-<span class="source-line-no">282</span><span id="line-282">    return false;</span>
-<span class="source-line-no">283</span><span id="line-283">  }</span>
-<span class="source-line-no">284</span><span id="line-284"></span>
-<span class="source-line-no">285</span><span id="line-285">  @Override</span>
-<span class="source-line-no">286</span><span id="line-286">  public boolean filterRow() throws IOException {</span>
-<span class="source-line-no">287</span><span id="line-287">    if (isEmpty()) {</span>
-<span class="source-line-no">288</span><span id="line-288">      return super.filterRow();</span>
-<span class="source-line-no">289</span><span id="line-289">    }</span>
-<span class="source-line-no">290</span><span id="line-290">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">291</span><span id="line-291">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">292</span><span id="line-292">      if (filter.filterRow()) {</span>
-<span class="source-line-no">293</span><span id="line-293">        return true;</span>
-<span class="source-line-no">294</span><span id="line-294">      }</span>
-<span class="source-line-no">295</span><span id="line-295">    }</span>
-<span class="source-line-no">296</span><span id="line-296">    return false;</span>
-<span class="source-line-no">297</span><span id="line-297">  }</span>
-<span class="source-line-no">298</span><span id="line-298"></span>
-<span class="source-line-no">299</span><span id="line-299">  @Override</span>
-<span class="source-line-no">300</span><span id="line-300">  public Cell getNextCellHint(Cell currentCell) throws IOException {</span>
-<span class="source-line-no">301</span><span id="line-301">    if (isEmpty()) {</span>
-<span class="source-line-no">302</span><span id="line-302">      return super.getNextCellHint(currentCell);</span>
-<span class="source-line-no">303</span><span id="line-303">    }</span>
-<span class="source-line-no">304</span><span id="line-304">    Cell maxHint = null;</span>
-<span class="source-line-no">305</span><span id="line-305">    for (Filter filter : seekHintFilters) {</span>
-<span class="source-line-no">306</span><span id="line-306">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">307</span><span id="line-307">        continue;</span>
-<span class="source-line-no">308</span><span id="line-308">      }</span>
-<span class="source-line-no">309</span><span id="line-309">      Cell curKeyHint = filter.getNextCellHint(currentCell);</span>
-<span class="source-line-no">310</span><span id="line-310">      if (maxHint == null) {</span>
-<span class="source-line-no">311</span><span id="line-311">        maxHint = curKeyHint;</span>
-<span class="source-line-no">312</span><span id="line-312">        continue;</span>
-<span class="source-line-no">313</span><span id="line-313">      }</span>
-<span class="source-line-no">314</span><span id="line-314">      if (this.compareCell(maxHint, curKeyHint) &lt; 0) {</span>
-<span class="source-line-no">315</span><span id="line-315">        maxHint = curKeyHint;</span>
-<span class="source-line-no">316</span><span id="line-316">      }</span>
-<span class="source-line-no">317</span><span id="line-317">    }</span>
-<span class="source-line-no">318</span><span id="line-318">    return maxHint;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  @Override</span>
-<span class="source-line-no">322</span><span id="line-322">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">323</span><span id="line-323">    if (this == obj) {</span>
-<span class="source-line-no">324</span><span id="line-324">      return true;</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">    if (!(obj instanceof FilterListWithAND)) {</span>
-<span class="source-line-no">327</span><span id="line-327">      return false;</span>
-<span class="source-line-no">328</span><span id="line-328">    }</span>
-<span class="source-line-no">329</span><span id="line-329">    FilterListWithAND f = (FilterListWithAND) obj;</span>
-<span class="source-line-no">330</span><span id="line-330">    return this.filters.equals(f.getFilters()) &amp;&amp; this.seekHintFilters.equals(f.seekHintFilters);</span>
+<span class="source-line-no">136</span><span id="line-136">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)) {</span>
+<span class="source-line-no">137</span><span id="line-137">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
+<span class="source-line-no">138</span><span id="line-138">        }</span>
+<span class="source-line-no">139</span><span id="line-139">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL)) {</span>
+<span class="source-line-no">140</span><span id="line-140">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">141</span><span id="line-141">        }</span>
+<span class="source-line-no">142</span><span id="line-142">        if (isInReturnCodes(rc, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">143</span><span id="line-143">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">144</span><span id="line-144">        }</span>
+<span class="source-line-no">145</span><span id="line-145">        break;</span>
+<span class="source-line-no">146</span><span id="line-146">      case INCLUDE_AND_SEEK_NEXT_ROW:</span>
+<span class="source-line-no">147</span><span id="line-147">        if (</span>
+<span class="source-line-no">148</span><span id="line-148">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
+<span class="source-line-no">149</span><span id="line-149">            ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)</span>
+<span class="source-line-no">150</span><span id="line-150">        ) {</span>
+<span class="source-line-no">151</span><span id="line-151">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
+<span class="source-line-no">152</span><span id="line-152">        }</span>
+<span class="source-line-no">153</span><span id="line-153">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">154</span><span id="line-154">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">155</span><span id="line-155">        }</span>
+<span class="source-line-no">156</span><span id="line-156">        break;</span>
+<span class="source-line-no">157</span><span id="line-157">      case SKIP:</span>
+<span class="source-line-no">158</span><span id="line-158">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.SKIP)) {</span>
+<span class="source-line-no">159</span><span id="line-159">          return ReturnCode.SKIP;</span>
+<span class="source-line-no">160</span><span id="line-160">        }</span>
+<span class="source-line-no">161</span><span id="line-161">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.NEXT_COL)) {</span>
+<span class="source-line-no">162</span><span id="line-162">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">163</span><span id="line-163">        }</span>
+<span class="source-line-no">164</span><span id="line-164">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">165</span><span id="line-165">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">166</span><span id="line-166">        }</span>
+<span class="source-line-no">167</span><span id="line-167">        break;</span>
+<span class="source-line-no">168</span><span id="line-168">      case NEXT_COL:</span>
+<span class="source-line-no">169</span><span id="line-169">        if (</span>
+<span class="source-line-no">170</span><span id="line-170">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.SKIP,</span>
+<span class="source-line-no">171</span><span id="line-171">            ReturnCode.NEXT_COL)</span>
+<span class="source-line-no">172</span><span id="line-172">        ) {</span>
+<span class="source-line-no">173</span><span id="line-173">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">174</span><span id="line-174">        }</span>
+<span class="source-line-no">175</span><span id="line-175">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">176</span><span id="line-176">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">177</span><span id="line-177">        }</span>
+<span class="source-line-no">178</span><span id="line-178">        break;</span>
+<span class="source-line-no">179</span><span id="line-179">      case NEXT_ROW:</span>
+<span class="source-line-no">180</span><span id="line-180">        return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">181</span><span id="line-181">    }</span>
+<span class="source-line-no">182</span><span id="line-182">    throw new IllegalStateException(</span>
+<span class="source-line-no">183</span><span id="line-183">      "Received code is not valid. rc: " + rc + ", localRC: " + localRC);</span>
+<span class="source-line-no">184</span><span id="line-184">  }</span>
+<span class="source-line-no">185</span><span id="line-185"></span>
+<span class="source-line-no">186</span><span id="line-186">  private boolean isIncludeRelatedReturnCode(ReturnCode rc) {</span>
+<span class="source-line-no">187</span><span id="line-187">    return isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
+<span class="source-line-no">188</span><span id="line-188">      ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW);</span>
+<span class="source-line-no">189</span><span id="line-189">  }</span>
+<span class="source-line-no">190</span><span id="line-190"></span>
+<span class="source-line-no">191</span><span id="line-191">  @Override</span>
+<span class="source-line-no">192</span><span id="line-192">  public ReturnCode filterCell(Cell c) throws IOException {</span>
+<span class="source-line-no">193</span><span id="line-193">    if (isEmpty()) {</span>
+<span class="source-line-no">194</span><span id="line-194">      return ReturnCode.INCLUDE;</span>
+<span class="source-line-no">195</span><span id="line-195">    }</span>
+<span class="source-line-no">196</span><span id="line-196">    ReturnCode rc = ReturnCode.INCLUDE;</span>
+<span class="source-line-no">197</span><span id="line-197">    this.seekHintFilters.clear();</span>
+<span class="source-line-no">198</span><span id="line-198">    int i = 0;</span>
+<span class="source-line-no">199</span><span id="line-199">    int n = filters.size();</span>
+<span class="source-line-no">200</span><span id="line-200">    for (; i &lt; n; i++) {</span>
+<span class="source-line-no">201</span><span id="line-201">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">202</span><span id="line-202">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">203</span><span id="line-203">        rc = ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">204</span><span id="line-204">        // See comment right after this loop</span>
+<span class="source-line-no">205</span><span id="line-205">        break;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      ReturnCode localRC;</span>
+<span class="source-line-no">208</span><span id="line-208">      localRC = filter.filterCell(c);</span>
+<span class="source-line-no">209</span><span id="line-209">      if (localRC == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">210</span><span id="line-210">        seekHintFilters.add(filter);</span>
+<span class="source-line-no">211</span><span id="line-211">      }</span>
+<span class="source-line-no">212</span><span id="line-212">      rc = mergeReturnCode(rc, localRC);</span>
+<span class="source-line-no">213</span><span id="line-213">      // Only when rc is INCLUDE* case, we should pass the cell to the following sub-filters.</span>
+<span class="source-line-no">214</span><span id="line-214">      // otherwise we may mess up the global state (such as offset, count..) in the following</span>
+<span class="source-line-no">215</span><span id="line-215">      // sub-filters. (HBASE-20565)</span>
+<span class="source-line-no">216</span><span id="line-216">      if (!isIncludeRelatedReturnCode(rc)) {</span>
+<span class="source-line-no">217</span><span id="line-217">        // See comment right after this loop</span>
+<span class="source-line-no">218</span><span id="line-218">        break;</span>
+<span class="source-line-no">219</span><span id="line-219">      }</span>
+<span class="source-line-no">220</span><span id="line-220">    }</span>
+<span class="source-line-no">221</span><span id="line-221">    // We have the preliminary return code. However, if there are remaining uncalled hintingFilters,</span>
+<span class="source-line-no">222</span><span id="line-222">    // they may return hints that allow us to seek ahead and skip reading and processing a lot of</span>
+<span class="source-line-no">223</span><span id="line-223">    // cells.</span>
+<span class="source-line-no">224</span><span id="line-224">    // Process the remaining hinting filters so that we can get all seek hints.</span>
+<span class="source-line-no">225</span><span id="line-225">    // The farthest key is computed in getNextCellHint()</span>
+<span class="source-line-no">226</span><span id="line-226">    if (++i &lt; n) {</span>
+<span class="source-line-no">227</span><span id="line-227">      for (; i &lt; n; i++) {</span>
+<span class="source-line-no">228</span><span id="line-228">        if (hintingFilters[i]) {</span>
+<span class="source-line-no">229</span><span id="line-229">          Filter filter = filters.get(i);</span>
+<span class="source-line-no">230</span><span id="line-230">          if (filter.filterCell(c) == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">231</span><span id="line-231">            seekHintFilters.add(filter);</span>
+<span class="source-line-no">232</span><span id="line-232">          }</span>
+<span class="source-line-no">233</span><span id="line-233">        }</span>
+<span class="source-line-no">234</span><span id="line-234">      }</span>
+<span class="source-line-no">235</span><span id="line-235">    }</span>
+<span class="source-line-no">236</span><span id="line-236"></span>
+<span class="source-line-no">237</span><span id="line-237">    if (!seekHintFilters.isEmpty()) {</span>
+<span class="source-line-no">238</span><span id="line-238">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">239</span><span id="line-239">    }</span>
+<span class="source-line-no">240</span><span id="line-240">    return rc;</span>
+<span class="source-line-no">241</span><span id="line-241">  }</span>
+<span class="source-line-no">242</span><span id="line-242"></span>
+<span class="source-line-no">243</span><span id="line-243">  @Override</span>
+<span class="source-line-no">244</span><span id="line-244">  public void reset() throws IOException {</span>
+<span class="source-line-no">245</span><span id="line-245">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">246</span><span id="line-246">      filters.get(i).reset();</span>
+<span class="source-line-no">247</span><span id="line-247">    }</span>
+<span class="source-line-no">248</span><span id="line-248">    seekHintFilters.clear();</span>
+<span class="source-line-no">249</span><span id="line-249">    Arrays.fill(rejectedByFilterRowKey, false);</span>
+<span class="source-line-no">250</span><span id="line-250">  }</span>
+<span class="source-line-no">251</span><span id="line-251"></span>
+<span class="source-line-no">252</span><span id="line-252">  @Override</span>
+<span class="source-line-no">253</span><span id="line-253">  public boolean filterRowKey(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">254</span><span id="line-254">    if (isEmpty()) {</span>
+<span class="source-line-no">255</span><span id="line-255">      return super.filterRowKey(firstRowCell);</span>
+<span class="source-line-no">256</span><span id="line-256">    }</span>
+<span class="source-line-no">257</span><span id="line-257">    Arrays.fill(rejectedByFilterRowKey, false);</span>
+<span class="source-line-no">258</span><span id="line-258">    boolean anyRowKeyFiltered = false;</span>
+<span class="source-line-no">259</span><span id="line-259">    boolean anyHintingPassed = false;</span>
+<span class="source-line-no">260</span><span id="line-260">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">261</span><span id="line-261">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">262</span><span id="line-262">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">263</span><span id="line-263">        // We don't need to care about any later filters, as we end the scan immediately.</span>
+<span class="source-line-no">264</span><span id="line-264">        // TODO HBASE-28633 in the normal code path, filterAllRemaining() always gets checked</span>
+<span class="source-line-no">265</span><span id="line-265">        // before filterRowKey(). We should be able to remove this check.</span>
+<span class="source-line-no">266</span><span id="line-266">        return true;</span>
+<span class="source-line-no">267</span><span id="line-267">      } else if (filter.filterRowKey(firstRowCell)) {</span>
+<span class="source-line-no">268</span><span id="line-268">        // Can't just return true here, because there are some filters (such as PrefixFilter) which</span>
+<span class="source-line-no">269</span><span id="line-269">        // will catch the row changed event by filterRowKey(). If we return early here, those</span>
+<span class="source-line-no">270</span><span id="line-270">        // filters will have no chance to update their row state.</span>
+<span class="source-line-no">271</span><span id="line-271">        anyRowKeyFiltered = true;</span>
+<span class="source-line-no">272</span><span id="line-272">        rejectedByFilterRowKey[i] = true;</span>
+<span class="source-line-no">273</span><span id="line-273">      } else if (hintingFilters[i]) {</span>
+<span class="source-line-no">274</span><span id="line-274">        // If filterRowKey returns false and this is a hinting filter, then we must not filter this</span>
+<span class="source-line-no">275</span><span id="line-275">        // rowkey.</span>
+<span class="source-line-no">276</span><span id="line-276">        // Otherwise this sub-filter doesn't get a chance to provide a seek hint, and the scan may</span>
+<span class="source-line-no">277</span><span id="line-277">        // regress into a full scan.</span>
+<span class="source-line-no">278</span><span id="line-278">        anyHintingPassed = true;</span>
+<span class="source-line-no">279</span><span id="line-279">      }</span>
+<span class="source-line-no">280</span><span id="line-280">    }</span>
+<span class="source-line-no">281</span><span id="line-281">    return anyRowKeyFiltered &amp;&amp; !anyHintingPassed;</span>
+<span class="source-line-no">282</span><span id="line-282">  }</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">  @Override</span>
+<span class="source-line-no">285</span><span id="line-285">  public boolean filterAllRemaining() throws IOException {</span>
+<span class="source-line-no">286</span><span id="line-286">    if (isEmpty()) {</span>
+<span class="source-line-no">287</span><span id="line-287">      return super.filterAllRemaining();</span>
+<span class="source-line-no">288</span><span id="line-288">    }</span>
+<span class="source-line-no">289</span><span id="line-289">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">290</span><span id="line-290">      if (filters.get(i).filterAllRemaining()) {</span>
+<span class="source-line-no">291</span><span id="line-291">        return true;</span>
+<span class="source-line-no">292</span><span id="line-292">      }</span>
+<span class="source-line-no">293</span><span id="line-293">    }</span>
+<span class="source-line-no">294</span><span id="line-294">    return false;</span>
+<span class="source-line-no">295</span><span id="line-295">  }</span>
+<span class="source-line-no">296</span><span id="line-296"></span>
+<span class="source-line-no">297</span><span id="line-297">  @Override</span>
+<span class="source-line-no">298</span><span id="line-298">  public boolean filterRow() throws IOException {</span>
+<span class="source-line-no">299</span><span id="line-299">    if (isEmpty()) {</span>
+<span class="source-line-no">300</span><span id="line-300">      return super.filterRow();</span>
+<span class="source-line-no">301</span><span id="line-301">    }</span>
+<span class="source-line-no">302</span><span id="line-302">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">303</span><span id="line-303">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">304</span><span id="line-304">      if (filter.filterRow()) {</span>
+<span class="source-line-no">305</span><span id="line-305">        return true;</span>
+<span class="source-line-no">306</span><span id="line-306">      }</span>
+<span class="source-line-no">307</span><span id="line-307">    }</span>
+<span class="source-line-no">308</span><span id="line-308">    return false;</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  @Override</span>
+<span class="source-line-no">312</span><span id="line-312">  public Cell getNextCellHint(Cell currentCell) throws IOException {</span>
+<span class="source-line-no">313</span><span id="line-313">    if (isEmpty()) {</span>
+<span class="source-line-no">314</span><span id="line-314">      return super.getNextCellHint(currentCell);</span>
+<span class="source-line-no">315</span><span id="line-315">    }</span>
+<span class="source-line-no">316</span><span id="line-316">    Cell maxHint = null;</span>
+<span class="source-line-no">317</span><span id="line-317">    for (Filter filter : seekHintFilters) {</span>
+<span class="source-line-no">318</span><span id="line-318">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">319</span><span id="line-319">        continue;</span>
+<span class="source-line-no">320</span><span id="line-320">      }</span>
+<span class="source-line-no">321</span><span id="line-321">      Cell curKeyHint = filter.getNextCellHint(currentCell);</span>
+<span class="source-line-no">322</span><span id="line-322">      if (maxHint == null) {</span>
+<span class="source-line-no">323</span><span id="line-323">        maxHint = curKeyHint;</span>
+<span class="source-line-no">324</span><span id="line-324">        continue;</span>
+<span class="source-line-no">325</span><span id="line-325">      }</span>
+<span class="source-line-no">326</span><span id="line-326">      if (this.compareCell(maxHint, curKeyHint) &lt; 0) {</span>
+<span class="source-line-no">327</span><span id="line-327">        maxHint = curKeyHint;</span>
+<span class="source-line-no">328</span><span id="line-328">      }</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">    return maxHint;</span>
 <span class="source-line-no">331</span><span id="line-331">  }</span>
 <span class="source-line-no">332</span><span id="line-332"></span>
-<span class="source-line-no">333</span><span id="line-333">  @Override</span>
-<span class="source-line-no">334</span><span id="line-334">  public int hashCode() {</span>
-<span class="source-line-no">335</span><span id="line-335">    return Objects.hash(this.seekHintFilters, this.filters);</span>
-<span class="source-line-no">336</span><span id="line-336">  }</span>
-<span class="source-line-no">337</span><span id="line-337">}</span>
+<span class="source-line-no">333</span><span id="line-333">  /**</span>
+<span class="source-line-no">334</span><span id="line-334">   * Maximal step: return the farthest hint among sub-filters that actually rejected the row. Only</span>
+<span class="source-line-no">335</span><span id="line-335">   * sub-filters whose {@link Filter#filterRowKey(Cell)} returned {@code true} are consulted,</span>
+<span class="source-line-no">336</span><span id="line-336">   * honouring the per-filter contract. Null hints are ignored; if no rejecting sub-filter provides</span>
+<span class="source-line-no">337</span><span id="line-337">   * a hint, return null.</span>
+<span class="source-line-no">338</span><span id="line-338">   */</span>
+<span class="source-line-no">339</span><span id="line-339">  @Override</span>
+<span class="source-line-no">340</span><span id="line-340">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">341</span><span id="line-341">    if (isEmpty()) {</span>
+<span class="source-line-no">342</span><span id="line-342">      return super.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">343</span><span id="line-343">    }</span>
+<span class="source-line-no">344</span><span id="line-344">    Cell maxHint = null;</span>
+<span class="source-line-no">345</span><span id="line-345">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">346</span><span id="line-346">      if (!rejectedByFilterRowKey[i]) {</span>
+<span class="source-line-no">347</span><span id="line-347">        continue;</span>
+<span class="source-line-no">348</span><span id="line-348">      }</span>
+<span class="source-line-no">349</span><span id="line-349">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">350</span><span id="line-350">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">351</span><span id="line-351">        continue;</span>
+<span class="source-line-no">352</span><span id="line-352">      }</span>
+<span class="source-line-no">353</span><span id="line-353">      Cell hint = filter.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">354</span><span id="line-354">      if (hint == null) {</span>
+<span class="source-line-no">355</span><span id="line-355">        continue;</span>
+<span class="source-line-no">356</span><span id="line-356">      }</span>
+<span class="source-line-no">357</span><span id="line-357">      if (maxHint == null || this.compareCell(maxHint, hint) &lt; 0) {</span>
+<span class="source-line-no">358</span><span id="line-358">        maxHint = hint;</span>
+<span class="source-line-no">359</span><span id="line-359">      }</span>
+<span class="source-line-no">360</span><span id="line-360">    }</span>
+<span class="source-line-no">361</span><span id="line-361">    return maxHint;</span>
+<span class="source-line-no">362</span><span id="line-362">  }</span>
+<span class="source-line-no">363</span><span id="line-363"></span>
+<span class="source-line-no">364</span><span id="line-364">  /** Maximal step: return the farthest skip hint among sub-filters. */</span>
+<span class="source-line-no">365</span><span id="line-365">  @Override</span>
+<span class="source-line-no">366</span><span id="line-366">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">367</span><span id="line-367">    if (isEmpty()) {</span>
+<span class="source-line-no">368</span><span id="line-368">      return super.getSkipHint(skippedCell);</span>
+<span class="source-line-no">369</span><span id="line-369">    }</span>
+<span class="source-line-no">370</span><span id="line-370">    Cell maxHint = null;</span>
+<span class="source-line-no">371</span><span id="line-371">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">372</span><span id="line-372">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">373</span><span id="line-373">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">374</span><span id="line-374">        continue;</span>
+<span class="source-line-no">375</span><span id="line-375">      }</span>
+<span class="source-line-no">376</span><span id="line-376">      Cell hint = filter.getSkipHint(skippedCell);</span>
+<span class="source-line-no">377</span><span id="line-377">      if (hint == null) {</span>
+<span class="source-line-no">378</span><span id="line-378">        continue;</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380">      if (maxHint == null || this.compareCell(maxHint, hint) &lt; 0) {</span>
+<span class="source-line-no">381</span><span id="line-381">        maxHint = hint;</span>
+<span class="source-line-no">382</span><span id="line-382">      }</span>
+<span class="source-line-no">383</span><span id="line-383">    }</span>
+<span class="source-line-no">384</span><span id="line-384">    return maxHint;</span>
+<span class="source-line-no">385</span><span id="line-385">  }</span>
+<span class="source-line-no">386</span><span id="line-386"></span>
+<span class="source-line-no">387</span><span id="line-387">  @Override</span>
+<span class="source-line-no">388</span><span id="line-388">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">389</span><span id="line-389">    if (this == obj) {</span>
+<span class="source-line-no">390</span><span id="line-390">      return true;</span>
+<span class="source-line-no">391</span><span id="line-391">    }</span>
+<span class="source-line-no">392</span><span id="line-392">    if (!(obj instanceof FilterListWithAND)) {</span>
+<span class="source-line-no">393</span><span id="line-393">      return false;</span>
+<span class="source-line-no">394</span><span id="line-394">    }</span>
+<span class="source-line-no">395</span><span id="line-395">    FilterListWithAND f = (FilterListWithAND) obj;</span>
+<span class="source-line-no">396</span><span id="line-396">    return this.filters.equals(f.getFilters()) &amp;&amp; this.seekHintFilters.equals(f.seekHintFilters);</span>
+<span class="source-line-no">397</span><span id="line-397">  }</span>
+<span class="source-line-no">398</span><span id="line-398"></span>
+<span class="source-line-no">399</span><span id="line-399">  @Override</span>
+<span class="source-line-no">400</span><span id="line-400">  public int hashCode() {</span>
+<span class="source-line-no">401</span><span id="line-401">    return Objects.hash(this.seekHintFilters, this.filters);</span>
+<span class="source-line-no">402</span><span id="line-402">  }</span>
+<span class="source-line-no">403</span><span id="line-403">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
index 7d8c580361d..c6e354efaa7 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
@@ -405,24 +405,76 @@
 <span class="source-line-no">392</span><span id="line-392">    return minKeyHint;</span>
 <span class="source-line-no">393</span><span id="line-393">  }</span>
 <span class="source-line-no">394</span><span id="line-394"></span>
-<span class="source-line-no">395</span><span id="line-395">  @Override</span>
-<span class="source-line-no">396</span><span id="line-396">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">397</span><span id="line-397">    if (this == obj) {</span>
-<span class="source-line-no">398</span><span id="line-398">      return true;</span>
-<span class="source-line-no">399</span><span id="line-399">    }</span>
-<span class="source-line-no">400</span><span id="line-400">    if (!(obj instanceof FilterListWithOR)) {</span>
-<span class="source-line-no">401</span><span id="line-401">      return false;</span>
-<span class="source-line-no">402</span><span id="line-402">    }</span>
-<span class="source-line-no">403</span><span id="line-403">    FilterListWithOR f = (FilterListWithOR) obj;</span>
-<span class="source-line-no">404</span><span id="line-404">    return this.filters.equals(f.getFilters()) &amp;&amp; this.prevFilterRCList.equals(f.prevFilterRCList)</span>
-<span class="source-line-no">405</span><span id="line-405">      &amp;&amp; this.prevCellList.equals(f.prevCellList);</span>
-<span class="source-line-no">406</span><span id="line-406">  }</span>
-<span class="source-line-no">407</span><span id="line-407"></span>
-<span class="source-line-no">408</span><span id="line-408">  @Override</span>
-<span class="source-line-no">409</span><span id="line-409">  public int hashCode() {</span>
-<span class="source-line-no">410</span><span id="line-410">    return Objects.hash(this.prevFilterRCList, this.prevCellList, this.filters);</span>
-<span class="source-line-no">411</span><span id="line-411">  }</span>
-<span class="source-line-no">412</span><span id="line-412">}</span>
+<span class="source-line-no">395</span><span id="line-395">  /**</span>
+<span class="source-line-no">396</span><span id="line-396">   * Minimal step: return the nearest hint. If any non-terminated sub-filter returns null, the</span>
+<span class="source-line-no">397</span><span id="line-397">   * composite cannot safely skip, so return null.</span>
+<span class="source-line-no">398</span><span id="line-398">   */</span>
+<span class="source-line-no">399</span><span id="line-399">  @Override</span>
+<span class="source-line-no">400</span><span id="line-400">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">401</span><span id="line-401">    if (isEmpty()) {</span>
+<span class="source-line-no">402</span><span id="line-402">      return super.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">403</span><span id="line-403">    }</span>
+<span class="source-line-no">404</span><span id="line-404">    Cell minHint = null;</span>
+<span class="source-line-no">405</span><span id="line-405">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">406</span><span id="line-406">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">407</span><span id="line-407">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">408</span><span id="line-408">        continue;</span>
+<span class="source-line-no">409</span><span id="line-409">      }</span>
+<span class="source-line-no">410</span><span id="line-410">      Cell hint = filter.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">411</span><span id="line-411">      if (hint == null) {</span>
+<span class="source-line-no">412</span><span id="line-412">        return null;</span>
+<span class="source-line-no">413</span><span id="line-413">      }</span>
+<span class="source-line-no">414</span><span id="line-414">      if (minHint == null || this.compareCell(minHint, hint) &gt; 0) {</span>
+<span class="source-line-no">415</span><span id="line-415">        minHint = hint;</span>
+<span class="source-line-no">416</span><span id="line-416">      }</span>
+<span class="source-line-no">417</span><span id="line-417">    }</span>
+<span class="source-line-no">418</span><span id="line-418">    return minHint;</span>
+<span class="source-line-no">419</span><span id="line-419">  }</span>
+<span class="source-line-no">420</span><span id="line-420"></span>
+<span class="source-line-no">421</span><span id="line-421">  /**</span>
+<span class="source-line-no">422</span><span id="line-422">   * Minimal step: return the nearest skip hint. Null from any sub-filter collapses the entire</span>
+<span class="source-line-no">423</span><span id="line-423">   * result to null.</span>
+<span class="source-line-no">424</span><span id="line-424">   */</span>
+<span class="source-line-no">425</span><span id="line-425">  @Override</span>
+<span class="source-line-no">426</span><span id="line-426">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">427</span><span id="line-427">    if (isEmpty()) {</span>
+<span class="source-line-no">428</span><span id="line-428">      return super.getSkipHint(skippedCell);</span>
+<span class="source-line-no">429</span><span id="line-429">    }</span>
+<span class="source-line-no">430</span><span id="line-430">    Cell minHint = null;</span>
+<span class="source-line-no">431</span><span id="line-431">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">432</span><span id="line-432">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">433</span><span id="line-433">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">434</span><span id="line-434">        continue;</span>
+<span class="source-line-no">435</span><span id="line-435">      }</span>
+<span class="source-line-no">436</span><span id="line-436">      Cell hint = filter.getSkipHint(skippedCell);</span>
+<span class="source-line-no">437</span><span id="line-437">      if (hint == null) {</span>
+<span class="source-line-no">438</span><span id="line-438">        return null;</span>
+<span class="source-line-no">439</span><span id="line-439">      }</span>
+<span class="source-line-no">440</span><span id="line-440">      if (minHint == null || this.compareCell(minHint, hint) &gt; 0) {</span>
+<span class="source-line-no">441</span><span id="line-441">        minHint = hint;</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">    }</span>
+<span class="source-line-no">444</span><span id="line-444">    return minHint;</span>
+<span class="source-line-no">445</span><span id="line-445">  }</span>
+<span class="source-line-no">446</span><span id="line-446"></span>
+<span class="source-line-no">447</span><span id="line-447">  @Override</span>
+<span class="source-line-no">448</span><span id="line-448">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">449</span><span id="line-449">    if (this == obj) {</span>
+<span class="source-line-no">450</span><span id="line-450">      return true;</span>
+<span class="source-line-no">451</span><span id="line-451">    }</span>
+<span class="source-line-no">452</span><span id="line-452">    if (!(obj instanceof FilterListWithOR)) {</span>
+<span class="source-line-no">453</span><span id="line-453">      return false;</span>
+<span class="source-line-no">454</span><span id="line-454">    }</span>
+<span class="source-line-no">455</span><span id="line-455">    FilterListWithOR f = (FilterListWithOR) obj;</span>
+<span class="source-line-no">456</span><span id="line-456">    return this.filters.equals(f.getFilters()) &amp;&amp; this.prevFilterRCList.equals(f.prevFilterRCList)</span>
+<span class="source-line-no">457</span><span id="line-457">      &amp;&amp; this.prevCellList.equals(f.prevCellList);</span>
+<span class="source-line-no">458</span><span id="line-458">  }</span>
+<span class="source-line-no">459</span><span id="line-459"></span>
+<span class="source-line-no">460</span><span id="line-460">  @Override</span>
+<span class="source-line-no">461</span><span id="line-461">  public int hashCode() {</span>
+<span class="source-line-no">462</span><span id="line-462">    return Objects.hash(this.prevFilterRCList, this.prevCellList, this.filters);</span>
+<span class="source-line-no">463</span><span id="line-463">  }</span>
+<span class="source-line-no">464</span><span id="line-464">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
index 70dae8a95af..1d8106064c4 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
@@ -186,53 +186,76 @@
 <span class="source-line-no">173</span><span id="line-173">    return PrivateCellUtil.createFirstOnRowCol(cell, hint, 0, hint.length);</span>
 <span class="source-line-no">174</span><span id="line-174">  }</span>
 <span class="source-line-no">175</span><span id="line-175"></span>
-<span class="source-line-no">176</span><span id="line-176">  public TreeSet&lt;byte[]&gt; createTreeSet() {</span>
-<span class="source-line-no">177</span><span id="line-177">    return new TreeSet&lt;&gt;(new Comparator&lt;Object&gt;() {</span>
-<span class="source-line-no">178</span><span id="line-178">      @Override</span>
-<span class="source-line-no">179</span><span id="line-179">      public int compare(Object o1, Object o2) {</span>
-<span class="source-line-no">180</span><span id="line-180">        if (o1 == null || o2 == null) throw new IllegalArgumentException("prefixes can't be null");</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">        byte[] b1 = (byte[]) o1;</span>
-<span class="source-line-no">183</span><span id="line-183">        byte[] b2 = (byte[]) o2;</span>
-<span class="source-line-no">184</span><span id="line-184">        return Bytes.compareTo(b1, 0, b1.length, b2, 0, b2.length);</span>
-<span class="source-line-no">185</span><span id="line-185">      }</span>
-<span class="source-line-no">186</span><span id="line-186">    });</span>
-<span class="source-line-no">187</span><span id="line-187">  }</span>
-<span class="source-line-no">188</span><span id="line-188"></span>
-<span class="source-line-no">189</span><span id="line-189">  @Override</span>
-<span class="source-line-no">190</span><span id="line-190">  public String toString() {</span>
-<span class="source-line-no">191</span><span id="line-191">    return toString(MAX_LOG_PREFIXES);</span>
-<span class="source-line-no">192</span><span id="line-192">  }</span>
-<span class="source-line-no">193</span><span id="line-193"></span>
-<span class="source-line-no">194</span><span id="line-194">  protected String toString(int maxPrefixes) {</span>
-<span class="source-line-no">195</span><span id="line-195">    StringBuilder prefixes = new StringBuilder();</span>
-<span class="source-line-no">196</span><span id="line-196"></span>
-<span class="source-line-no">197</span><span id="line-197">    int count = 0;</span>
-<span class="source-line-no">198</span><span id="line-198">    for (byte[] ba : this.sortedPrefixes) {</span>
-<span class="source-line-no">199</span><span id="line-199">      if (count &gt;= maxPrefixes) {</span>
-<span class="source-line-no">200</span><span id="line-200">        break;</span>
-<span class="source-line-no">201</span><span id="line-201">      }</span>
-<span class="source-line-no">202</span><span id="line-202">      ++count;</span>
-<span class="source-line-no">203</span><span id="line-203">      prefixes.append(Bytes.toStringBinary(ba));</span>
-<span class="source-line-no">204</span><span id="line-204">      if (count &lt; this.sortedPrefixes.size() &amp;&amp; count &lt; maxPrefixes) {</span>
-<span class="source-line-no">205</span><span id="line-205">        prefixes.append(", ");</span>
-<span class="source-line-no">206</span><span id="line-206">      }</span>
-<span class="source-line-no">207</span><span id="line-207">    }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(), count,</span>
-<span class="source-line-no">210</span><span id="line-210">      this.sortedPrefixes.size(), prefixes.toString());</span>
-<span class="source-line-no">211</span><span id="line-211">  }</span>
-<span class="source-line-no">212</span><span id="line-212"></span>
-<span class="source-line-no">213</span><span id="line-213">  @Override</span>
-<span class="source-line-no">214</span><span id="line-214">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">215</span><span id="line-215">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">216</span><span id="line-216">  }</span>
-<span class="source-line-no">217</span><span id="line-217"></span>
-<span class="source-line-no">218</span><span id="line-218">  @Override</span>
-<span class="source-line-no">219</span><span id="line-219">  public int hashCode() {</span>
-<span class="source-line-no">220</span><span id="line-220">    return Objects.hash(this.sortedPrefixes);</span>
-<span class="source-line-no">221</span><span id="line-221">  }</span>
-<span class="source-line-no">222</span><span id="line-222">}</span>
+<span class="source-line-no">176</span><span id="line-176">  @Override</span>
+<span class="source-line-no">177</span><span id="line-177">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">178</span><span id="line-178">    if (sortedPrefixes.isEmpty()) {</span>
+<span class="source-line-no">179</span><span id="line-179">      return null;</span>
+<span class="source-line-no">180</span><span id="line-180">    }</span>
+<span class="source-line-no">181</span><span id="line-181">    byte[] qualifier = CellUtil.cloneQualifier(skippedCell);</span>
+<span class="source-line-no">182</span><span id="line-182">    TreeSet&lt;byte[]&gt; lesserOrEqual = (TreeSet&lt;byte[]&gt;) sortedPrefixes.headSet(qualifier, true);</span>
+<span class="source-line-no">183</span><span id="line-183">    byte[] target;</span>
+<span class="source-line-no">184</span><span id="line-184">    if (lesserOrEqual.isEmpty()) {</span>
+<span class="source-line-no">185</span><span id="line-185">      target = sortedPrefixes.first();</span>
+<span class="source-line-no">186</span><span id="line-186">    } else {</span>
+<span class="source-line-no">187</span><span id="line-187">      byte[] largest = lesserOrEqual.last();</span>
+<span class="source-line-no">188</span><span id="line-188">      if (Bytes.startsWith(qualifier, largest)) {</span>
+<span class="source-line-no">189</span><span id="line-189">        return null;</span>
+<span class="source-line-no">190</span><span id="line-190">      }</span>
+<span class="source-line-no">191</span><span id="line-191">      target = sortedPrefixes.higher(largest);</span>
+<span class="source-line-no">192</span><span id="line-192">      if (target == null) {</span>
+<span class="source-line-no">193</span><span id="line-193">        return null;</span>
+<span class="source-line-no">194</span><span id="line-194">      }</span>
+<span class="source-line-no">195</span><span id="line-195">    }</span>
+<span class="source-line-no">196</span><span id="line-196">    return PrivateCellUtil.createFirstOnRowCol(skippedCell, target, 0, target.length);</span>
+<span class="source-line-no">197</span><span id="line-197">  }</span>
+<span class="source-line-no">198</span><span id="line-198"></span>
+<span class="source-line-no">199</span><span id="line-199">  public TreeSet&lt;byte[]&gt; createTreeSet() {</span>
+<span class="source-line-no">200</span><span id="line-200">    return new TreeSet&lt;&gt;(new Comparator&lt;Object&gt;() {</span>
+<span class="source-line-no">201</span><span id="line-201">      @Override</span>
+<span class="source-line-no">202</span><span id="line-202">      public int compare(Object o1, Object o2) {</span>
+<span class="source-line-no">203</span><span id="line-203">        if (o1 == null || o2 == null) throw new IllegalArgumentException("prefixes can't be null");</span>
+<span class="source-line-no">204</span><span id="line-204"></span>
+<span class="source-line-no">205</span><span id="line-205">        byte[] b1 = (byte[]) o1;</span>
+<span class="source-line-no">206</span><span id="line-206">        byte[] b2 = (byte[]) o2;</span>
+<span class="source-line-no">207</span><span id="line-207">        return Bytes.compareTo(b1, 0, b1.length, b2, 0, b2.length);</span>
+<span class="source-line-no">208</span><span id="line-208">      }</span>
+<span class="source-line-no">209</span><span id="line-209">    });</span>
+<span class="source-line-no">210</span><span id="line-210">  }</span>
+<span class="source-line-no">211</span><span id="line-211"></span>
+<span class="source-line-no">212</span><span id="line-212">  @Override</span>
+<span class="source-line-no">213</span><span id="line-213">  public String toString() {</span>
+<span class="source-line-no">214</span><span id="line-214">    return toString(MAX_LOG_PREFIXES);</span>
+<span class="source-line-no">215</span><span id="line-215">  }</span>
+<span class="source-line-no">216</span><span id="line-216"></span>
+<span class="source-line-no">217</span><span id="line-217">  protected String toString(int maxPrefixes) {</span>
+<span class="source-line-no">218</span><span id="line-218">    StringBuilder prefixes = new StringBuilder();</span>
+<span class="source-line-no">219</span><span id="line-219"></span>
+<span class="source-line-no">220</span><span id="line-220">    int count = 0;</span>
+<span class="source-line-no">221</span><span id="line-221">    for (byte[] ba : this.sortedPrefixes) {</span>
+<span class="source-line-no">222</span><span id="line-222">      if (count &gt;= maxPrefixes) {</span>
+<span class="source-line-no">223</span><span id="line-223">        break;</span>
+<span class="source-line-no">224</span><span id="line-224">      }</span>
+<span class="source-line-no">225</span><span id="line-225">      ++count;</span>
+<span class="source-line-no">226</span><span id="line-226">      prefixes.append(Bytes.toStringBinary(ba));</span>
+<span class="source-line-no">227</span><span id="line-227">      if (count &lt; this.sortedPrefixes.size() &amp;&amp; count &lt; maxPrefixes) {</span>
+<span class="source-line-no">228</span><span id="line-228">        prefixes.append(", ");</span>
+<span class="source-line-no">229</span><span id="line-229">      }</span>
+<span class="source-line-no">230</span><span id="line-230">    }</span>
+<span class="source-line-no">231</span><span id="line-231"></span>
+<span class="source-line-no">232</span><span id="line-232">    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(), count,</span>
+<span class="source-line-no">233</span><span id="line-233">      this.sortedPrefixes.size(), prefixes.toString());</span>
+<span class="source-line-no">234</span><span id="line-234">  }</span>
+<span class="source-line-no">235</span><span id="line-235"></span>
+<span class="source-line-no">236</span><span id="line-236">  @Override</span>
+<span class="source-line-no">237</span><span id="line-237">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">238</span><span id="line-238">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">239</span><span id="line-239">  }</span>
+<span class="source-line-no">240</span><span id="line-240"></span>
+<span class="source-line-no">241</span><span id="line-241">  @Override</span>
+<span class="source-line-no">242</span><span id="line-242">  public int hashCode() {</span>
+<span class="source-line-no">243</span><span id="line-243">    return Objects.hash(this.sortedPrefixes);</span>
+<span class="source-line-no">244</span><span id="line-244">  }</span>
+<span class="source-line-no">245</span><span id="line-245">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
index c31191a7d0a..31a0f1e52fc 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
@@ -155,25 +155,35 @@
 <span class="source-line-no">142</span><span id="line-142">  }</span>
 <span class="source-line-no">143</span><span id="line-143"></span>
 <span class="source-line-no">144</span><span id="line-144">  @Override</span>
-<span class="source-line-no">145</span><span id="line-145">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">146</span><span id="line-146">    return filter.isFamilyEssential(name);</span>
+<span class="source-line-no">145</span><span id="line-145">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">146</span><span id="line-146">    return filter.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">147</span><span id="line-147">  }</span>
 <span class="source-line-no">148</span><span id="line-148"></span>
 <span class="source-line-no">149</span><span id="line-149">  @Override</span>
-<span class="source-line-no">150</span><span id="line-150">  public String toString() {</span>
-<span class="source-line-no">151</span><span id="line-151">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
+<span class="source-line-no">150</span><span id="line-150">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">151</span><span id="line-151">    return filter.getSkipHint(skippedCell);</span>
 <span class="source-line-no">152</span><span id="line-152">  }</span>
 <span class="source-line-no">153</span><span id="line-153"></span>
 <span class="source-line-no">154</span><span id="line-154">  @Override</span>
-<span class="source-line-no">155</span><span id="line-155">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">156</span><span id="line-156">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">155</span><span id="line-155">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">156</span><span id="line-156">    return filter.isFamilyEssential(name);</span>
 <span class="source-line-no">157</span><span id="line-157">  }</span>
 <span class="source-line-no">158</span><span id="line-158"></span>
 <span class="source-line-no">159</span><span id="line-159">  @Override</span>
-<span class="source-line-no">160</span><span id="line-160">  public int hashCode() {</span>
-<span class="source-line-no">161</span><span id="line-161">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">160</span><span id="line-160">  public String toString() {</span>
+<span class="source-line-no">161</span><span id="line-161">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
 <span class="source-line-no">162</span><span id="line-162">  }</span>
-<span class="source-line-no">163</span><span id="line-163">}</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Override</span>
+<span class="source-line-no">165</span><span id="line-165">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">166</span><span id="line-166">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">167</span><span id="line-167">  }</span>
+<span class="source-line-no">168</span><span id="line-168"></span>
+<span class="source-line-no">169</span><span id="line-169">  @Override</span>
+<span class="source-line-no">170</span><span id="line-170">  public int hashCode() {</span>
+<span class="source-line-no">171</span><span id="line-171">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">172</span><span id="line-172">  }</span>
+<span class="source-line-no">173</span><span id="line-173">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
index 27cdc423769..fb13514183d 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
@@ -153,25 +153,35 @@
 <span class="source-line-no">140</span><span id="line-140">  }</span>
 <span class="source-line-no">141</span><span id="line-141"></span>
 <span class="source-line-no">142</span><span id="line-142">  @Override</span>
-<span class="source-line-no">143</span><span id="line-143">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">144</span><span id="line-144">    return filter.isFamilyEssential(name);</span>
+<span class="source-line-no">143</span><span id="line-143">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">144</span><span id="line-144">    return filter.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">145</span><span id="line-145">  }</span>
 <span class="source-line-no">146</span><span id="line-146"></span>
 <span class="source-line-no">147</span><span id="line-147">  @Override</span>
-<span class="source-line-no">148</span><span id="line-148">  public String toString() {</span>
-<span class="source-line-no">149</span><span id="line-149">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
+<span class="source-line-no">148</span><span id="line-148">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">149</span><span id="line-149">    return filter.getSkipHint(skippedCell);</span>
 <span class="source-line-no">150</span><span id="line-150">  }</span>
 <span class="source-line-no">151</span><span id="line-151"></span>
 <span class="source-line-no">152</span><span id="line-152">  @Override</span>
-<span class="source-line-no">153</span><span id="line-153">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">154</span><span id="line-154">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">153</span><span id="line-153">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">154</span><span id="line-154">    return filter.isFamilyEssential(name);</span>
 <span class="source-line-no">155</span><span id="line-155">  }</span>
 <span class="source-line-no">156</span><span id="line-156"></span>
 <span class="source-line-no">157</span><span id="line-157">  @Override</span>
-<span class="source-line-no">158</span><span id="line-158">  public int hashCode() {</span>
-<span class="source-line-no">159</span><span id="line-159">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">158</span><span id="line-158">  public String toString() {</span>
+<span class="source-line-no">159</span><span id="line-159">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
 <span class="source-line-no">160</span><span id="line-160">  }</span>
-<span class="source-line-no">161</span><span id="line-161">}</span>
+<span class="source-line-no">161</span><span id="line-161"></span>
+<span class="source-line-no">162</span><span id="line-162">  @Override</span>
+<span class="source-line-no">163</span><span id="line-163">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">164</span><span id="line-164">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">165</span><span id="line-165">  }</span>
+<span class="source-line-no">166</span><span id="line-166"></span>
+<span class="source-line-no">167</span><span id="line-167">  @Override</span>
+<span class="source-line-no">168</span><span id="line-168">  public int hashCode() {</span>
+<span class="source-line-no">169</span><span id="line-169">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171">}</span>
 
 
 
diff --git a/books/apache-hbase-reference-guide-dark-mode.pdf b/books/apache-hbase-reference-guide-dark-mode.pdf
index 43a6c1853a3..ab8bebdf0e4 100644
Binary files a/books/apache-hbase-reference-guide-dark-mode.pdf and b/books/apache-hbase-reference-guide-dark-mode.pdf differ
diff --git a/books/apache-hbase-reference-guide.pdf b/books/apache-hbase-reference-guide.pdf
index a70e9b0c29e..0e1e31dc900 100644
Binary files a/books/apache-hbase-reference-guide.pdf and b/books/apache-hbase-reference-guide.pdf differ
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 2d1296df5d8..3f244b05c81 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-05-14
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-05-16
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
@@ -109,10 +109,10 @@
 <th><img src="images/icon_warning_sml.gif" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" />&#160;Errors</th></tr>
 <tr class="b">
-<td>5301</td>
+<td>5305</td>
 <td>0</td>
 <td>0</td>
-<td>1844</td></tr></table></section><section><a id="Files"></a>
+<td>1830</td></tr></table></section><section><a id="Files"></a>
 <h2>Files</h2>
 <table class="table table-striped">
 <tr class="a">
@@ -526,47 +526,37 @@
 <td>0</td>
 <td>1</td></tr>
 <tr class="a">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAdmin.java">org/apache/hadoop/hbase/client/TestAdmin.java</a></td>
-<td>0</td>
-<td>0</td>
-<td>1</td></tr>
-<tr class="b">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAsyncRegionAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAsyncReplicationAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAvoidCellReferencesIntoShippedBlocks.java">org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
-<tr class="a">
+<td>2</td></tr>
+<tr class="b">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBlockEvictionFromClient.java">org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>4</td></tr>
-<tr class="b">
+<td>2</td></tr>
+<tr class="a">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBufferedMutatorParams.java">org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestClientSideRegionScanner.java">org/apache/hadoop/hbase/client/TestClientSideRegionScanner.java</a></td>
-<td>0</td>
-<td>0</td>
-<td>1</td></tr>
 <tr class="b">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestImmutableScan.java">org/apache/hadoop/hbase/client/TestImmutableScan.java</a></td>
+<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestClientSideRegionScanner.java">org/apache/hadoop/hbase/client/TestClientSideRegionScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
 <tr class="a">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestIncrementsFromClientSide.java">org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java</a></td>
+<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestImmutableScan.java">org/apache/hadoop/hbase/client/TestImmutableScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
@@ -574,19 +564,19 @@
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestMultipleTimestamps.java">org/apache/hadoop/hbase/client/TestMultipleTimestamps.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>26</td></tr>
+<td>20</td></tr>
 <tr class="a">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestPutWithDelete.java">org/apache/hadoop/hbase/client/TestPutWithDelete.java</a></td>
+<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicaWithCluster.java">org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>2</td></tr>
+<td>1</td></tr>
 <tr class="b">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicaWithCluster.java">org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</a></td>
+<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicasClient.java">org/apache/hadoop/hbase/client/TestReplicasClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
 <tr class="a">
-<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicasClient.java">org/apache/hadoop/hbase/client/TestReplicasClient.java</a></td>
+<td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestResult.java">org/apache/hadoop/hbase/client/TestResult.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
@@ -604,7 +594,7 @@
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestTimestampsFilter.java">org/apache/hadoop/hbase/client/TestTimestampsFilter.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>14</td></tr>
+<td>12</td></tr>
 <tr class="a">
 <td><a href="#org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2Fcoprocessor.2FAggregationClient.java">org/apache/hadoop/hbase/client/coprocessor/AggregationClient.java</a></td>
 <td>0</td>
@@ -3655,7 +3645,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="https://checkstyle.org/checks/blocks/needbraces.html">NeedBraces</a></td>
-<td>865</td>
+<td>864</td>
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td></tr>
 <tr class="a">
 <td>coding</td>
@@ -3723,7 +3713,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="https://checkstyle.org/checks/javadoc/nonemptyatclausedescription.html">NonEmptyAtclauseDescription</a></td>
-<td>43</td>
+<td>31</td>
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -3746,7 +3736,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="https://checkstyle.org/checks/sizes/methodlength.html">MethodLength</a></td>
-<td>62</td>
+<td>61</td>
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td></tr>
 <tr class="a">
 <td>whitespace</td>
@@ -5781,21 +5771,7 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>165</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAdmin.java"></a>
-<h3>org/apache/hadoop/hbase/client/TestAdmin.java</h3>
-<table class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method testCreateTableWithRegions length is 152 lines (max allowed is 150).</td>
-<td>174</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAsyncRegionAdminApi.java"></a>
+<td>165</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestAsyncRegionAdminApi.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -5843,19 +5819,13 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>101</td></tr>
+<td>119</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>248</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBlockEvictionFromClient.java"></a>
+<td>243</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBlockEvictionFromClient.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -5869,25 +5839,13 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>112</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>133</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>141</td></tr>
+<td>129</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>151</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBufferedMutatorParams.java"></a>
+<td>137</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestBufferedMutatorParams.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -5927,7 +5885,7 @@
 <td>design</td>
 <td>FinalClass</td>
 <td>Class FiltersRowsLessThan5 should be declared as final.</td>
-<td>352</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestImmutableScan.java"></a>
+<td>348</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestImmutableScan.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestImmutableScan.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -5941,21 +5899,7 @@
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method testUnmodifiableSetters length is 187 lines (max allowed is 150).</td>
-<td>113</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestIncrementsFromClientSide.java"></a>
-<h3>org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java</h3>
-<table class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>98</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestMultipleTimestamps.java"></a>
+<td>113</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestMultipleTimestamps.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestMultipleTimestamps.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -5966,161 +5910,125 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>201</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>316</td></tr>
+<td>286</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>346</td></tr>
+<td>314</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>371</td></tr>
+<td>337</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>396</td></tr>
+<td>360</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>431</td></tr>
+<td>393</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>432</td></tr>
+<td>394</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>444</td></tr>
+<td>406</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>445</td></tr>
+<td>407</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>448</td></tr>
+<td>410</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>461</td></tr>
+<td>423</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>465</td></tr>
+<td>427</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>479</td></tr>
+<td>441</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>480</td></tr>
+<td>442</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>497</td></tr>
+<td>459</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>498</td></tr>
+<td>460</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>509</td></tr>
+<td>471</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>510</td></tr>
+<td>472</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>517</td></tr>
+<td>479</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>518</td></tr>
+<td>480</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>525</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestPutWithDelete.java"></a>
-<h3>org/apache/hadoop/hbase/client/TestPutWithDelete.java</h3>
+<td>487</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicaWithCluster.java"></a>
+<h3>org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</h3>
 <table class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -6130,17 +6038,11 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>59</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicaWithCluster.java"></a>
-<h3>org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</h3>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>269</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicasClient.java"></a>
+<h3>org/apache/hadoop/hbase/client/TestReplicasClient.java</h3>
 <table class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -6153,8 +6055,8 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>271</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestReplicasClient.java"></a>
-<h3>org/apache/hadoop/hbase/client/TestReplicasClient.java</h3>
+<td>267</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestResult.java"></a>
+<h3>org/apache/hadoop/hbase/client/TestResult.java</h3>
 <table class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -6164,10 +6066,10 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>269</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestScannerTimeout.java"></a>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.hamcrest.Matchers.*.</td>
+<td>21</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestScannerTimeout.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestScannerTimeout.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -6181,19 +6083,19 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>64</td></tr>
+<td>59</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>83</td></tr>
+<td>78</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>91</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestTableDescriptorBuilder.java"></a>
+<td>86</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2FTestTableDescriptorBuilder.java"></a>
 <h3>org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -6221,85 +6123,73 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
+<td>76</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>88</td></tr>
+<td>84</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>105</td></tr>
+<td>101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>252</td></tr>
+<td>246</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>315</td></tr>
+<td>309</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>316</td></tr>
+<td>310</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>333</td></tr>
+<td>327</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>334</td></tr>
+<td>328</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>348</td></tr>
+<td>342</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>349</td></tr>
+<td>343</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>366</td></tr>
+<td>360</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>367</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2Fcoprocessor.2FAggregationClient.java"></a>
+<td>361</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Fclient.2Fcoprocessor.2FAggregationClient.java"></a>
 <h3>org/apache/hadoop/hbase/client/coprocessor/AggregationClient.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -7127,55 +7017,55 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
-<td>89</td></tr>
+<td>98</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>99</td></tr>
+<td>108</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>100</td></tr>
+<td>109</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>101</td></tr>
+<td>110</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>102</td></tr>
+<td>111</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>103</td></tr>
+<td>112</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>104</td></tr>
+<td>113</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>105</td></tr>
+<td>114</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>106</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Ffilter.2FFilterListWithOR.java"></a>
+<td>115</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Ffilter.2FFilterListWithOR.java"></a>
 <h3>org/apache/hadoop/hbase/filter/FilterListWithOR.java</h3>
 <table class="table table-striped">
 <tr class="a">
@@ -7405,7 +7295,7 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>180</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Ffilter.2FPageFilter.java"></a>
+<td>203</td></tr></table></section><section><a id="org.2Fapache.2Fhadoop.2Fhbase.2Ffilter.2FPageFilter.java"></a>
 <h3>org/apache/hadoop/hbase/filter/PageFilter.java</h3>
 <table class="table table-striped">
 <tr class="a">
diff --git a/code-of-conduct/index.html b/code-of-conduct/index.html
index 432de2958ed..9ecb689cc61 100644
--- a/code-of-conduct/index.html
+++ b/code-of-conduct/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><title>Code of Conduct - Apache HBase</title><meta name="description" content="Code of Conduct and Diversity Statement for the Apache HBase project community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><title>Code of Conduct - Apache HBase</title><meta name="description" content="Code of Conduct and Diversity Statement for the Apache HBase project community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -42,7 +42,7 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/landing-layout-By78yIYe.js";
 import * as route2 from "/assets/code-of-conduct-BvBGYarj.js";
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 757e3f20e3e..4f596d1718e 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-05-14
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-05-16
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/dependency-info.html b/dependency-info.html
index 791b85600a8..8fe6ef33828 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-05-14
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-05-16
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/dependency-management.html b/dependency-management.html
index a9de894f468..ea59edf6a90 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-05-14
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-05-16
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 3a0da1d8672..c7459d366cc 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -51650,12 +51650,26 @@ loadScripts(document, 'script');</script>
 <div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
  implementation.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterList.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterList.html" title="class in org.apache.hadoop.hbase.filter">FilterList</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html" title="class in org.apache.hadoop.hbase.filter">FilterListWithAND</a></dt>
+<dd>
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterListWithOR.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterListWithOR.html" title="class in org.apache.hadoop.hbase.filter">FilterListWithOR</a></dt>
+<dd>
+<div class="block">Minimal step: return the nearest hint.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/filter/FilterWrapper.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a></dt>
 <dd>
 <div class="block">Delegates to the wrapped filter's <a href="org/apache/hadoop/hbase/filter/Filter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)"><code>Filter.getHintForRejectedRow(Cell)</code></a> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/filter/SkipFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/SkipFilter.html" title="class in org.apache.hadoop.hbase.filter">SkipFilter</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/WhileMatchFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/WhileMatchFilter.html" title="class in org.apache.hadoop.hbase.filter">WhileMatchFilter</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/RegionScannerImpl.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow(Cell)</a> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">RegionScannerImpl</a></dt>
 <dd>
 <div class="block">Asks the current <a href="org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter"><code>FilterWrapper</code></a> for a seek hint to use
@@ -64275,6 +64289,10 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.html#getSkipBadLines()" class="member-name-link">getSkipBadLines()</a> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TsvImporterTextMapper</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnPrefixFilter</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/ColumnRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnRangeFilter</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></dt>
 <dd>
 <div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
@@ -64284,11 +64302,27 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterList.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterList.html" title="class in org.apache.hadoop.hbase.filter">FilterList</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html" title="class in org.apache.hadoop.hbase.filter">FilterListWithAND</a></dt>
+<dd>
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterListWithOR.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterListWithOR.html" title="class in org.apache.hadoop.hbase.filter">FilterListWithOR</a></dt>
+<dd>
+<div class="block">Minimal step: return the nearest skip hint.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/filter/FilterWrapper.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a></dt>
 <dd>
 <div class="block">Delegates to the wrapped filter's <a href="org/apache/hadoop/hbase/filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getSkipHint(Cell)</code></a> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">MultipleColumnPrefixFilter</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/SkipFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/SkipFilter.html" title="class in org.apache.hadoop.hbase.filter">SkipFilter</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/filter/WhileMatchFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint(Cell)</a> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/WhileMatchFilter.html" title="class in org.apache.hadoop.hbase.filter">WhileMatchFilter</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/master/normalizer/RegionNormalizerManager.html#getSkippedCount(org.apache.hadoop.hbase.master.normalizer.NormalizationPlan.PlanType)" class="member-name-link">getSkippedCount(NormalizationPlan.PlanType)</a> - Method in class org.apache.hadoop.hbase.master.normalizer.<a href="org/apache/hadoop/hbase/master/normalizer/RegionNormalizerManager.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerManager</a></dt>
 <dd>
 <div class="block">Retrieve a count of the number of times plans of type <code>type</code> were submitted but skipped.</div>
@@ -118169,6 +118203,10 @@ service.</div>
 <dd>
 <div class="block">Configured value of HConstants.REJECT_DECOMMISSIONED_HOSTS_KEY</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html#rejectedByFilterRowKey" class="member-name-link">rejectedByFilterRowKey</a> - Variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/FilterListWithAND.html" title="class in org.apache.hadoop.hbase.filter">FilterListWithAND</a></dt>
+<dd>
+<div class="block">Tracks which sub-filters returned <code>true</code> from <a href="org/apache/hadoop/hbase/filter/Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a>.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/RSRpcServices.html#rejectIfInStandByState(org.apache.hadoop.hbase.regionserver.HRegion)" class="member-name-link">rejectIfInStandByState(HRegion)</a> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/replication/regionserver/RejectReplicationRequestStateChecker.html" class="type-name-link" title="class in org.apache.hadoop.hbase.replication.regionserver">RejectReplicationRequestStateChecker</a> - Class in <a href="org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a></dt>
diff --git a/devapidocs/member-search-index.js b/devapidocs/member-search-index.js
index 2b7a23db423..66a5064acf6 100644
--- a/devapidocs/member-search-index.js
+++ b/devapidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBlockcache()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBlocksize()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBloomfilter()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getCompression()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getInMemory()"},{"p":"org.apache. [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBlockcache()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBlocksize()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getBloomfilter()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getCompression()"},{"p":"org.apache.hadoop.hbase.rest.model","c":"ColumnSchemaModel","l":"__getInMemory()"},{"p":"org.apache. [...]
\ No newline at end of file
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html b/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
index 18ef70b34ba..5c97001259d 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
@@ -1755,72 +1755,110 @@ service.</div>
  implementation.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last odd-row-color">
+<div class="block">Minimal step: return the nearest hint.</div>
+</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Delegates to the wrapped filter's <a href="../filter/Filter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)"><code>Filter.getHintForRejectedRow(Cell)</code></a> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code><a href="../filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code><a href="../filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </div>
-<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code><a href="../filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code><a href="../filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code><a href="../filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code><a href="../filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">PrefixFilter.</span><code><a href="../filter/PrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">PrefixFilter.</span><code><a href="../filter/PrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TimestampsFilter.</span><code><a href="../filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TimestampsFilter.</span><code><a href="../filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Pick the next cell that the scanner should seek to.</div>
+<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="../filter/Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached.</div>
 </div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
- <em>before</em> <a href="../filter/Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached.</div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+<div class="block">Minimal step: return the nearest skip hint.</div>
 </div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
 <div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
@@ -1828,36 +1866,45 @@ service.</div>
 <div class="block">Delegates to the wrapped filter's <a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getSkipHint(Cell)</code></a> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </div>
-<div class="col-first odd-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Give the filter a chance to transform the passed Cell.</div>
-</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">
-<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+<div class="block">Give the filter a chance to transform the passed Cell.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListBase.</span><code><a href="../filter/FilterListBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
-<div class="col-last even-row-color">
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListBase.</span><code><a href="../filter/FilterListBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">For FilterList, we can consider a filter list as a node in a tree.</div>
 </div>
-<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code><a href="../filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code><a href="../filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 <div class="caption"><span>Methods in <a href="../filter/package-summary.html">org.apache.hadoop.hbase.filter</a> with parameters of type <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span></div>
 <div class="summary-table three-column-summary">
@@ -2101,72 +2148,110 @@ service.</div>
  implementation.</div>
 </div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color">
+<div class="block">Minimal step: return the nearest hint.</div>
+</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Delegates to the wrapped filter's <a href="../filter/Filter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)"><code>Filter.getHintForRejectedRow(Cell)</code></a> so that the scan
  pipeline can seek directly past a rejected row rather than iterating cell-by-cell via
  <code>nextRow()</code>.</div>
 </div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code><a href="../filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPaginationFilter.</span><code><a href="../filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </div>
-<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code><a href="../filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.</span><code><a href="../filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code><a href="../filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MultiRowRangeFilter.</span><code><a href="../filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">PrefixFilter.</span><code><a href="../filter/PrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">PrefixFilter.</span><code><a href="../filter/PrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TimestampsFilter.</span><code><a href="../filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">ColumnPrefixFilter.</span><code><a href="../filter/ColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">ColumnRangeFilter.</span><code><a href="../filter/ColumnRangeFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TimestampsFilter.</span><code><a href="../filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Pick the next cell that the scanner should seek to.</div>
+<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="../filter/Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
- <em>before</em> <a href="../filter/Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached.</div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
 </div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithAND.</span><code><a href="../filter/FilterListWithAND.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+</div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+<div class="block">Minimal step: return the nearest skip hint.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
@@ -2174,52 +2259,61 @@ service.</div>
 <div class="block">Delegates to the wrapped filter's <a href="../filter/Filter.html#getSkipHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getSkipHint(Cell)</code></a> so that the scan pipeline
  can seek ahead when a cell is structurally skipped before <code>filterCell</code> is reached.</div>
 </div>
-<div class="col-first even-row-color"><code>(package private) boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#lessThan(org.apache.hadoop.hbase.Cell,byte%5B%5D)" class="member-name-link">lessThan</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
- byte[]&nbsp;nextRowKey)</code></div>
+<div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MultipleColumnPrefixFilter.</span><code><a href="../filter/MultipleColumnPrefixFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Give the filter a chance to transform the passed Cell.</div>
-</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>(package private) boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#lessThan(org.apache.hadoop.hbase.Cell,byte%5B%5D)" class="member-name-link">lessThan</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
+ byte[]&nbsp;nextRowKey)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>abstract <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">Filter.</span><code><a href="../filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">
-<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+<div class="block">Give the filter a chance to transform the passed Cell.</div>
 </div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterBase.</span><code><a href="../filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">By default no transformation takes place Give the filter a chance to transform the passed Cell.</div>
+</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FilterListBase.</span><code><a href="../filter/FilterListBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
-<div class="col-last even-row-color">
+<div class="col-second even-row-color"><span class="type-name-label">FilterList.</span><code><a href="../filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FilterListBase.</span><code><a href="../filter/FilterListBase.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">For FilterList, we can consider a filter list as a node in a tree.</div>
 </div>
-<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code><a href="../filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterWrapper.</span><code><a href="../filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">KeyOnlyFilter.</span><code><a href="../filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">SkipFilter.</span><code><a href="../filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#updatePrevCellList(int,org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.filter.Filter.ReturnCode)" class="member-name-link">updatePrevCellList</a><wbr>(int&nbsp;index,
+<div class="col-first odd-row-color"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WhileMatchFilter.</span><code><a href="../filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)" class="member-name-link">transformCell</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>private void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FilterListWithOR.</span><code><a href="../filter/FilterListWithOR.html#updatePrevCellList(int,org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.filter.Filter.ReturnCode)" class="member-name-link">updatePrevCellList</a><wbr>(int&nbsp;index,
  <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
  <a href="../filter/Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;currentRC)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>(package private) boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#updateTracker(org.apache.hadoop.hbase.Cell)" class="member-name-link">updateTracker</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>(package private) void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#updateWith(org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.util.Pair)" class="member-name-link">updateWith</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
- <a href="../util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<wbr>byte[]&gt;&nbsp;fuzzyData)</code></div>
+<div class="col-first odd-row-color"><code>(package private) boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#updateTracker(org.apache.hadoop.hbase.Cell)" class="member-name-link">updateTracker</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>(package private) void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">FuzzyRowFilter.RowTracker.</span><code><a href="../filter/FuzzyRowFilter.RowTracker.html#updateWith(org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.util.Pair)" class="member-name-link">updateWith</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
+ <a href="../util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<wbr>byte[]&gt;&nbsp;fuzzyData)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <div class="caption"><span>Method parameters in <a href="../filter/package-summary.html">org.apache.hadoop.hbase.filter</a> with type arguments of type <a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span></div>
 <div class="summary-table three-column-summary">
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
index 2472c022ead..de4a27f0cd3 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
@@ -185,22 +185,27 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getPrefix()" class="member-name-link">getPrefix</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="ColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnPrefixFilter</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="ColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnPrefixFilter</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
 <div class="block">Parses a serialized representation of the <a href="ColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>ColumnPrefixFilter</code></a></div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Returns The filter serialized using pb</div>
 </div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 </div>
 </div>
@@ -208,7 +213,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEss [...]
+<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">isFamilyEssential</a>, <a href="FilterBase.html#reset()">reset</a [...]
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#setReversed(boolean)">setReversed</a></code></div>
@@ -404,9 +409,68 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 </section>
 </li>
 <li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-151">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-151">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-159">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -418,7 +482,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-156">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-164">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -428,7 +492,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-161">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#line-169">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
index afe1bbe9b10..9483392be71 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
@@ -210,32 +210,37 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isMaxColumnInclusive()" class="member-name-link">isMaxColumnInclusive</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
-<div class="block">Returns if max column range is inclusive.</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
 </div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isMinColumnInclusive()" class="member-name-link">isMinColumnInclusive</a>()</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isMaxColumnInclusive()" class="member-name-link">isMaxColumnInclusive</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Returns if max column range is inclusive.</div>
+</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isMinColumnInclusive()" class="member-name-link">isMinColumnInclusive</a>()</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Returns if min column range is inclusive.</div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="ColumnRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnRangeFilter</a></code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
+<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="ColumnRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">ColumnRangeFilter</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
 <div class="block">Parse a serialized representation of <a href="ColumnRangeFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>ColumnRangeFilter</code></a></div>
 </div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Returns The filter serialized using pb</div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 </div>
 </div>
@@ -243,7 +248,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEss [...]
+<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">isFamilyEssential</a>, <a href="FilterBase.html#reset()">reset</a [...]
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#setReversed(boolean)">setReversed</a></code></div>
@@ -491,9 +496,68 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 </section>
 </li>
 <li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-203">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-203">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-211">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -505,7 +569,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-210">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-218">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -515,7 +579,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-215">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#line-223">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/Filter.html b/devapidocs/org/apache/hadoop/hbase/filter/Filter.html
index 5892b8157dc..56c7f9cf57c 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/Filter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/Filter.html
@@ -482,7 +482,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
 <h3>getHintForRejectedRow</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-230">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-234">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block">Provides a seek hint to bypass row-by-row scanning after <a href="#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>filterRowKey(Cell)</code></a> rejects a
  row. When <code>filterRowKey</code> returns <code>true</code> the scan pipeline would normally iterate
@@ -507,9 +507,13 @@ loadScripts(document, 'script');</script>
  must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
  validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
  the scan direction.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
  </ul></div>
 <dl class="notes">
 <dt>Parameters:</dt>
@@ -532,7 +536,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
 <h3>getSkipHint</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-270">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-276">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
                  throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block">Provides a seek hint for cells that are structurally skipped by the scan pipeline
  <em>before</em> <a href="#filterCell(org.apache.hadoop.hbase.Cell)"><code>filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
@@ -557,9 +561,11 @@ loadScripts(document, 'script');</script>
  <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
  in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
  direction are silently ignored.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
  </ul></div>
 <dl class="notes">
 <dt>Parameters:</dt>
@@ -583,7 +589,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="isFamilyEssential(byte[])">
 <h3>isFamilyEssential</h3>
-<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-282">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
+<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-288">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
                                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block">Check that given column family is essential for filter to check row. Most filters always return
  true here. But some could have more sophisticated logic which could significantly reduce
@@ -599,7 +605,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="toByteArray()">
 <h3>toByteArray</h3>
-<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-290">toByteArray</a></span>()
+<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-296">toByteArray</a></span>()
                             throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block">TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link"><code>IOException</code></a>.</div>
@@ -614,7 +620,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="parseFrom(byte[])">
 <h3>parseFrom</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-300">parseFrom</a></span><wbr><span class="parameters">(byte[]&nbsp;pbBytes)</span>
+<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-306">parseFrom</a></span><wbr><span class="parameters">(byte[]&nbsp;pbBytes)</span>
                         throws <span class="exceptions"><a href="../exceptions/DeserializationException.html" title="class in org.apache.hadoop.hbase.exceptions">DeserializationException</a></span></div>
 <div class="block">Concrete implementers can signal a failure condition in their code by throwing an
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link"><code>IOException</code></a>.</div>
@@ -637,7 +643,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">
 <h3>areSerializedFieldsEqual</h3>
-<div class="member-signature"><span class="modifiers">abstract</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-311">areSerializedFieldsEqual</a></span><wbr><span class="parameters">(<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;other)</span></div>
+<div class="member-signature"><span class="modifiers">abstract</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-317">areSerializedFieldsEqual</a></span><wbr><span class="parameters">(<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;other)</span></div>
 <div class="block">Concrete implementers can signal a failure condition in their code by throwing an
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link"><code>IOException</code></a>.</div>
 <dl class="notes">
@@ -650,7 +656,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setReversed(boolean)">
 <h3>setReversed</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-317">setReversed</a></span><wbr><span class="parameters">(boolean&nbsp;reversed)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-323">setReversed</a></span><wbr><span class="parameters">(boolean&nbsp;reversed)</span></div>
 <div class="block">alter the reversed scan flag</div>
 <dl class="notes">
 <dt>Parameters:</dt>
@@ -661,7 +667,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="isReversed()">
 <h3>isReversed</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-321">isReversed</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/Filter.html#line-327">isReversed</a></span>()</div>
 </section>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/FilterBase.html b/devapidocs/org/apache/hadoop/hbase/filter/FilterBase.html
index c70831cfede..b093a16f069 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/FilterBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/FilterBase.html
@@ -449,9 +449,13 @@ loadScripts(document, 'script');</script>
  must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
  validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
  the scan direction.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
  </ul></div>
 <dl class="notes">
 <dt>Overrides:</dt>
@@ -504,9 +508,11 @@ loadScripts(document, 'script');</script>
  <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
  in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
  direction are silently ignored.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
  </ul></div>
 <dl class="notes">
 <dt>Overrides:</dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/FilterList.html b/devapidocs/org/apache/hadoop/hbase/filter/FilterList.html
index 1a4214eda8f..c22ce47030c 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/FilterList.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/FilterList.html
@@ -231,16 +231,27 @@ loadScripts(document, 'script');</script>
 <div class="block">Get the filters.</div>
 </div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation.</div>
+</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="FilterList.Operator.html" title="enum class in org.apache.hadoop.hbase.filter">FilterList.Operator</a></code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getOperator()" class="member-name-link">getOperator</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="FilterList.Operator.html" title="enum class in org.apache.hadoop.hbase.filter">FilterList.Operator</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getOperator()" class="member-name-link">getOperator</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Get the operator.</div>
 </div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hasFilterRow()" class="member-name-link">hasFilterRow</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
@@ -297,7 +308,7 @@ loadScripts(document, 'script');</script>
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code></div>
+<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a></code></div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-java.lang.Object">Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></h3>
 <code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#clone()" title="class or interface in java.lang" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#finalize()" title="class or interface in java.lang" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#getClass()" title="class or interface in [...]
@@ -694,9 +705,128 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
+<h3>getHintForRejectedRow</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-245">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation. Subclasses whose row-key logic (e.g. a range pointer advanced inside
+ <a href="FilterBase.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>FilterBase.filterRowKey(Cell)</code></a>) makes a better seek target available should override this.
+ Provides a seek hint to bypass row-by-row scanning after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> rejects a
+ row. When <code>filterRowKey</code> returns <code>true</code> the scan pipeline would normally iterate
+ through every remaining cell in the rejected row one-by-one (via <code>nextRow()</code>) before
+ moving on. If the filter can determine a better forward position — for example, the next range
+ boundary in a <code>MultiRowRangeFilter</code> — it should return that target cell here, allowing
+ the scanner to seek directly past the unwanted rows.
+ <p>
+ Contract:
+ <ul>
+ <li>Only called after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> has returned <code>true</code> for the same
+ <code>firstRowCell</code>.</li>
+ <li>Implementations may use state that was set during <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> (e.g. an
+ updated range pointer), but <strong>must not</strong> invoke <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> logic —
+ the caller guarantees that <code>filterCell</code> has not been called for this row.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing <code>nextRow()</code>
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans (<a href="../client/Scan.html#isReversed()"><code>Scan.isReversed()</code></a>), the hint
+ must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
+ validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
+ the scan direction.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>firstRowCell</code> - the first cell encountered in the rejected row; contains the row key that
+                     was passed to <code>filterRowKey</code></dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than a sequential skip</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-250">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="isFamilyEssential(byte[])">
 <h3>isFamilyEssential</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-245">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-255">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">FilterBase</a></code></span></div>
 <div class="block">By default, we require all scan's column families to be present. Our subclasses may be more
@@ -716,7 +846,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setReversed(boolean)">
 <h3>setReversed</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-250">setReversed</a></span><wbr><span class="parameters">(boolean&nbsp;reversed)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-260">setReversed</a></span><wbr><span class="parameters">(boolean&nbsp;reversed)</span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="Filter.html#setReversed(boolean)">Filter</a></code></span></div>
 <div class="block">alter the reversed scan flag</div>
 <dl class="notes">
@@ -730,7 +860,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="isReversed()">
 <h3>isReversed</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-256">isReversed</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-266">isReversed</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="Filter.html#isReversed()">isReversed</a></code>&nbsp;in class&nbsp;<code><a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></code></dd>
@@ -740,7 +870,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-262">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-272">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -752,7 +882,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-267">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-277">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -762,7 +892,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-272">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterList.html#line-282">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithAND.html b/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithAND.html
index 2cec0917a99..382e79f66ab 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithAND.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithAND.html
@@ -84,7 +84,7 @@ loadScripts(document, 'script');</script>
 <section class="class-description" id="class-description">
 <hr>
 <div class="type-signature"><span class="annotations">@Private
-</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-32">FilterListWithAND</a></span>
+</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-33">FilterListWithAND</a></span>
 <span class="extends-implements">extends <a href="FilterListBase.html" title="class in org.apache.hadoop.hbase.filter">FilterListBase</a></span></div>
 <div class="block">FilterListWithAND represents an ordered list of filters which will be evaluated with an AND
  operator.</div>
@@ -112,9 +112,14 @@ loadScripts(document, 'script');</script>
 <div class="col-first even-row-color"><code>private boolean[]</code></div>
 <div class="col-second even-row-color"><code><a href="#hintingFilters" class="member-name-link">hintingFilters</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;</code></div>
-<div class="col-second odd-row-color"><code><a href="#seekHintFilters" class="member-name-link">seekHintFilters</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>private boolean[]</code></div>
+<div class="col-second odd-row-color"><code><a href="#rejectedByFilterRowKey" class="member-name-link">rejectedByFilterRowKey</a></code></div>
+<div class="col-last odd-row-color">
+<div class="block">Tracks which sub-filters returned <code>true</code> from <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a>.</div>
+</div>
+<div class="col-first even-row-color"><code>private <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;</code></div>
+<div class="col-second even-row-color"><code><a href="#seekHintFilters" class="member-name-link">seekHintFilters</a></code></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <div class="inherited-list">
 <h3 id="fields-inherited-from-class-org.apache.hadoop.hbase.filter.FilterListBase">Fields inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterListBase.html" title="class in org.apache.hadoop.hbase.filter">FilterListBase</a></h3>
@@ -186,11 +191,21 @@ loadScripts(document, 'script');</script>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#formatLogFilters(java.util.List)" class="member-name-link">formatLogFilters</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;&nbsp;logFilters)</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row.</div>
+</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
@@ -217,7 +232,7 @@ loadScripts(document, 'script');</script>
 <code><a href="FilterListBase.html#checkAndGetReversed(java.util.List,boolean)">checkAndGetReversed</a>, <a href="FilterListBase.html#compareCell(org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.Cell)">compareCell</a>, <a href="FilterListBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterListBase.html#getFilters()">getFilters</a>, <a href="FilterListBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterListBase.html#isEmpty()">isEmpty</a>, <a href="Filt [...]
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">areSerializedFieldsEqual</a>, <a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a>, <a href="FilterBase.html#toByteArray()">toByteArray</a></code></div>
+<code><a href="FilterBase.html#areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">areSerializedFieldsEqual</a>, <a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#toByteArray()">toByteArray</a></code></div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#parseFrom(byte%5B%5D)">parseFrom</a></code></div>
@@ -238,13 +253,22 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="seekHintFilters">
 <h3>seekHintFilters</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-35">seekHin [...]
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-36">seekHin [...]
 </section>
 </li>
 <li>
 <section class="detail" id="hintingFilters">
 <h3>hintingFilters</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-36">hintingFilters</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-37">hintingFilters</a></span></div>
+</section>
+</li>
+<li>
+<section class="detail" id="rejectedByFilterRowKey">
+<h3>rejectedByFilterRowKey</h3>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-43">rejectedByFilterRowKey</a></span></div>
+<div class="block">Tracks which sub-filters returned <code>true</code> from <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a>. Set in
+ <code>filterRowKey()</code>, consumed by <code>getHintForRejectedRow()</code>, cleared only by
+ <code>reset()</code> — callers must invoke <code>reset()</code> between rows to avoid stale state.</div>
 </section>
 </li>
 </ul>
@@ -258,7 +282,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="&lt;init&gt;(java.util.List)">
 <h3>FilterListWithAND</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-38">FilterListWithAND</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Fi [...]
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-45">FilterListWithAND</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Fi [...]
 </section>
 </li>
 </ul>
@@ -272,7 +296,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="addFilterLists(java.util.List)">
 <h3>addFilterLists</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-47">addFilterLists</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="cla [...]
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-55">addFilterLists</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="cla [...]
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="FilterListBase.html#addFilterLists(java.util.List)">addFilterLists</a></code>&nbsp;in class&nbsp;<code><a href="FilterListBase.html" title="class in org.apache.hadoop.hbase.filter">FilterListBase</a></code></dd>
@@ -282,7 +306,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="formatLogFilters(java.util.List)">
 <h3>formatLogFilters</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-57">formatLogFilters</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.co [...]
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-66">formatLogFilters</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.co [...]
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="FilterListBase.html#formatLogFilters(java.util.List)">formatLogFilters</a></code>&nbsp;in class&nbsp;<code><a href="FilterListBase.html" title="class in org.apache.hadoop.hbase.filter">FilterListBase</a></code></dd>
@@ -292,7 +316,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="cacheHintingFilters()">
 <h3>cacheHintingFilters</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-67">cacheHintingFilters</a></span>()</div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-76">cacheHintingFilters</a></span>()</div>
 <div class="block">As checks for this are in the hot path, we want them as fast as possible, so we are caching the
  status in an array.</div>
 </section>
@@ -300,7 +324,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="mergeReturnCode(org.apache.hadoop.hbase.filter.Filter.ReturnCode,org.apache.hadoop.hbase.filter.Filter.ReturnCode)">
 <h3>mergeReturnCode</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-114">mergeReturnCode</a></span><wbr><span class="parameters">(<a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filte [...]
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-123">mergeReturnCode</a></span><wbr><span class="parameters">(<a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filte [...]
  <a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;localRC)</span></div>
 <div class="block">FilterList with MUST_PASS_ALL choose the maximal forward step among sub-filters in filter list.
  Let's call it: The Maximal Step Rule. So if filter-A in filter list return INCLUDE and filter-B
@@ -345,13 +369,13 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="isIncludeRelatedReturnCode(org.apache.hadoop.hbase.filter.Filter.ReturnCode)">
 <h3>isIncludeRelatedReturnCode</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-177">isIncludeRelatedReturnCode</a></span><wbr><span class="parameters">(<a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;rc)</span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-186">isIncludeRelatedReturnCode</a></span><wbr><span class="parameters">(<a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;rc)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="filterCell(org.apache.hadoop.hbase.Cell)">
 <h3>filterCell</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-182">filterCell</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="Filter.ReturnCode.html" title="enum class in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-191">filterCell</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</span>
                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)">Filter</a></code></span></div>
 <div class="block">A way to filter based on the column family, column qualifier and/or the column value. Return
@@ -383,7 +407,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="reset()">
 <h3>reset</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-234">reset</a></span>()
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-243">reset</a></span>()
            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#reset()">FilterBase</a></code></span></div>
 <div class="block">Filters that are purely stateless and do nothing in their reset() methods can inherit this
@@ -400,7 +424,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="filterRowKey(org.apache.hadoop.hbase.Cell)">
 <h3>filterRowKey</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-242">filterRowKey</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-252">filterRowKey</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)">Filter</a></code></span></div>
 <div class="block">Filters a row based on the row key. If this returns true, the entire row will be excluded. If
@@ -423,7 +447,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="filterAllRemaining()">
 <h3>filterAllRemaining</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-272">filterAllRemaining</a></span>()
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-284">filterAllRemaining</a></span>()
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#filterAllRemaining()">FilterBase</a></code></span></div>
 <div class="block">Filters that never filter all remaining can inherit this implementation that never stops the
@@ -442,7 +466,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="filterRow()">
 <h3>filterRow</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-285">filterRow</a></span>()
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-297">filterRow</a></span>()
                   throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#filterRow()">FilterBase</a></code></span></div>
 <div class="block">Filters that never filter by rows based on previously gathered state from
@@ -464,7 +488,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getNextCellHint(org.apache.hadoop.hbase.Cell)">
 <h3>getNextCellHint</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-299">getNextCellHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-311">getNextCellHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</span>
                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
@@ -486,9 +510,65 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
+<h3>getHintForRejectedRow</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-339">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block">Maximal step: return the farthest hint among sub-filters that actually rejected the row. Only
+ sub-filters whose <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> returned <code>true</code> are consulted,
+ honouring the per-filter contract. Null hints are ignored; if no rejecting sub-filter provides
+ a hint, return null.</div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>firstRowCell</code> - the first cell encountered in the rejected row; contains the row key that
+                     was passed to <code>filterRowKey</code></dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than a sequential skip</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-365">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block">Maximal step: return the farthest skip hint among sub-filters.</div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-321">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-387">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -498,7 +578,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-333">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html#line-399">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithOR.html b/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithOR.html
index 384e30a7b15..65f630ac454 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithOR.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/FilterListWithOR.html
@@ -192,11 +192,21 @@ loadScripts(document, 'script');</script>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#formatLogFilters(java.util.List)" class="member-name-link">formatLogFilters</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&gt;&nbsp;logFilters)</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Minimal step: return the nearest hint.</div>
+</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getNextCellHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getNextCellHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit this implementation
  that, by default, returns a null Cell.</div>
 </div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Minimal step: return the nearest skip hint.</div>
+</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
@@ -229,7 +239,7 @@ loadScripts(document, 'script');</script>
 <code><a href="FilterListBase.html#checkAndGetReversed(java.util.List,boolean)">checkAndGetReversed</a>, <a href="FilterListBase.html#compareCell(org.apache.hadoop.hbase.Cell,org.apache.hadoop.hbase.Cell)">compareCell</a>, <a href="FilterListBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterListBase.html#getFilters()">getFilters</a>, <a href="FilterListBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterListBase.html#isEmpty()">isEmpty</a>, <a href="Filt [...]
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">areSerializedFieldsEqual</a>, <a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a>, <a href="FilterBase.html#toByteArray()">toByteArray</a></code></div>
+<code><a href="FilterBase.html#areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">areSerializedFieldsEqual</a>, <a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#toByteArray()">toByteArray</a></code></div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#parseFrom(byte%5B%5D)">parseFrom</a></code></div>
@@ -543,9 +553,64 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
+<h3>getHintForRejectedRow</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-399">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block">Minimal step: return the nearest hint. If any non-terminated sub-filter returns null, the
+ composite cannot safely skip, so return null.</div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>firstRowCell</code> - the first cell encountered in the rejected row; contains the row key that
+                     was passed to <code>filterRowKey</code></dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than a sequential skip</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-425">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block">Minimal step: return the nearest skip hint. Null from any sub-filter collapses the entire
+ result to null.</div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-395">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-447">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -555,7 +620,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-408">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html#line-460">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/FilterWrapper.html b/devapidocs/org/apache/hadoop/hbase/filter/FilterWrapper.html
index b82a1353c2a..0cb8dec2aae 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/FilterWrapper.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/FilterWrapper.html
@@ -431,9 +431,13 @@ loadScripts(document, 'script');</script>
  must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
  validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
  the scan direction.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
  </ul></div>
 <dl class="notes">
 <dt>Overrides:</dt>
@@ -485,9 +489,11 @@ loadScripts(document, 'script');</script>
  <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
  in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
  direction are silently ignored.</li>
- <li><strong>Composite filter limitation:</strong> <code>FilterList</code>, <code>SkipFilter</code>, and
- <code>WhileMatchFilter</code> do not currently delegate this method to wrapped sub-filters. Hints
- from filters used inside these wrappers will be silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
  </ul></div>
 <dl class="notes">
 <dt>Overrides:</dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
index 198f3f826cf..73c6adf699b 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
@@ -193,33 +193,38 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[][]</code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getPrefix()" class="member-name-link">getPrefix</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="MultipleColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">MultipleColumnPrefixFilter</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hashCode()" class="member-name-link">hashCode</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="MultipleColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter">MultipleColumnPrefixFilter</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parseFrom(byte%5B%5D)" class="member-name-link">parseFrom</a><wbr>(byte[]&nbsp;pbBytes)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
 <div class="block">Parse a serialized representation of <a href="MultipleColumnPrefixFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>MultipleColumnPrefixFilter</code></a></div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>byte[]</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toByteArray()" class="member-name-link">toByteArray</a>()</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Returns The filter serialized using pb</div>
 </div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
-<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString()" class="member-name-link">toString</a>()</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 </div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString(int)" class="member-name-link">toString</a><wbr>(int&nbsp;maxPrefixes)</code></div>
-<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#toString(int)" class="member-name-link">toString</a><wbr>(int&nbsp;maxPrefixes)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 </div>
 </div>
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEss [...]
+<code><a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRow()">filterRow</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">isFamilyEssential</a>, <a href="FilterBase.html#reset()">reset</a [...]
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#setReversed(boolean)">setReversed</a></code></div>
@@ -433,15 +438,74 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 </section>
 </li>
 <li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-176">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="createTreeSet()">
 <h3>createTreeSet</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeSet.html" title="class or interface in java.util" class="external-link">TreeSet</a>&lt;byte[]&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-176">createTreeSet</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeSet.html" title="class or interface in java.util" class="external-link">TreeSet</a>&lt;byte[]&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-199">createTreeSet</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-189">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-212">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -453,13 +517,13 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="toString(int)">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-194">toString</a></span><wbr><span class="parameters">(int&nbsp;maxPrefixes)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-217">toString</a></span><wbr><span class="parameters">(int&nbsp;maxPrefixes)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-213">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-236">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -469,7 +533,7 @@ implements <a href="HintingFilter.html" title="interface in org.apache.hadoop.hb
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-218">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#line-241">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/SkipFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/SkipFilter.html
index c26aeefc688..c0a5a1ddd5a 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/SkipFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/SkipFilter.html
@@ -187,6 +187,17 @@ loadScripts(document, 'script');</script>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getFilter()" class="member-name-link">getFilter</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation.</div>
+</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hasFilterRow()" class="member-name-link">hasFilterRow</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
@@ -232,7 +243,7 @@ loadScripts(document, 'script');</script>
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a>, <a href="FilterBase.html#getSkipHint [...]
+<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></code></div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#setReversed(boolean)">setReversed</a></code></div>
@@ -490,9 +501,128 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
+<h3>getHintForRejectedRow</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-144">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation. Subclasses whose row-key logic (e.g. a range pointer advanced inside
+ <a href="FilterBase.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>FilterBase.filterRowKey(Cell)</code></a>) makes a better seek target available should override this.
+ Provides a seek hint to bypass row-by-row scanning after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> rejects a
+ row. When <code>filterRowKey</code> returns <code>true</code> the scan pipeline would normally iterate
+ through every remaining cell in the rejected row one-by-one (via <code>nextRow()</code>) before
+ moving on. If the filter can determine a better forward position — for example, the next range
+ boundary in a <code>MultiRowRangeFilter</code> — it should return that target cell here, allowing
+ the scanner to seek directly past the unwanted rows.
+ <p>
+ Contract:
+ <ul>
+ <li>Only called after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> has returned <code>true</code> for the same
+ <code>firstRowCell</code>.</li>
+ <li>Implementations may use state that was set during <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> (e.g. an
+ updated range pointer), but <strong>must not</strong> invoke <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> logic —
+ the caller guarantees that <code>filterCell</code> has not been called for this row.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing <code>nextRow()</code>
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans (<a href="../client/Scan.html#isReversed()"><code>Scan.isReversed()</code></a>), the hint
+ must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
+ validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
+ the scan direction.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>firstRowCell</code> - the first cell encountered in the rejected row; contains the row key that
+                     was passed to <code>filterRowKey</code></dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than a sequential skip</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-149">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="isFamilyEssential(byte[])">
 <h3>isFamilyEssential</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-144">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-154">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">FilterBase</a></code></span></div>
 <div class="block">By default, we require all scan's column families to be present. Our subclasses may be more
@@ -512,7 +642,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-149">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-159">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -524,7 +654,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-154">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-164">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -534,7 +664,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-159">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/SkipFilter.html#line-169">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/WhileMatchFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
index b05ddd1674b..5fa210ecf35 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
@@ -183,6 +183,17 @@ loadScripts(document, 'script');</script>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getFilter()" class="member-name-link">getFilter</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)" class="member-name-link">getHintForRejectedRow</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</code></div>
+<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation.</div>
+</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSkipHint(org.apache.hadoop.hbase.Cell)" class="member-name-link">getSkipHint</a><wbr>(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.</div>
+</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#hasFilterRow()" class="member-name-link">hasFilterRow</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
@@ -228,7 +239,7 @@ loadScripts(document, 'script');</script>
 </div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.FilterBase">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a>, <a href="FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a>, <a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code></div>
+<code><a href="FilterBase.html#createFilterFromArguments(java.util.ArrayList)">createFilterFromArguments</a>, <a href="FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></code></div>
 <div class="inherited-list">
 <h3 id="methods-inherited-from-class-org.apache.hadoop.hbase.filter.Filter">Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a></h3>
 <code><a href="Filter.html#isReversed()">isReversed</a>, <a href="Filter.html#setReversed(boolean)">setReversed</a></code></div>
@@ -508,9 +519,128 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">
+<h3>getHintForRejectedRow</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-142">getHintForRejectedRow</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</span>
+                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a seek hint after row-key rejection can inherit this no-op
+ implementation. Subclasses whose row-key logic (e.g. a range pointer advanced inside
+ <a href="FilterBase.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>FilterBase.filterRowKey(Cell)</code></a>) makes a better seek target available should override this.
+ Provides a seek hint to bypass row-by-row scanning after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> rejects a
+ row. When <code>filterRowKey</code> returns <code>true</code> the scan pipeline would normally iterate
+ through every remaining cell in the rejected row one-by-one (via <code>nextRow()</code>) before
+ moving on. If the filter can determine a better forward position — for example, the next range
+ boundary in a <code>MultiRowRangeFilter</code> — it should return that target cell here, allowing
+ the scanner to seek directly past the unwanted rows.
+ <p>
+ Contract:
+ <ul>
+ <li>Only called after <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> has returned <code>true</code> for the same
+ <code>firstRowCell</code>.</li>
+ <li>Implementations may use state that was set during <a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a> (e.g. an
+ updated range pointer), but <strong>must not</strong> invoke <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> logic —
+ the caller guarantees that <code>filterCell</code> has not been called for this row.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing <code>nextRow()</code>
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans (<a href="../client/Scan.html#isReversed()"><code>Scan.isReversed()</code></a>), the hint
+ must point to a <em>smaller</em> row key (earlier in reverse-scan direction). The scanner
+ validates hint direction and falls back to <code>nextRow()</code> if the hint does not advance in
+ the scan direction.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results. For AND (<code>MUST_PASS_ALL</code>), only
+ sub-filters whose <code>filterRowKey</code> individually returned <code>true</code> are consulted, and
+ the farthest (maximal-step) hint among them is returned. For OR (<code>MUST_PASS_ONE</code>), the
+ nearest hint is returned only when every non-terminated sub-filter provides one — any null
+ collapses the OR result to null.</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getHintForRejectedRow(org.apache.hadoop.hbase.Cell)">getHintForRejectedRow</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>firstRowCell</code> - the first cell encountered in the rejected row; contains the row key that
+                     was passed to <code>filterRowKey</code></dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than a sequential skip</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)"><code>Filter.filterRowKey(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getSkipHint(org.apache.hadoop.hbase.Cell)">
+<h3>getSkipHint</h3>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-147">getSkipHint</a></span><wbr><span class="parameters">(<a href="../Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;skippedCell)</span>
+                 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
+<div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">FilterBase</a></code></span></div>
+<div class="block">Filters that cannot provide a structural-skip seek hint can inherit this no-op implementation.
+ Subclasses with purely configuration-driven, stateless hint computation (e.g. a fixed column
+ range or fuzzy-row pattern) may override this to avoid cell-by-cell advancement when the
+ time-range, column, or version gate fires. Provides a seek hint for cells that are structurally skipped by the scan pipeline
+ <em>before</em> <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a> is ever reached. The pipeline short-circuits on
+ several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —
+ and in each case the filter is bypassed entirely. When an implementation can compute a
+ meaningful forward position purely from the cell's coordinates (without needing the
+ <code>filterCell</code> call sequence), it should return that position here so the scanner can seek
+ ahead instead of advancing one cell at a time.
+ <p>
+ Contract:
+ <ul>
+ <li>May be called for cells that have <strong>never</strong> been passed to
+ <a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a>.</li>
+ <li>Implementations <strong>must not</strong> modify any filter state; this method is treated
+ as logically stateless. Only filters whose hint computation is based solely on immutable
+ configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.</li>
+ <li>The returned <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a>, if non-null, must be an
+ <a href="../ExtendedCell.html" title="interface in org.apache.hadoop.hbase"><code>ExtendedCell</code></a> because filters are evaluated on the server
+ side.</li>
+ <li>Returning <code>null</code> (the default) falls through to the existing structural skip/seek
+ behaviour, preserving full backward compatibility.</li>
+ <li>For reversed scans, the returned cell must have a <em>smaller</em> row key (i.e., earlier
+ in reverse-scan direction) than the <code>skippedCell</code>. Hints that do not advance in the scan
+ direction are silently ignored.</li>
+ <li><strong>Composite filter support:</strong> <code>FilterList</code> (both <code>MUST_PASS_ALL</code>
+ and <code>MUST_PASS_ONE</code>), <code>SkipFilter</code>, and <code>WhileMatchFilter</code> delegate this
+ method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest
+ hint is returned only when every non-terminated sub-filter provides one — any null collapses
+ the OR result to null).</li>
+ </ul></div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code><a href="FilterBase.html#getSkipHint(org.apache.hadoop.hbase.Cell)">getSkipHint</a></code>&nbsp;in class&nbsp;<code><a href="FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt>Parameters:</dt>
+<dd><code>skippedCell</code> - the cell that was rejected by the time-range, column, or version gate before
+                    <code>filterCell</code> could be consulted</dd>
+<dt>Returns:</dt>
+<dd>a <a href="../Cell.html" title="interface in org.apache.hadoop.hbase"><code>Cell</code></a> representing the earliest position the scanner should seek to, or
+         <code>null</code> if this filter cannot provide a better position than the structural hint</dd>
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></code> - in case an I/O or filter-specific failure needs to be signaled</dd>
+<dt>See Also:</dt>
+<dd>
+<ul class="see-list">
+<li><a href="Filter.html#filterCell(org.apache.hadoop.hbase.Cell)"><code>Filter.filterCell(Cell)</code></a></li>
+<li><a href="Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)"><code>Filter.getNextCellHint(Cell)</code></a></li>
+</ul>
+</dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="isFamilyEssential(byte[])">
 <h3>isFamilyEssential</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-142">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-152">isFamilyEssential</a></span><wbr><span class="parameters">(byte[]&nbsp;name)</span>
                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#isFamilyEssential(byte%5B%5D)">FilterBase</a></code></span></div>
 <div class="block">By default, we require all scan's column families to be present. Our subclasses may be more
@@ -530,7 +660,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="toString()">
 <h3>toString</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-147">toString</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-157">toString</a></span>()</div>
 <div class="block"><span class="descfrm-type-label">Description copied from class:&nbsp;<code><a href="FilterBase.html#toString()">FilterBase</a></code></span></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl class="notes">
@@ -542,7 +672,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="equals(java.lang.Object)">
 <h3>equals</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-152">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-162">equals</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>&nbsp;obj)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
@@ -552,7 +682,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="hashCode()">
 <h3>hashCode</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-157">hashCode</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#line-167">hashCode</a></span>()</div>
 <dl class="notes">
 <dt>Overrides:</dt>
 <dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></code></dd>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
index e23e4d9d48e..09d92770cbc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html
@@ -162,20 +162,28 @@
 <span class="source-line-no">149</span><span id="line-149">  }</span>
 <span class="source-line-no">150</span><span id="line-150"></span>
 <span class="source-line-no">151</span><span id="line-151">  @Override</span>
-<span class="source-line-no">152</span><span id="line-152">  public String toString() {</span>
-<span class="source-line-no">153</span><span id="line-153">    return this.getClass().getSimpleName() + " " + Bytes.toStringBinary(this.prefix);</span>
-<span class="source-line-no">154</span><span id="line-154">  }</span>
-<span class="source-line-no">155</span><span id="line-155"></span>
-<span class="source-line-no">156</span><span id="line-156">  @Override</span>
-<span class="source-line-no">157</span><span id="line-157">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">158</span><span id="line-158">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">159</span><span id="line-159">  }</span>
-<span class="source-line-no">160</span><span id="line-160"></span>
-<span class="source-line-no">161</span><span id="line-161">  @Override</span>
-<span class="source-line-no">162</span><span id="line-162">  public int hashCode() {</span>
-<span class="source-line-no">163</span><span id="line-163">    return Bytes.hashCode(this.getPrefix());</span>
-<span class="source-line-no">164</span><span id="line-164">  }</span>
-<span class="source-line-no">165</span><span id="line-165">}</span>
+<span class="source-line-no">152</span><span id="line-152">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">153</span><span id="line-153">    if (this.prefix == null) {</span>
+<span class="source-line-no">154</span><span id="line-154">      return null;</span>
+<span class="source-line-no">155</span><span id="line-155">    }</span>
+<span class="source-line-no">156</span><span id="line-156">    return getNextCellHint(skippedCell);</span>
+<span class="source-line-no">157</span><span id="line-157">  }</span>
+<span class="source-line-no">158</span><span id="line-158"></span>
+<span class="source-line-no">159</span><span id="line-159">  @Override</span>
+<span class="source-line-no">160</span><span id="line-160">  public String toString() {</span>
+<span class="source-line-no">161</span><span id="line-161">    return this.getClass().getSimpleName() + " " + Bytes.toStringBinary(this.prefix);</span>
+<span class="source-line-no">162</span><span id="line-162">  }</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Override</span>
+<span class="source-line-no">165</span><span id="line-165">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">166</span><span id="line-166">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">167</span><span id="line-167">  }</span>
+<span class="source-line-no">168</span><span id="line-168"></span>
+<span class="source-line-no">169</span><span id="line-169">  @Override</span>
+<span class="source-line-no">170</span><span id="line-170">  public int hashCode() {</span>
+<span class="source-line-no">171</span><span id="line-171">    return Bytes.hashCode(this.getPrefix());</span>
+<span class="source-line-no">172</span><span id="line-172">  }</span>
+<span class="source-line-no">173</span><span id="line-173">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
index 5c4892d91f3..ad3a0ca9cfc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/ColumnRangeFilter.html
@@ -214,23 +214,31 @@
 <span class="source-line-no">201</span><span id="line-201">  }</span>
 <span class="source-line-no">202</span><span id="line-202"></span>
 <span class="source-line-no">203</span><span id="line-203">  @Override</span>
-<span class="source-line-no">204</span><span id="line-204">  public String toString() {</span>
-<span class="source-line-no">205</span><span id="line-205">    return this.getClass().getSimpleName() + " " + (this.minColumnInclusive ? "[" : "(")</span>
-<span class="source-line-no">206</span><span id="line-206">      + Bytes.toStringBinary(this.minColumn) + ", " + Bytes.toStringBinary(this.maxColumn)</span>
-<span class="source-line-no">207</span><span id="line-207">      + (this.maxColumnInclusive ? "]" : ")");</span>
-<span class="source-line-no">208</span><span id="line-208">  }</span>
-<span class="source-line-no">209</span><span id="line-209"></span>
-<span class="source-line-no">210</span><span id="line-210">  @Override</span>
-<span class="source-line-no">211</span><span id="line-211">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">212</span><span id="line-212">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">213</span><span id="line-213">  }</span>
-<span class="source-line-no">214</span><span id="line-214"></span>
-<span class="source-line-no">215</span><span id="line-215">  @Override</span>
-<span class="source-line-no">216</span><span id="line-216">  public int hashCode() {</span>
-<span class="source-line-no">217</span><span id="line-217">    return Objects.hash(Bytes.hashCode(getMinColumn()), getMinColumnInclusive(),</span>
-<span class="source-line-no">218</span><span id="line-218">      Bytes.hashCode(getMaxColumn()), getMaxColumnInclusive());</span>
-<span class="source-line-no">219</span><span id="line-219">  }</span>
-<span class="source-line-no">220</span><span id="line-220">}</span>
+<span class="source-line-no">204</span><span id="line-204">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">205</span><span id="line-205">    if (this.minColumn == null) {</span>
+<span class="source-line-no">206</span><span id="line-206">      return null;</span>
+<span class="source-line-no">207</span><span id="line-207">    }</span>
+<span class="source-line-no">208</span><span id="line-208">    return getNextCellHint(skippedCell);</span>
+<span class="source-line-no">209</span><span id="line-209">  }</span>
+<span class="source-line-no">210</span><span id="line-210"></span>
+<span class="source-line-no">211</span><span id="line-211">  @Override</span>
+<span class="source-line-no">212</span><span id="line-212">  public String toString() {</span>
+<span class="source-line-no">213</span><span id="line-213">    return this.getClass().getSimpleName() + " " + (this.minColumnInclusive ? "[" : "(")</span>
+<span class="source-line-no">214</span><span id="line-214">      + Bytes.toStringBinary(this.minColumn) + ", " + Bytes.toStringBinary(this.maxColumn)</span>
+<span class="source-line-no">215</span><span id="line-215">      + (this.maxColumnInclusive ? "]" : ")");</span>
+<span class="source-line-no">216</span><span id="line-216">  }</span>
+<span class="source-line-no">217</span><span id="line-217"></span>
+<span class="source-line-no">218</span><span id="line-218">  @Override</span>
+<span class="source-line-no">219</span><span id="line-219">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">220</span><span id="line-220">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">221</span><span id="line-221">  }</span>
+<span class="source-line-no">222</span><span id="line-222"></span>
+<span class="source-line-no">223</span><span id="line-223">  @Override</span>
+<span class="source-line-no">224</span><span id="line-224">  public int hashCode() {</span>
+<span class="source-line-no">225</span><span id="line-225">    return Objects.hash(Bytes.hashCode(getMinColumn()), getMinColumnInclusive(),</span>
+<span class="source-line-no">226</span><span id="line-226">      Bytes.hashCode(getMaxColumn()), getMaxColumnInclusive());</span>
+<span class="source-line-no">227</span><span id="line-227">  }</span>
+<span class="source-line-no">228</span><span id="line-228">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
index d4ec9c51692..fb335c4f5ae 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.ReturnCode.html
@@ -229,112 +229,118 @@
 <span class="source-line-no">216</span><span id="line-216">   * must point to a &lt;em&gt;smaller&lt;/em&gt; row key (earlier in reverse-scan direction). The scanner</span>
 <span class="source-line-no">217</span><span id="line-217">   * validates hint direction and falls back to {@code nextRow()} if the hint does not advance in</span>
 <span class="source-line-no">218</span><span id="line-218">   * the scan direction.&lt;/li&gt;</span>
-<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">220</span><span id="line-220">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">221</span><span id="line-221">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">222</span><span id="line-222">   * &lt;/ul&gt;</span>
-<span class="source-line-no">223</span><span id="line-223">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
-<span class="source-line-no">224</span><span id="line-224">   *                     was passed to {@code filterRowKey}</span>
-<span class="source-line-no">225</span><span id="line-225">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">226</span><span id="line-226">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
-<span class="source-line-no">227</span><span id="line-227">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">228</span><span id="line-228">   * @see #filterRowKey(Cell)</span>
-<span class="source-line-no">229</span><span id="line-229">   */</span>
-<span class="source-line-no">230</span><span id="line-230">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">231</span><span id="line-231">    return null;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  /**</span>
-<span class="source-line-no">235</span><span id="line-235">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
-<span class="source-line-no">236</span><span id="line-236">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
-<span class="source-line-no">237</span><span id="line-237">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
-<span class="source-line-no">238</span><span id="line-238">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
-<span class="source-line-no">239</span><span id="line-239">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
-<span class="source-line-no">240</span><span id="line-240">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
-<span class="source-line-no">241</span><span id="line-241">   * ahead instead of advancing one cell at a time.</span>
-<span class="source-line-no">242</span><span id="line-242">   * &lt;p&gt;</span>
-<span class="source-line-no">243</span><span id="line-243">   * Contract:</span>
-<span class="source-line-no">244</span><span id="line-244">   * &lt;ul&gt;</span>
-<span class="source-line-no">245</span><span id="line-245">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
-<span class="source-line-no">246</span><span id="line-246">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
-<span class="source-line-no">247</span><span id="line-247">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
-<span class="source-line-no">248</span><span id="line-248">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
-<span class="source-line-no">249</span><span id="line-249">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
-<span class="source-line-no">250</span><span id="line-250">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
-<span class="source-line-no">251</span><span id="line-251">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
-<span class="source-line-no">252</span><span id="line-252">   * side.&lt;/li&gt;</span>
-<span class="source-line-no">253</span><span id="line-253">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
-<span class="source-line-no">254</span><span id="line-254">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
-<span class="source-line-no">255</span><span id="line-255">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
-<span class="source-line-no">256</span><span id="line-256">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
-<span class="source-line-no">257</span><span id="line-257">   * direction are silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">258</span><span id="line-258">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">259</span><span id="line-259">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">260</span><span id="line-260">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">261</span><span id="line-261">   * &lt;/ul&gt;</span>
-<span class="source-line-no">262</span><span id="line-262">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
-<span class="source-line-no">263</span><span id="line-263">   *                    {@code filterCell} could be consulted</span>
-<span class="source-line-no">264</span><span id="line-264">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">265</span><span id="line-265">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
-<span class="source-line-no">266</span><span id="line-266">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">267</span><span id="line-267">   * @see #filterCell(Cell)</span>
-<span class="source-line-no">268</span><span id="line-268">   * @see #getNextCellHint(Cell)</span>
-<span class="source-line-no">269</span><span id="line-269">   */</span>
-<span class="source-line-no">270</span><span id="line-270">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
-<span class="source-line-no">271</span><span id="line-271">    return null;</span>
-<span class="source-line-no">272</span><span id="line-272">  }</span>
-<span class="source-line-no">273</span><span id="line-273"></span>
-<span class="source-line-no">274</span><span id="line-274">  /**</span>
-<span class="source-line-no">275</span><span id="line-275">   * Check that given column family is essential for filter to check row. Most filters always return</span>
-<span class="source-line-no">276</span><span id="line-276">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
-<span class="source-line-no">277</span><span id="line-277">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
-<span class="source-line-no">278</span><span id="line-278">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">279</span><span id="line-279">   * {@link IOException}.</span>
-<span class="source-line-no">280</span><span id="line-280">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
-<span class="source-line-no">283</span><span id="line-283"></span>
-<span class="source-line-no">284</span><span id="line-284">  /**</span>
-<span class="source-line-no">285</span><span id="line-285">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">286</span><span id="line-286">   * {@link IOException}.</span>
-<span class="source-line-no">287</span><span id="line-287">   * @return The filter serialized using pb</span>
-<span class="source-line-no">288</span><span id="line-288">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  abstract public byte[] toByteArray() throws IOException;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">  /**</span>
-<span class="source-line-no">293</span><span id="line-293">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">294</span><span id="line-294">   * {@link IOException}.</span>
-<span class="source-line-no">295</span><span id="line-295">   * @param pbBytes A pb serialized {@link Filter} instance</span>
-<span class="source-line-no">296</span><span id="line-296">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
-<span class="source-line-no">297</span><span id="line-297">   * @throws DeserializationException if an error occurred</span>
-<span class="source-line-no">298</span><span id="line-298">   * @see #toByteArray</span>
-<span class="source-line-no">299</span><span id="line-299">   */</span>
-<span class="source-line-no">300</span><span id="line-300">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
-<span class="source-line-no">301</span><span id="line-301">    throw new DeserializationException(</span>
-<span class="source-line-no">302</span><span id="line-302">      "parseFrom called on base Filter, but should be called on derived type");</span>
-<span class="source-line-no">303</span><span id="line-303">  }</span>
-<span class="source-line-no">304</span><span id="line-304"></span>
-<span class="source-line-no">305</span><span id="line-305">  /**</span>
-<span class="source-line-no">306</span><span id="line-306">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">307</span><span id="line-307">   * {@link IOException}.</span>
-<span class="source-line-no">308</span><span id="line-308">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
-<span class="source-line-no">309</span><span id="line-309">   *         corresponding fields in other. Used for testing.</span>
-<span class="source-line-no">310</span><span id="line-310">   */</span>
-<span class="source-line-no">311</span><span id="line-311">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
-<span class="source-line-no">312</span><span id="line-312"></span>
-<span class="source-line-no">313</span><span id="line-313">  /**</span>
-<span class="source-line-no">314</span><span id="line-314">   * alter the reversed scan flag</span>
-<span class="source-line-no">315</span><span id="line-315">   * @param reversed flag</span>
+<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">220</span><span id="line-220">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">221</span><span id="line-221">   * method to their sub-filters and merge the results. For AND ({@code MUST_PASS_ALL}), only</span>
+<span class="source-line-no">222</span><span id="line-222">   * sub-filters whose {@code filterRowKey} individually returned {@code true} are consulted, and</span>
+<span class="source-line-no">223</span><span id="line-223">   * the farthest (maximal-step) hint among them is returned. For OR ({@code MUST_PASS_ONE}), the</span>
+<span class="source-line-no">224</span><span id="line-224">   * nearest hint is returned only when every non-terminated sub-filter provides one — any null</span>
+<span class="source-line-no">225</span><span id="line-225">   * collapses the OR result to null.&lt;/li&gt;</span>
+<span class="source-line-no">226</span><span id="line-226">   * &lt;/ul&gt;</span>
+<span class="source-line-no">227</span><span id="line-227">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
+<span class="source-line-no">228</span><span id="line-228">   *                     was passed to {@code filterRowKey}</span>
+<span class="source-line-no">229</span><span id="line-229">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">230</span><span id="line-230">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
+<span class="source-line-no">231</span><span id="line-231">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">232</span><span id="line-232">   * @see #filterRowKey(Cell)</span>
+<span class="source-line-no">233</span><span id="line-233">   */</span>
+<span class="source-line-no">234</span><span id="line-234">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">235</span><span id="line-235">    return null;</span>
+<span class="source-line-no">236</span><span id="line-236">  }</span>
+<span class="source-line-no">237</span><span id="line-237"></span>
+<span class="source-line-no">238</span><span id="line-238">  /**</span>
+<span class="source-line-no">239</span><span id="line-239">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
+<span class="source-line-no">240</span><span id="line-240">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
+<span class="source-line-no">241</span><span id="line-241">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
+<span class="source-line-no">242</span><span id="line-242">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
+<span class="source-line-no">243</span><span id="line-243">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
+<span class="source-line-no">244</span><span id="line-244">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
+<span class="source-line-no">245</span><span id="line-245">   * ahead instead of advancing one cell at a time.</span>
+<span class="source-line-no">246</span><span id="line-246">   * &lt;p&gt;</span>
+<span class="source-line-no">247</span><span id="line-247">   * Contract:</span>
+<span class="source-line-no">248</span><span id="line-248">   * &lt;ul&gt;</span>
+<span class="source-line-no">249</span><span id="line-249">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
+<span class="source-line-no">250</span><span id="line-250">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
+<span class="source-line-no">251</span><span id="line-251">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
+<span class="source-line-no">252</span><span id="line-252">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
+<span class="source-line-no">253</span><span id="line-253">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
+<span class="source-line-no">254</span><span id="line-254">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
+<span class="source-line-no">255</span><span id="line-255">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
+<span class="source-line-no">256</span><span id="line-256">   * side.&lt;/li&gt;</span>
+<span class="source-line-no">257</span><span id="line-257">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
+<span class="source-line-no">258</span><span id="line-258">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
+<span class="source-line-no">259</span><span id="line-259">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
+<span class="source-line-no">260</span><span id="line-260">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
+<span class="source-line-no">261</span><span id="line-261">   * direction are silently ignored.&lt;/li&gt;</span>
+<span class="source-line-no">262</span><span id="line-262">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">263</span><span id="line-263">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">264</span><span id="line-264">   * method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest</span>
+<span class="source-line-no">265</span><span id="line-265">   * hint is returned only when every non-terminated sub-filter provides one — any null collapses</span>
+<span class="source-line-no">266</span><span id="line-266">   * the OR result to null).&lt;/li&gt;</span>
+<span class="source-line-no">267</span><span id="line-267">   * &lt;/ul&gt;</span>
+<span class="source-line-no">268</span><span id="line-268">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
+<span class="source-line-no">269</span><span id="line-269">   *                    {@code filterCell} could be consulted</span>
+<span class="source-line-no">270</span><span id="line-270">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">271</span><span id="line-271">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
+<span class="source-line-no">272</span><span id="line-272">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">273</span><span id="line-273">   * @see #filterCell(Cell)</span>
+<span class="source-line-no">274</span><span id="line-274">   * @see #getNextCellHint(Cell)</span>
+<span class="source-line-no">275</span><span id="line-275">   */</span>
+<span class="source-line-no">276</span><span id="line-276">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">277</span><span id="line-277">    return null;</span>
+<span class="source-line-no">278</span><span id="line-278">  }</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">  /**</span>
+<span class="source-line-no">281</span><span id="line-281">   * Check that given column family is essential for filter to check row. Most filters always return</span>
+<span class="source-line-no">282</span><span id="line-282">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
+<span class="source-line-no">283</span><span id="line-283">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
+<span class="source-line-no">284</span><span id="line-284">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">285</span><span id="line-285">   * {@link IOException}.</span>
+<span class="source-line-no">286</span><span id="line-286">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">287</span><span id="line-287">   */</span>
+<span class="source-line-no">288</span><span id="line-288">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">292</span><span id="line-292">   * {@link IOException}.</span>
+<span class="source-line-no">293</span><span id="line-293">   * @return The filter serialized using pb</span>
+<span class="source-line-no">294</span><span id="line-294">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">295</span><span id="line-295">   */</span>
+<span class="source-line-no">296</span><span id="line-296">  abstract public byte[] toByteArray() throws IOException;</span>
+<span class="source-line-no">297</span><span id="line-297"></span>
+<span class="source-line-no">298</span><span id="line-298">  /**</span>
+<span class="source-line-no">299</span><span id="line-299">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link IOException}.</span>
+<span class="source-line-no">301</span><span id="line-301">   * @param pbBytes A pb serialized {@link Filter} instance</span>
+<span class="source-line-no">302</span><span id="line-302">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
+<span class="source-line-no">303</span><span id="line-303">   * @throws DeserializationException if an error occurred</span>
+<span class="source-line-no">304</span><span id="line-304">   * @see #toByteArray</span>
+<span class="source-line-no">305</span><span id="line-305">   */</span>
+<span class="source-line-no">306</span><span id="line-306">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
+<span class="source-line-no">307</span><span id="line-307">    throw new DeserializationException(</span>
+<span class="source-line-no">308</span><span id="line-308">      "parseFrom called on base Filter, but should be called on derived type");</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  /**</span>
+<span class="source-line-no">312</span><span id="line-312">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">313</span><span id="line-313">   * {@link IOException}.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
+<span class="source-line-no">315</span><span id="line-315">   *         corresponding fields in other. Used for testing.</span>
 <span class="source-line-no">316</span><span id="line-316">   */</span>
-<span class="source-line-no">317</span><span id="line-317">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">318</span><span id="line-318">    this.reversed = reversed;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  public boolean isReversed() {</span>
-<span class="source-line-no">322</span><span id="line-322">    return this.reversed;</span>
-<span class="source-line-no">323</span><span id="line-323">  }</span>
-<span class="source-line-no">324</span><span id="line-324">}</span>
+<span class="source-line-no">317</span><span id="line-317">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">  /**</span>
+<span class="source-line-no">320</span><span id="line-320">   * alter the reversed scan flag</span>
+<span class="source-line-no">321</span><span id="line-321">   * @param reversed flag</span>
+<span class="source-line-no">322</span><span id="line-322">   */</span>
+<span class="source-line-no">323</span><span id="line-323">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">324</span><span id="line-324">    this.reversed = reversed;</span>
+<span class="source-line-no">325</span><span id="line-325">  }</span>
+<span class="source-line-no">326</span><span id="line-326"></span>
+<span class="source-line-no">327</span><span id="line-327">  public boolean isReversed() {</span>
+<span class="source-line-no">328</span><span id="line-328">    return this.reversed;</span>
+<span class="source-line-no">329</span><span id="line-329">  }</span>
+<span class="source-line-no">330</span><span id="line-330">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
index 2f33d98eb0f..aeb5a0847b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/Filter.html
@@ -229,112 +229,118 @@
 <span class="source-line-no">216</span><span id="line-216">   * must point to a &lt;em&gt;smaller&lt;/em&gt; row key (earlier in reverse-scan direction). The scanner</span>
 <span class="source-line-no">217</span><span id="line-217">   * validates hint direction and falls back to {@code nextRow()} if the hint does not advance in</span>
 <span class="source-line-no">218</span><span id="line-218">   * the scan direction.&lt;/li&gt;</span>
-<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">220</span><span id="line-220">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">221</span><span id="line-221">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">222</span><span id="line-222">   * &lt;/ul&gt;</span>
-<span class="source-line-no">223</span><span id="line-223">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
-<span class="source-line-no">224</span><span id="line-224">   *                     was passed to {@code filterRowKey}</span>
-<span class="source-line-no">225</span><span id="line-225">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">226</span><span id="line-226">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
-<span class="source-line-no">227</span><span id="line-227">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">228</span><span id="line-228">   * @see #filterRowKey(Cell)</span>
-<span class="source-line-no">229</span><span id="line-229">   */</span>
-<span class="source-line-no">230</span><span id="line-230">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">231</span><span id="line-231">    return null;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  /**</span>
-<span class="source-line-no">235</span><span id="line-235">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
-<span class="source-line-no">236</span><span id="line-236">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
-<span class="source-line-no">237</span><span id="line-237">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
-<span class="source-line-no">238</span><span id="line-238">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
-<span class="source-line-no">239</span><span id="line-239">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
-<span class="source-line-no">240</span><span id="line-240">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
-<span class="source-line-no">241</span><span id="line-241">   * ahead instead of advancing one cell at a time.</span>
-<span class="source-line-no">242</span><span id="line-242">   * &lt;p&gt;</span>
-<span class="source-line-no">243</span><span id="line-243">   * Contract:</span>
-<span class="source-line-no">244</span><span id="line-244">   * &lt;ul&gt;</span>
-<span class="source-line-no">245</span><span id="line-245">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
-<span class="source-line-no">246</span><span id="line-246">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
-<span class="source-line-no">247</span><span id="line-247">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
-<span class="source-line-no">248</span><span id="line-248">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
-<span class="source-line-no">249</span><span id="line-249">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
-<span class="source-line-no">250</span><span id="line-250">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
-<span class="source-line-no">251</span><span id="line-251">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
-<span class="source-line-no">252</span><span id="line-252">   * side.&lt;/li&gt;</span>
-<span class="source-line-no">253</span><span id="line-253">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
-<span class="source-line-no">254</span><span id="line-254">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
-<span class="source-line-no">255</span><span id="line-255">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
-<span class="source-line-no">256</span><span id="line-256">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
-<span class="source-line-no">257</span><span id="line-257">   * direction are silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">258</span><span id="line-258">   * &lt;li&gt;&lt;strong&gt;Composite filter limitation:&lt;/strong&gt; {@code FilterList}, {@code SkipFilter}, and</span>
-<span class="source-line-no">259</span><span id="line-259">   * {@code WhileMatchFilter} do not currently delegate this method to wrapped sub-filters. Hints</span>
-<span class="source-line-no">260</span><span id="line-260">   * from filters used inside these wrappers will be silently ignored.&lt;/li&gt;</span>
-<span class="source-line-no">261</span><span id="line-261">   * &lt;/ul&gt;</span>
-<span class="source-line-no">262</span><span id="line-262">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
-<span class="source-line-no">263</span><span id="line-263">   *                    {@code filterCell} could be consulted</span>
-<span class="source-line-no">264</span><span id="line-264">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
-<span class="source-line-no">265</span><span id="line-265">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
-<span class="source-line-no">266</span><span id="line-266">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
-<span class="source-line-no">267</span><span id="line-267">   * @see #filterCell(Cell)</span>
-<span class="source-line-no">268</span><span id="line-268">   * @see #getNextCellHint(Cell)</span>
-<span class="source-line-no">269</span><span id="line-269">   */</span>
-<span class="source-line-no">270</span><span id="line-270">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
-<span class="source-line-no">271</span><span id="line-271">    return null;</span>
-<span class="source-line-no">272</span><span id="line-272">  }</span>
-<span class="source-line-no">273</span><span id="line-273"></span>
-<span class="source-line-no">274</span><span id="line-274">  /**</span>
-<span class="source-line-no">275</span><span id="line-275">   * Check that given column family is essential for filter to check row. Most filters always return</span>
-<span class="source-line-no">276</span><span id="line-276">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
-<span class="source-line-no">277</span><span id="line-277">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
-<span class="source-line-no">278</span><span id="line-278">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">279</span><span id="line-279">   * {@link IOException}.</span>
-<span class="source-line-no">280</span><span id="line-280">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
-<span class="source-line-no">283</span><span id="line-283"></span>
-<span class="source-line-no">284</span><span id="line-284">  /**</span>
-<span class="source-line-no">285</span><span id="line-285">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">286</span><span id="line-286">   * {@link IOException}.</span>
-<span class="source-line-no">287</span><span id="line-287">   * @return The filter serialized using pb</span>
-<span class="source-line-no">288</span><span id="line-288">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  abstract public byte[] toByteArray() throws IOException;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">  /**</span>
-<span class="source-line-no">293</span><span id="line-293">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">294</span><span id="line-294">   * {@link IOException}.</span>
-<span class="source-line-no">295</span><span id="line-295">   * @param pbBytes A pb serialized {@link Filter} instance</span>
-<span class="source-line-no">296</span><span id="line-296">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
-<span class="source-line-no">297</span><span id="line-297">   * @throws DeserializationException if an error occurred</span>
-<span class="source-line-no">298</span><span id="line-298">   * @see #toByteArray</span>
-<span class="source-line-no">299</span><span id="line-299">   */</span>
-<span class="source-line-no">300</span><span id="line-300">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
-<span class="source-line-no">301</span><span id="line-301">    throw new DeserializationException(</span>
-<span class="source-line-no">302</span><span id="line-302">      "parseFrom called on base Filter, but should be called on derived type");</span>
-<span class="source-line-no">303</span><span id="line-303">  }</span>
-<span class="source-line-no">304</span><span id="line-304"></span>
-<span class="source-line-no">305</span><span id="line-305">  /**</span>
-<span class="source-line-no">306</span><span id="line-306">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
-<span class="source-line-no">307</span><span id="line-307">   * {@link IOException}.</span>
-<span class="source-line-no">308</span><span id="line-308">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
-<span class="source-line-no">309</span><span id="line-309">   *         corresponding fields in other. Used for testing.</span>
-<span class="source-line-no">310</span><span id="line-310">   */</span>
-<span class="source-line-no">311</span><span id="line-311">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
-<span class="source-line-no">312</span><span id="line-312"></span>
-<span class="source-line-no">313</span><span id="line-313">  /**</span>
-<span class="source-line-no">314</span><span id="line-314">   * alter the reversed scan flag</span>
-<span class="source-line-no">315</span><span id="line-315">   * @param reversed flag</span>
+<span class="source-line-no">219</span><span id="line-219">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">220</span><span id="line-220">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">221</span><span id="line-221">   * method to their sub-filters and merge the results. For AND ({@code MUST_PASS_ALL}), only</span>
+<span class="source-line-no">222</span><span id="line-222">   * sub-filters whose {@code filterRowKey} individually returned {@code true} are consulted, and</span>
+<span class="source-line-no">223</span><span id="line-223">   * the farthest (maximal-step) hint among them is returned. For OR ({@code MUST_PASS_ONE}), the</span>
+<span class="source-line-no">224</span><span id="line-224">   * nearest hint is returned only when every non-terminated sub-filter provides one — any null</span>
+<span class="source-line-no">225</span><span id="line-225">   * collapses the OR result to null.&lt;/li&gt;</span>
+<span class="source-line-no">226</span><span id="line-226">   * &lt;/ul&gt;</span>
+<span class="source-line-no">227</span><span id="line-227">   * @param firstRowCell the first cell encountered in the rejected row; contains the row key that</span>
+<span class="source-line-no">228</span><span id="line-228">   *                     was passed to {@code filterRowKey}</span>
+<span class="source-line-no">229</span><span id="line-229">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">230</span><span id="line-230">   *         {@code null} if this filter cannot provide a better position than a sequential skip</span>
+<span class="source-line-no">231</span><span id="line-231">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">232</span><span id="line-232">   * @see #filterRowKey(Cell)</span>
+<span class="source-line-no">233</span><span id="line-233">   */</span>
+<span class="source-line-no">234</span><span id="line-234">  public Cell getHintForRejectedRow(final Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">235</span><span id="line-235">    return null;</span>
+<span class="source-line-no">236</span><span id="line-236">  }</span>
+<span class="source-line-no">237</span><span id="line-237"></span>
+<span class="source-line-no">238</span><span id="line-238">  /**</span>
+<span class="source-line-no">239</span><span id="line-239">   * Provides a seek hint for cells that are structurally skipped by the scan pipeline</span>
+<span class="source-line-no">240</span><span id="line-240">   * &lt;em&gt;before&lt;/em&gt; {@link #filterCell(Cell)} is ever reached. The pipeline short-circuits on</span>
+<span class="source-line-no">241</span><span id="line-241">   * several criteria — time-range mismatch, column-set exclusion, and version-limit exhaustion —</span>
+<span class="source-line-no">242</span><span id="line-242">   * and in each case the filter is bypassed entirely. When an implementation can compute a</span>
+<span class="source-line-no">243</span><span id="line-243">   * meaningful forward position purely from the cell's coordinates (without needing the</span>
+<span class="source-line-no">244</span><span id="line-244">   * {@code filterCell} call sequence), it should return that position here so the scanner can seek</span>
+<span class="source-line-no">245</span><span id="line-245">   * ahead instead of advancing one cell at a time.</span>
+<span class="source-line-no">246</span><span id="line-246">   * &lt;p&gt;</span>
+<span class="source-line-no">247</span><span id="line-247">   * Contract:</span>
+<span class="source-line-no">248</span><span id="line-248">   * &lt;ul&gt;</span>
+<span class="source-line-no">249</span><span id="line-249">   * &lt;li&gt;May be called for cells that have &lt;strong&gt;never&lt;/strong&gt; been passed to</span>
+<span class="source-line-no">250</span><span id="line-250">   * {@link #filterCell(Cell)}.&lt;/li&gt;</span>
+<span class="source-line-no">251</span><span id="line-251">   * &lt;li&gt;Implementations &lt;strong&gt;must not&lt;/strong&gt; modify any filter state; this method is treated</span>
+<span class="source-line-no">252</span><span id="line-252">   * as logically stateless. Only filters whose hint computation is based solely on immutable</span>
+<span class="source-line-no">253</span><span id="line-253">   * configuration (e.g. a fixed column range or a fuzzy-row pattern) should override this.&lt;/li&gt;</span>
+<span class="source-line-no">254</span><span id="line-254">   * &lt;li&gt;The returned {@link Cell}, if non-null, must be an</span>
+<span class="source-line-no">255</span><span id="line-255">   * {@link org.apache.hadoop.hbase.ExtendedCell} because filters are evaluated on the server</span>
+<span class="source-line-no">256</span><span id="line-256">   * side.&lt;/li&gt;</span>
+<span class="source-line-no">257</span><span id="line-257">   * &lt;li&gt;Returning {@code null} (the default) falls through to the existing structural skip/seek</span>
+<span class="source-line-no">258</span><span id="line-258">   * behaviour, preserving full backward compatibility.&lt;/li&gt;</span>
+<span class="source-line-no">259</span><span id="line-259">   * &lt;li&gt;For reversed scans, the returned cell must have a &lt;em&gt;smaller&lt;/em&gt; row key (i.e., earlier</span>
+<span class="source-line-no">260</span><span id="line-260">   * in reverse-scan direction) than the {@code skippedCell}. Hints that do not advance in the scan</span>
+<span class="source-line-no">261</span><span id="line-261">   * direction are silently ignored.&lt;/li&gt;</span>
+<span class="source-line-no">262</span><span id="line-262">   * &lt;li&gt;&lt;strong&gt;Composite filter support:&lt;/strong&gt; {@code FilterList} (both {@code MUST_PASS_ALL}</span>
+<span class="source-line-no">263</span><span id="line-263">   * and {@code MUST_PASS_ONE}), {@code SkipFilter}, and {@code WhileMatchFilter} delegate this</span>
+<span class="source-line-no">264</span><span id="line-264">   * method to their sub-filters and merge the results (maximal step for AND; for OR, the nearest</span>
+<span class="source-line-no">265</span><span id="line-265">   * hint is returned only when every non-terminated sub-filter provides one — any null collapses</span>
+<span class="source-line-no">266</span><span id="line-266">   * the OR result to null).&lt;/li&gt;</span>
+<span class="source-line-no">267</span><span id="line-267">   * &lt;/ul&gt;</span>
+<span class="source-line-no">268</span><span id="line-268">   * @param skippedCell the cell that was rejected by the time-range, column, or version gate before</span>
+<span class="source-line-no">269</span><span id="line-269">   *                    {@code filterCell} could be consulted</span>
+<span class="source-line-no">270</span><span id="line-270">   * @return a {@link Cell} representing the earliest position the scanner should seek to, or</span>
+<span class="source-line-no">271</span><span id="line-271">   *         {@code null} if this filter cannot provide a better position than the structural hint</span>
+<span class="source-line-no">272</span><span id="line-272">   * @throws IOException in case an I/O or filter-specific failure needs to be signaled</span>
+<span class="source-line-no">273</span><span id="line-273">   * @see #filterCell(Cell)</span>
+<span class="source-line-no">274</span><span id="line-274">   * @see #getNextCellHint(Cell)</span>
+<span class="source-line-no">275</span><span id="line-275">   */</span>
+<span class="source-line-no">276</span><span id="line-276">  public Cell getSkipHint(final Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">277</span><span id="line-277">    return null;</span>
+<span class="source-line-no">278</span><span id="line-278">  }</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">  /**</span>
+<span class="source-line-no">281</span><span id="line-281">   * Check that given column family is essential for filter to check row. Most filters always return</span>
+<span class="source-line-no">282</span><span id="line-282">   * true here. But some could have more sophisticated logic which could significantly reduce</span>
+<span class="source-line-no">283</span><span id="line-283">   * scanning process by not even touching columns until we are 100% sure that it's data is needed</span>
+<span class="source-line-no">284</span><span id="line-284">   * in result. Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">285</span><span id="line-285">   * {@link IOException}.</span>
+<span class="source-line-no">286</span><span id="line-286">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">287</span><span id="line-287">   */</span>
+<span class="source-line-no">288</span><span id="line-288">  abstract public boolean isFamilyEssential(byte[] name) throws IOException;</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * TODO: JAVADOC Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">292</span><span id="line-292">   * {@link IOException}.</span>
+<span class="source-line-no">293</span><span id="line-293">   * @return The filter serialized using pb</span>
+<span class="source-line-no">294</span><span id="line-294">   * @throws IOException in case an I/O or an filter specific failure needs to be signaled.</span>
+<span class="source-line-no">295</span><span id="line-295">   */</span>
+<span class="source-line-no">296</span><span id="line-296">  abstract public byte[] toByteArray() throws IOException;</span>
+<span class="source-line-no">297</span><span id="line-297"></span>
+<span class="source-line-no">298</span><span id="line-298">  /**</span>
+<span class="source-line-no">299</span><span id="line-299">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link IOException}.</span>
+<span class="source-line-no">301</span><span id="line-301">   * @param pbBytes A pb serialized {@link Filter} instance</span>
+<span class="source-line-no">302</span><span id="line-302">   * @return An instance of {@link Filter} made from &lt;code&gt;bytes&lt;/code&gt;</span>
+<span class="source-line-no">303</span><span id="line-303">   * @throws DeserializationException if an error occurred</span>
+<span class="source-line-no">304</span><span id="line-304">   * @see #toByteArray</span>
+<span class="source-line-no">305</span><span id="line-305">   */</span>
+<span class="source-line-no">306</span><span id="line-306">  public static Filter parseFrom(final byte[] pbBytes) throws DeserializationException {</span>
+<span class="source-line-no">307</span><span id="line-307">    throw new DeserializationException(</span>
+<span class="source-line-no">308</span><span id="line-308">      "parseFrom called on base Filter, but should be called on derived type");</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  /**</span>
+<span class="source-line-no">312</span><span id="line-312">   * Concrete implementers can signal a failure condition in their code by throwing an</span>
+<span class="source-line-no">313</span><span id="line-313">   * {@link IOException}.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @return true if and only if the fields of the filter that are serialized are equal to the</span>
+<span class="source-line-no">315</span><span id="line-315">   *         corresponding fields in other. Used for testing.</span>
 <span class="source-line-no">316</span><span id="line-316">   */</span>
-<span class="source-line-no">317</span><span id="line-317">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">318</span><span id="line-318">    this.reversed = reversed;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  public boolean isReversed() {</span>
-<span class="source-line-no">322</span><span id="line-322">    return this.reversed;</span>
-<span class="source-line-no">323</span><span id="line-323">  }</span>
-<span class="source-line-no">324</span><span id="line-324">}</span>
+<span class="source-line-no">317</span><span id="line-317">  abstract boolean areSerializedFieldsEqual(Filter other);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">  /**</span>
+<span class="source-line-no">320</span><span id="line-320">   * alter the reversed scan flag</span>
+<span class="source-line-no">321</span><span id="line-321">   * @param reversed flag</span>
+<span class="source-line-no">322</span><span id="line-322">   */</span>
+<span class="source-line-no">323</span><span id="line-323">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">324</span><span id="line-324">    this.reversed = reversed;</span>
+<span class="source-line-no">325</span><span id="line-325">  }</span>
+<span class="source-line-no">326</span><span id="line-326"></span>
+<span class="source-line-no">327</span><span id="line-327">  public boolean isReversed() {</span>
+<span class="source-line-no">328</span><span id="line-328">    return this.reversed;</span>
+<span class="source-line-no">329</span><span id="line-329">  }</span>
+<span class="source-line-no">330</span><span id="line-330">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
index 70b43734f06..e61377ab5e4 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.Operator.html
@@ -256,37 +256,47 @@
 <span class="source-line-no">243</span><span id="line-243">  }</span>
 <span class="source-line-no">244</span><span id="line-244"></span>
 <span class="source-line-no">245</span><span id="line-245">  @Override</span>
-<span class="source-line-no">246</span><span id="line-246">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">246</span><span id="line-246">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">248</span><span id="line-248">  }</span>
 <span class="source-line-no">249</span><span id="line-249"></span>
 <span class="source-line-no">250</span><span id="line-250">  @Override</span>
-<span class="source-line-no">251</span><span id="line-251">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">252</span><span id="line-252">    this.reversed = reversed;</span>
-<span class="source-line-no">253</span><span id="line-253">    this.filterListBase.setReversed(reversed);</span>
-<span class="source-line-no">254</span><span id="line-254">  }</span>
-<span class="source-line-no">255</span><span id="line-255"></span>
-<span class="source-line-no">256</span><span id="line-256">  @Override</span>
-<span class="source-line-no">257</span><span id="line-257">  public boolean isReversed() {</span>
-<span class="source-line-no">258</span><span id="line-258">    assert this.reversed == this.filterListBase.isReversed();</span>
-<span class="source-line-no">259</span><span id="line-259">    return this.reversed;</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  @Override</span>
-<span class="source-line-no">263</span><span id="line-263">  public String toString() {</span>
-<span class="source-line-no">264</span><span id="line-264">    return this.filterListBase.toString();</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  @Override</span>
-<span class="source-line-no">268</span><span id="line-268">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">269</span><span id="line-269">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">251</span><span id="line-251">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">252</span><span id="line-252">    return this.filterListBase.getSkipHint(skippedCell);</span>
+<span class="source-line-no">253</span><span id="line-253">  }</span>
+<span class="source-line-no">254</span><span id="line-254"></span>
+<span class="source-line-no">255</span><span id="line-255">  @Override</span>
+<span class="source-line-no">256</span><span id="line-256">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">257</span><span id="line-257">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">258</span><span id="line-258">  }</span>
+<span class="source-line-no">259</span><span id="line-259"></span>
+<span class="source-line-no">260</span><span id="line-260">  @Override</span>
+<span class="source-line-no">261</span><span id="line-261">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">262</span><span id="line-262">    this.reversed = reversed;</span>
+<span class="source-line-no">263</span><span id="line-263">    this.filterListBase.setReversed(reversed);</span>
+<span class="source-line-no">264</span><span id="line-264">  }</span>
+<span class="source-line-no">265</span><span id="line-265"></span>
+<span class="source-line-no">266</span><span id="line-266">  @Override</span>
+<span class="source-line-no">267</span><span id="line-267">  public boolean isReversed() {</span>
+<span class="source-line-no">268</span><span id="line-268">    assert this.reversed == this.filterListBase.isReversed();</span>
+<span class="source-line-no">269</span><span id="line-269">    return this.reversed;</span>
 <span class="source-line-no">270</span><span id="line-270">  }</span>
 <span class="source-line-no">271</span><span id="line-271"></span>
 <span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public int hashCode() {</span>
-<span class="source-line-no">274</span><span id="line-274">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">273</span><span id="line-273">  public String toString() {</span>
+<span class="source-line-no">274</span><span id="line-274">    return this.filterListBase.toString();</span>
 <span class="source-line-no">275</span><span id="line-275">  }</span>
-<span class="source-line-no">276</span><span id="line-276">}</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">  @Override</span>
+<span class="source-line-no">278</span><span id="line-278">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">279</span><span id="line-279">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">280</span><span id="line-280">  }</span>
+<span class="source-line-no">281</span><span id="line-281"></span>
+<span class="source-line-no">282</span><span id="line-282">  @Override</span>
+<span class="source-line-no">283</span><span id="line-283">  public int hashCode() {</span>
+<span class="source-line-no">284</span><span id="line-284">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">285</span><span id="line-285">  }</span>
+<span class="source-line-no">286</span><span id="line-286">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
index b412fb227e6..d931cb8b1a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterList.html
@@ -256,37 +256,47 @@
 <span class="source-line-no">243</span><span id="line-243">  }</span>
 <span class="source-line-no">244</span><span id="line-244"></span>
 <span class="source-line-no">245</span><span id="line-245">  @Override</span>
-<span class="source-line-no">246</span><span id="line-246">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">246</span><span id="line-246">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">247</span><span id="line-247">    return this.filterListBase.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">248</span><span id="line-248">  }</span>
 <span class="source-line-no">249</span><span id="line-249"></span>
 <span class="source-line-no">250</span><span id="line-250">  @Override</span>
-<span class="source-line-no">251</span><span id="line-251">  public void setReversed(boolean reversed) {</span>
-<span class="source-line-no">252</span><span id="line-252">    this.reversed = reversed;</span>
-<span class="source-line-no">253</span><span id="line-253">    this.filterListBase.setReversed(reversed);</span>
-<span class="source-line-no">254</span><span id="line-254">  }</span>
-<span class="source-line-no">255</span><span id="line-255"></span>
-<span class="source-line-no">256</span><span id="line-256">  @Override</span>
-<span class="source-line-no">257</span><span id="line-257">  public boolean isReversed() {</span>
-<span class="source-line-no">258</span><span id="line-258">    assert this.reversed == this.filterListBase.isReversed();</span>
-<span class="source-line-no">259</span><span id="line-259">    return this.reversed;</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  @Override</span>
-<span class="source-line-no">263</span><span id="line-263">  public String toString() {</span>
-<span class="source-line-no">264</span><span id="line-264">    return this.filterListBase.toString();</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  @Override</span>
-<span class="source-line-no">268</span><span id="line-268">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">269</span><span id="line-269">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">251</span><span id="line-251">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">252</span><span id="line-252">    return this.filterListBase.getSkipHint(skippedCell);</span>
+<span class="source-line-no">253</span><span id="line-253">  }</span>
+<span class="source-line-no">254</span><span id="line-254"></span>
+<span class="source-line-no">255</span><span id="line-255">  @Override</span>
+<span class="source-line-no">256</span><span id="line-256">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">257</span><span id="line-257">    return this.filterListBase.isFamilyEssential(name);</span>
+<span class="source-line-no">258</span><span id="line-258">  }</span>
+<span class="source-line-no">259</span><span id="line-259"></span>
+<span class="source-line-no">260</span><span id="line-260">  @Override</span>
+<span class="source-line-no">261</span><span id="line-261">  public void setReversed(boolean reversed) {</span>
+<span class="source-line-no">262</span><span id="line-262">    this.reversed = reversed;</span>
+<span class="source-line-no">263</span><span id="line-263">    this.filterListBase.setReversed(reversed);</span>
+<span class="source-line-no">264</span><span id="line-264">  }</span>
+<span class="source-line-no">265</span><span id="line-265"></span>
+<span class="source-line-no">266</span><span id="line-266">  @Override</span>
+<span class="source-line-no">267</span><span id="line-267">  public boolean isReversed() {</span>
+<span class="source-line-no">268</span><span id="line-268">    assert this.reversed == this.filterListBase.isReversed();</span>
+<span class="source-line-no">269</span><span id="line-269">    return this.reversed;</span>
 <span class="source-line-no">270</span><span id="line-270">  }</span>
 <span class="source-line-no">271</span><span id="line-271"></span>
 <span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public int hashCode() {</span>
-<span class="source-line-no">274</span><span id="line-274">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">273</span><span id="line-273">  public String toString() {</span>
+<span class="source-line-no">274</span><span id="line-274">    return this.filterListBase.toString();</span>
 <span class="source-line-no">275</span><span id="line-275">  }</span>
-<span class="source-line-no">276</span><span id="line-276">}</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">  @Override</span>
+<span class="source-line-no">278</span><span id="line-278">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">279</span><span id="line-279">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">280</span><span id="line-280">  }</span>
+<span class="source-line-no">281</span><span id="line-281"></span>
+<span class="source-line-no">282</span><span id="line-282">  @Override</span>
+<span class="source-line-no">283</span><span id="line-283">  public int hashCode() {</span>
+<span class="source-line-no">284</span><span id="line-284">    return Objects.hash(getOperator(), getFilters());</span>
+<span class="source-line-no">285</span><span id="line-285">  }</span>
+<span class="source-line-no">286</span><span id="line-286">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
index 9c3806904af..94ed173060a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithAND.html
@@ -32,322 +32,388 @@
 <span class="source-line-no">019</span><span id="line-19"></span>
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
 <span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.Collections;</span>
-<span class="source-line-no">023</span><span id="line-23">import java.util.List;</span>
-<span class="source-line-no">024</span><span id="line-24">import java.util.Objects;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.Cell;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.yetus.audience.InterfaceAudience;</span>
-<span class="source-line-no">027</span><span id="line-27"></span>
-<span class="source-line-no">028</span><span id="line-28">/**</span>
-<span class="source-line-no">029</span><span id="line-29"> * FilterListWithAND represents an ordered list of filters which will be evaluated with an AND</span>
-<span class="source-line-no">030</span><span id="line-30"> * operator.</span>
-<span class="source-line-no">031</span><span id="line-31"> */</span>
-<span class="source-line-no">032</span><span id="line-32">@InterfaceAudience.Private</span>
-<span class="source-line-no">033</span><span id="line-33">public class FilterListWithAND extends FilterListBase {</span>
-<span class="source-line-no">034</span><span id="line-34"></span>
-<span class="source-line-no">035</span><span id="line-35">  private List&lt;Filter&gt; seekHintFilters = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">036</span><span id="line-36">  private boolean[] hintingFilters;</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">  public FilterListWithAND(List&lt;Filter&gt; filters) {</span>
-<span class="source-line-no">039</span><span id="line-39">    super(filters);</span>
-<span class="source-line-no">040</span><span id="line-40">    // For FilterList with AND, when call FL's transformCell(), we should transform cell for all</span>
-<span class="source-line-no">041</span><span id="line-41">    // sub-filters (because all sub-filters return INCLUDE*). So here, fill this array with true. we</span>
-<span class="source-line-no">042</span><span id="line-42">    // keep this in FilterListWithAND for abstracting the transformCell() in FilterListBase.</span>
-<span class="source-line-no">043</span><span id="line-43">    subFiltersIncludedCell = new ArrayList&lt;&gt;(Collections.nCopies(filters.size(), true));</span>
-<span class="source-line-no">044</span><span id="line-44">    cacheHintingFilters();</span>
-<span class="source-line-no">045</span><span id="line-45">  }</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">  @Override</span>
-<span class="source-line-no">048</span><span id="line-48">  public void addFilterLists(List&lt;Filter&gt; filters) {</span>
-<span class="source-line-no">049</span><span id="line-49">    if (checkAndGetReversed(filters, isReversed()) != isReversed()) {</span>
-<span class="source-line-no">050</span><span id="line-50">      throw new IllegalArgumentException("Filters in the list must have the same reversed flag");</span>
-<span class="source-line-no">051</span><span id="line-51">    }</span>
-<span class="source-line-no">052</span><span id="line-52">    this.filters.addAll(filters);</span>
-<span class="source-line-no">053</span><span id="line-53">    this.subFiltersIncludedCell.addAll(Collections.nCopies(filters.size(), true));</span>
-<span class="source-line-no">054</span><span id="line-54">    this.cacheHintingFilters();</span>
-<span class="source-line-no">055</span><span id="line-55">  }</span>
-<span class="source-line-no">056</span><span id="line-56"></span>
-<span class="source-line-no">057</span><span id="line-57">  @Override</span>
-<span class="source-line-no">058</span><span id="line-58">  protected String formatLogFilters(List&lt;Filter&gt; logFilters) {</span>
-<span class="source-line-no">059</span><span id="line-59">    return String.format("FilterList AND (%d/%d): %s", logFilters.size(), this.size(),</span>
-<span class="source-line-no">060</span><span id="line-60">      logFilters.toString());</span>
-<span class="source-line-no">061</span><span id="line-61">  }</span>
-<span class="source-line-no">062</span><span id="line-62"></span>
-<span class="source-line-no">063</span><span id="line-63">  /**</span>
-<span class="source-line-no">064</span><span id="line-64">   * As checks for this are in the hot path, we want them as fast as possible, so we are caching the</span>
-<span class="source-line-no">065</span><span id="line-65">   * status in an array.</span>
-<span class="source-line-no">066</span><span id="line-66">   */</span>
-<span class="source-line-no">067</span><span id="line-67">  private void cacheHintingFilters() {</span>
-<span class="source-line-no">068</span><span id="line-68">    int filtersSize = filters.size();</span>
-<span class="source-line-no">069</span><span id="line-69">    hintingFilters = new boolean[filtersSize];</span>
-<span class="source-line-no">070</span><span id="line-70">    for (int i = 0; i &lt; filtersSize; i++) {</span>
-<span class="source-line-no">071</span><span id="line-71">      if (filters.get(i) instanceof HintingFilter) {</span>
-<span class="source-line-no">072</span><span id="line-72">        hintingFilters[i] = true;</span>
-<span class="source-line-no">073</span><span id="line-73">      }</span>
-<span class="source-line-no">074</span><span id="line-74">    }</span>
-<span class="source-line-no">075</span><span id="line-75">  }</span>
-<span class="source-line-no">076</span><span id="line-76"></span>
-<span class="source-line-no">077</span><span id="line-77">  /**</span>
-<span class="source-line-no">078</span><span id="line-78">   * FilterList with MUST_PASS_ALL choose the maximal forward step among sub-filters in filter list.</span>
-<span class="source-line-no">079</span><span id="line-79">   * Let's call it: The Maximal Step Rule. So if filter-A in filter list return INCLUDE and filter-B</span>
-<span class="source-line-no">080</span><span id="line-80">   * in filter list return INCLUDE_AND_NEXT_COL, then the filter list should return</span>
-<span class="source-line-no">081</span><span id="line-81">   * INCLUDE_AND_NEXT_COL. For SEEK_NEXT_USING_HINT, it's more special, and in method</span>
-<span class="source-line-no">082</span><span id="line-82">   * filterCellWithMustPassAll(), if any sub-filter return SEEK_NEXT_USING_HINT, then our filter</span>
-<span class="source-line-no">083</span><span id="line-83">   * list will return SEEK_NEXT_USING_HINT. so we don't care about the SEEK_NEXT_USING_HINT here.</span>
-<span class="source-line-no">084</span><span id="line-84">   * &lt;br/&gt;</span>
-<span class="source-line-no">085</span><span id="line-85">   * &lt;br/&gt;</span>
-<span class="source-line-no">086</span><span id="line-86">   * The jump step will be:</span>
-<span class="source-line-no">087</span><span id="line-87">   *</span>
-<span class="source-line-no">088</span><span id="line-88">   * &lt;pre&gt;</span>
-<span class="source-line-no">089</span><span id="line-89">   * INCLUDE &amp;lt; SKIP &amp;lt; INCLUDE_AND_NEXT_COL &amp;lt; NEXT_COL &amp;lt; INCLUDE_AND_SEEK_NEXT_ROW &amp;lt; NEXT_ROW</span>
-<span class="source-line-no">090</span><span id="line-90">   *     &amp;lt; SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">091</span><span id="line-91">   * &lt;/pre&gt;</span>
-<span class="source-line-no">092</span><span id="line-92">   *</span>
-<span class="source-line-no">093</span><span id="line-93">   * Here, we have the following map to describe The Maximal Step Rule. if current return code (for</span>
-<span class="source-line-no">094</span><span id="line-94">   * previous sub-filters in filter list) is &lt;strong&gt;ReturnCode&lt;/strong&gt;, and current filter returns</span>
-<span class="source-line-no">095</span><span id="line-95">   * &lt;strong&gt;localRC&lt;/strong&gt;, then we should return map[ReturnCode][localRC] for the merged result,</span>
-<span class="source-line-no">096</span><span id="line-96">   * according to The Maximal Step Rule. &lt;br/&gt;</span>
-<span class="source-line-no">097</span><span id="line-97">   *</span>
-<span class="source-line-no">098</span><span id="line-98">   * &lt;pre&gt;</span>
-<span class="source-line-no">099</span><span id="line-99">   * LocalCode\ReturnCode       INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">100</span><span id="line-100">   * INCLUDE                    INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">101</span><span id="line-101">   * INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">102</span><span id="line-102">   * INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW INCLUDE_AND_SEEK_NEXT_ROW  NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">103</span><span id="line-103">   * SKIP                       SKIP                       NEXT_COL                  NEXT_ROW                   SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">104</span><span id="line-104">   * NEXT_COL                   NEXT_COL                   NEXT_COL                  NEXT_ROW                   NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">105</span><span id="line-105">   * NEXT_ROW                   NEXT_ROW                   NEXT_ROW                  NEXT_ROW                   NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">106</span><span id="line-106">   * SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT      SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT</span>
-<span class="source-line-no">107</span><span id="line-107">   * &lt;/pre&gt;</span>
-<span class="source-line-no">108</span><span id="line-108">   *</span>
-<span class="source-line-no">109</span><span id="line-109">   * @param rc      Return code which is calculated by previous sub-filter(s) in filter list.</span>
-<span class="source-line-no">110</span><span id="line-110">   * @param localRC Return code of the current sub-filter in filter list.</span>
-<span class="source-line-no">111</span><span id="line-111">   * @return Return code which is merged by the return code of previous sub-filter(s) and the return</span>
-<span class="source-line-no">112</span><span id="line-112">   *         code of current sub-filter.</span>
-<span class="source-line-no">113</span><span id="line-113">   */</span>
-<span class="source-line-no">114</span><span id="line-114">  private ReturnCode mergeReturnCode(ReturnCode rc, ReturnCode localRC) {</span>
-<span class="source-line-no">115</span><span id="line-115">    if (rc == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">116</span><span id="line-116">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">117</span><span id="line-117">    }</span>
-<span class="source-line-no">118</span><span id="line-118">    switch (localRC) {</span>
-<span class="source-line-no">119</span><span id="line-119">      case SEEK_NEXT_USING_HINT:</span>
-<span class="source-line-no">120</span><span id="line-120">        return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">121</span><span id="line-121">      case INCLUDE:</span>
-<span class="source-line-no">122</span><span id="line-122">        return rc;</span>
-<span class="source-line-no">123</span><span id="line-123">      case INCLUDE_AND_NEXT_COL:</span>
-<span class="source-line-no">124</span><span id="line-124">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL)) {</span>
-<span class="source-line-no">125</span><span id="line-125">          return ReturnCode.INCLUDE_AND_NEXT_COL;</span>
-<span class="source-line-no">126</span><span id="line-126">        }</span>
-<span class="source-line-no">127</span><span id="line-127">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)) {</span>
-<span class="source-line-no">128</span><span id="line-128">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
-<span class="source-line-no">129</span><span id="line-129">        }</span>
-<span class="source-line-no">130</span><span id="line-130">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL)) {</span>
-<span class="source-line-no">131</span><span id="line-131">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">132</span><span id="line-132">        }</span>
-<span class="source-line-no">133</span><span id="line-133">        if (isInReturnCodes(rc, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">134</span><span id="line-134">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">022</span><span id="line-22">import java.util.Arrays;</span>
+<span class="source-line-no">023</span><span id="line-23">import java.util.Collections;</span>
+<span class="source-line-no">024</span><span id="line-24">import java.util.List;</span>
+<span class="source-line-no">025</span><span id="line-25">import java.util.Objects;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.Cell;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.apache.yetus.audience.InterfaceAudience;</span>
+<span class="source-line-no">028</span><span id="line-28"></span>
+<span class="source-line-no">029</span><span id="line-29">/**</span>
+<span class="source-line-no">030</span><span id="line-30"> * FilterListWithAND represents an ordered list of filters which will be evaluated with an AND</span>
+<span class="source-line-no">031</span><span id="line-31"> * operator.</span>
+<span class="source-line-no">032</span><span id="line-32"> */</span>
+<span class="source-line-no">033</span><span id="line-33">@InterfaceAudience.Private</span>
+<span class="source-line-no">034</span><span id="line-34">public class FilterListWithAND extends FilterListBase {</span>
+<span class="source-line-no">035</span><span id="line-35"></span>
+<span class="source-line-no">036</span><span id="line-36">  private List&lt;Filter&gt; seekHintFilters = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">037</span><span id="line-37">  private boolean[] hintingFilters;</span>
+<span class="source-line-no">038</span><span id="line-38">  /**</span>
+<span class="source-line-no">039</span><span id="line-39">   * Tracks which sub-filters returned {@code true} from {@link Filter#filterRowKey(Cell)}. Set in</span>
+<span class="source-line-no">040</span><span id="line-40">   * {@code filterRowKey()}, consumed by {@code getHintForRejectedRow()}, cleared only by</span>
+<span class="source-line-no">041</span><span id="line-41">   * {@code reset()} — callers must invoke {@code reset()} between rows to avoid stale state.</span>
+<span class="source-line-no">042</span><span id="line-42">   */</span>
+<span class="source-line-no">043</span><span id="line-43">  private boolean[] rejectedByFilterRowKey;</span>
+<span class="source-line-no">044</span><span id="line-44"></span>
+<span class="source-line-no">045</span><span id="line-45">  public FilterListWithAND(List&lt;Filter&gt; filters) {</span>
+<span class="source-line-no">046</span><span id="line-46">    super(filters);</span>
+<span class="source-line-no">047</span><span id="line-47">    // For FilterList with AND, when call FL's transformCell(), we should transform cell for all</span>
+<span class="source-line-no">048</span><span id="line-48">    // sub-filters (because all sub-filters return INCLUDE*). So here, fill this array with true. we</span>
+<span class="source-line-no">049</span><span id="line-49">    // keep this in FilterListWithAND for abstracting the transformCell() in FilterListBase.</span>
+<span class="source-line-no">050</span><span id="line-50">    subFiltersIncludedCell = new ArrayList&lt;&gt;(Collections.nCopies(filters.size(), true));</span>
+<span class="source-line-no">051</span><span id="line-51">    rejectedByFilterRowKey = new boolean[filters.size()];</span>
+<span class="source-line-no">052</span><span id="line-52">    cacheHintingFilters();</span>
+<span class="source-line-no">053</span><span id="line-53">  }</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">  @Override</span>
+<span class="source-line-no">056</span><span id="line-56">  public void addFilterLists(List&lt;Filter&gt; filters) {</span>
+<span class="source-line-no">057</span><span id="line-57">    if (checkAndGetReversed(filters, isReversed()) != isReversed()) {</span>
+<span class="source-line-no">058</span><span id="line-58">      throw new IllegalArgumentException("Filters in the list must have the same reversed flag");</span>
+<span class="source-line-no">059</span><span id="line-59">    }</span>
+<span class="source-line-no">060</span><span id="line-60">    this.filters.addAll(filters);</span>
+<span class="source-line-no">061</span><span id="line-61">    this.subFiltersIncludedCell.addAll(Collections.nCopies(filters.size(), true));</span>
+<span class="source-line-no">062</span><span id="line-62">    this.rejectedByFilterRowKey = Arrays.copyOf(this.rejectedByFilterRowKey, this.filters.size());</span>
+<span class="source-line-no">063</span><span id="line-63">    this.cacheHintingFilters();</span>
+<span class="source-line-no">064</span><span id="line-64">  }</span>
+<span class="source-line-no">065</span><span id="line-65"></span>
+<span class="source-line-no">066</span><span id="line-66">  @Override</span>
+<span class="source-line-no">067</span><span id="line-67">  protected String formatLogFilters(List&lt;Filter&gt; logFilters) {</span>
+<span class="source-line-no">068</span><span id="line-68">    return String.format("FilterList AND (%d/%d): %s", logFilters.size(), this.size(),</span>
+<span class="source-line-no">069</span><span id="line-69">      logFilters.toString());</span>
+<span class="source-line-no">070</span><span id="line-70">  }</span>
+<span class="source-line-no">071</span><span id="line-71"></span>
+<span class="source-line-no">072</span><span id="line-72">  /**</span>
+<span class="source-line-no">073</span><span id="line-73">   * As checks for this are in the hot path, we want them as fast as possible, so we are caching the</span>
+<span class="source-line-no">074</span><span id="line-74">   * status in an array.</span>
+<span class="source-line-no">075</span><span id="line-75">   */</span>
+<span class="source-line-no">076</span><span id="line-76">  private void cacheHintingFilters() {</span>
+<span class="source-line-no">077</span><span id="line-77">    int filtersSize = filters.size();</span>
+<span class="source-line-no">078</span><span id="line-78">    hintingFilters = new boolean[filtersSize];</span>
+<span class="source-line-no">079</span><span id="line-79">    for (int i = 0; i &lt; filtersSize; i++) {</span>
+<span class="source-line-no">080</span><span id="line-80">      if (filters.get(i) instanceof HintingFilter) {</span>
+<span class="source-line-no">081</span><span id="line-81">        hintingFilters[i] = true;</span>
+<span class="source-line-no">082</span><span id="line-82">      }</span>
+<span class="source-line-no">083</span><span id="line-83">    }</span>
+<span class="source-line-no">084</span><span id="line-84">  }</span>
+<span class="source-line-no">085</span><span id="line-85"></span>
+<span class="source-line-no">086</span><span id="line-86">  /**</span>
+<span class="source-line-no">087</span><span id="line-87">   * FilterList with MUST_PASS_ALL choose the maximal forward step among sub-filters in filter list.</span>
+<span class="source-line-no">088</span><span id="line-88">   * Let's call it: The Maximal Step Rule. So if filter-A in filter list return INCLUDE and filter-B</span>
+<span class="source-line-no">089</span><span id="line-89">   * in filter list return INCLUDE_AND_NEXT_COL, then the filter list should return</span>
+<span class="source-line-no">090</span><span id="line-90">   * INCLUDE_AND_NEXT_COL. For SEEK_NEXT_USING_HINT, it's more special, and in method</span>
+<span class="source-line-no">091</span><span id="line-91">   * filterCellWithMustPassAll(), if any sub-filter return SEEK_NEXT_USING_HINT, then our filter</span>
+<span class="source-line-no">092</span><span id="line-92">   * list will return SEEK_NEXT_USING_HINT. so we don't care about the SEEK_NEXT_USING_HINT here.</span>
+<span class="source-line-no">093</span><span id="line-93">   * &lt;br/&gt;</span>
+<span class="source-line-no">094</span><span id="line-94">   * &lt;br/&gt;</span>
+<span class="source-line-no">095</span><span id="line-95">   * The jump step will be:</span>
+<span class="source-line-no">096</span><span id="line-96">   *</span>
+<span class="source-line-no">097</span><span id="line-97">   * &lt;pre&gt;</span>
+<span class="source-line-no">098</span><span id="line-98">   * INCLUDE &amp;lt; SKIP &amp;lt; INCLUDE_AND_NEXT_COL &amp;lt; NEXT_COL &amp;lt; INCLUDE_AND_SEEK_NEXT_ROW &amp;lt; NEXT_ROW</span>
+<span class="source-line-no">099</span><span id="line-99">   *     &amp;lt; SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">100</span><span id="line-100">   * &lt;/pre&gt;</span>
+<span class="source-line-no">101</span><span id="line-101">   *</span>
+<span class="source-line-no">102</span><span id="line-102">   * Here, we have the following map to describe The Maximal Step Rule. if current return code (for</span>
+<span class="source-line-no">103</span><span id="line-103">   * previous sub-filters in filter list) is &lt;strong&gt;ReturnCode&lt;/strong&gt;, and current filter returns</span>
+<span class="source-line-no">104</span><span id="line-104">   * &lt;strong&gt;localRC&lt;/strong&gt;, then we should return map[ReturnCode][localRC] for the merged result,</span>
+<span class="source-line-no">105</span><span id="line-105">   * according to The Maximal Step Rule. &lt;br/&gt;</span>
+<span class="source-line-no">106</span><span id="line-106">   *</span>
+<span class="source-line-no">107</span><span id="line-107">   * &lt;pre&gt;</span>
+<span class="source-line-no">108</span><span id="line-108">   * LocalCode\ReturnCode       INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">109</span><span id="line-109">   * INCLUDE                    INCLUDE                    INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">110</span><span id="line-110">   * INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL       INCLUDE_AND_NEXT_COL      INCLUDE_AND_SEEK_NEXT_ROW  NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">111</span><span id="line-111">   * INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW  INCLUDE_AND_SEEK_NEXT_ROW INCLUDE_AND_SEEK_NEXT_ROW  NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">112</span><span id="line-112">   * SKIP                       SKIP                       NEXT_COL                  NEXT_ROW                   SKIP                  NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">113</span><span id="line-113">   * NEXT_COL                   NEXT_COL                   NEXT_COL                  NEXT_ROW                   NEXT_COL              NEXT_COL              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">114</span><span id="line-114">   * NEXT_ROW                   NEXT_ROW                   NEXT_ROW                  NEXT_ROW                   NEXT_ROW              NEXT_ROW              NEXT_ROW              SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">115</span><span id="line-115">   * SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT      SEEK_NEXT_USING_HINT       SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT  SEEK_NEXT_USING_HINT</span>
+<span class="source-line-no">116</span><span id="line-116">   * &lt;/pre&gt;</span>
+<span class="source-line-no">117</span><span id="line-117">   *</span>
+<span class="source-line-no">118</span><span id="line-118">   * @param rc      Return code which is calculated by previous sub-filter(s) in filter list.</span>
+<span class="source-line-no">119</span><span id="line-119">   * @param localRC Return code of the current sub-filter in filter list.</span>
+<span class="source-line-no">120</span><span id="line-120">   * @return Return code which is merged by the return code of previous sub-filter(s) and the return</span>
+<span class="source-line-no">121</span><span id="line-121">   *         code of current sub-filter.</span>
+<span class="source-line-no">122</span><span id="line-122">   */</span>
+<span class="source-line-no">123</span><span id="line-123">  private ReturnCode mergeReturnCode(ReturnCode rc, ReturnCode localRC) {</span>
+<span class="source-line-no">124</span><span id="line-124">    if (rc == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">125</span><span id="line-125">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">126</span><span id="line-126">    }</span>
+<span class="source-line-no">127</span><span id="line-127">    switch (localRC) {</span>
+<span class="source-line-no">128</span><span id="line-128">      case SEEK_NEXT_USING_HINT:</span>
+<span class="source-line-no">129</span><span id="line-129">        return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">130</span><span id="line-130">      case INCLUDE:</span>
+<span class="source-line-no">131</span><span id="line-131">        return rc;</span>
+<span class="source-line-no">132</span><span id="line-132">      case INCLUDE_AND_NEXT_COL:</span>
+<span class="source-line-no">133</span><span id="line-133">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL)) {</span>
+<span class="source-line-no">134</span><span id="line-134">          return ReturnCode.INCLUDE_AND_NEXT_COL;</span>
 <span class="source-line-no">135</span><span id="line-135">        }</span>
-<span class="source-line-no">136</span><span id="line-136">        break;</span>
-<span class="source-line-no">137</span><span id="line-137">      case INCLUDE_AND_SEEK_NEXT_ROW:</span>
-<span class="source-line-no">138</span><span id="line-138">        if (</span>
-<span class="source-line-no">139</span><span id="line-139">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
-<span class="source-line-no">140</span><span id="line-140">            ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)</span>
-<span class="source-line-no">141</span><span id="line-141">        ) {</span>
-<span class="source-line-no">142</span><span id="line-142">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
-<span class="source-line-no">143</span><span id="line-143">        }</span>
-<span class="source-line-no">144</span><span id="line-144">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">145</span><span id="line-145">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">146</span><span id="line-146">        }</span>
-<span class="source-line-no">147</span><span id="line-147">        break;</span>
-<span class="source-line-no">148</span><span id="line-148">      case SKIP:</span>
-<span class="source-line-no">149</span><span id="line-149">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.SKIP)) {</span>
-<span class="source-line-no">150</span><span id="line-150">          return ReturnCode.SKIP;</span>
-<span class="source-line-no">151</span><span id="line-151">        }</span>
-<span class="source-line-no">152</span><span id="line-152">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.NEXT_COL)) {</span>
-<span class="source-line-no">153</span><span id="line-153">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">154</span><span id="line-154">        }</span>
-<span class="source-line-no">155</span><span id="line-155">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">156</span><span id="line-156">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">157</span><span id="line-157">        }</span>
-<span class="source-line-no">158</span><span id="line-158">        break;</span>
-<span class="source-line-no">159</span><span id="line-159">      case NEXT_COL:</span>
-<span class="source-line-no">160</span><span id="line-160">        if (</span>
-<span class="source-line-no">161</span><span id="line-161">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.SKIP,</span>
-<span class="source-line-no">162</span><span id="line-162">            ReturnCode.NEXT_COL)</span>
-<span class="source-line-no">163</span><span id="line-163">        ) {</span>
-<span class="source-line-no">164</span><span id="line-164">          return ReturnCode.NEXT_COL;</span>
-<span class="source-line-no">165</span><span id="line-165">        }</span>
-<span class="source-line-no">166</span><span id="line-166">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
-<span class="source-line-no">167</span><span id="line-167">          return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">168</span><span id="line-168">        }</span>
-<span class="source-line-no">169</span><span id="line-169">        break;</span>
-<span class="source-line-no">170</span><span id="line-170">      case NEXT_ROW:</span>
-<span class="source-line-no">171</span><span id="line-171">        return ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">172</span><span id="line-172">    }</span>
-<span class="source-line-no">173</span><span id="line-173">    throw new IllegalStateException(</span>
-<span class="source-line-no">174</span><span id="line-174">      "Received code is not valid. rc: " + rc + ", localRC: " + localRC);</span>
-<span class="source-line-no">175</span><span id="line-175">  }</span>
-<span class="source-line-no">176</span><span id="line-176"></span>
-<span class="source-line-no">177</span><span id="line-177">  private boolean isIncludeRelatedReturnCode(ReturnCode rc) {</span>
-<span class="source-line-no">178</span><span id="line-178">    return isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
-<span class="source-line-no">179</span><span id="line-179">      ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW);</span>
-<span class="source-line-no">180</span><span id="line-180">  }</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">  @Override</span>
-<span class="source-line-no">183</span><span id="line-183">  public ReturnCode filterCell(Cell c) throws IOException {</span>
-<span class="source-line-no">184</span><span id="line-184">    if (isEmpty()) {</span>
-<span class="source-line-no">185</span><span id="line-185">      return ReturnCode.INCLUDE;</span>
-<span class="source-line-no">186</span><span id="line-186">    }</span>
-<span class="source-line-no">187</span><span id="line-187">    ReturnCode rc = ReturnCode.INCLUDE;</span>
-<span class="source-line-no">188</span><span id="line-188">    this.seekHintFilters.clear();</span>
-<span class="source-line-no">189</span><span id="line-189">    int i = 0;</span>
-<span class="source-line-no">190</span><span id="line-190">    int n = filters.size();</span>
-<span class="source-line-no">191</span><span id="line-191">    for (; i &lt; n; i++) {</span>
-<span class="source-line-no">192</span><span id="line-192">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">193</span><span id="line-193">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">194</span><span id="line-194">        rc = ReturnCode.NEXT_ROW;</span>
-<span class="source-line-no">195</span><span id="line-195">        // See comment right after this loop</span>
-<span class="source-line-no">196</span><span id="line-196">        break;</span>
-<span class="source-line-no">197</span><span id="line-197">      }</span>
-<span class="source-line-no">198</span><span id="line-198">      ReturnCode localRC;</span>
-<span class="source-line-no">199</span><span id="line-199">      localRC = filter.filterCell(c);</span>
-<span class="source-line-no">200</span><span id="line-200">      if (localRC == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">201</span><span id="line-201">        seekHintFilters.add(filter);</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      rc = mergeReturnCode(rc, localRC);</span>
-<span class="source-line-no">204</span><span id="line-204">      // Only when rc is INCLUDE* case, we should pass the cell to the following sub-filters.</span>
-<span class="source-line-no">205</span><span id="line-205">      // otherwise we may mess up the global state (such as offset, count..) in the following</span>
-<span class="source-line-no">206</span><span id="line-206">      // sub-filters. (HBASE-20565)</span>
-<span class="source-line-no">207</span><span id="line-207">      if (!isIncludeRelatedReturnCode(rc)) {</span>
-<span class="source-line-no">208</span><span id="line-208">        // See comment right after this loop</span>
-<span class="source-line-no">209</span><span id="line-209">        break;</span>
-<span class="source-line-no">210</span><span id="line-210">      }</span>
-<span class="source-line-no">211</span><span id="line-211">    }</span>
-<span class="source-line-no">212</span><span id="line-212">    // We have the preliminary return code. However, if there are remaining uncalled hintingFilters,</span>
-<span class="source-line-no">213</span><span id="line-213">    // they may return hints that allow us to seek ahead and skip reading and processing a lot of</span>
-<span class="source-line-no">214</span><span id="line-214">    // cells.</span>
-<span class="source-line-no">215</span><span id="line-215">    // Process the remaining hinting filters so that we can get all seek hints.</span>
-<span class="source-line-no">216</span><span id="line-216">    // The farthest key is computed in getNextCellHint()</span>
-<span class="source-line-no">217</span><span id="line-217">    if (++i &lt; n) {</span>
-<span class="source-line-no">218</span><span id="line-218">      for (; i &lt; n; i++) {</span>
-<span class="source-line-no">219</span><span id="line-219">        if (hintingFilters[i]) {</span>
-<span class="source-line-no">220</span><span id="line-220">          Filter filter = filters.get(i);</span>
-<span class="source-line-no">221</span><span id="line-221">          if (filter.filterCell(c) == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
-<span class="source-line-no">222</span><span id="line-222">            seekHintFilters.add(filter);</span>
-<span class="source-line-no">223</span><span id="line-223">          }</span>
-<span class="source-line-no">224</span><span id="line-224">        }</span>
-<span class="source-line-no">225</span><span id="line-225">      }</span>
-<span class="source-line-no">226</span><span id="line-226">    }</span>
-<span class="source-line-no">227</span><span id="line-227"></span>
-<span class="source-line-no">228</span><span id="line-228">    if (!seekHintFilters.isEmpty()) {</span>
-<span class="source-line-no">229</span><span id="line-229">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
-<span class="source-line-no">230</span><span id="line-230">    }</span>
-<span class="source-line-no">231</span><span id="line-231">    return rc;</span>
-<span class="source-line-no">232</span><span id="line-232">  }</span>
-<span class="source-line-no">233</span><span id="line-233"></span>
-<span class="source-line-no">234</span><span id="line-234">  @Override</span>
-<span class="source-line-no">235</span><span id="line-235">  public void reset() throws IOException {</span>
-<span class="source-line-no">236</span><span id="line-236">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">237</span><span id="line-237">      filters.get(i).reset();</span>
-<span class="source-line-no">238</span><span id="line-238">    }</span>
-<span class="source-line-no">239</span><span id="line-239">    seekHintFilters.clear();</span>
-<span class="source-line-no">240</span><span id="line-240">  }</span>
-<span class="source-line-no">241</span><span id="line-241"></span>
-<span class="source-line-no">242</span><span id="line-242">  @Override</span>
-<span class="source-line-no">243</span><span id="line-243">  public boolean filterRowKey(Cell firstRowCell) throws IOException {</span>
-<span class="source-line-no">244</span><span id="line-244">    if (isEmpty()) {</span>
-<span class="source-line-no">245</span><span id="line-245">      return super.filterRowKey(firstRowCell);</span>
-<span class="source-line-no">246</span><span id="line-246">    }</span>
-<span class="source-line-no">247</span><span id="line-247">    boolean anyRowKeyFiltered = false;</span>
-<span class="source-line-no">248</span><span id="line-248">    boolean anyHintingPassed = false;</span>
-<span class="source-line-no">249</span><span id="line-249">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">250</span><span id="line-250">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">251</span><span id="line-251">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">252</span><span id="line-252">        // We don't need to care about any later filters, as we end the scan immediately.</span>
-<span class="source-line-no">253</span><span id="line-253">        // TODO HBASE-28633 in the normal code path, filterAllRemaining() always gets checked</span>
-<span class="source-line-no">254</span><span id="line-254">        // before filterRowKey(). We should be able to remove this check.</span>
-<span class="source-line-no">255</span><span id="line-255">        return true;</span>
-<span class="source-line-no">256</span><span id="line-256">      } else if (filter.filterRowKey(firstRowCell)) {</span>
-<span class="source-line-no">257</span><span id="line-257">        // Can't just return true here, because there are some filters (such as PrefixFilter) which</span>
-<span class="source-line-no">258</span><span id="line-258">        // will catch the row changed event by filterRowKey(). If we return early here, those</span>
-<span class="source-line-no">259</span><span id="line-259">        // filters will have no chance to update their row state.</span>
-<span class="source-line-no">260</span><span id="line-260">        anyRowKeyFiltered = true;</span>
-<span class="source-line-no">261</span><span id="line-261">      } else if (hintingFilters[i]) {</span>
-<span class="source-line-no">262</span><span id="line-262">        // If filterRowKey returns false and this is a hinting filter, then we must not filter this</span>
-<span class="source-line-no">263</span><span id="line-263">        // rowkey.</span>
-<span class="source-line-no">264</span><span id="line-264">        // Otherwise this sub-filter doesn't get a chance to provide a seek hint, and the scan may</span>
-<span class="source-line-no">265</span><span id="line-265">        // regress into a full scan.</span>
-<span class="source-line-no">266</span><span id="line-266">        anyHintingPassed = true;</span>
-<span class="source-line-no">267</span><span id="line-267">      }</span>
-<span class="source-line-no">268</span><span id="line-268">    }</span>
-<span class="source-line-no">269</span><span id="line-269">    return anyRowKeyFiltered &amp;&amp; !anyHintingPassed;</span>
-<span class="source-line-no">270</span><span id="line-270">  }</span>
-<span class="source-line-no">271</span><span id="line-271"></span>
-<span class="source-line-no">272</span><span id="line-272">  @Override</span>
-<span class="source-line-no">273</span><span id="line-273">  public boolean filterAllRemaining() throws IOException {</span>
-<span class="source-line-no">274</span><span id="line-274">    if (isEmpty()) {</span>
-<span class="source-line-no">275</span><span id="line-275">      return super.filterAllRemaining();</span>
-<span class="source-line-no">276</span><span id="line-276">    }</span>
-<span class="source-line-no">277</span><span id="line-277">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">278</span><span id="line-278">      if (filters.get(i).filterAllRemaining()) {</span>
-<span class="source-line-no">279</span><span id="line-279">        return true;</span>
-<span class="source-line-no">280</span><span id="line-280">      }</span>
-<span class="source-line-no">281</span><span id="line-281">    }</span>
-<span class="source-line-no">282</span><span id="line-282">    return false;</span>
-<span class="source-line-no">283</span><span id="line-283">  }</span>
-<span class="source-line-no">284</span><span id="line-284"></span>
-<span class="source-line-no">285</span><span id="line-285">  @Override</span>
-<span class="source-line-no">286</span><span id="line-286">  public boolean filterRow() throws IOException {</span>
-<span class="source-line-no">287</span><span id="line-287">    if (isEmpty()) {</span>
-<span class="source-line-no">288</span><span id="line-288">      return super.filterRow();</span>
-<span class="source-line-no">289</span><span id="line-289">    }</span>
-<span class="source-line-no">290</span><span id="line-290">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
-<span class="source-line-no">291</span><span id="line-291">      Filter filter = filters.get(i);</span>
-<span class="source-line-no">292</span><span id="line-292">      if (filter.filterRow()) {</span>
-<span class="source-line-no">293</span><span id="line-293">        return true;</span>
-<span class="source-line-no">294</span><span id="line-294">      }</span>
-<span class="source-line-no">295</span><span id="line-295">    }</span>
-<span class="source-line-no">296</span><span id="line-296">    return false;</span>
-<span class="source-line-no">297</span><span id="line-297">  }</span>
-<span class="source-line-no">298</span><span id="line-298"></span>
-<span class="source-line-no">299</span><span id="line-299">  @Override</span>
-<span class="source-line-no">300</span><span id="line-300">  public Cell getNextCellHint(Cell currentCell) throws IOException {</span>
-<span class="source-line-no">301</span><span id="line-301">    if (isEmpty()) {</span>
-<span class="source-line-no">302</span><span id="line-302">      return super.getNextCellHint(currentCell);</span>
-<span class="source-line-no">303</span><span id="line-303">    }</span>
-<span class="source-line-no">304</span><span id="line-304">    Cell maxHint = null;</span>
-<span class="source-line-no">305</span><span id="line-305">    for (Filter filter : seekHintFilters) {</span>
-<span class="source-line-no">306</span><span id="line-306">      if (filter.filterAllRemaining()) {</span>
-<span class="source-line-no">307</span><span id="line-307">        continue;</span>
-<span class="source-line-no">308</span><span id="line-308">      }</span>
-<span class="source-line-no">309</span><span id="line-309">      Cell curKeyHint = filter.getNextCellHint(currentCell);</span>
-<span class="source-line-no">310</span><span id="line-310">      if (maxHint == null) {</span>
-<span class="source-line-no">311</span><span id="line-311">        maxHint = curKeyHint;</span>
-<span class="source-line-no">312</span><span id="line-312">        continue;</span>
-<span class="source-line-no">313</span><span id="line-313">      }</span>
-<span class="source-line-no">314</span><span id="line-314">      if (this.compareCell(maxHint, curKeyHint) &lt; 0) {</span>
-<span class="source-line-no">315</span><span id="line-315">        maxHint = curKeyHint;</span>
-<span class="source-line-no">316</span><span id="line-316">      }</span>
-<span class="source-line-no">317</span><span id="line-317">    }</span>
-<span class="source-line-no">318</span><span id="line-318">    return maxHint;</span>
-<span class="source-line-no">319</span><span id="line-319">  }</span>
-<span class="source-line-no">320</span><span id="line-320"></span>
-<span class="source-line-no">321</span><span id="line-321">  @Override</span>
-<span class="source-line-no">322</span><span id="line-322">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">323</span><span id="line-323">    if (this == obj) {</span>
-<span class="source-line-no">324</span><span id="line-324">      return true;</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">    if (!(obj instanceof FilterListWithAND)) {</span>
-<span class="source-line-no">327</span><span id="line-327">      return false;</span>
-<span class="source-line-no">328</span><span id="line-328">    }</span>
-<span class="source-line-no">329</span><span id="line-329">    FilterListWithAND f = (FilterListWithAND) obj;</span>
-<span class="source-line-no">330</span><span id="line-330">    return this.filters.equals(f.getFilters()) &amp;&amp; this.seekHintFilters.equals(f.seekHintFilters);</span>
+<span class="source-line-no">136</span><span id="line-136">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)) {</span>
+<span class="source-line-no">137</span><span id="line-137">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
+<span class="source-line-no">138</span><span id="line-138">        }</span>
+<span class="source-line-no">139</span><span id="line-139">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL)) {</span>
+<span class="source-line-no">140</span><span id="line-140">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">141</span><span id="line-141">        }</span>
+<span class="source-line-no">142</span><span id="line-142">        if (isInReturnCodes(rc, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">143</span><span id="line-143">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">144</span><span id="line-144">        }</span>
+<span class="source-line-no">145</span><span id="line-145">        break;</span>
+<span class="source-line-no">146</span><span id="line-146">      case INCLUDE_AND_SEEK_NEXT_ROW:</span>
+<span class="source-line-no">147</span><span id="line-147">        if (</span>
+<span class="source-line-no">148</span><span id="line-148">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
+<span class="source-line-no">149</span><span id="line-149">            ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW)</span>
+<span class="source-line-no">150</span><span id="line-150">        ) {</span>
+<span class="source-line-no">151</span><span id="line-151">          return ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW;</span>
+<span class="source-line-no">152</span><span id="line-152">        }</span>
+<span class="source-line-no">153</span><span id="line-153">        if (isInReturnCodes(rc, ReturnCode.SKIP, ReturnCode.NEXT_COL, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">154</span><span id="line-154">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">155</span><span id="line-155">        }</span>
+<span class="source-line-no">156</span><span id="line-156">        break;</span>
+<span class="source-line-no">157</span><span id="line-157">      case SKIP:</span>
+<span class="source-line-no">158</span><span id="line-158">        if (isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.SKIP)) {</span>
+<span class="source-line-no">159</span><span id="line-159">          return ReturnCode.SKIP;</span>
+<span class="source-line-no">160</span><span id="line-160">        }</span>
+<span class="source-line-no">161</span><span id="line-161">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.NEXT_COL)) {</span>
+<span class="source-line-no">162</span><span id="line-162">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">163</span><span id="line-163">        }</span>
+<span class="source-line-no">164</span><span id="line-164">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">165</span><span id="line-165">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">166</span><span id="line-166">        }</span>
+<span class="source-line-no">167</span><span id="line-167">        break;</span>
+<span class="source-line-no">168</span><span id="line-168">      case NEXT_COL:</span>
+<span class="source-line-no">169</span><span id="line-169">        if (</span>
+<span class="source-line-no">170</span><span id="line-170">          isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL, ReturnCode.SKIP,</span>
+<span class="source-line-no">171</span><span id="line-171">            ReturnCode.NEXT_COL)</span>
+<span class="source-line-no">172</span><span id="line-172">        ) {</span>
+<span class="source-line-no">173</span><span id="line-173">          return ReturnCode.NEXT_COL;</span>
+<span class="source-line-no">174</span><span id="line-174">        }</span>
+<span class="source-line-no">175</span><span id="line-175">        if (isInReturnCodes(rc, ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW, ReturnCode.NEXT_ROW)) {</span>
+<span class="source-line-no">176</span><span id="line-176">          return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">177</span><span id="line-177">        }</span>
+<span class="source-line-no">178</span><span id="line-178">        break;</span>
+<span class="source-line-no">179</span><span id="line-179">      case NEXT_ROW:</span>
+<span class="source-line-no">180</span><span id="line-180">        return ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">181</span><span id="line-181">    }</span>
+<span class="source-line-no">182</span><span id="line-182">    throw new IllegalStateException(</span>
+<span class="source-line-no">183</span><span id="line-183">      "Received code is not valid. rc: " + rc + ", localRC: " + localRC);</span>
+<span class="source-line-no">184</span><span id="line-184">  }</span>
+<span class="source-line-no">185</span><span id="line-185"></span>
+<span class="source-line-no">186</span><span id="line-186">  private boolean isIncludeRelatedReturnCode(ReturnCode rc) {</span>
+<span class="source-line-no">187</span><span id="line-187">    return isInReturnCodes(rc, ReturnCode.INCLUDE, ReturnCode.INCLUDE_AND_NEXT_COL,</span>
+<span class="source-line-no">188</span><span id="line-188">      ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW);</span>
+<span class="source-line-no">189</span><span id="line-189">  }</span>
+<span class="source-line-no">190</span><span id="line-190"></span>
+<span class="source-line-no">191</span><span id="line-191">  @Override</span>
+<span class="source-line-no">192</span><span id="line-192">  public ReturnCode filterCell(Cell c) throws IOException {</span>
+<span class="source-line-no">193</span><span id="line-193">    if (isEmpty()) {</span>
+<span class="source-line-no">194</span><span id="line-194">      return ReturnCode.INCLUDE;</span>
+<span class="source-line-no">195</span><span id="line-195">    }</span>
+<span class="source-line-no">196</span><span id="line-196">    ReturnCode rc = ReturnCode.INCLUDE;</span>
+<span class="source-line-no">197</span><span id="line-197">    this.seekHintFilters.clear();</span>
+<span class="source-line-no">198</span><span id="line-198">    int i = 0;</span>
+<span class="source-line-no">199</span><span id="line-199">    int n = filters.size();</span>
+<span class="source-line-no">200</span><span id="line-200">    for (; i &lt; n; i++) {</span>
+<span class="source-line-no">201</span><span id="line-201">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">202</span><span id="line-202">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">203</span><span id="line-203">        rc = ReturnCode.NEXT_ROW;</span>
+<span class="source-line-no">204</span><span id="line-204">        // See comment right after this loop</span>
+<span class="source-line-no">205</span><span id="line-205">        break;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      ReturnCode localRC;</span>
+<span class="source-line-no">208</span><span id="line-208">      localRC = filter.filterCell(c);</span>
+<span class="source-line-no">209</span><span id="line-209">      if (localRC == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">210</span><span id="line-210">        seekHintFilters.add(filter);</span>
+<span class="source-line-no">211</span><span id="line-211">      }</span>
+<span class="source-line-no">212</span><span id="line-212">      rc = mergeReturnCode(rc, localRC);</span>
+<span class="source-line-no">213</span><span id="line-213">      // Only when rc is INCLUDE* case, we should pass the cell to the following sub-filters.</span>
+<span class="source-line-no">214</span><span id="line-214">      // otherwise we may mess up the global state (such as offset, count..) in the following</span>
+<span class="source-line-no">215</span><span id="line-215">      // sub-filters. (HBASE-20565)</span>
+<span class="source-line-no">216</span><span id="line-216">      if (!isIncludeRelatedReturnCode(rc)) {</span>
+<span class="source-line-no">217</span><span id="line-217">        // See comment right after this loop</span>
+<span class="source-line-no">218</span><span id="line-218">        break;</span>
+<span class="source-line-no">219</span><span id="line-219">      }</span>
+<span class="source-line-no">220</span><span id="line-220">    }</span>
+<span class="source-line-no">221</span><span id="line-221">    // We have the preliminary return code. However, if there are remaining uncalled hintingFilters,</span>
+<span class="source-line-no">222</span><span id="line-222">    // they may return hints that allow us to seek ahead and skip reading and processing a lot of</span>
+<span class="source-line-no">223</span><span id="line-223">    // cells.</span>
+<span class="source-line-no">224</span><span id="line-224">    // Process the remaining hinting filters so that we can get all seek hints.</span>
+<span class="source-line-no">225</span><span id="line-225">    // The farthest key is computed in getNextCellHint()</span>
+<span class="source-line-no">226</span><span id="line-226">    if (++i &lt; n) {</span>
+<span class="source-line-no">227</span><span id="line-227">      for (; i &lt; n; i++) {</span>
+<span class="source-line-no">228</span><span id="line-228">        if (hintingFilters[i]) {</span>
+<span class="source-line-no">229</span><span id="line-229">          Filter filter = filters.get(i);</span>
+<span class="source-line-no">230</span><span id="line-230">          if (filter.filterCell(c) == ReturnCode.SEEK_NEXT_USING_HINT) {</span>
+<span class="source-line-no">231</span><span id="line-231">            seekHintFilters.add(filter);</span>
+<span class="source-line-no">232</span><span id="line-232">          }</span>
+<span class="source-line-no">233</span><span id="line-233">        }</span>
+<span class="source-line-no">234</span><span id="line-234">      }</span>
+<span class="source-line-no">235</span><span id="line-235">    }</span>
+<span class="source-line-no">236</span><span id="line-236"></span>
+<span class="source-line-no">237</span><span id="line-237">    if (!seekHintFilters.isEmpty()) {</span>
+<span class="source-line-no">238</span><span id="line-238">      return ReturnCode.SEEK_NEXT_USING_HINT;</span>
+<span class="source-line-no">239</span><span id="line-239">    }</span>
+<span class="source-line-no">240</span><span id="line-240">    return rc;</span>
+<span class="source-line-no">241</span><span id="line-241">  }</span>
+<span class="source-line-no">242</span><span id="line-242"></span>
+<span class="source-line-no">243</span><span id="line-243">  @Override</span>
+<span class="source-line-no">244</span><span id="line-244">  public void reset() throws IOException {</span>
+<span class="source-line-no">245</span><span id="line-245">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">246</span><span id="line-246">      filters.get(i).reset();</span>
+<span class="source-line-no">247</span><span id="line-247">    }</span>
+<span class="source-line-no">248</span><span id="line-248">    seekHintFilters.clear();</span>
+<span class="source-line-no">249</span><span id="line-249">    Arrays.fill(rejectedByFilterRowKey, false);</span>
+<span class="source-line-no">250</span><span id="line-250">  }</span>
+<span class="source-line-no">251</span><span id="line-251"></span>
+<span class="source-line-no">252</span><span id="line-252">  @Override</span>
+<span class="source-line-no">253</span><span id="line-253">  public boolean filterRowKey(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">254</span><span id="line-254">    if (isEmpty()) {</span>
+<span class="source-line-no">255</span><span id="line-255">      return super.filterRowKey(firstRowCell);</span>
+<span class="source-line-no">256</span><span id="line-256">    }</span>
+<span class="source-line-no">257</span><span id="line-257">    Arrays.fill(rejectedByFilterRowKey, false);</span>
+<span class="source-line-no">258</span><span id="line-258">    boolean anyRowKeyFiltered = false;</span>
+<span class="source-line-no">259</span><span id="line-259">    boolean anyHintingPassed = false;</span>
+<span class="source-line-no">260</span><span id="line-260">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">261</span><span id="line-261">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">262</span><span id="line-262">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">263</span><span id="line-263">        // We don't need to care about any later filters, as we end the scan immediately.</span>
+<span class="source-line-no">264</span><span id="line-264">        // TODO HBASE-28633 in the normal code path, filterAllRemaining() always gets checked</span>
+<span class="source-line-no">265</span><span id="line-265">        // before filterRowKey(). We should be able to remove this check.</span>
+<span class="source-line-no">266</span><span id="line-266">        return true;</span>
+<span class="source-line-no">267</span><span id="line-267">      } else if (filter.filterRowKey(firstRowCell)) {</span>
+<span class="source-line-no">268</span><span id="line-268">        // Can't just return true here, because there are some filters (such as PrefixFilter) which</span>
+<span class="source-line-no">269</span><span id="line-269">        // will catch the row changed event by filterRowKey(). If we return early here, those</span>
+<span class="source-line-no">270</span><span id="line-270">        // filters will have no chance to update their row state.</span>
+<span class="source-line-no">271</span><span id="line-271">        anyRowKeyFiltered = true;</span>
+<span class="source-line-no">272</span><span id="line-272">        rejectedByFilterRowKey[i] = true;</span>
+<span class="source-line-no">273</span><span id="line-273">      } else if (hintingFilters[i]) {</span>
+<span class="source-line-no">274</span><span id="line-274">        // If filterRowKey returns false and this is a hinting filter, then we must not filter this</span>
+<span class="source-line-no">275</span><span id="line-275">        // rowkey.</span>
+<span class="source-line-no">276</span><span id="line-276">        // Otherwise this sub-filter doesn't get a chance to provide a seek hint, and the scan may</span>
+<span class="source-line-no">277</span><span id="line-277">        // regress into a full scan.</span>
+<span class="source-line-no">278</span><span id="line-278">        anyHintingPassed = true;</span>
+<span class="source-line-no">279</span><span id="line-279">      }</span>
+<span class="source-line-no">280</span><span id="line-280">    }</span>
+<span class="source-line-no">281</span><span id="line-281">    return anyRowKeyFiltered &amp;&amp; !anyHintingPassed;</span>
+<span class="source-line-no">282</span><span id="line-282">  }</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">  @Override</span>
+<span class="source-line-no">285</span><span id="line-285">  public boolean filterAllRemaining() throws IOException {</span>
+<span class="source-line-no">286</span><span id="line-286">    if (isEmpty()) {</span>
+<span class="source-line-no">287</span><span id="line-287">      return super.filterAllRemaining();</span>
+<span class="source-line-no">288</span><span id="line-288">    }</span>
+<span class="source-line-no">289</span><span id="line-289">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">290</span><span id="line-290">      if (filters.get(i).filterAllRemaining()) {</span>
+<span class="source-line-no">291</span><span id="line-291">        return true;</span>
+<span class="source-line-no">292</span><span id="line-292">      }</span>
+<span class="source-line-no">293</span><span id="line-293">    }</span>
+<span class="source-line-no">294</span><span id="line-294">    return false;</span>
+<span class="source-line-no">295</span><span id="line-295">  }</span>
+<span class="source-line-no">296</span><span id="line-296"></span>
+<span class="source-line-no">297</span><span id="line-297">  @Override</span>
+<span class="source-line-no">298</span><span id="line-298">  public boolean filterRow() throws IOException {</span>
+<span class="source-line-no">299</span><span id="line-299">    if (isEmpty()) {</span>
+<span class="source-line-no">300</span><span id="line-300">      return super.filterRow();</span>
+<span class="source-line-no">301</span><span id="line-301">    }</span>
+<span class="source-line-no">302</span><span id="line-302">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">303</span><span id="line-303">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">304</span><span id="line-304">      if (filter.filterRow()) {</span>
+<span class="source-line-no">305</span><span id="line-305">        return true;</span>
+<span class="source-line-no">306</span><span id="line-306">      }</span>
+<span class="source-line-no">307</span><span id="line-307">    }</span>
+<span class="source-line-no">308</span><span id="line-308">    return false;</span>
+<span class="source-line-no">309</span><span id="line-309">  }</span>
+<span class="source-line-no">310</span><span id="line-310"></span>
+<span class="source-line-no">311</span><span id="line-311">  @Override</span>
+<span class="source-line-no">312</span><span id="line-312">  public Cell getNextCellHint(Cell currentCell) throws IOException {</span>
+<span class="source-line-no">313</span><span id="line-313">    if (isEmpty()) {</span>
+<span class="source-line-no">314</span><span id="line-314">      return super.getNextCellHint(currentCell);</span>
+<span class="source-line-no">315</span><span id="line-315">    }</span>
+<span class="source-line-no">316</span><span id="line-316">    Cell maxHint = null;</span>
+<span class="source-line-no">317</span><span id="line-317">    for (Filter filter : seekHintFilters) {</span>
+<span class="source-line-no">318</span><span id="line-318">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">319</span><span id="line-319">        continue;</span>
+<span class="source-line-no">320</span><span id="line-320">      }</span>
+<span class="source-line-no">321</span><span id="line-321">      Cell curKeyHint = filter.getNextCellHint(currentCell);</span>
+<span class="source-line-no">322</span><span id="line-322">      if (maxHint == null) {</span>
+<span class="source-line-no">323</span><span id="line-323">        maxHint = curKeyHint;</span>
+<span class="source-line-no">324</span><span id="line-324">        continue;</span>
+<span class="source-line-no">325</span><span id="line-325">      }</span>
+<span class="source-line-no">326</span><span id="line-326">      if (this.compareCell(maxHint, curKeyHint) &lt; 0) {</span>
+<span class="source-line-no">327</span><span id="line-327">        maxHint = curKeyHint;</span>
+<span class="source-line-no">328</span><span id="line-328">      }</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">    return maxHint;</span>
 <span class="source-line-no">331</span><span id="line-331">  }</span>
 <span class="source-line-no">332</span><span id="line-332"></span>
-<span class="source-line-no">333</span><span id="line-333">  @Override</span>
-<span class="source-line-no">334</span><span id="line-334">  public int hashCode() {</span>
-<span class="source-line-no">335</span><span id="line-335">    return Objects.hash(this.seekHintFilters, this.filters);</span>
-<span class="source-line-no">336</span><span id="line-336">  }</span>
-<span class="source-line-no">337</span><span id="line-337">}</span>
+<span class="source-line-no">333</span><span id="line-333">  /**</span>
+<span class="source-line-no">334</span><span id="line-334">   * Maximal step: return the farthest hint among sub-filters that actually rejected the row. Only</span>
+<span class="source-line-no">335</span><span id="line-335">   * sub-filters whose {@link Filter#filterRowKey(Cell)} returned {@code true} are consulted,</span>
+<span class="source-line-no">336</span><span id="line-336">   * honouring the per-filter contract. Null hints are ignored; if no rejecting sub-filter provides</span>
+<span class="source-line-no">337</span><span id="line-337">   * a hint, return null.</span>
+<span class="source-line-no">338</span><span id="line-338">   */</span>
+<span class="source-line-no">339</span><span id="line-339">  @Override</span>
+<span class="source-line-no">340</span><span id="line-340">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">341</span><span id="line-341">    if (isEmpty()) {</span>
+<span class="source-line-no">342</span><span id="line-342">      return super.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">343</span><span id="line-343">    }</span>
+<span class="source-line-no">344</span><span id="line-344">    Cell maxHint = null;</span>
+<span class="source-line-no">345</span><span id="line-345">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">346</span><span id="line-346">      if (!rejectedByFilterRowKey[i]) {</span>
+<span class="source-line-no">347</span><span id="line-347">        continue;</span>
+<span class="source-line-no">348</span><span id="line-348">      }</span>
+<span class="source-line-no">349</span><span id="line-349">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">350</span><span id="line-350">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">351</span><span id="line-351">        continue;</span>
+<span class="source-line-no">352</span><span id="line-352">      }</span>
+<span class="source-line-no">353</span><span id="line-353">      Cell hint = filter.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">354</span><span id="line-354">      if (hint == null) {</span>
+<span class="source-line-no">355</span><span id="line-355">        continue;</span>
+<span class="source-line-no">356</span><span id="line-356">      }</span>
+<span class="source-line-no">357</span><span id="line-357">      if (maxHint == null || this.compareCell(maxHint, hint) &lt; 0) {</span>
+<span class="source-line-no">358</span><span id="line-358">        maxHint = hint;</span>
+<span class="source-line-no">359</span><span id="line-359">      }</span>
+<span class="source-line-no">360</span><span id="line-360">    }</span>
+<span class="source-line-no">361</span><span id="line-361">    return maxHint;</span>
+<span class="source-line-no">362</span><span id="line-362">  }</span>
+<span class="source-line-no">363</span><span id="line-363"></span>
+<span class="source-line-no">364</span><span id="line-364">  /** Maximal step: return the farthest skip hint among sub-filters. */</span>
+<span class="source-line-no">365</span><span id="line-365">  @Override</span>
+<span class="source-line-no">366</span><span id="line-366">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">367</span><span id="line-367">    if (isEmpty()) {</span>
+<span class="source-line-no">368</span><span id="line-368">      return super.getSkipHint(skippedCell);</span>
+<span class="source-line-no">369</span><span id="line-369">    }</span>
+<span class="source-line-no">370</span><span id="line-370">    Cell maxHint = null;</span>
+<span class="source-line-no">371</span><span id="line-371">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">372</span><span id="line-372">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">373</span><span id="line-373">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">374</span><span id="line-374">        continue;</span>
+<span class="source-line-no">375</span><span id="line-375">      }</span>
+<span class="source-line-no">376</span><span id="line-376">      Cell hint = filter.getSkipHint(skippedCell);</span>
+<span class="source-line-no">377</span><span id="line-377">      if (hint == null) {</span>
+<span class="source-line-no">378</span><span id="line-378">        continue;</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380">      if (maxHint == null || this.compareCell(maxHint, hint) &lt; 0) {</span>
+<span class="source-line-no">381</span><span id="line-381">        maxHint = hint;</span>
+<span class="source-line-no">382</span><span id="line-382">      }</span>
+<span class="source-line-no">383</span><span id="line-383">    }</span>
+<span class="source-line-no">384</span><span id="line-384">    return maxHint;</span>
+<span class="source-line-no">385</span><span id="line-385">  }</span>
+<span class="source-line-no">386</span><span id="line-386"></span>
+<span class="source-line-no">387</span><span id="line-387">  @Override</span>
+<span class="source-line-no">388</span><span id="line-388">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">389</span><span id="line-389">    if (this == obj) {</span>
+<span class="source-line-no">390</span><span id="line-390">      return true;</span>
+<span class="source-line-no">391</span><span id="line-391">    }</span>
+<span class="source-line-no">392</span><span id="line-392">    if (!(obj instanceof FilterListWithAND)) {</span>
+<span class="source-line-no">393</span><span id="line-393">      return false;</span>
+<span class="source-line-no">394</span><span id="line-394">    }</span>
+<span class="source-line-no">395</span><span id="line-395">    FilterListWithAND f = (FilterListWithAND) obj;</span>
+<span class="source-line-no">396</span><span id="line-396">    return this.filters.equals(f.getFilters()) &amp;&amp; this.seekHintFilters.equals(f.seekHintFilters);</span>
+<span class="source-line-no">397</span><span id="line-397">  }</span>
+<span class="source-line-no">398</span><span id="line-398"></span>
+<span class="source-line-no">399</span><span id="line-399">  @Override</span>
+<span class="source-line-no">400</span><span id="line-400">  public int hashCode() {</span>
+<span class="source-line-no">401</span><span id="line-401">    return Objects.hash(this.seekHintFilters, this.filters);</span>
+<span class="source-line-no">402</span><span id="line-402">  }</span>
+<span class="source-line-no">403</span><span id="line-403">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
index 7d8c580361d..c6e354efaa7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/FilterListWithOR.html
@@ -405,24 +405,76 @@
 <span class="source-line-no">392</span><span id="line-392">    return minKeyHint;</span>
 <span class="source-line-no">393</span><span id="line-393">  }</span>
 <span class="source-line-no">394</span><span id="line-394"></span>
-<span class="source-line-no">395</span><span id="line-395">  @Override</span>
-<span class="source-line-no">396</span><span id="line-396">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">397</span><span id="line-397">    if (this == obj) {</span>
-<span class="source-line-no">398</span><span id="line-398">      return true;</span>
-<span class="source-line-no">399</span><span id="line-399">    }</span>
-<span class="source-line-no">400</span><span id="line-400">    if (!(obj instanceof FilterListWithOR)) {</span>
-<span class="source-line-no">401</span><span id="line-401">      return false;</span>
-<span class="source-line-no">402</span><span id="line-402">    }</span>
-<span class="source-line-no">403</span><span id="line-403">    FilterListWithOR f = (FilterListWithOR) obj;</span>
-<span class="source-line-no">404</span><span id="line-404">    return this.filters.equals(f.getFilters()) &amp;&amp; this.prevFilterRCList.equals(f.prevFilterRCList)</span>
-<span class="source-line-no">405</span><span id="line-405">      &amp;&amp; this.prevCellList.equals(f.prevCellList);</span>
-<span class="source-line-no">406</span><span id="line-406">  }</span>
-<span class="source-line-no">407</span><span id="line-407"></span>
-<span class="source-line-no">408</span><span id="line-408">  @Override</span>
-<span class="source-line-no">409</span><span id="line-409">  public int hashCode() {</span>
-<span class="source-line-no">410</span><span id="line-410">    return Objects.hash(this.prevFilterRCList, this.prevCellList, this.filters);</span>
-<span class="source-line-no">411</span><span id="line-411">  }</span>
-<span class="source-line-no">412</span><span id="line-412">}</span>
+<span class="source-line-no">395</span><span id="line-395">  /**</span>
+<span class="source-line-no">396</span><span id="line-396">   * Minimal step: return the nearest hint. If any non-terminated sub-filter returns null, the</span>
+<span class="source-line-no">397</span><span id="line-397">   * composite cannot safely skip, so return null.</span>
+<span class="source-line-no">398</span><span id="line-398">   */</span>
+<span class="source-line-no">399</span><span id="line-399">  @Override</span>
+<span class="source-line-no">400</span><span id="line-400">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">401</span><span id="line-401">    if (isEmpty()) {</span>
+<span class="source-line-no">402</span><span id="line-402">      return super.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">403</span><span id="line-403">    }</span>
+<span class="source-line-no">404</span><span id="line-404">    Cell minHint = null;</span>
+<span class="source-line-no">405</span><span id="line-405">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">406</span><span id="line-406">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">407</span><span id="line-407">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">408</span><span id="line-408">        continue;</span>
+<span class="source-line-no">409</span><span id="line-409">      }</span>
+<span class="source-line-no">410</span><span id="line-410">      Cell hint = filter.getHintForRejectedRow(firstRowCell);</span>
+<span class="source-line-no">411</span><span id="line-411">      if (hint == null) {</span>
+<span class="source-line-no">412</span><span id="line-412">        return null;</span>
+<span class="source-line-no">413</span><span id="line-413">      }</span>
+<span class="source-line-no">414</span><span id="line-414">      if (minHint == null || this.compareCell(minHint, hint) &gt; 0) {</span>
+<span class="source-line-no">415</span><span id="line-415">        minHint = hint;</span>
+<span class="source-line-no">416</span><span id="line-416">      }</span>
+<span class="source-line-no">417</span><span id="line-417">    }</span>
+<span class="source-line-no">418</span><span id="line-418">    return minHint;</span>
+<span class="source-line-no">419</span><span id="line-419">  }</span>
+<span class="source-line-no">420</span><span id="line-420"></span>
+<span class="source-line-no">421</span><span id="line-421">  /**</span>
+<span class="source-line-no">422</span><span id="line-422">   * Minimal step: return the nearest skip hint. Null from any sub-filter collapses the entire</span>
+<span class="source-line-no">423</span><span id="line-423">   * result to null.</span>
+<span class="source-line-no">424</span><span id="line-424">   */</span>
+<span class="source-line-no">425</span><span id="line-425">  @Override</span>
+<span class="source-line-no">426</span><span id="line-426">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">427</span><span id="line-427">    if (isEmpty()) {</span>
+<span class="source-line-no">428</span><span id="line-428">      return super.getSkipHint(skippedCell);</span>
+<span class="source-line-no">429</span><span id="line-429">    }</span>
+<span class="source-line-no">430</span><span id="line-430">    Cell minHint = null;</span>
+<span class="source-line-no">431</span><span id="line-431">    for (int i = 0, n = filters.size(); i &lt; n; i++) {</span>
+<span class="source-line-no">432</span><span id="line-432">      Filter filter = filters.get(i);</span>
+<span class="source-line-no">433</span><span id="line-433">      if (filter.filterAllRemaining()) {</span>
+<span class="source-line-no">434</span><span id="line-434">        continue;</span>
+<span class="source-line-no">435</span><span id="line-435">      }</span>
+<span class="source-line-no">436</span><span id="line-436">      Cell hint = filter.getSkipHint(skippedCell);</span>
+<span class="source-line-no">437</span><span id="line-437">      if (hint == null) {</span>
+<span class="source-line-no">438</span><span id="line-438">        return null;</span>
+<span class="source-line-no">439</span><span id="line-439">      }</span>
+<span class="source-line-no">440</span><span id="line-440">      if (minHint == null || this.compareCell(minHint, hint) &gt; 0) {</span>
+<span class="source-line-no">441</span><span id="line-441">        minHint = hint;</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">    }</span>
+<span class="source-line-no">444</span><span id="line-444">    return minHint;</span>
+<span class="source-line-no">445</span><span id="line-445">  }</span>
+<span class="source-line-no">446</span><span id="line-446"></span>
+<span class="source-line-no">447</span><span id="line-447">  @Override</span>
+<span class="source-line-no">448</span><span id="line-448">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">449</span><span id="line-449">    if (this == obj) {</span>
+<span class="source-line-no">450</span><span id="line-450">      return true;</span>
+<span class="source-line-no">451</span><span id="line-451">    }</span>
+<span class="source-line-no">452</span><span id="line-452">    if (!(obj instanceof FilterListWithOR)) {</span>
+<span class="source-line-no">453</span><span id="line-453">      return false;</span>
+<span class="source-line-no">454</span><span id="line-454">    }</span>
+<span class="source-line-no">455</span><span id="line-455">    FilterListWithOR f = (FilterListWithOR) obj;</span>
+<span class="source-line-no">456</span><span id="line-456">    return this.filters.equals(f.getFilters()) &amp;&amp; this.prevFilterRCList.equals(f.prevFilterRCList)</span>
+<span class="source-line-no">457</span><span id="line-457">      &amp;&amp; this.prevCellList.equals(f.prevCellList);</span>
+<span class="source-line-no">458</span><span id="line-458">  }</span>
+<span class="source-line-no">459</span><span id="line-459"></span>
+<span class="source-line-no">460</span><span id="line-460">  @Override</span>
+<span class="source-line-no">461</span><span id="line-461">  public int hashCode() {</span>
+<span class="source-line-no">462</span><span id="line-462">    return Objects.hash(this.prevFilterRCList, this.prevCellList, this.filters);</span>
+<span class="source-line-no">463</span><span id="line-463">  }</span>
+<span class="source-line-no">464</span><span id="line-464">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
index 70dae8a95af..1d8106064c4 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html
@@ -186,53 +186,76 @@
 <span class="source-line-no">173</span><span id="line-173">    return PrivateCellUtil.createFirstOnRowCol(cell, hint, 0, hint.length);</span>
 <span class="source-line-no">174</span><span id="line-174">  }</span>
 <span class="source-line-no">175</span><span id="line-175"></span>
-<span class="source-line-no">176</span><span id="line-176">  public TreeSet&lt;byte[]&gt; createTreeSet() {</span>
-<span class="source-line-no">177</span><span id="line-177">    return new TreeSet&lt;&gt;(new Comparator&lt;Object&gt;() {</span>
-<span class="source-line-no">178</span><span id="line-178">      @Override</span>
-<span class="source-line-no">179</span><span id="line-179">      public int compare(Object o1, Object o2) {</span>
-<span class="source-line-no">180</span><span id="line-180">        if (o1 == null || o2 == null) throw new IllegalArgumentException("prefixes can't be null");</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">        byte[] b1 = (byte[]) o1;</span>
-<span class="source-line-no">183</span><span id="line-183">        byte[] b2 = (byte[]) o2;</span>
-<span class="source-line-no">184</span><span id="line-184">        return Bytes.compareTo(b1, 0, b1.length, b2, 0, b2.length);</span>
-<span class="source-line-no">185</span><span id="line-185">      }</span>
-<span class="source-line-no">186</span><span id="line-186">    });</span>
-<span class="source-line-no">187</span><span id="line-187">  }</span>
-<span class="source-line-no">188</span><span id="line-188"></span>
-<span class="source-line-no">189</span><span id="line-189">  @Override</span>
-<span class="source-line-no">190</span><span id="line-190">  public String toString() {</span>
-<span class="source-line-no">191</span><span id="line-191">    return toString(MAX_LOG_PREFIXES);</span>
-<span class="source-line-no">192</span><span id="line-192">  }</span>
-<span class="source-line-no">193</span><span id="line-193"></span>
-<span class="source-line-no">194</span><span id="line-194">  protected String toString(int maxPrefixes) {</span>
-<span class="source-line-no">195</span><span id="line-195">    StringBuilder prefixes = new StringBuilder();</span>
-<span class="source-line-no">196</span><span id="line-196"></span>
-<span class="source-line-no">197</span><span id="line-197">    int count = 0;</span>
-<span class="source-line-no">198</span><span id="line-198">    for (byte[] ba : this.sortedPrefixes) {</span>
-<span class="source-line-no">199</span><span id="line-199">      if (count &gt;= maxPrefixes) {</span>
-<span class="source-line-no">200</span><span id="line-200">        break;</span>
-<span class="source-line-no">201</span><span id="line-201">      }</span>
-<span class="source-line-no">202</span><span id="line-202">      ++count;</span>
-<span class="source-line-no">203</span><span id="line-203">      prefixes.append(Bytes.toStringBinary(ba));</span>
-<span class="source-line-no">204</span><span id="line-204">      if (count &lt; this.sortedPrefixes.size() &amp;&amp; count &lt; maxPrefixes) {</span>
-<span class="source-line-no">205</span><span id="line-205">        prefixes.append(", ");</span>
-<span class="source-line-no">206</span><span id="line-206">      }</span>
-<span class="source-line-no">207</span><span id="line-207">    }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(), count,</span>
-<span class="source-line-no">210</span><span id="line-210">      this.sortedPrefixes.size(), prefixes.toString());</span>
-<span class="source-line-no">211</span><span id="line-211">  }</span>
-<span class="source-line-no">212</span><span id="line-212"></span>
-<span class="source-line-no">213</span><span id="line-213">  @Override</span>
-<span class="source-line-no">214</span><span id="line-214">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">215</span><span id="line-215">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
-<span class="source-line-no">216</span><span id="line-216">  }</span>
-<span class="source-line-no">217</span><span id="line-217"></span>
-<span class="source-line-no">218</span><span id="line-218">  @Override</span>
-<span class="source-line-no">219</span><span id="line-219">  public int hashCode() {</span>
-<span class="source-line-no">220</span><span id="line-220">    return Objects.hash(this.sortedPrefixes);</span>
-<span class="source-line-no">221</span><span id="line-221">  }</span>
-<span class="source-line-no">222</span><span id="line-222">}</span>
+<span class="source-line-no">176</span><span id="line-176">  @Override</span>
+<span class="source-line-no">177</span><span id="line-177">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">178</span><span id="line-178">    if (sortedPrefixes.isEmpty()) {</span>
+<span class="source-line-no">179</span><span id="line-179">      return null;</span>
+<span class="source-line-no">180</span><span id="line-180">    }</span>
+<span class="source-line-no">181</span><span id="line-181">    byte[] qualifier = CellUtil.cloneQualifier(skippedCell);</span>
+<span class="source-line-no">182</span><span id="line-182">    TreeSet&lt;byte[]&gt; lesserOrEqual = (TreeSet&lt;byte[]&gt;) sortedPrefixes.headSet(qualifier, true);</span>
+<span class="source-line-no">183</span><span id="line-183">    byte[] target;</span>
+<span class="source-line-no">184</span><span id="line-184">    if (lesserOrEqual.isEmpty()) {</span>
+<span class="source-line-no">185</span><span id="line-185">      target = sortedPrefixes.first();</span>
+<span class="source-line-no">186</span><span id="line-186">    } else {</span>
+<span class="source-line-no">187</span><span id="line-187">      byte[] largest = lesserOrEqual.last();</span>
+<span class="source-line-no">188</span><span id="line-188">      if (Bytes.startsWith(qualifier, largest)) {</span>
+<span class="source-line-no">189</span><span id="line-189">        return null;</span>
+<span class="source-line-no">190</span><span id="line-190">      }</span>
+<span class="source-line-no">191</span><span id="line-191">      target = sortedPrefixes.higher(largest);</span>
+<span class="source-line-no">192</span><span id="line-192">      if (target == null) {</span>
+<span class="source-line-no">193</span><span id="line-193">        return null;</span>
+<span class="source-line-no">194</span><span id="line-194">      }</span>
+<span class="source-line-no">195</span><span id="line-195">    }</span>
+<span class="source-line-no">196</span><span id="line-196">    return PrivateCellUtil.createFirstOnRowCol(skippedCell, target, 0, target.length);</span>
+<span class="source-line-no">197</span><span id="line-197">  }</span>
+<span class="source-line-no">198</span><span id="line-198"></span>
+<span class="source-line-no">199</span><span id="line-199">  public TreeSet&lt;byte[]&gt; createTreeSet() {</span>
+<span class="source-line-no">200</span><span id="line-200">    return new TreeSet&lt;&gt;(new Comparator&lt;Object&gt;() {</span>
+<span class="source-line-no">201</span><span id="line-201">      @Override</span>
+<span class="source-line-no">202</span><span id="line-202">      public int compare(Object o1, Object o2) {</span>
+<span class="source-line-no">203</span><span id="line-203">        if (o1 == null || o2 == null) throw new IllegalArgumentException("prefixes can't be null");</span>
+<span class="source-line-no">204</span><span id="line-204"></span>
+<span class="source-line-no">205</span><span id="line-205">        byte[] b1 = (byte[]) o1;</span>
+<span class="source-line-no">206</span><span id="line-206">        byte[] b2 = (byte[]) o2;</span>
+<span class="source-line-no">207</span><span id="line-207">        return Bytes.compareTo(b1, 0, b1.length, b2, 0, b2.length);</span>
+<span class="source-line-no">208</span><span id="line-208">      }</span>
+<span class="source-line-no">209</span><span id="line-209">    });</span>
+<span class="source-line-no">210</span><span id="line-210">  }</span>
+<span class="source-line-no">211</span><span id="line-211"></span>
+<span class="source-line-no">212</span><span id="line-212">  @Override</span>
+<span class="source-line-no">213</span><span id="line-213">  public String toString() {</span>
+<span class="source-line-no">214</span><span id="line-214">    return toString(MAX_LOG_PREFIXES);</span>
+<span class="source-line-no">215</span><span id="line-215">  }</span>
+<span class="source-line-no">216</span><span id="line-216"></span>
+<span class="source-line-no">217</span><span id="line-217">  protected String toString(int maxPrefixes) {</span>
+<span class="source-line-no">218</span><span id="line-218">    StringBuilder prefixes = new StringBuilder();</span>
+<span class="source-line-no">219</span><span id="line-219"></span>
+<span class="source-line-no">220</span><span id="line-220">    int count = 0;</span>
+<span class="source-line-no">221</span><span id="line-221">    for (byte[] ba : this.sortedPrefixes) {</span>
+<span class="source-line-no">222</span><span id="line-222">      if (count &gt;= maxPrefixes) {</span>
+<span class="source-line-no">223</span><span id="line-223">        break;</span>
+<span class="source-line-no">224</span><span id="line-224">      }</span>
+<span class="source-line-no">225</span><span id="line-225">      ++count;</span>
+<span class="source-line-no">226</span><span id="line-226">      prefixes.append(Bytes.toStringBinary(ba));</span>
+<span class="source-line-no">227</span><span id="line-227">      if (count &lt; this.sortedPrefixes.size() &amp;&amp; count &lt; maxPrefixes) {</span>
+<span class="source-line-no">228</span><span id="line-228">        prefixes.append(", ");</span>
+<span class="source-line-no">229</span><span id="line-229">      }</span>
+<span class="source-line-no">230</span><span id="line-230">    }</span>
+<span class="source-line-no">231</span><span id="line-231"></span>
+<span class="source-line-no">232</span><span id="line-232">    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(), count,</span>
+<span class="source-line-no">233</span><span id="line-233">      this.sortedPrefixes.size(), prefixes.toString());</span>
+<span class="source-line-no">234</span><span id="line-234">  }</span>
+<span class="source-line-no">235</span><span id="line-235"></span>
+<span class="source-line-no">236</span><span id="line-236">  @Override</span>
+<span class="source-line-no">237</span><span id="line-237">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">238</span><span id="line-238">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">239</span><span id="line-239">  }</span>
+<span class="source-line-no">240</span><span id="line-240"></span>
+<span class="source-line-no">241</span><span id="line-241">  @Override</span>
+<span class="source-line-no">242</span><span id="line-242">  public int hashCode() {</span>
+<span class="source-line-no">243</span><span id="line-243">    return Objects.hash(this.sortedPrefixes);</span>
+<span class="source-line-no">244</span><span id="line-244">  }</span>
+<span class="source-line-no">245</span><span id="line-245">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
index c31191a7d0a..31a0f1e52fc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/SkipFilter.html
@@ -155,25 +155,35 @@
 <span class="source-line-no">142</span><span id="line-142">  }</span>
 <span class="source-line-no">143</span><span id="line-143"></span>
 <span class="source-line-no">144</span><span id="line-144">  @Override</span>
-<span class="source-line-no">145</span><span id="line-145">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">146</span><span id="line-146">    return filter.isFamilyEssential(name);</span>
+<span class="source-line-no">145</span><span id="line-145">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">146</span><span id="line-146">    return filter.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">147</span><span id="line-147">  }</span>
 <span class="source-line-no">148</span><span id="line-148"></span>
 <span class="source-line-no">149</span><span id="line-149">  @Override</span>
-<span class="source-line-no">150</span><span id="line-150">  public String toString() {</span>
-<span class="source-line-no">151</span><span id="line-151">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
+<span class="source-line-no">150</span><span id="line-150">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">151</span><span id="line-151">    return filter.getSkipHint(skippedCell);</span>
 <span class="source-line-no">152</span><span id="line-152">  }</span>
 <span class="source-line-no">153</span><span id="line-153"></span>
 <span class="source-line-no">154</span><span id="line-154">  @Override</span>
-<span class="source-line-no">155</span><span id="line-155">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">156</span><span id="line-156">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">155</span><span id="line-155">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">156</span><span id="line-156">    return filter.isFamilyEssential(name);</span>
 <span class="source-line-no">157</span><span id="line-157">  }</span>
 <span class="source-line-no">158</span><span id="line-158"></span>
 <span class="source-line-no">159</span><span id="line-159">  @Override</span>
-<span class="source-line-no">160</span><span id="line-160">  public int hashCode() {</span>
-<span class="source-line-no">161</span><span id="line-161">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">160</span><span id="line-160">  public String toString() {</span>
+<span class="source-line-no">161</span><span id="line-161">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
 <span class="source-line-no">162</span><span id="line-162">  }</span>
-<span class="source-line-no">163</span><span id="line-163">}</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Override</span>
+<span class="source-line-no">165</span><span id="line-165">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">166</span><span id="line-166">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">167</span><span id="line-167">  }</span>
+<span class="source-line-no">168</span><span id="line-168"></span>
+<span class="source-line-no">169</span><span id="line-169">  @Override</span>
+<span class="source-line-no">170</span><span id="line-170">  public int hashCode() {</span>
+<span class="source-line-no">171</span><span id="line-171">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">172</span><span id="line-172">  }</span>
+<span class="source-line-no">173</span><span id="line-173">}</span>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
index 27cdc423769..fb13514183d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/WhileMatchFilter.html
@@ -153,25 +153,35 @@
 <span class="source-line-no">140</span><span id="line-140">  }</span>
 <span class="source-line-no">141</span><span id="line-141"></span>
 <span class="source-line-no">142</span><span id="line-142">  @Override</span>
-<span class="source-line-no">143</span><span id="line-143">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
-<span class="source-line-no">144</span><span id="line-144">    return filter.isFamilyEssential(name);</span>
+<span class="source-line-no">143</span><span id="line-143">  public Cell getHintForRejectedRow(Cell firstRowCell) throws IOException {</span>
+<span class="source-line-no">144</span><span id="line-144">    return filter.getHintForRejectedRow(firstRowCell);</span>
 <span class="source-line-no">145</span><span id="line-145">  }</span>
 <span class="source-line-no">146</span><span id="line-146"></span>
 <span class="source-line-no">147</span><span id="line-147">  @Override</span>
-<span class="source-line-no">148</span><span id="line-148">  public String toString() {</span>
-<span class="source-line-no">149</span><span id="line-149">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
+<span class="source-line-no">148</span><span id="line-148">  public Cell getSkipHint(Cell skippedCell) throws IOException {</span>
+<span class="source-line-no">149</span><span id="line-149">    return filter.getSkipHint(skippedCell);</span>
 <span class="source-line-no">150</span><span id="line-150">  }</span>
 <span class="source-line-no">151</span><span id="line-151"></span>
 <span class="source-line-no">152</span><span id="line-152">  @Override</span>
-<span class="source-line-no">153</span><span id="line-153">  public boolean equals(Object obj) {</span>
-<span class="source-line-no">154</span><span id="line-154">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">153</span><span id="line-153">  public boolean isFamilyEssential(byte[] name) throws IOException {</span>
+<span class="source-line-no">154</span><span id="line-154">    return filter.isFamilyEssential(name);</span>
 <span class="source-line-no">155</span><span id="line-155">  }</span>
 <span class="source-line-no">156</span><span id="line-156"></span>
 <span class="source-line-no">157</span><span id="line-157">  @Override</span>
-<span class="source-line-no">158</span><span id="line-158">  public int hashCode() {</span>
-<span class="source-line-no">159</span><span id="line-159">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">158</span><span id="line-158">  public String toString() {</span>
+<span class="source-line-no">159</span><span id="line-159">    return this.getClass().getSimpleName() + " " + this.filter.toString();</span>
 <span class="source-line-no">160</span><span id="line-160">  }</span>
-<span class="source-line-no">161</span><span id="line-161">}</span>
+<span class="source-line-no">161</span><span id="line-161"></span>
+<span class="source-line-no">162</span><span id="line-162">  @Override</span>
+<span class="source-line-no">163</span><span id="line-163">  public boolean equals(Object obj) {</span>
+<span class="source-line-no">164</span><span id="line-164">    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);</span>
+<span class="source-line-no">165</span><span id="line-165">  }</span>
+<span class="source-line-no">166</span><span id="line-166"></span>
+<span class="source-line-no">167</span><span id="line-167">  @Override</span>
+<span class="source-line-no">168</span><span id="line-168">  public int hashCode() {</span>
+<span class="source-line-no">169</span><span id="line-169">    return Objects.hash(this.filter);</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171">}</span>
 
 
 
diff --git a/docs/acl-matrix/index.html b/docs/acl-matrix/index.html
index d653ea7c195..be49d7086f1 100644
--- a/docs/acl-matrix/index.html
+++ b/docs/acl-matrix/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -67,10 +67,10 @@ In case the table goes out of date, the unit tests which check for accuracy of p
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/amv2/index.html b/docs/amv2/index.html
index 574b11b6902..e8012cb0c2a 100644
--- a/docs/amv2/index.html
+++ b/docs/amv2/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -104,10 +104,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/bulk-loading/index.html b/docs/architecture/bulk-loading/index.html
index 2b3fddf0502..2cf66e71f1d 100644
--- a/docs/architecture/bulk-loading/index.html
+++ b/docs/architecture/bulk-loading/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -70,10 +70,10 @@ every peer(s) cluster RS must be restarted to reload the configuration.</p></div
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/catalog-tables/index.html b/docs/architecture/catalog-tables/index.html
index 6b9189f95a6..977f0b7ada5 100644
--- a/docs/architecture/catalog-tables/index.html
+++ b/docs/architecture/catalog-tables/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -50,10 +50,10 @@ region in the table</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/client-request-filters/index.html b/docs/architecture/client-request-filters/index.html
index 90c9f0668d7..12ba93a50bc 100644
--- a/docs/architecture/client-request-filters/index.html
+++ b/docs/architecture/client-request-filters/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -189,10 +189,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/client/index.html b/docs/architecture/client/index.html
index 87b570439b9..81318f98102 100644
--- a/docs/architecture/client/index.html
+++ b/docs/architecture/client/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -191,10 +191,10 @@ configuration to fallback to the ZooKeeper based connection registry implementat
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/hbase-mob/index.html b/docs/architecture/hbase-mob/index.html
index 54eedfd26ec..e7639dd4ce1 100644
--- a/docs/architecture/hbase-mob/index.html
+++ b/docs/architecture/hbase-mob/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -481,10 +481,10 @@ the MOB stored values for that table or region respectively.</li>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/hdfs/index.html b/docs/architecture/hdfs/index.html
index 6be4f36ff04..6f11aa6abfb 100644
--- a/docs/architecture/hdfs/index.html
+++ b/docs/architecture/hdfs/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -34,10 +34,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/index.html b/docs/architecture/index.html
index df26a5b731d..90cd637626c 100644
--- a/docs/architecture/index.html
+++ b/docs/architecture/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -37,10 +37,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/master/index.html b/docs/architecture/master/index.html
index fa93d495157..7c21147482d 100644
--- a/docs/architecture/master/index.html
+++ b/docs/architecture/master/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -93,10 +93,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/overview/index.html b/docs/architecture/overview/index.html
index a4967c0dcfc..4dbb28e7961 100644
--- a/docs/architecture/overview/index.html
+++ b/docs/architecture/overview/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -50,10 +50,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/regions/index.html b/docs/architecture/regions/index.html
index 4ecdfe4ae8e..e54cefadf3d 100644
--- a/docs/architecture/regions/index.html
+++ b/docs/architecture/regions/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/region_states-D4hoWYLI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="fon [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/region_states-D4hoWYLI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="fon [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -606,10 +606,10 @@ Compaction Algorithm</a>.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/regionserver/index.html b/docs/architecture/regionserver/index.html
index 89f86e8843c..7386ad56350 100644
--- a/docs/architecture/regionserver/index.html
+++ b/docs/architecture/regionserver/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/region_split_process-DrwL5IoS.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/WAL_splitting-DCT3Hgkm.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 9 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/region_split_process-DrwL5IoS.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/WAL_splitting-DCT3Hgkm.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 9 [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -431,10 +431,10 @@ loss/inconsistency as HMaster has no information about previous WAL directory.</
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/snapshot-scanner/index.html b/docs/architecture/snapshot-scanner/index.html
index 43da131c4cb..79c37a51c01 100644
--- a/docs/architecture/snapshot-scanner/index.html
+++ b/docs/architecture/snapshot-scanner/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -104,10 +104,10 @@ false by default for every table, this means the HBase granted ACLs will not be
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/architecture/timeline-consistent-reads/index.html b/docs/architecture/timeline-consistent-reads/index.html
index fbf7007e34f..9036b456a09 100644
--- a/docs/architecture/timeline-consistent-reads/index.html
+++ b/docs/architecture/timeline-consistent-reads/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/timeline_consistency-WFOSacSg.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch"  [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/timeline_consistency-WFOSacSg.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch"  [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -244,10 +244,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/asf/index.html b/docs/asf/index.html
index 7f5e4f4f282..e6ea716b4dc 100644
--- a/docs/asf/index.html
+++ b/docs/asf/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -32,10 +32,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/backup-restore/additional-topics/index.html b/docs/backup-restore/additional-topics/index.html
index da001d959a9..afdd877fba9 100644
--- a/docs/backup-restore/additional-topics/index.html
+++ b/docs/backup-restore/additional-topics/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/backup-app-components-ZN_OfKpI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/backup-app-components-ZN_OfKpI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -249,10 +249,10 @@ which present information for consumption (<a href="https://issues.apache.org/ji
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/backup-restore/administration/index.html b/docs/backup-restore/administration/index.html
index a5cf5ba88a3..4de67472c4a 100644
--- a/docs/backup-restore/administration/index.html
+++ b/docs/backup-restore/administration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -118,10 +118,10 @@ automatically recover on its own.</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/backup-restore/commands/index.html b/docs/backup-restore/commands/index.html
index ff231e139b8..b8b4ca56955 100644
--- a/docs/backup-restore/commands/index.html
+++ b/docs/backup-restore/commands/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -177,10 +177,10 @@ case of failure on the primary cluster.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/backup-restore/index.html b/docs/backup-restore/index.html
index aba549d3c5b..6a7f6280564 100644
--- a/docs/backup-restore/index.html
+++ b/docs/backup-restore/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -29,10 +29,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/backup-restore/overview/index.html b/docs/backup-restore/overview/index.html
index b554a4395d9..06aed61d85c 100644
--- a/docs/backup-restore/overview/index.html
+++ b/docs/backup-restore/overview/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/backup-intra-cluster-VtQszuA-.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/backup-dedicated-cluster-BDX3WGln.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/backup-intra-cluster-VtQszuA-.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/backup-dedicated-cluster-BDX3WGln.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200 [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -140,10 +140,10 @@ literal text which should be added to hbase-site.xml.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/announcing/index.html b/docs/building-and-developing/announcing/index.html
index 6bfa3858aec..d65fc21eead 100644
--- a/docs/building-and-developing/announcing/index.html
+++ b/docs/building-and-developing/announcing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -63,10 +63,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/building/index.html b/docs/building-and-developing/building/index.html
index 06b060c81e9..cf8cd1031e8 100644
--- a/docs/building-and-developing/building/index.html
+++ b/docs/building-and-developing/building/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -180,10 +180,10 @@ protobuf later, then we don&#x27;t have to add the profile &#x27;-Paarch64&#x27;
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/developer-guidelines/index.html b/docs/building-and-developing/developer-guidelines/index.html
index 9e8ee00d8a9..bc127fff72d 100644
--- a/docs/building-and-developing/developer-guidelines/index.html
+++ b/docs/building-and-developing/developer-guidelines/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -583,10 +583,10 @@ for developing new HBase-related Maven archetypes, please see
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/generating-documentation/index.html b/docs/building-and-developing/generating-documentation/index.html
index 8d6483795e6..ab8b0d2dabe 100644
--- a/docs/building-and-developing/generating-documentation/index.html
+++ b/docs/building-and-developing/generating-documentation/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -32,10 +32,10 @@ See <a href="/docs/contributing-to-documentation" data-discover="true">appendix
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/getting-involved/index.html b/docs/building-and-developing/getting-involved/index.html
index 995b70b0517..965b250a553 100644
--- a/docs/building-and-developing/getting-involved/index.html
+++ b/docs/building-and-developing/getting-involved/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -137,10 +137,10 @@ a similar issue in the future.</li>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/ides/index.html b/docs/building-and-developing/ides/index.html
index 51f853e236e..17cdad56e81 100644
--- a/docs/building-and-developing/ides/index.html
+++ b/docs/building-and-developing/ides/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -119,10 +119,10 @@ documenting your setup process here.</p></div><a href="https://github.com/apache
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/index.html b/docs/building-and-developing/index.html
index 284f67faccf..3fde27befa7 100644
--- a/docs/building-and-developing/index.html
+++ b/docs/building-and-developing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -30,10 +30,10 @@ Being familiar with these guidelines will help the HBase committers to use your
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/releasing/index.html b/docs/building-and-developing/releasing/index.html
index b63214c374d..5cbd3f922c6 100644
--- a/docs/building-and-developing/releasing/index.html
+++ b/docs/building-and-developing/releasing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -219,10 +219,10 @@ It will put a snapshot up into the apache snapshot repository for you.</p></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/repositories/index.html b/docs/building-and-developing/repositories/index.html
index 5598566a8ef..51cd709e078 100644
--- a/docs/building-and-developing/repositories/index.html
+++ b/docs/building-and-developing/repositories/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -37,10 +37,10 @@ These are the following:</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/tests/index.html b/docs/building-and-developing/tests/index.html
index 74b2da57530..c8a361c1101 100644
--- a/docs/building-and-developing/tests/index.html
+++ b/docs/building-and-developing/tests/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -577,10 +577,10 @@ just run as the <em>slowDeterministic</em> policy
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/updating-landing/index.html b/docs/building-and-developing/updating-landing/index.html
index b93f51c196b..6a0d9339df8 100644
--- a/docs/building-and-developing/updating-landing/index.html
+++ b/docs/building-and-developing/updating-landing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -32,10 +32,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/building-and-developing/voting/index.html b/docs/building-and-developing/voting/index.html
index ad7ca8b6ea1..75af8a9c986 100644
--- a/docs/building-and-developing/voting/index.html
+++ b/docs/building-and-developing/voting/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -97,10 +97,10 @@ for how we arrived at this process.</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/bulk-data-generator-tool/index.html b/docs/bulk-data-generator-tool/index.html
index 0068b0c02d9..a1b6f8c266f 100644
--- a/docs/bulk-data-generator-tool/index.html
+++ b/docs/bulk-data-generator-tool/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -70,10 +70,10 @@ TOOL_EVENT_ID suffix and other columns of the row are populated with random data
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/case-studies/index.html b/docs/case-studies/index.html
index 1749f486ed0..7f0dd194899 100644
--- a/docs/case-studies/index.html
+++ b/docs/case-studies/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -124,10 +124,10 @@ Although this research is on an older version of the codebase, this writeup is s
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/community/index.html b/docs/community/index.html
index 7be045998bb..e1a7395c3f2 100644
--- a/docs/community/index.html
+++ b/docs/community/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -53,10 +53,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/compression/index.html b/docs/compression/index.html
index 16aa4788906..db23956083a 100644
--- a/docs/compression/index.html
+++ b/docs/compression/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/data_block_no_encoding-BRNLFT3D.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/data_block_prefix_encoding-DX9fSxyO.png" imageSizes="(max-width: 768px) 100vw, (max-width:  [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/data_block_no_encoding-BRNLFT3D.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/data_block_prefix_encoding-DX9fSxyO.png" imageSizes="(max-width: 768px) 100vw, (max-width:  [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -408,10 +408,10 @@ Following is an example using HBase Shell:</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/basic-prerequisites/index.html b/docs/configuration/basic-prerequisites/index.html
index 6371003ebcc..217186440f1 100644
--- a/docs/configuration/basic-prerequisites/index.html
+++ b/docs/configuration/basic-prerequisites/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -132,10 +132,10 @@ HBase appears hung.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/confirm/index.html b/docs/configuration/confirm/index.html
index 980d6440673..0888f8a4b61 100644
--- a/docs/configuration/confirm/index.html
+++ b/docs/configuration/confirm/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -40,10 +40,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/default/index.html b/docs/configuration/default/index.html
index 71ca006de21..472ddf6167d 100644
--- a/docs/configuration/default/index.html
+++ b/docs/configuration/default/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -806,10 +806,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/dynamic/index.html b/docs/configuration/dynamic/index.html
index e686c3e41c2..0a2037c4df1 100644
--- a/docs/configuration/dynamic/index.html
+++ b/docs/configuration/dynamic/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -32,10 +32,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/example/index.html b/docs/configuration/example/index.html
index a1e206cc4f3..3d1b2151430 100644
--- a/docs/configuration/example/index.html
+++ b/docs/configuration/example/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -80,10 +80,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/hbase-run-models/index.html b/docs/configuration/hbase-run-models/index.html
index 90839180070..754eecbce7f 100644
--- a/docs/configuration/hbase-run-models/index.html
+++ b/docs/configuration/hbase-run-models/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -107,10 +107,10 @@ information that was originally in this section has been moved there.</p></div><
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/important/index.html b/docs/configuration/important/index.html
index 7a24d100124..90515d73ac4 100644
--- a/docs/configuration/important/index.html
+++ b/docs/configuration/important/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -188,10 +188,10 @@ API</a>.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/configuration/index.html b/docs/configuration/index.html
index 948a965e58b..cebbd96afc5 100644
--- a/docs/configuration/index.html
+++ b/docs/configuration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -54,10 +54,10 @@ configuration is an exception to this, to be described later below.</p></div></d
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/contributing-to-documentation/index.html b/docs/contributing-to-documentation/index.html
index ce63f13d84c..302011584f6 100644
--- a/docs/contributing-to-documentation/index.html
+++ b/docs/contributing-to-documentation/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -182,10 +182,10 @@ number to the name of the new patch.</p></div><div class="fd-step">After a chang
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/cp/index.html b/docs/cp/index.html
index fd25155c3d0..5d0a6a22733 100644
--- a/docs/cp/index.html
+++ b/docs/cp/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -660,10 +660,10 @@ set: <code>arg1=1,arg2=2</code>. These could have been added to <code>hbase-site
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/datamodel/index.html b/docs/datamodel/index.html
index aaed619b209..11e4605c86c 100644
--- a/docs/datamodel/index.html
+++ b/docs/datamodel/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -395,10 +395,10 @@ Lars Hofhansl has also written a note on <a href="http://hadoop-hbase.blogspot.c
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/external-apis/index.html b/docs/external-apis/index.html
index 76012c71a32..0ce412faa39 100644
--- a/docs/external-apis/index.html
+++ b/docs/external-apis/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -1025,10 +1025,10 @@ non-Base64 encoded cell name.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/faq/index.html b/docs/faq/index.html
index a014a6a3ebf..616a0593af6 100644
--- a/docs/faq/index.html
+++ b/docs/faq/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -98,10 +98,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html
index 2908029cca7..d91f482c8c5 100644
--- a/docs/getting-started/index.html
+++ b/docs/getting-started/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -157,10 +157,10 @@ about ZooKeeper configuration, including using an external ZooKeeper instance wi
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/hbase-apis/index.html b/docs/hbase-apis/index.html
index be56abeabb7..18f956c15fc 100644
--- a/docs/hbase-apis/index.html
+++ b/docs/hbase-apis/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -122,10 +122,10 @@ See <a href="/docs/external-apis" data-discover="true">Apache HBase External API
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/hbase-history/index.html b/docs/hbase-history/index.html
index 58a920f4fbe..9421061eff9 100644
--- a/docs/hbase-history/index.html
+++ b/docs/hbase-history/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -34,10 +34,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/hbase-incompatibilities/index.html b/docs/hbase-incompatibilities/index.html
index 5b28b051d51..a3abb4839cc 100644
--- a/docs/hbase-incompatibilities/index.html
+++ b/docs/hbase-incompatibilities/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -349,10 +349,10 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/hbtop/index.html b/docs/hbtop/index.html
index 1ece1107914..f765f7b4c44 100644
--- a/docs/hbtop/index.html
+++ b/docs/hbtop/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/top_screen-CWb803TC.gif" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/scrolling_metric_records-DdLjDZmk.gif" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw,  [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/top_screen-CWb803TC.gif" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/scrolling_metric_records-DdLjDZmk.gif" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw,  [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -107,10 +107,10 @@ The top screen is refreshed in a certain period – 3 seconds by default.</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/hfile-format/index.html b/docs/hfile-format/index.html
index 57f1da0b12a..61411b5fe63 100644
--- a/docs/hfile-format/index.html
+++ b/docs/hfile-format/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/hfile-DV-hIcTP.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/hfilev2-O8X0wV-5.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/hfile-DV-hIcTP.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/hfilev2-O8X0wV-5.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority=" [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -239,10 +239,10 @@ For more information see <a href="/docs/security/data-access#transparent-encrypt
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/index.html b/docs/index.html
index e8e97093d09..ead701c8295 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -83,10 +83,10 @@ such features or use patterns.</p></div><a href="https://github.com/apache/hbase
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/inmemory-compaction/index.html b/docs/inmemory-compaction/index.html
index 0513011d5bb..4b041ff52d2 100644
--- a/docs/inmemory-compaction/index.html
+++ b/docs/inmemory-compaction/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -90,10 +90,10 @@ family Store named <em>family</em> configured to use a <em>CompactingMemStore</e
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/mapreduce/index.html b/docs/mapreduce/index.html
index 73294cb3f6e..69b9ba61c86 100644
--- a/docs/mapreduce/index.html
+++ b/docs/mapreduce/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -432,10 +432,10 @@ Especially for longer running jobs, speculative execution will create duplicate
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/offheap-read-write/index.html b/docs/offheap-read-write/index.html
index 48ae2302335..1bb75458f98 100644
--- a/docs/offheap-read-write/index.html
+++ b/docs/offheap-read-write/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/offheap-overview-DTGpchw3.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/bytebuff-allocator-stats-B7DU8asJ.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px)  [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/offheap-overview-DTGpchw3.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/bytebuff-allocator-stats-B7DU8asJ.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px)  [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -173,10 +173,10 @@ regions are selected for forced flushes.</p></div><a href="https://github.com/ap
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/backup-and-snapshots/index.html b/docs/operational-management/backup-and-snapshots/index.html
index 862647e893d..8fde91299f0 100644
--- a/docs/operational-management/backup-and-snapshots/index.html
+++ b/docs/operational-management/backup-and-snapshots/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -181,10 +181,10 @@ Storage</a>.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/cluster-replication/index.html b/docs/operational-management/cluster-replication/index.html
index f35a3b4c0bc..2786ba242a1 100644
--- a/docs/operational-management/cluster-replication/index.html
+++ b/docs/operational-management/cluster-replication/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/hbase_replication_diagram-pmf_4kSh.jpg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/replication_overview-CONFSRqj.png" imageSizes="(max-width: 768px) 100vw, (max-width: 120 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/hbase_replication_diagram-pmf_4kSh.jpg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/replication_overview-CONFSRqj.png" imageSizes="(max-width: 768px) 100vw, (max-width: 120 [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -373,10 +373,10 @@ in favor of discussions about cluster topologies appropriate for different scena
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/index.html b/docs/operational-management/index.html
index 0031e7f05a0..b09fce17fab 100644
--- a/docs/operational-management/index.html
+++ b/docs/operational-management/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -29,10 +29,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/metrics-and-monitoring/index.html b/docs/operational-management/metrics-and-monitoring/index.html
index bfe5092dc06..9874557ef22 100644
--- a/docs/operational-management/metrics-and-monitoring/index.html
+++ b/docs/operational-management/metrics-and-monitoring/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/bc_basic-BTMl5eCr.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/bc_config-Ceg8MoFC.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPrior [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/bc_basic-BTMl5eCr.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/bc_config-Ceg8MoFC.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPrior [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -410,10 +410,10 @@ recommended to turn on this feature only during debugging.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/node/index.html b/docs/operational-management/node/index.html
index 66deab53807..b76c867507e 100644
--- a/docs/operational-management/node/index.html
+++ b/docs/operational-management/node/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -126,10 +126,10 @@ the datanode.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/region-and-capacity/index.html b/docs/operational-management/region-and-capacity/index.html
index f97bbf36281..99ed073d58d 100644
--- a/docs/operational-management/region-and-capacity/index.html
+++ b/docs/operational-management/region-and-capacity/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -273,10 +273,10 @@ Administration</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/running-multiple-workloads-on-a-single-cluster/index.html b/docs/operational-management/running-multiple-workloads-on-a-single-cluster/index.html
index 55fa0b8a7dc..7ae03c37513 100644
--- a/docs/operational-management/running-multiple-workloads-on-a-single-cluster/index.html
+++ b/docs/operational-management/running-multiple-workloads-on-a-single-cluster/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -205,10 +205,10 @@ will always return false.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/table-rename/index.html b/docs/operational-management/table-rename/index.html
index a070215547b..21adcfa0838 100644
--- a/docs/operational-management/table-rename/index.html
+++ b/docs/operational-management/table-rename/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -44,10 +44,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/operational-management/tools/index.html b/docs/operational-management/tools/index.html
index 7a617866fc1..a955911c2f5 100644
--- a/docs/operational-management/tools/index.html
+++ b/docs/operational-management/tools/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -693,10 +693,10 @@ tables/regions/families target for a given compaction run.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/orca/index.html b/docs/orca/index.html
index 363be66c00c..ecea1900bbb 100644
--- a/docs/orca/index.html
+++ b/docs/orca/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/large-logo-CXfkkzJH.svg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/dark-theme-large-logo-BoBjg19n.svg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/large-logo-CXfkkzJH.svg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/dark-theme-large-logo-BoBjg19n.svg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900 [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -35,10 +35,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/other-info/index.html b/docs/other-info/index.html
index ce452f120bc..9271c54c847 100644
--- a/docs/other-info/index.html
+++ b/docs/other-info/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -53,10 +53,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/performance/index.html b/docs/performance/index.html
index 04034d0365e..6ebbd6507f0 100644
--- a/docs/performance/index.html
+++ b/docs/performance/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -376,10 +376,10 @@ HDFS files open all the time, this can add up quickly.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/profiler/index.html b/docs/profiler/index.html
index 9c88432b051..6b15f198b85 100644
--- a/docs/profiler/index.html
+++ b/docs/profiler/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -93,10 +93,10 @@ or direct interaction with the infoserver.</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/protobuf/index.html b/docs/protobuf/index.html
index cf8feec1e65..a09f8d819b3 100644
--- a/docs/protobuf/index.html
+++ b/docs/protobuf/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -185,10 +185,10 @@ plugin.</p></div><a href="https://github.com/apache/hbase/edit/master/hbase-webs
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/pv2/index.html b/docs/pv2/index.html
index 4a690a33fea..ac6404d5b04 100644
--- a/docs/pv2/index.html
+++ b/docs/pv2/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -125,10 +125,10 @@ It is easy to confuse the state that the Procedure itself is keeping with that o
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/regionserver-sizing/index.html b/docs/regionserver-sizing/index.html
index 64794e4d7a5..fea20359146 100644
--- a/docs/regionserver-sizing/index.html
+++ b/docs/regionserver-sizing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -675,10 +675,10 @@ for more information.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/rpc/index.html b/docs/rpc/index.html
index d88b61c346c..befae1eb02d 100644
--- a/docs/rpc/index.html
+++ b/docs/rpc/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -159,10 +159,10 @@ The server will return cellblocks compressed using this same compressor as long
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/schema-design/index.html b/docs/schema-design/index.html
index 0c32107bab4..652d82a1d8a 100644
--- a/docs/schema-design/index.html
+++ b/docs/schema-design/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -63,10 +63,10 @@ table to be disabled.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/client-access/index.html b/docs/security/client-access/index.html
index 3921fc0b857..45efcc70af3 100644
--- a/docs/security/client-access/index.html
+++ b/docs/security/client-access/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -229,10 +229,10 @@ work with Thrift framed transport at this time.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/data-access/index.html b/docs/security/data-access/index.html
index 0f4c8f32286..e8b56c8c1b5 100644
--- a/docs/security/data-access/index.html
+++ b/docs/security/data-access/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -496,10 +496,10 @@ any more. Just set hbase.regionserver.wal.encryption to true is enough to enable
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/example/index.html b/docs/security/example/index.html
index 3478f1765e4..2d03a7ed2c4 100644
--- a/docs/security/example/index.html
+++ b/docs/security/example/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -146,10 +146,10 @@ any more. Just set hbase.regionserver.wal.encryption to true is enough to enable
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/hdfs-and-zookeeper-access/index.html b/docs/security/hdfs-and-zookeeper-access/index.html
index f1034e710ac..d4dc7d41b65 100644
--- a/docs/security/hdfs-and-zookeeper-access/index.html
+++ b/docs/security/hdfs-and-zookeeper-access/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -36,10 +36,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/index.html b/docs/security/index.html
index 61008998aa1..027a0ae1e2b 100644
--- a/docs/security/index.html
+++ b/docs/security/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -34,10 +34,10 @@ contact you to follow up on your report.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/tls/index.html b/docs/security/tls/index.html
index 536b83b1f48..1ca1066da4d 100644
--- a/docs/security/tls/index.html
+++ b/docs/security/tls/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -172,10 +172,10 @@ inter-cluster replication.</p></div></div></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/user-access/index.html b/docs/security/user-access/index.html
index 6427cab845c..2f878e30f01 100644
--- a/docs/security/user-access/index.html
+++ b/docs/security/user-access/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -94,10 +94,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/security/web-ui/index.html b/docs/security/web-ui/index.html
index 874c4df96f7..31091d3ff62 100644
--- a/docs/security/web-ui/index.html
+++ b/docs/security/web-ui/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -187,10 +187,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/shell/index.html b/docs/shell/index.html
index 943ce1c016d..0faef08dc93 100644
--- a/docs/shell/index.html
+++ b/docs/shell/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -324,10 +324,10 @@ Default is to fetch one row at a time.</p></div><a href="https://github.com/apac
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/single-page/index.html b/docs/single-page/index.html
index 7679feb6af2..30199f4a853 100644
--- a/docs/single-page/index.html
+++ b/docs/single-page/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/large-logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-large-logo.svg"/><link rel="preload" as="image" href="/assets/region_split_process-DrwL5IoS.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><li [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/large-logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-large-logo.svg"/><link rel="preload" as="image" href="/assets/region_split_process-DrwL5IoS.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><li [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -18132,10 +18132,10 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/spark/index.html b/docs/spark/index.html
index 357db6d13bc..9f381b63d92 100644
--- a/docs/spark/index.html
+++ b/docs/spark/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -569,10 +569,10 @@ user to execute SQL queries.</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/sql/index.html b/docs/sql/index.html
index 3b29a8dc73b..b4e615d6140 100644
--- a/docs/sql/index.html
+++ b/docs/sql/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -30,10 +30,10 @@
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/store-file-tracking/index.html b/docs/store-file-tracking/index.html
index 5e5feac7660..04bf928c073 100644
--- a/docs/store-file-tracking/index.html
+++ b/docs/store-file-tracking/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -113,10 +113,10 @@ is shown below:</p>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/sync-replication/index.html b/docs/sync-replication/index.html
index 1892e24d23e..d4b3f2de3a2 100644
--- a/docs/sync-replication/index.html
+++ b/docs/sync-replication/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -78,10 +78,10 @@ transiting ACTIVE to STANDBY has no problem, because we&#x27;ll skip to replay t
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/thrift-filter-language/index.html b/docs/thrift-filter-language/index.html
index 2025b6fc675..84d6a9e2f13 100644
--- a/docs/thrift-filter-language/index.html
+++ b/docs/thrift-filter-language/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -215,10 +215,10 @@ It also takes two boolean variables to indicate whether to include the minColumn
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/tracing/index.html b/docs/tracing/index.html
index 97a2015d772..2017dc7d5bc 100644
--- a/docs/tracing/index.html
+++ b/docs/tracing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -46,10 +46,10 @@ to collect and view tracing data instead of logging.</p></div></div></div>
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/troubleshooting/index.html b/docs/troubleshooting/index.html
index 68d1803cb1a..87ab0c136b3 100644
--- a/docs/troubleshooting/index.html
+++ b/docs/troubleshooting/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -802,10 +802,10 @@ of Red Hat Enterprise Linux, according to
       console.error(error);
       sessionStorage.removeItem(storageKey2);
     }
-  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+  })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
 import * as route0 from "/assets/root-DCifVNB4.js";
 import * as route1 from "/assets/docs-layout-DXv1WpCa.js";
-import * as route2 from "/assets/docs-96Mc0fjB.js";
+import * as route2 from "/assets/docs-DkZb4eNt.js";
   
   window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
 
diff --git a/docs/unit-testing/index.html b/docs/unit-testing/index.html
index 5469c22dde9..b791e403390 100644
--- a/docs/unit-testing/index.html
+++ b/docs/unit-testing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e10010b0.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-efc3e3b7.js"/><link rel="mo [...]
               (function() {
                 const theme = localStorage.getItem('theme');
                 const root = document.documentElement;
@@ -306,10 +306,10 @@ integration testing.</p></div></div></div>
       console.error(error);
... 273054 lines suppressed ...