{
  "version": 3,
  "sources": ["../../src/store/reducer.js"],
  "sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { pipe } from '@wordpress/compose';\nimport { combineReducers, select } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport {\n\tstore as blocksStore,\n\tprivateApis as blocksPrivateApis,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { PREFERENCES_DEFAULTS, SETTINGS_DEFAULTS } from './defaults';\nimport { insertAt, moveTo } from './array';\nimport { sectionRootClientIdKey, isIsolatedEditorKey } from './private-keys';\nimport { unlock } from '../lock-unlock';\n\nconst { isContentBlock } = unlock( blocksPrivateApis );\n\nconst identity = ( x ) => x;\n\n/**\n * Given an array of blocks, returns an object where each key is a nesting\n * context, the value of which is an array of block client IDs existing within\n * that nesting context.\n *\n * @param {Array}   blocks       Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockOrder( blocks, rootClientId = '' ) {\n\tconst result = new Map();\n\tconst current = [];\n\tresult.set( rootClientId, current );\n\tblocks.forEach( ( block ) => {\n\t\tconst { clientId, innerBlocks } = block;\n\t\tcurrent.push( clientId );\n\t\tmapBlockOrder( innerBlocks, clientId ).forEach(\n\t\t\t( order, subClientId ) => {\n\t\t\t\tresult.set( subClientId, order );\n\t\t\t}\n\t\t);\n\t} );\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object where each key contains\n * the clientId of the block and the value is the parent of the block.\n *\n * @param {Array}   blocks       Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockParents( blocks, rootClientId = '' ) {\n\tconst result = [];\n\tconst stack = [ [ rootClientId, blocks ] ];\n\twhile ( stack.length ) {\n\t\tconst [ parent, currentBlocks ] = stack.shift();\n\t\tcurrentBlocks.forEach( ( { innerBlocks, ...block } ) => {\n\t\t\tresult.push( [ block.clientId, parent ] );\n\t\t\tif ( innerBlocks?.length ) {\n\t\t\t\tstack.push( [ block.clientId, innerBlocks ] );\n\t\t\t}\n\t\t} );\n\t}\n\treturn result;\n}\n\n/**\n * Helper method to iterate through all blocks, recursing into inner blocks,\n * applying a transformation function to each one.\n * Returns a flattened object with the transformed blocks.\n *\n * @param {Array}    blocks    Blocks to flatten.\n * @param {Function} transform Transforming function to be applied to each block.\n *\n * @return {Array} Flattened object.\n */\nfunction flattenBlocks( blocks, transform = identity ) {\n\tconst result = [];\n\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult.push( [ block.clientId, transform( block ) ] );\n\t}\n\n\treturn result;\n}\n\nfunction getFlattenedClientIds( blocks ) {\n\tconst result = {};\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult[ block.clientId ] = true;\n\t}\n\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object containing all blocks, without\n * attributes, recursing into inner blocks. Keys correspond to the block client\n * ID, the value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlocksWithoutAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => {\n\t\tconst { attributes, ...restBlock } = block;\n\t\treturn restBlock;\n\t} );\n}\n\n/**\n * Given an array of blocks, returns an object containing all block attributes,\n * recursing into inner blocks. Keys correspond to the block client ID, the\n * value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlockAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => block.attributes );\n}\n\n/**\n * Returns true if the two object arguments have the same keys, or false\n * otherwise.\n *\n * @param {Object} a First object.\n * @param {Object} b Second object.\n *\n * @return {boolean} Whether the two objects have the same keys.\n */\nexport function hasSameKeys( a, b ) {\n\treturn fastDeepEqual( Object.keys( a ), Object.keys( b ) );\n}\n\n/**\n * Returns true if, given the currently dispatching action and the previously\n * dispatched action, the two actions are updating the same block attribute, or\n * false otherwise.\n *\n * @param {Object} action     Currently dispatching action.\n * @param {Object} lastAction Previously dispatched action.\n *\n * @return {boolean} Whether actions are updating the same block attribute.\n */\nexport function isUpdatingSameBlockAttribute( action, lastAction ) {\n\treturn (\n\t\taction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tlastAction !== undefined &&\n\t\tlastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tfastDeepEqual( action.clientIds, lastAction.clientIds ) &&\n\t\thasSameKeys( action.attributes, lastAction.attributes )\n\t);\n}\n\nfunction updateBlockTreeForBlocks( state, blocks ) {\n\tconst treeToUpdate = state.tree;\n\tconst stack = [ ...blocks ];\n\tconst flattenedBlocks = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst block = stack.shift();\n\t\tstack.push( ...block.innerBlocks );\n\t\tflattenedBlocks.push( ...block.innerBlocks );\n\t}\n\t// Create objects before mutating them, that way it's always defined.\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set( block.clientId, {} );\n\t}\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set(\n\t\t\tblock.clientId,\n\t\t\tObject.assign( treeToUpdate.get( block.clientId ), {\n\t\t\t\t...state.byClientId.get( block.clientId ),\n\t\t\t\tattributes: state.attributes.get( block.clientId ),\n\t\t\t\tinnerBlocks: block.innerBlocks.map( ( subBlock ) =>\n\t\t\t\t\ttreeToUpdate.get( subBlock.clientId )\n\t\t\t\t),\n\t\t\t} )\n\t\t);\n\t}\n}\n\nfunction updateParentInnerBlocksInTree(\n\tstate,\n\tupdatedClientIds,\n\tupdateChildrenOfUpdatedClientIds = false\n) {\n\tconst treeToUpdate = state.tree;\n\tconst uncontrolledParents = new Set( [] );\n\tconst controlledParents = new Set();\n\tfor ( const clientId of updatedClientIds ) {\n\t\tlet current = updateChildrenOfUpdatedClientIds\n\t\t\t? clientId\n\t\t\t: state.parents.get( clientId );\n\t\tdo {\n\t\t\tif ( state.controlledInnerBlocks[ current ] ) {\n\t\t\t\t// Should stop on controlled blocks.\n\t\t\t\t// If we reach a controlled parent, break out of the loop.\n\t\t\t\tcontrolledParents.add( current );\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// Else continue traversing up through parents.\n\t\t\t\tuncontrolledParents.add( current );\n\t\t\t\tcurrent = state.parents.get( current );\n\t\t\t}\n\t\t} while ( current !== undefined );\n\t}\n\n\t// To make sure the order of assignments doesn't matter,\n\t// we first create empty objects and mutates the inner blocks later.\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.set( clientId, { ...treeToUpdate.get( clientId ) } );\n\t}\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.get( clientId ).innerBlocks = (\n\t\t\tstate.order.get( clientId ) || []\n\t\t).map( ( subClientId ) => treeToUpdate.get( subClientId ) );\n\t}\n\n\t// Controlled parent blocks, need a dedicated key for their inner blocks\n\t// to be used when doing getBlocks( controlledBlockClientId ).\n\tfor ( const clientId of controlledParents ) {\n\t\ttreeToUpdate.set( 'controlled||' + clientId, {\n\t\t\tinnerBlocks: ( state.order.get( clientId ) || [] ).map(\n\t\t\t\t( subClientId ) => treeToUpdate.get( subClientId )\n\t\t\t),\n\t\t} );\n\t}\n}\n\n/**\n * Higher-order reducer intended to compute full block objects key for each block in the post.\n * This is a denormalization to optimize the performance of the getBlock selectors and avoid\n * recomputing the block objects and avoid heavy memoization.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockTree =\n\t( reducer ) =>\n\t( state = {}, action ) => {\n\t\tconst newState = reducer( state, action );\n\n\t\tif ( newState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tnewState.tree = state.tree ? state.tree : new Map();\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.rootClientId ? [ action.rootClientId ] : [ '' ],\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK':\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tnewState.tree.set( action.clientId, {\n\t\t\t\t\t...newState.tree.get( action.clientId ),\n\t\t\t\t\t...newState.byClientId.get( action.clientId ),\n\t\t\t\t\tattributes: newState.attributes.get( action.clientId ),\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\t[ action.clientId ],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.set( clientId, {\n\t\t\t\t\t\t...newState.tree.get( clientId ),\n\t\t\t\t\t\tattributes: newState.attributes.get( clientId ),\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.clientIds,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst inserterClientIds = getFlattenedClientIds(\n\t\t\t\t\taction.blocks\n\t\t\t\t);\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\t// Controlled inner blocks are only removed\n\t\t\t\t\t// if the block doesn't move to another position\n\t\t\t\t\t// otherwise their content will be lost.\n\t\t\t\t\tif ( ! inserterClientIds[ clientId ] ) {\n\t\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.blocks.map( ( b ) => b.clientId ),\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\t// If there are no replaced blocks, it means we're removing blocks so we need to update their parent.\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst updatedBlockUids = [];\n\t\t\t\tif ( action.fromRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.fromRootClientId );\n\t\t\t\t} else {\n\t\t\t\t\tupdatedBlockUids.push( '' );\n\t\t\t\t}\n\t\t\t\tif ( action.toRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.toRootClientId );\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_UP':\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst updatedBlockUids = [\n\t\t\t\t\taction.rootClientId ? action.rootClientId : '',\n\t\t\t\t];\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn newState;\n\t};\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isPersistentChange` property value corresponding to whether a change in\n * state can be considered as persistent. All changes are considered persistent\n * except when updating the same block attribute as in the previous action.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withPersistentBlockChange( reducer ) {\n\tlet lastAction;\n\tlet markNextChangeAsNotPersistent = false;\n\tlet explicitPersistent;\n\n\treturn ( state, action ) => {\n\t\tlet nextState = reducer( state, action );\n\n\t\tlet nextIsPersistentChange;\n\t\tif ( action.type === 'SET_EXPLICIT_PERSISTENT' ) {\n\t\t\texplicitPersistent = action.isPersistentChange;\n\t\t\tnextIsPersistentChange = state.isPersistentChange ?? true;\n\t\t}\n\n\t\tif ( explicitPersistent !== undefined ) {\n\t\t\tnextIsPersistentChange = explicitPersistent;\n\t\t\treturn nextIsPersistentChange === nextState.isPersistentChange\n\t\t\t\t? nextState\n\t\t\t\t: {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t\t  };\n\t\t}\n\n\t\tconst isExplicitPersistentChange =\n\t\t\taction.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' ||\n\t\t\tmarkNextChangeAsNotPersistent;\n\n\t\t// Defer to previous state value (or default) unless changing or\n\t\t// explicitly marking as persistent.\n\t\tif ( state === nextState && ! isExplicitPersistentChange ) {\n\t\t\tmarkNextChangeAsNotPersistent =\n\t\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\t\tnextIsPersistentChange = state?.isPersistentChange ?? true;\n\t\t\tif ( state.isPersistentChange === nextIsPersistentChange ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t};\n\t\t}\n\n\t\tnextState = {\n\t\t\t...nextState,\n\t\t\tisPersistentChange: isExplicitPersistentChange\n\t\t\t\t? ! markNextChangeAsNotPersistent\n\t\t\t\t: ! isUpdatingSameBlockAttribute( action, lastAction ),\n\t\t};\n\n\t\t// In comparing against the previous action, consider only those which\n\t\t// would have qualified as one which would have been ignored or not\n\t\t// have resulted in a changed state.\n\t\tlastAction = action;\n\t\tmarkNextChangeAsNotPersistent =\n\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isIgnoredChange` property value corresponding to whether a change in state\n * can be considered as ignored. A change is considered ignored when the result\n * of an action not incurred by direct user interaction.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withIgnoredBlockChange( reducer ) {\n\t/**\n\t * Set of action types for which a blocks state change should be ignored.\n\t *\n\t * @type {Set}\n\t */\n\tconst IGNORED_ACTION_TYPES = new Set( [ 'RECEIVE_BLOCKS' ] );\n\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( nextState !== state ) {\n\t\t\tnextState.isIgnoredChange = IGNORED_ACTION_TYPES.has( action.type );\n\t\t}\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer targeting the combined blocks reducer, augmenting\n * block client IDs in remove action to include cascade of inner blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withInnerBlocksRemoveCascade = ( reducer ) => ( state, action ) => {\n\t// Gets all children which need to be removed.\n\tconst getAllChildren = ( clientIds ) => {\n\t\tlet result = clientIds;\n\t\tfor ( let i = 0; i < result.length; i++ ) {\n\t\t\tif (\n\t\t\t\t! state.order.get( result[ i ] ) ||\n\t\t\t\t( action.keepControlledInnerBlocks &&\n\t\t\t\t\taction.keepControlledInnerBlocks[ result[ i ] ] )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( result === clientIds ) {\n\t\t\t\tresult = [ ...result ];\n\t\t\t}\n\n\t\t\tresult.push( ...state.order.get( result[ i ] ) );\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( state ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\tremovedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 'REPLACE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\treplacedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `RESET_BLOCKS` action. When dispatched, this action will replace all\n * blocks that exist in the post, leaving blocks that exist only in state (e.g.\n * reusable blocks and blocks controlled by inner blocks controllers) alone.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockReset = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'RESET_BLOCKS' ) {\n\t\t/**\n\t\t * Preserve controlled inner block flags across RESET_BLOCKS.\n\t\t * If there are old and new blocks that:\n\t\t * - have the same `clientId`\n\t\t * - have the `controlledInnerBlocks` flag\n\t\t * - don't have any own, uncontrolled children\n\t\t * then we preserve the `controlledInnerBlocks` flag and the controlled sub-trees.\n\t\t * Nested controllers (e.g., `post-content`, patterns) don't lose their\n\t\t * controlled status and don't unnecessarily re-clone blocks.\n\t\t */\n\t\tconst newState = reducer( undefined, {\n\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\trootClientId: '',\n\t\t\tblocks: action.blocks,\n\t\t} );\n\n\t\tconst preservedControlledInnerBlocks =\n\t\t\tstate?.controlledInnerBlocks ?? {};\n\n\t\t// Preserve controlled inner blocks data from the old state.\n\t\t// The maps above are rebuilt solely from action.blocks, but\n\t\t// controlled inner blocks live under cloned IDs that aren't\n\t\t// present in action.blocks. Re-inject them so the state\n\t\t// remains consistent with the preserved flags.\n\t\tif ( state?.order ) {\n\t\t\tfor ( const clientId of Object.keys(\n\t\t\t\tpreservedControlledInnerBlocks\n\t\t\t) ) {\n\t\t\t\tif ( ! preservedControlledInnerBlocks[ clientId ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Only preserve if the parent block still exists.\n\t\t\t\tif ( ! newState.byClientId.has( clientId ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewState.controlledInnerBlocks[ clientId ] = true;\n\t\t\t\tconst oldOrder = state.order.get( clientId );\n\t\t\t\tif ( ! oldOrder?.length ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewState.order.set( clientId, oldOrder );\n\t\t\t\tconst preserveBlock = ( blockId, parentId ) => {\n\t\t\t\t\tconst blockData = state.byClientId.get( blockId );\n\t\t\t\t\tif ( ! blockData ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewState.byClientId.set( blockId, blockData );\n\t\t\t\t\tnewState.attributes.set(\n\t\t\t\t\t\tblockId,\n\t\t\t\t\t\tstate.attributes.get( blockId )\n\t\t\t\t\t);\n\t\t\t\t\tnewState.parents.set( blockId, parentId );\n\t\t\t\t\tconst childOrder = state.order.get( blockId ) || [];\n\t\t\t\t\tnewState.order.set( blockId, childOrder );\n\t\t\t\t\tchildOrder.forEach( ( childId ) =>\n\t\t\t\t\t\tpreserveBlock( childId, blockId )\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\toldOrder.forEach( ( id ) => preserveBlock( id, clientId ) );\n\t\t\t}\n\t\t}\n\n\t\t// Fix tree entries for controlled blocks. updateBlockTreeForBlocks\n\t\t// built tree entries using action.blocks' inner block structure\n\t\t// (entity-level IDs), but we need them to reference the preserved\n\t\t// cloned inner blocks instead. Mutating the existing object\n\t\t// preserves references held by ancestor tree entries.\n\t\tfor ( const clientId of Object.keys(\n\t\t\tnewState.controlledInnerBlocks\n\t\t) ) {\n\t\t\tconst controlledOrder = newState.order.get( clientId );\n\t\t\tif ( ! controlledOrder?.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst innerBlocks = controlledOrder.map( ( id ) =>\n\t\t\t\tstate.tree.get( id )\n\t\t\t);\n\t\t\tconst existingEntry = newState.tree.get( clientId );\n\t\t\tif ( existingEntry ) {\n\t\t\t\texistingEntry.innerBlocks = innerBlocks;\n\t\t\t}\n\t\t\tnewState.tree.set( 'controlled||' + clientId, { innerBlocks } );\n\t\t\tconst preserveTreeEntry = ( blockId ) => {\n\t\t\t\tconst treeEntry = state.tree.get( blockId );\n\t\t\t\tif ( ! treeEntry ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tnewState.tree.set( blockId, treeEntry );\n\t\t\t\tconst childOrder = newState.order.get( blockId ) || [];\n\t\t\t\tchildOrder.forEach( preserveTreeEntry );\n\t\t\t};\n\t\t\tcontrolledOrder.forEach( preserveTreeEntry );\n\t\t}\n\n\t\t// Preserve block editing modes for blocks that are not removed.\n\t\tconst preservedBlockEditingModes =\n\t\t\tstate?.blockEditingModes ?? new Map();\n\t\tfor ( const [ clientId, mode ] of preservedBlockEditingModes ) {\n\t\t\tif ( ! newState.tree.has( clientId ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnewState.blockEditingModes.set( clientId, mode );\n\t\t}\n\n\t\treturn newState;\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `REPLACE_INNER_BLOCKS` action. When dispatched, this action the state\n * should become equivalent to the execution of a `REMOVE_BLOCKS` action\n * containing all the child's of the root block followed by the execution of\n * `INSERT_BLOCKS` with the new blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withReplaceInnerBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type !== 'REPLACE_INNER_BLOCKS' ) {\n\t\treturn reducer( state, action );\n\t}\n\n\t// Finds every nested inner block controller. We must check the action blocks\n\t// and not just the block parent state because some inner block controllers\n\t// should be deleted if specified, whereas others should not be deleted. If\n\t// a controlled should not be deleted, then we need to avoid deleting its\n\t// inner blocks from the block state because its inner blocks will not be\n\t// attached to the block in the action.\n\tconst nestedControllers = {};\n\tif ( Object.keys( state.controlledInnerBlocks ).length ) {\n\t\tconst stack = [ ...action.blocks ];\n\t\twhile ( stack.length ) {\n\t\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\t\tstack.push( ...innerBlocks );\n\t\t\tif ( !! state.controlledInnerBlocks[ block.clientId ] ) {\n\t\t\t\tnestedControllers[ block.clientId ] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// The `keepControlledInnerBlocks` prop will keep the inner blocks of the\n\t// marked block in the block state so that they can be reattached to the\n\t// marked block when we re-insert everything a few lines below.\n\tlet stateAfterBlocksRemoval = state;\n\tif ( state.order.get( action.rootClientId ) ) {\n\t\tstateAfterBlocksRemoval = reducer( stateAfterBlocksRemoval, {\n\t\t\ttype: 'REMOVE_BLOCKS',\n\t\t\tkeepControlledInnerBlocks: nestedControllers,\n\t\t\tclientIds: state.order.get( action.rootClientId ),\n\t\t} );\n\t}\n\tlet stateAfterInsert = stateAfterBlocksRemoval;\n\tif ( action.blocks.length ) {\n\t\tstateAfterInsert = reducer( stateAfterInsert, {\n\t\t\t...action,\n\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\tindex: 0,\n\t\t} );\n\n\t\t// We need to re-attach the controlled inner blocks to the blocks tree and\n\t\t// preserve their block order. Otherwise, an inner block controller's blocks\n\t\t// will be deleted entirely from its entity.\n\t\tconst stateAfterInsertOrder = new Map( stateAfterInsert.order );\n\t\tObject.keys( nestedControllers ).forEach( ( key ) => {\n\t\t\tif ( state.order.get( key ) ) {\n\t\t\t\tstateAfterInsertOrder.set( key, state.order.get( key ) );\n\t\t\t}\n\t\t} );\n\t\tstateAfterInsert.order = stateAfterInsertOrder;\n\t\tstateAfterInsert.tree = new Map( stateAfterInsert.tree );\n\t\tObject.keys( nestedControllers ).forEach( ( _key ) => {\n\t\t\tconst key = `controlled||${ _key }`;\n\t\t\tif ( state.tree.has( key ) ) {\n\t\t\t\tstateAfterInsert.tree.set( key, state.tree.get( key ) );\n\t\t\t}\n\t\t} );\n\t}\n\treturn stateAfterInsert;\n};\n\n/**\n * Higher-order reducer which removes blocks from state when switching parent block controlled state.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withResetControlledBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t// When switching a block from controlled to uncontrolled or inverse,\n\t\t// we need to remove its content first \u2014 but only if there are inner\n\t\t// blocks to remove. Skipping the no-op dispatch is important because\n\t\t// REPLACE_INNER_BLOCKS creates new state references even when empty,\n\t\t// which propagates tree changes up to the root and triggers false-\n\t\t// positive change detection in parent subscriptions.\n\t\tconst innerBlockOrder = state.order.get( action.clientId );\n\t\tif ( innerBlockOrder?.length ) {\n\t\t\tconst tempState = reducer( state, {\n\t\t\t\ttype: 'REPLACE_INNER_BLOCKS',\n\t\t\t\trootClientId: action.clientId,\n\t\t\t\tblocks: [],\n\t\t\t} );\n\t\t\treturn reducer( tempState, action );\n\t\t}\n\t\treturn reducer( state, action );\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Reducer returning the blocks state.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blocks = pipe(\n\tcombineReducers,\n\twithBlockTree, // Needs to be before withInnerBlocksRemoveCascade.\n\twithInnerBlocksRemoveCascade,\n\twithReplaceInnerBlocks, // Needs to be after withInnerBlocksRemoveCascade.\n\twithBlockReset,\n\twithPersistentBlockChange,\n\twithIgnoredBlockChange,\n\twithResetControlledBlocks\n)( {\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tbyClientId( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known.\n\t\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\t// Do nothing if only attributes change.\n\t\t\t\tconst { attributes, ...changes } = action.updates;\n\t\t\t\tif ( Object.values( changes ).length === 0 ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...changes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tattributes( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known or there are no attribute changes.\n\t\t\t\tif (\n\t\t\t\t\t! state.get( action.clientId ) ||\n\t\t\t\t\t! action.updates.attributes\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...action.updates.attributes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Avoid a state change if none of the block IDs are known.\n\t\t\t\tif ( action.clientIds.every( ( id ) => ! state.get( id ) ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tlet hasChange = false;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst updatedAttributeEntries = Object.entries(\n\t\t\t\t\t\t!! action.options?.uniqueByBlock\n\t\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t\t: action.attributes ?? {}\n\t\t\t\t\t);\n\t\t\t\t\tif ( updatedAttributeEntries.length === 0 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet hasUpdatedAttributes = false;\n\t\t\t\t\tconst existingAttributes = state.get( clientId );\n\t\t\t\t\tconst newAttributes = {};\n\t\t\t\t\tupdatedAttributeEntries.forEach( ( [ key, value ] ) => {\n\t\t\t\t\t\tif ( existingAttributes[ key ] !== value ) {\n\t\t\t\t\t\t\thasUpdatedAttributes = true;\n\t\t\t\t\t\t\tnewAttributes[ key ] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\thasChange = hasChange || hasUpdatedAttributes;\n\t\t\t\t\tif ( hasUpdatedAttributes ) {\n\t\t\t\t\t\tnewState.set( clientId, {\n\t\t\t\t\t\t\t...existingAttributes,\n\t\t\t\t\t\t\t...newAttributes,\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn hasChange ? newState : state;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\torder( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst blockOrder = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tblockOrder.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\t'',\n\t\t\t\t\t( state.get( '' ) ?? [] ).concat( blockOrder[ '' ] )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst { rootClientId = '' } = action;\n\t\t\t\tconst subState = state.get( rootClientId ) || [];\n\t\t\t\tconst mappedBlocks = mapBlockOrder(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\trootClientId\n\t\t\t\t);\n\t\t\t\tconst { index = subState.length } = action;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tinsertAt(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tmappedBlocks.get( rootClientId ),\n\t\t\t\t\t\tindex\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst {\n\t\t\t\t\tfromRootClientId = '',\n\t\t\t\t\ttoRootClientId = '',\n\t\t\t\t\tclientIds,\n\t\t\t\t} = action;\n\t\t\t\tconst { index = state.get( toRootClientId ).length } = action;\n\n\t\t\t\t// Moving inside the same parent block.\n\t\t\t\tif ( fromRootClientId === toRootClientId ) {\n\t\t\t\t\tconst subState = state.get( toRootClientId );\n\t\t\t\t\tconst fromIndex = subState.indexOf( clientIds[ 0 ] );\n\t\t\t\t\tif ( fromIndex === -1 ) {\n\t\t\t\t\t\treturn state;\n\t\t\t\t\t}\n\t\t\t\t\tconst newState = new Map( state );\n\t\t\t\t\tnewState.set(\n\t\t\t\t\t\ttoRootClientId,\n\t\t\t\t\t\tmoveTo(\n\t\t\t\t\t\t\tstate.get( toRootClientId ),\n\t\t\t\t\t\t\tfromIndex,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\treturn newState;\n\t\t\t\t}\n\n\t\t\t\t// Moving from a parent block to another.\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\tfromRootClientId,\n\t\t\t\t\tstate\n\t\t\t\t\t\t.get( fromRootClientId )\n\t\t\t\t\t\t?.filter( ( id ) => ! clientIds.includes( id ) ) ?? []\n\t\t\t\t);\n\t\t\t\tnewState.set(\n\t\t\t\t\ttoRootClientId,\n\t\t\t\t\tinsertAt( state.get( toRootClientId ), clientIds, index )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_UP': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif ( ! subState.length || firstClientId === subState[ 0 ] ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex - 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst lastClientId = clientIds[ clientIds.length - 1 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif (\n\t\t\t\t\t! subState.length ||\n\t\t\t\t\tlastClientId === subState[ subState.length - 1 ]\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex + 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst { clientIds } = action;\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst mappedBlocks = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder = Object.values( order ).reduce(\n\t\t\t\t\t\t( result, subClientId ) => {\n\t\t\t\t\t\t\tif ( subClientId === clientIds[ 0 ] ) {\n\t\t\t\t\t\t\t\treturn [ ...result, ...mappedBlocks.get( '' ) ];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( clientIds.indexOf( subClientId ) === -1 ) {\n\t\t\t\t\t\t\t\tresult.push( subClientId );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\t// Remove inner block ordering for removed blocks.\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder =\n\t\t\t\t\t\torder?.filter(\n\t\t\t\t\t\t\t( id ) => ! action.removedClientIds.includes( id )\n\t\t\t\t\t\t) ?? [];\n\t\t\t\t\tif ( newSubOrder.length !== order.length ) {\n\t\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// While technically redundant data as the inverse of `order`, it serves as\n\t// an optimization for the selectors which derive the ancestry of a block.\n\tparents( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\taction.rootClientId || ''\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.clientIds.forEach( ( id ) => {\n\t\t\t\t\tnewState.set( id, action.toRootClientId || '' );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\tstate.get( action.clientIds[ 0 ] )\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\tcontrolledInnerBlocks(\n\t\tstate = {},\n\t\t{ type, clientId, hasControlledInnerBlocks }\n\t) {\n\t\tif ( type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ clientId ]: hasControlledInnerBlocks,\n\t\t\t};\n\t\t}\n\t\treturn state;\n\t},\n\n\tblockEditingModes( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\t\tif ( state.get( action.clientId ) === action.mode ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\t\t\t\treturn new Map( state ).set( action.clientId, action.mode );\n\t\t\tcase 'UNSET_BLOCK_EDITING_MODE': {\n\t\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.delete( action.clientId );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t},\n} );\n\n/**\n * Reducer returning visibility status of block interface.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isBlockInterfaceHidden( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'HIDE_BLOCK_INTERFACE':\n\t\t\treturn true;\n\n\t\tcase 'SHOW_BLOCK_INTERFACE':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning typing state.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isTyping( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_TYPING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_TYPING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragging state. It is possible for a user to be dragging\n * data from outside of the editor, so this state is separate from `draggedBlocks`.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isDragging( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_DRAGGING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragged block client id.\n *\n * @param {string[]} state  Current state.\n * @param {Object}   action Dispatched action.\n *\n * @return {string[]} Updated state.\n */\nexport function draggedBlocks( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING_BLOCKS':\n\t\t\treturn action.clientIds;\n\n\t\tcase 'STOP_DRAGGING_BLOCKS':\n\t\t\treturn [];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the visible blocks.\n *\n * @param {Record<string,boolean>} state  Current state.\n * @param {Object}                 action Dispatched action.\n *\n * @return {Record<string,boolean>} Block visibility.\n */\nexport function blockVisibility( state = {}, action ) {\n\tif ( action.type === 'SET_BLOCK_VISIBILITY' ) {\n\t\treturn {\n\t\t\t...state,\n\t\t\t...action.updates,\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Internal helper reducer for selectionStart and selectionEnd. Can hold a block\n * selection, represented by an object with property clientId.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction selectionHelper( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'CLEAR_SELECTED_BLOCK': {\n\t\t\tif ( state.clientId ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn state;\n\t\t}\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.clientId };\n\t\tcase 'REPLACE_INNER_BLOCKS':\n\t\tcase 'INSERT_BLOCKS': {\n\t\t\tif ( ! action.updateSelection || ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.blocks[ 0 ].clientId };\n\t\t}\n\t\tcase 'REMOVE_BLOCKS':\n\t\t\tif (\n\t\t\t\t! action.clientIds ||\n\t\t\t\t! action.clientIds.length ||\n\t\t\t\taction.clientIds.indexOf( state.clientId ) === -1\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {};\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tif ( action.clientIds.indexOf( state.clientId ) === -1 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst blockToSelect =\n\t\t\t\taction.blocks[ action.indexToSelect ] ||\n\t\t\t\taction.blocks[ action.blocks.length - 1 ];\n\n\t\t\tif ( ! blockToSelect ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tif ( blockToSelect.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: blockToSelect.clientId };\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the selection state.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function selection( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif ( action.clientId ) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.startOffset,\n\t\t\t\t\t},\n\t\t\t\t\tselectionEnd: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.endOffset,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: action.start || state.selectionStart,\n\t\t\t\tselectionEnd: action.end || state.selectionEnd,\n\t\t\t};\n\t\tcase 'RESET_SELECTION':\n\t\t\tconst { selectionStart, selectionEnd } = action;\n\t\t\treturn {\n\t\t\t\tselectionStart,\n\t\t\t\tselectionEnd,\n\t\t\t};\n\t\tcase 'MULTI_SELECT':\n\t\t\tconst { start, end } = action;\n\n\t\t\tif (\n\t\t\t\tstart === state.selectionStart?.clientId &&\n\t\t\t\tend === state.selectionEnd?.clientId\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: { clientId: start },\n\t\t\t\tselectionEnd: { clientId: end },\n\t\t\t};\n\t\tcase 'RESET_BLOCKS':\n\t\t\tconst startClientId = state?.selectionStart?.clientId;\n\t\t\tconst endClientId = state?.selectionEnd?.clientId;\n\n\t\t\t// Do nothing if there's no selected block.\n\t\t\tif ( ! startClientId && ! endClientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\t// If the start of the selection won't exist after reset, remove selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === startClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {},\n\t\t\t\t\tselectionEnd: {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If the end of the selection won't exist after reset, collapse selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === endClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tselectionEnd: state.selectionStart,\n\t\t\t\t};\n\t\t\t}\n\t}\n\n\tconst selectionStart = selectionHelper( state.selectionStart, action );\n\tconst selectionEnd = selectionHelper( state.selectionEnd, action );\n\n\tif (\n\t\tselectionStart === state.selectionStart &&\n\t\tselectionEnd === state.selectionEnd\n\t) {\n\t\treturn state;\n\t}\n\n\treturn {\n\t\tselectionStart,\n\t\tselectionEnd,\n\t};\n}\n\n/**\n * Reducer returning whether the user is multi-selecting.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isMultiSelecting( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_MULTI_SELECT':\n\t\t\treturn true;\n\n\t\tcase 'STOP_MULTI_SELECT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether selection is enabled.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isSelectionEnabled( state = true, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_SELECTION':\n\t\t\treturn action.isSelectionEnabled;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the client IDs for the viewport modal,\n * or null if the modal is not open.\n *\n * @param {string[]|null} state  Current state.\n * @param {Object}        action Dispatched action.\n *\n * @return {string[]|null} Client IDs for the viewport modal.\n */\nexport function viewportModalClientIds( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_VIEWPORT_MODAL':\n\t\t\treturn action.clientIds;\n\t\tcase 'HIDE_VIEWPORT_MODAL':\n\t\t\treturn null;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the data needed to display a prompt when certain blocks\n * are removed, or `false` if no such prompt is requested.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {Object|false} Data for removal prompt display, if any.\n */\nfunction removalPromptData( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'DISPLAY_BLOCK_REMOVAL_PROMPT':\n\t\t\tconst { clientIds, selectPrevious, message } = action;\n\t\t\treturn {\n\t\t\t\tclientIds,\n\t\t\t\tselectPrevious,\n\t\t\t\tmessage,\n\t\t\t};\n\t\tcase 'CLEAR_BLOCK_REMOVAL_PROMPT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning any rules that a block editor may provide in order to\n * prevent a user from accidentally removing certain blocks. These rules are\n * then used to display a confirmation prompt to the user. For instance, in the\n * Site Editor, the Query Loop block is important enough to warrant such\n * confirmation.\n *\n * The data is a record whose keys are block types (e.g. 'core/query') and\n * whose values are the explanation to be shown to users (e.g. 'Query Loop\n * displays a list of posts or pages.').\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {Record<string,string>} Updated state.\n */\nfunction blockRemovalRules( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_REMOVAL_RULES':\n\t\t\treturn action.rules;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the initial block selection.\n *\n * Currently this in only used to restore the selection after block deletion and\n * pasting new content.This reducer should eventually be removed in favour of setting\n * selection directly.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {number|null} Initial position: 0, -1 or null.\n */\nexport function initialPosition( state = null, action ) {\n\tif (\n\t\taction.type === 'REPLACE_BLOCKS' &&\n\t\taction.initialPosition !== undefined\n\t) {\n\t\treturn action.initialPosition;\n\t} else if (\n\t\t[\n\t\t\t'MULTI_SELECT',\n\t\t\t'SELECT_BLOCK',\n\t\t\t'RESET_SELECTION',\n\t\t\t'INSERT_BLOCKS',\n\t\t\t'REPLACE_INNER_BLOCKS',\n\t\t].includes( action.type )\n\t) {\n\t\treturn action.initialPosition;\n\t}\n\n\treturn state;\n}\n\nexport function blocksMode( state = {}, action ) {\n\tif ( action.type === 'TOGGLE_BLOCK_MODE' ) {\n\t\tconst { clientId } = action;\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ clientId ]:\n\t\t\t\tstate[ clientId ] && state[ clientId ] === 'html'\n\t\t\t\t\t? 'visual'\n\t\t\t\t\t: 'html',\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion point visibility, either null if there\n * is not an explicit insertion point assigned, or an object of its `index` and\n * `rootClientId`.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionCue( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_INSERTION_POINT': {\n\t\t\tconst {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t} = action;\n\t\t\tconst nextState = {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t};\n\n\t\t\t// Bail out updates if the states are the same.\n\t\t\treturn fastDeepEqual( state, nextState ) ? state : nextState;\n\t\t}\n\n\t\tcase 'HIDE_INSERTION_POINT':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether the post blocks match the defined template or not.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function template( state = { isValid: true }, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_TEMPLATE_VALIDITY':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisValid: action.isValid,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the editor setting.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function settings( state = SETTINGS_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_SETTINGS': {\n\t\t\tconst updatedSettings = action.reset\n\t\t\t\t? {\n\t\t\t\t\t\t...SETTINGS_DEFAULTS,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t  }\n\t\t\t\t: {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t  };\n\n\t\t\tObject.defineProperty( updatedSettings, '__unstableIsPreviewMode', {\n\t\t\t\tget() {\n\t\t\t\t\tdeprecated( '__unstableIsPreviewMode', {\n\t\t\t\t\t\tsince: '6.8',\n\t\t\t\t\t\talternative: 'isPreviewMode',\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn this.isPreviewMode;\n\t\t\t\t},\n\t\t\t} );\n\n\t\t\treturn updatedSettings;\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the user preferences.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function preferences( state = PREFERENCES_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tconst nextInsertUsage = action.blocks.reduce(\n\t\t\t\t( prevUsage, block ) => {\n\t\t\t\t\tconst { attributes, name: blockName } = block;\n\t\t\t\t\tlet id = blockName;\n\t\t\t\t\t// If a block variation match is found change the name to be the same with the\n\t\t\t\t\t// one that is used for block variations in the Inserter (`getItemFromVariation`).\n\t\t\t\t\tconst match = select( blocksStore ).getActiveBlockVariation(\n\t\t\t\t\t\tblockName,\n\t\t\t\t\t\tattributes\n\t\t\t\t\t);\n\t\t\t\t\tif ( match?.name ) {\n\t\t\t\t\t\tid += '/' + match.name;\n\t\t\t\t\t}\n\t\t\t\t\tif ( blockName === 'core/block' ) {\n\t\t\t\t\t\tid += '/' + attributes.ref;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevUsage,\n\t\t\t\t\t\t[ id ]: {\n\t\t\t\t\t\t\ttime: action.time,\n\t\t\t\t\t\t\tcount: prevUsage[ id ]\n\t\t\t\t\t\t\t\t? prevUsage[ id ].count + 1\n\t\t\t\t\t\t\t\t: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tstate.insertUsage\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinsertUsage: nextInsertUsage,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning an object where each key is a block client ID, its value\n * representing the settings for its nested blocks.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blockListSettings = ( state = {}, action ) => {\n\tswitch ( action.type ) {\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t// Collect all clientIds from replacement blocks. If a clientId\n\t\t\t// is reused, preserve its settings \u2014 the block instance (and\n\t\t\t// its InnerBlocks config) survived the replace. Settings for\n\t\t\t// clientIds that are truly removed get cleaned up so stale\n\t\t\t// config from old block types doesn't linger.\n\t\t\tconst replacementIds = new Set();\n\t\t\tconst stack = [ ...action.blocks ];\n\t\t\twhile ( stack.length ) {\n\t\t\t\tconst block = stack.shift();\n\t\t\t\treplacementIds.add( block.clientId );\n\t\t\t\tstack.push( ...block.innerBlocks );\n\t\t\t}\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) =>\n\t\t\t\t\t\t! action.clientIds.includes( id ) ||\n\t\t\t\t\t\treplacementIds.has( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) => ! action.clientIds.includes( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\tconst updates =\n\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t: action.clientId;\n\n\t\t\t// Remove settings that are the same as the current state.\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tif ( ! state[ clientId ] ) {\n\t\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tfastDeepEqual( state[ clientId ], updates[ clientId ] )\n\t\t\t\t) {\n\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( Object.keys( updates ).length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst merged = { ...state, ...updates };\n\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tdelete merged[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t}\n\t}\n\treturn state;\n};\n\n/**\n * Reducer return an updated state representing the most recent block attribute\n * update. The state is structured as an object where the keys represent the\n * client IDs of blocks, the values a subset of attributes from the most recent\n * block update. The state is always reset to null if the last action is\n * anything other than an attributes update.\n *\n * @param {Object<string,Object>} state  Current state.\n * @param {Object}                action Action object.\n *\n * @return {[string,Object]} Updated state.\n */\nexport function lastBlockAttributesChange( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_BLOCK':\n\t\t\tif ( ! action.updates.attributes ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn { [ action.clientId ]: action.updates.attributes };\n\n\t\tcase 'UPDATE_BLOCK_ATTRIBUTES':\n\t\t\treturn action.clientIds.reduce(\n\t\t\t\t( accumulator, id ) => ( {\n\t\t\t\t\t...accumulator,\n\t\t\t\t\t[ id ]: !! action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ id ]\n\t\t\t\t\t\t: action.attributes,\n\t\t\t\t} ),\n\t\t\t\t{}\n\t\t\t);\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current highlighted block.\n *\n * @param {boolean} state  Current highlighted block.\n * @param {Object}  action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function highlightedBlock( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_HIGHLIGHT':\n\t\t\tconst { clientId, isHighlighted } = action;\n\n\t\t\tif ( isHighlighted ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current spotlighted block.\n *\n * @param {string|null} state  Current clientId or null.\n * @param {Object}      action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function hasBlockSpotlight( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_SPOTLIGHT':\n\t\t\tconst { clientId, hasBlockSpotlight: _hasBlockSpotlight } = action;\n\n\t\t\tif ( _hasBlockSpotlight ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif (\n\t\t\t\taction.start?.clientId !== state ||\n\t\t\t\taction.end?.clientId !== state\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current expanded block in the list view.\n *\n * @param {string|null} state  Current expanded block.\n * @param {Object}      action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function expandedBlock( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_EXPANDED_IN_LIST_VIEW':\n\t\t\treturn action.clientId;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion event list state.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function lastBlockInserted( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS':\n\t\t\tif ( ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst clientIds = action.blocks.map( ( block ) => {\n\t\t\t\treturn block.clientId;\n\t\t\t} );\n\n\t\t\tconst source = action.meta?.source;\n\n\t\t\treturn { clientIds, source };\n\t\tcase 'RESET_BLOCKS':\n\t\t\treturn {};\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the contentOnly block that is being edited.\n *\n * @param {string|undefined} state  Current state.\n * @param {Object}           action Dispatched action.\n *\n * @return {string|undefined} Updated state.\n */\nexport function editedContentOnlySection( state, action ) {\n\tif ( action.type === 'EDIT_CONTENT_ONLY_SECTION' ) {\n\t\treturn action.clientId;\n\t}\n\n\t// Early return if there's no section being edited.\n\tif ( ! state ) {\n\t\treturn state;\n\t}\n\n\tswitch ( action.type ) {\n\t\tcase 'REMOVE_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS':\n\t\t\t// Clear if the edited section is directly among the removed/replaced blocks.\n\t\t\t// Note: this doesn't catch the case where a parent of the edited section\n\t\t\t// is removed, since action.clientIds only contains the top-level IDs.\n\t\t\t// That edge case is handled by the StopEditingContentOnlySectionOnOutsideSelect\n\t\t\t// component in block-list/index.js.\n\t\t\tif ( action.clientIds.includes( state ) ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'RESET_BLOCKS':\n\t\t\t// When all blocks are reset (e.g. navigating to a different post),\n\t\t\t// check whether the edited section still exists in the new block tree.\n\t\t\tif ( ! getFlattenedClientIds( action.blocks )[ state ] ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning a map of style IDs to style overrides.\n *\n * @param {Map}    state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Map} Updated state.\n */\nexport function styleOverrides( state = new Map(), action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_STYLE_OVERRIDE':\n\t\t\treturn new Map( state ).set( action.id, action.style );\n\t\tcase 'DELETE_STYLE_OVERRIDE': {\n\t\t\tconst newState = new Map( state );\n\t\t\tnewState.delete( action.id );\n\t\t\treturn newState;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning a map of the registered inserter media categories.\n *\n * @param {Array}  state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Array} Updated state.\n */\nexport function registeredInserterMediaCategories( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REGISTER_INSERTER_MEDIA_CATEGORY':\n\t\t\treturn [ ...state, action.category ];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting last focused element\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function lastFocus( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'LAST_FOCUS':\n\t\t\treturn action.lastFocus;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting zoom out state.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {number} Updated state.\n */\nexport function zoomLevel( state = 100, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_ZOOM_LEVEL':\n\t\t\treturn action.zoom;\n\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\treturn 100;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting the insertion point\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionPoint( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_INSERTION_POINT':\n\t\t\treturn action.value;\n\t\tcase 'SELECT_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the opened List View panels state.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction openedListViewPanels(\n\tstate = { allOpen: false, panels: {} },\n\taction\n) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_OPEN_LIST_VIEW_PANEL':\n\t\t\t// Open only the specified panel, close all others\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: action.clientId ? { [ action.clientId ]: true } : {},\n\t\t\t};\n\t\tcase 'SET_ALL_LIST_VIEW_PANELS_OPEN':\n\t\t\t// Set flag to open all panels\n\t\t\treturn { allOpen: true, panels: {} };\n\t\tcase 'TOGGLE_LIST_VIEW_PANEL':\n\t\t\t// If we're in \"all open\" mode, exit it when user manually toggles\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: {\n\t\t\t\t\t...state.panels,\n\t\t\t\t\t[ action.clientId ]: action.isOpen,\n\t\t\t\t},\n\t\t\t};\n\t\tcase 'REPLACE_BLOCKS':\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t// Clean up stale entries when blocks are removed or replaced\n\t\t\tif ( ! action.clientIds || action.clientIds.length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newPanels = { ...state.panels };\n\t\t\tlet hasChanges = false;\n\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\tif ( clientId in newPanels ) {\n\t\t\t\t\tdelete newPanels[ clientId ];\n\t\t\t\t\thasChanges = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn hasChanges ? { ...state, panels: newPanels } : state;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the List View expand revision.\n *\n * This is a counter used to force ListView components to remount. When incremented,\n * the ListView key changes, causing the component to remount with a fresh\n * isExpanded=true state.\n *\n * @param {number} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number} Updated state.\n */\nfunction listViewExpandRevision( state = 0, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INCREMENT_LIST_VIEW_EXPAND_REVISION':\n\t\t\treturn state + 1;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer tracking whether the list view content panel popover is open.\n *\n * @param {boolean} state  Current state.\n * @param {Object}  action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function listViewContentPanelOpen( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'OPEN_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn true;\n\n\t\tcase 'CLOSE_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn false;\n\n\t\t// Close when selection is cleared\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the requested inspector tab state.\n * Stores a request to open a specific inspector tab with optional configuration.\n *\n * @param {Object|null} state  Current state.\n * @param {Object}      action Dispatched action.\n *\n * @return {Object|null} Updated state.\n */\nexport function requestedInspectorTab( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REQUEST_INSPECTOR_TAB':\n\t\t\treturn {\n\t\t\t\ttabName: action.tabName,\n\t\t\t\toptions: action.options,\n\t\t\t};\n\t\tcase 'CLEAR_REQUESTED_INSPECTOR_TAB':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\nconst combinedReducers = combineReducers( {\n\tblocks,\n\tisDragging,\n\tisTyping,\n\tisBlockInterfaceHidden,\n\tdraggedBlocks,\n\tselection,\n\tisMultiSelecting,\n\tisSelectionEnabled,\n\tinitialPosition,\n\tblocksMode,\n\tblockListSettings,\n\tinsertionPoint,\n\tinsertionCue,\n\ttemplate,\n\tsettings,\n\tpreferences,\n\tlastBlockAttributesChange,\n\tlastFocus,\n\texpandedBlock,\n\thighlightedBlock,\n\tlastBlockInserted,\n\teditedContentOnlySection,\n\tblockVisibility,\n\tviewportModalClientIds,\n\tstyleOverrides,\n\tremovalPromptData,\n\tblockRemovalRules,\n\tregisteredInserterMediaCategories,\n\tzoomLevel,\n\thasBlockSpotlight,\n\topenedListViewPanels,\n\tlistViewExpandRevision,\n\tlistViewContentPanelOpen,\n\trequestedInspectorTab,\n} );\n\n/**\n * Retrieves a block's tree structure, handling both controlled and uncontrolled inner blocks.\n *\n * @param {Object} state    The current state object.\n * @param {string} clientId The client ID of the block to retrieve.\n *\n * @return {Object|undefined} The block tree object, or undefined if not found. For controlled blocks,\n *                           returns a merged tree with controlled inner blocks.\n */\nfunction getBlockTreeBlock( state, clientId ) {\n\tif ( clientId === '' ) {\n\t\tconst rootBlock = state.blocks.tree.get( clientId );\n\n\t\tif ( ! rootBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Patch the root block to have a clientId property.\n\t\t// TODO - consider updating the blocks reducer so that the root block has this property.\n\t\treturn {\n\t\t\tclientId: '',\n\t\t\t...rootBlock,\n\t\t};\n\t}\n\n\tif ( ! state.blocks.controlledInnerBlocks[ clientId ] ) {\n\t\treturn state.blocks.tree.get( clientId );\n\t}\n\n\tconst controlledTree = state.blocks.tree.get( `controlled||${ clientId }` );\n\tconst regularTree = state.blocks.tree.get( clientId );\n\n\treturn {\n\t\t...regularTree,\n\t\tinnerBlocks: controlledTree?.innerBlocks,\n\t};\n}\n\n/**\n * Recursively traverses through a block tree of a given block and executes a callback for each block.\n *\n * @param {Object}   state    The store state.\n * @param {string}   clientId The clientId of the block to start traversing from.\n * @param {Function} callback Function to execute for each block encountered during traversal.\n *                            The callback receives the current block as its argument.\n */\nfunction traverseBlockTree( state, clientId, callback ) {\n\tconst tree = getBlockTreeBlock( state, clientId );\n\tif ( ! tree ) {\n\t\treturn;\n\t}\n\n\tcallback( tree );\n\n\tif ( ! tree?.innerBlocks?.length ) {\n\t\treturn;\n\t}\n\n\tfor ( const innerBlock of tree?.innerBlocks ) {\n\t\ttraverseBlockTree( state, innerBlock.clientId, callback );\n\t}\n}\n\n/**\n * Checks if a block has a parent in a list of client IDs, and if so returns the client ID of the parent.\n *\n * @param {Object} state     The current state object.\n * @param {string} clientId  The client ID of the block to search the parents of.\n * @param {Array}  clientIds The client IDs of the blocks to check.\n *\n * @return {string|undefined} The client ID of the parent block if found, undefined otherwise.\n */\nfunction findParentInClientIdsList( state, clientId, clientIds ) {\n\tif ( ! clientIds.length ) {\n\t\treturn;\n\t}\n\n\tlet parent = state.blocks.parents.get( clientId );\n\twhile ( parent !== undefined ) {\n\t\tif ( clientIds.includes( parent ) ) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = state.blocks.parents.get( parent );\n\t}\n}\n\n/**\n * Checks if a block has any bindings in its metadata attributes.\n *\n * @param {Object} block The block object to check for bindings.\n * @return {boolean}    True if the block has bindings, false otherwise.\n */\nfunction hasBindings( block ) {\n\treturn (\n\t\tblock?.attributes?.metadata?.bindings &&\n\t\tObject.keys( block?.attributes?.metadata?.bindings ).length\n\t);\n}\n\n/**\n * Computes and returns derived block editing modes for a given block tree.\n *\n * This function calculates the editing modes for each block in the tree, taking into account\n * various factors such as zoom level, sections, and synced patterns.\n *\n * @param {Object} state        The current state object.\n * @param {string} treeClientId The client ID of the root block for the tree. Defaults to an empty string.\n * @return {Map} A Map containing the derived block editing modes, keyed by block client ID.\n */\nfunction getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {\n\tconst isZoomedOut =\n\t\tstate?.zoomLevel < 100 || state?.zoomLevel === 'auto-scaled';\n\tconst derivedBlockEditingModes = new Map();\n\n\t// When there are sections, the majority of blocks are disabled,\n\t// so the default block editing mode is set to disabled.\n\tconst sectionRootClientId = state.settings?.[ sectionRootClientIdKey ];\n\tconst sectionClientIds = state.blocks.order.get( sectionRootClientId );\n\tconst hasDisabledBlocks = Array.from( state.blocks.blockEditingModes ).some(\n\t\t( [ , mode ] ) => mode === 'disabled'\n\t);\n\tconst templatePartClientIds = [];\n\tconst syncedPatternClientIds = [];\n\n\tObject.keys( state.blocks.controlledInnerBlocks ).forEach( ( clientId ) => {\n\t\tconst block = state.blocks.byClientId?.get( clientId );\n\n\t\tif ( block?.name === 'core/template-part' ) {\n\t\t\ttemplatePartClientIds.push( clientId );\n\t\t}\n\n\t\tif ( block?.name === 'core/block' ) {\n\t\t\tsyncedPatternClientIds.push( clientId );\n\t\t}\n\t} );\n\tconst contentOnlyTemplateLockedClientIds = Object.keys(\n\t\tstate.blockListSettings\n\t).filter(\n\t\t( clientId ) =>\n\t\t\tstate.blockListSettings[ clientId ]?.templateLock === 'contentOnly'\n\t);\n\n\t// When in an isolated editing context (e.g., editing a template part or pattern directly),\n\t// don't apply contentOnly mode to nested unsynced patterns or template parts.\n\tconst isIsolatedEditor = state.settings?.[ isIsolatedEditorKey ];\n\n\tconst disableContentOnlyForUnsyncedPatterns =\n\t\tstate.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t// Use array.from for better back compat. Older versions of the iterator returned\n\t// from `keys()` didn't have the `filter` method.\n\tconst unsyncedPatternClientIds =\n\t\tisIsolatedEditor || disableContentOnlyForUnsyncedPatterns\n\t\t\t? []\n\t\t\t: Array.from( state.blocks.attributes.keys() ).filter(\n\t\t\t\t\t( clientId ) =>\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t  );\n\tconst disableContentOnlyForTemplateParts =\n\t\tstate.settings?.disableContentOnlyForTemplateParts;\n\n\tconst contentOnlyParents = [\n\t\t...contentOnlyTemplateLockedClientIds,\n\t\t...unsyncedPatternClientIds,\n\t\t...( isIsolatedEditor || disableContentOnlyForTemplateParts\n\t\t\t? []\n\t\t\t: templatePartClientIds ),\n\t];\n\n\ttraverseBlockTree( state, treeClientId, ( block ) => {\n\t\tconst { clientId, name: blockName } = block;\n\n\t\tconst hasEditedContentOnlySection = !! state.editedContentOnlySection;\n\t\tlet isWithinEditedContentOnlySection = false;\n\t\tif ( hasEditedContentOnlySection ) {\n\t\t\tisWithinEditedContentOnlySection =\n\t\t\t\tclientId === state.editedContentOnlySection ||\n\t\t\t\t!! findParentInClientIdsList( state, clientId, [\n\t\t\t\t\tstate.editedContentOnlySection,\n\t\t\t\t] );\n\n\t\t\t// When a contentOnly section is being edited, all blocks outside\n\t\t\t// the section are disabled. This should never be overridable by any\n\t\t\t// other block editing modes, it helps to constrain keyboard navigation\n\t\t\t// to within the edited section.\n\t\t\tif ( ! isWithinEditedContentOnlySection ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the block already has an explicit block editing mode set,\n\t\t// don't override it.\n\t\tif ( state.blocks.blockEditingModes.has( clientId ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Disabled explicit block editing modes are inherited by children.\n\t\t// It's an expensive calculation, so only do it if there are disabled blocks.\n\t\tif ( hasDisabledBlocks ) {\n\t\t\t// Look through parents to find one with an explicit block editing mode.\n\t\t\tlet ancestorBlockEditingMode;\n\t\t\tlet parent = state.blocks.parents.get( clientId );\n\t\t\twhile ( parent !== undefined ) {\n\t\t\t\tif ( state.blocks.blockEditingModes.has( parent ) ) {\n\t\t\t\t\t// Checking the explicit block editing mode will be slower,\n\t\t\t\t\t// as the block editing mode is more likely to be set on a\n\t\t\t\t\t// distant ancestor.\n\t\t\t\t\tancestorBlockEditingMode =\n\t\t\t\t\t\tstate.blocks.blockEditingModes.get( parent );\n\t\t\t\t}\n\t\t\t\tif ( ancestorBlockEditingMode ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tparent = state.blocks.parents.get( parent );\n\t\t\t}\n\n\t\t\t// If the ancestor block editing mode is disabled, it's inherited by the child.\n\t\t\tif ( ancestorBlockEditingMode === 'disabled' ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif ( isZoomedOut ) {\n\t\t\t// If the root block is the section root set its editing mode to contentOnly.\n\t\t\tif ( clientId === sectionRootClientId ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// There are no sections, so everything else is disabled.\n\t\t\tif ( ! sectionClientIds?.length ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( sectionClientIds.includes( clientId ) ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If zoomed out, all blocks that aren't sections or the section root are\n\t\t\t// disabled.\n\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( syncedPatternClientIds.length ) {\n\t\t\t// Synced pattern blocks (core/block).\n\t\t\tif ( syncedPatternClientIds.includes( clientId ) ) {\n\t\t\t\t// This is a synced pattern nested in another synced pattern,\n\t\t\t\t// disable the core/block itself.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Else do nothing, use the default block editing mode.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Inner blocks of synced patterns.\n\t\t\tconst parentSyncedPatternClientId = findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tsyncedPatternClientIds\n\t\t\t);\n\t\t\tif ( parentSyncedPatternClientId ) {\n\t\t\t\t// This is an inner block of a synced pattern that's nested in another synced pattern,\n\t\t\t\t// disable its contents.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tparentSyncedPatternClientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( hasBindings( block ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Synced pattern content without a binding isn't editable\n\t\t\t\t// from the instance, the user has to edit the pattern source,\n\t\t\t\t// so return 'disabled'.\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Set the edited section and all blocks within it to 'default', so that all changes can be made.\n\t\tif ( hasEditedContentOnlySection && isWithinEditedContentOnlySection ) {\n\t\t\tderivedBlockEditingModes.set( clientId, 'default' );\n\t\t\t// When there's an editedContentOnlySection, it overrides any modes that are usually\n\t\t\t// set for `contentOnlyParents`, return early to prevent continuing to code below.\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle `templateLock=contentOnly` blocks and unsynced patterns.\n\t\tif ( contentOnlyParents.length ) {\n\t\t\tconst hasContentOnlyParent = !! findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tcontentOnlyParents\n\t\t\t);\n\t\t\tif ( hasContentOnlyParent ) {\n\t\t\t\tif ( isContentBlock( blockName ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t} else {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn derivedBlockEditingModes;\n}\n\n/**\n * Updates the derived block editing modes based on added and removed blocks.\n *\n * This function handles the updating of block editing modes when blocks are added,\n * removed, or moved within the editor.\n *\n * It only returns a value when modifications are made to the block editing modes.\n *\n * @param {Object} options                    The options for updating derived block editing modes.\n * @param {Object} options.prevState          The previous state object.\n * @param {Object} options.nextState          The next state object.\n * @param {Array}  [options.addedBlocks]      An array of blocks that were added.\n * @param {Array}  [options.removedClientIds] An array of client IDs of blocks that were removed.\n * @return {Map|undefined} The updated derived block editing modes, or undefined if no changes were made.\n */\nfunction getDerivedBlockEditingModesUpdates( {\n\tprevState,\n\tnextState,\n\taddedBlocks,\n\tremovedClientIds,\n} ) {\n\tconst prevDerivedBlockEditingModes = prevState.derivedBlockEditingModes;\n\tlet nextDerivedBlockEditingModes;\n\n\t// Perform removals before additions to handle cases like the `MOVE_BLOCKS_TO_POSITION` action.\n\t// That action removes a set of clientIds, but adds the same blocks back in a different location.\n\t// If removals were performed after additions, those moved clientIds would be removed incorrectly.\n\tremovedClientIds?.forEach( ( clientId ) => {\n\t\t// The actions only receive parent block IDs for removal.\n\t\t// Recurse through the block tree to ensure all blocks are removed.\n\t\t// Specifically use the previous state, before the blocks were removed.\n\t\ttraverseBlockTree( prevState, clientId, ( block ) => {\n\t\t\tif ( prevDerivedBlockEditingModes.has( block.clientId ) ) {\n\t\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\t\tnextDerivedBlockEditingModes = new Map(\n\t\t\t\t\t\tprevDerivedBlockEditingModes\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tnextDerivedBlockEditingModes.delete( block.clientId );\n\t\t\t}\n\t\t} );\n\t} );\n\n\taddedBlocks?.forEach( ( addedBlock ) => {\n\t\tconst updates = getDerivedBlockEditingModesForTree(\n\t\t\tnextState,\n\t\t\taddedBlock.clientId\n\t\t);\n\n\t\tif ( updates.size ) {\n\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( prevDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? prevDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t} else {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( nextDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? nextDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn nextDerivedBlockEditingModes;\n}\n\n/**\n * Higher-order reducer that adds derived block editing modes to the state.\n *\n * This function wraps a reducer and enhances it to handle actions that affect\n * block editing modes. It updates the derivedBlockEditingModes in the state\n * based on various actions such as adding, removing, or moving blocks, or changing\n * the editor mode.\n *\n * @param {Function} reducer The original reducer function to be wrapped.\n * @return {Function} A new reducer function that includes derived block editing modes handling.\n */\nexport function withDerivedBlockEditingModes( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\t// An exception is needed here to still recompute the block editing modes when\n\t\t// the editor mode changes since the editor mode isn't stored within the\n\t\t// block editor state and changing it won't trigger an altered new state.\n\t\tif ( action.type !== 'SET_EDITOR_MODE' && nextState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Handle unsynced patterns which indicate their contentOnly-ness via\n\t\t\t\t// the `attributes.metadata.patternName` property.\n\t\t\t\t// Check when this is added or removed and update blockEditingModes.\n\t\t\t\tconst disableContentOnlyForUnsyncedPatterns =\n\t\t\t\t\tnextState.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t\t\t\tif ( disableContentOnlyForUnsyncedPatterns ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tfor ( const clientId of action?.clientIds ) {\n\t\t\t\t\tconst attributes = action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t: action.attributes;\n\n\t\t\t\t\tif ( ! attributes ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t// patternName is switching from falsy to truthy, indicating\n\t\t\t\t\t\t// this block is becoming an unsynced pattern.\n\t\t\t\t\t\tattributes.metadata?.patternName &&\n\t\t\t\t\t\t! state.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t// patternName is switching from truthy to falsy, this block is becoming\n\t\t\t\t\t\t// a regular block but was an unsynced pattern.\n\t\t\t\t\t\t// Check that `metadata` is part of the included attributes, as\n\t\t\t\t\t\t// `updateBlockAttributes` merges attributes, if it isn't present\n\t\t\t\t\t\t// the previous `metadata` would be retained.\n\t\t\t\t\t\tattributes.metadata &&\n\t\t\t\t\t\t! attributes.metadata?.patternName &&\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Include it in 'removedClientIds'.\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks?.length && ! removedClientIds?.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\t\t// Handle the addition and removal of contentOnly template locked blocks.\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tconst updates =\n\t\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t\t: action.clientId;\n\n\t\t\t\tfor ( const clientId in updates ) {\n\t\t\t\t\tconst isNewContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock !==\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock === 'contentOnly';\n\n\t\t\t\t\tconst wasContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock ===\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock !== 'contentOnly';\n\n\t\t\t\t\tif ( isNewContentOnlyBlock ) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( wasContentOnlyBlock ) {\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks.length && ! removedClientIds.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\tcase 'UNSET_BLOCK_EDITING_MODE':\n\t\t\tcase 'SET_HAS_CONTROLLED_INNER_BLOCKS': {\n\t\t\t\tconst updatedBlock = getBlockTreeBlock(\n\t\t\t\t\tnextState,\n\t\t\t\t\taction.clientId\n\t\t\t\t);\n\n\t\t\t\t// The block might have been removed in which case it'll be\n\t\t\t\t// handled by the `REMOVE_BLOCKS` action.\n\t\t\t\tif ( ! updatedBlock ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: [ action.clientId ],\n\t\t\t\t\t\taddedBlocks: [ updatedBlock ],\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_INNER_BLOCKS': {\n\t\t\t\t// Get the clientIds of the blocks that are being replaced\n\t\t\t\t// from the old state, before they were removed.\n\t\t\t\tconst removedClientIds = state.blocks.order.get(\n\t\t\t\t\taction.rootClientId\n\t\t\t\t);\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst addedBlocks = action.clientIds.map( ( clientId ) => {\n\t\t\t\t\treturn nextState.blocks.byClientId.get( clientId );\n\t\t\t\t} );\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_SETTINGS': {\n\t\t\t\t// Recompute the entire tree if the section root,\n\t\t\t\t// the effective disableContentOnlyForUnsyncedPatterns value,\n\t\t\t\t// the isIsolatedEditor value, or the\n\t\t\t\t// disableContentOnlyForTemplateParts value changes.\n\t\t\t\t// These are all values that affect the computation.\n\t\t\t\tif (\n\t\t\t\t\tstate?.settings?.[ sectionRootClientIdKey ] !==\n\t\t\t\t\t\tnextState?.settings?.[ sectionRootClientIdKey ] ||\n\t\t\t\t\t!! state?.settings\n\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns ||\n\t\t\t\t\t!! state?.settings?.[ isIsolatedEditorKey ] !==\n\t\t\t\t\t\t!! nextState?.settings?.[ isIsolatedEditorKey ] ||\n\t\t\t\t\t!! state?.settings?.disableContentOnlyForTemplateParts !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForTemplateParts\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RESET_BLOCKS':\n\t\t\tcase 'EDIT_CONTENT_ONLY_SECTION':\n\t\t\tcase 'SET_EDITOR_MODE':\n\t\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\tcase 'SET_ZOOM_LEVEL': {\n\t\t\t\t// Recompute the entire tree if the editor mode or zoom level changes,\n\t\t\t\t// or if all the blocks are reset.\n\t\t\t\treturn {\n\t\t\t\t\t...nextState,\n\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// If there's no change, the derivedBlockEditingModes from the previous\n\t\t// state need to be preserved.\n\t\tnextState.derivedBlockEditingModes =\n\t\t\tstate?.derivedBlockEditingModes ?? new Map();\n\n\t\treturn nextState;\n\t};\n}\n\nfunction withAutomaticChangeReset( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( ! state ) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Take over the last value without creating a new reference.\n\t\tnextState.automaticChangeStatus = state.automaticChangeStatus;\n\n\t\tif ( action.type === 'MARK_AUTOMATIC_CHANGE' ) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'pending',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\taction.type === 'MARK_AUTOMATIC_CHANGE_FINAL' &&\n\t\t\tstate.automaticChangeStatus === 'pending'\n\t\t) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'final',\n\t\t\t};\n\t\t}\n\n\t\t// If there's a change that doesn't affect blocks or selection, maintain\n\t\t// the current status.\n\t\tif (\n\t\t\tnextState.blocks === state.blocks &&\n\t\t\tnextState.selection === state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// As long as the state is not final, ignore any selection changes.\n\t\tif (\n\t\t\tnextState.automaticChangeStatus !== 'final' &&\n\t\t\tnextState.selection !== state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Reset the status if blocks change or selection changes (when status is final).\n\t\treturn {\n\t\t\t...nextState,\n\t\t\tautomaticChangeStatus: undefined,\n\t\t};\n\t};\n}\n\nexport default pipe(\n\twithDerivedBlockEditingModes,\n\twithAutomaticChangeReset\n)( combinedReducers );\n"],
  "mappings": "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",
  "names": ["blocksPrivateApis", "blocks", "fastDeepEqual", "parentsOfRemovedBlocks", "newState", "selectionStart", "selectionEnd", "deprecated", "blocksStore"]
}
