diff --git a/.agents/design/colophon.jsonc b/.agents/design/colophon.jsonc new file mode 100644 index 000000000..14e0dffbb --- /dev/null +++ b/.agents/design/colophon.jsonc @@ -0,0 +1,60 @@ +{ + "$schema": "https://raw.githubusercontent.com/karkarl/colophon/main/extensions/colophon/colophon.schema.json", + "schemaVersion": 1, + "extends": "colophon/default", + "brand": { + "name": "Windows Fluent UI for OpenClaw", + "tagline": "A calm native Windows companion for your AI assistant." + }, + "theme": { + "light": { + "colors": { + "canvas": { "$token": "paper" }, + "sidebar": { "$token": "surface" }, + "foreground": { "$token": "ink" }, + "muted": { "$token": "muted" }, + "border": { "$token": "line" }, + "accent": { "$token": "accent" }, + "accentForeground": { "$token": "accentInk" } + }, + "typography": { + "body": { "$token": "body" }, + "heading": { "$token": "display" }, + "mono": { "$token": "mono" } + }, + "shape": { + "control": { "$token": "sm" }, + "panel": { "$token": "lg" } + } + }, + "dark": { + "colors": { + "canvas": { "$token": "paper", "mode": "dark" }, + "sidebar": { "$token": "surface", "mode": "dark" }, + "foreground": { "$token": "ink", "mode": "dark" }, + "muted": { "$token": "muted", "mode": "dark" }, + "border": { "$token": "line", "mode": "dark" }, + "accent": { "$token": "accent", "mode": "dark" }, + "accentForeground": { "$token": "accentInk", "mode": "dark" } + } + } + }, + "navigation": { + "sections": [ + { "id": "brand", "label": "Brand", "target": "brand" }, + { "id": "components", "label": "Components", "target": "components" } + ], + "components": { + "presentation": "flat-list", + "searchable": true + } + }, + "templates": { + "components": { + "tabs": ["spec", "usage", "demo"], + "layout": "stack", + "tableOfContents": false, + "modeComparison": "light-dark" + } + } +} diff --git a/.agents/design/components.jsonc b/.agents/design/components.jsonc new file mode 100644 index 000000000..ec99f0f79 --- /dev/null +++ b/.agents/design/components.jsonc @@ -0,0 +1,3581 @@ +{ + "meta": { + "version": 3, + "updatedBy": "copilot", + "note": "Windows Fluent UI for OpenClaw — ported from the v1 raw-CSS components.jsonc to v3 Auto Layout. WinUI-derived pixel padding is snapped to the nearest 4px spacing token; per-component notes record the source values and any approximation. Chat components track the native chat refresh in docs/CHAT_VISUAL_DESIGN.md and Themes/ChatResources.xaml (#1459): message and code surfaces use the `bubble` (12px) radius, the composer uses the `composer` (20px) radius, and chat binds the chat-local ChatResources brushes. Workspace-shell components (AgentIdentityBadge, ConnectionStatusFlyout, NotificationFlyout, WorkspaceShell) mirror the native Home and Sessions workspace shipped in #1541: WorkspaceWindow.xaml (Mica shell, left NavigationView, Owner footer), Controls/AgentIdentityBadge.xaml, Controls/GatewayStatusContent.xaml, and Controls/NotificationFlyoutContent.xaml are the source of truth; token bindings follow their ThemeResource keys." + }, + "components": [ + { + "name": "Button", + "note": "Basic control. Accent variation: ship the stock WinUI Button with AccentButtonStyle. ButtonStandard references this shared markup and overrides its state brushes for the normal style; a variant class cannot override inline token styling. Both use exact ButtonPadding 11,5,11,6, a retained 1px ButtonBorderThemeThickness, ControlCornerRadius 4, normal-weight 14px content, and the native 83ms linear background-only transition. Accent fill/foreground use accent/accentInk at rest; existing chatAction tokens already bind the same AccentButton hover, pressed-fill, and disabled resources. Pressed text and state borders have dedicated aliases, including high-contrast system colors. Width and height follow content; MinWidth 100 belongs only to wizard instances. Browser limits: elevation borders are flat swatches, the body line box is 20px, and the focus outline is not WinUI's system focus visual. Keep the native template, gradient brush, text measurement and FocusVisualMargin=-3 when shipping.", + "props": { + "children": "Save changes", + "disabled": "false" + }, + "root": { + "id": "button-root", + "el": "button", + "attrs": { + "type": "button", + "aria-disabled": "{disabled}" + }, + "layout": { + "mode": "horizontal", + "padding": { + "left": "buttonHorizontal", + "top": "buttonTop", + "right": "buttonHorizontal", + "bottom": "buttonBottom" + }, + "align": "center", + "justify": "center", + "width": "hug", + "height": "hug" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "accentInk", + "background": "accent", + "borderColor": "buttonAccentBorder", + "borderWidth": 1, + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "color": "accentInk", "background": "chatActionHover", "borderColor": "buttonAccentBorder" }, + "pressed": { "color": "buttonAccentPressedText", "background": "chatActionPressed", "borderColor": "buttonAccentPressedBorder" }, + "hoverPressed": { "color": "buttonAccentPressedText", "background": "chatActionPressed", "borderColor": "buttonAccentPressedBorder" }, + "disabled": { "color": "chatActionDisabledText", "background": "chatActionDisabled", "borderColor": "buttonAccentDisabledBorder" } + }, + "transitions": [ + { "properties": ["background-color"], "duration": 83, "easing": "linear" } + ], + "children": [ + "{children}" + ] + } + }, + { + "name": "ButtonStandard", + "note": "Normal variation of the shared Button, not a second implementation. Ship a stock WinUI Button with DefaultButtonStyle (no AccentButtonStyle), as used by Back in SetupEngine.UI/Pages/CapabilitiesPage.xaml. Inherits exact padding, 1px border, 4px corners, regular 14px content, disabled semantics, keyboard focus and 83ms background transition. Dedicated Button* resource tokens preserve normal, pointer-over, pressed and disabled fill/foreground/border, including high contrast. The native rest/hover ControlElevationBorderBrush remains a gradient; this renderer can only show its default flat stroke swatch and cannot reproduce BackgroundSizing=InnerBorderEdge. Native font metrics and system focus remain platform-owned. Use this same variation for ordinary secondary actions such as SettingsCard's Change.", + "props": { + "children": "Standard button", + "disabled": "false" + }, + "root": { + "id": "button-standard-root", + "component": "Button", + "props": { "children": "{children}", "disabled": "{disabled}" }, + "appearance": { + "color": "buttonText", + "background": "buttonFill", + "borderColor": "buttonBorder" + }, + "states": { + "hover": { "color": "buttonHoverText", "background": "buttonHoverFill", "borderColor": "buttonHoverBorder" }, + "pressed": { "color": "buttonPressedText", "background": "buttonPressedFill", "borderColor": "buttonPressedBorder" }, + "hoverPressed": { "color": "buttonPressedText", "background": "buttonPressedFill", "borderColor": "buttonPressedBorder" }, + "disabled": { "color": "buttonDisabledText", "background": "buttonDisabledFill", "borderColor": "buttonDisabledBorder" } + } + } + }, + { + "name": "TextBox", + "note": "Basic control. Reusable default WinUI single-line TextBox, matching the stock control used by DirectUrlBox in Pages/ConnectionPage.xaml. Body text is 14px, the preview is 32px high with sm (4px) corners, and TextControlThemePadding is preserved exactly as 10,5,6,6 through named spacing tokens. Normal uses control/ink, pointer-over uses controlHover, and disabled uses controlDisabled/disabledText. The input has no separate native Pressed visual state: pressed previews retain pointer-over fill, while actual focus draws the 2px accent underline through control.focus. The browser uses controlLine as a flat approximation of TextControlElevationBorderBrush; native focused fill and the clear-button template remain owned by WinUI. Port as Microsoft.UI.Xaml.Controls.TextBox without replacing its template.", + "props": { + "accessibleName": "Text", + "placeholder": "Enter text" + }, + "root": { + "id": "textbox-input", + "el": "input", + "attrs": { + "type": "text", + "aria-label": "{accessibleName}", + "placeholder": "{placeholder}" + }, + "layout": { + "padding": { + "left": "textControlLeft", + "top": "textControlTop", + "right": "textControlEnd", + "bottom": "textControlEnd" + }, + "width": "fill", + "height": 32 + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink", + "background": "control", + "borderColor": "controlLine", + "borderWidth": 1, + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "underline", "color": "accent" } + }, + "states": { + "hover": { "background": "controlHover" }, + "pressed": { "background": "controlHover" }, + "hoverPressed": { "background": "controlHover" }, + "disabled": { "color": "disabledText", "background": "controlDisabled" } + } + } + }, + { + "name": "Field", + "note": "Basic composition. A visible label above the shared TextBox control, separated by token 2 (8px), equivalent to a stock WinUI TextBox with Header and PlaceholderText. The Gateway address example passes its label as the TextBox accessible name and its placeholder through props. All input geometry and interaction states belong to TextBox, so this field and its instances stay aligned with the default control.", + "props": { + "label": "Gateway address", + "placeholder": "127.0.0.1:18789" + }, + "root": { + "id": "field-root", + "el": "label", + "class": "ds-field", + "layout": { + "mode": "vertical", + "gap": "2", + "width": "fill" + }, + "children": [ + { + "id": "field-label", + "el": "span", + "class": "ds-field-label", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink" + }, + "children": [ + "{label}" + ] + }, + { + "id": "field-input", + "component": "TextBox", + "props": { + "accessibleName": "{label}", + "placeholder": "{placeholder}" + } + } + ] + } + }, + { + "name": "Card", + "note": "Content card. Flat by default: a 1px hairline border, not a drop shadow. Padding mirrors the WinUI Gallery card (16,12) as tokens 4 (16) and 3 (12) exactly, with the `md` radius and a `line`-colored border supplied by the ds-card class. The title binds `subtitle` (SubtitleTextBlockStyle, 20/28 SemiBold) and the description binds `body` (BodyTextBlockStyle, 14/20 Regular). Open report composes the shared HyperlinkButton, including its body typography and hover, pressed, disabled, and focus states. The card itself is static; only its action is interactive. Never nest a card inside a card.", + "props": { + "title": "Windows node", + "body": "Paired · 6 capabilities exposed over MCP." + }, + "root": { + "id": "card-root", + "el": "article", + "class": "ds-card", + "layout": { + "mode": "vertical", + "gap": "2", + "padding": { + "x": "4", + "y": "3" + }, + "width": "fill" + }, + "children": [ + { + "id": "card-title", + "el": "h3", + "class": "ds-card-title", + "appearance": { + "fontFamily": "display", + "textStyle": "subtitle", + "color": "ink" + }, + "children": [ + "{title}" + ] + }, + { + "id": "card-body", + "el": "p", + "class": "ds-card-body", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "muted" + }, + "children": [ + "{body}" + ] + }, + { + "id": "card-link", + "component": "HyperlinkButton", + "props": { + "children": "Open report" + }, + "margin": { + "top": "1" + } + } + ] + } + }, + { + "name": "Badge", + "note": "Basic control. Read-only status pill with no hover/pressed actions. Semantic tones positive, warning and critical use the existing ds-badge classes; padding remains 12,4 and the radius is pill. BadgeAccent is the shared outlined accent variation: it references this Badge, overriding appearance and padding rather than duplicating its markup. Recommended is example text for that variant, not a separate setup control. Workspace count and notification recurrence badges retain their documented host-specific geometry.", + "props": { + "children": "Connected", + "tone": "positive" + }, + "root": { + "id": "badge-root", + "el": "span", + "class": "ds-badge ds-badge-{tone}", + "layout": { + "mode": "horizontal", + "padding": { + "x": "3", + "y": "1" + }, + "align": "center", + "width": "hug" + }, + "children": [ + "{children}" + ] + } + }, + { + "name": "BadgeAccent", + "note": "Outlined accent variation of Badge, derived from production Controls/RecommendedBadge.xaml at 0131e4ce1f7937b22c69b289564087061687fa14. Caption text and a 1px border bind AccentTextFillColorPrimaryBrush (accentText), not AccentFillColorDefaultBrush. Transparent fill, sm (4px) corners, and native 8,4 padding. Disabled text and border bind TextFillColorDisabledBrush. Read-only, with no hover/pressed action. This component reference is a named variant of the shared Badge, not a second implementation.", + "props": { "children": "Recommended" }, + "root": { + "id": "badge-accent-root", + "component": "Badge", + "props": { "children": "{children}", "tone": "neutral" }, + "layout": { "padding": { "x": "2", "y": "1" } }, + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "accentText", + "background": "$none", + "borderColor": "accentText", + "borderWidth": 1, + "radius": "sm" + }, + "states": { + "disabled": { "color": "disabledText", "borderColor": "disabledText" } + } + } + }, + { + "name": "SubtleButton", + "note": "Basic control. Default WinUI SubtleButtonStyle, not the workspace's fixed-size icon variant. Uses native ButtonPadding 11,5,11,6 (left, top, right, bottom), a retained 1px ButtonBorderThemeThickness, sm (4px) ControlCornerRadius, and normal-weight 14px text. Width and height follow content; the style itself sets no 40x40 dimensions. Background, border, and foreground bind SubtleButton-specific normal, pointer-over, pressed, and disabled resources, including high-contrast overrides. Preview hover/pressed border tokens are transparent in light/dark: CSS paints the fill under the border, so adding the translucent native border again would produce an incorrect dark rim. High-contrast borders and keyboard focus remain visible. Disabled fill and border resolve to the same values as rest; disabled text uses TextFillColorDisabledBrush, not muted. Port with Style={StaticResource SubtleButtonStyle}, leaving the native template intact rather than copying the browser border compensation. Browser limitations: body uses a 20px line box; native system focus (FocusVisualMargin=-3) and the 83ms background transition are not reproduced by Colophon's shared renderer. Workspace icon sizing and padding overrides belong to usage variants.", + "props": { + "label": "Subtle button", + "accessibleName": "Subtle button", + "disabled": "false" + }, + "root": { + "id": "subtle-button-root", + "el": "button", + "attrs": { + "type": "button", + "aria-label": "{accessibleName}", + "aria-disabled": "{disabled}" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": { + "left": "buttonHorizontal", + "top": "buttonTop", + "right": "buttonHorizontal", + "bottom": "buttonBottom" + }, + "width": "hug", + "height": "hug" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "subtleButtonText", + "background": "subtleButtonFill", + "borderColor": "subtleButtonBorder", + "borderWidth": 1, + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "color": "subtleButtonHoverText", "background": "subtleButtonHoverFill", "borderColor": "subtleButtonHoverBorder" }, + "pressed": { "color": "subtleButtonPressedText", "background": "subtleButtonPressedFill", "borderColor": "subtleButtonPressedBorder" }, + "hoverPressed": { "color": "subtleButtonPressedText", "background": "subtleButtonPressedFill", "borderColor": "subtleButtonPressedBorder" }, + "disabled": { "color": "subtleButtonDisabledText", "background": "subtleButtonFill", "borderColor": "subtleButtonBorder" } + }, + "children": [ + "{label}" + ] + } + }, + { + "name": "HyperlinkButton", + "note": "Basic control. WinUI HyperlinkButton used for inline navigation and quiet actions (Reconnect, Approve, Open Connection, Clear all, Open notifications). Accent link text (system accent hyperlink brush, token `accent`) with no border or fill at rest; hover shows the subtle wash (SubtleFillColorSecondary, `subtleHover`) and pressed deepens to SubtleFillColorTertiary (`subtlePressed`); disabled drops to `muted`. Horizontal padding mirrors the production `Padding=4,0` (token `1` left/right, no vertical pad); `sm` radius. Text uses the `body` scale. `control.chrome:none` strips the web button chrome; `control.focus` supplies the accent focus rectangle.", + "props": { + "children": "Open Connection" + }, + "root": { + "id": "hyperlink-button-root", + "el": "button", + "attrs": { + "type": "button" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "padding": { + "left": "1", + "right": "1" + }, + "width": "hug" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "accent", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" }, + "disabled": { "color": "muted", "background": "$none" } + }, + "children": [ + "{children}" + ] + } + }, + { + "name": "ToggleSwitch", + "note": "Basic control. Interactive WinUI ToggleSwitch track reference, initially On. Each instance owns its checked state; click, Space, and Enter toggle it without saving to the design file. Native geometry is 40x20 with a 12x12 resting/disabled knob, 14x14 pointer-over knob, and 17x14 pressed knob. The carrier travels 20px in 367ms with the WinUI reposition reference spline 0.1,0.9,0.2,1. Independent thumb resizing uses 83ms and spline 0,0,0,1, or 250ms when disabled. Reduced motion suppresses transitions. Knob placement preserves the native half-pixel margins and pressed endpoint alignment. disabled=\"true\" prevents interaction. Full header/content layout, dragging, native focus visuals, and CircleElevationBorderBrush remain native behavior. Requires Colophon persistent-state/geometry support. See DESIGN.md for bindings and limitations.", + "props": { + "label": "Enable feature", + "disabled": "false" + }, + "root": { + "id": "toggle-switch-root", + "el": "button", + "attrs": { + "type": "button", + "role": "switch", + "aria-label": "{label}", + "aria-disabled": "{disabled}" + }, + "state": { "checked": true }, + "on": { "click": { "toggle": "checked" } }, + "layout": { "mode": "freeform", "width": 40, "height": 20, "padding": "0" }, + "appearance": { "background": "$none", "borderColor": "$none", "borderWidth": 0, "radius": "pill" }, + "control": { "chrome": "none", "focus": { "kind": "outline", "color": "accent" } }, + "children": [ + { + "id": "toggle-switch-track", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "position": { "mode": "absolute", "x": 0, "y": 0 }, + "layout": { "width": 40, "height": 20 }, + "appearance": { "background": "toggleOffFill", "borderColor": "toggleOffStroke", "borderWidth": 1, "radius": "pill" }, + "transitions": [{ "properties": ["background-color", "border-color"], "duration": 83, "easing": "linear" }], + "states": { + "hover": { "background": "toggleOffHoverFill", "borderColor": "toggleOffHotStroke" }, + "pressed": { "background": "toggleOffPressedFill", "borderColor": "toggleOffHotStroke" }, + "disabled": { "background": "toggleOffDisabledFill", "borderColor": "toggleDisabledStroke" } + }, + "when": [ + { "state": { "checked": true }, "style": { "background": "accent", "borderColor": "toggleOnStroke", "transitions": [] } }, + { "state": { "checked": true }, "interaction": "hover", "style": { "background": "toggleOnHoverFill", "borderColor": "toggleOnHotStroke" } }, + { "state": { "checked": true }, "interaction": "pressed", "style": { "background": "toggleOnPressedFill", "borderColor": "toggleOnHotStroke" } }, + { "state": { "checked": true }, "interaction": "disabled", "style": { "background": "toggleOnDisabledFill", "borderColor": "toggleOnDisabledStroke" } } + ] + }, + { + "id": "toggle-switch-carrier", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "position": { "mode": "absolute", "x": -0.5, "y": 0 }, + "layout": { "mode": "horizontal", "align": "center", "justify": "center", "width": 20, "height": 20 }, + "geometry": { "translateX": 0 }, + "transitions": [{ "properties": ["translate"], "duration": 367, "easing": [0.1, 0.9, 0.2, 1] }], + "when": [{ "state": { "checked": true }, "style": { "geometry": { "translateX": 20 } } }], + "children": [ + { + "id": "toggle-switch-thumb", + "el": "span", + "layout": { "width": 12, "height": 12 }, + "appearance": { "background": "toggleOffKnob", "radius": "pill" }, + "geometry": { "translateX": 0 }, + "transitions": [{ "properties": ["width", "height"], "duration": 83, "easing": [0, 0, 0, 1] }], + "states": { + "hover": { "background": "toggleOffHotKnob", "geometry": { "width": 14, "height": 14 } }, + "pressed": { "background": "toggleOffHotKnob", "geometry": { "width": 17, "height": 14, "translateX": 2 } }, + "disabled": { + "background": "disabledText", + "transitions": [{ "properties": ["width", "height"], "duration": 250, "easing": [0, 0, 0, 1] }] + } + }, + "when": [ + { "state": { "checked": true }, "style": { "background": "accentInk" } }, + { "state": { "checked": true }, "interaction": "hover", "style": { "background": "toggleOnHotKnob" } }, + { "state": { "checked": true }, "interaction": "pressed", "style": { "background": "toggleOnHotKnob", "geometry": { "translateX": -1 } } }, + { "state": { "checked": true }, "interaction": "disabled", "style": { "background": "toggleOnDisabledKnob" } } + ] + } + ] + } + ] + } + }, + { + "name": "StatusDot", + "note": "Basic control. The 10x10 connection/status indicator reused in the gateway flyout (Ellipse), the workspace Owner footer (10px FontIcon), and the identity badges. Non-interactive, so no hover/pressed states. Fill is a semantic token; previewed `positive` (SystemFillColorSuccess) for connected, and the variants are `warning` (SystemFillColorCaution) attention, `critical` (SystemFillColorCritical) error, and `muted`/neutral unknown. 10px sits between spacing tokens (nearest `2`=8); previewed at a literal 10x10 with a `pill` radius.", + "props": { + "tone": "positive" + }, + "root": { + "id": "status-dot-root", + "el": "span", + "attrs": { + "role": "img", + "aria-label": "Connected" + }, + "layout": { + "mode": "horizontal", + "width": 10, + "height": 10 + }, + "appearance": { + "background": "positive", + "radius": "pill" + } + } + }, + { + "name": "Avatar", + "note": "Basic control. Default WinUI PersonPicture initials reference: 96x96, a 1px ellipse stroke, PersonPictureEllipseFillThemeBrush, primary foreground, and SemiBold initials at diameter * 0.42 = 40.32px. ContentControlThemeFontFamily, not the Caption style. No hover or pressed states: PersonPicture is not interactive. AvatarStates shows Contact and People glyph fallbacks. Photo clipping, automatic initials, badges, and native TextLineBounds=Tight remain native behavior. Existing 32px agent and 24px owner avatars are usage overrides, not this control's defaults.", + "props": { + "initials": "AU", + "name": "Example user" + }, + "root": { + "id": "avatar-root", + "el": "span", + "attrs": { + "role": "img", + "aria-label": "{name}" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 96, + "height": 96 + }, + "appearance": { + "textStyle": "personInitials", + "color": "nativeText", + "background": "personPictureFill", + "borderColor": "personPictureStroke", + "borderWidth": 1, + "radius": "pill" + }, + "children": [ + "{initials}" + ] + } + }, + { + "name": "AvatarStates", + "note": "PersonPicture's native initials, NoPhotoOrInitials (Contact U+E77B), and Group (People U+E716) presentations. All are static and non-focusable. Photo and badge states require native image/initials handling and are not claimed by these references.", + "root": { + "id": "avatar-states-root", + "el": "div", + "layout": { "mode": "horizontal", "gap": "6", "wrap": true }, + "children": [ + { "id": "avatar-initials", "component": "Avatar" }, + { "id": "avatar-contact", "component": "Avatar", "props": { "initials": "\uE77B", "name": "Person without photo or initials" }, "appearance": { "textStyle": "personSymbol" } }, + { "id": "avatar-group", "component": "Avatar", "props": { "initials": "\uE716", "name": "Group" }, "appearance": { "textStyle": "personSymbol" } } + ] + } + }, + { + "name": "InfoBar", + "note": "Basic control. Native InfoBar horizontal reference, shown Error. Severity changes BOTH background and layered 16px icon; InfoBarStates shows all four. Native title is 14px SemiBold and message 14px Normal, both primary foreground. ControlCornerRadius=4; content-grid minimum height=48 plus outer border; leading padding=16, icon gap=14, text top=14, title/message gap=12, panel end margin=16. Close uses InfoBarCloseButtonStyle (DefaultButtonStyle with AppBarButton resources), 38x38 plus margin 5, with a 16px Cancel glyph. Hover/press/disabled/focus visuals work, but close does NOT dismiss: the renderer has no dismiss action. Native responsive InfoBarPanel, conditional content and high-contrast 2px border are unsupported; browser wrapping and the 1px preview border are not 1:1 native proof.", + "props": { + "title": "Couldn't reach the gateway", + "message": "Check that the gateway is running, then retry.", + "iconTone": "infoErrorIcon", + "iconGlyph": "\uF13D" + }, + "root": { + "id": "info-bar-root", + "el": "div", + "attrs": { "role": "status" }, + "layout": { + "mode": "horizontal", + "padding": { "left": "4" }, + "align": "start", + "width": "fill" + }, + "appearance": { + "background": "infoErrorFill", + "borderColor": "infoBorder", + "borderWidth": 1, + "radius": "sm" + }, + "children": [ + { + "id": "info-bar-icon", + "el": "svg", + "attrs": { + "aria-hidden": "true", + "viewBox": "0 0 16 16", + "width": 16, + "height": 16 + }, + "layout": { "width": 16, "height": 16 }, + "margin": { "top": "4", "right": "infoIconGap", "bottom": "4" }, + "appearance": { "textStyle": "infoSymbol" }, + "children": [ + { "id": "info-bar-icon-background", "el": "text", "attrs": { "x": 8, "y": 8, "text-anchor": "middle", "dominant-baseline": "central", "fill": "var(--color-{iconTone})" }, "children": [ "\uF136" ] }, + { "id": "info-bar-icon-foreground", "el": "text", "attrs": { "x": 8, "y": 8, "text-anchor": "middle", "dominant-baseline": "central", "fill": "var(--color-infoIconForeground)" }, "children": [ "{iconGlyph}" ] } + ] + }, + { + "id": "info-bar-text", + "el": "div", + "layout": { "mode": "horizontal", "gap": "3", "wrap": true, "grow": true }, + "margin": { "top": "infoTextTop", "right": "4" }, + "children": [ + { + "id": "info-bar-title", + "el": "span", + "appearance": { "fontFamily": "body", "textStyle": "bodyStrong", "color": "nativeText" }, + "children": [ "{title}" ] + }, + { + "id": "info-bar-message", + "el": "span", + "appearance": { "fontFamily": "body", "textStyle": "body", "color": "nativeText" }, + "children": [ "{message}" ] + } + ] + }, + { + "id": "info-bar-close", + "el": "button", + "attrs": { "type": "button", "aria-label": "Close (visual reference only)", "title": "Visual states only. Dismissal is not supported by this renderer." }, + "layout": { "mode": "horizontal", "align": "center", "justify": "center", "width": 38, "height": 38 }, + "margin": "buttonTop", + "appearance": { "color": "nativeText", "background": "$none", "borderColor": "$none", "borderWidth": 1, "radius": "sm" }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "infoCloseHoverFill", "color": "infoCloseHoverText" }, + "pressed": { "background": "infoClosePressedFill", "color": "infoClosePressedText" }, + "hoverPressed": { "background": "infoClosePressedFill", "color": "infoClosePressedText" }, + "disabled": { "background": "$none", "color": "subtleButtonDisabledText" } + }, + "children": [ + { + "id": "info-bar-close-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "infoSymbol" }, + "children": [ "\uE711" ] + } + ] + } + ] + } + }, + { + "name": "InfoBarStates", + "note": "Native severity references. Each reuses InfoBar's geometry, typography, layered glyph, and close-control states. The body remains static; severity is not a hover state. No close/dismiss behavior is implemented by Colophon.", + "root": { + "id": "info-bar-states-root", + "el": "div", + "layout": { "mode": "vertical", "gap": "3", "width": "fill" }, + "children": [ + { "id": "info-bar-informational", "component": "InfoBar", "props": { "title": "Informational", "message": "Gateway settings are ready to review.", "iconTone": "infoAttentionIcon", "iconGlyph": "\uF13F" }, "appearance": { "background": "infoAttentionFill" } }, + { "id": "info-bar-success", "component": "InfoBar", "props": { "title": "Success", "message": "The gateway is connected.", "iconTone": "infoSuccessIcon", "iconGlyph": "\uF13E" }, "appearance": { "background": "infoSuccessFill" } }, + { "id": "info-bar-warning", "component": "InfoBar", "props": { "title": "Warning", "message": "Pairing approval is required.", "iconTone": "infoWarningIcon", "iconGlyph": "\uF13C" }, "appearance": { "background": "infoWarningFill" } }, + { "id": "info-bar-error", "component": "InfoBar", "props": { "title": "Error", "message": "The gateway could not be reached." } } + ] + } + }, + { + "name": "ComposerPicker", + "note": "ReactorChatComposer.PickerButton at production 9e4999c6: a native Button with toolbar resource overrides, not a ComboBox. Native label 13px, ChevronDown U+E70D at 12px, 4px label-to-chevron gap, 8px horizontal and 4px vertical padding, 32px minimum height, 4px corners and no border. ChatSecondaryTextBrush supplies rest text. Model and effort are right-aligned in Workspace; only standalone ChatWindow includes a session trigger. The browser opens a representative option list, not the production searchable model flyout or effort slider. Native label trimming, 44px compact targets and the narrow effort gauge remain port requirements.", + "props": { + "label": "Model" + }, + "root": { + "id": "composer-picker-root", + "el": "button", + "attrs": { + "type": "button", + "aria-haspopup": "listbox", + "aria-label": "{label}" + }, + "layout": { + "mode": "horizontal", + "gap": "1", + "padding": { + "left": "2", + "right": "2", + "top": "1", + "bottom": "1" + }, + "align": "center", + "height": 32, + "width": "hug" + }, + "appearance": { + "textStyle": "chatPicker", + "color": "chatSecondary", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover", "color": "subtleButtonHoverText" }, + "pressed": { "background": "subtlePressed", "color": "subtleButtonPressedText" }, + "hoverPressed": { "background": "subtlePressed", "color": "subtleButtonPressedText" }, + "disabled": { "color": "disabledText", "background": "$none" } + }, + "on": { "click": { "open": "ComposerPickerOptions" } }, + "children": [ + { + "id": "composer-picker-label", + "el": "span", + "children": [ + "{label}" + ] + }, + { + "id": "composer-picker-chevron", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "chatChevron" }, + "children": [ "\uE70D" ] + } + ] + } + }, + { + "name": "ComposerPickerOptions", + "note": "Representative single-select flyout for the subtle composer pickers (model, session, reasoning-effort). Ships as a WinUI Flyout of RadioMenuItem rows on a `surface` (CardBackgroundFillColorDefault) sheet with 12px (`lg`) overlay corners (ChatPickerFlyoutStyle, #1459) and `md` shadow. Rows have 4px (`sm`) corners and full-row hover/pressed fills through `subtleHover`/`subtlePressed` (SubtleFillColorSecondary/Tertiary, the light/dark MenuFlyoutItem state resources). Pointer exit restores transparent fill without changing selection or geometry. Each row reserves a 16px leading glyph column; the selected row keeps its `accent` Segoe Fluent Icons CheckMark (U+E73E), not a radio dot. The check uses the existing 12px Fluent-glyph typography token, without raw style overriding its width or color. High-contrast subtle fills remain transparent under the current token contract; native MenuFlyout system-highlight overrides are not reproduced. This preview retains a representative checked row, not persistent model selection. Because `on.click.open` targets take no props, all triggers show the same representative model list; the searchable model flyout and effort slider/gauge remain app behavior.", + "root": { + "id": "composer-picker-options", + "el": "div", + "attrs": { "role": "menu", "aria-label": "Model" }, + "layout": { "mode": "vertical", "gap": "1", "padding": "1", "width": "hug" }, + "appearance": { "background": "surface", "color": "ink", "textStyle": "small", "radius": "lg", "shadow": "md" }, + "children": [ + { + "id": "composer-option-sonnet", + "el": "label", + "attrs": { "role": "menuitemradio", "aria-checked": "true" }, + "layout": { "mode": "horizontal", "gap": "2", "align": "center", "padding": { "x": "2", "y": "1" } }, + "appearance": { "background": "$none", "radius": "sm" }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { "id": "composer-option-sonnet-check", "el": "span", "attrs": { "aria-hidden": "true" }, "layout": { "width": 16 }, "appearance": { "textStyle": "chatChevron", "color": "accent", "textAlign": "center" }, "children": ["\uE73E"] }, + "Claude Sonnet 5" + ] + }, + { + "id": "composer-option-opus", + "el": "label", + "attrs": { "role": "menuitemradio", "aria-checked": "false" }, + "layout": { "mode": "horizontal", "gap": "2", "align": "center", "padding": { "x": "2", "y": "1" } }, + "appearance": { "background": "$none", "radius": "sm" }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { "id": "composer-option-opus-check", "el": "span", "attrs": { "aria-hidden": "true" }, "layout": { "width": 16 } }, + "Claude Opus 4.8" + ] + }, + { + "id": "composer-option-gpt", + "el": "label", + "attrs": { "role": "menuitemradio", "aria-checked": "false" }, + "layout": { "mode": "horizontal", "gap": "2", "align": "center", "padding": { "x": "2", "y": "1" } }, + "appearance": { "background": "$none", "radius": "sm" }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { "id": "composer-option-gpt-check", "el": "span", "attrs": { "aria-hidden": "true" }, "layout": { "width": 16 } }, + "GPT-5.6" + ] + } + ] + } + }, + { + "name": "ChatBubble", + "note": "Bubbleless assistant turn from ReactorChatTimeline and ChatMarkdownPresentation at production 9e4999c6. This reference shows the below-960px chat viewport variant without an avatar, at the 736px prose cap (768 minus two 16px insets). Native prose is 14/21, with 16px between blocks and 4px vertical content padding. The footer is sender, time, model and usage at 12/18, followed by 32x32 Copy and Read aloud controls with 14px Fluent glyphs. Copy is always visible. Read aloud previews the native 70% resting opacity through chatReadAloudText, returning to full alpha over the button; native row-level hover is not represented. Native avatars appear in a separate 44px gutter above the 960px breakpoint; do not replace the production logo with an invented sparkle. ChatTextBrush and ChatSecondaryTextBrush preserve alpha. The native source remains authoritative for Markdown, responsive layout, clipboard and speech behavior.", + "props": { + "sender": "Assistant", + "time": "2:14 PM", + "model": "browse", + "usage": "12.5K/200K (6%)", + "children": "FIXTURE MAIN: the lighthouse is green." + }, + "root": { + "id": "chat-bubble-root", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "start", + "width": 736 + }, + "children": [ + { + "id": "chat-bubble-stack", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "1", + "align": "start", + "grow": true + }, + "children": [ + { + "id": "chat-bubble-message", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "4", + "padding": { "y": "1" }, + "width": "fill" + }, + "appearance": { + "textStyle": "chatProse", + "color": "chatText" + }, + "children": [ + "{children}" + ] + }, + { + "id": "chat-bubble-footer", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "1", + "align": "center" + }, + "margin": { "top": "1" }, + "appearance": { + "textStyle": "chatFooter", + "color": "chatSecondary" + }, + "children": [ + { + "id": "chat-bubble-identity", + "el": "span", + "margin": { "right": "1" }, + "children": [ + "{sender} · {time} · {model} · {usage}" + ] + }, + { + "id": "chat-bubble-copy", + "component": "ChatCopyButton" + }, + { + "id": "chat-bubble-readaloud", + "el": "button", + "attrs": { + "type": "button", + "title": "Read aloud", + "aria-label": "Read message aloud" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 32, + "height": 32, + "padding": "0" + }, + "appearance": { + "color": "chatReadAloudText", + "background": "$none", + "radius": "sm" + }, + "control": { "chrome": "none", "focus": { "kind": "outline", "color": "accent" } }, + "states": { + "hover": { "background": "subtleHover", "color": "chatSecondary" }, + "pressed": { "background": "chatReadAloudPressed", "color": "chatSecondary" }, + "hoverPressed": { "background": "chatReadAloudPressed", "color": "chatSecondary" } + }, + "children": [ + { + "id": "chat-bubble-readaloud-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "chatActionIcon" }, + "children": [ "\uE767" ] + } + ] + } + ] + } + ] + } + ] + } + }, + { + "name": "ChatUserBubble", + "note": "Sent user bubble from ReactorChatTimeline.BuildUser at production 9e4999c6. Native ChatUserBrush is the system accent at 8% in Light and 12% in Dark, not a solid blue card. Text uses ChatUserTextBrush (primary text; highlight text in HC), 14/21, with 16px horizontal and 12px vertical padding, no stroke and 12px corners. The native width is content-sized and capped at 720px. The shared 32px Copy action sits below with 8px of stack spacing plus the native 2px top and 4px trailing margin, preserving the measured 10px gap for a sent message. Hover-only native metadata and queued-message states are not reproduced by this sent-message reference.", + "props": { "children": "Can we browse the synthetic Gateway?" }, + "root": { + "id": "chat-user-root", + "el": "div", + "layout": { "mode": "vertical", "gap": "2", "align": "end", "width": "hug" }, + "children": [ + { + "id": "chat-user-surface", + "el": "div", + "layout": { "mode": "vertical", "gap": "2", "padding": { "x": "4", "y": "3" } }, + "appearance": { "textStyle": "chatProse", "background": "chatUser", "color": "chatUserText", "radius": "bubble" }, + "children": [ "{children}" ] + }, + { + "id": "chat-user-copy", + "component": "ChatCopyButton", + "margin": { "top": "half", "right": "1" } + } + ] + } + }, + { + "name": "ChatComposer", + "note": "Workspace composer from ReactorChatComposer at production 9e4999c6, measured against the Release app and fixture Gateway. Reference width 768px, resting outer height 112px, 20px radius, 1px ChatStrokeBrush, native alpha-preserving ChatComposerBrush card fill. Inner padding is 16,12,16,8; input is at least 44px tall with 16px text and no padding, fill, border or accent underline, including focus. Stack gap 8px. Attach is the native paperclip U+E723, not Add. Workspace omits the session selector; model and effort align right before Voice and circular 32px Send. Toolbar glyphs are native 16px Segoe Fluent Icons. Preview contains a draft so Send is enabled; typing does not send, auto-grow, or update Send eligibility. Empty/disabled, Stop, narrow gauge, native flyouts and dynamic input behavior remain production responsibilities. At native widths <=560 effort uses a 44px gauge; the installed renderer cannot express that responsive switch. The reading cap, 40px/12px outer gutters and 12px vertical margin belong to the host, not this isolated writing-surface component.", + "props": { + "placeholder": "Message Assistant (Enter to send)", + "draft": "Draft for visual comparison", + "model": "Fixture Browse", + "effort": "off" + }, + "root": { + "id": "chat-composer-root", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "2", + "padding": { "left": "4", "top": "3", "right": "4", "bottom": "2" }, + "width": 768, + "height": 112 + }, + "appearance": { + "background": "chatSurface", + "borderColor": "chatStroke", + "borderWidth": 1, + "radius": "composer" + }, + "children": [ + { + "id": "chat-composer-input", + "el": "textarea", + "attrs": { + "placeholder": "{placeholder}", + "aria-label": "Message input", + "rows": "2" + }, + "layout": { + "padding": "0", + "width": "fill", + "height": 44 + }, + "margin": "0", + "appearance": { + "textStyle": "chatInput", + "color": "chatText", + "background": "$none", + "borderWidth": 0, + "radius": "$none" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "chatCanvas" } + }, + "children": [ + "{draft}" + ] + }, + { + "id": "chat-composer-toolbar", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "center", + "justify": "space-between", + "width": "fill" + }, + "children": [ + { + "id": "chat-composer-left", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "center" + }, + "children": [ + { + "id": "chat-composer-add", + "el": "button", + "attrs": { + "type": "button", + "title": "Attach", + "aria-label": "Attach" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": "0", + "width": 32, + "height": 32 + }, + "appearance": { + "color": "chatSecondary", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { + "id": "chat-composer-add-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "chatIcon" }, + "children": [ "\uE723" ] + } + ] + } + ] + }, + { + "id": "chat-composer-right", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "1", + "align": "center" + }, + "children": [ + { + "id": "chat-composer-pickers", + "el": "div", + "layout": { "mode": "horizontal", "gap": "0", "align": "center" }, + "children": [ + { "id": "chat-composer-model", "component": "ComposerPicker", "props": { "label": "{model}" } }, + { "id": "chat-composer-effort", "component": "ComposerPicker", "props": { "label": "{effort}" } } + ] + }, + { + "id": "chat-composer-mic", + "el": "button", + "attrs": { + "type": "button", + "title": "Voice", + "aria-label": "Voice" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": "0", + "width": 32, + "height": 32 + }, + "appearance": { + "color": "chatSecondary", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { + "id": "chat-composer-mic-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "chatIcon" }, + "children": [ "\uE720" ] + } + ] + }, + { + "id": "chat-composer-send", + "el": "button", + "attrs": { + "type": "button", + "title": "Send", + "aria-label": "Send" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": "0", + "width": 32, + "height": 32 + }, + "appearance": { + "background": "accent", + "color": "accentInk", + "radius": "pill" + }, + "control": { "chrome": "none", "focus": { "kind": "outline", "color": "accent" } }, + "states": { + "hover": { "background": "chatActionHover" }, + "pressed": { "background": "chatActionPressed", "color": "chatActionPressedText" }, + "hoverPressed": { "background": "chatActionPressed", "color": "chatActionPressedText" }, + "disabled": { "background": "chatActionDisabled", "color": "chatActionDisabledText" } + }, + "children": [ + { + "id": "chat-composer-send-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "chatIcon" }, + "children": [ "\uE74A" ] + } + ] + } + ] + } + ] + } + ] + } + }, + { + "name": "ChatThread", + "note": "Fixture-shaped composition of the shared ChatUserBubble, bubbleless ChatBubble and Workspace ChatComposer. The 848px reference frame includes two 40px host gutters around the 768px reading column; transcript prose has a further 16px inset. It paints the native content layer once, with transparent chat content and translucent card/user surfaces above it. Actual Mica depends on the desktop, activation and transparency settings, so the browser's neutral backplate is not an exact wallpaper-dependent Mica reproduction. Native timeline virtualization, anchored composer placement and responsive gutters remain host behavior.", + "root": { + "id": "chat-thread-root", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "3", + "width": 848, + "padding": { "x": "chatGutter", "y": "4" } + }, + "appearance": { "background": "chatLayer" }, + "children": [ + { + "id": "chat-thread-user", + "el": "div", + "layout": { + "mode": "horizontal", + "justify": "end", + "width": "fill", + "padding": { "x": "4" } + }, + "children": [ + { + "id": "chat-thread-user-bubble", + "component": "ChatUserBubble" + } + ] + }, + { + "id": "chat-thread-assistant", + "component": "ChatBubble", + "margin": { "x": "4", "y": "3" }, + "props": { + "time": "11:01 PM", + "usage": "200/128.0K (0%)" + } + }, + { + "id": "chat-thread-composer", + "component": "ChatComposer" + } + ] + } + }, + { + "name": "ChatCopyButton", + "note": "Shared native ChatCopyButton for user turns, assistant turns and code. 32x32 target, 4px padding, 4px corners, no border, and the 14px Segoe Fluent Copy glyph U+E8C8. Rest foreground is ChatSecondaryTextBrush. Native clipboard confirmation changes to Check U+E73E, announces Copied and resets after two seconds; clipboard behavior is not implemented by the preview. Hover, press, disabled and focus visuals are represented.", + "root": { + "id": "chat-copy-root", + "el": "button", + "attrs": { + "type": "button", + "title": "Copy", + "aria-label": "Copy" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": "1", + "width": 32, + "height": 32 + }, + "appearance": { + "color": "chatSecondary", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover", "color": "subtleButtonHoverText" }, + "pressed": { "background": "subtlePressed", "color": "subtleButtonPressedText" }, + "hoverPressed": { "background": "subtlePressed", "color": "subtleButtonPressedText" }, + "disabled": { "background": "$none", "color": "disabledText" } + }, + "children": [ + { + "id": "chat-copy-glyph", + "el": "span", + "attrs": { + "aria-hidden": "true" + }, + "appearance": { "textStyle": "chatActionIcon" }, + "children": [ "\uE8C8" ] + } + ] + } + }, + { + "name": "AgentIdentityBadge", + "note": "Agent identity row from Controls/AgentIdentityBadge.xaml (#1541): a 32x32 PersonPicture avatar (circular, so `pill` radius) to the LEFT of a two-line stack — agent display name in body type over the agent id in caption `muted` (TextFillColorSecondary) — with a trailing `muted` ChevronDown (Segoe Fluent U+E70D, previewed ~12px) marking it as the assistant selector's dropdown trigger. It ships as a subtle transparent WinUI DropDownButton (SubtleFillColorTransparent rest via `control.chrome:none`, `subtleHover`/`subtlePressed` through `states`, and a `control.focus` accent focus rectangle), so it stays quiet chrome and spends no accent at rest. Column spacing 12px maps to token 3; MinHeight 40 and the PersonPicture initials/photo fallback are port notes. Used as the assistant selector trigger and anywhere an agent is named. In-app the avatar is a real PersonPicture (initials or gateway avatar), previewed here with a person glyph.", + "props": { + "name": "Aurora", + "handle": "agent-aurora" + }, + "root": { + "id": "agent-badge-root", + "el": "button", + "attrs": { + "type": "button", + "aria-haspopup": "listbox", + "aria-label": "{name}" + }, + "layout": { + "mode": "horizontal", + "gap": "3", + "align": "center", + "padding": "1", + "width": "fill" + }, + "appearance": { + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { + "id": "agent-badge-avatar", + "el": "div", + "attrs": { + "aria-hidden": "true" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 32, + "height": 32 + }, + "appearance": { + "background": "surface", + "borderColor": "controlLine", + "color": "muted", + "radius": "pill" + }, + "children": [ + { + "id": "agent-badge-avatar-glyph", + "el": "svg", + "attrs": { + "width": "16", + "height": "16", + "viewBox": "0 0 24 24", + "fill": "none", + "stroke": "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true" + }, + "children": [ + { + "id": "agent-badge-avatar-head", + "el": "circle", + "attrs": { + "cx": "12", + "cy": "8", + "r": "4" + } + }, + { + "id": "agent-badge-avatar-body", + "el": "path", + "attrs": { + "d": "M4 20a8 8 0 0 1 16 0" + } + } + ] + } + ] + }, + { + "id": "agent-badge-text", + "el": "div", + "layout": { + "mode": "vertical", + "align": "start", + "grow": true + }, + "children": [ + { + "id": "agent-badge-name", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink", + "textAlign": "left" + }, + "children": [ + "{name}" + ] + }, + { + "id": "agent-badge-id", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "muted", + "textAlign": "left" + }, + "children": [ + "{handle}" + ] + } + ] + }, + { + "id": "agent-badge-chevron", + "el": "svg", + "attrs": { + "width": "12", + "height": "12", + "viewBox": "0 0 24 24", + "fill": "none", + "stroke": "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true" + }, + "appearance": { + "color": "muted" + }, + "children": [ + { + "id": "agent-badge-chevron-path", + "el": "path", + "attrs": { + "d": "M6 9l6 6 6-6" + } + } + ] + } + ] + } + }, + { + "name": "UserIdentityBadge", + "note": "Production OwnerButton from WorkspaceWindow.xaml at dc9f6345821075362580bd598cc32e4f2aa6a18a. Native SubtleButtonStyle with 8px padding, 1px border, a 24px PersonPicture, 12px column spacing, and a 10px status dot followed by a 4px gap and Caption text. PersonPicture uses its native brush tokens and Contact glyph at 24 * 0.42 = 10.08px, not a generic outlined SVG. The statusTone prop represents the connection state, never authorization. The shared preview preserves hover/pressed/disabled/focus visuals; the native Owner MenuFlyout is not executed.", + "props": { + "name": "Ada Lovelace", + "status": "Connected", + "statusTone": "positive" + }, + "root": { + "id": "user-badge-root", + "el": "button", + "attrs": { + "type": "button", + "aria-haspopup": "menu", + "aria-label": "{name}" + }, + "layout": { + "mode": "horizontal", + "gap": "3", + "align": "center", + "padding": "2", + "width": "fill" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "subtleButtonText", + "background": "subtleButtonFill", + "borderColor": "subtleButtonBorder", + "borderWidth": 1, + "radius": "sm", + "textAlign": "left" + }, + "control": { + "chrome": "none", + "focus": { + "kind": "outline", + "color": "accent" + } + }, + "states": { + "hover": { + "color": "subtleButtonHoverText", + "background": "subtleButtonHoverFill", + "borderColor": "subtleButtonHoverBorder" + }, + "pressed": { + "color": "subtleButtonPressedText", + "background": "subtleButtonPressedFill", + "borderColor": "subtleButtonPressedBorder" + }, + "hoverPressed": { + "color": "subtleButtonPressedText", + "background": "subtleButtonPressedFill", + "borderColor": "subtleButtonPressedBorder" + }, + "disabled": { + "color": "subtleButtonDisabledText", + "background": "subtleButtonFill", + "borderColor": "subtleButtonBorder" + } + }, + "children": [ + { + "id": "user-badge-avatar", + "component": "Avatar", + "props": { + "initials": "", + "name": "{name}" + }, + "layout": { + "width": 24, + "height": 24 + }, + "appearance": { + "textStyle": "workspacePerson" + } + }, + { + "id": "user-badge-text", + "el": "div", + "layout": { + "mode": "vertical", + "align": "start", + "grow": true + }, + "children": [ + { + "id": "user-badge-name", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink", + "textAlign": "left" + }, + "children": [ + "{name}" + ] + }, + { + "id": "user-badge-status", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "1", + "align": "center" + }, + "children": [ + { + "id": "user-badge-status-dot", + "el": "svg", + "attrs": { + "viewBox": "0 0 10 10", + "width": 10, + "height": 10, + "aria-hidden": "true" + }, + "layout": { + "mode": "horizontal", + "width": 10, + "height": 10 + }, + "children": [ + { + "id": "user-badge-status-fill", + "el": "circle", + "attrs": { + "cx": 5, + "cy": 5, + "r": 5, + "fill": "var(--color-{statusTone})" + } + } + ] + }, + { + "id": "user-badge-status-label", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "muted", + "textAlign": "left" + }, + "children": [ + "{status}" + ] + } + ] + } + ] + } + ] + } + }, + + { + "name": "ConnectionStatusFlyout", + "note": "Gateway/Operator/Node status flyout from Controls/GatewayStatusContent.xaml (#1541), opened from the Workspace connection affordance. A 304px column of three status rows split by 1px `line` (CardStrokeColorDefault) dividers, closing with an Open Connection link. Each row pairs a 10px status dot with a body-strong label over a caption `muted` detail; a trailing accent HyperlinkButton (Reconnect / Approve) appears only when that layer needs action. The dot binds the Fluent system fill that matches state: `positive` (SystemFillColorSuccess) connected, `warning` (SystemFillColorCaution) attention, `critical` (SystemFillColorCritical) error, `muted` (SystemFillColorNeutral) unknown. Row vertical padding 10px maps to token 2; column spacing 11px to token 3. The flyout sheet, `md` overlay radius and shadow are supplied by the WinUI Flyout presenter; previewed here as a `surface` sheet.", + "root": { + "id": "conn-status-root", + "el": "div", + "layout": { + "mode": "vertical", + "width": 304, + "padding": "3" + }, + "appearance": { + "background": "surface", + "color": "ink", + "radius": "md", + "shadow": "md" + }, + "children": [ + { + "id": "conn-status-gateway", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "3", + "align": "center", + "padding": { + "y": "2" + }, + "width": "fill" + }, + "children": [ + { + "id": "conn-status-gateway-dot", + "el": "span", + "attrs": { + "aria-hidden": "true" + }, + "layout": { + "mode": "horizontal", + "width": 10, + "height": 10 + }, + "appearance": { + "background": "positive", + "radius": "pill" + } + }, + { + "id": "conn-status-gateway-text", + "el": "div", + "layout": { + "mode": "vertical", + "grow": true + }, + "children": [ + { + "id": "conn-status-gateway-label", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink" + }, + "children": [ + "Gateway" + ] + }, + { + "id": "conn-status-gateway-detail", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "muted" + }, + "children": [ + "Connected · OpenClawGateway" + ] + } + ] + } + ] + }, + { + "id": "conn-status-divider-1", + "el": "div", + "layout": { + "mode": "horizontal", + "width": "fill", + "height": 1 + }, + "appearance": { + "background": "line" + } + }, + { + "id": "conn-status-operator", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "3", + "align": "center", + "padding": { + "y": "2" + }, + "width": "fill" + }, + "children": [ + { + "id": "conn-status-operator-dot", + "el": "span", + "attrs": { + "aria-hidden": "true" + }, + "layout": { + "mode": "horizontal", + "width": 10, + "height": 10 + }, + "appearance": { + "background": "positive", + "radius": "pill" + } + }, + { + "id": "conn-status-operator-text", + "el": "div", + "layout": { + "mode": "vertical", + "grow": true + }, + "children": [ + { + "id": "conn-status-operator-label", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink" + }, + "children": [ + "Operator" + ] + }, + { + "id": "conn-status-operator-detail", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "muted" + }, + "children": [ + "Authorized" + ] + } + ] + } + ] + }, + { + "id": "conn-status-divider-2", + "el": "div", + "layout": { + "mode": "horizontal", + "width": "fill", + "height": 1 + }, + "appearance": { + "background": "line" + } + }, + { + "id": "conn-status-node", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "3", + "align": "center", + "padding": { + "y": "2" + }, + "width": "fill" + }, + "children": [ + { + "id": "conn-status-node-dot", + "el": "span", + "attrs": { + "aria-hidden": "true" + }, + "layout": { + "mode": "horizontal", + "width": 10, + "height": 10 + }, + "appearance": { + "background": "warning", + "radius": "pill" + } + }, + { + "id": "conn-status-node-text", + "el": "div", + "layout": { + "mode": "vertical", + "grow": true + }, + "children": [ + { + "id": "conn-status-node-label", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "ink" + }, + "children": [ + "Node" + ] + }, + { + "id": "conn-status-node-detail", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "muted" + }, + "children": [ + "Waiting for approval" + ] + } + ] + }, + { + "id": "conn-status-node-action", + "el": "button", + "attrs": { + "type": "button" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "padding": { + "x": "2", + "y": "1" + }, + "width": "hug" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "accent", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + "Approve…" + ] + } + ] + }, + { + "id": "conn-status-divider-3", + "el": "div", + "layout": { + "mode": "horizontal", + "width": "fill", + "height": 1 + }, + "appearance": { + "background": "line" + } + }, + { + "id": "conn-status-open", + "el": "button", + "attrs": { + "type": "button" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "padding": { + "x": "2", + "y": "1" + }, + "width": "hug" + }, + "margin": { + "top": "2" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "accent", + "background": "$none", + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + "Open Connection" + ] + } + ] + } + }, + { + "name": "NotificationFlyout", + "note": "Populated state from Controls/NotificationFlyoutContent.xaml. Native presenter padding is 16,15,16,17, with a 1px flyoutStroke border, md corners and a 352px content column inside the 386px frame. flyoutFill maps the acrylic fallback, not the card brush. Native medium-shadow outside insets are 10,2,10,18; the flyout shadow token is a light CSS reference, not native composition proof. Notification cards preserve CardBackgroundFillColorDefaultBrush alpha through setupCardFill/setupCardStroke, 12px padding and 4px vertical margins; the ListView's -4px horizontal margin cancels each card's +4px margin. Columns are 11px apart; text stack gap is 3px. Title is Body Strong, severity and Cancel use native Fluent glyphs, and recurrence uses the caution background with 7,1 padding and 10px radius. Header/footer reuse HyperlinkButton with native 4,0 padding and transparent 1px borders. NotificationFlyoutEmpty shows the supplied screenshot's empty state. Acrylic noise, font rasterization, native shadow/dark recipe, high-contrast 2px presenter border, scrolling and notification actions remain unverified/native-owned; do not claim pixel identity.", + "props": { + "title": "Approval required", + "message": "A Windows node capability is waiting for your approval.", + "metadata": "Just now · Node", + "count": "2×" + }, + "root": { + "id": "notif-root", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "0", + "padding": { "left": "4", "top": "flyoutTop", "right": "4", "bottom": "flyoutBottom" }, + "width": 386 + }, + "margin": { "left": "textControlLeft", "top": "half", "right": "textControlLeft", "bottom": "flyoutShadowBottom" }, + "appearance": { + "background": "flyoutFill", + "borderColor": "flyoutStroke", + "borderWidth": 1, + "color": "nativeText", + "radius": "md", + "shadow": "flyout" + }, + "children": [ + { + "id": "notif-header", + "el": "div", + "layout": { + "mode": "horizontal", + "justify": "end" + }, + "margin": { "left": "half", "right": "half", "bottom": "2" }, + "children": [ + { + "id": "notif-clear", + "component": "HyperlinkButton", + "props": { "children": "Clear all" }, + "appearance": { + "color": "accentText", + "borderColor": "subtleButtonBorder", + "borderWidth": 1 + } + } + ] + }, + { + "id": "notif-card", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "buttonHorizontal", + "padding": "3", + "align": "start", + "width": "fill" + }, + "margin": { "y": "1" }, + "appearance": { + "background": "setupCardFill", + "borderColor": "setupCardStroke", + "borderWidth": 1, + "color": "nativeText", + "radius": "md" + }, + "children": [ + { + "id": "notif-card-glyph", + "el": "span", + "attrs": { + "aria-hidden": "true" + }, + "layout": { "width": 16, "height": 16 }, + "margin": { "top": "half" }, + "appearance": { + "textStyle": "chatIcon", + "color": "nativeText" + }, + "children": ["\uE7BA"] + }, + { + "id": "notif-card-text", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "notificationTextGap", + "grow": true + }, + "children": [ + { + "id": "notif-card-titlerow", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "center" + }, + "children": [ + { + "id": "notif-card-title", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "bodyStrong", + "color": "nativeText" + }, + "children": [ + "{title}" + ] + }, + { + "id": "notif-card-count", + "component": "Badge", + "props": { + "tone": "neutral", + "children": "{count}" + }, + "layout": { "padding": { "x": "notificationBadgeX", "y": "notificationBadgeY" } }, + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "background": "notificationBadgeFill", + "color": "nativeText", + "borderWidth": 0, + "radius": "notificationBadge" + } + } + ] + }, + { + "id": "notif-card-message", + "el": "p", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "nativeText" + }, + "children": [ + "{message}" + ] + }, + { + "id": "notif-card-meta", + "el": "p", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "nativeSecondary" + }, + "children": [ + "{metadata}" + ] + } + ] + }, + { + "id": "notif-card-dismiss", + "el": "button", + "attrs": { + "type": "button", + "title": "Dismiss", + "aria-label": "Dismiss notification" + }, + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "padding": "textControlEnd", + "width": 30, + "height": 30 + }, + "appearance": { + "background": "$none", + "borderWidth": 0, + "color": "nativeText", + "radius": "sm" + }, + "control": { "chrome": "none", "focus": { "kind": "outline", "color": "accent" } }, + "states": { + "hover": { "background": "buttonHoverFill", "color": "buttonHoverText" }, + "pressed": { "background": "buttonPressedFill", "color": "buttonPressedText" }, + "hoverPressed": { "background": "buttonPressedFill", "color": "buttonPressedText" }, + "disabled": { "background": "buttonDisabledFill", "color": "buttonDisabledText" } + }, + "children": [ + { + "id": "notif-card-dismiss-glyph", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "appearance": { "textStyle": "notificationDismissIcon" }, + "children": ["\uE711"] + } + ] + } + ] + }, + { + "id": "notif-footer", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "center", + "justify": "space-between" + }, + "margin": { "left": "half", "top": "2", "right": "half" }, + "children": [ + { + "id": "notif-footer-open", + "component": "HyperlinkButton", + "props": { "children": "Open notifications" }, + "appearance": { + "color": "accentText", + "borderColor": "subtleButtonBorder", + "borderWidth": 1 + } + }, + { + "id": "notif-footer-count", + "el": "span", + "appearance": { + "fontFamily": "body", + "textStyle": "caption", + "color": "nativeTertiary" + }, + "children": [ + "1 active" + ] + } + ] + } + ] + } + }, + { + "name": "NotificationFlyoutEmpty", + "note": "Empty state of the same native notification flyout, matching the user-supplied reference in .agents/design/reference/notification-native-empty.png. Keep the 386px presenter, 352px content column, 16,15,16,17 presenter padding and native card alpha. The collapsed Clear all button leaves an 8px header-grid margin. Empty card has 20px padding, 4px vertical margins, Body Strong title and Caption detail with a 6px gap; footer margin is 2,8,2,0. No severity glyph, recurrence badge, dismiss target or active count appears in this state. Content determines height; native acrylic noise, font metrics, shadow composition and actual popup positioning cannot be claimed pixel-identical from this source mapping.", + "root": { + "id": "notif-empty-root", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "0", + "padding": { "left": "4", "top": "flyoutTop", "right": "4", "bottom": "flyoutBottom" }, + "width": 386 + }, + "margin": { "left": "textControlLeft", "top": "half", "right": "textControlLeft", "bottom": "flyoutShadowBottom" }, + "appearance": { + "background": "flyoutFill", + "borderColor": "flyoutStroke", + "borderWidth": 1, + "color": "nativeText", + "radius": "md", + "shadow": "flyout" + }, + "children": [ + { + "id": "notif-empty-header", + "el": "div", + "attrs": { "aria-hidden": "true" }, + "layout": { "mode": "vertical" }, + "margin": { "bottom": "2" } + }, + { + "id": "notif-empty-card", + "el": "div", + "layout": { "mode": "vertical", "gap": "textControlEnd", "padding": "notificationEmpty", "width": "fill" }, + "margin": { "y": "1" }, + "appearance": { + "background": "setupCardFill", + "borderColor": "setupCardStroke", + "borderWidth": 1, + "radius": "md" + }, + "children": [ + { + "id": "notif-empty-title", + "el": "span", + "appearance": { "fontFamily": "body", "textStyle": "bodyStrong", "color": "nativeText" }, + "children": ["No notifications"] + }, + { + "id": "notif-empty-description", + "el": "p", + "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "nativeSecondary" }, + "children": ["New app notifications will appear here until you dismiss or clear them."] + } + ] + }, + { + "id": "notif-empty-footer", + "el": "div", + "layout": { "mode": "horizontal", "align": "center" }, + "margin": { "left": "half", "top": "2", "right": "half" }, + "children": [ + { + "id": "notif-empty-open", + "component": "HyperlinkButton", + "props": { "children": "Open notifications" }, + "appearance": { "color": "accentText", "borderColor": "subtleButtonBorder", "borderWidth": 1 } + } + ] + } + ] + } + }, + { + "name": "WorkspaceShell", + "note": "Production-derived expanded workspace at dc9f6345821075362580bd598cc32e4f2aa6a18a, showing the supplied screenshot's no-agent/no-session/error state. TitleBar is 32px; NavigationView is 256px. CollapsePaneButton is a separate 40x40 SubtleButton at (4,8), with native U+E90C; Back/Forward align to the right at 40px high and 8px apart, disabled with no history. Selector padding is 4,8,28,8 and its chevron is U+E70D. Home uses the original Chat.svg at 22px in a 24px column, 16px before the label. Session add and Notifications are 40x36, not 32px or 40px squares. Footer uses margin 4,8,4,8, a 4px gap, the shared Owner badge and original Notifications.svg at 20px with an InfoBadge. Artwork data URLs are exact bytes from production, not new theme colors. Caption buttons and red-bot title image mirror native chrome. Layout is measured in effective pixels; 852px is the supplied screenshot's client height at 125% scale. Native Mica tint, text rasterization, OS caption actions, pane collapse/reopen and navigation are not executed by this browser reference. The pane button has real hover/pressed/focus visuals, but remains a documented native action rather than an inaccessible width-only collapse. Production closes the pane entirely and exposes a 56px ReopenPaneSlot.", + "props": { + "owner": "Owner", + "status": "Error", + "statusTone": "critical", + "notifications": "1" + }, + "root": { + "id": "workspace-root", + "el": "div", + "layout": { + "mode": "vertical", + "width": "fill", + "height": 852 + }, + "appearance": { + "background": "paper", + "color": "nativeText" + }, + "children": [ + { + "id": "workspace-titlebar", + "el": "div", + "layout": { + "mode": "horizontal", + "align": "center", + "width": "fill", + "height": 32 + }, + "children": [ + { + "id": "workspace-title-leading", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "gap": "4", + "grow": true, + "padding": { + "left": "4" + } + }, + "children": [ + { + "id": "workspace-title-icon", + "el": "img", + "layout": { + "width": 16, + "height": 16 + }, + "attrs": { + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAADgCElEQVR4nOy9B7xmZ1Uuvt6991dOn5YeSCGhhBbgiigq4L3/i+K9KBcnerEERanSUZo6GUUsSEdULqB4Vbwz6rWg2CEoCBKKQEILkJCQMv20r+3y/n/PWs96957YAiSXzMzZcDJnznzn+3Z531We9axniWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF1bB1bx9axdWwdW8fWsXVsHVvH1rF13IlH3LMni/v25V/27+3bl+N3RSTcOWe2ddwZxx4+7/hvPbd3vauQGDOJ7yr+1bViz/ykP06JRY2FEC67rMb3e/bsmX/c3U+7/2LVfP2grk6XalZn/b5I00hTN9mknF013rnrwAcObX76R5///CO3fR/ZvbsJIcSv2cVsHf/uoRv3iiti9xn9+Wt/6R4XD+Pd87XNh/Ym07kiyy7tSXZOPp3O6hj70/H46mZh4bq1ueGRm4rsL/6/F+z9jL7X7t152L9f183JeoRTYUGEvXubf/yln3vAuYv9y5fq8F97o9El89UskywTaaJIFkRCEClraZpKZiGXamH+unI4/6U1qf7qgMg7H/qMH/9gek9bGA2+/dpe3dbxb238d73658+/+2TzvyyWs8cuNPGbelG297HaRzOR0UhkNBapK5Ecz15E5uZEFhdlI4SNY0H+z2eWl179n1/0sqt9/Zysd/qkNgAxSghB4sdf+crvPX+Q/8rixtEdcuiQNOsjqddX6yghZnkhAbehaSQ2tYSiyLM8D2FhXmRhQWRpQTbzvJwN8g8eqeq3vXc0+4vL9/7iF/X99+3Ow2Unt4e4qx8xxiBXXBF8k/7zK/Z8y+nj6XMWZ9UjFptmh6ytiWxuSr05lliWtdRNbKo6RIkhVpWELJNQVTHLsyhFHvL5+Tz0+7I5GBz6zMpgz4Nf/dY34jNO1qjvpDUAyP2CSPz0S5//M/dc3vZTcustUt56cxUn0yyELEgTQ8TlD4YSQiZSlRKaRsSy/ShVLTFIDL0iZlmeZyvLIju2ydri/C0H+/1f+/549Jfe//xXj7E4rrjiirD3JPYSd9Wj652veuXLHnbWaPyj28vyh+fWNkQOHZHZeLORuo5ZlCw2TVCPkOUSR2OJeSaxriWr8eu1CP4MEWlgjGVd94u8iGfvkE/s2v7YS3/17X96skYCJ6UB2Ld7d37Z/v31R1/03G+733j6zuaGG5s4HcG7Z7D4saxF8ty+ej0JTZSIzR8bzQoiDAIwgaaRMKvUEOArW5iLvZXlXM4+U1YHww9fF6srLn3xy/8Un3kiLRB6NPypSwDfci2cKF4u7Nu9O8Mz/uOffekFX1dkL16J8Unza5tZffCQVMdW6zArM71IOO4sVwOvHh/PtKwlwsA3tUhZqqdocOkVUkBgQVGaqqoX5nrZwXuce+37/+cjH/Kd3/XCDW6WE+Ue3a7jXyCgJ8Ox+5JL9CGdtn70+/Jbj8bZl25qskG/kH5PAhZ9hXC/EUR1oZeLNJlkEUGhmGfoD6QpehLqUmITgAuELAtB1icyXRvFcOvBZmXnzgffe3n+T770k8/5g6vy8KKwd++1NDxfE2wAEc8Ve/YgGomyf38mV18d3i0ij8Taxs/8wJ5gOIv9ob/LEFfD6c7r7GbuzuSSS/Qv/n5XiMjevXvj1+I6ge4j2sLm/8iLn3/ZBbP69StHV0+vDx+S2XRaS1llWSNW7YExh2efTiWMJyKzmTRVLQEbvIZhb6RRA69JoF5MozhQhEHIj01mzcr6+sXb/+ofvzWI/LE7FjmJjpMyAtBj3+781j+Y/tNph44+eOOWQ00W8iwUQb2AuJ8Ojd4AxQEQBcRGwnBOYlGIoDIgUcL8vOUS0kgWEDY2GjoiZsj7ReidfXpYPW3XgRu2zT/t/i/6pT80MGov1tSduTlC3LMHGzx75H3vG7/cysQrX/Lcc57/3g/fuu8Jjzv75kOb42e/9KUHH/D937/wsd/+7c0v5yS0xNYaiEb27lUb+hVd0e35PGIuD3vlK+d+b7r2c2eOp88tDh6Q2ZEjdVZWTN4ayTSVy6XZ2JS4viFSzaSZlrr5sbmxBmo1ANEMvF5LlKzIpapqqQAMazog1dkX7Mo/cPbKy795/9//5MlYFTh5DcBuyW+55es/sH08fvCxw6tRqojE3zwbNjIiAYSAIUgmQfIs0y8FhXp9kSITGfQlmx9KBoPQY7BUNVo50Ogg1ogg6sEZu/LZRefJDTt2/vxFz9v7kq6nuiMuRT3z/v3Zu6++Ojzyiivqf22zf/8rnr/w/YOz7rZcrleLQR68lPV2xGnTDPrFo+bzuFzXGuU2oYlDkXiplPXnQx7uGctyPTT11U3ROzcP8sU6Ij3qS54XTYxNb2My+1Tdzz4WJQw2Yiw3ivyDG/MyecW1n7npr1/5Lw2GGoV9+zKR/SK7991hJVPffPte8pRzvmXl9H1n1PKN1Reub6rDh0KoJSB8R46PQC2WM4mjTWnGU9349XQmTV3b5sbmbxqpq0qiZXpSwXrpTgDog8cLdChKrGNz2umL2TWnL3/PI9/ziX1xt+RhPwCDk+cIJzEAGD568YV/d4+6fsStG5tVU8dCc3ut+iH/xapBEBAlBzAkIv0sSK+XS0YjkBeZZINCCkQB/YFE5JL4N9QPylKdnqYQg6LJlxekuMf52RcGg1dduD3/SQFA+JXjAurh5b73hYf9F5voEXsuH/7iznvfa1cRLh1kvUsWKnlgPh6dLiL3DnVTLS7MLQXgG7OZGbm6u2aDAV74mk0179VoJzb2Z78nUmJLiMh0JjIY2B3t9USKQtZHo3GTSZS6/lQV8oOjqvlQGeKNG/3sE+89Wn7i6b/wC0f/VYNw9dXxK40Q3rVnT/GovXurD7zsJY++dxPfsDydXlQdOFDHw0fyUMKTF9JMptIgzEd0Nh5JnE6lhsevaynLSqYlNn8pVQ3v3+guLmEI4AdwS/An748Gb01TLyAxWpm76ZPbBg+87JobjziwLCfRcbIaAFT2m7edddajHzaZ/t9JXc+NmqaKUXLF/vECy/o00w0x6C8M81wGWZB+kUmvKKTo9yQPQfJeIZkahEIEKQI8xLAvMBsKKsFb9Iooc8Omf/45+Ze2Lb7n93bNP/4FL3jVoS/HCDj77Lav/7+v/vnz71HkD1qYju+zKNl/GvR6F2RldZ+l4XAgeWEbfTKROJ0I4pk6Dw3KXQJvjkhnNtPzRGSriB9Q8XJmmX9ZARqPASg5LgQoKPLkYd9WO4xHf6CREUDTLDY5DKAZDW6JIsi4LOO0GHwuFuELazFetR6K93263vj4d//UK6//N67xdmEIvvk//KLnPubiLOxbXF1fmB49VmflLA+TqQgwm+lEapR2Nyfm9WcT9fBI1Mqq1s0/rSqp6lomiASaRsomyizGWMGWGSICA6DnBOPQE8nPLYJcPyye/9ij66/aJ5JfpuWCk+s4KQ0Ajj0i2V6R5o9WVh63Mp39et7Up01h6oPlfHjwwIQBiSESHGaZDIJkw0zCMAsyl+XS6xXS7/f1JhV5Lr3BQI1BmJ+TMD+UgDISNgtApKqRugjSLMzVc+eeld+6a9v73jKc+66X/vzrD/57dWTdELf19E9+cu/99zr3ktOa8J+Wev3vHJTlw+eH/R0FrBS8MxDsWYkFXsfx1DZ1U4UwHgcJOUpdimtrGARnBk8OjsO0lFhYFIONrecNuGwGNLxSDESdH9IiAKbzA4seSrWYuloaTY6RSkmUoojwwNIvJBS9PC+wbTKNFrDxRmV5eFrO3rOW5f9wePu2D/7qgbWPv+21rz2Wrn3f7vzfSxO6m/+eMf6fhQOHFqdHj9ZZ0+SwZhGXOZ1IM5pKvbEp1cZIqrKWcjqVWV3KrG6kxKavKpnWUSZ1I5PYNLOmwSbPQrQP1kuLjYb//ZhJkUUps3DocL/3hh/89m9/Wdy/vznZPP9JbwC6kcDPrwwuvM+oeeZ8lMdKjD2t+IewIw/ZEtbyEF4eewugUIzNfBCZy7NsHpu+KKRX9GSAP3uF5PjZXF+yOeMPRHjKOko2sTwTm0H6RTW8x92Km887672vXVr6jl8YD9dvS08Forx73/GL/4Ov/IWH7mqqJyyH7FE9iRctDQfzugEnEyljjFk5rZuYhViV8NwwKkE9NEhM2LwVSlwVrBU3P4IAYBb4t0qasrIqCCKXQR8EGIkZKyCKftf6OkQVAYZiYWhMSRiOutLoQg1QL5eI1KeqJWNaVOchhkZNXQx5HmNV5v3BMCB6QOowzmI9LrLr1qT5gwN58Wc/d8PRj/zJW9+6rs9pz55s/zXXhG4FxXP+f/zxZz3m/v3B/1k4cGBxevRIEyZlBhAPlyvAYcqZNBsjacZjKctSJqOZTGZTGB+ZYsPXjcxgBJpYT6KEQmLWY84/lXhQgoxiyDLAOnmMs0biPzd59unrBvLmn1ibfu5kDPtPGQPQNQL4/sfvtXPp624+3Dt7TcqrFhbOK/L8kos3N8d1nt9LQnz4oJZvGMZ4Bn6pzPNmkCMqyLJh3wwAUoT+oJDe/FBxgxz58fy8RITYurnMg4ZhT2RhUA3uc4/iCzt3/cqFL3vdj2GRo3x2xTXXBLnkkuhh/ntevffrz5Hety428vCFGP/rQr/f03LVbCZ1ntWyvokEI9My5KyU2Osr/oDPhGcPusFrAynxNS31qYbJxAwANjAMBDZ2YOqD16HioeQXwwQiKiSIBDJEBXlLj8aB6ECBT1RAGgVHURXB6zSFws9x4fgT762/m1lIPeg3GjXVdZ4Ph4oxTPOs2Qz5x26N5R9etzD83cf81C9/Lj2v3bvzd19ySYDn/6fn/9i331vCvsX1zcXywK1NqKoslsbPwPWD0FOD5Qcj0NQyHk9kNC1lNJ3JuGlks2pkA96+iXE+wNRFGUl4f1Vk7xll2QcOxvjB3vxk9fNL52XXyTaZ9jabv7j22rV/be2crMdJbwA8HcDm+48e5it37DjnktH6t+ZleOqchG9Ud1SEZjHLsvleIYMsl2GRy2BuTgpEA4oN9KTJcsnyTA0AUoFMKwiFhIW5qneP84tP9fJfvM8b//eLup/1z6/42W85q1c8d6Gpv2N+MOjBJdXra1Ijdo51kJCFbDIFPKEIVVDSSqUbF946clMiIs8Q4g8HlpNjmWPzw0ioNco0/zeas6YHeo4IgrX6rUYCWIFIQPiurEgYlNw2O/AORBA13i0aWIjX4KW9nkQYId0qwCIQHeDfgkQYCRKqgpZVC7wT3iDmvTzPh3Naqluv47HN+eKvDywu/8Z3HB6/+8ZXv3qM+/OaJz/57t8zl3/ozPF41/SLX6rzJuY4T+AviEbq1Q1pNsdSlTMp60pm8P7lTDanpWzOKtmoa1lv1GxlRYgyLeT9VRZedfb4G/7vo+RKopz/8vBk5wqRiBRSTvLjlDAAfnRbQ68QCffl33fzn5OBeMQjiv0feN//WCnDT60EuV8ZpB6GLFvoFQFRQFH0BI66P0QkECRDOK2EAnWxkhFrCP1ezLYtN8W5p+UfmZv/wX3f+t//5Emf+9jjdw3n/0c/yrcvhJDVaEzJQlU3MYSqyUJdB2xgfa8x9gJyEwPxlL2mlYsG/lcCIgL9OzezodeGY+P1KIeB/YZzgWcH6xEbOc+N8zCdGvlFUyCcO3a1EGPAHgka6gM1yZQoCXpMxoght3NKqDkMlZ2fgohFJnFu6PfB0DXYjr6WWqPkeQwSmiLPC1lckGo4lGO98OFDo41X3ri8ctX918vfOn1j4+unN99S5xujHPl+RIqDVGY8lWoykRqp0XQq07qW0ayUUTnT0H9c1fD+dT+EfJLLjcfy/KVP/O///XeENfx3iRQHEWzIv9zgJ3O4L6e6Abg9BmK/SIaFgYXwneedt+1ZN9/68zua+NQxIucQ4lyeh2GvJ71+T/BnH9gAQLAeSodA1DJdqLGKjAR6sbdzm8zOPGM2O+fMA9u277ybLC1KfWwVSHUd6iZTBB4bSskqpQFvWtduREE+bGp6cXjALHKzYRPD4sAA4HeQt4OnAGwCrwXnHf+mQGYQ8OMyQN7w7EWum9giCRbAYHQYFaBTztIHC4SRTmhqgM8AJgDgEYZAOypLiXlPAiMH+Hk9X01L8nZbEZdAGqC/h00NQzAYNlkTs2JhGKrZTDYWl9a2Tcrl6c23xOzYmuIciCiUmj0amwFY35CyqmSCDV9WsjGbynpZyUwa/L0ZRMnqIvu7z26f+5Fn3br6BX+2l9mmP6U2+b93bBmAf+O+7BHJ9xpHRP5qMPihXY28cQq8UEJcKHphkAeZ6/dlbti3dKAoJGBBa0gNZ5qrF9TNOTeU3rZlKU7bJeUFFzQxB3o+00zZWhbRnzDTWrZuZEXZ2YAA8E156wigAfYhFwfeAFtDJgsQfQUCLU/XSD23IieqBdr/oOkCohOG9NjIMACaMkx51dzoQNjJmcBnNdY2ZQZADRE+AHaCn6XVBMMWdPNrlBD1fWvHClB90UaLRjJEIOAV5JmRrPB3oBNN08TpNOTLS6He2GhkfTOLE1QwGiv3wY6MJor217OZjKczWQfgV9WyUZYyqmsZN7FakliURfyVb3vhS54le/c28PiPshLe1sa/zbFlAP7jlAEbtf67ucXHL1bV26oYh708zxZ7MAKZDId9GRQgDyG/Bsxk+1JLYtSU0cXf78Xi4nvE/OwzMyx4Rev1Ayx8bpCzK8iG4qSVm2EADFiER4ZhQP6LzR6TsUEZUr0pfg5eu587jA89txolhM/qgREzYEMZXV5DHTRHEcRTAwBkHwdwjarWTWypRWJO2FYCsKjvj9C+J6Baa5aP68syq8lrBAFDUpsBALnKlx0MBohVRWGvU4JSLfV4FIuiFwIqK0AedOeD4DOVujRmXzkrZXM6kfWqkmP4HmXHpqmXs5DXWfY7j56Ov1/7I0A5OAVy+a/0OCmbge6og8u83ifS/9bxxh/82cLCeedU8ZXTGOtZVeZF6CnhpBLQiCv1bEqKx65CR0qeo6tMLUJ/186Q93twcio8EsboTuxZGE8amgJ3yO/zQKYh6/4wAjAA8LQaCeD1RmeOymIxVFwBQLwGG1khO5TsIz0srb0m4oYY4NyQUyM3AC1Wv0dUQI0MNS44P0QeCMMVA0Ckk2sXnWGC1kUZm0xkph9gIKCChmBZWKelRjAwbMrTh6G069AIZIZrFTNSwFRCCPXqumQBaUpm5Umg/tOZ1LNSytlMpogAqlJmwARA2o9NMwwxr/Pw4Q8uLvx4nI4V+N3a/P/+sRUB3L4Dji0Pe/Y0f/PKV/3u2WX1PeMozWKRZcAAiiKXXt7TP+GZc+TDCInzoHyB/q4dIsvLEgYDiQvzBtZPZ2DVqTEw5B20VCXYWJkOpUVEBNgk04m9Bh4TZ8M2Xt2ok5ltQkQA8LDa3mybEuCe5vCK/oPCbKmCGhO8B5B+/Xx4fEsxGlQNGFFoPIOKQdH2Tij4h42qKQDbqGEQtDAPw2dLytuN9f0Riei5GIZhWAU4E0gDcjsfRB1KTsJbRQnY7KD2zg8VkIwQ9Kiw+YH2VzIqK9msSyX5bNZ1LKtG5gf52ue29x72QzdvfOpUKOHdEccpIXx4BxzxCut2a65aWX7BLC9uGoSYzZqmAd+8Ls0LKccWXj1EZeLq5t++HYUoQQ1fQTbwBVC2AwKPSMCJPMiz4YERBYym9jXBnxOtTyAUz+B1ERHwPSBmYRUA5OxAyQEeltIoVgBSkImc6GeUMwvXEWYr2k8CvKcXlp7TQFjIr/V2GgHDGtA/UFoEooUOo1AHRB84NwCYqEzAKIGPgGqGknYaS3Hg6fEeGnUQEOT3+uExSgP8ABEE3z9ujKzez1beCsSeqpFpDWovOP1G3jprUITZyvDnsfmR829t/tt3bEUAX8ahUYBI/ecLC8+8R1m/agQHn2UZsIB+0ZcMni7LZG5pXnrbV5QoFOFdF+aUPKM1eBUgtdAa3hmovJXInIke21q/e04N2bHZLaxWb83avf+K/542OnX+QXUPAKA5aYe/j0qCcgy0e47YARm+yh3QvzdWlXDEXisT+CuiBC4dfQ2ZiPqlLlzZhGo+UBJkjTU4roBNrhYEH6UKLIYtwGhpuo/IAQbFDCIMUTmayHRayhSNPU0tsxp/gulXNwWoEMPeJ/74go2H/fL2R0zlyivrU62c95UeWxHAl9OSu9sYA3/3iy/Yf3Rl8QDq9mXTNCUop9VM+wvmluZksLQouZJggPAjt641bNYDnhALe1KJjMH4A521Ms8JkUpfuQWIRcZRV8/qZTSua930zPmN4Zcq8mxtM0DPdhSojRVlr7TeZ8ChXZd2OaIFVvN8eujYeG+AYQxardD3Zh6v7D87rUwbrPDvFlmgqgFjpbaERTc1ODg/bG4lNtlm1xRFIxdiHTByU/AX0MXIEiRuB4hYIF7lImOE/ogEmsZaeSXI4MIzj136hB/ZHq68spI9e/TWfcW74hQ6tgzA7Ti0ow8cd8iM/dRPPPolH/jEXy0vLZ51LMZYZlmWD/uysLwgO3Zul+H8PLlkRqk19h1AvUqJOxoqo7TlCDqpuo6Om7HAskZhzMg/utlY5tM8WfNta2XWLz1JxCcEBi1GsAgCuAFwAc3Tg+IC+hrHEZQD0NgpA8lnaK6lRxgNfC4rD2YMEMAYJ8HLj+rVNa2wGEmjg6aRrK5StuFGQN/bOYHI7RENEYzUz1Qsw6oXelkKLSgwKEUvl5X5OTl9cUG2zw20NwNaTWtFHk+fzL7pUX/z8ff+9Q985xNAs4bZQ7/Fnbh3Topjy0r+B/fnXXsekT9q75XVnj3P3vbDm9UbTj9y+Puyj39GDt9ySDdPP0QZFj3J+z3JhtxoWMAFeuv71rEGjgBBLhBasMCVLFRa2KyNN9gwTAPMqzOM101gaLlufDTv4Pc15PfSGQg5xr83roClAQhCsJEaCJsol0CI9hteoSZANysReRgppCk0Cs481E3N0MT5BFqC1L4BcAxgEPRMaagsZTHtAaYqbEVWw6ipDaMPnG8VjTrt1GQYSRoWgKRmJAxAVFyCVQV0+o3KWmYhShWkOX37SjZ/r/PkhjO2/8Ybzjn7Oa/f+/q1dz3iEcWjrrxyiwPwbxxbBuDfOLqKPn/z3Kc89NKyecvOtbX7bdxwY6w3NmM+LTMNqwGKAfAfDCQbWt+81sBBcNFeeePXqxqt3nELlXXhIyJXpSGG7Nhoyl7PLU1Qth8NAje8eVpuILyf4gJMsoEBWJJudDe8DpsaaD83uofcth9DZyYCuv1IK0ZqgY9TMBBpCVVD8ScbhJRSrPG9GQePUFKuj39x7UVPNfBDnL+G9YwC/Pz9mmqIcrLtnsQhLVcSn4AxUM2+BkCr3R+9VjAxh4Omt21Jtp21K7t1Zemfr+oXz/1vb9r3Lr09J3lX31d6bBmAf+VIIh57HlF8anrp889c3fjplcl0fvOWW+o4GmVhNgsI5zWkR7mMJCB4fA354dGpO6CZOYxA0dMw25t7EIprtIB8G0ol2FzYG9zguqEQIiu91vj3yqlBuK0lNTbluLov6bdmjfD7jA5gNPo5mYT++ag6IKwmk5Abz/J4JoZ4odb+IY9Ogo+Df94voO3EeB3pUomF5FUDT0YIcuLe6PvwPTpUY4UrGPaD7AMmol4nDCU3PlIkwzphbGr9Vb1OXC+irEFPIiKxuUG9sm0pX11erK9bWXnRpYemr0YfwMko6vnVHlsG4DaH96H/xlOecv6jdyy/6qxQP6760q0yW11r5OgxsFIkm06Msae18hbdVjGOfqGIOyFuravDH5uiDha0e0ss2txKdBq6M1dmKq0RgnthrS6wPu763azDq1cmRdc2EA2C5tFmJDRMR7SizUp4I9t4morAmzICwIFcWyfmsJ+Arp8b1juELRpRLQIE++6xLRQhp8BTCxPaUAOT9McZdTiWgW+VrsxogSVJNVRqAEy007Iigp1qEK0bUn+WFxJhANQQ9ySfn6/7ywthsHMluy7P/vcVC3PPettr33bsZBT2/GqOLRCwc8Q9ewosjnc8+9n3+e/bF/7mLJHHlQePVPVkHLPZLAvlTLIpmnOQ/xbKY9cQ3tts1RtaI4/m+F5jrzseEV6Tf8/IjDOBCysNtjpZ7lEZpityzr+nlIC8fKcJOzlIxTHJ5mM0oNGG6wHi34AJej3fUwvscfX+Vt5LvGb9SAvdsdkVBCToaHiHGaDUQU9A0FjDNEj6p0UkVgIlKYjXoOxFli5TP4H3FyDygEHqnIfiEsl9WWRi2AYUjgC2zvLZbBY2D6/W58/qH/iFafWu//3U3ffC833XnkdsMWB5bEUAPNwz/N2zn/71D15Y+N2VIBeODxyssrWNIozHKjQpkJlWuioXKumsNlwDpTXfvai7I+zHxqBH9Lq55sKExnVjcwN4boxFr0/Gk2n28+PbJO7ZAQGtDkePz3q79hJgU4huTttXoAhb7q8b0HN530U4DxguVCPUQLmHN0wBf1cas2IV4BTQVGlXIAlGVmFMBkorByQUJV6eUovt8/Se4H4gReLleFu1Yg1q1Igr0OM7nqDvqdFFioksbVCDDDHXnoTBUCJESOaG9eLSfH50fu5LHysGz3vkG39jX3dg7Kl8bBkALJ1HPKJA/fifX/aTT7xwOvvVxclsOD12tM42Jzm05rLNTYmzqbLvrA2WisJExzV01Q3MnFo9oJNdHG0364DNrwi6FrcLI9pEyHJZbowWYjUtEdgCNoLX1Em7JZVH/868WzcgIgrIkXloreQhknr8PdlsozaJHhueVs/NpyNxU8Kb6ibzSgB27axW7XwzbJaiWMXA7omPFfF0xXJ2C+tBFvJSpZYPkfkwIVDDmbWe3I2bR0OJZKTRUKagoHIJeIv1chitaNmzwH3soRXb5M0WFiBZVi+sLOWTxaXq2n7v8ge+7i2/y+d+SlcITnUDAPntPOzdW/3zC5/3xIuG/bcOp+MwPbLa5BujTEBD3YD0vdFqtSEFK5WEHXhCq6e3YbQZg7xN1Mnm8zKYGQMDCfE33dvYmMrzR77OsFsrA1avN2mv2jyvd7Njk2EjgmtPPoFuZvWiZkBMnYSRBkk2CkByk1EK397PIw+E5kr/tW4/oO3kDllrMc6TAKdLilmDEj093osGwtmESvGFkdJ7xJREIwTL99N9Idipf0PqgneodIynGU8d58pSoJ+7A6EmnGbCxkjJoDmg15RJwOTfYQ9AYd2bm8vLxYXq873BDz3gTb/12x50nKpG4JQ1AM4Uw9b4xEue98Tzs/ytA0hGr6/FbGOchfVNaTZHIpNxOzUIG983rIefqMtr1x0nB7GdVnNSF8VQ0I1CHSm/NUTcWbv636IwT850QQUwKNahzED8DzgCvZ4aFS0depefGR7sKYy+MkSRG0z/jr8iVaFB0NZdM1qWs+tgHRJ/zMMnSTBWJvS6UKb0hiIN5SlAqrgHjSFRQ9MOMI6/RgjM8c3yWQ9DUlNSkLTtWFQrox2I/GxlOFKajIYE1EBjMzKiQBQFnQH8O+TaVAguSrY4LzI3kDrkEazCuG0lfuGs015331984/MMu9TrP+WMwCkJAnpNOOzbl332J1+w94I8e0s/D6EcbUp2eDWLmyMrRWHTYMGp4Kfjbr5dLeeGcTBuDHNq5bnzc3yxoy1YjG5rQwmSUEBrgnVBk+wCL60n2TbGGL2X3tt4Otws2DjEFIiI4zU2+DS3DW684ZZOrJuYG8/ZhTU3MG+Qthkr0MYOCMc7lK1n98XPH2mK8wPUU1Maza7RIh5jGLq3ZyifQELvZ6BLUvyBYCWxjTTHsFNsMG6BMyEZjag1yqzCiCYtjTzE6MWYETgrQ41rW12VS8aj53z6BU9/EynTGI54yjnEUxENDbJnT/7MHTvy533mo79+/uLi5bPDR5pqYzNmm6OguepoYjk/UGUgyloms0lAGlKyiUXDY/bp6yYE+cdHS+gmt956LZ+xHGabtRXpUJagOmTP2zUxkCw1yFhKYJ9lWIMq9BxXnmN47xwBz6G1j98iCgPVGKE4uq9RjVUQNMJQrYIqRS0a+WDzKv0YZ0XriZ9TE1CBPNwnrcWD7eiT9gyA1O9VWYg1/7TpDW9wMpOVBj29KSwVcW9vSAG5hfYTTTc8clDbZ2mVRhs4HyUzoeWZ+gMqbw7RUpCjZiH25mR66+Hqnmf3fuTaFz4D1/fkeMUVMAKnVCRwylm8+K53FeFRj6o+/tIff8n9lhd/bnboSFmvbxRhfTNks6l6CZXbRiurhp2g7JpKj25/bHJ6Q5XfxMJS4UxHwBgCMz2wXNWGivrGN6RfRxGbso/26mPEFd0m2XlpbLkj8WzfBWrupkLDcWfgaTWBAKGnKhqRsMqgqD7xBbKNNcQmqKDDMpV6i7kBReIGmEAo5cVVbajQoCDV9f11zO0VrUfVQaMdN0g2c89ajzlkVd8P/ADcBxMfbWXOyCxM5+rsRxpPbRQyIDVhC5ZjMCXIWlq2GhoTJ9WqCD4Lcx16BWY/VsPTdxWfy/I3X/Sa//Vke4s0Mv2kP8KpiPZ/5Hk/9sR7zs+/qYDO/MZ6JhvjINDF068R58tNzZthASN8hLeEh1VBTduAKZTnOC13Yl1wUA+GvS6rDdKKItZY2zAoqqBjnhhbAmxAi+7ZHMR8Vxc16+om4e199DwPRdwZmrPrTsNxhPKOooOYpPoD3qRDyW923TUTKg3j/VHCU+9PBqH3ASDHZiqkhkjbf01gFAdC71QmJf9fNytKeUbfs2qIKwUxzHcegYEzLBE654BYpnb5uCaht0uzgmCQBe+7p0E4kAYpyAiDYINM8vmhzTtEo9RwUM3tWCmuCfLm+55+4VPiNdeE8DUa8/7/+shOqTo/Sn0//ROXXzzovaU3nfaatbUsrG4EbHAVz0CYDyELiHAgdMYCpoCGcfkZupLCaiC00XJTdx0YaS6xrQCb012tTBi6f2qfAFuGfWMbOmGvUfFMG/iBUp6BZW4ELA1RL9aHSo/JeFu0QWENGCxcPLw6wUNLRRJbP20wuzarLFhZkCkLiUfJCDCXV4OlpCeTMXMDaIqodp+Us69goQGZatC05MfJRQDsnB/hUbeTk1xZSLsLzVjU3X4CHXHmXIa2akIIIEU3mtYg1UJZE81XGH6Ca0ZU0/jEpLKYrq1Vl4j8yEcOXPcG8EFQHZJT4AinEsnnn3/mhU+8aNa8pbc5CtXmSLLxJGh4P55ImIxFxlMD4hQUI8rtHsw18CFOCR496stO5ukIcGhawPZV5Qz4KC6l7FoVAEeum802qJX50KprXso2N9YfUXXNs60hJqUVGorbQBL1ylAZUsSb1QaV7sIcQVQobHNamwEZddZ2aL0GGoG0TTsa3+uGJlFJS3tWyzdDwHFi2DwB05WDYhYaYzBt0YgFEYlXDtQ4UmlYS4323vgfDtcysDDf72lIqZfSkgl2mp1p0wu/RzA4riSk18kyrN4rBWNNfAR0bZUjizbFSSsEC3OxNzdo4vxCfnW/f/mDX/vm3zoVaMMnfQSAAZR4iO/+uRd/80WhePOgrEI9HkdM3UFdHzJbAZp7FKa0X/KZelbf1tFbSpjBLmK+T69mDJROTdoXJWt1Ko6h7bG2+FAqNFzQmmjwOg3cuwuV02+MicfP0DzWa+L0mCDEwANr377391MIVLvqGOp72Y8Tfttohvkyf9eBNWv5Zc+A1tatJGfvw0v0KkKHl6920nEORjBWyWs7Fr2t10FP9haz+YfwhL63FjOtooFDz4N2AYaI5T07V3IL7K4SA+X76/dtc5TptDRtI5dgwIpKrIVqY5SFjfXmnrPxWz74vB/5n4wETuo9kp30XX2X7a//7OUvv+eDYu+t81WdV9j8MWbqUbmishK6vkH/DKrTx8YahLHulpi/W0RMIqyWw4iiR6P/ughIcvXwlhQLVRFQ9u8bQMbynYfrDO8Tuu19+gTpjOVm8wf0YI+AGgCCk6lfHx4cf/f31g5Fkph8foAzFD18h5FRXAOcf1QQuJE1/eCGw8ZRNR+rOuRIY5D2aOcw9f2YAlhWZCU5pUJArxCwn83jZtmOKY/+HicXK3jnjUlWYbCPT9xA+3WnQhNMdGNipCEDGb1nou1QbCTXqkmtUQzuRwAbEyXCqtbBJIONzeLiyeQ3//pZP/p16Ao9mYVFTloDoNvgmmvCtz3zmYNLJ6tvXK6bi2ara3U+m2U6cgtClsj9QfbBgoBIJ8tdbVHaXbKFvYm/7620QPBpRBScYuSgRoO6dxoYc5MbNuBhPFFsejI9GM5bZc9Kber5sLa18Yacee3+6/TTK/LOoIQb2Km9Oq+QObzW+h2Ec++NzZquwynCHtEQjoDxIvOPAsIG/mmUQAUglD7hxeuONFmHb6BEHRhH1wOkR9c+f27EVqTE0ht4aq8YKOGKmIYbI71H3lykVQwzVN3XpMfp1GiVPbPx6hFCo+OxDmKV9ZFEqBBXTTarm3plOuvfd7r5Wy96xg/sRAsx5kvKSXiclBelx759GUK4N25b+JWzs/CfpwdvrWS0mTfrGzpeCnm/qu5ikZDyam28QOGtLGVe0TyPilt4eO45tYfz3vwCZRt6NdP385DaQDhHt7EJsrxnXpvluJRWkK6LWXxeOtNR3B7a6qbhaC+E084VUGFPKzF61JwMFg7lAsQ2RcB2SMo7bEtm2pNkw/GrEOVEFYSjxTVkdoVgsgS1FKrTf9oUCN47UYEV/KM0ufYmuKe3c/JCpFYccF6cTcg6AslKiFogouqMQGMy2udYL4NHB4he8F6p+5DPy/kHGt0ojtAoQGjPH2PYJtIcPgYgOB+Nx/VZIdz7yTF7jcSYXbF7t3cdnVTHSWkAFLy57LL6o3t+/IfPjs2TytW1OtZVoVr7APGUFYbx0hOJa5sqzIlcU5tMHAhTD4+wmgAWjYF0autOUlFYTjvwqNFHr+sgoi5IeBs7u7anHps29dV7Sc3Z6TRE3lfvyW3KnTujutgwY9GGc4fMa6c6v2sOeGcfrhmRgG5KI+0oYcibfJgO4AvEGgMJmVM70YeUXm/4cUKSNfeY588cc2CJ0/sjkhiIpids580znY2QdBK96kIOQgdrZRTSIXQzmiCpjxiC3xfnRjAi4Ki1qL0YjZU+Mf+AJCbBwNZpmU82N+oLivj9H3/ODz9F8YDdu0+6/ZKdlHn//v31e178ggdcGOMvF2UZq9ksy9ZH0pS1zt+T2sQ5Y40HPzOPR1173YxZh4Hmdt8XN3+gObaX94j86+u0t5/RBDY/wnPmtbqhkBODi65EPA79BGLt+brWr238tlYFkO8rNdZ7ABjac3xY1u/rJgNByef5mSw3iUiqPQhAsVLE3diBjBxoDMzrtwNCEyuXEYNXHkx6C7P8DCCE17TRXSAZGrVX6b2aN9BZ+jVRyMMNgzMEba4gy6Ke1+OekE5sxoEpuKY1LYtQPbrrJ+pbsimKz8zSFP5FjUN7zqpr0DRSs10Zcwd0mjKqKWNQhqcSNsdZubpaXxjq1/7983/027GuTjY8oDjZdPzkiiviG2TzzHvX9R8tlWH7ZGOjKUajrCHSj7xPKb46bqrkYgL1tdXl13KXLrAWVPNVpeo6Xu7CHk+daVzolNx2fQAHooA76rp3tF+TaUQAttFcGdgPXfS6Efx9bbJOpu289GqsDJggB8Nk8Aqw6ZA2QH0YEQ+RcJ8VeFy0wRZhZyjivPNgE4Ks6QlYBIwL5cCrylqCvUzIGj2MDHJ0rQ5o1x5DbpcUS8IgXnWgYUGqRPGPpBrkn5u4TqAz2/Qk11+wJqH2nmpPRqIhm4Gy58Rqh150W23hXRaNGvActRGJxgdcEBxLITQbI5kfDHoXD+R1P/fiZ37j7v6OwyeTvuBJFQE88t3vVvnux8yql59Whwuma+t1PplkBu6wtl8i5LMpM56r6ihsZbFho5IoQv17HYJBwM/1vzQlcEDOGXHe8ELBS+TXKlrpeS9yc198aOFNA0Db5iBl7uHtGG6nBhocjDh0dJc1vbalNPbTq9HSCoSPHMN5suuQKYedq20cr9UrP0FZciDYcJMwD8ecQ82nHbHXTkDQny3i8JTFQEKroNhYstj27XtE4krHxBcMCOW1O6mK1QMTDbFJy04BRp+/g5OpOcklxu3K7H9sRU7tQw4WkkHo3IEGxpTpgJcUNT3A9ZaV1EgRY8gno2l9RpSLLls/+jOqFXkSpQLZyZT3P+rKK6v3vfC5jztHsieWq2tVGI1z3fwICxEKY9yWGgMo4DpKTI/CcpnRdo0t57XypPzTkeLSibbk23sIbw1BIPJQS99Hb6U8F5unkQYeZmZ999YabKzAbj+BdQ7apjHxEFYE2HTjAp0B6QwjEsceTE8Pc/ZMYEQjC2wkinRqWQ0qujRilr+78SGQSSajNuXosBATQdF5BowaXG4s83KfwxQ6GtwYgt58ZMaRYn+uBYj/HBclkWatk40J8JH3rziKNy2xJVkNktrFtizYxT+Ni9BWVux2esTGJiJtpyZxSaccgTFY8auWZqxjz7Jyc1yfW8cf/dunXPaYkykVyE6a0H///ubtz37SfS7p5a/rY1OOJxlmyiHnbyDlhXIfSD++WCp87+UwMtaS12Hpjzp7vrCPI544g08HblCp1hc8OOYQB8VGdX37zAyGB442v69lrqXhH2o0KAIao4JiuvBVO7CWBqQV1RQwXrvm/SWFN3VJMk1xjUKSf9SKqAQ5UXz3lF55QOrjRBxn1Ol4clMizsBQxKYH9RiAofdG4OdeWvTKQYqP7VwsKjHvqmQju7ltV6RGDUyjwJvQVKS97zrMhAxG/R4lQmUr08d7+7BWFexnWtXRRi4bcuqcgaQ+7NJkDe8xokClBzMaICaiBm9zEuq19TCYzPIH9Qa/8ppnPfHi3fv2NXv2nPj754S/ABxXoHlDJH79wvafWin6507X1gyLRtiMGfXTUkkoSWSKQJ0udkeUHZhCDq1trQ4mtale4vV7SK0EH3pK1+snBkZAnl15CPdNytrINkGpqOhOw6asUYHgmC94s7ouUxlLN6gCVgjDGU0oDZkhtAtrOK6gOv4E85gj6+gunKuX5kqG95wZ6MxbRAhuBKzaESSb7ylhRstvyWtz4hBUitTAEaMA8w/vq4bNcnjlGbBF1weoWpsugFD2H3Buge1LkxZT4+Kpgd19gxEdHMRpIyXQFUz6MV/v8YWCpawSkN7UgoLUMWx8OCvPz7kaOMdqPNHBrxXW0GicjSfjanusz39M1rwEqeYV12hp8IQ+TvgLcL72P/zUc77zP5Xh95vV9RCm41w7+9Y39QvhXBbIDIOuHeq+HYKfvRGtgAJxXjtnS63/u07coTY/vBBCbPXCnOEHz6+98cbn93xWnLOfU6hiPFMwEoRc7cxTYA/RRE/i3MBKeOhSU+DP6uE4p5ybVUdpJflvwwKcU6SLHRqAyGW9tda3EV40gTHEpiU7uItlYRPgLbE58XcV64zW7uvhi844ZLqjwUNrQTWnVvlxknZUlgzlVWsB1inKOkch2BwEGjCcvc5JKHKDWpKoKEhVlEd3flJHyMSMq3cXtsKqLdch6j1OpUPYRzY94WgwSMXZmPh8tHVTQ9FGnpshwpRnNdiLc9I7bVvdDIfNlXV87Le98bf/4kSfNXCiVwGCXHJJ3PP0py/ea1T99GBWFZujUZMDWd7ctL5+BahsfIw10wRpdCAHNghxKeS3TBKVzIMNrJ2A5JCzjs52cwvzKc5hZB9jofukXy3RMQTH+C9sWK0uYpTY5ljk2DEZrW3KIcy4Z/45DEGWe5ksrixJtm1JyoVFGzSCzaQDNajc41UEagTqvkDo66QcL6FjoyI511O0RAYjuGwwp40J08vxTU5+vfc+OJ1ZR5i7VwWwiHNA5OAkJGXpschHrEIxFERZuo8bqepK6k3QbWcymE2lKks52kTZiEE7/BbzTJaLTOaHfZH5eakxQVnBTkQuiDRwr61fQJ+b72BSihPKT6KSRw3aQahRgOEGel8UsPBejZgESPVZzSh0ojJvpn5sEmTWGYq0p94Yh7lev/fgIt/zylc+98rda8tT/zg5AY9wMnj/T7/kuS++ZxlfPj58pM5GIwP+Nke2KfC9JfAG9hDlNaTNO966feg2rssVe7SHHBvbRTySCrABZf5aI9rY65wTYE0+ucTVVRkcOSqrR1fl07NKPjEcyLVLS3JDUchIm/6izJW1bBuN5PzNsTwk1vKgub4sbl+WaudpUiwsGhBI0Q9fbp6NGPuv05XocwgY1Zg+ARV+leXH6AFv0GcMoFUS2xh6StThUw9JXQDz+t7P4PMKa0s1HESjF1b2YMikmkyUbn14bVOumUzkk71CblhalAPDoayCaBWCLNS17CxLuWhzUx5SlnL/4VBWVpZlNje09gBcGceVIcIwnYE2zcImdxzCx5pZpRAb11WSgR/YSDYYMCsZClWU2CWp9OtMUzOFZFVc1FSe8gEmDvUlzA918lB/587843n+/Ae89jdfdSJ3DZ6wBsDB69/ds2fnf1099NHt0+lZ5XgkYXUja0DqgaIvCT6apyIcZfiqC96prN50Q36+qfkYp7y5je68VQpMmVcXCuvuqJM7LqBIP17eL6TGRNu1Damuu07+an0i7zj3XFm7+GIZnnmGvufm2prMIDlOAK6clrJ+9IhUhw7I3Y8ekyfMZvLonduluNs5ErZvM+ANWAZCF6QBGql0SC8I/UFkQXOOl/1wbi7dNS1Tnd719kE5trGCnCKkuIN5W+uoc0yAnh9/V5ouIhLyIDp1fJtdYsaz2diQtaNr8jebY3nH3ECOXHCeLN39btLrD2VjcySzycwMDHgGsEGzqTSrq3K3W26Sxx/bkG/ftiTZzhWpVDaNakXa5ES6M3EanEvt6YvzD2jNTaKcSkjs19C0pcMNCK55qGsg6IxHzZg8HewVkvcLyTBkFf+2MGz6i4vhaBau//VaHvqSt+47RPznhIsCTtgUYP/u3Rlyr6uP3PL8XVlxzng6abLZNNOFCpafc9pRngLiD6OQBCTaBjQreVm+3rahMuTlTHv36CYJjjDcQnKw4nSIJ0JmzfURDVhKUNWNzK8ek5tuuFHedMZZcvW33F+WduyS4ugxueULN8hoPJGyiTJBSFzVmt/3lNAiIsvb5AvzS3LF2jH5p2Or8hPxRlmKldQLC5Jr551LhZMQ5OVLoulqAHF4GUw5/64a1BoM0wHAZmbVgI0yChYOEP76fED2DqgLNvae4gsqY9adU2hheDmdSrG2KTeubsirm1I+fN7Zcua97i9nLy3KwUNH5IYbb9T7k/dQGWmlz6HhO+j15cC97iX/qyzl/Z+/Tp7xpVvlnLNOkzE6D5NasFmtpI/INmZvolK+RSIdWSNXUlWi6/BpRUIJMedd6AHDhEnPWhKNGnUoUBun0kNUMJ5ms6LX7Nyx7fzvqmZXhBCeoW3De/eecAYgnMjDO//mxS94wEPW1j64MJ0W1WQcstEkaJcXuv1GoPyC0AF6L3v6XYSX5TfdBoqjAfyjBh8XRlRhSm9+x++zFo+DebMCRdpgztxcF1aQOogMDxyQj9xyUN78wEulufTBUq2uysc+fo3MLczLhRfeQ8qqks9//nNS141M0I1W1/qzaVlK1VQynxVyer+Q0XRTHnj4sLy8yGXlzNMl7NxFNN/b3GgAEN0w33WsQmE2rZ0xbCdjRrkEeh/8XjCX573RDaXhvZc8jR3Zzg4goOoNNRwEAuNRA+RbW5OPH12Xn+8VcvSC82X7WefJobV12RhtyvnnnS+DQV9uvulmGY1GMhwOZHM0lulsKrNypsZwsdeTC3dtl11nbJPFT39WnvrFL8m9zzlDxoO+5MBouGkRvSSBVFRPGB04JRjpmAqzKHJr5w5ylmUPvBcER93wO805QxrASAIRTj7op3bvYnFewtJ87C0vxs1Bf/yXeXjoZa//nWu6E6VPlOOEjQBwXDRae942if3xdFKH0SRT5B8lG+X1G/PPBly2/edApDWHBIDmM/OwgpjBYSEo1VZVa/QnLYLuU38cANRio+EIihUIQK1GhkePyocOHJTXPPihMrzwAjn0qU/LTUePyOVPulwe/13fJaedtlPxgfe99x/lta99g2yMRlJVlYxGm7opJtOJTMpKbpw2clY2kKuWt8mzjxyWV910QLYXPcmXl40QQ7qulfLNi2ma4GkIfqIjun0en4OCHtEE1fbTJiC/dh+26aE9+x/03VUqvNNeS8KQ9hmQswClpc8c3ZA9/YHMzj9fioVlufaLX5QLLjxfXvGKl8ulD3yAGoqjx9Zk3/7fl3f82Z9L0e/J6rFVvdN5qGQWG/nUwaNy7mgsD7rffeXXlhbkRz91rVxy7lkyhZ4f5dgslGfcrUEIexTwd6D3jEgsOLeWaTd4NrUoMjPwpiM2KbGBS6Mnbcc2MNfAXmN5yqwM09G4WV6cX7g0C88WkadcISJ75cQ6shPV+7/7J597/x11c9lsNokynmTo9FPqKbwgPMF0ZoaAjX2pBp54/Za/+5BK85bmXdQbENH3/NkWQ8vUS2q9LkZBkcpeWckXbz0gb7nvg2T+vLvLZz9+tXz82mvl6U97qjzrx54hi4tzMh6PpZzN5Fu/9ZHyP7/ve2X79u1ywfnnyTnnnCun7doli/MW6ld1LV+czlRu66r5eXkV2lUPHJKmnLYbVOv7ItlgIAEoer+fwtzEuHPAUlOCnjl+GEd9+qjl10ZlQFnMemytFEYlH8VFQJZBNQMlTDWuFlXhHqdKalnKLcc2ZE+MsnHGGVL1B3JgbVV27dwhv/L618g3f9PD9ZzKupLt25flBS94jjzsGx6mVfqV5WUZDoaCoR3WSVnL9eub8t5//rRsv+eF8vaLL5Av3XJIBsqXMIk1o107qcgMQJIKo4FzjERTjaaRXHsdKHgSGSm4hDrrjYr4Vx3xFnUG1vYcGpQyTVEoVGVWra3GMyQ+ASQ0rMsTTUHohDpZPa65JuzZvbt/0bHVFy1JnGtGkybUjem5YyHgwaD8pyQV6y9X784Q1Up3HiO3ktWeHiSJaRWsBMqPkdN8Hem3ljqwPOiRtbbOBqlvuUXevOsc6d3rIrn+s5+TLx05LPe+1z3lsu9+vBw5fFBDcm2RDSKTyUguuc+9dYNsW1mR7dtWZH5+XvqDgWICWJx1XcktdS1zWU/+eDiQv9/clP5o06Sy1MCZ8VEePklBCmKygzCCR6AsQLIBPc9nWdSCI3h2dvmp2Ikh6EqMAcrPoaCaDpBNqP3zOijUNmKD1x3bkN8ZT+XgyooUc3OyWVcyPz8nj3v84+TCCy+Uo0eO6Hv0ip7MZqVMJmP5pod/g+oqzC/MS59hN94b6VBdlXLTeCL/+NHPyq4H3U9+b3FBZHMsYTBIo9JtA7Mz0IVDqLXiCsmGmbSSZqbN0BK67Fqc+elkomjVBSVmGaMQ6Y3KuFVWXpSNUWgms2ZZZPEhvfgcOQGPE8oA7GO55T9fdM7X7ej3n1BtjhsN/RXtrxTl1vFdZIZpOKcNKeCvc4MQ/U+UWA2ZfdxX2+Zlm9TyYGsG8k4gq5UbSaedAQBW3dyxVXnn2khuuPgiOXLjl+Sm9Q1dbJdcconm/rrPODlICTEhkxH4ClUpZVlqZDAZT2QGNh3Zf1h0OLX1kMmgPydvq0VGR9dMfgsuXC+BLb+a7jDM5dhu7ef3dmd4MW+vVaIOWY8uQ+4GzqcMs5HIOPomdab/jGzHqcha/qulN5nK1Ztj+cthX5aXVuRIVcugN5Ad23fIBeffXQ2Ze1xlJ2pdnr0LTvlFClFVUlWlRj/AA/CMPnl0TW6+6aBsft0D5a8OH5N53O+eiX665JmqB3l5MMmqGZKvKL/3Fbg0mFdGohlxxzqURIQKBsVYTImYvQhkC6LECT0F0BGbqsnq1fV42mTyhN952hMuBBCo1PQT5DhhThTH7ksu0Z17QTl70lwTsUhiDDFoXz+8VVWzHGSL0ppyLC3Qkl6n993VfXDo5sdmUW/hohcM9VWBhiAgm3xSLuj6e8AQm0qO3nyL/MH2MxR/+MQNN0k5m0pR9OTAwUMa0hf9vi7sEmIcIAUNhvKP7/8nWV1dl8OHj8iRo0dlfXNDJuORlFWpmx/XAMYrct9+0ZPPFLl8YG0kg/V1qXBdCMHJhLO5ALjOutUK9Dl5qu1n8uIaDeg8AlCZTcbchTcUU+A1oz9eFz7wEqXMmhFNTTe6WWopQRDanMifl5Wsz83JaowyKUvJi0Ijms985lrJ1bjATpe6yXHjFhaW5AMfuErGk4ls6nVPZDKdSgnUXVV6aiUR4Tm97/M3y86leXnvyoJsHF2zcpxGHwzotC8B1+JhPas4CbA0Qk8SJLFxTGJaDi2noO0c5HASYizqLGCYATLj3DYmUm2i12QWZqNxs21WLz4kC9+FdwU1XU6Q44QxALCqYe/e+IfPe8bFy9Pp99THVqHckmltGx1beCja1ltauy/7w63mT763a9TrA6+1aw3eHcLTinJ784yy+VoijfLyfVimC2l0VXVB7Z9M5crNiRzZtVMO3HyzHNvclOl0Kr1BIR/+yEfl935vnywvr8jy4pIsLS3I8sqy7P/9P5S//du/k/F0KrceuFWOHDki6+vrMp6MZQaNQq3JuwZhkA2UF4tC/hr18rUNK296WYw4hV4xG5z0V721WcN05OmIiLxxiXmw5velbbpYU9gjk4ZDS1qeBKcI63tRp1+nGtVyy6SUfwAGUhSyOpvJbDqT6WSihu7DH/ln+aM/eYcsLS3L0uKiLC4tyI4dO2T//t+Xd/7FX0kD43n0qIKhsxkqAWBO2pemInUtN26M5MDhVRlfcLZ8ZG1dhtrkhInKOOz8mu64cfuxtfu6IaAAiSskNak9uHUGRkjgcFRXEvYmMI6FT2IkeG9EA9MyICrYVjY/9uIf2n0aGtP8KdzVjxOmCgCrulekuf/65PHLucxPptNaNsa5a9XBIit6T163gVew4mzQ8XKePxZq9Gm4n/WM7aZ19Vb0w/vWLcclaUgJMC6G4Rz7TOKxNflgbyiDfi7X3npUZlUl/aJQb7+0vCSvf/0b5eqrPyEPeOADNdS/6qoPyUc++nFNNWaTqYwnI82JJxOkADP1/paDK04n/TyXcd3owv9IFDm0OZZtWGaDXFCIMLEOtvzCYOnsPtB1yYzTcVdmBGxgqS10185X6WwnF7GBycYJkh7cfZ1SiWk8sOmrSq4tS7kxC7IQgkwhXAK+UFnK5samzC8sqAG86qoPy33uc2+9LkQ+7373e/RRTKcTmU1LmZVT9fhJmot+O2aNlDORT9x0SO599g55d2zkW2DkeW7Kz/BNinOsaKic8YnDH39CgjHPwIhUxuxkQJBaqo34ZeQmRhqIr0CNVqqwpVi4h9mszMajcX36wvwFj5nF/xFEfh3sQDkB2IEnhAGwNHt//ZZn/tBp2ybN09SDjWb2KLFIUUfHRqUUNtAtI8iQz87+eKPNmm6fvq8bCv87AcEmVtqMk1BwWnwtG5rUDecD0Pv3e3J0cyTXzs1Jv6nlGMqRWnayTYKQdjiI8q53/7389V//nZJgvIw2Ho20Bo581zZ+KRVCYDLyFKACIBmi1PgSkUOZyKGqkp018uXCQnK+px7qnciBd+NnLBkqGFIAlCCnlkuxzIENcKPbHAPrazA1HwpocsN4BKH3pKrkc+VMyj6oPIa+A8SEEdvY3JT8yGFZmJtTA/Ce9/yDrK2vy9r6hk1dm04U/8Br4fkVdCPHwOjN+Jygw0duXF2Xi09blk9lQVY3N6VYXkINwwRIyEXySo42Zfn66fCmkxoyCD4NBWFco5DnbmPYLAoETgO8JUspYi0BM1g40kyNEIBRtGmPRvG8kH3PQx7ykLfK/v3USL9rHydGCnCZKbB8/Uz+y0qs7jYdbzYowajh915vAkDE6An0e79/q9Zrm5p941oRwKKhJ1RurLSSU6a7bWw/5tkKEjkwxggyn8zkhs2JHO31NXSfaDpiIpNY3JPxWI4dW9UmGGACvV6hC//okcOyvrEhY+S+CPuVDGObwQQwLGwFCq1INMd1TSTIQfVEkM5mLq5qQmzDhYgIQDLW8bWZRpV9OfJcoxkKaoA0xW69JMqRGm440agjNOK4h471ci5AXcvNYPZpCTKYzh4MXwUDsCGHDx2Wm265VVZXj2n0A5APhm59Y005DyAAOeYBjMQNjEVAPrqskfXZTKajiaxmuRzQbkonILEcm+YNUMeBoT9XQBu6JxJQJH5iziAZUDoFraB0BF5NuMSk0PWes9EL4b/MygyR3Eoev+Ul9z77IfobJwAYeEJEAMip8MeOqnwiws1qbSPqZBeErD7CG4sboJd1h/DP1ghY+Y/N+l3ZGF8zPhXHm3qofuv1Zh3jjSESuhBAn+UAEK6bw9NSRouNNh8ZKUdBSlIFDN2uK3Dfc90gk+lMZhiUwVZg4BdYxLW2sjr+YOcGHgAMiZNfsM6PIP8HRwCRCg7W7e06rJFHuxrJe07juGkErZcXXAJEEGwFVt0ATAXmrD9vbtIPaA1CaqNWMlUjOcRO0jguq3DA2E00aqrVqAEE1PtQ1xbyAwilMKcBtBZNsE/PHxAJurb5ZlUtaxsjmTWNrM5KubvrDGpsT4l20pYtMMC9dJvejmnTq6EcXMMqjoutdgFgSemOtWcrLbiulUsQwRwluUorG3UV6llZLQ+2FQ8YDr9dRN6PkrXcxY/shCD+iMR3PO1HHrIUwsPL8QQ7K1MiC7YZckEAWx1wS2m/AHJcUtqJHor+MypwJSDOlWwXAAlBBH8c8UYorOEiS1eaH/qUXn5GVVoYbyWjRkE1eDZEBVj04P+jCQZeH54PIBl485hGg+qFot+aA1dKWdW6M3UHgbT7BGGYHxBmQDkGeKfTbXAaSlUFB8C69dRAOu2ZhtFFTvReiH9vQqOqiKMbn/dFHwBja8AeFEDRmjoNgRoMzAfUlBtVGNvYFbz6dKoef7Q5ko2NTS15asoznVmag6qNgrHc/MkQtOCkK/m6fPqRjZFsoGRKNqaJflhJVi+HvRv2uy4I0sH4dMP6bMFMlY6UGs0SKtuk2iiE988EWrwHg4NRdTgqAWaVWp9lEBRdbOQxT37yk3vuuO7Kx13eALgVvVeRffeixIVqMq1DXQfViUO4zOm0XupRw01J7sSJ9zHSTp93eqtLP2mIz/yQpSEP95OApfeNo4Smbbn0Kqqc05chauSzaaudB28Bo4DcnnX+6WSqof6UX7WG+7dBvLEhGG5a6OuRQJR+jIIgexBrOWNuIHHQt7AWtW6AoZ56kMKqVRBSofUegGWnAp3WvWeGjcNAfRygh+CqdUgarfb+E2dg7k/RPZYeg/Tg3Um+wu8D54CXh0Esy5kawCmqAzB2JbEONXZuBFpgMWmKOcWQ5CCwAwEW4rpUgZCtzp6yJcOkoB3mHDDFo+xTkhHQej6eTSV1WUulKkZkC/q6U3pAJx6BUrJOfYJhZ2qC91C1KWszlyZmoAev1OWDd5eHH42PvqtrB97VU4AAK7r7uc+dW944/GjV+BuPszCepc2SptikGVBWbza1G5SEfCy2C3uwAcQFOTXvb1+Txmgr5ZRnkXrwSSCi1l+EYIiqzERZLgrJJ2OJ8/Pa1Yco2ufj6RzPaCo+APeQz1s7qlOQ2yik7U7LNGwuwH3nosbmx2pailHORL4NVqGClCaiaREOQ1cCX6ZeTMITue/eyGRgoE0eAjjqnAY9eaVJd0BQRcMhBAKA1AakKrlHRUVyOQf/VleS533t2qtNJklnETQIVaSry0+dQ+Vg0Mi1EH3i62MzgzhlVxlloABdLYO6kR2DOT0fI2ZSxovxu711+xyt1MPP0+lNblSiRlueAuiC4702I2ygb9YZjmrSD4ygOK9ARVMG/Oxq1sxnC8VFRXysiLyD3JW77HGXjgDinj3qt585WnvwwrS8/2x9hAQ4GJvLpL10seBhOEqL0JDhv7awOLONgyGsR7wddmmAkceH7CxT7rcLVraew7yka9Xxv8jb80xO6/WkDxJLVco8+OZAwl0jUBc+Mhfz8h5o8iNbhRtqD+AT8iKXAu/Z62kLKrB7ZPsosZ0ZRbZBbEPZbZnEGeStmfvDE+F73APgFn6tGN9NlFyvEeQdPxNwJ7AhWBVJ9VHWzaXAJ2ND+ggvIPXmsfEbZZbLxf1CFsg2HLjB5SYyL89Ih2PSPGw+TpSxUzzPyCkA+amX52oMh+jUrSo5PTZy2tycSoyZBLjLoxPrSAIhFHBxSTFCQ8qtYCQYVBAk5YSphJwkxph6+AARe2YEXZ3J6J+HCKysMoCC8031/73ou75up/YH3IU5AdmJEP6fVdf/baGpizo2TWiaYDPqUH7ChFdpyz4ukKk4gFFbUzurPuPO5B1HsIloW/jYskjdsWguru/dGaCpxBzKguWZlE2jLLUL61JGs5ks66IyjwAj4PLWajCIKVDK396LZTr35jkX/rDX102A39cUH0h4WcoDQiYLaE9VRN9KehrKaxhMT66L0kePUeacQqGOc+jGYHqEqch6Oj5vT6V4zFjWkxk3kfPvOUYLtzM3ctI95+fkgrKWaV3rRtXAnH0F6qU7AJ+JkXTmBDjFmn0FKCEC40B5FZu/lwcposgwRtmcTuU+Icji/JxUOtIdWAw1HVgJcBq45++mJuzSYdyOaaBL6KyFVi9Q5z5S3cnHiyN606lRvBcqHZ7KooYFhLLOJuubcTnIeY9YWHm4a1fIXfS4y56YHvv3N2AArtTVw3SSL8kpStGkfjs2gW5xH49LyWsbKd3Bk9WTteOjcRiw49E9Fw+VbB3I84k2itKrfiCHiFiOQaZdI8W2ZXkkat/Ticy7hhwHiMJ76fiuYDqBGtYqNRY/s1xaG4/yXAa9ngz6A+2Z7+WFIs5YzH0HpaAStDAUmZ8znkAak2WhqAtmmPei9j3HiiswCOzE3btOQ3ZPaJGHpjdOdfbuOjcYHvmoriDaiIEpGAaxbW5O/jN4DWUpg9ioGKcPPdVpQ7hW+wS9Vu3Ko3ioiqAi3EfKkxdaJoXx62eF/h4+GD2Mmp2Mx/LNC0MJkOdiLu+a/magGKV4/Z/Xx9lgbPhpR4uJ/tg2PldOMsqMh/RwzUWjUtDrI/dXIyTaJVnje4DSk2kznNXhgmzuMfi33XLXPbK7NPVXJD7o1hsuHmxsPggPPtQ1akktsq8ulhNynK1GBNtAfqLInnty5n0N0EebZ9gs5HVg74P3heO9AHgvrwVzoSReQdVIhpLe3FD+y/btcvZ4LLEqZY5qPYgUsOCxmeHNwQMocnAB+lIUuS52dMdh088PwSQcyHAwUBYhyC8qTlFXMhdrWStn8g0i8qDFRZn1+/bvCICV8UaQ0vkQTvxh5SCh5QyJlcBCbQONDDQoYhhLFSDvjvOJv0kVCMaCkQQ+A/BBOTeU/zY3r9p+ZV0rXgElZhhCREFFDjyjkALe3e8FDBz/jogHakD9fl/mBkM1hKqCrBWZShYkyqgs5R6zmTxo2zaZ6eg09mWw3KffM+SwKgZSQsqpa2HEiFRUABHHGmvwQHw+QwKLsRZso+v91TVk1GIdrOpgLQBBVGjw3tPKaOizSrOS7UXxkIsuumjAasBdMg34WhqA8K98pcMbKi5cW330clmulONxHctZ0AGe2LQcWR2nDL0YWqv34mALl5uydLTl1Stqq6QRVgIUuSelV3N8A9UclFKkX783YNBLhw1UdgGYzUqpM5Ezzj1LvjMGOTiZyGnI2aOlKPiC10c+P+wPpAcvXxS64Af9ocwPbfPja2E4lGGvkIKeHPLhYBfmTSO9spQfm5+T4coOCcjLVfuAraxYpNAEdLouMRA9f00DKlu8JAIllSDHBCypotVz2S3W6JUoBFEMG0qCa1EDoCKjdo+rPMh5y4vyeAlyrJzJSmy0MmDPxWi3/b6F9X01evbVL3L9+6Dfl8EAxm+oP1eaLpudihhlCQZgMpLLegNZ3Lldaoi9Mvw2HX977sfV/Zy85WmiA8UaxrdsRs0KWOJzoMCCSVszjuFY9SfNITMdRI3KwEMx6XQ4mbosw3gylf5c/4Eve/h9HkRSUPgP1n44qasA8Oj3veaacNoll4RHXnNN/NdUVJU5dd/7Brn66ijXXKM/29U0j1IvjRus01vIlEP+j8WvY7oYquLwARNUuDWvaPm/9XzYYtbPQ6DrCj9oz8U0nw4in+r8PjPOa/7UitP+AYT7KEuNpzLbtiyXbd8u7zxwQD6/UsjZIZeb4CkyLC6Et/B2RI7pUTXUpIdEuoD3R40cLLoGzURNpYv/ptlEnp0F+ebTTpPp3EAK/Du8PxF6Xz/a3Yf7hHMc2LzCpBCsA0jRMUfMoJXP1evXXgo1gEwtGsXD0Yhg6TrxEjt/GhgaXPzWtN+Xy+fn5f0b6/LpvJAdRZCj4ARof4UZDpPeomoyMIrGGInAPRARmeeFvFcl9RTCJ5XszESOlaU8uizl/zv7LJkg1CfhCkQl2/yYN+Ci4MT/VDOhMzeAA0c0VWB1JKqIjFUy9PAUoc0N9X0VAGRVxZmBqi6lDqWUOBFVKspXFhCZhbpp6m0ivfPq8NAY5QPylJvzuG93ePfVl4RH7d37r9KE47596B8QSN2jrfj/hcjonWoA9Bbu25fJ7t1NCFo5b4+rrurJ+p9GkUfq/+VDnwnhPz2FapZ2vPJJT9rRa0aX6vx2pZkxz+WN11IRvLZKRbPZxWW73AsqOMRasMtDQbhDG4V8CIXzyJ0CDNCOQz5VI99Uf51WqtEBaac+gSdiBFnIZen8c+SK1VV52sam1EsLslNZe1ae04Yy5esEKTIzBrZoDYwESl6ykw7fo96/FGu5cTqRb2+iPPv0XVLuWJEc5TW0pbKhyZhyYPH1EnUVs//QuOJKxwlldMFUj/0S0k1CEHol0qhuqiLD+KlxMTBTjQcMF5RyYXwgltFElfbasW1RXiFRfmg8liNZkB2hkGNNJVUZpYrY5Bb2mxgrSEQcKgQcRHX9KuVMoIkqb2rZlokcLSu5z2QiL9i5TeZO2ynVxogKzzx/T9NSDdAfaDuD0FJ35ob+/BoYdhh58j+sMywZu66MmFdPVWocWA7eGEZYsR2OEGOUVMjAdu60ktOa+uEhyOtE3lTKm3jPdYr1IzN5N/7ybpFHPlJk/xtjuOyy45yiNhRdcknUgaR30nGnhB1YI+++Yk/etXTveMXPnndhPX3IYpPdN8xGd18YDB+gso55gbA+xtkkHzXxhpjl/7DWy/7pN++246OP+bsPff3DptVfZqvH8np1XZr1UcCGVG145rZ6dPne6apM5tsn8vq4Llt4zPdJBjIvTI09nejL/JjhpHLu+YDtNZyLR3Rf3w1RwNxQwvKi9NZW5cqrPy/PKidSzg9kHpsgikw1R1V4zOr7mgMbo9Bm1YPYZGSaRRGZi43cNJvKI6taXrdzp6zc/VwN83WyETYtCSxpkCc3u072YdTiT1hHYKMGTuENndzDOcNq+Bgq64aH4fC6uRKBMPrbBn4YaGhlOu070OdgJUScGzZwfzaTjx9Zl2dsbsgtvZ4so5MxBpnmdv3YZAjxNRrwXg1uLhXtrGsFEpeCyJG6knNnpbxhYU4uufB8NDxq56Wdsw1mNYamnZjKdXkG0Cm12p8WBRjrkH0Prgfo5VgFJ8kDcMFUppFJQYqbXmc0o0SLSg2kw5VPkUtv26I0vTwubVsIB/rZF54s8k3Pu+RBC2dX1TfNh/ziZjb9hn6s53soIswPQzMYIuIr69n0HycSP3ugKP7x589e/Pw7nrJ3xPMOcsUV4c4wBHe4AYj7dufhMgvv9+zZs/yDw/qyxUoeO5+Fh89Vsx0AjNDDr7VlhF0I7dE9h4VEkQdkd+PYXBNGs6WlgwfvtnnDDVEOr2pV3cJGjtfWsVDe1mqLN9ym6QObrB05TVqsi2SoHgABrbSIvAaMopuFf4oNKFrUjtnSnzvPQMFDUw0OA4z3Gko4sib/9Nnr5KenY7lhOJBFUHeh7BMbwSgZI7pwITkJCXl+BOEFXJxKWXOPl0xevOs0WTrrdM1ddfoQ1iHSHlB3XbsQGxqo/sCGd4Ib4MNNdKiJRuswEEn7LEllm6SZk30Mubex4WyeAtGFAzTw80znElAL0SeWuF5AwPS1UnplI587fExevLYm7+9lsqM3lGEWBI10eL5WyLXynN10O48+FJW1AzDKRjmTB5W1vGh5Se53t7OtVXlj0zwzJx37RCJ98jqSnGPRmRZZ2c+ly4mHuBBMJKKLIELLoA5uOg6gJo/VD2M8po3DuQFa4QBnAzMDej2Ok68lH/YlP/sMiWefFUdzS5/q9wd3W86yRV1IWi2YiEDDEeEHjCI6WtFvgA7KTCb10tKnD8f4rk9tbvzOd7ziV67S87UWY0rW3MUMgJMdcHJ73vCGxR84fOP376jqZ24v60v0bo02ZDorzexi4aLDIsZoXkp70UM2NxeV2NHv5T306GuHHKifpZQ33SzVwSO28dXT2QNRwQdVAmIpy4ddkhiC0pMLgWhtm3mgLg6OBNPOOJeN8ouBt/LhADBUqUXd2Iap+5A96V43V09S9KRB6W08llu/eLO85dgReUeey0GdfRe0vKUVAJS90DffVFLWUSZonNGx4rU8qGnkqf2BfMuOHZLt2il53xaJovzKSeCsQkW5O4YPhiGpmTvwZSPPtT1a5xH6pZiCrkZJfB/zki1KblOB2D3HtmT93QpRi00LsuFrjkOAcxEVmwBQu3Z4XX53fUP+T1PJQZT3cA+YfyAktyodDI9tZiD1ACrPrSv57hDkO7dtl+1nn648gIixaq737xCGN35pNNbx+gR5U5nUFYR1uFG6AWKNXwbyJSZ42l+4FsMY8OYqOkJREGORwsHkkvdsfBvSG1xRsX2b9M+/u4S5eRVh7fULqYBrzEpwpCOqRDr7UYepGI/DG5Gy4ZzkgyLPFubUSa41Tb3WVO/8SF295rGve+vf4qzuyHmE4Y5U6sX3V//0j//AOb3+i1aa5hJM55mtr9dxMpE4nVgA7eUXWEA4cvwSwj61fs60ghxV2cS8AOsyaFNOEZT3P735VpG1DXsd8kAVbWRJRhvUbBBnksUmEq3gDSfOJnqo58b05OjUUwMDT25bTaMNU9mxf1e7AmVd6sOpxp83xTjzjalohjFSUOk5eESuPnhE/my0Ie+uajkAEi4kwiA4Ko2Mqae/o2nkQRLk0fNz8q0ry7Jtxw6ZILTkItEr0o+zhh/PU02bz+YR6n3R753ybF4cpS7VOeRQz6SCy42T4mTf+L402HTl3yfaLfgEnCCsBgO/D49IDEUlwqnPUMwa+dLahvzN5oa8B+IhIoJ4Ds8EBrHkM1zJRM6PQR7ey+Uxc3Ny0RmnSVxeEqiBNGubyavrxvQx3zxV5zOYgIjhCVYNavn9jBcSzVe6NGdvD+42hLFt3EuEhgcwxdBfNrYnwv8iD5LP9WX+wgult2un3XuMp9OOTGmasg5ZloUInUg+B8Ue8HEAtHFpqHoCx2nqGAe9GPIsZnme95eXZL3I68Nzw1f/7OlLP/PWF75i/Y4aR/ZVGwC3Rs985jOXf3yx97qzy+ryXCqZrY9qmcxCrMoMnhCAiG50/BIbUmxYJTcYzIO283IxadjNjjzcMCxoFaYsZHzoiJQ33mIOCmUX8sjNC8Iac4N7jg4PqJaE+aJLfLsicGK/mZHAxlavxjAZ5b5GuIE02iXIyAVlI6sJQnpI7ssE54xwEIv22IYc3liXg+ORHBnPZLOqZKJNOZkshyD3mB/IuTu2S295RSbDgU4RxkQjm9hjix/MO424sakpbKmqP/ge3l+hEZvAS+Jz6ob0IZmGZtPbO1HGDQZDIB3E6aPNMb6bDUKqOKR5sM0JNNtBQ6JCnebVtIPPZ+5hoyNDKktZ2xjLzeOx3DyrZFTXUihCb6H3aYO+nDs/p5JpARN5YdDA/3CxUxod39j2HKQTzieZY54jNQFSQ5c9K+2yZDdgcEag/qclC7W/h88x5SBtHdaqAHQYLCTMen2tTA22LcrKve8pvaUFkqaAncxEIKM+mbaTqihUkg37rLrkRl1P4GVLRFNSFhifS4t1r9/LettWwsGF4cc/uzx/+cN/+lUfuSOMwFdlAPwE3vPiF19ynzj9P7tm0/vNDh5sNE+czEyvDxeluap33bVNH0bA8ZHOpPWOpxZ2Un1XTxKLXjd/z9hlRU9Gq8dk8/qbLBj3iTW0yOqRFMgLHWUZEj0cK/CZcG5gFBgi4u9gDw4uFLMVAM9gjKiO2wmzFVxWoIzcAgeWfDwXugj7YPah5GfYB3J4FenAotK5c32pgBUoJtJIvTkxo+SNQ07H9X2adUBLbnQF47TXnQsWeIcP0VCHHNWIWM7PdiTeZ8U9aSAa8p41AuIgDeM+GI8AIaxuAoqwqioOF7539XmKpB5XORambaB4YQ1uQNvvDzTdNQbrtFmsUScZau0aZPTiy5czArQcqbLwxJ1pfDCsNGk36nqz8CyxkKPdE28dTgQoioba/Ualh8adxkSZi3mmugeD7Suy6x4XGKrR70nsQzsgg9yRzVHEsBooBqkwqwGFNpbN0lecmZbjVILd2KZatlZpumgDSsF+HAzq4Rmn56OFwepnFofPedDL3vibX60RCF9t2I/Nf98w/bMd4+n5k9WjVdjYKMJoqotbBTQUUbY83Ca3EjjDRtMNZovPVGdpJOhl3AAo4QInWwJ9Rx3bTnxzY0PWbzoguQpVWvkGi8o2qeMBLd888b05UMKbPXwEtXIEABpSTMMbjSzfQ40amnmkr6puPxVjqUQLUE8RdoT2HDyhC9EluWDRcW3AB/D7SmcuLfoAKIrXQegD90NJO9QotA4Wav2jDEWCPe4nJKyZNunHcGIRby4XHKoCFuamEeNad6Shwr1TngNzDA9//WEj901tzm2KnBiI1MZLRUky7yzHZVhNINLsiOEoiFi0JKhRFoeNsNmIQ/1ShcBsN9MOfx8Svrwj0EbAsXTJCo8NQWJ7t0u+kVIeKGCiKZN/VBoW4jgB39sZpRqINGrEazT97NgmZ93zHlZexTNEJYDrwRxAkGY0UbDPcRpMH9YoDNoRiHqRAijFnW3G2tjVclc0+h0UIoMeIqN6eNqOfLqyVH9qbvDkS1/xv9761RiB8NVs/ne9+Hn3vn9s3rlzNjt/urZahWOrhaxtiowt3NdJPbnn1tZL73V4Q5otFPU6c2qRBbECi9/DMmr6WaWnHRCJUH99Y1NWbz0iA73xFiKjTgtijV6gbl6Cva577zTWTmSQlju55xpaq2iGRwi2AG3zc1RWJwTVB0lOvxKMuEjd2jsOYUOEYrvo8YX3w+8WlN9my6qGgE7vxX+BVGsXESMXlh9VytwJOyhrei6M+8F598aYw6hzI1EZDs/dA2UfRCTJMDie4EKgxpxUT8t7ktjSrpfIsNrmDlLzX6MWRhv0qHbObPdlKJ8iM4/SWFlR8I0sRPPGTOs6bUWm7eD5u6Uy7H5WkpZt3g44SN0AV3PWQ6nEHQzE6eBaFWkVkdHGXZEbgbA/X16QC+95D1MI8vHxCkSZYRaE7+ohSGlWnMQ1GE3LUudYKhGLEnRI+XDPXNWJ907t8qCv6WScGzY9lA93LjcfXR78yDe86rd/8ysFBr9sKrAuTdB0v+3bBveZjH9156w8f3bLrVV28EgRj65rM4RAthqlDlpx30itF2Y3ngprQlXTOt40RAIY2O+pV0a/tVM81fIzbNYurKqWajyVxbyQweKcTJSfzXqtckOM3+3RozPWLOSltaf8lr1Gq7pJSjwRilwVlyiweQhnmja3+QxLE+w+tRTUZFy8aaWE52/zQRMYtdzUIwfbdOYZ1Iixzq6GiDm81oP0i+CYl/7oqs3wUgqcmIrPEPDc3e+NgVJmqC3/N1UhY2CyqYd6As6RSOVC775U5Ry7P0b7clEWi17ckCmV2HabVTR8Wo+nNwTd9L6zhTlFF67h53p+DOl1A8OAKjZjQ0PVgHiIr8SflgyUAFThH6R+Gw+QD9R5H5qR8MmqClMls14hZ597tjX/aA7fYRsj9dVrMiqxRqLY+ED+OVjWuzcRDVoXI++3r0tGA6iINABB0ZE5mUmNSsjRtWy2vhn7Bw/n9zm28fo/f8GTHoDN/5UMJPnyewHQo79/f33dfc7/tTOq6pGTG2+o5ehq0axuSJxWepK6yJ0yy5xR752q0rBc5m2YLmOFaB2lLrwON6vf11AJY6Ccw+/AleZNMATosS8r2TYc6KKdqtKMKba0TSKdISBaYuJsgDb9I4TMB4YT6XRwp9iAibf6Wspz2UNm9OLVDbbiJt2AJHFFPIFKMy65pSUwhI8qxcUVxpSB8YmdnvYDI1WgodR7S2COv6YbSM+NE3980Iez+XjOWrgj+cjZlXovfGwYZwqovn7KA0j60ZNmepNFrZ9ba3C7eL1E64xaK4sYYcgowBwrhhRFb6gbFkt3qM/Sag8yFdPXaLREGnFnLkNSDeK9sPXG++vaBB3jxxhDoFzkgWWKEuzM7IvTgeD5tZmyamSzquWM03fJHCZBu2SYTmcmz6IHpSYjWin1WqXH0JFpob9+BsfR2yrxwgvBZTIxU1hEaTI4PFRD6vFUwuY4Gx1Zq1eObSw+6Nix33r603cvYjjpl6s9kH0lof/HnvXkJ58zmz1xdvBgHdc383o0EkFzBv6ELJbystmPT/lkW2jWaeYa/Npo4vVboKkItX1nasssvSzbUiNybEWBqO6Axha8dVXLysJAUWUYADOuPuaJi8fdvi96xSLgfFuvb3klOwgpiunTYm1D0pCpAJ5tQK4KQ+ddRETXIxcma9VWTnTH4qQjTiemoo9tHFbaEBUQKFJMjE0/iTjD6zB8oC1Xmve2WrrJgbHNWSMLejjHA3Q8l09RYu+DVg+Yu6ecHB2T5lHh4bEYcb0mk07wUb0rgVfFNFhe1RsWVUTTIgQzLvoEKcrZRiTG8lTJLjcspG97FOSb+bh1SUNuTV40ih7xpVZfJ20lyy6eYWoViRGFG2vrIPXzsvsAYzEqa5lbnJddc0OpNHuiRqKTrrirbLaER5v4NxgsllFxCrOpYR4I+TXFoIFV7YFOdUXXTisUq2t7PJEKzNhpnW8e26jOHE8f+LTJ5KVaij++6eiOMwCczNO87YXPuvvdovxSWN2I9cYoBOT8qyMbmUzdNkVvPQd0Si1ba/UBU5NeH5421JigpKrUOPqKG6aEIevR18elijMMO1mz1VSgiTIoerLQ68morGz8FhaQg0XuKVxa22vbmiLag/KylTENLaTVMMzr5J6GdG5vGiHlbbNcXgoQKqXWNqFx682jsEm+IzNGb+kAlU8wSvp4xsSDsVFuvlkDz2FYqvPXMl1gidMBJPPeZtQgZe20YV9YCJf5KkO7/efeFIRTxedTAEQ3CM6pC3K6IWFVxuXQDFA1Ar5jPk6jNpEWNkRxJep5unNQ+2WyXEnaQSsUPrq7lSpXw9DZ2LqeHMOgpUxpm3I4ODvSS6WdX8Z90khSqcmWXplycy2zLMjZS0u65qw8y1TOm4900xLjUKagKNjnCtbaMwIhV1ZN9FnoqDTnLdJN8L3MSVJtme3dOrsQ1YXRROr1cV4eXm3OG5VP/YOnXna/L3dC8e22FuAjhxDiF57/tN8+fzT9vtGXbmrk8NEsHNswT6BgE1lxuHBmfCZFnSt1Vdts8TpUB4CU43vSMc1b+chn82DNBB4e4BfwBBvKaGIg1sNvUtq2EW2ibCm3rm3KsICgRG4UzbwLPCK9YNcdZ94raciVf73ryy44yWl5P4HTRj2icZKNKfKCgssOMyxuhNXY/Kgq2CeZASDVVKMJ5noojflI7kRZ7jSkmIHgKSiKn2LG1kgqNdUATP0Xd3auAVBy45DC7BJICFkblRR3JWAAWORmUDJL16OCq/arasDTcJVWaddyZpoSnRdAg6UVC9toFlDRy3muz2hI83gCiWqYqc+oRsc/J6Es1nijL3EwV0uP1GxIcxs5HLUlDNgfKRIUGj+WTXUqMFMDljLN2YhszEpZ3rYo52/bJhW1HPB8kapiVqENVrFoQ6tcCP/di2saBiMAj8+UFjjZrJJalaQhzkKDT0Nla9GMqTJeuR4UYwHojSrKXF+y+UG9dPr2/DPbVv70Xm/7o8d2Ztz+h0d2u0P/EOJfPv3J33LatPqf1eEjTVi3uXwayiniz6ETzp7S7718a6UOBauYL4EmqsQfbBTNgW0Ou7G8LHT3kF1n1TVe0vIN6PVfKsAg9cqw6TMZY8gEPXZS2vXyEWmt3Y3mEYqmF2wg0oqBj5viqbgR0IXpRWTXDaBnsddQ+suRXG4WGAiIe9DhJiA0od7wquxQUwRfQyNGLdijnB2g5+lDThMVn1x8ehLz4g5EcgPpBmWNnQIhGpdoKQraAyYNnrgNOAcnSSXQtJ3uq6tMpb3tubrNsSGsrKAk48lZjWz19TFslma02bfm3PBwVPjRCT4UcjERFoTcTFHcwfB3422ovI7HuP1MhCWdGkxWZDIMhkek1JFlP6yjWR1lWlUyBllpYVEqOoyWF2AYi9rUhTnlc+hb6gbHFGFLCVv5MOowuqIVv0xTEJE0B7H6LAum0a5OBWUrlyqH8agnZT4+ut6ctbnxbb/3hMd8y5czlOT2hQoU57hY4mULG5tZefhwVHafduaVHYUehs24MLW8Hk5zESMsn5UGUCkNliEv8yPIWWvpEBtBBS5scq3LZznyrLPZ1IkzXOVGxoOZ7xUyofU0nXq2snbGUCddON+45LsbcGelLn11QoFbEomGmj6SWzc1hDfZS85824Q2HNRxr4MUBrk2++8B/1DuS62755tEfzXc1z8dR7AWaOPet55e2XBKfW474tKUG0+5aJg887DqAT29A7J8gaPszrIzJSHm6X4tMDZ4VkqTtQ3pxKvmNiQgv8e6LjjJycuHnlsnfLTTjGVMOMfB/Hn5bU51ANpOsgN9Cgg3uUWUnWEhrobUBKnA7owE8Mj5x9mAljyjhiR+jr/jdWtNI8O5gczzupPgKE6IgjGmqFyJFP0WuGaqBYAcsu163pidAOcJWXhvz+5gDWrgNZrg+DWXqCMI6ziHGtMZjEApo81xXNqc9B44HpkC2e0cSlLcztC//oWfeOa5C4fXdleHDkvcHAWUOlCasFo3RTNILLGZdIwXYRl1eo0P3DDhCfVXHp4iNBr0EliiPZ+UtNNFqRp8FL30slpS5yXtNCIFqGWAzQFtuqpSTMBT7UT8oVSUcxGTDj1XotfWDZ9lUQg1euTG6nFsfrylKvCAYDs6xsENiPMkL8Hbj5MOsA/a8CYoz/csmaZ4heV6XrKyGYSso5NLoCDlcSU53CLSpxm9KJlJx4rZe9lnZYlMZZqASbUzbW6NJlx6zUk1vEHewquG0AU2iE2oYcF1s4ToOIYzL1OTEjeQ9SxQqIVerh3v1Yb8KffwiIzXq+lbbXwG1XJ0w6C3z0anpWfjsxGwYhhNRBULbQe/erRkEZM1NNl0pyjjGOVuw772VNCU0piz+qCDSqDQNCGW5eEIQn30QKJCg7Vi98YwiDaCc4eiP1fvbulvcnDex0CcRa8T1wP1MaTGsQnTtU3Zls391x9+7Dcuhf3714+nbX2lEcBll+lrHjWe3m9+Y/P0ydHVGKezzPJygjEJZCHHPI1TBiDkC49hrm5wlPFKy19d2gvhDzjTmLemijZ8DS/U5r5zyAUHXyTEHiUSKM+AyhuidtlhfJSXcHATEcqlEdH6nAkgceMrwu599hbjkjtPwU4v2GjTBgFMBYtaANBCVRJFyNpzDohPvvGyjgNkridgtWGvVpDZSKFQ3eQUFbFylkt6MyLwKIFMQDduujnZpwCk21DvltyjHXuOqjs67UzCJINmvRAumeWKwN5tl2S3mKrkrqjrkVJafp0xbKQDO4ZikmvWi686/F5NYFXEFZkwr8DnBNoNdwp225qdEH/vaPTzIfnMqh+sTMTULNkOY/FkwgVXMYsxRu3eXAZNmQQ1rUx51YfyYQqyIvKEZ59OLA1GIxzWszoKE0+xCUycwpQAX+Vt8p74miQ/QOnvHNXOa/JIVKXW4YxnVba+OY7zm7OLn5AV34TX7LsdasS3WxFo59r4OxY3N2VtY7PJylL5XtaX7+oyfnJsmUSrJO4m8kpOb3FGmFpceHXnguOaoRGgcla8eoz1BhOO4781LSAhw+vbhiKzZENQq2oaDdOOIAJQ9RY4bXD3nXXGtUM0Wb2dstycWmoL0JpLrKHEQzPdBArUcbF6VxkBxWjj42zxwzBoKYwAGD5Dy2i22LW/nF5ZzYs31/g+xPll1CqkUVKQ0ifi9JhC0ACmmX30fqmqoKkDST6eJ2uKRp4+jU6aoqMzAphi0ZDo/eLcAQdTzWsb50CjI7+v+pysyaUJLSbi+uDGwmtLmHbvzZikDkV6aqvUeN2eDTp4/t2ISg1xO8oM6LxhBSxr8h+sWtmhA3uNXXwAquPvZqjxPvg7/tysG1kaFNJjH4lNRAblG5vSngnCe/xe7vRCrh1dAd5RSqehayC1ALfdh06VStffsp5bvok6RNxnrBVjCiqQjGHZ06rZ1cT8rLJ8mIi8c/eBA+GrNgAg/Vyye3d/uZw9rBmjzl+GVGLhQ9MxGEQo0Ylm+R8RdVdUwb+T45wII0prtXKOlqfKKbn6OpvZ8qbk9Wj9fQS44w0u01zZxoXH74dMxhJlBmFKkDWaRgqNEckspoa8AlHqddx7kojkfd/dEWAkbqTSkXcg0oDo67Ubjtggqw9quDRv95yT3lWbjpSvRwYYKgZG1U3EH+wlpBw+nZcKtzhnVQ7Kup1sZpRw//nkqHegBIOE0+jBTaxhukYZfEZUOlLsICkLt7Lg+lb+O+T2OC1Yow3OMtQZCgx//dzMuLaSagak8jWt6DCfgXMp2OyjHtbAWd3fWmZzLAF4hD0nkv0Sq1IZeGQv2qbvaCS4kc/IMeFnkmGi6xWVADyzkTRyJvUiUmlWMQ1ImfMylRdSSw3+hpY+kYbRqMHjw3GQpKXRbhrW6nE6Ii1WdBLAbZGupjMazbbzEBPxSR0q8S3IqWE24ULxjboCrryyukNAwOeK3D1sbtxnMhqJLkH3eOQsp8YLAl+mo29NQCkP1BZgqvHgivFsdPyW/a7lVFRp1S4pq6EbIcP64bUuSw1MhPw6ZkvXq+XVipXpGUdVndlgpxpowRjegejAGF2NVDoJt9WN09qqfyb73o0RZlZf1zFLhgZK2WgPjZYZKiaeP9F/r0AglXGgUh8MDYKmAI5Sa8NNuwCsYGEz9hxss+3u8wgd1LRnoOCe4wrOSIRn1oXbhqt6dzTsRimVg1Q9/E2W0GvmXpMnWEbjZ1N98Vnuxo0E44CnGhQHhrtd1z4SzfUUufOVAs2RaXhWfrhiTyvzZX0OWht3KTYCuHi22h7t3YjerORlOHtDW7cFgDzbdL6hLSIn8s8IAHcIgDKuYT4v9O9mIGzkmVW0jL7tPSZWsTFjrYQmDhNVQheeJdaCk8S084+zBhi5aFrG56nVEGpeOGfC2pDZHsOSLNYI0g588ghGf1I/8Icf9KDzbs/evl0G4KKqumhQlXPjyTjGDIN5QAG1hp3Eb09dXsw9me/rjUbt07usCIRYjsjqAHJ9vwGWHKd8U5WAmXfa8rSbgJweAXKie3MuvWq/Yza9iByrK10YNujCsEXdTKnRiBESp+Y69dQ2qxsuC9s0JOMGDemzjLDiObaWZYC6sw9Boxhn3WnkTyCL16ZDMZ0Wy3y8m4s6WKnXnAyBLRLVKNB7xgXHe6QLkvcwbc7EK3BmGicra6TRUlFNINXPwSbfJJIT6/uOp3g6oAi8YgI0vS6f5v30Kac24U+2LpqOvlcM/P11GGkbqblaj5ccfeqRZpKpf8Mbe9ooxkuVVoCgAfPBITmiA2t3bjoVCJ1o3BGWUSMA9Tp1KkEGRa7Ow71u6mwFOxWzJhTVtzTAuga5/kHf9R2r/AoP/R0TMmdpI9LbQbQ2wBTP0v6tHUzKEfJWx+Y9tGvGvAuMTotlte0xy8O527O3bxcGMKxn9xqOp7AudVZWuY7E6jD5cEJKgmGXnYVrlInSnJdhFllhGqXipVhgtkJsIbcOJU3qtbFMjgsYU88fkvPAVYJKowUv6dl7bajxt42qnhYbCYtMI0OrSOgCowSYyoclRN1yVUXPicsoYm7oRwutukHxzaViEW3ziyLxPkPex1xqTZhSWp6TKnLcEolS6M0wXNVoPa3gRtCP94k13mbto69V64AhYyf0t7SAubV3YyYU3MJaHwFmXpLTdoDJEHwyRW1GPSB4zTpyYrp/W90FT7U9/9bKhlcQOupD3qOQOAFJf9+bcxz976D0bBRN91sbGVuCkVUYKPKvqSXLzoqmt1wHnftH628RAN43swiTBgg6Dl72c4o0NBBsuGiOWhSHsrDzU2dCMELWdchohA4HUYiVgC0yNlq15R56/iRgWWTE3hanAmucy+Yxx0MsJQjTaRnnF+az+Wx2oYh86g4xADuhWDoaQ+VHciCiKmftk1K9dZE5nYcqToBJWmrO31JVCAt9HBfwvFqn7tIjeB7aWRBqAelxcePwcJwUhIeIEA7GSDvmosiID8TWEltF1eoyQvE97Ki+s7BYcmFFmmCb5cqJkolzQz5Cb2Bhmj148zQ29gsbBQbGRlQzRWqOH0Cq7w8MQ1MMPxOeB0J/10zQ1mHvo+OBMlSqCrChhii+EX3Il2BpzrX87VSQdsB4c5u7wElCWUj2oRqRA+st7mDGT8VT9UcOqJqhNe/ezttzFSX1jm4QvWLCa7a/23NvdVkCUs80/tsxGY20PFXgPjfM9TbDPFiG1D4GhSlss9apJESVY+88RzpPowMcST2GRpwAttsZA0rcsZnqBDet61JL+AjL9flYk1Yaqe4DR0hz5qJoqxL+5A0EaYWv2Q7t6ZimPDr0uCVR4d5PZ1Wzo67zIsSLb8/evl0GoF9HHcip4YZvUKJEXg+3RdY2lKgQmhNZ0CyDDinSIV2eW0t+qeEGD842kn4O0TqrHBiLrcY4bvXSXq+GTqAtAi33cQik8mUogIO5ECoo6Uovam0BduUGDmITcNNoecorGt7E5BtPxYVbb2pdqPagdCHDO7talivo+rp37QNK86fmoyRNbjLd3RKUrR5uC4JePvMskZTYtKMDPPTzqFXgoSqRfC1lEp9A6Gu1/1YXz6oG3uqY5mu7o2akYrkqVJYdLtOuTFXGMcNthBx8HnsokrJuW1HwNZL0+5gLq4BriiKwhTngJE0sNkDP8n8v57VVgoQ/6Pvg9rXRVeJ66LrhpPDUiCQWPltWbz9XdolhAFg/WBsK8jaZCn86rpFkw1DtmXFupRsjnAdVpvRZaiXEB45wPbDPJZUoNex3gNwMvxlYI27hnNLAU0YvFvlZtQKjN+Agxyg95ll5hxmAcmPE0Ina7Qr0QHwzrXADRmj9rS7MsNJ0ppT+qZN3UkjriHFSCjDE3GvKyufhA+x0RznppA2J7Hwc6MKIED0bK53bg4xReqmbzzZBRmTdy4i2WOGtvc4K42WSz/aWXoM2A3Ecf8gXOQdcajiWhlX4UJI2l08qPASsvOaWavIW8vC+UQWZHthq5kSeNWduh54CbKqdlYeIpaUHcN2xDMvORK73hHswnlZBFb3+TpSEFC9Fed6ykujO3nbtQiFsqnHvS6/vpTwYNL36zoaxCvLx0uzuAf0+qk10gJIRhlfulbrFRisTlGr1G4yr0XYDMlwW7/izrkifHUhHwscAxEqTWQVs7fyRiDnQnaHXo8PTR4XCemPw7NoGLnUwKovGKABnzDTNXYX+l+VSlWRjOuVdhmqEPUp18lCm9AhevytqASy/fSTf22UAMNtdrX2iTloNGB9iG4blFE3lGb7oQsraGwCLRp659aqzxAZX7R7aCv0uTtfSK3GVlOZSzjS7evEGeLgI/fVB47bSssJyz7iZHUDylNMMieWRLKUmEQ3dCLDe2qhkuXlA9OLlSNa9u6PC9eHhYSc1YrLOfGBlp+6tD77b760v8U3PLj3lG8DjuRpBh/xBgM3YgQZqJoUb/rs2L+ncOt4oNRReEQtmJP31rMp4A4qpNrvIhjEIDdW3w9B/Rh8dvb00MNW77xIA6GicT9lhyYsG2UJv73t3TkWHduw6h4klx9SzvX1eFG4jgYQA2obWt0qt3u6w3LPa2lNQuQ28jFOCNQTiNSoCiBY9tSXL0NKK6vjUhOVaHVyjU4s69wIbmQxXB0YNx/VOSgfBUyG0BYoTlZ3NTjRWSnBjZIh9UJIwVpdV7w4zAPg4zGJHmIEA0OrUVErxGjXYYgRmDKlFyO6UWj40hka2kTjYkt7QQzVTeyUAiA2hWAGBKrfqaSW1+m0qLc0cqSZ103oG4ZUJCB0nQeXDRK2U5vRiBTBZV/UNHmvOoXcmoc+PI6VVmYIEdTr4XKebjwuEeW/y9C4K4qg18GaCjlZS9Lq/j6OmFoF7weNCXD+MNKUemxspAUyOhyRBD+581vU9HNBFSdJOotEaXe64a/PrsAXJdcD3cAVeNZa+CbwagSerbEB/T9dsa8NyH8Vl3ABsBIbqyjMxded0X1uwgEGMVxccAOSz83udhFvE9ifpyb7p1OgwRkI5GSmDVQoaqUD3RaSnEvTUj9QFS7EG9iLo/aCWA+k9HFfHvaPAHiMW5bNYNcdwFVdtZlMUN74aLN4YjXaTgSPlOISYhyzbmJVNUxTX3WEG4GhZ9k7X5WnWCgxrhNcZH4T3Shtl1jYANp9OkNGBFK0wiJdJ1Lv54nPWl4e2zgzxsNtJO9hk7FFXNSBNR6x0gz4Ard3yRk08UvFed7wHZaA1ulAdjrZ9U0N3NzBebydDrgU4rZfdUWDah9bCdzaDXTtbWfUbqzIkSrBbHz5QXZgaNZAPgSeja6uVSTdPYS3NPu3IUPlOsV03odXWfVZi2rTJKjmLF5/psTo3jIV31uSjPR0Wesbjqgbcanoa/u40XNzANrq8Ze7Z4m+jML8uUxG2t0xBK5+hDoWgCIl162GkmrXY+obQ/dYZ5XXc/BbiIkbpbatJft+id//53emUAPHKGdOCMWeMIvrp11bJMY2IygytoXOUTWPHJdeBpcKUAUvtHlRSZsXAjZ5Ftm33ogm8AJNwwk8L1nr0gsam0qXRskzmRcJ6XVf1onzmDjMAR3ryudXNqgkxKvesTnm+lSFSj7fnztrpxuk1zp5SYgOVZV3yCiWkJCbBGwgNejaSONMwAR+VWTw1tpz1fhxzK0aZ8maua6eYNfCodXUVX4KH1ljBNMVLeB6+Mz3Ra2WPuC1xbrTEc+HScSCLHsn7wjv1TFuc9DxkrrdUXEfvXebbW4E9dHdJcE/YExbBSNcZeATANEVwgNJPgV4QZdQ0k08XocmgJ6yAC1Hndup0YJKNHNzyKkkKezk0xfNiuW0+T4VgH8GWKgNumL2ka8w78bmF9NBm7O25tbV3fxpdgZaWz9CxIxaFAFDySoxGqQThmk6XI1OsmMSeLArAsxpF6wcYIP3LovQK8/B2S4wKaBUiAnNsQ0/ELxphp2r77AjFLBjZuEFO7ESW/HRPeZrpBCF+qQHQLIN7zx4z0se1f9qI0zvMAHyi13z63LqeDkXmAMSXTTTFJ1JvnUCiTXwsW6klhJc1tCqV8vQ7LXkTjEEpzemZuEiYXRe+cFaai0WQ8JKYb66V5pLNXPQzpgAYtjFjVFCQnnlcK7CDSYhqYCCoAKRotG80Jbhweq+uH8/nW9TcRDqdVUjSinffeapBcM5r7foZ5CFoZOGwMoZNdtpdNXdWY0azwVZk3XRaBXHCuANThlE4PdWKB5Q9U3ENbdfh/iQLsLNxnJRjaZanSh1dfV6TQpONXYfGw84p8jYERojeKOTTlSydoZVJYBajJueWUEzWnqcWxZPndu+tEQZxE9eA9HTFqgQ0FK7vwmqImh8fFiM0rM63SPwI+wysmz46S5soa3Ut21HpwSLABOAexGaQmrQOAkYA05CcQ6F7we+7NyIl/oEbPzeGjKSpWqxt2j7FKGkTGqlMw37lL3B0GYFtlRO0DfOpX/jsFz9/e/b27YIK//z6ozfgTZUmXrMfi9RLqxp5LmIeM+UsZS3VrNZRz1quo3ac3lylSfJ1Sr20EdOplKiUYqcH+8O3763mT2ovlIDwRfbfVKKMm0Y2Ub7kg4A1twfPReDadhxCqYsLVQrVuSTwRFqprdO2DTYhtZ6L65P3YSQGhGLhaPDJerX9nrHlNJd2DIT+I3PPYSyeNr9OEGA3PXJmH8J8qtpw05h0loZCFjYr4GTkn9YQue1rKydK5nJjlLIEryy0m98tRBqr5YClA48OuPLfnOXo8XjycF6799d4xcGvXRV5LKrx8qH5DysP2zg279lnBdODGl1DAC+p5eA2gACtrQF/btICd/yY42YsMNcfSyNHyNxU4I1KZ1ZhstIb/g0CtUZXN8tmrbumbaDtQMrXaAVQmmiVAif4+MPRz6gblbXTtc6vdn8YD2AGW0Qcg3LlMS/yuNo0SgDSgsVXawDibsmvvP76ySTEfwIBaBYj1KUUHa30ItvOKRIEWFojt7sEM4+AC72ZrZ+gebuz9mwhd6ayEhzUG6ASYK7RZkbGvkxC326IDdfE1xGJsonhDaQA14knQLJHAlYcO6YRIM9B88IsU6NkTCv7fffWDsK170MNO3oyZZexNGngDK8vlczaTeWzCsw7AyUwK+MkHu89qFRijJRXryI404wphTp0NrAY2YhCl14W46rwjjcln1hbeqoCJE/IZ2jagD4nkeeuUQQfuJdC/TmqmCs5DWmYhufwds7e06AmMCs0Kkk6ilohsOuy9dK68GRMO+XYRJIiim9G1TUKXHad5VeOU0uaAqE9T/e2pvJr52F6SeatD7JSgOGtcF74giKyM099g7I+awbfIx11nEZUQ8AGB+FYlRqmDJwUMhCVw0XD2Imyca/wO+rs+GWatE7V1spKaGIIoyq+Fz969/EZ0VfXDrwWmz+dC+EpJZ+uc+kMEIlSIJdWQIilHUUsmWcn+irLXB2mnTbyIKTjpCCrqXtJi//eGfygm7kJ2qQxUzkqA//A2AIYgpt0K4wPvas9k3aqiw4UUeDRvL8OdUhVOE+gOcsgzQQwrr+nOrZenPOgv9j2QTCFMO9WtzqJugeMXqob08s6eOrIp1IZsmsQvbHIy6wGMrmGh0Um9Lyeo+tNZG1bf906K+0c3YO3XXiexugWp9Cm/ogb2ggpRjbxnFTPnBUb5+67LoTiLgQWk5dNuAG7+BwvoSHxfNxOxQy1VVZawoxubBoP/ZlG/ZYGeZefEslyirfyfS3lNNDYY5HWmMe0Gu2E2nmPGskR3xhGkYOxRiNsarv2KBg6AR5Z6rWrQrT71bZ056IeiVpFxSZ/Hhpxup5BSrfaYSRuGKy3Bd3yFjEmPCCLcT4rsklojl3TlFfi0x/pvXFfjQEI+23f/MOsfu93Ns0XBlk4f1rVTWH0MCmczqmsXp9zZjmrIdG2OQznYFjnobFTTb19k6VFb45KwogsAxmwHmTm1hSbvkYoFGWqEYA92APoX+ANVOCNHH41JkTQbeZei1q7R7EOZV94lLXSUqJ7cV1aKWJx4Qkb2cUN5y/xiIgttN6KapwF2hvHA7xS0Rl3ndhrSVmL+APovy655Vgjh4V4rI5cVWWrXQOh2/1GA+alRHwhp9WJ7RwdZuUqI8gYFmFzCRL4yU1qEYKRpjTnd5EWFxS1mmJLhdU39maQLs/f7p1yAxw4JWNSS8N6VYYNuKe1crGXFj0lIQNSS7u2ZlxdGM/eU1CN0mo35h3WI9Ytno9zRtAJKEGOxCirsZEFGPWaGBR5GD30Cih1nQkb+lr0d33MWocv4r0BiosY99jmIxi+5XKTPm+gRIOZ4k/sA1CxG9vXoCHD8XEISrOUZdk0hPc874sHPn97hUFvTwRg/uT66499y93u9qdn5dmz1jG6m8iuCXF0tN70AcFCUfM+oZq8D84KS8om3lxjTS0+idXttYlgEJXlcIYpQjDwtMF9bgD4YcS2ef9pFDkmInfjpgHpxdRbWO1iU40bIsVnyWzUnnwmkxojJFHNdhJt0jggndi70LjnTRWH7Wp6hbqIvQTlVNfuRupo1iVP6RGTqxV784oXKlgCI7aRjCq9nJHNKC6KJ+wNQept6uMbcJDnYlhLis2cW8DN5WUyGipTgfJ7Q0ovFX99k1v0wMnPXUzHy1msxGrJM6nGo1zXMnxcCisBkA4Ydkq1hgf5nUepzlahys84icyjKkYyzk9IaVukNycWbSiDc0TsXAeY9B1FbohRLoTkvIjMgUqeo1FOJG9sejXYpeasbBisS+R5dZVIeOL363PkIFcvJ3tIb2K7qovDVJvEH0qOw/Bo2qHn7QqTIRyq6z/FW7/b8v/qDksBcHw+Tl7fL8PlQWQZWADVrpVrb8CXdU0xE2CYahGoiTOyASiJy9AIaHhve8BEOlqiET4EVtD7+W1Ki0UbqiFC7z/Srr4oX1QQTmTOFyX2IIkeVqILnU1iJUsrg1vU4p1lirqzv1vPi97IjLwZNbJ1U83ZLFzXE1PHzQl5KpHE8luX/su3dCDK6cHWuOMNUl0sgZiF91t0dD1ZOKCYaqtylCB0/p4DcqbpR8NAR5XSLmIaRpSyrktabYJ6nbAVOI2j/H4q/AyAdgZ6sdrhgzxdWCSRogieeUTQQcFTSEVoX58rBTe8fcPO33CjVj+xlflK+v9O/so4n5DS8l7/d85AMiS8oE/GKOdoMYm6BMHa1gvnOXg0RyPooVuqMnTWj+Mu3hgFHooD6liVRkvGn/yZy9spQ9GcnwLcdj+bpTwPR5r4mQ+F/u/jcx51O8L/220AaByzcOPBa/9i+8637cjDs9akqTNtjrLW1pyLwSUTYQgsD1cqRtLv9/JSQqy5IXzxKomCI6Rs8xu4osCJAJgDAFIpRxvqrQj/qbUqsxDl2iiywBQE52NiZN7lZRCR5qKw3JRs0hSEf2qm7fmto8Te382aVRHQDemLHFFLpyKQ9P/M61lliSQoL3f64FFaffQbWIMgx42p8EUjRU/Ro7YjzGW/3Ds7W5JceGPW+ZQjkpZcy8+THKYiibmn98I6KFqCjAOLFPR0shZhHK93d5gDVtt2boHOOiR3w/8Xj09jYFxdjszuGyMsYi0JZ+nYnO6cBDMMBFx1s9q90eoU8250rrZAr+MsViFxILHxagQ3nN1r4hG8QvX4IupcbolRTvMuV8I3E01boqpP5SjDaoWitcqOAyg0kuw02X5ajTLWrIf9eh9Ch+qrrtxSXZwjJEatZTmocytCiHO9PDtUhNftvf76Y2wGv10G4HZPEPG5Y1fX2euP1c06BgVMY2zGaLuta5kCJMHkFJQvCFw4Yu+opwJ46qHrFsln6dA2qD0IhHKzCuIGBvD5v8PrI/9BFQIh/xifpx1bjeION0mQ9RhlTkvT6CcjmuvcnSSOydZXl5BK+ZmXldgskoaaUrqNwx5Nz41MOi/pJREKIxZp3qvRBmcaclMqmEAxDUefVeTBw2WnGftnOrWWZtiNizeFWAbCUJntrF0WpRsmy0ntvKyQYGKnClx1RD+MjtrW3K023+EKpB6PdgOl/3lK4uRUkqK0R5+dbalnwe+dyxe5H3Arql6yFYhwefaE1BP4tNKgrasEgHLjl96kpbMXLLrrcgkiP6tzx1OHnaJZHYmxHliIEuWTPL1RbGTaNEoQwsa0MnRUMdopyWspb/fzpqFRlSc+X69kmJo8exJo0K3Oj+sgNqAdgXatExoe9CgO85BvSPPpj43K/82l3lJV7ygDsJf34vlrB69dDc0vzMeYTWITdRM2IlOIturNwAbFBrcNjc1qZQvcHH94FoY7HwAe3BoxHNmHAbHwBjcUhgA/t3p/o3V+vfGUbLLPFfl0jLKE+n/INALR9Ndpld5E4jl9p/6bvpJ+PH9H+d8tgpuIKu74PNfuUDnbaMbVgNpuLx864SW3RHTyujo9vEUv5Ihr7mwe2IUuGUO1ObvjFcGqGvD8RmG20qGhzhZup5SDuULKu5kzp0iAkYRyDXhHnMzTss9JePLUnUFBuk6dL9jyD5wYaEuUgKbfLubLyiXxab+pNZcNVR4w+hNjyuEUdLOnVkq1Tkvf7c6p7yg9+Xtl4AeQkeoirZyY5PcZ9xRh/nYJcq008iWJMq0b2ahrmdSNfq/ru0KZzvUEvKTHMizDeiv/WaSh0awrPXmfPyIO/hz/PoVzlUbKEHTNg+lqUa86VIj2S5HlsjnInr/3yJE1uZ3g31eEATgg+A1Hjr36pSvbvmkQwrdv2JiaHBu2QAikE3rMSyrlFgAF58enZhEs8sQ5t8Wm/DTmkxoZUOzBDIcBfFqDBUcbQGBjxB9EIL0Y5WrU/kXkLHx+yGRAHrsj5VhUeW5gkP4DJ7P6neKSSViFofktj91yhlbqWuMIJ8Do5dq0XH9P7/jT1lvto7e2YufmK4KOzcEcRUl0HG2lQKoLa3BunIfAlipb372VYduylVYimGo4kNUOxGzJVPoIyHz0hhyLAjpgBqMUv3c2HCTRPDoCFjQqXjHp1uidpuw8fO8D8PHjpIsnIiiTeTtHL4kSOPVkR0N+7/C08mP33C2Ys02PKLDb8+/NUIaaOx+ipSK7eTEn1ZKfdLqANk5ar8b7mkb+i/dZcLf1EU3FoHhYX9e3OQxvpEw6iF5ChEwADR6RTH1iaiAQ/nu1SNcW+P5RSW6KC5CMpLl/luWjTPZd9sVDf7an9XdypxgAvPkekfB+kfFVEp/+wEb+IQ/hnElsmkIyyEBIj6Gqlm4oLuGbEHkSmmQU+U1hq9Uzdeynq6hikyMS0Fo9Iwut9ZNEIa0lRNxws4h8JorswOdnmSwEL0W24bPnjZ4WOOLqpBeyZ9s2ZEfDtfmJh7f3komePL8vOkU7fKKQI/+kxHb7+H1GXiIqOJuNjMK0IrmZ06JO1TMq5JL8Q54DPhPhZdLJT0QXH/rhcLSjs4yKIPLhYh6UozIVIwM/fXekjkJVG2o1FJxN18VDrX+nM/zEKYI0dN4/kDT2ErXankHKBDrYhNpQsjUd5Tf2nwuskLxEHMPiBOJJHpmk+9+WW60sy9er+KpLcBsmlTPXxz1ZCJncJFE+EUUegD4B9fBosba0E84PUROMBdqInVGoH9VpG3b6evfQiNgjIDICccJY58j7IfupeJdFOc18nuVxkH12fVg/xW/V3jvTAHgqsFsk37u6et3rluf+x9lN8fdVFnp1E1VdCuW/OoMlBFhmvwNvn7rAsN0JT9i6tk4mtdKQ9PIBjeQ8IwJAWKXURwdDGkP+8XBgFD6qII2JfsxRAcjRaEsDyM/3CbU65cfDV6stO1CllQEv7bl5V0yhHffsOoS+IdLuIL6gk3wJllnbqgFVFvIbMu21fZ/Rp7ZCN3WrcOzlEotMWh07Q8rNe2s7tkOZmtNb7d0UhlxQhN65o11ogWjrzd0921BQvwdOjGL0QeanGlX1cG65SMhxjnuX5OKGSI0US7vaL+JYL4lMLM3ZJNx2Q9t1OXpGR8LORU0PqBrUCta44fOIwO69bW4H/ZLdFWeU+r33UqpGiIpT0OjRKOPSdkSRa6SRHRLkNIwZU2wJOIE5NDWGrjXJ+CzPuIJUmJDnQIZgdy6B4WK2dpTqG1HyNoo7nCRSaslivZxloZeHQ8cG2ff+8PVHjl0nkjFNlzvVAODYL1LvE8kvWxv/0+sWFp5/t5i/fhJiqKNx1nCPYbUQOmlOqp65rXO7d8MGVkkuzmh3frUnlVrnx8UTIQXIomAiS2FAeT/Mst+iXkym9F9NQxIDjcg+S31eN7ft1Z0tZ6iqPSwDx2y/ertqiw2kXNRZdOAupGuyF3j+raE2n4t6TnbJ2fvy516jd6S7owpsaVQ3d28ZKh36gJW/6K29cclkEHB/bX6CRmWkqabcW3vT3Th1mlYSyk+vxdQsNbIw2jDP1nb+mSHltnagNU0lasFX41X49CFn5imXT0og6dCHTPRl/J6x+YxjYRRrU8TtlNnIyHOk3yMz8/C+OVtQThI+xOoE14RXfCwK4X1RVakgfZYKsRn/IYo8QkSW2Q4/gBGh7YPT0yGzNslRyljpmtLIihs8YZyOjXk0oqF/MOfHYr5iafZ9Mx9CvtTL5FARf+JHv3jow7oXbyfqf9vDq8df0eFB5WsW5x53ep3/yqAIZ02ausJMH/w7NmMvASle67aQCaCK56/mNM3bO5ILg2BhPhZE02q0aapgxuUjQeRAjLKgdY+gFnl7yGQHrHSRy0qWyVLIZBgy6et4a//KuMmd2m+bDA8WlGabDtxGAWrJzUW3V07v36nKGRnE+1h1YbJOrgw5TFA2aS1rD+00+PhK0EjIym7uoazrzYArg7faurV7NZ5R2jAeTjs64P+mJBnw7lP64pON8A6eNliN3A1dN8S2Ulai3XFT2+84FmLDSQji8T1csj2Rv7z23VFg0ltK0VUnH3mDkU/rVWdCy2V6EGwP90qN/sejKJ9dYXRynQGordatVmCVoj7X+7d0E/0kuAd4740mamUJ6NpabGRDGtmIQT3yKrsFHykiS4z0hhgbDiwMNBKViIMBcFVhWzMetWGtWW8MQn5jIDpIucnUT6tmjAzKIPUwZPlSFg4emxu89FmHjv6vr2bz8/F8dYefwJt6vUsHRX//XJCLNmLTBI3bYt6nB4YxYFqth43sYt5Ko1B1a7Pag13LlNEBbhhoj9ZoFeXqRuRIEBlwNYKuuSIi24HWhkx25rks5kGWs54yuWAw0MxkIFQueW6Anf7f0Wg3EGqcPDzt/NfZfVxtyVHyB1b28gXWScX8uhVwU+yma0MSx8Xzgq6Ud2pN1hXb5vKaViQMg3qMPifQ8600AqtDRGFY3BoGB+Vdl4DqTJ2HlfjxXr6j3FjLDWCaoq7SAEztnVCEnXMUPOry3+N98Sm+zvDzwRcpOXCufAr/+T5eYtN/4611UpGPOtPSMX+XTqYtBTLkpngqR1xYCZrGAOAzxEA2uCE3JKrOxBoVp7Hr0Ha+kAX5JqxBbG51GFY21FI0SIGMSmAEUqTC9Meil8zAPrZN4zy0vK3noXdWY51FxJOh+VKdNY99yqj8cBfV+UqPrygF6B7Y/GoEyvKjzxwMvvGBs+rleQg/gkU+Vj3gRjUZLB/iE6UUoOfMfrPTfDnmQVjvvgrxYPDPUwnyWUz9kUYWOLQBxmWAagBr/wT59QEo0qqjxe29vUpt/TUWDXgXHNIRfTDMx82ZW0kTFGXzYATn3OtwE1qNHH/naOek0uPosxFEXLPei0yek+o5OzmGYhKphAkdRI18mLublCw9dJsSaV2cHrPbTeiIvQuL2qm65WmNg54j0WeNErxXX8Esb1lm0w1/HfcQrbv2vhwIy2GqjLeNV++KvymwaolTCWc4rgrhQqWtWpJKgROQcCAvlXCTQXZhGns/55Ao7pBERNl7H9qPVzg51TLJ1KMhxSYpMHSW+oCIaoeC8XONLDAd+1AAKGjRKFipSIu0RwCRDh2dyuSpM7QUwWj0FnoivXWnoR6f0gq4lH6I+ZKWdeVPDvTij79kvfzMHsMl/0Oq750eAfixpwNCvDHvP7afh5cOsvBQhPGlEe94S4NpVuKFtOK22V23X/Oo2MTYNA1aHwwSwxsflSA3qjGA6LNtflzAMAZ9EEtZkJWQybYMnj+TlbyQAfkAA221NY9qoKD92QpLWMhmQKWH7zQISi+1QQ9p5r27zpbcl5qZJJU0rZzoEY11FqbIn6G25bEp7fDau8qtUYTTcbo07JIcBmuJ039vGWSssbuwCckynorYNfq0ZYKQnRTB8+tW7ddAOMcMjOnH9+jqBLRxShquohRgbbqxJ2U231gEbgTUAydv34q/dBWbHTPBa5AO2sL1fN5+X1meHfFTJ0rx7iX16DT5J40uz8zI2GgGI+IEo5tj7SLUn9HTo8y81iAFwOg5pAGGyivuxIaxc6LItuiOid2ywcaWKHrB1FerUSGzPv7E62DhSe2zrtscmhZ5kGtjiL/8tPH013E1X23Yf6cYABx4pvtFMpzcWWedNf+Co0eftlBVPxglewBSAbCXkOdjJzjG7IQJL9hZ4UV9ts08Q16dZ7IqmRzmlB/v78fjBvIKAwCq5nwQ2Zbn+gVjMJ9lMsBYJ1349qD0AQCDKCyjTpOAGTZqjuub1LkA3nKbblcnD/bSjo/WShF4q1Dj8wa8ScZr2L5RXAfOfsVb/5hbp4GUHr6b+qtvYqf7JuEO3wGpLdnHtrfvn4aeaN+DXY8DUKbo5KAkox02rOg9Yk6fjAvvExt1WTVvqUIuwuH04gTKkQloIS7B1q5ykBsTn/STiE+mg+eVEe+sdJDTbBj5JPxExQBSnb2lWzedTkKNFhRQNiEwsPwAvE1ZaUJIDiwAaQCMwQjRaIdJCneMNYY7gch0BfgXZz8OoC1hJWId/aelcq8CU/uZxivr4W4SO2tivLGU8BvXzQ1e8+q1tSO3dbR3OQPgR9dC7RaZu7QoHjov8gNZDN/cRLnHIJMcIbuhmy7uaCgrLMOxKEfHTfOx7QtzFyz2Bnc/UM7iRlkGsP7Q8mtdX7awYCjm2bM9RJcScv8QZCUPCv4NMwMBXcRHUVlsdF46wEgFZOhh0oZLY6g6dFQuUhw2xYfZcVKo7dR6aUhSyOza8q09YSrRfpckoenNNI9lZGQRADGLlDrgfrGjzb28t+92DVFqG7aIxJqeaIyI9qUhE/xFL6vptXlvA7ERa7m1vooUtHewCBuT5RqHbW+Cb/40KIV1eX36LAebVqMTsdr6Pc8y9cDbcI+2DKk4kadbVPNrtSTMuxvQZ1Gn4k2N132MU2Lag+iyQ0pqTFObDxhkImCgRhlpZ6BFBogCrLHZ7g2iADgcAM5zWSa74Mbqqh7NymsLyc7vY8Qg1hwdnub9XL9wToryx+amKmRXS5b/ycfy8PtvG41u6eypllZ6VzYA/t77GA34D3Zv375yj+n0ojPLyb1iE+6fx7C5IXJpk2XLc031D5Lnc+OYXX84l7959XT6ud8+/9yXz02qF312c7PeLOt83FT6YGAATPHKkOQhb+IAaGwG74+GoKAtm31EAgx9raRmaLKF/haYWQjXlruMC9R6fW+GUQ/OLsPUw+/z7nhob71q+jujsOUH6AKFj4SSrM57Nw9tzUI2Q6Ftg7XXpdKhXi8tAZul6C9bTru33iroZBsOuIaXmdzwqJYgN7XSaD0H5lwAb3E2KMQ2vV6PAnueMtlGU4oxYcJU3kqgYSuMqTMEXSGIIb1ySHEOrtXIPmEXx9BrTMNIWwDTS4sJV3DlnoQFtJvcIxmcBlqeEsOO6r/Ca9e+AeZyiAJAb1fiGcC4YOmAioOiMpCIOVS/ZtkY9wkp51yma685o9fL5rPwrnfmxx579kG5aDkrHlbE+uy+ZGc3ef4gnO9M4tHF2PxjCHk5juEDhwb5x14zGt2c1hPLM18uw+//GQj47xyRmz+APYhmonD06KqIfIhf7eEBDZFohzZmdf3nvUxeMMjzHE1A0FBT695WmAyg4UJF2AQGoCLtVJZVWWmkEV560tHcrOu7x9N6eBtqK2WjI5apZTvOFlAuAZt8bGOz+t05J89bDeOwMaAeSTgHXxtU9JoZVrPV2asJabwXF7WrETnV1gRA6OETrbYFKT0d8c49Z+npR5Jm7AbPQ3CPilxLXw2W92lracu86nERjgKGZCM6q69TXkiCMBTL5BUShAUY1tYxrVzqEt7u/Vu4xQxCSxJyXoICl4n3cZvdkjy/GyhvuXXDyWoKmaMaGWgERvFqVy1mvAPwGiG892EiasW/W05vUSy8/zDL4rISzuL79h+UDQFfranAWTN47/wL4K9EPvvZmdU26SdHbSq9mxQFuROPO9MA+KH0xL3cAleIhPuiq5DP9Aq26wPV7PxOg985Ui19clvYuHElz86vSgZ4XPQI0/AGIF8AXzBDYJ7cav6ex7tsFdtwXVKLm94BpzRsRGc+GsjoRAGNMlVtl+i5lrnIo0+1vDTXhxN5HH13ZKPFCayPoM0/nRjl3yr9lGUsNwaJwJSsEjevzi11WDGt6vQZLvFl9qc1EEaBpa92zr4DeAQuHRvxNvyWc2/1a8cLXDfP1Jdao6phLisslmK0qUAaCko6dOq7JBhphtQ3ub1bt/HK0P5w3CQjN8Y6b5ZG0i617Qmw29Y+r5BUin3ze4ej36vOPffIjEi+lyZ1PqJGo5nyAvp5Jot5EdCUtibN+/Hbvy5SbBdpsO6vwK269lqT7Q5BfO1fIxL3+VDmOwjk+1qmAF/O0bnbdjjY8Y5zzvnDspw97sbxpB5XdT6qK2NFcfHizs0h78KfAVxts8AIxfr8Hq8xQoYh08ZOdMlyaxpBmcuGeTgaTo199dpt/7/mm+ws66TyNv9EeQaO5bapgnXycZN6FO8jvY+bwEfADd9ppGLnZ0A5WYYeJndaV9MoaceTqVILvkNbjWxLgxZ+c6pv0qFzNN7KsqnSkWYAdDysA3e6Ca3tW8fcdRdUorl5dMWKCP6tM1MQiLuVLTvkpk4aY23S5DN0UjQHjp1pivd0kUz9eFYEVJ0qRQVmRLznX9hs4/wALUd3W9eJU2E6kLb6kpKLrjx05yGJcxEZLe2FzML/oohnDAdhQeTGT+aTh+y9dfPAvyLR1d17d0p4f4e2A9/Jx7+4AYgU8OdmiO8b5rkM80zz+UGWq6dX2q+WUxwLsA2dRC64SB010QfcFV3sSlVxcRgC3C5CI5rgdSY+6j1iNp6LvQHsD3DgzCpr/vltV5kqGlMjAXXzRP1kc4jV+y3etTZk+0xXUvbt7bmrodYYeMIpsinacBaePdqkcuviHCydufKta+hbW6xv/uPxBVOoabUSEkEhsbbbaCFNbXMaMLv9EueBjUmmfUigldp6yfCwMpJ6ArxFmjgOjm6KY6IZStdU6wrboWKvDoAmngM1+qmo1LgQSEe92NNABjrJ8HqQ5kZdnQnNt2oFOOCsoLM0YKAWMfsrbP5/o0svVU3la3jcVQzAvzj288/DdfwA1O2GRZHDssIYIMQymrHl/Vmnhq+eXXP04/NCl8Z2jrvz7m3iqmvHt3miI+Pqbanzbsg1Rzb7dFkvePkocVfw7YaT7cRtI/mkBNN+5AbHDIXz6e290lQknzijRsAHoQibYVpmW1KU5aJOcwWdA6+y2K7M4xvASq52Dj66rS2feQaV5lzS0KghcnUgV9R1+TWGOh4IeEWkTWF8ihQZhC7D5hWYLGewg179nCQxGttOb4RWHMi/b8uT9nN/Ni48o6QSFwJxKrBYpGCenHJepkjXKil7NYTpmcWETDu1/Rel5iBDeH+M5ypyWcqDzLL6PV1ndlc87rIGACUP3O/fujm/qpdnn9jVKxRYmcsZ3iP3pxGAMcAdBvPKvvfuP1anqNVmrD/OFnSpcEYCKtLgzUguROHgEJlvyVumUh5BqM556/tjCErXACXSEEN0Bdhcj8DLePTxHaOkL0+hsDMl3Rjhe7YPu74GLU0adMHz8bq4L+7E/HO8j+Gy3Y9O9eM4TJBt0u5xmTaYdgORehpAE/FoKbomjOJlvFbwU9/b83O0hSdqM6XMkFJh8ydFoLZxypy7GRrd5D5pKkVJFrloOO9JNRuoPJIK3lCV4quWzGTUYIqI0KAawGmpIb6w1mAEHPhDCjqXhbgDGm8xrt5UhA/gva/4Gnv5rzUI+JUeuGn5++XG8TQ7950reXbp0VnVNDFmtXLerWfap7f0Ot4/57Rf5aCbK9OQEH9qExKrBDi8xceEOEESMpFQz4dTiM9d7gMzbSSUt7a1op42B5JRBt4fgKTWm12Zl8xuolzarUe3eNxEIA9F04QignEuxtlB8K0H05B6pDH6eUzadROmFtlWwcgFQ/VGd6INtK36fUkdgx1j6gy7tqZPxXA2MB3HJ/BIuiOs6b3/XcENNWI5ewF8kpDfC28p1he6cIkZfO1G5KZPpUcMnOlsZ09bgnt8GmLnE0ZKwwKL0FZbnjMk1VNrLkFTw3KMT6L1OV4L1h6c0UJRyLDImsUs5KWE97/g5sOfdilEuYsed9kIoJsGXFvWfz5umqaHSlSUqJ5fRRqytumCAhOu/+cttJbGURjDASw+OC2ne67oXXluSOhlLdSnkKUTZ8hiSzPh1PuyxVZr652L6Eys9RBd8/I0k961+1o3YSE/DBG+XNa6zXkV2UeXCUtv1ulGUNFVaVW0mGkF5ad01nyag9D2E1idHcM7rWfCQn1PPYhfcDKT3yCPWnBok4tvOaoq+2AQNzoJg/DUpPMmjtm4/JoOv3BxDy+F4j9IB9JsAoKLtDQmP9cq6XTvuf6ZLBINrA1fF0rWsp+CQh0JN2qNoHT1HnnNrn6lnH8aBmXyZSFuZvVv4W1QzpO78HGXPjlPA3755vxD01I+sFRkAQqoxtwDKOj9/yzPpJyans3nuNFyJ7fEKTs20tp57W3brbfy6gbjItKuMs7Qc508z119foCPNnNtPzt8omsbLtvYM9cDNAOTaj7OMfC8M51vW6/3UJyjJVieIhjY6bTTqbE0dmZoWmzAFWhN2MTBUe/WawEv23i3KZc6N59fHoU4zmIbz8N+3qdkBPhk1JDlnb9TyYdpjQuVtmU5ahGw0crZAJ46qQoSqwNuaD0wsvfvchD8uUZ7tkm/7ziaZnp+yUAz/fP2XjgcRJS9PNcv0L/6QbIqxhtvyuf+wtew3IWPu7QB8AjyRrlxHLPmdwaSw9paBIAbH6DFZgisvtgXIJVc/kXDSqdUnnTfSNZpiTotmOV13+TJtGfbPXS72NsFrBSc487eF7KBad5RSMSfMbwpDPtKsREP7qW66zHlwB5+6y+YubC21vbFqaSmg1RZ49fox0J1MzwUvnCVIA+N6ZyTInPyyO1cRq+SOBbgsZNtNP+zFVRVr9/pCE0e3iMNplJqRlOU0m5SL3MmodO2ctoZUc/+egKRLUHLy3/t+SPcj155aNXeUrnR/rSysOJKnuLR0Tjyr/TfPMh8nqHtt16GxHuMf/v8G2884iw+uQsfd2UMQLoAymdi9rcPaOqNQQiLjSYCMWBgiJVl6DkoiO7Th1j0dtUPBfMsz7X3bjkmLtnVorxaFqNH8G4F94ypfGVOh8CYfS76nlMZLjUWtd6eMCAXeuvBlAzWods6WG4cd/ITHETUKoMz9FjD7xi8bhMQOPBed28heG4uV/ztaCAa2y51E3QYjq7Qa+mRlwoTkKa3ozWI4F20Az9c16C9XjVEWmUgk9AVo7rn2S0zOhcvECvQXnE2E3UiD8/VvX9AYydrt0kcD9XsT+NF7GgjA/6JBh6OITccxTaLskrZo4oDjgiEH4sGTHH2BpE/xq/svwuj/37c5U8Qh0Nc7zzz9N8dRvnew2Vdl1WVQyXY6u9WW0dkYDJkqBJALZiNP5AeAymGvQPO206VOCrgKBmIVGADe9iIrKvQ8j8PB5POoM/7842u89ssfDfj4MM8Wo6/bZaO6i1JPcr+811CBmIKXRXPQKjLcWv0WDCC1k7cbgKXAbMmGw/xuSESw5AlRxoMD2/TYFcOFEEaYYbOEQ+H4BzJbyfueJNSa2LsT2M/doaFpmqBSaepeVXpNBoqb+d1TgVbaNuyAnn8xCvseqzByUuYAPysXMlJVRzb7jMFbLpUTOwc44BQrpuNOu2kHquOaOUIVwkyGbUkoACEbr88hGZHLw9VHt730m0HvvXqa7SFoHsj7pLHXT0F0IOWNN4wmNsXi1z7ShTtR48/wRjTinN22vFEIC0Hsb6tuXwK/z3v67T4+0gwZXq14JCH+S2Y2AmzO+QVrToQOEiDNZMQhR34uQFdHBDidXzdzCZy5diDA2FWXycoyYGcdr6kwqb3skYfK3l5621LqElyWV2VIkZJ7Zgw6ujryHLXD/B5dXzPRKZiyE+DlqY96dHe4xTSU/LcBp2Q5eil0zQYowv6Mb1zDQRNA45Pqx3k9PmJicJMQDV1/9HYWfmwxYxcq9+NhdOW/Z7Z+3jrs3WgugKwg395FuIwZGFUx9+75hqZEfy7S2/+E8YAOBj4moXr/2ws2fsWiiIrirwpdACGPVDkZD6yPAFvCZ02wM9EIxwvaIGwVjXGLIGXuhwscuqvtZfaM9W6vANf+oZtzp5y2+Qz7XCKsR7uaf1f1eMbGUX3RBKv9Lq0pRXWeUjOAocFeD+eE1wSj1/D5W4E4sq5xkg0kLEdTOJGzpiGbuSMkWeePWlZ6Xlod2USPGHUop6URsqHqhD8VJFLzHZwnT4fL9+578mwOK7Bc/dhIYb+2xhzJ/mYceo8C7+fDu7RmLqOhHMVGq2WJGHIxJo0ii+jJGdA+qXTGeDTEbOAgj7IQrOtX+STEK+/tY5/gE9HI4+cAMcJYQC8nALL2lTV6zH4A+Gygn9adiMq662rXEg2YqnDgGNg6YMXfWJLYg3ppmxn6dmzNnAtyXbDQymoxhDVx0Ax0vBF6JNo1Tsl9hnHnHttWRWHuKF95oFPj/HMw5WLWA5MZJkkwdGi/uZBMYjEooPUSsvw3MZutwIczuhLhooApxtJ9dxMRdJnd6IAJShxyq4bzWSEGBmZsCWHXTJC8uEcuul987K5xkty2jvIaMZZjKqd50M8k5FruwVVcZu04i7ib0bNqdTc+N3xcI2/VxsZJWDUtR490OID1kqAqgFhEHBoIELTZNm+5x06dDPa4O+s9t1T1QBAWESjgKs25O+qJt6wkOdQTml6pAWbN+KYKJeTcgQ+oeft/EHvW9dxTe6tdMO0gp3OTYe3N9qoN9VYUNGd4abz3hInnaFrJy2x8BvvX3EBtyU592bOSHS0O7XV8nBvq/lvinSOj2I8n9FBra7u63VvGgk7j5YqnJB33wROmFGvaBvJNQ90o7MM52g9q6Fpbl0qnTpL0GXJnJ9BzT3dlCod2GIQSfmHxsujLDUWLGU6E1Gvi0GCzddzFiLVfWhYkk4gjYIaZBq1mm9gFQEaFPIBNIIkSOBisdpUxvBAtf5DFgdZns+yOP5iU/0evf8JsflPKANAi5rt3bz1wLjIf3Uxz4KWBHXgQltv9rzWynYcsNiRfU60Xw9yXUefo5bTrEruX1s4Fp5r15i+t5FH7DNIMkEfgUYILWEnhdxoUeVEWhMXcT/s9F0D33ycmP/cFXJ0y3TYdF6Scx0Ay9fZJENxCo8crE7P6ULHbVwnCbXe0bEINQrOPaCHT6OzveTppT0+HX/HNOFWm4vaZhp/NjC2qv+YuP3kPVC1SZ8WjauDdoqX+PXyFuE9VCSZsZhPR3YQD8NkULb1hivHhVyFyrT4MjMYaWASKwBqtNq+CuvPtXQHm18JaNpVqs+tWc7zMM6yfc+8+dCH7+rMvxPWAPDQpfOxun7zRh1vXMzzrAhBsQCl+nYafRKJhocvzlTmoYFI/Hj3gLpIHCxkaJsmxrZglPPw/fd8E3o+2o7YbkNMr2c7kcc/z3vX3TB49JFILY4BpFzct5y9SCsJpMhaRMByoKsBETNQtqLn3F5j03CcM/O0IcgMXCrXsSnIm4D0EhJnoFU8Nm6xGRyPbnRSEbj8fo2JFcj3PY51x8EfnJxkswjbKMObu1zdyDsiKZ9opU8Od0lcDf1cPx8+d87eSy3NwglKyTm0FQjHjxyj0LZydPlxvcH797MsmzbNeFXKV8kJeJxQBsCjgJfecsvBJsveuBhwSERrsOdpyZs5DYChnYd/3TDPW1A5aJHlIAOrsGlURy6VpNtOt24LqXX2Wcea17GPq0t3o3i+j6cjKF1a6mDtvE7ntf50l0f3v5sx8n4g7X1X/T36Xi8b0utnRZE2genNu7f1RpZ2jLkXEXSENgdTejnNtQC9wSg1UNEMpbFbeg63YTmyXJeiKLRwYzAJR5TrsE3trbDUDVUdVRjSSUsmoealVS39aYNOW3nRc/UIywZn6OwIeHdw+XWUPFqqE8bggG0rNlJ7FNap7Nijaje/l1bxjBGpGftPr6VZzoswjbLvCV848LE7Qqf///VxQhmAbhTwqbn6zWMRjQKwFrQduEu66QCA7uyU8ulTa8kYdPorZu3ZhmGbLZRgO/JTbiBsdDlnF6Zamm8AD0fJofcWYmeaOfiHHNPJNuz+U70Bn8Dr79dRx0mUWyc5IeBBiY5devo7zszD9aT2XtMSVOJwh55sXjRIifIbLabl3fx8n5nnrb1+r7zc6JvJoy52XSIvdmzD7lMrCqqe10uujscofdrTEU7/TcazbetOWgepHGj3EgIeqs2HZh5vZfZKC3djEvjQ0qm3WrOdW41mKyHuTEjv2EbUZQNkLP2AkbIeFOT+IZs0zfjmLKr3h+zdiXacEESg2x4k/NW/f845L74g1i+/tazqsqrzaWnW3htzrO6bcTADfxEWXD1O++9AcnUmIMtiqanG5Z80b+/SbB1z8PI7M2EXGqXXsgoWlyrjepeyNkVavgdlu0xnsCUG6Xsm+jLlxBOTkJuKKYYbCWPAOaLtdOGWx2oDRF2Xo1XHMTFQr88bos7Laz1kkgUHGo8YyeWNbGN4CdLTAK8ceK+BXqpvMsdbaKRN2svnGHivAKsdBPgMiXd8RzsA2qpCSic8hWrLil38pyVWtQ1CZhyMNdkOLKW5pmq0wjxoRc8h+pHjz3pXr8gPS/iN3Tff8sMnovc/USMAXaJQWfn7ovjVozF8ZCHPsyzLmiJnV2DS+m+nDHk5ybnj5kWIjmto2SXHMJVI5UJGFB31mePVg7hcvE+evAErabVNLiYU4m2uFnprYIy2YBiHJOndravbzjEtgy4ugJSh7iD3zjNolXct2vCUh4texVYtivHgXc+d1sy6JCl80ulU9MPCb5YDXcsAoTg3qUY++v4e9TgmwzkALiaiVQpXZWqnCuhwjlTRkNTBqDwGyns5KJciHq9AsLqikR7HdFmk5gaATU9MIbKOwTC338qke2Tj3H+dK0EhkF4Wmvkiy0qRG24pyp9MYy1OwOOENAC42RAWfe311x9bi9nLeiFXZmAPM//cIzuTgyFzUrJ1hRiOgT5u05MSqg/eS4uUCtOF5GAelWz8uVu4b+2yXgq0TWjS3x7WtgQb56KzrOznclznmlF/Hcy02r5tbGAHiUrbIRi5FqlLgPmocdvYDOuRGnQiCA+/3bhYp6N5PvO+TJU6DUgOOOogzuZ4RaQW7DSI3tmMLiTa1tjblMkjlC5Yip+WTLe8Rdc7IbuDZCxdaA2u1yqS4U3EnQ6Ww3OqOobZqNvu67sRlxlFRIHI/bX5LAtxW5aHWRF/7Zk3HL5p/wlU9z9ZDIDOJETY9fZbvvSOzUb+ciXLsyxHRSAncaZV1aVWBnN/zz+7oR9bdXXB2oYxvXvOwGOYbSPMfVNS7poouZWkukCZT6PpMNSSpL6TekjYSeGpyXV5FaNbsUggHOvj08rYfIl4RCJNWyNom4Os7m4knFS18PP0Ep7mwS522kHM/Jyh2EMZMCcXpdKhl+ViqzeQev0pTqKfgQjI2x3IazD1H6/Tc9O5KrGFa61sWboXLPW54esIqKggiCv/OD6TREM6aRPvu7hQKbnWtuntSSaWIqdP20Tr0CzkWTYO4bqrZuHN8QRi/Z1UBsCP/SKzW5vyRU0Is56NAI9mBCzfV4QwbUBOYU0NHj5i2hdE2+Zqw0c8v3TKaaaNPlZNaI2JegsuwtQ4wqGaaX594h+wFAawLC+kyoKUCIepA6C5N/Tk1RsbQGdTgC1/tw3UKbc5n0AxBW7yTpTRioUyl+1sQFVUIoHKp+JYJNQy9BL4yEYYq5g4us/JOs44dGPE6oXxARhBUUG3K6Sqir+pTdd+z2r+kFzHDALHWIDAu+G2aCxFOn41NCZ1QNmxfb80MIQRntHDE3FElKmoLdMGkro4jK4dYjPY+AD+WP+PgywLB7PyhXtvvfVA2550Yh4ntAHA88PIpO8/ePCjh5vmVduyPMvRI6CTgEiISUKZVmoynoB7u87M+s54ZvAAvMHEw1An/yatep6ArT0D0FK5MZFP2CvPoTeaIjgK7SghewCwMFW1WMt2/DwnpjC98J5/CvkklNubbXTRJ1FRMtxIalENvDRq1YNmVwWmZ1TmnYN3nme7JoIr+LI9NmkWuLqvny8rGB203ryoGRlNybQD0NH9llGZHqqXH70Bifl7d1y64QdtKa+d9NuNTiiGQhzHz127/WB4paMAxDIs7pt2ijICwOa3ChPA4NBsL4r8mMS/fMINh/7viQr8nTQGoEsR/ocQXr0Rm+vnMgACKnNDRpsz7Hw2X5e95lLVNnDTvUPi2HfbcTvkEN1snkZQCyD1FHhaoZGFh9wsPzFfNuS+9WRpE3fCeQMgncJs3hALt6p8c3aYazRYbgicLuybQxH0JIphW820N1ohE/fgHjrbpmwRdrs83/SurMXhHJ2Ziok8xYYgxTK8m5IU3xZVDNYgpOlDKxyqZcqOHFki53Q4GH6d2MT+LDA5OHE0GKE5p8IVgPWyOwSwhmQsy/XbEV9ETtQQ6HyJPG/m1KPEw6uxfg4ykBOx7HfSGQCsE4Awr7z11gNfqOPl0sRZIRIB1Hh4q7mbA14dMo6r8LTVflKHEyGnbXKx3np7lSPenlc7Ss3GNe0r0AVad3oPaFDSmGpnEaYIpa2NJ0ALn69ouXnzNG/A2YY4Gd+wPFdsSUPOORDTB4JQVjx5cQqdWHRjLEaj+7bXZBvIDJUbCxvw0RoBn9CTNlTSXss6oCVr7jQsFubbPD77fFYGSEJSw+c9BEnJmEQtN6Bsz3UqsRpR6L46jsAoRKnEjNQ8EnIlpKB8byeR+TgwH/RqVF9EkpD7wnpayfNwrIlX/NDNhz+FyPOOnNL7tTpOSB7AvzeR+Pd3nf4L5+ThhUfrqqrqpkD7qYFEANhaL57EQzvW3tpdbbFAbzARadJgUa/5m/GwDkSegLNhLSI2r0vtPFORpachuo7lazoyLY8+CZJxtoDXxz2N8b+7J7NBnWQ3OrPXaolGwcWwT81j6YU9RaBaj00TpmfsNA75Bkocf6cVd9R+XS7LQnVu9mQ4ED63GjypTMn0wAhUbdsz/sHEULzaYJiGNeVYPu5AnUVGnZSHKZgLifJlyvf3MXCut9iCjwRM4/GS7v67SvelxDxmUPRCXp/Wz/PNEP7ysbcc+I7END6Bc/+TJgK4TSqQ/VF+5s9uhPCx5SIv8izURWGqZxSqTRx+57/7E0we1Zl6He0/DbHpkVxQROvtARiBTe9RUIyUXbymJQdYjdwUZX0VprYa3bCec2sXGxuO9Ey8nJcWLtWLnd+gkQZRezbStGkAN4T+InUGvPMwiWxyIxMJTyxE10FIvQfEJbj5PD3Qv2sTlWMUlOLixsS90em6NcJ8RhaUVGglUrzG7wQgYixsRkLujVeC4gtg1vsmulRpfDaiCb9cB/scy2mjubY8mdKEpi3bKlfBu/5CxgE0WbPYy/Na5OgNkj0Xb83Q/4Tf/CeVAcD6x4P57Vs/tnmsyp4oMRwbgCAUJPbAM2ca0A70cDYZQ0NvPyVzTxcFh4nol9fum+7GsxJWWridWr0bk9SQktpwSb111Iqv9fBTQ/MuFdan+KQUgXwBR7MJVBgD0PXrOaGo0xfh9OYEQqpWQdsW3XVp3s+QUgd2Juqmrk3B2Jw4m4zY2tsFOZ2gBOkEXmFbaTHaYisA0qFQt/36KR5Jo8XaVl7nUThIaq+zMm5Lp9aWaLYFa/VHjRfKhIY7NN65mKYp25+o+avcfJbFQZ41/aapbpxVP/GMW2755MkS+p90KcBtU4E/Of30p+wK8deOVFUFsauqhogoxmiRh88x1Dqcg2o3Kdx3aW/eHgeFbGMYN9xDc7egqCCkHJKjtWF9FH3XGYYcfe20Ww833dMlJV2CYQxt7QC3vy3JpVHhDr75NSE/11SFBoFCIs4fgIcz3Urv4DMDYnMPOzPwyNxLzECW0tA74CmFbUw7VxsLTmPkLcXHgZRtT366Vh/SyVwe99G0B1qQNvUMeKk20ZHtc9Dyi8jCZjsQAfHfIZfAqzquFO0rHgYh0/q+UcF1bDxGfyPsLzKdQZmHUJ2eheJQU//idx859qJ3iRSPSsPrT47jpDMAOPxB/dnpO39je5Y/8WhZV03dFCCqJLQ/uugGi1wdVVkYBBvPbYm9YgQUzEQJy0NunVDAsNFUhe1/WjrqKPaoAUB9miKUOnvHW3aVspoYu8696XD72Yrru/O2rc6urEPjoT/if1tdfNtEOtKKdGTPtT1asP4DU90lJMApOknV32ryXjlxL+w1TrLmNIIhmxBRl6LwTr1NuIqzBbvpi5fx7D/+LNKQkmQgWqmuBKCyqQdvZBr/RjqyeQstRmLnS01E3qce5b1BI8e1qcov+P55Xm3PQjGum7971/zCf/uGG2+cIc08kWv+J3UK0D0eaesj/6UDh592sI5/tFhkRchCVeSFjvDWGm+qb1uwqbxxJ6UoiOR5LckqnTo/Ds/DfYErSYedZdqO6oGvRgRGTvGus1YLgI0wSfrOu9VaqSvdchT5cBDR0hMfe93W9X14p/fEa8jLaoAN8UDzjEUljtg7s07HkXdUlBJol3j29js6fcdxEVYFjFtABR7FMLwb0q7Z+y9a4REHQluBEqs48P0Z6ltbdns9et+97OepBA2l1ftbdqJPauYvJavaFV0JHe0/l5RXFeksa/pZlpdRrvvMoHzGq2+8cXx1C/ydVMdJaQCIB8QrRSYfiPHpG41ct1DkRZCgGpAa0uuVcyH6HDhHpjv6fHjiaAv2vgGX78LhyjfOFkx5ub5nu0BxdHUKWuCp29hjIazz19N7OsKvrr8Nab1t1QE7ozO74q9tYUtHWuTeeflOMkoqP86Gc5DQJb44LNX6JtppyK18F72wGx/3sB0yTtJdJD7iKj9JnINlP4B8/r2p9bQCHnptOEdNqboSYWYszEA5Y5FGwqsi3RNN1Q2uk4DhoxaxYdIaIhaoTM0VeQDn/8Ze/YMvuHnjU3tEipMp7z/pU4Db4gFv3n7G/c4N5V8GiWeNMF40RgQA2gvvfH1vEELo7gsFr3G9QeTwdrcsn7QecdaT9Z9YS2Z+bJ3BnCHIUNqLfvhwa9hphTmtdGc4gOMLngebBiBjX6+/k9arxoSflQg5iRDHjZh0RN14cd6Bb0x6YVUXplCnR83acJHotBTIiDZs1Yk+NoTVzlcHmxAL8fzdgIu2G9FCcsi6W/bg76IVk8StRcux77mWGKQpWyeNSJoMNMaOFyCSsN/07kX+ngPBvM/DPJN+EBloZBjisJfXS3khG7F5xncfOPQmX0Nykh4ntQHo4gGv2b79e+8bst+tJMZx04QQmwBE25hiTirp1OOd5quTb012XA/XoOJh3IF22Ib9jo0Ux/vBgJj3tsWrgpIc1YWN5v3xRpt3ie8WDEs8AY1OGg1RUYWA8UF1gvCdvkZ1Do7zvK28WGpqchDR6+0dajI2tUUFjkLgYDWBHrczfSwZlhQJ+OxAahm6toJDrGaYkitO154Yj56nu5KwciW8A5AfppiEN1q1OgCOFxgHgKlVunb7bAdEnW9Y6Gg55Ps2ZzLPsur0PC+OSv3C7z549JdO9s1/ShgAHAzhqjdu3/7kC/Li16ZNpaw4APdYSmoE6M08JXBvCw8OJoGvPwXw0pAaC7Gz5viR195D3o4Pt43tm9N79rB58+jemO+n5JV22o6TbZyXb0AacXndaz4RuB2D5cmqRyO2MSxi8RxfwUePThJI2F6DbT3TIbTqB5lyNHgWHZipsA7qlnkHI2fRT8u9cMOTvHon4gGSr7kZr9H1+duCLO+llyQ54cmpvFb7t8jFyUb2qRaZIOLSOj8UlFhawKcNAub66Uw/GPhqe5YX67n87vceOvJEnnqXHnFSHqeEAcDh1vx/7dr+5HNj/mvI61EWBDDvLa7Wt87+farmYPKwD4f0ejg8rdWMGXr7GGkq8ngIbC3JXq7T8VFKtLVNY5vN+AWW/3oDUzo6nYBpEzj4pX1B+Afts0vGwVIXBvgpNPb2WKtUJPxAP8SF9TnCi/TcxPCj53QPrFdOlN3KfZQOc+6BYyudXnwzSs4LsHKpawbie1Nb9jthF95StNvuPY8o7LSh0owOPqRkzvjz+8mGJt5Gf18AgDDgWqKF9w8Y7QXCT15tC6FYb+Tt37d67HJqirS36CQ+ThkD0E0H3r5r15NXmvBrZV3KxDx/SNxzJ7Ck+jU9Or2kU1a1U6zTLGTLBfmv1Z9NK9Rqy61BsAGhtiDNAPRawqwRjly0RHW5vMHIzAZ+38k2bgwsJCc/gIi49TQ454CNUB2Fobad2YHC43kHSI1S2N0pK7bJCnN9VziiIcTRLS86ldj/dAKRA5T+br5R03Qfjxoc+W9rnsm7p8qEUppb1V+jR7fn4e4exCdF+DV64ITfzMp9p/eKYjPK23/xyJHLP2QZxAnd4iunehXg3zqw+ZEO/M9Dh960WldPLXwTY/4utfLSmC3fVp1SmKveaudZjDKjt/QGFdULYPpsM/raJhh9Pdt8k0hlet+O2IZuFJPndsFKV/5RvnsntXCRDG+H9Yk3XtrD+0I0Ayu6Yo3c6+Q40pgrR/Bp5Gz6sN81/6aVPXc2HoQ4vXTqoXu3IzHJsXXbd7vaC66D2BEp9dJkUkQm9dgxBq0YpKTJBov47Ad3Z6nqR0OCL1Ugpqx3P8+lnxcA/qodeVZs1s3b/+aCU2/zn3IRwG0jgbcuLz/ltDz7VTB7yS3PsMkm4Pd30GZlqfFmwXt4fR+HVwpY7Er5pR7M/TVPZzORKYP6955XW3jepgxpRhfDcwP7DERjdu5F+lQLp6BVSxKkF0dnoOe+DO07oqN+eNktKfK4uChz7KSb4CBhoiJ7SN62Ofv4bFUmpviqh+/+ttAQxTm3TTzY7GQdpqilM6ykoy+QGoP0Odm5+zU5A9EqCg44WmMPvmAI+iHEPIR6e8iLiTRvv3J19fI3nYKb/5Q1AF0j8Jvbtz/lrJD9Gog/46bW9QvRTHhj6yizMNvr2ZpDdkJUr+ZZisu4oQFu0G4a3GXtHMT3SZ2nZfz5SG5t5NMwtkvJdQGM9FapexCv1XHnTm4hmUl/zp9ZKmAGDLMB9Vo4/gxHjolGXknDn/prRmrSXD/NP2jJSl0Sj4OmrvyrAKVWShyMdKPTTlFWWq6nT2o4vJHZFYcM6ExUYjdcOinYGH5ufJxq7cTsoGpCZiwMwzDDoMNjIewJRZ88r7eHrFivm7e/96Jjl7/pQ6fm5j+lDUBXXvw3VlaedFqW/3Jsmm2Tpq5nTcxdpMIWOum4HKqhW7kjN+1ePOtiBtxsJknWSnq7R1Igil4u8eSVh9ASfHwen6H3TjSyDWhgo9cdzTAZ/ZVSXo5MaOUi06m82GwwGF02oqb9aIsn5JUmJXVSDTcC/n4m19W2VrdS2l7jbxn9jjFag1/bONWWDu1JeJqjEQIrHX4o8YkRk1dInInp91sNAUuwLs5iE3zI5VBV3ywOijwu53m2Hpvfed0FR3/oQ6fw5pdT3QAcZwROW7l01yz74540dz9a12XZxB6iAstPLfRNvHoybXyTmPdjKyk2Werj92nFbhza/nr6q1ROtI42Szc8h+51aL6oNCQP6rV7iov653p93YlAei7eseelRpfmorS3Jg63/V3X7HOqbBL69OaglmeAc0P3nHpqbmbT7ifPgDtdS5FswvGgHUYS7dDWXePXys9P5sWMhM8BxEElQpvQ65pcHpkw6seAEoT7A+Vw6Hs3GCIzlBA3s+b5P3hk9XVJF/QU3fw4TnkDgOPXRXpPESlfubBw/7sXxR/ORbnoWK1Nv1mlZUIPulvZrU6anVD4FAm41r3iA0lNj2OwbGOkDsPULmT4QtLIZ3iPQ7NuxuD+XkqR5SP0s7PBJhZC62d3FIY8dQCj0fUMtBmnMwbbJb584zk7r/u5XqP37mMrXx6/pLzTEEBm5azBDnrfYTgYYs+qC67XR305t6EVEWnBWF+4SqrqGk7SgDXXR1dfRoKPSA2puGGQ6UZVP+sHNzbe1JkfFOUUPrYMwG14ApfPz5/5X/v9122LcfdGjI0i97HJfHKMKvV2SliJrcdRBO59MVEIR0sMom/31IDphAtgeDNKy+WnGq5zctn84yCkiXvYRq/AEOx0/rWbmjm5RiIkLXVQQu9ONKkyn07kRCfXzzecoN0mPp6LajzpHrQof+rI58b28zc808aW2zt1R3LhXcFEtM0OWUdLGfxGOenHWJF8+2Q4YTzcKODvpuOfocxanlZkvVldX3+ojN/3tMnGe3mrm1N98+PYMgCdA9OG2PSRvX1p6XkLWfYKeNlRXdVlFMUFvJzlfPm2NajTkZYm+EpaYyAPtcg7hCbbvnxEFfDWXSaeU4P99c7ww09AnDHgsOvbzfLgM8xI+BQc8+Xa1EzD40R/GDQPqLuRTHuNZr6SRFinHVe3qzcjsY/AOxCNvntcATHBdF7r9092voNPEwYr0IE7Ix5Zw0+6H51ZCjiUX8GUQId2Csp8+rMGQOiukGVViH/2yRif/VNra59zVuidt6VOrGPLAPzbRkBev7j4uLuLvCKGcI/VGJuyiUgHnCRMGTCT6vaefW9J9TDdSUQpFCBwBWBOQ3S24GpHGrsR29zbgb+WJ2/01s62d+9KlB1YQaf61RkOwlDZFYSYmnhojk0LsM1NmgNsjoG0ICarG6k00k7ycd6N5+0a0ru8d4dr4FCmNye5ViMuWMe03YYBaAdSBPD17R7CGBv2YQZPe/lz5Pw6E6JeDlm+EEVWY3zZ5Wetv0yulempwO3/co8tA/Bv3Jd9IhkWy56FhdMvluyNwyw8fhLBEYgQr9VZ4Bauto0yacqOtDvecvlWQD6FzJw152IVyFndg/trPAe2Nd9iBerfvTnHc3GWE9upPS62YY/YefhKW07nZ+drVF9M2LUKh6oLhcYqBgmYs+XiG861Ba33x9V9bdPjgIHRZhz/PBpHtxJusNKMhY6Mt/6vk6DjS2c9aLWipT/YoBHT8Tc+fw75t7gjz7Oe1IcOl9WLf3Q0evNtDfvW0R5bBuDfOToeI/v1xcWnLsT4M/Mx7EQ0gGo3lqmJUZJlR8FJTTDpNbsyVu63DQCki2cZUAHAFCS7Rh03sdOS3ZuzE9ANQEt4c3Vc75ejwCXKaj6TIDYaedjmxkFqcKrJOw26BfcM1CN4yN4AL2+20c7x+b9iIt3GHCbsmmI4+1DLicbnh+HRxixoCCZGVWuqXIYNkZI2aLHMlyjReVbPhzxfyTM8iz86XNcvePba2ufI9/DAbOu4zbFlAP6Do53fI80bBoOLtkl41VyW//exiExjU5UiRXcAh5F9uoQdNBZ5/uy8e258bhQfS96O3Whlv9yTd8NyA76Qm3MjuUsk+Ke0Yp4/wMck8a3/ZlGA6uBpOmGhPwyYbUpy6DvwgzHqDNVPdFviCanlN80zbDsik+SYRgT4XIb8KfXg/WnjmjSAVVMg9jUkbUb2LWBQB6S7cN/yEJoihLCSZ6EKYXMmcc+PHl19JV6/FfL/x8eWAfgKooFfmZt76koT9+Yh23UMk+wMB8udgOMeS3vrb6Nl70xBbS7SkqGh7Mro62z6RAruAoEJpW81CzQF0NdpRwNRev89+PP8OFafvq6xqMBy8VbNx6oGbNTpDC3Fh7iJSrBjZ8IvKgjOd2hTIBqs9PMWrHRWo6cunuvr+C5XTSa3QSFKlvWcWNVTck8WeyE0S3mWD62/4o/Xe/HFzziy8UnYnStEwlbI/x8fWwbgyziQR0JqDE74J5f6F58xzV60kGU/jJB6M6IpVXvks1bBtl3croufOHPdwSS6wLs8AD6c7gY5LoBtd5CWvliV8PKhhf58pbMJnQ/QGQfAjIVYA9H4DhfBCE/Hi5B6auIKQM4FaBG7lsDjBsWHbsJ8IOIw9SIfQGrnlmYfEBQ0nT//bFPudaluCAkVEvIlNWLy6ak0L37axsb/xVttef0v79gyAF/B0V1kL+/PP2ZXFp+7JOG/IJQ+2iAgEPAGGOlTopt8f1b0rJ8/kYBMRCNPT8XycC8Dmse0fn/nDrh2gcF2BkZaemAvwIbxx+viH16B8BqYb1fLHjz8bnsT/HNJfib/oJUnsz1PbIOEHPfzjlmU/M4BRddGdFYgDJLNOuhEC7yOHhWUNNQXib2QN8Nc8jn9nbDeSHzNJ/rFq391dfXoltf/yo4tA/DVRQMexYZXzs09bWcVnxODXLyZQeRS6rKBFq4ZAjs48Ubr+DY7wKYONYpyu5SWbRKLCkwQhDPqKdjpmbHNJrTwPvdx3/TQDg7q5k8DQhNnMTns49L9VF93fX8LEVJfAEp0TibyNICX1WH/p1IffkfVkdXjW4ORDyMxQlD7eos0GCHReCmbT7+yupeFfEW7K2U2qevf3ijqX3rh+uzTeOWW1//Kjy0D8FUeWHyuF/8kkR0PKPpPlBB/IpPsDO3Fx4sSGo4NTHkqeFXuwlJqNQBGeGs16/VXPXT3IZz4L4VG1ItSFNTBR8cAktADPbprB1pPgbMQOzLnLttFgC6JmhKkc2DPmpLcRqRphomI5JiAlRZ9HFfbUuwNVDgc/Gs7FdsyKAE+mQ9BViDdFVXb4C11Fn716aPRh/zeX7bF6Puqji0DcAcdXS90+WBw/r3L+jszkefELDtfZ3A2EdibqdUin3VOPsuHBQgsrH/b5Np4vHf1CT06vINyYsqgI22GPAIL1SmLDcQ/Tbu1zWd1elMmNiKOT+1tFYJcGEXptxwJ5gU5NWipicj7ElwrtQN08nV2ni2u4FhFt7vP26y99IfPRwMPNPt6EsaLTf1bR0L4/Z+aTv+Gr9Loawvk++qPLQNwJxGI8Jc3bdvxk1k5/dmbZzMlD3lvOzY7Due2q8ftUIVb4mxX1orxOvj/1NED+KecgKTAi8YbWBtXtHSar/MPWpER7ymwuvzxqH1b7XMMwslCzhpkupEmK1OeiwNDNK9v+4gsPTkuSWj7CYgUpo5GH9MNdYRtRZ71svyDz9/YeCjvwtbGv4MPG527ddxRR8Tmv0qk93mRZrg4nzfjIIdqUxmaVbYhVTswgWr8RZ8Vqn+zCMC+Y+rg9X7q3neZgrbZWoHOeBvevm5A7wug0YD6ju+/loFoHtnLgt3SA6IU5yq0lQkYIZKEUpMuzsdyfpuk1BKNvAUZh9N9uwYHP9GpShQ8PaMYyOn9Ily0IYPPGlFxq4HnDj62DMCdcKzTEPxJlslcUchCUUi/FhlFkWkTZabSP/S4WkMngagrMtph0aWyWpLzatFHIxS2U251rDl/x8N4nfiTJIIRkmeq/OMivt2JyEb8cTk0lxgzopCCks5k5OfMNPR3rQG2KKsBoGR4J9LxkqJflakBewTSDmJBnX++KGSpyHVs2rU+KmArYr3Djy0DcCceQPoxYmpArjom4fQp8jmNoorEKnDp3XDk4wbWvL0xBhvPpxOn3ncfueVdedqubN5bNQg7U34YOJjaPybgKihh0YVRmC3E94gE4KUbGx8Gio1rDThYNC0pyb7aQag4dOM72Kg/IQFIf26xQukMQBqhIYU7FfjLM1mA8cS9C6k4unXcCceWAbgTj6JppI/FnedSVtY0hIYW9MPj52gJRi8/QvgJDEKIMmPO7Zx9bXQBqq7hPLdYc3yrrjlw88JK6dXvGil06AhLhs5O1N8zWq7W5VmPr5KiT5te6PuhtwC4Az8fIOLsuOEmrcKvRy4G+lmXowF/QWY+G9EbofBeOo5bpE+NBNCWYewA/i3mmazkudSnlnD1//NjywDciUeWQXq6Ye8/vgzuw3+xibIcXt4C5QISYNiQAWmCyAT6/NxsG5zA06dnVwAv0W9d8EO9d2OkgxC0004ixl/q9ndOvtbm1ZO3qj/egozMRHkGJPW43DjCAb5rmlaggT5jfNUo8PHdjiEoNmGfgY3upT27TmYkVAHCIgTqr80+mNiDa2yizOW5bDiTceu4U44tA3BnHlkheVbKgN4UclyqYx8z1cNT1eGskZDl0sPcAM2ho0yyRoaNyFQQGTQygSGIUda5qaye38gcN4+KYhr7T3eLjSY3Ui36FHRMmcENTBbakWLWp2+6gibrrXgCIUf7WWH7ViMIdBb4fAHDMSwKgKFynM82u0gfbD6mEdqVSO+PiMbHqnkXJP6nxgGjukgCgqJPXwUAto4769gyAHfK8QgRuVKZennINZ8PCGeT/BYm0jJQh/owI4ABxpVhWlAUGXN34VUIiWcSZF2iTDksA9EBUgZsLvxuLnE8J/KxEMJZIco5UWJVSBj0BWxEhvCUB7O0wSfvGFfAZcxaVaK2QozspZFYlTGMCpFPTkTOLYOcW1nioUYFG1m79Igx9AHo6TAOkJaM5GNkJXbyOURI/AF/UwkvMP9y2/w2tnurUn1nHlsG4E48lO5bi/QKCFQ1khfYiKycazXQeuGB3GMTo3EH3PmsxoZB6tDIFD+jxgBUijVMRxifIUXQaRZNHTSO+PjvxviwR0g8c1dRXLi9qqajLNxzGuWSoomjGMLZjYT/ZFU6pAb04KlVWcuFsZLYq0Wuy2P850qy3jSTptc0761ENo9Jb/0vZHbN94T8LZnE/7+9qwmZ66zC5733ZiZfE2JTKl2Z2oUuKkWQLgSFFrfFpSsRQVy5cuPGH+KmFDcW99VdxVLQTTbSUsyqXbhRtLa11mpRKpUW8/3M3Ln3Pa88zznvzDQWKqTvWMx54Mskk++bzL2Zc97z+zxfK6XoAJVvGLWrEyO8p/GDmssLlLbDb41PG/LZjTNbKuMDSKiXwHngNVgQJMlfy/+i2x7hANoFALy5VvCyCIAVcO7n2ymMFAAFMkzlod1lp7RV7ykD7oXEtZfVOTHXgYdgRxUO40GX4ci7addF3pR5fpPvQ5Ujs1sLfy/856rhHvxNbYFAX9LFrnsAoqS9jxhRZw8nv+8vLOAMSI/uUYFTeVWF5IWTeeCfhQ5h7SmQOSmbBPrA/amqoBRohXAADTEMg/QZFDd1ku7dElamaGuhMFtzMBQfgsGADU54hseIFHzGfwZzrkC1yCrpcAp3SJKjupInkq56I+DFvb75/SLlvx2dxaLT/s/u/TygS0lgS2cqcs6LdjjV4chAw42CHnC+63drvC7NhbwDeb4pJYsgFEGnoWf8YQ7H+VJtDwH3L9AM4QAapwBoxeEDP+dsfX4u81jIyw1AnnR2lqLsNrFZgDadaex1mPzzyT1rH5pjQHhNSRsYIZd73IDMUG/p3Hw/RwFngwIljBvRB0N2Qe4O4zf+Psw9oHZhslzY53fqdCcXQTLEICAjyre9CNRLLE2wdqCJrNzKlQTeD+EAGkJhwIWE3K4d6Nr0vgiDyjhOTG7N7eneU0KcdDg2xwvjX+ROxlTYCuRAkO/2Y6Do0CLPqFdUaXT28VPN280BwODx+9reY/jvC0Z1fxB3hSvKXWIagBkALig5EQil0sFqEhFAU4QDaAkM0eA0ZzqQZJ4sB2Zuy+EaYw2u7Lak5cZCDx1HNuZdpw9DGL102fC6lccQ3Bd9rNN/GKCtmVweHFTmLP6RtAN6Bz0LePizMfUamw+L+U6hzmlH3Bc879OFxhrkswKm5kMPgwWAQDuEA2h5cxnC25nHXB5KvEre+h3VpYfG3O5zS8AjP/jkHsYWjPH4M//3xyFl9tMRq+P03W/btQbGdvHvUoQDrTpEKNThs/bmEqc3n0MUYM7A9hV2XAd1pdnkyryC6QVStgkpMY58Ij6iLRF3tyFUZ4b+duiZXDUKeAhtbT9nT9O+62WDU9GVcZn7IgJgO82UitFemxLZhthmm8Dd7ws0dT7/EDAFYxvlRTpw1FvPHuE/jB/dgMWAGkDVKNqtF3Om0Nei63OVvnT3vU4/ijZlXZcMNEE4gIbgIcaxuj2CD1b7nfCSop/GAYwPfNUTMMZd1AXMeTCM9nVb/IfB6HYMQHARHaOBQ4HvS0XOI//vOjnvVf4dhZepHKFLYXCpLwc3Ctn/x7ISaM1sDbkSj9TBIKQUe3xqgQYIB9AQVOFGAcwZeGG1neIPvmmHkNeXZqSqCnOl1yMDOAcM32+lw6qoqPHrkkq82KQd0oBDYcB1uLGi+s8UgGq8PYt5NYenhPeWntj7nhiOwjX506RJ8giJUY8Tn3S9FQVjDqAtwgE0RDd0UljF9tl3Rr++1u7MN+S87y3sB7E4xofZAGDtwAZ90CVAMZGtMTIKdTKoqRHhlIQBHjAD4OmOPH13Srs2n1f+6SBckbjKg/F+uNEjzcGqMweMq6Sy04XpPjX4HjFKoA3CAbQEB1zM2EnuaTu125x4n1ST8uC+WsfIobLpopJesBaL6ME2CzeKdiBqAfY9MLi+0nUfABj+YfRRF31QD+AoLwaabMinyp3b39efxD2wyT8yHDsNElujNwmK8E/ogkYRoCnCAbSEakGOWzfwbEzHil3sjRsJniiOw6rYAThHvilj1b64Lw95XYBy2Gy7WUN+s1MFaQ7fJdpSl4HjsK8CntwLcGESf691t7DKglk7cDfzYMbu+gY+PGR1koTCKPxNoBFi06IJrvPX9TQNOs8F1N3bD/9WGc+EODAhWEU7Kp8Oh2C2xuNDQt4urCy+RqBRh2s4pX8wZ76SMlBElDZsU3vcd3DpsSouiK4HbRudjUp4Wq8FPf55Nol1D/mruKgxB0lZb2a5Q/Q3tpC4pVEMfIAIB9AAD1+3D+qNKf9zHOc0zjnNGYasFAGxVVwQZ6iLgOzagUbLjeKgS3arDQhxccidA1ATid5Igkvu0kt43g2lCeprHyd5aTYrV6v+m6bBTm8Yh3zl73R6sW0v0HWVtyoHKnPJWy5DOgBQpc1Z1nkum1lfw9O/is9qE4QDaADoB+Lx76ebX741rk+mOaezaZJxzqKa+QGf+GgFPjxSJptGjkdEBWb4+ELbDJ0BcAWQecfZdj22Zqw85fI8/s2nGxJn1tc+Lfr82pIAJvF479vlJlxLAReROQFzcvZlzgytP+c7ZJ8fz9u1wcnhtVyePP1rM6c/rjLVf96K078JYtCy0X31ibf0i8t3PvORJF841ZIHCAFvufRrH6yKgpqiTi2AjTgFwSLshs/fa5azrGQWBm/Apoh2qSQtafxT7j79lGxe2ZP8+8BR1Qm+LotP3tvpry926cKy79JR16VFjxagsf6gEIjaBCXQpA402fYgGYdIP+bGTpn13civR0F6aTGktXR/fTbnz/z4xo23W17X7YyIANqgTrzqq5vp0eM5T1mzrHLW06xyPGc5yZmswGNWWanK2ZzleJrkOM/8+9MZxj7TEazxvQyJs4w5y6pkuZFVj4tqhvUXfQzGjzXelkbi+z/dE7J5ZSzlZ30p3Vp1OlUtZ3hvMyKbwveIL5zkG+ghlEznxQjAH8eSyS6Aa+f1Z5WTrHKmqlBS7uac3lH9Foy/9XXdzogIoCG8VqePHy2/f0X6qyeW62auu3ZcgkVLLW35+JxXn/z6OOWdEwDU4aOWMpZSRinlTKSsFIU4qu0++hOR78JIfA24qaFUFd7fyoW7P9Gtfn4ppc+VlPQopXKh69Mgks51KaEoSF2CPbkzzjM4ZbilN+A61DJrKVNKSBxALNJfwnV1w2PfGFffrvew5TXdzggH0Pj+Vobs7w2Lb14uCvXge0kC6oIb51jrSzoV1skL8mMaiNcE4BA2UvpRS0KYDE7AVRE5EfnLSSk/uibyuBv/wYykpgIPidx9n6QfLiV95a4kcgH7AJJkaYQfphFSS4M+54trRtiPnYZJpM/wDJxnsNeepLw+lfKdH6j+dE8QLdAI4QAOgGqgXxS554p0X+6lPLLs0qcGkXuwKotJPlTBUc6vSj1U5EXeL1AUAhmo5DHJn2eRN9ZFrr0u8uTvRP5xqJP/Zuwb5yPSP3xJ8lcvSvr8Msl951LqoerrFOXWIfA2Z5UogzODUtKcRPsirxUpb5TSXXtZ9MnndtcVJ39jhAM4EG7WsH9Q5GNXRK4MIh8H49ZS0kSaAFfUhFAIPv2nImUSeWEWeftvIn94mcpjhi+J9E/vveb/AKQfq4b6UZGLD4jcf6fIZRX57MIoPd9FWWIaBJxbwDrAC1nknVdFfv8ig5r3vleBwP8FYNr4cN/q6zzkfKPyIQEckRfqbglXsWbwIbquQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCAWmEfwOLVFb884L/CgAAAABJRU5ErkJggg==", + "alt": "", + "aria-hidden": "true" + } + }, + { + "id": "workspace-title", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "workspaceTitle", + "color": "nativeText" + }, + "children": [ + "OpenClaw" + ] + } + ] + }, + { + "id": "workspace-caption-minimize", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 46, + "height": 32 + }, + "attrs": { + "role": "img", + "aria-label": "Minimize (native window chrome)" + }, + "appearance": { + "textStyle": "workspaceCaption", + "color": "nativeText" + }, + "children": [ + "" + ] + }, + { + "id": "workspace-caption-maximize", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 46, + "height": 32 + }, + "attrs": { + "role": "img", + "aria-label": "Maximize (native window chrome)" + }, + "appearance": { + "textStyle": "workspaceCaption", + "color": "nativeText" + }, + "children": [ + "" + ] + }, + { + "id": "workspace-caption-close", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 46, + "height": 32 + }, + "attrs": { + "role": "img", + "aria-label": "Close (native window chrome)" + }, + "appearance": { + "textStyle": "workspaceCaption", + "color": "nativeText" + }, + "children": [ + "" + ] + } + ] + }, + { + "id": "workspace-body", + "el": "div", + "layout": { + "mode": "horizontal", + "width": "fill", + "grow": true + }, + "children": [ + { + "id": "workspace-pane", + "el": "nav", + "layout": { + "mode": "vertical", + "width": 256, + "height": "fill" + }, + "children": [ + { + "id": "workspace-pane-header", + "el": "div", + "layout": { + "mode": "vertical", + "gap": "2", + "width": "fill", + "padding": { + "x": "1", + "y": "2" + } + }, + "children": [ + { + "id": "workspace-toolbar", + "el": "div", + "layout": { + "mode": "horizontal", + "align": "center", + "width": "fill", + "height": 40 + }, + "children": [ + { + "id": "workspace-collapse", + "component": "SubtleButton", + "props": { + "label": "", + "accessibleName": "Toggle navigation pane", + "disabled": "false" + }, + "layout": { + "width": 40, + "height": 40 + }, + "appearance": { + "textStyle": "chatIcon" + } + }, + { + "id": "workspace-toolbar-spacer", + "el": "span", + "layout": { + "grow": true + } + }, + { + "id": "workspace-history", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "2", + "align": "center" + }, + "children": [ + { + "id": "workspace-back", + "component": "SubtleButton", + "props": { + "label": "", + "accessibleName": "Back", + "disabled": "true" + }, + "layout": { + "width": 40, + "height": 40 + }, + "appearance": { + "textStyle": "chatIcon" + } + }, + { + "id": "workspace-forward", + "component": "SubtleButton", + "props": { + "label": "", + "accessibleName": "Forward", + "disabled": "true" + }, + "layout": { + "width": 40, + "height": 40 + }, + "appearance": { + "textStyle": "chatIcon" + } + } + ] + } + ] + }, + { + "id": "workspace-selector-container", + "el": "div", + "layout": { + "mode": "freeform", + "width": "fill", + "height": 36 + }, + "children": [ + { + "id": "workspace-selector", + "el": "button", + "layout": { + "mode": "horizontal", + "align": "center", + "width": "fill", + "height": 36, + "padding": { + "left": "1", + "top": "2", + "right": "workspaceSelectorEnd", + "bottom": "2" + } + }, + "attrs": { + "type": "button", + "aria-label": "Select assistant", + "title": "No agents loaded. Native assistant picker reference." + }, + "appearance": { + "background": "$none", + "borderColor": "$none", + "borderWidth": 0, + "radius": "sm", + "textAlign": "left" + }, + "control": { + "chrome": "none", + "focus": { + "kind": "outline", + "color": "accent" + } + }, + "states": { + "hover": { + "background": "subtleHover" + }, + "pressed": { + "background": "subtlePressed" + }, + "hoverPressed": { + "background": "subtlePressed" + } + }, + "children": [ + { + "id": "workspace-selector-label", + "el": "span", + "layout": { + "grow": true + }, + "appearance": { + "textStyle": "body", + "color": "muted" + }, + "children": [ + "No agents loaded" + ] + } + ] + }, + { + "id": "workspace-selector-chevron", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "chatChevron", + "color": "muted" + }, + "position": { + "mode": "absolute", + "x": 222, + "y": 12 + }, + "attrs": { + "aria-hidden": "true" + }, + "children": [ + "" + ] + } + ] + } + ] + }, + { + "id": "workspace-nav", + "el": "div", + "layout": { + "mode": "vertical", + "width": "fill" + }, + "children": [ + { + "id": "workspace-home", + "el": "div", + "layout": { + "mode": "freeform", + "width": 248, + "height": 36 + }, + "attrs": { + "aria-current": "page" + }, + "margin": { + "left": "1", + "right": "1", + "top": "half", + "bottom": "half" + }, + "appearance": { + "background": "subtleHover", + "radius": "sm" + }, + "states": { + "hover": { + "background": "subtlePressed" + }, + "pressed": { + "background": "subtleHover" + }, + "hoverPressed": { + "background": "subtleHover" + } + }, + "children": [ + { + "id": "workspace-home-indicator", + "el": "span", + "layout": { + "width": 3, + "height": 16 + }, + "position": { + "mode": "absolute", + "x": 0, + "y": 10 + }, + "appearance": { + "background": "accent", + "radius": "pill" + }, + "attrs": { + "aria-hidden": "true" + } + }, + { + "id": "workspace-home-content", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "gap": "4", + "height": 36 + }, + "position": { + "mode": "absolute", + "x": 8, + "y": 0 + }, + "children": [ + { + "id": "workspace-home-iconbox", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 24, + "height": 24 + }, + "children": [ + { + "id": "workspace-home-icon", + "el": "img", + "layout": { + "width": 22, + "height": 22 + }, + "attrs": { + "src": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyBmaWxsPSJub25lIj48cGF0aCBmaWxsPSJ1cmwoI1NWR2xyVFYxcWZrKSIgZD0iTTEyIDJjNS41MjMgMCAxMCA0LjQ3NyAxMCAxMHMtNC40NzcgMTAtMTAgMTBhOS45NiA5Ljk2IDAgMCAxLTQuNjQ0LTEuMTQybC00LjI5IDEuMTE3YS44NS44NSAwIDAgMS0xLjAzNy0xLjAzNmwxLjExNi00LjI4OUE5Ljk2IDkuOTYgMCAwIDEgMiAxMkMyIDYuNDc3IDYuNDc3IDIgMTIgMiIvPjxwYXRoIGZpbGw9InVybCgjU1ZHVTZncHVkRFQpIiBkPSJNMTMuMjUyIDEzSDguNzVsLS4xMDIuMDA3YS43NS43NSAwIDAgMCAwIDEuNDg2bC4xMDIuMDA3aDQuNTAybC4xMDEtLjAwN2EuNzUuNzUgMCAwIDAgMC0xLjQ4NnptMS45OTgtMy41aC02LjVsLS4xMDIuMDA3YS43NS43NSAwIDAgMCAwIDEuNDg2TDguNzUgMTFoNi41bC4xMDItLjAwN2EuNzUuNzUgMCAwIDAgMC0xLjQ4NnoiLz48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9IlNWR2xyVFYxcWZrIiB4MT0iMi43MTQiIHgyPSIyMC4xNzgiIHkxPSI1Ljc1MSIgeTI9IjM1LjUyMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiMwZmFmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNjYzIzZDEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHVTZncHVkRFQiIHgxPSI4LjciIHgyPSI5LjIyNyIgeTE9IjkuNTg4IiB5Mj0iMTUuMDI1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2NjZWFmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvZz48L3N2Zz4=", + "alt": "", + "aria-hidden": "true" + } + } + ] + }, + { + "id": "workspace-home-label", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "body", + "color": "nativeText" + }, + "children": [ + "Home" + ] + } + ] + } + ] + }, + { + "id": "workspace-sessions-header", + "el": "div", + "layout": { + "mode": "horizontal", + "align": "center", + "gap": "2", + "width": "fill", + "height": 40, + "padding": { + "left": "4", + "right": "1" + } + }, + "children": [ + { + "id": "workspace-sessions-label", + "el": "span", + "layout": { + "grow": true + }, + "appearance": { + "textStyle": "bodyStrong", + "color": "muted" + }, + "children": [ + "Sessions" + ] + }, + { + "id": "workspace-sessions-add", + "component": "SubtleButton", + "props": { + "label": "", + "accessibleName": "New conversation", + "disabled": "true" + }, + "layout": { + "width": 40, + "height": 36 + }, + "appearance": { + "textStyle": "chatIcon" + } + } + ] + }, + { + "id": "workspace-sessions-empty", + "el": "div", + "layout": { + "mode": "horizontal", + "align": "center", + "height": 40, + "padding": { + "x": "4" + } + }, + "children": [ + { + "id": "workspace-sessions-empty-text", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "bodyStrong", + "color": "muted" + }, + "children": [ + "No conversations to show." + ] + } + ] + } + ] + }, + { + "id": "workspace-footer-spacer", + "el": "div", + "layout": { + "grow": true + } + }, + { + "id": "workspace-footer", + "el": "div", + "layout": { + "mode": "horizontal", + "gap": "1", + "align": "center", + "width": "fill", + "padding": { + "x": "1", + "y": "2" + } + }, + "children": [ + { + "id": "workspace-owner", + "component": "UserIdentityBadge", + "props": { + "name": "{owner}", + "status": "{status}", + "statusTone": "{statusTone}" + }, + "layout": { + "grow": true, + "width": 0 + } + }, + { + "id": "workspace-bell", + "el": "button", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 40, + "height": 36, + "padding": "2" + }, + "attrs": { + "type": "button", + "aria-label": "Notifications", + "title": "Notifications" + }, + "appearance": { + "fontFamily": "body", + "textStyle": "body", + "color": "subtleButtonText", + "background": "subtleButtonFill", + "borderColor": "subtleButtonBorder", + "borderWidth": 1, + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { + "kind": "outline", + "color": "accent" + } + }, + "states": { + "hover": { + "color": "subtleButtonHoverText", + "background": "subtleButtonHoverFill", + "borderColor": "subtleButtonHoverBorder" + }, + "pressed": { + "color": "subtleButtonPressedText", + "background": "subtleButtonPressedFill", + "borderColor": "subtleButtonPressedBorder" + }, + "hoverPressed": { + "color": "subtleButtonPressedText", + "background": "subtleButtonPressedFill", + "borderColor": "subtleButtonPressedBorder" + }, + "disabled": { + "color": "subtleButtonDisabledText", + "background": "subtleButtonFill", + "borderColor": "subtleButtonBorder" + } + }, + "on": { + "click": { + "open": "NotificationFlyout" + } + }, + "children": [ + { + "id": "workspace-bell-container", + "el": "span", + "layout": { + "mode": "freeform", + "width": 20, + "height": 20 + }, + "children": [ + { + "id": "workspace-bell-glyph", + "el": "img", + "layout": { + "width": 20, + "height": 20 + }, + "attrs": { + "src": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyBmaWxsPSJub25lIj48cGF0aCBmaWxsPSJ1cmwoI2JlbGxCb2R5KSIgZD0iTTEyIDJhNiA2IDAgMCAwLTYgNnYzLjdjMCAuOS0uMzEgMS43Ny0uODggMi40NmwtLjc0LjlBMS43NSAxLjc1IDAgMCAwIDUuNzMgMThoMTIuNTRhMS43NSAxLjc1IDAgMCAwIDEuMzUtMi45NGwtLjc0LS45QTMuODQgMy44NCAwIDAgMSAxOCAxMS43VjhhNiA2IDAgMCAwLTYtNiIvPjxwYXRoIGZpbGw9InVybCgjYmVsbENsYXBwZXIpIiBkPSJNOS4yNSAxOWEyLjc1IDIuNzUgMCAwIDAgNS41IDB6Ii8+PHBhdGggZmlsbD0idXJsKCNiZWxsSGlnaGxpZ2h0KSIgZD0iTTkgOC4yNUEzLjI1IDMuMjUgMCAwIDEgMTIuMjUgNWEuNzUuNzUgMCAwIDEgMCAxLjVBMS43NSAxLjc1IDAgMCAwIDEwLjUgOC4yNWEuNzUuNzUgMCAwIDEtMS41IDAiLz48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImJlbGxCb2R5IiB4MT0iNS4yIiB4Mj0iMTkuOSIgeTE9IjMuNCIgeTI9IjE5LjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMGZhZmZmIi8+PHN0b3Agb2Zmc2V0PSIuNDgiIHN0b3AtY29sb3I9IiM5YzZjZmUiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNjU2ZWIiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYmVsbENsYXBwZXIiIHgxPSI5Ljc1IiB4Mj0iMTQuMjUiIHkxPSIxOSIgeTI9IjIxLjUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjZmZjZDBmIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmY2ZjQ3Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImJlbGxIaWdobGlnaHQiIHgxPSI5LjIiIHgyPSIxMi45IiB5MT0iNS4xIiB5Mj0iOC43IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2Y4ZmJmZiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2I2ZWZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvZz48L3N2Zz4K", + "alt": "", + "aria-hidden": "true" + } + }, + { + "id": "workspace-bell-badge", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "width": 16, + "height": 16 + }, + "position": { + "mode": "absolute", + "x": 12, + "y": -6 + }, + "appearance": { + "textStyle": "caption", + "color": "accentInk", + "background": "accent", + "radius": "pill" + }, + "children": [ + "{notifications}" + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "workspace-content", + "el": "div", + "layout": { + "mode": "vertical", + "grow": true, + "width": 0, + "height": "fill" + }, + "appearance": { + "background": "chatLayer", + "radius": "workspaceContent" + }, + "children": [ + { + "id": "workspace-content-topedge", + "el": "div", + "layout": { + "mode": "horizontal", + "width": "fill", + "height": 8, + "align": "start" + }, + "children": [ + { + "id": "workspace-content-corner", + "el": "svg", + "layout": { + "width": 8, + "height": 8 + }, + "attrs": { + "viewBox": "0 0 8 8", + "width": 8, + "height": 8, + "aria-hidden": "true" + }, + "children": [ + { + "id": "workspace-content-corner-stroke", + "el": "path", + "attrs": { + "d": "M0.5 8 A7.5 7.5 0 0 1 8 0.5", + "fill": "none", + "stroke": "var(--color-line)", + "stroke-width": 1 + } + } + ] + }, + { + "id": "workspace-content-topline", + "el": "span", + "layout": { + "grow": true, + "height": 1 + }, + "appearance": { + "background": "line" + } + } + ] + }, + { + "id": "workspace-content-below-edge", + "el": "div", + "layout": { + "mode": "horizontal", + "grow": true, + "width": "fill" + }, + "children": [ + { + "id": "workspace-content-leftline", + "el": "span", + "layout": { + "width": 1, + "height": "fill" + }, + "appearance": { + "background": "line" + } + }, + { + "id": "workspace-content-host", + "el": "div", + "layout": { + "mode": "vertical", + "grow": true, + "width": 0, + "align": "center", + "justify": "center" + }, + "children": [ + { + "id": "workspace-placeholder", + "el": "div", + "layout": { + "mode": "vertical", + "align": "center", + "gap": "3" + }, + "geometry": { + "translateY": -3.5 + }, + "children": [ + { + "id": "workspace-placeholder-icon", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "workspacePlaceholder", + "color": "nativeText" + }, + "children": [ + "" + ] + }, + { + "id": "workspace-placeholder-title", + "el": "span", + "layout": { + "mode": "horizontal", + "align": "center" + }, + "appearance": { + "textStyle": "subtitle", + "color": "nativeText" + }, + "children": [ + "Connect to gateway to start chatting" + ] + }, + { + "id": "workspace-open-connection", + "el": "button", + "layout": { + "mode": "horizontal", + "align": "center", + "justify": "center", + "height": 32, + "padding": { + "left": "buttonHorizontal", + "top": "buttonTop", + "right": "buttonHorizontal", + "bottom": "buttonBottom" + } + }, + "attrs": { + "type": "button" + }, + "appearance": { + "textStyle": "body", + "color": "nativeText", + "background": "control", + "borderColor": "controlLine", + "borderWidth": 1, + "radius": "sm" + }, + "control": { + "chrome": "none", + "focus": { + "kind": "outline", + "color": "accent" + } + }, + "states": { + "hover": { + "background": "controlHover" + }, + "pressed": { + "background": "controlDisabled" + }, + "disabled": { + "background": "controlDisabled", + "color": "disabledText" + } + }, + "children": [ + "Open Connection" + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + }, + + { + "name": "SetupProgressIndicator", + "note": "Setup control. The wizard step dots (SetupProgressIndicator.cs). Non-interactive, non-focusable, accessibility-hidden, so no hover/pressed states. The active step is a 20x8 pill in `accent` (SetupIndicatorAccentBrush = SystemAccentColorLight2 dark / Dark1 light); inactive steps are 8x8 dots in `muted` (SetupInactiveDotBrush = ControlStrongFill). Dot spacing is token `2` (8px); every dot uses the `sm` radius (4px).", + "root": { + "id": "setup-progress-root", + "el": "div", + "attrs": { "role": "img", "aria-label": "Step 2 of 4" }, + "layout": { "mode": "horizontal", "gap": "2", "align": "center" }, + "children": [ + { "id": "setup-progress-d1", "el": "span", "layout": { "width": 8, "height": 8 }, "appearance": { "background": "muted", "radius": "sm" } }, + { "id": "setup-progress-d2", "el": "span", "layout": { "width": 20, "height": 8 }, "appearance": { "background": "accent", "radius": "sm" } }, + { "id": "setup-progress-d3", "el": "span", "layout": { "width": 8, "height": 8 }, "appearance": { "background": "muted", "radius": "sm" } }, + { "id": "setup-progress-d4", "el": "span", "layout": { "width": 8, "height": 8 }, "appearance": { "background": "muted", "radius": "sm" } } + ] + } + }, + { + "name": "ProviderArtwork", + "note": "Non-interactive provider tile from Controls/ProviderArtwork.xaml. Native size is 42x42: a 24x24 content grid, 8px padding and a 1px border on each side. The Border explicitly requests Dark, binding SolidBackgroundFillColorBaseBrush and CardStrokeColorDefaultBrush even on light pages. The scalable SVG preserves those bounds and 4px outer corners when SetupOptionCard displays it through the native 32x32 Viewbox. The 24px Fluent fallback glyph is representative, not provider branding; image loading stays native.", + "root": { + "id": "provider-artwork-root", + "el": "svg", + "attrs": { "viewBox": "0 0 42 42", "aria-hidden": "true", "focusable": "false" }, + "layout": { + "width": 42, + "height": 42 + }, + "children": [ + { + "id": "provider-artwork-backplate", + "el": "rect", + "attrs": { + "x": 0.5, "y": 0.5, "width": 41, "height": 41, "rx": 3.5, + "fill": "var(--color-providerArtworkFill)", + "stroke": "var(--color-providerArtworkStroke)", + "stroke-width": 1 + } + }, + { + "id": "provider-artwork-glyph", + "el": "text", + "attrs": { "x": 21, "y": 21, "text-anchor": "middle", "dominant-baseline": "central", "fill": "currentColor" }, + "appearance": { "textStyle": "providerSymbol", "color": "providerArtworkText" }, + "children": [ "\uE99A" ] + } + ] + } + }, + { + "name": "SetupOptionCard", + "note": "One-row provider group derived from AiSetupPage.xaml at 0131e4ce1f7937b22c69b289564087061687fa14. The outer Border owns CardBackgroundFillColorDefaultBrush, a 1px CardStrokeColorDefaultBrush stroke and 8px corners. Inherited SettingsCardPadding is 16 on all sides. A 32px ProviderArtwork Viewbox precedes the Body Strong/Caption stack by 12px; stack spacing is 4px. Body action text precedes a 13px chevron with 14px margin. By design, the catalog interaction matches CapabilityOptionRow: subtleHover/subtlePressed fill, sm corners and the shared renderer transition. The outer border and bottom divider remain setupCardStroke in every state. Pointer exit restores transparency without layout changes or tinting child text/artwork. This intentionally differs from the stock CompactChoice square corners, SettingsCard state brushes and 83ms transition; native min/max sizes and adaptive reflow remain port notes. This row is an action, not a selected ListViewItem.", + "props": { + "title": "Sign in with GitHub", + "detail": "Use your Copilot subscription. No API key needed.", + "action": "Sign in" + }, + "root": { + "id": "setup-option-root", + "el": "div", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { + "background": "setupCardFill", + "borderColor": "setupCardStroke", + "borderWidth": 1, + "radius": "md" + }, + "children": [ + { + "id": "setup-option-action", + "el": "button", + "attrs": { "type": "button", "aria-label": "{title}" }, + "layout": { + "mode": "horizontal", + "padding": "4", + "align": "center", + "width": "fill" + }, + "appearance": { + "background": "$none", + "borderWidth": 0, + "radius": "sm", + "textAlign": "left" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" }, + "disabled": { "color": "disabledText", "background": "setupOptionDisabled" } + }, + "children": [ + { + "id": "setup-option-art-slot", + "el": "span", + "layout": { "mode": "horizontal", "width": 32, "height": 32 }, + "margin": { "right": "3" }, + "children": [ + { "id": "setup-option-art", "component": "ProviderArtwork", "layout": { "width": 32, "height": 32 } } + ] + }, + { + "id": "setup-option-text", + "el": "div", + "layout": { "mode": "vertical", "gap": "1", "grow": true }, + "children": [ + { "id": "setup-option-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "bodyStrong", "color": "nativeText" }, "children": [ "{title}" ] }, + { "id": "setup-option-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "{detail}" ] } + ] + }, + { + "id": "setup-option-action-label", + "el": "span", + "layout": { "mode": "horizontal", "width": "hug" }, + "margin": { "left": "3" }, + "appearance": { "textStyle": "body", "color": "nativeText" }, + "children": [ "{action}" ] + }, + { + "id": "setup-option-chevron", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "margin": { "left": "infoIconGap" }, + "appearance": { "textStyle": "setupActionIcon", "color": "nativeText" }, + "children": [ "\uE76C" ] + } + ] + }, + { + "id": "setup-option-divider", + "el": "div", + "attrs": { "aria-hidden": "true" }, + "layout": { "height": 1, "width": "fill" }, + "appearance": { "background": "setupCardStroke" } + } + ] + } + }, + { + "name": "CapabilityOptionRow", + "note": "CapabilitiesPage.xaml Balanced profile in a one-row group. The group owns the alpha-preserving CardBackgroundFillColorDefaultBrush backplate, 1px CardStrokeColorDefaultBrush border and 8px corners. Its transparent row has exact 16,12 padding. Body Strong title and the shared BadgeAccent sit together on the first line, 8px apart and vertically centered; Caption detail follows 4px below. Nested instances clear the standalone backplate so their enclosing group paints it once. Subtle hover/pressed are preview approximations; native ListView selection, focus and high-contrast template states remain native behavior.", + "props": { + "title": "Balanced", + "detail": "Commands, Canvas, screen capture and voice." + }, + "root": { + "id": "capability-row-root", + "el": "div", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { "background": "setupCardFill", "borderColor": "setupCardStroke", "borderWidth": 1, "radius": "md" }, + "children": [ + { + "id": "capability-row-action", + "el": "button", + "attrs": { "type": "button", "aria-label": "{title}: {detail}" }, + "layout": { + "mode": "vertical", + "gap": "1", + "padding": { "x": "4", "y": "3" }, + "align": "start", + "width": "fill" + }, + "appearance": { + "background": "$none", + "borderWidth": 0, + "radius": "sm", + "textAlign": "left" + }, + "control": { + "chrome": "none", + "focus": { "kind": "outline", "color": "accent" } + }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { + "id": "capability-row-heading", + "el": "div", + "layout": { "mode": "horizontal", "gap": "2", "align": "center", "width": "hug" }, + "children": [ + { "id": "capability-row-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "bodyStrong", "color": "nativeText" }, "children": [ "{title}" ] }, + { "id": "capability-row-badge", "component": "BadgeAccent" } + ] + }, + { "id": "capability-row-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "{detail}" ] } + ] + } + ] + } + }, + { + "name": "SetupPhaseStatus", + "note": "Setup control. The inline phase result row (Controls/SetupPhaseStatus.xaml). Non-interactive. A horizontal row, token `2` (8px) gap, pairing a status indicator with `caption` text (max width 160px) in `muted`. Running shows a 20x20 ProgressRing; Complete shows the Segoe Fluent StatusOk check (U+E73E) in `positive` (SystemFillColorSuccess); Failed shows StatusErr (U+EA39) in `critical` (SystemFillColorCritical); Cancelled shows Exit (U+E711) in `muted`. Previewed in the Complete state.", + "props": { + "children": "Gateway connected" + }, + "root": { + "id": "setup-phase-root", + "el": "div", + "attrs": { "role": "status" }, + "layout": { "mode": "horizontal", "gap": "2", "align": "center" }, + "children": [ + { + "id": "setup-phase-glyph", + "el": "span", + "attrs": { + "aria-hidden": "true", + "style": "font-family:'Segoe Fluent Icons','Segoe MDL2 Assets',sans-serif;font-size:16px" + }, + "appearance": { "color": "positive" }, + "children": [ "\uE73E" ] + }, + { + "id": "setup-phase-text", + "el": "span", + "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, + "children": [ "{children}" ] + } + ] + } + }, + { + "name": "SetupWizardShell", + "note": "Illustrative onboarding frame composed from shared controls, not an executable wizard. The capability group follows CapabilitiesPage.xaml: one setupCardFill backplate with a 1px setupCardStroke border and md corners behind transparent rows. The grouped preview has one straight, full-width 1px setupCardStroke separator between options, with no spacing or rounded ends. Balanced reuses CapabilityOptionRow with its standalone group paint cleared; Open has no recommended badge. Native 40,4,40,24 page padding is represented by chatGutter/1/5. The footer retains shared Button and SetupProgressIndicator instances; navigation, native minimum sizes and mascot behavior remain outside this preview.", + "root": { + "id": "setup-wizard-root", + "el": "section", + "layout": { + "mode": "vertical", + "gap": "5", + "padding": { "left": "chatGutter", "right": "chatGutter", "top": "1", "bottom": "5" }, + "width": "fill" + }, + "appearance": { "background": "paper" }, + "children": [ + { + "id": "setup-wizard-header", + "el": "div", + "layout": { "mode": "vertical", "gap": "1", "align": "center" }, + "children": [ + { "id": "setup-wizard-title", "el": "h1", "appearance": { "fontFamily": "display", "textStyle": "title", "color": "ink", "textAlign": "center" }, "children": [ "Set up your Windows node" ] }, + { "id": "setup-wizard-status", "el": "p", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted", "textAlign": "center" }, "children": [ "Step 2 of 4 · Choose capabilities" ] } + ] + }, + { + "id": "setup-wizard-card", + "el": "div", + "layout": { "mode": "vertical", "gap": "2", "width": "fill" }, + "children": [ + { "id": "setup-wizard-card-title", "el": "h2", "appearance": { "fontFamily": "display", "textStyle": "subtitle", "color": "ink" }, "children": [ "Choose what this node can do" ] }, + { + "id": "setup-wizard-option-group", + "el": "div", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { "background": "setupCardFill", "borderColor": "setupCardStroke", "borderWidth": 1, "radius": "md" }, + "children": [ + { + "id": "setup-wizard-opt-1", + "component": "CapabilityOptionRow", + "appearance": { "background": "$none", "borderColor": "$none", "borderWidth": 0, "radius": "$none" } + }, + { + "id": "setup-wizard-option-divider", + "el": "div", + "attrs": { "aria-hidden": "true" }, + "layout": { "width": "fill", "height": 1 }, + "appearance": { "background": "setupCardStroke", "radius": "$none" } + }, + { + "id": "setup-wizard-opt-2", + "el": "button", + "attrs": { "type": "button" }, + "layout": { "mode": "vertical", "gap": "1", "padding": { "x": "4", "y": "3" }, "width": "fill", "align": "start" }, + "appearance": { "background": "$none", "borderWidth": 0, "radius": "sm", "textAlign": "left" }, + "control": { "chrome": "none", "focus": { "kind": "outline", "color": "accent" } }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { "id": "setup-wizard-open-title", "el": "span", "appearance": { "textStyle": "bodyStrong", "color": "nativeText" }, "children": [ "Open" ] }, + { "id": "setup-wizard-open-detail", "el": "span", "appearance": { "textStyle": "caption", "color": "muted" }, "children": [ "All eight capabilities, including Camera, Location and Browser control." ] } + ] + } + ] + } + ] + }, + { + "id": "setup-wizard-footer", + "el": "div", + "layout": { "mode": "horizontal", "gap": "2", "align": "center", "justify": "space-between", "width": "fill" }, + "children": [ + { "id": "setup-wizard-back", "component": "ButtonStandard", "props": { "children": "Back" }, "layout": { "width": 100 } }, + { "id": "setup-wizard-progress", "component": "SetupProgressIndicator" }, + { "id": "setup-wizard-next", "component": "Button", "props": { "children": "Continue" }, "layout": { "width": 100 } } + ] + } + ] + } + }, + { + "name": "SettingsSectionHeader", + "note": "Settings control. The group label above a stack of settings cards (used across SettingsPage / PermissionsPage / SandboxPage), including General in SettingsWindowShell. Non-interactive. `bodyStrong` BodyStrongTextBlockStyle in `ink` gives the heading semibold weight without changing its 14px size or 20px line height, with margin 4,18,4,4 (previewed as token `1` sides, `4` top, `1` bottom; the 18px top is off-grid and a port note).", + "props": { "children": "Permissions" }, + "root": { + "id": "settings-section-header-root", + "el": "h2", + "margin": { "top": "4", "right": "1", "bottom": "1", "left": "1" }, + "appearance": { "fontFamily": "body", "textStyle": "bodyStrong", "color": "ink" }, + "children": [ "{children}" ] + } + }, + { + "name": "SettingsCard", + "note": "Settings composite derived from SettingsPage.xaml's hand-rolled Border, with iconless Windows Settings alignment. The outer frame paints CardBackgroundFillColorDefaultBrush once, with a 1px CardStrokeColorDefaultBrush border and md (8px) corners. The passive row has 16px padding, no leading icon or reserved gutter, and a growing left-aligned Body/Caption column with no title/detail gap and a 24px trailing margin. Only the normal Change button has hover/pressed states or a keyboard stop. The row and backplate stay unchanged under the pointer. The two-line sample is content-sized at 68px inside its 1px frame, not a fixed height.", + "props": { + "title": "Startup", + "detail": "Launch OpenClaw when you sign in to Windows." + }, + "root": { + "id": "settings-card-root", + "el": "div", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { "background": "setupCardFill", "borderColor": "setupCardStroke", "borderWidth": 1, "radius": "md" }, + "children": [ + { + "id": "settings-card-row", + "el": "div", + "layout": { "mode": "horizontal", "gap": "0", "padding": "4", "align": "center", "width": "fill" }, + "appearance": { "background": "$none", "textAlign": "left" }, + "children": [ + { + "id": "settings-card-text", + "el": "div", + "layout": { "mode": "vertical", "gap": "0", "grow": true }, + "margin": { "right": "5" }, + "children": [ + { "id": "settings-card-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "body", "color": "ink" }, "children": [ "{title}" ] }, + { "id": "settings-card-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "{detail}" ] } + ] + }, + { "id": "settings-card-action", "component": "ButtonStandard", "props": { "children": "Change" } } + ] + } + ] + } + }, + { + "name": "SettingsToggleRow", + "note": "Settings composite with the same single setupCardFill backplate, 1px setupCardStroke border and md corners as SettingsCard. The passive row has 16px padding and no icon gutter. Its left-aligned Body/Caption column has no title/detail gap and a 24px trailing margin. Only the shared ToggleSwitch has hover/pressed states, changes checked state, or participates in keyboard navigation. Its native 40x20 track is centered in a 36px-high compact control slot. The two-line sample is 68px inside its frame. SettingsExpanderRow reuses ToggleSwitch directly in its own item layout, not this padded standalone card. Shipping behavior is unchanged.", + "props": { + "title": "Run at startup", + "detail": "Start the OpenClaw tray automatically." + }, + "root": { + "id": "settings-toggle-root", + "el": "div", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { "background": "setupCardFill", "borderColor": "setupCardStroke", "borderWidth": 1, "radius": "md" }, + "children": [ + { + "id": "settings-toggle-row", + "el": "div", + "layout": { "mode": "horizontal", "gap": "0", "padding": "4", "align": "center", "width": "fill" }, + "appearance": { "background": "$none", "textAlign": "left" }, + "children": [ + { + "id": "settings-toggle-text", + "el": "div", + "layout": { "mode": "vertical", "gap": "0", "grow": true }, + "margin": { "right": "5" }, + "children": [ + { "id": "settings-toggle-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "body", "color": "ink" }, "children": [ "{title}" ] }, + { "id": "settings-toggle-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "{detail}" ] } + ] + }, + { + "id": "settings-toggle-control", + "el": "div", + "layout": { "mode": "horizontal", "align": "center", "justify": "center", "width": 40, "height": 36 }, + "children": [ + { "id": "settings-toggle-switch", "component": "ToggleSwitch", "props": { "label": "{title}" } } + ] + } + ] + } + ] + } + }, + { + "name": "SettingsExpanderRow", + "note": "Settings composite based on Community Toolkit SettingsExpander/SettingsCard at 34a57f969bf7966e0a3cbe9d4d10a47758d097a0, adapted to the requested iconless Windows Settings alignment. The entire header is one disclosure target with subtleHover/subtlePressed feedback, click/Enter/Space activation and browser-native expanded accessibility. The child row remains passive except for its shared ToggleSwitch. Native details/summary keeps each instance independent, preserves child switch state, and removes collapsed content from layout and keyboard navigation without shrinking focusable children to zero. Starts expanded. Header and child have a 16px left inset, 16px vertical padding, zero title/detail gap, a 24px trailing text margin, Body 20px and Caption 16px line heights: both shown rows are content-sized at 68px. The flex summary removes the browser triangle and RTL workaround. Header padding is 16,16,4,16; the trailing 32x32 slot has 8px right margin and a centered 16px Segoe Fluent ChevronDown glyph. This decorative span is part of the same header target, not a second button. The glyph retains the original fixed downward direction; state-linked direction and animation remain unimplemented. Child padding is 16,16,44,16, with the shared 40x20 switch centered in a 36px slot; no wrapper padding. WinUI Expander.xaml at 09cfc8ff3fbf556166dd813ae9b81646716f54bf animates downward opening from negative measured content height to zero over 333ms (0,0,0,1), and closing back over 167ms (1,1,0,1) before collapsing visibility. Its clipped translation and AnimatedChevronUpDownSmallVisualSource need additional disclosure support beyond the installed Colophon toggle transitions, so this preview opens/closes immediately. Native animation, system motion preferences, minimums and adaptive reflow remain port requirements. Application code is unchanged.", + "props": { + "title": "Advanced sandbox", + "detail": "Fine-tune the command execution sandbox." + }, + "root": { + "id": "settings-expander-root", + "el": "details", + "attrs": { "open": "" }, + "layout": { "mode": "none", "width": "fill" }, + "appearance": { "background": "setupCardFill", "borderColor": "setupCardStroke", "borderWidth": 1, "radius": "md" }, + "children": [ + { + "id": "settings-expander-header", + "el": "summary", + "attrs": { "role": "button", "tabindex": "0", "aria-label": "{title}" }, + "layout": { "mode": "horizontal", "gap": "0", "padding": { "left": "4", "top": "4", "right": "1", "bottom": "4" }, "align": "center", "width": "fill" }, + "appearance": { "background": "$none", "borderWidth": 0, "radius": "md", "color": "ink", "textAlign": "left" }, + "states": { + "hover": { "background": "subtleHover" }, + "pressed": { "background": "subtlePressed" }, + "hoverPressed": { "background": "subtlePressed" } + }, + "children": [ + { + "id": "settings-expander-header-card", + "el": "span", + "layout": { "mode": "vertical", "padding": "0", "grow": true }, + "children": [ + { + "id": "settings-expander-text", + "el": "span", + "layout": { "mode": "vertical", "gap": "0" }, + "margin": { "right": "5" }, + "appearance": { "textAlign": "left" }, + "children": [ + { "id": "settings-expander-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "body", "color": "ink" }, "children": [ "{title}" ] }, + { "id": "settings-expander-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "{detail}" ] } + ] + } + ] + }, + { + "id": "settings-expander-chevron-slot", + "el": "span", + "attrs": { "aria-hidden": "true" }, + "layout": { "mode": "horizontal", "align": "center", "justify": "center", "width": 32, "height": 32 }, + "margin": { "right": "2" }, + "children": [ + { + "id": "settings-expander-chevron", + "el": "span", + "appearance": { "textStyle": "chatIcon", "color": "ink" }, + "children": [ "\uE70D" ] + } + ] + } + ] + }, + { + "id": "settings-expander-divider", + "el": "div", + "attrs": { "aria-hidden": "true" }, + "layout": { "height": 1, "width": "fill" }, + "appearance": { "background": "setupCardStroke" } + }, + { + "id": "settings-expander-content", + "el": "div", + "layout": { "mode": "vertical", "gap": "0", "padding": "0", "width": "fill" }, + "children": [ + { + "id": "settings-expander-child", + "el": "div", + "layout": { "mode": "horizontal", "gap": "0", "padding": { "left": "4", "top": "4", "right": "settingsItemEnd", "bottom": "4" }, "align": "center", "width": "fill" }, + "appearance": { "background": "$none", "borderWidth": 0, "textAlign": "left" }, + "children": [ + { + "id": "settings-expander-item-text", + "el": "div", + "layout": { "mode": "vertical", "gap": "0", "grow": true }, + "margin": { "right": "5" }, + "children": [ + { "id": "settings-expander-item-title", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "body", "color": "ink" }, "children": [ "Allow network access" ] }, + { "id": "settings-expander-item-detail", "el": "span", "appearance": { "fontFamily": "body", "textStyle": "caption", "color": "muted" }, "children": [ "Let sandboxed commands reach the network." ] } + ] + }, + { + "id": "settings-expander-item-control", + "el": "div", + "layout": { "mode": "horizontal", "align": "center", "justify": "center", "width": 40, "height": 36 }, + "children": [ + { "id": "settings-expander-item-switch", "component": "ToggleSwitch", "props": { "label": "Allow network access" } } + ] + } + ] + } + ] + } + ] + } + }, + { + "name": "SettingsWindowShell", + "note": "Settings composite, shown as a content-only window sample per user direction: no left navigation pane or hidden navigation keyboard stops. The full-width content column has 24px padding and a 4px card gap matching the supplied Windows Settings reference. General uses the shared semibold SettingsSectionHeader. SettingsToggleRow remains passive around its switch; SettingsExpanderRow has one actionable header and independently interactive expanded content. All settings text shares the iconless 16px left inset. Production Windows/HubWindow.xaml remains unchanged, including its NavigationView, MinWidth 1000, Mica backdrop, title bar, 900px maximum content width and bottom status/toolbar; this sample does not claim to reproduce the complete native window.", + "root": { + "id": "settings-window-root", + "el": "section", + "layout": { "mode": "vertical", "width": "fill" }, + "appearance": { "background": "paper" }, + "children": [ + { + "id": "settings-window-content", + "el": "div", + "layout": { "mode": "vertical", "gap": "1", "padding": "5", "grow": true, "width": "fill" }, + "children": [ + { "id": "settings-window-section", "component": "SettingsSectionHeader", "props": { "children": "General" } }, + { "id": "settings-window-row-1", "component": "SettingsToggleRow" }, + { "id": "settings-window-row-2", "component": "SettingsExpanderRow" } + ] + } + ] + } + } + ] +} diff --git a/.agents/design/reference/chat-comparison.png b/.agents/design/reference/chat-comparison.png new file mode 100644 index 000000000..dbc0c6b30 Binary files /dev/null and b/.agents/design/reference/chat-comparison.png differ diff --git a/.agents/design/reference/notification-native-empty.png b/.agents/design/reference/notification-native-empty.png new file mode 100644 index 000000000..41a31da9f Binary files /dev/null and b/.agents/design/reference/notification-native-empty.png differ diff --git a/AGENTS.md b/AGENTS.md index 30ceea095..2d37daea5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -189,3 +189,27 @@ Important current facts: Use `--max-priority P3` with the shared autoreview helper to preserve this repository's existing P0–P3 review gate. Follow the [shared skill setup](.agents/skills/autoreview/SKILL.md) before running it. + + +## Design system + +This repository has a living design system at [`DESIGN.md`](DESIGN.md). These files are the **source of truth for design** - tokens, component intent, and principles - and are framework-agnostic. `components.jsonc` shows design intent for preview; it is **not** shipping code. +**Read it before creating or changing any UI.** To ship, port the design into this app's implementation using the port target(s) below - don't copy `components.jsonc` verbatim. + +- `DESIGN.md` - design tokens and rationale: brand, colors, typography, spacing, radii, shadows, principles. +- `.agents/design/components.jsonc` - the component patterns to reuse (structure, variants, states). + +Generate UI from these tokens and patterns: use token names (e.g. `accent`, `ink`, spacing step `4`, radius `md`), not raw hex or ad-hoc px; reuse the documented components instead of inventing new ones; honor the brand voice; and avoid the system's listed anti-references. If you need a value the system doesn't cover, add it to `DESIGN.md` rather than hard-coding a one-off. + +Use the **Colophon** tool/canvas to inspect, edit, and preview this system when available. Install the optional plugin with `copilot plugin install karkarl/colophon`. Without the extension, read and edit the files directly; Colophon is not required. + +**Port targets** - how a design becomes shipping code here (design stays the source of truth; these say what each surface ships as and which reference/skill to port it with): +- Default: ships as Native WinUI 3 / C# (Windows Fluent) - port via https://github.com/microsoft/win-dev-skills (helper agent: win-dev-skills) +- area "chat", components ChatBubble, ChatComposer, ChatThread: ships as Reactor (Microsoft.UI.Reactor) - port via https://github.com/microsoft/microsoft-ui-reactor (no helper agent yet) +- Canonical implementation owner: OpenClaw Windows (openclaw/openclaw-windows-node) +- Examples kept aligned via: Tokens are captured by manual inspection of the app's WinUI 3 XAML/C# Fluent resources; re-inspect and update this file when the app's ThemeResource mappings or SystemAccentColor usage change. + +Colors in `DESIGN.md` are **preview-only** swatches. When a color has a `resource` (e.g. a WinUI `ThemeResource` key), bind that resource in code - never hard-code the preview hex - so light, dark, and high-contrast themes stay correct. The shipping implementation is canonical; treat `components.jsonc` and the token values as derived visual examples, not a parallel upstream source. + +Managed by [Colophon](https://github.com/karkarl/colophon) - edit `DESIGN.md` to change the system; this block only points to it. + diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 000000000..5b805d389 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,1200 @@ +--- +version: alpha +name: Windows Fluent UI for OpenClaw +description: Windows Fluent UI for OpenClaw is the design system for OpenClaw's native Windows companion suite, a WinUI 3 system-tray app that connects your PC to OpenClaw, the AI-powered personal assistant. The app pairs your PC to an OpenClaw gateway, exposes allowlisted Windows node capabilities over MCP, and guides first-run pairing through a setup wizard. Its interface follows Windows Fluent design conventions (Mica surfaces, the user's system accent, and Segoe UI Variable type) so it feels like a quiet, native extension of the OS rather than a bolted-on dashboard. +colors: + ink: "#1b1b1b" + paper: "#f3f3f3" + surface: "#fbfbfb" + muted: "#5d5d5d" + line: "#e5e5e5" + accent: "#0067c0" + accentInk: "#ffffff" + accentText: "#003e92" + setupCardFill: "#ffffffb3" + setupCardStroke: "#0000000f" + flyoutFill: "#f9f9f9" + flyoutStroke: "#0000000f" + nativeSecondary: "#0000009e" + nativeTertiary: "#00000072" + notificationBadgeFill: "#fff4ce" + setupOptionDisabled: "#f9f9f94d" + providerArtworkFill: "#202020" + providerArtworkStroke: "#00000019" + providerArtworkText: "#ffffff" + positive: "#0f7b0f" + warning: "#9d5d00" + critical: "#c42b1c" + subtleHover: rgba(0,0,0,0.037) + subtlePressed: rgba(0,0,0,0.024) + buttonFill: "#ffffffb3" + buttonHoverFill: "#f9f9f980" + buttonPressedFill: "#f9f9f94d" + buttonDisabledFill: "#f9f9f94d" + buttonText: "#000000e4" + buttonHoverText: "#000000e4" + buttonPressedText: "#0000009e" + buttonDisabledText: "#0000005c" + buttonBorder: "#0000000f" + buttonHoverBorder: "#0000000f" + buttonPressedBorder: "#0000000f" + buttonDisabledBorder: "#0000000f" + buttonAccentBorder: "#ffffff14" + buttonAccentPressedBorder: "#ffffff00" + buttonAccentDisabledBorder: "#ffffff00" + buttonAccentPressedText: "#ffffffb3" + subtleButtonFill: "#ffffff00" + subtleButtonHoverFill: "#00000009" + subtleButtonPressedFill: "#00000006" + subtleButtonText: "#000000e4" + subtleButtonHoverText: "#000000e4" + subtleButtonPressedText: "#0000009e" + subtleButtonDisabledText: "#0000005c" + subtleButtonBorder: "#ffffff00" + subtleButtonHoverBorder: "#ffffff00" + subtleButtonPressedBorder: "#ffffff00" + control: "#ffffff" + controlHover: rgba(249,249,249,0.502) + controlDisabled: rgba(249,249,249,0.302) + disabledText: rgba(0,0,0,0.361) + controlLine: "#ececec" + accentSubtle: "#1a75c7" + chatLayer: "#ffffff80" + chatCanvas: "#ffffff00" + chatSurface: "#ffffffb3" + chatStroke: "#0000000f" + chatText: "#000000e4" + chatSecondary: "#0000009e" + chatReadAloudText: rgba(0,0,0,0.43372549) + chatUser: rgba(0,103,192,0.08) + chatUserText: "#000000e4" + chatActionDisabled: "#00000037" + chatActionDisabledText: "#ffffff" + chatActionHover: "#0067c0e6" + chatActionPressed: "#0067c0cc" + chatActionPressedText: "#ffffffb3" + chatReadAloudPressed: "#f9f9f94d" + nativeText: "#000000e4" + personPictureFill: "#00000018" + personPictureStroke: "#0000000f" + toggleOffFill: "#00000006" + toggleOffHoverFill: "#0000000f" + toggleOffPressedFill: "#00000018" + toggleOffDisabledFill: "#ffffff00" + toggleOffStroke: "#00000072" + toggleOffHotStroke: "#00000072" + toggleDisabledStroke: "#00000037" + toggleOnHoverFill: "#0067c0e6" + toggleOnPressedFill: "#0067c0cc" + toggleOnDisabledFill: "#00000037" + toggleOnStroke: "#ffffff00" + toggleOnHotStroke: "#ffffff00" + toggleOnDisabledStroke: "#ffffff00" + toggleOffKnob: "#0000009e" + toggleOffHotKnob: "#0000009e" + toggleOnHotKnob: "#ffffff" + toggleOnDisabledKnob: "#ffffff" + infoErrorFill: "#fde7e9" + infoWarningFill: "#fff4ce" + infoSuccessFill: "#dff6dd" + infoAttentionFill: "#f6f6f680" + infoErrorIcon: "#c42b1c" + infoWarningIcon: "#9d5d00" + infoSuccessIcon: "#0f7b0f" + infoAttentionIcon: "#0078d4" + infoIconForeground: "#ffffff" + infoBorder: "#0000000f" + infoCloseHoverFill: "#00000009" + infoClosePressedFill: "#00000006" + infoCloseHoverText: "#000000e4" + infoClosePressedText: "#0000009e" +typography: + display: + fontFamily: '"Segoe UI Variable Display", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 68px + fontWeight: 600 + lineHeight: 92px + titleLarge: + fontFamily: '"Segoe UI Variable Display", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 40px + fontWeight: 600 + lineHeight: 52px + title: + fontFamily: '"Segoe UI Variable Display", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 28px + fontWeight: 600 + lineHeight: 36px + subtitle: + fontFamily: '"Segoe UI Variable Display", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 20px + fontWeight: 600 + lineHeight: 28px + bodyLargeStrong: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 18px + fontWeight: 600 + lineHeight: 24px + bodyLarge: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 18px + fontWeight: 400 + lineHeight: 24px + bodyStrong: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 14px + fontWeight: 600 + lineHeight: 20px + body: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 14px + fontWeight: 400 + lineHeight: 20px + caption: + fontFamily: '"Segoe UI Variable Small", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 12px + fontWeight: 400 + lineHeight: 16px + small: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 13px + fontWeight: 400 + lineHeight: 18px + personInitials: + fontFamily: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 40.32px + fontWeight: 600 + lineHeight: 1 + personSymbol: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 40.32px + fontWeight: 600 + lineHeight: 1 + infoSymbol: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 16px + fontWeight: 400 + lineHeight: 16px + chatProse: + fontFamily: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 14px + fontWeight: 400 + lineHeight: 21px + chatInput: + fontFamily: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 16px + fontWeight: 400 + lineHeight: 22px + chatPicker: + fontFamily: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 13px + fontWeight: 400 + lineHeight: 18px + chatFooter: + fontFamily: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 12px + fontWeight: 400 + lineHeight: 18px + chatIcon: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 16px + fontWeight: 400 + lineHeight: 16px + chatActionIcon: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 14px + fontWeight: 400 + lineHeight: 14px + chatChevron: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 12px + fontWeight: 400 + lineHeight: 12px + workspaceTitle: + fontFamily: '"Segoe UI Variable Text", "Segoe UI Variable", "Segoe UI", system-ui, sans-serif' + fontSize: 12px + fontWeight: 400 + lineHeight: 16px + workspacePerson: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 10.08px + fontWeight: 400 + lineHeight: 1 + workspaceCaption: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 10px + fontWeight: 400 + lineHeight: 10px + workspacePlaceholder: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 48px + fontWeight: 400 + lineHeight: 48px + providerSymbol: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 24px + fontWeight: 400 + lineHeight: 24px + setupActionIcon: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 13px + fontWeight: 400 + lineHeight: 13px + notificationDismissIcon: + fontFamily: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + fontSize: 11px + fontWeight: 400 + lineHeight: 11px +spacing: + "0": 0px + half: 2px + "1": 4px + "2": 8px + "3": 12px + "4": 16px + "5": 24px + "6": 32px + "7": 48px + "8": 64px + textControlLeft: 10px + textControlTop: 5px + textControlEnd: 6px + buttonHorizontal: 11px + buttonTop: 5px + buttonBottom: 6px + infoTextTop: 14px + infoIconGap: 14px + chatGutter: 40px + workspaceSelectorEnd: 28px + settingsItemEnd: 44px + flyoutTop: 15px + flyoutBottom: 17px + flyoutShadowBottom: 18px + notificationEmpty: 20px + notificationTextGap: 3px + notificationBadgeX: 7px + notificationBadgeY: 1px +rounded: + sm: 4px + md: 8px + lg: 12px + bubble: 12px + composer: 20px + pill: 999px + workspaceContent: 8px 0 0 0 + notificationBadge: 10px +x-colophon: + version: 1 + tokens: + $schema: https://agents.design/schema/v1 + pages: + - id: setup + name: Setup + description: Onboarding controls and wizard compositions. + content: Production reference from OpenClaw.SetupEngine.UI. Basic controls remain in Components; these previews compose those shared definitions. + components: + - SetupProgressIndicator + - ProviderArtwork + - SetupOptionCard + - CapabilityOptionRow + - SetupPhaseStatus + - SetupWizardShell + - id: chat + name: Chat + description: Chat messages, composer controls, and conversation composition. + content: Production reference for Reactor chat. Workspace identity controls and flyouts live in Settings; shared building blocks remain in Components. + components: + - ComposerPicker + - ComposerPickerOptions + - ChatBubble + - ChatUserBubble + - ChatComposer + - ChatThread + - ChatCopyButton + - id: settings + name: Settings + description: Settings patterns, workspace chrome, identity controls, and flyouts. + content: References from OpenClaw.Tray.WinUI settings pages, HubWindow, and the Home and Sessions workspace. Iconless settings rows share the setup backplate and 16px left text inset. Ordinary rows and expanded children stay passive around their trailing actions; the entire expander header has hover/pressed feedback and immediate browser-native expand/collapse. Native WinUI animation remains a port requirement. The Settings shell sample has no left pane. Shared building blocks remain in Components. + components: + - SettingsSectionHeader + - SettingsCard + - SettingsToggleRow + - SettingsExpanderRow + - SettingsWindowShell + - NotificationFlyout + - NotificationFlyoutEmpty + - ConnectionStatusFlyout + - WorkspaceShell + - AgentIdentityBadge + - UserIdentityBadge + - id: components + name: Components + components: + - Button + - ButtonStandard + - TextBox + - Field + - Card + - Badge + - BadgeAccent + - SubtleButton + - HyperlinkButton + - ToggleSwitch + - StatusDot + - Avatar + - AvatarStates + - InfoBar + - InfoBarStates + meta: + version: 1 + updatedBy: xaml+manual + note: These tokens are the source of truth for DESIGN (brand, color, type, spacing, principles) and are framework-agnostic, and components.jsx shows design intent for the canvas preview, not shipping code. They were captured by manual inspection of the repo's WinUI 3 / XAML and C# surfaces (the CSS/JSX scanner finds no files in a XAML repo) and map to Windows Fluent system resources (SystemAccentColor, Mica, Segoe UI Variable). To ship, port the design into native code via the port targets in `authority`. Edit in the Design System canvas or directly. + authority: + designSource: self + owner: OpenClaw Windows (openclaw/openclaw-windows-node) + syncProcess: Tokens are captured by manual inspection of the app's WinUI 3 XAML/C# Fluent resources; re-inspect and update this file when the app's ThemeResource mappings or SystemAccentColor usage change. + tooling: + name: winapp (WinAppCli) + source: https://github.com/microsoft/WinAppCli + role: The Windows App Development CLI is the single build/packaging tool for both port targets below. Both the WinUI 3 (XAML) shell and the Reactor chat surface now build, package, and generate app identity, manifests, and certificates through winapp, so treat it as the port authority's build toolchain. + port: + authoritySource: Native WinUI 3 / C# (Windows Fluent) + syncSource: https://github.com/microsoft/win-dev-skills + toolingSource: https://github.com/microsoft/WinAppCli + helperAgent: win-dev-skills + portOverrides: + - area: chat + components: + - ChatBubble + - ChatComposer + - ChatThread + authoritySource: Reactor (Microsoft.UI.Reactor) + syncSource: https://github.com/microsoft/microsoft-ui-reactor + toolingSource: https://github.com/microsoft/WinAppCli + helperAgent: "" + shadows: + - name: sm + value: 0 1px 2px rgba(0,0,0,0.10) + - name: md + value: 0 4px 16px rgba(0,0,0,0.12) + - name: lg + value: 0 12px 40px rgba(0,0,0,0.16) + - name: flyout + value: 0 8px 16px rgba(0,0,0,0.14) + principles: + - Defer to Windows. Theme off SystemAccentColor and Fluent resources so the app follows the user's accent, light/dark, and high-contrast choices. + - One accent, and it means "act here". Selection, focus, and primary actions share the system accent; don't spend it on decoration. + - Hierarchy over decoration. Size, weight, and space do the work before color does. + - "State must be legible: connected, pairing, and error states read clearly via positive/warning/critical, never color alone." + - No hard-coded hex in UI. Use tokens/theme resources so dark and high-contrast modes stay correct. + - "Motion is a cue, not a garnish: 120-200ms ease-out, no bounce." + brand: + tagline: A calm native Windows companion for your AI assistant. + surface: product + voice: Clear, respectful, and native to Windows. Explain pairing, permissions, and security plainly. State what will happen and why; never alarmist, never hype. + personality: + - native + - trustworthy + - calm + - precise + antiReferences: + - custom-skinned controls that fight the OS theme + - neon gradients and glassmorphism overload + - ignoring the user's system accent or light/dark preference + - cramming a web dashboard into a desktop window + - hard-coded hex that breaks in dark or high-contrast mode + colors: + ink: + resource: TextFillColorPrimaryBrush + themes: + dark: "#ffffff" + highContrast: "#ffffff" + usage: Primary text, headings. Fluent TextFillColorPrimary on light. + paper: + resource: ApplicationPageBackgroundThemeBrush + themes: + dark: "#202020" + highContrast: "#000000" + usage: App / page background. Mica base / ApplicationPageBackground (light). + surface: + resource: CardBackgroundFillColorDefaultBrush + themes: + dark: "#2b2b2b" + highContrast: "#000000" + usage: Cards, flyouts, inputs. Fluent CardBackgroundFillColorDefault. + flyoutFill: + resource: FlyoutPresenterBackground + themes: + dark: "#2c2c2c" + highContrast: "#000000" + usage: Native AcrylicInAppFillColorDefaultBrush fallback, not a card fill. Light fallback F9F9F9 and dark fallback 2C2C2C come from AcrylicBrush_themeresources.xaml. Browser preview does not reproduce backdrop blur or acrylic noise. + flyoutStroke: + resource: FlyoutBorderThemeBrush + themes: + dark: "#00000033" + highContrast: "#ffffff" + usage: SurfaceStrokeColorFlyoutBrush in light/dark; SystemColorWindowTextColorBrush in high contrast. Preserve alpha rather than using the generic line swatch. + nativeSecondary: + resource: TextFillColorSecondaryBrush + themes: + dark: "#ffffffc5" + highContrast: "#ffffff" + usage: Alpha-preserving secondary native text for notification details and metadata. + nativeTertiary: + resource: TextFillColorTertiaryBrush + themes: + dark: "#ffffff87" + highContrast: "#ffffff" + usage: Alpha-preserving tertiary native text for the active notification count. + notificationBadgeFill: + resource: SystemFillColorCautionBackgroundBrush + themes: + dark: "#433519" + highContrast: "#000000" + usage: Recurrence-count background, not the caution foreground color or a generic status pill. + muted: + resource: TextFillColorSecondaryBrush + themes: + dark: "#c8c8c8" + highContrast: "#ffffff" + usage: Secondary text, captions. Fluent TextFillColorSecondary/Tertiary. + line: + resource: CardStrokeColorDefaultBrush + themes: + dark: "#303030" + highContrast: "#ffffff" + usage: Borders, dividers. Fluent CardStrokeColorDefault / DividerStroke. + accent: + resource: AccentFillColorDefaultBrush + themes: + dark: "#4cc2ff" + highContrast: "#ffff00" + usage: Primary actions, links, selection, focus. Follows SystemAccentColor (default AccentDark1 on light). + accentInk: + resource: TextOnAccentFillColorPrimaryBrush + themes: + dark: "#000000" + highContrast: "#000000" + usage: Text/glyphs on accent fills. + accentText: + resource: AccentTextFillColorPrimaryBrush + themes: { dark: "#99ebff", highContrast: "#ffffff" } + usage: Outlined accent badge text and border. Native SystemAccentColorDark2 in light, Light3 in dark, and SystemColorWindowTextColor in high contrast; not AccentFillColorDefaultBrush. + setupCardFill: + resource: CardBackgroundFillColorDefaultBrush + themes: { dark: "#ffffff0d", highContrast: "#000000" } + usage: Shared alpha-preserving backplate for setup choice groups and settings cards. Paint once behind transparent rows, not on every nested row. + setupCardStroke: + resource: CardStrokeColorDefaultBrush + themes: { dark: "#00000019", highContrast: "#ffffff" } + usage: Native 1px setup/settings frame border and dividers. Unlike the generic line swatch, preserves native alpha. + setupOptionDisabled: + resource: SettingsCardBackgroundDisabled + themes: { dark: "#ffffff0b", highContrast: "#000000" } + usage: Disabled provider row uses ControlFillColorDisabledBrush; high contrast uses SystemControlBackgroundBaseLowBrush. + providerArtworkFill: + resource: SolidBackgroundFillColorBaseBrush + themes: { dark: "#202020", highContrast: "#000000" } + usage: ProviderArtwork explicitly requests Dark, even in a light setup page. High contrast still follows SystemColorWindowColor. + providerArtworkStroke: + resource: CardStrokeColorDefaultBrush + themes: { dark: "#00000019", highContrast: "#ffffff" } + usage: ProviderArtwork requested-Dark tile border; high contrast follows SystemColorWindowTextColor. + providerArtworkText: + resource: TextFillColorPrimaryBrush + themes: { dark: "#ffffff", highContrast: "#ffffff" } + usage: Representative provider fallback glyph in the tile's requested Dark theme. + positive: + resource: SystemFillColorSuccessBrush + themes: + dark: "#6ccb5f" + highContrast: "#3ff23f" + usage: Success / connected states. Fluent SystemFillColorSuccess. + warning: + resource: SystemFillColorCautionBrush + themes: + dark: "#fcd116" + highContrast: "#ffb000" + usage: Warnings / attention. Fluent SystemFillColorCaution. + critical: + resource: SystemFillColorCriticalBrush + themes: + dark: "#ff99a4" + highContrast: "#ff5449" + usage: Errors, disconnected, destructive. Fluent SystemFillColorCritical. + subtleHover: + resource: SubtleFillColorSecondaryBrush + themes: + dark: rgba(255,255,255,0.0605) + highContrast: transparent + usage: "Hover fill for subtle/transparent controls (icon buttons, inline pickers). Fluent SubtleFillColorSecondary (light #09000000)." + subtlePressed: + resource: SubtleFillColorTertiaryBrush + themes: + dark: rgba(255,255,255,0.0419) + highContrast: transparent + usage: "Pressed fill for subtle/transparent controls. Fluent SubtleFillColorTertiary (light #06000000)." + buttonFill: + resource: ButtonBackground + themes: { dark: "#ffffff0f", highContrast: "#000000" } + usage: Normal Button fill with native ControlFillColorDefault alpha, not the opaque stock-input preview. + buttonHoverFill: + resource: ButtonBackgroundPointerOver + themes: { dark: "#ffffff15", highContrast: "#000000" } + usage: ControlFillColorSecondaryBrush; high contrast uses SystemColorHighlightTextColorBrush. + buttonPressedFill: + resource: ButtonBackgroundPressed + themes: { dark: "#ffffff08", highContrast: "#000000" } + usage: ControlFillColorTertiaryBrush; high contrast uses SystemColorHighlightTextColorBrush. + buttonDisabledFill: + resource: ButtonBackgroundDisabled + themes: { dark: "#ffffff0b", highContrast: "#000000" } + usage: ControlFillColorDisabledBrush; high contrast uses SystemControlBackgroundBaseLowBrush. + buttonText: + resource: ButtonForeground + themes: { dark: "#ffffff", highContrast: "#ffffff" } + usage: TextFillColorPrimaryBrush; high contrast uses SystemColorButtonTextColor. + buttonHoverText: + resource: ButtonForegroundPointerOver + themes: { dark: "#ffffff", highContrast: "#ffff00" } + usage: TextFillColorPrimaryBrush; high contrast SystemControlHighlightBaseHighBrush resolves to SystemColorHighlightColor. + buttonPressedText: + resource: ButtonForegroundPressed + themes: { dark: "#ffffffc5", highContrast: "#ffff00" } + usage: TextFillColorSecondaryBrush; high contrast uses SystemColorHighlightColor. + buttonDisabledText: + resource: ButtonForegroundDisabled + themes: { dark: "#ffffff5d", highContrast: "#808080" } + usage: TextFillColorDisabledBrush; high contrast uses SystemColorGrayTextColor. + buttonBorder: + resource: ButtonBorderBrush + themes: { dark: "#ffffff12", highContrast: "#ffffff" } + usage: Preview-only default stroke swatch for native ControlElevationBorderBrush, not a reproduction of its 3px absolute gradient. High contrast SystemControlForegroundTransparentBrush is solid SystemColorButtonTextColor, despite its name. + buttonHoverBorder: + resource: ButtonBorderBrushPointerOver + themes: { dark: "#ffffff12", highContrast: "#ffff00" } + usage: Same native elevation gradient as rest; high contrast changes to SystemColorHighlightColor. + buttonPressedBorder: + resource: ButtonBorderBrushPressed + themes: { dark: "#ffffff12", highContrast: "#000000" } + usage: Native flat ControlStrokeColorDefaultBrush; high contrast uses SystemColorHighlightTextColor. + buttonDisabledBorder: + resource: ButtonBorderBrushDisabled + themes: { dark: "#ffffff12", highContrast: "#808080" } + usage: ControlStrokeColorDefaultBrush; high contrast SystemControlDisabledTransparentBrush is solid SystemColorGrayTextColor. + buttonAccentBorder: + resource: AccentButtonBorderBrush + themes: { dark: "#ffffff14", highContrast: "#ffff00" } + usage: Preview-only default on-accent stroke swatch for native AccentControlElevationBorderBrush. Pointer-over uses the same gradient; both high-contrast aliases resolve to SystemColorHighlightColor. + buttonAccentPressedBorder: + resource: AccentButtonBorderBrushPressed + themes: { dark: "#ffffff00", highContrast: "#ffff00" } + usage: Transparent in light/dark; high contrast SystemControlHighlightTransparentBrush resolves to SystemColorHighlightColor. + buttonAccentDisabledBorder: + resource: AccentButtonBorderBrushDisabled + themes: { dark: "#ffffff00", highContrast: "#808080" } + usage: Transparent in light/dark; high contrast uses SystemColorGrayTextColor. + buttonAccentPressedText: + resource: AccentButtonForegroundPressed + themes: { dark: "#00000080", highContrast: "#ffff00" } + usage: TextOnAccentFillColorSecondaryBrush; high contrast SystemControlHighlightBaseHighBrush resolves to SystemColorHighlightColor. + subtleButtonFill: + resource: SubtleButtonBackground + themes: + dark: "#ffffff00" + highContrast: "#000000" + usage: Native SubtleButton rest and disabled fill. SubtleButtonBackgroundDisabled resolves to the same brush in every theme. + subtleButtonHoverFill: + resource: SubtleButtonBackgroundPointerOver + themes: + dark: "#ffffff0f" + highContrast: "#000000" + usage: Native SubtleButton pointer-over fill; high contrast binds SystemColorHighlightTextColorBrush. + subtleButtonPressedFill: + resource: SubtleButtonBackgroundPressed + themes: + dark: "#ffffff0a" + highContrast: "#000000" + usage: Native SubtleButton pressed fill; high contrast binds SystemColorHighlightTextColorBrush. + subtleButtonText: + resource: SubtleButtonForeground + themes: + dark: "#ffffff" + highContrast: "#ffffff" + usage: Native SubtleButton rest foreground; high contrast binds SystemColorButtonTextColorBrush. + subtleButtonHoverText: + resource: SubtleButtonForegroundPointerOver + themes: + dark: "#ffffff" + highContrast: "#ffffff" + usage: Native SubtleButton pointer-over foreground; high contrast binds SystemControlHighlightBaseHighBrush. + subtleButtonPressedText: + resource: SubtleButtonForegroundPressed + themes: + dark: "#ffffffc5" + highContrast: "#ffffff" + usage: Native SubtleButton pressed foreground uses TextFillColorSecondaryBrush, not the normal foreground. + subtleButtonDisabledText: + resource: SubtleButtonForegroundDisabled + themes: + dark: "#ffffff5d" + highContrast: "#808080" + usage: Native SubtleButton disabled foreground uses TextFillColorDisabledBrush, not muted text. + subtleButtonBorder: + resource: SubtleButtonBorderBrush + themes: + dark: "#ffffff00" + highContrast: "#ffffff00" + usage: Transparent 1px native border retained in layout. SubtleButtonBorderBrushDisabled is also transparent in every theme. + subtleButtonHoverBorder: + resource: SubtleButtonBorderBrushPointerOver + themes: + dark: "#ffffff00" + highContrast: "#ffff00" + usage: Preview-only transparent border in light/dark avoids painting the translucent hover fill twice at the edge. Native WinUI uses the matching subtle-fill brush with InnerBorderEdge clipping. High contrast retains SystemColorHighlightColorBrush. + subtleButtonPressedBorder: + resource: SubtleButtonBorderBrushPressed + themes: + dark: "#ffffff00" + highContrast: "#000000" + usage: Preview-only transparent border in light/dark avoids painting the translucent pressed fill twice at the edge. Native WinUI uses the matching subtle-fill brush with InnerBorderEdge clipping. High contrast retains SystemColorHighlightTextColorBrush. + control: + resource: ControlFillColorDefaultBrush + themes: + dark: "#2d2d2d" + highContrast: "#000000" + usage: Fill for stock input controls. The chat writing surface instead uses chatSurface and its inner editor is transparent. + controlLine: + resource: ControlStrokeColorDefaultBrush + themes: + dark: "#353535" + highContrast: "#ffffff" + usage: Border for stock input controls. Chat uses its alpha-preserving chatStroke; PersonPicture uses personPictureStroke. + controlHover: + resource: ControlFillColorSecondaryBrush + themes: + dark: rgba(255,255,255,0.0824) + highContrast: "#000000" + usage: TextBox pointer-over fill. In high contrast the native resource follows SystemColorButtonFaceColor. + controlDisabled: + resource: ControlFillColorDisabledBrush + themes: + dark: rgba(255,255,255,0.0431) + highContrast: "#000000" + usage: Disabled input fill. In high contrast the native resource follows SystemColorButtonFaceColor. + disabledText: + resource: TextFillColorDisabledBrush + themes: + dark: rgba(255,255,255,0.365) + highContrast: "#808080" + usage: Disabled input text. In high contrast the native resource follows SystemColorGrayTextColor. + accentSubtle: + resource: AccentFillColorSecondaryBrush + themes: + dark: "#47b6ef" + highContrast: "#ffff00" + usage: Standard secondary accent fill retained for compatibility. Do not use it for chat bubbles; chatUser preserves the actual translucent ChatUserBrush. + chatLayer: + resource: NavigationViewContentBackground + themes: { dark: "#3a3a3a4c", highContrast: "#000000" } + usage: One LayerFillColorDefaultBrush content layer above Mica. Do not paint it again inside nested chat components. + chatCanvas: + resource: ChatCanvasBrush + themes: { dark: "#ffffff00", highContrast: "#000000" } + chatSurface: + resource: ChatComposerBrush + themes: { dark: "#ffffff0d", highContrast: "#000000" } + usage: CardBackgroundFillColorDefault with native alpha preserved. ChatCardBrush has the same values. Composite over the content layer, not the input-control fill. + chatStroke: + resource: ChatStrokeBrush + themes: { dark: "#ffffff12", highContrast: "#ffffff" } + chatText: + resource: ChatTextBrush + themes: { dark: "#ffffff", highContrast: "#ffffff" } + chatSecondary: + resource: ChatSecondaryTextBrush + themes: { dark: "#ffffffc5", highContrast: "#ffffff" } + chatReadAloudText: + resource: ChatSecondaryTextBrush + themes: { dark: "rgba(255,255,255,0.54078431)", highContrast: "rgba(255,255,255,0.7)" } + usage: Preview of the native Read aloud button at 70% opacity. Native code applies opacity to the control, not a separate brush. Pointer-over uses full chatSecondary; row-level hover is not expressible in this renderer. + chatUser: + resource: ChatUserBrush + themes: { dark: "rgba(76,194,255,0.12)", highContrast: "#ffff00" } + usage: SystemAccentColorDark1 at 8% in light, SystemAccentColorLight2 at 12% in dark, system highlight in HC. These preview swatches use the Windows blue accent, not an opaque AccentFillColorSecondary substitute. + chatUserText: + resource: ChatUserTextBrush + themes: { dark: "#ffffff", highContrast: "#000000" } + chatActionDisabled: + resource: AccentButtonBackgroundDisabled + themes: { dark: "#ffffff28", highContrast: "#000000" } + chatActionDisabledText: + resource: AccentButtonForegroundDisabled + themes: { dark: "#ffffff87", highContrast: "#808080" } + chatActionHover: + resource: AccentButtonBackgroundPointerOver + themes: { dark: "#4cc2ffe6", highContrast: "#ffff00" } + chatActionPressed: + resource: AccentButtonBackgroundPressed + themes: { dark: "#4cc2ffcc", highContrast: "#000000" } + chatActionPressedText: + resource: AccentButtonForegroundPressed + themes: { dark: "#00000080", highContrast: "#ffffff" } + chatReadAloudPressed: + resource: ControlFillColorTertiaryBrush + themes: { dark: "#ffffff08", highContrast: "#000000" } + nativeText: + resource: TextFillColorPrimaryBrush + themes: { dark: "#ffffff", highContrast: "#ffffff" } + usage: Alpha-preserving native foreground for PersonPicture and InfoBar, including colored backgrounds. + personPictureFill: + resource: PersonPictureEllipseFillThemeBrush + themes: { dark: "#ffffff12", highContrast: "#000000" } + personPictureStroke: + resource: PersonPictureEllipseFillStrokeBrush + themes: { dark: "#00000019", highContrast: "#ffffff" } + toggleOffFill: + resource: ToggleSwitchFillOff + themes: { dark: "#00000019", highContrast: "#000000" } + toggleOffHoverFill: + resource: ToggleSwitchFillOffPointerOver + themes: { dark: "#ffffff0b", highContrast: "#000000" } + toggleOffPressedFill: + resource: ToggleSwitchFillOffPressed + themes: { dark: "#ffffff12", highContrast: "#000000" } + toggleOffDisabledFill: + resource: ToggleSwitchFillOffDisabled + themes: { dark: "#ffffff00", highContrast: "#000000" } + toggleOffStroke: + resource: ToggleSwitchStrokeOff + themes: { dark: "#ffffff8b", highContrast: "#ffffff" } + toggleOffHotStroke: + resource: ToggleSwitchStrokeOffPointerOver + themes: { dark: "#ffffff8b", highContrast: "#ffff00" } + usage: Pointer-over and pressed strokes share the same resource values. + toggleDisabledStroke: + resource: ToggleSwitchStrokeOffDisabled + themes: { dark: "#ffffff28", highContrast: "#808080" } + toggleOnHoverFill: + resource: ToggleSwitchFillOnPointerOver + themes: { dark: "#4cc2ffe6", highContrast: "#000000" } + toggleOnPressedFill: + resource: ToggleSwitchFillOnPressed + themes: { dark: "#4cc2ffcc", highContrast: "#000000" } + toggleOnDisabledFill: + resource: ToggleSwitchFillOnDisabled + themes: { dark: "#ffffff28", highContrast: "#000000" } + toggleOnStroke: + resource: ToggleSwitchStrokeOn + themes: { dark: "#ffffff00", highContrast: "#ffff00" } + usage: Transparent preview stroke models ToggleSwitchOnStrokeThickness=0 in light/dark; high contrast retains the native 1px stroke. + toggleOnHotStroke: + resource: ToggleSwitchStrokeOnPointerOver + themes: { dark: "#ffffff00", highContrast: "#ffffff" } + usage: Pointer-over and pressed preview strokes are transparent only where native stroke thickness is zero. + toggleOnDisabledStroke: + resource: ToggleSwitchStrokeOnDisabled + themes: { dark: "#ffffff00", highContrast: "#808080" } + usage: Disabled preview stroke is transparent only where native stroke thickness is zero. + toggleOffKnob: + resource: ToggleSwitchKnobFillOff + themes: { dark: "#ffffffc5", highContrast: "#ffffff" } + toggleOffHotKnob: + resource: ToggleSwitchKnobFillOffPointerOver + themes: { dark: "#ffffffc5", highContrast: "#ffff00" } + usage: Pointer-over and pressed knob fills share the same resource values. + toggleOnHotKnob: + resource: ToggleSwitchKnobFillOnPointerOver + themes: { dark: "#000000", highContrast: "#ffffff" } + usage: Pointer-over and pressed knob fills share the same resource values. + toggleOnDisabledKnob: + resource: ToggleSwitchKnobFillOnDisabled + themes: { dark: "#ffffff87", highContrast: "#808080" } + infoErrorFill: + resource: InfoBarErrorSeverityBackgroundBrush + themes: { dark: "#442726", highContrast: "#000000" } + infoWarningFill: + resource: InfoBarWarningSeverityBackgroundBrush + themes: { dark: "#433519", highContrast: "#000000" } + infoSuccessFill: + resource: InfoBarSuccessSeverityBackgroundBrush + themes: { dark: "#393d1b", highContrast: "#000000" } + infoAttentionFill: + resource: InfoBarInformationalSeverityBackgroundBrush + themes: { dark: "#ffffff08", highContrast: "#000000" } + infoErrorIcon: + resource: InfoBarErrorSeverityIconBackground + themes: { dark: "#ff99a4", highContrast: "#ffff00" } + infoWarningIcon: + resource: InfoBarWarningSeverityIconBackground + themes: { dark: "#fce100", highContrast: "#ffff00" } + infoSuccessIcon: + resource: InfoBarSuccessSeverityIconBackground + themes: { dark: "#6ccb5f", highContrast: "#ffff00" } + infoAttentionIcon: + resource: InfoBarInformationalSeverityIconBackground + themes: { dark: "#4cc2ff", highContrast: "#ffff00" } + infoIconForeground: + resource: InfoBarErrorSeverityIconForeground + themes: { dark: "#000000e4", highContrast: "#000000" } + usage: All four severity icon foreground aliases resolve to this same brush in each theme. + infoBorder: + resource: InfoBarBorderBrush + themes: { dark: "#00000019", highContrast: "#ffffff" } + infoCloseHoverFill: + resource: AppBarButtonBackgroundPointerOver + themes: { dark: "#ffffff0f", highContrast: "#ffff00" } + infoClosePressedFill: + resource: AppBarButtonBackgroundPressed + themes: { dark: "#ffffff0a", highContrast: "#ffff00" } + infoCloseHoverText: + resource: AppBarButtonForegroundPointerOver + themes: { dark: "#ffffff", highContrast: "#000000" } + infoClosePressedText: + resource: AppBarButtonForegroundPressed + themes: { dark: "#ffffffc5", highContrast: "#000000" } + typography: + display: + weights: + - 400 + - 600 + usage: Page and section titles. Segoe UI Variable Display optical size. + body: + weights: + - 400 + - 600 + usage: Body copy, UI labels, buttons. Segoe UI Variable Text optical size. + mono: + family: '"Cascadia Mono", "Cascadia Code", Consolas, "SFMono-Regular", monospace' + weights: + - 400 + usage: Commands, endpoints, tokens, logs, timestamps. Used heavily across setup and diagnostics surfaces. + icon: + family: '"Segoe Fluent Icons", "Segoe MDL2 Assets", sans-serif' + weights: + - 400 + usage: Fluent icon glyphs (checkmarks, chevrons, action glyphs). Ships as WinUI FontIcon/SymbolIcon on SymbolThemeFontFamily (Segoe Fluent Icons); e.g. the selection CheckMark is glyph U+E73E. Current chat aliases are ChatSubmit U+E74A (up), ChatAttach U+E723 (paperclip), VoiceAct U+E720 (microphone), ChevronDown U+E70D and Stop U+E71A. Not for body text. + scale: + display: + role: display + resource: DisplayTextBlockStyle + titleLarge: + role: display + resource: TitleLargeTextBlockStyle + title: + role: display + resource: TitleTextBlockStyle + subtitle: + role: display + resource: SubtitleTextBlockStyle + bodyLargeStrong: + role: body + resource: BodyLargeStrongTextBlockStyle + bodyLarge: + role: body + resource: BodyLargeTextBlockStyle + bodyStrong: + role: body + resource: BodyStrongTextBlockStyle + body: + role: body + resource: BodyTextBlockStyle + caption: + role: body + resource: CaptionTextBlockStyle + small: + role: body + usage: App-specific dense text at 13/18. Not a named WinUI TextBlock style. + personInitials: + role: body + usage: PersonPicture template text, not a TextBlock style. Default 96px diameter times 0.42, SemiBold; ContentControlThemeFontFamily. + personSymbol: + role: body + usage: PersonPicture Contact/People fallback glyph at the same 42% size; SymbolThemeFontFamily. + infoSymbol: + role: body + usage: InfoBarIconFontSize and InfoBarCloseButtonGlyphSize, both 16px; SymbolThemeFontFamily. + spacing: + unit: 4 +--- + +## Overview + +Windows Fluent UI for OpenClaw is the design system for OpenClaw's native Windows companion suite: a WinUI 3 system-tray app that connects your PC to OpenClaw, the AI-powered personal assistant. The app pairs your PC to an OpenClaw gateway, exposes allowlisted Windows node capabilities over MCP, and guides first-run pairing through a setup wizard. Its interface follows Windows Fluent design conventions (Mica surfaces, the user's system accent, and Segoe UI Variable type) so it feels like a quiet, native extension of the OS rather than a bolted-on dashboard. + + +Edit and preview this design with the **Colophon** canvas in the GitHub Copilot app. +Install the optional plugin with `copilot plugin install karkarl/colophon`. +Agents without Colophon can read and edit this file directly. +[Colophon documentation](https://github.com/karkarl/colophon). + + +This file owns the design tokens and rationale. `x-colophon` preserves preview +themes, production resource mappings, and other Colophon-specific metadata. + +**The one-line brief.** A calm native Windows companion for your AI assistant. It should feel like a quiet, trustworthy extension of Windows (Fluent surfaces, the user's own accent color), not a web dashboard wearing a desktop window. + +Voice: Clear, respectful, and native to Windows. Explain pairing, permissions, and security plainly. State what will happen and why; never alarmist, never hype. No hype words ("supercharge", "seamless", "revolutionary", "effortless"). + +Personality: native, trustworthy, calm, precise. + +## Colors + +- **ink** {colors.ink}: Primary text, headings. Fluent TextFillColorPrimary on light. +- **paper** {colors.paper}: App / page background. Mica base / ApplicationPageBackground (light). +- **surface** {colors.surface}: Cards, flyouts, inputs. Fluent CardBackgroundFillColorDefault. +- **muted** {colors.muted}: Secondary text, captions. Fluent TextFillColorSecondary/Tertiary. +- **line** {colors.line}: Borders, dividers. Fluent CardStrokeColorDefault / DividerStroke. +- **accent** {colors.accent}: Primary actions, links, selection, focus. Follows SystemAccentColor (default AccentDark1 on light). +- **accentInk** {colors.accentInk}: Text/glyphs on accent fills. +- **accentText** {colors.accentText}: `AccentTextFillColorPrimaryBrush` for outlined accent badge text and border. It uses Dark2 in light and Light3 in dark, not the primary button fill palette. +- **Setup and settings cards:** {colors.setupCardFill} and {colors.setupCardStroke} preserve `CardBackgroundFillColorDefaultBrush` and `CardStrokeColorDefaultBrush`, including their alpha. The frame owns the single backplate and 1px border. Setup choice rows and actionable expander headers have separate hover/pressed layers; ordinary settings rows and expanded children stay static around their action controls. Existing token names are retained because both surfaces bind the same native resources. +- **positive** {colors.positive}: Success / connected states. Fluent SystemFillColorSuccess. +- **warning** {colors.warning}: Warnings / attention. Fluent SystemFillColorCaution. +- **critical** {colors.critical}: Errors, disconnected, destructive. Fluent SystemFillColorCritical. +- **subtleHover** {colors.subtleHover}: Hover fill for subtle/transparent controls (icon buttons, inline pickers). Fluent SubtleFillColorSecondary (light #09000000). +- **subtlePressed** {colors.subtlePressed}: Pressed fill for subtle/transparent controls. Fluent SubtleFillColorTertiary (light #06000000). +- **SubtleButton states:** {colors.subtleButtonFill}, {colors.subtleButtonHoverFill}, {colors.subtleButtonPressedFill}, {colors.subtleButtonText}, {colors.subtleButtonHoverText}, {colors.subtleButtonPressedText}, {colors.subtleButtonDisabledText}, {colors.subtleButtonBorder}, {colors.subtleButtonHoverBorder}, and {colors.subtleButtonPressedBorder} bind the control-specific `SubtleButton*` resources. Fill and text alpha bytes come directly from WinUI. Hover/pressed borders are transparent only in the light/dark browser preview, where the background already covers the border area; painting the same translucent color twice would create an incorrect dark outline. Native resource bindings remain unchanged. Separate border and foreground roles preserve the native high-contrast overrides; the displayed high-contrast swatches represent this preview's black/white/yellow scheme, not fixed system colors. +- **control** {colors.control}: Stock input-control fill. The chat writing surface uses `chatSurface`, not this resource; its inner editor stays transparent. +- **controlHover** {colors.controlHover}: TextBox pointer-over fill, mapped to `ControlFillColorSecondaryBrush`. +- **controlDisabled** {colors.controlDisabled}: Disabled input fill, mapped to `ControlFillColorDisabledBrush`. +- **disabledText** {colors.disabledText}: Disabled input text, mapped to `TextFillColorDisabledBrush`. +- **controlLine** {colors.controlLine}: Border for stock input controls. Chat uses its alpha-preserving `chatStroke`; PersonPicture uses `personPictureStroke`. +- **accentSubtle** {colors.accentSubtle}: Standard secondary accent fill retained for compatibility, not the chat bubble fill. +- **Chat surfaces:** `chatLayer` maps the single native content layer; `chatCanvas` stays transparent outside HC; `chatSurface` and `chatStroke` retain the actual card and stroke alpha. `chatUser` is SystemAccentColorDark1 at 8% in light and SystemAccentColorLight2 at 12% in dark, with full system highlight in HC. `chatUserText` is primary text, not white-on-accent in light mode. `chatText` and `chatSecondary` also retain native alpha. Preview accent swatches use the Windows blue accent; native bindings follow the user's system palette. + +Colors are preview swatches only. Bind each color's mapped `resource` key (in `x-colophon.tokens.colors`) rather than the hex, so light, dark, and high-contrast themes stay correct. Never put gray text on a colored background. + +## Typography + +The reference follows the nine text styles in the WinUI Gallery Typography page. Sizes and line heights are effective pixels (epx), equivalent to XAML device-independent units; Colophon previews them as CSS pixels. Regular is weight 400 and SemiBold is weight 600. Bind the named WinUI `TextBlock` style in native XAML, for example `Style="{StaticResource BodyTextBlockStyle}"`, rather than recreating it with individual setters. + +| Style | Token | Segoe UI Variable optical size / weight | Size / line height | WinUI resource | +| --- | --- | --- | --- | --- | +| Caption | {typography.caption} | Small, Regular | 12 / 16 | `CaptionTextBlockStyle` | +| Body | {typography.body} | Text, Regular | 14 / 20 | `BodyTextBlockStyle` | +| Body Strong | {typography.bodyStrong} | Text, SemiBold | 14 / 20 | `BodyStrongTextBlockStyle` | +| Body Large | {typography.bodyLarge} | Text, Regular | 18 / 24 | `BodyLargeTextBlockStyle` | +| Body Large Strong | {typography.bodyLargeStrong} | Text, SemiBold | 18 / 24 | `BodyLargeStrongTextBlockStyle` | +| Subtitle | {typography.subtitle} | Display, SemiBold | 20 / 28 | `SubtitleTextBlockStyle` | +| Title | {typography.title} | Display, SemiBold | 28 / 36 | `TitleTextBlockStyle` | +| Title Large | {typography.titleLarge} | Display, SemiBold | 40 / 52 | `TitleLargeTextBlockStyle` | +| Display | {typography.display} | Display, SemiBold | 68 / 92 | `DisplayTextBlockStyle` | + +Resource mappings are also recorded on `x-colophon.tokens.typography.scale` for inspection. `subtitle` replaces the former `heading` token. The former 40px `display` sample is now correctly named `titleLarge`, with a 52px line height; `display` is the 68px style. Keep standard tracking rather than applying custom negative letter spacing. + +**App-specific extension:** {typography.small} remains 13/18, Text Regular, for existing dense controls. It is not one of the named WinUI Gallery styles and has no invented resource mapping. + +Use Segoe UI Variable for text and Cascadia Mono (`x-colophon.tokens.typography.mono`) for commands, endpoints, tokens, and logs. Fluent icon glyphs use Segoe Fluent Icons (`x-colophon.tokens.typography.icon`); for example, the selection checkmark is glyph U+E73E, and the chat toolbar uses ChatSubmit (U+E74A), ChatAttach (U+E723, paperclip), VoiceAct (U+E720), ChevronDown (U+E70D), and Stop (U+E71A). + +Chat-local typography follows production rather than substituting the named Gallery styles: `chatProse` is 14/21, `chatInput` is 16px with a 22px browser line box, `chatPicker` is 13/18, and `chatFooter` is 12/18. Native text uses maximum-height line stacking and layout rounding. `chatIcon`, `chatActionIcon` and `chatChevron` are actual Segoe Fluent glyphs at 16, 14 and 12px respectively, not generic SVG approximations. + +## Layout + +Use the named spacing tokens rather than ad-hoc values. Prefer the `5` and `6` steps between groups so content can breathe. One subject per screen: decide what the screen is for, and let that element win. + +The `textControlLeft` (10px), `textControlTop` (5px), and `textControlEnd` (6px) tokens preserve WinUI's `TextControlThemePadding` of 10,5,6,6 without rounding it to the general spacing grid. + +The `buttonHorizontal` (11px), `buttonTop` (5px), and `buttonBottom` (6px) tokens preserve WinUI's `ButtonPadding` of 11,5,11,6 (left, top, right, bottom). These are content padding inside the separately retained 1px button border, not a fixed square hit target. + +## Information hierarchy + +1. **One subject per screen.** Decide what the screen is for and let that element win. +2. **Size and weight before color.** Establish the hierarchy in grayscale first; color is the last 10%. +3. **One accent.** `accent` means "act here" (selection, focus, primary action). If everything is accented, nothing is. +4. **Generous vertical rhythm.** Prefer the `5` and `6` spacing steps between groups; let content breathe. + +## Elevation & Depth + +Use the named shadows in `x-colophon.tokens.shadows` when elevation is needed. Keep shadows soft and shallow; depth should read as Fluent layering, not drop-shadow decoration. + +## Shapes + +Use the `rounded` tokens for corner radii: `sm` for buttons and inputs, `md` for cards and flyouts, `lg` for grouped panels, `bubble` (12px) for the user chat bubble and code surfaces (assistant prose is bubbleless), `composer` (20px) for the chat writing surface, and `pill` for status badges and toggles. + +## Chat surface + +The chat transcript and composer ship via Reactor and follow the native chat visual system in [`docs/CHAT_VISUAL_DESIGN.md`](docs/CHAT_VISUAL_DESIGN.md). They align to the reading rhythm of the released web chat without replacing Windows chrome, native input, or gateway contracts. + +- **Semantic brushes.** Chat binds the chat-local resources in `Themes/ChatResources.xaml` (Default/Light/HighContrast), not raw palette hex: `ChatCanvasBrush` (transparent; system window in HC), `ChatComposerBrush` and `ChatCardBrush` (`CardBackgroundFillColorDefault`), `ChatStrokeBrush` (`ControlStrokeColorDefault`), `ChatTextBrush` (`TextFillColorPrimary`), `ChatSecondaryTextBrush` (`TextFillColorSecondary`, used for code text), `ChatUserBrush` (accent at low opacity for the user bubble), `ChatUserTextBrush` (`TextFillColorPrimary`), `ChatPickerAccentBrush` (accent variants for picker triggers), and `ChatCopySuccessBrush` (`SystemFillColorSuccess`). +- **Surface layering.** The Hub title bar and expanded navigation pane reveal Mica; `NavigationViewContentBackground` supplies one content layer (`LayerFillColorDefaultBrush`; system window in HC). The chat canvas is transparent so it neither hides nor doubles that layer, and the composer and code cards use the card fill above it. The standalone chat window uses the same Mica plus one content layer. +- **Geometry.** The reading column is capped at 768px with a 16px prose inset; outer gutters are 12px below 640px and 40px above. The avatar is omitted below 960px; wider native layouts reserve a 44px gutter on each side of the prose. The writing surface has a 20px radius, 1px border, 112px minimum height and 16,12,16,8 inner padding. Its 16px TextBox has no padding, a 44px minimum height and 200px maximum height. Native focus and hover keep the editor fill and border transparent, with no accent underline. Assistant prose is bubbleless at 14/21, with 4px vertical padding and 16px block gaps. User messages have 16,12 padding, 12px corners and a 720px maximum width. The 2px user-footer offset is an intentional native half-grid value. +- **Footer controls.** Workspace shows a leading paperclip and right-aligned model, effort, Voice and circular Send/Stop. Only standalone ChatWindow includes the session selector. Controls are 32px tall; icon targets are 32px square with 16px glyphs. Model/effort labels use 13px text, a 12px native chevron and 8,4 padding. Voice/Send have a 4px gap. The model flyout contains an AutoSuggestBox and grouped native list; effort uses a native discrete slider and changes to a 44px gauge trigger at widths <=560px. No fake session selector or separate speaker/settings actions belong in Workspace's composer. +- **Message actions.** Copy is a shared 32px control with a 14px Fluent glyph and 4px padding, not a 20px generic SVG button. The assistant footer includes sender, time, model and usage at 12/18. Read aloud is 70% opaque at rest and fully opaque when the row is hovered. Native copy confirmation announces Copied; the browser reference does not implement clipboard or speech. + +The chat reference was reconciled against production commit `9e4999c6d43f166437afa204a556bd8ee9dbfcb2`, including `ChatVisuals.cs`, `ReactorChatComposer.cs`, `ReactorChatTimeline.cs`, `ChatMarkdownPresentation.cs`, `ChatCopyButton.cs`, `FluentIconCatalog.cs` and `Themes/ChatResources.xaml`. A separately built ARM64 Release app ran against the isolated synthetic Gateway at 120 DPI; native screenshots and UI Automation bounds cover light/dark, empty/drafted input and the wide avatar breakpoint. This is fixture proof, not live Gateway/provider proof. + +The [120-DPI comparison](.agents/design/reference/chat-comparison.png) preserves the unmodified native and browser composer pixels at the same scale. Both writing surfaces are 960x140 physical pixels (768x112 effective pixels), with 40x40 action targets and a 55px input height. User-footer spacing includes 8px of stack space plus its 2px top margin. At capture time, schema/expansion checks covered all 38 definitions then present; focused chat geometry and action-state checks covered all three preview themes. This historical proof does not cover subsequently added examples. + +The Colophon catalog now uses the actual geometry, semantic alpha brushes and Fluent glyphs. It is **not a verified pixel-identical native renderer**: Mica is wallpaper/activation-dependent; this host's native UI Automation reports Segoe UI Variable while Chromium resolves the requested family to Segoe UI; and text rasterization/layout rounding differ. The installed schema also lacks responsive breakpoints, row-hover opacity, gradient elevation borders and native input/flyout behavior. Fixed-size references must not become production layout code. High-contrast preview swatches are resource simulations, not evidence of Windows HC mode. + +## Workspace shell + +The landing window is the native Home and Sessions workspace (`Windows/WorkspaceWindow.xaml`, shipped in #1541). The reference is reconciled against production commit `dc9f6345821075362580bd598cc32e4f2aa6a18a` and the supplied 125%-scale screenshot. It shows that screenshot's expanded, no-agent/no-session state, Owner / Error footer and one notification, not invented connected conversations. It is a Mica window with a 32px title bar, a 256px left `NavigationView` pane, and a content host that mounts the Reactor chat when connected. Settings remains an independent native companion window. + +- **Pane and toolbar.** The `NavigationViewExpandedPaneBackground` reveals Mica; there is no extra pane border or general 8px inset. PaneHeader margin is 4,8,4,8. The 40x40 pane button sits at x=4, y=8 below the title bar. Back/Forward align to the right of the same 40px toolbar with an 8px gap and the default SubtleButton padding, yielding 40px widths. Their disabled state represents empty navigation history. The selector sits 8px below the toolbar, with 4,8,28,8 padding and a trailing 12px U+E70D glyph. It shows No agents loaded until production has a roster; selected agents use `AgentIdentityBadge`. +- **Menu.** Home is a 36px row with 4px horizontal and 2px vertical outer margins, a 3x16 accent indicator and the original `Chat.svg` at 22px centered in a 24px column. The iconless native presenter reserves 8px before that column, followed by a 16px gap to Home. The Sessions header is 40px tall with 16px leading and 4px trailing insets, 14px semibold text, and a 40x36 add button. No conversations to show replaces session rows in the supplied state; add is disabled while disconnected. +- **Owner footer.** The PaneFooter uses 4,8,4,8 margins and a 4px column gap. The Owner button is the shared `UserIdentityBadge`, with native SubtleButton states, 8px padding and a retained 1px border, a 24px PersonPicture, 12px column spacing and a 10px status dot followed by a 4px gap and Caption text. `statusTone` follows connection state, never authorization. It reads the authenticated `users.self` profile or falls back to Owner. The notification button is 40x36 with 8px padding, vertically centered against Owner, containing the original 20px `Notifications.svg` and a 16px InfoBadge offset -6px above and 8px beyond the icon's right edge. +- **Connection status.** `Controls/GatewayStatusContent.xaml` is a 304px flyout of Gateway, Operator, and Node rows split by 1px `line` dividers, closing with an Open Connection link. Each row pairs a 10px status dot with a body-strong label over a caption `muted` detail, and reveals an `accent` action link (Reconnect, Approve) only when that layer needs one. The dot binds the Fluent system fill for its state: `positive` connected, `warning` attention, `critical` error, `muted` unknown, never color alone. +- **Notifications.** `NotificationFlyout` and `NotificationFlyoutEmpty` map the populated and empty states of `Controls/NotificationFlyoutContent.xaml`. They retain separate presenter and card layers, native alpha, and exact authored spacing. See the notification mapping below; the former generic `surface`/`line` shell and 12px presenter inset were incorrect. +- **Artwork and glyphs.** Pane, Back, Forward and Add use actual Segoe Fluent glyphs U+E90C, U+E76B, U+E76C and U+E710 at 16px, not hand-drawn SVG substitutes. Home and Notifications use exact production SVG bytes, including their authored gradients; these are artwork, not theme-color tokens. The title uses `BrandAssets.RedBotMarkUri` at 16px with a 16px gap before its 12px title. Native caption glyph references are U+E921, U+E922 and U+E8BB. The owner fallback uses PersonPicture's Contact glyph U+E77B at 24 * 0.42 = 10.08px. +- **Content.** One `NavigationViewContentBackground` layer uses `chatLayer`, with a 1px top/left `line` stroke and the native 8,0,0,0 corner shape (`workspaceContent`). The disconnected placeholder is centered: U+E8F2 at 48px, Subtitle text, and the standard 32px Open Connection button, separated by 12px gaps. + +Workspace button instances reuse SubtleButton's resource-bound states rather than a generic `muted` foreground. The added `workspaceTitle`, `workspacePerson` and `workspacePlaceholder` typography tokens preserve native title, PersonPicture and empty-state metrics. `workspaceSelectorEnd` records the 28px native selector padding. + +This is a production-structure and geometry reference, not a pixel-identity claim. The supplied screenshot's client is approximately 1266x852 effective pixels; the preview uses that height and follows its available width. Mica's wallpaper tint, font rasterization, OS caption actions and native NavigationView interaction cannot be reproduced by this renderer. The pane button has hover/pressed/focus styling, but collapse/reopen remains a native action: production hides the pane entirely, shows a 56px ReopenPaneSlot, and transfers focus. Do not approximate that behavior by shrinking focusable children to zero width. The preview notification button opens the shared populated flyout; the empty reference is a separate Settings example. Neither reads live notifications. + +### Notification presenter and card mapping + +The [user-supplied native empty-state capture](.agents/design/reference/notification-native-empty.png) is the visual target, not a screenshot of this browser preview. Its approximately 482px outer width and 440px card width are consistent with native 386px and 352px widths at 125% scale. + +| Part | Native mapping retained in the preview | +| --- | --- | +| Presenter | `FlyoutPresenterBackground` (`AcrylicInAppFillColorDefaultBrush`), `FlyoutBorderThemeBrush`, 1px light/dark border, 8px `OverlayCornerRadius` | +| Presenter padding | 16,15,16,17, exactly `FlyoutContentPadding`; outer width 386 = 352 + 16 + 16 + 1 + 1 | +| Card fill and frame | Existing `setupCardFill` / `setupCardStroke`, which bind the same native card brushes. Light fill is white at B3/FF alpha, not opaque white or the generic `surface` swatch | +| Clear-all row | Margin 2,0,2,8; shared HyperlinkButton with native 4,0 content padding and a retained transparent 1px border | +| Populated card | Padding 12; vertical margin 4. Native ListView margin -4 and card margin +4 cancel horizontally, leaving a 352px-wide card | +| Populated columns | 16px native severity glyph, 11px column gaps, Body Strong title, Caption message/metadata, 3px text-stack gaps; native Cancel glyph U+E711 at 11px in a 30px dismiss target | +| Recurrence badge | Caution background, primary text, 10px radius, exact 7,1 padding; no generic warning foreground or pill padding | +| Empty card | Padding 20, vertical margin 4, left-aligned Body Strong title and Caption description separated by 6px | +| Empty header | The collapsed Clear all button leaves its parent Grid's 8px bottom margin; do not remove that spacer | +| Footer | Margin 2,8,2,0; shared Open notifications link and native tertiary count. Empty state has no count | + +The [native acrylic dictionary](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/Materials/Acrylic/AcrylicBrush_themeresources.xaml) defines the light fallback as F9F9F9 and dark fallback as 2C2C2C. Sampling the supplied screenshot's blank presenter area gives mainly 249-250 per channel; its white card is mainly 253-254. Compositing the native B3-alpha white card over F9F9F9 gives approximately 253, preserving the small native contrast without inventing another gray panel. + +The named `flyout` shadow uses an 8px downward offset, 16px CSS blur and 14% black as a light-preview reference. The [native popup's medium shadow clearance](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/dxaml/xcp/components/graphics/ThemeShadow.cpp) is 10,2,10,18; the preview reserves those same outside insets instead of the old 32px margin. These insets are separate from content padding. Colophon's portal still positions its entire scroll box, including clearance, rather than anchoring the presenter like WinUI. + +**Pixel identity remains unverified.** The flat fallback cannot reproduce acrylic noise/backdrop composition, Chromium text measurement/rasterization differs from WinUI, and a CSS shadow is not the native composition shadow (including its dark-theme recipe). The empty example is content-sized, not forced to a screenshot height. The native high-contrast presenter uses a 2px border, while this schema keeps the authored 1px border. The exact resource and authored geometry mappings above are not a substitute for a same-scale native/browser image comparison. Production keeps the stock [FlyoutPresenter](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/CommonStyles/FlyoutPresenter_themeresources.xaml) and system resources; no application or installed-plugin code is changed. + +## Components + +Reuse [component patterns](.agents/design/components.jsonc); these describe design intent, not shipping code. +Optional click-through flows live in `.agents/design/prototypes.jsonc`. + +The catalog is organized into four families through `x-colophon.tokens.pages` above. The entry with `id: components` selects the built-in Components page; Setup, Chat, and Settings select their feature-specific previews. Each of the 39 definitions has exactly one standalone page assignment: Components 15, Setup 6, Chat 7, and Settings 11. Page selections do not copy or remove definitions, so shared controls still resolve inside compositions and flyouts. Keep control examples and variants beside their basic control, not on another feature page. The old synthetic Connection example screen and separate RecommendedBadge definition have been removed. + +Every interactive control documents its hover and pressed states; static controls say so. States bind Fluent resources (`SubtleFillColorSecondary` for hover, `SubtleFillColorTertiary` for pressed, accent variants for primary actions), never raw hex. + +ComposerPickerOptions rows use full-row `subtleHover` and `subtlePressed` fills with `sm` corners, both in the catalog and in opened composer flyouts. Pointer exit restores transparency; hover never changes the checked row, accent checkmark or layout. These tokens stay transparent in high contrast, so the preview does not reproduce native MenuFlyout system-highlight overrides. + +- **Basic controls and their examples (15).** Button (accent), ButtonStandard (normal), SubtleButton (native default style), HyperlinkButton, TextBox, Field, Badge, BadgeAccent, ToggleSwitch, StatusDot, Avatar, AvatarStates, InfoBar, InfoBarStates, and Card. ButtonStandard references Button and overrides its state brushes, just as BadgeAccent references Badge; neither duplicates shared markup. TextBox is the reusable default WinUI single-line input. Field composes a label and TextBox; its Gateway address example passes the label and placeholder into that shared control. AvatarStates and InfoBarStates demonstrate their parent control's presentations, not separate app features. +- **Setup (6).** SetupProgressIndicator, ProviderArtwork, SetupOptionCard, CapabilityOptionRow, SetupPhaseStatus, and the SetupWizardShell frame, ported from `OpenClaw.SetupEngine.UI`. Recommended labels reuse BadgeAccent from Components. +- **Chat (7).** ChatBubble (assistant prose), ChatUserBubble (sent user message), ChatComposer, ChatThread, ComposerPicker, ComposerPickerOptions, and ChatCopyButton. See the Chat surface section. +- **Settings and workspace (11).** SettingsSectionHeader, SettingsCard, SettingsToggleRow, SettingsExpanderRow, and SettingsWindowShell, plus the native workspace identity controls (AgentIdentityBadge, UserIdentityBadge), ConnectionStatusFlyout, NotificationFlyout, NotificationFlyoutEmpty, and WorkspaceShell. These come from `OpenClaw.Tray.WinUI` pages, `HubWindow`, and `WorkspaceWindow`. See the Workspace shell section. + +TextBox ships as the stock `Microsoft.UI.Xaml.Controls.TextBox`, as used by `DirectUrlBox` in `Pages/ConnectionPage.xaml`, not a custom control template. The Colophon preview uses 14px body text, 32px single-line height, `sm` corners, exact text-control padding, pointer-over and disabled resource tokens, and the accent focus underline. WinUI has no separate pressed background for the input itself; pressing enters its focused state. The browser preview approximates the native elevation border with `controlLine` and does not reproduce the native focused-fill transition or clear-button template. + +Card binds its title to `subtitle` (`SubtitleTextBlockStyle`, 20/28 SemiBold) and its description to `body` (`BodyTextBlockStyle`, 14/20 Regular). Its Open report action references the shared HyperlinkButton, not a separately styled link. The card remains static while the action inherits the shared control's typography, hover, pressed, disabled, and focus states. + +### Native normal and accent buttons + +Button is the accent example; ButtonStandard is its reusable normal variation. Both appear on Components. SetupWizardShell uses ButtonStandard for Back and Button for Continue; SettingsCard also uses ButtonStandard for Change. The old `variant` prop was ineffective because a CSS class could not override explicit accent appearance and states. Named component references now select the actual brushes, without duplicating button markup. + +The [native Button styles](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/CommonStyles/Button_themeresources.xaml) own exact 11,5,11,6 padding, a 1px border, 4px corners, normal-weight 14px content and an 83ms linear background transition. Foreground and border changes are discrete, not part of a generic all-color transition. The normal variation binds `Button*` resource aliases for every state; accent reuses the existing `accent`, `accentInk` and `chatAction*` aliases where their native resource values match. Its pressed foreground and borders have dedicated `buttonAccent*` tokens. + +High-contrast aliases are resolved through the Windows SDK's system resource dictionary, not inferred from their names: `SystemControlForegroundTransparentBrush` becomes button text, `SystemControlHighlightBaseHighBrush` and `SystemControlHighlightTransparentBrush` become highlight, and `SystemControlDisabledTransparentBrush` becomes gray text. The preview uses its representative black/white/yellow system palette; it is not a Windows high-contrast screenshot. + +`Pages/CapabilitiesPage.xaml` at production commit `0131e4ce1f7937b22c69b289564087061687fa14` uses an unstyled normal Back button and an `AccentButtonStyle` Next button, each with `MinWidth=100`. The catalog preserves its existing Continue sample label and shows both footer instances at 100px. That fixed preview width represents these short labels only: shipping code must retain the native minimum and grow for localization. The shared button itself is content-sized, with no universal 100px minimum. + +These are direct native style/resource mappings, **not a verified pixel-identical browser port**. Colophon cannot express `ControlElevationBorderBrush` / `AccentControlElevationBorderBrush` gradients or the normal button's `BackgroundSizing=InnerBorderEdge`; their preview borders use flat default stroke swatches. Body uses a 20px browser line box, and native font measurement/rasterization and the system focus visual (`FocusVisualMargin=-3`) remain WinUI-owned. Ship the stock Button styles and templates, not the browser approximation. + +### Setup badge and choice cards + +These references follow production commit `0131e4ce1f7937b22c69b289564087061687fa14`: `Controls/RecommendedBadge.xaml`, `Controls/ProviderArtwork.xaml`, `Pages/AiSetupPage.xaml`, and `Pages/CapabilitiesPage.xaml`. The shipped SettingsControls package is `8.3.260402-preview2`, whose [SettingsCard template](https://github.com/CommunityToolkit/Windows/blob/39c45efed2601b22170b9f6258c9cbe7e51031d1/components/SettingsControls/src/SettingsCard/SettingsCard.xaml) owns inherited padding, action-icon metrics, and interaction resources. + +- **Accent badge:** BadgeAccent composes Badge with Caption typography, a transparent fill, 1px `accentText` border, `sm` corners, and exact 8,4 padding. Both text and border use `AccentTextFillColorPrimaryBrush`; disabled uses `TextFillColorDisabledBrush`. It is read-only and has no hover/pressed action. Recommended is example text, not a separate control or Setup-page preview. Existing status-pill Badge instances keep their existing geometry and tones. +- **Provider option:** the 8px-rounded group owns a 1px `setupCardStroke` border and `setupCardFill` backplate. The inner row is transparent at rest, with a bottom-only 1px divider and native MinHeight 64. Its preview uses `sm` corners to match CapabilityOptionRow, rather than the native `CompactChoice` square corners. Toolkit padding is 16 on all sides, not 16,12. Its 32px Viewbox contains the 42px ProviderArtwork tile (24px content + 8px padding + 1px border on each side); the title/detail stack sits 12px after the tile. Body Strong and Caption are separated by 4px. Trailing body action text precedes a 13px chevron with 14px leading margin. The artwork explicitly requests Dark, even on light pages; the representative glyph is not provider branding. +- **Capability option:** the same group backplate surrounds a transparent ListViewItem with 16,12 padding. Body Strong title and BadgeAccent share the first line with an 8px gap; Caption detail follows 4px below. A full-width right-aligned badge is not the production layout. Nested rows in SetupWizardShell clear their standalone group paint so the parent paints the backplate once. The grouped wizard example adds one straight, full-width 1px `setupCardStroke` separator between options, with no gap or rounded divider ends. + +The catalog deliberately gives SetupOptionCard the same hover/pressed treatment as CapabilityOptionRow: `subtleHover` / `subtlePressed`, `sm` corners, and the shared renderer transition. The outer border and bottom divider stay `setupCardStroke`, with no extra hover underline. Pointer exit restores transparency without changing layout or tinting text/artwork. This user-directed preview choice differs from the stock SettingsCard state brushes, gradient border and 83ms transition; it does not change shipping code. Native minimum sizes, the action label's 112px maximum width, SettingsCard adaptive reflow, ListView selection/focus visuals, and provider image loading remain native behavior. Both preview controls use transparent interaction fills in high contrast, rather than simulating native system-highlight states. + +### Settings cards and disclosure feedback + +SettingsCard, SettingsToggleRow and SettingsExpanderRow reuse the setup cards' `setupCardFill` backplate, 1px `setupCardStroke` border and `md` outer corners. These map to the actual `CardBackgroundFillColorDefaultBrush` / `CardStrokeColorDefaultBrush` pair used by the hand-rolled Borders in `Pages/SettingsPage.xaml`, rather than painting the page background on the card. No new palette or duplicate control definitions are needed. + +The supplied Windows Settings screenshot guides alignment and spacing, not a new set of icons. OpenClaw's examples are iconless: SettingsCard, SettingsToggleRow, the expander header and its children all start text 16px inside the frame. There is no leading icon, empty icon column, or 58px child indentation. Body titles and Caption descriptions are left-aligned with zero stack gap and a 24px margin before trailing controls. Standalone cards use 16px padding and a content-derived 68px inner height for the shown two-line labels (70px including the frame). The expander header and expanded child use the same 20px/16px text line heights and 16px top/bottom padding, so both two-line rows are equally tall. SettingsWindowShell uses a 4px gap between cards. Its General section heading uses `bodyStrong` (`BodyStrongTextBlockStyle`, 14/20 SemiBold), as do other shared SettingsSectionHeader instances. + +SettingsCard, SettingsToggleRow and the expanded child have **no row-wide hover or pressed states**. Their wrappers are plain, non-focusable containers; clicking text/background cannot activate Change or toggle a switch. The expander header is the exception: its entire surface is one disclosure target with `subtleHover` / `subtlePressed` feedback, not a passive row with a separate chevron button. Click, Enter and Space expand/collapse it. ToggleSwitch retains its independent state and keyboard activation behavior; clicking the expanded switch does not collapse the header. Setup choice-row feedback is unchanged. + +SettingsWindowShell is a content-only sample: the left navigation subtree is removed, not hidden or reduced to zero width. Its content fills the available width with 24px padding. This is a user-directed catalog change, not a change to the shipping HubWindow NavigationView or the separate WorkspaceShell. + +The expander group has one straight, full-width 1px divider and one backplate. The child uses the shared ToggleSwitch inside the adapted Toolkit item layout, not a padded standalone SettingsToggleRow inside another padded container. Standalone and expanded switches both center their 40x20 track in a 36px-high control slot. SettingsWindowShell references these same definitions. High-contrast previews retain the system-colored frame; they do not claim native Windows high-contrast proof. + +### Toolkit settings expander geometry + +SettingsExpanderRow uses Community Toolkit's [SettingsExpander template](https://github.com/CommunityToolkit/Windows/blob/34a57f969bf7966e0a3cbe9d4d10a47758d097a0/components/SettingsControls/src/SettingsExpander/SettingsExpander.xaml) and [SettingsCard template](https://github.com/CommunityToolkit/Windows/blob/34a57f969bf7966e0a3cbe9d4d10a47758d097a0/components/SettingsControls/src/SettingsCard/SettingsCard.xaml) as geometry references, with user-directed iconless alignment, equal two-line row spacing and full-header disclosure feedback. Production SandboxPage uses a stock WinUI Expander and intentionally does not use the Toolkit's item indentation. Application code remains unchanged. + +| Part | Preview value and Toolkit provenance | +| --- | --- | +| Header padding (left, top, right, bottom) | 16,16,4,16, matching native Toolkit SettingsCard | +| HeaderPanel margin | 0,0,24,0 | +| Title / description stack spacing | 0; Body 14/20 above Caption 12/16, both left-aligned | +| Disclosure affordance | 32x32 decorative slot, margin 0,0,8,0, centered 16px Segoe Fluent ChevronDown glyph; part of the full-header target, not a second button | +| Expanded content wrapper padding / spacing | 0 / 0 | +| Non-clickable item padding | 16,16,44,16 (`4`, `4`, `settingsItemEnd`, `4`); replaces Toolkit's 58px leading icon indentation with the shared 16px text inset and increases its 8px top/bottom padding to match the header | +| Item HeaderPanel margin | 0,0,24,0 | +| RightAlignedCompactToggleSwitchStyle slot | Height 36, shared track 40x20 centered vertically | + +Both the header and child interiors measure 68px for the shown two-line labels (20+16 text, 16px top and bottom padding). The child's 36px control slot fits that same text height; its 1px top separator is separate. The displayed shared frame is therefore 139px tall: 1px top + 68px header + 1px separator + 68px item + 1px bottom. These are content-derived sizes, not fixed heights that clip wrapped descriptions. + +Native `SettingsCardMinHeight=68`, `DefaultSettingsExpanderItemStyle.MinHeight=52`, `SettingsExpanderContentMinHeight=16`, and `MinWidth=148` remain implementation requirements. Colophon's semantic layout has no minimum-size fields, so empty-header variants and native wrapping breakpoints are not reproduced by inventing fixed heights or raw CSS. The native template's content presenter also overlaps separate borders with margin `0,-2,0,0`; the catalog instead paints one frame and one divider and does not claim identical native outer height. Native high-contrast border thickness and glyph rasterization remain native. The removed icon indentation, increased item vertical padding, fixed chevron direction, shared backplate, 8px outer corners and header-wide feedback are catalog adaptations, not a pixel-identical reproduction of the screenshot. + +### Expander behavior and native motion reference + +The preview uses native HTML `details` / `summary`, initially open, rather than Colophon's switch-only boolean action. This gives each instance a real disclosure state and browser-managed expanded accessibility, keeps the child switch mounted across collapse/reopen, and excludes collapsed descendants from layout and keyboard navigation. The header is one keyboard target with no nested action. Horizontal Auto Layout on the summary removes the browser triangle without an RTL workaround and restores the trailing Fluent chevron slot. The actual U+E70D glyph uses the existing 16/16 Fluent-icon typography token; it is decorative and retains the original downward direction in both states. State-linked chevron direction remains unimplemented, while native disclosure owns the accessible expanded state. The browser focus outline remains a fallback. + +The animation reference is WinUI's [Expander.xaml](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/Expander/Expander.xaml), together with [Expander.cpp](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/Expander/Expander.cpp) and its [header template](https://github.com/microsoft/microsoft-ui-xaml/blob/09cfc8ff3fbf556166dd813ae9b81646716f54bf/controls/dev/Expander/Expander_themeresources.xaml). For downward expansion, content becomes visible and translates from negative measured content height to zero in **333ms**, with spline **(0,0,0,1)**. Closing translates back in **167ms**, with spline **(1,1,0,1)**, then sets visibility to Collapsed. A composition inset clip prevents content crossing the header. `AnimatedChevronUpDownSmallVisualSource` owns the native chevron's checked/unchecked and pointer states; this is not a generic 180-degree CSS rotation. + +**Animation is not implemented in this preview.** ToggleSwitch became animatable after Colophon gained persistent boolean state and numeric geometry transitions. Expander can follow that same upstream-extension approach, but it additionally needs disclosure semantics, measured-height clipping, visibility/focus timing and state-linked chevrons. Those capabilities are not present in the installed read-only renderer; this is a missing feature, not an inherent inability to animate expanders. Browser-native disclosure therefore opens/closes immediately; it does not pretend that a zero-height, still-focusable container is collapsed. Preserve the stock WinUI animation and system motion settings in production. A faithful animated browser reference needs separately scoped renderer support. Browser behavior/geometry proof remains pending and is not native pixel or Windows high-contrast proof. + +StatusDot is a non-interactive 10x10 indicator with `pill` corners and a semantic fill. Its standalone preview uses explicit Auto Layout so the empty span retains its width and height instead of collapsing as inline text. + +SubtleButton follows [`SubtleButtonStyle` and `ButtonPadding` in WinUI](https://github.com/microsoft/microsoft-ui-xaml/blob/main/controls/dev/CommonStyles/Button_themeresources.xaml): 11,5,11,6 content padding, a 1px border, `ControlCornerRadius` (4px), and normal-weight 14px content. The default example is content-sized text, not a 40x40 icon button. The workspace's 40x40 icon buttons and their local padding overrides are usage variants, not defaults of the style. Rest and disabled backgrounds remain transparent in light/dark; hover and pressed states change background, border, and foreground through the native resource aliases above. Ship with `Style="{StaticResource SubtleButtonStyle}"` and leave its template intact. + +The browser paints backgrounds through the border box rather than using WinUI's `BackgroundSizing=InnerBorderEdge`. SubtleButton therefore keeps its 1px border transparent in light/dark, including hover and pressed states, so the edge receives exactly one layer of the subtle fill. High-contrast borders and keyboard-only focus remain visible. This preview compensation must not replace the native `SubtleButtonStyle` resource bindings. + +Colophon's browser preview retains limitations: its body line box is 20px rather than native text measurement, and its shared focus outline and 160ms state transition do not reproduce the native system focus visual (`FocusVisualMargin=-3`) and 83ms background brush transition. Exact native rendering remains owned by WinUI, not this browser approximation. + +### Native ToggleSwitch, PersonPicture, and InfoBar references + +`ToggleSwitch` is one **interactive shared control**, not a gallery of static states. Each rendered instance starts On and owns an independent transient `checked` boolean; click, Space, or Enter toggles it and updates `aria-checked` without writing to the design file. `SettingsToggleRow` reuses this control and passes its title as the accessible name. Set the `disabled` prop to `"true"` to prevent activation, or use the canvas's Disabled preview state. The [native template](https://github.com/microsoft/microsoft-ui-xaml/blob/main/controls/dev/CommonStyles/ToggleSwitch_themeresources.xaml) uses a 40x20 track, a 12x12 resting/disabled knob, a 14x14 pointer-over knob, and a 17x14 pressed knob. The full native control also owns its header, On/Off content, 12px track-to-content gap, 10px pre/post margins, and 154px minimum width; these are not part of the isolated track. + +On/Off movement uses a separate 20x20 carrier with 20px travel. Colophon's WinUI reposition reference is 367ms cubic-bezier(0.1,0.9,0.2,1); thumb resizing independently uses `ControlFasterAnimationDuration` (83ms) and `ControlFastOutSlowInKeySpline` (0,0,0,1), or `ControlNormalAnimationDuration` (250ms) when disabled. These platform-specific timings intentionally override the general 120-200ms motion guideline. The browser respects `prefers-reduced-motion` by suppressing both transitions. Resting knob bounds are x=3.5 (Off) or x=23.5 (On), y=4, preserving the native half-pixel margins. Hover keeps each knob center; pressed alignment changes the bounds to x=3 (Off) or x=20 (On), y=3. + +Track and knob states bind the `toggle*`, `accent`, and `accentInk` resource tokens in all three preview themes. Off track fill/stroke changes use the native 83ms linear color transition; On brushes change discretely rather than inheriting Colophon's generic 160ms transition. The disabled Off knob reuses `disabledText`, the `TextFillColorDisabledBrush` alias used by native `ToggleSwitchKnobFillOffDisabled`. The preview requires the persistent-state and geometry-transition support merged into [Colophon](https://github.com/karkarl/colophon/commit/d3cd63899410ead81b2aab2b99135dffe9037035). It supports interruption and reversal, but does not reproduce native dragging, template-calculated reposition offsets, system focus visuals, or the on-knob `CircleElevationBorderBrush`. Shipping WinUI must keep its stock template and system animation settings; the browser graph is not a replacement control implementation. + +`Avatar` follows [DefaultPersonPictureStyle](https://github.com/microsoft/microsoft-ui-xaml/blob/main/controls/dev/PersonPicture/PersonPicture.xaml): 96x96 by default, a 1px ellipse stroke, `PersonPictureEllipseFillThemeBrush`, and semibold initials sized to `max(1, diameter * 0.42)`. At the default size this is 40.32px, not a 13px body label. `AvatarStates` also shows the native Contact (U+E77B) and People (U+E716) fallbacks. PersonPicture is non-interactive and has no hover/pressed states; an enclosing button owns those. Production 32px and 24px usages are size overrides, not the default. Native photo clipping, initials generation, badge layout, and `TextLineBounds=Tight` remain native behavior, not browser parity claims. + +`InfoBar` follows the [native template](https://github.com/microsoft/microsoft-ui-xaml/blob/main/controls/dev/InfoBar/InfoBar.xaml) and [resources](https://github.com/microsoft/microsoft-ui-xaml/blob/main/controls/dev/InfoBar/InfoBar_themeresources.xaml). `InfoBarStates` shows all four severities. Both the background and layered 16px icon change with severity. Titles are Body Strong and messages Body, both primary foreground, with 4px corners. The horizontal reference preserves 16px leading padding, 14px icon-to-text spacing, 14px text top offset, 12px title/message spacing, and 16px panel end margin. The 48px content grid plus two 1px borders produces a 50px outer height for a single-line banner. + +The close control is `InfoBarCloseButtonStyle` (based on `DefaultButtonStyle` with AppBarButton resource overrides), not SubtleButtonStyle: 38x38 with a 5px margin and a 16px Cancel glyph. Its preview has hover, pressed, disabled, and keyboard-focus visuals, but **does not dismiss the banner**. The installed renderer only supports opening an overlay on click. Native `IsOpen`, `IsClosable`, actions, `InfoBarPanel` responsive reflow, high-contrast 2px border thickness, and native glyph/text rasterization are not reproduced. The preview retains a 1px border in every theme and uses representative high-contrast system colors. These limits prevent a 1:1 native rendering claim; ship the stock controls and their resources, never these SVG/browser stand-ins. + +## Do's and Don'ts + +Do: + +- Defer to Windows: theme off `SystemAccentColor` and Fluent resources so the app follows the user's accent, light/dark, and high-contrast settings. +- Spend the accent sparingly. Selection, focus, and primary actions share the system accent; do not spend it on decoration. +- Let size, weight, and space carry hierarchy before color does. +- Make connection state legible: connected, pairing, and error read via `positive`/`warning`/`critical`, never by color alone. +- Keep motion to 120-200ms ease-out. Animate to explain, not to impress. + +Don't: + +- Don't hard-code hex in UI; it breaks in dark and high-contrast modes. Use tokens/theme resources. +- Don't put gray text on a colored background. +- Don't nest cards inside cards, or wrap every block in a card. +- Don't reach for bounce/elastic easing; it reads as dated. +- Don't fight the OS theme with custom-skinned controls or glassmorphism overload. + +Anti-references: if a mock could be mistaken for a neon-gradient SaaS landing page, or ignores the user's system accent and light/dark preference, start over. Avoid: custom-skinned controls that fight the OS theme; neon gradients and glassmorphism overload; ignoring the user's system accent or light/dark preference; cramming a web dashboard into a desktop window; hard-coded hex that breaks in dark or high-contrast mode. + +## Production implementation + +The design files are the source of truth for design, and are framework-agnostic. `components.jsonc` shows design intent for preview, not shipping code. Follow `x-colophon.tokens.authority` for port targets, ownership, and synchronization: + +- **Default:** surfaces ship as **native WinUI 3 / C#** (Windows Fluent). Port the design into XAML/C# via [win-dev-skills](https://github.com/microsoft/win-dev-skills). +- **Chat surface** (`ChatBubble`, `ChatComposer`, `ChatThread`): ships via **[Reactor](https://github.com/microsoft/microsoft-ui-reactor)**, the React-style framework for this app's chat. Reactor has no dedicated porting agent yet. +- Both port targets build and package through **[winapp (WinAppCli)](https://github.com/microsoft/WinAppCli)**, the Windows App Development CLI, which also generates app identity, manifests, and certificates. + +Colors are preview swatches: bind their mapped `resource` keys rather than hard-coding hex values. Preserve the light, dark, and high-contrast mappings. The shipping implementation is canonical; component patterns are not shipping code. When you need a value the design doesn't cover, add it here first, then port it into the native/Reactor implementation via the matching reference above.