detached 9bbf554

feat(xwm): XSETTINGS manager, xwayland.xsettings key and root cursor

XSETTINGS owner window with Xft/DPI (96*scale of the first output),
Gtk/CursorThemeName and Gtk/CursorThemeSize from XCURSOR_*, serial bumped
only when the encoded bytes change, MANAGER announcement, existing-owner
check, SelectionClear handling. Root cursor: RENDER ARGB cursor from the
theme image, glyph-cursor fallback. Plain data reaches the XWM through
ports.XwaylandSettings and wayland.Options.Xwayland.
commit
9bbf55424ade8cfa480bd16c5d56ed3e2f18d26e
author
brice · · 2026-10-22 16:07 UTC
committer
brice · · 2026-10-22 17:55 UTC
parent
46fd2a1
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
23 files · +3725 -2970
M Makefile +1 -1
@@ -70,7 +70,7 @@ adapter-imports:
7070 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }
7171 # Fast, mandatory guards for tiled content publications and SHM copies.
7272 perf-check:
73- CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations)$$' -count=1
73+ CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations|TestXSettingsNoChangeAllocations)$$' -count=1
7474 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=1
7575 check: vet test arch fakes-check log-check perf-check
7676
@@ -70,7 +70,7 @@ adapter-imports:
70 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }70 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }
71 # Fast, mandatory guards for tiled content publications and SHM copies.71 # Fast, mandatory guards for tiled content publications and SHM copies.
72 perf-check:72 perf-check:
73- CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations)$$' -count=173+ CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations|TestXSettingsNoChangeAllocations)$$' -count=1
74 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=174 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=1
75 check: vet test arch fakes-check log-check perf-check75 check: vet test arch fakes-check log-check perf-check
76 76
M docs/config.md +3 -2
@@ -1,6 +1,6 @@
11 # Configuration
22
3-NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup` and `xwayland`, which apply at the next start.
3+NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup`, `xwayland` and `xwayland.xsettings`, which apply at the next start.
44
55 ```sh
66 neferwl --config <path> # use another file
@@ -28,6 +28,7 @@ See [examples/config](../examples/config) for every key with its default.
2828 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |
2929 | `startup` | none | Commands run at session start, separated by `;` |
3030 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |
31+| `xwayland.xsettings` | `on` | With `xwayland = builtin`, publish the cursor theme, cursor size and DPI to X11 apps through XSETTINGS (restart required); `off` leaves them to the apps |
3132 | `background` | `#111111` | Background color |
3233 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |
3334 | `border.width` | `2` | Border width in pixels; `0` hides borders |
@@ -103,7 +104,7 @@ destination output, even if that output has no windows. Same-screen workspace
103104 switches and mouse focus do not trigger a flash.
104105 It runs when `animations = on`.
105106
106-`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.
107+`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. X11 apps get the cursor theme and size from `XCURSOR_THEME` and `XCURSOR_SIZE`, the DPI of the first output (96 times its scale) through XSETTINGS (`xwayland.xsettings = off` turns it off), and the themed arrow on the X background. Clipboard is not supported; use `satellite` if you need it.
107108
108109 ## Automatic terminal
109110
@@ -1,6 +1,6 @@
1 # Configuration1 # Configuration
2 2
3-NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup` and `xwayland`, which apply at the next start.3+NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup`, `xwayland` and `xwayland.xsettings`, which apply at the next start.
4 4
5 ```sh5 ```sh
6 neferwl --config <path> # use another file6 neferwl --config <path> # use another file
@@ -28,6 +28,7 @@ See [examples/config](../examples/config) for every key with its default.
28 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |28 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |
29 | `startup` | none | Commands run at session start, separated by `;` |29 | `startup` | none | Commands run at session start, separated by `;` |
30 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |30 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |
31+| `xwayland.xsettings` | `on` | With `xwayland = builtin`, publish the cursor theme, cursor size and DPI to X11 apps through XSETTINGS (restart required); `off` leaves them to the apps |
31 | `background` | `#111111` | Background color |32 | `background` | `#111111` | Background color |
32 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |33 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |
33 | `border.width` | `2` | Border width in pixels; `0` hides borders |34 | `border.width` | `2` | Border width in pixels; `0` hides borders |
@@ -103,7 +104,7 @@ destination output, even if that output has no windows. Same-screen workspace
103 switches and mouse focus do not trigger a flash.104 switches and mouse focus do not trigger a flash.
104 It runs when `animations = on`.105 It runs when `animations = on`.
105 106
106-`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.107+`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. X11 apps get the cursor theme and size from `XCURSOR_THEME` and `XCURSOR_SIZE`, the DPI of the first output (96 times its scale) through XSETTINGS (`xwayland.xsettings = off` turns it off), and the themed arrow on the X background. Clipboard is not supported; use `satellite` if you need it.
107 108
108 ## Automatic terminal109 ## Automatic terminal
109 110
M docs/desktop.md +1 -1
@@ -58,7 +58,7 @@ By default, X11 apps such as Steam run through [xwayland-satellite](https://gith
5858 xwayland = off # no X11 support
5959 ```
6060
61-With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.
61+With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. X11 apps get the cursor theme, cursor size and DPI through XSETTINGS (`xwayland.xsettings = off` to disable). Clipboard is not supported; use `satellite` if you need it.
6262
6363 Games with `builtin`:
6464
@@ -58,7 +58,7 @@ By default, X11 apps such as Steam run through [xwayland-satellite](https://gith
58 xwayland = off # no X11 support58 xwayland = off # no X11 support
59 ```59 ```
60 60
61-With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.61+With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. X11 apps get the cursor theme, cursor size and DPI through XSETTINGS (`xwayland.xsettings = off` to disable). Clipboard is not supported; use `satellite` if you need it.
62 62
63 Games with `builtin`:63 Games with `builtin`:
64 64
M internal/adapters/config/config.go +15 -5
@@ -167,7 +167,7 @@ func Defaults() ports.Config {
167167 // Hint mode is experimental: off unless the config turns it on.
168168 c.Hint.Enable = false
169169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift
170- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}
170+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}
171171 c.Background.Color = "#111111"
172172 c.Floating.Dim = 0.3
173173 c.Stash.Width = 80
@@ -724,17 +724,27 @@ func set(c *ports.Config, key, v string) error {
724724 }
725725 c.Terminal.AutoOpen = v
726726 case "xwayland":
727+ xs := c.Xwayland.XSettings // independent of the backend
727728 switch {
728729 case v == "off":
729- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff}
730+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: xs}
730731 case v == "satellite":
731- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}
732+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: xs}
732733 case v == "builtin":
733- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}
734+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: xs}
734735 case v == "" || strings.ContainsAny(v, " \t"):
735736 return fmt.Errorf("must be off, satellite, builtin or a satellite program")
736737 default:
737- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v}
738+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v, XSettings: xs}
739+ }
740+ case "xwayland.xsettings":
741+ switch v {
742+ case "on":
743+ c.Xwayland.XSettings = true
744+ case "off":
745+ c.Xwayland.XSettings = false
746+ default:
747+ return fmt.Errorf("must be on or off")
738748 }
739749 case "background":
740750 if !color.MatchString(v) {
@@ -167,7 +167,7 @@ func Defaults() ports.Config {
167 // Hint mode is experimental: off unless the config turns it on.167 // Hint mode is experimental: off unless the config turns it on.
168 c.Hint.Enable = false168 c.Hint.Enable = false
169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift
170- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}170+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}
171 c.Background.Color = "#111111"171 c.Background.Color = "#111111"
172 c.Floating.Dim = 0.3172 c.Floating.Dim = 0.3
173 c.Stash.Width = 80173 c.Stash.Width = 80
@@ -724,17 +724,27 @@ func set(c *ports.Config, key, v string) error {
724 }724 }
725 c.Terminal.AutoOpen = v725 c.Terminal.AutoOpen = v
726 case "xwayland":726 case "xwayland":
727+ xs := c.Xwayland.XSettings // independent of the backend
727 switch {728 switch {
728 case v == "off":729 case v == "off":
729- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff}730+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: xs}
730 case v == "satellite":731 case v == "satellite":
731- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}732+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: xs}
732 case v == "builtin":733 case v == "builtin":
733- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}734+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: xs}
734 case v == "" || strings.ContainsAny(v, " \t"):735 case v == "" || strings.ContainsAny(v, " \t"):
735 return fmt.Errorf("must be off, satellite, builtin or a satellite program")736 return fmt.Errorf("must be off, satellite, builtin or a satellite program")
736 default:737 default:
737- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v}738+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v, XSettings: xs}
739+ }
740+ case "xwayland.xsettings":
741+ switch v {
742+ case "on":
743+ c.Xwayland.XSettings = true
744+ case "off":
745+ c.Xwayland.XSettings = false
746+ default:
747+ return fmt.Errorf("must be on or off")
738 }748 }
739 case "background":749 case "background":
740 if !color.MatchString(v) {750 if !color.MatchString(v) {
M internal/adapters/config/config_test.go +27 -5
@@ -340,17 +340,17 @@ func TestWorkspacePrevNextAction(t *testing.T) {
340340 }
341341
342342 func TestXwayland(t *testing.T) {
343- if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}) {
343+ if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}) {
344344 t.Fatal(Defaults().Xwayland)
345345 }
346346 for _, tt := range []struct {
347347 value string
348348 want ports.XwaylandConfig
349349 }{
350- {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff}},
351- {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}},
352- {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}},
353- {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls"}},
350+ {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: true}},
351+ {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}},
352+ {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: true}},
353+ {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls", XSettings: true}},
354354 } {
355355 t.Run(tt.value, func(t *testing.T) {
356356 c, w := parseString(t, "xwayland = "+tt.value)
@@ -361,6 +361,28 @@ func TestXwayland(t *testing.T) {
361361 }
362362 }
363363
364+func TestXwaylandXSettings(t *testing.T) {
365+ for _, tt := range []struct {
366+ src string
367+ want bool
368+ }{
369+ {"", true},
370+ {"xwayland.xsettings = on", true},
371+ {"xwayland.xsettings = off", false},
372+ {"xwayland.xsettings = off\nxwayland = builtin", false},
373+ {"xwayland = builtin\nxwayland.xsettings = off", false},
374+ } {
375+ c, w := parseString(t, tt.src)
376+ if c.Xwayland.XSettings != tt.want || len(w) != 0 {
377+ t.Fatal(tt.src, c.Xwayland, w)
378+ }
379+ }
380+ c, w := parseString(t, "xwayland.xsettings = maybe")
381+ if !c.Xwayland.XSettings || len(w) != 1 || !strings.Contains(w[0].Msg, "must be on or off") {
382+ t.Fatal(c.Xwayland, w)
383+ }
384+}
385+
364386 func TestDuplicateKeyLastWins(t *testing.T) {
365387 c, w := parseString(t, "background = #000000\nbackground = #111111\n")
366388 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {
@@ -340,17 +340,17 @@ func TestWorkspacePrevNextAction(t *testing.T) {
340 }340 }
341 341
342 func TestXwayland(t *testing.T) {342 func TestXwayland(t *testing.T) {
343- if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}) {343+ if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}) {
344 t.Fatal(Defaults().Xwayland)344 t.Fatal(Defaults().Xwayland)
345 }345 }
346 for _, tt := range []struct {346 for _, tt := range []struct {
347 value string347 value string
348 want ports.XwaylandConfig348 want ports.XwaylandConfig
349 }{349 }{
350- {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff}},350+ {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: true}},
351- {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}},351+ {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}},
352- {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}},352+ {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: true}},
353- {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls"}},353+ {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls", XSettings: true}},
354 } {354 } {
355 t.Run(tt.value, func(t *testing.T) {355 t.Run(tt.value, func(t *testing.T) {
356 c, w := parseString(t, "xwayland = "+tt.value)356 c, w := parseString(t, "xwayland = "+tt.value)
@@ -361,6 +361,28 @@ func TestXwayland(t *testing.T) {
361 }361 }
362 }362 }
363 363
364+func TestXwaylandXSettings(t *testing.T) {
365+ for _, tt := range []struct {
366+ src string
367+ want bool
368+ }{
369+ {"", true},
370+ {"xwayland.xsettings = on", true},
371+ {"xwayland.xsettings = off", false},
372+ {"xwayland.xsettings = off\nxwayland = builtin", false},
373+ {"xwayland = builtin\nxwayland.xsettings = off", false},
374+ } {
375+ c, w := parseString(t, tt.src)
376+ if c.Xwayland.XSettings != tt.want || len(w) != 0 {
377+ t.Fatal(tt.src, c.Xwayland, w)
378+ }
379+ }
380+ c, w := parseString(t, "xwayland.xsettings = maybe")
381+ if !c.Xwayland.XSettings || len(w) != 1 || !strings.Contains(w[0].Msg, "must be on or off") {
382+ t.Fatal(c.Xwayland, w)
383+ }
384+}
385+
364 func TestDuplicateKeyLastWins(t *testing.T) {386 func TestDuplicateKeyLastWins(t *testing.T) {
365 c, w := parseString(t, "background = #000000\nbackground = #111111\n")387 c, w := parseString(t, "background = #000000\nbackground = #111111\n")
366 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {388 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {
M internal/adapters/wayland/server.go +5 -0
@@ -52,6 +52,9 @@ type Options struct {
5252 // Casts receives the screencast events and inventory (screencast.go);
5353 // nil serves no casts (Channels.CastCommands is not read).
5454 Casts ports.CastSink
55+ // Xwayland is what the built-in XWM publishes to X11 clients
56+ // (XSETTINGS, root cursor); the zero value publishes nothing.
57+ Xwayland ports.XwaylandSettings
5558 // LogDamage logs the damage of every fresh client commit at debug level
5659 // (--debug=wayland-damage).
5760 LogDamage bool
@@ -295,6 +298,7 @@ type Server struct {
295298 workspaceIDs *workspaceid.IDs
296299 outputHeads ports.OutputHeads
297300 outputPlaces ports.Layout
301+ xsettings ports.XwaylandSettings
298302 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM
299303 managementSerial uint32
300304 nextOutputApply uint64
@@ -379,6 +383,7 @@ func New(opts Options, ch Channels, log zerowrap.Logger) (*Server, error) {
379383 cleanup: cleanup,
380384 log: log,
381385 logDamage: opts.LogDamage,
386+ xsettings: opts.Xwayland,
382387 channels: ch,
383388 surfaces: make(map[*server.Resource]*surface),
384389 surfaceByIdentity: make(map[uint64]*surface),
@@ -52,6 +52,9 @@ type Options struct {
52 // Casts receives the screencast events and inventory (screencast.go);52 // Casts receives the screencast events and inventory (screencast.go);
53 // nil serves no casts (Channels.CastCommands is not read).53 // nil serves no casts (Channels.CastCommands is not read).
54 Casts ports.CastSink54 Casts ports.CastSink
55+ // Xwayland is what the built-in XWM publishes to X11 clients
56+ // (XSETTINGS, root cursor); the zero value publishes nothing.
57+ Xwayland ports.XwaylandSettings
55 // LogDamage logs the damage of every fresh client commit at debug level58 // LogDamage logs the damage of every fresh client commit at debug level
56 // (--debug=wayland-damage).59 // (--debug=wayland-damage).
57 LogDamage bool60 LogDamage bool
@@ -295,6 +298,7 @@ type Server struct {
295 workspaceIDs *workspaceid.IDs298 workspaceIDs *workspaceid.IDs
296 outputHeads ports.OutputHeads299 outputHeads ports.OutputHeads
297 outputPlaces ports.Layout300 outputPlaces ports.Layout
301+ xsettings ports.XwaylandSettings
298 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM302 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM
299 managementSerial uint32303 managementSerial uint32
300 nextOutputApply uint64304 nextOutputApply uint64
@@ -379,6 +383,7 @@ func New(opts Options, ch Channels, log zerowrap.Logger) (*Server, error) {
379 cleanup: cleanup,383 cleanup: cleanup,
380 log: log,384 log: log,
381 logDamage: opts.LogDamage,385 logDamage: opts.LogDamage,
386+ xsettings: opts.Xwayland,
382 channels: ch,387 channels: ch,
383 surfaces: make(map[*server.Resource]*surface),388 surfaces: make(map[*server.Resource]*surface),
384 surfaceByIdentity: make(map[uint64]*surface),389 surfaceByIdentity: make(map[uint64]*surface),
M internal/adapters/wayland/xwayland.go +1 -1
@@ -52,7 +52,7 @@ func (s *Server) forgetXwayland() {
5252 // closes the XWM on the display goroutine and waits for it.
5353 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {
5454 log := logging.For(ctx, "xwm")
55- x, err := xwm.Boot(ctx, wmFD, log)
55+ x, err := xwm.BootSettings(ctx, wmFD, log, s.xsettings)
5656 if err != nil {
5757 if ctx.Err() != nil {
5858 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")
@@ -52,7 +52,7 @@ func (s *Server) forgetXwayland() {
52 // closes the XWM on the display goroutine and waits for it.52 // closes the XWM on the display goroutine and waits for it.
53 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {53 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {
54 log := logging.For(ctx, "xwm")54 log := logging.For(ctx, "xwm")
55- x, err := xwm.Boot(ctx, wmFD, log)55+ x, err := xwm.BootSettings(ctx, wmFD, log, s.xsettings)
56 if err != nil {56 if err != nil {
57 if ctx.Err() != nil {57 if ctx.Err() != nil {
58 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")58 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")
M internal/adapters/wayland/xwm/atoms.go +6 -0
@@ -46,6 +46,9 @@ const (
4646 atomClipboard
4747 atomPrimary
4848 atomTargets
49+ atomManager
50+ atomXSettingsS0
51+ atomXSettingsSettings
4952 atomCount
5053 )
5154
@@ -93,4 +96,7 @@ var atomNames = [atomCount]string{
9396 atomClipboard: "CLIPBOARD",
9497 atomPrimary: "PRIMARY",
9598 atomTargets: "TARGETS",
99+ atomManager: "MANAGER",
100+ atomXSettingsS0: "_XSETTINGS_S0",
101+ atomXSettingsSettings: "_XSETTINGS_SETTINGS",
96102 }
@@ -46,6 +46,9 @@ const (
46 atomClipboard46 atomClipboard
47 atomPrimary47 atomPrimary
48 atomTargets48 atomTargets
49+ atomManager
50+ atomXSettingsS0
51+ atomXSettingsSettings
49 atomCount52 atomCount
50 )53 )
51 54
@@ -93,4 +96,7 @@ var atomNames = [atomCount]string{
93 atomClipboard: "CLIPBOARD",96 atomClipboard: "CLIPBOARD",
94 atomPrimary: "PRIMARY",97 atomPrimary: "PRIMARY",
95 atomTargets: "TARGETS",98 atomTargets: "TARGETS",
99+ atomManager: "MANAGER",
100+ atomXSettingsS0: "_XSETTINGS_S0",
101+ atomXSettingsSettings: "_XSETTINGS_SETTINGS",
96 }102 }
M internal/adapters/wayland/xwm/configure.go +1 -0
@@ -123,6 +123,7 @@ func (x *XWM) LayoutChanged(changed bool) {
123123 x.warnedSpace = true
124124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")
125125 }
126+ x.refreshXSettings()
126127 if !changed {
127128 return
128129 }
@@ -123,6 +123,7 @@ func (x *XWM) LayoutChanged(changed bool) {
123 x.warnedSpace = true123 x.warnedSpace = true
124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")
125 }125 }
126+ x.refreshXSettings()
126 if !changed {127 if !changed {
127 return128 return
128 }129 }
A internal/adapters/wayland/xwm/cursor.go +109 -0
@@ -0,0 +1,109 @@
1+package xwm
2+
3+import (
4+ "bnema.dev/xturbo"
5+ "bnema.dev/xturbo/render"
6+ "bnema.dev/xturbo/xproto"
7+)
8+
9+// Root cursor: a themed arrow on the root window so the X background does not
10+// show Xwayland's cross. One-shot at boot; never fatal.
11+
12+const maxCursorBytes = 1 << 18 // one PutImage request, below the core limit
13+
14+// bootRootCursor sets the cursor of the root window.
15+func (x *XWM) bootRootCursor() error {
16+ if !x.cfg.RootCursor {
17+ return nil
18+ }
19+ img := x.cfg.Cursor
20+ usable := img.W > 0 && img.H > 0 && img.W <= 0xffff && img.H <= 0xffff &&
21+ len(img.Pixels) == img.W*img.H*4 && len(img.Pixels) <= maxCursorBytes
22+ if usable && x.conn.Ext().Info(xturbo.ExtRender).Present {
23+ b := x.conn.Buf()
24+ x.expect(render.QueryPictFormats(b), kindPictFormats, 0, 0)
25+ if err := x.conn.Sync(&x.h); err != nil {
26+ return err
27+ }
28+ if x.bootErr != nil {
29+ return x.bootErr
30+ }
31+ if x.xs.argb != 0 && x.argbCursor(img.W, img.H, img.HotX, img.HotY, img.Pixels) {
32+ return nil
33+ }
34+ }
35+ x.glyphCursor()
36+ return nil
37+}
38+
39+// onPictFormatsReply remembers the ARGB32 picture format (depth 32, direct,
40+// alpha mask 0xff at shift 24).
41+func (x *XWM) onPictFormatsReply(r *xturbo.Reply) {
42+ v, ok := render.ParseQueryPictFormatsReply(r.Raw)
43+ if !ok {
44+ return
45+ }
46+ l := v.Formats()
47+ for i := 0; i < l.Len(); i++ {
48+ f := l.At(i)
49+ if f.Type == render.PictTypeDirect && f.Depth == 32 && f.Direct.AlphaMask == 0xff && f.Direct.AlphaShift == 24 &&
50+ f.Direct.RedMask == 0xff && f.Direct.RedShift == 16 {
51+ x.xs.argb = uint32(f.Id)
52+ return
53+ }
54+ }
55+}
56+
57+func (x *XWM) newIDs(ids []uint32) bool {
58+ for i := range ids {
59+ id, err := x.conn.NewXID()
60+ if err != nil {
61+ return false
62+ }
63+ ids[i] = id
64+ }
65+ return true
66+}
67+
68+// argbCursor uploads the image and installs it on the root.
69+func (x *XWM) argbCursor(w, h, hotX, hotY int, px []byte) bool {
70+ var id [4]uint32 // pixmap, gc, picture, cursor
71+ if !x.newIDs(id[:]) {
72+ return false
73+ }
74+ b := x.conn.Buf()
75+ pm, gc, pic, cur := xproto.Pixmap(id[0]), xproto.Gcontext(id[1]), render.Picture(id[2]), xproto.Cursor(id[3])
76+ xproto.CreatePixmap(b, 32, pm, xproto.Drawable(x.root), uint16(w), uint16(h))
77+ var gv xproto.CreateGCValues
78+ xproto.CreateGC(b, gc, xproto.Drawable(pm), &gv)
79+ xproto.PutImage(b, xproto.ImageFormatZPixmap, xproto.Drawable(pm), gc, uint16(w), uint16(h), 0, 0, 0, 32, px)
80+ var pv render.CreatePictureValues
81+ render.CreatePicture(b, pic, xproto.Drawable(pm), render.Pictformat(x.xs.argb), &pv)
82+ render.CreateCursor(b, cur, pic, uint16(min(max(hotX, 0), w-1)), uint16(min(max(hotY, 0), h-1)))
83+ var wv xproto.ChangeWindowAttributesValues
84+ wv.SetCursor(cur)
85+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
86+ render.FreePicture(b, pic)
87+ xproto.FreeGC(b, gc)
88+ xproto.FreePixmap(b, pm)
89+ xproto.FreeCursor(b, cur)
90+ return true
91+}
92+
93+// glyphCursor installs the "left_ptr" glyph of the X cursor font (glyph 68,
94+// mask 69).
95+func (x *XWM) glyphCursor() {
96+ var id [2]uint32 // font, cursor
97+ if !x.newIDs(id[:]) {
98+ return
99+ }
100+ b := x.conn.Buf()
101+ font, cur := xproto.Font(id[0]), xproto.Cursor(id[1])
102+ xproto.OpenFont(b, font, "cursor")
103+ xproto.CreateGlyphCursor(b, cur, font, font, 68, 69, 0, 0, 0, 0xffff, 0xffff, 0xffff)
104+ var wv xproto.ChangeWindowAttributesValues
105+ wv.SetCursor(cur)
106+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
107+ xproto.CloseFont(b, font)
108+ xproto.FreeCursor(b, cur)
109+}
@@ -0,0 +1,109 @@
1+package xwm
2+
3+import (
4+ "bnema.dev/xturbo"
5+ "bnema.dev/xturbo/render"
6+ "bnema.dev/xturbo/xproto"
7+)
8+
9+// Root cursor: a themed arrow on the root window so the X background does not
10+// show Xwayland's cross. One-shot at boot; never fatal.
11+
12+const maxCursorBytes = 1 << 18 // one PutImage request, below the core limit
13+
14+// bootRootCursor sets the cursor of the root window.
15+func (x *XWM) bootRootCursor() error {
16+ if !x.cfg.RootCursor {
17+ return nil
18+ }
19+ img := x.cfg.Cursor
20+ usable := img.W > 0 && img.H > 0 && img.W <= 0xffff && img.H <= 0xffff &&
21+ len(img.Pixels) == img.W*img.H*4 && len(img.Pixels) <= maxCursorBytes
22+ if usable && x.conn.Ext().Info(xturbo.ExtRender).Present {
23+ b := x.conn.Buf()
24+ x.expect(render.QueryPictFormats(b), kindPictFormats, 0, 0)
25+ if err := x.conn.Sync(&x.h); err != nil {
26+ return err
27+ }
28+ if x.bootErr != nil {
29+ return x.bootErr
30+ }
31+ if x.xs.argb != 0 && x.argbCursor(img.W, img.H, img.HotX, img.HotY, img.Pixels) {
32+ return nil
33+ }
34+ }
35+ x.glyphCursor()
36+ return nil
37+}
38+
39+// onPictFormatsReply remembers the ARGB32 picture format (depth 32, direct,
40+// alpha mask 0xff at shift 24).
41+func (x *XWM) onPictFormatsReply(r *xturbo.Reply) {
42+ v, ok := render.ParseQueryPictFormatsReply(r.Raw)
43+ if !ok {
44+ return
45+ }
46+ l := v.Formats()
47+ for i := 0; i < l.Len(); i++ {
48+ f := l.At(i)
49+ if f.Type == render.PictTypeDirect && f.Depth == 32 && f.Direct.AlphaMask == 0xff && f.Direct.AlphaShift == 24 &&
50+ f.Direct.RedMask == 0xff && f.Direct.RedShift == 16 {
51+ x.xs.argb = uint32(f.Id)
52+ return
53+ }
54+ }
55+}
56+
57+func (x *XWM) newIDs(ids []uint32) bool {
58+ for i := range ids {
59+ id, err := x.conn.NewXID()
60+ if err != nil {
61+ return false
62+ }
63+ ids[i] = id
64+ }
65+ return true
66+}
67+
68+// argbCursor uploads the image and installs it on the root.
69+func (x *XWM) argbCursor(w, h, hotX, hotY int, px []byte) bool {
70+ var id [4]uint32 // pixmap, gc, picture, cursor
71+ if !x.newIDs(id[:]) {
72+ return false
73+ }
74+ b := x.conn.Buf()
75+ pm, gc, pic, cur := xproto.Pixmap(id[0]), xproto.Gcontext(id[1]), render.Picture(id[2]), xproto.Cursor(id[3])
76+ xproto.CreatePixmap(b, 32, pm, xproto.Drawable(x.root), uint16(w), uint16(h))
77+ var gv xproto.CreateGCValues
78+ xproto.CreateGC(b, gc, xproto.Drawable(pm), &gv)
79+ xproto.PutImage(b, xproto.ImageFormatZPixmap, xproto.Drawable(pm), gc, uint16(w), uint16(h), 0, 0, 0, 32, px)
80+ var pv render.CreatePictureValues
81+ render.CreatePicture(b, pic, xproto.Drawable(pm), render.Pictformat(x.xs.argb), &pv)
82+ render.CreateCursor(b, cur, pic, uint16(min(max(hotX, 0), w-1)), uint16(min(max(hotY, 0), h-1)))
83+ var wv xproto.ChangeWindowAttributesValues
84+ wv.SetCursor(cur)
85+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
86+ render.FreePicture(b, pic)
87+ xproto.FreeGC(b, gc)
88+ xproto.FreePixmap(b, pm)
89+ xproto.FreeCursor(b, cur)
90+ return true
91+}
92+
93+// glyphCursor installs the "left_ptr" glyph of the X cursor font (glyph 68,
94+// mask 69).
95+func (x *XWM) glyphCursor() {
96+ var id [2]uint32 // font, cursor
97+ if !x.newIDs(id[:]) {
98+ return
99+ }
100+ b := x.conn.Buf()
101+ font, cur := xproto.Font(id[0]), xproto.Cursor(id[1])
102+ xproto.OpenFont(b, font, "cursor")
103+ xproto.CreateGlyphCursor(b, cur, font, font, 68, 69, 0, 0, 0, 0xffff, 0xffff, 0xffff)
104+ var wv xproto.ChangeWindowAttributesValues
105+ wv.SetCursor(cur)
106+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
107+ xproto.CloseFont(b, font)
108+ xproto.FreeCursor(b, cur)
109+}
A internal/adapters/wayland/xwm/cursor_test.go +86 -0
@@ -0,0 +1,86 @@
1+package xwm
2+
3+import (
4+ "testing"
5+
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/stretchr/testify/require"
8+)
9+
10+func rootCursorExts() map[string]xpeerExt {
11+ e := fullPeerExts()
12+ e["RENDER"] = xpeerExt{139, 0, 0}
13+ return e
14+}
15+
16+func bootCursor(t *testing.T, exts map[string]xpeerExt, mutate func(*xpeer), cfg ports.XwaylandSettings) (*XWM, *xpeer) {
17+ t.Helper()
18+ fd, p := startXPeer(t, exts)
19+ if mutate != nil {
20+ p.set(mutate)
21+ }
22+ x, err := BootSettings(t.Context(), fd, testLog(), cfg)
23+ require.NoError(t, err)
24+ t.Cleanup(x.CloseConn)
25+ return x, p
26+}
27+
28+func cursorCfg() ports.XwaylandSettings {
29+ return ports.XwaylandSettings{RootCursor: true, Cursor: ports.CursorImage{W: 2, H: 2, HotX: 1, HotY: 0, Pixels: make([]byte, 16)}}
30+}
31+
32+func TestRootCursorRequests(t *testing.T) {
33+ _, p := bootCursor(t, rootCursorExts(), nil, cursorCfg())
34+ // QueryPictFormats (render minor 1) comes first; then the core requests.
35+ var got []string
36+ for _, r := range p.requests() {
37+ switch {
38+ case r.major == 139 && r.minor == 1:
39+ got = append(got, "QueryPictFormats")
40+ case r.major == 53:
41+ got = append(got, "CreatePixmap")
42+ case r.major == 72:
43+ got = append(got, "PutImage")
44+ case r.major == 139 && r.minor == 4:
45+ got = append(got, "CreatePicture")
46+ case r.major == 139 && r.minor == 27:
47+ got = append(got, "CreateCursor")
48+ case r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0:
49+ got = append(got, "ChangeWindowAttributes(root)")
50+ case r.major == 54:
51+ got = append(got, "FreePixmap")
52+ }
53+ }
54+ require.Equal(t, []string{"QueryPictFormats", "CreatePixmap", "PutImage", "CreatePicture", "CreateCursor",
55+ "ChangeWindowAttributes(root)", "FreePixmap"}, got)
56+ for _, r := range p.requests() {
57+ if r.major == 72 { // PutImage: ZPixmap, depth 32
58+ require.EqualValues(t, 2, r.raw[1])
59+ require.EqualValues(t, 32, r.raw[21])
60+ }
61+ }
62+}
63+
64+func TestRootCursorFallbackWithoutRender(t *testing.T) {
65+ _, p := bootCursor(t, fullPeerExts(), nil, cursorCfg())
66+ var open, glyph, set bool
67+ for _, r := range p.requests() {
68+ open = open || r.major == 45
69+ glyph = glyph || r.major == 94
70+ set = set || r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0
71+ }
72+ require.True(t, open && glyph && set, "OpenFont, CreateGlyphCursor, root cursor")
73+ require.Zero(t, p.count(53, nil), "no pixmap")
74+}
75+
76+func TestRootCursorFallbackWithoutARGB(t *testing.T) {
77+ _, p := bootCursor(t, rootCursorExts(), func(p *xpeer) { p.noARGB = true }, cursorCfg())
78+ require.NotZero(t, p.count(94, nil))
79+ require.Zero(t, p.count(72, nil))
80+}
81+
82+func TestRootCursorOff(t *testing.T) {
83+ _, p := bootCursor(t, rootCursorExts(), nil, ports.XwaylandSettings{})
84+ require.Zero(t, p.count(94, nil))
85+ require.Zero(t, p.count(53, nil))
86+}
@@ -0,0 +1,86 @@
1+package xwm
2+
3+import (
4+ "testing"
5+
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/stretchr/testify/require"
8+)
9+
10+func rootCursorExts() map[string]xpeerExt {
11+ e := fullPeerExts()
12+ e["RENDER"] = xpeerExt{139, 0, 0}
13+ return e
14+}
15+
16+func bootCursor(t *testing.T, exts map[string]xpeerExt, mutate func(*xpeer), cfg ports.XwaylandSettings) (*XWM, *xpeer) {
17+ t.Helper()
18+ fd, p := startXPeer(t, exts)
19+ if mutate != nil {
20+ p.set(mutate)
21+ }
22+ x, err := BootSettings(t.Context(), fd, testLog(), cfg)
23+ require.NoError(t, err)
24+ t.Cleanup(x.CloseConn)
25+ return x, p
26+}
27+
28+func cursorCfg() ports.XwaylandSettings {
29+ return ports.XwaylandSettings{RootCursor: true, Cursor: ports.CursorImage{W: 2, H: 2, HotX: 1, HotY: 0, Pixels: make([]byte, 16)}}
30+}
31+
32+func TestRootCursorRequests(t *testing.T) {
33+ _, p := bootCursor(t, rootCursorExts(), nil, cursorCfg())
34+ // QueryPictFormats (render minor 1) comes first; then the core requests.
35+ var got []string
36+ for _, r := range p.requests() {
37+ switch {
38+ case r.major == 139 && r.minor == 1:
39+ got = append(got, "QueryPictFormats")
40+ case r.major == 53:
41+ got = append(got, "CreatePixmap")
42+ case r.major == 72:
43+ got = append(got, "PutImage")
44+ case r.major == 139 && r.minor == 4:
45+ got = append(got, "CreatePicture")
46+ case r.major == 139 && r.minor == 27:
47+ got = append(got, "CreateCursor")
48+ case r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0:
49+ got = append(got, "ChangeWindowAttributes(root)")
50+ case r.major == 54:
51+ got = append(got, "FreePixmap")
52+ }
53+ }
54+ require.Equal(t, []string{"QueryPictFormats", "CreatePixmap", "PutImage", "CreatePicture", "CreateCursor",
55+ "ChangeWindowAttributes(root)", "FreePixmap"}, got)
56+ for _, r := range p.requests() {
57+ if r.major == 72 { // PutImage: ZPixmap, depth 32
58+ require.EqualValues(t, 2, r.raw[1])
59+ require.EqualValues(t, 32, r.raw[21])
60+ }
61+ }
62+}
63+
64+func TestRootCursorFallbackWithoutRender(t *testing.T) {
65+ _, p := bootCursor(t, fullPeerExts(), nil, cursorCfg())
66+ var open, glyph, set bool
67+ for _, r := range p.requests() {
68+ open = open || r.major == 45
69+ glyph = glyph || r.major == 94
70+ set = set || r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0
71+ }
72+ require.True(t, open && glyph && set, "OpenFont, CreateGlyphCursor, root cursor")
73+ require.Zero(t, p.count(53, nil), "no pixmap")
74+}
75+
76+func TestRootCursorFallbackWithoutARGB(t *testing.T) {
77+ _, p := bootCursor(t, rootCursorExts(), func(p *xpeer) { p.noARGB = true }, cursorCfg())
78+ require.NotZero(t, p.count(94, nil))
79+ require.Zero(t, p.count(72, nil))
80+}
81+
82+func TestRootCursorOff(t *testing.T) {
83+ _, p := bootCursor(t, rootCursorExts(), nil, ports.XwaylandSettings{})
84+ require.Zero(t, p.count(94, nil))
85+ require.Zero(t, p.count(53, nil))
86+}
M internal/adapters/wayland/xwm/events.go +11 -0
@@ -21,6 +21,8 @@ const (
2121 kindVersion
2222 kindTree
2323 kindOverrideType
24+ kindSelOwner
25+ kindPictFormats
2426 )
2527
2628 // onEvent dispatches an X event. Before Attach there is no host: only the
@@ -38,6 +40,9 @@ func (x *XWM) onEvent(ev *xturbo.Event) {
3840 case xproto.KindReparentNotify:
3941 x.onReparentNotify(ev)
4042 }
43+ if ev.Kind == xproto.KindSelectionClear {
44+ x.onSelectionClear(ev)
45+ }
4146 if x.host == nil {
4247 x.onEventDetached(ev)
4348 return
@@ -95,6 +100,12 @@ func (x *XWM) onReply(r *xturbo.Reply) {
95100 case kindTree:
96101 x.onTreeReply(r)
97102 return
103+ case kindSelOwner:
104+ x.onSelOwnerReply(r)
105+ return
106+ case kindPictFormats:
107+ x.onPictFormatsReply(r)
108+ return
98109 }
99110 s, rec := x.tab.live(r.Args[0])
100111 if rec == nil {
@@ -21,6 +21,8 @@ const (
21 kindVersion21 kindVersion
22 kindTree22 kindTree
23 kindOverrideType23 kindOverrideType
24+ kindSelOwner
25+ kindPictFormats
24 )26 )
25 27
26 // onEvent dispatches an X event. Before Attach there is no host: only the28 // onEvent dispatches an X event. Before Attach there is no host: only the
@@ -38,6 +40,9 @@ func (x *XWM) onEvent(ev *xturbo.Event) {
38 case xproto.KindReparentNotify:40 case xproto.KindReparentNotify:
39 x.onReparentNotify(ev)41 x.onReparentNotify(ev)
40 }42 }
43+ if ev.Kind == xproto.KindSelectionClear {
44+ x.onSelectionClear(ev)
45+ }
41 if x.host == nil {46 if x.host == nil {
42 x.onEventDetached(ev)47 x.onEventDetached(ev)
43 return48 return
@@ -95,6 +100,12 @@ func (x *XWM) onReply(r *xturbo.Reply) {
95 case kindTree:100 case kindTree:
96 x.onTreeReply(r)101 x.onTreeReply(r)
97 return102 return
103+ case kindSelOwner:
104+ x.onSelOwnerReply(r)
105+ return
106+ case kindPictFormats:
107+ x.onPictFormatsReply(r)
108+ return
98 }109 }
99 s, rec := x.tab.live(r.Args[0])110 s, rec := x.tab.live(r.Args[0])
100 if rec == nil {111 if rec == nil {
A internal/adapters/wayland/xwm/selection_xsettings.go +205 -0
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "encoding/binary"
5+ "math"
6+
7+ "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/xproto"
9+)
10+
11+// XSETTINGS 0.5 manager (selection _XSETTINGS_S0). The window is the XWM's
12+// own, independent of any selection bridge window.
13+
14+const (
15+ xsBufSize = 1024
16+ xsMaxString = 256 // longest theme name published
17+ xsInt = 0
18+ xsString = 1
19+)
20+
21+// xsettings is the manager state. Settings are fixed, sorted by name.
22+type xsettings struct {
23+ win uint32
24+ active bool // we own _XSETTINGS_S0
25+ taken bool // another manager owns it (boot check)
26+ ownerNo uint32
27+ argb uint32 // ARGB32 picture format, 0 unknown
28+
29+ serial uint32
30+ // Last published values and the serial of their last change.
31+ dpi int32
32+ theme string
33+ size int32
34+ dpiSerial uint32
35+ themeSerial uint32
36+ sizeSerial uint32
37+
38+ buf [xsBufSize]byte
39+}
40+
41+// xsettingsDPI is Xft/DPI*1024 for a scale: 96 dpi at scale 1, rounded to an
42+// integer dpi.
43+func xsettingsDPI(scale float64) int32 {
44+ if scale <= 0 {
45+ scale = 1
46+ }
47+ return int32(math.Round(96*scale)) * 1024
48+}
49+
50+func (x *XWM) cursorThemeName() string {
51+ t := x.cfg.CursorTheme
52+ if t == "" {
53+ t = "default"
54+ }
55+ if len(t) > xsMaxString {
56+ t = t[:xsMaxString]
57+ }
58+ return t
59+}
60+
61+func (x *XWM) cursorThemeSize() int32 {
62+ if s := x.cfg.CursorSize; s >= 8 && s <= 256 {
63+ return int32(s)
64+ }
65+ return 24
66+}
67+
68+// bootSettings runs at the end of boot: the XSETTINGS manager and the root
69+// cursor. Failures are never fatal.
70+func (x *XWM) bootSettings() error {
71+ if err := x.bootXSettings(); err != nil {
72+ return err
73+ }
74+ return x.bootRootCursor()
75+}
76+
77+func (x *XWM) bootXSettings() error {
78+ if !x.cfg.XSettings {
79+ return nil
80+ }
81+ conn, b := x.conn, x.conn.Buf()
82+ win, err := conn.NewXID()
83+ if err != nil {
84+ return err
85+ }
86+ x.xs.win = win
87+ var wv xproto.CreateWindowValues
88+ wv.SetEventMask(0)
89+ xproto.CreateWindow(b, 0, xproto.Window(win), xproto.Window(x.root), -1, -1, 1, 1, 0, xproto.WindowClassInputOnly, 0, &wv)
90+ x.expect(xproto.GetSelectionOwner(b, xproto.Atom(x.atoms[atomXSettingsS0])), kindSelOwner, 0, 0)
91+ if err := conn.Sync(&x.h); err != nil {
92+ return err
93+ }
94+ if x.bootErr != nil {
95+ return x.bootErr
96+ }
97+ if x.xs.taken {
98+ x.log.Warn().Uint32("owner", x.xs.ownerNo).Msg("another XSETTINGS manager runs, not taking _XSETTINGS_S0")
99+ xproto.DestroyWindow(b, xproto.Window(win))
100+ x.xs.win = 0
101+ return nil
102+ }
103+ x.publishXSettings(true)
104+ sel := x.atoms[atomXSettingsS0]
105+ xproto.SetSelectionOwner(b, xproto.Window(win), xproto.Atom(sel), 0)
106+ // ICCCM §2.8: announce the new manager to the root.
107+ var ev [32]byte
108+ ev[0], ev[1] = 33, 32 // ClientMessage, format 32
109+ binary.LittleEndian.PutUint32(ev[4:], x.root)
110+ binary.LittleEndian.PutUint32(ev[8:], x.atoms[atomManager])
111+ binary.LittleEndian.PutUint32(ev[16:], sel)
112+ binary.LittleEndian.PutUint32(ev[20:], win)
113+ xproto.SendEvent(b, false, xproto.Window(x.root), xproto.EventMaskStructureNotify, &ev)
114+ x.xs.active = true
115+ return nil
116+}
117+
118+// onSelOwnerReply: the boot GetSelectionOwner of _XSETTINGS_S0.
119+func (x *XWM) onSelOwnerReply(r *xturbo.Reply) {
120+ if v, ok := xproto.ParseGetSelectionOwnerReply(r.Raw); ok && v.Owner() != 0 && uint32(v.Owner()) != x.xs.win {
121+ x.xs.taken, x.xs.ownerNo = true, uint32(v.Owner())
122+ }
123+}
124+
125+// onSelectionClear: another client took _XSETTINGS_S0.
126+func (x *XWM) onSelectionClear(ev *xturbo.Event) {
127+ e := xproto.SelectionClearEvent(xproto.SelectionClearOf(ev))
128+ if x.xs.active && uint32(e.Owner()) == x.xs.win && uint32(e.Selection()) == x.atoms[atomXSettingsS0] {
129+ x.xs.active = false
130+ x.log.Warn().Msg("XSETTINGS manager replaced by another client, settings no longer updated")
131+ }
132+}
133+
134+// refreshXSettings re-evaluates the DPI after a layout change.
135+func (x *XWM) refreshXSettings() {
136+ if !x.xs.active {
137+ return
138+ }
139+ if x.publishXSettings(false) {
140+ x.wake()
141+ }
142+}
143+
144+// publishXSettings encodes and writes the property when a value changed
145+// (force: the first time). It reports whether it wrote. Unchanged values cost
146+// no allocation and no request.
147+func (x *XWM) publishXSettings(force bool) bool {
148+ s := &x.xs
149+ dpi := xsettingsDPI(x.space.Scale())
150+ theme, size := x.cursorThemeName(), x.cursorThemeSize()
151+ if !force && s.serial != 0 && dpi == s.dpi && theme == s.theme && size == s.size {
152+ return false
153+ }
154+ next := s.serial + 1 // wraps
155+ if force || s.serial == 0 || dpi != s.dpi {
156+ s.dpiSerial = next
157+ }
158+ if force || s.serial == 0 || theme != s.theme {
159+ s.themeSerial = next
160+ }
161+ if force || s.serial == 0 || size != s.size {
162+ s.sizeSerial = next
163+ }
164+ s.serial, s.dpi, s.theme, s.size = next, dpi, theme, size
165+ n := s.encode()
166+ xproto.ChangeProperty(x.conn.Buf(), xproto.PropModeReplace, xproto.Window(s.win),
167+ xproto.Atom(x.atoms[atomXSettingsSettings]), xproto.Atom(x.atoms[atomXSettingsSettings]), 8, uint32(n), s.buf[:n])
168+ return true
169+}
170+
171+func pad4(n int) int { return (n + 3) &^ 3 }
172+
173+// encode writes the settings, sorted by name, into s.buf.
174+func (s *xsettings) encode() int {
175+ le := binary.LittleEndian
176+ b := s.buf[:]
177+ clear(b[:16])
178+ b[0] = 0 // LSBFirst
179+ le.PutUint32(b[4:], s.serial)
180+ le.PutUint32(b[8:], 3)
181+ n := 12
182+ putName := func(typ byte, name string, serial uint32) {
183+ b[n], b[n+1] = typ, 0
184+ le.PutUint16(b[n+2:], uint16(len(name)))
185+ n += 4
186+ copy(b[n:], name)
187+ clear(b[n+len(name) : n+pad4(len(name))])
188+ n += pad4(len(name))
189+ le.PutUint32(b[n:], serial)
190+ n += 4
191+ }
192+ putName(xsString, "Gtk/CursorThemeName", s.themeSerial)
193+ le.PutUint32(b[n:], uint32(len(s.theme)))
194+ n += 4
195+ copy(b[n:], s.theme)
196+ clear(b[n+len(s.theme) : n+pad4(len(s.theme))])
197+ n += pad4(len(s.theme))
198+ putName(xsInt, "Gtk/CursorThemeSize", s.sizeSerial)
199+ le.PutUint32(b[n:], uint32(s.size))
200+ n += 4
201+ putName(xsInt, "Xft/DPI", s.dpiSerial)
202+ le.PutUint32(b[n:], uint32(s.dpi))
203+ n += 4
204+ return n
205+}
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "encoding/binary"
5+ "math"
6+
7+ "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/xproto"
9+)
10+
11+// XSETTINGS 0.5 manager (selection _XSETTINGS_S0). The window is the XWM's
12+// own, independent of any selection bridge window.
13+
14+const (
15+ xsBufSize = 1024
16+ xsMaxString = 256 // longest theme name published
17+ xsInt = 0
18+ xsString = 1
19+)
20+
21+// xsettings is the manager state. Settings are fixed, sorted by name.
22+type xsettings struct {
23+ win uint32
24+ active bool // we own _XSETTINGS_S0
25+ taken bool // another manager owns it (boot check)
26+ ownerNo uint32
27+ argb uint32 // ARGB32 picture format, 0 unknown
28+
29+ serial uint32
30+ // Last published values and the serial of their last change.
31+ dpi int32
32+ theme string
33+ size int32
34+ dpiSerial uint32
35+ themeSerial uint32
36+ sizeSerial uint32
37+
38+ buf [xsBufSize]byte
39+}
40+
41+// xsettingsDPI is Xft/DPI*1024 for a scale: 96 dpi at scale 1, rounded to an
42+// integer dpi.
43+func xsettingsDPI(scale float64) int32 {
44+ if scale <= 0 {
45+ scale = 1
46+ }
47+ return int32(math.Round(96*scale)) * 1024
48+}
49+
50+func (x *XWM) cursorThemeName() string {
51+ t := x.cfg.CursorTheme
52+ if t == "" {
53+ t = "default"
54+ }
55+ if len(t) > xsMaxString {
56+ t = t[:xsMaxString]
57+ }
58+ return t
59+}
60+
61+func (x *XWM) cursorThemeSize() int32 {
62+ if s := x.cfg.CursorSize; s >= 8 && s <= 256 {
63+ return int32(s)
64+ }
65+ return 24
66+}
67+
68+// bootSettings runs at the end of boot: the XSETTINGS manager and the root
69+// cursor. Failures are never fatal.
70+func (x *XWM) bootSettings() error {
71+ if err := x.bootXSettings(); err != nil {
72+ return err
73+ }
74+ return x.bootRootCursor()
75+}
76+
77+func (x *XWM) bootXSettings() error {
78+ if !x.cfg.XSettings {
79+ return nil
80+ }
81+ conn, b := x.conn, x.conn.Buf()
82+ win, err := conn.NewXID()
83+ if err != nil {
84+ return err
85+ }
86+ x.xs.win = win
87+ var wv xproto.CreateWindowValues
88+ wv.SetEventMask(0)
89+ xproto.CreateWindow(b, 0, xproto.Window(win), xproto.Window(x.root), -1, -1, 1, 1, 0, xproto.WindowClassInputOnly, 0, &wv)
90+ x.expect(xproto.GetSelectionOwner(b, xproto.Atom(x.atoms[atomXSettingsS0])), kindSelOwner, 0, 0)
91+ if err := conn.Sync(&x.h); err != nil {
92+ return err
93+ }
94+ if x.bootErr != nil {
95+ return x.bootErr
96+ }
97+ if x.xs.taken {
98+ x.log.Warn().Uint32("owner", x.xs.ownerNo).Msg("another XSETTINGS manager runs, not taking _XSETTINGS_S0")
99+ xproto.DestroyWindow(b, xproto.Window(win))
100+ x.xs.win = 0
101+ return nil
102+ }
103+ x.publishXSettings(true)
104+ sel := x.atoms[atomXSettingsS0]
105+ xproto.SetSelectionOwner(b, xproto.Window(win), xproto.Atom(sel), 0)
106+ // ICCCM §2.8: announce the new manager to the root.
107+ var ev [32]byte
108+ ev[0], ev[1] = 33, 32 // ClientMessage, format 32
109+ binary.LittleEndian.PutUint32(ev[4:], x.root)
110+ binary.LittleEndian.PutUint32(ev[8:], x.atoms[atomManager])
111+ binary.LittleEndian.PutUint32(ev[16:], sel)
112+ binary.LittleEndian.PutUint32(ev[20:], win)
113+ xproto.SendEvent(b, false, xproto.Window(x.root), xproto.EventMaskStructureNotify, &ev)
114+ x.xs.active = true
115+ return nil
116+}
117+
118+// onSelOwnerReply: the boot GetSelectionOwner of _XSETTINGS_S0.
119+func (x *XWM) onSelOwnerReply(r *xturbo.Reply) {
120+ if v, ok := xproto.ParseGetSelectionOwnerReply(r.Raw); ok && v.Owner() != 0 && uint32(v.Owner()) != x.xs.win {
121+ x.xs.taken, x.xs.ownerNo = true, uint32(v.Owner())
122+ }
123+}
124+
125+// onSelectionClear: another client took _XSETTINGS_S0.
126+func (x *XWM) onSelectionClear(ev *xturbo.Event) {
127+ e := xproto.SelectionClearEvent(xproto.SelectionClearOf(ev))
128+ if x.xs.active && uint32(e.Owner()) == x.xs.win && uint32(e.Selection()) == x.atoms[atomXSettingsS0] {
129+ x.xs.active = false
130+ x.log.Warn().Msg("XSETTINGS manager replaced by another client, settings no longer updated")
131+ }
132+}
133+
134+// refreshXSettings re-evaluates the DPI after a layout change.
135+func (x *XWM) refreshXSettings() {
136+ if !x.xs.active {
137+ return
138+ }
139+ if x.publishXSettings(false) {
140+ x.wake()
141+ }
142+}
143+
144+// publishXSettings encodes and writes the property when a value changed
145+// (force: the first time). It reports whether it wrote. Unchanged values cost
146+// no allocation and no request.
147+func (x *XWM) publishXSettings(force bool) bool {
148+ s := &x.xs
149+ dpi := xsettingsDPI(x.space.Scale())
150+ theme, size := x.cursorThemeName(), x.cursorThemeSize()
151+ if !force && s.serial != 0 && dpi == s.dpi && theme == s.theme && size == s.size {
152+ return false
153+ }
154+ next := s.serial + 1 // wraps
155+ if force || s.serial == 0 || dpi != s.dpi {
156+ s.dpiSerial = next
157+ }
158+ if force || s.serial == 0 || theme != s.theme {
159+ s.themeSerial = next
160+ }
161+ if force || s.serial == 0 || size != s.size {
162+ s.sizeSerial = next
163+ }
164+ s.serial, s.dpi, s.theme, s.size = next, dpi, theme, size
165+ n := s.encode()
166+ xproto.ChangeProperty(x.conn.Buf(), xproto.PropModeReplace, xproto.Window(s.win),
167+ xproto.Atom(x.atoms[atomXSettingsSettings]), xproto.Atom(x.atoms[atomXSettingsSettings]), 8, uint32(n), s.buf[:n])
168+ return true
169+}
170+
171+func pad4(n int) int { return (n + 3) &^ 3 }
172+
173+// encode writes the settings, sorted by name, into s.buf.
174+func (s *xsettings) encode() int {
175+ le := binary.LittleEndian
176+ b := s.buf[:]
177+ clear(b[:16])
178+ b[0] = 0 // LSBFirst
179+ le.PutUint32(b[4:], s.serial)
180+ le.PutUint32(b[8:], 3)
181+ n := 12
182+ putName := func(typ byte, name string, serial uint32) {
183+ b[n], b[n+1] = typ, 0
184+ le.PutUint16(b[n+2:], uint16(len(name)))
185+ n += 4
186+ copy(b[n:], name)
187+ clear(b[n+len(name) : n+pad4(len(name))])
188+ n += pad4(len(name))
189+ le.PutUint32(b[n:], serial)
190+ n += 4
191+ }
192+ putName(xsString, "Gtk/CursorThemeName", s.themeSerial)
193+ le.PutUint32(b[n:], uint32(len(s.theme)))
194+ n += 4
195+ copy(b[n:], s.theme)
196+ clear(b[n+len(s.theme) : n+pad4(len(s.theme))])
197+ n += pad4(len(s.theme))
198+ putName(xsInt, "Gtk/CursorThemeSize", s.sizeSerial)
199+ le.PutUint32(b[n:], uint32(s.size))
200+ n += 4
201+ putName(xsInt, "Xft/DPI", s.dpiSerial)
202+ le.PutUint32(b[n:], uint32(s.dpi))
203+ n += 4
204+ return n
205+}
M internal/adapters/wayland/xwm/space.go +16 -4
@@ -15,9 +15,10 @@ type Region struct {
1515 type Space struct {
1616 regions [maxRegions]Region
1717 n int
18- dropped int // outputs beyond maxRegions in the last Set
19- ox, oy int // layout point that is X (0,0)
20- w, h int // X screen size: the extents
18+ dropped int // outputs beyond maxRegions in the last Set
19+ ox, oy int // layout point that is X (0,0)
20+ w, h int // X screen size: the extents
21+ scale float64 // scale of the first output; not part of the change test
2122 }
2223
2324 // Origin is the layout point that is X (0,0): the top-left of the layout
@@ -60,15 +61,26 @@ func (s *Space) Set(l ports.Layout) bool {
6061 }
6162 }
6263 next.w, next.h = maxX-next.ox, maxY-next.oy
64+ if n > 0 {
65+ next.scale = l[0].Scale
66+ }
6367 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&
6468 next.w == s.w && next.h == s.h {
65- s.dropped = next.dropped
69+ s.dropped, s.scale = next.dropped, next.scale
6670 return false
6771 }
6872 *s = next
6973 return true
7074 }
7175
76+// Scale is the scale of the first output of the layout, 1 when unset.
77+func (s *Space) Scale() float64 {
78+ if s.scale <= 0 {
79+ return 1
80+ }
81+ return s.scale
82+}
83+
7284 // Size is the X screen size.
7385 func (s *Space) Size() (w, h int) { return s.w, s.h }
7486
@@ -15,9 +15,10 @@ type Region struct {
15 type Space struct {15 type Space struct {
16 regions [maxRegions]Region16 regions [maxRegions]Region
17 n int17 n int
18- dropped int // outputs beyond maxRegions in the last Set18+ dropped int // outputs beyond maxRegions in the last Set
19- ox, oy int // layout point that is X (0,0)19+ ox, oy int // layout point that is X (0,0)
20- w, h int // X screen size: the extents20+ w, h int // X screen size: the extents
21+ scale float64 // scale of the first output; not part of the change test
21 }22 }
22 23
23 // Origin is the layout point that is X (0,0): the top-left of the layout24 // Origin is the layout point that is X (0,0): the top-left of the layout
@@ -60,15 +61,26 @@ func (s *Space) Set(l ports.Layout) bool {
60 }61 }
61 }62 }
62 next.w, next.h = maxX-next.ox, maxY-next.oy63 next.w, next.h = maxX-next.ox, maxY-next.oy
64+ if n > 0 {
65+ next.scale = l[0].Scale
66+ }
63 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&67 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&
64 next.w == s.w && next.h == s.h {68 next.w == s.w && next.h == s.h {
65- s.dropped = next.dropped69+ s.dropped, s.scale = next.dropped, next.scale
66 return false70 return false
67 }71 }
68 *s = next72 *s = next
69 return true73 return true
70 }74 }
71 75
76+// Scale is the scale of the first output of the layout, 1 when unset.
77+func (s *Space) Scale() float64 {
78+ if s.scale <= 0 {
79+ return 1
80+ }
81+ return s.scale
82+}
83+
72 // Size is the X screen size.84 // Size is the X screen size.
73 func (s *Space) Size() (w, h int) { return s.w, s.h }85 func (s *Space) Size() (w, h int) { return s.w, s.h }
74 86
M internal/adapters/wayland/xwm/testdata/streams/property_unchanged.hex +949 -949
@@ -1,950 +1,950 @@
1-1c00660001005000f30300000000000000000000000000000000000000000000
2-0108670003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00670001005000f30300000000000000000000
4-0000000000000000000000000108680003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c00680001005000
6-f303000000000000000000000000000000000000000000000108690003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00690001005000f303000000000000000000000000000000000000
9-0000000001086a0003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c006a0001005000f303000000000000
11-0000000000000000000000000000000001086b0003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c006b00
13-01005000f3030000000000000000000000000000000000000000000001086c00
14-03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c006c0001005000f3030000000000000000000000000000
16-000000000000000001086d0003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c006d0001005000f3030000
18-000000000000000000000000000000000000000001086e0003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c65000000
20-1c006e0001005000f30300000000000000000000000000000000000000000000
21-01086f0003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c006f0001005000f30300000000000000000000
23-0000000000000000000000000108700003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c00700001005000
25-f303000000000000000000000000000000000000000000000108710003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c00710001005000f303000000000000000000000000000000000000
28-000000000108720003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c00720001005000f303000000000000
30-000000000000000000000000000000000108730003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c007300
32-01005000f3030000000000000000000000000000000000000000000001087400
33-03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c00740001005000f3030000000000000000000000000000
35-00000000000000000108750003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00750001005000f3030000
37-00000000000000000000000000000000000000000108760003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00760001005000f30300000000000000000000000000000000000000000000
40-0108770003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00770001005000f30300000000000000000000
42-0000000000000000000000000108780003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c00780001005000
44-f303000000000000000000000000000000000000000000000108790003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00790001005000f303000000000000000000000000000000000000
47-0000000001087a0003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c007a0001005000f303000000000000
49-0000000000000000000000000000000001087b0003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c007b00
51-01005000f3030000000000000000000000000000000000000000000001087c00
52-03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c007c0001005000f3030000000000000000000000000000
54-000000000000000001087d0003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c007d0001005000f3030000
56-000000000000000000000000000000000000000001087e0003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c65000000
58-1c007e0001005000f30300000000000000000000000000000000000000000000
59-01087f0003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c007f0001005000f30300000000000000000000
61-0000000000000000000000000108800003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c00800001005000
63-f303000000000000000000000000000000000000000000000108810003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c00810001005000f303000000000000000000000000000000000000
66-000000000108820003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c00820001005000f303000000000000
68-000000000000000000000000000000000108830003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c008300
70-01005000f3030000000000000000000000000000000000000000000001088400
71-03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c00840001005000f3030000000000000000000000000000
73-00000000000000000108850003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00850001005000f3030000
75-00000000000000000000000000000000000000000108860003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00860001005000f30300000000000000000000000000000000000000000000
78-0108870003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00870001005000f30300000000000000000000
80-0000000000000000000000000108880003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c00880001005000
82-f303000000000000000000000000000000000000000000000108890003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00890001005000f303000000000000000000000000000000000000
85-0000000001088a0003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c008a0001005000f303000000000000
87-0000000000000000000000000000000001088b0003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c008b00
89-01005000f3030000000000000000000000000000000000000000000001088c00
90-03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c008c0001005000f3030000000000000000000000000000
92-000000000000000001088d0003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c008d0001005000f3030000
94-000000000000000000000000000000000000000001088e0003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c65000000
96-1c008e0001005000f30300000000000000000000000000000000000000000000
97-01088f0003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c008f0001005000f30300000000000000000000
99-0000000000000000000000000108900003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c00900001005000
101-f303000000000000000000000000000000000000000000000108910003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c00910001005000f303000000000000000000000000000000000000
104-000000000108920003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c00920001005000f303000000000000
106-000000000000000000000000000000000108930003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009300
108-01005000f3030000000000000000000000000000000000000000000001089400
109-03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c00940001005000f3030000000000000000000000000000
111-00000000000000000108950003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00950001005000f3030000
113-00000000000000000000000000000000000000000108960003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00960001005000f30300000000000000000000000000000000000000000000
116-0108970003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00970001005000f30300000000000000000000
118-0000000000000000000000000108980003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00980001005000
120-f303000000000000000000000000000000000000000000000108990003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00990001005000f303000000000000000000000000000000000000
123-0000000001089a0003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c009a0001005000f303000000000000
125-0000000000000000000000000000000001089b0003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c009b00
127-01005000f3030000000000000000000000000000000000000000000001089c00
128-03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c009c0001005000f3030000000000000000000000000000
130-000000000000000001089d0003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c009d0001005000f3030000
132-000000000000000000000000000000000000000001089e0003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000
134-1c009e0001005000f30300000000000000000000000000000000000000000000
135-01089f0003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c009f0001005000f30300000000000000000000
137-0000000000000000000000000108a00003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c00a00001005000
139-f303000000000000000000000000000000000000000000000108a10003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00a10001005000f303000000000000000000000000000000000000
142-000000000108a20003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00a20001005000f303000000000000
144-000000000000000000000000000000000108a30003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00a300
146-01005000f303000000000000000000000000000000000000000000000108a400
147-03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00a40001005000f3030000000000000000000000000000
149-00000000000000000108a50003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00a50001005000f3030000
151-00000000000000000000000000000000000000000108a60003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00a60001005000f30300000000000000000000000000000000000000000000
154-0108a70003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00a70001005000f30300000000000000000000
156-0000000000000000000000000108a80003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00a80001005000
158-f303000000000000000000000000000000000000000000000108a90003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00a90001005000f303000000000000000000000000000000000000
161-000000000108aa0003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00aa0001005000f303000000000000
163-000000000000000000000000000000000108ab0003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00ab00
165-01005000f303000000000000000000000000000000000000000000000108ac00
166-03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00ac0001005000f3030000000000000000000000000000
168-00000000000000000108ad0003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00ad0001005000f3030000
170-00000000000000000000000000000000000000000108ae0003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00ae0001005000f30300000000000000000000000000000000000000000000
173-0108af0003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00af0001005000f30300000000000000000000
175-0000000000000000000000000108b00003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00b00001005000
177-f303000000000000000000000000000000000000000000000108b10003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00b10001005000f303000000000000000000000000000000000000
180-000000000108b20003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00b20001005000f303000000000000
182-000000000000000000000000000000000108b30003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00b300
184-01005000f303000000000000000000000000000000000000000000000108b400
185-03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00b40001005000f3030000000000000000000000000000
187-00000000000000000108b50003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00b50001005000f3030000
189-00000000000000000000000000000000000000000108b60003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00b60001005000f30300000000000000000000000000000000000000000000
192-0108b70003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00b70001005000f30300000000000000000000
194-0000000000000000000000000108b80003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00b80001005000
196-f303000000000000000000000000000000000000000000000108b90003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00b90001005000f303000000000000000000000000000000000000
199-000000000108ba0003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00ba0001005000f303000000000000
201-000000000000000000000000000000000108bb0003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00bb00
203-01005000f303000000000000000000000000000000000000000000000108bc00
204-03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00bc0001005000f3030000000000000000000000000000
206-00000000000000000108bd0003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00bd0001005000f3030000
208-00000000000000000000000000000000000000000108be0003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00be0001005000f30300000000000000000000000000000000000000000000
211-0108bf0003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00bf0001005000f30300000000000000000000
213-0000000000000000000000000108c00003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00c00001005000
215-f303000000000000000000000000000000000000000000000108c10003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00c10001005000f303000000000000000000000000000000000000
218-000000000108c20003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00c20001005000f303000000000000
220-000000000000000000000000000000000108c30003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00c300
222-01005000f303000000000000000000000000000000000000000000000108c400
223-03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00c40001005000f3030000000000000000000000000000
225-00000000000000000108c50003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00c50001005000f3030000
227-00000000000000000000000000000000000000000108c60003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00c60001005000f30300000000000000000000000000000000000000000000
230-0108c70003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00c70001005000f30300000000000000000000
232-0000000000000000000000000108c80003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00c80001005000
234-f303000000000000000000000000000000000000000000000108c90003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00c90001005000f303000000000000000000000000000000000000
237-000000000108ca0003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00ca0001005000f303000000000000
239-000000000000000000000000000000000108cb0003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00cb00
241-01005000f303000000000000000000000000000000000000000000000108cc00
242-03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00cc0001005000f3030000000000000000000000000000
244-00000000000000000108cd0003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00cd0001005000f3030000
246-00000000000000000000000000000000000000000108ce0003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00ce0001005000f30300000000000000000000000000000000000000000000
249-0108cf0003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00cf0001005000f30300000000000000000000
251-0000000000000000000000000108d00003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00d00001005000
253-f303000000000000000000000000000000000000000000000108d10003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00d10001005000f303000000000000000000000000000000000000
256-000000000108d20003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00d20001005000f303000000000000
258-000000000000000000000000000000000108d30003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00d300
260-01005000f303000000000000000000000000000000000000000000000108d400
261-03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00d40001005000f3030000000000000000000000000000
263-00000000000000000108d50003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00d50001005000f3030000
265-00000000000000000000000000000000000000000108d60003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00d60001005000f30300000000000000000000000000000000000000000000
268-0108d70003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00d70001005000f30300000000000000000000
270-0000000000000000000000000108d80003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00d80001005000
272-f303000000000000000000000000000000000000000000000108d90003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00d90001005000f303000000000000000000000000000000000000
275-000000000108da0003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00da0001005000f303000000000000
277-000000000000000000000000000000000108db0003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00db00
279-01005000f303000000000000000000000000000000000000000000000108dc00
280-03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00dc0001005000f3030000000000000000000000000000
282-00000000000000000108dd0003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00dd0001005000f3030000
284-00000000000000000000000000000000000000000108de0003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00de0001005000f30300000000000000000000000000000000000000000000
287-0108df0003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00df0001005000f30300000000000000000000
289-0000000000000000000000000108e00003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00e00001005000
291-f303000000000000000000000000000000000000000000000108e10003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00e10001005000f303000000000000000000000000000000000000
294-000000000108e20003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00e20001005000f303000000000000
296-000000000000000000000000000000000108e30003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00e300
298-01005000f303000000000000000000000000000000000000000000000108e400
299-03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00e40001005000f3030000000000000000000000000000
301-00000000000000000108e50003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00e50001005000f3030000
303-00000000000000000000000000000000000000000108e60003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00e60001005000f30300000000000000000000000000000000000000000000
306-0108e70003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00e70001005000f30300000000000000000000
308-0000000000000000000000000108e80003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00e80001005000
310-f303000000000000000000000000000000000000000000000108e90003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00e90001005000f303000000000000000000000000000000000000
313-000000000108ea0003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00ea0001005000f303000000000000
315-000000000000000000000000000000000108eb0003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00eb00
317-01005000f303000000000000000000000000000000000000000000000108ec00
318-03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00ec0001005000f3030000000000000000000000000000
320-00000000000000000108ed0003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00ed0001005000f3030000
322-00000000000000000000000000000000000000000108ee0003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00ee0001005000f30300000000000000000000000000000000000000000000
325-0108ef0003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00ef0001005000f30300000000000000000000
327-0000000000000000000000000108f00003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00f00001005000
329-f303000000000000000000000000000000000000000000000108f10003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00f10001005000f303000000000000000000000000000000000000
332-000000000108f20003000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00f20001005000f303000000000000
334-000000000000000000000000000000000108f30003000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00f300
336-01005000f303000000000000000000000000000000000000000000000108f400
337-03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00f40001005000f3030000000000000000000000000000
339-00000000000000000108f50003000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00f50001005000f3030000
341-00000000000000000000000000000000000000000108f60003000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00f60001005000f30300000000000000000000000000000000000000000000
344-0108f70003000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00f70001005000f30300000000000000000000
346-0000000000000000000000000108f80003000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00f80001005000
348-f303000000000000000000000000000000000000000000000108f90003000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00f90001005000f303000000000000000000000000000000000000
351-000000000108fa0003000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00fa0001005000f303000000000000
353-000000000000000000000000000000000108fb0003000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c00fb00
355-01005000f303000000000000000000000000000000000000000000000108fc00
356-03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00fc0001005000f3030000000000000000000000000000
358-00000000000000000108fd0003000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00fd0001005000f3030000
360-00000000000000000000000000000000000000000108fe0003000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00fe0001005000f30300000000000000000000000000000000000000000000
363-0108ff0003000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c00ff0001005000f30300000000000000000000
365-0000000000000000000000000108000103000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c00000101005000
367-f303000000000000000000000000000000000000000000000108010103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c00010101005000f303000000000000000000000000000000000000
370-000000000108020103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c00020101005000f303000000000000
372-000000000000000000000000000000000108030103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000301
374-01005000f3030000000000000000000000000000000000000000000001080401
375-03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c00040101005000f3030000000000000000000000000000
377-00000000000000000108050103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00050101005000f3030000
379-00000000000000000000000000000000000000000108060103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00060101005000f30300000000000000000000000000000000000000000000
382-0108070103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00070101005000f30300000000000000000000
384-0000000000000000000000000108080103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00080101005000
386-f303000000000000000000000000000000000000000000000108090103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00090101005000f303000000000000000000000000000000000000
389-0000000001080a0103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c000a0101005000f303000000000000
391-0000000000000000000000000000000001080b0103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c000b01
393-01005000f3030000000000000000000000000000000000000000000001080c01
394-03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c000c0101005000f3030000000000000000000000000000
396-000000000000000001080d0103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c000d0101005000f3030000
398-000000000000000000000000000000000000000001080e0103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000
400-1c000e0101005000f30300000000000000000000000000000000000000000000
401-01080f0103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c000f0101005000f30300000000000000000000
403-0000000000000000000000000108100103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c00100101005000
405-f303000000000000000000000000000000000000000000000108110103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c00110101005000f303000000000000000000000000000000000000
408-000000000108120103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c00120101005000f303000000000000
410-000000000000000000000000000000000108130103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001301
412-01005000f3030000000000000000000000000000000000000000000001081401
413-03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c00140101005000f3030000000000000000000000000000
415-00000000000000000108150103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00150101005000f3030000
417-00000000000000000000000000000000000000000108160103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00160101005000f30300000000000000000000000000000000000000000000
420-0108170103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00170101005000f30300000000000000000000
422-0000000000000000000000000108180103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00180101005000
424-f303000000000000000000000000000000000000000000000108190103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00190101005000f303000000000000000000000000000000000000
427-0000000001081a0103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c001a0101005000f303000000000000
429-0000000000000000000000000000000001081b0103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c001b01
431-01005000f3030000000000000000000000000000000000000000000001081c01
432-03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c001c0101005000f3030000000000000000000000000000
434-000000000000000001081d0103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c001d0101005000f3030000
436-000000000000000000000000000000000000000001081e0103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000
438-1c001e0101005000f30300000000000000000000000000000000000000000000
439-01081f0103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c001f0101005000f30300000000000000000000
441-0000000000000000000000000108200103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c00200101005000
443-f303000000000000000000000000000000000000000000000108210103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c00210101005000f303000000000000000000000000000000000000
446-000000000108220103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c00220101005000f303000000000000
448-000000000000000000000000000000000108230103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002301
450-01005000f3030000000000000000000000000000000000000000000001082401
451-03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c00240101005000f3030000000000000000000000000000
453-00000000000000000108250103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00250101005000f3030000
455-00000000000000000000000000000000000000000108260103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00260101005000f30300000000000000000000000000000000000000000000
458-0108270103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00270101005000f30300000000000000000000
460-0000000000000000000000000108280103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00280101005000
462-f303000000000000000000000000000000000000000000000108290103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00290101005000f303000000000000000000000000000000000000
465-0000000001082a0103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c002a0101005000f303000000000000
467-0000000000000000000000000000000001082b0103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c002b01
469-01005000f3030000000000000000000000000000000000000000000001082c01
470-03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c002c0101005000f3030000000000000000000000000000
472-000000000000000001082d0103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c002d0101005000f3030000
474-000000000000000000000000000000000000000001082e0103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000
476-1c002e0101005000f30300000000000000000000000000000000000000000000
477-01082f0103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c002f0101005000f30300000000000000000000
479-0000000000000000000000000108300103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c00300101005000
481-f303000000000000000000000000000000000000000000000108310103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c00310101005000f303000000000000000000000000000000000000
484-000000000108320103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c00320101005000f303000000000000
486-000000000000000000000000000000000108330103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003301
488-01005000f3030000000000000000000000000000000000000000000001083401
489-03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c00340101005000f3030000000000000000000000000000
491-00000000000000000108350103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00350101005000f3030000
493-00000000000000000000000000000000000000000108360103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00360101005000f30300000000000000000000000000000000000000000000
496-0108370103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00370101005000f30300000000000000000000
498-0000000000000000000000000108380103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00380101005000
500-f303000000000000000000000000000000000000000000000108390103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00390101005000f303000000000000000000000000000000000000
503-0000000001083a0103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c003a0101005000f303000000000000
505-0000000000000000000000000000000001083b0103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c003b01
507-01005000f3030000000000000000000000000000000000000000000001083c01
508-03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c003c0101005000f3030000000000000000000000000000
510-000000000000000001083d0103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c003d0101005000f3030000
512-000000000000000000000000000000000000000001083e0103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000
514-1c003e0101005000f30300000000000000000000000000000000000000000000
515-01083f0103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c003f0101005000f30300000000000000000000
517-0000000000000000000000000108400103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c00400101005000
519-f303000000000000000000000000000000000000000000000108410103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c00410101005000f303000000000000000000000000000000000000
522-000000000108420103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c00420101005000f303000000000000
524-000000000000000000000000000000000108430103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004301
526-01005000f3030000000000000000000000000000000000000000000001084401
527-03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c00440101005000f3030000000000000000000000000000
529-00000000000000000108450103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00450101005000f3030000
531-00000000000000000000000000000000000000000108460103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00460101005000f30300000000000000000000000000000000000000000000
534-0108470103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00470101005000f30300000000000000000000
536-0000000000000000000000000108480103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00480101005000
538-f303000000000000000000000000000000000000000000000108490103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00490101005000f303000000000000000000000000000000000000
541-0000000001084a0103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c004a0101005000f303000000000000
543-0000000000000000000000000000000001084b0103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c004b01
545-01005000f3030000000000000000000000000000000000000000000001084c01
546-03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c004c0101005000f3030000000000000000000000000000
548-000000000000000001084d0103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c004d0101005000f3030000
550-000000000000000000000000000000000000000001084e0103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000
552-1c004e0101005000f30300000000000000000000000000000000000000000000
553-01084f0103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c004f0101005000f30300000000000000000000
555-0000000000000000000000000108500103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c00500101005000
557-f303000000000000000000000000000000000000000000000108510103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c00510101005000f303000000000000000000000000000000000000
560-000000000108520103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c00520101005000f303000000000000
562-000000000000000000000000000000000108530103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005301
564-01005000f3030000000000000000000000000000000000000000000001085401
565-03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c00540101005000f3030000000000000000000000000000
567-00000000000000000108550103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00550101005000f3030000
569-00000000000000000000000000000000000000000108560103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00560101005000f30300000000000000000000000000000000000000000000
572-0108570103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00570101005000f30300000000000000000000
574-0000000000000000000000000108580103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00580101005000
576-f303000000000000000000000000000000000000000000000108590103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00590101005000f303000000000000000000000000000000000000
579-0000000001085a0103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c005a0101005000f303000000000000
581-0000000000000000000000000000000001085b0103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c005b01
583-01005000f3030000000000000000000000000000000000000000000001085c01
584-03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c005c0101005000f3030000000000000000000000000000
586-000000000000000001085d0103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c005d0101005000f3030000
588-000000000000000000000000000000000000000001085e0103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000
590-1c005e0101005000f30300000000000000000000000000000000000000000000
591-01085f0103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c005f0101005000f30300000000000000000000
593-0000000000000000000000000108600103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c00600101005000
595-f303000000000000000000000000000000000000000000000108610103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c00610101005000f303000000000000000000000000000000000000
598-000000000108620103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c00620101005000f303000000000000
600-000000000000000000000000000000000108630103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006301
602-01005000f3030000000000000000000000000000000000000000000001086401
603-03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c00640101005000f3030000000000000000000000000000
605-00000000000000000108650103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00650101005000f3030000
607-00000000000000000000000000000000000000000108660103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00660101005000f30300000000000000000000000000000000000000000000
610-0108670103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00670101005000f30300000000000000000000
612-0000000000000000000000000108680103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00680101005000
614-f303000000000000000000000000000000000000000000000108690103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00690101005000f303000000000000000000000000000000000000
617-0000000001086a0103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c006a0101005000f303000000000000
619-0000000000000000000000000000000001086b0103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c006b01
621-01005000f3030000000000000000000000000000000000000000000001086c01
622-03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c006c0101005000f3030000000000000000000000000000
624-000000000000000001086d0103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c006d0101005000f3030000
626-000000000000000000000000000000000000000001086e0103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000
628-1c006e0101005000f30300000000000000000000000000000000000000000000
629-01086f0103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c006f0101005000f30300000000000000000000
631-0000000000000000000000000108700103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c00700101005000
633-f303000000000000000000000000000000000000000000000108710103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c00710101005000f303000000000000000000000000000000000000
636-000000000108720103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c00720101005000f303000000000000
638-000000000000000000000000000000000108730103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007301
640-01005000f3030000000000000000000000000000000000000000000001087401
641-03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c00740101005000f3030000000000000000000000000000
643-00000000000000000108750103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00750101005000f3030000
645-00000000000000000000000000000000000000000108760103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00760101005000f30300000000000000000000000000000000000000000000
648-0108770103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00770101005000f30300000000000000000000
650-0000000000000000000000000108780103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00780101005000
652-f303000000000000000000000000000000000000000000000108790103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00790101005000f303000000000000000000000000000000000000
655-0000000001087a0103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c007a0101005000f303000000000000
657-0000000000000000000000000000000001087b0103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c007b01
659-01005000f3030000000000000000000000000000000000000000000001087c01
660-03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c007c0101005000f3030000000000000000000000000000
662-000000000000000001087d0103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c007d0101005000f3030000
664-000000000000000000000000000000000000000001087e0103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000
666-1c007e0101005000f30300000000000000000000000000000000000000000000
667-01087f0103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c007f0101005000f30300000000000000000000
669-0000000000000000000000000108800103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c00800101005000
671-f303000000000000000000000000000000000000000000000108810103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c00810101005000f303000000000000000000000000000000000000
674-000000000108820103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c00820101005000f303000000000000
676-000000000000000000000000000000000108830103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008301
678-01005000f3030000000000000000000000000000000000000000000001088401
679-03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c00840101005000f3030000000000000000000000000000
681-00000000000000000108850103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00850101005000f3030000
683-00000000000000000000000000000000000000000108860103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00860101005000f30300000000000000000000000000000000000000000000
686-0108870103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00870101005000f30300000000000000000000
688-0000000000000000000000000108880103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00880101005000
690-f303000000000000000000000000000000000000000000000108890103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00890101005000f303000000000000000000000000000000000000
693-0000000001088a0103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c008a0101005000f303000000000000
695-0000000000000000000000000000000001088b0103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c008b01
697-01005000f3030000000000000000000000000000000000000000000001088c01
698-03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c008c0101005000f3030000000000000000000000000000
700-000000000000000001088d0103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c008d0101005000f3030000
702-000000000000000000000000000000000000000001088e0103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000
704-1c008e0101005000f30300000000000000000000000000000000000000000000
705-01088f0103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c008f0101005000f30300000000000000000000
707-0000000000000000000000000108900103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c00900101005000
709-f303000000000000000000000000000000000000000000000108910103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c00910101005000f303000000000000000000000000000000000000
712-000000000108920103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c00920101005000f303000000000000
714-000000000000000000000000000000000108930103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009301
716-01005000f3030000000000000000000000000000000000000000000001089401
717-03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c00940101005000f3030000000000000000000000000000
719-00000000000000000108950103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00950101005000f3030000
721-00000000000000000000000000000000000000000108960103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00960101005000f30300000000000000000000000000000000000000000000
724-0108970103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00970101005000f30300000000000000000000
726-0000000000000000000000000108980103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00980101005000
728-f303000000000000000000000000000000000000000000000108990103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00990101005000f303000000000000000000000000000000000000
731-0000000001089a0103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c009a0101005000f303000000000000
733-0000000000000000000000000000000001089b0103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c009b01
735-01005000f3030000000000000000000000000000000000000000000001089c01
736-03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c009c0101005000f3030000000000000000000000000000
738-000000000000000001089d0103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c009d0101005000f3030000
740-000000000000000000000000000000000000000001089e0103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000
742-1c009e0101005000f30300000000000000000000000000000000000000000000
743-01089f0103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c009f0101005000f30300000000000000000000
745-0000000000000000000000000108a00103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c00a00101005000
747-f303000000000000000000000000000000000000000000000108a10103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00a10101005000f303000000000000000000000000000000000000
750-000000000108a20103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00a20101005000f303000000000000
752-000000000000000000000000000000000108a30103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00a301
754-01005000f303000000000000000000000000000000000000000000000108a401
755-03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00a40101005000f3030000000000000000000000000000
757-00000000000000000108a50103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00a50101005000f3030000
759-00000000000000000000000000000000000000000108a60103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00a60101005000f30300000000000000000000000000000000000000000000
762-0108a70103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00a70101005000f30300000000000000000000
764-0000000000000000000000000108a80103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00a80101005000
766-f303000000000000000000000000000000000000000000000108a90103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00a90101005000f303000000000000000000000000000000000000
769-000000000108aa0103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00aa0101005000f303000000000000
771-000000000000000000000000000000000108ab0103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00ab01
773-01005000f303000000000000000000000000000000000000000000000108ac01
774-03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00ac0101005000f3030000000000000000000000000000
776-00000000000000000108ad0103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00ad0101005000f3030000
778-00000000000000000000000000000000000000000108ae0103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00ae0101005000f30300000000000000000000000000000000000000000000
781-0108af0103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00af0101005000f30300000000000000000000
783-0000000000000000000000000108b00103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00b00101005000
785-f303000000000000000000000000000000000000000000000108b10103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00b10101005000f303000000000000000000000000000000000000
788-000000000108b20103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00b20101005000f303000000000000
790-000000000000000000000000000000000108b30103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00b301
792-01005000f303000000000000000000000000000000000000000000000108b401
793-03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00b40101005000f3030000000000000000000000000000
795-00000000000000000108b50103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00b50101005000f3030000
797-00000000000000000000000000000000000000000108b60103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00b60101005000f30300000000000000000000000000000000000000000000
800-0108b70103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00b70101005000f30300000000000000000000
802-0000000000000000000000000108b80103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00b80101005000
804-f303000000000000000000000000000000000000000000000108b90103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00b90101005000f303000000000000000000000000000000000000
807-000000000108ba0103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00ba0101005000f303000000000000
809-000000000000000000000000000000000108bb0103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00bb01
811-01005000f303000000000000000000000000000000000000000000000108bc01
812-03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00bc0101005000f3030000000000000000000000000000
814-00000000000000000108bd0103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00bd0101005000f3030000
816-00000000000000000000000000000000000000000108be0103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00be0101005000f30300000000000000000000000000000000000000000000
819-0108bf0103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00bf0101005000f30300000000000000000000
821-0000000000000000000000000108c00103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00c00101005000
823-f303000000000000000000000000000000000000000000000108c10103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00c10101005000f303000000000000000000000000000000000000
826-000000000108c20103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00c20101005000f303000000000000
828-000000000000000000000000000000000108c30103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00c301
830-01005000f303000000000000000000000000000000000000000000000108c401
831-03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00c40101005000f3030000000000000000000000000000
833-00000000000000000108c50103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00c50101005000f3030000
835-00000000000000000000000000000000000000000108c60103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00c60101005000f30300000000000000000000000000000000000000000000
838-0108c70103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00c70101005000f30300000000000000000000
840-0000000000000000000000000108c80103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00c80101005000
842-f303000000000000000000000000000000000000000000000108c90103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00c90101005000f303000000000000000000000000000000000000
845-000000000108ca0103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00ca0101005000f303000000000000
847-000000000000000000000000000000000108cb0103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00cb01
849-01005000f303000000000000000000000000000000000000000000000108cc01
850-03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00cc0101005000f3030000000000000000000000000000
852-00000000000000000108cd0103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00cd0101005000f3030000
854-00000000000000000000000000000000000000000108ce0103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00ce0101005000f30300000000000000000000000000000000000000000000
857-0108cf0103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00cf0101005000f30300000000000000000000
859-0000000000000000000000000108d00103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00d00101005000
861-f303000000000000000000000000000000000000000000000108d10103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00d10101005000f303000000000000000000000000000000000000
864-000000000108d20103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00d20101005000f303000000000000
866-000000000000000000000000000000000108d30103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00d301
868-01005000f303000000000000000000000000000000000000000000000108d401
869-03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00d40101005000f3030000000000000000000000000000
871-00000000000000000108d50103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00d50101005000f3030000
873-00000000000000000000000000000000000000000108d60103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00d60101005000f30300000000000000000000000000000000000000000000
876-0108d70103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00d70101005000f30300000000000000000000
878-0000000000000000000000000108d80103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00d80101005000
880-f303000000000000000000000000000000000000000000000108d90103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00d90101005000f303000000000000000000000000000000000000
883-000000000108da0103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00da0101005000f303000000000000
885-000000000000000000000000000000000108db0103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00db01
887-01005000f303000000000000000000000000000000000000000000000108dc01
888-03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00dc0101005000f3030000000000000000000000000000
890-00000000000000000108dd0103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00dd0101005000f3030000
892-00000000000000000000000000000000000000000108de0103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00de0101005000f30300000000000000000000000000000000000000000000
895-0108df0103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00df0101005000f30300000000000000000000
897-0000000000000000000000000108e00103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00e00101005000
899-f303000000000000000000000000000000000000000000000108e10103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00e10101005000f303000000000000000000000000000000000000
902-000000000108e20103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00e20101005000f303000000000000
904-000000000000000000000000000000000108e30103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00e301
906-01005000f303000000000000000000000000000000000000000000000108e401
907-03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00e40101005000f3030000000000000000000000000000
909-00000000000000000108e50103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00e50101005000f3030000
911-00000000000000000000000000000000000000000108e60103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00e60101005000f30300000000000000000000000000000000000000000000
914-0108e70103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00e70101005000f30300000000000000000000
916-0000000000000000000000000108e80103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00e80101005000
918-f303000000000000000000000000000000000000000000000108e90103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00e90101005000f303000000000000000000000000000000000000
921-000000000108ea0103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00ea0101005000f303000000000000
923-000000000000000000000000000000000108eb0103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00eb01
925-01005000f303000000000000000000000000000000000000000000000108ec01
926-03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00ec0101005000f3030000000000000000000000000000
928-00000000000000000108ed0103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00ed0101005000f3030000
930-00000000000000000000000000000000000000000108ee0103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00ee0101005000f30300000000000000000000000000000000000000000000
933-0108ef0103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00ef0101005000f30300000000000000000000
935-0000000000000000000000000108f00103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00f00101005000
937-f303000000000000000000000000000000000000000000000108f10103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00f10101005000f303000000000000000000000000000000000000
940-000000000108f20103000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00f20101005000f303000000000000
942-000000000000000000000000000000000108f30103000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00f301
944-01005000f303000000000000000000000000000000000000000000000108f401
945-03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00f40101005000f3030000000000000000000000000000
947-00000000000000000108f50103000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00f50101005000f3030000
949-00000000000000000000000000000000000000000108f60103000000ef030000
1+1c00690001005000f30300000000000000000000000000000000000000000000
2+01086a0003000000ef0300000000000009000000000000000000000000000000
3+6e6574207469746c650000001c006a0001005000f30300000000000000000000
4+00000000000000000000000001086b0003000000ef0300000000000009000000
5+0000000000000000000000006e6574207469746c650000001c006b0001005000
6+f3030000000000000000000000000000000000000000000001086c0003000000
7+ef03000000000000090000000000000000000000000000006e6574207469746c
8+650000001c006c0001005000f303000000000000000000000000000000000000
9+0000000001086d0003000000ef03000000000000090000000000000000000000
10+000000006e6574207469746c650000001c006d0001005000f303000000000000
11+0000000000000000000000000000000001086e0003000000ef03000000000000
12+090000000000000000000000000000006e6574207469746c650000001c006e00
13+01005000f3030000000000000000000000000000000000000000000001086f00
14+03000000ef03000000000000090000000000000000000000000000006e657420
15+7469746c650000001c006f0001005000f3030000000000000000000000000000
16+00000000000000000108700003000000ef030000000000000900000000000000
17+00000000000000006e6574207469746c650000001c00700001005000f3030000
18+00000000000000000000000000000000000000000108710003000000ef030000
19+00000000090000000000000000000000000000006e6574207469746c65000000
20+1c00710001005000f30300000000000000000000000000000000000000000000
21+0108720003000000ef0300000000000009000000000000000000000000000000
22+6e6574207469746c650000001c00720001005000f30300000000000000000000
23+0000000000000000000000000108730003000000ef0300000000000009000000
24+0000000000000000000000006e6574207469746c650000001c00730001005000
25+f303000000000000000000000000000000000000000000000108740003000000
26+ef03000000000000090000000000000000000000000000006e6574207469746c
27+650000001c00740001005000f303000000000000000000000000000000000000
28+000000000108750003000000ef03000000000000090000000000000000000000
29+000000006e6574207469746c650000001c00750001005000f303000000000000
30+000000000000000000000000000000000108760003000000ef03000000000000
31+090000000000000000000000000000006e6574207469746c650000001c007600
32+01005000f3030000000000000000000000000000000000000000000001087700
33+03000000ef03000000000000090000000000000000000000000000006e657420
34+7469746c650000001c00770001005000f3030000000000000000000000000000
35+00000000000000000108780003000000ef030000000000000900000000000000
36+00000000000000006e6574207469746c650000001c00780001005000f3030000
37+00000000000000000000000000000000000000000108790003000000ef030000
38+00000000090000000000000000000000000000006e6574207469746c65000000
39+1c00790001005000f30300000000000000000000000000000000000000000000
40+01087a0003000000ef0300000000000009000000000000000000000000000000
41+6e6574207469746c650000001c007a0001005000f30300000000000000000000
42+00000000000000000000000001087b0003000000ef0300000000000009000000
43+0000000000000000000000006e6574207469746c650000001c007b0001005000
44+f3030000000000000000000000000000000000000000000001087c0003000000
45+ef03000000000000090000000000000000000000000000006e6574207469746c
46+650000001c007c0001005000f303000000000000000000000000000000000000
47+0000000001087d0003000000ef03000000000000090000000000000000000000
48+000000006e6574207469746c650000001c007d0001005000f303000000000000
49+0000000000000000000000000000000001087e0003000000ef03000000000000
50+090000000000000000000000000000006e6574207469746c650000001c007e00
51+01005000f3030000000000000000000000000000000000000000000001087f00
52+03000000ef03000000000000090000000000000000000000000000006e657420
53+7469746c650000001c007f0001005000f3030000000000000000000000000000
54+00000000000000000108800003000000ef030000000000000900000000000000
55+00000000000000006e6574207469746c650000001c00800001005000f3030000
56+00000000000000000000000000000000000000000108810003000000ef030000
57+00000000090000000000000000000000000000006e6574207469746c65000000
58+1c00810001005000f30300000000000000000000000000000000000000000000
59+0108820003000000ef0300000000000009000000000000000000000000000000
60+6e6574207469746c650000001c00820001005000f30300000000000000000000
61+0000000000000000000000000108830003000000ef0300000000000009000000
62+0000000000000000000000006e6574207469746c650000001c00830001005000
63+f303000000000000000000000000000000000000000000000108840003000000
64+ef03000000000000090000000000000000000000000000006e6574207469746c
65+650000001c00840001005000f303000000000000000000000000000000000000
66+000000000108850003000000ef03000000000000090000000000000000000000
67+000000006e6574207469746c650000001c00850001005000f303000000000000
68+000000000000000000000000000000000108860003000000ef03000000000000
69+090000000000000000000000000000006e6574207469746c650000001c008600
70+01005000f3030000000000000000000000000000000000000000000001088700
71+03000000ef03000000000000090000000000000000000000000000006e657420
72+7469746c650000001c00870001005000f3030000000000000000000000000000
73+00000000000000000108880003000000ef030000000000000900000000000000
74+00000000000000006e6574207469746c650000001c00880001005000f3030000
75+00000000000000000000000000000000000000000108890003000000ef030000
76+00000000090000000000000000000000000000006e6574207469746c65000000
77+1c00890001005000f30300000000000000000000000000000000000000000000
78+01088a0003000000ef0300000000000009000000000000000000000000000000
79+6e6574207469746c650000001c008a0001005000f30300000000000000000000
80+00000000000000000000000001088b0003000000ef0300000000000009000000
81+0000000000000000000000006e6574207469746c650000001c008b0001005000
82+f3030000000000000000000000000000000000000000000001088c0003000000
83+ef03000000000000090000000000000000000000000000006e6574207469746c
84+650000001c008c0001005000f303000000000000000000000000000000000000
85+0000000001088d0003000000ef03000000000000090000000000000000000000
86+000000006e6574207469746c650000001c008d0001005000f303000000000000
87+0000000000000000000000000000000001088e0003000000ef03000000000000
88+090000000000000000000000000000006e6574207469746c650000001c008e00
89+01005000f3030000000000000000000000000000000000000000000001088f00
90+03000000ef03000000000000090000000000000000000000000000006e657420
91+7469746c650000001c008f0001005000f3030000000000000000000000000000
92+00000000000000000108900003000000ef030000000000000900000000000000
93+00000000000000006e6574207469746c650000001c00900001005000f3030000
94+00000000000000000000000000000000000000000108910003000000ef030000
95+00000000090000000000000000000000000000006e6574207469746c65000000
96+1c00910001005000f30300000000000000000000000000000000000000000000
97+0108920003000000ef0300000000000009000000000000000000000000000000
98+6e6574207469746c650000001c00920001005000f30300000000000000000000
99+0000000000000000000000000108930003000000ef0300000000000009000000
100+0000000000000000000000006e6574207469746c650000001c00930001005000
101+f303000000000000000000000000000000000000000000000108940003000000
102+ef03000000000000090000000000000000000000000000006e6574207469746c
103+650000001c00940001005000f303000000000000000000000000000000000000
104+000000000108950003000000ef03000000000000090000000000000000000000
105+000000006e6574207469746c650000001c00950001005000f303000000000000
106+000000000000000000000000000000000108960003000000ef03000000000000
107+090000000000000000000000000000006e6574207469746c650000001c009600
108+01005000f3030000000000000000000000000000000000000000000001089700
109+03000000ef03000000000000090000000000000000000000000000006e657420
110+7469746c650000001c00970001005000f3030000000000000000000000000000
111+00000000000000000108980003000000ef030000000000000900000000000000
112+00000000000000006e6574207469746c650000001c00980001005000f3030000
113+00000000000000000000000000000000000000000108990003000000ef030000
114+00000000090000000000000000000000000000006e6574207469746c65000000
115+1c00990001005000f30300000000000000000000000000000000000000000000
116+01089a0003000000ef0300000000000009000000000000000000000000000000
117+6e6574207469746c650000001c009a0001005000f30300000000000000000000
118+00000000000000000000000001089b0003000000ef0300000000000009000000
119+0000000000000000000000006e6574207469746c650000001c009b0001005000
120+f3030000000000000000000000000000000000000000000001089c0003000000
121+ef03000000000000090000000000000000000000000000006e6574207469746c
122+650000001c009c0001005000f303000000000000000000000000000000000000
123+0000000001089d0003000000ef03000000000000090000000000000000000000
124+000000006e6574207469746c650000001c009d0001005000f303000000000000
125+0000000000000000000000000000000001089e0003000000ef03000000000000
126+090000000000000000000000000000006e6574207469746c650000001c009e00
127+01005000f3030000000000000000000000000000000000000000000001089f00
128+03000000ef03000000000000090000000000000000000000000000006e657420
129+7469746c650000001c009f0001005000f3030000000000000000000000000000
130+00000000000000000108a00003000000ef030000000000000900000000000000
131+00000000000000006e6574207469746c650000001c00a00001005000f3030000
132+00000000000000000000000000000000000000000108a10003000000ef030000
133+00000000090000000000000000000000000000006e6574207469746c65000000
134+1c00a10001005000f30300000000000000000000000000000000000000000000
135+0108a20003000000ef0300000000000009000000000000000000000000000000
136+6e6574207469746c650000001c00a20001005000f30300000000000000000000
137+0000000000000000000000000108a30003000000ef0300000000000009000000
138+0000000000000000000000006e6574207469746c650000001c00a30001005000
139+f303000000000000000000000000000000000000000000000108a40003000000
140+ef03000000000000090000000000000000000000000000006e6574207469746c
141+650000001c00a40001005000f303000000000000000000000000000000000000
142+000000000108a50003000000ef03000000000000090000000000000000000000
143+000000006e6574207469746c650000001c00a50001005000f303000000000000
144+000000000000000000000000000000000108a60003000000ef03000000000000
145+090000000000000000000000000000006e6574207469746c650000001c00a600
146+01005000f303000000000000000000000000000000000000000000000108a700
147+03000000ef03000000000000090000000000000000000000000000006e657420
148+7469746c650000001c00a70001005000f3030000000000000000000000000000
149+00000000000000000108a80003000000ef030000000000000900000000000000
150+00000000000000006e6574207469746c650000001c00a80001005000f3030000
151+00000000000000000000000000000000000000000108a90003000000ef030000
152+00000000090000000000000000000000000000006e6574207469746c65000000
153+1c00a90001005000f30300000000000000000000000000000000000000000000
154+0108aa0003000000ef0300000000000009000000000000000000000000000000
155+6e6574207469746c650000001c00aa0001005000f30300000000000000000000
156+0000000000000000000000000108ab0003000000ef0300000000000009000000
157+0000000000000000000000006e6574207469746c650000001c00ab0001005000
158+f303000000000000000000000000000000000000000000000108ac0003000000
159+ef03000000000000090000000000000000000000000000006e6574207469746c
160+650000001c00ac0001005000f303000000000000000000000000000000000000
161+000000000108ad0003000000ef03000000000000090000000000000000000000
162+000000006e6574207469746c650000001c00ad0001005000f303000000000000
163+000000000000000000000000000000000108ae0003000000ef03000000000000
164+090000000000000000000000000000006e6574207469746c650000001c00ae00
165+01005000f303000000000000000000000000000000000000000000000108af00
166+03000000ef03000000000000090000000000000000000000000000006e657420
167+7469746c650000001c00af0001005000f3030000000000000000000000000000
168+00000000000000000108b00003000000ef030000000000000900000000000000
169+00000000000000006e6574207469746c650000001c00b00001005000f3030000
170+00000000000000000000000000000000000000000108b10003000000ef030000
171+00000000090000000000000000000000000000006e6574207469746c65000000
172+1c00b10001005000f30300000000000000000000000000000000000000000000
173+0108b20003000000ef0300000000000009000000000000000000000000000000
174+6e6574207469746c650000001c00b20001005000f30300000000000000000000
175+0000000000000000000000000108b30003000000ef0300000000000009000000
176+0000000000000000000000006e6574207469746c650000001c00b30001005000
177+f303000000000000000000000000000000000000000000000108b40003000000
178+ef03000000000000090000000000000000000000000000006e6574207469746c
179+650000001c00b40001005000f303000000000000000000000000000000000000
180+000000000108b50003000000ef03000000000000090000000000000000000000
181+000000006e6574207469746c650000001c00b50001005000f303000000000000
182+000000000000000000000000000000000108b60003000000ef03000000000000
183+090000000000000000000000000000006e6574207469746c650000001c00b600
184+01005000f303000000000000000000000000000000000000000000000108b700
185+03000000ef03000000000000090000000000000000000000000000006e657420
186+7469746c650000001c00b70001005000f3030000000000000000000000000000
187+00000000000000000108b80003000000ef030000000000000900000000000000
188+00000000000000006e6574207469746c650000001c00b80001005000f3030000
189+00000000000000000000000000000000000000000108b90003000000ef030000
190+00000000090000000000000000000000000000006e6574207469746c65000000
191+1c00b90001005000f30300000000000000000000000000000000000000000000
192+0108ba0003000000ef0300000000000009000000000000000000000000000000
193+6e6574207469746c650000001c00ba0001005000f30300000000000000000000
194+0000000000000000000000000108bb0003000000ef0300000000000009000000
195+0000000000000000000000006e6574207469746c650000001c00bb0001005000
196+f303000000000000000000000000000000000000000000000108bc0003000000
197+ef03000000000000090000000000000000000000000000006e6574207469746c
198+650000001c00bc0001005000f303000000000000000000000000000000000000
199+000000000108bd0003000000ef03000000000000090000000000000000000000
200+000000006e6574207469746c650000001c00bd0001005000f303000000000000
201+000000000000000000000000000000000108be0003000000ef03000000000000
202+090000000000000000000000000000006e6574207469746c650000001c00be00
203+01005000f303000000000000000000000000000000000000000000000108bf00
204+03000000ef03000000000000090000000000000000000000000000006e657420
205+7469746c650000001c00bf0001005000f3030000000000000000000000000000
206+00000000000000000108c00003000000ef030000000000000900000000000000
207+00000000000000006e6574207469746c650000001c00c00001005000f3030000
208+00000000000000000000000000000000000000000108c10003000000ef030000
209+00000000090000000000000000000000000000006e6574207469746c65000000
210+1c00c10001005000f30300000000000000000000000000000000000000000000
211+0108c20003000000ef0300000000000009000000000000000000000000000000
212+6e6574207469746c650000001c00c20001005000f30300000000000000000000
213+0000000000000000000000000108c30003000000ef0300000000000009000000
214+0000000000000000000000006e6574207469746c650000001c00c30001005000
215+f303000000000000000000000000000000000000000000000108c40003000000
216+ef03000000000000090000000000000000000000000000006e6574207469746c
217+650000001c00c40001005000f303000000000000000000000000000000000000
218+000000000108c50003000000ef03000000000000090000000000000000000000
219+000000006e6574207469746c650000001c00c50001005000f303000000000000
220+000000000000000000000000000000000108c60003000000ef03000000000000
221+090000000000000000000000000000006e6574207469746c650000001c00c600
222+01005000f303000000000000000000000000000000000000000000000108c700
223+03000000ef03000000000000090000000000000000000000000000006e657420
224+7469746c650000001c00c70001005000f3030000000000000000000000000000
225+00000000000000000108c80003000000ef030000000000000900000000000000
226+00000000000000006e6574207469746c650000001c00c80001005000f3030000
227+00000000000000000000000000000000000000000108c90003000000ef030000
228+00000000090000000000000000000000000000006e6574207469746c65000000
229+1c00c90001005000f30300000000000000000000000000000000000000000000
230+0108ca0003000000ef0300000000000009000000000000000000000000000000
231+6e6574207469746c650000001c00ca0001005000f30300000000000000000000
232+0000000000000000000000000108cb0003000000ef0300000000000009000000
233+0000000000000000000000006e6574207469746c650000001c00cb0001005000
234+f303000000000000000000000000000000000000000000000108cc0003000000
235+ef03000000000000090000000000000000000000000000006e6574207469746c
236+650000001c00cc0001005000f303000000000000000000000000000000000000
237+000000000108cd0003000000ef03000000000000090000000000000000000000
238+000000006e6574207469746c650000001c00cd0001005000f303000000000000
239+000000000000000000000000000000000108ce0003000000ef03000000000000
240+090000000000000000000000000000006e6574207469746c650000001c00ce00
241+01005000f303000000000000000000000000000000000000000000000108cf00
242+03000000ef03000000000000090000000000000000000000000000006e657420
243+7469746c650000001c00cf0001005000f3030000000000000000000000000000
244+00000000000000000108d00003000000ef030000000000000900000000000000
245+00000000000000006e6574207469746c650000001c00d00001005000f3030000
246+00000000000000000000000000000000000000000108d10003000000ef030000
247+00000000090000000000000000000000000000006e6574207469746c65000000
248+1c00d10001005000f30300000000000000000000000000000000000000000000
249+0108d20003000000ef0300000000000009000000000000000000000000000000
250+6e6574207469746c650000001c00d20001005000f30300000000000000000000
251+0000000000000000000000000108d30003000000ef0300000000000009000000
252+0000000000000000000000006e6574207469746c650000001c00d30001005000
253+f303000000000000000000000000000000000000000000000108d40003000000
254+ef03000000000000090000000000000000000000000000006e6574207469746c
255+650000001c00d40001005000f303000000000000000000000000000000000000
256+000000000108d50003000000ef03000000000000090000000000000000000000
257+000000006e6574207469746c650000001c00d50001005000f303000000000000
258+000000000000000000000000000000000108d60003000000ef03000000000000
259+090000000000000000000000000000006e6574207469746c650000001c00d600
260+01005000f303000000000000000000000000000000000000000000000108d700
261+03000000ef03000000000000090000000000000000000000000000006e657420
262+7469746c650000001c00d70001005000f3030000000000000000000000000000
263+00000000000000000108d80003000000ef030000000000000900000000000000
264+00000000000000006e6574207469746c650000001c00d80001005000f3030000
265+00000000000000000000000000000000000000000108d90003000000ef030000
266+00000000090000000000000000000000000000006e6574207469746c65000000
267+1c00d90001005000f30300000000000000000000000000000000000000000000
268+0108da0003000000ef0300000000000009000000000000000000000000000000
269+6e6574207469746c650000001c00da0001005000f30300000000000000000000
270+0000000000000000000000000108db0003000000ef0300000000000009000000
271+0000000000000000000000006e6574207469746c650000001c00db0001005000
272+f303000000000000000000000000000000000000000000000108dc0003000000
273+ef03000000000000090000000000000000000000000000006e6574207469746c
274+650000001c00dc0001005000f303000000000000000000000000000000000000
275+000000000108dd0003000000ef03000000000000090000000000000000000000
276+000000006e6574207469746c650000001c00dd0001005000f303000000000000
277+000000000000000000000000000000000108de0003000000ef03000000000000
278+090000000000000000000000000000006e6574207469746c650000001c00de00
279+01005000f303000000000000000000000000000000000000000000000108df00
280+03000000ef03000000000000090000000000000000000000000000006e657420
281+7469746c650000001c00df0001005000f3030000000000000000000000000000
282+00000000000000000108e00003000000ef030000000000000900000000000000
283+00000000000000006e6574207469746c650000001c00e00001005000f3030000
284+00000000000000000000000000000000000000000108e10003000000ef030000
285+00000000090000000000000000000000000000006e6574207469746c65000000
286+1c00e10001005000f30300000000000000000000000000000000000000000000
287+0108e20003000000ef0300000000000009000000000000000000000000000000
288+6e6574207469746c650000001c00e20001005000f30300000000000000000000
289+0000000000000000000000000108e30003000000ef0300000000000009000000
290+0000000000000000000000006e6574207469746c650000001c00e30001005000
291+f303000000000000000000000000000000000000000000000108e40003000000
292+ef03000000000000090000000000000000000000000000006e6574207469746c
293+650000001c00e40001005000f303000000000000000000000000000000000000
294+000000000108e50003000000ef03000000000000090000000000000000000000
295+000000006e6574207469746c650000001c00e50001005000f303000000000000
296+000000000000000000000000000000000108e60003000000ef03000000000000
297+090000000000000000000000000000006e6574207469746c650000001c00e600
298+01005000f303000000000000000000000000000000000000000000000108e700
299+03000000ef03000000000000090000000000000000000000000000006e657420
300+7469746c650000001c00e70001005000f3030000000000000000000000000000
301+00000000000000000108e80003000000ef030000000000000900000000000000
302+00000000000000006e6574207469746c650000001c00e80001005000f3030000
303+00000000000000000000000000000000000000000108e90003000000ef030000
304+00000000090000000000000000000000000000006e6574207469746c65000000
305+1c00e90001005000f30300000000000000000000000000000000000000000000
306+0108ea0003000000ef0300000000000009000000000000000000000000000000
307+6e6574207469746c650000001c00ea0001005000f30300000000000000000000
308+0000000000000000000000000108eb0003000000ef0300000000000009000000
309+0000000000000000000000006e6574207469746c650000001c00eb0001005000
310+f303000000000000000000000000000000000000000000000108ec0003000000
311+ef03000000000000090000000000000000000000000000006e6574207469746c
312+650000001c00ec0001005000f303000000000000000000000000000000000000
313+000000000108ed0003000000ef03000000000000090000000000000000000000
314+000000006e6574207469746c650000001c00ed0001005000f303000000000000
315+000000000000000000000000000000000108ee0003000000ef03000000000000
316+090000000000000000000000000000006e6574207469746c650000001c00ee00
317+01005000f303000000000000000000000000000000000000000000000108ef00
318+03000000ef03000000000000090000000000000000000000000000006e657420
319+7469746c650000001c00ef0001005000f3030000000000000000000000000000
320+00000000000000000108f00003000000ef030000000000000900000000000000
321+00000000000000006e6574207469746c650000001c00f00001005000f3030000
322+00000000000000000000000000000000000000000108f10003000000ef030000
323+00000000090000000000000000000000000000006e6574207469746c65000000
324+1c00f10001005000f30300000000000000000000000000000000000000000000
325+0108f20003000000ef0300000000000009000000000000000000000000000000
326+6e6574207469746c650000001c00f20001005000f30300000000000000000000
327+0000000000000000000000000108f30003000000ef0300000000000009000000
328+0000000000000000000000006e6574207469746c650000001c00f30001005000
329+f303000000000000000000000000000000000000000000000108f40003000000
330+ef03000000000000090000000000000000000000000000006e6574207469746c
331+650000001c00f40001005000f303000000000000000000000000000000000000
332+000000000108f50003000000ef03000000000000090000000000000000000000
333+000000006e6574207469746c650000001c00f50001005000f303000000000000
334+000000000000000000000000000000000108f60003000000ef03000000000000
335+090000000000000000000000000000006e6574207469746c650000001c00f600
336+01005000f303000000000000000000000000000000000000000000000108f700
337+03000000ef03000000000000090000000000000000000000000000006e657420
338+7469746c650000001c00f70001005000f3030000000000000000000000000000
339+00000000000000000108f80003000000ef030000000000000900000000000000
340+00000000000000006e6574207469746c650000001c00f80001005000f3030000
341+00000000000000000000000000000000000000000108f90003000000ef030000
342+00000000090000000000000000000000000000006e6574207469746c65000000
343+1c00f90001005000f30300000000000000000000000000000000000000000000
344+0108fa0003000000ef0300000000000009000000000000000000000000000000
345+6e6574207469746c650000001c00fa0001005000f30300000000000000000000
346+0000000000000000000000000108fb0003000000ef0300000000000009000000
347+0000000000000000000000006e6574207469746c650000001c00fb0001005000
348+f303000000000000000000000000000000000000000000000108fc0003000000
349+ef03000000000000090000000000000000000000000000006e6574207469746c
350+650000001c00fc0001005000f303000000000000000000000000000000000000
351+000000000108fd0003000000ef03000000000000090000000000000000000000
352+000000006e6574207469746c650000001c00fd0001005000f303000000000000
353+000000000000000000000000000000000108fe0003000000ef03000000000000
354+090000000000000000000000000000006e6574207469746c650000001c00fe00
355+01005000f303000000000000000000000000000000000000000000000108ff00
356+03000000ef03000000000000090000000000000000000000000000006e657420
357+7469746c650000001c00ff0001005000f3030000000000000000000000000000
358+00000000000000000108000103000000ef030000000000000900000000000000
359+00000000000000006e6574207469746c650000001c00000101005000f3030000
360+00000000000000000000000000000000000000000108010103000000ef030000
361+00000000090000000000000000000000000000006e6574207469746c65000000
362+1c00010101005000f30300000000000000000000000000000000000000000000
363+0108020103000000ef0300000000000009000000000000000000000000000000
364+6e6574207469746c650000001c00020101005000f30300000000000000000000
365+0000000000000000000000000108030103000000ef0300000000000009000000
366+0000000000000000000000006e6574207469746c650000001c00030101005000
367+f303000000000000000000000000000000000000000000000108040103000000
368+ef03000000000000090000000000000000000000000000006e6574207469746c
369+650000001c00040101005000f303000000000000000000000000000000000000
370+000000000108050103000000ef03000000000000090000000000000000000000
371+000000006e6574207469746c650000001c00050101005000f303000000000000
372+000000000000000000000000000000000108060103000000ef03000000000000
373+090000000000000000000000000000006e6574207469746c650000001c000601
374+01005000f3030000000000000000000000000000000000000000000001080701
375+03000000ef03000000000000090000000000000000000000000000006e657420
376+7469746c650000001c00070101005000f3030000000000000000000000000000
377+00000000000000000108080103000000ef030000000000000900000000000000
378+00000000000000006e6574207469746c650000001c00080101005000f3030000
379+00000000000000000000000000000000000000000108090103000000ef030000
380+00000000090000000000000000000000000000006e6574207469746c65000000
381+1c00090101005000f30300000000000000000000000000000000000000000000
382+01080a0103000000ef0300000000000009000000000000000000000000000000
383+6e6574207469746c650000001c000a0101005000f30300000000000000000000
384+00000000000000000000000001080b0103000000ef0300000000000009000000
385+0000000000000000000000006e6574207469746c650000001c000b0101005000
386+f3030000000000000000000000000000000000000000000001080c0103000000
387+ef03000000000000090000000000000000000000000000006e6574207469746c
388+650000001c000c0101005000f303000000000000000000000000000000000000
389+0000000001080d0103000000ef03000000000000090000000000000000000000
390+000000006e6574207469746c650000001c000d0101005000f303000000000000
391+0000000000000000000000000000000001080e0103000000ef03000000000000
392+090000000000000000000000000000006e6574207469746c650000001c000e01
393+01005000f3030000000000000000000000000000000000000000000001080f01
394+03000000ef03000000000000090000000000000000000000000000006e657420
395+7469746c650000001c000f0101005000f3030000000000000000000000000000
396+00000000000000000108100103000000ef030000000000000900000000000000
397+00000000000000006e6574207469746c650000001c00100101005000f3030000
398+00000000000000000000000000000000000000000108110103000000ef030000
399+00000000090000000000000000000000000000006e6574207469746c65000000
400+1c00110101005000f30300000000000000000000000000000000000000000000
401+0108120103000000ef0300000000000009000000000000000000000000000000
402+6e6574207469746c650000001c00120101005000f30300000000000000000000
403+0000000000000000000000000108130103000000ef0300000000000009000000
404+0000000000000000000000006e6574207469746c650000001c00130101005000
405+f303000000000000000000000000000000000000000000000108140103000000
406+ef03000000000000090000000000000000000000000000006e6574207469746c
407+650000001c00140101005000f303000000000000000000000000000000000000
408+000000000108150103000000ef03000000000000090000000000000000000000
409+000000006e6574207469746c650000001c00150101005000f303000000000000
410+000000000000000000000000000000000108160103000000ef03000000000000
411+090000000000000000000000000000006e6574207469746c650000001c001601
412+01005000f3030000000000000000000000000000000000000000000001081701
413+03000000ef03000000000000090000000000000000000000000000006e657420
414+7469746c650000001c00170101005000f3030000000000000000000000000000
415+00000000000000000108180103000000ef030000000000000900000000000000
416+00000000000000006e6574207469746c650000001c00180101005000f3030000
417+00000000000000000000000000000000000000000108190103000000ef030000
418+00000000090000000000000000000000000000006e6574207469746c65000000
419+1c00190101005000f30300000000000000000000000000000000000000000000
420+01081a0103000000ef0300000000000009000000000000000000000000000000
421+6e6574207469746c650000001c001a0101005000f30300000000000000000000
422+00000000000000000000000001081b0103000000ef0300000000000009000000
423+0000000000000000000000006e6574207469746c650000001c001b0101005000
424+f3030000000000000000000000000000000000000000000001081c0103000000
425+ef03000000000000090000000000000000000000000000006e6574207469746c
426+650000001c001c0101005000f303000000000000000000000000000000000000
427+0000000001081d0103000000ef03000000000000090000000000000000000000
428+000000006e6574207469746c650000001c001d0101005000f303000000000000
429+0000000000000000000000000000000001081e0103000000ef03000000000000
430+090000000000000000000000000000006e6574207469746c650000001c001e01
431+01005000f3030000000000000000000000000000000000000000000001081f01
432+03000000ef03000000000000090000000000000000000000000000006e657420
433+7469746c650000001c001f0101005000f3030000000000000000000000000000
434+00000000000000000108200103000000ef030000000000000900000000000000
435+00000000000000006e6574207469746c650000001c00200101005000f3030000
436+00000000000000000000000000000000000000000108210103000000ef030000
437+00000000090000000000000000000000000000006e6574207469746c65000000
438+1c00210101005000f30300000000000000000000000000000000000000000000
439+0108220103000000ef0300000000000009000000000000000000000000000000
440+6e6574207469746c650000001c00220101005000f30300000000000000000000
441+0000000000000000000000000108230103000000ef0300000000000009000000
442+0000000000000000000000006e6574207469746c650000001c00230101005000
443+f303000000000000000000000000000000000000000000000108240103000000
444+ef03000000000000090000000000000000000000000000006e6574207469746c
445+650000001c00240101005000f303000000000000000000000000000000000000
446+000000000108250103000000ef03000000000000090000000000000000000000
447+000000006e6574207469746c650000001c00250101005000f303000000000000
448+000000000000000000000000000000000108260103000000ef03000000000000
449+090000000000000000000000000000006e6574207469746c650000001c002601
450+01005000f3030000000000000000000000000000000000000000000001082701
451+03000000ef03000000000000090000000000000000000000000000006e657420
452+7469746c650000001c00270101005000f3030000000000000000000000000000
453+00000000000000000108280103000000ef030000000000000900000000000000
454+00000000000000006e6574207469746c650000001c00280101005000f3030000
455+00000000000000000000000000000000000000000108290103000000ef030000
456+00000000090000000000000000000000000000006e6574207469746c65000000
457+1c00290101005000f30300000000000000000000000000000000000000000000
458+01082a0103000000ef0300000000000009000000000000000000000000000000
459+6e6574207469746c650000001c002a0101005000f30300000000000000000000
460+00000000000000000000000001082b0103000000ef0300000000000009000000
461+0000000000000000000000006e6574207469746c650000001c002b0101005000
462+f3030000000000000000000000000000000000000000000001082c0103000000
463+ef03000000000000090000000000000000000000000000006e6574207469746c
464+650000001c002c0101005000f303000000000000000000000000000000000000
465+0000000001082d0103000000ef03000000000000090000000000000000000000
466+000000006e6574207469746c650000001c002d0101005000f303000000000000
467+0000000000000000000000000000000001082e0103000000ef03000000000000
468+090000000000000000000000000000006e6574207469746c650000001c002e01
469+01005000f3030000000000000000000000000000000000000000000001082f01
470+03000000ef03000000000000090000000000000000000000000000006e657420
471+7469746c650000001c002f0101005000f3030000000000000000000000000000
472+00000000000000000108300103000000ef030000000000000900000000000000
473+00000000000000006e6574207469746c650000001c00300101005000f3030000
474+00000000000000000000000000000000000000000108310103000000ef030000
475+00000000090000000000000000000000000000006e6574207469746c65000000
476+1c00310101005000f30300000000000000000000000000000000000000000000
477+0108320103000000ef0300000000000009000000000000000000000000000000
478+6e6574207469746c650000001c00320101005000f30300000000000000000000
479+0000000000000000000000000108330103000000ef0300000000000009000000
480+0000000000000000000000006e6574207469746c650000001c00330101005000
481+f303000000000000000000000000000000000000000000000108340103000000
482+ef03000000000000090000000000000000000000000000006e6574207469746c
483+650000001c00340101005000f303000000000000000000000000000000000000
484+000000000108350103000000ef03000000000000090000000000000000000000
485+000000006e6574207469746c650000001c00350101005000f303000000000000
486+000000000000000000000000000000000108360103000000ef03000000000000
487+090000000000000000000000000000006e6574207469746c650000001c003601
488+01005000f3030000000000000000000000000000000000000000000001083701
489+03000000ef03000000000000090000000000000000000000000000006e657420
490+7469746c650000001c00370101005000f3030000000000000000000000000000
491+00000000000000000108380103000000ef030000000000000900000000000000
492+00000000000000006e6574207469746c650000001c00380101005000f3030000
493+00000000000000000000000000000000000000000108390103000000ef030000
494+00000000090000000000000000000000000000006e6574207469746c65000000
495+1c00390101005000f30300000000000000000000000000000000000000000000
496+01083a0103000000ef0300000000000009000000000000000000000000000000
497+6e6574207469746c650000001c003a0101005000f30300000000000000000000
498+00000000000000000000000001083b0103000000ef0300000000000009000000
499+0000000000000000000000006e6574207469746c650000001c003b0101005000
500+f3030000000000000000000000000000000000000000000001083c0103000000
501+ef03000000000000090000000000000000000000000000006e6574207469746c
502+650000001c003c0101005000f303000000000000000000000000000000000000
503+0000000001083d0103000000ef03000000000000090000000000000000000000
504+000000006e6574207469746c650000001c003d0101005000f303000000000000
505+0000000000000000000000000000000001083e0103000000ef03000000000000
506+090000000000000000000000000000006e6574207469746c650000001c003e01
507+01005000f3030000000000000000000000000000000000000000000001083f01
508+03000000ef03000000000000090000000000000000000000000000006e657420
509+7469746c650000001c003f0101005000f3030000000000000000000000000000
510+00000000000000000108400103000000ef030000000000000900000000000000
511+00000000000000006e6574207469746c650000001c00400101005000f3030000
512+00000000000000000000000000000000000000000108410103000000ef030000
513+00000000090000000000000000000000000000006e6574207469746c65000000
514+1c00410101005000f30300000000000000000000000000000000000000000000
515+0108420103000000ef0300000000000009000000000000000000000000000000
516+6e6574207469746c650000001c00420101005000f30300000000000000000000
517+0000000000000000000000000108430103000000ef0300000000000009000000
518+0000000000000000000000006e6574207469746c650000001c00430101005000
519+f303000000000000000000000000000000000000000000000108440103000000
520+ef03000000000000090000000000000000000000000000006e6574207469746c
521+650000001c00440101005000f303000000000000000000000000000000000000
522+000000000108450103000000ef03000000000000090000000000000000000000
523+000000006e6574207469746c650000001c00450101005000f303000000000000
524+000000000000000000000000000000000108460103000000ef03000000000000
525+090000000000000000000000000000006e6574207469746c650000001c004601
526+01005000f3030000000000000000000000000000000000000000000001084701
527+03000000ef03000000000000090000000000000000000000000000006e657420
528+7469746c650000001c00470101005000f3030000000000000000000000000000
529+00000000000000000108480103000000ef030000000000000900000000000000
530+00000000000000006e6574207469746c650000001c00480101005000f3030000
531+00000000000000000000000000000000000000000108490103000000ef030000
532+00000000090000000000000000000000000000006e6574207469746c65000000
533+1c00490101005000f30300000000000000000000000000000000000000000000
534+01084a0103000000ef0300000000000009000000000000000000000000000000
535+6e6574207469746c650000001c004a0101005000f30300000000000000000000
536+00000000000000000000000001084b0103000000ef0300000000000009000000
537+0000000000000000000000006e6574207469746c650000001c004b0101005000
538+f3030000000000000000000000000000000000000000000001084c0103000000
539+ef03000000000000090000000000000000000000000000006e6574207469746c
540+650000001c004c0101005000f303000000000000000000000000000000000000
541+0000000001084d0103000000ef03000000000000090000000000000000000000
542+000000006e6574207469746c650000001c004d0101005000f303000000000000
543+0000000000000000000000000000000001084e0103000000ef03000000000000
544+090000000000000000000000000000006e6574207469746c650000001c004e01
545+01005000f3030000000000000000000000000000000000000000000001084f01
546+03000000ef03000000000000090000000000000000000000000000006e657420
547+7469746c650000001c004f0101005000f3030000000000000000000000000000
548+00000000000000000108500103000000ef030000000000000900000000000000
549+00000000000000006e6574207469746c650000001c00500101005000f3030000
550+00000000000000000000000000000000000000000108510103000000ef030000
551+00000000090000000000000000000000000000006e6574207469746c65000000
552+1c00510101005000f30300000000000000000000000000000000000000000000
553+0108520103000000ef0300000000000009000000000000000000000000000000
554+6e6574207469746c650000001c00520101005000f30300000000000000000000
555+0000000000000000000000000108530103000000ef0300000000000009000000
556+0000000000000000000000006e6574207469746c650000001c00530101005000
557+f303000000000000000000000000000000000000000000000108540103000000
558+ef03000000000000090000000000000000000000000000006e6574207469746c
559+650000001c00540101005000f303000000000000000000000000000000000000
560+000000000108550103000000ef03000000000000090000000000000000000000
561+000000006e6574207469746c650000001c00550101005000f303000000000000
562+000000000000000000000000000000000108560103000000ef03000000000000
563+090000000000000000000000000000006e6574207469746c650000001c005601
564+01005000f3030000000000000000000000000000000000000000000001085701
565+03000000ef03000000000000090000000000000000000000000000006e657420
566+7469746c650000001c00570101005000f3030000000000000000000000000000
567+00000000000000000108580103000000ef030000000000000900000000000000
568+00000000000000006e6574207469746c650000001c00580101005000f3030000
569+00000000000000000000000000000000000000000108590103000000ef030000
570+00000000090000000000000000000000000000006e6574207469746c65000000
571+1c00590101005000f30300000000000000000000000000000000000000000000
572+01085a0103000000ef0300000000000009000000000000000000000000000000
573+6e6574207469746c650000001c005a0101005000f30300000000000000000000
574+00000000000000000000000001085b0103000000ef0300000000000009000000
575+0000000000000000000000006e6574207469746c650000001c005b0101005000
576+f3030000000000000000000000000000000000000000000001085c0103000000
577+ef03000000000000090000000000000000000000000000006e6574207469746c
578+650000001c005c0101005000f303000000000000000000000000000000000000
579+0000000001085d0103000000ef03000000000000090000000000000000000000
580+000000006e6574207469746c650000001c005d0101005000f303000000000000
581+0000000000000000000000000000000001085e0103000000ef03000000000000
582+090000000000000000000000000000006e6574207469746c650000001c005e01
583+01005000f3030000000000000000000000000000000000000000000001085f01
584+03000000ef03000000000000090000000000000000000000000000006e657420
585+7469746c650000001c005f0101005000f3030000000000000000000000000000
586+00000000000000000108600103000000ef030000000000000900000000000000
587+00000000000000006e6574207469746c650000001c00600101005000f3030000
588+00000000000000000000000000000000000000000108610103000000ef030000
589+00000000090000000000000000000000000000006e6574207469746c65000000
590+1c00610101005000f30300000000000000000000000000000000000000000000
591+0108620103000000ef0300000000000009000000000000000000000000000000
592+6e6574207469746c650000001c00620101005000f30300000000000000000000
593+0000000000000000000000000108630103000000ef0300000000000009000000
594+0000000000000000000000006e6574207469746c650000001c00630101005000
595+f303000000000000000000000000000000000000000000000108640103000000
596+ef03000000000000090000000000000000000000000000006e6574207469746c
597+650000001c00640101005000f303000000000000000000000000000000000000
598+000000000108650103000000ef03000000000000090000000000000000000000
599+000000006e6574207469746c650000001c00650101005000f303000000000000
600+000000000000000000000000000000000108660103000000ef03000000000000
601+090000000000000000000000000000006e6574207469746c650000001c006601
602+01005000f3030000000000000000000000000000000000000000000001086701
603+03000000ef03000000000000090000000000000000000000000000006e657420
604+7469746c650000001c00670101005000f3030000000000000000000000000000
605+00000000000000000108680103000000ef030000000000000900000000000000
606+00000000000000006e6574207469746c650000001c00680101005000f3030000
607+00000000000000000000000000000000000000000108690103000000ef030000
608+00000000090000000000000000000000000000006e6574207469746c65000000
609+1c00690101005000f30300000000000000000000000000000000000000000000
610+01086a0103000000ef0300000000000009000000000000000000000000000000
611+6e6574207469746c650000001c006a0101005000f30300000000000000000000
612+00000000000000000000000001086b0103000000ef0300000000000009000000
613+0000000000000000000000006e6574207469746c650000001c006b0101005000
614+f3030000000000000000000000000000000000000000000001086c0103000000
615+ef03000000000000090000000000000000000000000000006e6574207469746c
616+650000001c006c0101005000f303000000000000000000000000000000000000
617+0000000001086d0103000000ef03000000000000090000000000000000000000
618+000000006e6574207469746c650000001c006d0101005000f303000000000000
619+0000000000000000000000000000000001086e0103000000ef03000000000000
620+090000000000000000000000000000006e6574207469746c650000001c006e01
621+01005000f3030000000000000000000000000000000000000000000001086f01
622+03000000ef03000000000000090000000000000000000000000000006e657420
623+7469746c650000001c006f0101005000f3030000000000000000000000000000
624+00000000000000000108700103000000ef030000000000000900000000000000
625+00000000000000006e6574207469746c650000001c00700101005000f3030000
626+00000000000000000000000000000000000000000108710103000000ef030000
627+00000000090000000000000000000000000000006e6574207469746c65000000
628+1c00710101005000f30300000000000000000000000000000000000000000000
629+0108720103000000ef0300000000000009000000000000000000000000000000
630+6e6574207469746c650000001c00720101005000f30300000000000000000000
631+0000000000000000000000000108730103000000ef0300000000000009000000
632+0000000000000000000000006e6574207469746c650000001c00730101005000
633+f303000000000000000000000000000000000000000000000108740103000000
634+ef03000000000000090000000000000000000000000000006e6574207469746c
635+650000001c00740101005000f303000000000000000000000000000000000000
636+000000000108750103000000ef03000000000000090000000000000000000000
637+000000006e6574207469746c650000001c00750101005000f303000000000000
638+000000000000000000000000000000000108760103000000ef03000000000000
639+090000000000000000000000000000006e6574207469746c650000001c007601
640+01005000f3030000000000000000000000000000000000000000000001087701
641+03000000ef03000000000000090000000000000000000000000000006e657420
642+7469746c650000001c00770101005000f3030000000000000000000000000000
643+00000000000000000108780103000000ef030000000000000900000000000000
644+00000000000000006e6574207469746c650000001c00780101005000f3030000
645+00000000000000000000000000000000000000000108790103000000ef030000
646+00000000090000000000000000000000000000006e6574207469746c65000000
647+1c00790101005000f30300000000000000000000000000000000000000000000
648+01087a0103000000ef0300000000000009000000000000000000000000000000
649+6e6574207469746c650000001c007a0101005000f30300000000000000000000
650+00000000000000000000000001087b0103000000ef0300000000000009000000
651+0000000000000000000000006e6574207469746c650000001c007b0101005000
652+f3030000000000000000000000000000000000000000000001087c0103000000
653+ef03000000000000090000000000000000000000000000006e6574207469746c
654+650000001c007c0101005000f303000000000000000000000000000000000000
655+0000000001087d0103000000ef03000000000000090000000000000000000000
656+000000006e6574207469746c650000001c007d0101005000f303000000000000
657+0000000000000000000000000000000001087e0103000000ef03000000000000
658+090000000000000000000000000000006e6574207469746c650000001c007e01
659+01005000f3030000000000000000000000000000000000000000000001087f01
660+03000000ef03000000000000090000000000000000000000000000006e657420
661+7469746c650000001c007f0101005000f3030000000000000000000000000000
662+00000000000000000108800103000000ef030000000000000900000000000000
663+00000000000000006e6574207469746c650000001c00800101005000f3030000
664+00000000000000000000000000000000000000000108810103000000ef030000
665+00000000090000000000000000000000000000006e6574207469746c65000000
666+1c00810101005000f30300000000000000000000000000000000000000000000
667+0108820103000000ef0300000000000009000000000000000000000000000000
668+6e6574207469746c650000001c00820101005000f30300000000000000000000
669+0000000000000000000000000108830103000000ef0300000000000009000000
670+0000000000000000000000006e6574207469746c650000001c00830101005000
671+f303000000000000000000000000000000000000000000000108840103000000
672+ef03000000000000090000000000000000000000000000006e6574207469746c
673+650000001c00840101005000f303000000000000000000000000000000000000
674+000000000108850103000000ef03000000000000090000000000000000000000
675+000000006e6574207469746c650000001c00850101005000f303000000000000
676+000000000000000000000000000000000108860103000000ef03000000000000
677+090000000000000000000000000000006e6574207469746c650000001c008601
678+01005000f3030000000000000000000000000000000000000000000001088701
679+03000000ef03000000000000090000000000000000000000000000006e657420
680+7469746c650000001c00870101005000f3030000000000000000000000000000
681+00000000000000000108880103000000ef030000000000000900000000000000
682+00000000000000006e6574207469746c650000001c00880101005000f3030000
683+00000000000000000000000000000000000000000108890103000000ef030000
684+00000000090000000000000000000000000000006e6574207469746c65000000
685+1c00890101005000f30300000000000000000000000000000000000000000000
686+01088a0103000000ef0300000000000009000000000000000000000000000000
687+6e6574207469746c650000001c008a0101005000f30300000000000000000000
688+00000000000000000000000001088b0103000000ef0300000000000009000000
689+0000000000000000000000006e6574207469746c650000001c008b0101005000
690+f3030000000000000000000000000000000000000000000001088c0103000000
691+ef03000000000000090000000000000000000000000000006e6574207469746c
692+650000001c008c0101005000f303000000000000000000000000000000000000
693+0000000001088d0103000000ef03000000000000090000000000000000000000
694+000000006e6574207469746c650000001c008d0101005000f303000000000000
695+0000000000000000000000000000000001088e0103000000ef03000000000000
696+090000000000000000000000000000006e6574207469746c650000001c008e01
697+01005000f3030000000000000000000000000000000000000000000001088f01
698+03000000ef03000000000000090000000000000000000000000000006e657420
699+7469746c650000001c008f0101005000f3030000000000000000000000000000
700+00000000000000000108900103000000ef030000000000000900000000000000
701+00000000000000006e6574207469746c650000001c00900101005000f3030000
702+00000000000000000000000000000000000000000108910103000000ef030000
703+00000000090000000000000000000000000000006e6574207469746c65000000
704+1c00910101005000f30300000000000000000000000000000000000000000000
705+0108920103000000ef0300000000000009000000000000000000000000000000
706+6e6574207469746c650000001c00920101005000f30300000000000000000000
707+0000000000000000000000000108930103000000ef0300000000000009000000
708+0000000000000000000000006e6574207469746c650000001c00930101005000
709+f303000000000000000000000000000000000000000000000108940103000000
710+ef03000000000000090000000000000000000000000000006e6574207469746c
711+650000001c00940101005000f303000000000000000000000000000000000000
712+000000000108950103000000ef03000000000000090000000000000000000000
713+000000006e6574207469746c650000001c00950101005000f303000000000000
714+000000000000000000000000000000000108960103000000ef03000000000000
715+090000000000000000000000000000006e6574207469746c650000001c009601
716+01005000f3030000000000000000000000000000000000000000000001089701
717+03000000ef03000000000000090000000000000000000000000000006e657420
718+7469746c650000001c00970101005000f3030000000000000000000000000000
719+00000000000000000108980103000000ef030000000000000900000000000000
720+00000000000000006e6574207469746c650000001c00980101005000f3030000
721+00000000000000000000000000000000000000000108990103000000ef030000
722+00000000090000000000000000000000000000006e6574207469746c65000000
723+1c00990101005000f30300000000000000000000000000000000000000000000
724+01089a0103000000ef0300000000000009000000000000000000000000000000
725+6e6574207469746c650000001c009a0101005000f30300000000000000000000
726+00000000000000000000000001089b0103000000ef0300000000000009000000
727+0000000000000000000000006e6574207469746c650000001c009b0101005000
728+f3030000000000000000000000000000000000000000000001089c0103000000
729+ef03000000000000090000000000000000000000000000006e6574207469746c
730+650000001c009c0101005000f303000000000000000000000000000000000000
731+0000000001089d0103000000ef03000000000000090000000000000000000000
732+000000006e6574207469746c650000001c009d0101005000f303000000000000
733+0000000000000000000000000000000001089e0103000000ef03000000000000
734+090000000000000000000000000000006e6574207469746c650000001c009e01
735+01005000f3030000000000000000000000000000000000000000000001089f01
736+03000000ef03000000000000090000000000000000000000000000006e657420
737+7469746c650000001c009f0101005000f3030000000000000000000000000000
738+00000000000000000108a00103000000ef030000000000000900000000000000
739+00000000000000006e6574207469746c650000001c00a00101005000f3030000
740+00000000000000000000000000000000000000000108a10103000000ef030000
741+00000000090000000000000000000000000000006e6574207469746c65000000
742+1c00a10101005000f30300000000000000000000000000000000000000000000
743+0108a20103000000ef0300000000000009000000000000000000000000000000
744+6e6574207469746c650000001c00a20101005000f30300000000000000000000
745+0000000000000000000000000108a30103000000ef0300000000000009000000
746+0000000000000000000000006e6574207469746c650000001c00a30101005000
747+f303000000000000000000000000000000000000000000000108a40103000000
748+ef03000000000000090000000000000000000000000000006e6574207469746c
749+650000001c00a40101005000f303000000000000000000000000000000000000
750+000000000108a50103000000ef03000000000000090000000000000000000000
751+000000006e6574207469746c650000001c00a50101005000f303000000000000
752+000000000000000000000000000000000108a60103000000ef03000000000000
753+090000000000000000000000000000006e6574207469746c650000001c00a601
754+01005000f303000000000000000000000000000000000000000000000108a701
755+03000000ef03000000000000090000000000000000000000000000006e657420
756+7469746c650000001c00a70101005000f3030000000000000000000000000000
757+00000000000000000108a80103000000ef030000000000000900000000000000
758+00000000000000006e6574207469746c650000001c00a80101005000f3030000
759+00000000000000000000000000000000000000000108a90103000000ef030000
760+00000000090000000000000000000000000000006e6574207469746c65000000
761+1c00a90101005000f30300000000000000000000000000000000000000000000
762+0108aa0103000000ef0300000000000009000000000000000000000000000000
763+6e6574207469746c650000001c00aa0101005000f30300000000000000000000
764+0000000000000000000000000108ab0103000000ef0300000000000009000000
765+0000000000000000000000006e6574207469746c650000001c00ab0101005000
766+f303000000000000000000000000000000000000000000000108ac0103000000
767+ef03000000000000090000000000000000000000000000006e6574207469746c
768+650000001c00ac0101005000f303000000000000000000000000000000000000
769+000000000108ad0103000000ef03000000000000090000000000000000000000
770+000000006e6574207469746c650000001c00ad0101005000f303000000000000
771+000000000000000000000000000000000108ae0103000000ef03000000000000
772+090000000000000000000000000000006e6574207469746c650000001c00ae01
773+01005000f303000000000000000000000000000000000000000000000108af01
774+03000000ef03000000000000090000000000000000000000000000006e657420
775+7469746c650000001c00af0101005000f3030000000000000000000000000000
776+00000000000000000108b00103000000ef030000000000000900000000000000
777+00000000000000006e6574207469746c650000001c00b00101005000f3030000
778+00000000000000000000000000000000000000000108b10103000000ef030000
779+00000000090000000000000000000000000000006e6574207469746c65000000
780+1c00b10101005000f30300000000000000000000000000000000000000000000
781+0108b20103000000ef0300000000000009000000000000000000000000000000
782+6e6574207469746c650000001c00b20101005000f30300000000000000000000
783+0000000000000000000000000108b30103000000ef0300000000000009000000
784+0000000000000000000000006e6574207469746c650000001c00b30101005000
785+f303000000000000000000000000000000000000000000000108b40103000000
786+ef03000000000000090000000000000000000000000000006e6574207469746c
787+650000001c00b40101005000f303000000000000000000000000000000000000
788+000000000108b50103000000ef03000000000000090000000000000000000000
789+000000006e6574207469746c650000001c00b50101005000f303000000000000
790+000000000000000000000000000000000108b60103000000ef03000000000000
791+090000000000000000000000000000006e6574207469746c650000001c00b601
792+01005000f303000000000000000000000000000000000000000000000108b701
793+03000000ef03000000000000090000000000000000000000000000006e657420
794+7469746c650000001c00b70101005000f3030000000000000000000000000000
795+00000000000000000108b80103000000ef030000000000000900000000000000
796+00000000000000006e6574207469746c650000001c00b80101005000f3030000
797+00000000000000000000000000000000000000000108b90103000000ef030000
798+00000000090000000000000000000000000000006e6574207469746c65000000
799+1c00b90101005000f30300000000000000000000000000000000000000000000
800+0108ba0103000000ef0300000000000009000000000000000000000000000000
801+6e6574207469746c650000001c00ba0101005000f30300000000000000000000
802+0000000000000000000000000108bb0103000000ef0300000000000009000000
803+0000000000000000000000006e6574207469746c650000001c00bb0101005000
804+f303000000000000000000000000000000000000000000000108bc0103000000
805+ef03000000000000090000000000000000000000000000006e6574207469746c
806+650000001c00bc0101005000f303000000000000000000000000000000000000
807+000000000108bd0103000000ef03000000000000090000000000000000000000
808+000000006e6574207469746c650000001c00bd0101005000f303000000000000
809+000000000000000000000000000000000108be0103000000ef03000000000000
810+090000000000000000000000000000006e6574207469746c650000001c00be01
811+01005000f303000000000000000000000000000000000000000000000108bf01
812+03000000ef03000000000000090000000000000000000000000000006e657420
813+7469746c650000001c00bf0101005000f3030000000000000000000000000000
814+00000000000000000108c00103000000ef030000000000000900000000000000
815+00000000000000006e6574207469746c650000001c00c00101005000f3030000
816+00000000000000000000000000000000000000000108c10103000000ef030000
817+00000000090000000000000000000000000000006e6574207469746c65000000
818+1c00c10101005000f30300000000000000000000000000000000000000000000
819+0108c20103000000ef0300000000000009000000000000000000000000000000
820+6e6574207469746c650000001c00c20101005000f30300000000000000000000
821+0000000000000000000000000108c30103000000ef0300000000000009000000
822+0000000000000000000000006e6574207469746c650000001c00c30101005000
823+f303000000000000000000000000000000000000000000000108c40103000000
824+ef03000000000000090000000000000000000000000000006e6574207469746c
825+650000001c00c40101005000f303000000000000000000000000000000000000
826+000000000108c50103000000ef03000000000000090000000000000000000000
827+000000006e6574207469746c650000001c00c50101005000f303000000000000
828+000000000000000000000000000000000108c60103000000ef03000000000000
829+090000000000000000000000000000006e6574207469746c650000001c00c601
830+01005000f303000000000000000000000000000000000000000000000108c701
831+03000000ef03000000000000090000000000000000000000000000006e657420
832+7469746c650000001c00c70101005000f3030000000000000000000000000000
833+00000000000000000108c80103000000ef030000000000000900000000000000
834+00000000000000006e6574207469746c650000001c00c80101005000f3030000
835+00000000000000000000000000000000000000000108c90103000000ef030000
836+00000000090000000000000000000000000000006e6574207469746c65000000
837+1c00c90101005000f30300000000000000000000000000000000000000000000
838+0108ca0103000000ef0300000000000009000000000000000000000000000000
839+6e6574207469746c650000001c00ca0101005000f30300000000000000000000
840+0000000000000000000000000108cb0103000000ef0300000000000009000000
841+0000000000000000000000006e6574207469746c650000001c00cb0101005000
842+f303000000000000000000000000000000000000000000000108cc0103000000
843+ef03000000000000090000000000000000000000000000006e6574207469746c
844+650000001c00cc0101005000f303000000000000000000000000000000000000
845+000000000108cd0103000000ef03000000000000090000000000000000000000
846+000000006e6574207469746c650000001c00cd0101005000f303000000000000
847+000000000000000000000000000000000108ce0103000000ef03000000000000
848+090000000000000000000000000000006e6574207469746c650000001c00ce01
849+01005000f303000000000000000000000000000000000000000000000108cf01
850+03000000ef03000000000000090000000000000000000000000000006e657420
851+7469746c650000001c00cf0101005000f3030000000000000000000000000000
852+00000000000000000108d00103000000ef030000000000000900000000000000
853+00000000000000006e6574207469746c650000001c00d00101005000f3030000
854+00000000000000000000000000000000000000000108d10103000000ef030000
855+00000000090000000000000000000000000000006e6574207469746c65000000
856+1c00d10101005000f30300000000000000000000000000000000000000000000
857+0108d20103000000ef0300000000000009000000000000000000000000000000
858+6e6574207469746c650000001c00d20101005000f30300000000000000000000
859+0000000000000000000000000108d30103000000ef0300000000000009000000
860+0000000000000000000000006e6574207469746c650000001c00d30101005000
861+f303000000000000000000000000000000000000000000000108d40103000000
862+ef03000000000000090000000000000000000000000000006e6574207469746c
863+650000001c00d40101005000f303000000000000000000000000000000000000
864+000000000108d50103000000ef03000000000000090000000000000000000000
865+000000006e6574207469746c650000001c00d50101005000f303000000000000
866+000000000000000000000000000000000108d60103000000ef03000000000000
867+090000000000000000000000000000006e6574207469746c650000001c00d601
868+01005000f303000000000000000000000000000000000000000000000108d701
869+03000000ef03000000000000090000000000000000000000000000006e657420
870+7469746c650000001c00d70101005000f3030000000000000000000000000000
871+00000000000000000108d80103000000ef030000000000000900000000000000
872+00000000000000006e6574207469746c650000001c00d80101005000f3030000
873+00000000000000000000000000000000000000000108d90103000000ef030000
874+00000000090000000000000000000000000000006e6574207469746c65000000
875+1c00d90101005000f30300000000000000000000000000000000000000000000
876+0108da0103000000ef0300000000000009000000000000000000000000000000
877+6e6574207469746c650000001c00da0101005000f30300000000000000000000
878+0000000000000000000000000108db0103000000ef0300000000000009000000
879+0000000000000000000000006e6574207469746c650000001c00db0101005000
880+f303000000000000000000000000000000000000000000000108dc0103000000
881+ef03000000000000090000000000000000000000000000006e6574207469746c
882+650000001c00dc0101005000f303000000000000000000000000000000000000
883+000000000108dd0103000000ef03000000000000090000000000000000000000
884+000000006e6574207469746c650000001c00dd0101005000f303000000000000
885+000000000000000000000000000000000108de0103000000ef03000000000000
886+090000000000000000000000000000006e6574207469746c650000001c00de01
887+01005000f303000000000000000000000000000000000000000000000108df01
888+03000000ef03000000000000090000000000000000000000000000006e657420
889+7469746c650000001c00df0101005000f3030000000000000000000000000000
890+00000000000000000108e00103000000ef030000000000000900000000000000
891+00000000000000006e6574207469746c650000001c00e00101005000f3030000
892+00000000000000000000000000000000000000000108e10103000000ef030000
893+00000000090000000000000000000000000000006e6574207469746c65000000
894+1c00e10101005000f30300000000000000000000000000000000000000000000
895+0108e20103000000ef0300000000000009000000000000000000000000000000
896+6e6574207469746c650000001c00e20101005000f30300000000000000000000
897+0000000000000000000000000108e30103000000ef0300000000000009000000
898+0000000000000000000000006e6574207469746c650000001c00e30101005000
899+f303000000000000000000000000000000000000000000000108e40103000000
900+ef03000000000000090000000000000000000000000000006e6574207469746c
901+650000001c00e40101005000f303000000000000000000000000000000000000
902+000000000108e50103000000ef03000000000000090000000000000000000000
903+000000006e6574207469746c650000001c00e50101005000f303000000000000
904+000000000000000000000000000000000108e60103000000ef03000000000000
905+090000000000000000000000000000006e6574207469746c650000001c00e601
906+01005000f303000000000000000000000000000000000000000000000108e701
907+03000000ef03000000000000090000000000000000000000000000006e657420
908+7469746c650000001c00e70101005000f3030000000000000000000000000000
909+00000000000000000108e80103000000ef030000000000000900000000000000
910+00000000000000006e6574207469746c650000001c00e80101005000f3030000
911+00000000000000000000000000000000000000000108e90103000000ef030000
912+00000000090000000000000000000000000000006e6574207469746c65000000
913+1c00e90101005000f30300000000000000000000000000000000000000000000
914+0108ea0103000000ef0300000000000009000000000000000000000000000000
915+6e6574207469746c650000001c00ea0101005000f30300000000000000000000
916+0000000000000000000000000108eb0103000000ef0300000000000009000000
917+0000000000000000000000006e6574207469746c650000001c00eb0101005000
918+f303000000000000000000000000000000000000000000000108ec0103000000
919+ef03000000000000090000000000000000000000000000006e6574207469746c
920+650000001c00ec0101005000f303000000000000000000000000000000000000
921+000000000108ed0103000000ef03000000000000090000000000000000000000
922+000000006e6574207469746c650000001c00ed0101005000f303000000000000
923+000000000000000000000000000000000108ee0103000000ef03000000000000
924+090000000000000000000000000000006e6574207469746c650000001c00ee01
925+01005000f303000000000000000000000000000000000000000000000108ef01
926+03000000ef03000000000000090000000000000000000000000000006e657420
927+7469746c650000001c00ef0101005000f3030000000000000000000000000000
928+00000000000000000108f00103000000ef030000000000000900000000000000
929+00000000000000006e6574207469746c650000001c00f00101005000f3030000
930+00000000000000000000000000000000000000000108f10103000000ef030000
931+00000000090000000000000000000000000000006e6574207469746c65000000
932+1c00f10101005000f30300000000000000000000000000000000000000000000
933+0108f20103000000ef0300000000000009000000000000000000000000000000
934+6e6574207469746c650000001c00f20101005000f30300000000000000000000
935+0000000000000000000000000108f30103000000ef0300000000000009000000
936+0000000000000000000000006e6574207469746c650000001c00f30101005000
937+f303000000000000000000000000000000000000000000000108f40103000000
938+ef03000000000000090000000000000000000000000000006e6574207469746c
939+650000001c00f40101005000f303000000000000000000000000000000000000
940+000000000108f50103000000ef03000000000000090000000000000000000000
941+000000006e6574207469746c650000001c00f50101005000f303000000000000
942+000000000000000000000000000000000108f60103000000ef03000000000000
943+090000000000000000000000000000006e6574207469746c650000001c00f601
944+01005000f303000000000000000000000000000000000000000000000108f701
945+03000000ef03000000000000090000000000000000000000000000006e657420
946+7469746c650000001c00f70101005000f3030000000000000000000000000000
947+00000000000000000108f80103000000ef030000000000000900000000000000
948+00000000000000006e6574207469746c650000001c00f80101005000f3030000
949+00000000000000000000000000000000000000000108f90103000000ef030000
950950 00000000090000000000000000000000000000006e6574207469746c65000000
@@ -1,950 +1,950 @@
1-1c00660001005000f303000000000000000000000000000000000000000000001+1c00690001005000f30300000000000000000000000000000000000000000000
2-0108670003000000ef03000000000000090000000000000000000000000000002+01086a0003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00670001005000f303000000000000000000003+6e6574207469746c650000001c006a0001005000f30300000000000000000000
4-0000000000000000000000000108680003000000ef03000000000000090000004+00000000000000000000000001086b0003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c006800010050005+0000000000000000000000006e6574207469746c650000001c006b0001005000
6-f3030000000000000000000000000000000000000000000001086900030000006+f3030000000000000000000000000000000000000000000001086c0003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c7+ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00690001005000f3030000000000000000000000000000000000008+650000001c006c0001005000f303000000000000000000000000000000000000
9-0000000001086a0003000000ef030000000000000900000000000000000000009+0000000001086d0003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c006a0001005000f30300000000000010+000000006e6574207469746c650000001c006d0001005000f303000000000000
11-0000000000000000000000000000000001086b0003000000ef0300000000000011+0000000000000000000000000000000001086e0003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c006b0012+090000000000000000000000000000006e6574207469746c650000001c006e00
13-01005000f3030000000000000000000000000000000000000000000001086c0013+01005000f3030000000000000000000000000000000000000000000001086f00
14-03000000ef03000000000000090000000000000000000000000000006e65742014+03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c006c0001005000f303000000000000000000000000000015+7469746c650000001c006f0001005000f3030000000000000000000000000000
16-000000000000000001086d0003000000ef03000000000000090000000000000016+00000000000000000108700003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c006d0001005000f303000017+00000000000000006e6574207469746c650000001c00700001005000f3030000
18-000000000000000000000000000000000000000001086e0003000000ef03000018+00000000000000000000000000000000000000000108710003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c6500000019+00000000090000000000000000000000000000006e6574207469746c65000000
20-1c006e0001005000f3030000000000000000000000000000000000000000000020+1c00710001005000f30300000000000000000000000000000000000000000000
21-01086f0003000000ef030000000000000900000000000000000000000000000021+0108720003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c006f0001005000f3030000000000000000000022+6e6574207469746c650000001c00720001005000f30300000000000000000000
23-0000000000000000000000000108700003000000ef030000000000000900000023+0000000000000000000000000108730003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c0070000100500024+0000000000000000000000006e6574207469746c650000001c00730001005000
25-f30300000000000000000000000000000000000000000000010871000300000025+f303000000000000000000000000000000000000000000000108740003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c26+ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c00710001005000f30300000000000000000000000000000000000027+650000001c00740001005000f303000000000000000000000000000000000000
28-000000000108720003000000ef0300000000000009000000000000000000000028+000000000108750003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c00720001005000f30300000000000029+000000006e6574207469746c650000001c00750001005000f303000000000000
30-000000000000000000000000000000000108730003000000ef0300000000000030+000000000000000000000000000000000108760003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c00730031+090000000000000000000000000000006e6574207469746c650000001c007600
32-01005000f303000000000000000000000000000000000000000000000108740032+01005000f3030000000000000000000000000000000000000000000001087700
33-03000000ef03000000000000090000000000000000000000000000006e65742033+03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c00740001005000f303000000000000000000000000000034+7469746c650000001c00770001005000f3030000000000000000000000000000
35-00000000000000000108750003000000ef03000000000000090000000000000035+00000000000000000108780003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00750001005000f303000036+00000000000000006e6574207469746c650000001c00780001005000f3030000
37-00000000000000000000000000000000000000000108760003000000ef03000037+00000000000000000000000000000000000000000108790003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c6500000038+00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00760001005000f3030000000000000000000000000000000000000000000039+1c00790001005000f30300000000000000000000000000000000000000000000
40-0108770003000000ef030000000000000900000000000000000000000000000040+01087a0003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00770001005000f3030000000000000000000041+6e6574207469746c650000001c007a0001005000f30300000000000000000000
42-0000000000000000000000000108780003000000ef030000000000000900000042+00000000000000000000000001087b0003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c0078000100500043+0000000000000000000000006e6574207469746c650000001c007b0001005000
44-f30300000000000000000000000000000000000000000000010879000300000044+f3030000000000000000000000000000000000000000000001087c0003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c45+ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00790001005000f30300000000000000000000000000000000000046+650000001c007c0001005000f303000000000000000000000000000000000000
47-0000000001087a0003000000ef0300000000000009000000000000000000000047+0000000001087d0003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c007a0001005000f30300000000000048+000000006e6574207469746c650000001c007d0001005000f303000000000000
49-0000000000000000000000000000000001087b0003000000ef0300000000000049+0000000000000000000000000000000001087e0003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c007b0050+090000000000000000000000000000006e6574207469746c650000001c007e00
51-01005000f3030000000000000000000000000000000000000000000001087c0051+01005000f3030000000000000000000000000000000000000000000001087f00
52-03000000ef03000000000000090000000000000000000000000000006e65742052+03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c007c0001005000f303000000000000000000000000000053+7469746c650000001c007f0001005000f3030000000000000000000000000000
54-000000000000000001087d0003000000ef03000000000000090000000000000054+00000000000000000108800003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c007d0001005000f303000055+00000000000000006e6574207469746c650000001c00800001005000f3030000
56-000000000000000000000000000000000000000001087e0003000000ef03000056+00000000000000000000000000000000000000000108810003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c6500000057+00000000090000000000000000000000000000006e6574207469746c65000000
58-1c007e0001005000f3030000000000000000000000000000000000000000000058+1c00810001005000f30300000000000000000000000000000000000000000000
59-01087f0003000000ef030000000000000900000000000000000000000000000059+0108820003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c007f0001005000f3030000000000000000000060+6e6574207469746c650000001c00820001005000f30300000000000000000000
61-0000000000000000000000000108800003000000ef030000000000000900000061+0000000000000000000000000108830003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c0080000100500062+0000000000000000000000006e6574207469746c650000001c00830001005000
63-f30300000000000000000000000000000000000000000000010881000300000063+f303000000000000000000000000000000000000000000000108840003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c64+ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c00810001005000f30300000000000000000000000000000000000065+650000001c00840001005000f303000000000000000000000000000000000000
66-000000000108820003000000ef0300000000000009000000000000000000000066+000000000108850003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c00820001005000f30300000000000067+000000006e6574207469746c650000001c00850001005000f303000000000000
68-000000000000000000000000000000000108830003000000ef0300000000000068+000000000000000000000000000000000108860003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c00830069+090000000000000000000000000000006e6574207469746c650000001c008600
70-01005000f303000000000000000000000000000000000000000000000108840070+01005000f3030000000000000000000000000000000000000000000001088700
71-03000000ef03000000000000090000000000000000000000000000006e65742071+03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c00840001005000f303000000000000000000000000000072+7469746c650000001c00870001005000f3030000000000000000000000000000
73-00000000000000000108850003000000ef03000000000000090000000000000073+00000000000000000108880003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00850001005000f303000074+00000000000000006e6574207469746c650000001c00880001005000f3030000
75-00000000000000000000000000000000000000000108860003000000ef03000075+00000000000000000000000000000000000000000108890003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c6500000076+00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00860001005000f3030000000000000000000000000000000000000000000077+1c00890001005000f30300000000000000000000000000000000000000000000
78-0108870003000000ef030000000000000900000000000000000000000000000078+01088a0003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00870001005000f3030000000000000000000079+6e6574207469746c650000001c008a0001005000f30300000000000000000000
80-0000000000000000000000000108880003000000ef030000000000000900000080+00000000000000000000000001088b0003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c0088000100500081+0000000000000000000000006e6574207469746c650000001c008b0001005000
82-f30300000000000000000000000000000000000000000000010889000300000082+f3030000000000000000000000000000000000000000000001088c0003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c83+ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00890001005000f30300000000000000000000000000000000000084+650000001c008c0001005000f303000000000000000000000000000000000000
85-0000000001088a0003000000ef0300000000000009000000000000000000000085+0000000001088d0003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c008a0001005000f30300000000000086+000000006e6574207469746c650000001c008d0001005000f303000000000000
87-0000000000000000000000000000000001088b0003000000ef0300000000000087+0000000000000000000000000000000001088e0003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c008b0088+090000000000000000000000000000006e6574207469746c650000001c008e00
89-01005000f3030000000000000000000000000000000000000000000001088c0089+01005000f3030000000000000000000000000000000000000000000001088f00
90-03000000ef03000000000000090000000000000000000000000000006e65742090+03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c008c0001005000f303000000000000000000000000000091+7469746c650000001c008f0001005000f3030000000000000000000000000000
92-000000000000000001088d0003000000ef03000000000000090000000000000092+00000000000000000108900003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c008d0001005000f303000093+00000000000000006e6574207469746c650000001c00900001005000f3030000
94-000000000000000000000000000000000000000001088e0003000000ef03000094+00000000000000000000000000000000000000000108910003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c6500000095+00000000090000000000000000000000000000006e6574207469746c65000000
96-1c008e0001005000f3030000000000000000000000000000000000000000000096+1c00910001005000f30300000000000000000000000000000000000000000000
97-01088f0003000000ef030000000000000900000000000000000000000000000097+0108920003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c008f0001005000f3030000000000000000000098+6e6574207469746c650000001c00920001005000f30300000000000000000000
99-0000000000000000000000000108900003000000ef030000000000000900000099+0000000000000000000000000108930003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c00900001005000100+0000000000000000000000006e6574207469746c650000001c00930001005000
101-f303000000000000000000000000000000000000000000000108910003000000101+f303000000000000000000000000000000000000000000000108940003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c102+ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c00910001005000f303000000000000000000000000000000000000103+650000001c00940001005000f303000000000000000000000000000000000000
104-000000000108920003000000ef03000000000000090000000000000000000000104+000000000108950003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c00920001005000f303000000000000105+000000006e6574207469746c650000001c00950001005000f303000000000000
106-000000000000000000000000000000000108930003000000ef03000000000000106+000000000000000000000000000000000108960003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009300107+090000000000000000000000000000006e6574207469746c650000001c009600
108-01005000f3030000000000000000000000000000000000000000000001089400108+01005000f3030000000000000000000000000000000000000000000001089700
109-03000000ef03000000000000090000000000000000000000000000006e657420109+03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c00940001005000f3030000000000000000000000000000110+7469746c650000001c00970001005000f3030000000000000000000000000000
111-00000000000000000108950003000000ef030000000000000900000000000000111+00000000000000000108980003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00950001005000f3030000112+00000000000000006e6574207469746c650000001c00980001005000f3030000
113-00000000000000000000000000000000000000000108960003000000ef030000113+00000000000000000000000000000000000000000108990003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000114+00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00960001005000f30300000000000000000000000000000000000000000000115+1c00990001005000f30300000000000000000000000000000000000000000000
116-0108970003000000ef0300000000000009000000000000000000000000000000116+01089a0003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00970001005000f30300000000000000000000117+6e6574207469746c650000001c009a0001005000f30300000000000000000000
118-0000000000000000000000000108980003000000ef0300000000000009000000118+00000000000000000000000001089b0003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00980001005000119+0000000000000000000000006e6574207469746c650000001c009b0001005000
120-f303000000000000000000000000000000000000000000000108990003000000120+f3030000000000000000000000000000000000000000000001089c0003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c121+ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00990001005000f303000000000000000000000000000000000000122+650000001c009c0001005000f303000000000000000000000000000000000000
123-0000000001089a0003000000ef03000000000000090000000000000000000000123+0000000001089d0003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c009a0001005000f303000000000000124+000000006e6574207469746c650000001c009d0001005000f303000000000000
125-0000000000000000000000000000000001089b0003000000ef03000000000000125+0000000000000000000000000000000001089e0003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c009b00126+090000000000000000000000000000006e6574207469746c650000001c009e00
127-01005000f3030000000000000000000000000000000000000000000001089c00127+01005000f3030000000000000000000000000000000000000000000001089f00
128-03000000ef03000000000000090000000000000000000000000000006e657420128+03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c009c0001005000f3030000000000000000000000000000129+7469746c650000001c009f0001005000f3030000000000000000000000000000
130-000000000000000001089d0003000000ef030000000000000900000000000000130+00000000000000000108a00003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c009d0001005000f3030000131+00000000000000006e6574207469746c650000001c00a00001005000f3030000
132-000000000000000000000000000000000000000001089e0003000000ef030000132+00000000000000000000000000000000000000000108a10003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000133+00000000090000000000000000000000000000006e6574207469746c65000000
134-1c009e0001005000f30300000000000000000000000000000000000000000000134+1c00a10001005000f30300000000000000000000000000000000000000000000
135-01089f0003000000ef0300000000000009000000000000000000000000000000135+0108a20003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c009f0001005000f30300000000000000000000136+6e6574207469746c650000001c00a20001005000f30300000000000000000000
137-0000000000000000000000000108a00003000000ef0300000000000009000000137+0000000000000000000000000108a30003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c00a00001005000138+0000000000000000000000006e6574207469746c650000001c00a30001005000
139-f303000000000000000000000000000000000000000000000108a10003000000139+f303000000000000000000000000000000000000000000000108a40003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c140+ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00a10001005000f303000000000000000000000000000000000000141+650000001c00a40001005000f303000000000000000000000000000000000000
142-000000000108a20003000000ef03000000000000090000000000000000000000142+000000000108a50003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00a20001005000f303000000000000143+000000006e6574207469746c650000001c00a50001005000f303000000000000
144-000000000000000000000000000000000108a30003000000ef03000000000000144+000000000000000000000000000000000108a60003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00a300145+090000000000000000000000000000006e6574207469746c650000001c00a600
146-01005000f303000000000000000000000000000000000000000000000108a400146+01005000f303000000000000000000000000000000000000000000000108a700
147-03000000ef03000000000000090000000000000000000000000000006e657420147+03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00a40001005000f3030000000000000000000000000000148+7469746c650000001c00a70001005000f3030000000000000000000000000000
149-00000000000000000108a50003000000ef030000000000000900000000000000149+00000000000000000108a80003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00a50001005000f3030000150+00000000000000006e6574207469746c650000001c00a80001005000f3030000
151-00000000000000000000000000000000000000000108a60003000000ef030000151+00000000000000000000000000000000000000000108a90003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000152+00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00a60001005000f30300000000000000000000000000000000000000000000153+1c00a90001005000f30300000000000000000000000000000000000000000000
154-0108a70003000000ef0300000000000009000000000000000000000000000000154+0108aa0003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00a70001005000f30300000000000000000000155+6e6574207469746c650000001c00aa0001005000f30300000000000000000000
156-0000000000000000000000000108a80003000000ef0300000000000009000000156+0000000000000000000000000108ab0003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00a80001005000157+0000000000000000000000006e6574207469746c650000001c00ab0001005000
158-f303000000000000000000000000000000000000000000000108a90003000000158+f303000000000000000000000000000000000000000000000108ac0003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c159+ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00a90001005000f303000000000000000000000000000000000000160+650000001c00ac0001005000f303000000000000000000000000000000000000
161-000000000108aa0003000000ef03000000000000090000000000000000000000161+000000000108ad0003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00aa0001005000f303000000000000162+000000006e6574207469746c650000001c00ad0001005000f303000000000000
163-000000000000000000000000000000000108ab0003000000ef03000000000000163+000000000000000000000000000000000108ae0003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00ab00164+090000000000000000000000000000006e6574207469746c650000001c00ae00
165-01005000f303000000000000000000000000000000000000000000000108ac00165+01005000f303000000000000000000000000000000000000000000000108af00
166-03000000ef03000000000000090000000000000000000000000000006e657420166+03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00ac0001005000f3030000000000000000000000000000167+7469746c650000001c00af0001005000f3030000000000000000000000000000
168-00000000000000000108ad0003000000ef030000000000000900000000000000168+00000000000000000108b00003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00ad0001005000f3030000169+00000000000000006e6574207469746c650000001c00b00001005000f3030000
170-00000000000000000000000000000000000000000108ae0003000000ef030000170+00000000000000000000000000000000000000000108b10003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000171+00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00ae0001005000f30300000000000000000000000000000000000000000000172+1c00b10001005000f30300000000000000000000000000000000000000000000
173-0108af0003000000ef0300000000000009000000000000000000000000000000173+0108b20003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00af0001005000f30300000000000000000000174+6e6574207469746c650000001c00b20001005000f30300000000000000000000
175-0000000000000000000000000108b00003000000ef0300000000000009000000175+0000000000000000000000000108b30003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00b00001005000176+0000000000000000000000006e6574207469746c650000001c00b30001005000
177-f303000000000000000000000000000000000000000000000108b10003000000177+f303000000000000000000000000000000000000000000000108b40003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c178+ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00b10001005000f303000000000000000000000000000000000000179+650000001c00b40001005000f303000000000000000000000000000000000000
180-000000000108b20003000000ef03000000000000090000000000000000000000180+000000000108b50003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00b20001005000f303000000000000181+000000006e6574207469746c650000001c00b50001005000f303000000000000
182-000000000000000000000000000000000108b30003000000ef03000000000000182+000000000000000000000000000000000108b60003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00b300183+090000000000000000000000000000006e6574207469746c650000001c00b600
184-01005000f303000000000000000000000000000000000000000000000108b400184+01005000f303000000000000000000000000000000000000000000000108b700
185-03000000ef03000000000000090000000000000000000000000000006e657420185+03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00b40001005000f3030000000000000000000000000000186+7469746c650000001c00b70001005000f3030000000000000000000000000000
187-00000000000000000108b50003000000ef030000000000000900000000000000187+00000000000000000108b80003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00b50001005000f3030000188+00000000000000006e6574207469746c650000001c00b80001005000f3030000
189-00000000000000000000000000000000000000000108b60003000000ef030000189+00000000000000000000000000000000000000000108b90003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000190+00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00b60001005000f30300000000000000000000000000000000000000000000191+1c00b90001005000f30300000000000000000000000000000000000000000000
192-0108b70003000000ef0300000000000009000000000000000000000000000000192+0108ba0003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00b70001005000f30300000000000000000000193+6e6574207469746c650000001c00ba0001005000f30300000000000000000000
194-0000000000000000000000000108b80003000000ef0300000000000009000000194+0000000000000000000000000108bb0003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00b80001005000195+0000000000000000000000006e6574207469746c650000001c00bb0001005000
196-f303000000000000000000000000000000000000000000000108b90003000000196+f303000000000000000000000000000000000000000000000108bc0003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c197+ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00b90001005000f303000000000000000000000000000000000000198+650000001c00bc0001005000f303000000000000000000000000000000000000
199-000000000108ba0003000000ef03000000000000090000000000000000000000199+000000000108bd0003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00ba0001005000f303000000000000200+000000006e6574207469746c650000001c00bd0001005000f303000000000000
201-000000000000000000000000000000000108bb0003000000ef03000000000000201+000000000000000000000000000000000108be0003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00bb00202+090000000000000000000000000000006e6574207469746c650000001c00be00
203-01005000f303000000000000000000000000000000000000000000000108bc00203+01005000f303000000000000000000000000000000000000000000000108bf00
204-03000000ef03000000000000090000000000000000000000000000006e657420204+03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00bc0001005000f3030000000000000000000000000000205+7469746c650000001c00bf0001005000f3030000000000000000000000000000
206-00000000000000000108bd0003000000ef030000000000000900000000000000206+00000000000000000108c00003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00bd0001005000f3030000207+00000000000000006e6574207469746c650000001c00c00001005000f3030000
208-00000000000000000000000000000000000000000108be0003000000ef030000208+00000000000000000000000000000000000000000108c10003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000209+00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00be0001005000f30300000000000000000000000000000000000000000000210+1c00c10001005000f30300000000000000000000000000000000000000000000
211-0108bf0003000000ef0300000000000009000000000000000000000000000000211+0108c20003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00bf0001005000f30300000000000000000000212+6e6574207469746c650000001c00c20001005000f30300000000000000000000
213-0000000000000000000000000108c00003000000ef0300000000000009000000213+0000000000000000000000000108c30003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00c00001005000214+0000000000000000000000006e6574207469746c650000001c00c30001005000
215-f303000000000000000000000000000000000000000000000108c10003000000215+f303000000000000000000000000000000000000000000000108c40003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c216+ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00c10001005000f303000000000000000000000000000000000000217+650000001c00c40001005000f303000000000000000000000000000000000000
218-000000000108c20003000000ef03000000000000090000000000000000000000218+000000000108c50003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00c20001005000f303000000000000219+000000006e6574207469746c650000001c00c50001005000f303000000000000
220-000000000000000000000000000000000108c30003000000ef03000000000000220+000000000000000000000000000000000108c60003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00c300221+090000000000000000000000000000006e6574207469746c650000001c00c600
222-01005000f303000000000000000000000000000000000000000000000108c400222+01005000f303000000000000000000000000000000000000000000000108c700
223-03000000ef03000000000000090000000000000000000000000000006e657420223+03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00c40001005000f3030000000000000000000000000000224+7469746c650000001c00c70001005000f3030000000000000000000000000000
225-00000000000000000108c50003000000ef030000000000000900000000000000225+00000000000000000108c80003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00c50001005000f3030000226+00000000000000006e6574207469746c650000001c00c80001005000f3030000
227-00000000000000000000000000000000000000000108c60003000000ef030000227+00000000000000000000000000000000000000000108c90003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000228+00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00c60001005000f30300000000000000000000000000000000000000000000229+1c00c90001005000f30300000000000000000000000000000000000000000000
230-0108c70003000000ef0300000000000009000000000000000000000000000000230+0108ca0003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00c70001005000f30300000000000000000000231+6e6574207469746c650000001c00ca0001005000f30300000000000000000000
232-0000000000000000000000000108c80003000000ef0300000000000009000000232+0000000000000000000000000108cb0003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00c80001005000233+0000000000000000000000006e6574207469746c650000001c00cb0001005000
234-f303000000000000000000000000000000000000000000000108c90003000000234+f303000000000000000000000000000000000000000000000108cc0003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c235+ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00c90001005000f303000000000000000000000000000000000000236+650000001c00cc0001005000f303000000000000000000000000000000000000
237-000000000108ca0003000000ef03000000000000090000000000000000000000237+000000000108cd0003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00ca0001005000f303000000000000238+000000006e6574207469746c650000001c00cd0001005000f303000000000000
239-000000000000000000000000000000000108cb0003000000ef03000000000000239+000000000000000000000000000000000108ce0003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00cb00240+090000000000000000000000000000006e6574207469746c650000001c00ce00
241-01005000f303000000000000000000000000000000000000000000000108cc00241+01005000f303000000000000000000000000000000000000000000000108cf00
242-03000000ef03000000000000090000000000000000000000000000006e657420242+03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00cc0001005000f3030000000000000000000000000000243+7469746c650000001c00cf0001005000f3030000000000000000000000000000
244-00000000000000000108cd0003000000ef030000000000000900000000000000244+00000000000000000108d00003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00cd0001005000f3030000245+00000000000000006e6574207469746c650000001c00d00001005000f3030000
246-00000000000000000000000000000000000000000108ce0003000000ef030000246+00000000000000000000000000000000000000000108d10003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000247+00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00ce0001005000f30300000000000000000000000000000000000000000000248+1c00d10001005000f30300000000000000000000000000000000000000000000
249-0108cf0003000000ef0300000000000009000000000000000000000000000000249+0108d20003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00cf0001005000f30300000000000000000000250+6e6574207469746c650000001c00d20001005000f30300000000000000000000
251-0000000000000000000000000108d00003000000ef0300000000000009000000251+0000000000000000000000000108d30003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00d00001005000252+0000000000000000000000006e6574207469746c650000001c00d30001005000
253-f303000000000000000000000000000000000000000000000108d10003000000253+f303000000000000000000000000000000000000000000000108d40003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c254+ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00d10001005000f303000000000000000000000000000000000000255+650000001c00d40001005000f303000000000000000000000000000000000000
256-000000000108d20003000000ef03000000000000090000000000000000000000256+000000000108d50003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00d20001005000f303000000000000257+000000006e6574207469746c650000001c00d50001005000f303000000000000
258-000000000000000000000000000000000108d30003000000ef03000000000000258+000000000000000000000000000000000108d60003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00d300259+090000000000000000000000000000006e6574207469746c650000001c00d600
260-01005000f303000000000000000000000000000000000000000000000108d400260+01005000f303000000000000000000000000000000000000000000000108d700
261-03000000ef03000000000000090000000000000000000000000000006e657420261+03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00d40001005000f3030000000000000000000000000000262+7469746c650000001c00d70001005000f3030000000000000000000000000000
263-00000000000000000108d50003000000ef030000000000000900000000000000263+00000000000000000108d80003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00d50001005000f3030000264+00000000000000006e6574207469746c650000001c00d80001005000f3030000
265-00000000000000000000000000000000000000000108d60003000000ef030000265+00000000000000000000000000000000000000000108d90003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000266+00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00d60001005000f30300000000000000000000000000000000000000000000267+1c00d90001005000f30300000000000000000000000000000000000000000000
268-0108d70003000000ef0300000000000009000000000000000000000000000000268+0108da0003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00d70001005000f30300000000000000000000269+6e6574207469746c650000001c00da0001005000f30300000000000000000000
270-0000000000000000000000000108d80003000000ef0300000000000009000000270+0000000000000000000000000108db0003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00d80001005000271+0000000000000000000000006e6574207469746c650000001c00db0001005000
272-f303000000000000000000000000000000000000000000000108d90003000000272+f303000000000000000000000000000000000000000000000108dc0003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c273+ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00d90001005000f303000000000000000000000000000000000000274+650000001c00dc0001005000f303000000000000000000000000000000000000
275-000000000108da0003000000ef03000000000000090000000000000000000000275+000000000108dd0003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00da0001005000f303000000000000276+000000006e6574207469746c650000001c00dd0001005000f303000000000000
277-000000000000000000000000000000000108db0003000000ef03000000000000277+000000000000000000000000000000000108de0003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00db00278+090000000000000000000000000000006e6574207469746c650000001c00de00
279-01005000f303000000000000000000000000000000000000000000000108dc00279+01005000f303000000000000000000000000000000000000000000000108df00
280-03000000ef03000000000000090000000000000000000000000000006e657420280+03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00dc0001005000f3030000000000000000000000000000281+7469746c650000001c00df0001005000f3030000000000000000000000000000
282-00000000000000000108dd0003000000ef030000000000000900000000000000282+00000000000000000108e00003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00dd0001005000f3030000283+00000000000000006e6574207469746c650000001c00e00001005000f3030000
284-00000000000000000000000000000000000000000108de0003000000ef030000284+00000000000000000000000000000000000000000108e10003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000285+00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00de0001005000f30300000000000000000000000000000000000000000000286+1c00e10001005000f30300000000000000000000000000000000000000000000
287-0108df0003000000ef0300000000000009000000000000000000000000000000287+0108e20003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00df0001005000f30300000000000000000000288+6e6574207469746c650000001c00e20001005000f30300000000000000000000
289-0000000000000000000000000108e00003000000ef0300000000000009000000289+0000000000000000000000000108e30003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00e00001005000290+0000000000000000000000006e6574207469746c650000001c00e30001005000
291-f303000000000000000000000000000000000000000000000108e10003000000291+f303000000000000000000000000000000000000000000000108e40003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c292+ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00e10001005000f303000000000000000000000000000000000000293+650000001c00e40001005000f303000000000000000000000000000000000000
294-000000000108e20003000000ef03000000000000090000000000000000000000294+000000000108e50003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00e20001005000f303000000000000295+000000006e6574207469746c650000001c00e50001005000f303000000000000
296-000000000000000000000000000000000108e30003000000ef03000000000000296+000000000000000000000000000000000108e60003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00e300297+090000000000000000000000000000006e6574207469746c650000001c00e600
298-01005000f303000000000000000000000000000000000000000000000108e400298+01005000f303000000000000000000000000000000000000000000000108e700
299-03000000ef03000000000000090000000000000000000000000000006e657420299+03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00e40001005000f3030000000000000000000000000000300+7469746c650000001c00e70001005000f3030000000000000000000000000000
301-00000000000000000108e50003000000ef030000000000000900000000000000301+00000000000000000108e80003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00e50001005000f3030000302+00000000000000006e6574207469746c650000001c00e80001005000f3030000
303-00000000000000000000000000000000000000000108e60003000000ef030000303+00000000000000000000000000000000000000000108e90003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000304+00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00e60001005000f30300000000000000000000000000000000000000000000305+1c00e90001005000f30300000000000000000000000000000000000000000000
306-0108e70003000000ef0300000000000009000000000000000000000000000000306+0108ea0003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00e70001005000f30300000000000000000000307+6e6574207469746c650000001c00ea0001005000f30300000000000000000000
308-0000000000000000000000000108e80003000000ef0300000000000009000000308+0000000000000000000000000108eb0003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00e80001005000309+0000000000000000000000006e6574207469746c650000001c00eb0001005000
310-f303000000000000000000000000000000000000000000000108e90003000000310+f303000000000000000000000000000000000000000000000108ec0003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c311+ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00e90001005000f303000000000000000000000000000000000000312+650000001c00ec0001005000f303000000000000000000000000000000000000
313-000000000108ea0003000000ef03000000000000090000000000000000000000313+000000000108ed0003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00ea0001005000f303000000000000314+000000006e6574207469746c650000001c00ed0001005000f303000000000000
315-000000000000000000000000000000000108eb0003000000ef03000000000000315+000000000000000000000000000000000108ee0003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00eb00316+090000000000000000000000000000006e6574207469746c650000001c00ee00
317-01005000f303000000000000000000000000000000000000000000000108ec00317+01005000f303000000000000000000000000000000000000000000000108ef00
318-03000000ef03000000000000090000000000000000000000000000006e657420318+03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00ec0001005000f3030000000000000000000000000000319+7469746c650000001c00ef0001005000f3030000000000000000000000000000
320-00000000000000000108ed0003000000ef030000000000000900000000000000320+00000000000000000108f00003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00ed0001005000f3030000321+00000000000000006e6574207469746c650000001c00f00001005000f3030000
322-00000000000000000000000000000000000000000108ee0003000000ef030000322+00000000000000000000000000000000000000000108f10003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000323+00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00ee0001005000f30300000000000000000000000000000000000000000000324+1c00f10001005000f30300000000000000000000000000000000000000000000
325-0108ef0003000000ef0300000000000009000000000000000000000000000000325+0108f20003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00ef0001005000f30300000000000000000000326+6e6574207469746c650000001c00f20001005000f30300000000000000000000
327-0000000000000000000000000108f00003000000ef0300000000000009000000327+0000000000000000000000000108f30003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00f00001005000328+0000000000000000000000006e6574207469746c650000001c00f30001005000
329-f303000000000000000000000000000000000000000000000108f10003000000329+f303000000000000000000000000000000000000000000000108f40003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c330+ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00f10001005000f303000000000000000000000000000000000000331+650000001c00f40001005000f303000000000000000000000000000000000000
332-000000000108f20003000000ef03000000000000090000000000000000000000332+000000000108f50003000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00f20001005000f303000000000000333+000000006e6574207469746c650000001c00f50001005000f303000000000000
334-000000000000000000000000000000000108f30003000000ef03000000000000334+000000000000000000000000000000000108f60003000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00f300335+090000000000000000000000000000006e6574207469746c650000001c00f600
336-01005000f303000000000000000000000000000000000000000000000108f400336+01005000f303000000000000000000000000000000000000000000000108f700
337-03000000ef03000000000000090000000000000000000000000000006e657420337+03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00f40001005000f3030000000000000000000000000000338+7469746c650000001c00f70001005000f3030000000000000000000000000000
339-00000000000000000108f50003000000ef030000000000000900000000000000339+00000000000000000108f80003000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00f50001005000f3030000340+00000000000000006e6574207469746c650000001c00f80001005000f3030000
341-00000000000000000000000000000000000000000108f60003000000ef030000341+00000000000000000000000000000000000000000108f90003000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000342+00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00f60001005000f30300000000000000000000000000000000000000000000343+1c00f90001005000f30300000000000000000000000000000000000000000000
344-0108f70003000000ef0300000000000009000000000000000000000000000000344+0108fa0003000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00f70001005000f30300000000000000000000345+6e6574207469746c650000001c00fa0001005000f30300000000000000000000
346-0000000000000000000000000108f80003000000ef0300000000000009000000346+0000000000000000000000000108fb0003000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00f80001005000347+0000000000000000000000006e6574207469746c650000001c00fb0001005000
348-f303000000000000000000000000000000000000000000000108f90003000000348+f303000000000000000000000000000000000000000000000108fc0003000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c349+ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00f90001005000f303000000000000000000000000000000000000350+650000001c00fc0001005000f303000000000000000000000000000000000000
351-000000000108fa0003000000ef03000000000000090000000000000000000000351+000000000108fd0003000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00fa0001005000f303000000000000352+000000006e6574207469746c650000001c00fd0001005000f303000000000000
353-000000000000000000000000000000000108fb0003000000ef03000000000000353+000000000000000000000000000000000108fe0003000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c00fb00354+090000000000000000000000000000006e6574207469746c650000001c00fe00
355-01005000f303000000000000000000000000000000000000000000000108fc00355+01005000f303000000000000000000000000000000000000000000000108ff00
356-03000000ef03000000000000090000000000000000000000000000006e657420356+03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00fc0001005000f3030000000000000000000000000000357+7469746c650000001c00ff0001005000f3030000000000000000000000000000
358-00000000000000000108fd0003000000ef030000000000000900000000000000358+00000000000000000108000103000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00fd0001005000f3030000359+00000000000000006e6574207469746c650000001c00000101005000f3030000
360-00000000000000000000000000000000000000000108fe0003000000ef030000360+00000000000000000000000000000000000000000108010103000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000361+00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00fe0001005000f30300000000000000000000000000000000000000000000362+1c00010101005000f30300000000000000000000000000000000000000000000
363-0108ff0003000000ef0300000000000009000000000000000000000000000000363+0108020103000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c00ff0001005000f30300000000000000000000364+6e6574207469746c650000001c00020101005000f30300000000000000000000
365-0000000000000000000000000108000103000000ef0300000000000009000000365+0000000000000000000000000108030103000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c00000101005000366+0000000000000000000000006e6574207469746c650000001c00030101005000
367-f303000000000000000000000000000000000000000000000108010103000000367+f303000000000000000000000000000000000000000000000108040103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c368+ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c00010101005000f303000000000000000000000000000000000000369+650000001c00040101005000f303000000000000000000000000000000000000
370-000000000108020103000000ef03000000000000090000000000000000000000370+000000000108050103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c00020101005000f303000000000000371+000000006e6574207469746c650000001c00050101005000f303000000000000
372-000000000000000000000000000000000108030103000000ef03000000000000372+000000000000000000000000000000000108060103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000301373+090000000000000000000000000000006e6574207469746c650000001c000601
374-01005000f3030000000000000000000000000000000000000000000001080401374+01005000f3030000000000000000000000000000000000000000000001080701
375-03000000ef03000000000000090000000000000000000000000000006e657420375+03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c00040101005000f3030000000000000000000000000000376+7469746c650000001c00070101005000f3030000000000000000000000000000
377-00000000000000000108050103000000ef030000000000000900000000000000377+00000000000000000108080103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00050101005000f3030000378+00000000000000006e6574207469746c650000001c00080101005000f3030000
379-00000000000000000000000000000000000000000108060103000000ef030000379+00000000000000000000000000000000000000000108090103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000380+00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00060101005000f30300000000000000000000000000000000000000000000381+1c00090101005000f30300000000000000000000000000000000000000000000
382-0108070103000000ef0300000000000009000000000000000000000000000000382+01080a0103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00070101005000f30300000000000000000000383+6e6574207469746c650000001c000a0101005000f30300000000000000000000
384-0000000000000000000000000108080103000000ef0300000000000009000000384+00000000000000000000000001080b0103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00080101005000385+0000000000000000000000006e6574207469746c650000001c000b0101005000
386-f303000000000000000000000000000000000000000000000108090103000000386+f3030000000000000000000000000000000000000000000001080c0103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c387+ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00090101005000f303000000000000000000000000000000000000388+650000001c000c0101005000f303000000000000000000000000000000000000
389-0000000001080a0103000000ef03000000000000090000000000000000000000389+0000000001080d0103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c000a0101005000f303000000000000390+000000006e6574207469746c650000001c000d0101005000f303000000000000
391-0000000000000000000000000000000001080b0103000000ef03000000000000391+0000000000000000000000000000000001080e0103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c000b01392+090000000000000000000000000000006e6574207469746c650000001c000e01
393-01005000f3030000000000000000000000000000000000000000000001080c01393+01005000f3030000000000000000000000000000000000000000000001080f01
394-03000000ef03000000000000090000000000000000000000000000006e657420394+03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c000c0101005000f3030000000000000000000000000000395+7469746c650000001c000f0101005000f3030000000000000000000000000000
396-000000000000000001080d0103000000ef030000000000000900000000000000396+00000000000000000108100103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c000d0101005000f3030000397+00000000000000006e6574207469746c650000001c00100101005000f3030000
398-000000000000000000000000000000000000000001080e0103000000ef030000398+00000000000000000000000000000000000000000108110103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000399+00000000090000000000000000000000000000006e6574207469746c65000000
400-1c000e0101005000f30300000000000000000000000000000000000000000000400+1c00110101005000f30300000000000000000000000000000000000000000000
401-01080f0103000000ef0300000000000009000000000000000000000000000000401+0108120103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c000f0101005000f30300000000000000000000402+6e6574207469746c650000001c00120101005000f30300000000000000000000
403-0000000000000000000000000108100103000000ef0300000000000009000000403+0000000000000000000000000108130103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c00100101005000404+0000000000000000000000006e6574207469746c650000001c00130101005000
405-f303000000000000000000000000000000000000000000000108110103000000405+f303000000000000000000000000000000000000000000000108140103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c406+ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c00110101005000f303000000000000000000000000000000000000407+650000001c00140101005000f303000000000000000000000000000000000000
408-000000000108120103000000ef03000000000000090000000000000000000000408+000000000108150103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c00120101005000f303000000000000409+000000006e6574207469746c650000001c00150101005000f303000000000000
410-000000000000000000000000000000000108130103000000ef03000000000000410+000000000000000000000000000000000108160103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001301411+090000000000000000000000000000006e6574207469746c650000001c001601
412-01005000f3030000000000000000000000000000000000000000000001081401412+01005000f3030000000000000000000000000000000000000000000001081701
413-03000000ef03000000000000090000000000000000000000000000006e657420413+03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c00140101005000f3030000000000000000000000000000414+7469746c650000001c00170101005000f3030000000000000000000000000000
415-00000000000000000108150103000000ef030000000000000900000000000000415+00000000000000000108180103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00150101005000f3030000416+00000000000000006e6574207469746c650000001c00180101005000f3030000
417-00000000000000000000000000000000000000000108160103000000ef030000417+00000000000000000000000000000000000000000108190103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000418+00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00160101005000f30300000000000000000000000000000000000000000000419+1c00190101005000f30300000000000000000000000000000000000000000000
420-0108170103000000ef0300000000000009000000000000000000000000000000420+01081a0103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00170101005000f30300000000000000000000421+6e6574207469746c650000001c001a0101005000f30300000000000000000000
422-0000000000000000000000000108180103000000ef0300000000000009000000422+00000000000000000000000001081b0103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00180101005000423+0000000000000000000000006e6574207469746c650000001c001b0101005000
424-f303000000000000000000000000000000000000000000000108190103000000424+f3030000000000000000000000000000000000000000000001081c0103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c425+ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00190101005000f303000000000000000000000000000000000000426+650000001c001c0101005000f303000000000000000000000000000000000000
427-0000000001081a0103000000ef03000000000000090000000000000000000000427+0000000001081d0103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c001a0101005000f303000000000000428+000000006e6574207469746c650000001c001d0101005000f303000000000000
429-0000000000000000000000000000000001081b0103000000ef03000000000000429+0000000000000000000000000000000001081e0103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c001b01430+090000000000000000000000000000006e6574207469746c650000001c001e01
431-01005000f3030000000000000000000000000000000000000000000001081c01431+01005000f3030000000000000000000000000000000000000000000001081f01
432-03000000ef03000000000000090000000000000000000000000000006e657420432+03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c001c0101005000f3030000000000000000000000000000433+7469746c650000001c001f0101005000f3030000000000000000000000000000
434-000000000000000001081d0103000000ef030000000000000900000000000000434+00000000000000000108200103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c001d0101005000f3030000435+00000000000000006e6574207469746c650000001c00200101005000f3030000
436-000000000000000000000000000000000000000001081e0103000000ef030000436+00000000000000000000000000000000000000000108210103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000437+00000000090000000000000000000000000000006e6574207469746c65000000
438-1c001e0101005000f30300000000000000000000000000000000000000000000438+1c00210101005000f30300000000000000000000000000000000000000000000
439-01081f0103000000ef0300000000000009000000000000000000000000000000439+0108220103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c001f0101005000f30300000000000000000000440+6e6574207469746c650000001c00220101005000f30300000000000000000000
441-0000000000000000000000000108200103000000ef0300000000000009000000441+0000000000000000000000000108230103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c00200101005000442+0000000000000000000000006e6574207469746c650000001c00230101005000
443-f303000000000000000000000000000000000000000000000108210103000000443+f303000000000000000000000000000000000000000000000108240103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c444+ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c00210101005000f303000000000000000000000000000000000000445+650000001c00240101005000f303000000000000000000000000000000000000
446-000000000108220103000000ef03000000000000090000000000000000000000446+000000000108250103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c00220101005000f303000000000000447+000000006e6574207469746c650000001c00250101005000f303000000000000
448-000000000000000000000000000000000108230103000000ef03000000000000448+000000000000000000000000000000000108260103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002301449+090000000000000000000000000000006e6574207469746c650000001c002601
450-01005000f3030000000000000000000000000000000000000000000001082401450+01005000f3030000000000000000000000000000000000000000000001082701
451-03000000ef03000000000000090000000000000000000000000000006e657420451+03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c00240101005000f3030000000000000000000000000000452+7469746c650000001c00270101005000f3030000000000000000000000000000
453-00000000000000000108250103000000ef030000000000000900000000000000453+00000000000000000108280103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00250101005000f3030000454+00000000000000006e6574207469746c650000001c00280101005000f3030000
455-00000000000000000000000000000000000000000108260103000000ef030000455+00000000000000000000000000000000000000000108290103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000456+00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00260101005000f30300000000000000000000000000000000000000000000457+1c00290101005000f30300000000000000000000000000000000000000000000
458-0108270103000000ef0300000000000009000000000000000000000000000000458+01082a0103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00270101005000f30300000000000000000000459+6e6574207469746c650000001c002a0101005000f30300000000000000000000
460-0000000000000000000000000108280103000000ef0300000000000009000000460+00000000000000000000000001082b0103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00280101005000461+0000000000000000000000006e6574207469746c650000001c002b0101005000
462-f303000000000000000000000000000000000000000000000108290103000000462+f3030000000000000000000000000000000000000000000001082c0103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c463+ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00290101005000f303000000000000000000000000000000000000464+650000001c002c0101005000f303000000000000000000000000000000000000
465-0000000001082a0103000000ef03000000000000090000000000000000000000465+0000000001082d0103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c002a0101005000f303000000000000466+000000006e6574207469746c650000001c002d0101005000f303000000000000
467-0000000000000000000000000000000001082b0103000000ef03000000000000467+0000000000000000000000000000000001082e0103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c002b01468+090000000000000000000000000000006e6574207469746c650000001c002e01
469-01005000f3030000000000000000000000000000000000000000000001082c01469+01005000f3030000000000000000000000000000000000000000000001082f01
470-03000000ef03000000000000090000000000000000000000000000006e657420470+03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c002c0101005000f3030000000000000000000000000000471+7469746c650000001c002f0101005000f3030000000000000000000000000000
472-000000000000000001082d0103000000ef030000000000000900000000000000472+00000000000000000108300103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c002d0101005000f3030000473+00000000000000006e6574207469746c650000001c00300101005000f3030000
474-000000000000000000000000000000000000000001082e0103000000ef030000474+00000000000000000000000000000000000000000108310103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000475+00000000090000000000000000000000000000006e6574207469746c65000000
476-1c002e0101005000f30300000000000000000000000000000000000000000000476+1c00310101005000f30300000000000000000000000000000000000000000000
477-01082f0103000000ef0300000000000009000000000000000000000000000000477+0108320103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c002f0101005000f30300000000000000000000478+6e6574207469746c650000001c00320101005000f30300000000000000000000
479-0000000000000000000000000108300103000000ef0300000000000009000000479+0000000000000000000000000108330103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c00300101005000480+0000000000000000000000006e6574207469746c650000001c00330101005000
481-f303000000000000000000000000000000000000000000000108310103000000481+f303000000000000000000000000000000000000000000000108340103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c482+ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c00310101005000f303000000000000000000000000000000000000483+650000001c00340101005000f303000000000000000000000000000000000000
484-000000000108320103000000ef03000000000000090000000000000000000000484+000000000108350103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c00320101005000f303000000000000485+000000006e6574207469746c650000001c00350101005000f303000000000000
486-000000000000000000000000000000000108330103000000ef03000000000000486+000000000000000000000000000000000108360103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003301487+090000000000000000000000000000006e6574207469746c650000001c003601
488-01005000f3030000000000000000000000000000000000000000000001083401488+01005000f3030000000000000000000000000000000000000000000001083701
489-03000000ef03000000000000090000000000000000000000000000006e657420489+03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c00340101005000f3030000000000000000000000000000490+7469746c650000001c00370101005000f3030000000000000000000000000000
491-00000000000000000108350103000000ef030000000000000900000000000000491+00000000000000000108380103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00350101005000f3030000492+00000000000000006e6574207469746c650000001c00380101005000f3030000
493-00000000000000000000000000000000000000000108360103000000ef030000493+00000000000000000000000000000000000000000108390103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000494+00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00360101005000f30300000000000000000000000000000000000000000000495+1c00390101005000f30300000000000000000000000000000000000000000000
496-0108370103000000ef0300000000000009000000000000000000000000000000496+01083a0103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00370101005000f30300000000000000000000497+6e6574207469746c650000001c003a0101005000f30300000000000000000000
498-0000000000000000000000000108380103000000ef0300000000000009000000498+00000000000000000000000001083b0103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00380101005000499+0000000000000000000000006e6574207469746c650000001c003b0101005000
500-f303000000000000000000000000000000000000000000000108390103000000500+f3030000000000000000000000000000000000000000000001083c0103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c501+ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00390101005000f303000000000000000000000000000000000000502+650000001c003c0101005000f303000000000000000000000000000000000000
503-0000000001083a0103000000ef03000000000000090000000000000000000000503+0000000001083d0103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c003a0101005000f303000000000000504+000000006e6574207469746c650000001c003d0101005000f303000000000000
505-0000000000000000000000000000000001083b0103000000ef03000000000000505+0000000000000000000000000000000001083e0103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c003b01506+090000000000000000000000000000006e6574207469746c650000001c003e01
507-01005000f3030000000000000000000000000000000000000000000001083c01507+01005000f3030000000000000000000000000000000000000000000001083f01
508-03000000ef03000000000000090000000000000000000000000000006e657420508+03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c003c0101005000f3030000000000000000000000000000509+7469746c650000001c003f0101005000f3030000000000000000000000000000
510-000000000000000001083d0103000000ef030000000000000900000000000000510+00000000000000000108400103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c003d0101005000f3030000511+00000000000000006e6574207469746c650000001c00400101005000f3030000
512-000000000000000000000000000000000000000001083e0103000000ef030000512+00000000000000000000000000000000000000000108410103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000513+00000000090000000000000000000000000000006e6574207469746c65000000
514-1c003e0101005000f30300000000000000000000000000000000000000000000514+1c00410101005000f30300000000000000000000000000000000000000000000
515-01083f0103000000ef0300000000000009000000000000000000000000000000515+0108420103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c003f0101005000f30300000000000000000000516+6e6574207469746c650000001c00420101005000f30300000000000000000000
517-0000000000000000000000000108400103000000ef0300000000000009000000517+0000000000000000000000000108430103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c00400101005000518+0000000000000000000000006e6574207469746c650000001c00430101005000
519-f303000000000000000000000000000000000000000000000108410103000000519+f303000000000000000000000000000000000000000000000108440103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c520+ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c00410101005000f303000000000000000000000000000000000000521+650000001c00440101005000f303000000000000000000000000000000000000
522-000000000108420103000000ef03000000000000090000000000000000000000522+000000000108450103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c00420101005000f303000000000000523+000000006e6574207469746c650000001c00450101005000f303000000000000
524-000000000000000000000000000000000108430103000000ef03000000000000524+000000000000000000000000000000000108460103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004301525+090000000000000000000000000000006e6574207469746c650000001c004601
526-01005000f3030000000000000000000000000000000000000000000001084401526+01005000f3030000000000000000000000000000000000000000000001084701
527-03000000ef03000000000000090000000000000000000000000000006e657420527+03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c00440101005000f3030000000000000000000000000000528+7469746c650000001c00470101005000f3030000000000000000000000000000
529-00000000000000000108450103000000ef030000000000000900000000000000529+00000000000000000108480103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00450101005000f3030000530+00000000000000006e6574207469746c650000001c00480101005000f3030000
531-00000000000000000000000000000000000000000108460103000000ef030000531+00000000000000000000000000000000000000000108490103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000532+00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00460101005000f30300000000000000000000000000000000000000000000533+1c00490101005000f30300000000000000000000000000000000000000000000
534-0108470103000000ef0300000000000009000000000000000000000000000000534+01084a0103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00470101005000f30300000000000000000000535+6e6574207469746c650000001c004a0101005000f30300000000000000000000
536-0000000000000000000000000108480103000000ef0300000000000009000000536+00000000000000000000000001084b0103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00480101005000537+0000000000000000000000006e6574207469746c650000001c004b0101005000
538-f303000000000000000000000000000000000000000000000108490103000000538+f3030000000000000000000000000000000000000000000001084c0103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c539+ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00490101005000f303000000000000000000000000000000000000540+650000001c004c0101005000f303000000000000000000000000000000000000
541-0000000001084a0103000000ef03000000000000090000000000000000000000541+0000000001084d0103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c004a0101005000f303000000000000542+000000006e6574207469746c650000001c004d0101005000f303000000000000
543-0000000000000000000000000000000001084b0103000000ef03000000000000543+0000000000000000000000000000000001084e0103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c004b01544+090000000000000000000000000000006e6574207469746c650000001c004e01
545-01005000f3030000000000000000000000000000000000000000000001084c01545+01005000f3030000000000000000000000000000000000000000000001084f01
546-03000000ef03000000000000090000000000000000000000000000006e657420546+03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c004c0101005000f3030000000000000000000000000000547+7469746c650000001c004f0101005000f3030000000000000000000000000000
548-000000000000000001084d0103000000ef030000000000000900000000000000548+00000000000000000108500103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c004d0101005000f3030000549+00000000000000006e6574207469746c650000001c00500101005000f3030000
550-000000000000000000000000000000000000000001084e0103000000ef030000550+00000000000000000000000000000000000000000108510103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000551+00000000090000000000000000000000000000006e6574207469746c65000000
552-1c004e0101005000f30300000000000000000000000000000000000000000000552+1c00510101005000f30300000000000000000000000000000000000000000000
553-01084f0103000000ef0300000000000009000000000000000000000000000000553+0108520103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c004f0101005000f30300000000000000000000554+6e6574207469746c650000001c00520101005000f30300000000000000000000
555-0000000000000000000000000108500103000000ef0300000000000009000000555+0000000000000000000000000108530103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c00500101005000556+0000000000000000000000006e6574207469746c650000001c00530101005000
557-f303000000000000000000000000000000000000000000000108510103000000557+f303000000000000000000000000000000000000000000000108540103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c558+ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c00510101005000f303000000000000000000000000000000000000559+650000001c00540101005000f303000000000000000000000000000000000000
560-000000000108520103000000ef03000000000000090000000000000000000000560+000000000108550103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c00520101005000f303000000000000561+000000006e6574207469746c650000001c00550101005000f303000000000000
562-000000000000000000000000000000000108530103000000ef03000000000000562+000000000000000000000000000000000108560103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005301563+090000000000000000000000000000006e6574207469746c650000001c005601
564-01005000f3030000000000000000000000000000000000000000000001085401564+01005000f3030000000000000000000000000000000000000000000001085701
565-03000000ef03000000000000090000000000000000000000000000006e657420565+03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c00540101005000f3030000000000000000000000000000566+7469746c650000001c00570101005000f3030000000000000000000000000000
567-00000000000000000108550103000000ef030000000000000900000000000000567+00000000000000000108580103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00550101005000f3030000568+00000000000000006e6574207469746c650000001c00580101005000f3030000
569-00000000000000000000000000000000000000000108560103000000ef030000569+00000000000000000000000000000000000000000108590103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000570+00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00560101005000f30300000000000000000000000000000000000000000000571+1c00590101005000f30300000000000000000000000000000000000000000000
572-0108570103000000ef0300000000000009000000000000000000000000000000572+01085a0103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00570101005000f30300000000000000000000573+6e6574207469746c650000001c005a0101005000f30300000000000000000000
574-0000000000000000000000000108580103000000ef0300000000000009000000574+00000000000000000000000001085b0103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00580101005000575+0000000000000000000000006e6574207469746c650000001c005b0101005000
576-f303000000000000000000000000000000000000000000000108590103000000576+f3030000000000000000000000000000000000000000000001085c0103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c577+ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00590101005000f303000000000000000000000000000000000000578+650000001c005c0101005000f303000000000000000000000000000000000000
579-0000000001085a0103000000ef03000000000000090000000000000000000000579+0000000001085d0103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c005a0101005000f303000000000000580+000000006e6574207469746c650000001c005d0101005000f303000000000000
581-0000000000000000000000000000000001085b0103000000ef03000000000000581+0000000000000000000000000000000001085e0103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c005b01582+090000000000000000000000000000006e6574207469746c650000001c005e01
583-01005000f3030000000000000000000000000000000000000000000001085c01583+01005000f3030000000000000000000000000000000000000000000001085f01
584-03000000ef03000000000000090000000000000000000000000000006e657420584+03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c005c0101005000f3030000000000000000000000000000585+7469746c650000001c005f0101005000f3030000000000000000000000000000
586-000000000000000001085d0103000000ef030000000000000900000000000000586+00000000000000000108600103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c005d0101005000f3030000587+00000000000000006e6574207469746c650000001c00600101005000f3030000
588-000000000000000000000000000000000000000001085e0103000000ef030000588+00000000000000000000000000000000000000000108610103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000589+00000000090000000000000000000000000000006e6574207469746c65000000
590-1c005e0101005000f30300000000000000000000000000000000000000000000590+1c00610101005000f30300000000000000000000000000000000000000000000
591-01085f0103000000ef0300000000000009000000000000000000000000000000591+0108620103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c005f0101005000f30300000000000000000000592+6e6574207469746c650000001c00620101005000f30300000000000000000000
593-0000000000000000000000000108600103000000ef0300000000000009000000593+0000000000000000000000000108630103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c00600101005000594+0000000000000000000000006e6574207469746c650000001c00630101005000
595-f303000000000000000000000000000000000000000000000108610103000000595+f303000000000000000000000000000000000000000000000108640103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c596+ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c00610101005000f303000000000000000000000000000000000000597+650000001c00640101005000f303000000000000000000000000000000000000
598-000000000108620103000000ef03000000000000090000000000000000000000598+000000000108650103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c00620101005000f303000000000000599+000000006e6574207469746c650000001c00650101005000f303000000000000
600-000000000000000000000000000000000108630103000000ef03000000000000600+000000000000000000000000000000000108660103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006301601+090000000000000000000000000000006e6574207469746c650000001c006601
602-01005000f3030000000000000000000000000000000000000000000001086401602+01005000f3030000000000000000000000000000000000000000000001086701
603-03000000ef03000000000000090000000000000000000000000000006e657420603+03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c00640101005000f3030000000000000000000000000000604+7469746c650000001c00670101005000f3030000000000000000000000000000
605-00000000000000000108650103000000ef030000000000000900000000000000605+00000000000000000108680103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00650101005000f3030000606+00000000000000006e6574207469746c650000001c00680101005000f3030000
607-00000000000000000000000000000000000000000108660103000000ef030000607+00000000000000000000000000000000000000000108690103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000608+00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00660101005000f30300000000000000000000000000000000000000000000609+1c00690101005000f30300000000000000000000000000000000000000000000
610-0108670103000000ef0300000000000009000000000000000000000000000000610+01086a0103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00670101005000f30300000000000000000000611+6e6574207469746c650000001c006a0101005000f30300000000000000000000
612-0000000000000000000000000108680103000000ef0300000000000009000000612+00000000000000000000000001086b0103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00680101005000613+0000000000000000000000006e6574207469746c650000001c006b0101005000
614-f303000000000000000000000000000000000000000000000108690103000000614+f3030000000000000000000000000000000000000000000001086c0103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c615+ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00690101005000f303000000000000000000000000000000000000616+650000001c006c0101005000f303000000000000000000000000000000000000
617-0000000001086a0103000000ef03000000000000090000000000000000000000617+0000000001086d0103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c006a0101005000f303000000000000618+000000006e6574207469746c650000001c006d0101005000f303000000000000
619-0000000000000000000000000000000001086b0103000000ef03000000000000619+0000000000000000000000000000000001086e0103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c006b01620+090000000000000000000000000000006e6574207469746c650000001c006e01
621-01005000f3030000000000000000000000000000000000000000000001086c01621+01005000f3030000000000000000000000000000000000000000000001086f01
622-03000000ef03000000000000090000000000000000000000000000006e657420622+03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c006c0101005000f3030000000000000000000000000000623+7469746c650000001c006f0101005000f3030000000000000000000000000000
624-000000000000000001086d0103000000ef030000000000000900000000000000624+00000000000000000108700103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c006d0101005000f3030000625+00000000000000006e6574207469746c650000001c00700101005000f3030000
626-000000000000000000000000000000000000000001086e0103000000ef030000626+00000000000000000000000000000000000000000108710103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000627+00000000090000000000000000000000000000006e6574207469746c65000000
628-1c006e0101005000f30300000000000000000000000000000000000000000000628+1c00710101005000f30300000000000000000000000000000000000000000000
629-01086f0103000000ef0300000000000009000000000000000000000000000000629+0108720103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c006f0101005000f30300000000000000000000630+6e6574207469746c650000001c00720101005000f30300000000000000000000
631-0000000000000000000000000108700103000000ef0300000000000009000000631+0000000000000000000000000108730103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c00700101005000632+0000000000000000000000006e6574207469746c650000001c00730101005000
633-f303000000000000000000000000000000000000000000000108710103000000633+f303000000000000000000000000000000000000000000000108740103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c634+ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c00710101005000f303000000000000000000000000000000000000635+650000001c00740101005000f303000000000000000000000000000000000000
636-000000000108720103000000ef03000000000000090000000000000000000000636+000000000108750103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c00720101005000f303000000000000637+000000006e6574207469746c650000001c00750101005000f303000000000000
638-000000000000000000000000000000000108730103000000ef03000000000000638+000000000000000000000000000000000108760103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007301639+090000000000000000000000000000006e6574207469746c650000001c007601
640-01005000f3030000000000000000000000000000000000000000000001087401640+01005000f3030000000000000000000000000000000000000000000001087701
641-03000000ef03000000000000090000000000000000000000000000006e657420641+03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c00740101005000f3030000000000000000000000000000642+7469746c650000001c00770101005000f3030000000000000000000000000000
643-00000000000000000108750103000000ef030000000000000900000000000000643+00000000000000000108780103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00750101005000f3030000644+00000000000000006e6574207469746c650000001c00780101005000f3030000
645-00000000000000000000000000000000000000000108760103000000ef030000645+00000000000000000000000000000000000000000108790103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000646+00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00760101005000f30300000000000000000000000000000000000000000000647+1c00790101005000f30300000000000000000000000000000000000000000000
648-0108770103000000ef0300000000000009000000000000000000000000000000648+01087a0103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00770101005000f30300000000000000000000649+6e6574207469746c650000001c007a0101005000f30300000000000000000000
650-0000000000000000000000000108780103000000ef0300000000000009000000650+00000000000000000000000001087b0103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00780101005000651+0000000000000000000000006e6574207469746c650000001c007b0101005000
652-f303000000000000000000000000000000000000000000000108790103000000652+f3030000000000000000000000000000000000000000000001087c0103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c653+ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00790101005000f303000000000000000000000000000000000000654+650000001c007c0101005000f303000000000000000000000000000000000000
655-0000000001087a0103000000ef03000000000000090000000000000000000000655+0000000001087d0103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c007a0101005000f303000000000000656+000000006e6574207469746c650000001c007d0101005000f303000000000000
657-0000000000000000000000000000000001087b0103000000ef03000000000000657+0000000000000000000000000000000001087e0103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c007b01658+090000000000000000000000000000006e6574207469746c650000001c007e01
659-01005000f3030000000000000000000000000000000000000000000001087c01659+01005000f3030000000000000000000000000000000000000000000001087f01
660-03000000ef03000000000000090000000000000000000000000000006e657420660+03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c007c0101005000f3030000000000000000000000000000661+7469746c650000001c007f0101005000f3030000000000000000000000000000
662-000000000000000001087d0103000000ef030000000000000900000000000000662+00000000000000000108800103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c007d0101005000f3030000663+00000000000000006e6574207469746c650000001c00800101005000f3030000
664-000000000000000000000000000000000000000001087e0103000000ef030000664+00000000000000000000000000000000000000000108810103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000665+00000000090000000000000000000000000000006e6574207469746c65000000
666-1c007e0101005000f30300000000000000000000000000000000000000000000666+1c00810101005000f30300000000000000000000000000000000000000000000
667-01087f0103000000ef0300000000000009000000000000000000000000000000667+0108820103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c007f0101005000f30300000000000000000000668+6e6574207469746c650000001c00820101005000f30300000000000000000000
669-0000000000000000000000000108800103000000ef0300000000000009000000669+0000000000000000000000000108830103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c00800101005000670+0000000000000000000000006e6574207469746c650000001c00830101005000
671-f303000000000000000000000000000000000000000000000108810103000000671+f303000000000000000000000000000000000000000000000108840103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c672+ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c00810101005000f303000000000000000000000000000000000000673+650000001c00840101005000f303000000000000000000000000000000000000
674-000000000108820103000000ef03000000000000090000000000000000000000674+000000000108850103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c00820101005000f303000000000000675+000000006e6574207469746c650000001c00850101005000f303000000000000
676-000000000000000000000000000000000108830103000000ef03000000000000676+000000000000000000000000000000000108860103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008301677+090000000000000000000000000000006e6574207469746c650000001c008601
678-01005000f3030000000000000000000000000000000000000000000001088401678+01005000f3030000000000000000000000000000000000000000000001088701
679-03000000ef03000000000000090000000000000000000000000000006e657420679+03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c00840101005000f3030000000000000000000000000000680+7469746c650000001c00870101005000f3030000000000000000000000000000
681-00000000000000000108850103000000ef030000000000000900000000000000681+00000000000000000108880103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00850101005000f3030000682+00000000000000006e6574207469746c650000001c00880101005000f3030000
683-00000000000000000000000000000000000000000108860103000000ef030000683+00000000000000000000000000000000000000000108890103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000684+00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00860101005000f30300000000000000000000000000000000000000000000685+1c00890101005000f30300000000000000000000000000000000000000000000
686-0108870103000000ef0300000000000009000000000000000000000000000000686+01088a0103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00870101005000f30300000000000000000000687+6e6574207469746c650000001c008a0101005000f30300000000000000000000
688-0000000000000000000000000108880103000000ef0300000000000009000000688+00000000000000000000000001088b0103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00880101005000689+0000000000000000000000006e6574207469746c650000001c008b0101005000
690-f303000000000000000000000000000000000000000000000108890103000000690+f3030000000000000000000000000000000000000000000001088c0103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c691+ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00890101005000f303000000000000000000000000000000000000692+650000001c008c0101005000f303000000000000000000000000000000000000
693-0000000001088a0103000000ef03000000000000090000000000000000000000693+0000000001088d0103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c008a0101005000f303000000000000694+000000006e6574207469746c650000001c008d0101005000f303000000000000
695-0000000000000000000000000000000001088b0103000000ef03000000000000695+0000000000000000000000000000000001088e0103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c008b01696+090000000000000000000000000000006e6574207469746c650000001c008e01
697-01005000f3030000000000000000000000000000000000000000000001088c01697+01005000f3030000000000000000000000000000000000000000000001088f01
698-03000000ef03000000000000090000000000000000000000000000006e657420698+03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c008c0101005000f3030000000000000000000000000000699+7469746c650000001c008f0101005000f3030000000000000000000000000000
700-000000000000000001088d0103000000ef030000000000000900000000000000700+00000000000000000108900103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c008d0101005000f3030000701+00000000000000006e6574207469746c650000001c00900101005000f3030000
702-000000000000000000000000000000000000000001088e0103000000ef030000702+00000000000000000000000000000000000000000108910103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000703+00000000090000000000000000000000000000006e6574207469746c65000000
704-1c008e0101005000f30300000000000000000000000000000000000000000000704+1c00910101005000f30300000000000000000000000000000000000000000000
705-01088f0103000000ef0300000000000009000000000000000000000000000000705+0108920103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c008f0101005000f30300000000000000000000706+6e6574207469746c650000001c00920101005000f30300000000000000000000
707-0000000000000000000000000108900103000000ef0300000000000009000000707+0000000000000000000000000108930103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c00900101005000708+0000000000000000000000006e6574207469746c650000001c00930101005000
709-f303000000000000000000000000000000000000000000000108910103000000709+f303000000000000000000000000000000000000000000000108940103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c710+ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c00910101005000f303000000000000000000000000000000000000711+650000001c00940101005000f303000000000000000000000000000000000000
712-000000000108920103000000ef03000000000000090000000000000000000000712+000000000108950103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c00920101005000f303000000000000713+000000006e6574207469746c650000001c00950101005000f303000000000000
714-000000000000000000000000000000000108930103000000ef03000000000000714+000000000000000000000000000000000108960103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009301715+090000000000000000000000000000006e6574207469746c650000001c009601
716-01005000f3030000000000000000000000000000000000000000000001089401716+01005000f3030000000000000000000000000000000000000000000001089701
717-03000000ef03000000000000090000000000000000000000000000006e657420717+03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c00940101005000f3030000000000000000000000000000718+7469746c650000001c00970101005000f3030000000000000000000000000000
719-00000000000000000108950103000000ef030000000000000900000000000000719+00000000000000000108980103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00950101005000f3030000720+00000000000000006e6574207469746c650000001c00980101005000f3030000
721-00000000000000000000000000000000000000000108960103000000ef030000721+00000000000000000000000000000000000000000108990103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000722+00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00960101005000f30300000000000000000000000000000000000000000000723+1c00990101005000f30300000000000000000000000000000000000000000000
724-0108970103000000ef0300000000000009000000000000000000000000000000724+01089a0103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00970101005000f30300000000000000000000725+6e6574207469746c650000001c009a0101005000f30300000000000000000000
726-0000000000000000000000000108980103000000ef0300000000000009000000726+00000000000000000000000001089b0103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00980101005000727+0000000000000000000000006e6574207469746c650000001c009b0101005000
728-f303000000000000000000000000000000000000000000000108990103000000728+f3030000000000000000000000000000000000000000000001089c0103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c729+ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00990101005000f303000000000000000000000000000000000000730+650000001c009c0101005000f303000000000000000000000000000000000000
731-0000000001089a0103000000ef03000000000000090000000000000000000000731+0000000001089d0103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c009a0101005000f303000000000000732+000000006e6574207469746c650000001c009d0101005000f303000000000000
733-0000000000000000000000000000000001089b0103000000ef03000000000000733+0000000000000000000000000000000001089e0103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c009b01734+090000000000000000000000000000006e6574207469746c650000001c009e01
735-01005000f3030000000000000000000000000000000000000000000001089c01735+01005000f3030000000000000000000000000000000000000000000001089f01
736-03000000ef03000000000000090000000000000000000000000000006e657420736+03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c009c0101005000f3030000000000000000000000000000737+7469746c650000001c009f0101005000f3030000000000000000000000000000
738-000000000000000001089d0103000000ef030000000000000900000000000000738+00000000000000000108a00103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c009d0101005000f3030000739+00000000000000006e6574207469746c650000001c00a00101005000f3030000
740-000000000000000000000000000000000000000001089e0103000000ef030000740+00000000000000000000000000000000000000000108a10103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000741+00000000090000000000000000000000000000006e6574207469746c65000000
742-1c009e0101005000f30300000000000000000000000000000000000000000000742+1c00a10101005000f30300000000000000000000000000000000000000000000
743-01089f0103000000ef0300000000000009000000000000000000000000000000743+0108a20103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c009f0101005000f30300000000000000000000744+6e6574207469746c650000001c00a20101005000f30300000000000000000000
745-0000000000000000000000000108a00103000000ef0300000000000009000000745+0000000000000000000000000108a30103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c00a00101005000746+0000000000000000000000006e6574207469746c650000001c00a30101005000
747-f303000000000000000000000000000000000000000000000108a10103000000747+f303000000000000000000000000000000000000000000000108a40103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c748+ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00a10101005000f303000000000000000000000000000000000000749+650000001c00a40101005000f303000000000000000000000000000000000000
750-000000000108a20103000000ef03000000000000090000000000000000000000750+000000000108a50103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00a20101005000f303000000000000751+000000006e6574207469746c650000001c00a50101005000f303000000000000
752-000000000000000000000000000000000108a30103000000ef03000000000000752+000000000000000000000000000000000108a60103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00a301753+090000000000000000000000000000006e6574207469746c650000001c00a601
754-01005000f303000000000000000000000000000000000000000000000108a401754+01005000f303000000000000000000000000000000000000000000000108a701
755-03000000ef03000000000000090000000000000000000000000000006e657420755+03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00a40101005000f3030000000000000000000000000000756+7469746c650000001c00a70101005000f3030000000000000000000000000000
757-00000000000000000108a50103000000ef030000000000000900000000000000757+00000000000000000108a80103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00a50101005000f3030000758+00000000000000006e6574207469746c650000001c00a80101005000f3030000
759-00000000000000000000000000000000000000000108a60103000000ef030000759+00000000000000000000000000000000000000000108a90103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000760+00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00a60101005000f30300000000000000000000000000000000000000000000761+1c00a90101005000f30300000000000000000000000000000000000000000000
762-0108a70103000000ef0300000000000009000000000000000000000000000000762+0108aa0103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00a70101005000f30300000000000000000000763+6e6574207469746c650000001c00aa0101005000f30300000000000000000000
764-0000000000000000000000000108a80103000000ef0300000000000009000000764+0000000000000000000000000108ab0103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00a80101005000765+0000000000000000000000006e6574207469746c650000001c00ab0101005000
766-f303000000000000000000000000000000000000000000000108a90103000000766+f303000000000000000000000000000000000000000000000108ac0103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c767+ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00a90101005000f303000000000000000000000000000000000000768+650000001c00ac0101005000f303000000000000000000000000000000000000
769-000000000108aa0103000000ef03000000000000090000000000000000000000769+000000000108ad0103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00aa0101005000f303000000000000770+000000006e6574207469746c650000001c00ad0101005000f303000000000000
771-000000000000000000000000000000000108ab0103000000ef03000000000000771+000000000000000000000000000000000108ae0103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00ab01772+090000000000000000000000000000006e6574207469746c650000001c00ae01
773-01005000f303000000000000000000000000000000000000000000000108ac01773+01005000f303000000000000000000000000000000000000000000000108af01
774-03000000ef03000000000000090000000000000000000000000000006e657420774+03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00ac0101005000f3030000000000000000000000000000775+7469746c650000001c00af0101005000f3030000000000000000000000000000
776-00000000000000000108ad0103000000ef030000000000000900000000000000776+00000000000000000108b00103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00ad0101005000f3030000777+00000000000000006e6574207469746c650000001c00b00101005000f3030000
778-00000000000000000000000000000000000000000108ae0103000000ef030000778+00000000000000000000000000000000000000000108b10103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000779+00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00ae0101005000f30300000000000000000000000000000000000000000000780+1c00b10101005000f30300000000000000000000000000000000000000000000
781-0108af0103000000ef0300000000000009000000000000000000000000000000781+0108b20103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00af0101005000f30300000000000000000000782+6e6574207469746c650000001c00b20101005000f30300000000000000000000
783-0000000000000000000000000108b00103000000ef0300000000000009000000783+0000000000000000000000000108b30103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00b00101005000784+0000000000000000000000006e6574207469746c650000001c00b30101005000
785-f303000000000000000000000000000000000000000000000108b10103000000785+f303000000000000000000000000000000000000000000000108b40103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c786+ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00b10101005000f303000000000000000000000000000000000000787+650000001c00b40101005000f303000000000000000000000000000000000000
788-000000000108b20103000000ef03000000000000090000000000000000000000788+000000000108b50103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00b20101005000f303000000000000789+000000006e6574207469746c650000001c00b50101005000f303000000000000
790-000000000000000000000000000000000108b30103000000ef03000000000000790+000000000000000000000000000000000108b60103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00b301791+090000000000000000000000000000006e6574207469746c650000001c00b601
792-01005000f303000000000000000000000000000000000000000000000108b401792+01005000f303000000000000000000000000000000000000000000000108b701
793-03000000ef03000000000000090000000000000000000000000000006e657420793+03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00b40101005000f3030000000000000000000000000000794+7469746c650000001c00b70101005000f3030000000000000000000000000000
795-00000000000000000108b50103000000ef030000000000000900000000000000795+00000000000000000108b80103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00b50101005000f3030000796+00000000000000006e6574207469746c650000001c00b80101005000f3030000
797-00000000000000000000000000000000000000000108b60103000000ef030000797+00000000000000000000000000000000000000000108b90103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000798+00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00b60101005000f30300000000000000000000000000000000000000000000799+1c00b90101005000f30300000000000000000000000000000000000000000000
800-0108b70103000000ef0300000000000009000000000000000000000000000000800+0108ba0103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00b70101005000f30300000000000000000000801+6e6574207469746c650000001c00ba0101005000f30300000000000000000000
802-0000000000000000000000000108b80103000000ef0300000000000009000000802+0000000000000000000000000108bb0103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00b80101005000803+0000000000000000000000006e6574207469746c650000001c00bb0101005000
804-f303000000000000000000000000000000000000000000000108b90103000000804+f303000000000000000000000000000000000000000000000108bc0103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c805+ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00b90101005000f303000000000000000000000000000000000000806+650000001c00bc0101005000f303000000000000000000000000000000000000
807-000000000108ba0103000000ef03000000000000090000000000000000000000807+000000000108bd0103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00ba0101005000f303000000000000808+000000006e6574207469746c650000001c00bd0101005000f303000000000000
809-000000000000000000000000000000000108bb0103000000ef03000000000000809+000000000000000000000000000000000108be0103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00bb01810+090000000000000000000000000000006e6574207469746c650000001c00be01
811-01005000f303000000000000000000000000000000000000000000000108bc01811+01005000f303000000000000000000000000000000000000000000000108bf01
812-03000000ef03000000000000090000000000000000000000000000006e657420812+03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00bc0101005000f3030000000000000000000000000000813+7469746c650000001c00bf0101005000f3030000000000000000000000000000
814-00000000000000000108bd0103000000ef030000000000000900000000000000814+00000000000000000108c00103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00bd0101005000f3030000815+00000000000000006e6574207469746c650000001c00c00101005000f3030000
816-00000000000000000000000000000000000000000108be0103000000ef030000816+00000000000000000000000000000000000000000108c10103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000817+00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00be0101005000f30300000000000000000000000000000000000000000000818+1c00c10101005000f30300000000000000000000000000000000000000000000
819-0108bf0103000000ef0300000000000009000000000000000000000000000000819+0108c20103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00bf0101005000f30300000000000000000000820+6e6574207469746c650000001c00c20101005000f30300000000000000000000
821-0000000000000000000000000108c00103000000ef0300000000000009000000821+0000000000000000000000000108c30103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00c00101005000822+0000000000000000000000006e6574207469746c650000001c00c30101005000
823-f303000000000000000000000000000000000000000000000108c10103000000823+f303000000000000000000000000000000000000000000000108c40103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c824+ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00c10101005000f303000000000000000000000000000000000000825+650000001c00c40101005000f303000000000000000000000000000000000000
826-000000000108c20103000000ef03000000000000090000000000000000000000826+000000000108c50103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00c20101005000f303000000000000827+000000006e6574207469746c650000001c00c50101005000f303000000000000
828-000000000000000000000000000000000108c30103000000ef03000000000000828+000000000000000000000000000000000108c60103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00c301829+090000000000000000000000000000006e6574207469746c650000001c00c601
830-01005000f303000000000000000000000000000000000000000000000108c401830+01005000f303000000000000000000000000000000000000000000000108c701
831-03000000ef03000000000000090000000000000000000000000000006e657420831+03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00c40101005000f3030000000000000000000000000000832+7469746c650000001c00c70101005000f3030000000000000000000000000000
833-00000000000000000108c50103000000ef030000000000000900000000000000833+00000000000000000108c80103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00c50101005000f3030000834+00000000000000006e6574207469746c650000001c00c80101005000f3030000
835-00000000000000000000000000000000000000000108c60103000000ef030000835+00000000000000000000000000000000000000000108c90103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000836+00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00c60101005000f30300000000000000000000000000000000000000000000837+1c00c90101005000f30300000000000000000000000000000000000000000000
838-0108c70103000000ef0300000000000009000000000000000000000000000000838+0108ca0103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00c70101005000f30300000000000000000000839+6e6574207469746c650000001c00ca0101005000f30300000000000000000000
840-0000000000000000000000000108c80103000000ef0300000000000009000000840+0000000000000000000000000108cb0103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00c80101005000841+0000000000000000000000006e6574207469746c650000001c00cb0101005000
842-f303000000000000000000000000000000000000000000000108c90103000000842+f303000000000000000000000000000000000000000000000108cc0103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c843+ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00c90101005000f303000000000000000000000000000000000000844+650000001c00cc0101005000f303000000000000000000000000000000000000
845-000000000108ca0103000000ef03000000000000090000000000000000000000845+000000000108cd0103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00ca0101005000f303000000000000846+000000006e6574207469746c650000001c00cd0101005000f303000000000000
847-000000000000000000000000000000000108cb0103000000ef03000000000000847+000000000000000000000000000000000108ce0103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00cb01848+090000000000000000000000000000006e6574207469746c650000001c00ce01
849-01005000f303000000000000000000000000000000000000000000000108cc01849+01005000f303000000000000000000000000000000000000000000000108cf01
850-03000000ef03000000000000090000000000000000000000000000006e657420850+03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00cc0101005000f3030000000000000000000000000000851+7469746c650000001c00cf0101005000f3030000000000000000000000000000
852-00000000000000000108cd0103000000ef030000000000000900000000000000852+00000000000000000108d00103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00cd0101005000f3030000853+00000000000000006e6574207469746c650000001c00d00101005000f3030000
854-00000000000000000000000000000000000000000108ce0103000000ef030000854+00000000000000000000000000000000000000000108d10103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000855+00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00ce0101005000f30300000000000000000000000000000000000000000000856+1c00d10101005000f30300000000000000000000000000000000000000000000
857-0108cf0103000000ef0300000000000009000000000000000000000000000000857+0108d20103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00cf0101005000f30300000000000000000000858+6e6574207469746c650000001c00d20101005000f30300000000000000000000
859-0000000000000000000000000108d00103000000ef0300000000000009000000859+0000000000000000000000000108d30103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00d00101005000860+0000000000000000000000006e6574207469746c650000001c00d30101005000
861-f303000000000000000000000000000000000000000000000108d10103000000861+f303000000000000000000000000000000000000000000000108d40103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c862+ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00d10101005000f303000000000000000000000000000000000000863+650000001c00d40101005000f303000000000000000000000000000000000000
864-000000000108d20103000000ef03000000000000090000000000000000000000864+000000000108d50103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00d20101005000f303000000000000865+000000006e6574207469746c650000001c00d50101005000f303000000000000
866-000000000000000000000000000000000108d30103000000ef03000000000000866+000000000000000000000000000000000108d60103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00d301867+090000000000000000000000000000006e6574207469746c650000001c00d601
868-01005000f303000000000000000000000000000000000000000000000108d401868+01005000f303000000000000000000000000000000000000000000000108d701
869-03000000ef03000000000000090000000000000000000000000000006e657420869+03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00d40101005000f3030000000000000000000000000000870+7469746c650000001c00d70101005000f3030000000000000000000000000000
871-00000000000000000108d50103000000ef030000000000000900000000000000871+00000000000000000108d80103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00d50101005000f3030000872+00000000000000006e6574207469746c650000001c00d80101005000f3030000
873-00000000000000000000000000000000000000000108d60103000000ef030000873+00000000000000000000000000000000000000000108d90103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000874+00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00d60101005000f30300000000000000000000000000000000000000000000875+1c00d90101005000f30300000000000000000000000000000000000000000000
876-0108d70103000000ef0300000000000009000000000000000000000000000000876+0108da0103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00d70101005000f30300000000000000000000877+6e6574207469746c650000001c00da0101005000f30300000000000000000000
878-0000000000000000000000000108d80103000000ef0300000000000009000000878+0000000000000000000000000108db0103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00d80101005000879+0000000000000000000000006e6574207469746c650000001c00db0101005000
880-f303000000000000000000000000000000000000000000000108d90103000000880+f303000000000000000000000000000000000000000000000108dc0103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c881+ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00d90101005000f303000000000000000000000000000000000000882+650000001c00dc0101005000f303000000000000000000000000000000000000
883-000000000108da0103000000ef03000000000000090000000000000000000000883+000000000108dd0103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00da0101005000f303000000000000884+000000006e6574207469746c650000001c00dd0101005000f303000000000000
885-000000000000000000000000000000000108db0103000000ef03000000000000885+000000000000000000000000000000000108de0103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00db01886+090000000000000000000000000000006e6574207469746c650000001c00de01
887-01005000f303000000000000000000000000000000000000000000000108dc01887+01005000f303000000000000000000000000000000000000000000000108df01
888-03000000ef03000000000000090000000000000000000000000000006e657420888+03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00dc0101005000f3030000000000000000000000000000889+7469746c650000001c00df0101005000f3030000000000000000000000000000
890-00000000000000000108dd0103000000ef030000000000000900000000000000890+00000000000000000108e00103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00dd0101005000f3030000891+00000000000000006e6574207469746c650000001c00e00101005000f3030000
892-00000000000000000000000000000000000000000108de0103000000ef030000892+00000000000000000000000000000000000000000108e10103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000893+00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00de0101005000f30300000000000000000000000000000000000000000000894+1c00e10101005000f30300000000000000000000000000000000000000000000
895-0108df0103000000ef0300000000000009000000000000000000000000000000895+0108e20103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00df0101005000f30300000000000000000000896+6e6574207469746c650000001c00e20101005000f30300000000000000000000
897-0000000000000000000000000108e00103000000ef0300000000000009000000897+0000000000000000000000000108e30103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00e00101005000898+0000000000000000000000006e6574207469746c650000001c00e30101005000
899-f303000000000000000000000000000000000000000000000108e10103000000899+f303000000000000000000000000000000000000000000000108e40103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c900+ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00e10101005000f303000000000000000000000000000000000000901+650000001c00e40101005000f303000000000000000000000000000000000000
902-000000000108e20103000000ef03000000000000090000000000000000000000902+000000000108e50103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00e20101005000f303000000000000903+000000006e6574207469746c650000001c00e50101005000f303000000000000
904-000000000000000000000000000000000108e30103000000ef03000000000000904+000000000000000000000000000000000108e60103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00e301905+090000000000000000000000000000006e6574207469746c650000001c00e601
906-01005000f303000000000000000000000000000000000000000000000108e401906+01005000f303000000000000000000000000000000000000000000000108e701
907-03000000ef03000000000000090000000000000000000000000000006e657420907+03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00e40101005000f3030000000000000000000000000000908+7469746c650000001c00e70101005000f3030000000000000000000000000000
909-00000000000000000108e50103000000ef030000000000000900000000000000909+00000000000000000108e80103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00e50101005000f3030000910+00000000000000006e6574207469746c650000001c00e80101005000f3030000
911-00000000000000000000000000000000000000000108e60103000000ef030000911+00000000000000000000000000000000000000000108e90103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000912+00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00e60101005000f30300000000000000000000000000000000000000000000913+1c00e90101005000f30300000000000000000000000000000000000000000000
914-0108e70103000000ef0300000000000009000000000000000000000000000000914+0108ea0103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00e70101005000f30300000000000000000000915+6e6574207469746c650000001c00ea0101005000f30300000000000000000000
916-0000000000000000000000000108e80103000000ef0300000000000009000000916+0000000000000000000000000108eb0103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00e80101005000917+0000000000000000000000006e6574207469746c650000001c00eb0101005000
918-f303000000000000000000000000000000000000000000000108e90103000000918+f303000000000000000000000000000000000000000000000108ec0103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c919+ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00e90101005000f303000000000000000000000000000000000000920+650000001c00ec0101005000f303000000000000000000000000000000000000
921-000000000108ea0103000000ef03000000000000090000000000000000000000921+000000000108ed0103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00ea0101005000f303000000000000922+000000006e6574207469746c650000001c00ed0101005000f303000000000000
923-000000000000000000000000000000000108eb0103000000ef03000000000000923+000000000000000000000000000000000108ee0103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00eb01924+090000000000000000000000000000006e6574207469746c650000001c00ee01
925-01005000f303000000000000000000000000000000000000000000000108ec01925+01005000f303000000000000000000000000000000000000000000000108ef01
926-03000000ef03000000000000090000000000000000000000000000006e657420926+03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00ec0101005000f3030000000000000000000000000000927+7469746c650000001c00ef0101005000f3030000000000000000000000000000
928-00000000000000000108ed0103000000ef030000000000000900000000000000928+00000000000000000108f00103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00ed0101005000f3030000929+00000000000000006e6574207469746c650000001c00f00101005000f3030000
930-00000000000000000000000000000000000000000108ee0103000000ef030000930+00000000000000000000000000000000000000000108f10103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000931+00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00ee0101005000f30300000000000000000000000000000000000000000000932+1c00f10101005000f30300000000000000000000000000000000000000000000
933-0108ef0103000000ef0300000000000009000000000000000000000000000000933+0108f20103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00ef0101005000f30300000000000000000000934+6e6574207469746c650000001c00f20101005000f30300000000000000000000
935-0000000000000000000000000108f00103000000ef0300000000000009000000935+0000000000000000000000000108f30103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00f00101005000936+0000000000000000000000006e6574207469746c650000001c00f30101005000
937-f303000000000000000000000000000000000000000000000108f10103000000937+f303000000000000000000000000000000000000000000000108f40103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c938+ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00f10101005000f303000000000000000000000000000000000000939+650000001c00f40101005000f303000000000000000000000000000000000000
940-000000000108f20103000000ef03000000000000090000000000000000000000940+000000000108f50103000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00f20101005000f303000000000000941+000000006e6574207469746c650000001c00f50101005000f303000000000000
942-000000000000000000000000000000000108f30103000000ef03000000000000942+000000000000000000000000000000000108f60103000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00f301943+090000000000000000000000000000006e6574207469746c650000001c00f601
944-01005000f303000000000000000000000000000000000000000000000108f401944+01005000f303000000000000000000000000000000000000000000000108f701
945-03000000ef03000000000000090000000000000000000000000000006e657420945+03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00f40101005000f3030000000000000000000000000000946+7469746c650000001c00f70101005000f3030000000000000000000000000000
947-00000000000000000108f50103000000ef030000000000000900000000000000947+00000000000000000108f80103000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00f50101005000f3030000948+00000000000000006e6574207469746c650000001c00f80101005000f3030000
949-00000000000000000000000000000000000000000108f60103000000ef030000949+00000000000000000000000000000000000000000108f90103000000ef030000
950 00000000090000000000000000000000000000006e6574207469746c65000000950 00000000090000000000000000000000000000006e6574207469746c65000000
M internal/adapters/wayland/xwm/testdata/streams/steady.hex +2000 -2000 large diff (4000 lines changed): collapsed
M internal/adapters/wayland/xwm/xpeer_test.go +24 -0
@@ -26,6 +26,7 @@ const (
2626 opChangeProperty = 18
2727 opGetProperty = 20
2828 opSetSelectionOwner = 22
29+ opGetSelectionOwner = 23
2930 opSendEvent = 25
3031 opSetInputFocus = 42
3132 opGetInputFocus = 43
@@ -81,6 +82,8 @@ type xpeer struct {
8182 geoms map[uint32]xpeerGeom
8283 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}
8384 children []uint32
85+ selOwner map[uint32]uint32 // GetSelectionOwner answers, by selection atom
86+ noARGB bool // RENDER has no ARGB32 format
8487 denyRoot bool // answer the root event-mask request with BadAccess
8588 pids map[uint32]uint32 // XRes QueryClientIds answers, by window
8689 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow
@@ -304,6 +307,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
304307 p.atoms[name] = a
305308 }
306309 p.reply(0, le32(a))
310+ case r.major == opGetSelectionOwner:
311+ p.reply(0, le32(p.selOwner[binary.LittleEndian.Uint32(body)]))
307312 case r.major == opGetInputFocus:
308313 p.reply(1, le32(0))
309314 case r.major == opQueryTree:
@@ -386,6 +391,25 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
386391 if r.minor == 1 {
387392 p.reply(0, le32(0, 1))
388393 }
394+ case "RENDER":
395+ if r.minor == 1 { // QueryPictFormats: one format (ARGB32), unless noARGB
396+ n := uint32(1)
397+ if p.noARGB {
398+ n = 0
399+ }
400+ b := make([]byte, 24+28*int(n))
401+ binary.LittleEndian.PutUint32(b[0:], n)
402+ if n == 1 {
403+ f := b[24:]
404+ binary.LittleEndian.PutUint32(f[0:], 0x77) // format id
405+ f[4], f[5] = 1, 32 // direct, depth 32
406+ binary.LittleEndian.PutUint16(f[8:], 16) // red shift
407+ binary.LittleEndian.PutUint16(f[10:], 0xff)
408+ binary.LittleEndian.PutUint16(f[20:], 24) // alpha shift
409+ binary.LittleEndian.PutUint16(f[22:], 0xff)
410+ }
411+ p.reply(0, b)
412+ }
389413 case "Composite", "XFIXES":
390414 if r.minor == 0 {
391415 p.reply(0, le32(5, 4))
@@ -26,6 +26,7 @@ const (
26 opChangeProperty = 1826 opChangeProperty = 18
27 opGetProperty = 2027 opGetProperty = 20
28 opSetSelectionOwner = 2228 opSetSelectionOwner = 22
29+ opGetSelectionOwner = 23
29 opSendEvent = 2530 opSendEvent = 25
30 opSetInputFocus = 4231 opSetInputFocus = 42
31 opGetInputFocus = 4332 opGetInputFocus = 43
@@ -81,6 +82,8 @@ type xpeer struct {
81 geoms map[uint32]xpeerGeom82 geoms map[uint32]xpeerGeom
82 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}83 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}
83 children []uint3284 children []uint32
85+ selOwner map[uint32]uint32 // GetSelectionOwner answers, by selection atom
86+ noARGB bool // RENDER has no ARGB32 format
84 denyRoot bool // answer the root event-mask request with BadAccess87 denyRoot bool // answer the root event-mask request with BadAccess
85 pids map[uint32]uint32 // XRes QueryClientIds answers, by window88 pids map[uint32]uint32 // XRes QueryClientIds answers, by window
86 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow89 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow
@@ -304,6 +307,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
304 p.atoms[name] = a307 p.atoms[name] = a
305 }308 }
306 p.reply(0, le32(a))309 p.reply(0, le32(a))
310+ case r.major == opGetSelectionOwner:
311+ p.reply(0, le32(p.selOwner[binary.LittleEndian.Uint32(body)]))
307 case r.major == opGetInputFocus:312 case r.major == opGetInputFocus:
308 p.reply(1, le32(0))313 p.reply(1, le32(0))
309 case r.major == opQueryTree:314 case r.major == opQueryTree:
@@ -386,6 +391,25 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
386 if r.minor == 1 {391 if r.minor == 1 {
387 p.reply(0, le32(0, 1))392 p.reply(0, le32(0, 1))
388 }393 }
394+ case "RENDER":
395+ if r.minor == 1 { // QueryPictFormats: one format (ARGB32), unless noARGB
396+ n := uint32(1)
397+ if p.noARGB {
398+ n = 0
399+ }
400+ b := make([]byte, 24+28*int(n))
401+ binary.LittleEndian.PutUint32(b[0:], n)
402+ if n == 1 {
403+ f := b[24:]
404+ binary.LittleEndian.PutUint32(f[0:], 0x77) // format id
405+ f[4], f[5] = 1, 32 // direct, depth 32
406+ binary.LittleEndian.PutUint16(f[8:], 16) // red shift
407+ binary.LittleEndian.PutUint16(f[10:], 0xff)
408+ binary.LittleEndian.PutUint16(f[20:], 24) // alpha shift
409+ binary.LittleEndian.PutUint16(f[22:], 0xff)
410+ }
411+ p.reply(0, b)
412+ }
389 case "Composite", "XFIXES":413 case "Composite", "XFIXES":
390 if r.minor == 0 {414 if r.minor == 0 {
391 p.reply(0, le32(5, 4))415 p.reply(0, le32(5, 4))
A internal/adapters/wayland/xwm/xsettings_test.go +205 -0
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "context"
5+ "encoding/binary"
6+ "testing"
7+
8+ "github.com/bnema/neferwl/internal/ports"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func bootSettings(t *testing.T, cfg ports.XwaylandSettings, mutate func(p *xpeer)) (*XWM, *xpeer) {
13+ t.Helper()
14+ fd, p := startXPeer(t, fullPeerExts())
15+ if mutate != nil {
16+ p.set(mutate)
17+ }
18+ x, err := BootSettings(context.Background(), fd, testLog(), cfg)
19+ require.NoError(t, err)
20+ t.Cleanup(x.CloseConn)
21+ return x, p
22+}
23+
24+func (p *xpeer) count(major uint8, match func(xpeerReq) bool) (n int) {
25+ for _, r := range p.requests() {
26+ if r.major == major && (match == nil || match(r)) {
27+ n++
28+ }
29+ }
30+ return n
31+}
32+
33+func TestXSettingsEncode(t *testing.T) {
34+ s := &xsettings{serial: 7, theme: "ab", size: 24, dpi: 96 * 1024, themeSerial: 7, sizeSerial: 5, dpiSerial: 3}
35+ n := s.encode()
36+ u32 := binary.LittleEndian.AppendUint32
37+ var want []byte
38+ want = append(want, 0, 0, 0, 0)
39+ want = u32(want, 7)
40+ want = u32(want, 3)
41+ // Gtk/CursorThemeName STRING "ab"
42+ want = append(want, 1, 0, 19, 0)
43+ want = append(want, "Gtk/CursorThemeName"...)
44+ want = append(want, 0) // 19 -> 20
45+ want = u32(want, 7)
46+ want = u32(want, 2)
47+ want = append(want, 'a', 'b', 0, 0)
48+ // Gtk/CursorThemeSize INT 24
49+ want = append(want, 0, 0, 19, 0)
50+ want = append(want, "Gtk/CursorThemeSize"...)
51+ want = append(want, 0)
52+ want = u32(want, 5)
53+ want = u32(want, 24)
54+ // Xft/DPI INT (name length 7 -> pad 1)
55+ want = append(want, 0, 0, 7, 0)
56+ want = append(want, "Xft/DPI"...)
57+ want = append(want, 0)
58+ want = u32(want, 3)
59+ want = u32(want, 96*1024)
60+ require.Equal(t, want, s.buf[:n])
61+ // Name lengths 1..4 mod 4 pad to a multiple of 4.
62+ for l := 1; l <= 8; l++ {
63+ require.Zero(t, pad4(l)%4)
64+ require.GreaterOrEqual(t, pad4(l), l)
65+ require.Less(t, pad4(l)-l, 4)
66+ }
67+}
68+
69+func TestXSettingsOwnership(t *testing.T) {
70+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 32}, nil)
71+ win := x.xs.win
72+ require.NotZero(t, win)
73+ s0, mgr := p.atom("_XSETTINGS_S0"), p.atom("MANAGER")
74+ own := -1
75+ for i, r := range p.requests() {
76+ if r.major == opSetSelectionOwner && r.u32(8) == s0 {
77+ own = i
78+ require.Equal(t, win, r.u32(4))
79+ }
80+ }
81+ require.NotEqual(t, -1, own)
82+ var sent bool
83+ for _, r := range p.requests() {
84+ if r.major == opSendEvent && r.u32(4) == peerRoot && r.u32(20) == mgr {
85+ sent = true
86+ require.Equal(t, s0, r.u32(28))
87+ require.Equal(t, win, r.u32(32))
88+ }
89+ }
90+ require.True(t, sent, "MANAGER client message to the root")
91+ prop, ok := p.prop(win, "_XSETTINGS_SETTINGS")
92+ require.True(t, ok)
93+ require.Equal(t, p.atom("_XSETTINGS_SETTINGS"), prop.typ)
94+ require.EqualValues(t, 8, prop.format)
95+
96+ // SelectionClear stops updates.
97+ require.True(t, x.xs.active)
98+ p.event(29, func(b *[32]byte) {
99+ binary.LittleEndian.PutUint32(b[8:], win)
100+ binary.LittleEndian.PutUint32(b[12:], s0)
101+ })
102+ require.NoError(t, x.conn.Sync(&x.h))
103+ require.False(t, x.xs.active)
104+ before := p.count(opChangeProperty, nil)
105+ var sp Space
106+ sp.Set(ports.Layout{{Width: 10, Height: 10, Scale: 2}})
107+ x.space = &sp
108+ x.refreshXSettings()
109+ require.NoError(t, x.conn.Flush())
110+ require.NoError(t, x.conn.Sync(&x.h))
111+ require.Equal(t, before, p.count(opChangeProperty, nil))
112+}
113+
114+func TestXSettingsExistingOwner(t *testing.T) {
115+ var s0 uint32
116+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true}, func(p *xpeer) {
117+ p.selOwner = map[uint32]uint32{}
118+ // atoms are assigned on intern: pre-assign through a known name.
119+ p.nextAtom++
120+ s0 = p.nextAtom
121+ p.atoms["_XSETTINGS_S0"] = s0
122+ p.selOwner[s0] = 0xabc
123+ })
124+ require.False(t, x.xs.active)
125+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 }))
126+ _, ok := p.prop(x.xs.win, "_XSETTINGS_SETTINGS")
127+ require.False(t, ok)
128+}
129+
130+func TestXSettingsOff(t *testing.T) {
131+ _, p := bootSettings(t, ports.XwaylandSettings{XSettings: false, CursorSize: 24}, nil)
132+ s0 := p.atom("_XSETTINGS_S0")
133+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 && s0 != 0 }))
134+ require.Zero(t, p.count(opGetSelectionOwner, nil))
135+}
136+
137+// decodeSettings returns serial and the per-setting last-change serial by name.
138+func decodeSettings(t *testing.T, b []byte) (uint32, map[string]uint32) {
139+ t.Helper()
140+ le := binary.LittleEndian
141+ out := map[string]uint32{}
142+ n := int(le.Uint32(b[8:]))
143+ off := 12
144+ for i := 0; i < n; i++ {
145+ typ, nl := b[off], int(le.Uint16(b[off+2:]))
146+ off += 4
147+ name := string(b[off : off+nl])
148+ off += pad4(nl)
149+ out[name] = le.Uint32(b[off:])
150+ off += 4
151+ if typ == xsString {
152+ off += 4 + pad4(int(le.Uint32(b[off:])))
153+ } else {
154+ off += 4
155+ }
156+ }
157+ return le.Uint32(b[4:]), out
158+}
159+
160+func TestXSettingsSerial(t *testing.T) {
161+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorSize: 24}, nil)
162+ win := x.xs.win
163+ props := func() int {
164+ return p.count(opChangeProperty, func(r xpeerReq) bool { return r.u32(4) == win })
165+ }
166+ require.Equal(t, 1, props())
167+ layout := func(scale float64) {
168+ var sp Space
169+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: scale}})
170+ x.space = &sp
171+ x.LayoutChanged(true)
172+ require.NoError(t, x.conn.Flush())
173+ require.NoError(t, x.conn.Sync(&x.h))
174+ }
175+ layout(1) // same settings as boot
176+ require.Equal(t, 1, props())
177+ layout(2)
178+ require.Equal(t, 2, props())
179+ prop, _ := p.prop(win, "_XSETTINGS_SETTINGS")
180+ serial, last := decodeSettings(t, prop.data)
181+ require.EqualValues(t, 2, serial)
182+ require.EqualValues(t, 2, last["Xft/DPI"])
183+ require.EqualValues(t, 1, last["Gtk/CursorThemeSize"])
184+ require.EqualValues(t, 1, last["Gtk/CursorThemeName"])
185+ require.EqualValues(t, 192*1024, int32(binary.LittleEndian.Uint32(prop.data[len(prop.data)-4:])))
186+
187+ x.xs.serial = 0xffffffff
188+ x.xs.dpi = 0
189+ x.publishXSettings(false)
190+ require.EqualValues(t, 0, x.xs.serial, "wraps")
191+}
192+
193+func TestXSettingsNoChangeAllocations(t *testing.T) {
194+ x, _ := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 24}, nil)
195+ var sp Space
196+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: 1}})
197+ x.space = &sp
198+ x.LayoutChanged(true)
199+ l := ports.Layout{{Width: 100, Height: 100, Scale: 1}}
200+ n := testing.AllocsPerRun(100, func() {
201+ sp.Set(l)
202+ x.LayoutChanged(false)
203+ })
204+ require.Zero(t, n)
205+}
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "context"
5+ "encoding/binary"
6+ "testing"
7+
8+ "github.com/bnema/neferwl/internal/ports"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func bootSettings(t *testing.T, cfg ports.XwaylandSettings, mutate func(p *xpeer)) (*XWM, *xpeer) {
13+ t.Helper()
14+ fd, p := startXPeer(t, fullPeerExts())
15+ if mutate != nil {
16+ p.set(mutate)
17+ }
18+ x, err := BootSettings(context.Background(), fd, testLog(), cfg)
19+ require.NoError(t, err)
20+ t.Cleanup(x.CloseConn)
21+ return x, p
22+}
23+
24+func (p *xpeer) count(major uint8, match func(xpeerReq) bool) (n int) {
25+ for _, r := range p.requests() {
26+ if r.major == major && (match == nil || match(r)) {
27+ n++
28+ }
29+ }
30+ return n
31+}
32+
33+func TestXSettingsEncode(t *testing.T) {
34+ s := &xsettings{serial: 7, theme: "ab", size: 24, dpi: 96 * 1024, themeSerial: 7, sizeSerial: 5, dpiSerial: 3}
35+ n := s.encode()
36+ u32 := binary.LittleEndian.AppendUint32
37+ var want []byte
38+ want = append(want, 0, 0, 0, 0)
39+ want = u32(want, 7)
40+ want = u32(want, 3)
41+ // Gtk/CursorThemeName STRING "ab"
42+ want = append(want, 1, 0, 19, 0)
43+ want = append(want, "Gtk/CursorThemeName"...)
44+ want = append(want, 0) // 19 -> 20
45+ want = u32(want, 7)
46+ want = u32(want, 2)
47+ want = append(want, 'a', 'b', 0, 0)
48+ // Gtk/CursorThemeSize INT 24
49+ want = append(want, 0, 0, 19, 0)
50+ want = append(want, "Gtk/CursorThemeSize"...)
51+ want = append(want, 0)
52+ want = u32(want, 5)
53+ want = u32(want, 24)
54+ // Xft/DPI INT (name length 7 -> pad 1)
55+ want = append(want, 0, 0, 7, 0)
56+ want = append(want, "Xft/DPI"...)
57+ want = append(want, 0)
58+ want = u32(want, 3)
59+ want = u32(want, 96*1024)
60+ require.Equal(t, want, s.buf[:n])
61+ // Name lengths 1..4 mod 4 pad to a multiple of 4.
62+ for l := 1; l <= 8; l++ {
63+ require.Zero(t, pad4(l)%4)
64+ require.GreaterOrEqual(t, pad4(l), l)
65+ require.Less(t, pad4(l)-l, 4)
66+ }
67+}
68+
69+func TestXSettingsOwnership(t *testing.T) {
70+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 32}, nil)
71+ win := x.xs.win
72+ require.NotZero(t, win)
73+ s0, mgr := p.atom("_XSETTINGS_S0"), p.atom("MANAGER")
74+ own := -1
75+ for i, r := range p.requests() {
76+ if r.major == opSetSelectionOwner && r.u32(8) == s0 {
77+ own = i
78+ require.Equal(t, win, r.u32(4))
79+ }
80+ }
81+ require.NotEqual(t, -1, own)
82+ var sent bool
83+ for _, r := range p.requests() {
84+ if r.major == opSendEvent && r.u32(4) == peerRoot && r.u32(20) == mgr {
85+ sent = true
86+ require.Equal(t, s0, r.u32(28))
87+ require.Equal(t, win, r.u32(32))
88+ }
89+ }
90+ require.True(t, sent, "MANAGER client message to the root")
91+ prop, ok := p.prop(win, "_XSETTINGS_SETTINGS")
92+ require.True(t, ok)
93+ require.Equal(t, p.atom("_XSETTINGS_SETTINGS"), prop.typ)
94+ require.EqualValues(t, 8, prop.format)
95+
96+ // SelectionClear stops updates.
97+ require.True(t, x.xs.active)
98+ p.event(29, func(b *[32]byte) {
99+ binary.LittleEndian.PutUint32(b[8:], win)
100+ binary.LittleEndian.PutUint32(b[12:], s0)
101+ })
102+ require.NoError(t, x.conn.Sync(&x.h))
103+ require.False(t, x.xs.active)
104+ before := p.count(opChangeProperty, nil)
105+ var sp Space
106+ sp.Set(ports.Layout{{Width: 10, Height: 10, Scale: 2}})
107+ x.space = &sp
108+ x.refreshXSettings()
109+ require.NoError(t, x.conn.Flush())
110+ require.NoError(t, x.conn.Sync(&x.h))
111+ require.Equal(t, before, p.count(opChangeProperty, nil))
112+}
113+
114+func TestXSettingsExistingOwner(t *testing.T) {
115+ var s0 uint32
116+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true}, func(p *xpeer) {
117+ p.selOwner = map[uint32]uint32{}
118+ // atoms are assigned on intern: pre-assign through a known name.
119+ p.nextAtom++
120+ s0 = p.nextAtom
121+ p.atoms["_XSETTINGS_S0"] = s0
122+ p.selOwner[s0] = 0xabc
123+ })
124+ require.False(t, x.xs.active)
125+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 }))
126+ _, ok := p.prop(x.xs.win, "_XSETTINGS_SETTINGS")
127+ require.False(t, ok)
128+}
129+
130+func TestXSettingsOff(t *testing.T) {
131+ _, p := bootSettings(t, ports.XwaylandSettings{XSettings: false, CursorSize: 24}, nil)
132+ s0 := p.atom("_XSETTINGS_S0")
133+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 && s0 != 0 }))
134+ require.Zero(t, p.count(opGetSelectionOwner, nil))
135+}
136+
137+// decodeSettings returns serial and the per-setting last-change serial by name.
138+func decodeSettings(t *testing.T, b []byte) (uint32, map[string]uint32) {
139+ t.Helper()
140+ le := binary.LittleEndian
141+ out := map[string]uint32{}
142+ n := int(le.Uint32(b[8:]))
143+ off := 12
144+ for i := 0; i < n; i++ {
145+ typ, nl := b[off], int(le.Uint16(b[off+2:]))
146+ off += 4
147+ name := string(b[off : off+nl])
148+ off += pad4(nl)
149+ out[name] = le.Uint32(b[off:])
150+ off += 4
151+ if typ == xsString {
152+ off += 4 + pad4(int(le.Uint32(b[off:])))
153+ } else {
154+ off += 4
155+ }
156+ }
157+ return le.Uint32(b[4:]), out
158+}
159+
160+func TestXSettingsSerial(t *testing.T) {
161+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorSize: 24}, nil)
162+ win := x.xs.win
163+ props := func() int {
164+ return p.count(opChangeProperty, func(r xpeerReq) bool { return r.u32(4) == win })
165+ }
166+ require.Equal(t, 1, props())
167+ layout := func(scale float64) {
168+ var sp Space
169+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: scale}})
170+ x.space = &sp
171+ x.LayoutChanged(true)
172+ require.NoError(t, x.conn.Flush())
173+ require.NoError(t, x.conn.Sync(&x.h))
174+ }
175+ layout(1) // same settings as boot
176+ require.Equal(t, 1, props())
177+ layout(2)
178+ require.Equal(t, 2, props())
179+ prop, _ := p.prop(win, "_XSETTINGS_SETTINGS")
180+ serial, last := decodeSettings(t, prop.data)
181+ require.EqualValues(t, 2, serial)
182+ require.EqualValues(t, 2, last["Xft/DPI"])
183+ require.EqualValues(t, 1, last["Gtk/CursorThemeSize"])
184+ require.EqualValues(t, 1, last["Gtk/CursorThemeName"])
185+ require.EqualValues(t, 192*1024, int32(binary.LittleEndian.Uint32(prop.data[len(prop.data)-4:])))
186+
187+ x.xs.serial = 0xffffffff
188+ x.xs.dpi = 0
189+ x.publishXSettings(false)
190+ require.EqualValues(t, 0, x.xs.serial, "wraps")
191+}
192+
193+func TestXSettingsNoChangeAllocations(t *testing.T) {
194+ x, _ := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 24}, nil)
195+ var sp Space
196+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: 1}})
197+ x.space = &sp
198+ x.LayoutChanged(true)
199+ l := ports.Layout{{Width: 100, Height: 100, Scale: 1}}
200+ n := testing.AllocsPerRun(100, func() {
201+ sp.Set(l)
202+ x.LayoutChanged(false)
203+ })
204+ require.Zero(t, n)
205+}
M internal/adapters/wayland/xwm/xwm.go +17 -2
@@ -23,6 +23,8 @@ import (
2323 "github.com/bnema/purego-libwayland/server"
2424 "github.com/bnema/zerowrap"
2525 "golang.org/x/sys/unix"
26+
27+ "github.com/bnema/neferwl/internal/ports"
2628 )
2729
2830 var (
@@ -81,6 +83,9 @@ type XWM struct {
8183 unpaired [unpairedCap]struct{ serial, surface uint64 }
8284 unpairedN int
8385
86+ cfg ports.XwaylandSettings
87+ xs xsettings // XSETTINGS manager and root cursor (xsettings.go, cursor.go)
88+
8489 space *Space // layout <-> X coordinates, shared with the host
8590 warnedSpace bool // more outputs than the Space holds, logged once
8691 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size
@@ -155,6 +160,11 @@ func (x *XWM) setProp32(win uint32, prop int, typ xproto.Atom, vals []uint32) {
155160 // Boot gives up promptly when ctx ends (the Xwayland process died or the run
156161 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").
157162 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
163+ return BootSettings(ctx, wmFD, log, ports.XwaylandSettings{})
164+}
165+
166+// BootSettings is Boot with the XSETTINGS manager and the root cursor of cfg.
167+func BootSettings(ctx context.Context, wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
158168 // The watcher shuts the socket down when ctx ends, which wakes any blocked
159169 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown
160170 // can never reach a descriptor number reused after Boot closed wmFD.
@@ -178,7 +188,7 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
178188 }()
179189 stopWatch = func() { close(quit); <-joined }
180190 }
181- x, err := boot(wmFD, log)
191+ x, err := boot(wmFD, log, cfg)
182192 stopWatch()
183193 if err == nil && ctx.Err() != nil {
184194 x.CloseConn()
@@ -190,12 +200,13 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
190200 return x, err
191201 }
192202
193-func boot(wmFD int, log zerowrap.Logger) (*XWM, error) {
203+func boot(wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
194204 conn, err := xturbo.NewConn(wmFD)
195205 if err != nil {
196206 return nil, fmt.Errorf("xwm: connect: %w", err)
197207 }
198208 x := newXWM(conn, log)
209+ x.cfg = cfg
199210 if err := x.boot(); err != nil {
200211 _ = conn.Close()
201212 return nil, err
@@ -292,6 +303,10 @@ func (x *XWM) boot() error {
292303 return x.bootErr
293304 }
294305
306+ if err := x.bootSettings(); err != nil {
307+ return err
308+ }
309+
295310 // Windows that exist already (Xwayland restarted under a live client set).
296311 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)
297312 if err := conn.Sync(&x.h); err != nil {
@@ -23,6 +23,8 @@ import (
23 "github.com/bnema/purego-libwayland/server"23 "github.com/bnema/purego-libwayland/server"
24 "github.com/bnema/zerowrap"24 "github.com/bnema/zerowrap"
25 "golang.org/x/sys/unix"25 "golang.org/x/sys/unix"
26+
27+ "github.com/bnema/neferwl/internal/ports"
26 )28 )
27 29
28 var (30 var (
@@ -81,6 +83,9 @@ type XWM struct {
81 unpaired [unpairedCap]struct{ serial, surface uint64 }83 unpaired [unpairedCap]struct{ serial, surface uint64 }
82 unpairedN int84 unpairedN int
83 85
86+ cfg ports.XwaylandSettings
87+ xs xsettings // XSETTINGS manager and root cursor (xsettings.go, cursor.go)
88+
84 space *Space // layout <-> X coordinates, shared with the host89 space *Space // layout <-> X coordinates, shared with the host
85 warnedSpace bool // more outputs than the Space holds, logged once90 warnedSpace bool // more outputs than the Space holds, logged once
86 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size91 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size
@@ -155,6 +160,11 @@ func (x *XWM) setProp32(win uint32, prop int, typ xproto.Atom, vals []uint32) {
155 // Boot gives up promptly when ctx ends (the Xwayland process died or the run160 // Boot gives up promptly when ctx ends (the Xwayland process died or the run
156 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").161 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").
157 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {162 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
163+ return BootSettings(ctx, wmFD, log, ports.XwaylandSettings{})
164+}
165+
166+// BootSettings is Boot with the XSETTINGS manager and the root cursor of cfg.
167+func BootSettings(ctx context.Context, wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
158 // The watcher shuts the socket down when ctx ends, which wakes any blocked168 // The watcher shuts the socket down when ctx ends, which wakes any blocked
159 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown169 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown
160 // can never reach a descriptor number reused after Boot closed wmFD.170 // can never reach a descriptor number reused after Boot closed wmFD.
@@ -178,7 +188,7 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
178 }()188 }()
179 stopWatch = func() { close(quit); <-joined }189 stopWatch = func() { close(quit); <-joined }
180 }190 }
181- x, err := boot(wmFD, log)191+ x, err := boot(wmFD, log, cfg)
182 stopWatch()192 stopWatch()
183 if err == nil && ctx.Err() != nil {193 if err == nil && ctx.Err() != nil {
184 x.CloseConn()194 x.CloseConn()
@@ -190,12 +200,13 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
190 return x, err200 return x, err
191 }201 }
192 202
193-func boot(wmFD int, log zerowrap.Logger) (*XWM, error) {203+func boot(wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
194 conn, err := xturbo.NewConn(wmFD)204 conn, err := xturbo.NewConn(wmFD)
195 if err != nil {205 if err != nil {
196 return nil, fmt.Errorf("xwm: connect: %w", err)206 return nil, fmt.Errorf("xwm: connect: %w", err)
197 }207 }
198 x := newXWM(conn, log)208 x := newXWM(conn, log)
209+ x.cfg = cfg
199 if err := x.boot(); err != nil {210 if err := x.boot(); err != nil {
200 _ = conn.Close()211 _ = conn.Close()
201 return nil, err212 return nil, err
@@ -292,6 +303,10 @@ func (x *XWM) boot() error {
292 return x.bootErr303 return x.bootErr
293 }304 }
294 305
306+ if err := x.bootSettings(); err != nil {
307+ return err
308+ }
309+
295 // Windows that exist already (Xwayland restarted under a live client set).310 // Windows that exist already (Xwayland restarted under a live client set).
296 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)311 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)
297 if err := conn.Sync(&x.h); err != nil {312 if err := conn.Sync(&x.h); err != nil {
M internal/adapters/wayland/xwm/xwm_test.go +6 -0
@@ -341,6 +341,9 @@ func TestFlushWithNothingQueuedSendsNothing(t *testing.T) {
341341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")
342342 }
343343
344+// bootOnlyFiles run only from boot() (XSETTINGS manager, root cursor).
345+var bootOnlyFiles = map[string]bool{"selection_xsettings.go": true, "cursor.go": true}
346+
344347 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup
345348 // only, so they may appear in production code only inside boot().
346349 func TestNoBlockingCallsOutsideBoot(t *testing.T) {
@@ -354,6 +357,9 @@ func TestNoBlockingCallsOutsideBoot(t *testing.T) {
354357 src, err := os.ReadFile(name)
355358 require.NoError(t, err)
356359 text := string(src)
360+ if bootOnlyFiles[name] {
361+ continue
362+ }
357363 lo, hi := 0, 0
358364 if name == "xwm.go" {
359365 lo = strings.Index(text, "func (x *XWM) boot() error")
@@ -341,6 +341,9 @@ func TestFlushWithNothingQueuedSendsNothing(t *testing.T) {
341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")
342 }342 }
343 343
344+// bootOnlyFiles run only from boot() (XSETTINGS manager, root cursor).
345+var bootOnlyFiles = map[string]bool{"selection_xsettings.go": true, "cursor.go": true}
346+
344 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup347 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup
345 // only, so they may appear in production code only inside boot().348 // only, so they may appear in production code only inside boot().
346 func TestNoBlockingCallsOutsideBoot(t *testing.T) {349 func TestNoBlockingCallsOutsideBoot(t *testing.T) {
@@ -354,6 +357,9 @@ func TestNoBlockingCallsOutsideBoot(t *testing.T) {
354 src, err := os.ReadFile(name)357 src, err := os.ReadFile(name)
355 require.NoError(t, err)358 require.NoError(t, err)
356 text := string(src)359 text := string(src)
360+ if bootOnlyFiles[name] {
361+ continue
362+ }
357 lo, hi := 0, 0363 lo, hi := 0, 0
358 if name == "xwm.go" {364 if name == "xwm.go" {
359 lo = strings.Index(text, "func (x *XWM) boot() error")365 lo = strings.Index(text, "func (x *XWM) boot() error")
M internal/app/cursor.go +18 -0
@@ -138,3 +138,21 @@ func loadCursorUpright(c ports.CursorChange, scale float64, limit int) (ports.Cu
138138 themeCursors.m[key] = out
139139 return out, nil
140140 }
141+
142+// xwaylandSettings is what the built-in XWM publishes to X11 clients: the
143+// XSETTINGS cursor theme and size and the root cursor image, all from the
144+// XCURSOR_* environment. The DPI follows the layout inside the XWM.
145+func xwaylandSettings(cfg ports.XwaylandConfig) ports.XwaylandSettings {
146+ if cfg.Backend != ports.XwaylandBuiltin {
147+ return ports.XwaylandSettings{}
148+ }
149+ size, theme := cursorSize(), os.Getenv("XCURSOR_THEME")
150+ st := ports.XwaylandSettings{XSettings: cfg.XSettings, CursorTheme: theme, CursorSize: size, RootCursor: true}
151+ img, err := xcursor.Load(xcursor.SearchPath(), theme, []string{"default", "left_ptr"}, size)
152+ if err != nil {
153+ return st // the XWM falls back to the X cursor font
154+ }
155+ img = img.ForSize(size, 64)
156+ st.Cursor = ports.CursorImage{W: img.W, H: img.H, HotX: img.HotX, HotY: img.HotY, Pixels: img.Pixels}
157+ return st
158+}
@@ -138,3 +138,21 @@ func loadCursorUpright(c ports.CursorChange, scale float64, limit int) (ports.Cu
138 themeCursors.m[key] = out138 themeCursors.m[key] = out
139 return out, nil139 return out, nil
140 }140 }
141+
142+// xwaylandSettings is what the built-in XWM publishes to X11 clients: the
143+// XSETTINGS cursor theme and size and the root cursor image, all from the
144+// XCURSOR_* environment. The DPI follows the layout inside the XWM.
145+func xwaylandSettings(cfg ports.XwaylandConfig) ports.XwaylandSettings {
146+ if cfg.Backend != ports.XwaylandBuiltin {
147+ return ports.XwaylandSettings{}
148+ }
149+ size, theme := cursorSize(), os.Getenv("XCURSOR_THEME")
150+ st := ports.XwaylandSettings{XSettings: cfg.XSettings, CursorTheme: theme, CursorSize: size, RootCursor: true}
151+ img, err := xcursor.Load(xcursor.SearchPath(), theme, []string{"default", "left_ptr"}, size)
152+ if err != nil {
153+ return st // the XWM falls back to the X cursor font
154+ }
155+ img = img.ForSize(size, 64)
156+ st.Cursor = ports.CursorImage{W: img.W, H: img.H, HotX: img.HotX, HotY: img.HotY, Pixels: img.Pixels}
157+ return st
158+}
M internal/app/session.go +1 -0
@@ -140,6 +140,7 @@ func assembleSession(ctx context.Context, opts Options) (s *session, err error)
140140 RepeatRate: opts.Config.Keyboard.RepeatRate,
141141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,
142142 LogDamage: logging.Enabled(ctx, "wayland-damage"),
143+ Xwayland: xwaylandSettings(opts.Config.Xwayland),
143144 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {
144145 return s, err
145146 }
@@ -140,6 +140,7 @@ func assembleSession(ctx context.Context, opts Options) (s *session, err error)
140 RepeatRate: opts.Config.Keyboard.RepeatRate,140 RepeatRate: opts.Config.Keyboard.RepeatRate,
141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,
142 LogDamage: logging.Enabled(ctx, "wayland-damage"),142 LogDamage: logging.Enabled(ctx, "wayland-damage"),
143+ Xwayland: xwaylandSettings(opts.Config.Xwayland),
143 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {144 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {
144 return s, err145 return s, err
145 }146 }
M internal/ports/config.go +18 -0
@@ -311,4 +311,22 @@ const (
311311 type XwaylandConfig struct {
312312 Backend XwaylandBackend
313313 Binary string
314+ // XSettings (xwayland.xsettings) turns the XSETTINGS manager of the
315+ // built-in XWM on.
316+ XSettings bool
317+}
318+
319+// XwaylandSettings is the plain data the built-in XWM publishes to X11
320+// clients; the app fills it from the config and the environment.
321+type XwaylandSettings struct {
322+ // XSettings turns the XSETTINGS manager on.
323+ XSettings bool
324+ // CursorTheme and CursorSize are XCURSOR_THEME and XCURSOR_SIZE
325+ // (published as Gtk/CursorThemeName and Gtk/CursorThemeSize).
326+ CursorTheme string
327+ CursorSize int
328+ // RootCursor sets a cursor on the X root window. Cursor is its image
329+ // (premultiplied ARGB8888, little-endian); empty uses the X "left_ptr" glyph.
330+ RootCursor bool
331+ Cursor CursorImage
314332 }
@@ -311,4 +311,22 @@ const (
311 type XwaylandConfig struct {311 type XwaylandConfig struct {
312 Backend XwaylandBackend312 Backend XwaylandBackend
313 Binary string313 Binary string
314+ // XSettings (xwayland.xsettings) turns the XSETTINGS manager of the
315+ // built-in XWM on.
316+ XSettings bool
317+}
318+
319+// XwaylandSettings is the plain data the built-in XWM publishes to X11
320+// clients; the app fills it from the config and the environment.
321+type XwaylandSettings struct {
322+ // XSettings turns the XSETTINGS manager on.
323+ XSettings bool
324+ // CursorTheme and CursorSize are XCURSOR_THEME and XCURSOR_SIZE
325+ // (published as Gtk/CursorThemeName and Gtk/CursorThemeSize).
326+ CursorTheme string
327+ CursorSize int
328+ // RootCursor sets a cursor on the X root window. Cursor is its image
329+ // (premultiplied ARGB8888, little-endian); empty uses the X "left_ptr" glyph.
330+ RootCursor bool
331+ Cursor CursorImage
314 }332 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 25

Tags 10

↑↓ moveenter openesc close