Reproduce and eliminate intermittent editor flicker #14
Open
opened 2026-09-13 13:34:43 +00:00 by kayg
·
11 comments
No Branch/Tag specified
dev
wave19/desktop-test
wave19/per-space-state
wave19/first-space-integration
wave19/first-space-draft-transfer
wave19/block-editor-craft
codex/wip/root-conflict-snapshot-20260914
wave12/first-space-draft-transfer
wave14/editor-overnight-combined
wave17/editor-diagnostics-3bbb
wave16/code-block-polish
wave16/image-controls
wave16/event-title-crash-control
wave16/image-preview-dispatch-repair
wave16/event-title-lifecycle-qa
wave16/editor-list-refinements
wave17/editor-layout-correction
wave16/event-edit-date
wave16/note-title-presentation
wave16/editor-final-combined
wave18/document-chrome-repair
wave17/cross-event-drop
wave16/editor-structural-combined
wave16/editor-hover-margins
wave16/editor-caret-relocation-perf
wave16/inspector-polish
wave16/image-preview-integration
wave16/english-transcription
wave16/document-background-edge
wave16/sidebar-live-layout
wave15/image-preview-ownership-repair
wave15/editor-handle-six-dot
wave15/titlebar-public-repair
wave15/sidebar-initial-restoration
wave15/editor-formatting-tooltips
wave15/editor-drag-mounted-repair
wave15/image-preview-foundation-isolated
wave15/editor-block-drag-feedback
wave15/sidebar-attachment-layout
wave14/editor-inline-plain-fastpath
wave14/editor-rendered-paste-replacement
wave14/clipboard-awaited-shutdown
wave14/editor-selectall-toolbar-perf
fix/clipboard-body-undo-group
diagnostic/clipboard-insertion-491
wave14/sidebar-unselected-drag-v2
diagnostic/sidebar-unselected-drag-trace
diagnostic/clipboard-phase-0225
wave14/sidebar-prime-access
wave14/nested-projection-handle-test-fix
wave14/sidebar-unselected-event-drag
fix/clipboard-task-ownership-6318
fix/editor-resource-url-invalidation
codex/wip/editor-handle-render-diagnostic-20260914
fix/central9c9-clipboard-crash
codex/wip/editor-handle-diagnostic-20260914
wave14/sidebar-event-runtime-repair
wave14/nested-projection-runtime-fix
wave14/sidebar-event-test-fixtures
wave14/sidebar-attachment-overlap
integration/rendered-image-clipboard
wave14/sidebar-event-preview-integration
wave14/editor-nested-list-integrate
wave14/editor-nested-list-projection
task/rendered-image-clipboard
wave14/sidebar-paste-preview-integration
wave14/sidebar-event-day-dnd
wave14/editor-preview-next
wave14/editor-list-handle-integrated
task/native-basic-paste
wave14/editor-list-keyboard-audit
task/native-clipboard-contract
codex/wip/editor-handle-geometry-20260914
wave14/editor-block-drag
wave14/editor-drag-integrated
wave14/editor-empty-marker-map-publication
wave14/editor-empty-marker-runtime-diag
wave14/editor-empty-marker-preview
wave14/editor-empty-marker-host-repro
wave14/editor-empty-marker-probe
codex/wip/editor-hr-leaf-fix-20260914
wave14/event-attachment-drop
wave14/editor-empty-marker-paint
wave14/editor-drop-list-preview
wave14/editor-finder-drop
wave14/editor-rule-caret
wave14/editor-list-enter-next
wave14/editor-image-qa
wave14/editor-mode-commands
wave13/editor-code-performance-preview
wave14/sidebar-overlap-repair
wave13/cross-day-compile-repair
wave13/spotlight-retry
wave13/editor-chrome-runtime-repair
wave13/editor-inline-fast-path
codex/wip/detached-87aa-20260914
wave12/editor-viewport-polish
wave12/craft-code-block-polish
wave12/editor-asset-return-preview
wave12/voice-polish-preview
wave12/editor-native-return-runtime-repair
wave12/editor-asset-focus
wave12/cross-day-reviewed-integration
wave12/optional-voice-provider-finish
wave12/event-move-descriptor-compile-fix
wave12/editor-image-geometry-preview
wave12/editor-native-return-undo-repair
wave12/image-native-geometry-fixture
wave12/editor-pattern-preview
wave12/editor-bullet-continuation
wave12/editor-top-chrome
wave12/voice-composer-restart
wave12/speech-variable-buffer-repair
wave12/editor-image-preview
wave12/event-move-descriptor-scale
wave12/editor-image-geometry
wave12/afternoon-ui-preview
wave12/sidebar-hosted-bounds-repair
wave12/sidebar-overlap-live
wave12/speech-e2e-verification
wave12/mentions-polish-finish
wave12/editor-structural-range-repair
wave12/sidebar-fade-desktop-preview
wave12/sidebar-design-ledger
wave12/voice-assets-physical-fixtures
wave12/native-event-marker-polish
wave12/sidebar-fade-undo-preview
wave12/event-move-fence-corrections
wave12/sidebar-fade-boundary-repair
wave12/parent-space-entry-integration
wave12/editor-undo-group-repair
wave12/native-event-row-performance
wave12/parent-swipe-integration
wave12/metadata-noteid-test-fix
wave12/space-composer-generation-fix
wave12/voice-lifecycle-clock-fixture
wave12/sidebar-child-binding
wave12/voice-provider-pool-preview
wave12/composer-recording-preview
wave12/event-cross-day-store-corrections
wave12/voice-async-test-locks
wave12/speech-buffer-lease-fix
wave12/composer-no-top-readouts
wave12/sidebar-child-target
wave12/space-required-composer
wave12/editor-correctness-preview
wave12/voice-provider-compile-corrected
wave12/event-move-integration
wave12/voice-assets-compile-fix
wave12/parakeet-compile-fix
wave12/note-metadata-flexibility
wave12/sidebar-event-drag-drop
wave12/editor-paste-source-guard
wave12/note-asset-import-safety-causal-tests
wave12/note-asset-import-safety
wave12/editor-readonly-command-guards
wave12/voice-provider-integration
wave12/editor-format-flexibility
wave12/hosted-sidebar-ui-sdk-fix
wave12/event-cross-day-store
wave12/voice-app-wiring
wave12/voice-parakeet-assets
wave12/voice-hosted-await-fix
wave12/event-edit-date-guard
wave12/event-cross-day-app
wave12/network-client-entitlement
wave12/sidebar-row-overlap
wave12/voice-settings-surface
wave12/parakeet-capture-adapter
wave12/task-marker-normalization
wave12/voice-polish-integration
wave12/voice-capture-hardening
wave12/voice-provider-settings-plan
wave12/copied-space-editor-io
wave12/hosted-background-sendability
wave12/voice-stop-nlp
wave12/voice-fixture-roots
wave12/voice-claim-collision
wave12/sidebar-add-swipe-plan
wave12/copied-space-app-wiring-plan
wave12/voice-fence-stat-compilefix
wave12/composer-dismiss-crash-hotfix
wave12/voice-retainer-defer-fix
wave12/overnight-recovery-space-preview
wave12/background-checkpoint-compilefix
wave12/copied-space-enumeration-fix
wave12/copied-space-local-state
wave12/voice-fence-fixture-fix
wave12/voice-manifest-fd-fix
wave12/voice-recovery-publication-proof
wave12/voice-retainer-bytecount-fix
wave12/overnight-navigation-background-compilefix
wave12/navigation-work-diagnostic
wave12/overnight-navigation-background-preview
wave12/background-import-bounds
wave12/overnight-voice-lifecycle-preview
wave12/voice-frozen-claim
wave12/voice-input-seam
wave12/voice-recovery-compile-fix
wave12/voice-terminal-cleanup-plan
wave12/voice-recovery-activation-plan-current
wave12/overnight-runtime-probe-preview
wave12/overnight-sandbox-startup-preview
wave12/startup-geometry-diagnostic
wave12/voice-source-sandbox-fix
wave12/image-root-sandbox-fix
wave12/perf-scroll-zero-args
wave12/overnight-document-geometry-preview
wave12/native-document-geometry-diagnostic
wave12/overnight-draft-root-preview
wave12/voice-recovery-c-session-fence
wave12/draft-root-direct-open
wave12/hosted-single-module-linkage
wave12/overnight-voice-recovery-preview
wave12/voice-recovery-checkpoint-a-finalization
wave12/copied-space-local-state-plan
wave12/overnight-refresh-hosted-preview
wave12/incremental-refresh-bounded-load
wave12/raw-source-reconciliation-test-fix
wave12/overnight-rendering-startup-preview
wave12/draft-root-diagnostic
wave12/day-event-bulk-load
wave12/speech-asset-install-test-preview
wave12/hr-material-contrast
wave12/height-clamp-followup
wave12/voice-recovery-checkpoint-a-corrections
wave12/overnight-cstore-caret-preview
wave12/voice-recovery-checkpoint-a
wave12/editor-adjacent-caret-boundary-v3
wave12/voice-recovery-index-query-fix
wave12/editor-adjacent-caret-boundary-v2
wave12/voice-recovery-index-query
wave12/startup-collector-empty-args
wave12/editor-adjacent-caret-boundary
wave12/overnight-hr-storage-preview
wave12/hr-native-diagnostic-followup
wave12/hr-native-diagnostic
wave12/overnight-storage-settings-preview
wave12/snapshot-native-move-followup
wave12/speech-local-fallback
wave12/settings-stream-test-compilefix
wave12/snapshot-path-identity-followup
wave12/corefrontmatter-join-fastpath
wave12/speech-fallback-plan
wave12/overnight-caret-control-registry
wave12/editor-registry-compilefix
wave12/voicea-test-compilefix
wave12/overnight-caret-control-ready
wave12/voicea-enum-compilefix
wave12/voice-recovery-phaseb
wave12/overnight-caret-control
wave12/overnight-polish-storage-preview
wave12/voicea-foundation-compilefix
wave12/snapshot-path-identity
wave12/overnight-native-polish-preview
wave12/hr-rule-geometry
wave12/speech-conversion-fixture
wave12/editor-deferred-caret
wave12/overnight-hosted-lifetime-preview
wave12/marker-glyph-clipping
wave12/voice-recovery-activation
wave12/overnight-package-fixture-preview
wave12/overnight-lifetime-voice-preview
wave12/app-tests-cleanup
wave12/snapshot-physical-fixtures
wave12/event-date-title-punctuation
wave12/overnight-lifetime-voice-plan
wave12/overnight-draw-before
wave12/overnight-picker-event-preview
wave12/settings-watcher
wave12/event-date-title-fix
wave12/note-background-picker-fix
wave12/editor-lifetime
wave12/overnight-draw-preview
wave12/snapshot-attribute-compile-fix
wave12/editor-accepted-draw-trace
wave12/overnight-runtime-preview
wave12/composer-test-concurrency-fix
wave12/editor-caret-performance
wave12/overnight-snapshot-correction
wave12/settings-model-callbacks
wave12/overnight-full-preview
wave12/overnight-store-preview
wave12/rendered-bullet-fix
wave12/settings-document-fixture-fix
wave12/composer-task-pill-ui
wave12/overnight-roadmap-preview
wave12/task-tag-readouts
wave12/event-snapshot-dependency
wave12/h1-strict-preview
wave12/settings-store-await-fix
wave12/settings-store-test-fix
wave12/overnight-pill-preview
wave12/composer-pill-accent-fix
wave12/composer-pill-final
wave11/sidebar-cold-index-prime
wave12/overnight-preview
wave11/voice-draft-recovery
wave11/voice-transcription-finish
wave11/note-save-rename
wave11/task-event-preview
wave11/settings-enabled-plugin-section
wave11/pill-fade-preview
wave11/sidebar-top-fade-regression
wave11/event-sidebar-preview
wave11/composer-pill-restore
wave11/settings-plugins-portability
wave11/composer-hash-semantics
wave11/event-composer-edit
wave11/sidebar-spacing-followup
wave11/editor-performance-evidence
wave11/voice-preview
wave11/voice-stop-repair
wave11/polish-verification
wave11/plugins-settings-ui
wave11/bullet-list-regression
wave11/sidebar-insert-stability
wave11/polish-preview
wave11/document-style-repair
wave11/composer-native-readouts
wave11/mentions-disclosure-motion
wave11/sidebar-swipe-compact
wave11/legacy-helper-path-fix
wave11/persistence-integration
wave11/capsule-instant-presentation
wave11/native-link-activation
wave11/desktop-integration
wave11/link-integration
wave11/synthetic-note-names
wave11/composer-overflow-actions
wave11/legacy-root-links
wave11/note-title-punctuation
wave11/note-title-metadata
wave11/spotlight-navigation
wave11/spotlight-trace-baseline
wave11/note-name-collisions
wave11/identity-query-indexes
wave11/note-heading-title
wave11/capsule-scroll-chrome
wave11/sidebar-context-menu
wave11/spotlight-metadata
wave11/rename-link-repair
wave11/analytics-native
wave11/sidebar-scroll-restoration
wave11/sidebar-bottom-spacing
wave11/capsule-optical-alignment
wave11/markdown-link-resolution
wave11/command-results-layout
wave11/capsule-outside-dismissal
wave11/events-folder
wave11/capsule-query-retention
wave11/capsule-snap-preview
wave11/composer-controls-preview
wave11/sidebar-fade-preview
wave11/selection-lookup
wave11/note-creation-routing
wave11/sidebar-header-spacing
wave11/block-editor
wave11/space-onboarding
wave11/space-terminology
wave4/voice
wave2/search
wave4/glur-probe
wave7/cli-integration
wave12/inspector-style
wave4/document-presentation
wave2/cli
wave2/sidebar
No results found.
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal-macos#14
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request and current status
Refresh guards exist, but user-reported occasional flicker has no confirmed resolution.
Acceptance
Capture reproducible edit/paste/selection/scroll sequence; identify draw/invalidation cause. Verify repair with mixed lists/images and appearance changes, preserving caret/source mapping. Retain before/after evidence.
Keep open until the user-facing outcome is verified in a delivered build. Source review or a successful build alone is not completion.
Worker/role:
/root/sidebar_live_geometry_diagnosis, bounded source and runtime diagnosis for issue #14. No source ownership or edits are planned in this phase.Current boundary: integrated Release
6ca85fd2d82428d4fe18db508535bc643f3a0ee4. Existing equal-resource refresh guards are historical source evidence only; the user-reported intermittent flicker has no reproduced sequence or verified repair.Plan:
/usr/bin/samplestacks; screenshots/video may establish visible flicker but will not be used as performance evidence.Immediate next action: audit current invalidation hotspots and retained runtime evidence while issue #13 waits for the same VM lease. Issue remains open.
Worker:
/root/sidebar_live_geometry_diagnosis(diagnosis), no source edits.Current state: source audit of exact candidate
6ca85fd2d82428d4fe18db508535bc643f3a0ee4does not support calling the historical resource-URL guard a flicker fix. The guard is present at both resource setters, so repeatedNoteEditorHost.updateNSViewcalls with equal URLs do not refresh images or invalidate layout.The remaining full-visible-surface redraw/reflow candidates are bounded:
BlockEditorView.viewDidMoveToWindowrefreshes image presentation synchronously, then refreshes it again on the next main turn and unconditionally invalidates the entire TextKit document. This is a mount/reattach candidate, not yet evidence for ordinary selection flicker.onGeometryChange; the editor then invalidates the entire TextKit document and the host invalidates document-page height. This is the primary mixed-image candidate.refreshProjectionLayout; TextKit storage replacement invalidates changed elements, but the method also invalidates intrinsic height, layout, and display for the fullNSTextViewsurface.NoteEditorContainerView.layoutinvalidates the document layout on every host layout.NoteDocumentScrollView.layoutthen marks the page dirty and forceslayoutSubtreeIfNeeded, even when width and measured content have not changed. This can amplify editor invalidation but does not itself prove a blank frame.Existing
CALTERNAL_DOCUMENT_GEOMETRY=1telemetry can correlate page/editor/footer frame and clip-origin changes, whileCALTERNAL_PERF_TRACE=1marks accepted edit to post-super editor draw. Neither records why editor layout was invalidated or whether a draw contained no visible fragments. If the leased VM reproduces a flash, the smallest next diagnostic patch is opt-in numeric logging at the five paths above: reason, mount generation, source revision/length, visible/dirty rects, viewport range presence, image token/job/change counts, page/editor frames, and post-super draw. It must record no note text or path and must not force a display. A source repair is premature until that record identifies the triggering path.Runtime dependency: the exclusive VM is currently leased to another QA task and the compiler-idle window is not yet available. No user desktop was touched. Issue remains open; next action is the separately recorded edit/paste/select/scroll/appearance/mixed-image sequence on the exact staged Release after root grants the lease.
Worker:
/root/sidebar_live_geometry_diagnosis(flicker diagnosis), no source edits.The exact
6ca85fd2d82428d4fe18db508535bc643f3a0ee4Release completed a fresh-process full-selection plus 177,779-byte native paste and Undo sequence during the issue #13 sample. Pre-selection and post-paste native window captures establish correct visible endpoints, and source/AppTrace receipts establish that the edit and one post-super draw occurred. There was no continuous video and no invalidation-reason telemetry, so these endpoint captures cannot prove the absence or presence of an intermittent flash. They are not being counted as a flicker pass.The CPU profile did identify the best next correlation point: after the paste mutation, the deferred caret-reveal closure entered
BlockEditorView.revealInsertionPointand TextKit viewport relocation. Together with the code-audit candidates already posted (mount double-refresh/full invalidation, image geometry completion, projection/display invalidation, and unconditional host/page relayout), the next opt-in diagnostic should record a numeric reason and generation at those invalidation/reveal paths and match it to post-super draws and existing document geometry. That is narrower than changing clipping or suppressing redraws without a reproduced flash.Mixed-image, appearance, selection-only, and bounded scroll recordings remain required, as does a before/after repair. Issue stays open. Raw shared-run artifacts are
/Users/lume/Performance/results/6ca85fd2-paste-issue13-02/; screenshots are state evidence only and are not performance evidence.Worker:
/root/sidebar_live_geometry_diagnosis(bounded flicker follow-up).Isolated worktree:
/Users/kayg/Developer/calternal-app/.worktrees/editor-caret-relocation-perfBranch:
wave16/editor-caret-relocation-perfBase: exact integration
37c5d40de40a2d0b279aad8d13d6f68837533c2d, clean at creation.Current state: planning only; no source edits or runtime use. The
6ca85paste profile did not reproduce or disprove a visible flash, but it found a concrete post-mutation double-pass candidate: the editor performs immediate caret reveal and schedules a later reconciliation; the later pass spent 55 sampled milliseconds, including 33 in TextKit viewport relocation.Immediate next action: check the documented viewport/caret invariants and design a narrow guard around redundant relocation or projection work. A reviewer must approve the plan before implementation. Any candidate must retain distant block navigation, EOF paste/typing, source-selection mapping, image-height growth, and the previously repaired scroll-origin behavior. Issue stays open.
Bounded flicker plan from the retained current-Release profile (planning only; issue remains open).
The
6ca85fd2native paste trace shows a concrete invalidation/viewport correlation point: one accepted replacement performs a 96-sample immediate reveal, AppKit then re-entersscrollRangeToVisiblefor another 39-sample immediate reveal, and scheduled reconciliation work accounts for 55 samples. The profile did not visually reproduce the user's intermittent flicker, so this is a measured hotspot candidate rather than a confirmed flicker cause.Proposed reversible candidate: coalesce only an exact same-turn pending reveal in
BlockEditorView, keyed by source revision, requested display range, selected range, and reveal mode. Keep the first immediate TextKit relocation and its single deferred post-layout reconciliation. Create the token only when the first immediate reveal succeeds; consume it in the scheduled closure; allow all changed, failed, or later requests through. Do not special-case pasteboard content and do not change canonical Markdown/projection behavior.Material risks:
The candidate cannot close #14 without a reproducible visual sequence. After reviewer approval and a separately owned Release build, measure the same large-paste A/B first and verify source/caret/Undo. Then retain before/after evidence for mixed lists/images, appearance changes, selection, paste, and scrolling. A pass requires visible caret/source mapping plus absence of the reproduced flash; profile changes alone are insufficient.
Reviewer required narrower scope before implementation. The trace identifies native
super.pasteas the only proven duplicate caller, so a global reveal coalescer would expose unrelated Find, Accessibility, Undo, selection, and navigation paths without evidence.Amended candidate: create a one-shot exact marker only for the synchronous duration of native
super.paste. Arm it only after the canonical replacement's immediate non-local reveal has scheduled its retained post-layout reconciliation. Key it by revision, target range, selected range, attached window, and enclosing scroll view. The first paste-time AppKitscrollRangeToVisibleconsumes the marker and is skipped only on an exact match; all mismatches and failures run normally, anddeferclears the scope. Preserve the original immediate reveal and one asynchronous reconciliation, with the latter fenced to the same window and scroll view.This may remove one redundant TextKit relocation/layout pair, but it remains only a flicker correlation candidate. A focused shared-scroll native-paste caret/source/Undo test and exact Release A/B come first. Issue #14 still requires a reproduced continuous visual flash and mixed list/image plus appearance evidence before any repair or closure claim.
Narrow source candidate
51628eb9is ready for build-owner validation onwave16/editor-caret-relocation-perf, parent exact37c5d40.git diff --checkpassed; no local compile or runtime was performed.The implementation coalesces only an exact AppKit follow-up while synchronous native
super.pasteis active, retaining the canonical immediate reveal and one host-fenced deferred reconciliation. All custom paste, failed, changed, later, Find, Accessibility, Undo, selection, and navigation requests keep their existing paths. A focused shared-scroll native-paste regression asserts exact source, result selection, visible distant/EOF caret, and Undo.Independent implementation review: PASS, no P1/P2/P3 findings. Build-host tests and exact Release A/B are pending. This remains a measured relocation/layout hotspot candidate, not a verified flicker repair. #14 stays open until a continuous visual sequence reproduces the reported flash and before/after mixed list/image and appearance evidence shows it eliminated.
Combined integration candidate — worker
/root/block_drag_finishReviewed reveal-coalescing/flicker commit
51628eb92208b8e980acf0ddca91d5a328397c52is integrated conflict-free as8d3dd56dbb76805747783ba662b1150f366dfc0cwith identical stable patch ID. Combined tip isf99ed4f28ae3b21beb87e4a99c4bf4a05acaaae8in.worktrees/editor-structural-combined, based on exact26eb1552.Exact interaction review is active; no local build or GUI run. Focused flicker/cancellation coverage:
testRepeatedCaretRevealKeepsWrappedInsertionsVisibleInSharedScrollPage,testNativePasteKeepsDistantCaretVisibleAndUndoesInSharedScrollPage, andtestStaleCaretRevealDoesNotOverrideNewSelectionOrFocus. Runtime flicker/performance remains a separate QA gate.Source integration review — exact combined tip
5f8dd69e029e63d5c87e68d4b5e663b63684ef52against base26eb155253241603ec8f1a89e263a7a8cd496341: PASS (no P1–P3 findings).The reviewed native-paste reconciliation patch is unchanged by stable patch ID. Exact-request suppression remains limited to the active native paste and matching revision/selection/window/scroll identity; changed requests proceed normally, and deferred callbacks fail closed after selection, revision, attachment, or editability changes. The list, code-fragment, hover, image, and title additions do not broaden this suppression.
This is a source-only integration verdict. Compile and mounted runtime verification remain with the build/QA lanes.
Root fast-forwarded the clean preview integration branch from26eb1552 to exact5f8dd69e after independent combined source review PASS and diff-check. Includes code-block presentation, atomic disjoint list indentation, native-paste reveal coalescing, and hover lifecycle/footer-width correction. The known roughly7pt visible text/mentions alignment gap remains for native measurement. This is a NEXT build candidate; it does not supersede the current26eb event/title build and is not installed. No runtime/performance acceptance is claimed.
Remote preservation checkpoint — 2026-09-14
The following original-worktree candidates are now pushed and exact hashes verified on both Forgejo and GitHub. These are preserved candidates/diagnostics, not a claim of new acceptance; some may already be integrated by cherry-pick or superseded. Use the issue’s existing evidence before choosing changes to resume.
wave13/editor-chrome-runtime-repair—7c049cd14fde0797452459399a6a93c772f089f0Master #20 contains the resume instructions. No force push; dev remains
1d8f4adf.