diff --git a/pxiii_bec/bec_ipython_client/startup/post_startup.py b/pxiii_bec/bec_ipython_client/startup/post_startup.py index 953eeed..1297873 100644 --- a/pxiii_bec/bec_ipython_client/startup/post_startup.py +++ b/pxiii_bec/bec_ipython_client/startup/post_startup.py @@ -44,5 +44,5 @@ if _args.session.lower() == "alignment": bec._ip.prompts.username = _session_name bec._ip.prompts.status = 1 -d, planner = init_beamline_environment() +#d, planner = init_beamline_environment() diff --git a/pxiii_bec/bec_widgets/profiles/daily_setup.ini b/pxiii_bec/bec_widgets/profiles/daily_setup.ini new file mode 100644 index 0000000..57fbe0e --- /dev/null +++ b/pxiii_bec/bec_widgets/profiles/daily_setup.ini @@ -0,0 +1,457 @@ +[BECDockArea] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=false +baseSize=@Size(0 0) +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 23 1670 1505) +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +maximumSize=@Size(16777215 16777215) +minimumSize=@Size(0 0) +mode=creator +mouseTracking=false +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +statusTip= +tabletTracking=false +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle=BEC - TestLayout4 +workspace_is_locked=false + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Info.dockWidgetScrollArea.qt_scrollarea_viewport.Info] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +baseSize=@Size(0 0) +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 816 1426) +html_text="\n
\nStarting daily beamline setup
\n✓ Machine current OK (401.8 mA)
\n✓ Beamline is not offline, (operation mode is attended)
\n✓ FE shutter is open
\n✓ Hutch shutter is open
\n✓ SS Xray eye is OUT
\n✓ Cryostream temperature: 99.96 K
\n✓ Detector height: 62.0 mm
\n✓ Beamstop blocking beam: I2 = 8.76e-09
\n✓ Beamline energy set to 12400 eV
\n✓ Beam aligned
\nDisplacement: Beam X: -0.1 microns, Beam Y: -0.3 microns
\n✓ Flux measured
\nIntensity at current transmission: 8.62e+11 ph/s
\nIntensity at 100% transmission: 8.53e+12 ph/s
\nTotal duration: 39.7 s
" +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +maximumSize=@Size(16777215 16777215) +minimumSize=@Size(640 310) +mouseTracking=false +plain_text="Starting daily beamline setup\n\n✓ Machine current OK (401.8 mA)\n✓ Beamline is not offline, (operation mode is attended)\n✓ FE shutter is open\n✓ Hutch shutter is open\n\n✓ SS Xray eye is OUT\n✓ Cryostream temperature: 99.96 K\n✓ Detector height: 62.0 mm\n✓ Beamstop blocking beam: I2 = 8.76e-09\n\n✓ Beamline energy set to 12400 eV\n\n✓ Beam aligned\nDisplacement: Beam X: -0.1 microns, Beam Y: -0.3 microns\n\n✓ Flux measured\nIntensity at current transmission: 8.62e+11 ph/s\nIntensity at 100% transmission: 8.53e+12 ph/s\n\nTotal duration: 39.7 s" +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +statusTip= +tabletTracking=false +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_1.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_1] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +auto_range_x=true +auto_range_y=false +baseSize=@Size(0 0) +color_palette=plasma +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +curve_json=[] +enable_fps_monitor=false +enable_popups=true +enable_side_panel=false +enable_toolbar=true +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 575 341) +inner_axes=true +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +invert_x=false +invert_y=false +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +legend_label_size=9 +lock_aspect_ratio=false +max_dataset_size_mb=10 +maximumSize=@Size(16777215 16777215) +minimal_crosshair_precision=3 +minimumSize=@Size(384 200) +mouseTracking=false +outer_axes=false +signal_x=dcm_pitch +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +skip_large_dataset_check=false +skip_large_dataset_warning=false +statusTip= +tabletTracking=false +title=Scan: Current +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= +x_grid=false +x_label=dcm_pitch +x_limits=@Variant(\0\0\0\x1a\xc0\x1a\xb0\xb0)(\x17v\xc0\x15\xa0\xc4\x15n&N) +x_log=false +x_mode=dcm_pitch +y_grid=false +y_label=lu_bpmsum +y_limits=@Variant(\0\0\0\x1a\xc0g\xe2\xe0\x3|_\x2@\x9d\xf0\x41\x91k\xed@) +y_log=false + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_2.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_2] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +auto_range_x=true +auto_range_y=true +baseSize=@Size(0 0) +color_palette=plasma +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +curve_json=[] +enable_fps_monitor=false +enable_popups=true +enable_side_panel=false +enable_toolbar=true +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 575 304) +inner_axes=true +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +invert_x=false +invert_y=false +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +legend_label_size=9 +lock_aspect_ratio=false +max_dataset_size_mb=10 +maximumSize=@Size(16777215 16777215) +minimal_crosshair_precision=3 +minimumSize=@Size(384 200) +mouseTracking=false +outer_axes=false +signal_x= +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +skip_large_dataset_check=false +skip_large_dataset_warning=false +statusTip= +tabletTracking=false +title= +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= +x_grid=false +x_label= +x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +x_log=false +x_mode=auto +y_grid=false +y_label= +y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +y_log=false + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_3.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_3] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +auto_range_x=true +auto_range_y=true +baseSize=@Size(0 0) +color_palette=plasma +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +curve_json=[] +enable_fps_monitor=false +enable_popups=true +enable_side_panel=false +enable_toolbar=true +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 575 358) +inner_axes=true +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +invert_x=false +invert_y=false +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +legend_label_size=9 +lock_aspect_ratio=false +max_dataset_size_mb=10 +maximumSize=@Size(16777215 16777215) +minimal_crosshair_precision=3 +minimumSize=@Size(384 200) +mouseTracking=false +outer_axes=false +signal_x= +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +skip_large_dataset_check=false +skip_large_dataset_warning=false +statusTip= +tabletTracking=false +title= +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= +x_grid=false +x_label= +x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +x_log=false +x_mode=auto +y_grid=false +y_label= +y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +y_log=false + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_4.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_4] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +auto_range_x=true +auto_range_y=true +baseSize=@Size(0 0) +color_palette=plasma +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +curve_json=[] +enable_fps_monitor=false +enable_popups=true +enable_side_panel=false +enable_toolbar=true +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 575 294) +inner_axes=true +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +invert_x=false +invert_y=false +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +legend_label_size=9 +lock_aspect_ratio=false +max_dataset_size_mb=10 +maximumSize=@Size(16777215 16777215) +minimal_crosshair_precision=3 +minimumSize=@Size(384 200) +mouseTracking=false +outer_axes=false +signal_x= +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +skip_large_dataset_check=false +skip_large_dataset_warning=false +statusTip= +tabletTracking=false +title= +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= +x_grid=false +x_label= +x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +x_log=false +x_mode=auto +y_grid=false +y_label= +y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0) +y_log=false + +[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Progress.dockWidgetScrollArea.qt_scrollarea_viewport.Progress] +acceptDrops=false +accessibleDescription= +accessibleIdentifier= +accessibleName= +autoFillBackground=true +baseSize=@Size(0 0) +contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1) +cursor=@Variant(\0\0\0J\0\0) +enabled=true +focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0) +geometry=@Rect(0 0 256 1416) +html_text="\n\n✓ Pre checks
\n✓ Set energy
\n✓ Move beam
\n– Align beamstop
\n– Align collimator
\n✓ Measure flux
" +inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0) +layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0) +maximumSize=@Size(16777215 16777215) +minimumSize=@Size(256 310) +mouseTracking=false +plain_text=✓ Pre checks\n✓ Set energy\n✓ Move beam\n– Align beamstop\n– Align collimator\n✓ Measure flux +sizeIncrement=@Size(0 0) +sizePolicy=@Variant(\0\0\0K\0\0\0U) +statusTip= +tabletTracking=false +toolTip= +toolTipDuration=-1 +whatsThis= +windowFilePath= +windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0) +windowModified=false +windowOpacity=1 +windowTitle= + +[BECDockArea.dockSettingsAction] +autoRepeat=true +checkable=false +checked=false +enabled=true +iconText=Dock settings +iconVisibleInMenu=true +menuRole=@Variant(\0\0\0\x7f\0\0\0\x12QAction::MenuRole\0\0\0\0\x1) +priority=@Variant(\0\0\0\x7f\0\0\0\x12QAction::Priority\0\0\0\0\x80) +shortcut= +shortcutContext=@Variant(\0\0\0\x7f\0\0\0\x14Qt::ShortcutContext\0\0\0\0\x1) +shortcutVisibleInContextMenu=true +statusTip= +text=Dock settings +toolTip=Dock settings +whatsThis= + +[Perspectives] +1\Name=BEC - TestLayout4 +1\State="@ByteArray(\0\0\x3:x\xda\x95\x92\xdfO\x83\x30\x10\xc7\xdf\xfd+.}\x9f@\xcb\x94%\xc0\xb2`\x96\xf8\xe2\x8f\xb0\xe9\xa3\x41\x38I#\xb4\xa6\xed\x16\x35\xfe\xf1\x16\xb6\x10\xa3\x65\x91\x87\xa6\xbd\xef]?\xed\xf7r\xf1\xf2\xbdm`\x8fJs)\x12\x12\x9c\xfb\x4P\x94\xb2\xe2\xa2N\xc8v\xb3\x9e\x45\x64\x99\xc6\xf7\x66U\xed\vQbu%\xcbW\x9b\xcb?\xb4\xc1\x16\x1e\x86\x8b\x4\xb6\x1a\xd5\x10[L&\x85)\xb8\xb0J\x97N\xe3!\x86u#\v\xd3?\xe0[=\x7fk\xb8\x31V\xbeU\x1cm\x89\xe9\x1_\x1d`'LB\xe8?kV\n\v\xd8\x14\xcf\xfds\x90\xed\x94\xc2.u\xa7\x64\xadPk[\xf1\xc8\xab\x1a\r\xdc\x14-\xfe\xd0!k\xa4\xc6\xaa\xfb\x8c\x97\xc6^\x87\x19\x85]\x8b\x17\xf9\x1b\xd4kNH\xce?Q\xa7t\x1e@D)\xc4\xde!\xb6\xfb\xd1\xcd\x98\xaf\xd9\xe0+<\xe1\xab\x91\xe6)\xf8\xe3\xea\xa0N\xf1\xd4_\xa1N\x10\x9d\xe\x62N\x10\x9b\xe\n\x9d\xa0\xf0T\xa7\xd9\xe5\x5\x30\xb6\0\xb6`\xc0\xe8\xc2\xdd\xf1^\t\xfc(\x80\xb9]\xae\x12o\x98T{\x1e\x99\xfc\xf4\xec\x1b\xd0\xbb\tD)" +size=1 + +[mainWindow] +DockingState="@ByteArray(\0\0\x3:x\xda\x95\x92\xdfO\x83\x30\x10\xc7\xdf\xfd+.}\x9f@\xcb\x94%\xc0\xb2`\x96\xf8\xe2\x8f\xb0\xe9\xa3\x41\x38I#\xb4\xa6\xed\x16\x35\xfe\xf1\x16\xb6\x10\xa3\x65\x91\x87\xa6\xbd\xef]?\xed\xf7r\xf1\xf2\xbdm`\x8fJs)\x12\x12\x9c\xfb\x4P\x94\xb2\xe2\xa2N\xc8v\xb3\x9e\x45\x64\x99\xc6\xf7\x66U\xed\vQbu%\xcbW\x9b\xcb?\xb4\xc1\x16\x1e\x86\x8b\x4\xb6\x1a\xd5\x10[L&\x85)\xb8\xb0J\x97N\xe3!\x86u#\v\xd3?\xe0[=\x7fk\xb8\x31V\xbeU\x1cm\x89\xe9\x1_\x1d`'LB\xe8?kV\n\v\xd8\x14\xcf\xfds\x90\xed\x94\xc2.u\xa7\x64\xadPk[\xf1\xc8\xab\x1a\r\xdc\x14-\xfe\xd0!k\xa4\xc6\xaa\xfb\x8c\x97\xc6^\x87\x19\x85]\x8b\x17\xf9\x1b\xd4kNH\xce?Q\xa7t\x1e@D)\xc4\xde!\xb6\xfb\xd1\xcd\x98\xaf\xd9\xe0+<\xe1\xab\x91\xe6)\xf8\xe3\xea\xa0N\xf1\xd4_\xa1N\x10\x9d\xe\x62N\x10\x9b\xe\n\x9d\xa0\xf0T\xa7\xd9\xe5\x5\x30\xb6\0\xb6`\xc0\xe8\xc2\xdd\xf1^\t\xfc(\x80\xb9]\xae\x12o\x98T{\x1e\x99\xfc\xf4\xec\x1b\xd0\xbb\tD)" +Geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x17\0\0\x6\x85\0\0\x5\xf7\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\xf\0\0\0\0\0\0\0\0\x17\0\0\x6\x85\0\0\x5\xf7) +State=@Variant(\0\0\0\x7f\0\0\0\tPyObject\0\0\0\0\xf\x80\x4\x95\x4\0\0\0\0\0\0\0\x43\0\x94.) + +[manifest] +widgets\1\closable=true +widgets\1\floatable=true +widgets\1\floating=false +widgets\1\floating_abs_h=0 +widgets\1\floating_abs_w=0 +widgets\1\floating_abs_x=0 +widgets\1\floating_abs_y=0 +widgets\1\floating_rel_h=0 +widgets\1\floating_rel_w=0 +widgets\1\floating_rel_x=0 +widgets\1\floating_rel_y=0 +widgets\1\floating_screen= +widgets\1\movable=true +widgets\1\object_name=Info +widgets\1\widget_class=TextBox +widgets\2\closable=true +widgets\2\floatable=true +widgets\2\floating=false +widgets\2\floating_abs_h=0 +widgets\2\floating_abs_w=0 +widgets\2\floating_abs_x=0 +widgets\2\floating_abs_y=0 +widgets\2\floating_rel_h=0 +widgets\2\floating_rel_w=0 +widgets\2\floating_rel_x=0 +widgets\2\floating_rel_y=0 +widgets\2\floating_screen= +widgets\2\movable=true +widgets\2\object_name=Plot_1 +widgets\2\widget_class=Waveform +widgets\3\closable=true +widgets\3\floatable=true +widgets\3\floating=false +widgets\3\floating_abs_h=0 +widgets\3\floating_abs_w=0 +widgets\3\floating_abs_x=0 +widgets\3\floating_abs_y=0 +widgets\3\floating_rel_h=0 +widgets\3\floating_rel_w=0 +widgets\3\floating_rel_x=0 +widgets\3\floating_rel_y=0 +widgets\3\floating_screen= +widgets\3\movable=true +widgets\3\object_name=Plot_2 +widgets\3\widget_class=Waveform +widgets\4\closable=true +widgets\4\floatable=true +widgets\4\floating=false +widgets\4\floating_abs_h=0 +widgets\4\floating_abs_w=0 +widgets\4\floating_abs_x=0 +widgets\4\floating_abs_y=0 +widgets\4\floating_rel_h=0 +widgets\4\floating_rel_w=0 +widgets\4\floating_rel_x=0 +widgets\4\floating_rel_y=0 +widgets\4\floating_screen= +widgets\4\movable=true +widgets\4\object_name=Plot_3 +widgets\4\widget_class=Waveform +widgets\5\closable=true +widgets\5\floatable=true +widgets\5\floating=false +widgets\5\floating_abs_h=0 +widgets\5\floating_abs_w=0 +widgets\5\floating_abs_x=0 +widgets\5\floating_abs_y=0 +widgets\5\floating_rel_h=0 +widgets\5\floating_rel_w=0 +widgets\5\floating_rel_x=0 +widgets\5\floating_rel_y=0 +widgets\5\floating_screen= +widgets\5\movable=true +widgets\5\object_name=Plot_4 +widgets\5\widget_class=Waveform +widgets\6\closable=true +widgets\6\floatable=true +widgets\6\floating=false +widgets\6\floating_abs_h=0 +widgets\6\floating_abs_w=0 +widgets\6\floating_abs_x=0 +widgets\6\floating_abs_y=0 +widgets\6\floating_rel_h=0 +widgets\6\floating_rel_w=0 +widgets\6\floating_rel_x=0 +widgets\6\floating_rel_y=0 +widgets\6\floating_screen= +widgets\6\movable=true +widgets\6\object_name=Progress +widgets\6\widget_class=TextBox +widgets\size=6 + +[profile] +created_at=2026-09-27T09:27:43Z +quick_select=true +screenshot="@ByteArray(\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x6\x86\0\0\x5\xe1\b\x6\0\0\0\xb7\x5(\x97\0\0\0\tpHYs\0\0\xe\xc4\0\0\xe\xc4\x1\x95+\xe\x1b\0\0 \0IDATx\x9c\xec\xddut\x14\xd7\xfb\xc7\xf1w\x1c\x12\x92\xe0n\xc5\xdd\x83\xb6Xp\xb7\xe0RZ\xac\xb8\x43)R\\\x8a\xbbK\xb1\xe0.-\x85\x1f-\x14)\x14)\xe\xa5XB\bNB\x2\x44v\x7f\x7f\xe4\xcb\x96\x94\x18\xc9\xc6\xe0\xf3:'\xe7$3w\xef}\xb2wv\xf6\xce<3w,\xfc_\x5\x1a\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x8f\x9e\x65|\a \"\"\"\"\"\"\"\"\"\"\"\"qC\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91O\x84\x12\x43\"\"\"\"\"\"\"\"\"\"\"\"\x9f\b%\x86\x12\x90{\xf7\x1fq\xef\xfe\xa3\xf8\xe\x43$\xca\xb4\xcd&N\xea\xb7O\x97\xfa^DD\xe4\xc3\xe8\xbbSDDD\x12\x13\x8d]$\xaa\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xf9\x44(1$\"\"\"\"\"\"\"\"\"\"\"\xf2\x89\xb0\x8e\xef\0\x44\x44\x44\x44\x44\x44\x44\x12;?\xbf\xd7\xf8\xbc\xf4#(\xd8\x10\xdf\xa1\x88\x88\x88\x98\x95\xad\xad\rI\xeclqv\xb4\x8f\xefPD\xc4L\x94\x18\x12\x11\x11\x11\x11\x11\x11\x89\x1\xaf\x87OIjkC\xd6\xcci\xb0\xb6\xd2\xc4\x1c\"\"\xf2qy\xf3&\x90\x17>\xaf\xf0\xb8\xff\x98\xcc\x19S\xc7w8\"1r\xef\xfe#\xb2\x64L\x13\xdf\x61\xc4;%\x86\x44\x44\x44\x44\x44\x44\x44\xa2\xc9\xcf\xef\x35I\xecl\xc8\x90.E|\x87\"\"\"\x12+\xec\xeclH\x9b\xc6\x6+k\xf0\xf3\x7f\x83\x83\xbd]|\x87$\"1\xa4K\x99\x44\x44\x44\x44\x44\x44\x44\xa2\xc9\xe7\xa5\x1fiS;\xc7w\x18\"\"\xf2\t\xbb\xfe\x8fW\x9c\xb4\xe3\xec\xe4\xc0\v\x1f\xbf\x38iKDb\x97\x12\x43\"\"\"\"\"\"\"\xd1\x14\x14l\xd0\xf4q\"\"\xf2I\xb0\xb6\xb2\"\xd8\x10\x1c\xdf\x61\x88\x88\x19h\xf4*\"\"\"\"\"\"\"\"\"\"\xf2\x89\x33\x1a\x8d\x18\x8d\xc6\x38{\x9d\xc4\x1f=cHDDDDDDDDDD\xcc\xc2}\xc3\x66N\x9d>\x13\xe5\xf2\xe5\xca\xba\xd0\xaci\xe3X\x8cH\xa2\xc2h42m\xfal\x8c\x46#\x3\a\xf4\xc1`00x\xe8\b\xdc\x9a\x35\xa6l\x19\x97PeO\x9c<\xc5\xa6\xcd\xdb\x98\x34\x61\f\xd6\xd6VL\x9e\x32\x9d\x37\x1o\x18\x39\xfc[,,,\xcc\x1a\xd3\xac\x39\v\xb8w\xcf#\xd4\xf2,Y2\xd3\xa7\xd7\x37\x66m\xebS\xa3\xc4\x90\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x98\xc5\xa9\xd3g\xd8\xbdg\x1f\xb9s\xe5\x8c\xb4\xec\xcb\x97/\xd9\xbc\x65\x1b\xaf\xfc_\xd3\xae]\xabX\x89\xe7\xfa\xb5\x1b\x1c<\xfc+\xdft\xed\x14+\xf5G\xe6\xce\x9d{l\xd8\xb8\x19\xef\x87\x8f(X ?\xad[\xb9\x91$I\x92x\x89%*\xe6\xce_\x84\xd1h\xa4_\xdf^l\xde\xb2\r\x97R%\xdeK\f\xdd\xbe}\x87\xcd[\xb6\x31~\xecH\xa6\xcf\x98\xcd\x82\x45K\xe9\xf1M\x17\xb3\xc7\x32{\xee\x42\x66\xcc\x9c\x43\x81\xfc\xf9\xb0\xb2\xb2\x2\xc0`0\xb0y\xcb\xb6\x90\x18\xfb\xf4\x30{\x9bq-((\x18\x83!\x18[[\xdb\x38mW\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x31\x9b\xdc\xb9r\xb2s\xfb\x46\x9e}J\xa3\xc6\xcd\x1\xf8y\xe2\x38j\xd4\xa8\xc6\xd1\xe3g\xb8y;J\xd9\xde\x8c\xea\xc8\xa8O\x1\xaaU\xb3\"d\xdf\xc1\f\xfbP\b!\x84\x10\x42\b!\x84\x10\xdf\x9e\x1c\r%w\xf5\xea\x35N\x9d\xb9\xc8\xb2\xa0\xd9t\xec\xda\x97K\x97\xc3\xd3\rq\"as\x84\xf8:\xbd|\xf9\x92\xc0\xf9\x8bY\xb7zI\xa6\xf2\xef\t\teOH\xa8\xf2u\xe4\xd5[l\xd8\xb8\x99\x36\xad\xfd\x38q\xf2\x14\x87\x8f\x9e \xf2\xf2ituuq\xb0\xb7\xe3\xd5\xeb\xd7,]\x16L\xebV-177c\xdc\xb8\xd1\xcas+V\xac\xc8\xf2\x95\x1b\x89\x88\x88\xa0N\x1d'e\xfa\xac\x99\x1\xe4\xcf\x9f\x1fHz\xca%h\xe9\x1a\x86\xe\x19\x4\x80\x8b\x8b\x33\xa1G\x8e\x11z\xf8\b\xee\xeen\x99\xbe\xce\xc0\xb9\x33\x95\x65\x46G?d\xdd\xfa\xcd\f\xf8\xbe\x1fO\x9e\xc4\x30~\xe2\x34v\xff\xb2\x41\x39\xc6\x15-Z\x14\xf7\x6\xcd\x19>l\x88\xca\x13+\x1f\x8a\x8a\x8a\xe2\xef\x87\x31\x34k\xda\x98J\x95,\xd2\xad_]M\x1d\r\ru\xfa\xf5\xeb\x3\x80\xb3s\x1d\xf6\x1f\xf8\x95#G\x8e\xe1\\\xc7\x89\xb0\xb0\x8b\xacZ\xbb\x95\x8b\xe7\x8e)\xeb\x34\x33+Gm\xe7\x6\x9c:u\x1a{{;\xec\xedl\x1\xb0\xb2\xaa\x82\x81\x81\x41\x8a:\xe2\xe2\xe2\x18\x33n\x12\xf3\xe6L\xa3n]g\0\x1c\x1c\xec\xa8\xeb\xd6\x80M\x9b\xb6\xd0\xa3G7\xe5\x35\xda\xdaXS\xb9r%\0tt\xb4S\xa4\x45\xff\xfdwF]\n|\x9e~\xfd\xe7\x9f\x7f\xb8r\xed\x36&\xc5\x8a)\xd3\xb6l\xdd\x8e\x81\x81>\xe3\xc7\x8d\x46\x43\x43\x3'@OO\x97~\xdf\xf\xc7\xcf\xcf\x17\x3\x3\x3\xb4\xf3\xe6\xa5{\x97\xef\xe8\xd0\xa1\x1d\0\x8e\x8e\xb5\x89\x8c\xbc\xca\xdau\x1b\x18\x31|\b\xeb\x37l\xc4\xc1\xce\x9a\x1e\xdd\x93\x9e\xe4q\xb0\xb7\xe3\xfc\x85\x30\xf6\xee\t\xc1\xf2\xdf\xeb\x6X\x1c\x14H\x99\x32\x65\x94\xaf\xa7L\x9e\xa8\xfc\xbd\x8e\x93#\xbf\xec\xda\xcb\x89\x93\xa7pp\xb0\xc7\xac\\9\x9c\x1dmqvvR\xf6\xdd\x87\x32\xf3\xde\x66t\x7f|H]M\x1d\xad<\x9a\xf8\xf7\xe9\x5@\xed\xda\xb5\xd9\xbc\x65\a\xf6\xf6\xd6\xca\xeb\xaf^\xad*\xc1\xab\x37s\xee\xdcyJ\x96(\x91\x61\x1f\xaa\xabk\xf0\xe3\xc4\0\x16\xcd\x9f\xa5\xbc\x7f\xeclm(W\xa1\x86\xb2\xde\xcc\xf6\x61j\xce\x9e\xbf@\xedZvx\xb8\xd7\x43MM\r\a\a\xfbT\xf3\x65\x34N\xa4\xf6\x39H\xed}\xc8\xcc=X\xa9\x62\x39\xeclk\xd0\xbaUK\0*W\xae\xcc\xda\r;\xb8p!\x8c\x62\xc5\x8a\xb2y\xcb\x36LL\x8a\x32\xe1\xc7\xb1hhh\0p\xe0`(\xbf\x9f\x38\x93\xa9:tuu3\xecS\0SS\x13\"\xaf\xde\"66\x96\x2YxjS\b!\x84\x10\x42\b!\x84\x10\xff}9\xba\x30\xb4\xff\xc0\x41\\\x9c\xec\xf1\xf4\xf4\xc0\xd2\xc2\x8c\x43\x87~Mwa( `\x6\x97\xc2#X\xb1,\xe9\xdb\xe2\x89\x89\x89l\xdd\xb6\x9d\xf5\xeb\x37\x11\xfb,\x8e\x46\r\xebs\xe4\xc8\x31:ujO}\xfw\xe\x1d\ne\xda\x8c\xd9\xb4j\xd9\x9c]{B\xf8\xf3\xcf(\x9a\xfb\x34\xa1{\xb7.\xa9~\v\x1e\xe0\xd2\xa5\bF\x8e\x1a\xcb\xee=\xfb\xa9\\\xa9\x2\x9d:\xb6\xc3\xd9\xb9\x8e\xf2x\\\\\x1c\x41\x8b\x97\xb2s\xe7^\xf2\xe5\xcfG\xebV\xbe\x34\xf7i\x86\x86\x86\x6\xf\x1e\x44\xb3\x61\xc3&B\xf\x1f\xe5\xc6\xad;\xd8\xdb\xd6\xc0\xbfOO,-+\x3(\xdb\xd3\xd2\xd7\x87\xdd\xbb\x43\x88\xfa\xeb\x1e~-}h\xe5\xe7\xcb\xba\xf5\x1b\xd9\xb3w?o\xde\xbc\xa1\x63\xfb\xef\xf0\xf5m\x8e\xba\xba\xba\xf2\xbc\xe5+Vr\xe6\xdc\x45J\x14/F\xebV\xbe\x34k\xda\x4s\v\x1b\0\x65\xc8\x9b_\xb6\xad\xc1\xce\xd6\x6\x85\x42\xc1\xbe}\aX\xb3n\x3W\xae\\\xc7\xb9N-\xfa\xf4\xeeI\x89\x12\xc5\x95\xe5\x5\xce_H\xebV\xbel\xdd\xba\x83\xbbQ\xf7h\xee\xd3\x84\xae]:\xa3\xad\x9d\xf7#\xdfU\xf1\xad\x8b\x8e~\xc8\xca\xd5\xeb\xe9\xd3\xab\v\xda\xdaI\x8b\x1\xc1\xab\xd6\x63U\xa5\x32U\xad,3U\xc6\xd1\xd0]\xca=\x86\x62\x62\x62\x98\x31s6\xdf\xff\x30\x8a:N\xb5\xb9q\xfd\x6/_\xc5S\xba\x9c\xeaX\xa1\xa7\xab\xad\xfc=<<\x82={\xf7\xf1\xfb\x89\x93\x9c;\x9f\x14\x1e\xea\xe5\xabW*\xf9\xdf}\xbe\0\xca\x97\x37\xe7\x7f\x65\x8a\xab\x1c\xafjU\x85\xbf\xfe\xba\x97\xc9\xabNY\xa6\xb9Y9\xee\xfcy\x9f\xc4\xc4\x44\xfe\xf8\xf3O\x12\x12\x12\xf1h\xd0<\xc5\x39I\xa1\xbe\xd2^\xc0\x30\x33+\x87W\x3WZ\xf8\xb5\xa7\xb5\x9f\xfn\xae.\xd8\xd8X+'\x90?\xe4\xee\xa6:\xc1o]\xa3\x1a\x31\x31\x31\0\\\xbb~\x1dK\v3\x95\x5\x13ss3L\x8a\x16\xe6\xe6\xcd[\xd8\xdb\xdb\x65x\x8dw\xa3\xa2x\x12\x13K\xc5\x64\xa1\xfdttt\xf0\xa8W\x97\x8b\x99x\xa2#;>G\xbf>\x7f\x9e\x14\x8e\xaeH\x11\x63\x65ZX\xd8\x45\x9c\x1ck\xaa\xf4m\x8d\x1a\xd5\x89\x7f\xf3\x96\xbbw\xa3\x94\v\x4\xa5K\x95Ti\x9bs\x1dG\x8e\x1d\xff\xed\xdf\x32.\xb1}\xe7~\xb6\x9b\x98\xa9\xd4\xd7\xb9\x83\x9f\xcakccc\x95\xd7\xf\x1e\x44\xb3k\xd7nB\xf\x1f%\xea\xaf\xfb\x84G\xde\xc0\xc1\xde\x36\xcd\xf6\x7f(\xb3\xefmz\xf7Gj\\\xeb\xd6V\xfe\xae\xa9\xa9\x81\x8du5\x95\xc5\x34\x43\x43\x43\xca\x94\x32U\x86\x35\xcb\xa8\xf\x35\x34\x34\x88}\xf6\x2\v\x8b\x8a\xca\xe3\xef\xc6\x89w2\xdb\x87\xa9\xf1m\xeeM\xb7\x9e\xfdy\xf0\xa0=^^\r\xa8W\xcf\x15\xe3\xc2\x85S\xcd\x9b\x99q\"#\x99\xb9\a\xf3hjbV\xee\x7f\xca\xf4\"E\x8c\x31\x32,@\xec\xbf}v\xe9\xd2\x65\xea\x38\xd6R\xe9\x33\x37Wg\xae]\xbb\x91\xa9:\x9e|0F\x86\x86T\xb5v\xe2\xca\x95\xab\x19\\\xc3{\xd9}o\xb3z\x9f\xa7\x96_]\xfd}ZF}\xf8nO\xbc\xf\xef\x9f\xe4\xb2\xd3\x87\xef\x38;\xd7\xe1\xec\xa9#\x1c\x39z\x8c\x90\x90\xfd\f\x19\x36\x8e\xc0\xd9Sh\xd2\xc4K%_v\xc6\x89\xd4\x64\xf7\x1eL\xbe\xd8\xf9\xfau \xe5\x13\x97\x17.]\xe1\xc2\xa5+\xca\x30g\n\x85\x82\x13'Nag\x97t/V\xb1\xac\xcc\xb6\x1d{\xd0\xd3\xcb\xa7\x1c_3\x12\x1e\x1e\xc9\xed?\xfe\xa2}\xbb\xb6\x18\x19\x19\x2\x90\x90\x90\xc8\xbe\x83\xc7\x94y\xd4\xd4\xd4\x95\x8b*\xa9\xc9\xd4{\x9b\x3\x32\xea\xc3\xd7\xaf\xe3\x93\xee\x9fs\x17\x30\x31\x31\x1\xe0\xcd\x1b\xd5{-;}\x98\\\xfe\xfc\xf9i\xd8\xc0\x93\x86\r<166f\xe9\xf2\x95)\x16\x86\x32\x1c'\xd2\xf8\x1c|\xf8>|\xecg\x1b\xa0re\v6m\xde\xce\xc0\x1\xef\xfb\xec\xfc\xf9\x30\x9e\xbfx\x99\xa9:\x8a\x17/\x9e\x61\x9f\x2<|\xf8\x10x\x7f\xef\v!\x84\x10\x42\xa4\x46\x16\x82\x84\x10\x42\x88oS\xb6\x16\x86\xe2\xe2\xe2\xb8{7*\xcd\xe3:::\x94.]J%m\xfe\xc2\xa4\x8d\xa8\xef\xfc\xf1'w\xfe\xf8\x93\xc4\x7f\xbf\xc9\xbau\xdb\x8eL-\f\xdd\xbd\x1b\xc5\xf3\x17\xaf\x32\f\x9d\x2i\x87!J\x9e\xeP\xachQ\xea\xd7S\r\xb3\xe3\xe8T\x9by\x8b\x82\x89\x8b\x8b\xcb\x95\x10V\x8eN\xb5Y\x18\xb4\x8c\x6\x8d\xbci\xee\xd3\x84zn\xae\xe9N\xf2\x65%\xcc\x93\x96\xd6\xfbo\xc0\xbf\xdb\xbb\xe4\xee\xdd\xbb\xb2\x30$>Z\xc1\x82\x46,^8\x1b\x1f\xdfv\x94\x37\x37\xa3UK\x9f,\x9d\x7f\xf9r8\xcf\x62\x9f\xa1P(x\xf6,\x8e\xf5\x1b\x36\xe1\xd5\xc0\x95\n\x15\xca\x93'O\x1e\xda\xb5\xf1\xa1W\x9f\x1\x8c\x1b;\x9c\xd2\xa5J\x11\x15\xf5\x17\xda\xday\xa9S\xc7\x89\xd2\xa5Kq\xec\xe7\x99\xacZ\xb5\x86\x32\x65\xcb\xb0}\xfb/Im*T0\xdb\xd7\xa3\xa3\x93\xf4\x8d\xfd\v\x17\xc2(\\\xb8\x30\xa5\x92\x85\x12\xcb\f==]\xc6\x8d\x1eJ\xdf\x1\xc3\xc9\x93'\xf\xd6\x35\xaa\x13\xfb\xec\x19w\xee\xfc\x41\x9b\xd6\xe9\x87\xc7\xbau\xeb\x36\xeb\xd6o\xc4\xce\xce\x6\x3\x3\x3N\x9f:\x8d\x86\x86\xba\xf2\t\xc1\xac\xb0\xb3\xb3\xc5\xd5\xa5&={\xf7\xe3\xfb~}\xd0\xd2\xca\xc3\xfc\x5\x41\xb4m\xed\xad\\h65M\x9aX\xde\xb8q\v\xb6\xb6\xd6\x94/o\xae|\x1a\x6\x92\x9e\xe0\x1a>\xa4\x1f\x3\a\x8d\xe4\xc5\xf3\x17\x98\x16\x37\x65\xf7\xee\xbd\xc4=\x7f\x81w\xb3&YjO\xfe\x7f\xcb=y\xea\x34\xf6v\xb6)\xc6\xe4\x8c\x64\xd4\xaf\x31\x31\x31\x94\xaf\x64\xcb\xb2\xc5\xb3i\xd8@\xf5\xf\\}}}\x8a\x16)H\xf4\x83heZ\x8b\xe6\xde\xcc\t\fb\xe0\xf\x43h\xd1\xc2\x87\x98'1\x8c\xfb\xf1g&\x8c\x1f\x81\x9e\x9e\x9e\xca\xf9\x33g\xcd\xa1\x46\xf5\xea\xfc\xf6\xfb\xef\x9c\xbbp\x99\xe9\xd3\xa7\0\xd0\xb4ic\x16-^N\xcf^}\xe9\xd3\xa7\a\xfa\xfa\xfa\x44\x84G`ccM\xd9\xb2\x65H\xcd\xbb>\xf\x9c\xb7\x80\xbau\x9d\xb9v\xed:\xa0\x1a:\xadre\vv\xef\xdeG\xadZ5\xd1\xd3\xd5U\xf9\xb7\xf\x32\xf7\xde\xe6\x84\x8c\xfaPOO\x8f\xa1?\xf8\x33`\xd0\b\xe2\xe2\xe2\x30\x31\x35\x61\xd3\xa6-*ed\xa7\xf\xdf\x99??\xe9\v\xf\x65\xca\x96\xe1M|<'N\x9e\xc6\xd6&\xe5\x17\x46\x32\x1a'\xd2\xfa\x1c\xa4\xf6>d\xf7\xb3\xfdNs\x9f\x66\xcc\x98\x35?\xa9\xcf\x9a{\xf3\xf8\xf1\x13V\xad\xdd\xaa<\x9e\xd1}ndd\x98\x61\x9f\x2\x44G\xff\x8dI\xd1\xc2\xe8\xebK\x18\x39!\x84\x10\x42\b!\x84\x10\x42\xa8\xca\xd6\xc2\xd0\xcd[\xb7\xa9W\xdf;\xcd\xe3-\x9b\x37\x62\xce\xec\x19\xca\xd7\xcf\x9e=c\xf7\xde_\x1\xf0j\xdaZ%\xef\xe2\x65k\x19=jD\x86{\xdd\xbc\xfb\x16oF\xa1SR\xc8 j\x8e\xda\a\x13\x93\xef\xc2\aihh\xe4J\b\xab\x92%Jpp\xff.N\x9f>\xc3\xc1\x43\xa1x4\xf0\xa6m\x9b\xe6\x8c\x1b;:\xe5\x89\x64?\xcc\xd3\xbb\tY\xad\xbc\xb2\xc7\x90\xf8\x34\xaaZY\xd2\xb9\x63[\x2\xe7\a\x11\xbcl~\x96\xce\xed\xd9g0\x90\xb4\xe8Z\xa3\xba%\xf5\xdd\xddh\xd9\xb2\x85\xf2\xf3\x38\xf1\xa7\xf1\xac^\xb3\x8e\xa5\xcb\x82\xb9~\xe3\x36\xd6\xd5\xad\xe8\xd0\xfe;\0\x1a\x34\xa8\xcf\x98\x91Q\x4\xce\xf\x42_\xbf\0\xad[\xf9\xe2\xe2t\xf7\xa3\xae\xa5@\x81\xfc\xcc\x9e\xfe\x13\xd3g\xce%&\xe6)\x83\x6\r\xc8r\x19\xcd\x9b{c`h\xc0\xda\xb5\x1b\x98\x36\x63.\xe6\xe5\xca\xe2\xe5\xd5 \xc3\xf3\xb4\xb4\xb4PS\x83)Sgp7\xea>6\xd6U\xd9\xba\x31\x38\xcb\x8bS\x90\x34\x8e-\x9c?\x87\x5\v\x83\x98\xf8s\0\x6\x6\xfa\x34\xf6j@\xdb\xef\xde\x8f\xc3%K\x94`\xe9\xa2YL\x9b\x31\x87]{B\x98:\xe5'*V\xa8\xa0RN\xcf\x1e\xdd\x31\x32\x32\x62\xdd\xfaM<~\x12\x43=7\x17\xb6lZ\xab\xb2\x80\x94\x19\x65\xca\x94\x66\xc4\x90~L\xfay\x1a\x3\xfa\xf7\xc1\xc5\xa5NF\xa7\xa4\x90^\xbf\xbe\xdbG\xc8\xc8\xd0\x30\xc5y\xea\xea\xea\xb8\xbb\x39s\xed\xfa\re\x9a\xb1\xb1\x31{wma\xce\xdcy\f\x18\x38\x8cJ\x95*\xf0\xf3\xc4q\xb8\xbb\xbb)\xf3T\xb5\xac@\x91\"\x85\xb9|9\x82\xe0\x95\xebpq\xae\xcd\x9e\x9d\x9b\x95\xfb\xd8\xe4\xcb\x97\x8f\xad\x9b\xd7\xb2`\xe1\x62\xc6\x8c\x99\xc0\x8b\x97/\xa9U\xd3\xek\xeb\xeai^C\xd9\xb2\x65\b^\x16\xc8\xccY\x81\xec\xde\xb3\x8f\xc6^\x9e\xf4\xed\xddY%O\xcf\x1e]y\xf2\xe4\t\xdd{\xf4\xa5\x45\xf3&)\x16\x86\x32\xf3\xde\xe6\x84\xcc\xf4\x61\xef\xde=\xd0\xd7/@\xf0\xca\x35\xe8\xea\xe9\xd2\xa4qC\x1e>z\xac<\x9e\x9d>|\xa7\x98IQ~\xf9\x65\x37g\xcf]D_??\x8d\xbd<\xe9\xd6\xb5s\x8a|\x19\x8d\x13i}\xeR{\x1f\xb2\xfb\xd9~\xa7H\x91\"\xec\xdd\xb5\x85Y\xb3\xe7\x32h\xc8(\xdc\\\xeb\x30y\xe2(\x16\x5\xe4\xea\xe8\x1f\0\0 \0IDAT-S\xe6\xc9\xa8\x8e\x8c\xfa\x14\xe0\xea\xd5k\xb8\xd6u\xcc\xf2\x2\xac\x10\x42\b!\x84\x10\x42\b!\xfe\xfb\xd4\xae\xde\xbc\xa7(a\x92\x34\xc1u\xf7\xde\x43\xcc\xcb\x16\xcb\xe0\x94\xac\xdb\x1b\xb2\x8f\x8e]\xfc\x89\xb8x\x2\xc3\x64\x13v\xe1\xe1\x11\xb8\xd4k\xc2\xb6M\xc1\xd4\xac\xe9\x80\xbb\x87\x17-}\xbd\xe9\xdc\xb9#\0\x1\x1\x33\xb8\x14\x1e\xc1\x8a\x65\x41\xc4\xc4\xc4`Q\xc5\x9e\xa0\xf9\x33h\xd4\xe8\xfd$`\x19\x33+\x82\x97\x5R\xdf\xc3\x9d\x43\x87\x42\xf1\xfb\xae+\xb7\xaf_P~\xdb{\xc7/;\xe9\xd2\xfd{\x1e\x44]M192j\xf4\x38\x16.^\xc5\xdf\xf7\xae+\xd3\xe6\xcc\t\xe4\xd8\xf1\x13\xac_\xb7\x92\x8b\x17/\xe1V\xdf\x9b\x9d\xdb\xd6\xa4\x1a\xc2j\xf6\xec@B\xf\x1f\x65\xcb\xe6u@Rh\x9a\x92\x65-\x99\x31u \xe7iI\x9e'\xbb\x63\x81\x42\xa1\xe0\xd5\xabW\x12\xbaH\xe4\x8a\xf0\x88\b\\\xdc\x9a\xf0\xdb\x91\xbd\x94+\xf7\xbf\x14\xc7\xf\x1e \xfe\xb9\xd0\x12!\x84\x10\x42\xe4\xa4\x1c\t%\xf7\xb9\x44\x45\xfd\x45u[g\x8e\x1f\xde\x83\x99Y\xb9\xdcn\xce\x17+\xb5\x90v\xe2\xdb\x90\xd3\xa1\xe4\x84\xf8\xd2%&&\xf2\xe6\xcd\x1b\xf2\xca\xfej\xe2?\xec\xd5\xab\xd7hi\xe5\x91\xfd\x85\x84\x10\x42|\x13$\x94\\\xf6I(9!\x84\x10\xe2\xdb\x92\xe3\xa1\xe4>\x95\xabW\xafq\xec\xf8o\x98\x99\x95\x43\x43\x43\x83\x15+V\xd1\xae\x8dO\xaa{I\b!\x84\x10\x1fRWW\x97\x45!\xf1\x9f\xa7\xad-\xf7\xb8\x10\x42\b!\x84\x10\x42\b!\xd2\xf6U-\f\x1\x84\x87G0\x7f\xc1\x12LM\x8b\xd1\xd8\xab\x1mZ\xfbI8 !\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42\x88L\xf8\xaa\x16\x86\xca\x97\x37g\xfa\xb4)\xb9\xdd\x8c\xafN\xdd\xba\xce\xfc}O\x1e\xf\x17\x42\b!\x84\x10\x42\b!\x84\x10\x42\b!\xbeu_\xd5\xc2\x90\x10\x42\b!\x84\x10\x42\b!\x84\xf8\x34\x42\xf6\xeeQy\xedQ\xdf\x33\x97Z\"\x84\x10\x42\x88\x9c$\vCB\x88\xcf.!!\x81\xf8\xf8xtttr\xbb)B\b!\x84\x10\x42\b!\xfe%\vAB\b!\xc4\xb7I=\xb7\x1b \x84\xf8o{\xf2$\x6\xdb\x9a\xae\x1c <|\xf8\xe8\x93\x96+\x84\x10\x42\b!\x84\x10\x42\b!\x84\xf8v\xe5\xf8\xc2\xd0\x9a\xb5\xeb\x31\x36\x31\x63\xce\xdcy)\x8e\xb9{x\xb1\x64\xc9\x32\xe5\xeb\x5\v\x16\xd1\xabO?\x14\nEN61SR\x9b\x64N\xde\xfe\xb7o\x13\xe8\xd4\xb9;+V\xac\xfc\xac\xedHm\x92Z\x88/\xc9\xe0\x61\x63\xb0\xa9Q\x8d\x46\r=\xd2\xcc\x33g\xc6\x44\xb6o^\xa9\xf2\x63]\xa3\x86\xf2x\x7f\xff\xae)\x8e\xf7\xee\xd5='\x9a\x9f\x42\x97\xae=Y\xfe\xc1\xe7\xfa\xec\xd9s\x98[\xd8\x10\x1b\x1b\xfbI\xebR(\xf8\"\xc7?!\x84\x10\x42\b!\x84\x10\x42\b!\xc4\xd7+GC\xc9)\x14\n\xd6\xac\xdd\0\xc0\xaa\xd5\x1b\xe8\xd9\xa3\x1b\x9a\x9ai7A\xa1\0\x45\xa2L\x8a\xa6\xa7K\xd7\x9e\x38;;\xd1\xabg\xeeL\x92\v\x91\x9e\x9d\xbb\x42\x38}\xfa\x1cGBw\xa7\x9b\xafj5+\xca\x9b\x9b\xa7H\x7f\xf7\x4\x8e\xb9y9\x1c\x1c\xec?K\x1b\xbf\x64\x8e\x8e\xb5pt\xac\x95\xdb\xcd\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42\xfc\x87\xe4\xe8\x13\x43W\xaf^\xe3\xd4\x99\x8b,\v\x9a\xcd\xed?\xfe\xe2\xd2\xe5\xf0t\xf3\xf7\xec\xd9\x8d\xf9\xf3\x66\xa3\xa6\xa6\x96\x43-\xfct455X\xba\x64!\xed\xdb\xb7\xcd\xed\xa6\b\x91+\xe2\xe3\xe3\x19\x33~\x12\xe3\xc6\xe\x43\xbf@\x81\x1c\xab\xf7\xea\xb5k\f\x18\x38\x18k[G\x1cj\xb9\x30|\xc4h\xde\xbcy\xa3<\xbe\x37\x64?\xfe}\xbf\xc7\xda\xd6\x91\x1f\x6\r\xe5\xde\xbd\xfb\xca\x63\xdf\xf\x18\xc4\xb8q\x13T\xca\xb3\xb0\xb4\x61\xd3\xe6-\0\xb4\xf9\xae\x3\xa1GO1\xf6\xc7\0\x8cM\xccX\xb8h1'O\x9d\xa6\x89O\xd2\xe7\xdc\xdc\xc2\x6\x63\x13\x33\x62\x63\x9f\x1p\xf7n\x14\x43\x86\x8e\xc0\xd6\xde\x89v\xed;s\xf2\xe4)e\xb9\x87\xe\x85\xe2\xe1\xd9\x98_\x7f\r\xa5m\xbbN\xb8\xb8z\x12\x17\x17\xa7R\xf7\xa1\x43\xa1\x18\x9b\x98\xf1\xfc\xf9\xf3L][r\x11\x11\x91\xf4\xeb?\x10k[G\xbat\xed\xa9Rwtt4\xc5KUd\xf7\x9e\xbd\xf4\xf1\xef\x8f\x9d\x83\x33\xc3\x86\x8f\":\xfao\x95\x32\xd2k\x7f@\xc0\fF\x8e\x1aK\xc0\xb4\x99xx6\xa6\xa1\x97\x37\x9b\x36o\x91'\x9c\x84\x10\x42\b!\x84\xf8\x8a\xcc\x9b;'\xc5\x8f\x10\x42\b!\xfe\xfbrtah\xff\x81\x83\xb8\x38\xd9\xe3\xe9\xe9\x81\xa5\x85\x19\x87\xe\xfd\x9an\xfe\x80\x80\x19\xb4\xef\xd8U\xf9:11\x91\xcd[\xb6\xe2\xdb\xb2\r\xf5\x1b\x34\x61n\xe0||[\xb6\x61o\xc8> i\x12\xb5\xa1\x97\x37\xabV\xad\xa1U\x9b\xf6\xd4rte\xc6\xcc\xd9\xe9\x86Z\xbb~\xfd\x6\xdf\xf\x18\x44u\xebZ4\xf3n\xc9\x8e\x1d;\x95\xc7\xd2\x9bX\xcd\x8c\xe4\xa1\xe5\xdeM\xc4\xae[\xb7\x81\x9e\xbd\xfa\x62m\xeb\xc8\xb0\xe1\xa3\xb8\x7f\xff\x1[\xb6l\xa3}\xc7\xae\x38\xd4ra\xca\xd4i\xca\xc9\xe1\x97/_\xb2v\xddz\xda\xb6\xeb\x44\x95j\xf6\x34\xf7m\xcd\xae]{\x94\xe5\xa7\x36I\rIOf\x85\x84\xec\xa7}\xc7\xae\xd8\x39\x38\x33\x64\xe8\b\xee\xde\x8dR\x9e\x97\x99\ti!>\xd6\xc2\xa0\xe5\x94(nJ\xd3\xc6\r3\xcc{1\xec\x12'O\x9dV\xf9I\xbe_\xcf\x8d\x1b\x37S\x1c\x7f\xf4(\xe5\xbe;11O\xf1i\xf1\x1d\x46\x46\x46\xcc\x99\x1d\xc0\xe8\x91\x43\xa9P\xa1 \xc2\xb3\x91\x37\x65\xca\x94\x66\xd6\xcc\xa9\x38\xd8\xdb\xe1\xd5\xac\x8d\xca\x82\xf8\xf9\xb0H&\xfc\x34\x5wwW\xfa\xfa\xf7 _\xbe|i\xd6\x9d\x99k{'<\"\x2wOo,,*2}\xda$\xca\x96-\x83W\xb3\x36\x9c\x38qR\x99'\xfe\xcd[:t\xf6\xa7\x9e\x9b+\x13'\x8c\xe6\xd6\xad;\xb4n\xd3\x81W\xaf^\x3\x64\xd8\xfe\x44\x45\"\x8b\x96\xac&\x8f\xa6&\xc3\x86\f\xa4\xae\x8b\x13\xbd\xfc\x87p\xf8\xc8\xd1L\xf5\xa5\x10\x42\b!\x84\x10\"\xf7\xf5\xea\xe3\x9f\xe2G\b!\x84\x10\xff}9\x16J\xee\xcd\x9b\x37\xac\\\xb5\x8e\xc1?\xf4G]]\x1d__o\xe6/X\x8a\x7f\x9f^hiie\xaa\x8c\xe0\xe0U\xcc\x9e\xbb\x90\x91\xc3\a\x91\xbf@~V\xad^G\xe8\xd1St\xea\xd4^\x99\xe7\xf4\xd9K\x14\x34\x32\xa4s\xc7\xf6\xdc\x7fp\x9fi\xd3\x3Q(\x14\f\xf8\xbe_\x8a\xf2\xae_\xbf\x81\xbbg3~\x18\xd0\x1b\x1f\x9f\x66 \x8cz\xf5\\\xe9\xdc\xb9\x3W\"\xaf\xd0\xb1k_\xb6o^\x89\x83\x83=c\xc7\x8e\x64\xff!OljX2y\xd2\x8f\x14,h\x4\xc0\x86\x8d\x9b\x99 k\xd7m\xc0\xb3\x91\x37\xa1\awS\xa8P!\xe0\xfd\x84t\x87\xem\xc8\x97/_\xba\x13\xd2\x42\x64\xd5\xcb\x97/\t\x9c\xbf\x98u\xab\x97\x64*\x7f\xef~CS\xa4\x45\xdd\tW\x86\x9a\x9c>k\x11\xd3g-R9\xbeq\xed\x12\xea\xd4qR='*\x8a\xbf\x1f\xc6\xd0\xacic*U\xb2H\xb5\xaeU\xcb\xe7\xe3\xee\xee\x6@>==Z\xb6\xe9\xca\xbd\xfb\xf7(Y\xa2\x44\x86\xed\x34+W\xegG[\x9c\x9d\x9d\xa8\\\xb9\x92\x32\xdd\xde\xce\x16\0+\xab*\x18\x18\x18\0\xb0~\xc3\x46\x1c\xec\xac\xe9\xd1=iq\xdb\xc1\xde\x8e\xf3\x17\xc2\xd8\xbb'\x4\xcb\x64\xe7.\xe\n\xa4L\x99\x32\x19\xd6\x9d\x99k{g\xd6\xac@\xfa\xfbw\xa3{\xb7.\0\x38\x39\xd6\xe6\xe9\xd3\xa7\xcc\x9c\x15\xc8\xba\x64\xe3\xd7\x8a%s\xf1\xf4L\xda\xfb\xc9\xb2\x8a%\xd5\xad\x9d\x38|\xf8\b\x1e\x1e\xf5\x32l\xbf\xba\x9a:\x1a\x1a\xea\xf4\xeb\xd7\a\0g\xe7:\xec?\xf0+G\x8e\x1c\xc3\xf9\x83\xf7\x45\b!\x84\x10\x42\b!\x84\x10\x42\b\xf1\xe5\xc8\xb1\x85\xa1s\xe7\xces\xe7\xcf\xfb\xca\xfd\x32\x9c\x1ck3j\xec\x64\xc2\xc2.bcc\x9d\xe1\xf9\xcf\x9e=c\xdc\x84\xa9,Y4\x87\xbau\x9d\x1\xb0\xb3\xb5\xa1\\\x85\x1a)\xf2\x6\xce\x9dI\xfe\xfc\xf9\x1\x88\x8e~\xc8\xba\xf5\x9bS]\x18\x9a\x33w\x1e];\xb7\xa5w\xaf\x1e)\x8e\x65vb5\xab\x92Of\xab\xab\xa9\xd3\xb5\xe7\0\xc6\x8d\x1d\x45\x91\"\xc6\0<~\xfc\x84y\v\x96\x32t\xc8\xfhk\xe7\x65\xca\xe4\x89\xcas\xeb\x38\x39\xf2\xcb\xae\xbd\x9c\x38y\n\a\a\xfbT'\xa9\xe3\xe2\xe2\x18\x33n\x12\xf3\xe6LS\xf6\x93\x83\x83\x1du\xdd\x1a\xb0i\xd3\x16z\xf4\xe8\xa6,/\xb3\x13\xd2\x42\xa4':\xfa!+W\xaf\xa7O\xaf.hkk\x3\x10\xbcj=VU*S\xd5\xca\x32Se\x1c\r\xdd\x95\xee\x1e\x43\xf3\xe6L\xa6\xb9\x8fw\x86\xe5\x98\x99\x95\xc3\xab\x81+-\xfc\xda\xd3\xda\xcf\a7W\x17ll\xac\xd1\xd0\xd0P\xe6\x31\x32\x32T\xfe^\xaaT)\0\x9e\xc7=\xcfT;\xb3\",\xec\x12\xdbw\xeeg\xbb\x89\x99Jz\xe7\xe~*\xaf\x8d\x8d\x8d\x33U^f\xae\r\xe0\xed\xdb\x4\xf6\x1f \xa4\xa3\xa3\x43\xe9\xd2\xa5T\xd2\xe6/L\nsv\xe7\x8f?\xb9\xf3\xc7\x9f$&$\x85n\xda\xbamG\xa6\x16\x86\xee\xde\x8d\xe2\xf9\x8bWXXTT\xa6\xbd\x9b\x84\xfe\x90\xba\xfa\xfb\by\xe6\x66\xe5\xb8\xf3\xe7}\x12\x13\x13U\xd2\x13\x13\x13\xd9\xbb\xefWfM\xff\x39\xc5\xf9Y\x99X\xcd*===\xe5\xef\xef\xfa\xe8\xcd\x9b\xf7\xe5\x95\xfb_Y\x1e=~\xca\xdb\xb7o\xd1\xd2\xd2\xe2\xc1\x83hv\xed\xdaM\xe8\xe1\xa3\x44\xfdu\x9f\xf0\xc8\x1b\x38\xd8\xdb\xa6Y\xfe\xdd\xa8(\x9e\xc4\xc4R\xb1\x62\x5\x65\x9a\x8e\x8e\xe\x1e\xf5\xear\xf1\x83=\x9d\x32;!-Dz\xf4\xf4t\t\xd9w\x90+W\xaf\x11\xb4`\x16\n\x85\x82\x45\x8b\x97\x33w\xd6\xd4\x1co\x8b\xb6\xb6\x36\x8b\x83\xe6\x13\x19y\x85_C\xf\x33p\xd0p\x8c\v\x17\x62\xc5\xf2\xa0T\xf3\xa7\xb6}\xd9\xa7\xda#\xc7\xd0\xd0\x80J\x15\xcb\xb1r\x85j\xdd\xda\xda:\xd9*/\xbdk+\x90l\xf\xa7\xc4\xc4\x4^\xbd\x8e'!!Q\xe5\xfc \f\r\r\xb2y5\x1fV\x93\xfa\xb5\xbd{\x12\x13@KK\x8bZ\xe\x35\x38v\xfc\xb8\x32\x64\x1e\xc0\xb9\xf3\xe7qw\xab\x83\xa6\xe6\xfb\xf1k\xfd\x86M\xca\x85\xf9\xa7O\x9fr\xe6\xec\x45\xbe\xef\xef\xff\xd9\xda/\x84\x10\x42\b!\x84\x10\x42\b!\x84\xc8}\xd9Z\x18\xb2\xaa\x62\xc9\xdf\xf7\xaeg:\xff\xf1\xdf~GCC\x9d\x88\x8b'04|\x1f\xc6)<<\x2\x97zM8w\xee\x1c\x35k:\xa4[F\x89\x12\xc5\xd1\xd0P\xe7\xdc\xb9\v\x98\x98\x98\0\xf0\xe6\xcd\xdbt\xcfI\x8f\x8e\x8e\xeU-+p\xfe|\x18\r<\xeb\xab\x1c\xcb\xca\xc4\xea\xe7\x14\x1e\x1e\xc9\xed?\xfe\xa2}\xbb\xb6\xca\xf0W\t\t\x89\xec;xL\x99\xe7\xc3I\xea\x92\xef\xfa\xe9\xfc\x5LMM\x81\xa4'\xa0\x8e\x1d\xfb\r?\xbf\x16\x39\xd2n\xf1\xed)X\xd0\x88\xc5\vg\xe3\xe3\xdb\x8e\xf2\xe6\x66\xb4j\xe9\x93\xf1IYp\xe3\xc6MN\x9e:\xad\x92\x96OO/\xc5^;\xb7n\xdd\x66\xdd\xfa\x8d\xd8\xd9\xd9```\xc0\xe9S\xa7\xd1\xd0P\xa7\x64\xc9\x8c\xf7\xf\x2\xa8\xedX\x8b\xc0\x85+\x98\x33w\x1eVU,9\xfe\xdb\xef)\xf2T\xael\xc1\xee\xdd\xfb\xa8U\xab&z\xba\xbaXXT\xc4\xd4\x34iL\xda\xb8q\v\xb6\xb6\xd6\x94/oN\xd3\xa6\x8dY\xb4x9={\xf5\xa5O\x9f\x1e\xe8\xeb\xeb\x13\x11\x1e\x81\x8d\x8d\x35\x65\xcb\x66=\x84\x63V\xae\xad\x7f\xbf>x\xb7h\x8f\xa1\xa1!v\xb6\x36\x84GD2w\xdeR\xf6\xed\xd9\xa2\x92/x\xf5\x66\xac\xac,)U\xaa\x14+W\xae\xc1\xb1\x96-\xe\xff\x86\xca\xfc\xd4\xed\x17\x42\b!\x84\x10\x42|yB\xf6\xeeQy\xedQ\xdf\x33\x97Z\"\x84\x10\x42\x88\x9c\x94#{\fm\xdd\xba\x83\xd6-\x9b\xaa,\n\x1T\xacX\x1\xf3r\xa5\xd8\xbf\xff 5k:P\xb8pA.\x87G\x10\x11\x11\xa9\x12\x32\xe\xc0\xd0\xd0\x90\xa1?\xf8\x33`\xd0\b\xe2\xe2\xe2\x30\x31\x35\x61\xd3&\xd5I\xce\xac\xea\xd7\xb7\x17]z\xf4\xc7\xc4\xa4\x18\x35\xaaW\xe3\xe1\xa3G$&$P\xaf\x9e[\x86\x13\xab::\xba\0\\\xb8\x10\x46\xe1\xc2\x85)U\xaa\x64\xba\xed\xcf\x8ew\x93\xcd\x81\xf3\x16P\xb7\xae\x33\xd7\xae%-\xc6%\xdf\xe3#\xb5I\xea\xe1\x43\xfa\x31p\xd0H^<\x7f\x81iqSv\xef\xdeK\xdc\xf3\x17x7k\xf2\xd1m\x12\"-U\xad,\xe9\xdc\xb1-\x81\xf3\x83\b^6\xff\x93\x96=}\xd6\"\xa6\xcfZ\xa4\x92\xe6\xdd\xa4>\v\xe6\xcfQI\xd3\xd2\xd2\x42M\r\xa6L\x9d\xc1\xdd\xa8\xfb\xd8XWe\xeb\xc6`J\x95*Ittt\x86\xf5\xd4uqf\xf6\xf4\x9fX\xbct\x5!\xfb\xe\xd2\xc0\xd3\x9d\x6\xf5]T\xf2\xf4\xec\xd1\x95'O\x9e\xd0\xbdG_Z4o\x82\x85\x45\x45J\x96(\xc1\xd2\x45\xb3\x98\x36\x63\xe\xbb\xf6\x84\x30u\xcaOT\xacP\x81\xad\x9b\xd7\xb2`\xe1\x62\xc6\x8c\x99\xc0\x8b\x97/\xa9U\xd3\xek\xeb\xea\xd9\xea\x83\xf4\xae\xed\x43\xb5k\xd5\x64\xcb\xc6\x15,^\xb2\x9c\xd5k6R\xab\xa6-\xfb\x43\xb6R\xb1\x42\x5\x95|\xed\xda\xf8\xb0~\xc3\x16\x62\x63\x9f\xd1\xa8\xa1\a={tS\xeeY\x94/_\xbeO\xda~!\x84\x10\x42\b!\xc4\x97G\x16\x82\x84\x10\x42\x88o\x93\xda\xd5\x9b\xf7\x14%L\n\x3p\xf7\xde\x43\xcc\xcb\x16\xfb\xa4\x15\xdc\xbf\xff\0\xab\x1a\x8e\xac]\xb5\b\xd7\xba.)\x8e\xcf\x99;\x8fYs\x16r\xf1\xfc\xef\\\xb9r\x95\x81\x83\x86S\xb4\xa8\x31\xcb\x97.b\xce\x9cy\\\n\x8f`\xc5\xb2\xa4=.\xde\xbe}\xcb\xaaUk\xd8\xb0q\v\xbaz\xba\xb8\xb9\xba\x30z\xdc\x14\xd6\xae\\\x88\xabk]\xe\x1d\n\xc5\xef\xbb\xae\xdc\xbe~A\xb9\x97\xcf\x8e_v\xd2\xa5\xfb\xf7<\x88\xba\xaa\xb2\xc7\x10$\xed\xaf\xb1{\xcf^V\xae\\\xcb\xe5\x88+T\xb3\xaaL\xbb\xb6\xad\xa9W/\xe9)\xa1\x63\xc7\x7f\x63\xf1\x92\xe5\\\xbe\x1cI\xad\x9a\xb6\xf4\xe8\xd1Uebu\xdd\xba\rL\x9f\x39\x97\x16>M\x19\x34h\0\xe7\xce\x9dWi\xbfW\xe3\xe6\xb4\xf4\xf5\xa6s\xe7\x8e\x44GGcY\xad\x36\xbbw\xac\xc3\xda\xba\x6\0\x61\x17/Q\xaf\xbe\x37\xe7N\xfdJ\xf1\xe2\xc5\x1\xd8\x1b\xb2\x8fv\x1d{\x13u'\x1c---\xf6\x86\xec\x63\xe6\xac@\xfe\xf9'\x96\xc6^\x9e\xca\xf0v#G\f\x5\xe0\xd1\xa3G\xfc\x34q2\x87\x8f\xfc\x46\x8b\xe6M\x18\x36t0o\xdf&\xb0~\xc3\x46\x36m\xda\xca\xe3'1\xd4ss\xa1g\x8fn\x14*T\x10 \xd5~\x12\xffM/_%=Uw\xf7\xde\x43\xde}\xce\xd3\x92 :\"g\xa4\x36\x1e\t!\x84\x10\x42\b\xf1\x35\xbav\xeb\xbe\xca\xdf\x31Y\xf9\xbb\xe7\xd9\xf3\xb8\xcf\xde\xbe/Y\xa5\nf\x84_\xc9|4\x18!\x84\x10\x42|\xdd\xf2\xeb\xe5\x3\x92\xfe?\xf4\xd9\x17\x86>\xa7\xa8\xa8\xbf\xa8n\xeb\xcc\xf1\xc3{03\xcbx\xff\x10!\xbe\x35\x39\xbd\x30$\xbe\xe\xb2\x30$\x84\x10\x42\b!\xfe+da(\xfb\x64\x61H\b!\x84\xf8\xb6$_\x18\xca\x91Pr\x9f\xca\xd5\xab\xd7\x38v\xfc\x37\xcc\xcc\xca\xa1\xa1\xa1\xc1\x8a\x15\xabh\xd7\xc6\x87r\xe5\xfe\x97\xdbM\x13\x42\b!\x84\x10\x42\b!\x84\x10\x42\b!\x84\xf8\xe2}U\vC\0\xe1\xe1\x11\xcc_\xb0\x4S\xd3\x62\x34\xf6j@\x9b\xd6~\xa8\xa9\xa9\xe5v\xb3\x84\x10\xe2\xabQ\xa4H\x11\xfe\xbe'\xdf\f\x14\x42\b!\x84\x10\xe2[7o\xee\x9c\x14i\xbd\xfa\xf8\xe7\x42K\x84\x10\x42\b\x91\x93\xbe\xaa\x85\xa1\xf2\xe5\xcd\x99>mJn7C\b!\x84\x10\x42\b!\x84\x10\xe2\xab'\x8b@B\b!\xc4\xb7I=\xb7\x1b \x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42\b!r\x86,\f\t!\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42|#daH\b!\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\xe2\x1b\xf1Y\xf7\x18JHH >>\x1e\x1d\x1d\x9d\xcfY\x8d\x10\xe2\v'c\x81\x10\x42\b!\x84\x10\x42|yB\xf6\xeeQy\xedQ\xdf\x33\x97Z\"\x84\x10\x42\x88\x9c\xf4\xd9\x9e\x18z\xf2$\x6\xdb\x9a\xae\x1c \x87\xb4\xda\xbf|\xc5JBC\x8f\xb0\x61\xfd\xeaOZ\x9f\x42\x1\x8a\x44Y\x14\x12\x42\b!\x84\x10\"'$&&r\xe2\xc4\xef\x4\xce\x99\xcd\x85\xf3\xe7R\x1c\x7f\xfe\xfc\x39\r\x1by\xe1\xd7\xaa\x8dJ\xba\x81\x81\x1\x90\xb4\xa0\x34l\xc8 \xe2\xe2\x9e\xd1\xa5kw\x9e \xef\x45\n!\x84\x10\xe2\xab\xf1Y\x16\x86v\xee\n\xe1\xf4\xe9s\x1c\t\xdd\x9dn\xbe{\xf\x1e\xb2o\xdf\x1\x1a\x35j\xa0\x92\xbeu\xeb\xf6\xcf\xd1\xac\\\x15\x16v\t\xc7Zv8\xd7q\xca\xed\xa6\b\x91\x63\x32;\x16\x88\x9c\xd7\xb3g\xb7\xdcn\x82\x10\x42\b!\x84\x10\xdf\x8c\xd8\x7f\xfe\xe1\xe7\x9f&\xd0\xae\x43Gf\xcf\r\xc4\xa9\x96\x83\xca\xf1\xe7qq\x94\x33\x33\xa7z\x8d\x1a\xa9\x9e\x7f\xea\xd4I\x8e\x1d=B\xc8\x81_122\x2@__\x9f\xa1\x83\x7f\xa0\x91Wc\n\x16,\xc8\xa3G\xf\x99\x1e\x30\x95\x45K\x96\x62kk\a@E\v\v\xea\xd7s\xe5\xec\x99\xd3\xd8\xda}}_\xa0\x13\x42\b!\xc4\xe7\xf1\xc9\x43\xc9\xc5\xc7\xc7\x33\x66\xfc$\xc6\x8d\x1d\x86~\x81\x2\xe9\xe6m\xdb\xda\x9b\x19\x33\xe7\xaa\x84N\x8a\x8d}\xc6\xb4\x99\x81\xf8\xf7\xea\x94\"\xff\xc9S\xa7\xe9\xda\xad\x17\xd6\xb6\x8e\xfc\x30h(\x7f\xfe\xf9\xa7\xf2\xd8\xfe\x3\a\xe9\xe3\xdf\x1f[{'<<\x1b\xb3`\xc1\"^\xbdz\xa5<~\xf5\xda\x35\x6\f\x1c\x8c\xb5\xad#\xe\xb5\\\x18>b4o\xde\xbcQ\x86\xb2\xfa\xe3\x8f\xf7\x65\xed\xf8\x65'\xc6&f\xca\xd7\x1\x1\x33\xf8y\xf2T\x96/\xf\xc6\xc3\xb3\x31\x83\x6\xf\x3 ..\x8e\x19\x33g\xe3\xea\xd6\x80&\xcd|Y\xbf\x61\x13\t\t\t)\xda=l\xf8(\xa6L\v\xe4\x97\xdd\a161K3<\xd6\xf7\x3\x6\x31n\xdc\x4\x95\x34\vK\x1b\x36m\xde\x42\\\\\x1c\xaen\r\x18=f\x9c\xf2\xd8_\x7f\xfd\x45\xb9\xf2V\xacY\xbb>\xdd~\x16\"7de,\xc8\x8c\xf4>\x1f\xb1\xb1\xcf\x30\xb7\xb0\x1\xa0\x89O[\x8cM\xcc\x38y\xea\xb4\x32\xdf\xa1\x43\xa1t\xee\xd2\x83*\xd5\xec\xe9\xd4\xb9;aa\x17\x95\xc7\xc2.^b\xd4\xe8q8\xd4r\xa1m\xbbN\x9c;w>\xcd\x36\x1c:\x14J\xbb\xf6\x9d\xb1\xb0\xb4\xc1\xc3\xb3\x31+\x82W\xa9\x1c\xdf\x1b\xb2\x1f\xff\xbe\xdf+\xc7\xa8{\xf7\xee\x7fT\xfb\x17.Z\xcc\xd8\x1f\x3\b=z\nc\x13\x33\xda|\xd7\x41y\xee\xdd\xbbQ\f\x19:\x2[{'\xda\xb5\xef\xcc\xc9\x93\xa7\x94\xc7\xd2\x1a\xb3\x92\v\b\x98\x41\xfb\x8e]\x95\xaf\xd3\x1a#S\x13\x11\x11I\xbf\xfe\x3\xb1\xb6u\xa4K\xd7\x9e*uGGGS\xbcTEv\xef\xd9K\x1f\xff\xfe\xd8\x39\x38\x33l\xf8(\xa2\xa3\xffV)#\xbd\xf1< `\x6#G\x8d%`\xdaL<<\x1b\xd3\xd0\xcb\x9bM\x9b\xb7H\xd8;!\x84\x10\x42\b\xf1\xd5\x32\x30\x34\x64\xcb\xf6_h\xde\xc2\x97\xfc\xf9S\xfe}\xf4\xec\xd9\x33t\xd3\xd9\x93u\xef\x9e\xdd\x34i\xdaL\xb9(\x4P\xb3Vm\x12\x12\x12\x39s:\xe9\xff\xe3\xbf\x1d?N\xc1\x82\x46T\xaf\xfe~q\xa9\x44\x89\x92\xb8\xb9{p\xf0\xe0\x81Ox5B\b!\x84\xf8\xda}\xf2\x85\xa1\x85\x41\xcb)Q\xdc\x94\xa6\x8d\x1b\x66\x98\xb7}\xbb\xef\xb8\x1f\xfd\x90\xfd\a\xe*\xd3\xb6m\xdf\x41\x5\xf3\xff\xe1\xee\xee\xa6\x92\xf7\xf7\x13'\xe9\xda\xdd\x9f\x46\r=\x99>m\x12\x9a\x9a\x9a\xb4j\xd3\x91\x7f\xfeI\xda{\xe3J\xe4\x15*YX0i\xe2\x38zt\xef\xcc\xec\xc0 \x96.[\x1@L\xccS|Z|\x87\x91\x91\x11sf\a0z\xe4P*T(O\x9e z\x82\xc8\xcb\xa7\xd1\xd5\xd5\xc5\xc1\xde\x8eW\xaf_\xb3tY0\xad[\xb5T9\xaft\xa9R\xf8\x34k\xcc\x95\xab\xd7\xa8\\\xb9R\xb6\xeb\xafQ\xbd\x1a\x43~\xe8\xcd\x90\xa1\xa3\xe8\xda\xb9=\xbf\x9d\x38\xcd\xfe\xbd\xdb%N\xb0\xf8\xe2\x64u,\xe8\xddo\xe8G\xd5\xa7\xa9\xa9\x81\x95U\x15\0\xec\xedl\x95\x9f\xb3\x97/_2z\xec\x44\x2&OP.6\xd7\xaa\xf9>d\x83y\xb9RT\xaeT\x91\xef\xbek\r@\xe5\xca\x95Y\xbb\x61\a\x17.\x84Q\xacXQ\x95:\xae^\xbd\x86qaC\xbc\xbd\x9b\xa2\xa3\xa3\x83]*\xedX\xb5|\xbe\xb2\x9e|zz\xb4l\xd3\x95{\xf7\xefQ\xb2\x44\xfa{\x8a\xa5\xd5\xfe\x2\x5\n\xd0\xb0\x81\az\xba:*c\xc7\xfa\r\x1bq\xb0\xb3\xa6G\xf7\xa4'~\x1c\xec\xed\x38\x7f!\x8c\xbd{B\xb0L\x96/\xf9\x98\x95\x9e\xac\x8c\x91\xb3\x66\x5\xd2\xdf\xbf\x1b\xdd\xbbu\x1\xc0\xc9\xb1\x36O\x9f>e\xe6\xac@\xd6\xd9\xbf\xef\x95\x15K\xe6\xe2\xe9\x99\xb4\xaf\x94\x65\x15K\xaa[;q\xf8\xf0\x11<<\xea\x65\x38\x9e\xab\xab\xa9\xa3\xa1\xa1N\xbf~}\0pv\xae\xc3\xfe\x3\xbfr\xe4\xc8\x31\t\xc7)\x84\x10\x42\b!\xfe\x93Z\xb5n\x83\xa1\xa1!\x5\n\xe8\x13\x1d\xfd\x80\x95\xc1+8t\xf0\0\xcbV\xac\x44WW\x8f\xc8\xc8H\x9a\xfb\xfa\xa6\x38\xafpac\x9e\xc4$- E?x\x80\xbe\xbe~\x8a<\x5\xf4\v\x10u\xf7n\xaa\xf5V\xaa`\x96jz\xf8\x95\xeb\x1fq5B\b!\x84\xf8\xd2\x65{a(:\xfa!+W\xaf\xa7O\xaf.hkk\x3\x10\xbcj=VU*S\xd5\xca\x32\xd3\xe5\xf8x7#`\xfa\\\xe\x1c\x38\xc4\xe3\xc7\x8f)W\xb6\x34\x35k:\xa8\x84sz\xf5\xea\x15G\x8f\x9f\xe1\xe8\xf1\x33\f\x1a\x36^\xe5\xfc\xd8\xd8\xa4o\x98\xbf|\xf9\x92]\xbb\xf6p(\xf4\x30\x37o\xde\xe6|X\xa4\xf2)\x1d\x33\xb3rx5p\xa5\x85_{Z\xfb\xf9\xe0\xe6\xea\x82\x8d\x8du\x96\x16T<=\x9cU&Xo\\\xbf\xc1\xcbW\xf1\x94.g\xa5\x92OOW;\xd3\x65\x66G\x8f\xee\xdd\x98\x1c\x10\xc8\xa0\x61\xe3Y\xbf:\x88\"E\x8a|\xd6\xfa\x84\xc8\xc8\xa7\x18\v\x8e\x86\xee\xa2\xbc\xb9\xb9J\xda\xae\xdd{\xe8\xd8\xa5\xefG\xb5\xed\xee\xdd(\x1e\x44?\xa6\x42\xc5\xf2\xa9\x1e\xd7\xd5\xd1\xc1\xc6\xba\xba\xf2u\x91\"\xc6\x18\x19\x16 \xf6\xd9\xb3\x14y\x1d\x9dj\xb3\x30h\x19\r\x1ay\xd3\xdc\xa7\t\xf5\xdc\\17W\xfd#\xca\xc8\xc8P\xf9{\xa9R\xa5\0x\x1e\xf7\xfc\xa3\xae!5aa\x97\xd8\xbes?\xdbMT\xeb\xef\xdc\xc1O\xf9\xfb\x87\x63Vz2;F\xbe}\x9b\xc0\xfe\x83Gh\xe9\xeb\xa3\x92^\xc7\xc9\x91.=\xfa\xab\x84\x5-\\\xb8\x90\xf2w\xe3\xc2\x85\xa9Q\xdd\x92\x9b\xb7nej<\apwS]\0\xb2\xaeQ\x8d\x98\x98\x98L]\x8f\x10\x42\b!\x84\x10_\x9b\xe6-T\x17}\xacmlquv\xe4\xd8\xd1\xa3x\xd4\xf7\xa4\xec\xff\xca\xf2,\x95\xbfSbb\x9eP\xb8pa\0\n\x16*\xc8\xa5\x8b\x17S\xe4\x89\x8b\x8b\xa3t\x99\x32\xa9\xd6+\v@B\b!\xc4\xb7)\xdb\vCzz\xba\x84\xec;\xc8\x95\xab\xd7\bZ0\v\x85\x42\xc1\xa2\xc5\xcb\x99;kj\x96\xca\xd1\xd7/\xc0\xa0\x81\xfe\xf4\xe8=\x80\x84\x84\x44V\a/D\xfd\x83\xa7\x85\xb4\xb4\xb4\xd0\xd0P\xa7g\xb7\xf6t\xea\xd8N\xe5\x98\x81\x81\x1\0\xfe}\a\x90'O\x1e\xbau\xebL\xd1\"\xc6\xac\b^\xc5\xf4Y\x8b\0\xd0\xd6\xd6\x66q\xd0|\"#\xaf\xf0k\xe8\x61\x6\xe\x1a\x8eq\xe1\x42\xacX\x1e\xa4,GA\xd6\xf6\xae\xc8\x97?\x1f\0\xa7~?\x80\x66\xb2\xc9S55\xb5,\x95\xf3\xa1\x8c\xf6\xd0H\x1e\x82N;\x9d\xf8\xc3\x42\xe4\x94O5\x16\x64\x46V\xf7\x98y\xfe\xfc\xf9\xbb\x13\x33}\xce\x87\xe3\xcf;%K\x94\xe0\xe0\xfe]\x9c>}\x86\x83\x87\x42\xf1h\xe0M\xdb\x36\xcd\x19\x37vt\xaa\xf9S\x1b\n>\xd5\x1e\x39\x86\x86\x6T\xaaX\x8e\x95+\x82T\xd2\xb5\xb5\xb3\x37&\xa4\x37\x46\x16H\xb6?Tbb\x2\xaf^\xc7\x93\x90\x90\xa8r~\x9e vl\x15\x42\b!\x84\x10\xe2kR\xb4hQJ\x97.\xc3\xfd\xfb\xf7\0\x30\x37/\xcf\xad[\xb7T\xf2\xbc~\xfd\x9a\x9b\x37nR\xb4h1\0LLL\xd8\xb0~\x1d\xf1\xf1\xf1hii)\xf3\xfdq\xe7\xe\x65\xca\x94\xcd\xb9\xc6\v!\x84\x10\xe2\x8b\x97\xed=\x86\xf2\xe5\xd3\x63\xdd\xea%\\\b\xbb\xc4\xc2\xa0\xe5\x1c>r\x1c===\x1c\xecm\xb2\\\x96w\xb3\xa6\xbc|\x15O\xfc\x9b\xb7\xd4\xae]+e#\xd5\xd5i\xea\xe5\xc1\x8d\x1b\x37\x31\x35\x35\xa5x\xf1\xe2\xca\x9f|\xf9\xf2\xf1\xf8\xf1\x63v\xec:@\x9b\x36~T\xabjE\xb1\x62\xc5\b\xf\x8fT)CMM\r\v\x8b\x8a\xf4\xee\xd5\x83\xf5kWp\xfc\xc4\x39\xc2\xc2.\xa1\xab\xab\v\xc0\x9f\x7f\xbe\x7f\xac\xfa\xef\xf\x36IO\x8dY\xb9r\xca\xbc\xc9\xdb\x63jj\x9a\xc1\x99\xaa\x92O\x9e\x1a\xe8\xebs\xee|\x98\xca\xf1G\x8f\x9f\xaa\xbc^\xbbn\x1d\x66\xff+I\xe7\xe~\xfc\x30h8O\x9f\xaa\x1e\x17\"\xa7}\xca\xb1 =\x19}>\xde-\x1c\xbcy\xf3\x46\x99\x66\x62\x92\xf4\aRd\xe4\xd5O\xd2\x86 \x95\xf1\xa7P\xa1\x82\xd9\xb9,e\xfd\xa9\x8d\x91\xc9iiiQ\xcb\xa1\x6\xc7\x8e\x1fWI?w\xfe<\xeenu\xd0\xd4|\xbf\x30\x94|\xbf\xb5\xa7O\x9fr\xe6\xec\x45\xcc\xcd\xcd\x32\x1c\xcf\x85\x10\x42\b!\x84\xf8\xd6(\x14\n\x12\x13U\xbf|\xf5\xf8\xf1#\xee\xdc\xb9M\xe9\xd2IO\xfa\xd4s\xf7`\xc7\xb6m<\xfc\xfb\xfd|\xc5\xd9\x33\xa7\x1\xb0\xb1M\n\xe9l\xefP\x93'\x8f\x1fs\xfa\xd4)e\x9e\x87\xf\x1f\xb2k\xe7/\xb8\xd6\xab\xf7\xb9/C\b!\x84\x10_\x91\x8f\xda\x63\xa8`A#\x16/\x9c\x8d\x8fo;\xca\x9b\x9b\xd1\xaa\xa5O\xc6'\xa5\x42_\xbf\0G\x7f\xdd\x85\x8e\x8ev\x9a\xe1\xdd\xfa\xf6\xed\x45\xddzM\x18\x33v !>\x97O5\x16\xa4'\xa3\xcfG\x81\x2\x5\x30\xfb_I\xb6n\xdb\x41\xfe\x2\x5(\\\xa8 \xc5\x8b\x17\xa7W\xb7v\x8c\x18\x35\x9e\xc4\xc4\x44LMM\xb8y\xeb\x16\xe5\xcd\xcd\xb1\xb0\xa8\x98\xa5\xfa\xf7\x1f\x38\xc8\xcd\x9b\xb7\xa8\\\xc9\x2---\xe\x1e\xfc\x95\x8a\xe5\xcb\xa2\xafo\xc0\xe3\xc7\x8f>[\xfb\xcb\x94)\xc5\xa9\x33\x17\xd9\x7f\xe0 \xfa\x5\n`kkC\xd3\xa6\x8dY\xb4x9={\xf5\xa5O\x9f\x1e\xe8\xeb\xeb\x13\x11\x1e\x81\x8d\x8d\x35\x65\xcb\xa6\x1e\"\"=\xe9\x8d\x91\x1f\xea\xdf\xaf\xf\xde-\xda\x63hh\x88\x9d\xad\r\xe1\x11\x91\xcc\x9d\xb7\x94}{\xb6\xa8\xe4\v^\xbd\x19++KJ\x95*\xc5\xca\x95kp\xac\x65\x8b\xc3\xbf{\x10\xa5\x37\x9e'\xff\x66\xa3\x10\x42\b!\x84\x10\xdf\x82;\xb7o3r\xc4\x30\xbc}|(Z\xd4\x84\xb8\xb8g\xacY\xbd\x92\xda\x8eN\xd4\xac\x99\xf4\xe5YGG'jX[3\xe8\x87\x1\xb4\xef\xd0\x91\x17/^0\xe5\xe7I\f\x1c\x34X\xb9\xaf\x90\xa9iqz\xf6\xee\xc3\xd0!?0h\xf0P\n\x14(@\xf0\x8a\xe5\x34h\xd8\b+\xab\xaa\xb9y\x89\x42\b!\x84\xf8\xc2\x64\xfb\x89\xa1w\xaaZY\xd2\xb9\x63[\xc2.^\xa2\x85O\x93l\x97S\xbe\xbc\x39%K\x96L\xf3x\xc5\n\x15\xf8u\xff\xe\x62\x63\x9f\xd1\xbdG_\x86\xe\x1bMll,\xaf^\xbd\"O\x9e<,_\xba\x80\x84\xc4\x44\xfa\x7f?\x94\x83\a\x7f\x65\xea\xa4\xd1\xca=\x86\xb4\xb4\xb4PS\x83)Sg\xd0\xb6}7~?y\x9a\xad\x1b\x83)U\xaa$\x9a\x9a\x9a\x4\xce\x9d\x89I\xb1\xa2\x8c\x1c=\x81\x3\a\xf\x31i\xc2\x88L\xb5y\xe2O\xe3\xe9\xdd\xab+K\x97\x5\xd3\xea\xbbN\xac\xdf\xb0)K\xe1\x8e:vh\xcb?\xb1\xcf\x18\x37~\"111\xd4uqf\xf6\xf4\x9f\xd8\xbe\x63\x17S\x2\x66\xa2\xaf\xafO\x83\xfa.@RH\xac\xef\a\xe\xa1K\xc7\xd6\xd4\xaeU\x13]]]&O\xfa\x91\x85\x8bWq\xe8Ph\xa6\xeb\x14\xe2s\xf9TcAZ\xd2\xfb|@\xd2\x13/\x8b\x16\xcc\xe1\xde\xbd\a\xf8\xf7\x1d\xc8\x85\vI\xb1\xb5\x87\xe\x1d\x44\x97\xce\xed\x98\x33w>\x9d\xba\xf4\"4\xf4H\xb6\xc2\x92\x19\x19\x19q\xe3\xc6M\x86\xe\x1f\x43\x8f^\xfd\x1\b^\x1e\xa4\xf2\x94\xcc\xe7h\xbf\x9b\x9b+C\a\xfd\x9f\xbd\xbb\x8e\xaa\xfa\xfe\xe3\x38\xfe\x4\x5\xa4\x44\xc5@\xc4\x16\xbb\x45\x62\xce\xe\x14\x44\x31\x66\xe7l\xc4n\xdd\x66\xeb\xc2\xee\xc0\xee\xee\x9a\x39k\xb6\xdb\xec\xce\xa9(6\b\"\xf1\xfb\x83\xed\xfev\a(&\xdbx=\xce\xb9\xe7x?\xf9\xfe~\x11\xe\x97\xf7\xf7\xf3\xf9\xf8\xd3\xaf\xff &M\x9e\x46H\xc8\vlllX\xb3j\t\x85\n\x15`\xe0\xc0\x61\xb4m\xe7\xcf\xd1\x63\xc7\x89\x8e\x8e\x8ao\xfa\xd7z\xdd\xcf\xc8\xbf\xfb\xbc\xd4g\xac^1\x8f_\x7f;M\xe7\xae\xbd\x39}\xfa\f\xdb\xb7\xad\x89\x95hk\xd6\xb8\xe\xcb\x96\xaf\xe6\xab\xaf\x87\xe0\xec\x9c\x93\xa9S&\x18\x12\xff\xaf\xfby.\"\"\"\"\x92\xd4\xa4N\x93\x86\x9a\xbe\xb5\xd8\xb9\x63\a\xfd\xfb\xf6\x66\xd9\xd2%T\xaa\xec\xc9\x98q\xe3\x31\xff\x63;ys\v\v\xc6O\x98\x84K\xc9\x92L\x9c\x30\x8e\xcd\x9b\x36\xd2\xff\xab\xaf\xa9W\xbf\x81\xd1X~\x1d;\xd1\xa5kw\xd6\xaeY\xcd\x8c\xe9S)]\xa6,C\x86\xe\x8fw\xcb\xecm[\xb7\x18\xbd\x44\x44\x44$i0\xb9p\xe5Ntf\xc7\x98\x83\no\xddy@\xee\x1c\x19\xdfz\x90\xe8\xe8h\xc2\xc2\xc2\xb0\xd4\x99\x37\"\xff(\xa1\x61\x11@\xcc\xf7\xf6\x9f\xdf\xe7\xf1\xf9k\x1b\xfd,\x90w\x15\x18\x18H\xa1\x62\x9f\xb3y\xfdR\\\\J$v8\"\"\"\"\xf2\x1fw\xf1\xea]\xa3\xcf\x31o\xf3\xb9\xe7yH\xf0G\x8f\xef\x9f\xac@^g\xce\x9c\xbf\x94\xd8\x61\x88\x88\x88\xc8'bk\x1ds\x8c\xc3\xad;\xf\xde\x7f\xc5\x10\xc4<\xe9\xae?\x4\x8b\x88~\x16\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\xfc\xb3}\x90\xc4\x90\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\xfc\xf3%O\xec\0\x44\x44\xe4\xbf#C\x86\f\xdc\xbf\xa3\xed(DDDDDDDDD\xfe\xa9\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11I\x82\xa6L\x9a\x18\xab\xcc\xcf\xbfS\"D\"\"\"\"\x9f\x92\x12\x43\"\"\"\"\"\"\"\"I\x90\x92@\"\"\"I\x93\xce\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11I\"\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11I\"\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11I\"t\xc6\x90\x88\x88\x88\x88\x88\x88\x88H\x12\xb4m\xeb\x16\xa3\xf7\x9eU\xab%R$\"\"\"\xf2))1$\"\"\"\"\"\"\"\x92\x4)\x11$\"\"\x92\x34i+9\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91$B\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91$B\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91$B\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91$\"yb\a \"\"\"\"\"\"\"\"\x9f\xde\x94I\x13\x63\x95\xf9\xf9wJ\x84HDDD\xe4SRbHDDDDDDD$\tR\x12HDD$i\xd2Vr\"\"\"\"\"\"\"\"\"\"\"\"I\x84\x12\x43\"\"\"\"\"\"\"\"\"\"\"\"I\x84\x12\x43\"\"\"\"\"\"\"\"\"\"\"\"I\x84\xce\x18\x12\x11\x11\x11\x11\x11\x11\x11I\x82\xb6m\xdd\x62\xf4\xde\xb3j\xb5\x44\x8a\x44\x44\x44\x44>%%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x92 %\x82\x44\x44\x44\x92&m%'\"\"\"\"\"\"\"\"\"\"\"\x92\x44h\xc5\x90\x88\x88\x88\x88\x88\x88\x88H\x2\x84\x84\x84\xf0\xfb\xef\xb7\x89x\xf5\xca\xa8\xdc\xda\xda\x86\xac\xd9\xb2%NP\"\"\"\"oI\x89!\x11\x11\x11\x11\x11\x11\x11\x91\x37\x38|\xe8\x10={t\xe5\xd1\xc3\x87\xb1\xea\xea\xd5o\xc8\xc0\xc1\x43\x12!*\x11\x11\x11\x91\xb7\xa7\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc8k\x84\x85\x85\xd1\xbbgw\xbc\xbc\xabS\xb3\xa6/\xa9R\xa7\x36\xaa\xb7\xb0\xb0H\xa4\xc8\xde\xcf\x94I\x13\x63\x95\xf9\xf9wJ\x84HDDD\xe4SRbHD>\xba\xc8\xc8H\xc2\xc3\xc3\xb1\xb4\xb4L\xecPDDDDDD\xdeZPP\x10\x41\x41\xfh\xda\xac\x5NNN\x89\x1d\xce\a\xa3$\x90\x88\x88H\xd2\x64\x9a\xd8\x1\x88\xc8\x7f\xdb\xa3G\x8fq\xfd\xac\";w\xed\x8d\xb3\xfe\xd7\xdfN\xd1\xabw?>/S\tW\xf7\x32\xb4i\xeb\xc7\xaa\xd5k\f\xf5w\xee\xdc\xe5\xbb\xefG\xe1\xedS\x9b\x82\x45\\\xa9\xdf\xa0)3\x3\x66\xf3\xec\xd9s\xa3qN\x9c\x38IzGg\xd6\xac]gT\xfe\xf0\xe1\x43\n\x17sg\xfc\xf8I\x1f\xfe\xe2\x12\xd1\xb4i3\xf0\xf3\xef\x42tt\xf4;\xf5?}\xfa\f\x83\x87\f\xa7\x8a\xa7\xf^\xde\xbe\f\x19:\x82K\x97.\x1b\xb5\x39y\xf2\x17\xd2;:s\xe3\xc6\xcdX\xfd'N\x9cL\xbd\xfa\x8d\xb9p\xf1\"\xe9\x1d\x9d_\xfb\xbav\xed\xda;\xc5(\"\"\"\"\xf2O\x91!C\x6\xac\xac\xac\x62\x9d-$\"\"\"\xf2o\xa4\x15\x43\"\xf2Q\xf5\xee\x37\x90\x92%\x8aQ\xdd\xdb\x33V\xdd\x81\x83?S\xb7~\v\xbe\xee\xdf\x1d\xafj\x9e\x44\x44\x46r\xf3\xe6-\xee\xde\xbd\a\xc0\xdd\xbbw\xa9\xe1[\x8f\x8a\x15\xca\xd0\xb5\xb3\x1f\x66\x66\x66\x4\x6\xde\xe7\xd8\xf1\x13XZ\xa6\x30\x1a\xabx\xf1\x62\xf4\xea\xd6\x81\x1_\xf\xa3\xd4g\x1e\xa4O\x9f\x1e\x80\x31\x63'\x90\xd1!=m\xda|\xf9\xf1/\xf6\x13\x8a\x8e\x86\xe8\xa8wK\n\xadX\xb1\x8a\xce\xdd\xfb\xd3\xb1}K\xbav\xedHHp\b?n\xdfI\xf9J>L\x9f\x32\x6o\xefj\t\x1e\xcb\x31\x63\x46\xd6\xadZ`x?z\xec\x4\xac,-\xe9\xd0\xbe\x8d\xa1,]\xbat\xef\x14\xa7\x88\x88\x88\x88\xc8?\x85\x99\x99\x19]\xbau\xc7\xbf\x63{z\xf5\xeeGTT\xa4Q}\x9a\x34i(R\xb4X\"E'\"\"\"\xf2v\x94\x18\x12\x91\x8f\x66\xe3\xa6m\x1c=z\x82\xbd{6\xc7Y?3`\xe\xfe\x1d\xbe\xc4\xaf\x43\xbb\x38\xeb\x37o\xd9\x86\xad\xad\r#G\f\xc5\xd4\xf4\xff\v\x1c\xeb\xd7\xff\"\xce\xf6\x1d:\xb4\x65\xe3\xe6m\x8c\x1a=\x8e\xef\xbf\x1b\xc1\xc1\x83?3s\xf6\x62\xb6m^\x89\x95\x95\xd5\xfb_\xd0?H\x87\xem\xdf\xa9\xdf\x95+W\xe9\xdc\xbd?\v\xe7N\xa5\x62\xc5\n\x86\xf2:uj1y\xf2T\xfc\xbb\xf4\xa6X\xb1\"8::&h<[[[<<\xdc\r\xef\x33.Y\x86\x8d\x8d\x8dQ\x99\x88\x88\x88\x88\xc8\x7f\x81\xa5\xa5\x15\xd7\xae^\xc5\xef/\xf\x41\xfd\xa9^\xfd\x86J\f\x89\x88\x88\xc8\xbf\x86\xb6\x92\x13\x91\x8f\"<<\x9c\x81\x43\x46\x32xP?\xecR\xa6\x8c\xb3MP\xd0\x43\xee\xdf\xbf\x1f\xefvh\xcf\x9f?\xe7\x41\xd0\x43^\xbe|\x99\xa0\x39mll\xf8\xfe\xdb\xa1\xcc]\xb0\x82M\x9b\xb6\xd0o\xc0 \xfa\xf5\xee\x44\xb1\xa2\x45\fmF\x8d\x1a\xcb\xb7\xdf\xfd\xc0\xdc\xb9\xf3\xf1\xacV\x83^\xbd\xfbq\xef^ \x13&L\xa6v\x9d\x6\x14.\xe6N\xdbv\x1d\x39u\xea\x34\0\xc7\x8e\x1d'\xbd\xa3\x33\xe7\xce\x9f\x37\x8c\x11\x11\x11I\xa9\xd2\x15Y\xbe\x62\x65\xac\x18\xa2\xa2\xa2X\xb1\x62\x15u\xeb\x35\xa2L\xb9*\x8c\x1e\x33\x8e\xe7\xcf\x63\xb6\xbdk\xde\xb2\r\xdd{\xf4\x36j\xbfq\xe3\x66\n\x17s',\xec\xe5k\xfb\xfe\xdd\xa8Qci\xde\xf2\xff\x1fH/\\\xbcH\xf7\x1e\xbdqq-\x8dG\xa9\xf2\xf4\x1f\xf0\r\xaf\xe2\xd8\xe6\x62\xde\xfc\x5T\xabR\x8e\n\x15\xca\x1b\x95\x9b\x9a\x9a\xd2\xaaUK\xd2\xa7\xb3g\xc5\x8a\xd5o\xba\xd5\"\"\"\"\"IJpp0C\a\xf\xa2k\xf7\x9e\xec\xd9{\x80\x93\xbf\x9d\x31z\r\xf8\xfa\x9b\xc4\xeQDDD$\xc1\x94\x18\x12\x91\x8f\x62\xfa\xcc\xb9\x64v\xca\x84o\r\xefx\xdb\xb4l\xd1\x84%\xcb\xd7\xd3\xaf\xff\xd7\x1c=z\x8c\xf0\xf0p\xa3zO\xcf\xca<\x7f\x1e\xc2\x97\xad\xdb\xb3}\xc7\xceX\xe7\n\xc5\xc5\xcd\xcd\x95N~_\xd2\xb2Mg\xae\\\xbdI\xdb\x36\xad\x63\xb5\x19\x33~\x6\x87\xe\x1f\xa5M\xeb\x16\xd4\xac\xe9\xc3\xb3g\xcfx\xf8\xf0!\x8d\x1a\xd5\x63\xc2\xd8\xefH\x95\xca\x8e/\x1a\x34\xe7\xc1\x83 \x8a\x15+J\x81|\xb9\xd8\xb3\xfb\xffg$\x9d:}\x9a\xab\xd7oS\xa1|\xb9\xd8\xd7==\x80\xc5K\x96\xe3\xef\xd7\x8e\xfe}{p\xec\xf8I\x6|5\x90\xe8\xe8h\x1a\xd6\xaf\xcb\x92\xe5\xebx\xfc\xf8\x89\xa1\xfd\xba\xf5\x1bi\xdd\xb2))RX\xbc\xb6\xef\xeb<~\xfc\x84:_4!M\x9a\x34L\x9c\x30\x8ao\xbe\xeaK\xde\xbcy033\x8b\xd5\xf6\xd0\xa1\x63\xb8\xbb\xbb\x62\x62\x62\x12\xab\xce\xca\xca\x8a\n\xe5Ks\xea\xf4\x99\xd7\xce'\"\"\"\"\x92\xd4<}\xfa\x84W\xaf\xc2\xf1\xa9Q\x93t\xe9\xd3\x63nnn\xf4J\x9e\xfc\xdf\xb9!\xcb\xb6\xad[\x8c^\"\"\"\x92\x34\xfc;\x7fs\x11\x91\x7f\xb4\xd0\xd0P&O\r`\xe9\xa2Y\xafmW\xa7v-\xf2\xe4\xce\xcd\x92\xa5\xcb\xa9Q\xbb\x31Y\x9c\x32\xd2\xd1\xaf\r>\xd5\xbdH\x9d:5\xf9\xf2\xe6\xe5\xe7\xfd;X\xb3v\x1d]\xba\xf5%44\f\xbfv-\xf9\xe2\x8b:d\xcb\x96\x35\xdeq?/\xe5\xc1\xc4)\xb3\xc9\x91=3\xd6\xd6qo!7i\xe2X\xa3\xfo\x83\a\xff\xff\t\xbf|\xf9\xf2\x31w\xc1\n\xce\x9e=K\xd9\xb2\x65h\xd1\xbc\x31\x33\x3\xe6\xd2\xb6m+\x92%K\xc6\x8e\xed;i\xd2\xb0\x36i\xd3\xa6\x35\x1a\xf3\xd1\xa3\xc7\f\x19\x31\x9a\xcd\x1b\x96\x1bV)988P\xc5\xab.\xfd\xfb\xf5\xe1\xf3\xcfKakc\xc5\xcf\x87\xe\xe1U\xad*\xf7\xee\x5\xb2n\xe3vz\xf6\xec\xfa\xc6\xbe\xe\xe\x19\xe2\xbd\xde\xdb\xb7os\xff\xc1\x63j\xf9\xd6\xa0@\x81\xfc\xf1\xb6{\xf5\xea\x15\xbf\x9c:O\xdb\x36\xa9\xe3m\x93)\x93#\a\xe\x1e\x8e\xb7^DDDD$)rp\xc8H\x1a{{\x9e=}\x8a\x83\x83\x43\x62\x87\xf3\xc1xVM\xf8\xf9\xa2\"\"\"\xf2\xdf\xa1\x15\x43\"\xf2^\x2\x3\x1f\x30j\xcc$\xc2\xc2\xc2\fe\xf3\x17.\xa3H\xe1\x82\x14-R\xe8\x8d\xfd\v\x16,\xc0\xf0\x61\x83\x39\xfd\xcb\x41\xfa\xf6\xee\xc6\x84\x89\xd3h\xd0\xa8\x39\xc1\xc1\xc1\0\x38:f\xa4\xa3_{\x8e\x1f\xd9\xcb\x9cY\x93\x39v\xfc$e+xq\xe1\xe2\xc5\x38\xc7\v\r\r\xe5\xbb\x1f\xc6\x2p\xfe\xe2\x35\x8e\x1e=\x16\xabM5\xcfr\xb1\x9e\xe8;s\xe6,\xa3\x46\x8f\xa3\xce\x17\rq/U1f\xac?\xae\xa9r\xa5\x8a\\\xbc|\x83\xb3g\xcf\xf1\xf2\xe5K\xe6-\\\x8a\xafo\x8dX\xe3\xde\xb8y\x93\xc8\xc8(<\xbd\xea\x92\xde\xd1\x99\xf4\x8e\xceT\xf1\xaa\v\xc4l=acc\xc3\x97-\x1a\xb1qS\xcc\x93x{\xf7\xed\xa3t)\x17r;;\xbf\xb1\xef\xeb\x38;\xe7\xc2\xc7\xab\"_4h\xce\xb0\xe1\xdfr\xe8\xd0\x61\"##c\xb5\x33\x33\x33#o\xee\xec\xdc\v\f\x8cw\xac\xfb\xf7\xefS\xa4p\x1\xa3\xb2h^\xbf\x62IDDDD\xe4\xbf.\"\"\x2;;;j\xd5\xac\xce\xecY\x1,Z\xb8\xc0\xe8\xb5{\xd7\xae\xc4\xeQDDD$\xc1\xb4\x62HD\xde\x8b\xb5\xb5\x15\xdb~\xdc\xc9\xf9\v\x17\x99\x39m<\xd1\xd1\xd1\xcc\b\x98\xcb\xa4\xf1?\xbc\xd5\x38\xf6\xf6\xf6\xd4\xaaU\x13'\xa7Lx\xd7l\xc8\xd9\xb3\xe7pu-i\xa8\xb7\xb4\xb4\xa4\\\xd9\x32\x14/V\x94\xfc\x85\xdc\xf8\xe9\xa7}\xe4\xc9\x9d;\xd6\x38\x1\x1\xb3y\xfa\xf4\x19\x97\xce\x1d\xe3\xbb\xefG\xd3\xb3\xf7\0\x36\xae_\x89\xad\xadm\xbcs\x1f?q\x92\xba\xf5\x9a\x31\x66\xd4\x30j\xd7\xaa\x89\x99\x99\x19%\xdc\xca\x13\x12\x12\x2\xc4$\xa7\xea\xd5\xf1\x66\xd7\xae=<\x7f\xfe\x9c\x14\x16\x16\x94t)\x11\xfb^X\xc5\xacN\x9a\x37k\x12\x85\n\x19'W2d\x88Y\xf1\xe3\xed\xed\x45\xc5*\xbe\f\x1e\xf8\x35\xcbW\xac\xa6I\xa3\x6\x98\x98\x98$\xa8o|R\xa4HA\xc0\xcc\xa9\x9c;w\x9e\xdd{~\xa2G\xaf\xfe\xa4O\x97\x96ysg\x92\xf2o\xe7;\xb9\x96,\xce\xee={\xf1\xeb\xd0\xeSS\xe3g\x3\xc2\xc3\xc3\xd9\xb7\xff\x10\r\x1b\xc4$\xa4R\xa6\x8c\xb9g\xcf\xe3\xd8\xc2\xef\xd9\xf3`2gvzm\\\"\"\"\"\"\xff\x15w\xef\xde!y\xf2\x98\xad\x9a\xb7n\xd9\x14\xab\xbeT\xa9\xd2\x94\xafP\xe1S\x87%\"\"\"\xf2N\x94\x18\x12\x91\xf7\x62\x63\x63\xcd\xd2\x45\xb3\xf0\xf4\xae\xc3\xf4\x99s\xc9\x93;\x17\xd6\xd6\xd6x\xb8\x97|c\xdf\xe8\xe8\xe8Xg\xddXZZ\x2`kk\x1bg\xbd\xb9\xb9\x5VV)\xb0\xb3\xb3\x8b\x35\xde\xa9S\xa7\x19:r\x1c\xcb\x97\xcc\xc2\xce\xce\x8e\x1e\xdd\xbb\xb0y\x8b\xf\x13'M\xa5\x7f\xbf\xde\xf1\xc6q`\xff\x41\x8a\x15)@-\xdf\x9a\0\x86\xd5Oa\xa1\xff_\x5U\xa7\xb6/}\xfa}\xc3\xefw\xee\xd0\xaa\x65S\xcc\xcd\xcd\x63\x8d\x93)S&\xd2\xda\xa7\xe2\xd6\xed\xdbT\xab\xe6\x19\xe7\\\x5\v\xe4\xa7\x64\x89\x42L\x9b>\x93\x43\x87O2s\xfa\xe4\x4\xf7}\x1d\x13\x13\x13\xf2\xe7\xcfG\xfe\xfc\xf9\xa8Y\xa3:\xc5]\xcb\xf3\xeb\xaf\xa7(]\xba\x94Q\xbb\xe6\xcd\x9aP\xd1\xb3\x16\xeb\xd6o0\\\xef\x9f\x96.[\xc1\xc3G\x8f\xa9[\xa7\x16\0NNN\xa4O\x97\x9a\xbd\xfb\xf6S\xa8PAC\xbb\xb0\xb0\x97\xec\xde\xb3\x97V_6{\xeb\x38\x45\x44\x44\x44\x44\xfe\x8d\xb2\x65\xcb\xce\xda\xf5\x1b\x13;\f\x11\x11\x11\x91\xf\x42\x89!\x11yo\xf6\xf6i\b\x98>\x81:\xf5\x9a\x91'\xb7\x33\r\xeb\xd7yc\x9f\xa8\xa8(\xea\xd4mH\x91\xc2\x5)T\xb8 iR\xa7&(\xe8!3\x3\xe6R\xbfnu\x9c\x9d\x9d\xf9\xfe\x87\xd1\xdc\xbe\xfd;\x1e\x1e\xee\x64H\x9f\x8e\xb0\x97/Y\xbbv\x3\xe\x19\xd2Q\xb1\x42y\xa3\xf1\xc2\xc2\xc2\xe8\xdb\xff\x1b\x9a\x35\xae\x43\xd9\x32\xa5\xff\x88\xcb\x9e\xef\x46\xe\xa6iK?*\x94/\x8b\xbb\xbb[\x9c\xb1\x64\xcb\x96\x95\xfd\xdf\x8e\x63\xe1\xc2\xc5\x64\xcf\x91\x9du\xeb\x36\xc4\xf4Okoh\xe3\xe1\xe1\xce\xf5\x9bw\x99\xbb`\x5?\xef\xdb\x16\xe7\x38\xd6\xd6V\f\xfe\xa6/\x9d\xbb\xf7\xc7\xcc\xcc\f\x97\x12\xc5y\xf6\xfc\x39\xd7\xaf\xdf\xa0q\xa3\x6@L\x2\xa7Y\xd3\x46t\xea\xda\x8f\x36_6\"u\xea\xd4\t\xee\x1b\x9f\xabW\xaf\xb1t\xd9\n\xdc\xdcJ\x92*U*\x8e\x1e\x39J\xb2\x64\xa6\x64\xc9\x92\x39V\xdb\x42\x85\n2lp_\xda\xf9\xf5\xe4\xd7_~\xc3\xdd\xc3\x8d\xe8\xa8h~\xda\xbb\x8f\xd5k7\x11\x30\x63\"i\xd2\xa4\x1\xc0\xc2\xc2\x82\x1f\xbe\x1dJ\xf3V\xfe<}\xfa\f\xd7\x92.\xbc\f\x7f\xc9\xf2\x15\xabIik\x1b+\xb1$\"\"\"\"\"\xff.S&M\x8cU\xe6\xe7\xdf)\x11\"\x11\x11\x11\x91OI\x89!\x11\xf9 \x8a\x16)D\xab\x96M\x99Y\xb3\x66\x89\xb3}\xdb\x36\xad(R\xb8\x10k\xd7m`\xd8\xf0\xefI\x9f.-nn.\xec\xda\xbe\x1''\xe3\xed\xe1\xaaU\xf3\x64\xc3\xda\xc5\xcc\x9b\xbf\x90\x95\xab\xd6\x91+g6*U\xaa@\xe3\x46\rI\x91\"\xc5\x1b\x63\x13\x11\x11\x11\x11\xf9/\b\v\v\xe3\xf7\xdb\xb7\xe3\xad\xb7\xb4\xb2\xc4\xd1\x31\xd3'\x8c\xe8\xc3P\x12HDD$i2\xb9p\xe5Ntf\xc7t\0\xdc\xba\xf3\x80\xdc\x39\x32&rH\"\xf2\xa1\x84\x86\x45\0\x31\xdf\xdb\x7f~\x9f\xc7\xe7\xafm\xde\xf5gAtt4aaa\x86\xed\xe0\xfeK\xc2\xc3\xc3\xf9\xbcL%\xfa\xf5\xed\xf1\xde+e\xd6\xacY\xc7\xf0\x91\xa3\xf8\xf9\xc0.\xcc\xcc\xcc>P\x84\"\"\"\"\"I\xcf\xc5\xabw\x8d>\xc7\xbc\xcd\xe7\x9e\xe7!\xc1\t\x9e\xe7\xca\xe5\xcb\xd4\xa8^-\xde\xfa/[\xb5\xa1G\xaf\xf8\xb7\xaf\xfe'*\x90\xd7\x99\x33\xe7/%v\x18\"\"\"\xf2\x89\xd8Z\xdb\0\x31\xbf\xfi\xc5\x90\x88|0&&&\xff\xc9\xa4\x10\xc0\xa1\xc3G\xb8\xf5{ eJ\x7f\xfe^\xe3\x44GG3\x7f\xc1\x62\x9a\x37k\xa8\xa4\x90\x88\x88\x88\x88\xc8\xbf\x84S\xe6\xccl\xde\xb6#V\xf9\x83\xfb\x81\x34o\xda\x18\xdfZ\xb5\x13!*\x11\x11\x11\x91w\xa3\xc4\x90\x88H\x2\xacZ\xb5\x86\x46\xf5}\xb1\xb7\xb7\x7fs\xe3\xd7\x38{\xee\x1c\a\xe\x9d`\xe4\x88!\x1f(2\x11\x11\x11\x11\x11\xf9\xd8,,,\xc8\x9a\x35k\xac\xf2\xacY\xb3\xd2\xa1\xa3?\x87\xf\x1f\"g\xae\\\x89\x10\x99\x88\x88\x88\xc8\xdbSbHD$\x1\xc6\x8f\x1b\xfd\x41\xc6)\x90??\xf7\xefh\xbb\x6\x11\x11\x11\x11\x91\xff\x8a\xbbw\xef\x12\x1e\x1e\x9e\xd8\x61\xbc\x93m[\xb7\x18\xbd\xf7\xac\x1a\xffvy\"\"\"\xf2\xdf\xa1\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc8k<}\xfa\x84\xa3G\x8e\x18\x95\x45\x46\x46r\xea\xb7\xdfX\xbbz\x15\xd3\x66\xccz\xe3\x18\x11\x11\x11\xec\xda\xb9\x83\xef\xbf\x1b\xc9\xa0\xc1\x43\xf9\xbct\x19\x43]`\xe0=\xe6\xcd\x99\xc3\xfe}{\xc9_\xa0\0\xf5\xea\x37\xa4x\x89\x12\x46\xfd\xc3\xc2\xc2X\xbcp\x1;v\xfc\x88\xadmJ\xbc\xab\xfb\xe0S\xa3&&&&\x86\x36\xd1\xd1\xd1l\xd9\xb2\x99\xcd\x1b\x37\x10x\xef\x1e\x95\xaaT\xa1Y\xf3\x96\xf1n\xf9\xad\x44\x90\x88\x88H\xd2\xa4\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc8k\x4=\b\xa2K\xa7\x8e\xb1\xca\xf3\xe7/\xc0\x88o\xbf\xe7\xf3\xd2\xa5\xe3\xed\x1b\x15\x15\xc5\xa1\x43?3y\xe2\x4~9y\"V\xfd\xfd\xfb\xf7i\xd5\xb2\x39\xae\xae\xee\xf4\xec\xdd\x87_\x7f\xfd\x85\x16\xcd\x1a\x33g\xde\x2J\xb8\x94\x4\x62\x92J\xfd\xfa\xf4\"8\xf8\x39\xad\xdb\xb4\xe3\xd1\xa3G\f\x1d<\x90\xc7\x8f\x1f\xd3\xbc\x45K\xc3X\v\xe6\xcf\x63\xce\xac\0\xba\xf7\xec\x85\x85\x85\x5\xb3\x2\x66r\xe6\xf4\x19\xc6\x8e\x9f@\xb2\x64\xc9>\xc0\x9d\x10\x11\x11\x91\xff\x2%\x86\x44\x44\x44\x44\x44\x44\x44\x44^#g\xae\\\x9c:{!V\xb9\xa9\xa9\xe9\x1b\xfb>{\xfa\x94o\x87\xf\xa3Y\x8b\x96L\x98\x34\x99\x32\xa5<\x8c\xea\xd7\xac^I\x96,Y\x19\xf0\xf5\x37$K\x96\x8c\x32\x65\xcb\xf1\x32\xec%S&O\"`\xf6\\LLL8r\xe4\x30\xfb\xf7\xed\x65\xdb\x8e\xdd\xa4I\x93\x6\0;;;\xfa\xf6\xeeIu\x9f\x1a\xd8\xdb\xdb\x13\x14\xf4\x80\x31\xa3~`\xc6\xac\xd9\xb8\xba\xba\x1\x90/\x7f~\xaaV\xae\xc8\xf1\x63Gqus\xff\0wBDDD\xfe\v\xde\xfc\x1b\x8c\x88\x88\x88\x88\x88\x88\x88H\x12\x17\x19\x19\x89\xa9\xa9\xa9\xe1\x15\x18\x18\xc8\xa1\x43?\xf3\xe4\xf1\xe3\xd7\xf6K\x95:5\xab\xd7m\xa0\xee\x17\xf5\xb0\xb5MiT\x17\x11\x11\xc1\xec\x80\0\xaa\xfb\xd4\x30Z\xd1S\xc5\xb3*\x87~>\xc8\xcd\x1b\x37\0\xd8\xba\x65\x33\x35}k\x19\x92\x42\0\x9f\x95\xfa\x9c\xc8\xc8(\x8e\x1d\x8d\xd9\xe2\xee\xe0\x81\x3\xd8\xdb\xa7\xa1x\xf1\xffoA\x97\x39s\x16*U\xf1\x64\xe7\xce\x1d\xef}\xfd\"\"\"\xf2\xdf\xa1\xc4\x90\x88|t\x91\x91\x91\x84\x86\x86&v\x18\"\"\"\"\"\"\xef$\"\"\x82\x1a\xd5\xabq\xea\xb7\xdf\0\xb8w\xef\x1e\xbe>\xde\xb4j\xd1\x8c\xc6\r\xeb\xf3\xe0\xc1\x83\xd7\xf6O\x9e<\xee\r[\x9e ((f\xdcK\x17.\x90%k6\xa3\x36\xd6\xd6\xd6\xe4\xce\x93\x9b{w\xef\x2\xf0\xfb\xef\xbf\x93;O\xdeXs\xe5\xc9\x9d\x87\xeb\xd7\xae%\xec\x42\x45\x44\x44$IPbHD>\xaaG\x8f\x1e\xe3\xfaYEv\xee\xda\x1bo\x9b\xb0\xb0\x30\x16.\\L\xe7.\xdd)\xeeR\n/o_\x6\xf\x1e\xc6\xb9s\xe7?a\xa4\xff\x17\x15\x15\xc5\x93'O\b\xf\xfO\x94\xf9\xdf\xc6\xbf)\xd6w\xf5\xe2\xc5\v\x9e={\x96\xd8\x61\0p\xfd\xc6\rz\xf7\xe9\x8f\xab{\x19\xda\xb4\xf5\x63\xd7\xae=\xb1\xda\xfc|\xe8\x30\xadZ\xb7\xc7\xd5\xbd\f\xbdz\xf7\xe3\xd2\xa5\xcb\xaf\x1d\xf3\xd9\xb3\xe7\x8c\x1e\x33\x8e\x8a\x95\xbc\xa8\xf3\x45\x43\xe6\xce\x9dODDd\xacv\xe7\xce\x9dg\xe0\xc0!\x94\xafX\x8dJU\xbc\x19>\xe2;\xee\xdc\xb9\x13g\xbb\xf4\x8e\xce\\\xb8x\xd1P\x16\x15\x15\xc5\xe0!\xc3)X\xc4\xf5\x8d\xf1\x88\x88\x88\x88Hl\xf7\x3\x3\xb9y\xe3\x6\xf6\xf6\xf6\0l\xdd\xb2\x89\xca\x9e\x9e\xec\xd9w\x90\x2\x5\v\xb2\xfd\xc7m\xef\x34\xee\x93'O\0\xb0\xb4\xb4\x34*\xb7\xb2\xb6\x2\xe0\xd9\xb3gDGGs\xee\xdc\x39\xac\xff(\xfb\xabt\xe9\xd2\xf3\xe8\xf1#\0\x2\xef\xdd\xc3\xce\xce.V\x9b\x94v)\xb9}\xebV\x9c\xf3\x17\xc8\xeb\x1c\xe7KDDD\xfe\xdb\x94\x18\x12\x91\x8f\xaaw\xbf\x81\x94,Q\x8c\xea\xde\x9eq\xd6\xdf\xb8q\x93\xba\xf5\x1a\xb3z\xcdz\\\\J\xf0\xc3wCi\xdf\xae\x35\x66\xe6\xe6<|\xf4\xe8\x13G\x1b\xe3\xd9\xb3g\xe4\xce_\x92\xe3\xc7\x63\x1f\f\xfbO\xf3o\x8a\xf5]\xcd\x9d\xb7\x80\xd6m:$v\x18\xdc\xbd{\x97\xaa^\xb5I\x97\x36-#G\f\xa6`\x81\xfc\x34h\xd2\x86\xcd[\xb6\x1a\xda\xfc\xf4\xd3^\x9a\xb7lO\xf9re\x18>\xf4\x1b\xa2\xa2\xa2\xf0\xf1\xad\xcf\x95+W\xe3\x1c\xf3\xd5\xabW\xb4i\xeb\xc7\xe5\xcbW\xe9\xdb\xb7\auj\xfb\x32\x66\xfc\x14\x46\x8c\xfc\xce\xa8\xdd\xce]\xbb\xa9\xea]\a[[[\xfa\xf4\xee\x46\xf7n\x9d\b\x7f\xf9\x92\x88\x88\x88\x37\xc6\x1d\x1d\x1d\xcd\xa4ISY\xb4\x64%K\x16\xcd\xc1\xd9\x39\xd7\xfb\xdd\b\x11\x11\x11\x91$(**\n\0\x1b[[\xa2\xa2\xa2X\xbdr%\xbe\xb5j\x93.]:\x8a\x16+\xce\xad[7\xdfi\\[[[\0\x42^\x84\x18\x95\x87\x86\x86\x1\x31\xdb\xd0\x99\x98\x98\x90#g\xe\x9e?\x7f\x1e\xab\xff\xe3\xc7\x8fH\x97.\x1d\0\xf6i\xedy\x14\xc7g\xa8\xe0\xe0`\xb2\x65\xcf\x1e\xe7\xfcg\xce_\x8a\xf3%\"\"\"\xffmq\xaf\x65\x16\x11\xf9\0\x36n\xda\xc6\xd1\xa3'\xd8\xbbgs\x9c\xf5\x11\x11\x11\xf4\x1f\xf0\r%]\x8a\xd3\xafo/\xcc\xcd\xcd\ru5jT\xffTa\x8a$\xc8\xe2%\xcb\xc8\x99#+\xbdzu\a\xa0\x62\x85\xf2XZY\xf2\xedwc\xa8T\xb1\x2\xe6\xe6\xe6\x8c\xfcn4\x1d\xda\xb5\xa4I\x93\x46\0\x94/_\x9e'O\x9e\x32\x7f\xfe\x42\x6\xf\xfe&\xd6\x98\a\xe\x1c\x64\xf7\xde\x43\x9c\xfe\xf5 \xe9\xff\xf8@\x9f+g\xe\xaa\xfb\x36\xa2i\x93\x46\x64\xcf\x9e\x8d\xe0\xe0`z\xf5\xfe\x8a\xe9S\xc7R\xd5\xb3\x8a\xa1\xafW\xb5\xaa\t\x8a{\xc1\xc2\xc5\x8c\x1e\x37\x85\x95\xcb\xe7S\xa8`\x81\xf7\xbb\t\"\"\"\"IT\xba\xf4\xe9I\x9b\x36\x1d\xfb\xf7\xef\xc3\xdc\xcc\x8c\x90\x90`\n\x16,\x4\xc0\xc3\x87\x41q\xae\xd4I\x88\xd4\xa9\xd3\x90,Y2\xee\xfc\xfe;\xb8\x94\x34\x94?xp?f\xde\xb4\x31\xbf#\xe6\xce\x9d\x87\xabW\x8d\x1f\x36z\xf9\xf2%W._1lC\xe7\xe8\xe8\xc8\xf2\x65K\t\xf\xf\x37\xfalu\xe3\xfau\xb2g\xcf\xf1N\xf1\x89\x88\x88\xc8\x7f\x93V\f\x89\xc8G\x11\x1e\x1e\xce\xc0!#\x19<\xa8\x1fv)S\xc6\xd9\x66\xcf\x9e\xbd\x1c>z\x92.\x9d;\x1a}p\xf9\xbb*\x9e>\xac\\\xb5\x9a\xe1#\xbe\xa3T\xe9\x8a\xcc\x9d\xb7\x80\xec\xb9\n\xb1|\xc5J\xa3v\x3\a\xe\xa1{\x8f\xde@\xcc*\x89m\xdb\xb6\xd3\xbc\x65\x1b\xdc<\xca\xd1\xa7\xef\0n\xdd\xbamh\xfb\xea\xd5+\xe6/XD\x8d\x9au\xc9[\xa0\x4\xf5\xea\x37\xe6\xe0\xc1\x9fy\xf6\xec\x39\xb9\xf3\xc7| \xabY\xa7)\xe9\x1d\x9d\x39|\xe4(\x81\x81\x81\xa4wt\xe6\xa7\x9f\xf6\xd2\xbdGo\xdc<\xca\xf1\xdbo\xa7\0\xb8u\xeb\x36}\xfa\xe\xc0\xd5\xbd\f\xcd\x9a\xb7\xe2\xf0\xe1#\x86y\xb6\xef\xd8\x89\x7f\xa7\xae\xb8\xba\x97\xc1\xb3Z\r\xa6M\x9b\x41XX\x98\xd1\xb5M\x9b\x36\x83\xbe\xfd\xbe\xc2\xcd\xa3\x1c\xcd[\xb6\xe1\xf4\xe9\x33\x1c=z\x8c\xae\xddz\xe2\xe2Z\x9a.]{p3\x8e\xad\x1f\xe2\x8b\x15\x62\x9eh\\\xb1\x62\x15u\xeb\x35\xa2L\xb9*\x8c\x1e\x33\xce\xe8\t\xc3w\x99w\xd4\xa8\xb1\x8c\xfc\xf6{&N\x9c\x8cg\xb5\x1a\xd4\xae\xd3\x80u\xeb\x36\x10\x1d\x1dmh\x13\x1c\x1c\xcc\xd8q\x13\xa8X\xc9\x8b\x9a\xb5\xea\xb1l\xf9J\"#c\xb6\x45\x8b\xef\x1e\xbe\xee\x1eM\x9f\x11\xc0\xa0\xa1\xa3\xd8\xb3\xef\b\xe9\x1d\x9di\xdc\xa4\x5\0\xdd\xba\xf7\x62\xf0\xe0\x61\x46\xf7#\x7f\xa1\x92\xac\\\xb5\xfa\xb5s\x1\x1c>r\x94\x36m\xfdpq-M\xcf^}\xb9y\xf3\xffOw\xce\x9a=\x97\x66\xcd[\x11\x16\xf6\x32\xd6\xfd>u\xfa,\x95+\x95\x37*\xabR\xa5\x12\xe7/^\xe3\xc2\x85\x8b\x84\x84\xbc\xe0\xc4/g)Q\xbc\x98\xa1>y\xf2\x64T\xabZ\x85\xa9\x33\x17\xc4\xb9\xdd\xdf\x95\xab\xd7pu)lH\n\x1\xb8\xb8\xc4\x1c\x16|\xf0\xe0\xcf\0\xec\xdc\xb9\x1b\v\vs*U\xac\x10\xab\xff\x9b\xac_\xbf\x91>\xfd\x87\xb0`\xdetJ\xba\x94xs\a\x11\x11\x11\x11\x89\x93\x85\x85\x5\xfd\xbf\xfa\x9a^\xdd\xbb\xd2\xa5SGZ\xb7mO\x8a\x14)\x88\x8a\x8a\x62\xe7\x8e\x1d\xe4\xcf\xffn\xf\xe0\x98\x9b\x9b\xd3\xbc\xe5\x97lX\xbf\x96W\xaf^\x19\xca\x7f\xda\xb3\x9br\xe5+\x90\xc9\xc9\t\x80\xcaU (\x2\xaf\x8du\xfa\xf4\0\x16/Y\x8e\xbf_;\xfa\xf7\xed\xc1\xb1\xe3'\x19\xf0\xd5@C\x12\xe7]\xe7\x1d;a&\xcf\x83\x43\xe8\xdf\xb7'U\xabV\xa6\xbd\x7fO6l\xdc\x4@dd$~\x1d\xbbp\xf7\xee=\x86\r\x1bH\xa3\x6_0n\xfc\x64\x96-7N\xe0\xfd\xfd\x1e\xbe\xee\x1e\xd5\xf0\xf1\xa6\x64\x89\x98'1w\xfd\xb8\x96\x41\x83\xbez\xe3\xff\x95\xd7\xcd\xf5\xf3\xa1\xc3\xb4i\xd7\x89\xea\xde\xd5\x18\x33z$\xc9\x93'\xa7\x61\xe3\x96<}\x1as\x86\xb4\xe4=\x98\0\0 \0IDAT\xd1\xc5\x8b\x97\x38\xf1\xcb)^\xbe\f\x8b\x35\x96\x63\x46\a\xae^5>\xb4\x37\xe8\x41\xcc\xff\xa7\xfb\xf\x1e`i\x99\x82\xb4\xf6\xa9\xf8\xfdo\xe7\xfel\xd8\xb4\x5\x88\x39o\xeb\xef\xec\xed\xd3p\xfd\xc6-BCC\re\x7f\xfe\xfb\xce\x9d\x98\x43\x84\xaf]\xbfN\x91\xc2\x5\x39q\xe2$-\xbelKq\x97Rt\xeb\xde\x8b\xeb\xd7o\xbc\xf6\xda\x37m\xda\x42\xeb\xf6\xdd\x98\x1b\x30\x89\x32\xa5?\x7fm[\x11\x11\x11\x11y3\xcf\xaa\xd5\xd8\xbek\xfk\xd7o\xa2\x41\xc3\x46\x86\xf2\x61\xc3GR\xe2/\xab}\xdeV\xbd\xfa\r\xb8|\xe9\x32\xc3\x86\f\xe6\xc0\xfe}\xcc\x99=\x8b\x99\xd3\xa7\xd1\xae\x83\x1f&&&\0\x94.]\x86\x12..\xf4\xea\xd9\x9d\xdd\xbbv\xb2i\xe3\x6\xfa\xf5\xe9M\x8f^\xbd\r\xab\x95\x32\x65r\xa2\x43G\x7f\xfa\xf6\xe9\xc9\xfauk\xd9\xb3{\x17}z\xf5\xc0\xcb\xbb:E\x8a\x14}\xbf\x8b\x17\x11\x11\x91\xff\x14m%'\"\x1f\\hh(\x93\xa7\x6\xb0t\xd1\xac\xd7\xb6\xbbx\xe9\x12\x19\x32\xa4O\xf0\xb8_\x7f\xd5\xcf\xf0o\x9f\xea^L\x9c\x32\x9b\x9b\x37o\x92%K\x16\xe\x1d>BJ[\x1b\\]]\b\xe\xe\x66\xe0\xe0\x91L\x99\x38\x9a\n\x15\xca\x1\xe0\xe1\xe1\x46\x85J^\xac\\\xb9\x9a\xf6\xed\xdbr\xfc\xe4/|^\xca\r\xcf*\x95\x31\x31\x31\xc1\xc3\xc3\xdd\x30v\x91\"\x85\x1pws\xa5\xe0\x1f[o\xfd\xf9\xc7\xfa\xde=:\xd2\xd1\xaf\xbd\xa1\xed\xa4\xc9S\xf1ps\xa1}\xbb\x36\x31\xf3\xb8\xbbq\xf2\x97_\xd9\xba\x65\x1b\x85\n\x16\xa0S\xa7\x8e\x46\xd7p\xe5\xca\x35\x36m\xde\x86_\x87v\0\x14\xc8\x97\vw7\x17\x1a\x34\xa8\a@\x8e\xec\xd9Y\xb3~\x1b\x33\xa7\x8e\xa1\x66M\x1f\0R\xa5JE\xad\xba\xcd\xb8y\xf3&9s\xe6\x34\x8c\x95 88dx\xe7y\xd3\xda\xa7\xa2\x7f\xbf\x98UYe\xcb\x96\xe1\xc5\x8b\x17|\xff\xc3\x38j\xf8T\xe7\xd0\xe1#\xfc\xb4\xef\x10\xe7N\x1f\xc5\xca\xca\n\xfw7\xc2^\xbe\x64\xf6\x9c\xf9\x34jX\xdf\x10\xf7\xdf\xef\xe1\xeb\xeeQ\xc6\x8c\x19\xf1\xf6\xf2\xc4\xda\xca\xd2p}o\xe3\xefs\x8d\x1a=\x8e\x1e];\x1a\xae\xb1\x44\xf1\x62\x14)\xfe\x19\xc7\x8e\x1f\xa7\x62\x85\xf2\x8c\x18>\x84o\xbe\x1e\x10\xe7\xc1\xbe\xb5|k\xe0]\xb3!\xb9s;\xe3R\xa2\x38\x17.\\d\xfd\xc6\x98m\x12\x9f?\x7f\x8e\xa9\xa9)\xdd\xbat`\xf8\xc8\xd1\x98\x9b\x9b\xe3\xe0\xe0\xc0\xd1\xa3\xc7\xd8\xb2m\xf\0!!\xc1@\x6\xa3\x31K\x7f^\nSSS\x6|5\x90/\xea\xd6\xe6^` \xabV\xad\x5\xe0\xf1\x1f\a\x11\xdf\xbcy\x8b\xd5\xeb\xb6\xf2\xf4\xd9\x33\xea\xd6\xf1\xe5\xcb\x96\xcdX\xbal\x5\xf5\x1a\x34\x65\xfb\xb6\r\xf1n[\xf2\xed\xf\x93\0pu}\xf7?R\x88\x88\x88\x88\x88\x31;\xbbT\x4\a\as\xee\xec\x19\x43\x99\xa9\xa9\tA\xf\x1e`mm\xfdNcf\xce\x9c\x85\xb9\v\x16\x31\x7f\xee\x1c\x86\r\x1dL\xf1\x12.\xcc_\xb8\x84\x2\x5\v\x1a\xda\x98[X0~\xc2$\xe6\xce\x9d\xcd\xc4\t\xe3\xc8\x98\xd1\x91\xfe_}\x8dg\xd5jFc\xf9u\xec\x84\x83\x43\x46\xd6\xaeYMXX(\x95\xabT\xa5q\xe3&\x98\x9a\xc6\xfd\\\xf0\xb6\xad[\x8c\xde\xff}<\x11\x11\x11\xf9oRbHD\xdeK`\xe0\x3\x16,Z\x86\xbf_kR\xa4H\x1\xc0\xfc\x85\xcb(R\xb8 E\x8b\x14zm\xdfL\x99\x1c\xd9\xb7\xef`\x82\xe6\x19\x39\xb4\xbf\xd1\xfb\xc2\x85\vQ\xb4P^\xf6\xed;@\xe3\xc6Y\xd8\xb4i\v_\xb6l\x82\x85\x85\x5W\xaf]\xe3\xd1\xe3g\xe4\xcb\x97\xd7\xd0\xde\xd2\xd2\x12\xcf\xca\x15\xf8\xed\x8f\x95<\xf5\xea\xd6\xa6m\x87\xae\xdc\xbb\xd7\x1c\x1f\x1f/*W\xaeh\xb4\x9dW|\xca\x95-m\xf4\xfe\xd7_O\xb1n\xe3v\xd6\x39:\x1b\x95\xb7j\xd1\0\x88I(m\xda\xb4\x85]{~\xe2\xca\x95k\x9c\xfc\xf5\x1c\x39\xb3;\x19\xda\x99%ON\xae\x9c\xff\xdf\xef\xdb\xc9)\x13\0\x16),\feY2g\x6 8\xe4\xc5\x1b\xe3\x3\xb8q\xf3&\x91\x91Qxz\xd5\x8dU\x17\x1c\x1c\x93\x9cx\xd7yK\xba\x18?iX\xa2xqF|7\x81'O\x9ep\xf9\xd2\x65\x42\xc3\xc2\xc9\x96\xab\x88Q\x1bk\xab\x14\x46\xef\xff~\xf\xdft\x8f\xde\xc7_\xe7\n\v\vc\xdf\x81\x63\xec;p\x8c^\xfd\x86\x18\xb5{\xf6,f\xc5P\xb2\x64\xc9\xe2L\n\x1\x94,\xe9\xc2\xf2\xc5\x1L\x9b>\x8b\xd9s\x16\xe2Y\xa5\x2#\x86\r\xa6tyo2d\x88I\xf8\xb4h\xde\x14s33f\xcc\x9c\x43hh\x18_\xd4\xa9\xc9\xf2\xc5\x1\xd4k\xd4\x9a\xb4i\xd3\xc6\x1a\xd3\xde\xde\x9e\xd5+\x16\x31n\xfc\x44:t\xecN\xf1\x62\x85\xe8\xda\xc5\x1f\v\v\v2\xff\xb1m\xc8\x9f\x89\x9f\x80\x19S\r\xb1\x95(^\x8c\x62.\x9f\xb3\xff\xc0\x41\xbc\xbd\xe2\xfe\xf0\xbe\x62\xc9,\x6\r\x19I\xd7\xee\xbd\x98\x36\x65\x2\x96\x96\x96os\xeb\x44\x44\x44\x44\xe4o\xe\x1f:D\xcf\x1e]y\xf4\xf0\x61\xac\xbaz\xf5\x1b\x32p\xf0\x90\x38z\x19\x33\x37\x37\xe7\xcc\xf9K\xb1\xca\xb3\x66\xcd\xca\xd7\x3\a\xbd\xb6\xaf\x8d\xad-\xfe\x9d\xba\xe0\xdf\xa9K\xbcmLMM\xa9\xfb\x45=\xea~Q\xef\x8d\xb1\x80\x12\x41\"\"\"I\x95\x12\x43\"\xf2^\xac\xad\xad\xd8\xf6\xe3N\xce_\xb8\xc8\xcci\xe3\x89\x8e\x8e\x66\x46\xc0\\&\x8d\xff\xe1\x8d}\xf3\xe6\xc9\xc3\xd8\t3\xb9v\xed:\xd9\xb3g{\xabyMMMi\xde\xbc\x31\xcbW\xac\xa6Z5O\x96,_\xc7\xde\xdd\x31[\x9a\x85\x87\xc7l}\x16\x15\x15i\xd4\xc7\xdc\xc2\x2\xcb?\x92W\xe5\xca\x95\xe5\xf8\x91\xbd\xec\xdd\xb7\x9fm\xdb\xb6\xd3\xa7\xdf`&O\xf8\xde\xb0\x92$\xa1R\xa7NE\x81|\xb9X0o\xa6Qy\x8a\x14\x31\x7f\x84\xef\xd4\xb9;fff\xb4m\xdb\n\x87\f\xe9\x99\x37\x7f!c\xc6\xcf\x88w\xbc?\xb7\x8a\x30.{\xab\x90\xb0\xb6\x8aI\x1e\xcc\x9b\x35\x89\x42\x85\x8cW\xd9\xfc\x99\xc0x\xd7y\xff~N\x8ei\xb2\x98'\xf\xcd\xcc\xcc\xb1\xb1\xb5\x1\xe0\xc8\xcf;H\x9e,\xd9k\xc7\xfe\xab\xb7\xbdG\x7f\xfa\xeb\xd9\x46\tannN\xb2\x64\xa6th\xdb\x9c/[63\xaaK\xc8v\x86\x10\xf3\xff\xa6\\\xb9\xb2\x86\xf7W\xae\\\x1 \x93\x63\xcc\x81\xbf\x66\x66\x66\x34o\xde\x94\xe6\xcd\x9b\x1a\xda\xac]\xb7\x9elY2\x92\x32\x9e\xb3\xb6r\xe5\xca\xc9\xa4\x89\xe3\f\xef_\xbdz\xc5\xa9\xd3g\xa9S\xc7\x17\0\xa7L\x8e$Kf\x8a\x95\xd5\xff\x13;\xd6\xd6\xd6\x64\xcf\x96\xd9\xb0\x95]\\\x1c\x32:\x10\x30\x63\x32>\xbe\xf5\x19\x34x\x18#\x86\xf!\xd9_\xbe.\"\"\"\"\x92paaa\xf4\xee\xd9\x1d/\xef\xea\xd4\xac\xe9K\xaa\xd4\xa9\x8d\xea-,,\xe2\xe9)\"\"\"\xf2\xcf\xa3\xc4\x90\x88\xbc\x17\x1b\x1bk\x96.\x9a\x85\xa7w\x1d\xa6\xcf\x9cK\x9e\xdc\xb9\xb0\xb6\xb6\xc6\xc3\xfd\xcd\xdbWU\xa9R\x89\x2\xf9r1b\xe4\xf7\x8c\x1e\xf5m\xbc\x7f\x38\x8fO\xa5\x8a\xe5\xe9\xd6\xf3k&O\x99N\x99R\xae\x38\xe7\xca\x5@\x96\xccN$Kf\xca\x89\x93\xbf\x90)S\xccJ\x98\x88\x88H\xf6\xef?H\x83\x6_\x18\xfa\xdb\xda\xda\xe2\xedU\ro\xafj\xa4O\x9f\x9e\xd9s\x17P\xb3\xa6\x8f!\x91\xf1\xf7\x33}\xe2R\xb8PA\xd6\xae\xdf\x82\xb5\xb5\r\xa9S\x1b'\x17\x1e>|\xc8\xfaM;X\xbd\x62\x9e\x61K\xb7\x33g\xce\xbd\xd5\x35\xbeI\\\xb1\x66\xca\x94\x89\xb4\xf6\xa9\xb8u\xfb\x36\xd5\xaay~\xb0\xb9\x42\xc3\xc2\xd8\xb9\xfb \xe1\xe1\xe1\x98\x9b\x9b\x3p\xea\xd4i>\xf7(\x81\xb5\xb5\x95\xe1\xfe\xdf\xf\xbc\x9f\xe0\xed\xcb\x12r\x8fL0\xe1\x45\xa8\xf1\x99?\xa9\xec\xec\x38~\xe2\x17\xa3\xb2\xa0\x87O^;\x97\xa9\xa9)\xbe>\x9e\\\xbe|\x85L\x99\x32\xc5\x99\xb0\x8a\x8a\x8a\xe2\xe5\xcb\x97\tZ]\x13\x1d\x1d\xcd\xd2\x65+iT\xbf&Y\xb2\x64\x89\xb3Mhh(s\xe6.\xa4G\xf7\xce\x86\xf9\x42\x42\x42^\xbb\xcd\xc8\x8e\x1d\xbb\0([&f\xb5\xd3\xe7\x9f\x97\"22\x8a_~\xfd\xcdp\x8f\xee\xdd\v\xe4\xe4\xaf\xe7\x18\xd0?\xfbkc\xcc\x99\x33\a\xf3\xe6L\xa3\x46\xad\x46\x38\x38\x64\xa0[\xd7\xceo\xbc.\x11\x11\x11\x11\x89-((\x88\xa0\xa0\a4m\xd6\x2'\xa7\xf\xb3\xba]DDD$\xb1(1$\"\xef\xcd\xde>\r\x1\xd3'P\xa7^3\xf2\xe4v\xa6\x61\xfd:\t\xeagmm\xcd\xf8\xb1\xdf\xd3\xbamG\xbc\xaa\xd7\xa6\x65\xf3\xc6\x64\xcb\x9e\x8dW\xe1\xe1\x9c=w\x1e\xf\xfw<\xdc\xdd\xe2\xed\x9f!C\x6\x1a\x37\xf0\x65\xe2\x94\xd9\xcc\x9c:\xc6P\x9e:uj\xfa\xf7\xe9\x42\x8f^_\xf1\"\xe4\x5\x99\x9c\x32\xb1y\xf3V\x82\x43^P\xbbVM\0\xa6N\x9d\x41\xea\xd4\xa9\xc8\x9e#;\xaf\xc2\xc3\x39t\xf8(\xae%K\0\x90\x32\x65J\x9csfa\xcd\xda\xf5\xd8\xa6LI\xba\xb4\xf6\x98\x99\x99\xc5\x19\x83\xafo\rf\x4\xcc\xa5\x83_g\xfc\xfd\xdb\x63gg\xc7\xd9\x33g)Y\xd2\x85\xcc\x99\x9d\xc8\x9e\x35\x13\xb3g\xcf#\"\"\x82g\xcf\x9e\xb1m\xc7\xbe\x4\xde\xd5\x84\x89+V'''\x6\x7f\xd3\x97\xce\xdd\xfb\x63\x66\x66\x86K\x89\xe2<{\xfe\x9c\xeb\xd7o\xd0\xb8Q\x83w\x9e\xcb\xc2\"&\x19\xd4\xaf\xff\xd7x{U\xe3^` #\xbf\x1bg8K\xaap\xe1\x42\x34k\\\a?\xff\xee\f\x1e\xd4\x9flY\xb3r\xfb\xf6\xef\xa4HaA\xd9\xb2\x65\xe2\x8d\xffM\xf7({\xf6\xac\x1c\x39\xf6\x1b\xdbw\xec\xc4.eJ\\]K\xf2y\xe9RL\x9e>\x8f\x89\x93\xa6P\xa4p!\xe\x1c\xfc\x39\x41\xd7\xd0\xb9\xb3\x1f\x15*\xd7\x64\xe0\xa0!\xd4\xacY\x3\x13\xe0\xd0\xe1#\xb4n\xd5\x12sss\xbe\xfaz\x10\x9b\xb7\xec\xe0\xa7\xdd[\xb1\xb3\x33NT\xee\xdc\xb9\x8bK\x97\xaf\x90'\xb7\x33!!/\xd8\xb9k7G\x8e\x9e`\xd1\x82\xd9\x86\x36\xd3\xa6\xcf\xc4\xce.%\x19\x33\x66$\xe8\x41\x10\x8b\x97,'U*;j\xf8x\x3p\xf1\xe2%*W\xf5\x65\xc8\xc0\xbe\x34o\xde\x94\xeb\xd7o\xb0h\xf1RJ\xba\x94\xc0\xc4\x4~;u\x9a\t\x93\x66\x32w\xd6\x64\x43\xf2(O\x9e\xdc\xb4j\xd1\x80\x36m\xfd\xe9\xdb\xbb\x1b\xf6\xf6iX\xbe\x62\x35\x15\xcb\x7f\xf6\xda\xef\x8f?\x95t)A\xc0\xb4q\xb4l\xd3\x99\x8c\xe\xe\x86s\xa5\x44\x44\x44\x44$\xe1\x32\x64\xc8\x80\x95\x95\x15\x11\txxLDDD\xe4\x9fN\x89!\x11\xf9 \x8a\x16)D\xab\x96M\x99zL\xe5J\xe5Y\xbdr\t661\xdb\x9d\x65tt`\xc3\x86\xcd\x1c?\xf1\x1bvv\xb6\xd4\xf0\xa9\x46\xdb\x36\xad\x80\x98U83\xa6Md\xc8\xd0\x91t\xea\xdc\x83\xbe\xbd\xbbS\xf2\x8f\xa4\xd1\xdf\xd9\xd8\xd8\xb0\x66\xd5\x12\xa6M\xf`\xe0\xc0\x61\xbc\b\r\xa5\xd4gn\xb8\xb8\x14\xc7\xcc\xcc\x8c\xb9\xb3\xa7\xf1\xed\xf7\xa3\xe9\xda\xad/e\xcbx\xf0\xc3\xc8o\x98\x36\x63v\x9c\x63\xbd\x8b\xb8\x62urr\xa2n\xdd\xda\xa4J\x9d\x8a%K\x96\x33z\xec$r\xe7\xca\x81\x8f\x8f\xd7{\xcd\x65jb\x8a\x93\x63z\xac\xac\xac\xe8\xd9{\0\x85\v\x17`\xc9\xc2\0<<\xdc\rmF\f\x1f\xc2\xa2\xc5K\x99=g>\x97._\xc3\xa5x\x11Z4o\x12\xef\x98\t\xb9G\x95*U\xa4o/\x7f\xfa\xf5\x1f\x44\xfe|\xb9\x99Z\xa0\0\x15\xca\x97\x63\xc2\x98\xe1\x4\xcc\x9e\xc7\xb6\x1fw\xe2U\xad\n^U\xcb\xbf\xf1\x1a\xf2\xe5\xcd\xcb\xee\xed\xeb\x99\x36}&\xed\xdaw&M\xeaTT\xa8P\x86\xb0\xb0\x30\xcc\xcd\xcd\xc9\x91=\x1b\x85\n\xe6\x35$\xc1\xfe*\xa5\x9d\x1dg\xce\x9c\x65\xc6\xcc\xb9\x64\xcf\x9e\x5\xfw7\xd6\xf\xe8\x8b\xbd\xfd\xff\xff\x9f\xa6O\x97\x8e\xd5k\xd6\xf1\xdb\xe9s\x94,Q\x94\x9a\x35\xab\xd3\xb0\x41=\xc3\n+\x1b\x1b\x1b\x8a\x14\xca\x87\x63&G \xe6L\xa3\x88\x88\b\x86\x8f\xfc\x1SSSJ\x7f\xee\xce\xd6\xcd\xab\xc8\x97\x37\xaf\xd1\xdc\x43\x6\x7f\x43\x8e\x1c\xd9\x99\xbf`1/BC\xf1\xf6\xf2\xa4\xd5\x97-\xe3MX\xfe\x9d\xb7w5\x86\r\xeeK\xe7\xee\x3H\x9f>=\x15*\x94KP?\x11\x11\x11\x11\x89\x61\x66\x66\x46\x97n\xdd\xf1\xef\xd8\x9e^\xbd\xfb\xc5\xda\xb6:M\x9a\x34\x14)Z,\x91\xa2{wS&M\x8cU\xe6\xe7\xdf)\x11\"\x11\x11\x11\x91O\xc9\xe4\xc2\x95;\xd1\x99\x1d\x63\xe\\\xbfu\xe7\x1\xb9sdL\xe4\x90\x44\xe4\x43\t\r\x8b\0\x62\xbe\xb7\xff\xfc>\x8f\xcf_\xdb\xbc\xeb\xcf\x82\xe8\xe8h\xc2\xc2\xc2>\xe9!\xf7}\xfb}\x85\x89\x89\t#G\f\xfd\x64s&U\xa3\x46\x8d\xe5\xd4\x99\xb3\xcc\x9b\x33\xf3\xcd\x8d\x45\x44\x44\x44\x44>\x81\x8bW\xef\x1a}\x8ey\x9b\xcf=\xcf\x43\x82\xdfj\xaeU+W\xf0\xcdW\xfd\xe3\xac\xabW\xbf!\x3\a\xfy\xab\xf1\x12[\x81\xbc\xce\x9c\x39\x7f)\xb1\xc3\x10\x11\x11\x91O\xc4\xd6:\xe6\x81\xf9[w\x1eh\xc5\x90\x88|8&&&\x9f\x34)\x14\x14\x14\xc4\xbc\x85+X\xb1t\xce'\x9bSDDDDD\x92\x9e\xe0\xe0`\x86\xe\x1e\x44\xd7\xee=\xf1\xf5\xad\x85]*\xe3\xf3\x45MMM\x13)2\x11\x11\x11\x91\xb7\xa7\xc4\x90\x88\xfck\xed\xd8\xb1\x8btiSS\xd2%\xeem\xde\x44\x44\x44\x44\x44\x44>\x84\xa7O\x9f\xf0\xeaU8>5j\x92.}\xfa\xc4\xeGDDD\xe4\xbd(1$\"\xffZ\r\x1a\xd4\xa3\x41\x83z\x89\x1d\x46\x92\xd1\xb3g\xb7\xc4\xe\x41\x44\x44\x44\x44$Q88d$\x8d\xbd=\xcf\x9e>\xc5\xc1\xc1!\xb1\xc3\x11\x11\x11\x11y/J\f\x89\x88\x88\x88\x88\x88\x88\x88\xbc\x46\x44\x44\x4vvv\xd4\xaaY\x9d\x1e\xbd\xfa`aaaT\xef\xe8\x98\x89\xf2\x15*$Rt\xefn\xdb\xd6-F\xef=\xabVK\xa4HDDD\xe4SRbHDDDDDDD\xe4\x35\xee\xde\xbd\x43\xf2\xe4\x66\0l\xdd\xb2)V}\xa9R\xa5\xff\x95\x89!%\x82\x44\x44\x44\x92&%\x86\x44\x44\x44\x44\x44\x44\x44\x44^#[\xb6\xec\xac]\xbf\x31\xb1\xc3\x10\x11\x11\x11\xf9 \x94\x18\x12\x11\x11\x11\x11\x11\x11\x11y\x83\xe8\xe8h\x8e\x1f;\xca\x96\xcd\x9b\xb9|\xf9\"\x99\x32\x39\xe1\xea\xe6N\xd5j^\xa4H\x91\"\xb1\xc3\x13\x11\x11\x11I0\xd3\xc4\xe@D\xfe\xfb\"##\t\r\rM\xec\x30\x44\x44\x44\x44\x44\x44\xde\xd9\x8a\xe5\xcbh\xde\xb4\x31!!\xc1\x94\xafP\x91\xccY\xb2\x32w\xcel:\xfb\xfb\x11\x16\x16\x96\xd8\xe1\x89\x88\x88\x88$\x98\x12\x43\"\xf2Q=z\xf4\x18\xd7\xcf*\xb2s\xd7\xdeXu\xe7\xce\x9d'\xbd\xa3\xb3\xe1U\xb4\xf8g\xf8\xf9wa\xe1\xc2\xc5\x84\x85\xbd|\xaby^\xbcx\xc1\xb3g\xcf>T\xd8\x84\x87\x87\xf3\xe4\xc9\x13\xa2\xa2\xa2>\xd8\x98\x7f\x1a\x35j,\xcd[\xb6y\xe7\xfe\xfb\xf7\x1f\xa0z\x8d: u\xa9P\xbe\x34-\x9a\x35\xe1\xd1\xe3\xc7,[\xbe\x8a\x46\x8d[\xb2i\xc3j\xec\xecR\xc6\x1a/\"\"\x82\x8e\xfe]y\xfe\xfc\x39\x9d;u (\xe8!\xbd\xfb\r\xe2\xe1\xa3G\xb4o\xf7\xee\x89\x34\x11\x11\x11\x11\x91\xf7\xf5\xe4\xc9\x63\"##qs\xf7\x30*O\x91\"\x5\x1e\x1e\x9fq\xf1\xc2\x85\x44\x8a\xec\xfdL\x99\x34\x31V\x99\x9f\x7f\xa7\x44\x88\x44\x44\x44\x44>%%\x86\x44\xe4\xa3\xd9\xb8i\x1bG\x8f\x9e`\xef\x9e\xcd\xafmW\xb4X\x11\xf2\xe4\xcemx_\xa7\xb6/_\xd4o\xca\xe8\x31\xe3\xf9\xee\xdb\xe1\x1f;\xcc\x7f\x9d\xd2\xa5KQ\xbat\xa9\xc4\xe\x83\xd1\x63\xc6S\xdd\xdb\x93\xbe}zabb\x2@\xe5\xca\x95\f\xf5\xabW.\"S\xa6L\x86\xf7\x15\xca\x97\xa5\xb8kyN\x9c\x38\x41\xf9\xf2\xe5\x62\x8dw\xe0\xc0\x41v\xed\x39\xc0\xd1\x43{H\x9b\xd6\x1e\x80\xd4\xa9S\xe3\xd7\xa9'u\xeb\xd4\"m\xda\xb4\x1f\xf7\x82\x44\x44\x44\x44\x44\xe2\xe1\xe0\x90\x91\x8c\x8e\x8e\xdc\xbd{\a{{{Cytt4\xfb\xf7\xef\xc5\xcb\xdb'\x11\xa3{wJ\x2\x89\x88\x88$MJ\f\x89\xc8G\x11\x1e\x1e\xce\xc0!#\x19<\xa8\x1fv)c\xaf\xey\x9d\xb4i\xd3\xd2\xa7w7\x9a\xb5\xecH'\x7f?\x9c\x9c\x32\x11\x15\x15\xc5\xaaUkX\xb6\x62\x15\xf7\xef\aQ\xb3\x86\x17m\xdb\xb4\xc2\xd6\xd6\x96\xe9\x33\x2\x18\x34t\x14\0\xe9\x1d\x9d\xa9\\\xa1\x14\x8b\x16\xce\x5\xe0\xd6\xad\xdbL\x9a<\x95\xdd{\xf6\x91\x37\x8f\x33\x1d\xfd\xda\xe1\xe6\xe6j\x98\xeb\xd2\xa5\xcbL\x99:\x9d\x9f\xf6\x1e$k\x16'Z\xb6hJ\x6\x87\f\xd4\xac\xd3\x14\x80\xdc\xf9K\x2p\xf9\xfc\tR\xa6\xb4%<<\x9c\xf9\xf3\x17\xb2\x61\xd3V\x82\x9f\a\xe3\xed\xedI\xdb\x36\xad\xb0\xb1\xb1\x1\x62\xb6\x89\x8b\x88\x8c\xc0!C\x6\x96,[I\xe1\x42\x5\xf8\xe1\xfb\x91\xb1\xae\xf1\xf6\xad\xdf\x19?~\x12[\xb6m'Y\xb2\x64\xb4l\xd1\x84:\xb5k\x19\x12,\xc1\xc1\xc1\xcc\f\x98\xcd\xc6\x8d[\xb1\xb1\xb5\xa1Q\xc3z\xd4\xadS\x8b\x64\xc9\x92\xb1k\xd7\x1e\x1a\x34i\xc3\xb5K\xbf`mm\r\xc4\xac\xf8\x99\x36=\x80\xb3\xe7.P\xa5r\x5\xc2\xc3\xc3\xb1\xb4\xb4\xe4\xab\x1}\rsn\xdd\xb6\x9dy\xf3\x17\xf2\xf3\xa1\x63\x94+[\x8a\xee\xdd\xba\xe0\xe8\x98\x91\xc3G\x8e\xc6y\xbd!!!\xf8u\xec\x42G\xbfvT\xaaT\xc1(\xfe+W\xae\xb2|\xd5&\xe\x1f\xd8n\x88\xf9\xef\xfe\x9a\x14\x82\x98$\xf@x\xf8\xab\x38\xdb\xaf[\xbf\x91\xfa_\xd4\x34$\x85\0\xca\x96-Mdd\x14\a\xf\x1e\xa2\x46\x8d\xea\x46\xed\x3\x3\x3)\xe1Z\x8eQ\xdf\r\xe6\xa7\xbd\xfb\x39z\xec$\x95+\x95\xa3s\xa7\x8e\xfc\xfc\xf3!\xd6m\xd8\xc4\xc5\x8b\x97\xa9\xe5[\x1d\xbf\xe\xed\f_\xa3*\x9e>\xd4\xae\xe5\xc3\xf5\x1b\x37\xd9\xbdg?y\xf3:\xd3\xabGWBCCY\xb4x)\xfb\xf\x1c\xa6\xd4g\xae\xf4\xe8\xd1\x95,\x99\x33\xc7\x19\xab\x88\x88\x88\x88$-\xaf^\xbd\"O\x9e\xbc\xd4\xaf[\x9b\xde}\xfa\x91\xdc\xcc\x8c;\xbf\xff\xce\xdc\x39\xb3\0(^\xdc\x85\x45\v\x17\0\xe0\xe8\x98\x89\xf2\x15*\xbcn8\x11\x11\x11\x91\x44\xa5\x33\x86\x44\xe4\xa3\x98>s.\x99\x9d\x32\xe1[\xc3\xfb\x9d\xfa\xe7\xcf\x97\x17\x80\xdb\xb7o\xc7\x8c\x37=\x80\xc5K\x96\xe3\xef\xd7\x8e\xfe}{p\xec\xf8I\x6|5\x90\xe8\xe8hj\xf8xS\xb2\x44!\0v\xfd\xb8\x96\x41\x83\xbe\x2\xe0\xc1\x83 \xaaU\xafM\xf6\xec\xd9\x18?\xee\a<\xdc\xdd\xf0\xa9\xd5\x98S\xa7\xcf\0\x31I\xa1*\xd5j\x91+WN&\x8c\xff\x81\x96-\x9a\x62\x66\x66\x46\xbe\xbcy\xe8\xd7;\xe6\xc9\xb9\x15Kf\xb1\xeb\xc7\xb5XYY\x11\x1d\x1dM\xdf~_\xb1}\xc7n:\xfb\xb7\xa7{\xb7N\xac[\xbf\x19\xbf\x8e]\x8c\xce\xe6\x19\x33~\x6\x87\xe\x1f\xa5M\xeb\x16\xd4\xac\x19\xfb\xc9\xc1\xa8\xe8(N\x9d\xbd\x44\x44\x64\x4}{w\xa7\x42\xf9\x32\xf8u\xea\xc3O{\xf7\x1\x10\x19\x19\x89_\xc7.\xdc\xbd{\x8f\x61\xc3\x6\xd2\xa8\xc1\x17\x8c\x1b?\x99\x65\xcbW\xc6y\xafN\x9c\x38Iu\xdf\x86\x94(Q\x8c\x11\xc3\x6\x62i\x99\x82\x99\xb3\x17\xc7:si\xc2\xe4YT\xaeT\x91\x81\xdf\xf4\xe5\xca\x95k\xf8w\xea\x46\x44\x44\x64\xbc\xd7\xfb\xec\xd9\x33\x8e\x1e\xff-\xces\x81~\xff\xfdw f\xfb\xb7\xbe\xfd\xbe\xa2\xb8K)\x9a\x36\xfb\x92\x83\a\x7f\x8e\xf7kz\xe1\xc2\x45\0\xf2\xe5\xcf\x1bg\xfd\xd9s\x17\xc8\x9e=\x9bQ\x99\x8d\x8d\r\xf9\xf3\xe6\xe2\xce\x9d;q\xf6\t\x7f\x15\x41\xe7\xee\x3\xf0\xf6\xaa\xca\x80\xfe=9q\xf2W\x8a\x94(\xcd\x8f\xdbw\xd2\xb8\x61}:wj\xcf\xcaU\xeb\x98\x30q\x8a\xa1\xcf/\xa7\xce\xf3\xcd\x90\x1f(Z\xa4\x30\xc3\x86~M\n\v\v*T\xf1\xc5\xbb\x66\x43\xca\x96-\xcd\xe0\x41\xfd\xb9{\xf7\x1e\xed\xdbw\xe2\xd5\xab\xb8\x93X\"\"\"\"\x92\xb4\xdc\xbd{\x87\a\xf\xee\x93\xcb\xd9\x99M\x9b\x36\xb0n\xedj\x8e\x1c>\x4\x80\x83\x83\x3\a\xe\xec\x63\xdd\xda\xd5\xac[\xbb\x9a\xdf~\xfd%\x91\xa3\x15\x11\x11\x11y=\xad\x18\x12\x91\xf.44\x94\xc9S\x3X\xbah\xd6;\x8f\xf1\xe7\x39\x37O\x9e>\xe5\xd1\xa3\xc7\f\x19\x31\x9a\xcd\x1b\x96S\xach\x11 \xe6\xc3W\x15\xaf\xba\xf4\xef\xd7\x87\x8c\x19\x33\xe2\xed\xe5\x89\xb5\x95%\x5\v\x16\x30\x8c\xb1l\xf9\n<\xdc\\\f\xe7\xd3x\xb8\xbbq\xf2\x97_\xd9\xba\x65\x1b\x85\n\x16`\xe2\xa4)\xb4i\xd5\x94\x8e~\xed\x63\xcd\xef\xfe\xc7\xaa\xa2\"E\n\x1b\x62\xf9\xe5\x97_Y\xb8\x64\r\xbf\x9d\xd8\x8f\x83\x43\x6\0\x9c\x9ds\xf1y9/\x8e\x1c\x39\x8a\xbb\xbb\x9b\xa1\xff\xa4\x89\x63I\x9e<\xee\x1f\xb1\xa6&19\xf9\x1e\xdd\xbb\x2P\xae\\Y\xb6\xef\xd8\xcd\xde\xbd\xfb)W\xb6\f\x87\xe\x1f\xe1\xa7}\x87\x38w\xfa(VVVx\xb8\xbb\x11\xf6\xf2%\xb3\xe7\xcc\xa7Q\xc3\xfa\xb1\xc6\x9b\x30i*=\xba\xb4\x37\\g\xd9\xb2\x65\x18\x35v\x1a)\xff\xb6Rk\xe1\xdc\xa9T\xa9\x12\xb3\xd5\x9b\x8d\xb5\x35\xf5\x1b\xb7\xe1\xce\xdd;d\xc9\x9c\x39\xce\xeb\xcd\x93'7gO\x1d!eJ\xdbXs\xde\v\f\x4\xa0O\xdf\xaf\xa8^\xbd\x1a>>\xde\x1c:t\x18\xdf\xba\xcd\xd8\xbe\x65\x15\x45\x8a\x14\x36j\x1f\x19\x19\xc9\x98\xb1\x13\xe8\xda\xa9M\x9c\xabp\xa2\xa3\xa3\x39}\xe6\"M\x1b[\xc7\xaa\xcb\x90!\x1d\x41\xf\x1f\xc5y/!&\x99U\xb6l\x19 \xe6\xde\xb6\xe9\xd0\x9d\xc1\x83\xbe&C\x86\x98\xf3\xa9\x1e>|\xc4\x94i\xb3\xe9\xdb\xa7'\xa6\xa6\xa6\x14\xc8\x97\vw7\x17\x1a\x34\xa8\a@\x8e\xec\xd9Y\xb3~\x1b\x33\xa7\x8e\x31$\xf2R\xa5JE\xad\xba\xcd\xb8y\xf3&9s\xe6\x8cwn\x11\x11\x11\x11I\x1a\xb2\x65\xcb\xce\xf2\x95k\x12;\f\x11\x11\x11\x91\xf\x42\x89!\x11y/\x81\x81\xfX\xb0h\x19\xfe~\xadI\x91\"\x5\0\xf3\x17.\xa3H\xe1\x82\x14-R\xe8\x9d\xc7}\xf2\xf4)\0\x99\x9d\x9c\xb8q\xf3&\x91\x91Qxz\xd5\x8d\xd5.88\x18\xc8\x10\xe7\x18\xbf\xfez\x8au\x1b\xb7\xb3\xce\xd1\xd9\xa8\xbcU\x8b\x6\x44\x45\x45\xb1\xf5\xc7\xdd\x8c\x1f\xf3m\x82\x63\xbax\xe9\x12\x85\xf2;\x1b\x92\x42\0\xb9s;\xe3\xe8\x90\x8e+W\xae\x1a\x12\x43\xd5<\xcb\xc5\x9b\x14\xfaS5\xcfrF\xef]J\x14\xe3\xf1\xe3\xc7\0\\\xbet\x99\xd0\xb0p\xb2\xe5*b\xd4\xc6\xda*E\xacq\"\"\"\xd8\xbd\xe7\0M\x9b\x34\x34*\xaf]\xb3j\xac\xb6i\xd2\xa4\x36\xfc;k\xd6\xac\0\x84\x4\x87\xbc\x36\xce\xb8\x92\x42\x80\x61[\xb6\x81\x3\aP\xa4p\xcc\xd7\xb9\xd4g\x1e\\\xb8p\x89\xb5k\xd7\xc7J\fM\x99:\x9d'O\x9f\xe1\xdf\xb1\x43\x9c\xe3\x99\x98\x98\xe0\x9c+\x1b\xcf\x9e=\x8fU\xf7\xf0\xe1#C\x92'.\x7fn\xa7\a\x90-[\xccu\xbdz\x15n(\xcb\x95\x33\aA\xf\x9f\x10\x11\x11\x81\xb9\xb9\x39\x66\xc9\x93\x93+g\xe\x43\xbd\x93S\xcc\x96w\x16),\fe\x7f&\xaf\x82\x43^\xc4;\xaf\x88\x88\x88\x88\xc8\xbf\xdd\xb6\xad[\x8c\xde{V\xad\x96H\x91\x88\x88\x88\xc8\xa7\xa4\xc4\x90\x88\xbc\x17kk+\xb6\xfd\xb8\x93\xf3\x17.2s\xdax\xa2\xa3\xa3\x99\x11\x30\x97I\xe3\x7fx\xafq\xcf\x9f\xbb\x80\x65\ns2gv\xe2\xde\xbd\x98\xd5)\xf3\x66M\xa2P\xa1\x2\x46\xed\x32\x64\x88;)\x4\x90:u*\n\xe4\xcb\xc5\x82y3\x8d\xcaS\xa4\xb0\xe4\xe5\xcb\x97 u\"\xd3\xa6\xcf\x64\xc4\xb7\xa3H\x95\xca\x8e\x1a>^4m\xd2\xe8}o_,#\x86\xf\x61\xd1\xe2\xa5\xcc\x9e\x33\x9fK\x97\xaf\xe1R\xbc\b-\x9a\x37\x89\xb3m\x99\xd2\x9f\xb3l\xd1L\x2\x66\xcd\x65\xc3\xc6\xadxW\xab\x42\xf1\xa2\xf9\xb1\xb2\xb6J\xf0|q]\xaf]J;\x8a\x14\xca\x87\xe3\x1fI\xa3\xbf\xab\xe5[\x13KKK\x96.[\xc9\xec\xb9\v)_\xae\x34\xdb\x36\xaf\x31\x9c\xc1\x34h\xf0H\0\xfa}=\xc2\xa8_\xbe<9\xf8i\xf7\x36\xd2\xa7KG\xf1\xa2\x5\xb0\xb3\xb3\x3\xc0\xc2\xc2\x82\xd9\x1\xd3\x99\x36}\x6\xdf}?\x16\xa7L\x19\x19\x31\xec\x1bj\xf8TO\xf0u\x88\x88\x88\x88\x88|\f\x81\x81\xf7\b\xe~N\xe5*\x9e\x46\x9fS\xac\xad\xad\xa9P\xb1\x12\xe7\xce\x9dUbHDDD\xfe\x35L.\\\xb9\x13\x9d\xd9\x31\xe6\xac\x88[w\x1e\x90;G\x2\xcfq\x10\x91\x7f\xbc\xd0\xb0\x98m\xc1n\xddy\xc0\x9f\xdf\xe7\xf1\xf9k\x9bw\xfdY\x10\x1d\x1dMXX\x18\x96\x96\x96o\x1f\xac|0QQQT\xac\xecM\xa7\x8e\xed\xa8]\xdb\x37\xb1\xc3\x11\x11\x11\x11\x11\xf9h.^\xbdk\xf4\x39\xe6m>\xf7<\xf\tN\xf0\xa3\xba\xde=\xbb\x93\xbf@\x1Z\xb4l\xf5\x96\xd1'\xae\x2y\x9d\xe9\xe8\xdf\x39V\xb9\x9f\x7f\xa7\x44\x88\x46\x44\x44\x44>6[\xeb\x98s\xcdo\xddy\xa0\x15\x43\"\xf2\xe1\x98\x98\x98()\x94\b\x82\x83\x83\x99\x33w>yr\xe7&U*;\xf6\xfc\xb4\x97\xa8\xa8(*W\xae\x98\xd8\xa1\x89\x88\x88\x88\x88\xfck\x5\x5\x5\xb1m\xeb\x16\xc3\xfb\x17/^P\xa7V\r\xaa\xfb\xd4\xa0p\x91\xa2\x44\x44\x44\xf0\xfd\xb7\x31\xab\xe3}k\xd5N\xac\x30\xdf\x8b\x92@\"\"\"I\x93\x12\x43\"\"\xffr\xe1\xe1\xafx\xfe<\x98\x91\xdf\x8d&22\x92\xca\x95\xca\xb3\x62\xf9\x42lmm\x13;4\x11\x11\x11\x11\x91\x7f\xad\xe0\xe0\xe7\xac[\xbb\xda\xf0\xbe@\xc1\x82\x9c\x39}\x9a\x8d\x1b\xd6s\xed\xdaU\xa3\xb6G\x8f\x1c\xe1\xb3R\x9f\x7f\xea\x10\x45\x44\x44\x44\xde\x89\x12\x43\"\"\xffri\xd2\xa4\xa6\x7f\xbf\xde\xf4\xef\xd7;\xb1\x43\x11\x11\x11\x11\x11\xf9\xcf\xc8\x96-;\xcbW\xaeIp\xfb=\xbbwq\xfb\xf6-\x9a\x34m\xfe\x11\xa3\x12\x11\x11\x11y\x7f\xa6\x89\x1d\x80\x88\x88\x88\x88\x88\x88\x88\xc8\xbf\xdd\x83\a\xf\xb8r\xf9Jb\x87!\"\"\"\xf2\x46J\f\x89\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88$\x11\xdaJNDDDDDDD$\t\xda\xb6u\x8b\xd1{\xcf\xaa\xd5\x12)\x12\x11\x11\x11\xf9\x94\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11I\x82\x94\b\x12\x11\x11I\x9a\xb4\x95\x9c\x88|t\x91\x91\x91\x84\x86\x86&v\x18\"\"\"\"\"\"\"\"\"\"I\x9e\x12\x43\"\xf2Q=z\xf4\x18\xd7\xcf*\xb2s\xd7\xdeXu\xe7\xce\x9d'\xbd\xa3\xb3\xe1\xe5\xe6Q\x8e\xce]\xbas\xec\xd8\xf1\x44\x88\x34\xe1\x9e={\xc6\x8b\x17/>\xea\x1c\xbbv\xed!\xbd\xa3\x33!!!\xf1\xb6\xa9\xe2\xe9\xc3\xacYs>\xc8|\x81\x81\x81\xa4wt\x8e\xf3\xdeGDD\xf2\x65\xabv\xcc\x9b\xb7\xe0\x83\xcc\x15\x97Q\xa3\xc6\xd2\xbc\x65\x9b\x8f\x36\xfe\x87\x16\x15\x15\x45zGgV\xaeZ\r@X\xd8K\x16-ZB\xab\xd6\xed)Z\xfc\x33Z\xb7\xe9\xc0\x91#G?\xd8|\xc1\xc1\xc1L\x9e\x32\r/o_ \x9a\x8d\x9b\xb6q\xf4\xe8\t\xf6\xee\xd9\xfc\xdav\x85\x8b\x14\"O\xee\xdc\0\x94-[\x86\xad\xdbvr\xe8\xd0\xe1\x7flb(\xa9I\x9e<\x19\xb3gMO\xec\x30\xfe\xd1\xfc;v ]\xba\xb4$K\x96\f\x80\xea\xde\xde\\\xbb^\x83m\xdb\xb6\xbfwb\xe8\xde\xbd{\xac\\\xbd\x99u\xab\x16\xe0\xe1\xe1\xe\xc0g\x9fyP\xa0\x88\a\xe7\xce\x9f\xc7\xcd\xb5\xa4Q{\x1b\x1b\x1b\x43\xbb?\x9d\x39{\x16\x80z_\xd4\x1\xe0\xd4\xa9\xd3\x8c\x1d?\x9d\x83\xfb\x7f$K\xe6\xcc\x86v\xb5k\xfb\xbeW\xac\0\a\xe\x1c\x64\xd7\x9e\x3\x1c=\xb4\x87\xb4i\xed\x1H\x9d:5~\x9dzR\xb7N-\xd2\xa6M\xcb\xe2%\xcb\xc8\x99#+\xbdzu\a\xa0\x62\x85\xf2XZY\xf2\xedwc\xa8T\xb1\x2\xe6\xe6\xe6\xef\x1d\x87\x88\x88\x88\xc8\xa7V\xb6l9\\]\xdd\x12;\x8c\xb7\x32\x65\xd2\xc4Xe~\xfe\x9d\x12!\x12\x11\x11\x11\xf9\x94\x94\x18\x12\x91\x8f\"<<\x9c\x81\x43\x46\x32xP?\xecR\xa6Lp\xbf\x17/^\xf0\xf0\xd1\x13\xf2\xe6\xcbk(\v\xe\xe\x66\x66\xc0l6n\xdc\x8a\x8d\xad\r\x8d\x1a\xd6\xa3n\x9dZ$K\x96\x8c{\xf7\x2Y\xbe|%{~\xda\xc7\xe5\xab\xd7qw-A'\xff\xe\x14*T\x10\x88\xd9\x92m\xf4\xd8\t\xd4\xafW\x87\xcd\x9b\xb7q\xfb\xf7;4\xa8_\x87\x86\r\xea\xb1t\xd9\n\xb6l\xdd\xce\xabW\xafh\xd9\xbc\t\xf5\xea\xd5\x35\xac\xa6\xd8\xb5k\xfs\xe7-\xe0\xd8\x89\xdf\xc8\xec\x94\x91\x46\r\xeb\xd1\xbcY\x13\x1a\x37i\xc1\x9e}G\xd8\xb3\xef\b\x83\x86\x8e\x62\xe8\xa0>\xb4k\xdb\x9a\xe8\xe8h~\xfcq\a\x8b\x97.\xe7\xfc\xf9K\x94+[\n\xff\x8e\x1d\xc8\x9c\xd9\xc9\x30\xde\xe4\xa9\xd3i\xd4\xb0\x1ek\xd6\xac\xe7\xd6\xed;\xd4\xadS\x93\x36\xad[\x91\"E\xfc+4\xc6\x8d\x9f\xc4\x96\xad\xdbI\x95\xca\x8e/\xea\xd6\xa2q\xa3\x6$O\x1e\xff\x8f\xee\xb3g\xcf\x31}F\0\a\xe\x1e\xa1h\x91\x82\xb4i\xdd\x12\x37\x37WC\xfd\xabW\xafX\xbcx)\xeb\xd6o\xe2\xe6\xad\xff\xb1w\xdfQQ\x1dm\x1c\xc7\xbf\xa0\xa8\x88\x82\x88\x5\xc1\x86\n\xf6XP\xec\x62\x5{CE%j\xec\xbd\xf7\xae\x89\xbd\xc4\x12{\xef\xb1G\xa3Q1j\xb0\xf7\xf6*\x96\x44Ml(*h(\x8aHy\xff n\xdc\x80\x11+F~\x9fs8\x87\x9d;3\xf7\xb9\xc3]`\xf7\xd9\x99\xb9\x43\xa5\x8a\xe5\xe8\xdb\xb7W\xac~\xfc\xfc\xfc\xf0h\xe4\x45\xad\x9a\xd5\x18<\xa8?\xee\xd5\xea\xe0\xd9\xb8\x1m\xda\xb4\xc2\xdf\xdf\x1fg\x97\nL\x99\xf4\r\xfb\xf6\x1f\xe0\xf8\xf1\xd3Tp-C\xef^=\xb0\xb3\xcb\x64\xe8\xe3\xd4\xa9\xd3\xcc\x9d\xb7\x90\x8b\x97\xae\xe0V\xb5\x12\xe1\xe1\xe1\x98\x9b\x9b\x33t\xc8\xc0\x38\x63?\x7f\xfe\"C\x87\x8d\x64\xfb\x8e\x9f)\x90?\xf\xad[\xb5\xa0\x42\x5\xd7x\xdd\a\x17.\xf8\xb2n\xfd\x6\x8e\x1e=\xc9\x9f\x41\xc1\xb8\xbbU\xa4K\xe7Nd\xcc\x98\x1\x88Y\xaa\xee\xd1\xe3\xc7X\xa7I\xc3\xae\x9f\xf7\x92,y2:\xb6oC\xe1\xc2_\xb0`\xc1\x62\xf6\xfc\xb2\x9f\xcc\xf6v\xf4\xea\xd9\xd5\x30^G\x8e\x1e\x63\xcc\xd8\x89|7}2\xe\xe\xe\xaf\x1cs\x88\x99\xa5\xf3\xb2\xa4I\x93`oo\xc7\xb3g\xcf\x62\xd5=y\xf2\x14\x35\xea\x34ye_\xf7\xfd~3z\x9c\"\x85\x39\0w\xfc\xfc\feAA\x7f\x2\x90\xe9\x1f\xe7}\x95\r\xeb\x37\xe1^\xa5\x1cy\xffz^\xadY\xbb\x9e\xd6_51J\n\xfdSTT\x14\x1b\x37\xfe\xc0\xda\xf5\x1b\xb9\x7f\xff!u\xeb\xd4\xa0}\xbb\x36\xa4N\x9d\xfa\x95m\0\xb6\xfc\xb8\r\xcf\x46u\rI!\0W\xd7rDFFq\xf8\xf0Q\xea\xd4\xa9\xc5\xf9\v\x17\xa9Z\xa5\xa2Q;7\xb7*\f\x1d\x31\x9e+W~5<\x7f\x45\x44\x44\x44>\x15\x61\x61\x61\xdcy\xc5R\xbe\0\xe6)\xcd\xb1\xb3\xb3\xff\x88\x11\xbd\x1fJ\x2\x89\x88\x88$NJ\f\x89\xc8\a1o\xc1R\xb2\x64\xb6\xa7^\x9d\x9a\xaf\xad;v\xdc$\xca\x97-\x8d\xcf\xbe\x3x\xef>@\xde\xdc\x39(S\xba\x14\0\x91\x91\x91t\xee\xd2\x3[\xdb\x8c\x8c\x1e=\x82\x9b\x37n2m\xfa,\"##i\xd6\xd4\x93\xa0\xa0 \x2\x2\x2h\xd6\xac\x31\xe9ll\xd8\xbe\xc3\x9b\x46MZr\xc0\xc7\x9b\xf4\xe9\xd3\x1p\xe2\xd4y2fHO\xbb\xb6_q\xf3\xd6m\xc6M\x98\xca\xd7\x63\xbe\xa5w\x8f\xf6\xf4\xe9\xd5\x8d\v\x17|\xe9\xde{\bi\xd3\xa6\xc5\xcd\xad\n'O\x9e\xa2\xc9\x97\xed\x98:\xe9k\xbat\xee\xc0\xed;wH\x93&\r\0#G\xe\xe5\xe7\xbd\xd5)\xee\\\x90\t\xe3\xbe\xc1\xc6&-\0\xeb\xd6od\xc2\xc4\xa9\f\x1b\xda\x1f\xab\xe6V|\xbf\x66\x1d\xd5k5\xc0g\xcfv\xd2\xa5\x8b\x89\xe3\xc0\xa1\x93\x44\x44\x44\xd2\xb5K\aBCC\xf9\xfa\x9b\t\xdc\xbf\xff\x80o\xbe\x1e\xf1\xca\xb1\xf9\xed\xea\x35\x46\x8d\x1c\xc2\xbd{\xfe\x8c\x18\x35\x8e\a\xf\x1e\xd2\xb7O\xcf\x38\xeb\xfa^\xbc\x88{u\xf\x86\r\xe9\x83\x87G}\xe\x1e }\xda\x64\xc3L\x87\xabW\xaf\xb1`\xf1j\x6\xe\xe8\a@\xc5\x8a\x15\xf0\xd9\x7f\x10\x9f}\xfbqs\xab\xc2\x95+\xbf\x92!\xbd\x35\r\x1a\xd4\xc3\xdc\xdc\x9c\x97\x17\x83p\xcc\x95\x8b\n\xe5\\\xa8P\xa1<\x5\xfeZ\",$$\x84\x11\xa3\xc6\x31\xfb\xbb)T\xaaT\x1\x80R\xa5JP\xa9J\r6l\xd8\x44\xc7\x8e\xed\r\xed\x97.\x9e\x8f\xb5uL\x92)\xad\xb5\x35\r\x9b\xb4\xa6\x43\xfb\xb6\x64\xcel\xfc\xe9\xc2h\xa2\x1\x98\x31m\xb2\xe1\x8d\xfa\x34VV\xb4j\xd7\x9d\x16\xcd\x9b\x91!C\x86X\xe3\x38}\xfa,zvkO\x87\xf6m\x1(_\xae,\x8f\x1f?f\xda\xf4Y\xac)Y\x2_\xdf\x8b,X\xbc\x9a\x33'|\xb0\xb7\xb7\x37\xd4\x1\f\x89\xa1\xe0\xe0`\xbau\xefM\xbat6\x8c\x19=\n33\xb3W\xfe\xdc\xd6}\xbf\x88\n\x7f\x8dq*\v\v<\xbd\xda\xe1w\xd7\x8f\xacY\xb2\x30\x63\xe6\x1c\xfa\xf4\xe8h\xd8S\xc6\xd5\xb5<\x93\xa7\xce\x35\\\xcb?\x5\x6\x6\x2\xd0\xad[\x17\x43\xfd\xd0\xd0P&L\x9aJ\xc5\x8a\x15^{\x1fT\xab\xe6N\xb5j\x7f\xef\x63\x65\x66\x96\x14O\xafv<|\x18@\xfa\xf4\xe9\x30\x35\x31%\x99YR\xbau\xed\f@\xd9\xb2\x65\xd9\xb8\xe9GJ\x96,\xc6W_\xb5\0\xa0h\x91\xc2,_\xb5\x91\xd3\xa7\xcf\x90\x35K\x16\x1a\x34\xa8G\x95*\x95\x63\xed\xe1\x13\x1f\xcb\x96\xaf$o\xee\x9cT\xae\\)\xd6\x31\x1b\x1b\x1b\xa3{3>\xea\xd5\xab\xc3/\xfb\xe\x30t\xc4x\0\x9ay\xd6\x8d\xb3\xef\xb8\xfc\xf4\xd3v\xb2\x64\xb6\xa5l\xd9\xd2@\xccL\xa0Sg.p\xfc\xe4\xffh\xe1\xe5\x41\xb7\xae\x1d\x89\x8c\x8a\x62\xea\xb4\x99\xfc~\xe3\x6\xb3\xbe\x9b\xc6\xa3G\x8f\xf9z\xec\x14\xb6o]G\x91\xbf\x96t\xb4\xb5\xb5\xc5\xad\x46\x43\x6\xf\x1a\x10k\x86\xd4\v\xd1\xd1\xd1\\\xf0\xfd\x95\xe6^\x16\xb1\x8e\x65\xcc\x98\x9e\x87\x1\x31?\xe7\xfa\xf5\xeaP\xb3nS\x9c\x9c\x1c)\xe6\\\x94+W~\xe5\xc7m1KN\x6\a\a\xbf\xd1\xd8\x88\x88\x88\x88|\f\x99\xb3\x64\x61\xbb\xf7\xeeX\xe5\xf\xee\xfb\xd3\xb2\xb9\x17\xf5\xea\x37H\x80\xa8\x44\x44\x44\x44\xde\x8e\x12\x43\"\xf2N\xfc\xfd\x1f\xb0\x62\xd5Z\xbavnK\x8a\x14)\0X\xber-\x85\xbe(@\xe1\x42\x5\xe3\xd5\xc7\x1\x9f\x9f\f{\f=z\xf4\x88\xa9\xd3\x66\xd0\xab\xef\x30\\\xcb\x97\xe5\xeaoWy\x1a\x16N\xf6\\\xc6\xfb\rY\xa4La\xf8\xde\xd7\xf7\";v\xee\xe2\xc8\xd1\x63\x9c>s\x1\x80\xa7\x61\x61\x46\xf5_,\x11\a\x90;\xb7\x13\x39\x1d\x32\x1b\x1d/\\\xe8\v\xee\xdc\x89\x99\xcdP\xae|Y\xe6-XB\x8dZ\rh\xe8Q\x97\xaaU*\xe3\xe4\xe4\xf8\xca\xf8o\xdd\xbeM\xe0\xa3 \xc3\x32]\0\xe6\xe6\xe6\xb8W\xad\xc4\xff.\xf8\x1a\xd5M\x96\xec\xef\x44K\xfe\xfc\xf9\x62\xda\xdf\xba\x15+1dB\xcc\x8c\x8c\x17{\xd6\0\x38;\x17\x5\xe0\xc6\x8d\x9b\xb1\x12\x43\x11\x11\x91\xfc\xbcg?\x9e\x8d=\x8c\xca]\xcb\x97\xa3m\xc7\x9e\x84\x87\x87s\xf9\xca\x15\xb2g\xcd\x64H\n\xc5\xc5\xd3+&\x91s\xf9\xc2\x31\xcc\xcd\xcd_Y\xf\x62\x92\x41/d\xcb\x96\r\x80\xd0\x90P\"\"\"\xf8\xc5\xe7\x10\xcd\xbfljT\xbf\x41\xddj\xaf\xec+\x93\xad-\xd5\xaa\x1a'K\xca\x95/\xcb\xec\xf9\xcb\t\t\ty\xed}\x10\x1d\x1d\x8d\x8f\xcf>v\xef\xf9\x85\xf3\xe7}9z\xe2\x1c\0\xcf\x9e\xfd}\x1fT\xaeT\xd6\xf0}\xd2\xa4I(^\xac\bv\x99\xfe^\xfa\xce\xda\xda\x1a\x87l\xf6\x46\x89\x89\xb7I\n\x1d \xb8\xd7h@s\xaf\x86\x8c\x1a\x39<\xee\x65\xd5\xc2\x9f\x3\x10\x15\x15iT\x9e,yr\xccS\xa4\x88U\xff\x85\x17\xc9\xaa\x64\xc9_\xbd\xc7\xd0\xcb^\xec-\x94\x34\x8e\x64\x43TT$a\xcf\xc2\x89\x8c\x8c\x32*733#E\xf2\x64\x98\x9a&!8(\x98\xa8\xa8\xe8\x7f=G\xeb\x96\x9e,^\xb6\x96\xad[\x7f\xa2\x65\xcb\xe6\xf1\x8a\v\x8c\xc7\x34**\x8a\xf0\xe7\x11\x44\x45\x46\xbe\xba\x41\\}\xbc\x94\xbc{\x11;\xc4$\xc7^w\x1f,]\xb6\x82\x95+\xd7\x30\x62\xc4`:ul\x87\xaf\xef%\x9a\xb7\xeaL\xf4\xbf\\n\\?KS\xd3W/\x91\x16\x1f\x97._\xa6u\xdb.,\x9c\x37\xc3\x90\xec\xfc\xa7\x37\xdd\x63h\xa7\xf7.n\xdf\xb9\xc7\xc0\x1}\r\xf7\xc0\xc4\t\xe3h\xec\xe9\xc5\xc2\x85K\x98\x30~\xcc+\xfb\xda\x7f\xe0 w\xfc\xfc\xa9Q\xdd\xdd\xa8\xbcx\xb1\xc2\xa4\xb3Ik4\x6\x99\xfeJ\x92\x5>z\x84\x45\xca\x94\0,[4\x93\x82\x5\xf3\x1b\xb5\xcd\x98\x31#\x87\xf\x1f\xa1Q\xd3\x36\x46\xe5\x87\xf7\xef$W\xae\x9c\xe4\xcd\xeb\xc4oW\xaf\x1a\x1d\v\v{\xc6\xafW\x7f\x37\xda\x83\xaa\x42\x5W\xa3=\xa4\xae]\xbb\x6\x80\xfdKuDDDD\xfe\v\xee\xde\xbdKxxxB\x87\xf1V\xbcw\xee\x30z\xec^\xed\xd5\xcb\xe5\x89\x88\x88\xc8\xe7\x43\x89!\x11y'\xa9RY\xb0\x66\xd5\"\xdckz0o\xc1Rr;\xe5\xc2\xc2\xc2\x82R%\x8b\xbfu\x9f/\x12&666\xa4M\x1b\xb3\x87\xcf}\xff\xfb\xb8\xb8\xc4\xee\xf3\xd0\xc1\xc3\x14)\x94\x9f\xfa\xf5\xea\x2\x31\x9b\xc2\x2\x84=\r\x8bU\xf7M\x98\x99\x99Q\xbat)J\x97.E\xf1\xe2\xce\xb4h\xd5\x85\x1e\xdd\xbb\x62\x63\x63\x83\x89\x89\xa9\xd1\v\xbf\xacY2\x93$\x89)\xa7\xcf\x9c\x35\xcc\xc6\x89\x88\x88\xe4\xe0\xc1\xc3\x34ib\xbc\xa7\xce\xcd\x9b\xb7\f3\x8b~\xfd\xf5\x37\x92\x99%%[\x1c\xfb\xc4\xbcXJ\xee\xf9\xf3\xe7\x86\xb2\xcb\x97/c\x9e\"Y\x9c\xf5\x93%KF\x99R\xce\x1c }\xf9\xaa\xfb`\xf3\x96m\xd4\xabW\xcb\xb0\x34\xde\x8b\xfdk\xfe\x65+\x9cx\t\r\r\xc5\xc2\"\xf6\xb2hq\xb9r\xe5W\x9a\x36k\xcd\xf4o\xc7\x1b%<\xfe\xc9\xc1\xe1\xcd\xf6\x18z\xf6\xec\x19O\x9f\x86\x11\x16\x16\x46\xaaT1\t\xb2\xa4I\x93\xe0\xe0\x90\xcdp\xbf\xc7\x15ktt4\x8b\x97,\xa7}\xdb\xe6\x86}\xae^\xa8]\xb3:#\xbf\x19\xcf\x88\xa0 \xc3\xf2~\x17|cf\xb7\x65\xc9l\x8f\xb9yJ\xd2\xd9\xa4\xe1\xd6\xed\xdbT\xffGR\tb\x96\xfa\xfbg\x2\xeb\xef\xbek\xd0\xae\x63O\x6\xf4\xef\x63\x98\xfds\xf4\xd8\x31\0\xc3\xde\x61\xff\x14\x1d\x1d\xcd\x9a\xb5\x1bh\xe6Y7^\xfb&\x89\x88\x88\x88|l\x7f\xfe\xf9\x98\x13\xc7\x8f\x1b\x95\x45\x46\x46r\xfe\x7f\xff\x63\xf3\xa6\x8d\xcc\x9d\x1f\xff\xff\xef\xe2\x32\x61\xfcX\x96/]\x12\xab|\x8f\xcf\x1lmm\x81\x98\xd7:\xabW\xae`\xf7\xee]\xa4NmI\xcdZ\xb5\xa9]\xa7\xae\xd1\x87}\xa2\xa3\xa3\xd9\xb1\x63;\xdb\xb7m\xc5\xff\xde=\xaa\xb8\xb9\xd1\xa2\x65\xabW\xae\x6\xa0\x44\x90\x88\x88H\xe2\xa4\xc4\x90\x88\xbc\x33\x1b\x9b\xb4,\x9c\x37\x3\x8f\xc6-\xc8\xed\xe4HSO\x8f\xd7\x37z\xc9\x85\v\xbe\x4\a\x5\x13\x1d\x1dMpp\bk\xd7m\xa0v\x8d\xca\xe4\xc9\x93\x1b\x33\x33\x33Zxy\xd0\xb9koF\x8d\x1cL\xf6l\xd9\xb8}\xfb\xe)R$\xc7\xd5\xb5<\xd9\xb3g\xe3\xe0\xf8i\xac\\\xb9\x1a\x87\x1c\xel\xd9\xb2\x35&\xa6t6o}=?\xef\xde\xc3\xb5k\xd7)\x90?\x1f\xc9\x92%c\xcf\x9e_\xc8\x9b;\aVV1{\x3\x15(\x90\x8f\xed\xdbwQ\xa6Li,R\xa6$_\xbe\xbc\f\x1e\xd0\x83>\xfd\x86\xf2$\xf4\t\xf6\x99\xed\xd9\xbe}'!\xa1OhP\xbf\xaeQ\xdf_\xb5\xee\xc8\xd0!\xfdH\x9e,9c\xc6Mb\xf0\xc0\x9e\xa4\xfb\x97X;v\xeaN\xbbv\xadx\xf2\xe4\t\xa3\xc7Lb\xe8\xe0>\xa4Mk\r@\xfa\xf4\x36\\\xf0\xbd\xc8\xc5\x8b\x97\xc8\x97//={t\xa5\x41\xa3\x96X[[S\xc2\xa5\x38\xbe\x17/1s\xf6\x62v\xed\xd8\x4@\xe9\xd2\xa5(\\0\xf}\xfa\xe\xa4{\xf7\xce\xa4L\x99\x92\x33g\xce\xd2\xa8\xa1\xf1z\xe8\xad[\x7f\xc5\xb5\xeb\xbf\xd3\xb6\x43w~\xda\xba\xfe_\x97*{\x95\xee\xdd:\xd3\xd0\xb3\x15Vi\xacpq)\x8e\xaf\xef\x45\0\"^Jt\xbd,\xfa\xaf\xa9=S\xbe\x9d\x46\t\x97\xe2\xfc\xfa\xdbU&L\x9e\xc9\xf\x1bV\0\xf0\xc5\x17\x5\xff\xf5>(X \x1fk\xd6n$g\xce\x1c\xa4\x34\x37\xa7q\xb3\xb6o\x1c\xf3?m\xde\xf2#\x9d\xba\xf6\x63\xfb\x8fk)R\xa4\xf0\xbf\xd6\xbd|\xf9\n\xe5+\xd5\xa2I\xa3\xda\xa4\xb5I\xcb\xb1\xe3'\f\xc7\xbe(X\xc0\xe8\x85\xf8\x9b\xee\x31T\xb1\x42\x5\xac\xac\xbe\xa3S\xe7\xee\x34k\xeaI\xea\xd4\xa9\xf0\xbdx\x89\x15\xab\x37\xb1\x65\xe3\x8aW\xc6\xea\xeb{\x91=\xbf\x1c\x66\xf8\xd0\x41\xb1\xfa\xacV\xcd\x8d\x5\x8b\x96\xd2\xa1S7Z|\xd9\x8ch\xa2\x99\x36m\x16\x43\a\xf6\x34$\x91\x46\r\x1fH\xf7\xde\x83\x31\x33\x33\xa3\x98sQ\x82\x82\x83\xf9\xe3\x8f\x1bx5{\xf5l'\x80J\x95*P\xb2\x44\x11:v\xeaN\x87\xemx\x12\xfa\x84\xe1\xa3\xc6\x32|h\x7f\xd2\xa4\x89y\xe\xed\xd9\xb3\x97\xdf\xae^#\xb7\x93#\xa1\xa1O\xd8\xb3\xf7\x17\x8e\x9f\x38\xcd\xaa\x15\x8b\xe3=.\"\"\"\"\x1f\xd3\xc3\a\xf\xe9\xf1\xd7~\x98/\xcb\x97/?c\xc7O\xa4l\xb9\x37\xff@\xd5\xcb\x42\x43\x43\xa9Y\xab\x36M\x9az\x19\x95\xbf\xf8\xff)\"\"\x82\x41\x3\xfa\x11\x12\x12L\xdbv\x1d\b\f\f\xe4\x9bQ#x\xf4\xe8\x11-\xbfje\xa8\xbf\x62\xf9\x32\x96,ZH\xef\xbe\xfdH\x9e<9\x8b\x16.\xc0\xf7\x82/S\xa7\xcf\x30Z\xa6ZDDD\x12\x37%\x86\x44\xe4\xbd(\\\xa8 mZ5g\xd6\x9c\x5,_2\xe7\x8d\xdav\xea\xda\x1f\x88\xd9/\xc6\xb9hA\xaa\xb9U\xc1\xd3\xb3\x91\x61)\xb1\xb1\x63\xbe\x66\xd5\xea\x35,^\xb2\x9c\xdf\xae\xfeN\xb1\xa2\x85\xf8\xaa\xe5\x97\0\xd4\xa8Q\x8d\x11\x43o3k\xce\x2\xac\xac,i\xd6\xb4\x31\x15\xcb\xdfz\xa7kI\x9b\x36-\xde\xde?\xb3r\xd5Z\x9e l0\xbf\xff~\x83\xf6\x1d\xba\xb1q\xfd\xaa\x37\x1e\xc3\xf2\xe5\xca\xb2v\xd5\x2\x16.Z\xca\xd6m;\xa9Y\xdd\x8d\xa2\x85\xf3\x91\xd2\"e\x9c\xf5\xd3XY\xd1\xa0n5\xfe\xf8\xe3\x6\xcbV\xac\xa1\xa4\x8b\x33\x9b\x37\xae\xa4X1gC\x9d\x7f\xbb\xfz\xf5\xec\x46\x64\x64$\x83\x87|M\xde\xbc\x8e\xcc\x9b=\x99~\x3\x86\xbfq\xdc/\xcb\x90>=E\v\xe7\xc7\xca\xca\xea\xb5u\xd7\xae]\xf\xc0\x9a\xf5[Y\xb3~\xab\xd1\xb1\xb3'\xf7\xbfv\xbf\xa6\x7f\x93\x39\xb3=[7\xaf\x63\xe9\xd2\xe5L\x9e\x32\x9d\xe0\x90\x10J\x95,\xce\xcem\xeb(Z\xb4\xc8+c]\xbf~#\xeeU\xca\x19\xed}\xf5\x42\xaaT\xa9\xf8~\xd5Rf\xce\x9a\xcb\x98q\x93\xb0\xb5\xcd@\xdb\xb6-iP\xbf\xbe\xa1N\xc3\x86\rHc\x9d\x86\xef\xbf_\xc7\x94\xa9\x33q\xca\x95\x83\xda\xb5k\xbc\x36\xde\xe4\xc9\x93\xb3x\xe1<\xe6\xce\x9b\xcf\x84\x89S\xc9l\x9f\x89\xb1\xa3\x87S\xa7v-C\x1dK++|}/2\x7f\xc1R\x1c\x1c\xb2R\xaa\x64\t~\x1c\x32\x10\x1b\x9b\xb7O\xe8\x8a\x88\x88\x88|H9s\xe5\xe2\xfc\xc5+\xb1\xca_\xacv\x10\xfe\xecY\xbc\x97\x88\x8eKhH\b\xb9\x1c\x9d(\xea\xec\x1c\xe7\xf1\xe3\xc7\x8fq\xf0\xc0~\xbcw\xff\x62XU\xc1\xca\xca\x8a\x81\xfd\xfbR\xabv\x1dlllx\xf8\xf0\x1\xdfN\x9e\xc4\xfc\x45\x8bqq)\x1@\xde|\xf9\xa8V\xb5\x32\xa7N\x9e\xc0\xa5\x44\xc9\xb7\x8eODDD>/&W\xae\xf9\x45g\xb1K\xf\xc0-\xbf\a8\xe5\xd0\xda\xfe\"\x9f\x8b\xa7\x61\x11@\xccs\xfb\xc5\xf3\xfcU^\xae\xf3\xb6\xbf\v\xa2\xa3\xa3\t\v\v{\xa7\x37\xc1?W{\xf7\xfa\xd0\xe4\xcbv\xfc\xfe\xdb\xd9x/M\xf6\x39\x89\x8a\x8a\xa2r\xd5\x9at\xeb\xd2\x81\x6\r\xea%t8\"\"\"\"\xf2\x99\xf8\xf5\xfa]\xa3\xd7\x31o\xf2\xba'84\xe4\xbd\xc4\xb0\x65\xf3\xf<~\xfc\xd8h\xe6\xce\x9bj\xdf\xb6\x35\x65\xca\x94\xa5\x65\xab\xd6q\x1e\x1f>l\b\xc9\xcc\xcc\x18:|\xa4\xa1,44\x94\x32%]\x98\x30i2\xee\xd5\xaa\xf3\xe3\x96\xcdL\x9f:\x5\xef\xdd\xbf\x18\xf6\xa6\x4\xe8\xd1\xbd+\xb6\xb6\xb6\f\x1a<\xd4\xa8\xcf\xfcy\x1c\xf1\xbd\x1c\xf7\xf2\xc0\"\"\"\xf2\xf9Im\x11\xf3\x1\xf6[~\xf\x34\x63HD\xde\x1f\x13\x13\x13%\x85\x4\x80\x90\x90\x10\x96,]Nn''\xd2\xa4\xb1\xc2g\xdf~\xa2\xa2\xa2\xa8Z\xb5rB\x87&\"\"\"\"\x12/\xf\x1f>\xc4{\xe7\x8e\x7f\xad\x13\x1d\x1d\xc5\xde={^9\xd3'\xbe\x2\x2\x2\x98\x38\x61\x1c\xcb\x97-\xc1\xde>3\xa5\xcb\x96\xa5\xb1gS\xc3\xec\xa0\xdf\xae\\\xa1z\xcdZFm,,,p\xca\xed\xc4\xbd\xbbw\x1\xb8s\xe7\xeN\xb9\xf3\x18%\x85\0r;\xe5\xe6\xdc\xb9\xb3q\x9e\x37\x7f\x1e\xc7\x38\xcb\x95\x30\x12\x11\x11\xf9\xbc)1$\"\"\xef]x\xf8s\x82\x83\x43\x18\x37\x61\n\x91\x91\x91T\xadR\x91\xf5\xebV\x92:u\xea\x84\xeMDDDD$^BB\x82\xd9\xb2y\xd3k\xeb\x39:\xe5\xc6\xd3\xb3\xe9;\x9d\xabi3/\xac\xad\xad\xb1\xb4\xb4\xc2\xdf\xff\x1e+\x96/c\xef\x9e\xdd,Y\xb6\x82\x94)-\xb8t\xe9\x12\r\x1b\x37\x8e\xd5.}\xfa\f\x4>\n\x4\xc0\xff\xde\xbd\x38\x97\x41\xb6\xb4\xb2\xe4\xf6\xad\xb8\x97\xdbV\x2HDD$qRbHD\xe4#\xa8T\xa9\x2\xf7\xfd\x12\xcf\x8b\xae\xb4i\xad\x19<\xa8?\x83\a\xf5O\xe8PDDDDD\xdeJ\xf6\xec\xe\xac\xdb\xf0\xc3G9W\xc3\x46\xc6I\x9f\x62\xc5]\xa8\\\xa1\x1c\a\xf\x1c\xc0\xbdZur\xe4\xcc\x41ppp\xacv\x8f\x1e\x5\x92>}\xcc\xd2x6\xe9l8\xff\xbf\xff\xc5\xaa\x13\x12\x12\x42v\a\x87\xf\x13\xb8\x88\x88\x88\xfc'\x99&t\0\"\"\"\"\"\"\"\"\xf2\x37[[[\xb2gw\xe0\xee]?\0\x9c\x9crs\xfd\xfau\xa3:\xcf\x9e=\xe3\xda\xd5k\xd8\xda\xc6\xec\xfkgg\xc7\xa5K\x17\t\xf\xf\x37\xaaw\xe3\x8f?pp\xc8\xf1q\x2\x17\x11\x11\x91\xff\x4%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x12Htt4QQQFe\x1\x1\xf\xf9\xe3\x8f\xdf\xc9\x9e=f\xa6OU7w~\xdc\xbc\x99\a\xf7\xef\x1b\xea\x9c:y\x2\x80\xe2.%\0(Y\xaa\x34\x81\x1\x1\x9c\x38~\xdcP\xe7\xc1\x83\a\xfc\xb4m+\x95\xabV\xfd\xd0\x97!\"\"\"\xff!ZJNDDDDDDD$\x81\xfc\xf1\xfb\xef\f\x1d\x32\x88\x6\x1e\x1e\xd8\xda\xda\x11\x12\x12\xcc\xeaU+([\xae<\xa5K\x97\x1\xa0\\\xb9\xf2\x38\x17+F\xbf\xbe\xbdi\xf9U+\x9e x|\x9f\xb2\xfcy\x1c\xf1\xbd\xfc[B\x87!\"\"\"\x1fIj\x8bT@\xcc\xff\x43\xda\x63HDDDDDDDDDDD$\x91PbHDDDDDDDDDDD$\x91PbHDDDDDDDDDDD$\x91H\x9a\xd0\x1\x88\x88\x88\x88\x88\x88\x88\x88\xc8\xc7\x37{\xe6w\xb1\xca:w\xed\x96\0\x91\x88\x88\x88\xc8\xc7\xa4\xc4\x90\x88\x88\x88\x88\x88\x88\x88H\"\xa4$\x90\x88\x88H\xe2\xa4\xa5\xe4\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t\xed\x31$\"\"\"\"\"\"\"\x92\by\xef\xdc\x61\xf4\xd8\xbdZ\xf5\x4\x8a\x44\x44\x44\x44>&%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x12!%\x82\x44\x44\x44\x12'-%'\"\"\"\"\"\"\"\"\"\"\"\x92H(1$\"\"\"\"\"\"\"\"\"\"\"\x92H(1$\"\"\"\"\"\"\"\"\"\"\"\x92H(1$\"\"\"\"\"\"\"\"\"\"\"\x92H$M\xe8\0\x44\x44\x44\x44\x44\x44\x44\x44\xe4\xe3\x9b=\xf3\xbbXe\x9d\xbbvK\x80HDDD\xe4\x63RbHDDDDDDD$\x11R\x12HDD$q\xd2Rr\"\"\"\"\"\"\"\"\"\"\"\"\x89\x84\x12\x43\"\xf2\xc1\x45\x46\x46\xf2\xf4\xe9\xd3\x84\xe\x43\x44\x44\x44\x44\x44\x44\x44\x44\x44$\xd1SbHD>\xa8\xc0\xc0G\xb8\x94\xae\xcc\x9e\xbd\xfb\x63\x1d\xbbt\xe9\x32\x19\xec\x1c\r_%JU\xa0{\x8f\xde\x9c \x7fJ\f\x89\xc8\a\xd5\x7f\xd0\b\x8a;\x17\xa1VM\xf7W\xd6\x99\x35}<[\x7fX\xc5\xf8\xb1#\xb1\xb4\xb4\xa4\x46\x9d&\x9c={\xee#F)\ti\xe9\xb2\x15\xb4m\xd7\xe9_\xeb\xb4m\xd7\x89\xa5\xef\x90\x98\xbbt\xf9\x32\x9d\xbb\xf6\xa0V\xdd&\x1c\x39v\xc6P~\xfd\xfa\xef\xd4\xa8\xd5\x88\xb4i\xd3\xd2\xb7O\xfj\xd5\xac\xc6\xe2\xa5\xab\x18:ld\xac\xa4\xe\xc0\xa9S\xa7\xf9\x66\xec\xd4X\xe5\x11\x11\x11t\xe9\xda\x93\xfd\xfb\xf\xd2\xbd['j\xd5\xac\x46\xff\x41#\x99\x37\x7f\xa1Q\xbd\xf9\v\x16\x31\x62\xd4\x38\xea\xd4\xaeI\x8f\xee\x9d\xd9\xe9\xbd\x9b\xce]{\x12\x11\x11\xf9\x46\xd7\x93\x31\x63\x46\xea\xd7qg\xe3\xa6-\xb1\x8e\xdd\xbcu\v\x9f\x3\xc7q\xabZ\xf9\x8d\xfa\x14\x11\x11\x11\x91\xc4\xc7{\xe7\xe\xa3/\x11\x11\x11I\x1c\x92&t\0\"\xf2\xf9\xda\xf6\x93\x37'N\x9c\x66\xbf\xcf\xf6\x7f\xad\xf7\x45\xa1\x82\xe4vr\x2\xc0\xd5\xb5<;\xbd\xf7p\xf4\xe8\x31\n\x17.\xf4\x31\xc2|\xad\xa4I\x93\xb0x\xd1\xbc\x84\xe\x43\xdeRtt4\xe3\xc6M\xa2@\x81|\x9c\x38\xb2\x97\xd1\x63\xc6\x1b\x8e\x65\xcf\x9e\x8d\xc3\a~&S&[\0\xaa\xb9\xbb\xe1\x94\xdb\x91\x16\xad\xba\x30x\xd0\0\x32\x66\xcc`\xa8\xfb\xe7\x9f\x41\xf4\xea\x33\x90\xe6\xcd\x1a\xb0\x62\xf5&\xa3s\x1c:t\x98\xbd>\x87\x38q\xd4\x87t\xe9l\0\xb0\xb6\xb6\xa6s\xb7\xbe\x34\xf4\xa8O\xbat\xe9\xb8\x7f\xff>\xdf\x8c\x99\xc2\xda\xef\x17S\xa6t)\0\n\x16,\x80K\xa9*\x1c=v\x8c\xb2\x65J\xbf\xd1u\xd5\xab[\x9b\x96m\xbar\xe3\xc6M\xb2\x65\xcbj(?p\xe0\x10\xe\xd9\xec)T\xe8\x8b\x37\x1b(\x11\x11\x11\x11It\xdc\xabUO\xe8\x10\x44\x44\x44$\x1h\xc6\x90\x88|\x10\xe1\xe1\xe1\x8c\xf8z\x1c\xa3\x46\xe\xc2\xca\xd2\x32\xde\xed\x9e \xb8W\xaf\xc3/\xbf\xf8\xd0\xbc\x45k*V\xaeNHH\b\x10\x33\x3\xa6]\xfb\xce\x94)W\x99Q_\x8f\x61\xc8\xd0\x11\x8c\x1e\x33\x9e\xa0\xa0`\x1cr\x15\x64\xdd\xfa\rFq\x8e\x18\xf1\x35\xbd\xfb\xf4\x8f\x15\x7f@@\0\x13&N\xa6\x62\xe5\xea|Q\xa4$\x1d:v\xe5\xd6\xad\xdb\xaf\xbd\xbey\xf3\x17\x32\xf2\x9b\xc9\xf8\x1c\x38N\x6;G\xbc\xbe\xfc*V\xdf^_~\x85\xcf\x81\xe3\x8c\xfc\x66\x32\x19\xec\x1c\x8d\x66\xe1\\\xbcx\x89\x1e=\xfbP\xcc\xa5\x1cm\xdbu\xe2\xd8\xb1\xe3\xb1\xda\x9b\x98\x98\xb0h\xe1\\\xfa\xf7\xeb\x43\xe6\xcc\xf6\x46\xc7LMM\rI\xa1\x17\xd2\xd9\xc4$v\x9e?\x7fn(\x8b\x8e\x8e\x66\xe2\xa4)\xb8\x96/C\xc3\x86\rb\x9d\x63\xcb\x8f\xdb\xf0lT\xd7\x90\x14\x2pu-Gdd\x14\x87\xf\x1f\x5\xc0g\xdf~\xd2\xd9XS\xc2\xa5\xb8\xa1N\xf6l\xd9\xa8U\xbd\x12;w\xee\x8a\xd5'\xfc\xfb}T\xbatI\x92\x99%\xe5\xe0\xa1\xc3\x46m6n\xdcL\xf3/=133\x8b\xb3O\x11\x11\x11\x11\x11\x11\x11\x11I\xdc\x94\x18\x12\x91\xf\x62\xde\x82\xa5\x64\xc9lO\xbd:5_[w\xec\xb8I,Z\xb4\x84\xe6-Z\x93\xc3\xa9\bY\xb3\xd8\x19\x66TDFF\xd2\xb9K\xf\xee\xde\xbd\xc7\xe8\xf2\x39&_\0\0 \0IDAT\xd1#h\xd6\xa4\x11\xd3\xa6\xcf\x62\xed\xba\x98\x84\x45PP\x10\x1\x1\x1\x34k\xd6\x98\x19S'\x90&\x8d\x15\x8d\x9a\xb4\xe4\xc1\x83\x87\x86\xfeO\x9c:\x8f\x8f\xcf~\xda\xb5\xfd\x8a\x36\xad[0c\xe6|\xf2\x16,Ipp0}zu\xa3V\rw\xba\xf7\x1e\xc2\xee\xdd{\xe3}}'N\x9dg\xd7\xcf{h\xd3\xaa%\x1d;\xb4\x66\xd9\xf2\x35\xcc\x9d\xb7\xe0\xef\xeb\x9f\xb7\x90\xd5\xdf\xaf\xa3k\xe7\xe\f\x1e\xd8\x87\x93\xa7\xce\x30\x64\xe8\x88\x38\x97';r\xf4\x18\xed:t\xa3V\xcd\xea|;e\x1cI\x93&\xa5\xa9W+\xfe\xfc\x33\x66\xdf\x9d\xa8\xe8(\xe6/Z\x85Y\xd2\xa4\f\x1a\xd0\x87J\x15\xcb\xd3\xb9\xdb\0\xf6\xed?\x10\xaf\x31\x2\x38s\xee\x12\xa3\xc7L\xc4\xcd\xad\x32\xdd\xbbu$U\xaaT\x9c>}\x86Z\xf5\x9a\xe2\xec\\\x84\xb1\xa3G`n\x9e\x82\x5\x8bW\x13\x14\x14\x84\xa5\x65jZ\x7f\xd5\x8c\x8d\x1b\xff^\xaa,44\x94Uk6R\xbf^\xddX\xd7\xd0\xbb\xef@.]\xfe\x95\x91\xc3\a1c\xea\x4\x9c\x9d\x8b`ee\xf5\xda\xeb\xabS\xbb&\xc5\x9d\v\x2\xb0w\xd7\x66\x46\x8e\x1c\x1a\xab\xef\x17\x65\xc5\x9d\v\xb2w\xd7\x66\xea\xd4\x8e\xb9\xa7|/^\xc4\xadz\x3\xf2\xe5\xcb\xcb\xb7S\xc6\x91#\x87\x3\xb5\xeb{q\xf4\xe8\xb1X}\xbcI\x92\xe4\xfc\x5_\xf2\xe7\xcd\x65\x94\x30\xf2\xde\xf5\x33\xfb\xf6\x1f\xa2o\x9f\x9e\x98\xc4\xd1\xe6\xe2\xa5+88d7*K\x95*\x15\xf9\xf2\xe4\xc2\xcf\xcf\xf\x80[\xb7n\x93?\x9f\x13I\x93\x1aO\xd6\xcd\x97\x37\xfW\xaf^\x8f\x33\x96\x7f\xbb\x8f\xac\xac\xac\xf8\xb2\x99\a\x9b~\xf8\xfbg\xf4\xc7\x8d\x1b\x1c \xfd\xfd\x1f\xb0\x66\xed\x46z\xf7\xea\x41`\xe0#\xbe\x1e;\x85\xed[\xd7Q\xe4\xaf\xe5\xf0lmmq\xab\xd1\x90\xc1\x83\x6`k\x9b\xd1\xa8\x9f\xc9S\xa6\xd1\xa7g\x17\xea\xd6\xad\r\x80s\xd1\"\x14*Z\x9a\x93\xa7NQ\xb9RELMLI\x92\xc4\x94\x1e=\xba\x2P\xa1\x82+?\xef\xfe\x85\xfd\xfb\xfR\xc1\xb5\xfck\xc7\xe8\x85\x85\vf\xe1\xe0\xe0`x L\xffv\xb4\x61\xcc+Tp\x8d\xf7\xf5\xd5\xac\xe1\x8e\x45Js\n\x14\xc8\x1f\xe7\x38;\xe6\xca\x45\x85r.T\xa8P\xde\xa8\xce\xf4\xe9\xb3\xe8\xd9\xad=\x1d\xda\xb7\x5\xa0|\xb9\xb2<~\xfc\x98i\xd3g\xb1\xa6\x64\x89\xd7\xff\0\xe3\xf0\xe0\xc1\x43&L\x9a\xce\x8c\xa9\x13H\x92$\t\0~~w\xe9\xddw\bK\x16\xcd\x36$\xbb^\x16\x1d\x1d\xcd\x5\xdf_i\xee\x65\x11\xebX\xc6\x8c\xe9y\x18\x10\b\xc0\xdd\xbb\xf7\xb0J\x13\xbb\xbdU\x1a+n\xdc\xbc\x15\xab<>\xf7Q\x8d\xea\xee\x34l\xd2\x9a\x9b\xb7n\x91\x35K\x16\xe\x1c\x38H\xd1\xc2\xf9\xc8\x93;\xf7[]\xbf\x88\x88\x88\x88\x88\x88\x88\x88|\xfe\x94\x18\x12\x91w\xe2\xef\xff\x80\x15\xab\xd6\xd2\xb5s[R\xa4H\x1\xc0\xf2\x95k)\xf4\x45\x1\n\x17*\x18\xaf>\xe\xf8\xfc\x64\xd8\x63\xe8\xd1\xa3GL\x9d\x36\x83^}\x87\xe1Z\xbe,W\x7f\xbb\xca\xd3\xb0p\xb2\xe7\x32\xdeo\xc8\"e\n\xc3\xf7\xbe\xbe\x17\xd9\xb1s\x17G\x8e\x1e\xe3\xf4\x99\x98\x65\xe4\x9e\x86\x85\x19\xd5\x37\x35\xfd{\x82\x64\xee\xdcN\xe4t\xc8lt\xbcp\xa1/\xb8s\xc7/\x9eW\x1d\xbbO'\xc7\\\xfcq\xf3.QQQ\xdc\xb8y\x93\xc8\xc8(\xdck4\x8c\xd5&f\t\xb7\xbf\x13\x43\x61\x61\x61\x1c\x38t\x92\x3\x87N\xd2o\xd0\xd7\x46u\x83\x82\x82\f\xdf\xbbU)ot\xac\x98s\x11\x1e=z\x4\x10\xaf\x31\x2\xc8\x90\xe1\xef\xfdr\"\"\"\xf8\xc5\xe7\x10\xcd\xbfljT\xa7\x41\xddj\x86\xef\xbf\xf8\xa2 \x85\v\xe6\xe1\xc0\x81\x43xye\xe5\xa7\x9fv\xd0\xba\xd5\x97$O\x9e\xdc\xa8\x8d\x99\x99\x19\xc3\x6\xf5\xa4w\xbf\xe1\x1c?~\x92\xaaU+S\xc1\xb5<)S\xa6\x8c\xf7\xf5\xbd\xa9\x88\x88H~\xde\xb3\x1f\xcf\xc6\x1e\x46\xe5\xae\xe5\xcb\xd1\xb6\x63O\xc2\xc3\xc3I\x96,\xd9\x1b\xf5\x19\x16\xf6\x8c\x1\x3\x87\xd0\xc8\xa3\xeU\xaaT2\x9cg\xd8\xf0Q\xb4\xfe\xca\xcb\xb0\x4\xdc?\xe7|\x99\x98\x98\xe0\x98+;AA\xb1\x97\n\f\b\b4\xecS\x94>}:N\x9f>\x17\xabNpp0\xb9r:\xc4*\x8f\xcf}T\xbcx1\xd2Z[r\xe8\xd0\x61\xb2\x36\xf1\x64\xc3\xc6-4k\xda\x18\x13\x93\xb8\xe6\x35\x89\x88\x88\x88\x88\x18\x9b=\xf3\xbbXe\x9d\xbbvK\x80HDDD\xe4\x63RbHD\xde\x89\x85\x45J\xbcw\xed\xe1\xf2\x95_Y0w:\xd1\xd1\xd1\xcc_\xb8\x94\x99\xd3'\xbdU\x7f\xd6\xd6\xd6\xb4o\xd7\x86\xb9\vVr\xf5\xea\x35R\xa5N\x5\xc0\xf1#\xbbI\xfa\xd7\f\xe\xc0\xf0\xc6\xf7\xa9\xd3gh\xd8\xb8\x5\xdfN\x1eM\x83\xfau133\xc3\xb9\x44\x45\x42\x43\x43_y\x8e\xb8\xde\x33\x7f\xe7\x37\xd2_jn\x91\x32%\0\xcb\x16\xcd\xa4`A\xe3Y0\x19\x33\x1a\xcf\x16J\x96,\x19I\x92\x98\xd2\xa9}KZ\xb7jat,M\x9a\x34\xaf>\xddK\xf1\xben\x8c\xe2\x12\x15\x15\x45\xf8\xf3\b\xa2\xfe\xda\x87(.\xa6\xa6\xa6\xb4l\xe9\xc5\xba\xf5\x9b\xa8^\xdd\x9d\xef\xd7ma\xff/?\xc5Y\xb7[\xb7.xx4\xe0\x17\x9f},^\xb2\x9c\xc1\x43\xbe\xe6\xfb\xd5\x8b\xc9\xed\xe4\xf4V\xd7\xf7:QQ\x91\x84=\v'2\xd2x_(333R$O\x86\xa9i\x92W\xb4\x8c[dd$c\xc6\x8e\xe7\xf9\xf3\xe7\f\x1e\xd4\xdf\x90\xf4\xdb\xb9\xd3\x9b\xad\xdb\xf7\xb0u\xfb\x1e&N\x99\x65\xd4&W\x9e\xa2\xa4\xb3I\xc3\xc5\xf3'\xc8\x9b\xd7\x89\xdf\xae^5:\x1e\x16\xf6\x8c_\xaf\xfe\x8e\x9d]&\0\x32\xdb\xdb\xb3l\xc5\xdaXI\xab\xeb\xd7\x7f'W\xce\x1c\xb1\x62\x8a\xcf}dnnN\x8b/=\xf9\xe1\x87\x1f)\xe1\xe2\xc2\x91\x63g\xf8n\xc6\x94\x37\xbav\x11\x11\x11\x11I\xbc\x94\x4\x12\x11\x11I\x9c\xb4\xc7\x90\x88\xbc\x93T\xa9,X\xb3j\x11g\xcf\x9dg\xde\x82\xa5\xec\xdb\x7f\b\v\v\vJ\x95,\xfe\xd6}\xbexS\xde\xc6\xc6\x6\xc7\\\xb9\0\xb8\xef\x7f\x9f\xcc\x99\x33\x1b\xbe\xec\xed\xed\x1\x38t\xf0\x30\x45\n\xe5\xa7~\xbd\xba\xe4\xc8\xe1@\xfa\xf4\xe9\0\b{\x1a\x16w\xe7\x1f\x81\xbd\xbd=\xe9l\xd2p\xeb\xf6m\xa3\x98\x33g\xce\x1ck\xaf\x1bSSS\xea\xd5v\xe7\xea\xd5k\xd8\xdb\xdb\x1b\xd5M\x95*U\xbc\xce\xf7\xba\x31\x8aK\xb2\x64\xc9(S\xca\x99\x83\a\xf\x1b\x95o\xda\xb2\xd3\xe8q\x95\xca\x15\x39r\xec\f\xb3\x66\xcf\xa3|\x19\x17\xc3\xb9\xe2\x62g\x97\t\xaf\x66MX\xb3z9\x19\xd2\xdb\xf0\xf3\xae=\xf1\xba>\x13Lx\xf2\x9a\x9f\x97\x89\x89)\xe1\xe1\xe1\xb1\xe3?t\xc8\xa8\xde\xe9\x33gp\xab\xe2J\xd2\xa4\xf1O\fEFF2v\xdc\x44\xae_\xff\x9d\x99\xdfM\xc3\xdc\xdc\xdcp\xcc\xd9\xb9(?\xef\xdc\x64\xf4\xd5\xbfwg\0\xd6\x7f\xbf\x88\xb5\xab\x97\0P\xbb\x66\r\xd6m\xd8\x8a\xbf\xbf\xbf\xa1\xed\xd1\x63\x31{\x1d\xbd\xd8/\xab\\\xf9\xb2<\fx\xcc\xe1\xc3G\fu\xfc\xfd\xef\xb3q\xf3\xej\xd4\xf8{\xa6\xd6\v\xf1\xbd\x8f\xdc\xdd\xaa\xe0s\xe0\x38s\xe7-\xc0\xadrY\xb2\x66\xc9\x12\xefk\x17\x11\x11\x11\x11\x11\x11\x11\x91\xc4G3\x86\x44\xe4\x9d\xd9\xd8\xa4\x65\xe1\xbc\x19x4nAn'G\x9azz\xbc\xbe\xd1K.\\\xf0%8(\x98\xe8\xe8h\x82\x83\x43X\xbbn\x3\xb5kT&O\x9e\xdc\x98\x99\x99\xd1\xc2\xcb\x83\xce]{3j\xe4`\xb2g\xcb\xc6\xed\xdbwH\x91\"9\xae\xae\xe5\xc9\x9e=\x1b\a\xc7Oc\xe5\xca\xd5\x38\xe4p`\xcb\x96\xad\x31\x31\xa5\xb3y\xeb\xeb\x31\x37\x8f\x99\xa9q\xf6\xec\x39\xd2\xa7OO\xb6lY\xdf\xa8\xbd\x85\x45JF\r\x1fH\xf7\xde\x83\x31\x33\x33\xa3\x98sQ\x82\x82\x83\xf9\xe3\x8f\x1bx5k\x12\xab~\xf7\xee\x9d\xa9T\xb5.#F~M\xdd\xbau0\x1\x8e\x1e;N\xdb\x36\xad\xe2\xb5\x1c\xda\x17_\x14\xfc\xd7\x31z\x95\xee\xdd:\xd3\xd0\xb3\x15Vi\xacpq)\x8e\xaf\xef\x45\0\"\x9e?7\xd4\xc9\x98\x31#^M\xea\xf1\xdd\xec\xc5,\x98\xf3m\x9c\xfd\x44\x44\x44\x30l\xf8(\xca\x94.E\xa6L\xb6\xdc\xbf\xff\x80\x8b\x97\xaf\xd2\xabg\xaex]\x9f\x83\x43\x36\x8e\x9f\xfc\x1f?\xef\xde\x83\x95\xa5%..\xb1\x93\x8a\x5\n\xe4\x63\xfb\xf6]\x94)S\x1a\x8b\x94)\xc9\x97//={t\xa5\x41\xa3\x96X[[S\xc2\xa5\x38\xbe\x17/1s\xf6\x62v\xed\xd8\xf4\xda\x31{!f\xa6\xd0\x4\x66\xceY\xc2\xf2\xc5\x33\xb9|\xe5\x8a\xe1\x98M\xda\xb4\xe4\xca\x95\x93L\x99l\x8d\xda<\t\r\x85ogS\xa4H\x11,-c\xf6\x98\xaaT\xa9\x2%K\x14\xa1\x63\xa7\xeet\xe8\xd0\x86'\xa1O\x18>j,\xc3\x87\xf6\x37\xcc\x8c\xca\x9a%\v}{u\xa4s\xb7\xbe\x8c\x1a>\x10+++\xe6-XD\xfd\xba\xd5pv.\x1a+\xb6\xf8\xdeG\x85\n}A\xf6\xac\x99X\xba\x62=\xf3\x66O\x8e\xf7\xb5\x8b\x88\x88\x88\x88\x88\x88\x88H\xe2\xa4\xc4\x90\x88\xbc\x17\x85\v\x15\xa4M\xab\xe6\xcc\x9a\xb3\x80\xe5K\xe6\xbcQ\xdbN]\xfb\x3\x31{\xe2\x38\x17-H5\xb7*xz62\xcc\x8a\x18;\xe6kV\xad^\xc3\xe2%\xcb\xf9\xed\xea\xef\x14+Z\x88\xafZ~\t@\x8d\x1a\xd5\x18\x31\xf4\x36\xb3\xe6,\xc0\xca\xca\x92\x66M\x1bS\xb1\xfc\xadw\xba\x16K\xcb\xd4\xcc\xf8v\f\xdfN\x9b\xc9\xa3G\x8f\xe9\xd7\xaf\xf7\x1b\xf7\xd1\xb0\x61\x3\xd2X\xa7\xe1\xfb\xef\xd7\x31\x65\xeaL\x9cr\xe5\xa0v\xed\x1aq\xd6\xcd\x9b'\xf\xbf\xfc\xfc#s\xe7-\xa0\x43\xc7\xee\xa4\xb5NC\xa5J\xe5\t\v\v\x8b\xf7>9\xff\x36\x46\xafR\xbe\\Y\xd6\xaeZ\xc0\xc2\x45K\xd9\xbam'5\xab\xbbQ\xb4p>RZ\xa4\x34\xaaW\xb9RE\xd6o\xdc\x86\xabk\xb9\x38\xfb\t\xf\xf'{\xf6l,Y\xb6\x2\xdf\x8b\xbf\x92+gv\xa6L\xfa\x86j\xd5\xdc\xe2u}U\xaaTf`\xbf\xae\f\x1a<\x92|y\x9d\x98\x93??\x16\xff\x88\xa1S\xc7v\x4\x6\x6\xd2\xa1\x63w\x1a\x35\xacK\xbe|y)[\xa6\x34\x9b\xd6/c\xe1\xa2\xa5\xacZ\xbd\x9e\x32\xa5]\xf8\xd9\xfb\a\xf2\xe6\xc9\x13\xaf\x31\x3\xb8}\xfb\xe\x33\xe7\xc4\xcc\xfai\xd1\xba\xab\xd1\xb1\xde=\xda\x33p@\xbfx\xf5\x93 e\xf9\xf3\x38\xe2{\xf9\xb7\x84\xe\x43\x44\x44\x44>\x92\xd4\x16\x31\xdb:\xdc\xf2{\xa0\x19\x43\"\xf2\xfe\x98\x98\x98()\xf4\x1f\x12\x12\x12\xc2\x92\xa5\xcb\xc9\xed\xe4\x44\x9a\x34V\xf8\xec\xdbOTT\x14U\xabV6\xd4y\xf8\xf0!\xcbV\xaeg\xfd\x9a%\t\x18\xa9\x88\x88\x88\x88\x88|\b\xde;w\x18=v\xafV=\x81\"\x11\x11\x11\x91\x8fI\x89!\x11\x91\x44*<\xfc\x39\xc1\xc1!\x8c\x9b\x30\x85\xc8\xc8H\xaaV\xa9\xc8\xfau+I\x9d:\xb5\xa1\xce\xee\xdd{I\x9f\xce\x9a\xe2\xc5\x9c\x13\x30R\x11\x11\x11\x11\x11\xf9\x10\x94\b\x12\x11\x11I\x9c\x94\x18\x12\x11I\xa4\xd2\xa6\xb5\x66\xf0\xa0\xfe\f\x1e\xd4\xff\x95u\x9a\x34iL\x93&\x8d?bT\"\"\"\"\"\"\"\"\"\xf2!\xc5\xbd\xdb\xb5\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88|v\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11I$\xb4\x94\x9c\x88\x88\x88\x88\x88\x88\x88H\"4{\xe6w\xb1\xca:w\xed\x96\0\x91\x88\x88\x88\xc8\xc7\xa4\xc4\x90\x88\x88\x88\x88\x88\x88\x88H\"\xa4$\x90\x88\x88H\xe2\xa4\xa5\xe4\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t%\x86\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x12\t\xed\x31$\"\"\"\"\"\"\"\x92\by\xef\xdc\x61\xf4\xd8\xbdZ\xf5\x4\x8a\x44\x44\x44\x44>&%\x86\x44\x44\x44\x44\x44\x44\x44\x44>\x3\xd1\xd1\xd1\xec\xd8\xb1\x9d\xed\xdb\xb6\xe2\x7f\xef\x1eU\xdc\xdch\xd1\xb2\x15\xe6\xe6\xe6q\xd6W\"HDD$qRbHDDDDDDD\xe4\x33\xb0\x62\xf9\x32\x96,ZH\xef\xbe\xfdH\x9e<9\x8b\x16.\xc0\xf7\x82/S\xa7\xcf I\x92$\t\x1d\x9e\x88\x88\x88|\"\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\xf9\x8f{\xf8\xf0\x1\xdfN\x9e\xc4\xfc\x45\x8bqq)\x1@\xde|\xf9\xa8V\xb5\x32\xa7N\x9e\xc0\xa5\x44\xc9\x4\x8ePDDD>\x15\xa6\t\x1d\x80\x88\x88\x88\x88\x88\x88\x88\x88\xbc\x9b\xc3\x87\xe\x61\x63\x93\x96\xa2\x45\x9d\reY\xb2\x64\xa5\x8a\x9b;{\xf6\xecN\xc0\xc8\x44\x44\x44\xe4S\xa3\x19\x43\"\"\"\"\"\"\"\"\xffqw\xee\xdc\xc1)w\x1e\x92&5~\xab'\xb7Sn\xce\x9d;\x1bg\x9b\xfcy\x1c\xe3,\xf7\xbd\xfc\xdb{\x8fODDD>\x1dJ\f\x89\x88\x88\x88\x88\x88\x88\x88\xfc\xc7\xf9\xdf\xbb\x87\x95\x95U\xacrK+Kn\xdf\xba\x15g\x1b%\x80\x44\x44\x44\x12'-%'\"\"\"\"\"\"\"\xf2\x1fg\x93\xce\x86\xc0\xc0\xc0X\xe5!!!dwpH\x80\x88\x44\x44\x44\xe4S\xa5\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc8\x7f\x9c\x9d\x9d\x1d\x97.]$<<\xdc\xa8\xfc\xc6\x1f\x7f\xe0\xe0\x90#\x81\xa2\x12\x11\x11\x91O\x91\x12\x43\"\"\"\"\"\"\"\"\xffq%K\x95&0 \x80\x13\xc7\x8f\x1b\xca\x1e 5\xda\x63HDDDDDDD\xe4?\xce\xde>3\x9d\xbate\xe0\x80\xbe\xf4\xeb?\x10KKK\x96/[J\x8d\x9a\xb5(T\xa8pB\x87'\"\"\"\x9f\x10%\x86\x44\x44\x44\x44\x44\x44\x44\x44>\x3\x9d\xbbt\xc3\xd6\x36\x13\x9b\x7f\xd8\x44X\xd8S\xaa\xbaU\xc3\xcb\xebKLM\xe3^0\xc6{\xe7\xe\xa3\xc7\xee\xd5\xaa\x7f\x8c\x30\x45\x44\x44$\x81)1$\"\"\"\"\"\"\"\xf2\x19\x30\x35\x35\xa5\x61\xa3\xc6\x34l\xd4\x38^\xf5\x95\b\x12\x11\x11I\x9c\xb4\xc7\x90\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88H\"\xa1\xc4\x90\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88H\"\xa1\xc4\x90\x88|p\x91\x91\x91<}\xfa\x34\xa1\xc3\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11I\xf4\x94\x18\x12\x91\xf*0\xf0\x11.\xa5+\xb3g\xef\xfeX\xc7.]\xbaL\x6;G\xc3W\x89R\x15\xe8\xde\xa3\x37'O\x9eJ\x80H\xdf\x8e\xbf\xbf?\x19\xec\x1c\r1\xfb\xf9\xf9Q\xb3v\x3N\x9c\x38\x99\xa0q\xadX\xb9\x8aRe*&h\f\"\"\"\"\"\xf2i\x9b=\xf3\xbbX_\"\"\"\xf2\xf9K\x9a\xd0\x1\x88\xc8\xe7\xad\xff\xa0\x11\x14w.B\xad\x9a\xee\xaf\xac\x33k\xfax\xb2\x66\xcd\xc2\x93'O\xd8\xb3\xd7\x87\x1au\x9a\xb0k\xfb\x6\n\x17.\xf4\x11#}?\xa2\xa3\xa3\x89\x8e\x8aJ\xe8\x30\x44\x44\x44\x44\x44\x44^\xabs\xd7n\t\x1d\x82\x88\x88\x88$\0%\x86\x44\xe4\x83\xd9\xf6\x93\x37'N\x9c\x66\xbf\xcf\xf6\x7f\xad\xf7\x45\xa1\x82\xe4vr\x2\xc0\xd5\xb5<;\xbd\xf7p\xf4\xe8\xb1\xff\x64\x62\xc8\xde\xde\x9e\xed?mN\xe8\x30\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\xe2\xa4\xc4\x90\x88|\x10\xe1\xe1\xe1\x8c\xf8z\x1c\xa3\x46\xe\xc2\xca\xd2\x32\xde\xed\x9e m\x12\xa5J\x96\xa0v}/\xce_\xf0}\xe9\x1c\r\x1\f\xe7\x38p\xe8\xa4\xd1\x39\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44@3\x86\x44\xe4\x3x\xfa\xf4)\xb3\xe6,d\xcd\xaa\x45\xf1\xaa\xbf\xc3\xdb\x87\x1d\xde>\x86\xc7\x97\xae\\g\xdd\xfa\x8dx5k\xc2\xd1\x63\xc7\xd9w\xe0(\x97.\x9c e\xca\x94\x94*Y\x82\xb0g\xcfX\xbc\x64\x39\xcd\x9az\xe2\xe4\xe4\xc8\xa8Q\xc3\rm\xf3\xe6\xcd\xcb\xd2\x15\xeb\xb9x\xf1\"\xae\xae\xe5\r\xe5\xd3\xa7M&u\xea\xd4\0\\\xbdz\x8d\x5\x8bW3p@?\0*V\xac\x80\xcf\xfe\x83\xf8\xec\xdb\x8f\x9b[\x15\xa3\xd8R\xa4H\xce\xc4\tc\r\x8f]\xcb\x97\x63\xebO;9z\xec\x38\xa5J\x95|\xed\xb5m\xdc\xb4\x19;;[F\x7f\x33\x92$I\x92\0\xb0{\x8f\xfG\x8e\x9e\x34\xd4\xc9\x9f\x37\x17%\\\x9ci\xd6\xd4\x13\x80\x2\x5\n\xf0\xfd\xba\x1f\x39{\xf6\x1c\x99\x32\xd9\xb2v\xddzJ\x95(F\xc7\xe\xed\0(U\xb2\x4g\xce\x9e\x63\xe7\xeo\n\x16\xc8\x1f\xafs\x88\x88\x88\x88\x88\x88\xfc\x93\xf7\xce\x1d\x46\x8f\xdd\xab\xc5\xbd\x32\xc2\xfb\x94?\x8f#\xbe\x97\x7f\xfb\xe0\xe7\xf9\\i\xfc\xde\x9e\xc6\xee\xddh\xfc\xde\x9e\xc6\xee\xddh\xfc>\f\xcd\x18\x12\x91w\xe2\xef\xff\x80\xc9\xdf\xce$,,\xccP\xb6|\xe5Z\n}Q\x80\xc2\x85\n\xc6\xab\x8f\x3>?q\xdf\xef\x37\xee\xfb\xfd\xc6\x15\xdf\xe3tl\xf7%\xbd\xfa\xe\xe3\xf6\xed\xdb\\\xfd\xed*O\xc3\xc2\xc9\x9e\xab\x10\x19\xec\x1c\xc9`\xe7H\xbf\x81\xa3\xb8v\xfd\xa6\xa1\xbd\xaf\xef\x45&O\x99\x86G\xa3\xa6\x94,S\x19\x80\xa7/\xc5\x3\x18-\x11\x97;\xb7\x13\x39\x1d\x32\x1b\x1d/\\\xe8\v\x2\x3\x1f\xc5\x19\xdf\xbd{\xfe\x86\x19M\x95\xaa\xd4\xe0\xc4\xa9\xf3\x84\x86>\x89\xd7\xb5\x9d?\x7f\x1\xd7re\f\t\x1b\x80*\x95+`\x93\x36\x8d\xe1\xb1Y\xd2\xa4\x38\xe6\xcaix\x9c\x31\x63\x6\xd2Z[\x12\x14\x1c\f\xc0\xb9s\xe7\xd9\xb2\xedg\xc3\xf5g\xb0sd\xf3\xd6]\x4>z\x14\xefs\x88\x88\x88\x88\x88\x88\xfc\x93{\xb5\xea\x46_\x2\xb3g~\x97\xd0!\xfcgi\xec\xde\x8d\xc6\xef\xedi\xec\xde\x8d\xc6\xef\xdd\xfcW\xc7O\x89!\x11y'\x16\x16)\xf1\xde\xb5\x87\xae=\xfa\x13\x1d\x1dMTT\x14\xf3\x17.\xa5g\xf7No\xd5\x9f\xb5\xb5\x35\xed\xdb\xb5\x1\x62\x66\xf6\xa4J\x9d\n\x80\xe3Gvs\xfa\xf8/\x86\xaf\x83\xfbv\x2p\xea\xf4\x19j\xd5\xf5$gN\a&M\x18\xcb\xfe_b>\xf1\x16\x1a\x1a\xfa\xcas\x98\x98\xc4U\x16G!\x10\x18\x18H\xdd\xfa\x9e\x4\x5\a3xp\x7f\xd6\xac^J\x92$\xa6\\\xbe|%^\xd7\xf3\xecY8\x11\x91\x11\xf1\xaa\xfb\xb2\x97\x13Y\xd6\xd6i\xc8\x9f\x37\x97\xd1\xf5\x9f>\xfe\v}z\xf7|\xa7s\x88\x88\x88\x88\x88\x88\xfc\xd3?g\x11\xbd\xef\xe3\t}~\xc5\xf7\xea\xe3\x9frl\xef\xe3\xf8\xeb(\xbe\xcf\x37\xbeO9\xb6\x8fq~\xc5\xa7{/.J\f\x89\xc8;I\x95\xca\x82\x35\xab\x16q\xf6\xdcy\xe6-X\xca\xbe\xfd\x87\xb0\xb0\xb0\xa0T\xc9\xe2o\xdd\xe7\x8b\xa4\x88\x8d\x8d\r\x8e\xb9r\x1p\xdf\xff>\x99\x33g6|\xd9\xdb\xdb\x3p\xe8\xe0\x61\x8a\x14\xcaO\xfdzu\xc9\x91\xc3\x81\xf4\xe9\xd3\x1\x10\xf6\x34,\xee\xce\xdf\x90\xaf\xef%~\xbfq\x87\x96-\x9a\x93\x37O\x1e\x32\x66\xccHdd\x14\xbb\xf6\x1c\x8cW\xfb\x2\x5\xf2\xb1\xeb\xe7_\b\xf\xf\x37\x94\x9d\x39s\x8e\xd0'O\xe3\x1d\xc3\x17\x5\vp\xc7\xef\x1e\x16\x16\xa9\x8c\xc6 ]:\x9b\xf7v\xe\x11\x11\x11\x11\x11\x11\x11\x11\x11I\x1c\xb4\xc7\x90\x88\xbc\x33\x1b\x9b\xb4,\x9c\x37\x3\x8f\xc6-\xc8\xed\xe4HSO\x8f\x37j\x7f\xe1\x82/\xc1\x41\xc1\x44GG\x13\x1c\x1c\xc2\xdau\x1b\xa8]\xa3\x32y\xf2\xe4\xc6\xcc\xcc\x8c\x16^\x1et\xee\xda\x9bQ#\a\x93=[6n\xdf\xbe\x43\x8a\x14\xc9qu-O\xf6\xec\xd9\x38\x38~\x1a+W\xae\xc6!\x87\x3[\xb6l\x8d\x89\xe9\xaf\xa4\xc9\xbb\xb2\xb7\xb7\x3`\xd6\xec\xb9T\xaaT\x81_\x7f\x8dY\xd3\xb4\xcdWM\0\x30\x37O\t\xc0\xd9\xb3\xe7H\x9f>=)R$7j\xdf\xd0\xa3>\xd3\xbf\x9bG\x9f\xbe\x3h\xd4\xb0\x1\x1\x1\x81\xac\xfc\xfe\x87\x37\x8a\xa1^\xbd:\xcc_\xb8\x94N\x9d\xbb\xd3\xb5kG\xac\xac\xac\xb8\xe8{\x91\xe2\xc5\x8b\x91#\x87\x3\r=\xea\x33u\xfa\x9cw:\x87\x88\x88\x88\x88\x88\x88\x88\x88\x88$\xe\x9a\x31$\"\xef\x45\xe1\x42\x5i\xd3\xaa\x39\xe7\xfew\x9e\x46\x1eu\xdf\xa8m\xa7\xae\xfd\xa9Q\xa7\t\x8d\x9b\xb6\x62\xf6\xdc\xf9\x14/V\x94iS'aff\x6\xc0\xd8\x31_\xd3\xa5s;\x16/YN\xd3/[\xb3v\xdd\x6\xc3\xd2o5jTc\xc4\xd0>\xcc\x9a\xb3\x80oF\x8f\xa7@\x81\xfcT,_\xf2\xbd]W\x8e\x1c\xe,_2\x8b\x43\x87\x8f\xd2\xb7\xdf`\xee\xdd\xbbG\xf7.m\xb0\xb0\xb0\0\xc0\xd2\x32\x35\x33\xbe\x1d\xc3\xfc\x85KY\xb7nC\xac\xf6\x19\x33\x66\x64\xfb\xd6\x98\xf2~\x3\x86q\xf2\xd4i\x1a{\xd4\xa4`>\xc7x\xc7\x90*U*~\xd8\xf8=\x5\v\xe6g\xc4\x88\xd1\xb4\xef\xd0\x95\x13'O\x11\x1d\x1d\x65\x38\xc7\xce\x9f\x36\x19\x9d\x63\xc2\xd8\x61\xb1\xf6Q\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x31\xb9r\xcd/:\x8b]z\0n\xf9=\xc0)G\xa6\x4\xeID\xde\x97\xa7\x61\x31\xfb\xce\xdc\xf2{\xc0\x8b\xe7\xf9\xab\xbc\\\xe7m\x7f\x17\x44GG\x13\x16\x16\x86\xb9\xb9\xf9\x9b\a\x9b\x88\x8c\x19;\x81\xa0\xa0 &\x8c\x1f\x93\xd0\xa1\x88\x88\x88\x88\x88\xfc\xa7\xfdz\xfd\xae\xd1\xeb\x98\x37y\xdd\x13\x1c\x1a\xf2\xc1\xe3\xfb\x94\xe5\xcf\x13\xff\xf\xab\x89\x88\x88\xc8\x7f\x8b\xef\xe5\xdf\x62\x95\xa5\xb6\x88\xd9\xcb\xfd\x96\xdf\x3-%'\"\xef\x8f\x89\x89\x89\x92\x42qX\xb2t9i\xad\xad\xb1\xb3\xcb\xc4\xf5\xeb\xbf\xb3p\xf1J\xb6o[\x9f\xd0\x61\x89\x88\x88\x88\x88H\"\x16\xd7\x1b\x46\"\"\"\x92\x38(1$\"\xf2\x1\x45GG\x13\x19\x11\xc1\xe2\xa5+\xb8u\xeb\xe\x65\xcb\x94`\xdb\x8fk\xc9\x9b'OB\x87&\"\"\"\"\"\"\"\"\"\x89\x90\x12\x43\"\"\x1f\x90\x89\x89\tm\xdb\xb6\xa6m\xdb\xd6\t\x1d\x8a\x88\x88\x88\x88\x88\x88\x88\x88\x88\b\xa6\t\x1d\x80\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88|\x1c\x9a\x31$\"\"\"\"\"\"\"\"\xef\xdd\xf3\xe7\xcf\xf9\x61\xd3\x6\x8e\x1c>\xcc\xff\xce\x9d%_\xfe\x2\xd4\xaa]\a\xf7j\xd5_\xd9\xe6\xd7_\xaf\xb0y\xd3&\x8e\x1e=L\x12\xd3$\x94)[\x8e&M\x9b\x61\x9b)\xd3G\x8c\xfc\xd3\xf0\xb6\x63\x11\x11\x11\x41\x8fn]\x88\x8a\x8a\x62\xce\xbc\x5\x1f)\xdaOO|\xc7/::\x9a\x83\a\xe\xb0k\xd7NN\x1c;\x8a}\xe6,\xd4o\xe0\x41\xf5\x1a\x35I\x92$I\x2\x45\x9f\xb0\xde\xf4\xde\xf3\xf7\xbf\xc7\xb2%K8x`?\xf9\xf2\xe7\xa7\xb1gS\x8a:;\x7f\xe4\xa8\x13\xde\xcd\x9b\x37\xa8\xeeV%Vy\x87N\x9d\xe9\xde\xa3W\x9cm\xfc\xfc\xee\xb0|\xd9R\xe\xec\xdb\x87\xa5\xa5%n\xd5\xaa\xd3\xd8\xd3\x13\v\x8bT\x1f:\xdcO\xce\x84\xf1\x63Y\xbetI\xac\xf2=>\a\xb0\xb5\xb5\x8d\xb3\xcd\xdb\xfc\x9d\x91\x18J\f\x89\x88\x88\x88\x88\x88\x88\x88\xc8{\xf5\xe4\xc9\x13\x6\xf4\xeb\x43HH\bu\xeb\xd5\xa7\x81G#\xee\xde\xf5\xe3\xde\xdd\xbb\xafls`\xff~zv\xef\x42\x9b\xb6\xed\xe9\xd6\xbd'QQQ\x9c:y\x92\x88\xc8\xc8\x8f\x18\xf9\xa7\xe1]\xc6\x62\xdd\xda\x35\xf8\xfc\xb2\x97\xf2\xae\x15>|\xa0\x9f\xa8\x37\x19\xbf]\xde;\xf9n\xc6\x34\x9a\xb7\xf8\x8a\n\x15*r\xea\xe4I\x6\xf4\xeb\x43xx8\r<\x1a&@\xf4\t\xebM\xef\xbd\xfb\xf7\xef\xd3\xa6UK\\\\J\xd2\xb7\xff\0\xce\x9d;\xcbW-\xbcX\xb2l\x5\xce\xc5\x8a\x7f\xe4\xe8\x13\xd6\xb3\xb0g\0|;m\x6\xe9\xd3g0\x94[\xa7\xb5\x8e\xb3\xfe\x9f\x7f>\xa6}\xdb\xd6\x14+\xe6\xc2\xc0\xc1\x43\xf0\xf7\xf7g\xe5\x8a\xe5\\\xbbv\x95\xd1\x63\xc6}\x94\x98?%\xa1\xa1\xa1\xd4\xacU\x9b&M\xbd\x8c\xca\xd3\xa4I\x13g\xfd\xb7\xf9;#\x7fSbHDDDDDDDD\xde\xab\x1d\xdb\xb7\x11\x12\x12\xc2\xec\xb9\xf3\x31\x37\x37\x7fm\xfd\xd0\xd0\x10\x46\x8d\x1c\xc6\xe4o\xa7Q\xb1ReCy\xe5*U?d\x98\x9f\xa4w\x19\x8b\xcb\x97.1k\xe6\f\xea\xd4\xad\xc7\xe3\xc7\x8f?d\x98\x9f\xac\x37\x1d\xbfR\xa5\xcbP\xae\xbc+)S\xa6\x34\xd4\x33Kf\xc6\xda\x35\xdf'\xba\xc4\xd0\xdb\xdc{?l\xda@\xd6\xac\xd9\x18\x32l8I\x92$\xa1\xbck\x5\x9e\x85=c\xf6\xac\x99,\\\xbc\x14\x13\x13\x93\x8f\x11\xfa'\xe1\xd9\xb3\x98\xc4\x90s\xb1\x62\xa4K\x97\xfe\xb5\xf5\xcf\x9d=\xcb\xef\xd7\xaf\xb3\xea\xfbuXYY\x1`goO\xbb\xd6_1p\xe0`R\xa5N\xfd\x41\xe3\xfd\xd4\x84\x86\x84\x90\xcb\xd1)\xde\xb3\xcd\xde\xf4\xef\x8c\x18\xd3\x1e\x43\"\xf2\xcez\xf5\xeeG\x6;G2\xd8\x39\x92)Kn\xea\x37\xf0\x64\xd4\xa8\xd1\\\xbat\xd9\xa8\xde\xc1\x83\x87\xa8U\xc7\x83\a\xf\x1e\xbe\xf3\x39\xfd\xfd\xfd\xc9`\xe7\xc8\xc9\x93\xa7\xde\xb9\xafOUxx8\x8f\x1f?&***^\xf5\xa3\xa2\xa2\f?\x87\fv\x8e\xe4+X\x9c/\x9b\xb7\x62\xcb\x96\xad\xf1\xee\xe3\x43;}\xfa\f\x19\xec\x1c\xf9\x61\xf3\x16\xa3\xf2\x80\x80\0\xbe(R\x92\xe9\xd3g\xbe\xf3\x39N\x9d:M\x8f\x9e}(U\xa6\"C\x86\x8e\xe0\xf6\xed;\xffZ\xff\xf9\xf3\xe7l\xdd\xf6\x13\x45\x8b\x95\x61\xef^\x9fw>\xff\v~~~\xd4\xac\xdd\x80\x13'N\xbe\xb7>?\xa6\x97\x9f\xd7\xd9r\xe4\xa7~\x3O\xe6\xcd_HPPpB\x87\x6\xc0\x83\a\xf\xc9W\xb0\x38S\xbe\x9d\x16\xeb\xd8\xe1\xc3G\xc8`\xe7\xc8\xb9\xff\x9d\x7f\xa7s\xbc\xc9\xbd\xf4\xf4\xe9Sv\xec\xf0\xa6{\x8f\xde\x94*S\x11\x37\xf7\xdaL\x9d\x36\x83G\x8f\xde\xdf\x8b\xf1\x88\x88HZ\xb7\xe9\xc0\xb2\x65+\xde[\x9f\"\"\"\"\x1f\x42TT\x14\x33g\xcc\xa0i3\xafx\xbfYw`\xff~\x92'KN\xb9\xf2\xae\x1f\x38\xbaO\xdf\xdb\x8e\x45hh(#\x86\xf\x65\xf8\x88Q\xe4\xc9\x93\xf7\x3\x45\xf7\xe9{\xd3\xf1\xb3\xb4\xb4\x34$\x85^\xc8\x90!#\xa1\xa1!\x1f\"\xbcO\xda\x9b\x8e]DD\x4\x8b\x17.\xa4V\xed:F\xcb\xee\xb9\xb9W\xe3\xe8\x91\xc3\xdc\xbcq\xe3\x43\x85\xfaI\n{\x16\x6@\xb2\x64\xc9\xe3U\xdf\xdc<\xe6\xbe{\xf8\xe0\x81\xa1\xec\xcf\xc7\x8f\xc9\xe5\xe8HJ\v\x8b\xf7\x1f\xe0'.88\x98\x94\xf1\xfc\x9b\xf1\x36\x7fg\xc4\x98\x12\x43\"\xf2^\xb8U.\xcb\x96\x8d+X\xbf\x66\t^\xcd \x1d_\x8f\x18\xc4\x84\xc9\xb3\xb8v\xed\x9a\xa1\xfc\xf9\xf3\xe7\x8c\x19\x37\x89N\xed\x9aS\xe8\x8b\x82o\xdd\xff\x9b\xdcK\0\xb7o\xdf\x61\xce\xdc\x5\x14/\xee\xcc\x98oF\xd0\xb4i#vz\xef\xa6[\xf7^DD$\xbe\xa5ODDD$q{\xf4\xe8\x11\xf7\xef\xfb\x63ii\xc9\x82ys\xa9[\xbb\x6_6k\xc2\xf\x9b\x36\x12\xf9\x8a\xe5\xa8n\xde\xb8\x41\xfe\x2\x5\x38\xff\xbfst\xef\xda\x85*\x95\\\x19\x36t0\xb7n\xde\xfc\xc8\xd1'\xbc\xb7\x1d\x8b\xf9\xf3\xe6\xe0\xe8\xe4\x84\x9b{\xb5\x8f\x14\xe9\xa7\xe9}\xdcK\xa7N\x9e\xa0R\xe5\xd8{\xc5|\xee\xdet\xec\x1e?~DHH0\xb6\xb6\xc6{\xf\x65\xfak/\xa2\x87\xf\x1f\xc4\xd5\xec\xb3\xf5,,&1\xd4\xd8\xa3\x1eU*\xb9\xd2\xb7wO\x8e\x1c>\xfc\xca\xf7\xc2\x8a\x14-J}\x8f\x86t\xef\xda\x99\x8d\x1b\xd6\x31\x7f\xee\x1cV,_\xca\xb8\xf1\x13\x31\x35M|o\xdb\a\x4\x4\x30q\xc2\x38*W(G\v\xaf\xa6\xcc\x9d\x33\x8b\xc0\xc0\xc0\x38\xeb\xbe\xcd\xdf\x19\x31\xa6\xa5\xe4\x44\xe4\xbd\xc8\x94\xc9\x96R\xa5J\x1a\x1e{x\xd4\xc7\xc5\xa5\x18}\a\x8c\xa0x1g\x9c\x9c\x1c)W\xae\f\xe5\xca\x95I\xc0(\x13\x87\\\xb9rR\xc2%f\x1d\xdfr\xe5\xcap\xf3\xe6-\xb6o\xf7\xa6\x45s\xaf\xd7\xb4\xfc\x38:uj\xcf\xb6\xed\xdeL\x9e\x32\x8d\x89\x13\xc6r\xf8\xf0\x11\x16,^\x8d\xf7\xf6\r\xb1>\xa5\xf5&\xa2\xa2\xa2\x98\x30\xf1[\x6\xf6\xefN\x97\xce\x1d\x1(W\xb6\f\xf5\x1ax\xb2~\xc3\x46\xbau\xedlT\xff\xf1\xe3?\x19\x32\xeck:\xb6o\xcd\xd2\xc5\xf3\xc9_\xa8\xd4;]\xd7?\xd9\xdb\xdb\xb3\xfd\xa7\xcd\xef\xb5\xcf\x8f\xcd\xd6\x36\xa3\xe1^\x2H\x96,\x19m;\xf4\x62\xe2\x84 \xac\xac,\x13\x30\xb2\x18u\xeb\xd6\x66\xf5\xf7\xeb\x98\x38i*s\xe7|\x87\x89\x89\t[\xb7\xfe\xc4oW\x7fg\xc9\xa2\xb9o\xdd\xef\x9b\xdeK\x10\xf3\xbc\xdb\xb2y\xbd\xd1\x32\t\xa5K\x95\xa4\\\xc5\x9a\xdc\xb8\xf1\a9s\xe6|\xebx^H\x9a\x34\t\x8b\x17\xcd{\xe7~DDDD>\xb4\xc0\x80\0\0\xda\xb4jI\xd7\xee=\x19\x34x(w\xef\xde\x65\xe2\xf8qDDD\xd0\xa8\xb1g\xac\x36\xb7\xef\xdc\xe6\xa7m[\t\n\n\xa2V\xed:4\xf3\xf2\x62\xf3\xf\x9bh\xd7\x12l]9\0\0 \0IDAT\xe6+\xd6m\xdc\x8c\xa5\x65\xc2\xff\xff\xf9\xb1\xbc\xcdX\x1c>|\x88m?na\xdd\xc6\x1f\x12\xd5\xd2]qy\xd7{\xe9\xc4\xf1\xe3\xec\xdd\xb3\x87\xed\xde\xbb>N\xc0\x9f\x90\x37\x1d\xbb\x17\xcb\x15\xfes\xc6\x46J\x8b\x98\xd7\xf6o\xfa\x41\xd7\xff\xba\xf4\xe9\x33\x30v\xfc\x44\x32\x64\xc8HTT$'O\x9c\xa0m\xeb\x96L\x9c\xfc-5k\xd5\x8eU?i\xd2\xa4\xb4m\xdb\x9e\x9a\x1b\xdd\x18>t\b\0_\x8f\x1e\x8bS\xee<\x1f;\xf4OB\xd3\x66^X[[cii\x85\xbf\xff=V,_\xc6\xde=\xbbY\xb2l\x5\x16\x16\xa9\x8c\xea\xbe\xcd\xdf\x19\x31\xa6\xc4\x90\x88|\x10&&&4\xf1l\xcc\xcaUkY\xbf\x61\x13\x43\x6\xf`\xef^\x1f\x9a|\xd9\x8e\xdf\x7f;\x8b\x85\x85\x5\x1\x1\x1,\\\xb4\x84\x9d\xde{\b\b|D\xa9\x12\xc5\x18:d Y\xb2\x64\x66\xf2\xe4\xa9<\x8fxN*\v\v\xb6m\xf7\xc6\"eJZ\xb6\xf0\xa2N\x9dZq\xfe\x93\xfb\xf4\xe9S6o\xf9\x91\xed\xdb\xbd\x39w\xfe\"N\x8e\x39h\xd5\xb2\x39\x35kV7\xd4y\xf4\xe8\x11s\xe7-`\xa7\xf7\x1eLMM\xa9Y\xdd\x8d\xde\xbd{`jj\xca\xad[\xb7\x99\x39k\xe\xbf\xf8\x1c OnG\xbat\xee@\x89\x12.\0\xec\xdd\xeb\xc3\x94\xa9\x33\xf0l\xec\xc1\xf6\xed\xde\xdc\xbe\xe3G\x13O\xf\x9a\x36i\xcc\x9a\xb5\xeb\xd9\xb1\xf3g\x9e?\x7fN\xab\x96_\xd2\xb8qC\xc3\xa7:BBBX\xb0p1\xdb\xb6\xed$U\xeaT4k\xda\x98\x86\x1e\xf5I\x92$\t\xfe\xfe\xfe\x38\xbbT`\xca\xa4o\xd8\xb7\xff\0\xc7\x8f\x9f\xa6\x82k\x19z\xf7\xea\x81\x9d]&\x8e\x1d?A]\x8f\xe6\0\x38\xe5\x8byc\xfe\xea\xe5\xd3\xf8^\xbc\xc8\x98\xb1\x13\xf9n\xfa\x64\x1c\x1c\x1c\xe2\xf5\xb3\xb8s\xc7\xf\x17\x17\xe3\xf5Y\x8f\x1d?\xc1\xc2\x85K8s\xf6<\x15\\\xcb\xd0\xbd[g\xb2\x66\xcd\xfa\xdaq|\x11\xf7\xe4\t\xa3\xd8\xb7\xff 'N\x9e\xa1j\x95\nt\xef\xd6\x85#G\x8e\xb2\x65\xebO\xfc\xfa\x7f\xf6\xee:,\x8a\xf5\v\xe0\xf8w\x81\xa5U\x10\x4T\x14\v\v[D0Q\x14\xbb\xc0\xee\xee\xee\xee\xc4\xee.\xec\x8e{\xed\xc2\xb8\xf7zm\xc4\xee@\x14\x13\x11\xa5w\x7f\x7fp]]YB\x5\xfd\xdd\xeb\xf9<\x8f\xcf\xc3\xce\xbc\x33s\xe6uvvw\xce\xbcgn\xdd\xa1^\xdd\x9at\xed\xd2\tss\xf3x\xf1\x98\x9b\x9b\xe3\x33y\x1c\xb5\xea\x35\xa3|\xb9\xb2\xf8L\x9b\xc5\x90\x81=(Z\xa4\xb0\xa6\xcd\xf2\x15\xab\x38~\xfc$K\x16/\xc0\xd8\x38yC\xb0o\xde\xba\xc5\x1f\xa7/\xe0\xe3\x33\x41\x33\xcd\xd8\xd8\x98\x86\r\xbc\x98\x31k>\xdd\xbbu\xd1:v\xd2\xa7\xb7\xe4\xd8\x91}(\x95J\xa2\xa2\xa2\x12]\xf7\xb7\x1c\x3\xc1\xc1\xc1\x14,Z\x86\xbd\xbb\x37\xe2\xec\x1c\xd7\xff\xb7o\xdf\x61\xc1\xc2\xc5\x1c?\xf1'\xeY\xedi\xd3\xba\x5\xb5k\xd7\x64\xda\xb4\x99\xc4\xc4\xc6`gk\xcb\x86M[)T\xd0\x89\xa9>\x93P\xab\xd5\x1c \x8c\x1e\x39\x18\x1b\x9b\xb8m\xfc\x88\x63\t\xd0y^\xfaX_\xda\xd4\x34~\t\x80o=\xafxV\xa9\x45\xa3\x86^\xb4k\xd7\x6H\xf8\xbc\xe6\xe7w\x82)Sg0x`_V\xac\xf4%\xf0\xc9S~\xdb\xb5\x5sss\xae]\xbb\xce\xe2%\xcb\xf8\xe3\xcf\x33\x14)\\\x80\xe\xed\xdbh\xfe\xcf\x92:7\x1\x89\x9e\xbb\x85\x10\x42\b\xf1k\t\r\r\xe5\xd9\x33\xed\x87|g\xcd\xea\x80\xc9?\xdf\x45k\xd6\xaaM\x97\xae\xdd\x34\xf3\xa2\xa3\xa3X\xbax\x11\xf5\x1b\x34\x8c\xf7\xfd)]\xda\xb8\xe7k\xcc\x98\x35G\xf3]\xb6P\xe1\"x\xb8\x97\xe3\xcc\xdf\xa7\xa9T\xd9\x33\x35w\xe5\x87\x8b\x8e\x8e\xe6\xfe\xfd{Z\xd3\x32Xg\xc0\x32}\xfa\xaf\xee\x8bW\xaf^2r\xf8P\xc6\x8e\x9f\x88\x95\x95\x35\0j\xfe\xfb\xd5:\xee\xdf\xbbGtL\xb4\xe6\xb5\x99\x99\x19\x99\x33\xdb\x7f\xd7\xb1\xf4\xec\xe9SF\f\x1b\xcc\x64\x9f\xa9\x64\xca\x94\x39uw\xe0'I\xc9\x63/\xcd?\xcf\xc0y\xff\xe1\xbd\xd6\xf4\xf0\xf0\xb8\x91\x33\x16\x96\x96\xa9\xb2\xf?Sb\xfd\x97;O\x1er\xe7\xc9\xa3\x99^\xbaLY\x14z\n\xa6\xf9L\xa1Z\xf5\x1a\xf1\x46\x1\xdd\xbcy\x83\xe6M\x1a\x31~\xe2\x64\xdc+T\xe4\xee\x9d\xdb\xcc\x9d\x33\x8b\x3\xfb\xf7\x31s\xf6\x9cx\xc9\x90\xff\x82g\xcf\x9e\x11\x1a\xfaV\xf3Z\x81\x2\xc7\xdc\xb9\x1\xa8\xdf\xa0\xa1V[\xe7\x12.x\xb8\x97\xe5\xd4\xc9\x93T\xa9ZMk\xde\xb7|\xce\bm\x92\x18\x12\x42\xa4\x1a\xa5RI)\xb7\x92\x4\x4\\\xd5\x39\xbfo\xff\xc1(\x14\nF\x8f\x1c\x82Z\xad\xe6\xd6\xed;\x9a\x87\xed\x1\xcc\x9c\xb3\x94\xde=:0tp\x7fn\xde\xbaM\xe7\xee\xfdQ\xe8)\xa8]\xab\x66\xbcu)\x14z\\\xbc\xe8O\xe5\xca\x1e\xb4k\xd7\x9a\x1b\xd7o\xd0\xa6\x43Ovm[\x83\x9b\x9b+\x1f>|\xa0\x41\xa3\xe6\x14+Z\x98\xb1\xa3\x87\x11\x15\x1d\xcd\x83\a\xf\xd1\xd3\xd3\xe3\xc5\x8b\x97T\xab\xe9\x45\xf7\xae\x1d\xa8[\xb7\x36\x97.\xfaS\xab^3\x8e\x1c\xdcI\xc1\x2N\0\x9c=\x1f\x80\xadM\x6:\xb4o\xcd\xa3\xc7\x81L\x9a\x32\x93\xb1\x13\x66\xd0\xb7WG\xfa\xf5\xe9\xc1\x95+W\xe9\xd9w\x18\xe9\xd3\xa7\xc7\xd3\xb3\x12\xb1\xb1\xb1t\xed\xd6\v;;[\xc6\x8f\x1f\xc5\xa3\x87\x8f\x98\x35{>\xb1\xb1\xb1\x34m\x12w\xd7\x42Tt\f=z\xf\x61\xd9\xe2\x99T\xab\xea\xc9\x8a\x15\xbet\xef\xd1\x87\xcd\x9b\xd6\x91/o\x1e\x86\f\xec\xc1$\x9f\xb9l\xd9\xb0\x1c+++LMMy\x1a\xf4\x94\xf3\x17\xaf\xf0\xfa\xf5\x9b\x4\x13\x43]{\f\xe2m\xc8[\x1e>z\xc4\xa2\xa5k\x1\xf0\x99\xf2\xe9\x2\xf7_\xa7\xff\xa6S\x97^\x8c\x1b=\x8c\x16-\x9a\xb2w\xef~\x9a\x34k\xc3\xde\xdfw`dd\x94h?~\x8c\xbbg\xdf\x61\xacX2\x1bOO\xf\x16-^N\xe1\xe2\x65\xf1\xaaS\x95\x66M\x1a\xf1\xea\xf5+f\xce\x9aOLL,C\x87\f\xd4\x19\x63\xc9\x92.\xf4\xe8\xda\x96\x36\x1dzb\xa8\x34\xa0\x63\x87\xf6Z\xf3o\xdd\xba\xcd\x85K\x1\x44\x46\x46$\xfb\x62~\xf0?%\xbelml\xb5\xa6gsp\xe0\xf9\x8b\x37\x84\x86\xbe\x8b\x37\xca\xe5k\x92#_{\f|\xe9\xf6\xed;xV\xabG\xff\xbe\xdd\xf0\xf6\xae\xc7\xebW\xaf\xb5\xb6?c\xf6\x12\xbc\xeaT\xa5\x43\xfb\xd6\xd8\xd9\xd9\x1\xb0y\xcb\x36\xa6\xf8\xcc\x64\xc4\xf0\x81\xa4k\x91\x8e\r\x1b\x37S\xad\xa6\x17~G\xf6\x62mm\xad\x89\xcb*\xbd%\xed\xda\xb4\xe2\xe9\xb3\xa7L\x9f\x31\x1f\xb5ZM\xdf>\xbdx\xf3&\x4\xef\x6\xcdi\xdc\xd0\x8b\xb9s\xa6\x11\xf2&\x84\x17/_&k\xbf\xa3\xa3\xa3Y\xb7q'y\xf3\xe4\xe6\x43x8\xe3&\xce\x4`\xef\xee\x8d\x9a/WI\xbdw\x2\x3\x3I\x9b&-}zwG__\x9f\x45\x8b\x97\xd1\xb3W?6n\xf0\x45\xa1Pp)\xe0\x6\x97\x2n0g\xc6\x4<<*\xb0u\xeb\xe*z\xd6\x5`\xf1\x82iT\xae\xec\xc1\xea\xd5k\xe9\xdc\xb9\a\xbbvn\xd1\x19w\xe1\xc2\x85\xe8\xd6\xb9\x35\x63\xc7O\xa6\x62\x85\xf2\x64\xcah\x83\xb7W]\xcd\xfc\x1fu,}\xf4\xf8q O\x9e<\xe1\xf1\xe3@\xe6\xce_\xcc\x84\xb1\x43\xc8\x98\xd1Ng\xdb\xef=\xa6\x12;\xaf\x1\\\xf4\xbf\xce\xf8\t>\xb4n\xdd\fsss\xcc\xcd\xcd\xb9z\xed\x1aU\xaay3bX?\xbc\xbd\xebq\xea\xd4\x9f\xd4\xaa\xd7\x8c\xdd\xdb\xd7\xe2\xeaZ\x12H\xfc\xdc\x64`\xa0\x9f\xe4\xb9[\b!\x84\x10\xbf\x8e+W\x2\xe8\xd0\xb6\xb5\xd6\xb4\xdf\xf7\x1d\xc0\xd6\x36\xee\xfb\x8f{\x85\x8aZ\xf3\x32g\xb6\xe7\xc9\x93@\"##166\xd6\x9ag\x97\x31#\xfa\xfa\xfaZ#\xfLMM\xc9\xea\xe0\xc0\xab\x7f\xee\f\xff/\t\r}K\xbd\xda\xda\xbfm\xa7\xce\x98\x45\xf5\xea\x35\xbe\xba/\x96/]\xca\xd3\xa0 :\xb6\x8f_\x9a\xdb)\xaf#-Z\xb5\x66\xf0\x90\x61)\xbf\x13?\xd9\xf0\x61\x43\xb8t\xf1\x82\xe6u\xd3\x66\xcd\x19\x36\x62\xd4\x37\x1fKo\xdf\xbe\x65`\xff\xbe\xd4\xf5\xf2\xa6j\xb5\xea\xa9\x1a\xfb\xcf\x94\x92\xc7\x9e\xa5\x65z\xf4\xf5\xf5\tz\xf2\x4\x9c?U\x9bx\xf1\"\xaeT{\x6\xeb\f\xa9\xb4\x17?Ob\xfd\xa7K\xc1\x82\x85X\xbcp\x1\x61\x61\x61\xf1\x46\\\xad[\xbb\x86\x1a\x35kS\xcf\xcb\x1b\x88K\x84L\x9f\x39\x9b\xf2\x65J\xe1w\xec\x98\xceQF\xffv\xbbvng\xce\xac\x99\x9a\xd7\xa6\xa6\xa6\x9c\xbd\xe0\xaf\xb3\xad\x9d\x9d\x1d\xd9\xb2\x65\xe7\xe9\xd3\xa0x\xf3\xd2\xa7O\xf|\xdd\xe7\x8c\xd0&\x89!!D\xaa\xb2\xb5\xb5\x61\xff\x81\xc3\xf1\xa6GGG\xb3\xef\x80\x1f\xb3g\x8c\xa7|\xf9r\0\xb8\xbbk?\xdc\xd0\xda\xca\x42\x93X(_\xbe\x1c\x1f>|\xc0g\xea,\x9d\x89!cc#|\xa6L\xd4\xbc._\xae,\xbf\xed\xd9\xcf\xe9\xbf\xcf\xe0\xe6\xe6\xca\xae\xdd\xbf\xa1\xaf\xaf\xcf\xc4\tc10\xd0>\xf5m\xda\xbc\x5\xb7\x92\xcet\xee\xd4\x1\0\x37\xd7\x92\\\xbc\xe4\xcf\xfe}\a4\x89!\x80\xd9\xb3\xa6i\xee\x86\xb9s\xe7.KW\xacg\xf0\xa0\x1\0T\xa8\xe0\x8e\xdf\x89S\xf8\x1d?\x81\xa7g%N\xff}\x86\xe3'Os\xfd\xcaYLMMqs-IDd$+V\xfaj\x12\x43\0\x9b\x37,\xc7\xfd\x9f\xfd\x37\x37\x33\xa3Q\xb3\xe\x4=\r\"k\x96,\xb8\xfes\a\x7f\xe1\xc2\x85\xb0\xb0\xb0\0\xc0\xcb\xab.\x95*yh\x8d\xd8\xd0\x65\xc8\x88\x89Z\xaf'M\x9e\xca\x94\xc9\x13\x31\x30\xd0g\xda\xf4Y\xf4\xeb\xdd\x8d:u\xe2\xbe`\x14/V\x94\xc2\xc5Jq\xee\xfcy<*VH\xb4\x1f?\xda\xb2\x61\xb9\xe6\xffMO\xa1G\x87.}\x19\x33z\x84\x66$\xc8\xabW\xafY\xb0h\x5\x83\a\xf5O\xb0.n\x99\xd2n\xcc]\xb0\x82\x1c\xd9\xb3`f\xa6]Bn\xe2\x84\xb1\x8c\x1c\x31,\xde\xf4\xc4\xbc|\x19\xf7%\xd5\xc4\x44\xfb\x83?M\x9a\xb8;l\xde\xbd\xfb\xfe\xf2g_s\f|i\xee\xbc\x5th\xd7\x42S\x9aL\x97ysgj\x8e\xcf\xb0\xb0\x30\x46\x8d\x99\xc4\x82\xb9\xd3\xa9X\xd1\x1d\0\x37\xb7\x92T\xacT\x9d\xad[\xb7\xd3\xb9sG\xcdr\xf3\xe7\xcd\xd2\xc4\x15\x1c\xfc\x82\x8d\x9b\xb6\xd1\xb7O/\x2\x3\x3y\xfe\xe2\r\xf5\xea\xd6\xc6\xc9)\xffW\xed\xeb\xc7\xe7\xe2|y,\r\x1f\x39\x96\xb5\xbe\xcb\xb1\xb6\xb6N\xf2\xbdS\xb5j\x15\xaaV\xad\xa2YV\xa9\x34\xa0Q\xb3\xe\xbc|\xf9\x8a\f\x19\xacq\xca\x97\v\xd7\x92\xce\x34n\x1cwWP\x8e\xec\xd9\xd9\xb1\xfb\0K\x17\xce\xd0\x1c\x9f\x16\x16\x16\xd4\xab\xdf\x92G\x8f\x1e%X\x8e\xad[\xd7\xce\xac\xf2\xdd\xc8\xe5+K\xd9\xbd}-FF\x9f\x12@?\xfaX:x\xf0\x90V\x9f\xd9g\xce\x8cZ\xadN\xf0N\xa5\xef\x39\xa6\x12;\xaf}\xb4l\xe9|\xad$\xf2\xec\xd9\xf3\xe9\xdd\xa3#\x9d:\xc6%c\xcb\x95-CHH\b\xb3\x66\xcfg\xe3?\x89!H\xf8\xdc\x94\xd1\xce.\xc9s\xb7\x10\x42\b!~\x1d\xa5J\x95\xe6\xea\x8d\xdb:\xe7\x35h\xd8\x18\xbf\x63G\xa9R\xb5\x9a\xe6\x37\xc1\xa5\x8b\x17)^\xdcYs\xb1\xee\xc3\x87\xf\x9aQ\t%]]\x89\x8d\x8d\xe5\xea\x95+\x14(\x18\xf7\xac\xc8\xe7\xcf\x9fs%\xe0\x32}\xfa\xf6\xfb\x1{\xf3\x63YYY'\xd8w\xc9\xe9\v\x95JEdd$&&&4h\xd8\x88\x9a\xb5\xb4/ \x8f\x1e\x35\x82\xabW\xae\xb0\x65\xdb\xe\xcc\xd3$\xfe\xfb\xf1\xdfj\xdd\x86M:\xa7\x7fm\xff\x41\\Rh@\xbf>8\xbb\xb8\xd0\xb1S\x97\x1f\xb3\x3?\xc9\xf7\x1e{\x91\x91\x91\x18\x18\x18\xa0\xaf\xaf\x8f\xa1\xa1!\xad\xda\xb4\xe5\xb7\xdd;\xa9V\xbd\x86\xe6\x66\xbe\xe3~\xc7p\xafP\x91\xcc\xf6\xff\xbd\xaa\x2\x89\xf5_ll,\xfa\xfa\xfaZ\xd3n\xdd\xbaI\xce\x9c\xb9\x34I\xa1\xcf\xcf{\x11\xe1\xe1\xc4\xc6\xc6j\xfd\x66\xb4\xb0\x88+\xa5\x96Te\x93\x7f\xabN\x9d\xbb\xd2\xa9s\xfc\xf2\xecj\xb5\x1a\xb5Z\xadu\r\xe9\xd5\xab\x97 g\xcf\x9e\xa3\x44\tg\xcd|}}\xfd\x4/\xe4\xdf\xbes\x87\x98\xe8\x98O\xb1\x98\x9b\x91\x35K\x16M\xf2\xec\xc3\x87\xfZ\xa3\x17\xde\x7f\xf8\0\xa0\x99\xff=\xbe\xe6\x18\xf8\x9cJ\xa5\x62\xff\xc1\x63\xcc\x9e\x31\x39\xc1uW\xab\xe2\xaeu|>\xe\f\xe4\xf5\x9bP\xf2\xe5\xfbT[\xd8\xc4\xc4\x84*\x95+r\xf9\x8a\xf6(\xbc\xcf\xe3\xca\xed\x98\x8b\a\x8f\x9e\xa2R\xa9pt\xcc\x45\xad\xea\x1e\x34h\xdc\x8a\xa6\x8d\xbd\xa9\xe4Q\x81\x12%\x9c\xe3}Q\xd5\xc5\xc4\xc4\x98V\xcd\xeb\x33\xd5g\x12\x10\x97\xcc\xbd\x1cp\x85\x46MZ\xb3h\xf1\x32\x86\xf\x1b\x9c\xe4{G\xadV\xe3\xe7w\x9c\xc3G\x8e\x11\x10p\x95\xd3g\xe3\xee\x2\x8a\x8c\x8c++\xa0\x34\x30 W\xce\x1c\x9a\xe5\xec\xed\xe3J5\x18}6\xb2\xe7\x63\t\xb9\xb0\xf7\x1f\x12\x8c\xd5\xda\xda\x8an]\xda\xb1o\xdf\x41\xcd\xa8\x97\x8f\x12;\x96\x82\x82\x9e\xf2\xf6\xed\xa7!\xec( _\xde\xbc\xdfu,\xb5k\xd7\x86\xb6m[\x13\x1a\xfa\xe?\xbf\xe3\xb4j\xd7\x1d\xdf\x95\xf3\xa9ZEw\xb9\x8ao=\xa6 \xf1\xf3\xdaG\x1fK\xea\x41\\\xb2\xef\xd0\x91\x13\x34j\xe8\xad\xd5\xa6|\xb9\xb2\xb4\xef\xdc[\xeb\x87GB\xe7\xa6\xe4\x9c\xbb\x85\x10\x42\b!\0\x9a\xb7hI\xb3&\x8d\x98 l\b^\xde\xde\xd8\xd9\x65\",\xec\x1d\xeb\xd7\xad\xa1L\xd9r\x94*\x15\xf7\xbc\xf2\xcf\xdf\xb7i\xd3\xa6M\xf2sF$N\x12\x43\x42\x88T\x13\x13\x13\xc3\x9f\x7f\xfdM}\xaf::\xe7\xf7\xe8\xd1\roo/\x8e\xf9\x1dg\xc5J_\x86\xe\x1b\xcb\x86\xf5+\xc8\x97\x37\xee\x42\xf8\x97wG\xe8\xe9\xc7]@U*\r5\xcf\xee\xf8\xe8\xf5\xeb\xd7\xd4\xa9\xd7\x88\xc6\x8d\xbc\x18:t \xe9--)\xe2\\\x8e\x1b\x37n\xfe\x33\xff\x8dV2\xe3s\x96\x96\x16\x38\xe5\xcb\xc5\x9a\xd5K\xb5\xa6\x1b\x1b\x9b\xe8l\xf\xa0\xeb\xbb\xcd\xe7_x\xcc\xff\x19Yp\xe6\xaf\xc3\x18|v\x11>\xb1/E\xa9\xf1}\xc9\xc4\xc4\x84\x86\r\xeb\x33g\xde\"\xae^\xbd\x86g\xe5J\xe8\xeb\xeb\xd1\xa5\x63+\xda\xb6i\xa9\xd5\xd6\xc2\xc2\"\xc9~Lv\xe0I\xec\xcc\xb2\x65+x\xfb\x36\x94\xdb\xd7\xcf\x31\xc5g:\xfd\a\xe\xe3\xf7\xdd[5#'\x12\xd3\xbb\xcf@\xce\x9e\xf\xd0\xbcn\xd7\xba\x31\x93&\x8e\xd3\x8cV\nz\xfaT\xeb\x62\xfe\x93'Ad\xb5\xb7\xd3\xf9\xbc\xa3\xef\x91\xd4\x31\xf0\xb9\xc8\xc8HB\xde\x86}U\x9d\xef\xa8\xa8\xb8Z\xd9*U\xac\xd6tC##L\x12\xbb\xf3\xe5\xb3\x10\x8c\x8d\x8dY\xb6t!\xd7\xaf\xdf\xe0\x98\xdfq\xfa\r\x18\x8aM\x6kV\xafZ\xfa\xd5\xf\xefU*\x95\x14/V\x94\xd6-\x9bp\xea\x8f\xbf\x80\xa4\xdf;\xabV\xaf\x61\xed\xda\x8d\x8c\x1a\x35\x94.\x9d;p\xf5\xeauZ\xb4\xe9\x8a:\x81n\xd0\xd5\x7f\xc9}_\x18\x19*16\xf9\xba;\x82\x36m\xde\xc2$\x9fO_\x18\xcdL\x8d\xb9\x7f'\xe0\xbb\x8f%\x85\x42\x41\xbati\xa9S\xa7\x16~\xc7O\xf0\xfb\xef{\x13L\fi/\xa7{]\tI\xec\xbc\xa6\x8bJ\x15KDd\x14\xb1\xb1*\xad\xe9J\xa5\x12\x63#C\xf4\xf4t'\f\xbf\f!\xa9s\xb7\x10\x42\b!\x4@.GG\xd6\xac\xdf\xc0\x1a\xdf\xd5\x8c\x1d=\x8a\x2\x5\v2o\xc1\x42\x8a\xffSn\xca\xcc\xcc\x1c'\xa7\x2\xd8\xd9\x65\xd4,3h\xc8\x30\x1c\xb2\x65\x63\xcb\xa6\x8d\x84\x87\x87S\xc9\xd3\x93\x66\xcdZ$z#\xcc\x7fUR}\x91\xd5!\x1by\xf3\xe5\xd7y#\x9e\xf8\xba\xfe;u\xf2\x4W\x2.\x3\xd0\xba\x65\x33\xad\xf5,X\xb4\x94\xf2\xee\xee?:\xfc\x9f*\xb1\xbeS(\x14\xe4\xc9\x93\x97\xec\x39>Us\xc8\x92%+\xab\xd6\xac\xc3w\xd5J\xc6\x8f\x1b\x43\xb1\xe2\xce\xf8\xae\xdd\x80S\x81_/)Y\xadz\r\xf6\xed\xdb\xcb\xe2\x85\vx\xf7.\x94\xe2%\\\xd8\xb8y\x1b\x5\v\x15\x2\xe2\x9f\xf7J\x95*\xcd\xda\r\x9b\xd8\xb2i#cG\x8f\"]\xbat\xb8\x95.\xcd\xaa\x35k\xb5n\xf2\xfb\x15X\xa6OO\x9d\xba\xf5\x38r\xf8\x30W\xaf\\!g\xae\\T\xaa\\\x5/oo\f\xff\xa9\n\xf2\xe5y/\xa9\xcf\x19\x91\xb8_\xef\x93U\b\xf1\xc3l\xdb\xb6\x83\xd7\xaf\xdfP\xbf\xbeW\x82m2e\xcaH\xb3\xa6\x8di\xd4\xb0>\xd5k\xd4\xe3\xd0\xc1#\xe4\xcb\x9b\x97\xf0\x88\b\x8e\x1c\xfb\x93\xa8\xa8(\xcd\t? \xe0\ne\xdc\x8a\x63\x66\x66JX\xd8;\xad\xf5\\\xbdz\x9d\xfb\xf\x9f\xd0\xaa\x65\v\xd2\xa7\x8f{\xb8\x61l\xac\x8a\x83GN\x1\x90\x37On\xe\x1e:JLLL\xbc\x1f\x15\x85\n\x16`\xe7\xee}\x98\x99\x99\x63i\xf9\xfd\xa3J\0\x1cs\xe5\x2\xe0y\xf0s\\\\\xbe\xf1\x3\xe9\x9f\xab\xb1\x31\x31\x31Z\x93\xdf\xbf\x7f\xffU\x17\x83\x1\f\r\r\xb1\xb3\xb5\x45OO\x8f\xba\xb5\xaap\xe7\xce]2g\xce\x1c\xef\xa2\xf3\xc9\x93\x7f$\xda\x8f)! \xe0\n\xe3&\xcd\x62\xf3\x86\xe5\xa4K\x97\x8e~}{\xb1w_-\xe6\xce[\xa8)\x1d\xf8\xe5\xb0\xfe\xcf\xed\xf9m\xbb\xce\xf5\xe6\xcd\x9b\x87\x82\xf9\x1d\xd9\xbbw\xbf\xe6\x2uLL\f;v\xee\xa6S\xc7\x36\x9av\x11\x11\x91(\x95\x6\xc9\x1a\x35\x93RLLL(R0/\x17/\xfaS\xbdZ\xd5\x64-\x93\x35\x8b=\xfa\xfaz\\\xb8x\x89\xcc\x99\xe3\x46\xd2\xc4\xc4\xc4r\xea\xd4\x9f\x34n\xdc \xd9\xdbV(\x14\xe4\xcf\x9f\x8f\xfc\xf9\xf3Q\xa7vM\x8a\xb9T\xc0\xdf?\x80\xb2\x65K\x7f\xd3\xbe\xe8\xeb\xeb\x91#G6 \xe9\xf7\xce\xce]\xbfS\xb7nM\xca\x95-\x3\xc0\xbd{\xf7\xff\x89\xe9\x9b\x36\xfdM\x12;\x96\xfa\xf4\xeeI\x9f\xde=\xe3M\xff\x96\x63I\xd7\xb9\x45\xadV\xf3\xfaM\b9\xb2gK\xd1}\xd2\xc4\x99\xc8yM\x17\x43\x43\x43J\xbb\x15\xe7\xd4\x1f\x7fh\x95\xa6\xbbp\xf1\"\x9e\x95\xca\x63`\x90\xfc\xf7\x44\x42\xe7n!\x84\x10\x42\x88\xcf\xe5\xce\x9d\x87q\xe3'\xea\x9cggg\x87\xef\xba\rZ\xd3\f\f\fh\xde\xa2\x15\xcd[\xb4\xfa\x11\xe1\xfd_K\xaa/\x9a\xb7hI\xf3\x16-u\xce\x3h\xd3\xb6\x1dm\xda\xb6K\xad\xf0\xfe\xef}M\xffU\xaa\xec\x99`i\xb0_Qb}\xa7\xaf\xaf\x8f\xcf\xb4\x19\xf1\xa6;880b\xd4\xe8\x1f\x10\xdd\xff\xb7\xa2\xc5\x8aS\xb4X\xf1\x4\xe7\xeb:\xef\x15-Z\x8c\xa2\x45\x8b\xa5vh\xff\xf7,,,h\xd8\xa8\x31\r\x1b\x35N\xb0\x8d\xae\xf3^b\x9f\x33\"q\x92\x18\x12\x42\xa4\x88g\xcf\x82\xf9\xfb\xccY\xd4*\x15\xcf\x9f\xbf\xe0\xe4\xa9?8t\xf8\x38K\x16\xcd\xd6Yv)&&\x86\x11#\xc7P\xba\x94\x1b\x19\x33\xda\xf1\xfc\xf9\v\xae\xdd\xb8\x43\x9f\xdeq\t\x15#\xa3\xb8\x64\xd0\x90\xa1#\xa8Q\xbd\x1a\xcf\x82\x83\x99\x34\x65\x16\x1b\xd7-\a\xc0\xc4$\xael\xd1\xa5K\xfe\x64\xc8\x90\x81\xcc\x99\x33\x1\x30\x7f\xc1\"*Vt\xe7\xd6\xad\xb8/u\x1fKZy{\xd7\x63\xfa\xec\x45\x8c\x1d\x37\x81:uj\x13\x1d\x15\xc5\xcd[\xb7i\xd5\xb2\x39u\xeb\xd6\x66\xc9\xb2Ut\xe9\xda\x93\xee\xdd;\x93.]:\xae]\xbd\x46\x89\x12\xce\xe4\xc8\x91\x9doQ\xa8PAZ6\xf3\xa6k\xf7\xbe\x8c\x19=\x94l\xe\xe\x4\x6>\xc1\xd8\xd8H\xf3\\\x8e\xa4|\xdc\xa7-[\xb6\xe3\xe2\xe2L\x9e<\xb9\x39|\xe4(]\xba\xf`\xef\xeeM\x14-ZD\xe7r\xf7\xee\xdd\xe7\xdc\xb9\xf3\xa8\x81\xc8\x88\b\xfe\xf8\xf3/\xde\xbd\v\xa3R%\xf\0z\xf6\xecJ\xc5\xcau\x18\x35z,u\xea\xd4\x46\x1\x9c\xfe\xfb\f\xed\xdb\xb5I\xb2\x1f\xbfWDD\x4\x83\x87\x8e\xa4\x65\x33o\xca\x97\x8b\x1b\x16mee\xc5\x94Ich\xd1\xa6+\x15+\x94\xc7\xd5\xb5$\xc3G\x8c\x66\xef\xbe\xc3\x1c?\xb6?\xd9\xcf\x5R*\x95\f\x1d\xd2\x9f&-:a\xa8TR\xb0`\x1\xf6\xee;\xc0\x8b\x17\xaf\xa8W\xb7\x8e\x66\xfb\x9eUk\x93\x37\x8f#K\x16\xcfO\x91}J\xae^=\xbb\xd2\xbeso2e\xcaH\xf1\x62\x45y\xf1\xf2%\xaa\xd8X*W\x8e\xff\xec\x18\0KKK\x86\xe\xea\x45\xbf\x1\xc3\xf9\xf0\xfe\x3\x99\xed\x33\xb3w\xef~\xc2\xde\x7f\xc0\xab\x9e\xeeQx_\xbaw\xef>\x1b\x37m\xa1\x64\xc9\x12XXXp\xf6\xccY\xf4\xf5\xf5\xc8\x9a\x35\xae<\x9bw\x83&\x14*\xe0\xc4\xa8Q\xc3u.\x1f\x1c\xfc\x9cs\xe7\xce\x3\x10\x1d\x13\xc3\xbd{\xf7Y\xb4\x64\x35\x9b\xd6\xaf\0H\xf2\xbdS\xb0@~6n\xda\x46\xce\x9c\x39\x30\x35\x31\xa1\x61\xd3\xf6_\xdbm\xdf\xedG\x1dK\a\xe\x1c\x62\xe5\xea\x35\xd4\xaaQ\x8dL\x99\x32\xa2R\xa9\xf1;~\x82?\xfe<\xc3\xf0\xa1\x83Re\xdf\x12;\xaf%\xa4w\xaf\xeex5h\x85\xa5\xa5%%]Jp\xf5\xdau\xe6-X\xc1\xc1}\xba\x13\xae_J\xea\xdc-\x84\x10\x42\b!\x84\x10\x42\x88\xff\x7f\x92\x18\x12\x42\xa4\x88\x3\x87Or\xe0\xf0I\xccL\x8d)W\xd6\x95\xe2\x45\x8bp\xf8\xe0oX[[\xe9l\x1f\x15\x15\x45\xb6l\xe\xac\\\xbd\x86\xab\xd7n\x91+g6\xa6O\x1dG\xd5\xaaq\xe5\x96\xf4\x14z\xd8g\xb2\xc1\xd4\xd4\x94\xfe\x3\x87Q\xa8\x90\x13\x1b\xd6.\xc3\xcd\xcd\x15\x88{\xce\xce\x9c\x19\x13\x98\x31k\x1eo\xde\x84\x30`@_|W\xceg\xd6\xec\xf9\xec\xddw\x90\xda\xb5\xaa\xd1\xb3\xdb\xa7\xbb\xa3\xb2g\xcf\xc6\xc1}\xdb\x99?\x7f\x11m\xdau![V{\xaaW\xaf\x82J\xa5\xc2\xdc\xdc\x9c\x1d\xdb\x36\xb0h\xf1\x32\x46\x8d\x1a\xcf\x87\xf0pJ\x97*\x89\xb3\xf3\xf7\xdd\xb1\x31q\xc2X\xd6\xad\xdf\xc8\x8a\x95\xbe\xdc\xbes\x1f\xe7\x62\x85i\xdd*\xe1\v\xb6_\xca\x9a%\v+\x96\xcc\x66\xfa\xcc\xb9\xec\xd9w\x80\xa9>\x13\xb0\xc9\x90\x81\x62\x45\x9c\xb4\xca[}i\xda\xcc\x45L\x9b\xb9\b}}=\n\x17\xccK\x99\xd2n\xec\xdc\xbeQS\x1e+_\xde\xbc\x1c;\xb4\x9b\x45\x8b\x97\xd2\xa9sO\xd2[ZP\xb1\x62\x39\"\"\"\xc8\x91#{\xa2\xfd\xf8\xbdV\xac\\\xcd\xfd\a\x8fY\xb9|\x91\xd6h%O\xcfJ4iX\x9b\xfe\x3\x87\xb1\xf7\xf7\xed\xe4\xc8\x9e\x8d\x82\x5\xf2j\x12\x84\xc9\xe5\xe1Q\x91\xad\x9bV\xb2v\xed\x6\x36n\xdeNe\xfw6o\\\xa3\x39\xe\r\f\x94\xe4\xcf\x97\aG\xc7\x9cI\xac)\xe5U\xaf^\x95\x65\x8bg\xb1\x66\xcd\x6\xa6\xcf\x9cG\xd1\xc2\x5h\xd9\xa2i\xa2\xcbt\xe9\xdc\x89\xf4\xe9\xd3\xb3q\xd3V^\xbd~C\xe5J\x15\xd8\xbeuC\xb2\xcb\xe2\x19\x1a\x1a\xa2P\x80\xcf\xd4\x99<\xe|J\t\xe7\"\xec\xd8\xe2\x8b\x83\x43V\0\x9e={\x8eGE\xf7\x4\x97\xdf\x7f\xe8\x4\xfb\xf\x9d\0\xc0\x31gVJ8\x17\x65\xe7\xb6u\x9a\xa4\x64R\xef\x9d>\xbd{\x10\x1b\x1b\xcb\xd0\x61\x63\xc9\x97\xcf\x91\xc5\v\xa6\x31`\xd0\xc8\x64\xc5\x9eR~\xd4\xb1\xe4\xec\\\x9c\xd7o^s\xe4\xe8q._\xbe\x8a\xb5UzJ\x97*\xc9\xa1\xfd\xbb\xc8\x9e=[\x8a\xee\xd3G\xd9\xb3'|^KH\x99\xd2\xa5\xd8\xbe\x65\x35\xcb\x96\xaf\x62\xdd\xfa-\x94.\xe5\xc2\xa1\x3;\x92=\xda'\xa9s\xb7\x10\x42\b!\x84\x10\x42\b!\xfe\xff)n\xde\rRg\xc9\x14\xf7\x10\xb5\xc7\x41/\xc8\x9d#c\x12\x8b\b!\xfe-\xc2#\xe2J\x90=\xez\xc1\xc7\xf7yB>o\xf3\xffp.\x98\x36m&\x1W\xaf\xb1z\xe5\xd2\xa4\x1b\v!\xbeZLL\f\xd9r\x16\x64\xee\xec\xc9\x9aQ0B\b!\x84\x10\xff\x36\xb7\xee=\xd5\xfa\x1d\xf3\x35\xbf{\xde\xbd\xfK\xf5\xf8\x84\x10\x42\b!\xfe_\xa4\x31\x8b\xbb\xd1\xf8q\xd0\v\xf4~r,B\b!\x84\xf8\t\x1e=zLTt\fE\x8b\xe8.I(\x84\x10\x42\b!\x84\x10\x42\b!\xfe\x9b$1$\x84\x10\x42\xfc\x82\"\"\"\x18\xd4\xbf\x9b\xa6\xac\x9c\x10\x42\b!\x84\x10\x42\b!\x84\xf8\x35\xc8\x33\x86\x84\x10\xff\x97\xfa\xf7\xef\xf3\xb3\x43\x10\xe2?-\x7f\xfe|\xe4\xcf\x9f\xefg\x87!\x84\x10\x42\b!\x84\x10\x42\b!~0\x19\x31$\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42\b\xf1\x8b\x90\xc4\x90\x10\x42\b!\x84\x10\x42\b!\x84\x10\x42\b!\xc4/B\x12\x43\x42\b!\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\xbf\bI\f\t!\x84\x10\x42\b!\x84\x10\x42\b!D*\xbbv\xf5\nNy\x1d\t\nz\xf2\xb3\x43\xd1\xe9\xef\xd3\xa7i\xde\xb4\x31\xaf^\xbd\x4 ::\x9a\xb7o\xdf\xa2R\xa9\x92\xb5\xfc\x8b\xe7\xcfq\xca\xeb\x88\xff\xa5\x8b\xa9\x19\xa6\x10\"\x5HbH\b!\x84\x10\x42\b!\x84\x10\x42\b!~qj\xd4\xa8\xd5j\xcdk\xffK\x17)U\xd2\x99w\xef\xde\xfd\xc4\xa8\x84\x10\xa9\xc1\xe0g\a \x84\x10\x42\b!\x84\x10\x42\b!\x84\x10\xe2\xe7ruu\xc3\xd5\xd5\xedg\x87!\x84\xf8\x1$1$\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10),<<\x9c\xb5k|9\xb8\x7f\x1f\x36\xb6\xb6\xa4K\x97.^\x9b{w\xef\xb2r\xe5r\xfe\xfa\xf3\xf\xec\xed\xb3\xd0\xa4i3\xaaT\xad\xc6\x82ys\ty\x1b\x82\x45:\v\xfc\xfc\x8e\x62hhD\xab\xd6mp*P\x80\xb5\xbe\xbe\x9c:y\x82\x8c\x99\x32\xd1\xb1s\x17\x8a\x17wNV<\r\xeb\xd7\xa3q\x93\x66\xdc\xbau\x93\x93\xc7\x8f\x93;O\x1e\xdaw\xe8\x84S\x81\x2\0\x9c:y\x82N\x1d\xdaq\xf6\x82?7\xae_\xa7U\x8b\x66\0\x94*\x19\xb7\xfe\xbf\xcf^\xc0\xf\x1f<\x88\xd7\xd6\x31wnz\xf6\xee\x3\xc0\xd2\x15\xab\xd8\xb6\x63\x37&\xa6\xa6\0\xf8L\x99\xc4\xfe}{i\xd5\xba\rc\xc7O \xb3}f\x8c\x8d\x8d\x35\xcb.[\xb2\x98\xf2\xee\x15\xe8?p\x10\xf\x1e\xdcg\xc8\xa0\x1\xc4\xc6\xc6~C/\n!R\x8b\x8c\x18\x12\x42\b!\x84\x10\x42\b!\x84\x10\x42\x88\x14t\xf9\xb2?\a\xf6\xef\xe3\xf0\xb1\x13\xd8\xd8\xd8\0\xa0\xa7\xa7G\x9f^\x9f\x46\xd6,_\xb6\x84\xe6-Z\xd1\xb6]\xfbx\xcb\xeb)\xf4P*\ri\xd7\xbe#\0\xaenn\xfc\xfe\xfbn\x9c\x9dK\xd0\xb8IS\0\n\x16*\xc4\x96\xcd\x1b\xb9\xec\xefO\xe6\xcc\xf6I\xc6\x64\x64\x64\x44\x8bV\xad\x35\xcb\xbb\xba\xbaq\xfb\xd6-vl\xdf\x46\xef\xbe\xfd\xb4\xda\xa6I\x93\x46\x33\x12\xc9\xc9\xa9\x80\x66\xb4\xd3\xcd\x1b\x37X\xb7\xc6\x97\xc3\xc7N\x90\x31\x63\xc6\x7f\x62+\x5@\xf8\x87\xf\0\xcc_\xb8\x18\xf7\n\x15\x1\x30\x33\x33\xa3\x63\xfb\xb6<{\xf6\x34Y1\n!~\f\x19\x31$\x84\x10\x42\b!\x84\x10\x42\b!\x84\x10)\xe8\xfe\xbd{\xe4\xc9\x93W\x93\x14\x2\xb0\xb7\xff\x94\x18Q\xa9T\x1c=r\x84\x2\x5\v&\xb8\x8e\xb2\xe5\xcai\xfe\xd6\xd7\xd7\xa7h\xd1\x62\xd8~V\x92\xcd\xc2\xc2\x82\xac\xe\xe\x84\x85\x85%;\xae,Y\xb2j\xfe\xd6\xd3\xd3\xa3T\xe9\x32\\\xbd\x1a\x90\xec\xe5o\xdf\xbe\x45\x96,Y4I!],--5\x7f\xdb\xdbg\x1\xe0\xfd\xfb\xf7\xc9\xde\x86\x10\"\xf5IbH\b!\x84\x10\x42\b!\x84\x10\x42\b!RPLL\fQ\xd1Q\t\xce\x8f\x8a\x8a\"4\xf4\xedW\xadS\xa1P\xc4\x9b\xa6\xa7\xf8\xba\xcb\xbb\x31\x31\x31Z\xaf\xf5\xf5\xf4\x30\x35\x33O\xf6\xf2\x61\x61\x61\xa8T\xea\xe4oPG\xcc\x42\x88\x9fO\x12\x43\x42\b!\x84\x10\x42\b!\x84\x10\x42\b\x91\x82\x1c\x1c\xb2q\xe7\xf6m\x1e?z\xa4\x99\xf6\xea\xd5+\xcd\xdf\xc6\xc6\xc6\x38\x15(@\xc0\xe5\xcb?,\xa6\xabW\xae\xe0\x33y\xa2\xe6\xb5Z\xad\xe6\xdc\xb9\xb3\x14*TH\xf7\x2\xff$u>O&\xd9\xdb\xdb\xf3\xe4I O\x83\x82R5V!D\xea\x92g\f\t!\x84\x10\x42\b!\x84\x10\x42\b!D\n*V\xbc\x38\xa5J\x97\xa6\x7f\xbf>t\xee\xd2\r===\xbav\xee\xa0\xd5\xa6\x43\xc7\xce\xf4\xeb\xd3\v[;;\n\x17)\xc2\xab\x97\xafP\xa9\x62)\xef^!Uc[\xb2h!\x85\x8a\x14\xe1\xec\x99\xbf\t\b\xb8\xcc\xd8\xf1\x13u\xb6\xfbX.\xee\xb7\xdd;)Z\xac\x38\xb9r\xe5\xa2\x84KI\x9c\n\x14`\xd4\xc8\xe1\xb4\xef\xd8\tS\x13S\x2\x2\xfc\xa9U\xbbn\xaa\xc6,\x84HY2bH\b!\x84\x10\x42\b!\x84\x10\xbf\x1c]%\x99\x84\x10\"\xa5\xe8\xeb\xeb\x33m\xc6l\\\xdd\xdc\x98>m\n{~\xdf\xcd\xd4\xe9\x33\x31\x35\x35\xd5\xb4\xa9T\xd9\x93\x19\xb3\xe6\xe0w\xec(]:v`\xe3\x86u\xa9\x1a\x93S\x81\x2\xb8W\xa8\xc8\x8d\x1b\xd7\x19>t0/_\xbc\x64\xc3\xc6-X[[\xebl\x9f\x39\xb3=\xb3\xe6\xcc\x63\xf7\xae\x9dL\x9d\x32\x99\xa0'A\x18\x19\x19\xb1`\xd1\x12r\xe6\xca\xc5\x98\x91#\x18\x39\x62(O\x9f>%:*\xe1\xb2yB\x88\x9f\xef\xcb\xef=\x8a\x9bw\x83\xd4Y2e\0\xe0q\xd0\vr\xe7H\xf8\xc1\x61\x42\x88\x7f\x97\xf0\x88\xb8\xa1\xbe\x8f\x83^\xf0\xf1}\x9e\x90\xcf\xdb\xc8\xb9@\b!\x84\x10\x42\b\xf1op\xeb\xdeS\xad\xdf\x31_\xf3\xbb\xe7}\xf8\xfb\xaf{N\x86\x10\x42\xfc\x1f\xbb\x7f\xfd\xbe\n\xf0\0\0 \0IDAT\xef\x1e\xe1\xe1\x1f\x12\x9c\xef\x90-\x1bmZ\xb5\xa0N]/\x9a\x35o\xf1\x3#\x13\x42\xfc?\xd0\xd3S`fb\x6\xc4}\x1f\x92RrB\b!\x84\x10\x42\b!\x84\xf8\xe5\xe8\xeb\x19\xa0RE\xff\xec\x30\x84\x10\"E,\\0\x8f=\xbf\xff\x96\xe0\xfcm;v\xff\xc0h\x84\x10\xffo\xf4\xf5\xb4SA\x92\x18\x12\x42\b!\x84\x10\x42\b!\xc4/G\xdf@\x9f\xe8\x18I\f\t!\xfe\x1b|\xa6\xcd\xc0g\xda\x8c\x9f\x1d\x86\x10\xe2\xff\x94\xbe\x81\xbe\xd6kI\f\t!\x84\x10\x42\b!\x84\x10\xe2\x97\x63\xa0g\x80\x9e\x42\x81J-\xe5\xe4\x84\x10\xbf\x86\xcd[w\xfc\xec\x10\x84\x10?\x81\x9e\x42\x81\x81\xbev*H\xef'\xc5\"\x84\x10\x42\b!\x84\x10\x42\b\xf1\xd3(\x14`dd\xf4\xb3\xc3\x10\x42\b!\x84HUFFF(\xbe\x98&\x89!!\x84\x10\x42\b!\x84\x10\x42\xfc\x92\f\xf4\r04P\xfe\xec\x30\x84\x10\x42\b!R\x85\xa1\x81\x32\xdeh!\x90\xc4\x90\x10\x42\b!\x84\x10\x42\b!~\x11J\xa5\x1\xd1\xd1\x31Z\xd3\x8c\x8c\x8c$9$\x84\x10\x42\x88\xff\x1c\x43\x3\x65\xbc\xd1\xd1Q\xd1\x31\x18*\r$1$\x84H}\xb1\xb1\xb1\x84\x87\x87\xff\xec\x30\x84\x10\x42\b!\x84\x10\xbf\x38\x43\xa5\x1Q_$\x86 .9dbl\x8c\x9e\xe2\xcb\x42+B\b!\x84\x10\xff.z\n\x5&\xc6\xc6:K\xe6\x46G\xc5\xa0\x34\x94\xc4\x90\x10\"\x95\xbd~\xfd\x6\x97R\x1e\x1c\x39z\"\xde\xbc\xeb\xd7o`\x93\xc9Q\xe7\xbf\xdd\xbf\xfdNpp06\x99\x1c\x39w\xee\xfcO\x88\xfc\xbfk\xcd\xdau\xb8\x95\xae\xf0\xb3\xc3\x10\x42\b!\x84\x10\xe2\x87\x33\x36\x32$2:Z\xe7<\x3}\x3LM\xcd\x30\x36\x36\x46i\xa0\x44OO\x81\x42\x12\x45\x42\b!\x84\xf8?\xa7P(\xd0\xd3S\xa0\x34Pbll\x8c\xa9\xa9\x99\xce\xf2q\0\x91QQ\x98\x18\x19\xa1{\xae\x10\x42\xa4\x90\x81\x43\x46Q\xa2xQj\xd6\xa8\x92`\x9b\xb9\x33'\x92\x35k\x16\xadi\xe\xe\xe\xa9\x1d\x9a\x10\x42\b!\x84\x10\xe2\x17\x63jbD\xd8\x87p>\x84G`jb\x1co\xbe\x2P\xea\x1b\xa0\xd4\x37\0\xe2\xdf\x65+\x84\x10\x42\b\xf1o\xf5:\xe4\x1d\x31*\x15&\xc6\x86\x92\x18\x12\x42\xa4\x9e\xdf\xf7\x1c\xe0\xec\xd9\v\x9c\xf0\xdb\x9bh\xbb\"E\v\x93'w\xeex\xd3\x83\x83\x83S+4!\x84\x10\x42\b!\xc4/\xca\xca\"\rA\xc1\xafQ(\x14q\x89 C%\xfazRPE\b!\x84\x10\xff=Q\xd1\x31\x44G\xc5\x10\x11\x15\x8d*6\x16\x1bk\v\0I\f\t!RGTT\x14\xa3\xc6Nb\xcc\xe8!\xa4K\x9b\x36\x45\xd6\xa9R\xa9\xb0\xb3\xcf\xc3\xca\x65s\xa8Q\xbd\x1a\0\xf7\xef\xdf\xa7\x64iON\xfa\xed\x1\x35\xb8W\xaa\xc5\x92\x85\x33\xa8U\xb3\x6\0G\x8e\x1e\xa3I\xf3\x8e\x1c\x39\xb0\x83\x82\x5\vh\xd6\x15\x1c\x1cLq\x17w\xa6M\x19\xc3\xf1\x13\xa7\x38{\xee\"\x95+\xb9\xd3\xb3G7\xfe\xfa\xeb\x34\xbb~\xdb\xc3\xad[w\xa8W\xb7&]\xbbt\xc2\xdc\xdc\\\x13\xc3\xb6m;\xd8\xb4\x65\x1b\xcf\x9f\xbf\xa4N\xed\xeat\xec\xd0\x8e\x34i\xd2\x10\x1e\x1e\xce\xce]\xbb\xd9\xbb\xf7\0\xfe\x1\xd7\xc8\xed\x98\x83\x36\xadZP\xa3\x46\\\xac\xd1\xd1\xd1l\xd8\xb8\x99\xad[wp\xeb\xce}\n\x15\xc8K\xef^\xdd)U\xca\x8dM\x9b\xb7\x32\xc5g&\x17\xce\xfd\xa1\x89q\xc4\xc8\x31\x44\x44\x44\x30\xd5g\x12\0\x9eUj\xd1\xb1\x63\x1bn\xde\xbc\xcd\xde}\a\xe9\xd9\xa3\v\x8d\x1a\xd6\xe7\xf1\xe3@\xe6\xcd_\xc8\x31\xbf\x93\xe4\xcd\xe3H\xb7\xae\x9d(Y\xd2\x45\xb3\x9e\xa0\xa0\xa7\xcc\x9d\xb7\0\xbf\xe3\xa7(\xe9R\x9c\xc7\x81OR\xe4\xff\x43\b!\x84\x10\x42\x88\x7f#}}}\xb2\x64\xca\xc0\x9b\xb7\xef\x88\x89U\x13\x1d\x12\x46\xacJ\xf5\xb3\xc3\x12\x42\b!\x84Hq\x86J\x3\x94\x86\x6\x98\x9a\x18\x62\x62\xfci4\xb4$\x86\x84\x10\xa9\x62\xf1\xd2Ud\xb1\xcfL\xdd\xda\x35\x92l{\xd9?\x80\x90\x90\xb7Z\xd3J8\x17\xff\xeam\xe6\xc9\x93\x9b\tc\x87\x32h\xc8h\\J\x94\xc0\xd0P\xc9\xa0\xc1#\x99v\xed\x31\x88\x1e]\xdb\xd2\xbf_O\n89\xf1\xe2\xc5K\xaa\xd5\xf4\xa2{\xd7\xe\xd4\xad[\x9bK\x17\xfd\xa9U\xaf\x19G\xe\xee\xa4`\x1'BBB\xa8Y\xbb>U<+2y\xe2\x18\x1e=~\xcc\xfaM\xbb\xbe\xbao\x85\x10\x42\b!\x84\xf8\xaf\xb1L\x97\xe6g\x87 \x84\x10\x42\b\xf1SHbH\b\x91\xe2\xc2\xc3\xc3\x99\xbfp\x19\x1b\xd7-OV\xfbn\xbd\x6\xc7\x9b\x16\xf8\xe0\xea\x37m\xbby\xb3&\x1c\x38p\x98\xc9S\xa6\x62\x66\x66\x46\xfe|\xb9i\xd1\xbci\x82\xed\xb7lXN\xf9\xf2\xe5\0\xd0S\xe8\xd1\xa1K_\xc6\x8c\x1e\x81\xad\xad\r\0\xaf^\xbd\x66\xc1\xa2\x15\f\x1e\xd4\x9f\x90\x90\xb7\x8c\x9d\x38\x9d\xbd\xbfm\xa6h\x91\xc2\0\xd8\xd9\xd9\xe1Y\xbd>C\x87\f\xc2\xce\xce\x16\x9f)\x13\x35\xeb._\xae,\xbf\xed\xd9\xcf\xe9\xbf\xcf\xe0\xe6\xe6\xca\xf9\x8b\x97(S\xba$U<+\xa3P(pss\xfd\xa6}\x1c\x31|\x88\xe6\xefy\xf3\x17\xe2V\xd2\x99\xce\x9d:\0\xe0\xe6Z\x92\x8b\x97\xfc\xd9\xbf\xef\0\x5\v8\xb1m\xfbN2e\xb2\x63\xfc\xb8\xd1\xe8\xeb\xeb\x3p\xf8\x88\x1f\x7f\x9d>\xf7M\xdb\x16\x42\b!\x84\x10\x42\b!\x84\x10\x42\xfc\xbbIbH\b\xf1]\x82\x83_\xb0\x66\xdd&\xbawm\x8f\xb1q\xdc\xc3[}\xd7n\xa2p\xa1\x2\x14)\\0Y\xeb\x38\xe9\xb7G\xe7\x33\x86\xbe\x85\xa1\xa1!\x13\xc6\x8f\xa6T\xb9\xaa\0\\8\xe3\x87R\xa9L\xb0\xbd\x99\x99\x99\xe6\xefl\xd9\x1c\0\x88\x8e\x8e\xd2L\xcb\x95\x33\a/_\x85\x10\x13\x13\xc3\xc3G\x8f\x88\x8dUQ\xa5z\xfdx\xeb\t\v\v\x3ly\xf6,\x98={\xf6\xe2w\xfc$\x81O\x9er\xf5\xfa\x1d\xdc\\\xe3\xca\xba\x35\xac\xef\x45\xc7.\xbdy\xf6\xac\x15\xb5jU\xa7re\xfl2d\xf8\xaa\xfd\x9b\x34n\xa8\xd6k\x7f\xff\0v\xfd~\x88]\x99\x1c\xb5\xa6\xb7k\xdd\x18\x80\x80\x80+\x94/[Z\x93\x14\x2\xa8\xe4\xe1\xce\xad[w\xbej\xbb\x42\b!\x84\x10\x42\b!\x84\x10\x42\x88\xff\x6I\f\t!\xbe\x8b\x99\x99)\a\xe\x1e\xe1\xc6\xcd[,]4\x1b\xb5Z\xcd\x92\x65\xab\x98\x37{j\xeamT\x9d\xf8l\v\x8bt\x9a\xbf\r\r\x13N\n\xc5\xa3P$:\xcd\xcc\xd4\x14\x80\xd5\xcb\xe7Q\xb0\xa0\x93V3[[[^\xbf~M\x9dz\x8dh\xdc\xc8\x8b\xa1\x43\a\x92\xde\xd2\x92\"\xce\xe5\xb8q\xe3&\0\xee\xee\xe5\x39\x7f\xe6\x4'N\x9e\xe2\xc0\x81\x43\f\x1a\x32\x86\xf9s|\xa8S\xa7\x16\0*U\x12;\xa6\x83\xa5\xa5\x5N\xf9r\xb1\x66\xf5R\xad\xe9\xc6\xc6&\0\x44\x46\x46\x11\x13\x1b\xf3\xd5\xeb\x15\x42\b!\x84\x10\x42\b!\x84\x10\x42\xfc\x37\xe9\xfd\xec\0\x84\x10\xffn\xe6\xe6\x66l\\\xb7\x9cK\xfe\x1,^\xba\x8a\xe3'\xfe\xc0\xcc\xcc\f7\xd7\x12)\xbe-===\xb2\xda\xdbq\xe7\xce]\xcd\xb4\xa8\xe8h\xad\x36*\x95\x8a\x31\x63'P\xa7\x66\x65\xdc\xcb\xba\x30~\xc2\x64T)\xf4 \xd9\xcc\x99\x33\x63me\xc1\xe3\xc0@\xec\xed\xed\xb5\xfe)\x95J\xae^\xbd\xce\xfd\x87Oh\xd5\xb2\x5\xf9\xf2\xe6\xc5\xd6\xd6\x96\xd8X\x15\a\x8f\x9c\xd2\xac#M\x9a\x34\xd4\xa8^\x8d\x39\xb3g\xd0\xb9\x63+V\xacZ\x3\xc4\xf5\x63\xd0\xb3\x17\xbc|\xf9J\xd3\xd6\xdf? \xc9\x98\n\x15,\xc0\x93\xa0g\x98\x99\x99k\xc5\x63mm\x5@\x81\x2\xf9\x39x\xe8\x18QQ\x9f\x46\x41]\xbc\xe8\xcf\xfb\xf\xe1)\xd2'B\b!\x84\x10\x42\b!\x84\x10\x42\x88\x7f\x17\x19\x31$\x84\xf8nVV\xe9Y\xb6x\xe\xde\r[\x92'\xb7#M\x1ay\xa7\xc8zML\xe2\x46\xe8\\\xba\xe4O\x86\f\x19pp\xc8J\xa3\x6\xf5X\xb3n\x13vv\xb6X[[\xd1\xa4\x45'\xad\x65\xb6n\xdb\xce\x91\x63\xa7\x38v\xf8w\xc2\xc2\xc2(_\xb1&\x95<*R\xbbv\xcd\xef\x8e\xc7\xcc\xcc\x94\x31#\a\xd3\xb3\xefP\x94J%\xce\xc5\x8b\x11\xfa\xee\x1d\xf\x1e<\xa4Y\xd3\xc6\x64\xce\x9c\t\x80\xf9\v\x16Q\xb1\xa2;\xb7n\xdd\x6>\x95u[\xb8p\t\x96\x96\x16\x64\xcf\x91\x9d\xe8\xa8(N\xff}\x16\x97\x12\xc5\x1(Z\xa4\x30&\xc6\x86L\x9e\x32\x95\x9a\x35\xab\xf3\xf0\xe1#N\x9f\xf5\xc7\xce\xce\x36\xd1\x98\xea\xd6\xad\xcd\x92\x65\xab\xe8\xd2\xb5'\xdd\xbbw&]\xbat\\\xbbz\x8d\x12%\x9c\xc9\x91#;\xf5\xbd\xeb\x31s\xf6\x42\xfa\xf5\x1f\x44\x83\xfa^\xbcz\xf5\x9a\xb5\x1bv|w_\b!\x84\x10\x42\b!\x84\x10\x42\b!\xfe\x9d\x64\xc4\x90\x10\"E\x14)\\\x90vmZ\xe0\x7f\x39\x80\x6\xdeuRd\x9di\xd3\xa6\x61\xce\x8c\t,Y\xb6\x8a\xcd\x9b\xb7\x2\xd0\xb5k'\x1a\xd4\xaf\xc3\xf4\x99sY\xed\xbb\x8eY\xd3\xc7\x63\x93\xc1\x12\x80;w\xee\x32`\xd0(&O\x1c\x85\xad\xad-9s\xe6\x64\xc2\xb8\x61\xf4\x1f\x34\x82\xc0\xc0')\x12S\xfd\xfa^\xf8\xae\\\xc0\xc9\x93\x7f\xd0\xa4y[\xa6O\x9f\xad\x19\x8d\x93#Gv|W\xce\xe7\x8f?O\xd3\x7f\xc0P\x9e={F\xcfn\xed\x34\xcf\x31\xca\x98\xc9\x8e\x43\x87\x8f\xd2\xa9s/\x86\x8d\x18K\x5\xf7\xb2\xf4\xe9\xdd\x3\x80L\x99\x32\xb1y\xe3*\x1e=z\xcc\xb0\xe1\x63\xb8\x7f\xef>}zv ]\xba\xb4\x89\xc6\x63nn\xce\x8em\x1b(X\xd0\x89Q\xa3\xc6\xd3\xb1Sw\xce\x9e;\x8fZ\x1d\x37J\xca\xd6\xd6\x96\xfd{\xb6\x3\x30`\xd0\b\xce\x9d\xbf\xc0\x94\x89#\xc8\x99\xdd>E\xfa\x43\b!\x84\x10\x42\b!\x84\x10\x42\b\xf1\xef\xa2\xb8y7H\x9d%S\xdc\xc3\xcf\x1f\a\xbd w\x8e\x8c?9$!DJ\t\x8f\x88{\xb6\xcc\xe3\xa0\x17||\x9f'\xe4\xf3\x36\xdfz.P\xab\xd5\x44\x44\x44`bb\xf2\xf5\xc1\n!\x84\x10\x42\b!\xc4W\xbau\xef\xa9\xd6\xef\x98\xa4~\xf7\b!\x84\x10\x42\b)%'\x84HA\n\x85\x42\x92\x42\x42\b!\x84\x10\x42\x88\x7f\x85\xd7!\xef\x88U\xa9\x88\x8e\x8a!6\x85\x9eK*\x84\x10\x42\b\xf1\xff\x44\xa9\x34\xc0Pi\x80\x89\x91\x11&&\x86\x9a\xe9\x92\x18\x12\x42\b!\x84\x10\x42\b!\xc4/#2*\x9a\xe7/C\xb0\xb2L\x8b\x9e\x42\x81\xd2\xc2\0}=\xa9\xb4/\x84\x10\x42\x88\xff\x9e\xe8\xe8\x18\xa2\xa2\x63\b\x8f\x8a\xe4\xdd\x87\xfXY\xa4\x41___\x12\x43\x42\b!\x84\x10\x42\b!\x84\xf8u<\x7f\x19\"%\xe7\x84\x10\x42\b\xf1KP*\rP*\r0\xc3\x98\xf\xe1\x11\x4\x5\xbf&K\xa6\f\x92\x18\x12\x42\b!\x84\x10\x42\b!\xc4\xaf\xe1u\xc8;\xac,\xd3\xfe\xec\x30\x84\x10\x42\b!~8S\x13\x63@\xc1\x9b\xb7\xef\x90\xb1\xd2\x42\b!\x84\x10\x42\b!\x84\xf8%\xc4\xaaT\xe8)\x14?;\f!\x84\x10\x42\x88\x9f\x42O\x1\x31\xb1jI\f\t!\x84\x10\x42\b!\x84\x10\xe2\xd7\x10\x1d\x15\x83\xd2P\x8a\xa7\b!\x84\x10\xe2\xd7\xa4\x34T\x12\x1d\x15-\x89!!\x84\x10\x42\b!\x84\x10\x42\xfc\x1a\x62U*\xf4\xf5\xe4R\x88\x10\x42\b!~M\xfazzq#\xa8\x7fv B\x88\x7f\xbf>}\a0`\xe0\x90\x64\xb7W\xa9T\x84\x84\x84\x10\x15\x15\x95\x8aQi[\xb4h\t]\xbb\xf7\x42\xadV\x3\x10\x1a\x1a\xca\x87\xf\x1fRe[?c\xffRSTT\x14!!!\xa8T\xaa\x4\xdb\xa4\x66\x7f\xa6\xb6/\x8f\x8do\x11\x13\x13K\xdbv\x9dX\xbdzM\nF\x96\xb8\xb0\xb0\x30\xe6/XD\xf5\x1auq+]\x81\x91\xa3\xc6\x10\x18\x18\x98\xe4r\x87\xe\x1f\xa1O\xdf\x1\x38\xbb\x94\xa5\x9eW#\x96-[\xc1\x87\xf\x1fP\xab\xd5\x1c\x39z\x8c>}\a\xe0\xe2Z\x8e\xfa\r\x9b\xb2m\xfb\xe\x62\x63\x63S4\xee\xd0\xd0P\xe6\xce\x9dO\xae<\x85\t\xe\xe\xd6L\x8f\x8e\x8e\xe6\xb7\xdf\xf7P\xcc\xb9\x34G\x8f\xfa}\xf3\xfa=\xab\xd4\x62\xf9\xf2\x95I\xb6\xbbs\xe7.6\x99\x1c\xb9{\xf7\xee\x37oK\b!\x84\x10\x42\b!\x84\x10\xe2\xdfH\x12\x43\x42\x88\x1f.44\x94\xdc\xf9Kp\xfe\xfc\x85\x1f\xb6M\xb5\x1a\xd4\xaaO\x17\xfe\xdbw\xe8\xc2\xaaT\xba\x88\xff\x33\xf6/5\x9d?\x7f\x81\xdc\xf9K\x10\x1a\x1a\x9a`\x9b\xd4\xec\xcf\xd4\xf6\xe5\xb1\xf1o\xa0V\xab\x19\x38x\x18\xc7\xfcN\xd0\xb5KG\x6\xf\xec\xcb\x83\a\x8fh\xda\xbc-\xa1\xa1\xef\x12\\n\xfa\x8cY\f\x18\x38\x82\x82\x5\v0y\xe2\x18Z4o\xc2\xed;w144\xe2\xb7\xdf\xf6\x30r\xd4x\x8a\x14.\xc4\x98Q\xc3p\xca\x97\x97.\xdd\a\xb2i\xf3\xd6\x14\x89\x39<<\x9c\x8d\x1b\x37S\xa6\xbc'\xe3&\xcd\"\xf4]\\\"Q\xa5Rq\xfc\xf8\t\xeaz5\xa2]\xc7\xde\x4\x6=O\x91\xed%\xe5\xea\xd5k\xd8\xd9Z\x91-[\xb6\x1f\xb2=!\x84\x10\x42\b!\x84\x10\x42\x88\xff\x17RXW\b\xf1K\xe8\xd2\xa5\xe3\xcf\xe\x41\xfc\x9fJ\x89\x63\xc3\xc0@\x9f\x15\xcb\x17\xa7@4\xc9\xf3\xec\xd9\x33\xb6n\xdf\xcb\xaemkpss\x5\xa0T)7\x9c\n\xbbq\xfd\xc6\rJ\xba\x94\x88\xb7L@\xc0\x15\x66\xce^\xcc\x9f\xa7\xe\x92\x35K\x16\xcdt/\xaf\xba\0\x94/_\xe\xf\x8f\n\x98\x99\x99\x1P\xadZ\x15\x94\x86\x86\xac\xf6]G\xd3&\x8d\xbe*\xbe\xc5K\x96q\xed\xdauf\xcf\x9a\xae\x99v\xf9r\0k\xd7ob\xfa\xd4\tXXXP\xa3vc\0\x42\x42\xde\x32l\xc4X:wl\xcb\xaa\x15Kp*\xec\xf6u\x9d\xf1\x8d\xce\x9d\xbf@\xcd\xea\x9e\xe8\xeb\xeb\xff\x90\xed\t!\x84\x10\x42\b!\x84\x10\"\xf9|\xa6\xce\xe4\xef\x33\xe7\0(\xe9\xe2\xcc\xc0\x1}~rD\x9f\f\x1d>\x8a\xd3\xa7\xcf$\xab\xad}\x96,\xf8\xae\\\x92\xca\x11}=\x19\x31$\x84Hq\x9eUj\xb1x\xc9\x32\x86\f\x1d\x81[\xe9\n\xb4h\xd9\x96\v\x17.\x2\x10\x1a\xfa\x8e\xdc\xf9\xe3.Z\xd7\xf1n\x81M&G\xfe>s\x16\x88+\x8d\x35s\xd6\x1c<*U\xa7N\xbd\x86l\xda\xbcUS\xc6*88\x18{\x87|l\xda\xbc\x95\xae\xdd{\xe1\xecR\x96\xfe\x3\x6\x13\x14\xf4T\xb3\xddW\xaf^1\xc5g\x1a\x15<\xaaQ\xa8\xa8+\x9d:w\xe7\xf1\xe3\xb8\xd2Z\xd3\xa6\xcd\xa4U\x9b\xe\0\x34k\xde\x1a\xbf\x93g\x18=n\x1a\x36\x99\x1cY\xbc\x64\x19\xcb\x97\xaf\xa4@a\x17\"##5\xeb{\xf0\xe0!6\x99\x1c\xb9~\xe3\x86\xd6\xfe={\x16\xcc\x9c\x39\xf3\xf1\xf2nL\xa1\xa2\xaet\xec\xd4\x8d\x80\x80+I\xee\xdf\x97\x8e\x1e\xf5\xa3]\xfb\xce\x14*\xeaJ\xdbv\x9d\xf0\xf7\xbf\x8cJ\xa5\xc2&\x93#{\xf6\xee\xd3\xb4\xbb\x7f\xff>6\x99\x1c\xb9y\xeb\x96\x66\xb9*\xd5js\xec\x98\x1f-Z\xb6\xa5\x82G5\xc2\xc2\xc2\xf0\xacR\x8b\xad\xdb\xb6\x33\x61\xe2\x14J\x97\xf5\xd0\x8c\xf4\xf8\x9e~\xfd\xfb\xccY\xeax\xb7\0 w\xfe\x12\xd8\x64r\x8c\x37\"EW\x7f~\xec\xf3\xc9S\xa6\xb2j\x95/U\xaa\xd5\x66\xc0\xc0!\x84\x87\x87\xb3\x61\xe3&Z\xb4lK\xa1\xa2\xae\xd4o\xd8\x94={>\xed\xeb\xd1\xa3~\xd4\xa8\xe5\xc5\xda\xb5\xebi\xd2\xac\x15\xa5\xcbz0s\xd6\x1c\xad\x32u7o\xdd\xa2o\xbf\x81\x38\xbb\x94\xc5\xadt\x5\x86\xe\x1bItt\xb4\xe6\xd8[\xb4h\t\x83\x87\f\xa7\xa4\x9b;\xad\xdat\xe0\xca\x95\xab\x9c={\x8e\xde}\xfa\xe3\xecR\x96^\xbd\xfb\xf1\xe8\xf1\x63\xcd\xfa>?6\x92Z\x7fR\xdb\xfe\xbc\x84\xd9\xcb\x97/\x19;n\"e\xcaU\xa2~\xc3\xa6l\xde\xb2U\xab\x1c_b\xef\x13\x80\xbfN\xffM\xcd\xda\xde\xdc\xbf\x7f?\xde\xb1\x63ll\x2\xc0\x93\xa0 \xcd\xb4\xd0\xd0\xb7\0\x64\xb4\xb3\x8d\xd7\x1e`\xe3\xa6-\xb4m\xddX+)\xf4\xb9t\xe9\xd2j\x92\x42\x1f\x65\xb4\xb3%,\xec\xbd\xe6\xb5J\xa5\x62\xcb\x96m\xd4o\xd8\x94r\xee\x9eL\x9f\x31\x8bw\xef\xe2\x8fP\x8a\x8d\x8d%2R\xbb\x94\xa2\x8bK\tv\xed\xd8L\xe5J\x1e\x18\x1a\x1aj\xa6\xa7Oo\xc9\xb1#\xfbh\xde\xbc)\xe9\xd2\xa5\xd5\x19\xdbGG\x8f\xfa\xe1\xdd\xa0\t\xdb\xb6\xef\xa0y\x8b\x36\x94\xafP\x85\xb9\xf3\x16\x10\x11\x11\xa9\xd5\xce\xffr\0#F\x8e\xd1\xd9\xaf\x1f\xf7\x63\xdf\xfe\xc3\xb8\xb8\x38\x3qe\xec|\xd7\xac\xa3v\x9d\xfa\xe4u*N\xc3\x46\xcd\xf8\xf3\xcf\xbf\x12\x8d\x45\b!\x84\x10\"9\x82\x9f?\xe7\xd5\xabW\xc9j\xabR\xa9p\xc8\x91O\xf3\xcf\xd9\xa5\x14={\xf6\xe6\xcc\x99O\x17\x9e\x8e\x1f?\x8e\x43\x8e|\xbc\x7f\xff>\x91\x35i\x8b\x8a\x8a\xe2\xed\xdb\xb7\x89\x96\x86\xfe\xd2\xcd\x9b\x37\x19;n<5j\xd6\xa6\x66\xad\xba,X\xb0@\xe7\xf7>!\x84\x10\"\xb5\x1c>\xe6\xc7\xb9\xf3\x17\x38w\xfe\x2\x87\x8f\xf9\xfd\xecp\xb4<}\x16\xcc\xdd{\xf\x92\xf5/\xf0\xb3kP\xffOd\xc4\x90\x10\"\xc5]\n\xb8\xc1\xa5\x80\x1b\xcc\x9a>\x9eJ\x1e\x15\xd8\xfd\xdb\x1e\x1a\x36i\xcdI\xbf\x3\x64\xc8\x90\x81-\x1b\x96\xd3\xa0I;\x86\f\xec\x41\xe5J\x1e\x64\xcd\x9a\x85\xd8\xd8X\xbav\xeb\x85\x9d\x9d-\xe3\xc7\x8f\xe2\xd1\xc3G\xcc\x9a=\x9f\xd8\xd8X\xcdh\x85\xa8\xe8\x18z\xf4\x1e\xc2\xb2\xc5\x33\xa9V\xd5\x93\x15+|\xe9\xde\xa3\xf\x9b\x37\xad\xc3\xc0@\x9f\xbe\xfd\a\xa3P(\x18=r\bj\xb5\x9a[\xb7\xef\x90.]\xbax\xf1\x8d\x1e=\x9c\x43G\xabQ\xa2xA\xa6L\x1a\x87\x95Uzbbb\x19\x32\x62\"\x17.^\xc2\xcd\xb5$\0\xc7\x8f\x9f\xa0\xb4k1\xf2\xe6\xc9\xa3\xb5|hh(\xaf^\xbd\xa2i\xd3\x86X[Y\xb1w\xdf\x1\x1a\x34n\xc5I\xbf\x3XZZ\xea\xdc\xbf/\xed\xdc\xb5\x9b\xd1\x63&3|h\x7f\xda\xb6m\xc5\x83\xfb\xf\x30\x30H\xfe)\xf9\xa2\xffu\xc6O\xf0\xa1u\xeb\x66\x98\x9b\x9b\x63nn\xe@\xd7\x1e\x83\xe8\xd1\xb5-\xfd\xfb\xf5\xa4\x80\x93\xd3w\xf7k\xbe\xbcy\x18\x32\xb0\a\x93|\xe6\xb2\x65\xc3r\xac\xac\xac\x30\x35\x35M\xb2??\x9a\x31{\t^u\xaa\xd2\xa1}k\xec\xec\xecP(\xf4\xb8x\xd1\x9f\xca\x95=h\xd7\xae\x35\x37\xae\xdf\xa0M\x87\x9eZ#_\xce\x9e\xf\xc0*\xbd%\xed\xda\xb4\xe2\xe9\xb3\xa7L\x9f\x31\x1f\xb5ZM\xdf>\xbdx\xf3&\x4\xef\x6\xcdi\xdc\xd0\x8b\xb9s\xa6\x11\xf2&\x84\x17/_\xa2T*\xb5\x8e\xbd\x39\x33&\xe0\xe1Q\x81\xad[wP\xd1\x33nD\xcc\xe2\x5\xd3\xa8\\\xd9\x83\xd5\xab\xd7\xd2\xb9s\xfv\xed\xdc\xa2Y\xee\xa3\xc4\xd6\x9f\xd4\xb6?\xf7\xee\xdd;\xeaz5\xa6|\xb9\xd2L\x1c?\x8a\a\xf\x1f\x31h\xc8\x18^\xbfzM\xe7\xce\x1d\xb5\x62\xd5\xf5>\xc9\x98\xd1\x8e\xa7\x41O9\x7f\xf1\n\xaf_\xbf!{\xf6\xecZ\xeb\xb7\xb4\xb4`\xea\xa4\x91\xf4\xee;\x8c\xd7\xaf\xdf\xa0P(\xd8\xb1\x63\x37\x8b\xe7O#k\xd6\xac:\x8f\x19\xff\xcbW\xa8\xefU\x87\xad\xdb\xb6\xe3\xeb\xbb\x9eW\xaf\xdfP\xb7v\r:ujO\xda\xb4\xba\x13\x32\x7f\x9d>C\xd5*\x95\x34\xaf\x17/^\xc6\xc1\x43G\xe8\xd5\xb3+\x11\x11\x11\xac^\xb3\x9e\x87\xfG1{\xd6t\x14\n\x85\xceu|\xa4P(\x12\x1c\x9d\xa3\xab\xf\x13r\xf2\x8fs\xc4\xc4\xc4\xd2\xbd['\xde\xbf\x7f\xcf\xd8qSx\xfe\xfc\x5\xe3\xc6\x8e\x2>\xf5\xeb\f\x9f\x31\xb8\x97/\x1b\xaf_\x1\x1e=~\xcc\xa3\xc0g\x14,\xe0\x4\x80\xaf\xefZ\x16.^\xc1\xf8q#H\x97\x36-w\xef\xde#}\xfa\xf4\t\xc6 \x84\x10\x42\b\x91\x1c\xef\x42\xdf\xd1\xb2uG*{T\xa0\x7f\xbf^\xc9^\xae{\x97v\x94+W\x96\xf\x1f>p\xf2\xe4)\x1a\x34n\xc5\xca\x65\xf3\xa9X\xb1\xe2\x37\xc5q\xf1\xe2\x45\x1a\x36i\xcd\xe5\x8b\xa7u\xfe>\xfa\xd2\xfd\xfb\xf7\xa9\xe7\xdd\x98\xae\x9d\xdb\xd3\xbbW\xfn\xdf\xbe\x8d\xef\x9a\r\xdc\xbb\xf7\x80\xa9S\xa7$\xf9\xbd\xefsO\x9e<\xe1\xc6\x8d\xdbxx\xb8\xeb\x9c\x7f\xe4\x88\x1fy\xf3:\x92\x39s\xe6\x64\xafS\b!\xc4\x7f\xd3o{\xf6r\xe1\xc2%\xda\xb6n\xc5\x85K\x97\xb8\x7f\xf7\xd3\x8d\xb2\xf7\xef\xdeg\xdb\xf6\x9d\xb8\x94(\xc1\xf2\x95\xab(^\xbc(\xb5jT\xff\xe1\x31\xe\x1d>\x8a\x86\r\xea\x3\xd0\xacY#\xaaW\xad\x92h\xfb\v\x17\xfd\xd9\xb9s\xd7wm3\xb5>K%1$\x84HqN\xf9rQ\xd2\xa5\xb8&\xf1P\xa0@\x1\x36l\xde\xcd\xa5K\xfeT\xabV\x85\xc2\x85\v\x1\xe0Z\xd2\x85\x2\xff\\\x98\xfd\xe3\xcf\xbf\x38~\xf2\x34\xd7\xaf\x9c\xc5\xd4\xd4\x14\x37\xd7\x92\x44\x44\x46\xb2\x62\xa5\xafV\x19\xab\xcd\x1b\x96\xe3^\xbe\x1c\0\xe6\x66\x66\x34j\xd6\x81\xa0\xa7\x41\x64\xb4\xb3\x63\xdf\x1?f\xcf\x18O\xf9\x7f\xe6\xbb\xbb\x97\xd7\x19\x9f\x63\xae\\\xb8\x97u\xc1\xdd\xbd\x9c\x66\xfb\0ukyr\xf0\xe0\x61\xdc\\K\xa2V\xabY\xbfq\v\x1d\xda\xb7\x8e\xf7\xc3'wnG\xc6\x8c\x19\xa9y\x9d/_>V\xad\xd9\xc2\xb5k\xd7(_\xbe\x9c\xce\xfd\xfb\\xx8#GOd\xda\x94\xf1xz\xc6]t/]*\xae|\xd6\xd7\xdc\xc5\xb7l\xe9\xfcx\t\x3\x80\x11\xc3\x87h\xfe\xfe\xde~\xcd\x9a%\v\xae%]\0(\\\xb8\x10\x16\x16\x16\xf1\xb6\x97P\x7f~4o\xeeL\xad\xa4\x97\xcf\x94\x89\x9a\xbf\xcb\x97+\xcbo{\xf6s\xfa\xef\x33\x9a\xc4\x10\xc0\xfcy\xb3H\x93&\r\0\xc1\xc1/\xd8\xb8i\x1b}\xfb\xf4\"00\x90\xe7/\xdeP\xafnm\x9c\x9c\xf2\xc7\xdb\x96S\xbe\\\xb8\x96t\xa6q\xe3\x86\0\xe4\xc8\x9e\x9d\x1d\xbb\xf\xb0t\xe1\f\xea\xd4\xa9\x5\x80\x85\x85\x5\xf5\xea\xb7\xe4\xd1\xa3G\xe4\xcc\x99Sk\xf9\xc4\xd6\x9f\xd4\xb6?\xb7}\xc7.,,\xd2\x31v\xccH\xf4\xf5\xf5)\a\x98\x99\x99\xd2\xab\xcfP\x1a\x37n\x88\x85\x85\x45\xa2\xef\x93\x8c\x19\xed\xf0\xf2\xaaK\xa5J\x1e\xa4M\x9b\x46\xe7\x36\xea\xd6\xad\xcd\xb1\xe3'\x19>j2\0M\x1b\xd5\xc1\xc3\x43\xf7\xc5\x2\x95J\xc5\xf9\x8bW8s\xee\x32-\x9by\xd3\xa3{gbU*f\xce\x9a\xc7\xfd\x87\xf\x99?wV\xbc\xe3\xfc\xcf?\xff\x62\xff\x41?N\xffq\b\x80\xd7\xaf\xdf\x30v\xe2t\xf6\xfe\xb6\x99\xa2\x45\n\x3`gg\x87g\xf5\xfa\f\x1d\x32\x88={\xf6\x32\x64\xc4\x44\xadul\xdf\xe5\b@\xab\xe6\xf5\x99\xea\x33)\xd1>\xfb\x1a\xabV,\xc1\xd2\x32\xeeXLoiI\xfd\xc6m\xe9\xd4\xb1=\xf6\xf6\x99\xc9\x9d\xcb\x81\x2N\xf9h\xde\xbc)\x10\xbf_\x1\xae]\xbb\xae\xf5|\xa1\xf3\x17/Q\xa6tI\xaaxVF\xa1Ph\x1d\x8b\x42\b!\x84\x10\xdf\"*:\x9aN]{b\x93\xc1\x9a^=\xbb}\xd5\xb2\xb9\x1csQ\xb2\x64\xdc\xcdj\x15*T **\x8a\x89\x93|\xbe\x39\x31\xf4\xb5\x1c\x1c\x1c\x38zx\x1fvvq\xdf\x9d*W\xae\x8c\xa3\xa3#\xed;\xf5\x64\xe0\xc0\xfe\xd8\xd8\xd8${]7n\xdc\xa6k\x8f>\xcc\x9e\xe9\x43\xd5*\x95\xb5\xe6\xed?p\x88^}\x6\xb2`\xeeLI\f\t!\xc4/\xee\xc3\x87p\xc6\x8f\xf7\xe1Yp0+V\xc6\x7f\x86uTt4}\xfb\x7f\xba\xde\xb5o\xdf!<*T\xc0\xd4\xd4\xe4G\x86\xc9\xe9\xd3g\xf0\xa8P\x1\x80\x9c\x39rP\xa6t\xe2\xe5\xf0##\"\xbf;1\x94Z\x9f\xa5\x92\x18\x12\x42\xa4\x38\xa5\x81\x1\x8e\xb9>]p\xb7\xb5\xb5!\xbd\x65ZB\x13)=p\xe7\xf6\x1d\xc2#\xa2\xc8\x96\xab\xb0\xd6t3Sc\xad\xd7\xe6\x9f\x95\xbarpp\0\xe0}\xd8{\x94J%#\x86\xf4\xa6\xef\x80\x91\x9c\x39s\x8e\xca\x95=p/_.\xde\xe8\x96\xc4\x34h\xe0\x45\xb7\x1e\xfd\x19\x38\xa0/\xf\x1e>\xe4\xf2\x95\x9bTH \xb9t\xf5\xea\x35\xf6\xed?\xc8_\xa7\xff\xe6\xc2\xc5\xb8\x32r\xe1\x11\x11\xc9\xda\xce\xe3\xc7\x81<\v~E\xde|y\x92n\x9c\b]?\xc8&\x8d\x1b\xaa\xf5\xfa{\xfb\xf5{U\xab\xe2\x1eo$\xd4\xb3g\xc1\xec\xd9\xb3\x17\xbf\xe3'\t|\xf2\x94\xab\xd7\xef\xe0\xe6\xea\xa2\xd5\x46O\xefS\xa5\xd3\xdc\x8e\xb9x\xf0\xe8)*\x95\nG\xc7\\\xd4\xaa\xee\x41\x83\xc6\xadh\xda\xd8\x9bJ\x1e\x15(Q\xc2Y3\x12\x45i`@\xae\x9c\x39\x34\xcb\xda\xdb\xc7}(\x1a\x19\x1bi\xa6},\xa5\x16\xf6\xfeSy\xba\x8f\x12[\x7fR\xdb\xfe\x9c\xbf\xff\x65\xca\x95-\xa5\x35\xafx\xf1\x62\x44\x45\xc7\xf0\xf8q \x16\x16\x16\xc9z\x9f$\x94\x14\n\r\r\xc5\xbb\x41S\xdc\xcb\x97\xe5\xdc\xdf#\x88\x8c\x88\x64\xe1\xa2%\xb8W\xac\xca\xa6\x8d\xabq\xcc\x95+^\x7fZZ\xa4\xe5\xe5\xab\x10\xa6\xfaL\xd2$\x81\xeclm\xf1\xac^\x9f\x41\x3\xfa\xe1\xe0\xf0i\xa4QPP\x10\xbd\xfb\xe\x62\xfe\x1c\x1f\xec\xed\xed\x1x\xf8\xe8\x11\xb1\xb1*\xaaT\xaf\x1f/\x9e\xb0\xb0\x30\xdc\xdd\xcb\xb3\x65\x43\xdc\xfe\x34h\xd2\xe\x80-\x1b\x96\x3`ii\xa9s?\xbe\x95\xa1\xe1\xa7\x11\x46\x1f\x93t\x8f\x1f?\xc6\xde>3\xa6&&\x94p.\xa6\x99\xaf\xab_\xcf\x9d\xd3~\xbeP\xc3\xfa^t\xec\xd2\x9bg\xcfZQ\xabVu*W\xf6\xc0&C\x86\x14\x8dY\b!\x84\x10\xffMQ\xd1\xd1\x9c={Ns\xa3\x17\xc4\xdd\x94\x33`\xc0P\xde\xbc\ta\xcb\xa6\xb5(\x95\xdfw\xe9\xa5l\xd9\x32\xacY\xbf\x95\xb7o\xdf\xea\x8e!*\x8au\xeb\xd7\xb3o\xef~\xc2\xde\xbf\xa7jUO\xda\xb6i\x83\xb9\xb9\x39g\xcf\x9e\xa3\x61\x93\xd6\0\x14*\x1aw\xf3\xcb\x15\xff\x33\x9a\x9b\xb0t\xd1\xd3\xd3\xd3$\x85>\xb2\xb2\xb2\x2\xd0\x94QN.\xf\xfwf\xcf\xf4\xa1W\x9f\x81Z\x17\xb4>^\xc8\x9a=\xd3'\xc1;\xa0\x85\x10\x42\xfc:\x96,]\xce\xb3\xe0\xe0x\xd3-,,@\xad&\xe4\x8b\xcf\xc0g\xc1\xc1,^\xba\x82>\xbd\xbe\xee\xe6\x8b\x7f\xa3\xd4\xfa,\x95\xc4\x90\x10\xe2\x87\xf8\xfc\x42\xbf.\xe6i\xe2J\xa1\x9d\xf9\xeb\x30\x6\x9f]LO\xacL\xc1\x97\xb3z\xf4\xe8\x86\xb7\xb7\x17\xc7\xfc\x8e\xb3\x62\xa5/C\x87\x8d\x65\xc3\xfa\x15\xe4\xcb\x9b\x37Y1\x96)]\n\x3\x3\x3\xce\x9e;O@\xc0\x15Z5o\xa0\xf9\x1\xf4\xb9\xf3\x17.R\xbf\x61KfL\x1b\x8fW\xbd:(\x95J\x8a\x97\xac\x90\xec:\xdf\x9avju\xc2\x8d\x12\x99\xf5\x35R\xa2_S\xd2\xeb\xd7\xaf\xa9S\xaf\x11\x8d\x1by1t\xe8@\xd2[ZR\xc4\xb9\x1c\x37n\xdcLx\xa1\xcf\xe2\x31\x36\x36\x66\xd9\xd2\x85\\\xbf~\x83\x63~\xc7\xe9\x37`(6\x19\xacY\xbdj\xa9\xcerh\xba\xf6\x33\xb1\xfdKj\xfd\xc9\xdd\xf6\x87\xf\xe1\xc4\xc4\xc4jMS\xfe\x93 K\xaclZR\xef\x93\x8f\xf6\x1f\x38H\xe0\x93g\f\x1e\xd4_\x93x\xf3\x99\x32\x89\x86\x8d\x9a\xb1l\xd9J\xa6L\x9e\x10o\x99\x12\xce\x45\xb0\xb6J\xaf\xd5'\x19\x33\x66\x4\xe0\xf5\x9b\x37\x9a\xc4PHH\b\x9d\xbb\xf4\xa4q#o\xcd(+\0\xb3\x7f\x92\xac\xab\x97\xcf\xa3`A\xed\x91\x61\xb6\xb6\xb6(\x95Jr\xfe\x93\x94\x1b=\xa2?\x97/_\xd1\x8c\xdeKM\x1f\xfb\xcc\xd0\xc8(\xc9\x36\0j\xb5\x9a\x83\x87\x8e\x32\xe0\xb3r.\xee\xee\xe5\x39\x7f\xe6\x4'N\x9e\xe2\xc0\x81\x43\f\x1a\x32\x86\xf9s|\xb4\xf6_\b!\x84\x10\xe2KQ\xd1\xd1t\xeb\xde\x97\x43\x87\x8f\x30\xcdg\x2\xf5\xbd\xeb\x1\x30\xd9g:g\xcf]`\xe7\xf6\x8d\x98\x9b\x9b%\xb1\x96\xa4\x45\x44\x44\x90\xc1\xdaRg2G\xadV3b\xc4H\x82\x9e>\xa5K\x97NDDF2k\xd6\x1c._\xe`\xc9\xe2\x45\xe4\xc9\x93\x9b\xfe}\xba\x31m\xe6|\xd6\xae^\x8a\x95U\xfa\xaf\xbay\xee\xa3\xabW\xaf\x92/O\xcex\t\xa3\xe4\xa8Z\xa5\xb2\xd6\x5- \xde\xc5-!\x84\x10\xbf\xb6\x12%\x9c\xb1\xb1\xc9\xc0\xf3\xe7/4\xd3zv\xefL\x9f\xde=\0\x98:m\x16\v\x16-\xd5\xcc\xcbhg\x87k\xc9\x12I\xae\xf7\xc9\x93'\x9c<\xa5\xfb\x19\xc2\x65\xcb\xb8\xfdkF\xac\xa6\xc6g\xa9$\x86\x84\x10?\xdc\xc7\v\xd3\x9f\xdfm\xf6q\x84\xc3\xf3\xe0\xe7\xb8\xb8$}bOH\xa6L\x19i\xd6\xb4\x31\x8d\x1a\xd6\xa7z\x8dz\x1c:xDgbH\xa1\xd0#**Jk\x9a\x89\x89\tm[7c\xf7\xee\xdf\xf9\xe3\xcf\xbf\x99\x31}\xb2\xcem\xfcq\xeaO\x8a\x16v\xa2^\xdd:@\xdc\xf\x35\x80\x88\xf0\x88\x4\xf7\xef\xcb\x18\x1\xae_\xbf\x19\xefy0zzzd\xb5\xb7\xe3\xce\x9d\xbb\x9aiQ_yW\xde\xe7R\xa4_\xff\xd9\x9f\x98\x98\x98\x44\x9a\xc4\xefO]\xae^\xbd\xce\xfd\x87Oh\xd5\xb2\x5\xe9\xd3\xc7\x8d\"\x89\x8dUq\xf0\xc8\xa9\xaf\bGA\xfe\xfc\xf9\xc8\x9f?\x1fuj\xd7\xa4\x98K\x5\xfc\xfd\x3([\xb6t\xb2\xd7\xf1\xad\xebO\xee\xb6\v\x16tb\xeb\xb6]\xf4\xef\xd7\x1b\x43\x43\x43\0\xae]\xbf\x81\x45:s\xb2\x64\xb1Ov,\xef\xdf\xbf\xc7\xcc,\xfe\xc5\x84\xc8\xc8H\xc2\xc3#\x88\x88\x88\xd0<_\xca\xc0@\x9f\xec\xd9\x1d\x34\xc7\xe3\x97\xcb\xd7\xaaQ\x8d\xd1\xe3&3*4T\x93\xc8\xbar\xf5*\0Y\xfe\x19Y\x15\x12\x12\x42\xa7\xce=(U\xaa$\xbd{\xf5\xd0\xda\x66\xe6\xcc\x99\xb1\xb6\xb2\xe0q` \xd5\xaa%^C7\xb5=z\xf4\x98|\xf9\xe2\xde\xd7\xb7n\xdd\xc6Pi\x80\x43\x2\xcfV\xfaRPP\x10\xb7\xee<\x8cW\xf6\x30M\x9a\x34\xd4\xa8^\x8d\x1a\xd5\xab\x61\x63\x63\xc3\x8aUk$1$\x84\x10\x42\x88\x4}L\n]\xbe\x1c@\xbf\xbe=\x19\x38x\x4\0\xa1\xa1\x61l\xdc\xb8\x8dm[\xd7\x63\x63\xf3}#\x90\x63\x63\x63y\xf4\xe8\x11+V\xae\xa6K\xa7\xf6:o\"\n\b\b`\xe3\x96]\x9c\xf9\xcb\xf[[[\0r\xe5\xcc\x45\xa5*\xb5\x38w\xee\x1c...\x9a\xdf\x1\x85\n\x15L\xd6\x33\x86\xbe\xf4\xf2\xe5K\xa6\xcf\x9c\xcb\x34\x9fI\t>32)\x9f_\xd0\x2$)$\x84\x10\x42K\xe9R\xae\xec\xdf\xb3\x83\x62%\xca\0`\x91.\x1d}z\xf7\xd0|\xf6\xf5\xef\xd7\x8b\x35\xeb\x37\xf2.4\xae\x1a\xc8\xfe\xbd;t>\xee\xe0K\x19\x33\x66\xe4\x92\xff\x65\x36l\xdc\xa2\x35\xbdi\x93\x86\x34l\xe0\x95\xc2{\x91\xbaR\xfa\xb3T\x12\x43\x42\x88\x1f.m\xda\xb4\x38\xe6\xcc\xca\x8e\x9d\xbbI\x93\x36-\x19\xac\xad(T\xa8 -\x9by\xd3\xb5{_\xc6\x8c\x1eJ6\a\a\x2\x3\x9f`ll\x94\xacQ\a111\x8c\x18\x39\x86\xd2\xa5\xdc\xc8\x98\xd1\x8e\xe7\xcf_p\xed\xc6\x1d\xfa\xf4\xce\xa5\xb3}\x81\x2\xf9\xd9\xbb\xf7 \xa5K\x97\xc2\xcc\xd4\x94\xfc\xf9\xf3\x1P\xa3zU\xca{\xc4]\fv.^L\xe7\xb2\xd9\xb2\x39pj\xf2,\xd6\xae]O\xf6\x1c\xd9\xd9\xb5\xeb\x37\0\xac\xac\xad\x12\xdc\xbf\x8f\xe5\xb8 ntE\xd7\x8e-\x19\x36\x62,*\x95\x8a\xcc\x99\x33q\xf7\xde=\xf2\xe4\xceM\xfe\xfc\xf9h\xd4\xa0\x1ek\xd6m\xc2\xce\xce\x16kk+\x9a\xb4\xe8\x94\xfc\xce\xfd\xc2\xf7\xf6+@\xe6\xcc\x99\0\xd8\xb2\x65;..\xce\xe4\xc9\x93[\x93\x8c\xf8(\xa1\xfeLh]\xf3\x17,\xa2\x62\x45wn\xdd\xba\r@\xbb\xd6\x8d\x93\x15\xcb\xbd{\xf7\xd9\xb8i\v%K\x96\xc0\xc2\xc2\x82\xb3g\xce\xa2\xaf\xafG\xd6\xacY\x92\xb5\xfc\xf7\xac\xffk\xb6\xdd\xa0\xbe\x17s\xe7/\xa5_\xff\x41\x34h\xe0\xcd\x9b\xd7o\x18\x33n2\xe3\xc7\xe\xd3\x99\xe8\xd1\x65\xe7\xae\xddt\xe9>\x80\xbd\xbb\x37Q\xb4h\x11\xady\x15\xdc\xddI\x97n.]\xba\xf6\xa4i\x93\x46\xa4Ic\xce\xd5k\xd7Y\xb3~;\xbb\xb6\xad\xd1\xb9|\xd5\xaa\x9e,]\xbe\x8aN]z\xd0\xb2yS\xd4\xa8\x99\x35k>\xc3\a\xf7\xc6\xda\xda\x9a\x90\x90\x10\x1a\x35i\xc9\x45\xff\xeb\xf4\xea\xd9\x95\xb3\xe7\xcek\xb6\x97=\x9b\x3\x36\x36\x36\x8c\x19\x39\x98\x9e}\x87\xa2T*q.^\x8c\xd0w\xefx\xf0\xe0!\xcd\x9aj\xff\xffU\xad\xe2I\xd9\x32)\x93\xa8\xd3\xa5u\xdb\xce\f\x1f\x36\0#C#&L\x9a\xca\xd0\xc1\xbd\xb1\xb6\x8e?3\x8fU\xb5\0\0 \0IDAT\xbaO\x97k\xd7\xae\x93\xc9.\x3\xd9\xb2\x39h\xa6-\\\x18\xf7\xcc\xa2\xec\x39\xb2\x13\x1d\x15\xc5\xe9\xbf\xcf\xe2R\xa2xj\x85/\x84\x10\x42\x88\x7f\xb9\x8fI\xa1\x80\x80+l\xda\xe8K6\x87\xac\x64\xcah\xc7\xc0\xc1\xc3\x31\x30P\xb2\xd6w\x19\x8e\xb9r$\xbd\xa2\x4\xf4\xee;\x84\xde}?=Ga@\xdf\xee\xb4h\xd1\\g\xdb\xdb\xb7\xef\xe0\x94/\x97&)\x4q\xe5\x91\x33\xdaZs\xef\xde=\\\\\\t.\x97\\\x91\x91\x91\f\x1b>\x2\xaf\xba\xb5\xa8X\xb1\xc2w\xadK\b!\x84H)\xc9}F\xb7\x9e\x9e\x1e\x13\xc7\x8f\x46\xa1P\xb0~\xc3\x66\0\x9a\x35m\xc8\xf8\xb1\xa3\x92]\xb5\xe5\xbfJ\x12\x43\x42\x88\x1fN\xa1P\xb0\x64\xd1\\\xc6\x8e\x9b\x44\x8f\x9e\xfd\x18<\xb0/\xf6\xf6\xf6L\x9c\x30\x96u\xeb\x37\xb2\x62\xa5/\xb7\xef\xdc\xc7\xb9XaZ\xb7\xd2\xfd\x3\xe8KQQQd\xcb\xe6\xc0\xca\xd5k\xb8z\xed\x16\xb9rfc\xfa\xd4qT\xad\xea\xa9\xb3}\x97\xce\x1dx\xfd\xfa\x35\x9d:\xf7\xa4\x41\xfd:\x9a\x44\x46\xde\xbcy\xc8joG\xfbv-\x13,\xf9U\xbdzUF\r\xf\x64\xfe\xc2\xa5\xa4K\x97\x96\xa6M\x1aR\xa1\xdc\xe3$\xf7\xefs\x83\a\xf\xc0.\xa3\x1ds\xe7-\xe4\xf9\x8bW\x94.\xe5\x42\xde \x13\xe2\x8d\xc2J\xa8?\xbf\x94#Gv|W\xceg\xd6\xec\xf9\xec\xddw\x90\xda\xb5\xaa\xd1\xb3[\xbb\x64\xc7\x62hh\x88\x42\x1>Sg\xf2\x38\xf0)%\x9c\x8b\xb0\x63\x8b\xaf\xd6\xf3q\xbeGb\xeb\xf\f|\x92\xecm\xdb\xd8\xd8\xb0\x7f\xcfv\xe6\xce[@\xdf~Cpr\xca\xcb\xe4\x89\x63\xf0\xf4\xac\x94\xecXl2d\xa0X\x11'\x9dwu\xda\xdbg\xe6\xb7\x9d\x9bY\xb5\xca\x97i\xd3g\xf3.,\f7\xd7\x12\xec\xff}3\xc5\x8a\x15\xd5\xb9\xbc\xb9\xb9\x39\x1b\xd6\xad\x62\xde\xfc\x45L\x98\x34\x15;;\x1b\xda\xb7o\x85W\xbd\xb8\x92'\x7f\xfc\xf9\x17\x17\xfd\xaf\x3P\xb7~K\xad\xed\xad\xf3]D\xe5J\x1e\xd4\xaf\xef\x85\x85\xa5\x5\x1b\x36lf\xfa\xccy\xe4\xce\x95\x83Z\xb5\xaa\xc7\x8b/G\x8e\xec\xc9\xde\xcfoQ\xafn\r&O\x99\x81\xb5\xb5\x15\x9d:\xb6\xa5q\xa3\x6\xc9^\xf6\xc2\xc5K\xd4\xa8^Y\xebn\xd7\x8c\x99\xec\xf8\xed\xb7\xbd\x9c\xbfp\x99t\xe9\xd2P\xbbV5:vH\xfeq)\x84\x10\x42\x88\xff\xb1w\xdfQU\x1cm\x1c\xc7\xbfT\x1b\x2vD\xec\x62\xc7\xde+\xf6\xd8{\xef\xb1\xc4\x8e\xbd\xc7\xde\xbbQ\x13{W\xd4\xd8{\x8f\x1a\x13\xbb\x46\x8d]c|U\xc0\x8e\xa0\x80\xd4\xf7\xf\xf4\xc6+ET\x10\x95\xdf\xe7\x1c\xcf\xb9;3\xbb\xf3\xec\xdd\xe5\n\xfb\xdc\x99\x89;\x8c\x92\x42\xae\xcbI\x9f>\xf4KB\xf5\xeb\xd5\xc1\xcc\xdc\x1cK\v\v\n\x17\xfa\xb4/\x98\x94.Y\x98\xee\xdd\xba\x92\x30\x61\x42\x1c\x1c\x1c\"]\xaf\xf1\x95\xff+\xfc\xfd\xc3\xce\x30`e\x95\xc8\x30r\xfd\x63\x5\x5\x5\x31q\xe2$\x2\x3\x3\xe9\xd7\xbf\xdf'=@{{\x1d\x4\xd0Tr\"\"b\xec\x8f?\x8f\xd3\xb3w\x7f\xc3\xb6\xe7\xf3\xe7L\x9b>\x8b\xde\xbd\xba\x13\x12\x12\xc2\xe4)3\f\xa3\x85\0\xaaV\xaf\xc7\xf4i\x13)Q\xbc\xe8{\x8fmjj\xca\xd8\xd1\xc3\x43'\xc4\x31\x31\x61\xcc\xc8\x61_eR(\xba\xff/5\xb9v\xcb-$\xad}\xe8\xf0\xe6\xbbn\x8f\xc8\x9a)u\xb4\x5+\"\xb1\xcb\xd7/t\xea\xaf\xbbn\x8fx\xf3s\x1e\x91\xb7\xdb\xc4\xe5\xcf\x82\x1b\x37oR\xb2LU\xfe<\xb2\x9b,Y2\xc7v8\"\xf2\x96\x83\a\xf\xd1\xa4\x45\an\xdf\xf8+\xca#\xaf\xdeU\xb1ru\xbaw\xed\xa4i\xe2\x44\x44\x44\xbe\x11\xd7\xffq7\xfa;\xe6\x43\xfe\xee\xf9\x18S\xa7\xcd\x64\xfd\x86-\xacY\xbd\xcc\x90\x14\x8a.\xc1\xc1\xc1\x64\xcc\x92\x8b\x19\xd3\xc6S\xb7N\x9dp\xdb\x1c>|\x98Vm;q\xf9\xe2i\x12%J\xc4\xf1\xe3\xc7i\xdc\xac-\x87\xf\xee\"C\x86\f\0\xb8\xbb\xbbS\xac\x64y\xb6oY\x87\x93\x93\x13'N\x9c\xa4Q\xd3\xd6\x9c\x39\xf9;\xc9\x93'\x8fR,AAAL\x9e<\x85k\xd7\xae\x33s\xe6\xf4p\xd7\xf3\x8c\xaa\xb7\x1f\x64\x85\xb7`\xb6\x92\x43\"\"2c\xe6l\xa6\xcf\x9c\x13\xa6\xdc\xd6\xd6\x16\x42\x42\xf0|\xfe\xde\x8c\x32\xfa\x94\xa4P\xf9\x8aU\x19\x32h\0+]\xd7P\xaa\x64\t\xda\xb5m\x15i\xfb\x3\a\xe\x31v\xfc\x44\xe\xee\xdf\xf5\xd1}B\xf4\xff_z\xd7\xed\x91\x46\f\x89\x88\xbcm\xe7\x8e\xdd\x94.YHI!\x91o\xd0\x83\a\xf\xb8\xf0\xf7\xf5\x30\xeb\v\x89\x88\x88\x88\x44U\xc7\xe\xedh\xdc\xa8\x1\xe\xe\xb1\xb3Xu\xc2\x84\xa1_\x8e\x39}\xfa\f\xb9r\xe5\xa4p\xe1\xc2\x38\x97)\x8eK\xcf\xdet\xef\xd6\x5\v\vK\x16,\\H\xd3\x46uprr\x2\xc0\xde>t:\xe7M\x9b\x36Q\xa8P!\x1c\x1d\x1d\xc3L\r\xfd\xb6\xa0\xa0 &M\x9a\xcc\xdc\x5\xcbX0\xf7'\xae]\xbbn\xa8K\x9a\x34\t\x99\x33G\xfdo\xa5\x3\a\xe\x85\xfb\xd0\xea\xedu\x12~\x9e\x35\x9d\n\x15\x9c?\xe4m\x10\x11\x91oL\xc7\xe\xedp]\xb3\x1e\x8f\a\xf\x8c\xca===\xc3m\x9f\xda\xce\x8eN\x1d\xbf\xff\xa0>\xa2{\x94\xd0\xf1\xe3\xa7\xde\xdb\xe6\xcd\x12\n\x9f\"\xa6\xfe/UbHD\xe4\x35___\x16,^\xce\xf0\xa1\x3\x62;\x14\x11\x89\x1\xc9\x92%\xe7\xe6\xd5\xb3$N\x1c\xf1\x83\x10\x11\x11\x11\x91\xc8$Nl\x15\xab\xbfK\xe4\xcb\x97\x97vm\x9b\x33l\xf8H\x86\f\x1eH\xe5\xca\x95\x98\xf5\xd3\f\x16.\\\xc4\xe4)\xd3\xb0\xb1\xb6\xa6z\xf5j4m\xfa\xdf\x1a\x90i\xd3:0w\xce\x34\x66\xfe\x34\x87\xdd{\xf6\x31n\xech\xb2\xbd\x9e\xc6:<\xf7\xef\xdfg\xee\x82\x65\0t\xe8\xd4\xc3\xa8\xae{\xd7\xf6\xf4\xed\xd3'\xca\xf1\x66\xcf\xee\x18\xe1\xc3\xaa\xef\xaaT\xe2\xe7Y\xd3\xc9\x9e\xdd\x31\xca\xc7\x13\x11\x91oS\xc2\x84\t\x18:\xb4?\xe7\xce\x9e\xa7m\x9bV\x9c:}\x9a\xfe\x3\x87\x12\x10\x10:\x1b\x92\xa5\x85\x5\x13\xc6\x8f\xa2H\xe1\xc2,^\xba\x8c\x2\x5\xf2\x91 A\x82X\x8b\x37\x8f\x93\x13\x17.^\xe4\xe8\x1f\x7f\xbe\xb7m\xb1\x62\x9f\xb6\xde_L\xfd_\xaa\xa9\xe4\x44\xbe\x61\x9aJNDDDDD\xbe\x65\x9f{*\xb9o\x81\x87\x87\a\x8f\x1e=\x8a\xb0>e\xca\x94\xa4J\x95\xea\x33\x46$\"\"\x12V\xa5\xaa\xb5\xb8~-t\xc4M\xb6\xecY\xd9\xbbsK,G\x14:\x95\\\x8d\xeaU\xc9\x9b'\xcf{\xdb&K\x9e\x8c|y\x9d>CT\x1fNS\xc9\x89\x88\x88\x88\x88\x88\x88\x88\xc4!\a\x7f\xfb\x8d\x41\x43\x46\x45X?i\xc2H\x1a\x37j\xf4\x19#\x12\x11\x11\t\xab\x62\x39g\xac\xad\x12\x3P\xb4H\xa1X\x8e&\x94\x43\xda\xb4l\xdf\xb1\x8b\xed;\xde\xbf\x66P\xb1\x62\x45\xbe\xd8\xc4\x10h*9\x11\x11\x11\x11\x11\x11\x11\x91\x38\xa3Y\xd3\xa6\x34k\xda\x34\xb6\xc3\x10\x11\x11\x89\xd4\x80\xfe\xbd\x63;\x84\x30\x96/\x99\x1f\xdb!D\x9b\xe8]qIDDDDDDDDDDDD\xbeXJ\f\x89\xc8'\xeb\xd5\xbb\x1f\xfd\xfa\xf\x8ar\xfb\xe0\xe0`<==\xf1\xf7\xf7\x8f\xc1\xa8\x8c\xcd\x9d;\x9f.\xdd\\\b\t\t\x1\xc0\xcb\xcb\v\x1f\x1f\x9f\x18\xe9+\xaa\xe7w\xe6\xec\x39j\xd7m\xc4\x94)\xd3\x8d\xca\x43\x42\x42\xd8\xb4y\v\xadZ\xb7\xa3\x62\xe5\xeaL\x9f\xf1S\xb8\xb1\x9e\x39s\x16\x97\x9e}(^\xb2\x1c\x43\x86\xe\xe7\xde\xbd\xfb\x46\xf5\xcf\x9e=c\xe0\xa0\xa1\x14/Y\x8ei\xd3g\x1a\xc5\xf3\xf2\xa5\xf\x45\x8b;\xe3\xba\x66\xed{\xcf\xc7\xc7\xc7\a//\xaf\xf7\xb6\xfb\x12\x1d=\xfa\a5j\xd5\xe7\xd1\xa3\xc7\x1f}\x8c\xc0\xc0 \xbeo\xf7\x3\xcb\x96\xad\x88\xc6\xc8\"\xf7\xe2\xc5\v\xe6\xfc<\x97j\xd5\xebP\xbc\x64\x39\x86\r\x1f\xc9\xbd{\xf7\"l\xbfm\xfb\xeR\xda;\x86\xf9\xb7o\xff\x1\0n\xde\xbc\xc5\xb4\xe9\x33i\xd4\xb8\x39y\xf2\x17\xa3]\xfbNQZ \xf1\x43yyy1k\xd6\x1c\xb2\x64\xcb\xcb\x83\a\xf\x80\xd0\xfb\xf9\xc0\xc1\xdf\xe8\xd5\xbb\x1f\x45\x8a\x95\xa1\x41\xa3\x66l\xd8\xb8\x89\xa0\xa0\xa0\x8f\xea\xe3\xc1\x83\a\xa4\xb4w\xe4\xf4\xe9\x33\xefm\xbbi\xf3\x16\xf2\xe4/\xf6\xd1}\x89\x88\x88\x88\x88\x88\x88\x88|\x8b\x94\x18\x12\x91\xcf\xce\xcb\xcb\x8b\xac\x39\vs\xe6\xcc\xd9\xcf\xd6gH\b\x84\x4\x87\x18\xb6\xdbw\xe8\xcc\xd2\x18z\xd0\xff\xbe\xf3\xbbr\xf5*]\xba\xb9P\xa3v\x13\x8e\x9d\x38\x17\xa6~\xfe\x82\x45\f\x1f\x39\x9eZ5\xab\xe3\xd2\xa3\v\xbb\xf7\xec\xa7K\xb7\x9e\x4\x6\xfe\xf7p\xfb\xf8\xf1\x13\xd4\xae\xd7\x9c\xacY\x1d\x19\x35r(O\x9f>\xa3~\xc3\xe6xx<0\xb4\x19=f<\xaf^\xbd\x62\xc6\xf4I\xec\xdc\xb5\x97u\xeb\xd6\x1b\xea\x36m\xda\x8c\xb9\xb9\x19uj\xd7z\xef\xf9,]\xb6\x82\xf6\x1d:\x7f\xc8[\xf0\xc5\b\t\xc1\x90\f\xfcZ\x84\x84\x84\xd0\x7f\xe0\x10~;t\x84.\x9d;2\xb0\x7fo\xfe\xfd\xf7\x7f\x34k\xf1=^^\xde\xe1\xee\xe3\xeb\xeb\x8b]\xaa\x64l\xdb\xbc\xda\xe8_\xde<\xa1s\xd9.Y\xba\x1co\xef\x17\xb4n\xd5\x82\x89\xe3\x46\x92&Mj\xea\x35l\xcd\x1f\x7f\x1e\x8b\x96\x98}}}Y\xb3\x66\x1d\xa5\xcaVf\xf4\xf8\x19xy\xff\x97\xc8\xdc\xb6m\a\xc3\x86\x8f!_\xde<\x8c\x1c>\x84\\9\xb2\xd3\xb9[\x7f\xd6\xbeu?\xc6\x94\xd3\xa7\xcfR\xa3Ze\xcc\xcc\xcc\x62\xbc/\x11\x11\x11\x11\x11\x11\x11\x91\xaf\x85\xd6\x18\x12\x91\x38\xa1s\xe7\x8e\xb1\x1d\x2\x10\xfa\xd0\x7f\xfc\xf8\xc9\xe4\xce\x9d\x93S\xc7\xe\x32\x66\xec\x4\xa3\xfa\x87\xf\x1f\x32z\xecT\xd6\xba.\xa6\x64\x89\xe2\0\x38\x39\xe5\xa6H\xf1\x8a\x1c?q\x82R%K\x10\x1c\x1c\xcc\xc4I\xd3\x18\xd8\xbf\a]\xbbt\x2\xa0t\xa9\x92\xd4\xa9\xd7\x98_\xd7o\xa0{\xb7.<{\xe6\xc9J\xd7M\xec\xdd\xb9\x9e|\xf9\xf2\xd2\xaa\x65\x33\xd6\xfd\xba\x91\x16-\x9a\xf1\xfc\xf9s&L\x9e\xc1\x84\xb1#H\x90 \xc1g\x7f\xf>\xa7\xd2\xa5KR\xbat\xc9O:\x86\xb9\xb9\x19\x8b\x17\xcd\x8b\xa6\x88\xde\xcf\xc3\xc3\x83\xf5\x1bw\xb2\x65\xc3\n\x8a\x17/\x6@\x89\x12\xc5\xc9\x95\xb7\x38W\xae^\xa5h\x91\xc2\x61\xf6\xf1\xf5\xf1\xc5>u\xaap\xeb\0\x46\x8f\x1a\x8e\xa9\xe9\x7f\xdf\x5\xa9Z\xb5\n>>\xbe\xec\xd8\xb1\xcbp\x9f\x45\xd5\xf1\xe3'\xf8\xbe\x43\x37\xfe:\xf3\a\x96\x96\x96\0\\\xb8p\x91\x95\xab\xd7\x32u\xf2Xlmm\xa9^\xab\x89\xa1}\xd9\xb2\x65\xa8P\xa1\x1c\x89\x12%2\xf4mai\xc9\xb2\xe5\xabh\xd6\xb4\xf1\a\xf5\xfd!\x82\x83\x83\xd9\xb5{?\xc3~\x1c\x10\x63}\x88\x88\x88\x88\x88\x88\x88\x88|\x8d\x94\x18\x12\x91hW\xb9JM\xea\xd7\xaf\xcd\xbf\xff\xde\xe1\xd0\xe1\xa3\x64\xc9\x9c\x91^=\xbbS\xa0@~\xbc\xbc\xbc\xc9\x9a\x33\xf4\xe1u\xed\xfa-\x1\xd8\xb6y5E\x8b\x14\xe6\xc5\x8b\x17,X\xb8\x98\xed\xdbwc\x95\xd8\x8a\x66M\x1b\xd1\xa0~]\xcc\xcc\xccx\xf0\xe0\x1\x5\x8b\x38\x33u\xf2h\xe\x1f\xf9\x9d\x93'\xcf\xe2\\\xb6$\xbd{\xb9`o\x9f\x1a\x80'O\x9e\xb0p\xd1\x12v\xef\x39\xc0\x93\xa7\xcf(^\xb4\x10\x43\x87\f$mZ\a\xa6L\x99\xce\xc5K\x97Y\xb6\x64\x1\xcd[\xb4\xe1\xd0\xef'9\xf4\xfbIF\x8c\x9e\xc2\xe8\x11\x3\x30\x37\x33\x63\xfaO\xbfp\xe6\xe4\xef\xc4\x8b\x17\xf\x80\x7f\xff\xbd\x43\x91\x12\x15\x39|p\x1b\x39\xb2g7\x9c\x9f\x87\xc7\x3\xd6\xad[\xcf\xa1\xc3\xbfs\xf3\x9f\x7f)V\xa4 \xdd\xbbu\xc6\xc9)w\xa4\xe7\a`bb\xc2\xa2\x85s\xb1\xb0\xb0\b\xf7\xbd;t\xf8\b\xc9\x93%1z\xc0\x9f!}zjT-\xcf\xee\xdd{)U\xb2\x4\xd7\xae_\xe7\x8f\xe3g\x99\x34i\xac\xa1M\xfc\xf8\xf1i\xd4\xb0\x1e\xd3\x66\xcc\xa1[\xd7\xcexz>\x3 \x91U\xe8\xc3x[\x1b\x1b._\xbd\x1\xc0\x9a\xb5\xbf\x92\xce\xc1\x9e*U*\xbd\xf7Z\xce\x9b\xbf\x90\x11\xa3\xa7\0\x90\xd2\xde\x91J\xe5K\xb2j\xe5R\xa6L\x99N`P v\xa9R\xe1\xbav=y\x9cr1j\xe4\x30\x36o\xd9\xca\xce\x9d{8\x7f\xf1\x32Y\x1d\x33\xd1\xb6uK\xaaW\xaf\n\x10-\xd7\xf0\x99\xa7'Ilm\xd9\xbb\xef \x96\xf1,\xe9\xd4\xb1\x1d\xf9\xf2\xe5\x61\xc1\x82\xc5\x1c\xf8\xed\b\xei\xec\xe9\xd5\xb3\x1b\x45\x8b\x16\x1\xe0\xe0\xc1\x43\x34i\xd1\x81\xdb\x37\xfe\"Q\xa2\x44\\\xbb~\x9dy\xf3\x16r\xe4\xf7\x63XX\x98S\xce\xb9\x34#G\xfc\x88\x85\x85\x45\xa4u\x95\xab\xd4\xa4q\xa3z\xb4k\xd7\x16\0\x7f\x7f\x7f\x96/_\xc9\xb6\x1d\xbby\xe1\xfd\x82\xea\xd5\xab\xd0\xb1\x43;\xac\xac\xac\0\x98\x32\x65:\x9e\xcf\x9f\x63kk\xcb\xbe\xfd\a177\xa7m\x9b\x16\xd4\xafW\x17\x13\x13\x13\xdc\xdd=\xe8\xd2\xd5\x85\xae]~\xa0\x62\xc5\xf2\x46\xefy\xfc\xf8\xa1\xc9\xba\xfbnn\x86\x32/\xaf\xe7\0\xa4\xb6K\x15\xeeu\xf2\xf1\xf1\xc5\xd6\xc6&\xc2\xeb\xf8vR\bB\x13\x94>\xbe\xbe\xa4L\x99\xc2P\x16\x1c\x1c\xcc\x86\r\x9bX\xfb\xeb\x6\x1e>|L\xedZ\xd5\xe8\xd8\xa1\x1d\x89\x13'\xe\xb3\xef\xe3'\x9e\x46\x65\x45\x8a\x14\x66\xcb\xa6u\x98\x99\x99q\xfe\xc2\x45\xa3:\x1b\x1b\xeb\x30\xf1\xa4\xb6K\xc5\x8b\x17/\xc3\x8d\xb5r\x95\x9a\xb4i\xd3\x82+W\xae\xb2\xff\xc0!r\xe6\xc8\x46\x8f\xee]\xc8\x9b\x37\x8fQ\xbb\xdd{\xf6\xb1l\xf9J\x8e\x1d?\x1d\xe6>\x2\xb8s\xe7\x7f\xdcs{\x88S\xee\\@\xe4\xf7\x96\x88\x88\x88\xc4Mw\xdd\x1e\xc5v\b\x12\r\xd2\xda\xa7x\x7f#\x11\x11\x11\x31\xa2\xa9\xe4\x44$\xda\xfdu\xf1*?\x8e\x98\x88\x93Sn\xc6\x8c\xfa\x91\xa4I\x93\xd0\xa8i\x1b\xdc\xdd=H\x98\x30!\xbf\xba.\x2`P\xff\xee\x1c\xdc\xbb\x99\x1c\xd9\xb3\x11\x14\x14\x44\x97\xae.\xb8\xbb{0f\xccp\x9a\x35i\xc8\x8c\x99s\x8c\xa6\x9b\xf2\xf\b\xa4{\xcf\x41|W\xa5\x12\xc3\x87\r\xe4\xd6\xad\xdbt\xeb\xde\xcb\x30\xc5Z\xef\xbe\x3\xb9r\xf5:#\x86\r\xe2\xa7\xe9\x13)X0?6\xe1<,\x1f\x31\x62(\0\x85\v:qp\xef\x66j\xd5\xacN\xe5\xca\x95x\xf8\xe8\x19g\xcf\xfd\x65hw\xf8\xf0\x11J\x16+@\xf6l\xd9\x8c\xf6\xf7\xf2\xf2\xe2\xc9\x93'4k\xd6\x88\x9f\xa6O\xc4\xd6\xd6\x86\x86MZ\xf3\xe8\xd1\xe3\b\xcf\xefm\x11%\x85\0\xee\xde\xbdG\xae\x9cY177\xce\xdb\xe7\xcc\x91\x9d\x9b\x37\xff\x1\xe0\xc1\xeb\xe9\xe2R\xa5\x34N\x12\x64H\x9f\x9e\x87\x8f\x9e\xe1\xe5\xe5M\x92$I\0p\xbb\x1f\x9a\\\xb8{\xef\x1e\xf9\xf2\xe6\xe2\xf1\xe3\xc7L\x9e:\x8b\xfe\xfd{\xf3\xc7\x9f\xc7\xa8Q\xab>\x8d\x1a\x37\xf\xf3\x30\xff\x8dZ5\xabS\xb8`\xe8td\a\xf7n6\xbcw\0\xd3\x66\xce\xe7\xf8\x89Sth\xdf\x86\xda\xb5kbbb\xca\xb9s\xe7\xa9T\xa9\x2?\xcd\x98\x44\xc5\xf2\xce\xb4\xed\xd0\x83\x63\xc7\x8e\x1b\xf6\xf9\x94k\x18\x1c\x12\xcc\x82\xc5\xab\x89\x17?\x1e\x83\a\xf5\xa5x\xb1\"|\xdf\xd1\x85\x2\x45\xca\x91\x31\x63\x6\x46\x8e\x18\x82\x83\x83=\x8d\x9a\xb6\xe5\x7fw\xef\x86\x39\x97g\xcf<\xa9\xdf\xb0\x5I\x93&e\xd6OS\x18\x36t \xd9\xb3g\xc3\xc2\xc2\"\xd2\xbaw\x85\x84\x84\x30p\xd0P\xf6\xed\xff\x8d\x1e\xdd:\xd1\xbbWw\xb6l\xddI\x97\xae.\x4\a\a\x1b\x62\x9d\xbfh\x15\x16\xe6\xe6\f\x1a\xd0\x87\xf2\xe5\xca\xd0\xa5\xfb\0\xe\x1f\xf9\x1d\b\xbd\x87N\x9d\xb9\x10n\x9cI\x92\xd8\x32y\xfc\x30z\xf6\x1e\xc2\xfc\x5\x8bX\xb0p1\xdd{\xf4\x61\xde\x9c)\xa4K\x97.\xdc\xeb\xf4\xd2\xc7\x87\x83\x87\x8fQ\xaaLE\xca\x38Wf\xe0\xa0\xa1\\\xbf~\xc3\xa8M``\x10\xa7N\x9f\xe1\xd0\xa1\xc3\f\x1f\x31\x8aK\x97\xae\xd2\xb2\x45\x33\x43\xfd\xbcy\vY\xed\xba\x8en]~`\xf0\xc0>\x9c>s\x8e!C\x87Gi*>\x13\x13\x93\xf\x9a\xae\xed\xd8\xf1\x93|W\xa5\x62\xb8u~\xaf^\xd1\xb3\xcfP2g\xca\xc8\x84q#\xb1\xb3K\xc5w5\x1a\xf2\xcf?\xb7\x8d\xda\xfd\x34g\x11\x95*V\b\xf7>\x2\xb8|\xf9\nv\xa9\x92\x91!C\x6 \xea\x9f\xf\"\"\"\"\"\"\"\"\xdf:\x8d\x18\x12\x91h\x97+G\x16\x8a\x16)h\x98&*w\xee\xdc\xb8\xae\xdb\xca_\x7f\x9d\xa7j\xd5*\x86o\xfe\x17+Z\x84\xdc\xaf\xbf\xcd\xff\xc7\x9f\xc7\x38\xfc\xfbq\xae\xfc}\x8a\x84\t\x13R\xbcXQ\xfc^\xbd\x62\xf1\x92\xe5\x46\xd3M\xads]\x84s\xd9\x32\0X%JD\xe3\xe6\x1dpsw#\xb5\x9d\x1d\xbb\xf6\x1c\x62\xe6\xb4\x31\x94}]\xef\xec\\6\xdc\xf8\x1c\xb3\x64\xc1\xb9t\x11\x9c\x9d\xcb\x18\xfa\a\xa8S\xb3\x32{\xf7\xee\xa7x\xb1\xa2\x84\x84\x84\xb0z\xcd\xafth\xdf\x6\x13\x13\x13\xa3\xfd\xb3\x66ud\xe4\xc8\x61\x86\xed\x1c\x39r\xb0t\xc5\xaf\\\xbe|\x99\xb2\x65\xcb\x84{~Q\xe5\xee\xee\x81\x8dm\xd8\x87\xd5\x36\xb6\x36\xdc\xf9_h\x12\xe1\xf1\xe3'\0$H\x10\xdf\xa8M\xe2\xc4\xa1\xa3U\xbc\xbd\xbdppp\xa0\x45\xd3\xba\xacY\xbb\x9e\x84\x89\x12\xb1i\xf3\x36:ul\xc7\xf2\x15\xab(\\(\x1f\xe9\xd2\xa6\xa5X\xa9\xca,\x9a?\x83\xfb\xf7\xee\xd3\xbc\x65;\x8e\x1d=\x10\x66tH\xea\xd4\xa9\xa9^\xad\n\x89\x12&\b\xf7\\f\xcf\x9an\x94\xc4\x9a\x34q\x9c\xe1u\xd9\x32\xa5\xd9\xb6\x63\x37\xc7O\x9c\x34L\x89\x6\x1f\x7f\rMML\xb1\xb4\x30\xa7{\xb7.\0\x94*U\x8a\r\x1b\xb7R\xacX!\xda\xb4i\x5@\x81\xfc\xf9X\xbej\x3g\xcf\x9e#]\xda\xb4\x46\xb1\xde\xbbw\x8f\x87\x8f\x9eQ\xb7N-r\xe5\xca\x19\xe5\xbaw\x9d?\x7f\x81\x95\xae\x9b\xb8p\xf6(v\xafG\xf0\x38:f\xa1\x94s5N\x9e \xea\xd4\xa9\xc5o\x87\x7fg\xe8\xf0\xd0\xa9\x6\x9b\x35\xaeM\x85\n\xe5\xc3m\v\x90?\x7f^\xe6\xfd<\x85\x94)S\xe2\xed\xed\xcd\xc6\x8d[(_\xa9\x16\a\xf6n![\xb6\xac\0\xbcz\xe5g4\xc5[\x93\x86\x35\x31\x35\rM\xe6<}\xfa\x8cQ\xe3\xa6\xb2s\xdb:\xf2\xe7\xcb\v\x80\x9d\x9d\x1d\x95\xab\x35`\xf0\xa0\x1\xdc\xbbw\x8fjo\xed\v\xe0\x90\xe1\xbf\xfb\xe1\xa1\x9bq\x12*2\x7f\xfey\x8c\xdd{\xfq\xfc\x8f}\xe1\xd6\xc7\x8f\x17\x8f\x1f\xda\xb7\x30\\\xd3\xd2\xa5Kq\xe5\xca\x35\\\xd7\xac\x63\xc8\xe0\xff\xa6\x85[\xb9\xf4\x17*W\xeM.\xbd}\x1f\xbd\xb9\xee\xa7\xcf\xfc\xb7\xbeP@@@\x94?\x1f\x44\x44\x44$\xee\xd0H\x13\x11\x11\x11\x89\xab\x94\x18\x12\x91hgan\x8e\x63\x96\xcc\x86\xedT\xa9R\x92\x34\x89\x35^\xde\xde\x11\xees\xf3\xc6M|\xfd\xfc\xc9\x90%\xafQy\xa2\x84\xc6\xc9\xf\xab\xd7\xeb\x94\0\xa4O\x9f\x1e\x80\x97/^baa\xc1\x8f\x83z\xd2\xbb\xdf\x30N\x9e \x88\x88\x88\xc8\xb7GS\xc9\x89\x88\x88H\\\xf2\xf6\x97\x62\x94\x18\x12\x91\xcf\xe2\xdd\x35N\xde\x65\xf5z\xb4\xcb\xc9\x63\xfb\x31\x7f\xeb\x61\xfc\xbb\xa3u\xde\xf6nU\xf7\xee]\xa9_\xbf\x1e\xbf\x1d:\xcc\xe2%\xcb\x19 \xb5k\xd7\x8c\xb4m@`\xa0\xd1\xb6\xa9\x99\xa9\xe1\xbe\xe\xcf\xbbo\xed\xfd\xfb\xf7\xb9q\xeb\x7f\x38\xe5\xcem(\xfb\xd4\xcf\a\x11\x11\x11\xf9\xf6h\xc4\x90\x88\x88\x88\xc4UZcHD>\xbb\x37\xf\xc8\x3\x2\x2\feoFA<|\xf0\x10\a\a\a\xc3\xbf\x34i\xd2|\xd0\xb1\xed\xedS\xd3\xbcY\x13\xd6\xac^N\xca\x14\xc9\xd8\xb7\xf7@\x4\x31\x98\xe2\xff\xce\xc3\xfd\x4\t\x12\xf0}\x9b\xe6l\xdd\xba\x9d\x95\xab\xd6\x46\xf8\xf0\xfa\x8f\xa3\x7f\x92?o.\xea\xd6\xa9M\xa6L\x19I\x91\"9\0~\xbe~\x11\x9e_T\x95.S\x8a\xc7O<\xf9\xf3\xcf\x63\x86\xb2\a\xf\x1e\xb2\x61\xf3.\xaaU\xfb\xe\x80\xec\xd9\xb3\xe1\x94\xd3\x91\x9d;w\x1b\xda\x4\x6\x6\xb2i\xf3V~\xe8\xd8\x36\xdc\xe3\xde\xbe}\x9b\xd9\xbf,\xa1\xc7\xebi\xd8\x92'Of\x98\x92.00\b\xcf\xe7\xde\xe1&\xc1\0L0\xc1\xc7\xf7\xfd\xa3\xa1.]\xba\xc2\xed;\xf7i\xdd\xaa%9\xb2g'U\xaaT\x4\x5\x5\xb3\xf7\xc0\xd1\xa8\x9d\xfckQ\xbd\x86\x1f\xc3\xc4\xc4\x84\x9c\x39s\xd0\xb5K'\xd6\xba.\xe3\x8f\xe3g9\x7f\xfe\xe2{\xeb\xde\x96\x39S&\xae\xdf\xbc\xc3\xed\xdb\xff\x1a\xca\xdc\xdc\xdc\xb9~\xf3\xeY\xb3:F9\x96\x88\x12\x89\xaf^\xbd\xc2\xd7\xd7\xf\xbf\xb7\x46\xa0\x99\x9b\x9b\x91\x31\x63z\xa3\xb2\xb7\xf7\xf\n\n2:F``\x10\x7f\x9d\xbf@\xde\xbcN\xaf\xb7\x8d\x13-\x10:\x12\b\xc0\xc6:1i\xd2\xa4!y2[\xee\xde\xbbg\xf4\xf3\xe7\xe0\xe0\x10\xe9\x9aXQ\xe5\xe9\xe9\xc9\xf\x9d\xbaS\xa2\x44Qz\xbat\x8f\xb4\xed_\x17\xaf\x32l\xe4$\xc3vHH\b\xc7\x8f\x9f$\x7f\xfe\xbc\x91\xec\x65\xec\xf2\xe5\xab\xd8\xdb\xa5 C\x86\xf4\x46\xe5\x31yo\x89\x88\x88\x88\x88\x88\x88\x88|-4bHD>;kkk\x1c\x33\xa7\x63\xd3\xe6\xad$\xb6\xb6&E\xf2\x64\xe4\xc9\xe3\x44\xab\xe6\xf5\xe9\xd2\xad\x37#G\f&C\xfa\xf4\xdc\xbbw\x9f\xf8\xf1\xe3\x19\x46*D&00\x90\x1f\x87\x8d\xa4\x64\x89\xe2\xa4Nm\xc7\xc3\x87\x8f\xb8|\xf5&\xbdz\x86\x9dv\v w\xee\x9c\xec\xdc\xb9\x97\x92%K\x90(aBr\xe6\f\x1d=S\xbd\xdaw\x94\xad\x10\x9a\x10*T\xb0@\xb8\xfb\x66\xc8\x90\x9e\xa3\x13\x66\xb0r\xe5j2f\xca\xc8\x96-\xdb\0H\x96 \xd7\xaf\xdf\xa0\xd2wu\x18\x35| \xad[\xb7\x34\xaa+\xe7\xec\x8c\x8d\xcd,:w\xe9\x41\xb3\xa6\x8dI\x9c\xd8\x8aK\x97\xaf\xb0\x62\xf5\x46\xb6lX\x1\xc0\xe6-[\xe9\xdc\xad\x1f;\xb7\xae%w\xee\\\xd4\xa8U\x9f\xda\xb5\xaa\xe3\xe8\x98\x5\x42\x42\xd8\xb1s7\x97\xaf\xdc`\xc6\xb4\xc9\x4\a\aS\xe5\xbbZ8;\x97\xc6\xc9)\x17\x36\xd6\xd6\xb8\xb9{\xf0\xf3/\v\xe8\xdc\xa1%i\xd3\xa6\xc5\xc4\xc4\x84\x91\xc3\x6\xd2\xa3\xf7`,,,(T\xb0\0^\xde\xde\xfc\xfb\xef\x1d\x9a\x37\x33\xbe~\x8e\x8e\x8el\xd9\xb0\"\xcc\x34\x82\x11\xf1\xf4\xf4\xa4q\xd3V\x9c;\x7f\x5\x97\x1e]8u\xfa\x8c\xa1.c\x86\xf4\xa4L\x99\x32\xdc\xfd\x66\xcc\x9c\x45\xc1\x2\x5\xf8\xf3\xd8\x31\xce\xfe\xf5\x37\xd3\xa6M\n\xb7]x\xce\x9c=K\xf5j\x95\fS\x1\xc6\xf4\xbd%\"\"\"\xf2-\xf3\xf7\xf7\xe7\xfe\xfd\xfb\xbc\xf0\xf6& \xf0\xc3\xbf\xfc\xf6\xa5\xb0\x30\xb7\xc0*q\xe8\x97\xa2>d\xe4\xbb\x88\x88\xc8\xb7H\x89!\x11\xf9\xecLLL\x98?w\x16\xa3\x46\x8f\xa7{\x8f>\f\xec\xdf\x1b\a\a\a\xc6\x8d\x1d\xc5\xaa\xd5kX\xbc\x64\x39\x37n\xde\xa6P\x81\xbc\xb4i\xdd\"J\xc7\xf4\xf7\xf7'C\x86\xf4,Y\xb6\x82K\x97\xaf\x93%s\x6\xa6N\x1e\xcdw\xdfU\xe\xb7}\xe7N\x1dx\xfa\xf4)?t\xea\x41\xc3\x6\xb5\r\x89\xa1\xec\xd9\xb3\x91\xce\xc1\x8e\xf6\xedZE8R\xa2Z\xb5\xef\x18>\xf4\x1es~Y\x80\x8d\x8d\x35\xcd\x9a\x36\xa2\\\x99\xbb\xef=\xbf\xa8\xea\xdb\xa7\x17\xf6\xa9S\xb3\x66\xddz|}|\xa9Q\xa3*\xed\xbeoc4\x1d_\x85\n\xe5Y\xbfv\t+W\xba\xb2\x66\xdd\x46*Upf\xdd\x9a\x15$O\x1ev\xd4\xcf\xe5\xcbWX\xb1z\x3'\xfe\xdco(\xcb\x9e=\x1b\xcb\x16\xcd\x66\xfa\xcc\x39\xd8X'f\xd5\x8a\x45\x61\xa6L{\xa3\x62\xc5\n\f\xec\xd7\x8d\x41\x83G\x90\x33GV~\xc9\x95+\xdcv\x99\x32\x65\x64\xf9\x92\x39\xcc\x98\x39\x87\x9d\xbb\xf6R\xab\x66Uztm\x17\xe5\xf3\xfe\xd0k\xf8\xa1,--11\x81I\x93\xa7s\xf7\x9e;\x85\v\xe5\x63\xd3\xaf\xcbI\x9f>\x1d\xf7\xee\xdd\x8f\xb0\xee]fff\xcc\xfb\x65\x16s\xe7-`\xdc\x84)\xd8\xda\xdaP\xab\x66\x35Z\xb6h\x16\xe5X\xac\xac\xac\xc8\xeb\x94\x3\xfb\xd7\xc9\xb4\xb7\x39\x38\xa4\x61\xdb\xe6u,]\xba\x9c)Sg\xe2\xfd\xe2\x5\xc5\x8b\x15\x66\xf7\xf6u\x14(\x90\x1f\x80\x94)RP _.lll\b\t\t\xc1\xa5G\x17\xb6m\xdb\xc9\xd2\x65\xab\xb0\xb5\xb1\xa1T\xa9\xe2\xec\xdd\xb5\x19\a\x87\x34\x4\a\a3f\xf4\x30v\xed\xde\xc3\x82\x85K\xb9\xf3\xbf{\x14\xc8\xe7\x44\xbf\xbe.T\xab\xfa\x9d\x61\x84[\x83\x6\xf5\xb0Mb\x8b\xab\xeb:\xa6N\x9fM\xd6,\x99\xa8Y\xb3Z\x98\xf8\x92'O\x16\xee}\x16\x91?\xfe<\xc6\xb9\xf3W\0\xa8\xd3\xa0\x95Q\xdd\xaa\xe5s\xa9T\xb1\x82QY>\xa7\xec\xa4J\x95\x82\xbf\xff\xbe\xcc\xf2\x15k(\xe7\\\x8a]\xdb\x37\x90\x32\x45\xd4\xa7z\xd9\xbf\xff\x10=\xbaw6l\xc7\xf4\xbd%\"\"\"\xf2\xad\xf2\xf7\xf7\xe7\xca\x95+\x4\x5\x85\x1d\x81\xfe\xb5\t\b\f\xe0\xd9\xb3\xa7xyy\x91#G\xe%\x87\x44\x44$N3\xb9v\xcb-\xe4\xcd\xbc\xbaw\xdd\x1e\x91\x35S\xea\xf7\xec\"\"_\v_\xbf\xd0_\xde\xef\xba=z\xef\xfc\xd9o\xb7\x89\xcb\x9f\x5\x37n\xde\xa4\x64\x99\xaa\xfcyd7Y\xb2\x64\x8e\xedpD\xe2\x9c\xcaUj\xd2\xb8Q=\xda\xb5\v\x7fZ\xc4\xf7\xf1\xf0x@\x9e\x2\xa5\x38\xf6\xfb\x1e\x32\xbf^\x97KDDD\xbe]\xd7\xffq7\xfa;\xe6\x43\xfe\xee\xf9R\xc4VLw\xdd\x1e\x1\x91\xaf\xb5t\xfb\xf6m\x9e={\xfa\xb9\x42\n#\x85]:\x1ey\xfc/\xda\x8f\x9b$IR2f\xcc\x18\xed\xc7\x8d.Q\xb9\x36\xf2\x65\xfa\x9a\xaf\xdd\xd7\x1c\xbb\x88|\x98\xbbn\x8f\xb4\xc6\x90\x88\xc8\xdbv\xee\xd8M\xe9\x92\x85\x94\x14\x12\xf9J]\xbe|%\xdc\xf5\x85\x44\x44\x44\x44\xe4\xc3\xbd\xf0\xf6\x8e\xed\x10\x62\xc4\x8b\x17\xdf\xe6y\x89\x88\x88\x44\x95\x12\x43\"\"\xaf\xf9\xfa\xfa\xb2`\xf1r\x9a\x34j\x10\xdb\xa1\x88\xc8G*Y\xb2\x38G\x8f\xec\x35\xac/$\"\"\"\"\x1f\xefk^S(2\x1\x1\xdf\xe6y\x89\x88\x88\x44\x95\xd6\x18\x12\x11y-A\x82\x4\xfc}\xfe\x64l\x87!\x12\xa7\xed\xdd\xb3\xed\x93\xf6\x8f\x17/\x1e\xf1\xe2\xc5\x8b\xa6hDDDDDDDD\xbe=J\f\x89\x88\x88\x88\x88\x88\x88\x88H\xb4\xb9{\xcf\r\x80\xb4\xe\xf6\xb1\x1c\x89|i\x2\x2\x42\xd7\x42\xb6\xb0\x88\x99G\x92\x8f\x1e?\xc6\xc3\xe3\x1N\xb9s}\xd4\xfe\x17\xff\xbe\x44\xaaT)I\x99\xe2\xcb[gg\xc7\xce\xdd\0T\xaf\xf6],G\x12u~~~,^\xba\xc2\xa8\xac]\xdbV\xfa\x32\x9f\xc8\x17@\x89!\x11\x11\x11\x11\x11\x11\x11\x91p\xacY\xbb\x9eS\xa7\xcf\x46\xb9}\xf1\x62\x85iP\xbfn\fF\xf4\xe5\xbb{\xcf\x8d\x61#\xc6\x2\x30j\xc4\x90o:94c\xe6lC\x12\xecm\x85\v\x15\xa0I\xe3/s\x8a\xf2%KW\x2\xd0\xb6M\x8b\xcf\xdew@@ \xdd]\xfa\x90(Q\"\xa6N\x1e\x17#} t\xb0\xa1\xcd\xa8\x91\x43X\xb2t%\x8d\x9b\xb6\x2\xc0.U*<\x1e<`\xeb\xf6\x9d\xd4\xaeY=\xda\x63\xda\xb5{/S\xa7\xcd\x64\xe5\x8a\xc5\xd8\xa5Je(\xf\n\n\xa2o\xff!l\xde\xba\x9d)\x93\xc6~\xf2\xf4|w\xde\x19=haaN\x99\x32\xa5\x80\xd0{\xcau\xcd\xaf\xcc\x9a=\x17\x37ww\xe2\xc5\x8bG\x99\x32\xa5\x18=r(\xa9\xed\xec>\xa9\xdf\xf7\t\t\t\xc1\xdf\xdf?\xd2\x35\x9d\xe6\xce_\xc4\xc4I\xd3(V\xb4\x30\xcb\x96.0L\xfb'\xdf>%\x86\x44\x44\x44\x44\x44\x44\x44\x44\xa2\x81\xb9\xb9\x19S\xa7L\xe0\xfc\x85\x8b\x1c;~*N$\x86\xdc\xdd=\xb0\xb5\xb5%A\x82\xf8\xf4\xe8\xd6\xd1\xa8\xce\xce.\xa5\xa1\xcc\xdf\xdf\x9f\xa7O=\xbf\xb9\x91\x43o'\x85z\xbat\xfb\xe2\x13\x43\x15\x9c\x9d?[_\xd7\xaf\xdd\xa0\x61\xd3Vd\xcf\xe6\xc8\x9a\xd5\xcbX\xb2h\x1em\xbe\xff\x81\xc0\x80\0\x36oX\xc3\xb5\xab\xd7q\xe9\xd3\x9fVm\xda\xe3\xbaj)\x85\v\x15\x8c\x96~\x83\x83\x83Y\xb9j5\0\x35\xaaW#\xc5{\xd6\vz\xfc\xf8\x31\xdbw\xec\x8c\x96\xbe?\xd5\xf0\x91\x63Y\xbf\x61S\xa4m\xf2\x15,\x11ny\x83\xfaucl\xed\xa6\xf7\xf1\xf5\xf5\x65\xe2\xc4i\x14-R\x88\x35\xab\x97\xf1\xdboG\xb8p\xf1\"]\xbbv2J4\xd4\xadS\x8b\x1a\xd5\xab\x31\xfb\xe7y\xe4\xc9\x9d\x8br\xe5\xca\xd0\xb8i+&L\x98J\x95J\x15\x88\x1f?~\xb4\xc5\xb4s\xd7\x1e\xba\xf5\xe8\x43HH\b\x8d\x9b\xb4\x62\x8d\xeb\x32R\xdb\xd9\x11\x14\x14\x44\xbf\x1\x43\xd9\xb4y+\x93&\x8e\x8d\x96\xcf\xe9={\xf7\x31v\xfc\x64\xc3\xb6\xad\xad-\xe7\xcf\x1e\x3`\xfa\x8cY\xcc\x9a\x33\x8f\xd6\xad\x9aQ\xa6T)\x1e?}\xca\xcf?\xcf\xa3z\xcd\x6\xec\xdf\xb3\x95\xa4I\x93~r\xff\xe1\xf1\xf7\xf7\xa7i\xf3\xb6\x9c\x39{\x8e\xfe\xfdz\xd1\xa5S\x87p\xdb-]\xba\x92\xe0\xe0`\xfe GX\xb1\xee\xcd\x9a\x42N\xb9s\xd2\xbbg\xd7H\xdb\xce\x9d\xbf\x94s\x7f\x9d\xff\xa6\xd6\x1cz7)\xf4\x35h\xd1\xa2\xc9g\xe9' \x90\x1e\xbd\xfb\x91 \xa7i\xd3\x46\x31\xba\xce\xc9o\x87\xeq\xe5\xca\x35\x36\xae_\x8d\x8d\xb5\x8d\xa1\xbcx\xb1\"F\xed\xe2\xc5\x8b\xc7\xd4)\x13\xa8Y\xbb!\x9b\x36o\xa3i\x14\xee\xa5oY\xef^\xddh\xf7}\xabp\xeb\x86\r\x1f\x3\xc0\xa8\x91\x43\xc3\xad\xb7\xb1\x89\xbd\xb5\x9a\xca\x96-\xcd\x8a\x65\v\xe9\xd9{\0U\xab\xd5\xe5\xd7\x35+\xc8\x9a\xcd\x91s\xe7\xceS\xbfQs\x82\x82\x82\0\xd8\xb0i\v\x1b\xd7\xbb\x92\x37\x8f\x13\xd7\xaf\xdd\xa0\x41\xe3\x96$H\x10\x9f\xd5+\x97\x44\xdbt\x82\xdbv\xec\xc4\xa5g\x7f\xca\x97w\xe6\xe7\xd9\xd3\xb1\xb4\xb0`\xad\xebr\x9a\x34kM\xf9\x8a\xd5\xf1\xf3\xf3\x63\xe2\x84\x31\x34nX\xf\x80\xbf/]f\xef\xde\xfd\xf4\xee\xd5\xe3\xa3\xfbLl\x9d\x98\xc4\xd6\x89\xc3\x94\x9f>}\x6\x33SS\x9a\x37o\x1c\xa6}\xc3\x6u\xd8\xb2u\xc7G\xf7\x19\x99\xc0\xc0 \x16/^n\xd8\xbe\x7f\xdf\x9d\xad\xdbwP\xab\xc6\x7f\xd3\xf5m\xdd\xbe\x3\x97\x9e\xfd\xa9S\xbb\x86\xf\xc2:\xb1u\x8c\xad\xf3$_&%\x86\x44\x44\x44\x44\x44\x44\x44\x44\xbe@\xa9S\xa7\xe6\xaf\xf3\x17p]\xf3\xabQy\xb3\xa6\x8dh\xf4\xfa\xa1\x66lx\x93\x14\xf2\xf4|N\x86\xf4\xe9\fk\n\xbdq\xfd\x46\xe8Z\x1b\x63\xc7O1*\xb7\xb2J\xc4\xbfw\xfe\x17-\xc9\xa1\x64\xc9\x92r\xf3\xc6-\xf6\xee\xff\xcd\xa8\xbcr\xa5\xf2T(\x17\xf1zP\xd1!\xb2\x91\x42\x33\xa6M\x8c\xd1\xbe\xa3\x62\xc9\xd2\x95\x1c\x39z\xd4\xb0]\xc1\xd9\x99\x16-\x9a\xe0\xea\xba\x8e\xa1\xc3G\x1`\x9b\xd4\x86\x9a\xd5\xab\xb1r\xe5\x1a\xe\x1c:dh[\xa6T)\xa3\x91\r\x1fk\xcf\xde\x83\x64u\xccL\x81\xfc\xf9\xde\xdb\x36\x8fSn\xd2\xa7O\xcb\xefG\xff\x8c\xf3\x89\xa1\x34\xf6\xf6\xa4\xb1\xf\xff\xe7\"\xb1u\xe8H\xc4\x9c\x39\xb2\x7f\xce\x90\xa2\xacL\xe9\x92L\x9f\x32\x9eVm;\x12\x10\x14\xba\x66\xd3*\xd7\x35\x86\xa4\x10\x84&,V\xbb\xae#o\x1e'^\x5\xf8\xf3\xdc\xeb\x39sfO\x8b\xf6\xa4P\x85\xf2\xe5\x98\x33{\x9a\x61\x14P\x96\xcc\x19Y\xb3z\x19\xcd\x9a\xb7\x61\xe4\xf0!4iT\xdf\xb0\xcf\xc0\x41\xc3\xc8_ o\xb4\xf4\xff.?\xdfWXXZ`n\x16\x36\tk\x19/\x1e\xde/^F{\x9f\x41\x41\x41\xf4\xe9;\x90\xad\xdbw\xf2\xd3\xcc)\x94w.\xcb\xb0\x11\x63p\xe9\xd9\x1f\x80Z5\xaa\x1b\x92\x42\xb5k\xd5`\xca\xa4\xb1\x98\x85\x13\x9f|\xfb\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\xf9\0\xaf^\xbd\x62\xf3\xeboz\xd7\xa9U=\xd2\x85\xbd?\x85\xa9\xa9)\xe3\xc6\x8c\xc0\xc4\xc4\x84\xd5\xae\xa1S15o\xd6\x88\x31\xa3\x86\x63jj\x1a#}~-LMM\xf9\xa1\x63[01a\xef\xbe\x83\0T\xa9\\\x9e\x8e\xed\xdb\xc4\xe8{\xf3\x35N\x1f\xf7\x86m\xd2\xff\x46\xeex>}\x1e\xa3}\xdd\xbd{\x97\xcc\x99\x33Gy\x4\x42\xf6l\xd9qsw\x8f\xd1\x98\xe4\xcb\x14\x12\x1c\x1c-\xc7\xd9\xbbo?=\\\xfaQ\xa9\x62\x5\xe6\xcc\x9a\x86\x85\x85\xf1\x63\xef,\x99\x33rp\xffN\xac\xac\x12\x19\x95\a\xbeNb}\x8a\xd5\xae\xeb\x98\xfd\xf3|\xc3\xb6\x8dubv\xed\xd8\x84S\x9e\\\xbc|\xe9\xc3\xe1\xc3\xbfS\xae\\\xd9\xff\xfa\f\fb\xf7\xee}QJ\x9c~\x88\xd0\xa4\xd0 \xb6n\xdf\xc9\xcc\x19\x93\f#\x84\xa6L\x1a\v\x80K\xcf\xfe\x8c\x1f?\x15\x8f\a\xf\xa8]\xb3:S'\x8fSR(\xeSbHDDDDDDD\xe4\x3\xb4l\xdd\x9e\x13'O\x3\xb0q\xe3\x66\xd6\xac^\x16\x63S\xf0\x98\x9a\x9a\x32v\xf4pLL\0\x13\x13\xc6\x8c\x1c\x16\xebI\xa1\xb4\xe\xf6\x8c\x1a\x31\x84\x61#\xc6\xf2\xe2\xc5K\x6\xf4\xeb\x89\x9d]JC\xfd\x9b\x91\x42\x43\x6\xf5\x35\x94yx<\xe4\xc7\xe1\x63\xb1\xb5\xb5\x89\xb6u\x86LMM\xf9\xa1\x43\x9b\xd0\xf7\x6\x13:\xb6o\x1dm\xef\xcd\x8c\x99\xb3\xf9\xf7\xce]\xa3\x11@_KR\xa8m\x9b\x16\xe1\x8e\xfa\xa9Z\xa5\ncF>\xc7\x36\xa9\rU\xab\x84\xae\x87\xd2\xa2\x45\x93\x18Yw\xc8\xdc\xdc\x1c//\xaf(\xb7\xf7\xf5\xf5\xc1\xc2\\\x8f)\xdf\xf0\xf\b\xe0\xe6\xcd[Fe\xde^/\0\xb8|\xe5\xaaQy\x96,\x99?i}\x9c\xe8r\xe8\xd0\x11z\xf7\x1b\x8c\xad\x8d\r\x16\x66\xa1\xd7\xb2y\xd3&l\xdc\xb4\xcd\x30j\xc8\xdc\xdc\x8c\x66M\x1b\x1\x10\xcf\xc2\x12\x1bk\x1bz\xf7\x1b\xcc\xb4)\xe3?y}\xa1\xdf\xff\x38\x46\xe5J\x15\x98\xfdShR\xe8\xea\xd5k\x4\x6\x5\x91;WN6m\xd9\x46\xad\x1a\xd5\fI\xa1\x63\xc7O\x92!C:R\xdb\xd9}R\x9fod\xce\x9c\x89Z5\xaa\x1a\xb6\xe3'H\0\x84\x8e\x86\xab^\xed;z\xf5\x1d\xc4\xe8QC)[\xba\x14\xf\x1e>f\xca\xd4\x19\\\xb8\xf8\x37]\xbbt\x8c\x96\xfe\x43\x42\x42\xf0\xf2\xf6\x62\xf8\x88ql\xd9\xb6\xc3()\x4\xa1\xeb\xe4\x8d\x1e\xf9#\x1b\x37m1$`G\x8f\x1a\xa6\xa4P\x1c\xa7O\\\x11\x11\x11\x11\x11\x11\x11\x91(rsw7$\x85\0\x8e\x9f\x38\x85\xbb\x87\a\xf6\xa9S\xc7X\x9f\xa6\xa6\xa6\x8c\x19\x35\xdc\xf0\xfaK\xf0vrh\xdd\xfa\xcd\xf4\xe8\x16\xf9\x3\xceu\xeb\x37\x13\x18\x14\x18mI\xa1\x37LMM\xe9\xd8\xbe\x8d\xe1ut\xb9{\xcf\xcd\xe8\xc1\xfc\xd7\x92\x14\x8a\x8c\xb9\xb9\x19-[6\xfd,}e\xc9\x92\x99-[w\x10\x14\x14\xf4\xde\x87\xcf\xc1\xc1\xc1\\\xbdv\x9d\n\xe5\x9d?Kl_\x83\x87\xf\x1eR\xb5z\xddp\xeb\xde-\xff\xe3\xc8~\x1c\x1c\x62o\xbd\x31\x80\xc3\x87\x7f\xa7\xf5\xf7?\x90?\x7f^~\x99\x33\xc3\x90p\xc9\x9f?/\x1b\xd6\xad\xc2u\xcd:LLLh\xda\xb4\x31y\xf3\x38\x1\x90\x35\x9b#\xbbwm\xa2K\xb7^\xb4l\xdd\x9e\xe5K\xe6S\xb6l\xe9\x8f\x8e\xa1R\xf9r\x14/^\f\v\vs<==i\xd2\xbc-\xb3\x7f\x9a\n\xc0\xd6m;\xb8|\xe9\nC\x6\xf7\xe7\xf6\xbfwh\xdb\xae\x13\xbbwn\xfe\xf4\x13\x7f\xadh\x91\x42\x14-R(L\xb9\x89\x89\t\x13\xc7\x8f\x66\xf8\xc8\xb1t\xeb\xde\xc7P\xee\xe0`O\x8e\x1c\xd9\x18\xf2\xe3(2g\xce\x8c\x63\x96L\x1f\xdd\xb7\xbf\xbf?M\x9b\xb7\xe5\xf4\x99\xb3\x98\x9a\x9a\x86I\n\xbd\x91(QB\n\x15,\xc0\xe9\x33g)\\\xa8`\x98\x91S\x12\xf7(1$\"\"\"\"\"\"\"\x12\x45\xc9\x92&\xc5\xd6\xc6\x6\xcf\xe7\xa1Sq\xd9\xda\xda\x92,i\xd2\x18\xef\xf7KI\b\xbd-\xad\x83=\xe3\xc7\f'iR\xdb\xf7\xb6\xed\xd4\xb1\rO\x9fz\x1a\x8d,\x8a.1\xfd\xde|\vI\xa1\x37V\xae\\\x3\x10#\xa3\x84\xdeV\xa7v\r\x96-_\x85\xab\xeb\xaf\xef\xedk\xdd\xfaM<|\xf8\x88\xda\xb5j\xc4hL\x12s\x8a\x16-L\x1a{{,-,H\x95\x32%\xfb\xf\xfc\xc6\xf9\xf3\x17\xe8\xd6\xb5\x13\xf9\xf3\xe7%\x7f\xfe\xff\xd6\xf0y\xf5\xea\x15\xb3\xe7\xcc%_\xde\xbc\x38;\x97\xc6\xc2\xdc\x9c\x34i\xd2P\xacX\x91O\x8a\xa1L\x99R\x86\xd7\x9e\xcf\xbdx\xf6\xec\x99Q\xfd\xcd\x7f\xfe\x1\xc0\xc3\xe3\x1\xbe\xbe\xbe\x9f\xd4\xd7\x87H\x9c\xd8\x8aiS\xc6\xd3\xa7W7\xae\\\xbd\x8e\xad\xad\ry\xf2\x38\xe1\xe7\xebK\xcb\xd6\xedi\xd2\xac\x35kV/\xfb\xe8\xe4\xd0\xed\x7f\xfe\xe5\xf4\x99\xb3\0\xa4L\x91\"\xdc\xa4\x10\x84&\xa9\\W-\xe1\xc6\xcd[8f\x89\xfa\x34\x8f\xf2\xedRbHDDDDDDD$\x8a\xe2\xc5\x8b\xc7\xe2\x45\xbf\x30\x65\xeaLLLL\xe8\xdb\xc7%\xc6\xd6\x18\xfa\x1a\xbcI\xf4<~\xf2\x84Y\xb3\xe7\xd3\xb5s{C\xdd\x83\a\xf\xf9y\xee\"\xbaw\xebH\xf2\x64\xc9\x62$)\x14\xd3\xbe\xa5\xa4\x10\xc0\x81\x43\x87\x80\x98O\f\x15\xc8\x9f\x8f\xa6M\x1a\x32\x61\xca\x34\xf2\xe5\xcf\x43\xee\\9\xc3mw\xe9\xf2\x15\xc6\x8f\x9fL\xfdzu(\xfe\x89\x89\x81\x37LMMi\xd6\x34\xf4\xfc\xcc\xa3\x30=]\xf2\xe4\xc9i\xd1\xbc\x19\0\xab]\xd7\x44K\f\x9f*uj;\xfe:\xf3\xa7QYw\x97\xd0\xa9\x19g\xcd\x9c\x62Tnmm\xfd\xd9\xe2\x8aH\xfc\xf8\xf1\x19\x30\xa0\x37=\\\xfaR\xbc\x64y<\x1e<\0`\xc7\xce\xddt\xec\xd8\x9e&\x8d\xea\x3\xb0\x66\xedz\xe6/X\xc4\xad\x7f\xfe\x5\xc0.U*<\x1e<`\xd6OS\xa2\xe5s\xf4\xce\x9d\xbb\xa4O\x9f\xf6\x93\x8f\xf3\xa1\xce_\xb8\xc8\x89\x13\xa7\"\xac\x8f\x1f/>\xadZ5#M\x9a\xff\x46vYZX\xb0\x62\xd9\x42\x43rh\xdd\x9a\x15\x64\xce\x94\xe1\x83\xfb\xce\x94\x39\x13%K\x14\xe7\xd8\xf1\x13\xb4\tg\n\xc9\xb7YZZ\x92+g\x8e\xf\xee\x43\xbeMJ\f\x89\x88\x88\x88\x88\x88\x88\x88|\x80\x82\x5\xf2\xe3\xbajil\x87\xf1\x45\xf1\xf3\xf3\xe7\x7fw\xef\x31\xe4\xc7\x31\x86)\x8a\x86\xe\x1bK`P ~~\xfe\xb1\x1c\xdd\xc7\xb9r\xf5*\x17\xff\xbe\xf4\xcd$\x85>\xb7\xc1\x3\xfbr\xe9\xd2\x15\xea\xd6oJ\xbf\xbe=\xa9]\xab:\xa9R\x86&\a\x1f<|\xc8\xf6\x1d\xbb\x99\x38i\x1a\x99\x33\x65\xe4\xc7!\xfd\xa3\xad_\x13\x13\x13,>`\xcd\x9d\xb7\xdb\x7f)\xa3(\xcc\xcc\xccH\x92$\x89Q\x99\x85\x65h\x8c\xef\x96\x7f)j\xd5\xa8\xc6\x8a\x15\xae\x38\xa4\xb1\xa7\x63\xc7\xef\xf1\xf2\xf2\x66\xf8\xc8\xb1\x8c\x19\x37\xd1\x90\x18\x1a;n2\xf6iR\xe3\xbaj)66\xd6\xcc\x9f\xbf\x18\x37wwjV\xaf\xf6\xc9\xfd\x9f\x38y\x9a\x89\x93\xa6\xb1q\xfd\xeaO>\xd6\x87:s\xe6/\xa6\xcf\x9c\x1d\x61}\x12\xdb$\xb4j\xd5,L\xb9\xb5\xb5\x35+\x96-d\xec\xb8I$K\xf6q\xd7\xd5\xc2\xc2\x9c\xd5+\x17\x13\x10\x10\x88\x85\x85\x1e\xf5K\xd4\xe9n\x11\x11\x11\x11\x11\x11\x11\x11\x89\xc0\x8d\x9b\xb7\xa8Q\xab\xc1\a\xef\x93-[\xd6\x18\x8a\xe8\xcb\xe4\x90&\xb5\x61\xcd\xa1\x7f\xef\xfc\xf\0[[\x1b\x46\x8d\x18\x82\x43\x9a\x98[\x7f)&\x5\x6\x6\x61nn\xc6\xfe\x3\x87\xd8\x7f\xe0\x10\x10\xbav\xce\x8ci\x13\x63\x37\xb0\xaf\x84\xb5\xb5\x35\x1b~]\xc5\xd8\xf1\x93\x19;n\x12\x63\xc7Mb\xc6\xf4I\xc4\x8f\x17\x8fN]\\\0h\xde\xac\x11\xc3\x7f\x1c\x1c\xa7G\xdd}+LLLX\xeb\xba\xcchM\xa9\xae]:\xd0\xbdG_\xbc\xbc\xbc\0\xf0\xf2\xf6\x62\\\xd7\xe1\x94(^\x14\x80\x99\x33&\x13\x14\x14\x14-\t\xb9\xed;w\xe1\xe3\xeb\xf3\xc9\xc7\xf9\x18\xdf\xb7m\xc9\xf7m[~\xd4\xbe\xd6\xd6\xd6L\x9c\x30\xe6\x93\x63PRH>\x94\xee\x18\x11\x11\x11\x11\x11\x11\x11\x91p\x14.T\xe0\xa3\xf6\xcb\x96-\xebG\xef\xfb\x35K\xeb`oH\xe\x1\x8c\x1a\x31\x84\xb4\xe\xf6\xb1\x1c\xd5\xc7\x89\xe8\xfa}\xad\xe7\xf3\x46\x99R\xa5\xde\xdf(\x1aYZZ2r\xf8\x10\xbeo\xd3\x8a\xfd\a\x7f#C\xbat\x98\x99\x9b\x31t\xc8\0*\x94w&S\xc6\f\x9f\x35\x1e\x89Yo'\x85\0\xb2\x64\xce\f@\xc1\xc2\xff\xddwY2e\x8et\x9f\x8fU\xb4p!\xecR\xa5\x2\xc0:\xb1\x15\xadZ5\xc3\xce\xce\xe\x80\n\xce\xce\x86vvv\xa9h\xd5\xaa\x19\xd6\x89\xad\0\xa8Y\xa3\x1a\xe9\xd3}\xfe\xe9\xe7\x44\x62\x9b\xc9\xb5[n!i\xedS\0p\xd7\xed\x11Y3}\x9d\xdf\xe2\x10\x91\xb0|\xfd\x2\x81\xd0\x9f\xed\x37?\xe7\x11y\xbb\x8d>\vDDDDD\xe4kp\xfd\x1fw\xa3\xbf\x63>\xe4\xef\x9e/El\xc5t\xd7\xed\x11@\xa4}\x9f={\xe6\xe3\x8e}\xcf-\xf4\xd8\x9f\x98\x44Ia\x97\x8eG\x1e\xff\xfb\xa4\x63\x44\xa4@\x81\x82\x31r\xdc\xe8\x10\x95k#\xe1{\xfc\xf8\x31\xf\x1e>$W\xce\xf0\xd7\x34z\x9fK\x97/\x93\x32\x65JR$O\xfeQ\xfb\xc7\xe4\xb5\xdb\xbdg\x1f\0\xdfU\xa9\x14\xed\xc7\x86\x98\x89\xfd\xd5\xabW,[\xbe\xca\xa8\xacu\xab\xe6\x1a!&\x12\xcb\xee\xba=\xd2\x88!\x11\x11\x11\x11\x11\x11\x11\x11\x89>_\xfb\xa8\x1a\xf9z%O\x9e\x9c\xe4\x1f\x99\xd4\x1>:\xa1\xf4\x39\xc4TB(&\xc5\x8b\x17\x8f\x8e\x1d\xbe\x8f\xed\x30\x44$\x1c\xa6\xb1\x1d\x80\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88|\x1eJ\f\x89\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\xc4\x11J\f\x89\xc8'Ii\xef\x18\xe9\xbf\xad\xdb\xb6G\xe9\x38>>>xyy}P\xdf\x95\xab\xd4\x64\xd1\xa2%Qn\xbf\x62\xe5*\x8a\x97,\xf7\x41}|\f///|||\f\xdb\x81\x81\x41|\xdf\xee\a\x96-[\x11\xe3}C\xe8\x9c\xca\xcbW\xac\xe2\xfbv?\x90\xaf@\t\x1a\x34j\xc6\xdau\xeb\t\b\b0jw\xec\xf8\t\xda\xb5\xef\x44\x91\x62\x65\xe8\xd7\x7f\x10\x37n\xdc\x8c\xf0\x98\x19\xb3\x38\x45x\x8d\xaf]\xbb\x1e\xd3\xa7$\"\"\"\"\"\xb1\xc0\xc2\xdc\"\xb6\x43\x88\x11\x16\x16\xdf\xe6y\x89\x88\x88\x44\x95\xd6\x18\x12\x91O\xb2\x65\xc3\x7f\xc9\x8e\xbd{\xf7\xb3`\xf1*~]\xf3_\xb2&}\xfa\xf4Q:\xce\xd2\x65+8t\xe8\b\xeb\xd6\xaez\x7f\xe3/\\\xfb\xe\x9dqv.C\x97\xce?\xc4J\xffG\x8e\x1c\xe5\xcf?\x8fS\xbd\xfaw4o\xd6\x98K\x97\xae\x30r\xf4\x44\x1e?~L\xd7.\x9d\0\x38|\xf8\b\x1d:\xb9\x30lH?\x9a\x34n\xc0\xee=\xfb\xa8Y\xa7\x31;\xb6\xfeJ\xe6\xcc\x99\xc2\x1cs\xf5\xca\x85\x10\x12\x62T\xd6\xb5{\x1f\xee\xb9=\f\xb7\xbd\x88\x88\x88\x88\x88|\xfd\xac\x12'\xe6\xd9\xb3\xa7\xb1\x1d\x46\xb4\xb3\xb2J\x1c\xdb!\x88\x88\x88\xc4*%\x86\x44\xe4\x93\x14/^\xcc\xf0\xfa\xf6\xbfw\xb0\xb0\x30\x37*\x13\x30\x37\x37\x63\xf1\xa2y\x9f\xad\xbf:ujQ\xaf^\x1d\xc3v\x85\n\xe5\xb1\xb7O\xcd\x88\xd1\x13\xe8\xdc\xa9#\xa6\xa6\xa6\x8c\x9f\x38\x95\xce?\xb4\xa5\x45\x8b\x66\0\x94+W\xeO\xcf\xe7,_\xbe\x92\x91#\x87\x85\x39\x66\xf1\x62\x45\x8d\xb6}}}\t\xe\xe\x61\xd6\x8c\xf1\x98\x9b\xeb\xbf\x12\x11\x11\x11\x11\x91\x8f\x95\xd6>\xc5\x17\xdbo\x9a\x34i\xf0\xf2\xf2\"((\xf0\x33\x44\x14\xd6#\x8f\xff\x45\xfb\x31\xcd\xcc\xccI\x93&M\xb4\x1f\x37:\xc5\xd6=!\x9f\xeek\xbev_s\xec\"\xf2\xe1\x34\x95\x9c\x88|\x16\x8f\x1f?f\xd4\xe8q\x94*S\x91\x6\x8d\x9a\xb1\xee\xd7\xf5\x4\a\a\x3\x30o\xfe\x42\x46\x8c\x9e\xc2\xa1\xdfO\x92\xd2\xde\x91\xe6-\xda\0\xb0o\xff\x1\xbau\xefI\x91\x62\x65\xa8R\xb5\x16s\xe7\xce\xc7\xcf\xcf/\xca}\xba\xb9\xb9\x33h\xf0\x8f\x14/Y\x8e\x9e\xbd\xfa\xb2y\xcb\x7f\xd3\xda\x5\a\a\x93\xd2\xde\x91\x1d;w\x19\xcan\xdf\xbe\x1d:5\xda\xf5\xd0\xa9\xd1\xa6L\x99\xce\x84\x89\x93Y\xbat9U\xaa\xd6\xa2_\xff\x41\xf8\xfa\xfa\xe2\xba\x66--[}O\x9e\xfc\xc5h\xd0\xa8\x19;v\xfcw\x8c\xe6-\xdap\xe8\xf7\x93\x8c\x18=\x85\x94\xf6\x8e\xcc\x9b\xbf\x10\b;\xed\x9d\xbf\xbf?\v\x17.\xa6v\xdd\x46T\xa8X\x8di\xd3g\xf2\xe2\xc5\vC\xfd\x94)\xd3\x19\xfa\xe3\b\xa6L\x9d\x41\x95\xaa\xb5\xa8^\xb3\x1e\xeb\x37l$\xe4\xf5\xa8\x1dww\xf\xea\xd6k\xcc\xfe\xfd\a\xc3\x9c\xb7\xa9i\xd8\x8fv???R\xa5H\x8e\xa9\xa9)/_\xfap\xf6\xaf\xcb\x14,\x90\xdfPonnF\xd5\xef*\xf3\xcb\x82\x15\xf8\xfb\xfb\xbf\xf7\xbd=\xf8\xdb!\x9e{yS\xa5r\xc5p\xeb\xaf]\xbfN\xef>\xfd)T\xa4\x34\xc5K\x96\x63\xf0\x90\x61\x61\xa6\xb2\x13\x11\x11\x11\x11\x91/\x9b\xa5\xa5%9r\xe4 I\x92\xa4_\xfd\xf4k\x16\x16\x16$I\x92\x94\x1c\x39r`ii\x19\xdb\xe1\x88\x88\x88\xc4*}\xcd[Db\x9c\xb7\xb7\x37u\xea\x35\xa1l\x99\x92\x8c\x1b\x33\x9c\x7f\xef\xfc\x8f\x1\x83\x46\xf2\xf4\xc9S:u\xeaH\xad\x9a\xd5\xd9\xbam'\xa7\xce\\\xe4\xe0\xde\xcd\xc4\x8b\x1f\xf\x80\xabW\xae\x92+gN\xea\xd6\xad\x8d\x97\x97\x17\x43~\x1c\x43pHH\x94\xa6h\xf3\xf4\xf4\xa4\x46\xad\x6T\xa9\\\x9e\t\xe3\x46\xf2\xbf\xbbwY\xbdv\xcb\a\xc7>m\xe6|\xea\xd5\xfe\x8e\xe\xed\xdb`gg\x87\x89\x89)\xe7\xce\x9d\xa7R\xa5\n\xb4k\xd7\x86\xabW\xae\xd2\xb6\x43\xf\xb6lXA\xf1\xe2\xc5\x18\x31\x62(\xfb\xeV\xa5pA'&\x8e\x1fM\xb2\x64I\xc3\x1c\x33$$\x84\x81\x83\x86r\xff\xbe;=\xbau\xc2\xcf\xef\x15\x93\xa6\xcc\xe0\xaf\xbf.\xb0t\xc9\x2LMM\t\xe\tf\xfe\xa2U\f\x19\xe0\xc2\xa0\x1}8s\xf6\x1c]\xba\xf y\xf2\xe4\x38\x97-\x83\x97\x97\x17\xa7\xce\\\xe0\x7fw\xef\x46\x18\xfb\xa5\xcb\x97y\xf6\xcc\x93\xcb\x97\xaf\x30\xe3\xa7\xb9,Z0\x1b\x80\x4\t\xe2\x93<\x99-\xf7\xdd\xdc\x8c\xdao{\x9d\xe0z\xfa\xf4\x19vv\xa9\" \xbe/\xf1\xf3\xf3# 0\x80\xe0\xe0\x10%\x85\x44\x44\x44\xe4\x8b\x17\x12\x12\x42pp\b\x1\x81\x1\xf8\xf9\xf9\xe1\xe3\xfb\xf2\xbd\xcf\x45\x95\x18\x12\x91\x18\xe7\xe4\x94\x8b}\xfb\x7f\xc3\xff\xad\x64\xc8\xe5+W\xb1\xb5\xb1\"m\xda\xd0\x11@&\x98\xe0\xe3\xebg\xa8\x7f\xf2\xe4\t[w\xec\xa7y\xf3&\xe4\xcf\x97\x97\xd4\xa9Ss\xe9\xd2\x95(\xf7\x99;wN\xf6\xee\x33\xee\xf3\xdc\xb9\xf3\xbc\xf4\xf1\x5\x42\xa7SK\xe7`\xc7\xcd\x9b\xb7\f\xf5\xfe\x1\x1\xef=\xee\xa5KW\xb8}\xe7>\xad[\xb5$G\xf6\xec\xa4J\x95\x8a\xa0\xa0`\xf6\x1e\x38jhcbbj\xd4\xef\xbb\x32g\xca\xc4\xf5\x9bw\xb8}\xfb_C\x99\x9b\x9b;\xd7o\xde!kV\xc7(\x9f\xe3\xcb\x97/\xc3-\xf\f\f\xfb\xc1\xef\xeb\xeb\xc7K\x1f?\x92$\x89xt\xd6\x92\xa5+\xe9\xd3\xbb\x87!\x1\xe5\xe7\xf7\x8a\xa0 \xe3\x84\xde\xd6\xad\xdb\xc9\x95#\v\xc5\x8a\x46>B\xca\xc4\xc4\x84\x9c\x39s\xd0\xb5K'\xd6\xba.\xe3\x8f\xe3g9\x7f\xfe\x62TNKDDDD\xe4\xb3{\xf5\xea\x15\xbe~~\x4+\x11$\"\"\"_\xb9\xe0\x90\x10|\xfd\xfcx\xf5\xeaU\x84m4\x95\x9c\x88\xc4\xb8\x86\r\xea\x31k\xce\x2\xfa\xf4\x1d@\xc3\x86\xf5y\xf6\xf4\x19#GO`\xcc\xa8!$J\x94\b\x80\x8c\x19\xd3s\xf2\xf4\x5\xf6\xed?\x80\x8d\xb5\x35\xf9\xf3\xe7#c\xfa\x34,^\xbc\x8c\xc0\xc0@\xbc\xbc\xbc\xd8\xb3\xffw\xa3\xe3\xa6H\x91\x8c\xbf/]\xe6\xf2\xe5+\xe4\xcc\x99\xc3\xa8\xae\x41\xfd\xbaL\x9f\xf9Kh\x9f\r\xea\xf1\xe4\xc9SV\xban2j\xd3\xb8\x61]V\xacZ\x8b\x9d]*\x92'OF\xd3\x96\xef_\xbb(M\x1a{\0\xe6\xfc<\x97\xf2\xe5\x9d\xb9~\xfd\x6\0\xed\xda\x34\x31\xb4\xc9\x9d;';w\xee\xa5\x64\xc9\x12$J\x98\x30LlE\x8b\x16\xa1\x42\xb9\x12t\xee\xea\x42/\x97nXZZ\xf0\xcb\xdc\x5\xb4lV\x8f\xbcy\xf3\x44\xe9=\xbd~\xfd\x6\x95\xbe\xab\xc3\xa8\xe1\x3i\xdd\xba\xa5Q\xdd\x98\x31\xe3y\xe6\xe9I\x89\x12\xc5I\x91<9\xde\xde\xde\xacY\xb7\x9e\xc2\x5\x9c(]\xaa$\0s\xe7-\xc0\xc6\xc6\x9a\xd4\xa9S\xf3\xf8\xd1\x63V\xbb\xae\xc3\xd6\xd6\x86Z5\xab\x3\xe0\xe7\xe7G\xe5\xefj\x91=\x9b#\xf3\xe7\xcd\x1\xc0\xc7\xc7\x87\x9f\xe7-f\xc8\xa0\xbe\x61\xa6\xd7{\xdb?\xff\xdc\x66\xcd\xda_)Z\xb4\x30\xb6\xb6\xb6\x9c:y\n33S\xd2\xa5K\x1b\xa5s\x13\x11\x11\x11\x11\xf9\x9c^\xbdz\x85\x7f\xe0\xfb\xbf$&\"\"\"\xf2\x35y\xf3\xfbM\xbcx\xf1\xc2\xd4i\xc4\x90\x88\xc4\xb8\x94)S\xb2{\xc7\x46,--\xe9\xddg\x10\x1b\x37oe\xc2\xb8\x91\x34j\xd8\xc0\xd0\xa6\x62\xc5\n\f\xec\xd7\x8d\x41\x83G0{\xce\\\xfc\xfd\x3X\xbax.A\xc1\xc1\xf4\xec\x35\x90\x3\a~c\xf2\xf8\x61\x46k\f\xf5\xe9\xed\xc2_\xe7\xff\x66\xf4\xd8\ta2\xe0\xa9R\xa5\x62\xf7\x8e\x8d\0\xf4\x1b\xf0#\xa7\xcf\x9c\x65\xe2\xb8\x1f\x8d\xf6\xef\xd2\xe5\a\x1a\x36\xa8\xcd\xd4\xe9\xb3X\xb6|\x15\x33\xa6\x8e!e\x8a$\x91\x9eK\xa6L\x19Y\xbe\x64\xe\x7f\xfcy\x9c\xbe\xfd\x6\xe3\xe1\xe1\x41\x8f\xae\xed\f\t.\x80\xce\x9d:\x90+Wv~\xe8\xd4\x83-[\xb7\x85\x39\x86\x99\x99\x19\xf3~\x99\x45\xf9re\x18\x37\x61\n3~\xfa\x99*U*1~\xdc\xe8(\xbf\xa7VVV\xe4u\xca\x81\xfd\xeb\x44\xd5\xdb\x9a\x36mL\xc6\x8c\x19\xd8\xb8q\v\xdd\\\xfa\xb1l\xf9*\xca\x96.\xc9\xb2\xa5\vI\x9c\x38t]\xa2\x94)R\xb0\x63\xc7nz\xf4\xec\xcf\xae\xdd{\xa9]\xbb\x6\v\xe6\xcd!A\x82\x4\0\x98\x9b[\x90\x33G6\xb2\x65\xfbo\x4\xd3\xc1\x83\x87\xf0\xf6~I\x95\xca\x15#\x8d\xcd\xd2\xd2\x12\x13\x13\x98\x34y:-[w\xe4\xd8\x89Sl\xfau9\xe9\xd3\xa7\x8b\xf2\xf9\x89\x88\x88\x88\x88|\xe\x81\x41\x81J\n\x89\x88\x88\xc8\x37\xcb?0 \xdci\xe5L\xae\xddr\vIk\x9f\x2\x80\xbbn\x8f\xc8\x9a)\xf5\xe7\x8eMDb\x88\xaf_\xe8\xf\xfd]\xb7G\xbc\xf9\x39\x8f\xc8\xdbm\xf4Y \"\"\"\"\"_\x83\xeb\xff\xb8\x1b\xfd\x1d\xf3!\x7f\xf7\x84\x84\x80\x8f\xefKM\x1f'\"\"\"\xdf\x34S\x13\x13\x12&L\xc4\x9b\xd5\xcb\xef\xba=\xd2\x88!\x11\x11\x11\x11\x11\x11\x11\x89{\x2\x83\x3\x95\x14\x12\x11\x11\x91o^pHH\x98QCJ\f\x89\x88\x88\x88\x88\x88\x88H\x9c\x13\x14\x18\x14\xdb!\x88\x88\x88\x88|\x16\xef\xfe\xde\xa3\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc4\x39\x41\xc1\x61\xe7\xdb\x17\x11\x11\x11\xf9\x16\xbd\xfb{\x8f\x12\x43\"\"\"\"\"\"\"\x12\xe7h\x16\x39\x11\x11\x11\x89+\xde\xfd\xbdG\x89!\x11\x11\x11\x11\x11\x11\x11\x89sB\x94\x19\x12\x11\x11\x91\x38\xe2\xdd\xdf{\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x89#\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\xf9H\xde\xde\xde,\\0\x8f\xa2\x85\n\xf0\xe8\xe1\xc3H\xdb\x9e?\xff\x17\x43\x6\xf\xa4\xfaw\x95\x19\x37v4\xeenn\x9f)J\x11\x11\x11\x91\xff(1$\"\"\"\"\"\"\"\xf2\x81|}}\xd9\xb4q\x3\xb5\xaaWe\xfa\xd4)\xbcx\xe1\x1di\xfb\x33\xa7O\xd1\xba\x45s2g\xce\x42\xff\x81\x83y\xee\xe9\xc9\xf7m[\xf1\xf0=\xc9$\x11\x11\x11\x91\xe8\xa6\xc4\x90\x88\x88\x88\x88\x88\x88\x88\xc8\a\xba|\xf9\x12\x1b\xd6\xff\xca\x88QcX\xe5\xba.\xd2\xb6\xc1\xc1\xc1\xcc\xfai&=\\z\xf2}\xbb\xf6\x94uvf\xe4\xe8\xb1\xd8\xda\xd8\xb2m\xeb\xe6\xcf\x14\xb1\x88\x88\x88H(%\x86\x44\x44\x44\x44\x44\x44\x44\x44>P\x81\x2\x5Y\xb6\x62\x15\x65\x9d\x9d\xb1\xb4\xb4\x88\xb4\xed\xad\x9b\x37\x39u\xf2\x4\xe5\xcaW0\x94\xc5\x8f\x1f\x9fZu\xea\xb0|\xe9RBBBb:\\\x11\x11\x11\x11\x3%\x86\x44\x44\x44\x44\x44\x44\x44\x44>\x90\x89\x89\tfffQj\xfb\x66\xba\xb8\x14)R\x18\x95\xa7M\x9b\x8e\xc7\x8f\x1f\xe1\xed\x1dv\x1a\xba\\\xd9\x1d?=H\x11\x11\x11\x91p\x98\xc7v\0\"\"\"\"\"\"\"\"\xdf\xb2\xa7O\x9f\0\x10/~|\xa3\xf2\x44VV\0\xbcx\xe1\x8d\xb5\xb5u\x98\xfd\"J\xe]\xbaz#\x9a#\x14\x11\x11\x91\xb8\x44\x89!\x11\x11\x11\x11\x11\x11\x11\x91\x18\x64\x63\x63\x3\x80\xaf\xaf/\x16\x16\xffM;\xe7\xeb\xe3\x63\xbbL7\x9e\0\0 \0IDATT\xff.%\x80\x44\x44\x44$&h*9\x11\x11\x11\x11\x11\x11\x11\x91\x18\x94\"EJ\0\x1exx\x18\x95\xbb\xbb\xbb\x93&\x8d\x3\x89\x12Y\xc5\x46X\"\"\"\x12G)1$\"\"\"\"\"\"\"\x12\xcd|^\x8f\x6\x2p\xcc\x9a\x95\xec\x39r\xb2\x7f\xff>CY`` ;wl\xa7U\x9b\x36\xb1\x10\x9d\x88\x88\x88\xc4\x65\x9aJNDDDDDDD$\x1a\xdd\xbau\x93\x46\xf5\xeb\xd2\x7f\xe0`\x1a\x37i\x8a\xb9\xb9\x39={\xf5\xa6S\xc7\xf6XX\x98\x93#G.\xe\xec\xdf\xc7\x93'O\xa8V\xbd\x66\x84\xc7\xd9\xb3{\x97\xe1u\x95\xef\xaa~\x8e\xd0\x45\x44\x44$\xePbHDDDDDDD$\x1a%JdE\xae\\\xb9\xb1\xb3Km(+]\xa6,\x8b\x96,c\xfd\xaf\xeb\xd8\xbci#e\xcb\x96\x63\xc1\xa2%$M\x9a\x34\xc2\xe3(\x19$\"\"\"1A\x89!\x11\x11\x11\x11\x11\x11\x11\x91O\x90\x33Wn.]\xbd\x61\xd8\xb6\xb3\xb3\x63\xf9*\xd7\x30\xed\x8a\x15/A\xb1\xe2%>gh\"\"\"\"ah\x8d!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x38\x42#\x86\x44\x44\x44\x44\x44\x44\x44\x44\xbe@ZcHDDDb\x82\x12\x43\"\"\"\"\"\"\"\"_ %\x83\x44\x44\x44$&h*9\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x38\x42\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x38\x42S\xc9\x89\x88\x88\x88\x88\x88\x88\x88|\x81\xb4\xc6\x90\x88\x88\x88\xc4\x4%\x86\x44\x44\x44\x44\x44\x44\x44\x44\xbe@J\x6\x89\x88\x88HL\xd0Tr\"\"\"\"\"\"\"\"\"\"\"\"q\x84\x12\x43\"\"\"\"\"\"\"\"\"\"\"\"q\x84\xa6\x92\x13\x11\x11\x11\x11\x11\x11\x11\xf9\x2i\x8d!\x11\x11\x11\x89\tJ\f\x89\x88\x88\x88\x88\x88\x88\x88|\x81\x94\f\x12\x11\x11\x91\x98\xa0\xa9\xe4\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\xe2\b%\x86\x44\x44\x44\x44\x44\x44\xfe\xcf\xde}\x87YU\x9d{\0\xfe\rS\0\x91\"M\x10\xd0X(\x8a\x9a\xc4\xde\x1b*`\xaf`\vv\x93\x1b{7v\x8d&\xb6h\x8c\xc6\xd8\xc1^b!F\x5,\xd1\x44ob\xc4\x1a\xf5\xda\x8d^\xa5\xaa\x80Re\x86\x99\xfb\a\xd7\x89#\x83\x32\xca\x61\x6\xce\xfb>\xf\xcfs\xce\xda{\x9d\xfd\x1d\x36\x33\xc3\xcco\xd6\xb7\0\0\0\x8a\x84Vr\0\0\0\0M\xd0UW^Q\xe7\xf9\xcf\x8f\x38\xb2\x91*\x1\0\x96$\x82!\0\0\0\x80&H\x10\x4\0\x14\x82Vr\0\0\0\0\0\0\x45\x42\x30\x4\0\0\0\0\0P$\xb4\x92\x3\0\0\0h\x82\x46\x8d\x1cQ\xfb\xb8\xff\x80\x81\x8dX\t\0\xb0$\x11\f\x1\0\0\0\x34\x41\xc2 \0\xa0\x10\xb4\x92\x3\0\0\0\0\0(\x12\x82!\0\0\0\0\0\x80\"\xa1\x95\x1c\0\0\0@\x13\x64\x8f!\0\xa0\x10\x4\x43\0\0\0\0M\x90\x30\b\0(\x4\xad\xe4\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84=\x86\0\0\0\0\x9a\xa0Q#G\xd4>\xb6\xdf\x10\0\xb0\xb0\b\x86\0\0\0\0\x9a a\x10\0P\bZ\xc9\x1\0\0\0\0\0\x14\t+\x86\0\0\0\0\x1ah\xd6\xacY\xb9\xfd\xd6[\xf2\xd8\x63\x8f\xa4u\xeb\x36\xd9~\x87\x1d\xb3\xe3N;\xa7\xa4\xa4\x64\xbes^~\xf9\xa5\xdcz\xf3My\xe1\xf9\xe7\xb2\xd2\xca+g\xb7\xdd\xf7L\xff\x1\x3\xd3\xac\x99\xdf\xdb\x5\0\x16\x1d\xc1\x10\0\0\0@\x3TUU\xe5\x17'\x9f\x98i\xd3\xa6\xe6\x90\x43\x7f\x9aI\x93&\xe5\x97\xe7\x9c\x95\xc9\x93'g\xff\x3\xe\xacw\xcek\xaf\xbe\x9a}\x6\xef\x99\x63\x8e;!\xbb\xec\xba[\xde|\xe3\x8d\x9c~\xea)\xf9\xe2\x8b/\xb2\xcb\xae\xbb\xd5;\xc7\x1e\x43\0@!\b\x86\0\0\0\0\x1a\xe0\xd9g\xff\x99\xa7\x9f\xfa[F=\xf6\x44\xda\xb7o\x9f$i\xdb\xb6mN9\xe9\x84\xec\xb0\xe3N\xe9\xd0\xa1\xc3 \x99\xc7\x1e{$\xff\xfc\xc7?\xb2\\\xb7n\xd9z\x9bm\xb3\xfb\x1e{\xa6\x65\xcb\x96\xf3\x9ck\x8f!\0\xa0\x10\x4\x43\0\0\0\0\rPUU\x95_\x9c|b\xa6M\x9b\x9a\x43\xe\xfdi&M\x9a\x94_\x9esV&O\x9e\x9c\xfd\xf\x38p\xbe\xf3\xfep\xd5\xefs\xcf\xddw\xe6\x90\xc3~\x9am\xb6\xd9\x36S\xa7N\xcd\v\xcf?\x9f\x8a\x8a\x8az\xcf\x17\x6\x1\0\x85 \x18\x2\0\0\0h\x80g\x9f\xfdg\x9e~\xeao\x19\xf5\xd8\x13i\xdf\xbe}\x92\xa4m\xdb\xb6\x39\xe5\xa4\x13\xb2\xc3\x8e;\xa5\x43\x87\xe\xf3\xccy\xfd\x7f\xfe'\xd7\xfc\xe1\xaa<4rT\xbau\xeb^;\xbe\xfd\xe;.\xb2\xba\x1\0\x12{\f\x1\0\0\0\x34\xc8\xc8\x11\xfg\xe7]v\xad\r\x85\x92\x64\xa3\x8d\x37\xc9\x9c\x39\xd5yn\xf4\xb3\xf5\xce\xb9\xff\xfe{\xb3\xf7\xbe\xfb\xd6\t\x85\0\0\x1a\x83\x15\x43\0\0\0\0\r\xf0\xf6\x9bof\xe0\xf6;\xd4\x19k\xd5\xaaUz\xf5\xee\x95\xf1\xe3\xc6\xd5;\xe7\x7f^{-;\xec\xb8S\x1e\xfc\xf3\x3\xb9\xfb\xce;2i\xf2\xa4\f\x1c\xb8}\x86\x1cp`Z\xb7n]\xef\x9c\xbe}z\xd6;\xfe\xda\x1bo\x7f\xbf\x37\0\0\x14\x35\xc1\x10\0\0\0\xc0\x2\xaa\xa9\xa9\xc9\xeb\xaf\xbf\x9e=\x6\r\x9a\xe7X\xa7N\x9d\x33i\xf2\xa4y\xc6\xab\xab\xab\xf3\xaf\x97_\xca\x8b/<\x9f=\a\xed\x95\x83\xf=,\xd5\xd5\xd5\xb9\xfa\xfW\xe5\xc3\xf\xff\x37\xbf\xbe\xf0\xe2\x94\x94\x94\xcc\x33O\0\x4\0\x14\x82`\b\0\0\0`\x1\x95\x94\x94\x64\xa5\x95W\xca\xd4\xa9S\xe7\x39\x36y\xf2\xa4t\xea\xd4i\x9e\xf1\x66\xcd\x9a\xa5m\xbbv\x99\xf4\xe9\xa7\x39\xeb\x9cskC\xa0N\x9d;g\xf0\x1e\xbb\xe5\x88#\x8fN\xf7\x1e=\n^;\0@\"\x18\x2\0\0\0h\x90^\xbdz\xe7\xbd\xf7\xde\xab\x33\xf6\xc5\x17_\xe4\xddw\xdeM\x97.]\xeb\x9d\xf3\xa3\x1f\xfd\x38\xed\xdbw\xa8\xb3\x32h\xd9\x65\xbb$I\xa6L\x99\"\x18\x2\0\x16\x99\x66\x8d]\0\0\0\0\xc0\xe2\x64\x9bm\xfb\xe7\x81\xe1\xc3\xf3\xf1\xc4\x89\xb5\x63\xcf?7:I\xb2\xeez\xeb'\x99\xdb>n\xe6\xcc\x99\xb5\xc7\xb7\xed? O>\xf1\x97:+\x8d\xdex\xfd\xf5$I\xd7\xe5\x96\xab\xf7:\xa3\x46\x8e\xa8\xfd\x3\0\xb0\xb0X1\x4\0\0\0\xd0\0\x9bn\xbaY\xd6^g\x9d\x9cx\xc2q\xd9\xff\x80\x3\x33\x63\xc6\x8c\\t\xc1\xafs\xfc\x89'\xa5m\xdb\xb6I\x92\v~u^\x1e\x7f\xec\xd1\xdc\xff\xc0\x43i\xd3\xa6M\xb6\xea\xb7un\xbd\xe5\xe6\x9cx\xfc\xb1\xd9s\xd0\xe0$\xc9\x35W_\x95\x63\x8e;!\x1d:t\xa8\xf7:\xfd\a\f\\d\xef\t\0(\x1e\x82!\0\0\0\x80\x6\xa8h\xde<\x97\xff\xee\xca\f\x1bvc\xae\xf8\xddo\xd3\xb5\xebr9\xf5\xf4\x33\xea\x4\x39\xcb\xaf\xf0\x83\xf4Yu\xb5TTT$IZ\xb5j\x95\xab\xaf\xbd>7\xdep].\xbf\xec\xd2t\xea\xdc\x39\xfb\xfd\x64\xffl\xbf\xc3\x8e\x8d\xf5\x36\0\x80\"U\xf2\xe6\xbb\x63kz,7wc\xc4\xf\xc7~\x9c^+\xd5\xdf\v\x17X\xfc\xcc\x9cU\x95\x64\xee\xc7\xf6\x97\x1f\xe7\xf3\xf3\xd5s|.\0\0\0\x16\ao\xbd\x37\xae\xce\xf7\x31\r\xf9\xbeg\xea\xf4i\x5\xaf\xef\xfb\xe8\xdb\xa7g^{\xe3\xed\xc6.\x3\0XB\xb4n\xb5t\x92\xb9\xff\x1f\xb2\xc7\x10\0\0\0\0\0@\x91\xd0J\xe\0\0\0\xa0\t\x1a\x35rD\xed\x63\xfb\r\x1\0\v\x8b`\b\0\0\0\xa0\t\x12\x6\x1\0\x85\xa0\x95\x1c\0\0\0\0\0@\x91\x10\f\x1\0\0\0\0\0\x14\t\xad\xe4\0\0\0\0\x9a {\f\x1\0\x85 \x18\x2\0\0\0h\x82\x84\x41\0@!h%\a\0\0\0\0\0P$\x4\x43\0\0\0\0\0\0\x45\x42+9\0\0\0\x80&\xc8\x1e\x43\0@!\b\x86\0\0\0\0\x9a a\x10\0P\bZ\xc9\x1\0\0\0\0\0\x14\t\xc1\x10\0\0\0\0\0@\x91\xd0J\xe\0\0\0\xa0\t\xba\xea\xca+\xea<\xff\xf9\x11G6R%\0\xc0\x92\x44\x30\x4\0\0\0\xd0\x4\t\x82\0\x80\x42\xd0J\xe\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84Vr\0\0\0\0M\xd0\xa8\x91#j\x1f\xf7\x1f\x30\xb0\x11+\x1\0\x96$\x82!\0\0\0\x80&H\x18\x4\0\x14\x82Vr\0\0\0\0\0\0\x45\x42\x30\x4\0\0\0\0\0P$\xb4\x92\x3\0\0\0h\x82\xec\x31\x4\0\x14\x82`\b\0\0\0\xa0\t\x12\x6\x1\0\x85\xa0\x95\x1c\0\0\0\0\0@\x91\x10\f\x1\0\0\0\0\0\x14\t\xad\xe4\0\0\0\0\x9a {\f\x1\0\x85 \x18\x2\0\0\0h\x82\x84\x41\0@!h%\a\0\0\0\0\0P$\x4\x43\0\0\0\0\0\0\x45\x42+9\0\0\0\x80\x6\x9a\x30\x61|n\x1a:4O?\xf5\xb7\xac\xd6\xb7o\x6\r\xde;k\xad\xbd\xf6\x2\xcd\xad\xaa\xaa\xca\xd1G\x1e\x9e\xea\xea\xea\xfc\xe1\x9a\xeb\n\\)\0@]V\f\x1\0\0\0\x34\xc0\xc4\x89\x13s\xf0\x81\xfbg\xd6\xacY9\xe1\xa4\x93\xd3\xad{\xf7\x1c\x30\x64\xdf<\xff\xdc\xe8\x5\x9a\x7f\xf7]w\xe6\xc9'\xfe\xf2\xad\xe7\x8d\x1a\x39\xa2\xf6\xf\0\xc0\xc2\x62\xc5\x10\0\0\0@\x3\xdc\x7f\xdf=Y~\xf9\x15r\xda\x19g\xa6\xb4\xb4\x34\x9bm\xbe\x45\xbe\x98\xf5\x45\xae\xfa\xfd\x95\xb9\xfe\xc6\x61)))\x99\xef\xdc\x37^\x7f=\xbf\xbf\xf2w\xd9i\xe7]2e\xca\x94o\xbcN\xff\x1\x3\x17v\xe9\0\0V\f\x1\0\0\0,\xa8\xaa\xaa\xaa\xdcx\xfd\xf5\xd9\x61\xc7\x9dRZZZ;\xbem\xff\x1y\xe6\x1f\x7f\xcf\xff~\xf0\xc1|\xe7N\x9f>=g\x9dyz\xce<\xeb\x9c\xf4\xe9\xb3\xea\xa2(\x17\0`\x1e\x82!\0\0\0\x80\x5\x34\x65\xca\xe4L\x9b\x36\x35]\xbat\xad\x33\xde\xb5\xeb\xdc\xe7\x9f|\xf2\xf1|\xe7^{\xcd\x1f\xd2\xb3W\xafl\xdb\x7f@Ak\x4\0\xf8&Z\xc9\x1\0\0\0,\xa0/\xdb\xbf\xb5l\xd9\xb2\xce\xf8R\xad\x96J\x92|\xfe\xf9\xe7\xf5\xce\xfb\xfb\xdf\xff;\xf>\xf0\xa7\xdc}\xef\xfd\xdf\xd8j\xee\xab\xfa\xf6\xe9Y\xef\xf8ko\xbc\xbd\xa0\xe5\x2\0\xcc\x43\x30\x4\0\0\0\xb0\x80Z\xb7n\x9d$\x99>cz\x9d\xf1\x99\x33g%I\xda-\xb3\xcc\xfd\xf4\x93\x9cy\xfa\xa9\x39\xf7\xbc_\xa5\x43\x87\x8eI\x92\x9a\xd4|\xeb\xb5\x4@\0@!\b\x86\0\0\0\0\x16\xd0\x32\xcb\xb4Oiii\xc6\x8e\x19\x93\xac\xb3n\xed\xf8\xc7\x1fOL\x92t\xea\xd8i\x9e\x39\x37\\w]\xc6\x8d\x1d\x9b\xc3\xe\x39h\x9e\x63}\xfb\xf4\xccO\xf6? \xa7\xfc\xe2\xb4\xc2\x15\r\0\xf0\x15\x82!\0\0\0\x80\x5TQQ\x91\xfd\xf<(\x7f~`x\x6n\xb7}\xca\xcb\xcb\x93$\x7f}\xf2\x89l\xb1\xe5V\xe9\xd6\xbd{\x92\xe4\x8b/\xbeHYYYJKK\xb3\xe7\xa0\xc1\xd9\x61\xc7\x1d\xeb\xbc\xce\xd9g\x9d\x91\xd7^}5\x7f\xbc\xf7\xfe,\xfd\xff\xab\x90\0\0\x16\x5\xc1\x10\0\0\0@\x3\f\x1a\xbcW\x86\xec\xbbO\xce;\xf7\x9cl\xdb\xbf\x7f\xdez\xeb\xad\\w\xcd\xd5\x19z\xf3\xad)))\xc9\xacY\xb3\x32x\xcf\xdd\xd2\xb3g\xaf\\r\xe9o\xb3\xe2J+\xcd\xf3\x1a\x3\xb7\xdb!\x1d:t\xccj}W\x9f\xefuF\x8d\x1cQ\xfb\xb8\xff\x80\x81\x5y/\0@\xf1\x11\f\x1\0\0\0\x34@\x8f\x1e\xcbg\xd8-\xb7\xe5\xe6\x61\x43s\xde/\xcf\xc9Zk\xaf\x93\x9bo\xbd#}W\x9f\x1b\xf2\x94\x97\x97\xa7w\xef>Yq\xa5\x95\xbf\xd7u\x84\x41\0@!\b\x86\0\0\0\0\x1ah\x85\x15V\xc8\x19g\x9d]\xef\xb1\xd2\xd2\xd2\\t\xc9\xa5\xdf\x38\xff\xc0\x83\xe\xce\x81\a\x1d\\\x80\xca\0\0\xbeY\xb3\xc6.\0\0\0\0\0\0\x80\x45\xc3\x8a!\0\0\0\x80&\xc8\x1e\x43\0@!\b\x86\0\0\0\0\x9a a\x10\0P\bZ\xc9\x1\0\0\0\0\0\x14\t\xc1\x10\0\0\0\0\0@\x91\xd0J\xe\0\0\0\xa0\t\xb2\xc7\x10\0P\b\x82!\0\0\0\x80&H\x18\x4\0\x14\x82Vr\0\0\0\0\0\0\x45\x42\x30\x4\0\0\0\0\0P$\xb4\x92\x3\0\0\0h\x82\xec\x31\x4\0\x14\x82`\b\0\0\0\xa0\t\x12\x6\x1\0\x85\xa0\x95\x1c\0\0\0\0\0@\x91\x10\f\x1\0\0\0\0\0\x14\t\xad\xe4\0\0\0\0\x9a\xa0\xab\xae\xbc\xa2\xce\xf3\x9f\x1fqd#U\x2\0,I\x4\x43\0\0\0\0M\x90 \b\0(\x4\xad\xe4\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84=\x86\0\0\0\0\x9a\xa0Q#G\xd4>\xee?``#V\x2\0,I\x4\x43\0\0\0\0M\x90\x30\b\0(\x4\xad\xe4\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0Hh%\a\0\0\0\xd0\x4\xd9\x63\b\0(\x4\xc1\x10\0\0\0@\x13$\f\x2\0\nA+9\0\0\0\0\0\x80\"!\x18\x2\0\0\0\0\0(\x12Z\xc9\x1\0\0\0\x34\x41\xf6\x18\x2\0\nA0\x4\0\0\0\xd0\x4\t\x83\0\x80\x42\xd0J\xe\0\0\0\0\0\xa0HX1\x4\0\0\0\xf0\x1dL\x98\x30>7\r\x1d\x9a\xa7\x9f\xfa[V\xeb\xdb\x37\x83\x6\xef\x9d\xb5\xd6^\xbb\xdeskjj\xf2\xf4SO\xe5\x91GFf\xf4?\x9fI\xb7\xee=\xb2\xebn\xbbg\xe0v\xdb\xa7\xb4\xb4t\x11W\xe\0\x14\x33+\x86\0\0\0\0\x1ah\xe2\xc4\x89\x39\xf8\xc0\xfd\x33k\xd6\xac\x9cp\xd2\xc9\xe9\xd6\xbd{\xe\x18\xb2o\x9e\x7fnt\xbd\xe7?2jd.\xbc\xe0\xfc\xac\xbe\xfa\x1a\x39\xf1\xe4_\xa4w\xef>9\xf9\xc4\xe3\xf3\xa7\xe1\xf7\xcf\xf7\x1a\xa3\x46\x8e\xa8\xfd\x3\0\xb0\xb0X1\x4\0\0\0\xd0@\xf7\xdfwO\x96_~\x85\x9cv\xc6\x99)--\xcd\x66\x9bo\x91/f}\x91\xab~\x7f\x65\xae\xbfqXJJJ\xea\x9c\xbf\xe1\x46\x1bg\xd3\xcd\x36\xcfRK-\x95$\xe9\xb7\xf5\x36)\xaf(\xcf]w\xde\x91\xddv\xdf\xa3\xdek\xd8\x63\b\0(\x4+\x86\0\0\0\0\x1a\xa0\xaa\xaa*7^\x7f}v\xd8q\xa7:m\xe0\xb6\xed? \xcf\xfc\xe3\xef\xf9\xdf\xf>\x98gN\x9b\x36mjC\xa1/u\xee\xbcl\xa6O\x9fV\xf0z\x1\0\xbeJ0\x4\0\0\0\xd0\0S\xa6L\xce\xb4iS\xd3\xa5K\xd7:\xe3]\xbb\xce}\xfe\xc9'\x1f/\xd0\xeb<\xff\xdc\xe8l\xd5o\xeb\x85^\x1f\0\xc0\x37\xd1J\xe\0\0\0\xa0\x1\xa6L\x99\x92$i\xd9\xb2\x65\x9d\xf1\xa5Z\xcd]\x11\xf4\xf9\xe7\x9f\x7f\xebk\x8c~\xf6\xd9\xfc\xe5\xf1\xc7\xf3\xf0\xa8G\xe6{N\xdf>=\xeb\x1d\x7f\xed\x8d\xb7\x17\xb4T\0\x80y\b\x86\0\0\0\0\x1a\xa0u\xeb\xd6I\x92\xe9\x33\xa6\xd7\x19\x9f\x39sV\x92\xa4\xdd\x32\xcb|\xe3\xfc\xf1\xe3\xc6\xe5\x8c\xd3N\xc9\x5\x17]\x9c\xe5\x96\xeb\x36\xdf\xf3\x4@\0@!h%\a\0\0\0\xd0\0\xcb,\xd3>\xa5\xa5\xa5\x19;fL\x9d\xf1\x8f?\x9e\x98$\xe9\xd4\xb1\xd3|\xe7~\xf6\xd9g9\xe9\x84\xe3\xb2\xcbn\xbbg\xc0\xc0\xed\nZ'\0@}\x4\x43\0\0\0\0\rPQQ\x91\xfd\xf<(\x7f~`x*++k\xc7\xff\xfa\xe4\x13\xd9\x62\xcb\xad\xd2\xad{\xf7$Iuuuf\xce\x9cY{\xfc\xb3\xcf>\xcb\x89\xc7\x1f\x9bu\xd6[/\x87\xfd\xf4\xbf\x16y\xdd\0\0\x89Vr\0\0\0\0\r6h\xf0^\x19\xb2\xef>9\xef\xdcs\xb2m\xff\xfey\xeb\xad\xb7r\xdd\x35Wg\xe8\xcd\xb7\xa6\xa4\xa4$Ir\xc1\xaf\xce\xcb\xe3\x8f=\x9a\xfb\x1fx(5559\xec\x90\x83\xf2\xea+\xff\xca\xa1\x87\xfd,/\xbd\xf8\x62\xedk-\xbf\xc2\xf2\xe9X\xcf*\xa3Q#G\xd4>\xee?``\xe1\xdf\x14\0P\x14\x4\x43\0\0\0\0\r\xd4\xa3\xc7\xf2\x19v\xcbm\xb9y\xd8\xd0\x9c\xf7\xcbs\xb2\xd6\xda\xeb\xe4\xe6[\xefH\xdf\xd5W\xaf=g\xf9\x15~\x90>\xab\xae\x96\x8a\x8a\x8a<\xfd\xd4\xdf\xf2\xea+\xffJ\x92\x1c\x30\x64\xdf:\xafu\xd5\xd5\xd7\x65\xf3-\xb6\x98\xe7\x1a\xc2 \0\xa0\x10\x4\x43\0\0\0\0\xdf\xc1\n+\xac\x90\x33\xce:{\xbe\xc7\xf7\xfb\xc9\x90\xec\xf7\x93!I\x92\xad\xb7\xd9\x36\xaf\xbd\xf1\xf6\"\xaa\f\0`\xfe\xec\x31\x4\0\0\0\0\0P$\xac\x18\x2\0\0\0h\x82\xec\x31\x4\0\x14\x82`\b\0\0\0\xa0\t\x12\x6\x1\0\x85\xa0\x95\x1c\0\0\0\0\0@\x91\x10\f\x1\0\0\0\0\0\x14\t\xc1\x10\0\0\0\0\0@\x91\xb0\xc7\x10\0\0\0@\x13\x34j\xe4\x88\xda\xc7\xf6\x1b\x2\0\x16\x16\xc1\x10\0\0\0@\x13$\f\x2\0\nA+9\0\0\0\0\0\x80\"!\x18\x2\0\0\0\0\0(\x12Z\xc9\x1\0\0\0\x34\x41\xf6\x18\x2\0\nA0\x4\0\0\0\xd0\x4\t\x83\0\x80\x42\xd0J\xe\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84Vr\0\0\0\0M\xd0UW^Q\xe7\xf9\xcf\x8f\x38\xb2\x91*\x1\0\x96$\x82!\0\0\0\x80&H\x10\x4\0\x14\x82Vr\0\0\0\0\0\0\x45\x42\x30\x4\0\0\0\0\0P$\xb4\x92\x3\0\0\0h\x82\x46\x8d\x1cQ\xfb\xb8\xff\x80\x81\x8dX\t\0\xb0$\x11\f\x1\0\0\0\x34\x41\xc2 \0\xa0\x10\xb4\x92\x3\0\0\0\0\0(\x12\x82!\0\0\0\0\0\x80\"\xa1\x95\x1c\0\0\0@\x13\x64\x8f!\0\xa0\x10\x4\x43\0\0\0\0M\x90\x30\b\0(\x4\xad\xe4\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0Hh%\a\0\0\0\xd0\x4\xd9\x63\b\0(\x4\xc1\x10\0\0\0@\x13$\f\x2\0\nA+9\0\0\0\0\0\x80\"!\x18\x2\0\0\0\0\0(\x12\x82!\0\0\0\x80\x45\xe0\xe5\x97_\xcai\xa7\x9e\x92\xed\al\x9b_\x9d\xff\xcb\x8c\x1b;\xf6\x1b\xcf\xef\xdb\xa7gF\x8d\x1cQg\xaf!\x9a\x96\xbe}z6v\t,\0\xf7\xa9\xe9s\x8f\x16\xf\xee\xd3\xe2\x61\x41\xee\x93`\b\0\0\0\xa0\xc0\x9e\x7fnt\xf6\xdfo\xdf\xac\xbc\xf2*9\xe9\x94S\xf3\xd9\x94)9\xe8\xc0!\x99\x38q\xe2\x37\xce\xeb?`\xe0\x12\xb3\xd7\xd0UW^\xd1\xd8%\xb0\0\xdc\xa7\xc5\x83\xfb\xd4\xf4\xb9G\x8b\x87\x62\xbdO\x82!\0\0\0\x80\x2\xaa\xae\xae\xce\x15\xbf\xbbs\xc6\x8c:\xc7\x17T}a\xd1\xe2\xe2\xf7W\xfe\xae\xb1KX\xe8\x16\xe7\xfb\x31?\xee\xd3\xe2\x61I\xbbO\xee\xd1\xe2\xc1}Z2\b\x86\0\0\0\0\n\xa8S\xa7\xceI\x92\t\xe3\xc7\xd7Y\x19\x34n\xdc\xb8t\xeb\xd6=\xadZ-=\xcf\x1c\xab\x82\0\x80\x42\xb1\xc7\x10\0\0\0@\x1\xf5\xec\xd5+}V]-\x8f=\xf6h\xedXUUU\x1e~\xe8\xc1\f9\xe0\x80\xc6+\f\0(JV\f\x1\0\0\0\x14PYYY\x8e\x39\xf6\xb8\xfc\xec\xb0\x43R^^\x96UW\xed\x9b\xc7\x1f{4\x9f~\xfai\xb6\xdb~\xc7\xc6.\xf\0(2V\f\x1\0\0\0\x14\xd8\xa6\x9bm\x9e\x1b\x86\xde\x94\x37^\x7f=\xbf\xfe\xd5/\xd3\xb2\x65\xcb\\w\xc3\xd0\xb4o\xdf\xbe\xb1K\x3\0\x8a\x8c\x15\x43\0\0\0\0\x8b\xc0\x6\x1bn\x94\r6\xdc\xa8\xb1\xcb\xa0\x1&L\x18\x9f\x9b\x86\xe\xcd\xd3O\xfd-\xab\xf5\xed\x9b\x41\x83\xf7\xceZk\xaf]\xef\xb9\x35\x35\x35y\xfa\xa9\xa7\xf2\xc8##3\xfa\x9f\xcf\xa4[\xf7\x1e\xd9u\xb7\xdd\x33p\xbb\xedSZZ\xba\x88+/\x1e\r\xb9G\xf5\xb9\xe1\xfaks\xe9%\x17\xe7\x9f\xa3_\xc8\xd2\xad[\x17\xb0\xd2\xe2\xf6\xf2\xcb/\xe5\xee\xbb\xee\xccK/\xbc\x90\x8d\x37\xdd\x34\a\x1exp\xba.\xb7\xdc\x37\xce\x99\x34iR\xee\xba\xe3\xf6\x8c\x1e\xfdl\xc6\x8e\xf9(\xebm\xb0\x61\x6\r\xda+\xab\xaf\xb1\xc6\"\xaa\xba\xb8\xd4\xd4\xd4\x64\xc4\x88\x87\xf3\xf0\x83\x7f\xce\x84\xf1\xe3\xb3\xf5\xb6\xdb\x66\xc8\xfe\a\xa6\x65\xcb\x96\xf3\x9d\x33v\xec\x98\xdc|\xd3\xb0<\xf5\xd7\xbf\xa6M\x9b\x36\xd9v\xc0\xc0\f\x1a<\xb8\xde\xbd\xf3hZ\xac\x18\x2\0\0\0\x80\xaf\x99\x38qb\xe>p\xff\xcc\x9a\x35+'\x9ctr\xbau\xef\x9e\x3\x86\xec\x9b\xe7\x9f\x1b]\xef\xf9\x8f\x8c\x1a\x99\v/8?\xab\xaf\xbe\x46N<\xf9\x17\xe9\xdd\xbbON>\xf1\xf8\xfci\xf8\xfd\x8b\xb8\xf2\xe2\xd1\xd0{\xf4u/\xbf\xfcR.\xbd\xe4\xe2\x2W\xc9\xf3\xcf\x8d\xce\xfe\xfb\xed\x9b\x95W^%'\x9drj>\x9b\x32%\a\x1d\x38$\x13'N\x9c\xef\x9c\xf>\xf8 C\xf6\xdb;c\xc7\x8d\xcd\xa0\xc1{\xe5\x17\xa7\x9d\x91\xe5\x97_>\x93'O^\x84\x95\x17\x97[n\xbe)\x17_\xf0\xeb\xf4\x1f\x30\x30\x87\xfe\xf4g\xf9\xcb\xe3\x8f\xe7\xe4\x13O\xc8\x9c\x39s\xea=\xff\xb3\xcf\xa6\xe4\xb0\x43\xe\xca\xac\x99\xb3r\xca\xa9\xa7\x65\xf7=\a\xe5O\xc3\xef\xcf\xaf\x7fu\xfe\"\xae\x9c\xef\xc2\x8a!\0\0\0\0\xf8\x9a\xfb\xef\xbb'\xcb/\xbf\x42N;\xe3\xcc\x94\x96\x96\x66\xb3\xcd\xb7\xc8\x17\xb3\xbe\xc8U\xbf\xbf\x32\xd7\xdf\x38,%%%u\xce\xdfp\xa3\x8d\xb3\xe9\x66\x9bg\xa9\xa5\x96J\x92\xf4\xdbz\x9b\x94W\x94\xe7\xae;\xef\xc8n\xbb\xef\xd1\x18oa\x89\xd7\xd0{\xf4U\x9f\x7f\xfey\xce<\xfd\xd4\xec\xb1\xe7\xe0\xdc\xf3\xc7\xbb\x16\x61\xd5\xc5\xa5\xba\xba:W\xfc\xee\xf2\x1cu\xf4\x31\x39\xe8\xe0\x43\x92$\xebo\xb0\x41\xe\x1c\xb2_\xfe\xfc\xc0\xf0\x1c|\xc8\x61\xf5\xce\xbb\xfa\xaa+\xb3\xed\xb6\x3r\xe4\xd1\xc7\xd4\xde\xc7\xcd\xb7\xd8r\x91\xd5]l>\xf9\xe4\xe3\\z\xc9\xc5\xb9\xf6\x86\x1b\xb3\xdez\xeb'IV]m\xb5\f\xd8\xa6_\x9e\x7fnt\xd6[\x7f\x83y\xe6\xbc\xfc\xd2K\xf9\xf7{\xef\xe5\xb6;\xeeN\xdb\xb6m\x93$\xcbu\xeb\x96\x43\xf: \xa7\x9cr\xaa\x15xM\x9c\x15\x43\0\0\0\0\xf0\x15UUU\xb9\xf1\xfa\xeb\xb3\xc3\x8e;\xd5i\x3\xb7m\xff\x1y\xe6\x1f\x7f\xcf\xff~\xf0\xc1 \xfexn\x98\xf4\xcbs\xcf\xce\xca\xab\xac\x92_]pQV_c\xcd\x1c\x30\x64\xdf\xbc\xf6\xea\xab\x5\xae\xb8\x38M\x18?\xbe\xb6\x1d\xdcW\xb5i\xdb&\x1f}\xf8\x61\xbds\xca\xca\xcar\xc8!\x87\xe5\xfd\xf7\xff\x9d\x33O?-\x97\xff\xf6\xd2\xec\xbe\xc7\xa0\xf4\xea\xdd\xa7\xd0\xe5\xb2\x10\xd8\x63\b\0\0\0\0\xbe\xa2\xf5\xff\xef\x8d\x31}\xc6\xf4:\xe3\x33g\xceJ\x92\xb4[f\x99o\x9c?~\xdc\xb8\x9cq\xda)\xb9\xe0\xa2\x8b\xb3\xdcr\xdd\nSd\x91\xfb.\xf7h\xce\x9c\x39\xb9\xf0\xd7\xe7g\x9f}\xf6\xcbZk\xcfm\x99\x35o#3\x16\xa6/\xc3\x86\x99\x33g\xa6\xbc\xbc\xbcv|\xe6\x8c\x19u\x8e\x7fU\xab\xffoCv\xe2I'g\xb5\xbe\xab'I\xd6[o\xfd\xbc\xfb\xce\xdb\x19\xf1\xf0\x43\xe9\xbb\xfa\xea\x85.\xbb\xe8t\xe8\xd8!\xaf\xfc\xeb_\xf3\x8cO\x9b\x36-?Xq\xc5z\xe7\xbc\xf9\xe6\x1b\xd9o\xef\xc1\x39\xefW\x17\x64\x8b-\xb7\xca\xbb\xef\xbc\x9d+~\xf7\xdb\x8c\x1a\x39\"\x97]\xfe\xbb\xb4j\xb5t\xa1\xcb\xe6{\xb0\x62\b\0\0\0\0\xbe\x62\x99\x65\xda\xa7\xb4\xb4\x34\x63\xc7\x8c\xa9\x33\xfe\xe5J\x86N\x1d;\xd5\x37-I\xf2\xd9g\x9f\xe5\xa4\x13\x8e\xcb.\xbb\xed\x9e\x1\x3\xb7+h\x9d\xc5\xec\xbb\xdc\xa3\xbf<\xfeX\x1e\x19\x35\x32W^qy\xfa\xf6\xe9\x99\xbe}zf\xff\xfd\xe6\xae\xe8Z\x7f\xdd\xb5\xb2\xe9\xc6\x1b\x14\xbe\xf0\"\xd3\xa9S\xe7$sW\xa4|\xd5\xb8q\xe3\xd2\xad[\xf7z\xc3\x83\x8e\x1d;&I\x96i\xdf\xa1\xce\xf8\xca+\xaf\x92q\xe3\xc6\x16\xa8\xd2\xe2\xb6\xdcr\xcb\xe5\xf5\xd7\xff'\xb3g\xcf\xae\x33\xfe\xc1\xfb\xefg\xc5\x15W\xaaw\xcem\xb7\xde\x92\xedw\xd8)\xbb\xee\xb6{\x96Yf\x99\xac\xb3\xeez\xf9\xcd\x65\x97\xe7\xbf\x9f~*O>\xf1\xc4\xa2(\x9b\xef\x41\x30\x4\0\0\0\0_QQQ\x91\xfd\xf<(\x7f~`x*++k\xc7\xff\xfa\xe4\x13\xd9\x62\xcb\xad\xd2\xad{\xf7$Iuuuf\xce\x9cY{\xfc\xb3\xcf>\xcb\x89\xc7\x1f\x9bu\xd6[/\x87\xfd\xf4\xbf\x16y\xdd\xc5\xe4\xbb\xdc\xa3\x1f\xfe\xf0G\xf9\xe3\xbd\xf7\xd7\xf9s\xf8\x11G%I\xae\xbbqX\xae\xbd\xee\xc6\x45\xff\x46\x96p={\xf5J\x9fUW\xcb\x63\x8f=Z;VUU\x95\x87\x1fz0C\xe\x38\xa0v\xec\x8b/\xbe\xc8\x9c\x39s\x92$\xbd\xfb\xac\x9a\x1e=z\xe4o\x7f}\xb2\xf6xMMM\x9e|\xf2\x89\xf4\xe9\xb3\xea\xa2*\xbd\xa8l\xb0\xe1\x46\x99\xf4\xe9\xa7u\xf6q\xfa\xf8\xe3\x8f\xf3\xd0\x83\x7fN\xbfm\xb6\xa9\x1d\x9b\xf1\xff+\xbd\x92\x64\xd6\xcc\x99\x99:\xf5\xf3\xd4\xd4\xfcg\xdd]\xbbv\xcb\xa4M\x9b\xb6\xf3\x4L4=Z\xc9\x1\0\0\0\xc0\xd7\f\x1a\xbcW\x86\xec\xbbO\xce;\xf7\x9cl\xdb\xbf\x7f\xdez\xeb\xad\\w\xcd\xd5\x19z\xf3\xad)))I\x92\\\xf0\xab\xf3\xf2\xf8\x63\x8f\xe6\xfe\a\x1eJMMM\xe;\xe4\xa0\xbc\xfa\xca\xbfr\xe8\x61?\xcbK/\xbeX\xfbZ\xcb\xaf\xb0|:~\xc3*#\xbe\x9b\x86\xde\xa3\xce\xcb.\x9b\xce\xcb.[\xe7\x35\x66\xcc\x98\x91\xdf_\x99\xac\xb9\xc6\x9aY\xfa\xff\xdb\xd3\xb1\xf0\x94\x95\x95\xe5\x98\x63\x8f\xcb\xcf\xe;$\xe5\xe5\x65Yu\xd5\xbey\xfc\xb1G\xf3\xe9\xa7\x9f\x66\xbb\xedwL\x92\xcc\x9a\x35+\x83\xf7\xdc-={\xf6\xca%\x97\xfe\x36-Z\xb4\xc8Q\xc7\x1e\x9f\x13\x8f;&\xb3\x66\xceL\xcf\xde\xbd\xf3\xd2\v/\xe4\xa3\x8f>\xcc\xce\xbb\xee\xd6\xc8\xefh\xc9\xd4\xad[\xf7\xfc\xd7\xe1G\xe4\x94\x93O\xc8\x89'\x9d\x92\x36m\xda\xe4\xe6\x9b\x86\x65\xbb\xedw\xc8\xf\x7f\xf8\xa3$\xc9\xbb\xef\xbe\x93\x41\xbb\xef\x9a\x93N\xe1\x99\xd3\0\0 \0IDATN95\x83\xf7\xda;\xbb\xec\xb6{\xe=\xe8\x80t\xea\xdc\x39\x9bl\xb2i\x9a\x35k\x96'\xfe\xf2xZ\xb7n\x9d\x8d\x37\xd9\xb4\x91\xdf\x11\xdf\x46\x30\x4\0\0\0\x14\x9d\x92\x92\x92:\xbf\xe5\f_\xd7\xa3\xc7\xf2\x19v\xcbm\xb9y\xd8\xd0\x9c\xf7\xcbs\xb2\xd6\xda\xeb\xe4\xe6[\xef\xa8\xb3\xbf\xc9\xf2+\xfc }V]-\x15\x15\x15y\xfa\xa9\xbf\xe5\xd5W\xe6\xee\xd1q\xc0\x90}\xeb\xbc\xd6UW_\x97\xcd\xb7\xd8\x62Q\x96_\x14\x1az\x8fh\x1c\x9bn\xb6yn\x18zS\xee\xf9\xe3\xdd\x19~\xff}\xd9|\xf3-s\xdd\rC\xd3\xbe}\xfb$Iyyyz\xf7\xee\x93\x15WZ\xb9v\xcev\xdbm\x9f\x96-Z\xe4\xfe\xfb\xee\xcb\x1d\xb7\xdf\x9a\x8d\x37\xd9,w\xdd}o:w\xee\xdcXoc\x89\xf7\xf3\xc3\x8fL\x97.]3\xfc\xfe\xfb\x32k\xd6\xccl\xb3\xed\x80\xec\xbb\xef~i\xd6ln\xd3\xb1V\xad\x96N\xdf\xbe\xab\xa7K\x97\xaeI\x92\x8d\x36\xda\x38\xb7\xdeqW\xfex\xd7\x9d\x39\xf7\xec\xb3\xd2\xb6m\xdbl\xb8\xf1\xc6\x19v\xcb\xad\xeeS\x13\xf4\x65X^\xfb\xfc\xcdw\xc7\xd6\xf4Xn\xeeo,|8\xf6\xe3\xf4Z\xa9kc\xd4\x5\x14\xc0\xccYUI\xe6~l\x7f\xf9q>?_=\xc7\xe7\x2\0\0`q\xf0\xd6{\xe3\xea|\x1f\xd3\x90\xef{\xa6\xcf\x9c\x9e\xeaj\xc1\x10\0\xb0\xe4k\xd6\xac$\xadZ\xb6J2\xf7\xff\x43\xf6\x18\x2\0\0\0\x8aNi3MT\0\x80\xe2\xf0\xf5\xff\xf7\b\x86\0\0\0\x80\xa2SZV\xda\xd8%\0\0,\x12_\xff\x7f\x8f`\b\0\0\0(:e\xcd\xca\xd2\xeck\xfd\xf6\x1\0\x96\x34\xcdJJRVj\xc5\x10\0\0\0P\xe4JJ\x92\xe6\xcd\x9b\x37v\x19\0\0\x5\xd5\xbcy\xf3|\xfdWa\x4\x43\0\0\0@Q*+-KEYyc\x97\x1\0P\x10\x15\x65\xe5\xf3\xac\x16J\x4\x43\0\0\0@\x91(//KeeU\x9d\xb1\xe6\xcd\x9b\v\x87\0\x80%NEY\xf9<\xab\xa3gWV\xa5\xa2\xbcL0\x4\0\0\0\x14\x87\x8a\xf2\xb2\xcc\xfeZ0\x94\xcc\r\x87Z\xb6ha\xcf!\0`\xb1\xd7\xac\xa4$-[\xb4\xa8\xb7\x65n\xe5\xec\xaa\x94W\x94\x65\xde\x35\x44\0\0\0\0K\xa0\x16\xcd+2k\xf6\xec\xb4J\x8by\x8e\x95\x95\x96\xa5t\xa9\xb2T\xcd\xa9\xca\x9c\xaa\x39\x99S]\x95\x9a\x9a\xa4\xa6\xa6\xa6\x11*\x5\0X0%%%))IJ\x9b\x95\xa5\xb4\xac\x34\x65\xa5\x65\xf3\xec)\xf4\xa5/f\xcfN\xcb\x96-\x4\x43\0\0\0@qX\xaa\x65\xf3L\x9b\x31\x33\x33\x66\xce\xcaR-\xe7\r\x87J\x92\x94\x97\x96\xa5\xbc\xb4,\xc9\xbc\xbf\x65\v\0\xb0\xb8\x9a\x34\x65j\xaa\xaa\xab\xd3\xb2\x45\x85`\b\0\0\0(\x1e\x1d\xda\xb5\xce\xd8\t\x93\xe6\xfevm\x92\xf2\x8a\xf2\x94\x36\xd3i\x1f\0X\xf2\xcc\xae\xacJ\xe5\xec\xaa\xcc\x9a]\x99\xea\x39s\xd2\xb9\x63\xbb$\x11\f\x1\0\0\0\xc5\xa3\xb4\xb4\x34=\x96\xeb\x94\xc9\x9fMM\xd5\x9c\x9aTN\x99\x96\x39\xd5\xd5\x8d]\x16\0\xc0\x42WQ^\x96\xf2\x8a\xb2,\xd5\xb2\"-[\xfcg5\xb4`\b\0\0\0(:\xcb\xb4m\xdd\xd8%\0\0\x34\nk\xa5\x1\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x84`\b\0\0\0\0\0\xa0H\b\x86\0\0\0\0\0\0\x8a\x44Yc\x17\0\0\0\0\xb0\xa8M\x9a\x32\x35s\xaa\xabS9\xbb*s\xaa\xab\x1b\xbb\x1c\0\x80\x85\xae\xbc\xbc,\x15\xe5\x65i\xd9\xbcyZ\xb6\xac\xa8\x1d\x17\f\x1\0\0\0\x45\xe3\x8b\xd9\x95\x99\xf8\xc9\x94tX\xa6M\x9a\x95\x94\xa4\xbc]YJ\x9bi\xa8\x2\0,y*+\xab\x32\xbb\xb2*3g\x7f\x91\xa9\x33\x66\xa4\x43\xbb\xd6)--\x15\f\x1\0\0\0\xc5\x63\xe2'S\xd2\x63\xb9N\x8d]\x6\0@\xc1\x95\x97\x97\xa5\xbc\xbc,\xad\xd2\"3f\xce\xca\xd8\t\x93\xd2\x63\xb9N\x82!\0\0\0\xa0\x38L\x9a\x32\x35\x1d\x96i\xd3\xd8\x65\0\0,rK\xb5l\x91\xa4$\x93?\x9b\x1ak\xa5\x1\0\0\x80\xa2\x30\xa7\xba:\xcdJJ\x1a\xbb\f\0\x80\x46\xd1\xac$\xa9\x9aS#\x18\x2\0\0\0\x8a\x43\xe5\xec\xaa\x94Wh\x9e\x2\0\x14\xa7\xf2\x8a\xf2T\xce\xae\x14\f\x1\0\0\0\xc5\x61NuuJ\x9b\xf9Q\b\0P\x9cJ\x9b\x35\x9b\xbb\x82\xba\xb1\v\x1\0\0\0\0\0`\xd1\x10\f\x1\0\0\0\0\0\x14\t\x8du\x1\0\0\0\0\x80&\xe3\xa2\x8b/\xcb?\x9f}.I\xb2\xfez\xeb\xe4\xa4\x13\x8fm\xe4\x8a\xfe\xe3\xd4\xd3\xcf\xca\x33\xcf<\xbb@\xe7v\xef\xd1#7\xf\xbd\xb6\xc0\x15\x35\x9c`\b\0\0\0\xa0\0&L\x9c\x98\xb2\xd2\xd2t\xe8\xd0\x61\x81\xce?\xe9\xa4Sr\xd7=\x7fJ\x92\xb4hQ\x91\x8d\xd6_';\xed\xbc\x63v\xd8~\xfb\x94\x97\x97g\xc2\x84\x89Yo\xc3\xcds\xff=\xb7\x65\xad\xb5\xd6Z\xa0\xd7\xac\xae\xae\xce\xd4\xa9S\xd3\xb2\x65\xcbTTT,\xd0\x9cw\xdf}7\xf=\xfcp\x9e}vt\xdez\xfb\xdd\xac\xfd\xe3\x1f\x66\xc8\x90\x9f\x64\xc3\r7\\\xa0\xf9\0\xf0}=\xf6\xc4\x93y\xf3\x8d\xb7\x92$S\xa7OkR\xc1\xd0\xb8\xf1\x13\xf2\xee{\xef\x37v\x19\xdf\x8b`\b\0\0\0`!\x9b\xfa\xf9\xd4\f9\xe0\xb0l\xd3o\xcb\x9cp\xfc\xd1\v<\xaf\xdf\x16\x1b\xe7\xa7?=4\x95\x95\x95y\xfd\x8d\x37r\xca\xa9g\xe5\xddw\xdf\xcd\t\xc7\x1f\xff\xdd\xea\x98:5k\xfex\x83\xdc}\xc7\xb0\xac\xbf\xfe\xfa\v4\xe7\x96[nMEEE\xf6\xddw\x9f\x94\x36k\x96g\xfe\xf9l\xf6\xda\xf7\xa0\xdcy\xdb\xd0l\xb8\xe1\x6\r\xba\xfe\x98\x31\x63\xf2\xc6\x1bo\xa7_\xbf-\xea=\xfe\xf8\xe3O\xa6O\x9f\x9e\xe9\xd6\xad[\x83^\x17\x80%\xcb\x9f\x1fz8/\xbc\xf0R\xe:`\xff\xbc\xf0\xd2K\xf9\xf7\xbb\xff\xae=\xf6\xefw\xff\x9d{\xef\x1b\x9e\xf5\xd6]77\f\x1d\x96\xb5\xd7\xfeqv\xdc~\xbb\x45^\xe3\xa9\xa7\x9f\x95\x41{\xee\x91$\xd9w\xdf\xc1\xd9n@\xffo<\xff\x85\x17_\xce\xf0\xe1\x7f\xfa^\xd7,\xd4\xd7Q\xc1\x10\0\0\0\xc0\x42\x34\xbb\xb2\x32?\xfd\xf9Q\xe9\xdc\xa9\x63\x8e>\xea\xf0\x6\xcd\xed\xd2\x65\xd9\xda\0g\x93M6I\xe7N\x9dr\xd4\xb1\xa7\x64\xef\xbd\xf6JYYy!\xca\x9d\xc7\x99g\x9e\x91\x66\xcd\xfe\xb3-\xf5\xb6\xdbn\x9b\x99\x33\x66\x64\xe4\xc8\x91\r\xe\x86\xdex\xe3\xed\xfc\xfc\xc8\x63s\xf9\x65\x17\x65@\xffm\xea\x1c\x1b\x39\xea\xd1\x1c}\xecI\xb9\xea\x8a\xcb\x4\x43\0\x45l\xc6\x8c\x99\x39\xef\xbc\x8b\x32~\xc2\x84\xdc\x38\xf4\x96y\x8e\xcf\xae\xac\xccq'\xfc\xa2\xf6\xf9\x88\x11\x8f\xa6\xdf\x96[f\xa9\xa5Z.\xca\x32\xf3\xcc\x33\xcf\xa6\xdf\x96[&IV^i\xa5l\xb2\xf1\x37\xaf\xa4\xfd\x62\xd6\x17\xdf;\x18*\xd4\xd7\xd1\x66\xdf~\n\0\0\0\0_7\xbb\xb2\x32\xff\xfd\xf7\x7f\xd4\x19\xab\xae\xae\xce\x89'\x9e\x9a\xc9\x93\xa7\xe4\xf\xbf\xbf<\xe5\xe5\xdf\xefwr\xbfl\x19\xf7\xd1Gc\xea=^SS\x93\xc7\x1e{,\x87\x1e\xf6\xd3l\xbe\x45\xbf\x9c~\xfa\x19\xf9\xe8\xa3\x8f\x92\xfcg\xb5P\x92\f\xda\xfb\x80\xac\xb0\xd2\xaa\x19=\xfa\xb9o\xbd\xe6WC\xa1/\xaf\x31s\xe6\xac\xb4m\xdb\xb6\xc1\xf5\xf7\xeb\xb7\x45.\xbf\xec\xa2\x1c}\xecI\x19\x39\xea\xd1\xda\xf1/\x7f\x98u\xf9\x65\x17\xcd\xf7\xb7\xa0\x1(\xe\xd7^wC\xc6O\x98\x30\xcfx\xbbv\xed\xd2\xae\x9e\xaf=\xe3'L\xc8\x35\xd7\xdd\xb8(Jkt\x85\xfa:j\xc5\x10\0\0\0@\x3\xcd\xae\xac\xcc\xe1G\x1c\x97G\x1f{<\x97\\t~\xf6\xd8}\xd7$\xc9\x5\x17\xfd&\xa3\x9f{!\xc3\xef\xbb\x33K/\xdd\xea{_\xe7\x8b/\xbeH\x92t\xea\xd4\xb1\xde\xe3\xf7\xdew_.\xbd\xf4w9\xe5\x94\x13\xd2\xb6M\x9b\xdc}\xf7=\xd9\x65\xb7\x41\x19\xf9\xf0\x3Yf\x99\x65r\xebM\xd7\x65\xbf\xfd\xf\xcd\t\xc7\x1e\x9e~\xfd\xb6J\xf7\xee\xdd\x17\xe8\xbas\xe6\xcc\xc9K/\xbd\x9c\xe9\xd3\xa7\xe5\xc9\xbf\xfemn[\xbbSN\xfaN\xef\x61@\xffmj\x7f\xa8u\xf9\x65\x17%I\xed\xe3\xaf\xff\xf6\x33\0\xc5g\xddu\xd7I\xe7\xce\x9d\x32q\xe2\xc7\xb5\x63G\x1d\xf1\xb3\x1c{\xcc\x91I\x92\x8b/\xf9m\xae\xba\xfa\xba\xda\x63]\xbbt\xc9\x6\xeb\xaf\xfb\xad\xaf;f\xcc\x98<\xf5\xf4?\xea=\xb6\xe9&\x1b.6\xabU\v\xf1uT0\x4\0\0\0\xd0\0_\x86\x42\xff\xfa\xd7+9\xfe\xb8\xa3r\xd2)g$I>\xff|Z\xee\xbc\xf3\xde\xdc{\xcf\xed\xe9\xdc\xb9\xd3\xf7\xba\x46MMM>\xfd\xf4\xd3\f\x1d:,\x3\xb6\xdd\"+\xac\xb0\x42>\xf9\xe4\xd3:\xe7L\x9f>=\xe7\x9d\x7f\x61.\xbf\xec\xe2l\xbe\xf9\xe6I\x92\xf5\xd6_?\x3\xb7\xdb\x31\xf7\xf\x1f\x9e\x43\xf\x39$k\xae\xb9\xc6\xdc\xf1\xf5\xd6\xcdj\xab\xad\xb6\xc0\xd7\x9f\x35kVv\xdbs\xdf\xda\xe7{\xec\xba\xc3<+\x89\x1a\xe2\xab?\xd4J\"\x14\x2\xa0\xd6\xc6\x1bm\x90\x91\xf\xdd\x9f\xb5\xd6\xdd$I\xd2\xaem\xdb\x1c{\xcc\x91\xb5_wN8\xfe\xe8\xdcr\xfb\x9d\x99\xfa\xf9\xd4$\xc9\xc8\x87\xefO\xbbv\xed\xbe\xf5u\xbbv\xed\x9a\x97^\xfeW\xee\xb8\xf3\x8fu\xc6\xf7\xd9{P\x6\xed\xb9\xdb\x42~\x17\x85\xb5\xb0\xbf\x8e\n\x86\0\0\0\0\x16\xd0\x97\xa1\xd0+\xaf\xbc\x9a\xbb\xee\xbc\x39?Xa\xf9,\xd7\xb5KN:\xe5\xf4\x94\x95\x95\xe7\xd6\x9b\xafO\xcfUV\xfa\xce\xaf\x7f\xdb\x9d\xf7\xe5\xb6;\xef\xab}\xbe\xc7\xae;\xe4\xbc_\x9e\x9b\xd2\xd2\xd2y\xce\xfd\xe8\xa3\x8f\x32y\xca\xd4\xf4\xee\xdd\xbbv\xac\x65\x8b\x16\xd9\xba\xdf\x16y\xed\xd5\xff\xf9\xce\x35$I\xabV\xad\xf2\xc1{\xafg\xf6\xec\xd9\x19\x33\x66L.\xbe\xf8\x92\xfc\xfc\xf0#s\xdb\xad\x37\xa7y\xf3\xe6\xdf\xeb\xb5\x1\xe0\xfb\xa8\xae\xae^\xa0\xf3\x9a\x35k\x96_\x9dwvJJJr\xfb\x1dw'I\xf6\xddgP\xce;\xf7\xac\xef\xf5\xcb\xeK\x2\xc1\x10\0\0\0\xc0\x2\xa8\x13\n\xddqsVX\xa1G\x92\x64\xf7\xddvIiYY*\xca\xcb\xb3\xee:k\x7f\xef\xeb\xdc}\xc7\xb0\x94\x95\x95\xa7k\xd7\xae\xe9\xda\xb5KJJJ\xea\xafg\xf6\xec$\xf3\xfe\x80\xacyE\xf3\xb4h\xb1p\xc2\x9b\x8a\x8a\x8a\xac\xb8\xe2\x8a\x39\xea\xa8#\xd3\x7f\xbb]\xf3\xce;\xef\xa4o\xdf\xbe\r~\x9d\xaf\xee\x85\x90h%\a\xc0\x7f\xfc\xf7\xdf\x9f\xc9\x31\xc7\xfd\xa7]\xe9\x94\xcf>\xcb\xa5\x97]\x91\xe3\x8e=2555\xb9\xf8\x92\xdf\xd6\xae\x16J\x92\x81\xdb\xef\x96\xcb.\xbd\x30\x1bm\xb8\xfe\xb7\xbev\xb3\x66\xcdr\xfe/\xcfJII\x92\x92\x92\x9cw\xce\x99\x8b\x65(\xb4\xb0\xbf\x8e\n\x86\0\0\0\0\x16\xc0\x15W\\\x95W_}\xadN(\xf4\xa5]v\xda\x61\xa1\\c\xdf\xbdv\xcb\xfa\xeb\x7f\xfb\xf\xba\x92\xa4{\xf7\xee)-m\x96\x97^z)\xcb-\xb7\\\x92\xb9{\x3\xfd\xf7\xdf\x9f\x99\xa7\x45Nee\xe5\x2\xd7PUU\x95\xb2\xb2\xba?2\x9a>}z\x92\xa4M\x9b\x36\v\xfc:_\xfa\xea\xf\xb3\xbe\xfc\x1\xd6W\xf7J\x10\xe\x1\x14\xb7\xd1\xa3\x9f\xab\xb3\xbfP\x92\\\xf1\xfb\xabs\xcbmw&55\x99\xf2\xd9gu\x8e\x8d\x9f\x30!\xff|\xf6\xb9\x5\n\x86\x92\xb9\xe1\xd0y\xe7\x9eU\xfbxqS\x88\xaf\xa3\x82!\0\0\0\x80\x5p\xd8\xa1\ag\xf0\xa0=\xd2\xbd{\xe3lV\xbd\xd4R-\x93$/\xff\xeb_\xe9\xd8\xb1\x63\x96_~\xf9\x9cx\xfc\x91\x39\xe5\xd4\xb3\x32\x63\xc6\x8ct\xeb\xd6-#G\x8e\xca\xf4\xe9\xd3\xb3\xd3N;%\x99\x1b\xe4\xac\xbc\x62\x8f<\xf0\xc0\x83i\xdd\xbau:v\xec\xf8\x8d\x9bmWWWg\xa7\x9dw\xcd\x66\x9bn\x92\xbe}\xfb\xa6M\x9b\x36\x19?~\\\xae\xb9\xf6\x86\x1cr\xd0~\xe9\xde\xbd{\x83j~\xfc\xf1'\xeb\xfd\xc1\xd5W\xf7J\xb8\xea\x8a\xcb\xd2\xaf\xdf\x16\r\xff\v\x1`\x89p\xd8\xa1\a\xe7\x8e;\xef\xc9\xf8\t\x13\xea\x8cO\x99\x32\xa5\xde\xf3\xbbv\xe9\x92\x9f\x1dvP\x83\xae\xb1\xb0\x3\xa1g\x9e\x19\xfd\xad\xe7\xbc\xf5\xd6\xdb\xdf\xfb:\x85\xfa:Zz\xe4\xd1\xc7\x9f\xdd\xb6u\xab$\xc9\xe7Sg\xa4\xc3\x32\xad\xbfw\xb1@\xd3PU5\xb7\x9d\xc0\xe7Sg\xe4\xcb\x8f\xf3\xf9\xf9\xea\x39>\x17\0\0\0\x8b\x83O'O\xab\xf3}LC\xbe\xef\xf9.\x9a\x37\xaf\xf8N+f\x16\xd4\xa3\x8f>\x96\x66\xcd\x9a\xa5_\xbf~\xf3\xb9~\xf3t_n\xd9\\}\xcd\rIMu6\xdcp\x83\xac\xf5\xe3\x1f\xa7\x63\x87v\xb9\xf7\xbe\xe1yx\xc4\xa8\xf4\xea\xd5\x33\xbf\xfe\xd5y\xb5\x9br\x97\x94\x94\x64\xddu\xd7\xce\x88\x91#s\xef}\xc3\xb3\xf2J+\xa6g\xcf\x9e\xf3\xad\xa1\xa6\xa6&={\xae\x92\xb7\xde~;#G\x8e\xca\x1f\xef\xb9?3fL\xcf\x1\xfb\xf\xc9\xfe\xfb\xf\x99g%\xd1\xb7i\xde\xbc<\xeb\xaf\xb7n\xb6\xdd\x66\xde\xf7\xb4\xca*+g\xb5>}\xd2\xa7O\xcf\x82\xfe\xbd\x2\xd0\xb4\x95\x97\x97\xa7K\xd7\xce\xe9\xda\xa5K\xae\xb8\xfc\x37Yc\x8d\xd5\xf2\x97'\x9e\xacm\x95ZQ^\x9e\x8b/:?g\x9c\xf6\x8b\xa4\xa4&\x83\a\xef\x9e\xbe\xab\xad\xb6\xc8\xeb\xbc\xe9\xe6\xdb\xb2\xd9\xa6\x9b$%%\x19\x37~\\\xfe\xf7\xc3\xf\xbf\xf1\xcf\xf4\x19\x33\xb2j\x9f\xde\xe9\xb7\xd5\x96\xdf\xf9\x9a\x85\xf8:\xfa\xf9\xd4\x19)y\xf3\xdd\xb1\x35=\x96\xeb\x94$\xf9p\xec\xc7\xe9\xb5R\xd7\xef\\$\xd0\xb4\xcc\x9cU\x95\x64\xee\xc7\xf6\x97\x1f\xe7\xf3\xf3\xd5s|.\0\0\0\x16\ao\xbd\x37\xae\xce\xf7\x31\r\xf9\xbe\xa7XM\x9d:5\xef\xbf\xff\xfe|\x8f/\xb5\xd4RYy\xe5\x95\x17]A\0P\x8fm\x6\xee\x94\xb7\xde\x9c\xbb\xe2\xa6w\x9f^y\xe4\xe1?5rE\xc9V[\xf\xcc\xe\xdb\xf\xcc\xf\xd7\\\xf3[\xcf\xed\xd0\xb1\x43~\xf4\xc3\x35\x16\x41U\r\xf7\xe1\xd8\x8f\xb5\x92\x3\0\0\0(\x16\xef\xbf\xff~v\xd8y\xd0|\x8f\xef\xbe\xcb\xf6\xb9\xf4\xd2K\x16\x61\x45\0\x30\xaf\xad\xb7\xdc\"m\x96\x9e\xdb\xd1h\xfd\xf5\xd6i\xe4j\xe6\xea\xde\xa3G\x1e|hD\x1e|h\xc4\xb7\x9e\xbb\xc1\x6\xeb\x35\xd9`(\xb1\xc7\x10\0\0\0@\xd1Xc\x8d\x35\xf2\xc1{\xaf\x37v\x19\0\xf0\x8dN>\xe9\xb8\xc6.a\x1e\x37\xf\xbd\xb6\xb1KXh\x16\xee\x8eK\0\0\0\0\0\0\x34Y\x82!\0\0\0\0\0\x80\"!\x18\x2\0\0\0\0\0(\x12\x82!\0\0\0\0\0\x80\"Q\xd6\xd8\x5\0\0\0\0,j\xdb\\\\\xd9\xd8%\xb0\x90;:\x1bo\xb4\x41\x63\x97\x2\x8b\x94`\b\0\0\0\xa0\x1e\xa3\x9f{!\xf>4\"=WY\xf9[\xcf\x9d\x36mZ\xee\xb9\xf7\xfe\xcc\x9c\x31+?\xf9\xc9\xde\x8b\xa0\xba\xa6\xe7\xcbPh\xca\x94\xcf\x92$g\x9e}\xfe\x12\x1d\xe\xbd\xff\xc1\x87y\xe7\x9dwk\x9f\xbf\xfe\xc6\x1b\xa9\xaa\x9a\x93$M6\x18\xfa\xdb\xd3O'Y\xf4\xc1\xd0\x97\xa1\xd0\xdf\x9ez:7\xf\xbbn\x91^\x9b\x45g\xce\x9c\x39)--\xad}\xfe\xce{s?>\x9e\x1f=\xf7\xdf\xdd\x1a?Z?\xef\xbc\xf7n\x9d`\xe8\xebs\x16\xa5\x39s\xe6\xe4\xf8\x13NI\x9bvm\x4\x43\x14\x1d\xc1\x10\0\0\0\xc0|\xf4\\e\xe5<0\xfc\xee|\xfa\xe9\xa7\xf3=\xa7M\x9b\x36)--\xcb\xf1'\x9c\x92\xd3\xcf:7I\x8a.\x1c\x1a?~b\xce<\xfb\xfc\x94\x95\x96\xe5\a+,\x9f$\x99\x36mz\xce<\xfb\xfc\xfc\xfa\xbc\xb3\xd2\xa5K\xe7\x46\xaep\xe1\xfb\xed\xa5\x17\xfe\xe7\xf1\xe5W\xe6\x95W_KYY\xe3\xfc\x80\xbb\xa9;\xf9\x17gd\xc4\xc8GRVV\x9a\xff:\xfc\x98\xf4\xe8\xde=[m\xb5y\x86\xec\xb7w\xda\xb4i\xd3\xd8\xe5\xb1\x10TWWg\xd0^C\xd2m\xb9\xae\x39\xec\xb0\x83\x32\x63\xc6\xcc\xfc\xe1\xf\xd7\xa7u\x9b\xd6\xb5\xf7\xb8M\xeb\x36\xb9\xea\xaa\xeb\xd2\xa9\x63\xa7\xb4n\xbdt\xae\xb9\xe6\x86\x8c\x1d\x37>\x7f\xbc\xeb\x96\x94\x94\x94\x14\xa4\xae\xca\xca\xaaz[\x17\xce\r\x85~\x91?\xfd\xf9\xa1\xfc\xfe\x8aK\vr\xed\xaf\x9b\xf2\xd9gY\xba\xd5\xd2M\xee\xf3\xc4\xfc\xfe\x8eX\xb2\xb9\xe3\0\0\0\0\xdf\xe0\xd3O?\xcd:\xebo6\xdf\xe3\xbf\xbd\xf4\xc2\xec\xba\xcbN\xf9\xcd%\x17$IN?\xeb\xdc\xb4\\\xaa\x45Q\xb5\x95k\xdf\xbe]~\xfc\xa3\x1f\x66\xd0\x1e\xbb\xe4\x86\xa1\x37'IN>\xf1\x98\xdc}\xcf\xf0\xb4o\xdf\xae\x91\xab+\xac\xdf^~e.\xbb\xfc\xf7\x39\xf6\xe8\xc3\xf3\xd8\xe3O6v9M\xca\xbb\xef\xbd\x9f$\x19 \xbds\xd6\xe9\xa7\xd6\x9es\xee\x39\xa7\x65\xe8\xb0[3x\xef!I\x92.\xcb.\x9b\xf1\x13&\xe4\x81\a\x1f\xce\xce;n\xbf\xd0k\x1a\x31\xf2\x91\xfc\xe6\xd2\xcbs\xeb-7\xa6\xcb\xb2\xcb\xd6\x8e\xcf\x99\x33''\x9ctZ\x86?\xf0`.\xb9\xe8\xfc\xef\xdd\x9e\xef\x83\xaf\xad\x1e,//\xcb\x66\x9bm\x92\x64\xee\xbf\xa9;\xee\xfc\x63\xae\xb8\xf2\xea\x8c\x1d\x37.\xcd\x9b\x37\xcf\x66\x9bm\x92_\x9esz\xbav\xe9\xf2\xbd\xae\xfbmjjj2{\xf6\xeco\xdc\xd3\xe9\xeako\xc8\x85\x17]\x9a\r\xd6_77\r\xbb\xae\xb6\xed\x1fK>\xc1\x10\0\0\0\xc0\x42PVV\x9a\xdf\\rA^\xfe\xd7+\xf9\xc7\x33\xa3\x8b\"\x18\x1a\x37n|\xda\xb5k\x97\x96-[\xe4\xa8#\xe\xabs\xacK\x97\xce\xb5\x63\xb3g\xcf\xce\xa4IS\x96\xb8\x95\x43_\r\x85\x8e\x39\xfa\x88&\x1f\f\xf5\xdb\x62\x8b\x45v\xad\xb7\xde|;{\xee=$}z\xf7\xcc\x9d\xb7\xdf\x94\xa1\x37\\\x93\x3\xe\xfai\xaa*+3\xfc\xde;\xf3\xe6\x1bo\xe5\xe8\xe3O\xca\x90\x3\xe\xc9\x1d\xb7\r\xcb\xba\xeb\xac\xbdP\xae[]]\x9d[o\xbb=I\xb2\xc3\xf6\xdb\xa5\xd3\xb7\xec\x17\xf4\xc9'\x9f\xe4\xc1\x87\x1e^(\xd7\xfe\xbe\xce:\xe7\xfc\xdcs\xef\xfd\xdfx\xce\x8f\xd6\xde\xa8\xde\xf1=v\xdf\xb5`{7}\x9b\x99\x33g\xe6\xc2\v/\xcd\xfa\xeb\xad\x93;o\xbf)O<\xf1\xb7\xfc\xeb\x95Wr\xf8\xe1?\xab\x13\x34\xec\xba\xcbN\xd9\x61\xfb\xedr\xe5U\xd7\x64\xcd\xd5\xfb\x66\xcb-7\xcb\xe0\xbd\x87\xe4\x82\v~\x93\xfe\xdb\xf4K\x8b\x16-\x16ZM\xf\x8f\x18\x95#\x8e:>555\x19\xbc\xd7\x90\xdcy\xc7M\xe9\xda\xa5K\xe6\xcc\x99\x93\x13O>=\xf7\xf\x7f \x17]x\xfe\x42\xf9<=\xea\x91Gs\xfe\xaf/\xae}\xde\xae]\xbb\xbc\xfc\xc2?\x92$\x97\xfd\xf6\x8a\\\xf1\xfbk\xb2\xff\x90}\xb2\xd9&\x9b\xe4\x93I\x93r\xd5U\xd7\x64\xfb\x1d\xf7\xc8\x63\xa3\x1eH\xfb\xf6\xed\xbf\xf7\xf5\xeb\x33{\xf6\xec\xec\xbd\xef\x81y\xfe\x85\x17s\xd2\x89\xc7\xe6\xe7?;\xb4\xde\xf3\x86\r\xbb\x35\xd5\xd5\xd5\xf9\xfb?\xfe\x99\x7f\xbf\xfb\xef\xf4\xee\xd3\xab \xf5\xd0\xf4\b\x86\0\0\0\0\xbe\x41iii\xbau\xeb\x36\xdf\xe3\xadZ-U\xfb\xb8\xac\xac\x34K/\xbd\xf4\xa2(\xab\xd1}\xb9\xa7\xd0\x1a\xab\xaf\x96\xe3\x8e\x39\xfc\x1b\xcf\xbd\xfa\xda\x61y\xf1\xa5\x97\x97\xa8=\x87\xbe\x1e\n-\xe\xf6\xdbo\xaf\x45r\x9d\xca\xca\xaa\x1cu\xdc\x89\xe9\xd8\x61\x99\\{\xcd\x15)))\xc9\x6\xeb\xaf\x9b\xa1\x37\\]{N\xef>\xbd\xf2\xa7\xfb\xee\xca\xe;\xed\x9e#\x8e<>\x7f}b\xe4\x42\r\x6Xt\x9e}\xf6\xb9\x8c\x1d\x37.\xcbv\xe9\x9c\xf1\x13&\xa4_\xbf-\xd2\xaf\xdf\x16I\x92\x17_|9w\xdcyw\x92\x64\x9f}\xf6\xca\x8f~\xb8\x46\x8e=z\xee\xe7\x8b\xb1\xe3\xc6\xa5\xb2\xaa*\xe3\xc6\x8f\xcf\xb3\xa3\x9f\xcf\x66\x9bn\xbcP\xeay\xe8\xe1\x91\x39\xf2\xe8\x13\xb2\xd5\x96\x9b\xe7\xf8\x63\x8f\xca~\xfb\x1f\x92\xc1{\xf\xc9\x1d\xb7\r\xcb\xa5\x97]\x99{\xef\x1b\x9e\x8b.\x83\xf6\x98\x1b\n\xcd\xae\xac\xfc^+e\xf6\x1e\xbcg\xb6\x1b\xd8\xbf\xf6yI\xb3\xb9\xab\xd4\xde\xff\xe0\x7fs\xe5U\xd7\xe6\xcc\xd3\x7fQg_\xaf\x81\xdbn\x9d\xfe\xdb\xed\x92\v/\xbe,\x17\xfe\xfa\x97\xdf\xf9\xba\xdf\xe4\xf5\x37\xde\xccs\xcf\xbf\x90$\xb9\xfd\x8e\xbb\xea\r\x86\x1ex\xf0\xa1L\x98\x38\x31I\xb2\xce\xdake\xc5\x95W,H-4M\x82!\0\0\0\x80o\xd0\xbe}\xfb\xfc\xfd\xa9\xc7\x16\xf9u\xc7\x8c\x19\x93\xa7\x9e\xfeG\xbd\xc7\x36\xdd\x64\xc3o\f\xab\n\xed\xcbP\xa8\xac\xb4,\xfb\xec\xb5\xe7\xb7\x9e?h\x8f]\xf2\xca+\xaf\xe5\xcc\xb3\xcf_(\xe1\xd0\xc7\x1f\x7f\x92\x97\xfe\xf5j\xbd\xc7~\xb4\xe6\xea\xe9\xd4\xa9\xe3\xf7z\xfdo3\xbfPh\x95UVn\xb2\xc1WU\xd5\x9c\x8c\x18\x35*S&}\x96\xbd\xf7\x1eT\xd0}N\x9ex\xf2\xc9\xbc\xfe\xfa\x9b\xb9\xef\x9e\xdb\xd3\xb6M\xdb\xda\xf1\r7X\xaf\xcey\xcd\x9b\x37\xcfo.\xb9 ;\xee\xbcg\xee\x1f\xfe\xe7\xec\xbd\0\xff\x96\x96\x64\xc7\x1d{D\xe>hH\xbd\xc7\xce<\xeb\xbc$\xc9\xb9\xe7\x9c^\xef\xf1\xb6m\x1bo\xaf\xa6\xcd\x37\xdf\x34\xb7\xdct}\x8e\x39\xee\xe4\f\xdcn\xd7\xfc\xf1\xce[\xd2\xabw\xcf\xbc\xf8\xe2\xcb\xd9}\xd0\xbe\x99\x33gN\x92\xe4\xde\xfb\xff\x94\xfb\xee\xb9#?\\s\x8d\xbc\xf5\xe6\xdb\xd9\x63\xf0O\xd2\xb2\x65\x8b\xdc~\xeb\xd0\x85\xd6N\xf0\xcf\xf=\x9c\xa3\x8f\x39)[m\xb5\x45\xae\xba\xf2\xb2T\x94\x97\xe7\xae;n\xce^\xfb\xec\x9f\xad\xb6\xde>\xb3\x66\xcd\xca\x85\x17\x9c\x97\xc1{\xee\x96$y\xf5\xb5\xff\xc9#\x8f\xfc\x1f{w\x1e\xa6UY\xff\xf\xfc=\xcc\x80\x1a\xb2\x83\xb1\xbb\xa0\x88\xa2\x96K\xae\xb9+\x8b\xfbR\xb8\x86\xa2\x46}\xcb-sKs_33\xb7\xac\xd4\xdc\x15\x33Ksc0\\\xca\x36\x45\xfbi\xdfL\xcb%\xcd\xaf\x80\xa0\x88\x80\xe\xc8\xc0\xfc\xfe \x1f\x19g0\x6\xe6\x61\x6\xce\xebu]^\xd7y\xee\xe7\xdc\xe7|\x1e\xce\xcc\\0o\xef\xfb\x33>'|\xeb\xd8%\xbeg\x87\x8e\x1d\xd2\xa1\x63\x87\x6\xe3O?\xfdL*\xdb\xb4\xc9!\x87\x1c\xd0\xe0\xfc/\x7fi\x9f\xfc\xfa\xbe\a\x97\xf8\x9e\x9f\xa6\xb6v^n\xb8\xe1\x96\xd2\xeb\x37\xdf\x9c\x94\xfb\x1ex0{\xed\xf1\xf1v}\xf7=\xf0`\x8e;\xfe\xe4\xec\xb3\xf7\x9e\x39\xfb\xac\xef\xa4\x63\x87\x8e\x65\xeb\xf3\x44\xeb$\x18\x2\0\0\0h\x85z\xf5\xea\x95g\x9f\xfbk\xc6\xdc\xf9\x8bz\xe3\a\x1f\x34\"#\xfe\xf3K\xcd\x96\xf0Q(4}\xfa{Yc\xf5\xfe\xa5\x9e\x42\x1f\xf9\xe7K\vzm\\p\xd1\xa5\xf5\xc6W]\xb5}^{\xfd\xdf\xcd\x12\xeu\xeb\xd6\x35/\xbf\xf4J\x1e\x1e\xffX\xbd\xf1!\xbb\xee\x94\x9dw\\t?\xa8\xe6\xf0i+\x85.\xbf\xec{e\xbd\xf7\xe2\xb8\xf1\xa6\xdb\xf2\xbb\xdf\xff\xbe\xf4z\xe7\x1dv\xc8\xa1\x87\x1e\x98\x31\x63\xee\xcaw\xcf:7I\xd2\xb9k\xa7\xec\xb9\xfbn\xb9\xed\xb6;\xf3\xc8\xe3\x8f\x97\xce\xdd\xee\x8b_\xac\xb7\xb2\x61I\x8d{\xf8\xd1\f\\g@6\xd9\xf8\xf3\xff\xf5\xdc\x8d\x36\xdc \xab\xaf\xde/O\xfc\xfe\x8f\x85\xf\x86\xfa\xf4\xee\x9d>\xbd\x1b\xff\xbe\xe8\xd0q\xc1J\xc4\xf5\xd7\x1b\xb4,KZl\xdbm\xbbM~x\xe9\x45\x19\x39jt\xe6\xce[\xd0\xb3\xe9\xf6\x31w\x96\x42\xa1\x64\x41`q\xc7\x98\xbb\xf2\xb9\x8d\x36\xcc\x9c\xb9\x1f\xe6\xbd\x19\xef\xe5GW_\xd6\xec\xa1\xd0\xce;\xed\x98\x1f]}Yi\x15\xd0\xda\x3\xd6\xcc\x9dw\xdc\x9c\x83\xf\x39<\xe7\x9cuz\xe\x1c\xb1\x7fi\xce\xa9\xdf\x39\x33\x1bo\xf2\xb9\x66\xb9\xff'\xcd\xae\x99\x93\xb6\xed\xda\xa6\xaa\xb2\x61\b\xdbn\xa5\x95\x32s\xd6\xfb\xcd~\xcfy\xf3\xe6\xe5\xdb'\x9e\x9a\xfb\x1ex(W^qiv\xda\x61\xfb\x9cy\xf6\xf9\x39\xee\xf8\x93\x93${\xed\xb1{)\x14\xda{\xaf=r\xe9%\x17\xa4\xb2\x91\xfaX\xf1\t\x86\0\0\0\0\x9a`\xce\x9c\x39\xb9\xf7?\xff\xa7\xf7>{\xed\xfe\xa9\x8d\xbd\x97\x46\x9b\x36mr\xe1\xf9g\xa7\xa2\xa2\"w\x8cY\xb0\x15\xd3!\a\x8f\xc8\xf9\xe7\x9e\x95\x36m\xda\x94\xe5\x9e\xcb\x8b\x36m\xda\xe4k\xa3G%\x15\x15y\xf8\x37\x8f&I\x86\xe\xd9)\xa3\x8f:\xbc\xac\x7f\x36\xcb\xe3\xf6q\x1f\xe9\xdc\xf5\xe3\x95;\xd3\xa7\xbdW\xd6{\xbd\xf1\xc6\x1b\x19\x30`\xc0\x62\xaf@\x18\xb4\xee\xa0L\x9c\x34\xa9\xac\x35\xd1:\xd5\xcd\x9f\xdf,\xd7y\xf8\x37\xe3s\xecq'e\xd7]v\xce\x8f\xae\xba,m\xdb\xd6\xff\xb5\xf7\xda\x3\xd6\xcc\xa3\xe3\x1f\xca\xaa\xab\xb6\xaf\x37^\xfb\x9f\x10ki\xdc\x31\xe6\xae\\}\xcd\xb5\xa5\xd7\x9d:v\xc8\xd8\a\xef\xc9\x86\x1b\r\xce\xfb\xef\x7f\x90\xdf\xfe\xf6\x89\xec\xb8\xe3\xf6\x1f\xdf\xb3v^\xaa\xab\x7f\xb3X\xc1iS,\b\x85\xbe\x93\xfb\x1ex(W\\~Ii\x85\xd0\xa5\x97\\\x90$9\xee\xf8\x93s\xd1\x45?\xc8\xe4\xb7\xde\xca\xde{\xee\x9e\x1f|\xff\x42\xa1P\x81\t\x86\0\0\0\0\x9a\xe0+\x87\x1d\x95'\x9fz:I\xf2\xab_\xdd\x9b;\xef\xb8\xb9l[\xf0\xb4i\xd3&\x17\x9cwV**\x92TT\xe4\xfcs\xcel\xf1P\xa8_\xdf\xde\x39\xf7\xec\xd3s\xe6\xd9\x17\x64\xd6\xac\xf7s\xcaI\xc7\xa7g\xcf\xd5J\xef\x7f\xb4R\xe8\xf4\xef\x9cX\x1a\x9b \x9c;7/\xbf\xfcJ\xbd\xb1\x99\x33\x66%I\xfe\xfe\xc2\x8b\xf5\xc6\xd7^{\xc0R\xf5\xc7i.\x8f?\xfe\xbb\x9cp\xd2i\xe9\xdc\xa9S\xdaV.x\x96\x87\x1ct`~u\xcf\xfd\xa5UCUU\x95\x39\xf8\xa0\x11I\x92\x95\xda\xb6K\xa7\x8e\x9dr\xc2I\xa7\xe5\xb2K/Z\xea\xfe\x42O\xfc\xe1O\x19\xb2\xeb\xce\xb9\xfa\xca\x5\xa1\xd0\x8b/\xfe#\xb5\xf3\xe6\x65\x83\xc1\xeb\xe7\x9e_\xdf\x9f\xbd\xf6\xd8\xad\x14\n\xfd\xe9\xcfOe\x8d\x35\xfa\xa7W\xcf\x9eKu\xcf\x8f\f\x18\xb0V\xf6\xda\x63x\xe9\xf5\xca\xab\xac\x92\x64\xc1j\xb8\xddw\x1b\x96o\x9d\xf8\x9d\x9cw\xeew\xb3\xfd\xb6_\xcc[S\xde\xce\xa5?\xb8<\x7f\xfd\xdf\xbf\xe5\x9b\xdf\x18\xdd,\xf7\xaf\xab\xab\xcb\x8c\x99\x33r\xd6\xd9\x17\xe6\xd7\xf7?X/\x14J\x16\xf4\xc9;\xef\x9c\x33\xf2\xab{~]\n`\xcf;\xf7L\xa1P\xc1\xf9\x89\v\0\0\0\xb0\x98&N\x9aT\n\x85\x92\xe4\xcfON\xc8\xa4\xc9\x93\xd3\xbbW\xaf\xb2\xdd\xb3M\x9b\x36\x39\xff\xdc\xb3J\xc7\xad\xc1\xc2\xe1\xd0]w\xdf\x9b\x63\x8f\xfe\xf4_p\xdeu\xf7\xbd\xa9\x9dW\xdbl\xa1\xd0G\xda\xb4i\x93\xd1G\x1d^:n.o\xfc\xdf\xc4z\xbf\x98_^B\xa1OSUU\x99\xaf|\xe5\xa0\x65r\xaf\xb5\xd7\x1e\x90_\xdf\xf7`\xe6\xcd\x9b\xf7_\x7f\xf9<\x7f\xfe\xfc\xbc\xf8\x8f\x7f\x66\xe7\x9dvX&\xb5-\xf\xa6\xbc\x35%\xc3w\xdf\xb7\xd1\xf7>9\xfe\x87\xdf\x8dO\xdf\xbe-\xd7o,I~\xfb\xdb'r\xd8\x11_\xcb\xc6\x1b\x7f.?\xfe\xd1\xe5\xa5\xc0\x65\xe3\x8d?\x97_\xdeu{\xc6\xdcyW***r\xd0\x41\a\xe4s\x1bm\x98$\x19\xb8\xee:\xa9\x1e{O\xbeq\xf4\xb7\xf2\x95\xc3\x8e\xca-7^\x9b\xed\xb7\xdfv\x89k\xd8u\xa7\x1d\xb3\xd5V[\xa6m\xdb\xaaL\x9f>=\a\x1e\x32*W_\xf9\x83$\xc9}\xf7?\x98\xbf?\xff\x42N?\xed\xe4\xfc\xeb\xb5\xd7\x33\xea\xc8\xaf\xa7\xfa\xa1{\x97\xfe\x83\xff\xc7\x16\x9bo\x96-6\xdf\xac\xc1xEEE\xbew\xd1y9\xeb\x9c\vr\xf4\x31\xdf.\x8d\xf7\xed\xdb;\xeb\xad\xb7nN?\xe3\xdc\f\x18\x30 \xeb\xac\xbd\xd6\x12\xdf\xfb\xc3\xf?\xcc\x41\x87\x8c\xca\xd3\xcf\xfc%m\xda\xb4i\x10\n}\xa4}\xfb\xcf\x64\xb3M7\xc9\xd3\xcf\xfc%_\xd8l\xd3\x6+\xa7(\x1e\xc1\x10\0\0\0\xc0\x62\xea\xd6\xb5k:w\xea\x94\xe9\xef-\xd8\x8a\xabs\xe7\xce\xe9\xd6\xb5k\xd9\xef\xdbZ\x2\xa1\x85\xf5\xeb\xdb;\x17\x9d\x7fV\xbav\xed\xfc_\xcf\xfd\xfa\xe8\xc3\x33m\xda\xf4z+\x8b\x9aK\xb9\xfflV\x84P\xe8#\xb7\xddvg\x92\x94\x65\x95\xd0\xc2\xf6\xd9{\x8f\xdc|\xcb\xed\x19\x33\xe6\x17\xff\xf5^w\xdd}O\xa6L\x99\x9a\xbd\xf7\xda\xa3\xac\x35Q>[l\xf1\x85\xf4\xe9\xdd;\xed\xda\xb6\xcdgW[-\xe3\x1fy,\xcf=\xf7\xd7\x1c\xfd\xcd\xafg\xe3\x8d?\x97\x8d\x37\xfe\xb8\x87\xcf\x9c\x39sr\xf5\x8f~\x92\xcf\x7f\xees\xd9\x61\x87m\xd3\xb6\xaa*}\xfa\xf4\xc9\x96[n\xbeT5l\xb7\xdd\x17K\xc7\xd3\xdf\x9b\x91w\xdf}\xb7\xde\xfb/\xbf\xfaj\x92\x64\xf2\xe4\xb7RSS\xb3T\xf7j\x8a\xe\x1dV\xcd\x65\x97^\x94o\x7f\xeb\xe8\xbc\xf0\xe2?\xd3\xb9s\xa7l\xb4\xd1\x86\x99]S\x93\xaf\x1cvT\xe<\xf8\xb0\xdcy\xc7\xcdK\x1c\xe\xfd\xeb\xd5\xd7\xf2\xf4\x33\x7fI\x92\xac\xd6\xa3G\xa3\xa1P\xb2 \xa4\x1as\xfb\x8dy\xe9\xe5W\xb2\xce\xda\x8b\xbf\xcd#+.\xc1\x10\0\0\0\xc0\x62Zi\xa5\x95r\xc3\xcf~\x9cK\x7fpE***r\xe2\xb7\x8f+[\x8f\xa1\xe5\xc1GA\xcf\xdb\xef\xbc\x93\xab\xae\xbe\x36\xdf\xfc\x9f\xa3J\xef\xbd\xf5\xd6\x94\\\xf3\x93\x9f\xe5\x98\xa3G\xa7{\xb7ne\t\x85\xcamE\n\x85\x92\xe4\x91\xc7\x1fOR\xfe`h\x93\x8d?\x9f\x83\xe\xfcr.\xbe\xf4\xb2|~\xe3\x8d\xb2\xc1\xe0\xf5\x1b=\xef\xf9\xbf\xbf\x90\x8b.\xfa~\xf6\xdfo\x9fl\xb5\x94\xc1\xc0G\xda\xb4i\x93\x83\xfZ\xf0\xf9\xaa\x16\x63{\xba\xee\xdd\xbb\xe7\xd0\x43\xeN\x92\xdc\x31\xe6\xce\x66\xa9\x61i\xf5\xea\xd5\x33\xcf>\xf3\xc7zc\xbf\a\xf8\xb7\0\0 \0IDAT\xc7\x1c\xb7`k\xc6\xab\xae\xb8\xb4\xdex\xc7\x8e\x1d\x97Y]\x8b\xb2\xf2\xca+\xe7\x94SN\xc8\xb1\xc7\x9d\x98\xad\xb6\xd9)\x93\xdfz+I\xf2\xe0\x43\xd5\x19=\xfa\xa8\x1c\x38\x62\xff$\xc9\x9d?\xbf;\xd7^\xf7\xb3\xbc\xf2\xeakI\x92\x9e\x9f\xfdl&\xbf\xf5V\xae\xba\xf2\xd2\x66\xf9\x39\xfa\xfa\xebod\xf5\xd5\xfb-\xf5u\x9a\xea\xb9\xbf\xfeo\x9e|r\xc2\"\xdf_y\xa5\x95\x33r\xe4\xc1\xe9\xd3\xe7\xe3\x95]\xed\xda\xb6\xcd\xad\x37__\n\x87\xee\xba\xf3\xd6\fXk\x8d&\xdf{\xad\x1ke\x9b\xad\xb7\xca\x9f\xfe\xfc\x64\xeod\v\xc9\x85\xb5k\xd7.\x83\xd7_\xaf\xc9\xf7`\xc5$\x18\x2\0\0\0h\x82M7\xd9\x38\x63n\xbf\xa9\xa5\xcbhUf\xcf\xfe\x30\xff~\xe3\xffr\xfa\x19\xe7\x97\xb6(\xfa\xee\x99\x17\xa4v^mf\xcf\xfe\xb0\x85\xab[2/\xbc\xf8\x62\xfe\xf7o\xcf\xaf\x30\xa1\xd0\xb2v\xda\xa9'\xe6\xf9\xe7_\xc8\xbe\xfb\x1f\x94\x93N<>{\xef\xb5{>\xbb\xda\x82p\xf0\xad)S\xf2\xc0\x83\xd5\xf9\xde%\x97\x65\xc0Zk\xe6\x8c\xd3On\xb6\xfbVTT\xa4m\x13z\xee,|~kYEQYY\x99.]\xba\xd4\x1bk\xdbnA\x8d\x9f\x1co-\xf6\xda\x63\xb7\xdcz\xeb\x98\xf4\xed\xd3;\xa3G\x1f\x91\x19\x33\x66\xe6\xacs.\xc8\xf9\x17~\xaf\x14\f]p\xe1\xf7\xd3\xbbO\xaf\x8c\xb9\xfd\xa6t\xea\xd4\x31\xd7^{C&N\x9a\x94=w\xdfm\xa9\xef\xff\xe4SO\xe7{\x97\\\x96_\xdd}\xc7R_\xab\xa9\x9ey\xe6\xd9\xfc\xf0\x8a\xab\x17\xf9~\x97\xce]2r\xe4\xc1\r\xc6;v\xec\x98[o\xbe>\x17\\xI\xbau[\xb2\xe7\xda\xb6mU\xee\xb8\xed\x86\xcc\x9d[\x9b\xb6m\xfd\xaa\x9f\xc5\xe7\xab\x5\0\0\0`\x11^z\xf9\x95\xec\xb1\xd7\x97\x9a \xf5\xde\x7f\xf9\xcb\x33Kv\xed\xff\x9b\xb8\xe0\xdaK\x19\xa2\xf4\xe8\xd9?S'\xff{\xa9\xae\xb1(\x9bl\xb2iY\xae\xdb\x1c\x16\xe7\xd9\xd0\xb8\xb7\xdf~;oM\x99\x92\xc1\xeb\x37\xde\xd3\xe8\xbfy\xfe\xef\x7f\xcfj\xab\xad\x96\x1e\xdd\xbb/\xd1\xfcr>\xbb\xeaq\xbfI\x92\f\x1b\xbak\xb3_;)O\xeds\xe6\xcc\xc9\xcd\xb7\xdc^o\xec\xb0\x91\x87X!\x6-\xec\x8d\x89S\xad\x18\x2\0\0\0\xa0\xf9,\xef\xabjX~u\xef\xde=\xdd\x97\x30\xd4I\xb2\xc4\x81\xd2\xb2P\xae@\xa8\x9cVZi\xa5\x8c\xfe\xea\x11-]\x6\xd0\x88\x36-]\0\0\0\0\0\0\0\xcb\x86`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\x34\xd0\xb6\xaamK\x97P\x16m\xdb\xae\x98\x9f\v\0\x16\x97`\b\0\0\0\x80\x6V\xed\xd0\xa1\xa5K(\x8bUW]1?\x17\0,\xae\xaa\x96.\0\0\0\0\xa0\xa8\xfa\xf5\xee\xd1j\xef\xdb\xa7O\x9f\xcc\x98\x31#\xf3\xe6\xd5.\x83\x8a\x1a\x9a:\xf9\xdf\xcd~\xcd\xca\xca\xaa\xf4\xe9\xd3\xa7\xd9\xaf\xdb\x9cZ\xeak\x82\xa5\xb7\xbb\xe5\xb9v\xa0\xe9\xac\x18\x2\0\0\0\xa0\x81v\xed\xda\x65\xbd\xf5\xd6K\x97.]\x97\xfb\xed\xd7\xda\xb6m\x9b.]\xba\x66\xbd\xf5\xd6K\xbbv\xedZ\xba\x1c\0hQV\f\x1\0\0\0\xd0\xa8v\xed\xda\x65\xcd\x35\xd7l\xe9\x32\0\x80\x66\x64\xc5\x10\0\0\0\0\0@AX1\x4\0\0\0\x90\xa4\xae.\xa9\x9d_\x9by\xb5\xf3\x32o~m\xea\xea\x92\xba\xba\xba\x96.\v\0`\x91***RQ\x91T\xb6\xa9JeUe\xaa\xdaT\xa5\xa2\xe2\xd3\xe7\b\x86\0\0\0\x80\xc2\xab\x9dW\x9b\x39s\xe6\x64\xbe \b\0X\x8e\xd4\xd5\xd5\xa5\xae.\x99?\x7fn\xe6\xd6\xceM\x9b\x8a\x8a\xac\xb4\xd2J\xa9\xaa\\t\xfc\x63+9\0\0\0\xa0\xd0\xe6\xcc\x99\x93\x9a\xd9\xb3\x85\x42\0\xc0ro~]]jf\xcf\xce\x9c\x39s\x16y\x8e`\b\0\0\0(\xac\x39s\xe6\xe4\xc3\xda\xb9-]\x6\0@\xb3\xfa\xb0v\xee\"\xc3!\xc1\x10\0\0\0PH\xb5\xf3j\x85\x42\0\xc0\n\xeb\xc3\xda\xb9\xa9\x9dW\xdb`\\0\x4\0\0\0\x14N]]>u\x8b\x15\0\x80\x15\xc1\x9c\x39s\xf2\xc9\xcdr\x5\x43\0\0\0@\xe1\xd4\xce\xaf\xd5S\b\0X\xe1\xcd\xaf\xabk\xb0jH0\x4\0\0\0\x14\xce\xbc\xday-]\x2\0\xc0\x32\xf1\xc9\xbf\xf7\b\x86\0\0\0\x80\xc2\x99\x37\xbf\xe1~\xfb\0\0+\xa2O\xfe\xbdG0\x4\0\0\0\x14\x8e]\xe4\0\x80\xa2\xf8\xe4\xdf{\x4\x43\0\0\0@\xe1\xd4I\x86\0\x80\x82\xf8\xe4\xdf{\x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\xb0\x84\x66\xce\x9c\x99\xeb\xaf\xfbi\xb6\xd8l\x93L\x9d\x32\xe5S\xcf}\xee\xb9gs\xfai\xa7\x66\xf7\x61\x43r\xe1\x5\xe7\x65\xd2\xc4\x89\xcb\xa8J\0\x80\x8f\t\x86\0\0\0\0\x9a\xa8\xa6\xa6&\xf7\xfc\xea\x97\xd9k\xf7\xe1\xf9\xe1\xf.\xcd\xacY3?\xf5\xfcg\x9e\x9e\x90\xc3\xe=$\x3\x6\xac\x9d\x93O=-\xefM\x9f\x9e#F\x8d\xcc\x94\xff\x12&\x1\0\x34\x37\xc1\x10\0\0\0@\x13\xfd\xfd\xef\xcf\xe7\x97w\xff\"g\x9f{~n\x1fs\xd7\xa7\x9e;\x7f\xfe\xfc\\u\xe5\x15\x39\xf6\xb8\xe3s\xc4\x91Ge\xfb\x1dv\xc8\x39\xe7]\x90\xce\x9d:\xe7\xfe\xfb\xee]F\x15\x3\0, \x18\x2\0\0\0h\xa2M6\xd9\x34\x37\xdfz{\xb6\xdf\x61\x87\xb4k\xd7\xf6S\xcf}\xe5\xe5\x97\x33\xe1\xa9'\xb3\xe3N;\x97\xc6V^y\xe5\xec\xb5\xcf>\xb9\xe5\xa6\x9bRWWW\xeer\x1\0J\x4\x43\0\0\0\0MTQQ\x91\xca\xca\xca\xc5:\xf7\xa3\xed\xe2z\xf4\xe8Qo\xbc_\xbf\xfey\xfb\xed\xa9\x99\x39\xb3\xe1\x36t\x83\a\xad\xb3\xf4\x45\x2\0\x34\xa2\xaa\xa5\v\0\0\0\0X\x91M\x9b\xf6N\x92\x64\xa5\x95W\xae\x37\xde~\xd5U\x93$\xb3\x66\xcdL\xc7\x8e\x1d\x1b\xcc[T8\xf4\xfc\x8b/5s\x85\0@\x91\b\x86\0\0\0\0\xca\xa8S\xa7NI\x92\x9a\x9a\x9a\xb4m\xfb\xf1\xb6s5\x1f|P\xef\xfdO\x12\0\x1\0\xe5`+9\0\0\0\x80\x32\xea\xd1\x63\xb5$\xc9[\x93'\xd7\x1b\x9f\x34iR\xfa\xf4\xe9\x9b\xf6\xedWm\x89\xb2\0\x80\x82\x12\f\x1\0\0\0\x34\xb3\xf\xfe\xb3\x1a(I\xd6\x19\x38\x30\x83\xd6[?\xe3\xc7\xff\xa6\x34V[[\x9b\x87\x1e| #\xf?\xbc\x5\xaa\x3\0\x8a\xccVr\0\0\0\0\xcd\xe8\x95W^\xce\x88\xfd\xf7\xcd\xc9\xa7\x9e\x96\x3\xe<(UUU9\xfe['\xe4\xeb\xa3\x8fJ\xdb\xb6UYo\xbd\xc1yd\xfco\xf2\xce;\xef\x64\xb7\xdd\xf7l\xe9r\x1\x80\x82\x11\f\x1\0\0\0\x34\xa3\xf6\xedW\xcd\xe0\xc1\x1b\xa4g\xcf^\xa5\xb1m\xb7\xdb>?\xbb\xf1\xe6\xdc\xfd\x8b\xbbr\xef=\xbf\xca\xf6\xdb\xef\x98\xeb~vc\xbav\xed\xba\xc8\xeb\x8c\xab\x1e[:\x1e:lxYk\x6\0\x8a\x43\x30\x4\0\0\0\xb0\x14\xd6\x1f\xbc\x41\x9e\x7f\xf1\xa5\xd2\xeb\x9e={\xe6\x96\xdb\xc7\x34\x38o\xcb\xad\xb6\xce\x96[m\xbd\xd8\xd7\x15\x6\x1\0\xe5\xa0\xc7\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10z\f\x1\0\0\0\xb4\x42\xe3\xaa\xc7\x96\x8e\xf5\x1b\x2\0\x9a\x8b`\b\0\0\0\xa0\x15\x12\x6\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\xe8\x31\x4\0\0\0\xd0\n\x8d\xab\x1e[:\xd6o\b\0h.\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x44UK\x17\0\0\0\0@C\xd7\\}U\xbd\xd7\xdf\x38\xfa\x98\x16\xaa\x4\0X\x91\b\x86\0\0\0\0Z!A\x10\0P\xe\xb6\x92\x3\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB\x8f!\0\0\0\x80Vh\\\xf5\xd8\xd2\xf1\xd0\x61\xc3[\xb0\x12\0`E\"\x18\x2\0\0\0h\x85\x84\x41\0@9\xd8J\xe\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b=\x86\0\0\0\0Z\xa1q\xd5\x63K\xc7\xfa\r\x1\0\xcd\x45\x30\x4\0\0\0\xd0\n\t\x83\0\x80r\xb0\x95\x1c\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10z\f\x1\0\0\0\xb4\x42\xe3\xaa\xc7\x96\x8e\xf5\x1b\x2\0\x9a\x8b`\b\0\0\0\xa0\x15\x12\x6\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@\x13\xcd\x9e=;w\xdcvk\xc6\x8f\x7f\x38\x1d:t\xcc\xee{\xec\x99=\xf7\xda;\x15\x15\x15\x8b\x9c\xf3\xdcs\xcf\xe6\xb6[n\xce_\x9ey:k\r\x18\x90\xfd\xf6\xffr\x86\xe\x1b\x9e\x36m\x1a\xdf\xd0\x45\x18\x4\0\x94\x83`\b\0\0\0\xa0\tjkk\xf3\x9dSN\xca\xacY3s\xd4W\xbf\x96i\xd3\xa6\xe5\xbcs\xce\xca\xbb\xef\xbe\x9b\xc3\xe\x1f\xd5\xe8\x9c\xe7\xff\xf6\xb7\x1c|\xc0\x97s\xfc\t'f\x9f}\xf7\xcb?^|1\xdf=\xed\xd4\xcc\x99\x33'\xfb\xec\xbb\xdf\x32\xfe\x4\0@\x91\t\x86\0\0\0\0\x9a\xe0\xa9\xa7\x9e\xcc\xef\x9f\xf8]\xc6\x8d\x7f,]\xbbvM\x92t\xea\xd4)\xa7\x9e|b\xf6\xd8s\xaft\xeb\xd6\xad\xc1\x9cG\x1f\x1d\x9f\xad\xb7\xd9&_\x1d\xfd\xb5$\xc9\x36_\xdc\x36sk\xe7\x66\\\xf5X\xc1\x10\0\xb0L5\xbeV\x19\0\0\0\x80\x46U\x8f}({\xef\xb3o)\x14J\x92\xad\xb7\xf9\x62\xe6\xcd\x9b\x9f\xa7'<\xd5\xe8\x9c\xf6\xedW\xcd\xa4I\x93RSSS\x1a{\xe7\xed\xb7\xb3\xf6:\xeb\x94\xbd^\0\x80\x85\t\x86\0\0\0\0\x9a\xe0\xa5\x7f\xfc#\xfdW_\xa3\xdeX\xfb\xf6\xed\x33p\xdd\x81\x99 2\xbf\xfb\xed\xe3I\x92\xdb\xee\xb8\x33\xdd\xbbw_\xe4\xbd\x6\xfj|5\xd1\xf3/\xbe\xd4\xf4\xc2\x1\0\xfe\x43\x30\x4\0\0\0\xb0\x98***\xb2\xd6\x80\xb5\x32s\xe6\xcc\x6\xef\xbd\xfb\xee\xb4\xf4\xe8\xd1\xa3\xd1y\xf7\xfd\xfa\xde\xfc\xf4\xc7\xd7\xe4\xda\xebo\xc8\x6\x1bn\x94?\xff\xe9\x8f\x39\xfe\xd8\x63\xb2\xef~\xfb\xe7\xb8o\x9d\x90\x8a\x8a\x8a\x6s\x4@\0@9\b\x86\0\0\0\0\x9a`\xe0\xc0u\xf3\xea\xab\xaf\xd6\x1b\x9b\x33gN^y\xf9\x95\xf4\xec\xd9\xab\xc1\xf9\xb5\xb5\xb5\xb9\xe8\x82\xf3s\xdaw\xcf\xc8\x36_\xdc\x36I2t\xd8\xf0t\xe8\xd0!_=rT\xf6\xda{\x9f\xac\x35`\xc0\x32\xa9\x1d\0@\x8f!\0\0\0\x80&\xd8u\xc8\xd0\xdcw\xef\xbd\x99:eJi\xec\x99\xa7'$I\xbe\xb0\xf9\x16\xa5\xb1\xf>\xf8 \xc9\x82`\xa8\xa6\xa6&\xb3\x66\xcd\xaaw\x9d\xd5V\xfbl\x92\x64n\xed\xdcr\x97\f\0Pb\xc5\x10\0\0\0@\x13l\xbb\xedv\xd9t\xb3\xcdr\xd2\x89'\xe4\xb0\xc3G\xe5\x83\xf>\xc8%\x17_\x94o\x9ftr:u\xea\x94$\x19\xfb\xd0\x83\x39\xe5\xa4o\xe7\xf6\x31we\xc3\x8d\x36\xca\xff|\xf3\x9b\xb9\xf4\x92\x8b\x33w\xee\xdc\f\x1c\x38\x30\x35\x35\xb3\x33\xe6\x8e\xdb\xb2\xf3.C2`\xc0\xda-\xfc\x89\0\x80\"\x11\f\x1\0\0\0\x34\x41\xbb\x95V\xca\x15W^\x9d\x9bn\xba!W]yyz\xf5\xea\x9d\xd3\xbe{F\x86\xe\x1b^:\xa7{\xf7\x1e\xd9p\xa3\xcf\xa5\x63\xc7\x8eI\x92#\x8f\x1a\x9d\x35\xd6X3\xbf\xbe\xf7\x9e\xfc\xec\xbak\xb3\xe6Zke\x97]\x87\x64\x9f}\xf7KUU\xe3\xbf\x9e\x19W=\xb6t\xbc\xf0\xb5\x1\0\x96\x46\xc5?^\x99X\xd7\xaf\xf7\x82\xc6\x88oL\x9c\x9a\x81k5\xdc\v\x17X>\xd5\xcc\xaeM\xb2\xe0{\xfb\xa3\xef\xf3\x45Y\xf8\x1c?\v\0\0\x80\xe5\xc1?_\x9dT\xef\xdf\x31M\xf9w\xcf\xcc\xf7g}\xea\xb9-m\xf0\xa0u\xf2\xfc\x8b/\xb5t\x19\0\xc0\n\xa2\x43\xfbU\x93,\xf8\xfb\x90\x1e\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A4\xde\xdd\x10\0\0\0\x80\x16\x35\xaezl\xe9x\xe8\xb0\xe1-X\t\0\xb0\"\x11\f\x1\0\0\0\xb4\x42\xc2 \0\xa0\x1cl%\a\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84\x1e\x43\0\0\0\0\xad\xd0\xb8\xea\xb1\xa5\x63\xfd\x86\0\x80\xe6\"\x18\x2\0\0\0h\x85\x84\x41\0@9\xd8J\xe\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@AT\xb5t\x1\0\0\0\0\x34\x34\xaezl\xe9x\xe8\xb0\xe1-X\t\0\xb0\"\x11\f\x1\0\0\0\xb4\x42\xc2 \0\xa0\x1cl%\a\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84\x1e\x43\0\0\0\0\xad\xd0\x35W_U\xef\xf5\x37\x8e>\xa6\x85*\x1\0V$\x82!\0\0\0\x80VH\x10\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x15\x1aW=\xb6t }\xb2\xcb\xae\x43\xb2\xff\x97\xbe\x9cUVY\xa5\xc1\xb9\xe3\xaa\xc7\x96\x8e\x87\xe\x1b\xde\xec\x9f\x1\0(&\xc1\x10\0\0\0@\x13\xd4\xd6\xd6\xe6;\xa7\x9c\x94Y\xb3\x66\xe6\xa8\xaf~-\xd3\xa6M\xcby\xe7\x9c\x95w\xdf}7\x87\x1d>j\x91\xf3~|\xcd\x8fr\xf7]w\xe6\xa8\xd1_\xcb\xae\xbb\xe\xc9\xcc\x99\x33\xf3\x97g\x9eI\xbbv\xed\x1a=_\x18\x4\0\x94\x83`\b\0\0\0\xa0\t\x9ez\xea\xc9\xfc\xfe\x89\xdf\x65\xdc\xf8\xc7\xd2\xb5k\xd7$I\xa7N\x9dr\xea\xc9'f\x8f=\xf7J\xb7n\xdd\x1a\xccy\xe1\xef\x7f\xcfO\x7f|M\x1e\xac\x1e\x97>}\xfa\x96\xc6w\xdf\x63\xcf\x65V7\0@\xa2\xc7\x10\0\0\0@\x93T\x8f}({\xef\xb3o)\x14J\x92\xad\xb7\xf9\x62\xe6\xcd\x9b\x9f\xa7'<\xd5\xe8\x9c{\xee\xf9\x65\xe:\xe4\x90z\xa1\x10\0@K\x10\f\x1\0\0\0\x34\xc1K\xff\xf8G\xfa\xaf\xbe\x46\xbd\xb1\xf6\xed\xdbg\xe0\xba\x3\x33y\xd2\xa4\x46\xe7\xfc\xfd\xf9\xe7\xb3\xfa\xeak\xe4\x81\xfb\xef\xcb\xc8\x43\xe\xca\x1e\xbb\r\xcd\x8f\xae\xba\x32\x33g\xce\\\x6\x15\x3\0|\xccVr\0\0\0\0\x8b\xa9\xae\xae./\xbc\xf0\x42\xbe\x34\x62\x44\x83\xf7z\xf4X-\xd3\xde\x9d\xd6`|\xfe\xfc\xf9\xf9\xebs\xcf\xe6\xff\xfd\xe5\x99|y\xc4\x81\x39\xf2\xab\xa3\x33\x7f\xfe\xfc\xfc\xe4\xc7\xd7\xe4\x8d\x37\xfe\x9d\x8b\xbe\xf7\xfdTTT4\x98\x37x\xd0:\x8d\xd6\xf0\xfc\x8b/-\xfd\a\x1\0\nK0\x4\0\0\0\xb0\x98***\xb2\xd6\x80\xb5\x1a]\xe9\xf3\xee\xbb\xd3\xd2\xa3G\x8f\x6\xe3m\xda\xb4I\xa7\xce\x9d\x33\xed\x9dwr\xd6\x39\xe7\x96\x42\xa0\x1e\xab\xad\x96\x3\xbe\xb4_\x8e>\xe6\xb8\xf4\xed\xd7\xaf\xc1<\x1\x10\0P\xe\x82!\0\0\0\x80&\x18\x38p\xdd\xbc\xfa\xea\xab\xf5\xc6\xe6\xcc\x99\x93W^~%={\xf6jt\xce\xe7?\xbfq\xbav\xedVoe\xd0g?\xdb\x33I2}\xfa\xf4\x46\x83!\0\x80r\xd0\x63\b\0\0\0\xa0\tv\x1d\x32\x34\xf7\xdd{o\xa6N\x99R\x1a{\xe6\xe9\tI\x92/l\xbe\x45\x92\x5\xdb\xc7\xd5\xd4\xd4\x94\xde\x1f\x32tX\x1e\x7f\xec\xd1z+\x8d^|\xe1\x85$I\xaf\xde\xbd\x97\x45\xd9\0\0I\x4\x43\0\0\0\0M\xb2\xed\xb6\xdb\x65\xd3\xcd\x36\xcbI'\x9e\x90\xc7\x1e}$\xf>p\x7f\xbes\xca\xc9\xf9\xf6I'\xa7S\xa7NI\x92\x8b/{\f\x1f\x92\x19\x33\x66$Iv\xday\x97\xf4\xec\xd5+'}\xfb[yd\xfco\xf2\xc8\xf8\xdf\xe4\xaa+\x7f\x98\xe3O81\xdd\xbauk\xc9\x8f\x3\0\x14\x8c\xad\xe4\0\0\0\0\x9a\xa0\xddJ+\xe5\x8a+\xaf\xceM7\xdd\x90\xab\xae\xbc<\xbdz\xf5\xcei\xdf=#C\x87\r/\x9d\xd3\x7f\xf5\x35\x32h\xbd\xf5\xd3\xae]\xbb$I\xfb\xf6\xed\xf3\x93k\xaf\xcf\r?\xbb.W\xfc\xf0\xb2\xf4Xm\xb5\x1c\xfa\x95\xc3\xb2\xfb\x1e{.\xf2>\xe3\xaa\xc7\x96\x8e\x17\xbe\x36\0\xc0\xd2\xa8\xf8\xc7+\x13\xeb\xfa\xf5^\xd0\x18\xf1\x8d\x89S3p\xad\xc6\xf7\xc2\x5\x96?5\xb3k\x93,\xf8\xde\xfe\xe8\xfb|Q\x16>\xc7\xcf\x2\0\0`y\xf0\xcfW'\xd5\xfbwLS\xfe\xdd\x33\xf3\xfdYe\xafoi\f\x1e\xb4N\x9e\x7f\xf1\xa5\x96.\x3\0XAth\xbfj\x92\x5\x7f\x1f\xb2\x95\x1c\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10U-]\0\0\0\0\0\r\x8d\xab\x1e[:\x1e:lx\vV\x2\0\xacH\x4\x43\0\0\0\0\xad\x90\x30\b\0(\a[\xc9\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\x88\xaa\x96.\0\0\0\0\x80\x86\xc6U\x8f-\x1d\xf\x1d\x36\xbc\x5+\x1\0V$\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x15\x1aW=\xb6t\xac\xdf\x10\0\xd0\\\x4\x43\0\0\0\0\xad\x90\x30\b\0(\a[\xc9\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5\xa1\xc7\x10\0\0\0@+t\xcd\xd5W\xd5{\xfd\x8d\xa3\x8fi\xa1J\0\x80\x15\x89`\b\0\0\0\xa0\x15\x12\x4\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xf\x1d\x36\xbc\x5+\x1\0V$\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x15\x1aW=\xb6t\xac\xdf\x10\0\xd0\\\x4\x43\0\0\0\0\xad\x90\x30\b\0(\a[\xc9\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\x88\xaa\x96.\0\0\0\0\x80\x86\xc6U\x8f-\x1d\xf\x1d\x36\xbc\x5+\x1\0V$\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x89\xdezkrn\xbe\xf1\xc6\xfc\xfe\x89\xdf\x65\xfd\xc1\x83\x33\xe2\x80\x83\xb2\xc9\xa6\x9b.\xd6\xdc\xda\xda\xda\x1cw\xcc\x37\x33\x7f\xfe\xfc\xfc\xf8\xa7\xd7-\xf2\xbcq\xd5\x63K\xc7\xfa\r\x1\0\xcd\xc5\x8a!\0\0\0\x80&\x98\x32\x65J\x8e\x1cuXf\xcf\x9e\x9d\x13O>%}\xfa\xf6\xcd\xe1#\xf\xc9\x33OOX\xac\xf9w\xfd\xfc\xce<\xfe\xd8\xa3\xff\xf5\xbc\xa1\xc3\x86\x97\xfe\x3\0h.V\f\x1\0\0\0\x34\xc1=\xbf\xba;\xfd\xfb\xaf\x9e\xd3\xcf\x38\x33\x95\x95\x95\xd9n\xfb\x1d\x32g\xf6\x9c\\\xf3\xa3\xabs\xfd\r7\xa5\xa2\xa2\x62\x91s_|\xe1\x85\xfc\xe8\xea+\xb3\xd7\xde\xfb\x64\xfa\xf4\xe9\xcb\xb0j\0\x80\x5\xac\x18\x2\0\0\0XL\xb5\xb5\xb5\xb9\xe1\xfa\xeb\xb3\xc7\x9e{\xa5\xb2\xb2\xb2\x34>d\xe8\xb0\xfc\xf9O\x7f\xcc\xbf_\x7f}\x91s\xdf\x7f\xff\xfd\x9cu\xe6ws\xe6Y\xe7\x64\xd0\xa0\xf5\x96\x45\xb9\0\0\r\b\x86\0\0\0\0\x16\xd3\xf4\xe9\xef\x66\xd6\xac\x99\xe9\xd9\xb3W\xbd\xf1^\xbd\x16\xbc~\xfb\xed\xa9\x8b\x9c{\xedO\x7f\x9cu\x6\xe\xcc\x90\xa1\xc3\xcaZ#\0\xc0\xa7\xb1\x95\x1c\0\0\0\xc0\x62\xfah\xfb\xb7UVY\xa5\xde\xf8g\xda\x7f&I2c\xc6\x8c\x46\xe7\xfd\xf1\x8f\x7f\xc8\x3\xf7\xfd:w\xfd\xf2\x9eO\xddjna\x83\a\xad\xd3\xe8\xf8\xf3/\xbe\xb4\xb8\xe5\x2\0\x34 \x18\x2\0\0\0XL\x1d:tH\x92\xbc\xff\xc1\xfb\xf5\xc6kjf'I:w\xe9\xd2`\xce;\xef\xbc\x9d\x33\xbf{Z\xce=\xff\xc2t\xeb\xd6=IR\x97\xba\xffz/\x1\x10\0P\xe\x82!\0\0\0\x80\xc5\xd4\xa5K\xd7TVVf\xe2\x9bo&\x9b}\xa1\x34>u\xea\x94$I\x8f\xee=\x1a\xcc\xf9\xd9u\xd7\x65\xd2\xc4\x89\x19}\xd4\x11\r\xde\x1b u\xfe\xa8#\x8e\xcc\xa8#\x8e\xfc\xd4s\x86\xe\x1b\xbe\xa4\xe5\x1\0,\x92\x15\x43\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\n\xa2\xaa\xa5\v\0\0\0\0\xa0\xa1q\xd5\x63K\xc7\x43\x87\ro\xc1J\0\x80\x15\x89`\b\0\0\0\xa0\x15\x12\x6\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\xe8\x31\x4\0\0\0\xd0\n\x8d\xab\x1e[:\xd6o\b\0h.\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x15\xba\xe6\xea\xab\xea\xbd\xfe\xc6\xd1\xc7\xb4P%\0\xc0\x8a\x44\x30\x4\0\0\0\xd0\n\t\x82\0\x80r\xb0\x95\x1c\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10z\f\x1\0\0\0\xb4\x42\xe3\xaa\xc7\x96\x8e\x87\xe\x1b\xde\x82\x95\0\0+\x12\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\n\xa2\xaa\xa5\v\0\0\0\0\xa0\xa1q\xd5\x63K\xc7\x43\x87\ro\xc1J\0\x80\x15\x89`\b\0\0\0\xa0\x15\x12\x6\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\xe8\x31\x4\0\0\0\xd0\n\x8d\xab\x1e[:\xd6o\b\0h.\x82!\0\0\0\x80%\xf0\xd6[\x93s\xf3\x8d\x37\xe6\xf7O\xfc.\xeb\xf\x1e\x9c\x11\a\x1c\x94M6\xdd\xb4\xd1s\xeb\xea\xea\xf2\xfb'\x9e\xc8\xc3\xfWg\xc2\x93\x7fN\x9f\xbe\xfd\xb2\xef~\xfbg\xf8n\xbb\xa7\xb2\xb2\xb2\xd1\x39\xc2 \0\xa0\x1cl%\a\0\0\0\xd0\x44S\xa6L\xc9\x91\xa3\xe\xcb\xec\xd9\xb3s\xe2\xc9\xa7\xa4O\xdf\xbe\x39|\xe4!y\xe6\xe9\t\x8d\x9e\xff\xf0\xb8\xea|\xef\xe2\v\xb2\xc1\x6\x1b\xe6\xa4S\xbe\x93u\xd7\x1d\x94SN\xfav~}\xef=\xcb\xb8r\0\xa0\xe8\xac\x18\x2\0\0\0h\xa2{~uw\xfa\xf7_=\xa7\x9fqf*++\xb3\xdd\xf6;d\xce\xec\x39\xb9\xe6GW\xe7\xfa\x1bnJEEE\xbd\xf3\xb7\xdaz\x9bl\xbb\xdd\xf6\xf9\xccg>\x93$\xd9y\x97]\xd3\xb6]\xdb\xfc\xfc\xce\x31\xd9o\xff/\xb5\xc4G\0\0\n\xca\x8a!\0\0\0\x80&\xa8\xad\xad\xcd\r\xd7_\x9f=\xf6\xdc\xab\xde\x36pC\x86\xe\xcb\x9f\xff\xf4\xc7\xfc\xfb\xf5\xd7\x1b\xcc\xe9\xd8\xb1\x63)\x14\xfa\xc8j\xab}6\xef\xbf?\xab\xec\xf5\x2\0,\xcc\x8a!\0\0\0\x80&\x98>\xfd\xdd\xcc\x9a\x35\x33={\xf6\xaa\x37\xde\xab\xd7\x82\xd7o\xbf=5\xab\xaf\xb1\xc6\x7f\xbd\xce\x33OO\xc8N;\xef\xb2\xc8\xf7\a\xfZ\xa7\xd1\xf1\xe7_|i\xf1\x8b\x5\0\xf8\x4\xc1\x10\0\0\0@\x13L\x9f>=I\xb2\xca*\xab\xd4\x1b\xffL\xfb\x5+\x82\x66\xcc\x98\xf1_\xaf\x31\xe1\xa9\xa7\xf2\xe8#\x8f\xe4\xa1q\xf/\xf2\x1c\x1\x10\0P\xe\xb6\x92\x3\0\0\0h\x82\xe\x1d:$I\xde\xff\xe0\xfdz\xe3\x35\x35\xb3\x93$\x9d\xbbt\xf9\xd4\xf9\x93'M\xca\x19\xa7\x9f\x9a\x8b/\xf9~z\xf7\xeeS\x9e\"\x1\0\x16\x41\x30\x4\0\0\0\xd0\x4]\xbatMeee&\xbe\xf9\x66\xbd\xf1\xa9S\xa7$Izt\xef\xb1\xc8\xb9\xef\xbd\xf7^N>\xf1\x84\xec\xb3\xdf\xfe\x19\x36|\xb7\xb2\xd6\t\0\xd0\x18\xc1\x10\0\0\0@\x13\xb4k\xd7.\x87\x8d:\"\xf7\xdfwo\xe6\xce\x9d[\x1a\xff\xed\xe3\x8f\x65\x87\x1dwJ\x9f\xbe}\x93$\xf3\xe7\xcfOMMM\xe9\xfd\xf7\xde{/'}\xfb[\xd9l\xf3\xcd\x33\xfak\xff\xb3\xcc\xeb\x6\0H\xf4\x18\x2\0\0\0h\xb2\x11\a\x1c\x98\x91\x87\x1c\x9c\xf3\xcf='C\x86\xe\xcd?\xff\xf9\xcf\\\xf7\xd3\x9f\xe4\xc6[nKEEE\x92\xe4\xe2\v\xcf\xcf#\xe3\x7f\x93{\xee{0uuu\x19}\xd4\x11\xf9\xdb\xff\xfe\x35_\x1d\xfd\xf5<\xfb\xff\xfe_\xe9Z\xfdW\xef\x9f\xee\x9f\xb2\xca\b\0\xa0\x39\t\x86\0\0\0\0\x9a\xa8_\xbf\xfe\xb9\xe9\xd6\xdbs\xcbM7\xe6\xfc\xf3\xce\xc9&\x9bn\x96[n\x1b\x93\xc1\x1blP:\xa7\xff\xeakd\xd0z\xeb\xa7]\xbbv\xf9\xfd\x13\xbf\xcb\xdf\xfe\xf7\xafI\x92\xc3G\x1eR\xefZ\xd7\xfc\xe4\xbal\xbf\xc3\xe\r\xee\x31\xaezl\xe9x\xe8\xb0\xe1\xe5\xf9 \0@\xe1\b\x86\0\0\0\0\x96\xc0\xea\xab\xaf\x9e\x33\xce:{\x91\xef\x1f\xfa\x95\x91\x39\xf4+#\x93$\xbb\xec:$\xcf\xbf\xf8R\x93\xae/\f\x2\0\xca\x41\x8f!\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x10\0\0\0\0\0@A\xe8\x31\x4\0\0\0\xd0\n\x8d\xab\x1e[:\xd6o\b\0h.\x82!\0\0\0\x80VH\x18\x4\0\x94\x83\xad\xe4\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10\x82!\0\0\0\0\0\x80\x82\xd0\x63\b\0\0\0\xa0\x15\x1aW=\xb6t\xac\xdf\x10\0\xd0\\\x4\x43\0\0\0\0\xad\x90\x30\b\0(\a[\xc9\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5\xa1\xc7\x10\0\0\0@+t\xcd\xd5W\xd5{\xfd\x8d\xa3\x8fi\xa1J\0\x80\x15\x89`\b\0\0\0\xa0\x15\x12\x4\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \x4\x43\0\0\0\0\0\0\x5Q\xd5\xd2\x5\0\0\0\0\xd0\xd0\xb8\xea\xb1\xa5\xe3\xa1\xc3\x86\xb7`%\0\xc0\x8a\x44\x30\x4\0\0\0\xd0\n\t\x83\0\x80r\xb0\x95\x1c\0\0\0\0\0@A\b\x86\0\0\0\0\0\0\nB0\x4\0\0\0\0\0P\x10z\f\x1\0\0\0\xb4\x42\xe3\xaa\xc7\x96\x8e\xf5\x1b\x2\0\x9a\x8b`\b\0\0\0\xa0\x15\x12\x6\x1\0\xe5`+9\0\0\0\0\0\x80\x82\x10\f\x1\0\0\0\0\0\x14\x84`\b\0\0\0\0\0\xa0 \xf4\x18\x2\0\0\0h\x85\xc6U\x8f-\x1d\xeb\x37\x4\0\x34\x17\xc1\x10\0\0\0@+$\f\x2\0\xca\xc1Vr\0\0\0\0\0\0\x5!\x18\x2\0\0\0\0\0(\b\xc1\x92\xc2\x42h\0\0 \0IDAT\x10\0\0\0\0\0@A\xe8\x31\x4\0\0\0\xd0\n\x8d\xab\x1e[:\xd6o\b\0h.V\f\x1\0\0\0,\x3\xcf=\xf7lN?\xed\xd4\xec>lH.\xbc\xe0\xbcL\x9a\x38\xf1S\xcf?\xe1\xf8\x63\x33t\xd8p\xa1P+6x\xd0:-]\x2\x8b\xc1sj\xfd<\xa3\xe5\x83\xe7\xb4|X\x9c\xe7$\x18\x2\0\0\0(\xb3g\x9e\x9e\x90\xc3\xe=$\x3\x6\xac\x9d\x93O=-\xefM\x9f\x9e#F\x8d\xcc\x94)SZ\xba\xb4\x65\xe6\x9a\xab\xafj\xe9\x12X\f\x9e\xd3\xf2\xc1sj\xfd<\xa3\xe5\x43Q\x9f\x93`\b\0\0\0\xa0\x8c\xe6\xcf\x9f\x9f\xab\xae\xbc\"\xc7\x1ew|\x8e\x38\xf2\xa8l\xbf\xc3\xe\x39\xe7\xbc\v\xd2\xb9S\xe7\xdc\x7f\xdf\xbdK}\xfd\x85\xb7\x9ck\xaes\xcbq\xcd\xa6h\xe9:W\xb4\xcf\xd4\x92\x9f\xa7\\\xe7./\x9fiy\xf9\xbak\xca\xb9\xcb\xcbgj\xe9\xaf\xd1\xa6\xf0\xf3\xa1y\xcf]^>SK~\xdd\t\x86\0\0\0\0\xca\xe8\x95\x97_\xce\x84\xa7\x9e\xcc\x8e;\xed\\\x1a[y\xe5\x95\xb3\xd7>\xfb\xe4\x96\x9bnJ]]]\vV\a\0\x14\x8d`\b\0\0\0\xa0\x8c>\xda.\xaeG\x8f\x1e\xf5\xc6\xfb\xf5\xeb\x9f\xb7\xdf\x9e\x9a\x99\x33g\xb6\x44Y\0@AU\xb5t\x1\0\0\0\0+\xb2i\xd3\xdeI\x92\xac\xb4\xf2\xca\xf5\xc6\xdb\xaf\xbaj\x92\x64\xd6\xac\x99\xe9\xd8\xb1\x63\xa3s\x1bk \xfd\xfc\x8b/5s\x85\0@\x91\b\x86\0\0\0\0\xca\xa8S\xa7NI\x92\x9a\x9a\x9a\xb4m\xdb\xb6\x34^\xf3\xc1\a\xf5\xde_\\\x8d\x85\x45\xcb\x8b\x1f]}eK\x97\xd0\xec\x96\xe7\xe7\xb1(\x9e\xd3\xf2\x61\x45{N\x9e\xd1\xf2\xc1sZ1\b\x86\0\0\0\0\xca\xa8G\x8f\xd5\x92$oM\x9e\\oe\xd0\xa4I\x93\xd2\xa7O\xdf\xb4o\xbfj\x83\x39V\x5\x1\0\xe5\xa2\xc7\x10\0\0\0@\x19\xad\x33p`\x6\xad\xb7~\xc6\x8f\xffMi\xac\xb6\xb6\x36\xf=\xf8@F\x1e~x\xcb\x15\x6\0\x14\x92\x15\x43\0\0\0\0\x65TUU\x95\xe3\xbfuB\xbe>\xfa\xa8\xb4m[\x95\xf5\xd6\x1b\x9cG\xc6\xff&\xef\xbc\xf3Nv\xdb}\xcf\x96.\xf\0(\x18+\x86\0\0\0\0\xcal\xdb\xed\xb6\xcf\xcfn\xbc\x39/\xbe\xf0\x42.\xba\xf0\xbc\xac\xb2\xca*\xb9\xeeg7\xa6k\xd7\xae-]\x1a\0P0V\f\x1\0\0\0,\x3[n\xb5u\xb6\xdcj\xeb\x96.\x83&x\xeb\xad\xc9\xb9\xf9\xc6\x1b\xf3\xfb'~\x97\xf5\a\xf\xce\x88\x3\xe\xca&\x9bn\xda\xe8\xb9uuu\xf9\xfd\x13O\xe4\xe1\x87\xab\x33\xe1\xc9?\xa7O\xdf~\xd9w\xbf\xfd\x33|\xb7\xddSYY\xb9\x8c+/\x8e\xa6<\xa3\xc6\xfc\xec\xfaks\xd9\xa5\xdf\xcf\x93\x13\xfe\x92U;t(c\xa5\xc5\xf6\xdcs\xcf\xe6\xae\x9f\xdf\x99g\xff\xf2\x97l\xb3\xed\xb6\x19\x35\xea\xc8\xf4\xea\xdd\xfbS\xe7L\x9b\x36-?\x1fsG&Lx*\x13\xdf\xfc\xbfl\xbe\xe5V\x19\x31\xe2\xc0l\xb0\xe1\x86\xcb\xa8\xea\x62\xa9\xab\xab\xcb\xd8\xb1\xf\xe5\xa1\a\xee\xcf[\x93'g\x97!C2\xf2\xb0QYe\x95U\x16\x39g\xe2\xc4\x37s\xcb\xcd\x37\xe5\x89\xdf\xfe\x36\x1d;v\xcc\x90\x61\xc3\x33\xe2\x80\x3\x1a\xed\x9dG\xeb\x62\xc5\x10\0\0\0\0|\xc2\x94)Sr\xe4\xa8\xc3\x32{\xf6\xec\x9cx\xf2)\xe9\xd3\xb7o\xe\x1fyH\x9eyzB\xa3\xe7?<\xae:\xdf\xbb\xf8\x82l\xb0\xc1\x86\x39\xe9\x94\xef\x64\xddu\a\xe5\x94\x93\xbe\x9d_\xdf{\xcf\x32\xae\xbc\x38\x9a\xfa\x8c>\xe9\xb9\xe7\x9e\xcd\x65\x97~\xbf\xccU\xf2\xcc\xd3\x13r\xd8\xa1\x87\x64\xc0\x80\xb5s\xf2\xa9\xa7\xe5\xbd\xe9\xd3s\xc4\xa8\x91\x99\x32\x65\xca\"\xe7\xbc\xfe\xfa\xeb\x19y\xe8\x41\x99\x38ibF\x1cp`\xbes\xfa\x19\xe9\xdf\xbf\x7f\xde}\xf7\xdd\x65Xy\xb1\xdcz\xcb\xcd\xf9\xfe\xc5\x17\x65\xe8\xb0\xe1\xf9\xea\xd7\xbe\x9eG\x1fy$\xa7\x9ctb\xe6\xcd\x9b\xd7\xe8\xf9\xef\xbd\x37=\xa3\x8f:\"\xb3kf\xe7\xd4\xd3N\xcf\xfe_\x1e\x91_\xdf{O.\xba\xf0\x82\x65\\9K\xc2\x8a!\0\0\0\0\xf8\x84{~uw\xfa\xf7_=\xa7\x9fqf*++\xb3\xdd\xf6;d\xce\xec\x39\xb9\xe6GW\xe7\xfa\x1bnJEEE\xbd\xf3\xb7\xdaz\x9bl\xbb\xdd\xf6\xf9\xccg>\x93$\xd9y\x97]\xd3\xb6]\xdb\xfc\xfc\xce\x31\xd9o\xff/\xb5\xc4GX\xe1\x35\xf5\x19-l\xc6\x8c\x19\x39\xf3\xbb\xa7\xe5K_> w\xff\xe2\xe7\xcb\xb0\xea\x62\x99?\x7f~\xae\xba\xf2\x8a\x1c{\xdc\xf1\x39\xe2\xc8\xa3\x92$[l\xb9\x65\x46\x8d<4\xf7\xdfwo\x8e \x9b\x7f\xbd\xfajn\x1fsW:u\xea\x94$\xe9\xdd\xa7O\xbez\xc4\xe1\x39\xf5\xd4\xd3\xac\xc0k\xe5\xac\x18\x2\0\0\0\x80\x85\xd4\xd6\xd6\xe6\x86\xeb\xaf\xcf\x1e{\xeeUo\x1b\xb8!C\x87\xe5\xcf\x7f\xfa\x63\xfe\xfd\xfa\xeb\r\xe6t\xec\xd8\xb1\x14\n}d\xb5\xd5>\x9b\xf7\xdf\x9fU\xf6z\x8bhI\x9e\xd1G\xea\xea\xear\xf5UWd\xab\xad\xb7\xc9\x9e{\xef\xbd,\xca-\xacW^~9\x13\x9ez2;\xee\xb4sil\xe5\x95W\xce^\xfb\xec\x93[n\xba)uuu\r\xe6\xbc\xf6\xda\xbfr\xdf\xaf\xef\xcd>\xfb\xed\xf7\xa9\xe1\x1e\xcd\xe7\x8f\x7f\xf8\x43\xbau\xeb\x9aM6\xf9x\x1b\xc6~\xfd\xfag\x97!C\xf3\xc8#\xe3\x1b\x9d\xb3\xca*\v~\xde\xbd=uji\xec\xbd\xe9\xd3\xb3\xf6:\xeb\xe4\x33\xed\xdb\x97\xb7`\x96\x9a`\b\0\0\0\0\x16\x32}\xfa\xbb\x99\x35kfz\xf6\xecUo\xbcW\xaf\x5\xaf\xdf~{jc\xd3\x1ax\xe6\xe9\t\xd9i\xe7]\x9a\xbd>\x96\xee\x19=\xfe\xd8\xa3\xf9\xf3\x1f\xff\x98o|\xf3\x98\x88\x1d\xca\xeb\xa3\xed\xe2z\xf4\xe8Qo\xbc_\xbf\xfey\xfb\xed\xa9\x99\x39sf\x83\x39\x93&NJ\x92\xd4\xce\xad\xcd\xf9\xe7\x9e\x9d]v\xda>\xdf\xfc\x9f\xaf\x65\xc2SO\x95\xbf\xe0\x82z\xf3\xcd\x37\x33p\xdd\x41\xa9\xaa\xaa\xbf\xc1\xd8\xba\x3\xd7\xcdk\xff\xfaW\xa3s6\xde\x64\x93\xec\xbb\xff\x97r\xec\xd1\xdf\xc8/\xef\xbe+\xd7\xfe\xe4\xc7\xb9\xf5\x96\x9br\xd1\xc5\x97\xa4M\x1b\xb1\x43k\xe7\t\x1\0\0\0\xc0\x42\xa6O\x9f\x9e$\r\x9a\xae\x7f\xa6\xfd\x82\xff\x43~\xc6\x8c\x19\xff\xf5\x1a\x13\x9ez*\x8f>\xf2H\xe<\xe8\xe0\xe6/\x90%~F\x93'O\xce\x99g\x9c\x9e\xb3\xcf=?\x1d;v,o\x91\x64\xda\xb4w\x92$+\xad\xbcr\xbd\xf1\xf6\xab\xae\x9a$\x99\x35\xab\x61\x30\x34u\xea\x82\x30\xe9\xbcs\xcf\xce\x80\xb5\xd7\xce\x85\x17_\x92\r6\xdc(\x87\x8f<$\xcf\xff\xedoe\xae\xb8\x98\xde\x9a<\xb9\xb4\x1d\xdc\xc2:v\xea\x98\xff{\xe3\x8d\x46\xe7TUU\xe5\xa8\xa3\x46\xe7\xb5\xd7\xfe\x95\x33\xbf{z\xae\xb8\xfc\xb2\xec\xff\xa5\x11\x19\xb8\xee\xa0r\x97K3\xd0\x63\b\0\0\0\0\x16\xd2\xe1?\xbd\x31\xde\xff\xe0\xfdz\xe3\x35\x35\xb3\x93$\x9d\xbbt\xf9\xd4\xf9\x93'M\xca\x19\xa7\x9f\x9a\x8b/\xf9~z\xf7\xeeS\x9e\"\vnI\x9e\xd1\xbcy\xf3\xf2\xbd\x8b.\xc8\xc1\a\x1f\x9aM6]\xb0\x65V\xc3\x8d\xcchN\x1f\x85\r555i\xdb\xb6mi\xbc\xe6\x83\xf\xea\xbd\xbf\xb0\xf6\xff\xd9\x86\xec\xa4\x93O\xc9\xfa\x83\x37H\x92l\xbe\xf9\x16y\xe5\xe5\x97\x32\xf6\xa1\a3x\x83\r\xca]v\xe1t\xeb\xde-\xff\xfb\xd7\xbf\x36\x18\x9f\x35kV\xd6Xs\xcd\x46\xe7\xfc\xe3\x1f/\xe6\xd0\x83\xe\xc8\xf9\x17^\x9c\x1dv\xdc)\xaf\xbc\xfcR\xae\xba\xf2\xf2\x8c\xab\x1e\x9b\x1f^qe\xda\xb7_\xb5\xdc\x65\xb3\x14\xac\x18\x2\0\0\0\x80\x85t\xe9\xd2\x35\x95\x95\x95\x99\xf8\xe6\x9b\xf5\xc6?Z\xc9\xd0\xa3{\x8f\xc6\xa6%I\xde{\xef\xbd\x9c|\xe2\t\xd9g\xbf\xfd\x33l\xf8ne\xad\xb3\xc8\x96\xe4\x19=\xfa\xc8\xf8<<\xae:W_uE\x6\xfZ'\x83\a\xad\x93\xc3\xe]\xb0\xa2k\x8b/l\x92m\xb7\xd9\xb2\xfc\x85\x17L\x8f\x1e\xab%Y\xb0\"ea\x93&MJ\x9f>}\x1b\r\xf\xbaw\xef\x9e$\xe9\xd2\xb5[\xbd\xf1\x1\x3\xd6\xce\xa4I\x13\xcbTi\xb1\xf5\xee\xdd;/\xbc\xf0\xf7|\xf8\xe1\x87\xf5\xc6_\x7f\xed\xb5\xac\xb9\xe6Z\x8d\xce\xb9\xfd\xb6[\xb3\xfb\x1e{e\xdf\xfd\xf6O\x97.]\xb2\xd9\x17\x36\xcf\xf~xE\xfe\xf0\xfb'\xf2\xf8\x63\x8f-\x8b\xb2Y\n\x82!\0\0\0\0XH\xbbv\xedr\xd8\xa8#r\xff}\xf7\x66\xee\xdc\xb9\xa5\xf1\xdf>\xfeXv\xd8q\xa7\xf4\xe9\xdb\x37I2\x7f\xfe\xfc\xd4\xd4\xd4\x94\xde\x7f\xef\xbd\xf7r\xd2\xb7\xbf\x95\xcd\x36\xdf<\xa3\xbf\xf6?\xcb\xbc\xee\"Y\x92g\xf4\xb9\xcf}>\xbf\xf8\xe5=\xf5\xfe\xfb\xe6\xd1\xc7&I\xae\xbb\xe1\xa6\\{\xdd\r\xcb\xfe\x83\xac\xe0\xd6\x19\x38\x30\x83\xd6[?\xe3\xc7\xff\xa6\x34V[[\x9b\x87\x1e| #\xf?\xbc\x34\x36g\xce\x9c\xcc\x9b\x37/I\xb2\xee\xa0\xf5\xd2\xaf_\xbf\xfc\xee\xb7\x8f\x97\xde\xaf\xab\xab\xcb\xe3\x8f?\x96\x41\x83\xd6[V\xa5\x17\xca\x96[m\x9di\xef\xbcS\xaf\x8f\xd3\xd4\xa9S\xf3\xe0\x3\xf7g\xe7]w-\x8d}\xf0\x9f\x95^I2\xbb\xa6&3g\xceH]\xdd\xc7\xeb\xee:w\xee\x92\x8e\x1d;5\b\x98h}l%\a\0\0\0\0\x9f\x30\xe2\x80\x3\x33\xf2\x90\x83\xff?{\xf7\x1d&eu\xb7\x1\xf8\xd9\nH\x15\x4\xa9\x36\x4\x35\xc6\xde{\x8b\xa2\x62/(j\xb0\xc4\x98\x62\xef\xc6\x86\r[\x8c]c\xef\n1\xf6\xd8\xc5h\xca\x97\xa2\xa8\xb1\xc5n\x8a\x91\xa6\"\x2\xa1m\xfb\xfe \xae\xae,\xc8\xc2.\xbb\x30\xf7}]\\\xd7\xccy\xcf\xfb\x9e\xdf\x30\xbb\xb3\xbb\xf3\xcc\x39'\xe7\x9dsv\xb6\x1b\x30 \xef\xbe\xfbnn\xbc\xfe\xba\xdcz\xc7])**J\x92\\x\xfeyyv\xe4\x33y\xf0\x91\xc7RSS\x93\xc3\xe=$o\xbc\xfeZ~x\xd8\x8f\xf3\xb7W^\xa9\xbd\xd6\x32\xcb.\x93\xa5\xe6\x32\xcb\x88\xf9\xd3\xd0\xe7\xa8\xdb\xd2K\xa7\xdb\xd2K\xd7\xb9\xc6\xd4\xa9Ss\xcd\xd5\xc9\xea\xab\xad\x9ev\xff[\x9e\x8e\xc6SZZ\x9a\x63\x8e=.?>\xec\xd0\x94\x95\x95\x66\x95UV\xcd\xb3#\x9f\xc9g\x9f}\x96\x1d\a\xee\x9c$\x99>}z\xf6\xd9{\x8f\xf4\xeb\xd7?\x97\\zyZ\xb7n\x9d\xa3\x8e=>'\x1ewL\xa6O\x9b\x96~+\xad\x94\xbf\xbd\xfcr\xfe\xf3\x9f\x8f\xb2\xeb\xee{4\xf3#Z<\xf5\xea\xd5;?9\xfc\x88\x9cr\xf2\t9\xf1\xa4S\xd2\xa1\x43\x87\xdcq\xfbm\xd9q\xe0NYc\x8d\x35\x93$\x1f|\xf0~\x6\xed\xb9{N:\xe5\xd4\xec\xb3\xef\xe0\xec\xb6\xc7\x9e\xf9\xe1!\a\xa5k\xb7n\xd9t\xd3\xcdR\\\\\x9c\xe7~\xfbl\xda\xb7o\x9fM6\xdd\xac\x99\x1f\x11\xdf\x46\x30\x4\0\0\0\x14\x9c\xa2\xa2\xa2:\x9fr\x86o\xea\xd3g\x99\xdcv\xe7\xdd\xb9\xe3\xb6[s\xde\xb9gg\xedu\xd6\xcd\x1dw\r\xaf\xb3\xbf\xc9\x32\xcb.\x97\x95W\xf9N\xca\xcb\xcb\xf3\xc7?\xfc>o\xbc>k\x8f\x8e\x83\x86\xec_\xe7Z\xd7^wc\xb6\xd8r\xcb\x85Y~Ah\xe8sD\xf3\xd8l\xf3-r\xf3\xad\xb7\xe7\xbe_\xdf\x9b\x87\x1e| [l\xb1Un\xbc\xf9\xd6t\xee\xdc\x39IRVV\x96\x95VZ9\xcb\xaf\xd0\xb7\xf6\x9c\x1dw\x1c\x98\x36\xad[\xe7\xc1\a\x1e\xc8\xf0{\xee\xca&\x9bn\x9e_\xdd{\x7f\xbau\xeb\xd6\\\xf\x63\xb1\xf7\xd3\xc3\x8fL\xf7\xee=\xf2\xd0\x83\xf\x64\xfa\xf4i\xd9v\xbb\xed\xb3\xff\xfe\a\xa4\xb8x\xd6\xa2\x63m\xdb\xb6\xcb\xaa\xab~7\xdd\xbb\xf7H\x92l\xbc\xf1&\xb9k\xf8\xaf\xf2\xeb_\x8d\xc8\x39g\rM\xc7\x8e\x1d\xb3\xd1&\x9b\xe4\xb6;\xef\xf2<\xb5@_\x86\xe5\xb5\xf7\xdf\xf9`tM\x9f\x9e\xb3>\xb1\xf0\xd1\xe8O\xd2\x7f\x85\x1e\xcdQ\x17\xd0\x4\xa6M\xafL2\xeb{\xfb\xcb\xef\xf3\x39\xf9z\x1f\xaf\x5\0\0\xc0\xa2\xe0\xdd\xf\xc7\xd4\xf9;\xa6!\x7f\xf7\xfcw\xda\x7fS]-\x18\x2\0\x16\x7f\xc5\xc5\x45i\xdb\xa6m\x92Y\xbf\xf\xd9\x63\b\0\0\0(8%\xc5\x16Q\x1\0\n\xc3\x37\x7f\xef\x11\f\x1\0\0\0\x5\xa7\xa4\xb4\xa4\xb9K\0\0X(\xbe\xf9{\x8f`\b\0\0\0(8\xa5\xc5\xa5)\xfe\xc6z\xfb\0\0\x8b\x9b\xe2\xa2\xa2\x94\x96\x98\x31\x4\0\0\0\x14\xb8\xa2\xa2\xa4U\xabV\xcd]\x6\0@\x93j\xd5\xaaU\xbe\xf9Q\x18\xc1\x10\0\0\0P\x90JKJS^Z\xd6\xdc\x65\0\0\x34\x89\xf2\xd2\xb2\xd9\x66\v%\x82!\0\0\0\xa0@\x94\x95\x95\xa6\xa2\xa2\xb2N[\xabV\xad\x84\x43\0\xc0\x62\xa7\xbc\xb4l\xb6\xd9\xd1\x33+*S^V*\x18\x2\0\0\0\nCyYif~#\x18Jf\x85\x43mZ\xb7\xb6\xe7\x10\0\xb0\xc8+.*J\x9b\xd6\xad\xeb]2\xb7\x62\x66\x65\xca\xcaK3\xfb\x1c\"\0\0\0\x80\xc5P\xebV\xe5\x99>sf\xda\xa6\xf5l\xc7JKJS\xb2\x44i*\xab*SUY\x95\xaa\xea\xca\xd4\xd4$555\xcdP)\0\xc0\xbc)**JQQRR\\\x9a\x92\xd2\x92\x94\x96\x94\xce\xb6\xa7\xd0\x97\x66\xcc\x9c\x99\x36mZ\v\x86\0\0\0\x80\xc2\xb0\x44\x9bV\x99\x32uZ\xa6N\x9b\x9e%\xda\xcc\x1e\xe\x15%)+)MYIi\x92\xd9?e\v\0\xb0\xa8\x9a\x30qr*\xab\xab\xd3\xa6u\xb9`\b\0\0\0(\x1c]:\xb5\xcf\xe8q\x13\x66}\xba\x36IYyYJ\x8a\xad\xb4\xf\0,~fVT\xa6\x62\x66\x65\xa6\xcf\xacHuUU\xba-\xd5)I\x4\x43\0\0\0@\xe1())I\x9f\x9e]\xf3\xf9\x17\x93SYU\x93\x8a\x89SRU]\xdd\xdc\x65\x1\0\x34\xba\xf2\xb2\xd2\x94\x95\x97\x66\x89\x36\xe5i\xd3\xfa\xab\xd9\xd0\x82!\0\0\0\xa0\xe0,\xd9\xb1}s\x97\0\0\xd0,\xcc\x95\x6\0\0\0\0\0(\x10\x82!\0\0\0\0\0\x80\x2!\x18\x2\0\0\0\0\0(\x10\x82!\0\0\0\0\0\x80\x2!\x18\x2\0\0\0\0\0(\x10\x82!\0\0\0\0\0\x80\x2!\x18\x2\0\0\0\0\0(\x10\xa5\xcd]\0\0\0\0\xc0\xc2\x36\x61\xe2\xe4TUW\xa7\x62\x66\x65\xaa\xaa\xab\x9b\xbb\x1c\0\x80\x46WVV\x9a\xf2\xb2\xd2\xb4i\xd5*m\xda\x94\xd7\xb6\v\x86\0\0\0\x80\x82\x31\x63\x66\x45\xc6\x7f:1]\x96\xec\x90\xe2\xa2\xa2\x94u*MI\xb1\x5U\0\x80\xc5OEEefVTf\xda\xcc\x19\x99 }r\xc7\xad\x37\x34qE\r'\x18\x2\0\0\0h\x2\xe3\xc6\x8fOiII\xbat\xe9\xf2\xad}\xab\xab\xab\xb3\xfc\x8a\xab\xd6\xde\xef\xba\xd4\x92\xd9x\xc3\xf5s\xc0\x1\xfb\x65\xfd\xf5\xd7O\x92\xfc\xeew\xbf\xcb\x90\x83\x7f\x9c\xbf\xbf>*m\xdb\xb6\x9d\xa7\x1a\x66\xce\x9c\x99i\xd3\xa6\xa5}\xfb\xf6)\x9e\xcf\xfd\x95~y\xddu\xb9\xf0\xe2+\xf2\xc6\xab/\xa4}\xfb\xf6\xf3u\r\0h\x88\x91\xcf=\x9fw\xde~7I2\xf9\xbfSZT04f\xec\xb8|\xf0\xe1?\x9b\xbb\x8c\x5\"\x18\x2\0\0\0hd\x93'M\xce\x90\x83\xe\xcb\xb6\xdbl\x95\x13\x8e?z\x9e\xcf;\xe2'?\xc8\xe6\x9bo\x96\xa9S\xa7\xe6\xf\x7f\xf8\x63\xf6\xde\xf7\xc0\xdcz\xd3\x35\xd9z\xeb\xad\xe7\xab\x8eW^y%\x83\x6\x1f\x94\xd7^\xf9K:v\xec\x38_\xe7_x\xf1\x15\xf3\x35v\x92|\xfc\xf1\xc7y\xfb\xed\xf7\xb2\xcd\x36[\xd6{\xfc\xd9g\x9f\xcf\xca+\xf7K\xaf^\xbd\xe6{\f\0\x16}\xbfy\xec\xf1\xbc\xfc\xf2\xdfr\xc8\x41\a\xe6\xe5\xbf\xfd-\xff\xf8\xe0\x1f\xb5\xc7\xfe\xf1\xc1?r\xff\x3\xf\x65\xfd\xf5\xd6\xcb\xcd\xb7\xde\x96u\xd6Y+;\xf\xdcq\xa1\xd7x\xea\xe9\x43\x33h\xef\xbd\x92$\xfb\xef\xbfOv\xdc~\xc0\\\xfb\xbf\xfc\xca\xaby\xe8\xa1\x87\x17h\xcc\xa6\xfa\x39*\x18\x2\0\0\0hD3+*\xf2\xa3\x9f\x1e\x95n]\x97\xca\xd1G\x1d\xde\xa0sW\xec\xb7\x62\x36\xd8`\x83$\xc9V[m\x95\x99\x33g\xe6\xfc\v.\x9e\xef`hAL\x9a\x34)'\x9d|j\x6\xf\xda-\xc3\xef}h\xbe\xae\xf1\xf6\xdb\xef\xe5\xa7G\x1e\x9b+.\xbb\x38\xdb\xf\xd8\xb6\xce\xb1'\x9fz&G\x1f{R\xae\xbd\xea\x32\xc1\x10@\x1\x9b:uZ\xce;\xef\xe2\x8c\x1d\x37.\xb7\xdcz\xe7l\xc7gVT\xe4\xb8\x13~V{\xff\x89'\x9e\xc9\x36[m\x95%\x96h\xb3\x30\xcb\xcc_\xfe\xf2\x42\xb6\xd9j\xab$I\xdf\x15V\xc8\xa6\x9bl4\xd7\xfe\x33\xa6\xcfX\xe0`\xa8\xa9~\x8e\xce\xdf\x1c\x62\0\0\0\x80\x2\x37\xb3\xa2\"\xff\xf7\xa7?\xd7i\xab\xae\xae\xce\x89'\x9e\x9a\xcf?\x9f\x98_^sE\xca\xca\x16\xec\x33\xb9\x9bm\xb6i\xde\xfb\xe0_\xf9\xe2\x8b/\xea\xaf\x61\xe6\xcc\xdcz\xdbm\x19\x34h\xdf\xec\x38p\xe7\\y\xd5U\x99\x32\x65J\x92\xe4\xc5\x17Ge\xd0\xe0\x83\x92$\xab\xaf\xb5\x61\x96]a\x95L\x9e \xfc\xf0\xc3\xac\xbf\xfe\xfa\r\x1e\xbf\xaa\xaa*\xe7\x9csn\xe\xfc\xfe\xe0\xac\xb7\xde\xbaI\x92\x9a\x9a\x6_\x6\0\x9aLuu\xf5<\xf5+..\xce\xf9\xe7\x9d\x95\xa2\xa2\xa2\xdc\x33\xfc\xde$\xc9\xfe\xfb\r\xcay\xe7\f\xad\xf7\x3\x17\x85\x44\x30\x4\0\0\0\x30\xf\xea\x84\x42\xc3\xef\xc8\xb2\xcb\xf6I\x92\xec\xb9\xc7n))-MyYY\xd6[w\x9d\x5\x1a\x63\xb3M\xd6\xcb\x91G\x1c\x9e%\x96X\"\xbd{\xf7\xce\x92K.9\xc7\xbe\x33\x66\xce\xc8\xcc\x99\x15\xb3\xb5\xb7k\xd7\x36\xe5\xe5\xe5\xf3\x35\xfe\xd3O?\x9d\xc7\x9fz.\x8f?\xf5\\.\xbd\xe2\xba:\xc7\xbe\xbb\xc6\xfa\xe9\xd2\xb9\x63^\x1e\xf5\x97\x6_\xf7\xeb{!$\x96\x92\x3\xe0+\xff\xf7\xa7\xbf\xe4\x98\xe3N\xaa\xbd?\xf1\x8b/r\xe9\x65W\xe5\xb8\x63\x8fLMMM~~\xc9\xe5\xb5\xb3\x85\x92\x64\x87\x81{\xe4\xb2K/\xca\xc6\x1bm\xf0\xad\xd7...\xce\xb0s\x87\xa6\xa8(IQQ\xce;\xfb\xcc\x45\x32\x14j\xec\x9f\xa3\x82!\0\0\0\x80yp\xd5U\xd7\xe6\x8d\x37\xde\xac\x13\n}i\xb7]vj\x94\x31\xf6\xdcs\x8fl\xb0\xc1\xb7\xbf\xd1\x95$+,\xbf|\xde\xfb\xe0_\xf9\xe7?\xff\x99\xe5\x96[.\xc9\xac\x65\xe0\xde\xfb\xe0_\xe9\xd7\xaf\xdf\xffz\x15%I**f\xf\x90\xea\xb3\xd6Zk\xe5\xd1\x87\xef\xad\xd3\xf6\xec\xb3\xbf\xcd\x65W^\x97\xbbn\xbfq\xae\x41\xd5\x9c|\xfd\xcd\xac/\xdf\xc0\xfa\xfa^\t\xc2!\x80\xc2\xf6\xe2\x8b\xa3\xea\xec/\x94$W]s]\xee\xbc{DRS\x93\x89_|Q\xe7\xd8\xd8q\xe3\xf2\xd7\x17\x46\xcdS0\x94\xcc\n\x87\xce;gh\xed\xed\x45MS\xfc\x1c\x15\f\x1\0\0\0\xcc\x83\xc3~\xf8\x83\xec\x33h\xaf\xf4\xee\xdd<\x9bU/\xb1\x44\xdb$\xc9\xa8Q/e\xd5U\xbf\x93\xf5\xd6[/[n\xbeQ\x8e>\xe6\xb8\x1cy\xc4OSVV\x9e\x1bo\xba)\x83\a\xed\x96\xd5V[-I\xd2\xb3g\xcf$\xc9\x83\xf>\x98u\xd7]7\xfd\xfa\xf5K\xbbv\xed\xe6\x38\x46\xf7\xee\xdd\xd3\xbd{\xf7:mS\xa7N\xcd\x65W^\x97\x35\xd7\\#\xed\xdb\xb7oP\xcd\xcf>\xfb|\xbdo\\}}\xaf\x84k\xaf\xba,\xdbl\xb3\x65\x83\xae\v\xc0\xe2\xe3\xb0\x1f\xfe \xc3G\xdc\x97\xb1\xe3\xc6\xd5i\x9f\x38qb\xbd\xfd{t\xef\x9e\x1f\x1fvH\x83\xc6h\xec@\xe8/\x7fy\xf1[\xfb\xbc\xfb\xee{\v ^\v\0\0\x80\x45\xc1\xbb\x1f\x8e\xa9\xf3wLC\xfe\xee)Tc\xc7\x8e\xcd'\x9f|2\xc7\xe3\xdd\xbau\xcb\xd2K/\xbd\x10+\x2\x80\xd9m\xbb\xc3.y\xf7\x9dY3nVZ\xb9\x7f\x9e~\xfc\xe1\x66\xae(\xd9\xfa{;d\xa7\x81;d\x8d\xd5W\xff\xd6\xbe]\x96\xea\x92\x35\xd7Xm!T\xd5p\x1f\x8d\xfe\xc4\x8c!\0\0\0\x80\x42\xf1\xdb\xe7\x9e\xcb\xcfN;g\x8e\xc7/\xbe\xf0\xec\xec\x33h\xd0\x42\xac\b\0\x66\xf7\xbd\xad\xb6L\x87v\xb3\x96/\xdd`\xfdu\x9b\xb9\x9aYz\xf7\xe9\x93G\x1f{\"\x8f>\xf6\xc4\xb7\xf6\xddp\xc3\xf5[l0\x94XJ\xe\0\0\0\xa0`\xec\x37xp\xf6\x1b<\xb8\xb9\xcb\0\x80\xb9:\xf9\xa4\xe3\x9a\xbb\x84\xd9\xdcq\xeb\r\xcd]B\xa3i\xdc\x1d\x97\0\0\0\0\0\0h\xb1\x4\x43\0\0\0\0\0\0\x5\x42\x30\x4\0\0\0\0\0P \x4\x43\0\0\0\0\0\0\x5\xa2\xb4\xb9\v\0\0\0\0X\xd8>\x1a\xfdIs\x97@#\xe9\xd3\xb3ks\x97\0\0\x8b\x14\x33\x86\0\0\0\0\0\0\n\x84\x19\x43\0\0\0@\xc1\x31\xcb\x4\0(T\x82!\0\0\0\xa0\xe0XJ\xe\0($_\xffP\x8c`\b\0\0\0(8f\f\x1\0\x85\xca\x1e\x43\0\0\0\0\0\0\x5\xc2\x8c!\0\0\0\0\xea\x35s\xe6\xcc|\xfc\xf1\xc7\x99\x32yr**+\x9a\xbb\x9c\xf9VVZ\x96v\xed\xdb\xa7W\xaf^)//o\xeer\0\xa0Y\t\x86\0\0\0\0\x98\xcd\xcc\x99\x33\xf3\xd6[o\xa5\xaa\xaa\xb2\xb9KY`\x15\x95\x15\xf9\xfc\xf3\t\x99\x34iRVYe\x15\xe1\x10\0\x5\xcdRr\0\0\0\0\xcd\xe4\xa3\xd1\x9f\x34\xdb\xb8\xdf\x36\xf6\xc7\x1f\x7f\xdc\xac\xa1P\xd7\xee\xcb\x34\xfa\x35\xab\xaa*\xf3\xf1\xc7\x1f\x37\xfau\x1b\xd3\xbc<7\xb4L\x8b\xf2s\xb7(\xd7\xe\x34\x9c`\b\0\0\0\x80\xd9L\x99<\xb9\xb9Kh\x12S\xa6,\x9e\x8f\v\0\xe6\x95`\b\0\0\0\x80\xd9,\xca{\n\xcdME\xc5\xe2\xf9\xb8\0`^\t\x86\0\0\0\0\0\0\nDis\x17\0\0\0\0\xc0\xe2\xe3\xa3\xff\x8cN\x92\xf4\xe9\xdd\xb3\x99+\xa1\xa5\xa9\xa8\x98\xb5gUYY\xd3\xbc%\xf9\xc9\xa7\x9f\x66\xec\xd8qY\xed\xbb\xab\xce\xd7\xf9\xaf\xbf\xf1\x66\x96^\xba[\xbau\xed\xda\xc8\x95-\xb8\xc7\x1e\x7f\x32I2p\xc7\xed\x9b\xb9\x92y7}\xfa\xf4\xdcr\xdb\x9du\xda~p\xf0\x90\xb4j\xd5\xaa\x99*\x2\xbe$\x18\x2\0\0\0\xa8\xc7\x88_\xdd\x97\x17G\xbd<\xcf\xfd\x37\xdap\xbd\xec\xb5\xe7\xeeMXQ\xcb\xf7\xd1\x7f\x46\xe7\xcc\xb3\x86%I\xce\x39\xeb\xb4\xc5:\x1c\xba\xfc\x8a\xabkC\xb0\xaf[o\xdd\xb5\xb3\xef>{5CE\xdf\xee\xd6\xdb\xeeJ\x92\x1c|\xd0\x1\v}\xec\x8a\x8a\xca\x1cy\xf4\xf1i\xdb\xb6m~\xf1\xf3\xf3\x9b\x64\x8cq\xe3\xc6\xe5\x95W^\x99\xef`\xe8\x95W^\xc9\x9ak\xae\xd1\"\x83\xa1\xfb\x1ex(\xc9\xa2\x15\f\xfd\xe3\x1f\xff\xca\x45\x17_\x9a\xf2\xb2\xb2$\xc9\xcc\x8a\x8al\xb5\xc5\xe6Ye\x95\x95\x9a\xb9\xb2\xafTVV\xe5\xaf/\xbc\x98M6\xde\xb0\xb9K\x81\x85J0\x4\0\0\0P\x8f\x17G\xbd\x9cG\x1f{\"\xfdV\xec\xfb\xad}\xa7L\x99\x92\xfb\xee\x7f\x30\xd3\xa6N\xcf\xf7\xbf?x!T\xd7\xf2|\x19\nM\x9c\xf8\x45\x92\xe4\xcc\xb3\x86-\xd6\xe1\xd0?\xff\xf5Q\xde\x7f\xff\x83\xda\xfbo\xbd\xfdv*+\xab\x92\xa4\xc5\x6\x43\xbf\xff\xe3\x1f\x93,\xfc`\xe8\xcbP\xe8\xf7\x7f\xf8\x63\xee\xb8\xed\xc6\x85:6\vOUUUJJJj\xef\xbf\xff\xe1\xac\xef\x8f\x97^\x9c\xf5u\xb7\xda\x9a\x1b\xe4\xfd\xf?\xa8\x13\f}\xf3\x9c\x85\xa9\xaa\xaa*\xc7\x9fpJ:t\xea \x18\xa2\xe0\b\x86\0\0\0\0\xe6\xa0\xdf\x8a}\xf3\xc8\x43\xf7\xe6\xb3\xcf>\x9b\x63\x9f\xe\x1d:\xa4\xa4\xa4\x34\xc7\x9fpJN\x1fzN\x92\x14\\84v\xec\xf8\x9cy\xd6\xb0\x94\x96\x94\x66\xb9\x65\x97I\x92L\x99\xf2\xdf\x9cy\xd6\xb0\\p\xde\xd0t\xef\xde\xad\x99+l|\x97_z\xd1W\xb7\xaf\xb8:\xaf\xbf\xf1\x66JK\x9b\xe7\r\xee\x96\xee\xe4\x9f\x9d\x91'\x9e|:\xa5\xa5%\xf9\xc9\xe1\xc7\xa4O\xef\xde\xd9z\xeb-2\xe4\x80\xc1\xe9\xd0\xa1\x43s\x97G#\xa8\xae\xae\xce\xa0}\x87\xa4W\xcf\x1e\x39\xec\xb0\x43\x32u\xea\xb4\xfc\xf2\x97\x37\xa5}\x87\xf6\xb5\xcfq\x87\xf6\x1dr\xed\xb5\x37\xa6\xebR]\xd3\xbe}\xbb\\\x7f\xfd\xcd\x19=fl~\xfd\xab;STT\xd4$uUTT\xd6\xbbt\xe1\xacP\xe8gy\xf8\x37\x8f\xe5\x9a\xab.m\x92\xb1\xbfi\xe2\x17_\xa4]\xdbv-\xeeubN\xffG,\xde<\xe3\0\0\0\0s\xf1\xd9g\x9f\x65\xdd\r6\x9f\xe3\xf1\xcb/\xbd(\xbb\xef\xb6K~q\xc9\x85I\x92\xd3\x87\x9e\x93\x36K\xb4.\xa8\x65\xe5:w\xee\x94\xb5\xd6\\#\x83\xf6\xda-7\xdfzG\x92\xe4\xe4\x13\x8f\xc9\xbd\xf7=\x94\xce\x9d;5suM\xeb\xf2+\xae\xce\x65W\\\x93\x63\x8f><#\x9f}\xbe\xb9\xcbiQ>\xf8\xf0\x9fI\x92}\x6\xed\x99'\x9e|*EEE\xf9\xde\x36[\xe5\xad\xb7\xdf\xc9\x65\x97_\x95\x9bn\xbe=\xd7^}Y6\xdeh\x83\x46\x1b\xb3\xa6\xa6&\x15\x15\x15I\x92\xd2\xd2\xd2o\r\x1cjjjRYYY{\xbb\x39M\x99\xf2\xdfTT\xcc\xac\xf7X\xc5\xccY\x8f\xe9\xf3\xcf?\xaf\xf7xYYy\xda\xb5k\xdb\x64\xb5}\x9bG\x1e}<\xa3^z9\xff\xf9\xcf\xd2y\xf8\x37\x8f%IV^y\xa5\f=\xfd\xd4\xda>\xe7\x9c}Zn\xbd\xed\xae\xec\x33xH\x92\xa4\xfb\xd2Kg\xec\xb8qy\xe4\xd1\xc7\xb3\xeb\xce\x3\x1b\xbd\xa6'\x9e|:\xbf\xb8\xf4\x8a\xdcu\xe7-\xe9\xbe\xf4\xd2\xb5\xedUUU9\xe1\xa4\xd3\xf2\xd0#\x8f\xe6\x92\x8b\x87-\xf0\xf2|\xff\xfa\xc6\xec\xc1\xb2\xb2\xd2l\xbe\xf9\xa6If}M\r\x1f\xf1\xeb\\u\xf5u\x19=fLZ\xb5j\x95\xcd\x37\xdf\x34\xe7\x9e}zzt\xef\xbe@\xe3~\x9b\x9a\x9a\x9a\xcc\x9c\x39s\xae{:]w\xc3\xcd\xb9\xe8\xe2K\xb3\xe1\x6\xeb\xe5\xf6\xdbn\xac]\xf6\x8f\xc5\x9f`\b\0\0\0\xa0\x11\x94\x96\x96\xe4\x17\x97\\\x98W_{=\x7f\xfe\xcb\x8b\x5\x11\f\x8d\x19\x33\x36\x9d:uJ\x9b\x36\xads\xd4\x11\x87\xd5\x39\xd6\xbd{\xb7\xda\xb6\x99\x33gf\xc2\x84\x89\x8b\xdd\xcc\xa1\xaf\x87\x42\xc7\x1c}D\x8b\xf\x86\xb6\xd9r\xcb\x85\x36\xd6\xbb\xef\xbc\x97\xbd\a\xf\xc9\xca+\xf5\xcb\x88{n\xcf\xad\x37_\x9f\x83\xe\xf9Q*+*\xf2\xd0\xfd#\xf2\xce\xdb\xef\xe6\xe8\xe3O\xca\x90\x83\xe\xcd\xf0\xbbo\xcbz\xeb\xae\xd3(\xe3VWW\xe7\xae\xbb\xefI\x92\xec\x34p\xc7t\xfd\x96\xfd\x82>\xfd\xf4\xd3<\xfa\xd8\xe3\x8d\x32\xf6\x82\x1az\xf6\xb0\xdcw\xff\x83s\xed\xb3\xe6:\x1b\xd7\xdb\xbe\xd7\x9e\xbb\x37\xd9\xdeM\xdf\x66\xda\xb4i\xb9\xe8\xa2K\xb3\xc1\xfa\xeb\x66\xc4=\xb7\xe7\xb9\xe7~\x9f\xd7^\x7f=\x87\x1f\xfe\xe3:A\xc3\xee\xbb\xed\x92\x9d\x6\xee\x98\xab\xaf\xbd>\xab\x7fw\xd5l\xb5\xd5\xe6\xd9g\xf0\x90\\x\xe1/2`\xdbm\xd2\xbau\xeb\x46\xab\xe9\xf1'\x9e\xca\x11G\x1d\x9f\x9a\x9a\x9a\xec\xb3\xef\x90\x8c\x18~{zt\xef\x9e\xaa\xaa\xaa\x9cx\xf2\xe9y\xf0\xa1Gr\xf1\x45\xc3\x1a\xe5u\xfa\xa9\xa7\x9f\xc9\xb0\v~^{\xbfS\xa7Ny\xf5\xe5?'I.\xbb\xfc\xaa\\u\xcd\xf5\x39p\xc8~\xd9|\xd3M\xf3\xe9\x84\t\xb9\xf6\xda\xeb\x33p\xe7\xbd\x32\xf2\xa9G\xd2\xb9s\xe7\x5\x1e\xbf>3g\xce\xcc\xe0\xfd\xf\xceK/\xbf\x92\x93N<6?\xfd\xf1\xf\xeb\xedw\xdbmw\xa5\xba\xba:\x7f\xfa\xf3_\xf3\x8f\xf\xfe\x91\x95V\xee\xdf$\xf5\xd0\xf2\b\x86\0\0\0\0\xe6\xa2\xa4\xa4$\xbdz\xf5\x9a\xe3\xf1\xb6m\x97\xa8\xbd]ZZ\x92v\xed\xda-\x8c\xb2\x9a\xdd\x97{\n\xad\xf6\xdd\xef\xe4\xb8\x63\xe\x9fk\xdf\xebn\xb8-\xaf\xfc\xed\xd5\xc5j\xcf\xa1o\x86\x42\x8b\x82\x3\xe\xd8w\xa1\x8cSQQ\x99\xa3\x8e;1KuY27\\\x7fU\x8a\x8a\x8a\xb2\xe1\x6\xeb\xe5\xd6\x9b\xaf\xab\xed\xb3\xd2\xca\xfd\xf3\xf0\x3\xbf\xcaN\xbb\xec\x99#\x8e<>\xbf{\xee\xc9\x46\r\x6Xx^xaTF\x8f\x19\x93\xa5\xbbw\xcb\xd8q\xe3\xb2\xcd\x36[f\x9bm\xb6L\x92\xbc\xf2\xca\xab\x19>\xe2\xde$\xc9~\xfb\xed\x9b\x35\xd7X-\xc7\x1e=\xeb\xf5\x62\xf4\x98\x31\xa9\xa8\xac\xcc\x98\xb1\x39\x84\xb5\xb7\0\0 \0IDATc\xf3\xc2\x8b/e\xf3\xcd\x36i\x94z\x1e{\xfc\xc9\x1cy\xf4\t\xd9z\xab-r\xfc\xb1G\xe5\x80\x3\xf\xcd>\x83\x87\x64\xf8\xdd\xb7\xe5\xd2\xcb\xae\xce\xfd\xf<\x94\x8b/\x1a\x96\x41{\xcd\n\x85\x66VT,\xd0L\x99\xc1\xfb\xec\x9d\x1dw\x18P{\xbf\xa8x\xd6,\xb5\x7f\xfe\xeb\xdf\xb9\xfa\xda\x1br\xe6\xe9?\xab\xb3\xaf\xd7\xe\xdb}/\x3v\xdc-\x17\xfd\xfc\xb2\\t\xc1\xb9\xf3=\xee\xdc\xbc\xf5\xf6;\x19\xf5\xd2\xcbI\x92{\x86\xff\xaa\xde`\xe8\x91G\x1f\xcb\xb8\xf1\xe3\x93$\xeb\xae\xb3v\x96\xef\xbb|\x93\xd4\x42\xcb$\x18\x2\0\0\0\x98\x8b\xce\x9d;\xe7O\x7f\x18\xb9\xd0\xc7\xfd\xf8\xe3\x8f\xf3\x87?\xfe\xb9\xde\x63\x9bm\xba\xd1\\\xc3\xaa\xa6\xf6\x65(TZR\x9a\xfd\xf6\xdd\xfb[\xfb\xf\xdak\xb7\xbc\xfe\xfa\x9b\x39\xf3\xac\x61\x8d\x12\xe}\xf2\xc9\xa7\xf9\xdbko\xd4{l\xcd\xd5\xbf\x9b\xae]\x97Z\xa0\xeb\x7f\x9b\x39\x85\x42+\xae\xd8\xb7\xc5\x6_\x95\x95Uy\xe2\xa9\xa7\x32q\xc2\x17\x19 \xbd\xde\xe3\x1d;6\xdf^M[l\xb1Y\xee\xbc\xfd\xa6\x1cs\xdc\xc9\xd9\x61\xc7\xdd\xf3\xeb\x11w\xa6\xffJ\xfd\xf2\xca+\xaf\x66\xcf\x41\xfb\xa7\xaa\xaa*Ir\xff\x83\xf\xe7\x81\xfb\x86g\x8d\xd5W\xcb\xbb\xef\xbc\x97\xbd\xf6\xf9~\xda\xb4i\x9d{\xee\xba\xb5\xd1\x96\x13\xfc\xcd\x63\x8f\xe7\xe8\x63N\xca\xd6[o\x99k\xaf\xbe,\xe5\x65\x65\xf9\xd5\xf0;\xb2\xef~\af\xeb\xef\r\xcc\xf4\xe9\xd3s\xd1\x85\xe7\x65\x9f\xbd\xf7H\x92\xbc\xf1\xe6\xdf\xf3\xf4\xd3#s\xdc\xb1G\xcd\xf7\x98\xed;\xb4O\xfb\xe\xedgk\x1f\x35\xea\xa5\x94\x14\x17g\xff\xfd\xf7\x99\xad\xff\xde{\xed\x96\x87\x1fyl\xbe\xc7\x9c\x9b\xca\xca\xaa\xdcr\xcb\x1d\xb5\xf7?\xfexL\x1ey\xf4\xb1\xec\xb2\xd3W\xcb\xf5=\xf2\xe8\x63\x39\xfa\x98\x93\xb2\xdb\xae;\xe7\xac\xa1?K\x87\xf6\x1d\x9al\x9f'Z&\xc1\x10\0\0\0@\v\xd4\xa3G\x8f\xfc\xed\xd5\xd7\x32|\xc4\xaf\xeb\xb4\xef\x37xP\x6\xfd\xefM\xcd\xe6\xf0\x65(4q\xe2\x17Yn\xd9\x65j\xf7\x14\xfa\xd2\xbb\xef\xcd\xdakc\xd8\x5\x97\xd4io\xd7\xaem\xfe\xf9\xaf\x7f\x37J8\xd4\xa5K\xe7\xbc\xff\xde\ayz\xe4su\xda\xb7\xdbv\xebl\xb3\xd5\x9c\xf7\x83j\fs\x9b)t\xf9\xa5\x17\x35\xe9\xd8\xf3\xe2\xd6\xdb\xee\xca\xef\xff\xf8\xc7\xda\xfb\xdbl\xb9\x65\xe\x38`\xdf\f\x1f~oN\x1fzN\x92\xa4S\xe7\x8e\xd9y\xe0\x8e\xb9\xeb\xae\x11y\xf6\xf9\xe7k\xfbn\xbe\xe9\xa6uf6\xcc\xaf\xa7\x9e\xfem\xfa\xf7\xeb\x9b\xb5\xd7Z\xf3[\xfb\xae\xbe\xdaw\xb3\xec\xb2}\xf2\x87?\xfe\xa9\xe0\x83\xa1^={\xa6W\xcf\xfa\xbf/\xdaw\x98\x35\x13\xf1;\xab\xac\xbc\x30K\x9ag\x9bo\xb6I.\xbb\xe4\x82\f9\xf8\xb0TT\xcd\xda\xb3\xe9\xee\xe1#jC\xa1\x64V`q\xcf\xf0{\xb3\xc6\xea\xab\x65\x46\xc5\xcc|1\xe9\x8b\\s\xf5\xa5\x8d\x1e\nm\xb3\xf5V\xb9\xe6\xeaKkg\x1\xad\xd8w\xf9\x8c\xb8\xe7\xf6\xec\xb7\xff\x41\x39{\xe8i\xd9w\xd0\x9e\xb5\xe7\x9c\xf2\xb3\x33\xb3\xd6\xdak4\xca\xf8\xdf\x34}\xda\x8c\x94\x95\x97\xa5\xb4\x64\xf6\x10\xb6\xbcU\xabL\x9e\xf2\xdf\x46\x1f\xb3\xaa\xaa*\xc7\x9fpJ\x1ey\xf4\xf1\\y\xc5%\xd9z\xcb-r\xe6Y\xe7\xe5\xe8\x63NJ\x92\xec\xb2\xd3\xc0\xdaPh\xd7]v\xca%\x17\xfKI=\xf5\xb1\xf8\x13\f\x1\0\0\0\x34\xc0\x8c\x19\x33\xf2\xd0\xff>\xe9\xbd\xdb.\x3\xe7\xba\xb1\xf7\x82(..\xce\xf9\xe7\x9d\x95\xa2\xa2\xa2\xdc\x33|\xd6RL\xfb\xef\x37(\xe7\x9d\x33\x34\xc5\xc5\xc5M2\xe6\xa2\xa2\xb8\xb8\x38?:\xec\xe0\xa4\xa8(O?\xf3\xdb$\xc9\x80\xed\xb6\xce\x61\x87\x1e\xd4\xa4\xff\x37\x8b\xe2\xf2q_\xea\xd4\xf9\xab\x99;\x13'|\xd1\xa4\x63}\xf4\xd1G\xe9\xdb\xb7\xef<\xcf@Xy\xa5\x95\x33z\xcc\x98&\xad\x89\x96\xa9\xa6\xba\xbaQ\xae\xf3\xf4\x33#s\xd4\xd1'f\xdb\xefm\x93k\xae\xba\x34\x65\x65u\xdf\xf6^\xb1\xef\xf2\xf9\xed\xc8\xc7\xd3\xae]\xdb:\xed\x95\xff\v\xb1\x16\xc4=\xc3\xef\xcd\xd5\xd7\xdeP{\xbf\x63\x87\xf6y\xe2\xb1\a\xb3\xda\xea\xab\xe6\xbf\xff\x9d\x9a\xdf\xfd\xee\xf\xd9j\xab-\xbe\x1a\xb3\xb2*O>\xf9\xcc<\x5\xa7\r1+\x14\xfaY\x1ey\xf4\xf1\\q\xf9\xc5\xb5\x33\x84.\xb9xX\x92\xe4\xe8\x63N\xca\x5\x17\xfc\"c\xc7\x8d\xcb\xae;\xf\xcc/~~\xbeP\xa8\x80\t\x86\0\0\0\0\x1a\xe0\xfb\a\x1e\x9a\xbf\xbe\x30*I\xf2\xc0\x3\xf\x65\xc4=\xb7\x37\xd9\x12<\xc5\xc5\xc5\x19v\xee\xd0\x14\x15%)*\xcayg\x9f\xd9\xec\xa1P\x9f\xde=s\xceY\xa7\xe5\xcc\xb3\x86\x65\xca\x94\xff\xe6\xe4\x13\x8fI\xf7\xee\xddj\x8f\x7f\x39S\xe8\xb4\x9f\x9dP\xdb\x36v\xec\xf8\x9c\x31tX:u\xea\xd8h\xfb\f\x15\x17\x17\xe7G? \xdf\xe1\xd0?>\xfcgF\xbd\xf4r\x92\xa4[\xd7\xae\xf5\x86\x42\xc9\xac\x90j\xf8\xdd\xb7\xe6\xbd\xf7?H\xbf\x15\xe7}\x99G\x16_\x82!\0\0\0\x80y\xd4\xaaU\xab\xdcr\xf3/s\xc9/\xaeHQQQN8\xfe\xe8&\xdb\x63hQ\xf0\x65\xd0\xf3\xe9g\x9f\xe5\xaa\xabo\xc8\xe1?9\xb4\xf6\xd8\xb8q\xe3s\xedu7\xe7\xc8#\xe\xcbR]\xba\x34I(\xd4\xd4\x16\xa7P(I\x9e}\xfe\xf9$M\x1f\f\xad\xbd\xd6\x9a\x19\xbc\xef\xde\xb9\xf0\x92K\xb3\xe6Z\xab\xe7\xbb\xab~\xa7\xde~o\xfe\xfd\xad\\p\xc1\xcf\xb3\xe7\x1e\xbb\x65\xa3\x5\f\x6\xbeT\\\\\x9c\xfd\x6\xcfz|\xa5\xf3\xb0<\xddRK-\x95\x3\xf6\xdf/Ir\xcf\xf0\x11\x8dR\xc3\x82\xea\xd1\xa3{\xfe\xf6\xd2\x9f\xea\xb4\x1dy\xf4\xac\xa5\x19\xaf\xba\xe2\x92:\xed\x1d:tXhu\xcdI\xeb\xd6\xads\xf2\xc9\xc7\xe5\xa8\xa3O\xc8\x46\x9bl\x9d\xb1\xe3\xc6%I\x1e{\xfc\xc9\x1cv\xd8\xa1\xd9w\xd0\x9eI\x92\x11\xbf\xba/7\xdcxs>\xf8\xf0\x9fI\x92\xeeK/\x9d\xb1\xe3\xc6\xe5\xaa+/i\x94\xd7\xd1\x7f\xfd\xeb\xa3,\xbbl\x9f\x5\xbeNC\xbd\xfa\xda\xeb\xf9\xeb__\x9c\xe3\xf1\xd6\xadZg\xc8\x90\xfd\xd2\xab\xd7W3\xbb\xca\xcb\xcar\xe7\xed\x37\xd5\x86\x43\xf7\x8e\xb8\x33}WX\xae\xc1\x63\xaf\xd0w\x85l\xb2\xf1\x46\xf9\xf3_\xfe\x9a\x83\xeaYB\xf2\xeb\xca\xcb\xcb\xb3\xeawVi\xf0\x18,\x9e\x4\x43\0\0\0\0\r\xb0\xce\xdake\xf8\xdd\xb7\x35w\x19-\xca\xf4\xe9\x33\xf3\xef\x8f\xfe\x93\xd3\xce\x38\xafv\x89\xa2\xd3\xcf\x1c\x96\xca\xaa\xcaL\x9f>\xb3\x99\xab\x9b?o\xbd\xfdv^\x7f\xe3\xcd\xc5&\x14Z\xd8N=\xe5\x84\xbc\xf9\xe6[\xd9}\xcf\xc1\x39\xf1\x84\x63\xb2\xeb.\x3\xb3t\xb7Y\xe1\xe0\xb8\xf1\xe3\xf3\xe8\x63O\xe6\xa2\x8b/M\xdf\x15\x96\xcf\x19\xa7\x9d\xd4h\xe3\x16\x15\x15\xa5\xac\x1{\xee|\xbd\x7fK\x99\x45QRR\x92%\x97\\\xb2N[Y\xf9\xac\x1a\xbf\xd9\xdeR\xec\xb2\xd3\x8e\xb9\xf3\xce\xe1\xe9\xdd\xabg\xe;\xec\x90L\x9a\x34\x39\x43\xcf\x1e\x96\xf3\xce\xbf\xa8\x36\x18\x1av\xfe\xcf\xd3\xb3W\x8f\f\xbf\xfb\xb6t\xec\xd8!7\xdcpKF\x8f\x19\x93\x9d\a\xee\xb8\xc0\xe3\xff\xf5\x85Q\xb9\xe8\xe2K\xf3\xc0}\xf7,\xf0\xb5\x1a\xea\xa5\x97\xfe\x96\xcb\xae\xb8z\x8e\xc7\x97\xec\xb4\x64\x86\f\xd9o\xb6\xf6\xe\x1d:\xe4\xce\xdbo\xca\xb0\xf3/N\x97.\xf3\xf7\xbc\x96\x95\x95\xe6\x9e\xbbnIEEe\xca\xca\xbc\xd5\xcf\xbc\xf3\xd5\x2\0\0\0\x30\a\xef\xbd\xff\x41v\xda\x65\xaf\x6\x9f\xb3\xd2J\xfd\x9b\xa8\xa2\x96\xa9w\xaf\x1e\xb5{\xe\xfd\xf3_\xffN\x92t\xea\xd4\x31\xe7\x9cuZz\xf7j\xba\xfd\x97\x9aReeUJKK2\xf2\xd9\xe7\x33\xf2\xd9\xe7\x93\xcc\xda;\xe7\xf2K/j\xde\xc2\x16\x11\x1d:t\xc8\xfd\xbf\xbe;\xc3.\xf8y\x86\x9d\x7fq\x86\x9d\x7fq.\xbf\xec\xe2\xb4n\xd5*?\xfe\xe9\xd1I\x92\xfd\xf7\x1b\x94\xa1g\x9cZ\xd0\xb3\xee\x16\x17\x45\x45\x45\xf9\xd5\xf0\xdb\xeb\xec)u\xf8O\x7f\x98#\x8f:!\x93&MJ\x92L\x9a<)\xe7\x1f>4\x1bo\xb4\x41\x92\xe4\x8a\xcb\x7f\x9e\xaa\xaa\xaa\x46\t\xe4\x1e}\xfc\x89L\x9d\x36u\x81\xaf\x33?\xe\x39\xf8\xfb\x39\xe4\xe0\xef\xcf\xd7\xb9\x1d:t\xc8\x45\x17\x9e\xb7\xc0\x35\b\x85h(_1\0\0\0\0\xf5Xo\xdd\xb5\xe7\xeb\xbc\x95V\xea?\xdf\xe7.\xca\xfa\xf4\xeeY\x1b\xe%\xc9\x39g\x9d\x96>\xbd{6sU\xf3gN\xcf\xdf\xa2\xfax\xbe\xb4\xf9\xa6\x9b~{\xa7\x46T^^\x9e\xb3\x87\x9e\x96\x43\xe\x1a\x92\x91\xbf}.\xcb-\xb3LJJKr\xfai'g\x9b\xad\xb7\xcc\n\xcb/\xb7P\xeb\xa1i}=\x14J\x92\x15\xfb\xf6M\x92\xac\xb3\xdeW_w+\xae\xd0w\xae\xe7\xcc\xaf\r\xd6[7\xdd\x97^:I\xd2\xa1}\xbb\f\x19\xb2_\xbaw\xef\x9e$\xd9\x66\xcb-k\xfbu\xef\xbet\x86\f\xd9/\x1d\xda\xb7K\x92\xec\xbc\xd3\x8eYv\x99\x85\xbf\xfc\x1c\x34\xb7\xa2w>\x18]\xd3\xa7g\xd7$\xc9G\xa3?I\xff\x15\x16\xcdOq\0\xb3\x9b\x36\xbd\x32\xc9\xac\xef\xed/\xbf\xcf\xe7\xe4\xeb}\xbc\x16\0\0\0\x8b\x82w?\x1cS\xe7\xef\x98\x86\xfc\xdd\xd3R4WM\x1f\x8d\xfe$I\xe6:\xf6\xcb/\xbf\x34\x7f\xd7\xfe\xcf\xe8Y\xd7^\xc0\x10\xa5k\xf7\x65\xf2\xc9\xd8\x7f/\xd0\x35\xe6\x64\xed\xb5\xd7i\x92\xeb\x36\x86yyn\xa8\xdf\xa7\x9f~\x9aq\xe3\xc7g\xd5\xef\xd4\xbf\xa7\xd1\xb7y\xf3\xef\x7fO\xb7n\xdd\xd2u\xa9\xa5\xe6\xeb\xfc\xa6|\xee\x9e|\xea\x99$\xc9\xf6\x3\xb6m\xf4k'MS\xfb\x8c\x19\x33r\xfb\x1dw\xd7i;p\xc8\xfe\x66\x88\x41\x33\xfbh\xf4'f\f\x1\0\0\0\xd0x\x16\xf5Y5,\xba\x96Zj\xa9,5\x9f\xa1N\x92\xf9\xe\x94\x16\x86\xa6\n\x84\x9aR\xabV\xadr\xd8\xf\xfi\xee\x32\x80z\x14\x37w\x1\0\0\0\0\0\0,\x1c\x82!\0\0\0\0\0\x80\x2!\x18\x2\0\0\0`6e\xa5\x65\xcd]B\x93(+[<\x1f\x17\0\xcc+\xc1\x10\0\0\0\0\xb3i\xd7\xbe}s\x97\xd0$\xda\xb5[<\x1f\x17\0\xcc\xab\xd2\xe6.\0\0\0\0\xa0P\xf5\xe9\xd9\xb5\xc5\x8e\xdb\xabW\xafL\x9a\x34)UU\x95\v\xa1\xa2\xd9}2\xf6\xdf\x8d~\xcd\x92\x92\xd2\xf4\xea\xd5\xab\xd1\xaf\xdb\x98\x9a\xebk\x82\x5\xb7(?w\x8br\xed@\xc3\x99\x31\x4\0\0\0\xc0l\xca\xcb\xcb\xb3\xca*\xab\x64\xc9%;/\xf2\xcb\xaf\x95\x95\x95\x65\xc9%;g\x95UVIyyys\x97\x3\0\xcd\xca\x8c!\0\0\0\0\xeaU^^\x9e\xe5\x97_\xbe\xb9\xcb\0\0\x1a\x91\x19\x43\0\0\0\0\0\0\x5\xc2\x8c!\0\0\0\x80$55Ieue\xaa*\xabRU]\x99\x9a\x9a\xa4\xa6\xa6\xa6\xb9\xcb\x2\0\x98\xa3\xa2\xa2\xa2\x14\x15%%\xc5\xa5))-Iiqi\x8a\x8a\xe6~\x8e`\b\0\0\0(x\x95U\x95\x99\x31\x63\x46\xaa\x5\x41\0\xc0\"\xa4\xa6\xa6&55IuuE**+R\\T\x94V\xadZ\xa5\xb4\x64\xce\xf1\x8f\xa5\xe4\0\0\0\x80\x82\x36\x63\xc6\x8cL\x9b>](\x4\0,\xf2\xaakj2m\xfa\xf4\xcc\x98\x31\x63\x8e}\x4\x43\0\0\0@\xc1\x9a\x31\x63\x46\x66VV4w\x19\0\0\x8djfe\xc5\x1c\xc3!\xc1\x10\0\0\0P\x90*\xab*\x85\x42\0\xc0\x62kfeE*\xab*gk\x17\f\x1\0\0\0\x5\xa7\xa6&s]b\x5\0`q0c\xc6\x8c|s\xb1\\\xc1\x10\0\0\0Pp*\xab+\xed)\x4\0,\xf6\xaakjf\x9b\x35$\x18\x2\0\0\0\nNUeUs\x97\0\0\xb0P|\xf3\xf7\x1e\xc1\x10\0\0\0Pp\xaa\xaag_o\x1f\0`q\xf4\xcd\xdf{\x4\x43\0\0\0@\xc1\xb1\x8a\x1c\0P(\xbe\xf9{\x8f`\b\0\0\0(85\x92!\0\xa0@|\xf3\xf7\x1e\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\xc0|\x9a }z\xee\xb9\xeb\xce\x8c\x1c\xf9t\xda\xb7\xef\x90\x81;\xed\x9c\x9dw\xd9\x35\x45\x45\x45s<\xe7\xd5W\xff\x96\xbb\xee\xb8=/\xbf\x34*+\xf4\xed\x9b=\xf6\xdc;\x3\xb6\xdf!\xc5\xc5>\xb7\v\0,<\x82!\0\0\0\x80\x6\xa8\xac\xac\xcc\xcfN>1S\xa6L\xce\xa1?\xfcQ&L\x98\x90s\xcf\x1e\x9a\xcf?\xff<\a\x1etp\xbd\xe7\xbc\xf9\xc6\x1b\xd9o\x9f\xbds\xccq'd\xb7\xdd\xf7\xc8;o\xbf\x9d\xd3O=%3f\xcc\xc8n\xbb\xefQ\xef\x39\xf6\x18\x2\0\x9a\x82`\b\0\0\0\xa0\x1^x\xe1\xaf\xf9\xe3\x1f~\x9f\xa7\x46>\x97\xce\x9d;'I:v\xec\x98SN:!;\xed\xbcK\xbat\xe9\x32\xdb\x39\xbf\xfd\xed\xc8l\xbc\xc9&\xf9\xe1\x61?J\x92l\xb2\xe9\x66\xa9\xa8\xac\xc8SO>1\xc7`H\x18\x4\0\x34\x5s\x95\x1\0\0\0\x1a\xe0\xc9'\x1e\xcf\xae\xbb\xed^\x1b\n%\xc9\xc6\x9bl\x9a\xaa\xaa\xea\x8cz\xf1\x85z\xcfi\xdb\xb6]\xc6\x8c\x19\x93i\xd3\xa6\xd5\xb6}\xf6\xe9\xa7Y\xb1_\xbf&\xaf\x17\0\xe0\xeb\x4\x43\0\0\0\0\r\xf0\xde;\xef\x64\x99\x65\x97\xab\xd3\xd6\xb6m\xdb\xf4_\xa9\x7f\xc6\x8e\x19S\xef\x39\xbb\xec\xbak\xda\xb4n\x93\xe3\x8e\x39*\xf=\xf8@.\xbc`X\xc6\x8e\x1d\x97\x3\xf:d!T\f\0\xf0\x15K\xc9\x1\0\0\0\xcc\xa3\x9a\x9a\x9a\xbc\xf5\xd6[\xd9k\xd0\xa0\xd9\x8eu\xed\xda-\x13>\x9fP\xefyK-\xd5\x35G\x1ds\\~|\xd8\xf\xf2\xfb\xdf=\x9f$\xb9\xeb\x9e\x11Yj\xa9\xa5\xe6\x38\xd6\xaa+\xd7?\x9b\xe8\xcd\xb7\xdfkx\xe1\0\0\xff#\x18\x2\0\0\0\x98GEEEY\xa1\xef\n\x99 \xff|B\xbav\xedZ\xefy\x8f<\xfcP\xae\xff\xe5\xb5\xb9\xe1\xa6[\xf2\xdd\xd5V\xcf_\xfe\xfc\xa7\x1cs\xd4\x91\xd9}\x8f=s\xf4\xb1\xc7\xa5\xa8\xa8h\xb6s\x4@\0@S\x10\f\x1\0\0\0\x34@\xff\xfe+\xe5\xc3\xf?\xac\xd3\x36\x63\xc6\x8c|\xf0\xfe\a\xe9\xde\xbd\xc7l\xfd+++s\xc1\xb0\xf3r\xea\xe9gd\x93M7K\x92\f\xd8~\x87\xb4o\xdf>?\xfc\xc1\xc1\xd9\x65\xd7\xdd\xb2\x42\xdf\xbe\v\xa5v\0\0{\f\x1\0\0\0\x34\xc0\xb6\xdb\r\xc8#\xf=\x94O\xc6\x8f\xafm{i\xd4\x8bI\x92\xf5\xd6\xdf\xa0\xb6m\xea\xd4\xa9If\x5\x43\xd3\xa6M\xcb\x94)S\xea\\\xa7[\xb7\xa5\x93$\x15\x95\x15M]2\0@-3\x86\0\0\0\0\x1a`\xb3\xcd\x36\xcf:\xeb\xae\x9b\x13O8.\a\x1etp\xa6N\x9d\x9a\x8b/\xbc \xc7\x9fxR:v\xec\x98$y\xe2\xf1\xc7r\xf2\x89\xc7\xe7\xee\xe1\xf7\x66\xb5\xd5W\xcfO\xe?<\x97\\|a***\xd2\xbf\x7f\xffL\x9b\x36=\xc3\xef\xb9+\xdb|o\xbb\xf4\xed\xbb\x62\xbd\xe3<\xf5\xe4\x13\xb5\xb7\al\xbf\xc3\x42yl\0\xc0\xe2O0\x4\0\0\0\xd0\0\xe5\xadZ\xe5\x8a+\xaf\xcem\xb7\xdd\x92\xab\xae\xbc<=z\xf4\xcc\xa9\xa7\x9fQ'\xbcYj\xa9\xaeYm\xf5\x35\xd2\xa1\x43\x87$\xc9\xf\xe=,\xcb-\xb7|\x1e~\xe8\xc1\xdc|\xe3\rY~\x85\x15\xf2\xbdm\xb7\xcbn\xbb\xef\x91\xd2\xd2\xfa\xdf\x9e\x11\x6\x1\0MA0\x4\0\0\0\xd0@\xed\xda\xb7\xcf\x11G\x1e\x9d#\x8e<\xba\xde\xe3\xeb\xad\xbf~\xee\x1e\xfe\xab\xda\xfb\xa5\xa5\xa5\x19\xb0\xfd\xe\xc2\x1e\0\xa0\xd9\xd9\x63\b\0\0\0\0\0\xa0@\x98\x31\x4\0\0\0\xd0\x2\xd9\x63\b\0h\n\x82!\0\0\0\x80\x16H\x18\x4\0\x34\x5K\xc9\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\xb0\x94\x1c\0\0\0@\vd\x8f!\0\xa0)\b\x86\0\0\0\0Z a\x10\0\xd0\x14,%\a\0\0\0\0\0P \x4\x43\0\0\0\0\0\0\x5\xc2Rr\0\0\0\0-\x90=\x86\0\x80\xa6 \x18\x2\0\0\0h\x81\x84\x41\0@S\xb0\x94\x1c\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\bK\xc9\x1\0\0\0\xb4@\xd7^}U\x9d\xfb?=\xe2\xc8\x66\xaa\x4\0X\x9c\b\x86\0\0\0\0Z A\x10\0\xd0\x14,%\a\0\0\0\0\0P \x4\x43\0\0\0\0\0\0\x5\xc2Rr\0\0\0\0-\xd0SO>Q{{\xc0\xf6;4c%\0\xc0\xe2\x44\x30\x4\0\0\0\xd0\x2\t\x83\0\x80\xa6`)9\0\0\0\0\0\x80\x2\x61\xc6\x10\0\0\0@\vd)9\0\xa0)\b\x86\0\0\0\0Z a\x10\0\xd0\x14,%\a\0\0\0\0\0P \x4\x43\0\0\0\0\0\0\x5\xc2Rr\0\0\0\0-\x90=\x86\0\x80\xa6 \x18\x2\0\0\0h\x81\x84\x41\0@S\xb0\x94\x1c\0\0\0\0\0@\x81\x10\f\x1\0\0\0\0\0\x14\bK\xc9\x1\0\0\0\x34\xd0\xf4\xe9\xd3s\xcf]wf\xe4\xc8\xa7\xd3\xbe}\x87\f\xdci\xe7\xec\xbc\xcb\xae)**\x9a\xeby\xbf{\xfe\xf9\x8c\x1c\xf9t\xfe\xfa\xe7?\xa7g\xaf^\xf9\xde\xb6\xdb\x65\xcf\xbd\xf6N\x9b\x36mf\xebk\x8f!\0\xa0)\b\x86\0\0\0\0\x1a\xa0\xb2\xb2\x32?;\xf9\xc4L\x99\x32\x39\x87\xfe\xf0G\x99\x30\x61\x42\xce={h>\xff\xfc\xf3\x1cx\xd0\xc1s<\xef\x97\xd7^\x93\xfb\xee\x1d\x91\x43\xf\xfbQ\xb6\xddv\xbbL\x9e<9/\xbf\xf4R\xca\xcb\xcb\xeb\xed/\f\x2\0\x9a\x82`\b\0\0\0\xa0\x1^x\xe1\xaf\xf9\xe3\x1f~\x9f\xa7\x46>\x97\xce\x9d;'I:v\xec\x98SN:!;\xed\xbcK\xbat\xe9\x32\xdb\x39o\xfd\xfd\xef\xb9\xfe\x97\xd7\xe6\xb1'\x9fJ\xaf^\xbdk\xdb\a\xee\xb4\xf3\x42\xab\x1b\0 \xb1\xc7\x10\0\0\0@\x83<\xf9\xc4\xe3\xd9u\xb7\xddkC\xa1$\xd9x\x93MSUU\x9dQ/\xbeP\xef\x39\xf>x\x7f\x6\xef\xbf\x7f\x9dP\b\0\xa0\x39\x98\x31\x4\0\0\0\xd0\0\xef\xbd\xf3Nv\x18\xb8S\x9d\xb6\xb6m\xdb\xa6\xffJ\xfd\x33v\xcc\x98z\xcf\xf9\xfb\x9bof\xa7\x9dw\xc9\xa3\xbfy$\xf7\x8e\x18\x9e\t\x9fO\xc8\xe;\f\xcc\x90\x83\xeN\xfb\xf6\xed\xeb=g\xd5\x95\xfb\xd5\xdb\xfe\xe6\xdb\xef-\xd8\x3\0\0\n\x9a`\b\0\0\0`\x1e\xd5\xd4\xd4\xe4\xad\xb7\xde\xca^\x83\x6\xcdv\xack\xd7n\x99\xf0\xf9\x84\xd9\xda\xab\xab\xab\xf3\xda\xab\x7f\xcb+/\xbf\x94\xbd\a\xed\x9b\x1f\xfc\xf0\xb0TWW\xe7\xba_^\x9b\x8f>\xfaw.\xb8\xe8\xe7)**\x9a\xed<\x1\x10\0\xd0\x14\x4\x43\0\0\0\0\xf3\xa8\xa8\xa8(+\xf4]!\x93'O\x9e\xed\xd8\xe7\x9fOH\xd7\xae]gk/..N\xc7N\x9d\x32\xe1\xb3\xcf\x32\xf4\xecsjC\xa0\xae\xdd\xba\x65\x9f\xbd\xf6\xc8\x11G\x1e\x9d\xde}\xfa\x34y\xed\0\0\x89`\b\0\0\0\xa0\x41\xfa\xf7_)\x1f~\xf8\x61\x9d\xb6\x19\x33\x66\xe4\x83\xf7?H\xf7\xee=\xea=g\xcd\x35\xd7J\xe7\xce]\xea\xcc\fZz\xe9\xeeI\x92\x89\x13'\n\x86\0\x80\x85\xa6\xb8\xb9\v\0\0\0\0X\x94l\xbb\xdd\x80<\xf2\xd0\x43\xf9\x64\xfc\xf8\xda\xb6\x97\x46\xbd\x98$Yo\xfd\r\x92\xccZ>n\xda\xb4i\xb5\xc7\xb7\x1b\xb0}\x9e\x7f\xee\xb7uf\x1a\xbd\xfd\xd6[I\x92\x1e={\xd6;\xceSO>Q\xfb\xf\0\xa0\xb1\x98\x31\x4\0\0\0\xd0\0\x9bm\xb6y\xd6Yw\xdd\x9cx\xc2q9\xf0\xa0\x83\x33u\xea\xd4\\|\xe1\x5\x39\xfe\xc4\x93\xd2\xb1\x63\xc7$\xc9\x85\xe7\x9f\x97gG>\x93\a\x1fy,\x1d:t\xc8\xd6\xdb|/w\xddyGN<\xfe\xd8\xec=h\x9f$\xc9\xf5\xd7]\x9b\x63\x8e;!]\xbat\xa9w\x9c\x1\xdb\xef\xb0\xd0\x1e\x13\0P8\x4\x43\0\0\0\0\rP\xde\xaaU\xae\xb8\xf2\xea\xdcv\xdb-\xb9\xea\xca\xcb\xd3\xa3G\xcf\x9cz\xfa\x19u\x82\x9c\x65\x96].+\xaf\xf2\x9d\x94\x97\x97'I\xda\xb6m\x9b\xebn\xb8)\xb7\xdc|c\xae\xb8\xec\xd2t\xed\xd6-\a|\xff\xc0\f\xdci\xe7\xe6z\x18\0@\x81*z\xe7\x83\xd1\x35}z\xce\xda\x18\xf1\xa3\xd1\x9f\xa4\xff\n\xf5\xaf\x85\v,z\xa6M\xafL2\xeb{\xfb\xcb\xef\xf3\x39\xf9z\x1f\xaf\x5\0\0\xc0\xa2\xe0\xdd\xf\xc7\xd4\xf9;\xa6!\x7f\xf7L\xfe\xef\x94&\xafoA\xac\xbar\xbf\xbc\xf9\xf6{\xcd]\x6\0\xb0\x98h\xdf\xb6]\x92Y\xbf\xf\x99\x31\x4\0\0\0\xd0\x2}}o!\xcb\xca\x1\0\x8d\x45\x30\x4\0\0\0\xd0\x2\t\x83\0\x80\xa6P\xdc\xdc\x5\0\0\0\0\0\0\xb0p\b\x86\0\0\0\0\0\0\n\x84\xa5\xe4\0\0\0\0Z {\f\x1\0MA0\x4\0\0\0\xd0\x2\t\x83\0\x80\xa6`)9\0\0\0\0\0\x80\x2!\x18\x2\0\0\0\0\0(\x10\x96\x92\x3\0\0\0h\x81\xec\x31\x4\0\x34\x5\xc1\x10\0\0\0@\v$\f\x2\0\x9a\x82\xa5\xe4\0\0\0\0\0\0\n\x84`\b\0\0\0\0\0\xa0@XJ\xe\0\0\0\xa0\x5\xba\xf6\xea\xab\xea\xdc\xff\xe9\x11G6S%\0\xc0\xe2\x44\x30\x4\0\0\0\xd0\x2\t\x82\0\x80\xa6`)9\0\0\0\0\0\x80\x2!\x18\x2\0\0\0\0\0(\x10\x96\x92\x3\0\0\0h\x81\x9ez\xf2\x89\xda\xdb\x3\xb6\xdf\xa1\x19+\x1\0\x16'\x82!\0\0\0\x80\x16H\x18\x4\0\x34\x5K\xc9\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0@\x81\xb0\x94\x1c\0\0\0@\vd\x8f!\0\xa0)\b\x86\0\0\0\0Z a\x10\0\xd0\x14,%\a\0\0\0\0\0P \x4\x43\0\0\0\0\0\0\x5\xc2Rr\0\0\0\0-\x90=\x86\0\x80\xa6 \x18\x2\0\0\0h\x81\x84\x41\0@S\xb0\x94\x1c\0\0\0\0\0@\x81\x30\x63\b\0\0\0\xa0\x81\xc6\x8d\x1b\x9b\xdbo\xbd\x35\x7f\xfc\xc3\xef\xf3\x9dUW\xcd\xa0}\x6g\xedu\xd6\x99\xa7s+++s\xf4\x91\x87\xa7\xba\xba:\xbf\xbc\xfe\xc6&\xae\x14\0\xa0.3\x86\0\0\0\0\x1a`\xfc\xf8\xf1\xf9\xc1\xc1\af\xfa\xf4\xe9\x39\xe1\xa4\x93\xd3\xabw\xef\x1c\x34\x64\xff\xbc\x34\xea\xc5y:\xff\xde_\x8d\xc8\xf3\xcf\xfd\xf6[\xfb=\xf5\xe4\x13\xb5\xff\0\0\x1a\x8b\x19\x43\0\0\0\0\r\xf0\xe0\x3\xf7\x65\x99\x65\x96\xcdig\x9c\x99\x92\x92\x92l\xbe\xc5\x96\x99\x31}F\xae\xbd\xe6\xea\xdct\xcbm)**\x9a\xe3\xb9o\xbf\xf5V\xae\xb9\xfa\xca\xec\xb2\xebn\x99\x38q\xe2\\\xc7\xb1\xc7\x10\0\xd0\x14\xcc\x18\x2\0\0\0\x98G\x95\x95\x95\xb9\xe5\xa6\x9b\xb2\xd3\xce\xbb\xa4\xa4\xa4\xa4\xb6}\xbb\x1\xdb\xe7/\x7f\xfeS\xfe\xfd\xaf\x7f\xcd\xf1\xdc\xff\xfe\xf7\xbf\x19z\xe6\xe9\x39s\xe8\xd9Yy\xe5U\x16\x46\xb9\0\0\xb3\x11\f\x1\0\0\0\xcc\xa3\x89\x13?\xcf\x94)\x93\xd3\xbd{\x8f:\xed=z\xcc\xba\xff\xe9\xa7\x9f\xcc\xf1\xdc\x1b\xae\xff\x65\xfa\xf5\xef\x9f\xed\x6l\xdf\xa4\x35\x2\0\xcc\x8d\xa5\xe4\0\0\0\0\xe6\xd1\x97\xcb\xbf\xb5i\xd3\xa6N\xfb\x12m\x97H\x92L\x9a\x34\xa9\xde\xf3\xfe\xf4\xa7\xff\xcb\xa3\x8f<\x9c{\xef\x7fp\xaeK\xcd}\xdd\xaa+\xf7\xab\xb7\xfd\xcd\xb7\xdf\x9b\xd7r\x1\0\x66#\x18\x2\0\0\0\x98G\xed\xdb\xb7O\x92\xfcw\xea\x7f\xeb\xb4O\x9b\x36=I\xd2i\xc9%g;\xe7\xb3\xcf>\xcd\x99\xa7\x9f\x9as\xce;?]\xba,\x95$\xa9I\xcd\xb7\x8e%\0\x2\0\x9a\x82`\b\0\0\0`\x1e-\xb9\x64\xe7\x94\x94\x94\x64\xf4\xc7\x1f'\xeb\xaeW\xdb\xfe\xc9'\xe3\x93$]\x97\xea:\xdb\x39\x37\xdfxc\xc6\x8c\x1e\x9d\xc3\xe=d\xb6\x63\xab\xae\xdc/\xdf?\xf0\xa0\x9c\xf2\xb3\xd3\x9a\xaeh\0\x80\xaf\x11\f\x1\0\0\0\xcc\xa3\xf2\xf2\xf2\x1cx\xf0!\xf9\xcd#\xf\x65\x87\x1d\a\xa6\xac\xac,I\xf2\xbb\xe7\x9f\xcb\x96[m\x9d^\xbd{'If\xcc\x98\x91\xd2\xd2\xd2\x94\x94\x94\x64\xef\x41\xfb\x64\xa7\x9dw\xaes\x9d\xb3\x86\x9e\x91\x37\xdfx#\xbf\xbe\xff\xc1\xb4\xfb\xdf,$\0\x80\x85\x41\x30\x4\0\xd3\xe9\xc3<\0\0\x15\xb8IDAT\0\0\xd0\0\x83\xf6\xd9\x37\x43\xf6\xdf/\xe7\x9dsv\xb6\x1b\x30 \xef\xbe\xfbnn\xbc\xfe\xba\xdcz\xc7])**\xca\xf4\xe9\xd3\xb3\xcf\xde{\xa4_\xbf\xfe\xb9\xe4\xd2\xcb\xb3\xfc\n+\xccv\x8d\x1dv\xdc)]\xba,\x95\xef\xac\xfa\xdd\x39\x8e\xf3\xd4\x93O\xd4\xde\x1e\xb0\xfd\xeM\xf2X\0\x80\xc2#\x18\x2\0\0\0h\x80>}\x96\xc9mw\xde\x9d;n\xbb\x35\xe7\x9d{v\xd6^g\xdd\xdcq\xd7\xf0\xac\xfa\xddY!OYYYVZi\xe5,\xbf\x42\xdf\x5\x1aG\x18\x4\0\x34\x5\xc1\x10\0\0\0@\x3-\xbb\xec\xb2\x39\x63\xe8Y\xf5\x1e+))\xc9\xc5\x97\\:\xd7\xf3\xf>\xe4\a9\xf8\x90\x1f\x34\x41\x65\0\0sW\xdc\xdc\x5\0\0\0\0\0\0\xb0p\x98\x31\x4\0\0\0\xd0\x2\xd9\x63\b\0h\n\x82!\0\0\0\x80\x16H\x18\x4\0\x34\x5K\xc9\x1\0\0\0\0\0\x14\b\xc1\x10\0\0\0\0\0\xff\xdf\xde\x9d\x87yY\xd6\xfb\x3\x7f\xcf>\xc3\xc0 \n\xa8lV\x8a\xa0`\x9d\xa3\x1dsI\xc1\rP[\x14\n5=\xa8h\xb4\x97\x95\v\xe9\xb1SnY\xf6\xeb\x64\x9a?O. \xda\x31[\xd4\x34wQK\xeb\x94hi\xd9\xa9LK\x8f\t\xc8\xa2\f\xdb\f\xcc\x30s\xfe &F\x6\x10\xe4;3\xf0}\xbd\xaek\xaek\xbe\xf7\xf7\xbe\x9f\xf9<\xd7=\xf3\\\xcf\x33\x9f\xef\xfd\xb9\x81\"\xa1\x94\x1c\0\0\0@7d\x8f!\0\xa0\x10$\x86\0\0\0\0\xba!\xc9 \0\xa0\x10\x94\x92\x3\0\0\0\0\0(\x12V\f\x1\0\0\0tCJ\xc9\x1\0\x85 1\x4\0\0\0\xd0\rI\x6\x1\0\x85\xa0\x94\x1c\0\0\0\0\0@\x91\x90\x18\x2\0\0\0\0\0(\x12J\xc9\x1\0\0\0tCW]yE\xbb\xd7\x1f\xff\xe4\xa7\xba(\x12\0`[\"1\x4\0\0\0\xd0\rI\x4\x1\0\x85\xa0\x94\x1c\0\0\0\0\0@\x91\x90\x18\x2\0\0\0\0\0(\x12J\xc9\x1\0\0\0tC\xf7\xdd{O\xdb\xf7\x63\xc7\x1d\xd9\x85\x91\0\0\xdb\x12\x89!\0\0\0\x80nH2\b\0(\x4\xa5\xe4\0\0\0\0\0\0\x8a\x84\xc4\x10\0\0\0\0\0@\x91PJ\xe\0\0\0\xa0\x1b\xb2\xc7\x10\0P\b\x12\x43\0\0\0\0\xdd\x90\x64\x10\0P\bJ\xc9\x1\0\0\0\0\0\x14\t\x89!\0\0\0\0\0\x80\"\xa1\x94\x1c\0\0\0@7d\x8f!\0\xa0\x10$\x86\0\0\0\0\xba!\xc9 \0\xa0\x10\x94\x92\x3\0\0\0\0\0(\x12V\f\x1\0\0\0l\x86W^\x99\x9b\x1b\xa6M\xcb\x63\x8f\xfe,{\x8e\x18\x91\x89\xc7\x9d\x90\xbd\xf7\xd9\xa7\xc3\xbe\xad\xad\xady\xec\xd1Gs\xff\xfd\xf7\x66\xd6\xaf~\x99\x81\x83\x6\xe7\xd8\xf1\x13r\xe4QG\xa7\xac\xac\xac\x93#\a\0\x8a\x99\x15\x43\0\0\0\0\x9bh\xde\xbcy9\xed\xd4\x93\xd3\xd8\xd8\x98\x33\xcf>'\x3\a\r\xca)\x93N\xcc\x93O\xcc\xea\xb0\xff\xfd\xf7\xdd\x9b\xaf^zqF\x8e\xdc+g\x9d\xf3\x85\f\x1b\x36<\xe7\x9c\xf5\xf9\xfc\xf8\xf6\xdb\xd6\xfb\x33\xee\xbb\xf7\x9e\xb6/\0\x80-\xc5\x8a!\0\0\0\x80Mt\xdb\xad?\xcc\x90!\xbb\xe4\xbc\xf3\xbf\x98\xb2\xb2\xb2\x1c }\xb6OYYYf\xbf\xfcr\xbb\xf6\xf9\xf3\xe7%I\xfa\xf5\xed\xb7\xde\xb1\xf5\xf5\xf5\x39\xfb\xcc\xcf\xe5\x98\xf1\x13\x32\xee\xc8\xa3\n\x1a'\0@G$\x86\0\0\0\0\x36\x41\x65\x65\x65N>ur\xee\xbc\xe3\xf6\x34\x35\x35\xb5\xb5\xff\xf4\x91\x87\x33\xfa\x90\x43\x33p\xd0\xa0$IKKK\x1a\x1a\x1a\xda\xde\xaf\xaf\xaf\xcfY\x9f\xffl\xde\xb9\xef\xbe\x99\xf2\x91\x8fuz\xdc\0\0\x89Rr\0\0\0\0\x9bl\xe2q\xc7g\xd2\x89\x1f\xca\x45\x17|9c\xc6\x8e\xcd\xb3\xcf>\x9bk\xfe\xf3\xeaL\x9bqSJJJ\x92$\x97^rQf>\xf8@n\xbb\xe3\xae\xb4\xb6\xb6\x66\xca\xe9\x93\xf3\xcc\xef~\x9b\xfO\xf9h\x9e\xfa\xcdo\xda\x8e\x35\x64\x97!\xe9\xdb\xc1*\xa3\xfb\xee\xbd\xa7\xed\xfb\xb1\xe3\x8e,\xfcI\x1\0\x45\x41\x62\b\0\0\0`\x13\r\x1e<$\xd3o\xfcnfL\x9f\x96\x8b.\xfcr\xf6\xde\xe7\x9d\x99q\xd3\xcd\x19\x31rd[\x9f!\xbb\xbc%\xc3\xf7\xd8\x33\x95\x95\x95y\xec\xd1\x9f\xe5\x99\xdf\xfd\x36Ir\xca\xa4\x13\xdb\x1d\xeb\xaa\xab\xaf\xc9\xa8\xd1\xa3\xd7\xf9\x19\x92\x41\0@!H\f\x1\0\0\0l\x86]v\xd9%\xe7\xff\xfb\x97\xd6\xfb\xfeI\xff:)'\xfd\xeb\xa4$\xc9\xe1G\x8c\xc9\xef\xff\xf8\xe7N\x8a\f\0`\xfd\xec\x31\x4\0\0\0\0\0P$\xac\x18\x2\0\0\0\xe8\x86\xec\x31\x4\0\x14\x82\xc4\x10\0\0\0@7$\x19\x4\0\x14\x82Rr\0\0\0\0\0\0\x45\x42\x62\b\0\0\0\0\0\xa0H(%\a\0\0\0\xd0\r\xd9\x63\b\0(\x4\x89!\0\0\0\x80nH2\b\0(\x4\xa5\xe4\0\0\0\0\0\0\x8a\x84\xc4\x10\0\0\0\0\0@\x91PJ\xe\0\0\0\xa0\x1b\xb2\xc7\x10\0P\b\x12\x43\0\0\0\0\xdd\x90\x64\x10\0P\bJ\xc9\x1\0\0\0\0\0\x14\t\x89!\0\0\0\0\0\x80\"\xa1\x94\x1c\0\0\0@7t\xd5\x95W\xb4{\xfd\xf1O~\xaa\x8b\"\x1\0\xb6%\x12\x43\0\0\0\0\xdd\x90\x44\x10\0P\bJ\xc9\x1\0\0\0\0\0\x14\t\x89!\0\0\0\0\0\x80\"\xa1\x94\x1c\0\0\0@7t\xdf\xbd\xf7\xb4}?v\xdc\x91]\x18\t\0\xb0-\x91\x18\x2\0\0\0\xe8\x86$\x83\0\x80\x42PJ\xe\0\0\0\0\0\xa0HH\f\x1\0\0\0\0\0\x14\t\xa5\xe4\0\0\0\0\xba!{\f\x1\0\x85 1\x4\0\0\0\xd0\rI\x6\x1\0\x85\xa0\x94\x1c\0\0\0\0\0@\x91\x90\x18\x2\0\0\0\0\0(\x12J\xc9\x1\0\0\0tC\xf6\x18\x2\0\nAb\b\0\0\0\xa0\x1b\x92\f\x2\0\nA)9\0\0\0\0\0\x80\"!1\x4\0\0\0\xd0\t\x9e~\xfa\xa9\x9cw\xee\xd4\x1c=nL.\xb9\xf8\xc2\xcc\x99={\x83\xfdG\f\x1f\xdaI\x91\xb1\xb9\xcc\xd1\xd6\xc1:\xe5\xf4TT\x94g\x8f=Fd\xe6\x83\xf\x64\xe1\xc2\x85\x39\xea\xe8\xf7vux\0@\x91\xb1\x62\b\0\0\0\xa0\xc0\xe:xT\xae\x9bvC\xfe\xf8\x87?\xe4+\x97\\\x98\x9a\x9a\x9a\\s\xdd\xb4l\xbf\xfd\xf6]\x1d\x1a\0Pd\xac\x18\x2\0\0\0\xe8\x4\xfb\xed\x7f@\xf6\xdb\xff\x80\xae\xe\x83M\xf0\xca+ss\xc3\xb4iy\xec\xd1\x9f\x65\xcf\x11#2\xf1\xb8\x13\xb2\xf7>\xfbt\xd8\xb7\xb5\xb5\x35\x8f=\xfah\xee\xbf\xff\xde\xcc\xfa\xd5/3p\xd0\xe0\x1c;~B\x8e<\xea\xe8\x94\x95\x95ur\xe4\xc5\x63S\xe6\xa8#\xd7]\xfb\x9d|\xe3\xeb\x97\xe5W\xb3~\x9d\x9e\xbdz\x15\x30\xd2\xe2\xf6\xf4\xd3O\xe5\xfb\xb7|/O\xfd\xfa\xd7\x39\xf0\xa0\x83r\xea\xa9\xa7\x65\xe7\x1\x3\x36\x38\xe6\xd5W_\xcd-7\xffWf\xcdz<\xb3_\xfe[\xf6\xddo\xffL\x9cx|F\xee\xb5W'E]\\Z[[s\xcf=w\xe7\xee\x9f\xdc\x99W\xe6\xce\xcd\xe1\x63\xc6\x64\xd2\xc9\xa7\xa6\xa6\xa6\x66\xbd\x63\x66\xcf~93n\x98\x9eG\x7f\xfa\xd3\xd4\xd5\xd5\x65\xcc\xb8#3\xf1\xb8\xe3:\xdc;\x8f\xee\xc5\x8a!\0\0\0\0x\x9dy\xf3\xe6\xe5\xb4SONccc\xce<\xfb\x9c\f\x1c\x34(\xa7L:1O>1\xab\xc3\xfe\xf7\xdfwo\xbez\xe9\xc5\x19\x39r\xaf\x9cu\xce\x17\x32l\xd8\xf0\x9cs\xd6\xe7\xf3\xe3\xdbo\xeb\xe4\xc8\x8b\xc7\xa6\xce\xd1\xeb=\xfd\xf4S\xf9\xc6\xd7/+p\x94<\xf9\xc4\xac\x9c|\xd2\x89\xd9u\xd7\xddr\xf6\xd4sS\xbfhQ&\x9f:)\xf3\xe6\xcd[\xef\x98\x17_|1\x93N:!\xb3\xe7\xcc\xce\xc4\xe3\x8e\xcf\x17\xce;?C\x86\f\xc9k\xaf\xbd\xd6\x89\x91\x17\x97\x1bg\xdc\x90\xcb.\xfdJ\xc6\x8e;2\x1f\xfe\xc8G\xf3\xd0\xcc\x99\x39\xe7\xac\x33\xb3j\xd5\xaa\xe\xfb\xd7\xd7/\xca\x94\xd3'\xa7\xb1\xa1\x31S\xcf=/\x13>81?\xbe\xfd\xb6|\xe5\x92\x8b;9r6\x87\x15\x43\0\0\0\0\xf0:\xb7\xdd\xfa\xc3\f\x19\xb2K\xce;\xff\x8b)++\xcb\xc1\xa3\x46gE\xe3\x8a\\\xf5\xed+s\xed\xf5\xd3SRR\xd2\xae\xff\xfe\a\x1c\x98\x83\xe\x1e\x95\x1e=z$I\xe;\xfc\x88TTV\xe4\x96\xef\xdd\x9c\xf1\x13>\xd0\x15\xa7\xb0\xcd\xdb\xd4\x39Z\xdb\xe2\xc5\x8b\xf3\xc5\x7f;7\x1f\xf8\xe0q\xf9\xe1\xfn\xe9\xc4\xa8\x8bKKKK\xae\xf8\xd6\xe5\xf9\xf4g\xce\xc8\xe4\xd3NO\x92\xbck\xbf\xfdr\xea\xa4\x93r\xe7\x1d\xb7\xe7\xb4\xd3\xa7t8\xee\xea\xab\xae\xcc\x98\x31\xe3\xf2\xa9\xcf\x9c\xd1\x36\x8f\xa3\x46\x1f\xd2iq\x17\x9b\x5\v\xe6\xe7\x1b_\xbf,\xdf\xb9\xee\xfa\xec\xbb\xef\xbb\x92${\xec\xb9g\xc6\x1dqX\x9e|bV\xf6}\xd7~\xeb\x8cy\xfa\xa9\xa7\xf2\xd7\xbf\xfc%\xdf\xbd\xf9\xfb\xe9\xdd\xbbw\x92\x64\xc0\xc0\x81\xf9\xf0\xe4S2u\xea\xb9V\xe0usV\f\x1\0\0\0\xc0Z\x9a\x9b\x9bs\xfd\xb5\xd7\xe6=\xef}_\xbb\x32pc\xc6\x8e\xcb/\xff\xfb\x17\xf9\xdf\x17_\\gL]]][Rh\x8d\xfe\xfdw\xcc\xb2\x65K\v\x1eo1\xda\x9c\x39Z\xa3\xb5\xb5\x35W^qy\xf6?\xe0\xc0\xbc\xf7\xfd\xef\xef\x8cp\x8b\xd6\xf3\xcf=\x97Y\x8f\xff*\x87\x1czX[[uuu\xdew\xcc\x31\x99\x31}zZ[[\xd7\x19\xf3\xc2\v\x7f\xcd\x1d?\xbe=\xc7\x8c\x1f\xbf\xc1\xe4\x1e[\xce/~\xfe\xf3\xec\xb0\xc3\xf6\xd9{\xef\x7f\x94\x61\x1c \xd8\xe1\x98\x9a\x9a\xd5\xd7\xbb\x5\xf3\xe7\xb7\xb5\xd5/Z\x94\xdd\x86\xeM\x8f\xda\xda\xc2\x6\xcc\x9b&1\x4\0\0\0\0kY\xb4\xe8\xb5,]\xba$;\xed\xb4s\xbb\xf6\x9dw^\xfdz\xc1\x82\xf9\x1d\r[\xc7\x93O\xcc\xca\xa1\x87\x1d\xbe\xc5\xe3\xe3\xcd\xcd\xd1#\xf?\x94_\xfe\xe2\x17\xf9\xf8'>\x15i\x87\xc2ZS.\xae_\xbf~\xed\xda\a\xf\x1e\x92\x5\v\xe6g\xc9\x92%\xeb\x8c\x99\x33{N\x92\xa4\xb9\xa9\x39\x17]\xf0\xa5\x1c~\xe8\xa8|\xe2\x63\x1f\xc9\xac\xc7\x1f/|\xc0\x45\xea\xe5\x97_\xce\xee\xc3\x86\xa7\xbc\xbc}\x81\xb1\x61\xbb\xf\xcb\v\x7f\xfdk\x87\x63\xfey\xef\xbds\xec\x84\xf\xe4\xd3\x9f\xfcx~\xf4\xc3\xef\xe7;W\xff\xff\xdc\x38\x63z\xber\xe9\xd7RZ*\xed\xd0\xdd\x99!\0\0\0\0X\xcb\xa2\x45\x8b\x92\x64\x9dM\xd7{\xd4\xae\xfe\x84\xfc\xe2\xc5\x8b\x37z\x8cY\x8f?\x9e\x87\x66\xce\xcc\xf1'|h\xcb\a\xc8\x66\xcf\xd1\xdc\xb9s\xf3\xc5\xf3\xcf\xcb\x97.\xb8(uuu\x85\r\x92\xbc\xfa\xea\xc2$IUuu\xbb\xf6\xda\x9e=\x93$K\x97\xae\x9b\x18\x9a?\x7fu2\xe9\xc2\v\xbe\x94]w\xdb-\x97\\\xfa\xb5\x8c\xdc\xeb\xed\x39\x65\xd2\x89\xf9\xfd\x33\xcf\x14\x38\xe2\xe2\xf4\xca\xdc\xb9m\xe5\xe0\xd6V\xd7\xbb.\x7f{\xe9\xa5\xe\xc7\x94\x97\x97\xe7\xf4\xd3\xa7\xe4\x85\x17\xfe\x9a/\xfe\xdby\xb9\xfc\x9b\xdf\xc8\x84\xfL\xcc\xee\xc3\x86\x17:\\\xb6\x80v)\xc0\xca\xca\x8a\xacX\xd1\x94\xaa\xaa\x8a\xae\x8a\a\0\0\0\0\xbaT\xaf\xbf\xef\x8d\xb1l\xf9\xb2v\xed\r\r\x8dI\x92\xed\xfa\xf4\xd9\xe0\xf8\xb9s\xe6\xe4\xfc\xf3\xa6\xe6\xd2\xaf]\x96\x1\x3\x6\x16&\xc8\"\xb7\x39s\xb4j\xd5\xaa|\xf5+\x17\xe7\x43\x1f:){\xef\xb3\xba\x64\xd6\xba\x85\xcc\xd8\x92\xd6$\x1b\x1a\x1a\x1aRQ\xf1\x8f\xff\x39\x37,_\xde\xee\xfd\xb5\xd5\xfe\xbd\f\xd9Yg\x9f\x93=G\x8cL\x92\xec\xbb\xef\xbb\xf2\xfcs\x7f\xce=w\xdf\x95\x11#G\x16:\xec\xa2\xb3\x43\xdf\x1d\xf2\xbb\xdf\xfev\x9d\xf6\xa5K\x97\xe6-o}k\x87\x63\xfe\xf4\xa7?\xe6\xa4\x13\x8e\xcb\x45\x97\\\x9a\xd1\x87\x1c\x9a\xe7\x9f\xfbs\xae\xf8\xd6\x37s\xdf\xbd\xf7\xe4?.\xffVjk{\x16:l\xde\x84v+\x86j\xaa*S\xbf\x64yW\xc5\x2\0\0\0\0]\xaeO\x9f\xedSVV\x96\xd9/\xbf\xdc\xae}\xcdJ\x86~}\xfbu4,IR__\x9f\xb3\xcf\xfc\\\x8e\x19?!\xe3\x8e<\xaa\xa0q\x16\xb3\xcd\x99\xa3\x87\x66>\x98\xfb\xef\xbb\x37W^qyF\f\x1f\x9a\x11\xc3\x87\xe6\xe4\x93V\xaf\xe8z\xd7\xbf\xec\x9d\x83\xe\xdc\xaf\xf0\x81\x17\x99~\xfd\xfa'Y\xbd\"ems\xe6\xcc\xc9\xc0\x81\x83:L\x1e\xf4\xed\xdb\x37I\xd2g\xfb\x1d\xda\xb5\xef\xba\xebn\x99\x33gv\x81\"-n\x3\x6\f\xc8\x1f\xfe\xf0?Y\xb9re\xbb\xf6\x17_x!o}\xeb\xdb:\x1c\xf3\xdd\x9bn\xcc\xd1\xefy_\x8e\x1d?!}\xfa\xf4\xc9;\xff\x65\xdf\xfc\xbf\xff\xb8\x7f\xec\xd1<\xf2\xf0\xc3\x9d\x11\x36oB\xbb\xc4P]\xaf\x1e\xa9_\xdc\x90\x85\xaf-N\xf3\xaaU]\x15\x13\0\0\0\0t\x99\xca\xca\xca\x9c|\xea\xe4\xdcy\xc7\xedijjjk\xff\xe9#\xfg\xf4!\x87\x66\xe0\xa0\x41I\x92\x96\x96\x96\x34\x34\x34\xb4\xbd___\x9f\xb3>\xff\xd9\xbcs\xdf}3\xe5#\x1f\xeb\xf4\xb8\x8b\xc9\xe6\xcc\xd1;\xde\xf1O\xf9\xc1\x8fnk\xf7\xf5\x89O~:Ir\xcd\xf5\xd3\xf3\x9dk\xae\xef\xfc\x13\xd9\xc6\r\xdd}\xf7\f\xdf\x63\xcf<\xf8\xe0\x3mm\xcd\xcd\xcd\xb9\xfb\xae\x9f\x64\xd2)\xa7\xb4\xb5\xadX\xb1\"\xab\xfe\xfe\xff\xe8\x61\xc3\xf7\xc8\xe0\xc1\x83\xf3\xb3\x9f>\xd2\xf6~kkk\x1ey\xe4\xe1\f\x1f\xbeGg\x85^T\xf6\xdb\xff\x80\xbc\xbapa\xbb}\x9c\xe6\xcf\x9f\x9f\xbb~rg\xe;\xe2\x88\xb6\xb6\xe5\xcb\xff\xb1\xa8\xa4\xb1\xa1!K\x96,Nk\xeb?\xd6\xddm\xb7]\x9f\xd4\xd5\xf5^'\xc1\x44\xf7S\xfe\xfa\x86\x41\x3\xfa\x66YCc^|iaV\xb5H\xe\xc1\xd6l\xf0\x80\xf5\x7f\x82\t\0\0\0X\xbf\x89\xc7\x1d\x9fI'~(\x17]\xf0\xe5\x8c\x19;6\xcf>\xfbl\xae\xf9\xcf\xab\x33m\xc6M)))I\x92\\z\xc9\x45\x99\xf9\xe0\x3\xb9\xed\x8e\xbb\xd2\xda\xda\x9a)\xa7O\xce\x33\xbf\xfbm><\xe5\xa3y\xea\x37\xbfi;\xd6\x90]\x86\xa4\xef\x6V\x19\xb1y6u\x8e\xfa\xef\xb8\x63\xfa\xef\xb8\x63\xbb\x63,_\xbe<\xdf\xbe\x32y\xfb^oO\xcf\xbf\x97\xa7\x63\xcb)//\xcf\x19\x9f\xfd\\>:\xe5\xf4TT\x94g\x8f=Fd\xe6\x83\xf\x64\xe1\xc2\x85\x39\xea\xe8\xf7&I\x1a\x1b\x1bs\xdc\a\xc7g\xe8\xd0\xdd\xf3\xf5o|3\xd5\xd5\xd5\xf9\xf4g?\x9f\xb3>wF\x1a\x1b\x1a\x32t\xd8\xb0<\xf5\xeb_\xe7o\x7f{)\xef?v|\x17\x9f\xd1\xb6i\xe0\xc0\x41\xf9\xd8'>\x99\xa9\xe7\x9c\x99\xb3\xce\x9e\x9a\xba\xba\xba\xcc\xb8\x61z\x8e:\xfa=y\xc7;\xfe)I\xf2\xfc\xf3\xcf\x65\xe2\x84\x63s\xf6\xd4ss\xdc\xf1'\xe4\x98\xf1\x13\xf2\xe1\xc9\xa7\xa4_\xff\xfey\xf7\xbb\xfJiii\x1e~hfz\xf5\xea\x95\x3\xdf}P\x17\x9f\x11\x1b\xb3Nb(Ijk\xaaS[S\xdd\xd1[\0\0\0\0[\xbd\x92\x92\x92v\x9fr\x86\xd7\x1b -\x17]\xf8\xe5\xec\xbd\xcf;3\xe3\xa6\x9b\xdb\xedo2d\x97\xb7\x64\xf8\x1e{\xa6\xb2\xb2\x32\x8f=\xfa\xb3<\xf3\xbb\xd5{t\x9c\x32\xe9\xc4v\xc7\xba\xea\xeak2j\xf4\xe8\xce\f\xbf(l\xea\x1c\xd1\x35\xe:xT\xae\x9bvC~\xf8\x83\xef\xe7\xf6\xdbn\xcd\xa8Q\x87\xe4\x9a\xeb\xa6\x65\xfb\xed\xb7O\x92TTTd\xd8\xb0\xe1y\xeb\xdbvm\x1bs\xd4QG\xa7\xa6\xba:\xb7\xddzkn\xfe\xaf\x9br\xe0\xbb\xf\xce-\xdf\xffQ\xfa\xf7\xef\xdfU\xa7\xb1\xcd\xfb\xf8'>\x95\x9dv\xda\x39\xb7\xdfvk\x1a\x1b\x1br\xc4\x98q9\xf1\xc4\x93RZ\xba\xba\xe8Xmm\xcf\x8c\x18\x31\x32;\xed\xb4s\x92\xe4\x80\x3\xe\xccM7\xdf\x92\x1f\xdc\xf2\xbd\\\xf0\xa5\x7fO\xef\xde\xbd\xb3\xff\x81\af\xfa\x8d\x37\x99\xa7nhM\xb2\xbc\xed\xf5\x9f\x9e\x9f\xddjU\x1l\xdb^\x9a=\x7f\xa3\xab\x87\xd6\xee\xf3\xd2\xec\xf9\xd9\xfdm;wFh\0\0\0\x9b\xed\xd9\xbf\xcci\xf7\x1c\xb3)\xcf=\xcb\x1a\x96\xa5\xa5\x45\x62\b\0\xd8\xf6\x95\x96\x96\xa4\xb6\xa6\x36\xc9\xea\xfb\xa1\xeW\f\xad\xd1\xda\xda\x9a\xfa%\xcb\xb2|\xf9\x8a\xacji\xe9\x94\0\x81\xa4\xac\xb4\x34=zT\xa5w\xaf\xdau\xb2\xb9\0\0\0\xbcye\xa5\xe5iii\xdaxG\0\x80\xad\\Yi\xfbTP\xe9\x86:\xd7/Y\x96%K\x1b$\x85\xa0\x93\xadji\xc9\x92\xa5\r\xa9_\xb2\xac\xab\x43\x1\0\0\xd8&\x95\x95\x97uu\b\0\0\x9d\xe2\xf5\xf7=\x1bL\f-_\xbe\xa2\xa0\xc1\0\x1b\xe6o\x10\0\0\xa0\x30\xcaK\xcbS\xaa\x42\x3\0\xb0\x8d+-)Iy\xd9&\xac\x18\x2\0\0\0\xd8\x16\x95\x94$UUU]\x1d\x6\0@AUUU\xe5\xf5\x1f\x85\xd9`b\xa8G\xf\x37H\xd0\x95\xba\xeao\xb0\xb2\xb2\"+V\xa8\xb5\r\0\0t_\x8d+\x9aRUY\xf1\xa6\x8eQ^V\x9e\xca\xf2\x37w\f\0\x80\xee\xaa\xb2\xbc\x62\x9d\xd5\x42IRZQQ\x9e\xa6\xa6\xe6\xe\a\xf5\xeeU\x9b^=kRVja\x11t\xa6\xb2\xd2\xd2\xf4\xeaY\x93\xde\xbdj\xdf\xf4\xb1V65\xa7\xb2\x62\xdd?\xfe\xd7[\xfbZPSU\x99\xfa%\xcb\xdf\xf4\xcf\x6\0\0(\x94\x15+\x9aRU\xbd:\xa9\xb3\x39\xcf=kTUUI\xe\x1\0\xdb\x9c\xca\xf2\x8auVG\xaf\xb9g*\xaf\xac(\xcf\xca\xa6\xe6Ttp\x3URR\x92\xed\xeazf\xbb\xba\x9e\x9d\x15+\xb0\x85\x35\xadlNE\xe5\xc6\x1f\x90\xd6\xbe\x16\xd4\xf5\xea\x91\xbf\xcd^\x90\xb2\xb2\x92\xf4\xae\xabMy\x99MY\x1\0\x80\xee\xa1qESV\xacl\xca+\v\xea\x33x@\xbf$\x9b\xf7\xdc\xb3\xb6\xaa\xaa\xaa\x94\x95\x97\x65\xc5\x8a\x15iim-H\xdc\0\0\x9d\xa1\xb4\xa4$UUU\x1d\xae\x14Zs\xcfT^]U\x99\xc6\x95+S\x9b\xea.\b\x11(\xb4\x15+W\xa6\xa6\x66\xe3\x7f\xdf\xaf\xbf\x16\f\x1a\xd0\x37\xcb\x1a\x1a\xf3\xe2K\v\xb3\xaa\x65U\xa1\xc3\x4\0\0xC\xaa*+R]U\xd9\x96\x14J6\xff\xb9gm\xe5\x65\xe5)\xebQ\x9e\xe6U\xcdY\xd5\xbc*\xabZ\x9a\xd3\xda\x9a\xb4J\x14\x1\0\xddXIIIJJ\x92\xb2\xd2\xf2\x94\x95\x97\xa5\xbc\xac|\x9d=\x85\xd6Xs\xcfT\xde\xa3\xa6*K\x97\x37\x64yCcz\xbc\x81\x9b(`\xeb\xf1\xea\xa2%iniIMu\xe5\x46\xfbvt-\xa8\xad\xa9N\xad\xeb\x2\0\0\xd0\x8d\xbd\xd9\xe7\x9e\xb5\x95$\xa9(+OEYy\x12\xfb.\x3\0\xdb\x8e\xb5\xef\x99\xca\x93\x64\x87\xedze\xf6+\xaf\xae\xce,%\xa9\xa8\xac\xb0\xaf\x10l\xa5V65\xa7ies\x1aW6\xa5\x65\xd5\xaa\xf4\xef\xbb\xdd\x1b\x1e\xebZ\0\0\0l\r<\xf7\0\0l\xdc\xfa\xee\x99J\x96\x37\x34\xb5\xad\x89~\xad~I\x9aW\xb5\xa6ieSV\xb5\xb4tY\xb0\xc0\xe6\xab\xac(OEeyj\xaa*SS\xbdy\x9fps-\0\0\0\xba\x33\xcf=\0\0\x1b\xb7\xbe{\xa6\xff\x3\x8c\x85\xbf!Y\xb9\x14\x1e\0\0\0\0IEND\xae\x42`\x82)" +screenshot_at=2026-09-27T09:27:43Z diff --git a/pxiii_bec/device_configs/pxiii-beamline-states.yaml b/pxiii_bec/device_configs/pxiii-beamline-states.yaml index e8579d9..3921888 100644 --- a/pxiii_bec/device_configs/pxiii-beamline-states.yaml +++ b/pxiii_bec/device_configs/pxiii-beamline-states.yaml @@ -193,7 +193,7 @@ states: bl_bright: 'on' bs_pos: in bs_z: safe - coll_y: intermediate + coll_y: in cryo_pos: in det_cov: 'close' diag_y: out diff --git a/pxiii_bec/device_configs/pxiii-devices.yaml b/pxiii_bec/device_configs/pxiii-devices.yaml old mode 100644 new mode 100755 index 2ac3186..39d9282 --- a/pxiii_bec/device_configs/pxiii-devices.yaml +++ b/pxiii_bec/device_configs/pxiii-devices.yaml @@ -55,8 +55,8 @@ aerotech: deviceConfig: prefix: http://mx-x06da-queue-01:5234 deviceTags: - - motors - aerotech + - motors enabled: true onFailure: buffer readoutPriority: baseline @@ -66,12 +66,12 @@ aerotech: work: 0 work: null x: - in: 0 + in: -0.0 out: -10 safe: -50 y: mount: 0 - work: 0.026 + work: -0.014 z: mount: 0 work: 0.022 @@ -246,6 +246,43 @@ bcu_sl_yt: enabled: true onFailure: buffer readoutPriority: baseline +beam_profile_centroid: + description: Beam location and size based on AD sample camera analysis with centroid + analysis + deviceClass: pxiii_bec.devices.CentroidBeamProfile + deviceConfig: + prefix: 'X06DA-ES-MS:Stats5:' + deviceTags: + - beam + enabled: true + readoutPriority: baseline +beam_profile_gaussian: + description: Beam location and size based on AD sample camera analysis with gaussiant + fitting + deviceClass: pxiii_bec.devices.GaussianBeamProfile + deviceConfig: + prefix: 'X06DA-ES-MS:XYP1:' + deviceTags: + - beam + enabled: true + readoutPriority: baseline +beam_steering: + description: Beam location and size based on AD sample camera analysis + deviceClass: pxiii_bec.devices.BeamSteerer + deviceConfig: + hfm_step_per_x_px: -0.00013 + prefix: '' + px_tolerance: 3 + sample_loc_x_px: 1020 + sample_loc_y_px: 1010 + step_fraction: 0.7 + vfm_step_per_y_px: -0.00033 + deviceTags: + - beam + enabled: true + readoutPriority: on_request + userParameter: + profile_provider: beam_profile_centroid bl_bright: description: Backlight Brightness deviceClass: ophyd.EpicsSignal @@ -401,7 +438,7 @@ coll_y: onFailure: buffer readoutPriority: baseline userParameter: - in: 25.42 + in: 25.4 intermediate: 15 out: 4.901 park: 0 @@ -616,8 +653,8 @@ det_z: onFailure: buffer readoutPriority: baseline userParameter: - vis: 150 mse: 800 + vis: 150 diag_y: description: Scintillator/diode Y deviceClass: ophyd_devices.EpicsMotor @@ -741,6 +778,15 @@ fl_bright: 'on': 3.0 type: continuous "\u201Ctol\u201D": 0.01 +fluorimeter: + description: fluorimeter + deviceClass: pxiii_bec.devices.Fluorimeter + deviceConfig: + prefix: 'X06DA-ES-XRF:' + deviceTags: + - xrf + enabled: true + readoutPriority: on_request hfm_bd: description: HFM Downstream Bender deviceClass: ophyd_devices.EpicsMotorEC @@ -1019,8 +1065,8 @@ smargon: deviceConfig: prefix: http://x06da-smargopolo.psi.ch:3000 deviceTags: - - smargon - motors + - smargon enabled: true onFailure: buffer readoutPriority: baseline diff --git a/pxiii_bec/device_configs/temp/beam_steerer.yaml b/pxiii_bec/device_configs/temp/beam_steerer.yaml new file mode 100644 index 0000000..c123575 --- /dev/null +++ b/pxiii_bec/device_configs/temp/beam_steerer.yaml @@ -0,0 +1,43 @@ +beam_profile_gaussian: + readoutPriority: baseline + description: Beam location and size based on AD sample camera analysis with gaussiant fitting + deviceClass: pxiii_bec.devices.GaussianBeamProfile + deviceConfig: + prefix: "X06DA-ES-MS:XYP1:" + deviceTags: + - beam + enabled: true + readOnly: false + softwareTrigger: false + +beam_profile_centroid: + readoutPriority: baseline + description: Beam location and size based on AD sample camera analysis with centroid analysis + deviceClass: pxiii_bec.devices.CentroidBeamProfile + deviceConfig: + prefix: "X06DA-ES-MS:Stats5:" + deviceTags: + - beam + enabled: true + readOnly: false + softwareTrigger: false + +beam_steering: + readoutPriority: on_request + description: Beam location and size based on AD sample camera analysis + deviceClass: pxiii_bec.devices.BeamSteerer + deviceConfig: + prefix: "" + hfm_step_per_x_px: -0.00013 + vfm_step_per_y_px: -0.00033 + sample_loc_x_px: 1020 + sample_loc_y_px: 1010 + px_tolerance: 3 + step_fraction: 0.7 + userParameter: + profile_provider: "beam_profile_centroid" # "centroid" or "gaussian" + deviceTags: + - beam + enabled: true + readOnly: false + softwareTrigger: false diff --git a/pxiii_bec/device_configs/temp/fluo.yaml b/pxiii_bec/device_configs/temp/fluo.yaml new file mode 100644 index 0000000..ce2e101 --- /dev/null +++ b/pxiii_bec/device_configs/temp/fluo.yaml @@ -0,0 +1,11 @@ +fluorimeter: + readoutPriority: on_request + description: fluorimeter + deviceClass: pxiii_bec.devices.Fluorimeter + deviceConfig: + prefix: "X06DA-ES-XRF:" + deviceTags: + - xrf + enabled: true + readOnly: false + softwareTrigger: false diff --git a/pxiii_bec/device_configs/temp/pxiii-beamline-states.yaml b/pxiii_bec/device_configs/temp/pxiii-beamline-states.yaml new file mode 100644 index 0000000..3921888 --- /dev/null +++ b/pxiii_bec/device_configs/temp/pxiii-beamline-states.yaml @@ -0,0 +1,213 @@ +states: + robot_sample_exchange: + allow_modifiers: true + bl_pos: in + bl_bright: 'off' + bs_pos: out + bs_z: safe + coll_y: out + cryo_pos: in + det_cov: 'close' + diag_y: out + fl_bright: 'off' + aerotech_x: in + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + + sample_alignment: + allow_modifiers: true + bl_pos: in + bl_bright: 'on' + bs_pos: in + bs_z: safe + coll_y: out + cryo_pos: in + det_cov: 'close' + diag_y: out + fl_bright: 'on' + aerotech_x: in + aerotech_y: work + aerotech_z: work + # aerotech_u: mount + # smargon_x: mount + # smargon_y: mount + # smargon_chi: mount + # smargon_phi: mount + xrf_pos: out + + data_collection: + allow_modifiers: true + bl_pos: out + bl_bright: 'off' + bs_pos: in + bs_z: safe + coll_y: in + cryo_pos: in + det_cov: 'open' + diag_y: out + fl_bright: 'on' + aerotech_x: in + aerotech_y: work + aerotech_z: work + # aerotech_u: mount + # smargon_x: mount + # smargon_y: mount + # smargon_chi: mount + # smargon_phi: mount + xrf_pos: out + + DC_XRF: + allow_modifiers: true +# bl_pos: out + bl_bright: 'off' + bs_pos: in + bs_z: safe + coll_y: in + cryo_pos: in + det_cov: 'close' + diag_y: out + fl_bright: 'on' + aerotech_x: in + aerotech_y: work + aerotech_z: work + aerotech_u: mount + # smargon_x: mount + # smargon_y: mount + # smargon_chi: mount + # smargon_phi: mount + xrf_pos: in + + manual_sample_exchange: + allow_modifiers: true + bl_pos: out + bl_bright: 'off' + bs_pos: out + bs_z: safe + coll_y: park + cryo_pos: in + det_cov: 'close' + diag_y: park + fl_bright: 'off' + aerotech_x: in + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + det_z: 'mse' + + beam_visualisation: + bl_pos: out + bl_bright: 'off' + bs_pos: in + bs_z: safe + coll_y: in + cryo_pos: out + det_cov: 'close' + det_z: 'vis' + diag_y: scint + fl_bright: 'off' + aerotech_x: out + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + + flux_measurement: + bl_pos: in + bl_bright: 'off' + bs_pos: in + bs_z: safe + coll_y: out + cryo_pos: out + det_cov: 'close' + diag_y: i1 + fl_bright: 'off' + aerotech_x: out + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + + beamstop_alignment: + bl_pos: out + bl_bright: 'off' + bs_pos: in + bs_z: samp + coll_y: out + cryo_pos: out + det_cov: 'close' + diag_y: out + fl_bright: 'on' + aerotech_x: out + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + + maintenance: + allow_modifiers: true + bl_pos: out + bl_bright: 'off' + bs_pos: out + bs_z: safe + coll_y: park + cryo_pos: in + det_cov: 'close' + diag_y: park + fl_bright: 'off' + aerotech_x: out + aerotech_y: mount + aerotech_z: mount + aerotech_u: mount + smargon_x: mount + smargon_y: mount + smargon_chi: mount + smargon_phi: mount + xrf_pos: out + + xtal_snapshot: + allow_modifiers: true + bl_pos: in + bl_bright: 'on' + bs_pos: in + bs_z: safe + coll_y: in + cryo_pos: in + det_cov: 'close' + diag_y: out + fl_bright: 'on' + #aerotech_x: in + #aerotech_y: work + #aerotech_z: work + #aerotech_u: mount + #smargon_x: mount + #smargon_y: mount + #smargon_chi: mount + #smargon_phi: mount + xrf_pos: out + + + + diff --git a/pxiii_bec/device_configs/temp/pxiii-devices.yaml b/pxiii_bec/device_configs/temp/pxiii-devices.yaml new file mode 100644 index 0000000..39d9282 --- /dev/null +++ b/pxiii_bec/device_configs/temp/pxiii-devices.yaml @@ -0,0 +1,1590 @@ +# BEC Device Configuration File +# +# The device config consists of a mapping of device names to their configurations. +# +# The following fields are required for each device: +# - deviceClass: The class of the device (e.g., ophyd_devices.SimPositioner). +# - enabled: A boolean indicating if the device is enabled. +# - readoutPriority: Determines how the device is read out during a scan. Possible values are ["monitored", "baseline", "async", "on_request", "continuous"]. +# +# Optional fields (defaults shown): +# - connectionTimeout: Connection timeout in seconds. Default is 5. +# - description: A string description of the device. Default is "" (empty string). +# - deviceConfig: A dictionary of configuration parameters specific to the device class. Default is None. +# - deviceTags: A list/set of tags associated with the device. Default is an empty list/set. +# - needs: A list of other device names that this device depends on. Default is []. +# - onFailure: The action to take on failure. Possible values are ["buffer", "retry", "raise"]. Default is "retry". +# - readOnly: A boolean indicating if the device is read-only. Default is false. +# - softwareTrigger: A boolean indicating if the device uses software triggering. Default is false. +# - userParameter: A dictionary of user-defined parameters. Default is {}. +# +# Default values may be omitted for brevity. +########################################################################################################################## + + +# An example device configuration with all fields: + +# device1: +# deviceClass: ophyd_devices.SimPositioner +# description: Sample positioner device +# deviceConfig: +# delay: 1 +# update_frequency: 10 +# deviceTags: +# - frontend +# - motor +# enabled: true +# connectionTimeout: 20 +# readoutPriority: baseline +# needs: +# - device2 +# - device3 +# onFailure: retry +# readOnly: false +# softwareTrigger: false +# userParameter: +# in: 23.1 +# out: -50 + +########################################################################################################################## + + +aerotech: + description: REST-based device which connects to AareScan and Aerotech + deviceClass: pxiii_bec.devices.aerotech.Aerotech + deviceConfig: + prefix: http://mx-x06da-queue-01:5234 + deviceTags: + - aerotech + - motors + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + u: + mount: 0 + work: 0 + work: null + x: + in: -0.0 + out: -10 + safe: -50 + y: + mount: 0 + work: -0.014 + z: + mount: 0 + work: 0.022 +bcu_bpm1: + description: BCU BPM Channel 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BCBPM:Current1:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +bcu_bpm2: + description: BCU BPM Channel 2 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BCBPM:Current2:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +bcu_bpm3: + description: BCU BPM Channel 3 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BCBPM:Current3:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +bcu_bpm4: + description: BCU BPM Channel 4 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BCBPM:Current4:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +bcu_bpm_x: + description: BCU BPM X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCBPM:TRX + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_bpm_y: + description: BCU BPM Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCBPM:TRY + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_bpmsum: + description: BCU BPM Summed + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BCBPM:SumAll:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +bcu_shutter: + description: Fast Shutter + deviceClass: ophyd_devices.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SHUTTER:SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_xcen: + description: BCU Slit X Centre + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLH:CENTER + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_xr: + description: BCU Slit Ring + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLH:TRXR + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_xsize: + description: BCU Slit X Size + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLH:SIZE + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_xw: + description: BCU Slit Wall + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLH:TRXW + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_yb: + description: BCU Slit Bottom + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLV:TRYB + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_ycen: + description: BCU Slit Y Centre + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLV:CENTER + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_ysize: + description: BCU Slit Y Size + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLV:SIZE + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +bcu_sl_yt: + description: BCU Slit top + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BCSLV:TRYT + deviceTags: + - bcu + enabled: true + onFailure: buffer + readoutPriority: baseline +beam_profile_centroid: + description: Beam location and size based on AD sample camera analysis with centroid + analysis + deviceClass: pxiii_bec.devices.CentroidBeamProfile + deviceConfig: + prefix: 'X06DA-ES-MS:Stats5:' + deviceTags: + - beam + enabled: true + readoutPriority: baseline +beam_profile_gaussian: + description: Beam location and size based on AD sample camera analysis with gaussiant + fitting + deviceClass: pxiii_bec.devices.GaussianBeamProfile + deviceConfig: + prefix: 'X06DA-ES-MS:XYP1:' + deviceTags: + - beam + enabled: true + readoutPriority: baseline +beam_steering: + description: Beam location and size based on AD sample camera analysis + deviceClass: pxiii_bec.devices.BeamSteerer + deviceConfig: + hfm_step_per_x_px: -0.00013 + prefix: '' + px_tolerance: 3 + sample_loc_x_px: 1020 + sample_loc_y_px: 1010 + step_fraction: 0.7 + vfm_step_per_y_px: -0.00033 + deviceTags: + - beam + enabled: true + readoutPriority: on_request + userParameter: + profile_provider: beam_profile_centroid +bl_bright: + description: Backlight Brightness + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BL:SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + 'off': 0 + 'on': 1.3 + type: continuous + "\u201Ctol\u201D": 0.01 +bl_pos: + description: Backlight Positioner + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BL:POS-SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + in: 1 + out: 0 + type: discrete +bs_pos: + description: Beamstop Positioner + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-BS:POS-SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + in: 1 + out: 0 + type: discrete +bs_x: + description: Beamstop X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BS:TRX + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +bs_y: + description: Beamstop Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BS:TRY + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +bs_z: + description: Beamstop Z + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-BS:TRZ + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + max_blin: 26 + max_blout: 35 + min: 13 + safe: 24 + samp: 15 + type: continuous + work_min: 20 +bsf_f1_y: + description: BSF Filter 1 Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-BSFFI1:TRY + deviceTags: + - bsf + enabled: true + onFailure: buffer + readoutPriority: baseline +bsf_sl_xcen: + description: BSF X Centre + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-BSFSLH:CENTER + deviceTags: + - bsf + enabled: true + onFailure: buffer + readoutPriority: baseline +bsf_sl_xr: + description: BSF Slit inboard + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-BSFSLH:TRXR + deviceTags: + - bsf + enabled: true + onFailure: buffer + readoutPriority: baseline +bsf_sl_xsize: + description: BSF X Size + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-BSFSLH:SIZE + deviceTags: + - bsf + enabled: true + onFailure: buffer + readoutPriority: baseline +bsf_sl_xw: + description: BSF Slit outboard + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-BSFSLH:TRXW + deviceTags: + - bsf + enabled: true + onFailure: buffer + readoutPriority: baseline +coll_x: + description: Collimator X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-COL:TRX + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +coll_y: + description: Collimator Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-COL:TRY + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + in: 25.4 + intermediate: 15 + out: 4.901 + park: 0 + tol: 0.05 + type: continuous +cryo_pos: + description: Cryo Positioner + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-CS:POS-SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + in: 1 + out: 0 + type: discrete +cryo_temp: + description: Cryo Temperature + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-CS:TEMP_RBV + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +cryo_x: + description: Cryo X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-CS:TRX + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_bpm1: + description: DCCM BPM Channel 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM2:Current1:MeanValue_RBV + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_bpm2: + description: DCCM BPM Channel 2 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM2:Current2:MeanValue_RBV + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_bpm3: + description: DCCM BPM Channel 3 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM2:Current3:MeanValue_RBV + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_bpm4: + description: DCCM BPM Channel 4 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM2:Current4:MeanValue_RBV + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_bpmsum: + description: DCCM BPM Summed + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM2:SumAll:MeanValue_RBV + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_di_bot: + description: DCCM Diode Bottom + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM1B:READOUT + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_di_top: + description: DCCM Diode Top + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-OP-DCCMXBPM1T:READOUT + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: monitored +dccm_energy: + description: DCCM Energy + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-OP-DCCM:ENERGY + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_rotz: + description: DCCM RotZ Xtal 2 + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-DCCM:ROTZ-CR2 + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_theta1: + description: DCCM Theta Xtal1 + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-DCCM:ROTX-CR1 + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_theta2: + description: DCCM Theta Xtal2 + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-DCCM:ROTX-CR2 + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_xbpm1_y: + description: DCCM BPM1 Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-DCCMXBPM1:TRY + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +dccm_xbpm2_y: + description: DCCM BPM2 Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-OP-DCCMXBPM2:TRY + deviceTags: + - dccm + enabled: true + onFailure: buffer + readoutPriority: baseline +det_cov: + description: Detector Cover + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-DETCOV:SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + close: 1 + open: 2 + type: discrete +det_y: + description: Detector Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-DET:TRY + deviceTags: + - det + enabled: true + onFailure: buffer + readoutPriority: baseline +det_z: + description: Detector Z + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-DET:TRZ + deviceTags: + - det + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + mse: 800 + vis: 150 +diag_y: + description: Scintillator/diode Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SCL:TRY + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + i1: 27 + out: 5.0 + park: 0 + scint: 22 + tol: 0.3 + type: continuous +diag_z: + description: Scintillator/diode Z + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SCL:TRZ + deviceTags: + - se + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_xcen: + description: FE Slit X Centre + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:CENTERX + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_xr: + description: FE Slit X Ring + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:TRXR + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_xsize: + description: FE Slit X Size + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:SIZEX + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_xw: + description: FE Slit X Wall + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:TRXW + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_yb: + description: FE Slit Y Bottom + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:TRYB + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_ycen: + description: FE Slit Y Centre + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:CENTERY + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_ysize: + description: FE Slit Y Size + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:SIZEY + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fe_sl_yt: + description: FE Slit Y Top + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-SLDI:TRYT + deviceTags: + - fe + enabled: true + onFailure: buffer + readoutPriority: baseline +fl_bright: + description: Frontlight Brightness + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-FL:SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + 'off': 0 + 'on': 3.0 + type: continuous + "\u201Ctol\u201D": 0.01 +fluorimeter: + description: fluorimeter + deviceClass: pxiii_bec.devices.Fluorimeter + deviceConfig: + prefix: 'X06DA-ES-XRF:' + deviceTags: + - xrf + enabled: true + readoutPriority: on_request +hfm_bd: + description: HFM Downstream Bender + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:BNDD + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_bu: + description: HFM Upstream Bender + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:BNDU + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_pitch: + description: HFM Virtual Pitch + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:PITCH + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_roll: + description: HFM Virtual Roll + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:ROLL + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_x: + description: HFM Virtual X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRX + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_xd: + description: HFM Downstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRXD + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_xu: + description: HFM Upstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRXU + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_y: + description: HFM Virtual Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRY + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_yaw: + description: HFM Virtual Yaw + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:YAW + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_ydw: + description: HFM Downstream Wall Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRYDW + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_yr: + description: HFM Ring Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRYR + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +hfm_yuw: + description: HFM Upstream Wall Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-HFM:TRYUW + deviceTags: + - hfm + enabled: true + onFailure: buffer + readoutPriority: baseline +i1: + description: I1 diode + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SCLDI:READOUT + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_ecc: + description: Sample Camera Eccentricity + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:Eccentricity_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_exp: + description: Sample Camera Exposure + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:cam1:AcquireTime + deviceTags: + - scam + enabled: true + onFailure: buffer + readoutPriority: baseline +samcam_gain: + description: Sample Camera Gain + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:cam1:Gain + deviceTags: + - scam + enabled: true + onFailure: buffer + readoutPriority: baseline +samcam_max: + description: Sample Camera Max + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:MaxValue_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_mean: + description: Sample Camera Mean + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats1:MeanValue_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_sigma: + description: Sample Camera Sigma + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats1:Sigma_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_x: + description: Sample Camera X + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:CentroidX_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_xsig: + description: Sample Camera X Sigma + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:SigmaX_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_y: + description: Sample Camera Y + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:CentroidY_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +samcam_ysig: + description: Sample Camera Y Sigma + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-MS:Stats5:SigmaY_RBV + deviceTags: + - scam + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +scam_zoom: + description: Sample Camera Zoom + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-MS:ZOOM + deviceTags: + - scam + enabled: true + onFailure: buffer + readoutPriority: baseline +sls_current: + description: SLS Current + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: ARS07-DPCT-0100:CURR + deviceTags: + - SLS + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +smargon: + description: REST-based device which connects to Smargopolo + deviceClass: pxiii_bec.devices.smargopolo_smargon.Smargon + deviceConfig: + prefix: http://x06da-smargopolo.psi.ch:3000 + deviceTags: + - motors + - smargon + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + chi: + mount: 0 + phi: + mount: 0 + x: + mount: 0 + y: + mount: 0 + z: + mount: 18 +ss_bpm1: + description: SS BPM Channel 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSBPM:Current1:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_bpm2: + description: SS BPM Channel 2 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSBPM:Current2:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_bpm3: + description: SS BPM Channel 3 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSBPM:Current3:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_bpm4: + description: SS BPM Channel 4 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSBPM:Current4:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_bpm_x: + description: SS BPM X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSBPM:TRX + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_bpm_y: + description: SS BPM Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSBPM:TRY + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_bpmsum: + description: SS BPM Summed + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSBPM:SumAll:MeanValue_RBV + deviceTags: + - bpm + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_sl_xcen: + description: SS Slit X Centre + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLH:CENTER + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_xr: + description: SS Slit Ring + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLH:TRXR + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_xsize: + description: SS Slit X Size + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLH:SIZE + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_xw: + description: SS Slit Wall + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLH:TRXW + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_yb: + description: SS Slit Bottom + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLV:TRYB + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_ycen: + description: SS Slit Y Centre + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLV:CENTER + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_ysize: + description: SS Slit Y Size + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLV:SIZE + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_sl_yt: + description: SS Slit Top + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSSLV:TRYT + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_xi_x: + description: SS X-ray Eye X + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSXI:TRX + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_xi_y: + description: SS X-ray Eye Y + deviceClass: ophyd_devices.EpicsMotor + deviceConfig: + prefix: X06DA-ES-SSXI:TRY + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_xicam_exp: + description: SS Camera Exposure + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:cam1:AcquireTime + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_xicam_gain: + description: SS Camera Gain + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:cam1:Gain + deviceTags: + - ss + enabled: true + onFailure: buffer + readoutPriority: baseline +ss_xicam_max: + description: SS Cam Max + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:Stats5:MaxValue_RBV + deviceTags: + - ss + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: monitored +ss_xicam_x: + description: SS Camera X + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:Stats5:CentroidX_RBV + deviceTags: + - ss + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: baseline +ss_xicam_xsig: + description: SS Camera X Sigma + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:Stats5:SigmaX_RBV + deviceTags: + - ss + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: baseline +ss_xicam_y: + description: SS Camera Y + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:Stats5:CentroidY_RBV + deviceTags: + - ss + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: baseline +ss_xicam_ysig: + description: SS Camera Y Sigma + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-SSCAM:Stats5:SigmaY_RBV + deviceTags: + - ss + enabled: true + onFailure: buffer + readOnly: true + readoutPriority: baseline +tm_b1: + description: TorM Bender + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:BEND1 + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_pitch: + description: TorM Virtual Pitch + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:PITCH + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_roll: + description: TorM Virtual Roll + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:ROLL + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_x: + description: TorM Virtual X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRX + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_xd: + description: TorM Downstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRXD + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_xu: + description: TorM Upstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRXU + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_y: + description: TorM Virtual Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRY + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_yaw: + description: TorM Virtual Yaw + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:YAW + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_yd: + description: TorM Downstream Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRYD + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_yur: + description: TorM Upstream Ring Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRYUR + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +tm_yw: + description: TorM Wall Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-FE-MI1:TRYUW + deviceTags: + - tm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_bd: + description: VFM Downstream Bender + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:BNDD + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_bu: + description: VFM Upstream Bender + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:BNDU + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_pitch: + description: VFM Virtual Pitch + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:PITCH + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_roll: + description: VFM Virtual Roll + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:ROLL + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_x: + description: VFM Virtual X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRX + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_xd: + description: VFM Downstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRXD + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_xu: + description: VFM Upstream X + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRXU + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_y: + description: VFM Virtual Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRY + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_yaw: + description: VFM Virtual Yaw + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:YAW + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_ydr: + description: VFM Downstream Ring Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRYDR + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_yur: + description: VFM Upstream Ring Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRYUR + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +vfm_yw: + description: VFM Wall Y + deviceClass: ophyd_devices.EpicsMotorEC + deviceConfig: + prefix: X06DA-ES-VFM:TRYW + deviceTags: + - vfm + enabled: true + onFailure: buffer + readoutPriority: baseline +xrf_pos: + description: XRF Positioner + deviceClass: ophyd.EpicsSignal + deviceConfig: + auto_monitor: true + read_pv: X06DA-ES-XRF:POS-SET + deviceTags: + - state + enabled: true + onFailure: buffer + readoutPriority: baseline + userParameter: + in: 1 + out: 0 + type: discrete diff --git a/pxiii_bec/device_configs/pxiii-state-devices.yaml b/pxiii_bec/device_configs/temp/pxiii-state-devices.yaml similarity index 100% rename from pxiii_bec/device_configs/pxiii-state-devices.yaml rename to pxiii_bec/device_configs/temp/pxiii-state-devices.yaml diff --git a/pxiii_bec/device_configs/temp/x06da_device_config.yaml b/pxiii_bec/device_configs/temp/x06da_device_config.yaml new file mode 100644 index 0000000..196681f --- /dev/null +++ b/pxiii_bec/device_configs/temp/x06da_device_config.yaml @@ -0,0 +1,5 @@ +base_config: + - !include ./pxiii-devices.yaml +#states_config: +# - !include ./pxiii-state-devices.yaml + diff --git a/pxiii_bec/devices/__init__.py b/pxiii_bec/devices/__init__.py index f68521a..4b0da3c 100644 --- a/pxiii_bec/devices/__init__.py +++ b/pxiii_bec/devices/__init__.py @@ -4,11 +4,16 @@ Ophyd devices for the PX III beamline, including the MX specific Aerotech A3200 @author: mohacsi_i """ + +from mx_bec.devices.beam_profile import CentroidBeamProfile, GaussianBeamProfile +from mx_bec.devices.beam_steering import BeamSteerer + from .A3200 import AerotechAbrStage from .A3200utils import A3200Axis +from .NDArrayPreview import NDArrayPreview +from .PneumaticValve import PneumaticValve +from .SamCamDetector import SamCamDetector from .SmarGonA import SmarGonAxis as SmarGonAxisA from .SmarGonB import SmarGonAxis as SmarGonAxisB from .StdDaqPreview import StdDaqPreviewDetector -from .NDArrayPreview import NDArrayPreview -from .SamCamDetector import SamCamDetector -from .PneumaticValve import PneumaticValve +from .fluorimeter import Fluorimeter \ No newline at end of file diff --git a/pxiii_bec/devices/fluorimeter.py b/pxiii_bec/devices/fluorimeter.py new file mode 100644 index 0000000..dabc146 --- /dev/null +++ b/pxiii_bec/devices/fluorimeter.py @@ -0,0 +1,30 @@ +from ophyd import DeviceStatus, EpicsSignal, Component as Cpt + +from ophyd_devices import PSIDeviceBase + +class Fluorimeter(PSIDeviceBase): + + start = Cpt(EpicsSignal, suffix="mca1Start") + stop_signal = Cpt(EpicsSignal, suffix="mca1Stop") + erase_and_start = Cpt(EpicsSignal, suffix="mca1EraseStart") + erase = Cpt(EpicsSignal, suffix="mca1Erase") + preset_mode = Cpt(EpicsSignal, suffix="dxp1:PresetMode") + status = Cpt(EpicsSignal, suffix="mca1.ACQG") + real_time = Cpt(EpicsSignal, suffix="mca1.PRTM") + live_time = Cpt(EpicsSignal, suffix="mca1.PLTM") + elapsed_real_time = Cpt(EpicsSignal, suffix="mca1.ERTM") + elapsed_live_time = Cpt(EpicsSignal, suffix="mca1.ELTM") + elapsed_trigger_live_time = Cpt(EpicsSignal, suffix="dxp1:ElapsedTriggerLiveTime") + instant_dead_time = Cpt(EpicsSignal, suffix="mca1.IDTIM") + average_dead_time = Cpt(EpicsSignal, suffix="mca1.DTIM") + poll_time_rbv = Cpt(EpicsSignal, suffix="PollTime_RBV") + poll_time = Cpt(EpicsSignal, suffix="PollTime") + mca = Cpt(EpicsSignal, suffix="mca1") + data = Cpt(EpicsSignal, suffix="mca1.VAL") + background = Cpt(EpicsSignal, suffix="mca1.BG") + saveFile = Cpt(EpicsSignal, suffix="SaveSystemFile") + saveFile_name = Cpt(EpicsSignal, suffix="SaveSystem") + saveFile_rbv = Cpt(EpicsSignal, suffix="SaveSystem_RBV") + calibration_offset = Cpt(EpicsSignal, suffix="mca1.CALO") + calibration_slope = Cpt(EpicsSignal, suffix="mca1.CALS") + diff --git a/pxiii_bec/devices/old/A3200.py b/pxiii_bec/devices/old/A3200.py new file mode 100644 index 0000000..4e9941e --- /dev/null +++ b/pxiii_bec/devices/old/A3200.py @@ -0,0 +1,426 @@ +""" +``Aerotech`` --- Aerotech control software +****************************************** + +This module provides an object to control the Aerotech Abr rotational stage. + +Methods in the Abr class +======================== + +Standard bluesky interface: + AerotechAbrStage.configure(d={...}) + AerotechAbrStage.kickoff() + AerotechAbrStage.stop() +Additional bluesky functionality: + + + + + +Aerotech.is_homed() +Aerotech.do_homing(wait=True) +Aerotech.get_ready(ostart=None, orange=None, etime=None, wait=True) +Aerotech.is_done() +Aerotech.is_ready() +Aerotech.is_busy() +Aerotech.start_exposure() +Aerotech.wait_status(status) +Aerotech.move(angle, wait=False, speed=None) +Aerotech.set_shutter(state) + + + Returns the axis mode: ``-ES-DF1:AXES-MODE`` + +Examples +======== + + abr = AerotechAbrStage(prefix="X06DA-ES-DF1", name="abr") + + # move omega to 270.0 degrees + abr.omega = 270.0 + + # move omega to 180 degrees and wait for movement to finish + abr.move(180, wait=True) + + # move omega to 3000 degrees at 360 degrees/s and wait for movement to finish + abr.move(3000, velocity=360, wait=True) + + # stop any movement + abr.stop() # this function only returns after the STATUS is back to OK + +""" + +import time +from ophyd import Device, Component, EpicsSignal, EpicsSignalRO, Kind +from ophyd.status import SubscriptionStatus +from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase + +try: + from .A3200enums import AbrCmd, AbrMode +except ImportError: + from A3200enums import AbrCmd, AbrMode + + +from bec_lib import bec_logger + +logger = bec_logger.logger + + +# pylint: disable=logging-fstring-interpolation +class AerotechAbrStage(PSIDeviceBase, Device): + """Standard PX stage on A3200 controller + + This is the wrapper class for the standard rotation stage layout for the PX + beamlines at SLS. It wraps the main rotation axis OMEGA (Aerotech ABR)and + the associated motion axes GMX, GMY and GMZ. The ophyd class associates to + the general PX measurement procedure, which is that the actual scan script + is running as an AeroBasic program on the controller and we communicate to + it via 10+1 global variables. + """ + + USER_ACCESS = ["reset", "kickoff", "complete", "set_axis_mode", "arm", "disarm"] + + taskStop = Component(EpicsSignal, "-AERO:TSK-STOP", put_complete=True, kind=Kind.omitted) + status = Component(EpicsSignal, "-AERO:STAT", put_complete=True, kind=Kind.omitted) + clear = Component(EpicsSignal, "-AERO:CTRL-CLFT", put_complete=True, kind=Kind.omitted) + + # Enable/disable motor movement via the IOC (i.e. make it task-only) + axisModeLocked = Component(EpicsSignal, "-DF1:LOCK", put_complete=True, kind=Kind.omitted) + axisModeDirect = Component( + EpicsSignal, "-DF1:MODE-DIRECT", put_complete=True, kind=Kind.omitted + ) + axisAxesMode = Component(EpicsSignal, "-DF1:AXES-MODE", put_complete=True, kind=Kind.omitted) + + # Shutter box is missing readback so the -GET signal is installed on the VME + # _shutter = Component( + # EpicsSignal, "-PH1:GET", write_pv="-PH1:SET", put_complete=True, kind=Kind.config, + # ) + + # Status flags for all axes + omega_done = Component(EpicsSignalRO, "-DF1:OMEGA-DONE", kind=Kind.normal) + gmx_done = Component(EpicsSignalRO, "-DF1:GMX-DONE", kind=Kind.normal) + gmy_done = Component(EpicsSignalRO, "-DF1:GMY-DONE", kind=Kind.normal) + gmz_done = Component(EpicsSignalRO, "-DF1:GMZ-DONE", kind=Kind.normal) + + # For some reason the task interface is called PSO... + scan_command = Component(EpicsSignal, "-PSO:CMD", put_complete=True, kind=Kind.omitted) + start_command = Component( + EpicsSignal, "-PSO:START-TEST.PROC", put_complete=True, kind=Kind.omitted + ) + stop_command = Component( + EpicsSignal, "-PSO:STOP-TEST.PROC", put_complete=True, kind=Kind.omitted + ) + + # Global variables to controll AeroBasic scripts + _var_1 = Component(EpicsSignal, "-PSO:VAR-1", put_complete=True, kind=Kind.omitted) + _var_2 = Component(EpicsSignal, "-PSO:VAR-2", put_complete=True, kind=Kind.omitted) + _var_3 = Component(EpicsSignal, "-PSO:VAR-3", put_complete=True, kind=Kind.omitted) + _var_4 = Component(EpicsSignal, "-PSO:VAR-4", put_complete=True, kind=Kind.omitted) + _var_5 = Component(EpicsSignal, "-PSO:VAR-5", put_complete=True, kind=Kind.omitted) + _var_6 = Component(EpicsSignal, "-PSO:VAR-6", put_complete=True, kind=Kind.omitted) + _var_7 = Component(EpicsSignal, "-PSO:VAR-7", put_complete=True, kind=Kind.omitted) + _var_8 = Component(EpicsSignal, "-PSO:VAR-8", put_complete=True, kind=Kind.omitted) + _var_9 = Component(EpicsSignal, "-PSO:VAR-9", put_complete=True, kind=Kind.omitted) + _var_10 = Component(EpicsSignal, "-PSO:VAR-10", put_complete=True, kind=Kind.omitted) + + # Task status PVs (programs always run on task 1) + task1 = Component(EpicsSignalRO, "-AERO:TSK1-DONE", auto_monitor=True) + task2 = Component(EpicsSignalRO, "-AERO:TSK2-DONE", auto_monitor=True) + task3 = Component(EpicsSignalRO, "-AERO:TSK3-DONE", auto_monitor=True) + task4 = Component(EpicsSignalRO, "-AERO:TSK4-DONE", auto_monitor=True) + scan_done = Component(EpicsSignal, "-GRD:SCAN-DONE", kind=Kind.config) + + def __init__( + self, + prefix="", + *, + name, + kind=None, + read_attrs=None, + configuration_attrs=None, + parent=None, + scan_info=None, + **kwargs, + ): + # super() will call the mixin class + super().__init__( + prefix=prefix, + name=name, + kind=kind, + read_attrs=read_attrs, + configuration_attrs=configuration_attrs, + parent=parent, + scan_info=scan_info, + **kwargs, + ) + + def set_axis_mode(self, mode: str, settle_time=0.1) -> None: + """Set axis mode to direct/measurement mode. + + Measurement ensures that the scrips run undisturbed by blocking axis + motion commands from the IOC (i.e. internal only). + + Parameters: + ----------- + mode : str + Valid values are 'direct' and 'measuring'. + """ + if mode == "direct": + self.axisModeDirect.set(37, settle_time=settle_time).wait() + if mode == "measuring": + self.axisAxesMode.set(AbrMode.MEASURING, settle_time=settle_time).wait() + + def on_stage(self): + """ + + NOTE: Zac's request is that stage is essentially ARM, i.e. get ready and don't do anything. + """ + d = {} + # FIXME: I don't care about how we fish out config parameters from scan info + scan_args = { + **self.scan_info.msg.request_inputs["inputs"], + **self.scan_info.msg.request_inputs["kwargs"], + **self.scan_info.msg.scan_parameters, + } + scanname = self.scan_info.msg.scan_name + + if scanname in ( + "standardscan", + "helicalscan", + "helicalscan1", + "helicalscan2", + "helicalscan3", + ): + d["scan_command"] = AbrCmd.MEASURE_STANDARD + d["var_1"] = scan_args["start"] + d["var_2"] = scan_args["range"] + d["var_3"] = scan_args["move_time"] + d["var_4"] = scan_args.get("ready_rate", 500) + d["var_5"] = 0 + d["var_6"] = 0 + d["var_7"] = 0 + # d["var_8"] = 0 + # d["var_9"] = 0 + if scanname in ("verticallinescan", "vlinescan"): + d["scan_command"] = AbrCmd.VERTICAL_LINE_SCAN + d["var_1"] = scan_args["range"] / scan_args["steps"] + d["var_2"] = scan_args["steps"] + d["var_3"] = scan_args["exp_time"] + d["var_4"] = 0 + d["var_5"] = 0 + d["var_6"] = 0 + d["var_7"] = 0 + # d["var_8"] = 0 + # d["var_9"] = 0 + if scanname in ("screeningscan"): + d["scan_command"] = AbrCmd.SCREENING + d["var_1"] = scan_args["start"] + d["var_2"] = scan_args["oscrange"] + d["var_3"] = scan_args["exp_time"] + d["var_4"] = scan_args["range"] / scan_args["steps"] + d["var_5"] = scan_args["steps"] + d["var_6"] = scan_args.get("delta", 0.5) + d["var_7"] = 0 + # d["var_8"] = 0 + # d["var_9"] = 0 + if scanname in ("rasterscan", "rastersimplescan"): + d["scan_command"] = AbrCmd.RASTER_SCAN_SIMPLE + d["var_1"] = scan_args["exp_time"] + d["var_2"] = scan_args["range_x"] / scan_args["steps_x"] + d["var_3"] = scan_args["range_y"] / scan_args["steps_y"] + d["var_4"] = scan_args["steps_x"] + d["var_5"] = scan_args["steps_y"] + d["var_6"] = 0 + d["var_7"] = 0 + # d["var_8"] = 0 + # d["var_9"] = 0 + + # Reconfigure if got a valid scan config + if len(d) > 0: + self.configure(d) + + # Stage the ABR stage + self.arm() + + def on_unstage(self): + """Unstage the ABR controller""" + self.disarm() + + def configure(self, d: dict) -> tuple: + """ " Configure the exposure scripts + + Script execution at the PX beamlines is based on scripts that are always + running on the controller that execute commands when commanded by + setting a pre-defined set of global variables. This method performs the + configuration of the exposure scrips by setting the required global + variables. + + Parameters in d: dict + --------------------- + scan_command: int + The index of the desired AeroBasic program to be executed. + Usually supported values are taken from an Enum. + var_1: + var_2: + var_3: + var_4: + var_5: + var_6: + var_7: + var_8: + var_9: + var_10: + """ + old = self.read_configuration() + + # ToDo: Check if idle before reconfiguring + self.scan_command.set(d["scan_command"]).wait() + # Set the corresponding global variables + if "var_1" in d and d["var_1"] is not None: + self._var_1.set(d["var_1"]).wait() + if "var_2" in d and d["var_2"] is not None: + self._var_2.set(d["var_2"]).wait() + if "var_3" in d and d["var_3"] is not None: + self._var_3.set(d["var_3"]).wait() + if "var_4" in d and d["var_4"] is not None: + self._var_4.set(d["var_4"]).wait() + if "var_5" in d and d["var_5"] is not None: + self._var_5.set(d["var_5"]).wait() + if "var_6" in d and d["var_6"] is not None: + self._var_6.set(d["var_6"]).wait() + if "var_7" in d and d["var_7"] is not None: + self._var_7.set(d["var_7"]).wait() + if "var_8" in d and d["var_8"] is not None: + self._var_8.set(d["var_8"]).wait() + if "var_9" in d and d["var_9"] is not None: + self._var_9.set(d["var_9"]).wait() + if "var_10" in d and d["var_10"] is not None: + self._var_10.set(d["var_10"]).wait() + + new = self.read_configuration() + return old, new + + def arm(self): + """Bluesky-style stage + + Since configuration synchronization is not guaranteed, this does + nothing. The script launched by kickoff(). + """ + + def on_kickoff(self, timeout=1) -> SubscriptionStatus: + """Kick off the set program""" + self.start_command.set(1).wait() + + # Define wait until the busy flag goes high + def is_busy(*, value, **_): + return bool(value == 0) + + # Subscribe and wait for update + status = SubscriptionStatus(self.scan_done, is_busy, timeout=timeout, settle_time=0.1) + status.wait() + # return status + + def disarm(self, settle_time=0.1): + """Stops current script and releases the axes""" + # Disarm commands + self.scan_command.set(AbrCmd.NONE, settle_time=settle_time).wait() + self.stop_command.set(1).wait() + # Go to direct mode + self.set_axis_mode("direct", settle_time=settle_time) + + def complete(self, timeout=None) -> SubscriptionStatus: + """Waits for task execution + + NOTE: Original complete was raster scanner complete... + """ + + # Define wait until the busy flag goes down (excluding initial update) + def is_idle(*, value, **_): + return bool(value == 1) + + # Subscribe and wait for update + # status = SubscriptionStatus(self.task1, is_idle, timeout=timeout, settle_time=0.5) + status = SubscriptionStatus(self.scan_done, is_idle, timeout=timeout, settle_time=0.5) + return status + + def reset(self, settle_time=0.1, wait_after_reload=1) -> None: + """Resets the Aerotech controller state + + Attempts to reset the currently running measurement task on the A3200 + by stopping current motions, reloading aerobasic programs and going + to DIRECT mode. + + This will stop movements in both DIRECT and MEASURING modes. During the + stop the `status` temporarely goes to ERROR but reverts to OK after a + couple of seconds. + """ + # Disarm commands + self.scan_command.set(AbrCmd.NONE, settle_time=settle_time).wait() + self.stop_command.set(1, settle_time=settle_time) + # Reload tasks + self.taskStop.set(1, settle_time=wait_after_reload).wait() + # Go to direct mode + self.set_axis_mode("direct", settle_time=settle_time) + + # pylint: disable=arguments-differ + def stop(self, settle_time=1.0) -> None: + """Stops current motions""" + # Disarm commands + self.scan_command.set(AbrCmd.NONE, settle_time=settle_time).wait() + self.stop_command.set(1).wait() + # Go to direct mode + self.set_axis_mode("direct", settle_time=settle_time) + + def is_ioc_ok(self): + """Checks execution status""" + return 0 == self.status.get() + + @property + def axis_mode(self): + """Read axis mode""" + return self.axisAxesMode.get() + + # @property + # def shutter(self): + # return self._shutter.get() + + # @shutter.setter + # def shutter(self, value): + # if self.axisAxesMode.get(): + # print("ABR is not in direct mode; cannot manipulate shutter") + # return False + # state = str(state).lower() + # if state not in ["1", "0", "closed", "open"]: + # print("unknown shutter state requested") + # return None + # elif state in ["1", "open"]: + # state = 1 + # elif state == ["0", "closed"]: + # state = 0 + # self._shutter.set(state).wait() + # return state == self._shutter.get() + + def wait_for_movements(self, timeout=60.0): + """Waits for all motor movements""" + t_start = time.time() + t_elapsed = 0 + + while self.is_moving() and t_elapsed < timeout: + t_elapsed = time.time() - t_start + if timeout is not None and t_elapsed > timeout: + raise TimeoutError("Timeout waiting for all axis to stop moving") + time.sleep(0.5) + + def is_moving(self): + """Chechs if all axes are DONE""" + return not ( + self.omega_done.get() + and self.gmx_done.get() + and self.gmy_done.get() + and self.gmz_done.get() + ) + + +if __name__ == "__main__": + abr = AerotechAbrStage(prefix="X06DA-ES", name="abr") + abr.wait_for_connection() diff --git a/pxiii_bec/devices/old/A3200enums.py b/pxiii_bec/devices/old/A3200enums.py new file mode 100644 index 0000000..da3abf9 --- /dev/null +++ b/pxiii_bec/devices/old/A3200enums.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" +Enumerations for the MX specific Aerotech A3200 stage. + +@author: mohacsi_i +""" +# pylint: disable=too-few-public-methods + + +class AbrStatus: + """ABR measurement task status""" + + DONE = 0 + READY = 1 + BUSY = 2 + + +class AbrGridStatus: + """ABR grid scan status""" + + BUSY = 0 + DONE = 1 + + +class AbrMode: + """ABR mode status""" + + DIRECT = 0 + MEASURING = 1 + + +class AbrShutterStatus: + """ABR shutter status""" + + CLOSE = 0 + OPEN = 1 + + +class AbrCmd: + """ABR command table""" + + NONE = 0 + RASTER_SCAN_SIMPLE = 1 + MEASURE_STANDARD = 2 + VERTICAL_LINE_SCAN = 3 + SCREENING = 4 + SUPER_FAST_OMEGA = 5 + STILL_WEDGE = 6 + STILLS = 7 + REPEAT_SINGLE_OSCILLATION = 8 + SINGLE_OSCILLATION = 9 + OLD_FASHIONED = 10 + RASTER_SCAN = 11 + JET_ROTATION = 12 + X_HELICAL = 13 + X_RUNSEQ = 14 + JUNGFRAU = 15 + MSOX = 16 + SLIT_SCAN = 17 + RASTER_SCAN_STILL = 18 + SCAN_SASTT = 19 + SCAN_SASTT_V2 = 20 + SCAN_SASTT_V3 = 21 + + +class AbrAxis: + """ABR axis index""" + + OMEGA = 1 + GMX = 2 + GMY = 3 + GMZ = 4 + STY = 5 + STZ = 6 diff --git a/pxiii_bec/devices/old/A3200utils.py b/pxiii_bec/devices/old/A3200utils.py new file mode 100644 index 0000000..30072dc --- /dev/null +++ b/pxiii_bec/devices/old/A3200utils.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Jun 11 11:28:38 2024 + +@author: mohacsi_i +""" +import types +from collections import OrderedDict +from ophyd import Component, PVPositioner, Signal, EpicsSignal, EpicsSignalRO, Kind, PositionerBase +from ophyd.status import Status, MoveStatus + +from bec_lib import bec_logger + +from .A3200enums import AbrMode + +logger = bec_logger.logger + + +# ABR_DONE = 0 +# ABR_READY = 1 +# ABR_BUSY = 2 + +# GRID_SCAN_BUSY = 0 +# GRID_SCAN_DONE = 1 + +# DIRECT_MODE = 0 +# MEASURING_MODE = 1 + + +class A3200Axis(PVPositioner): + """Positioner wrapper for A3200 axes + + + Positioner wrapper for motors on the Aerotech A3200 controller. As the IOC + does not provide a motor record, this class simply wraps axes into a + standard Ophyd positioner for the BEC. It also has some additional + functionality for error checking and diagnostics. + + Examples + -------- + omega = A3200Axis('X06DA-ES-DF1:OMEGA', base_pv='X06DA-ES') + + Parameters + ---------- + prefix : str + Axis PV name root. + base_pv : str (situational) + IOC PV name root, i.e. X06DA-ES if standalone class. + """ + + USER_ACCESS = ["omove"] + + abr_mode_direct = Component( + EpicsSignal, "-DF1:MODE-DIRECT", put_complete=True, kind=Kind.omitted + ) + abr_mode = Component( + EpicsSignal, "-DF1:AXES-MODE", auto_monitor=True, put_complete=True, kind=Kind.omitted + ) + + # Basic PV positioner interface + done = Component(EpicsSignalRO, "-DONE", auto_monitor=True, kind=Kind.config) + readback = Component(EpicsSignalRO, "-RBV", auto_monitor=True, kind=Kind.hinted) + # Setpoint is one of the two... + setpoint = Component(EpicsSignal, "-SETP", kind=Kind.config) + # setpoint = Component(EpicsSignal, "-VAL", kind=Kind.config) + + velocity = Component(EpicsSignal, "-SETV", kind=Kind.config) + status = Component(EpicsSignalRO, "-STAT", auto_monitor=True, kind=Kind.config) + # PV to issue native relative movements on the A3200 + relmove = Component(EpicsSignal, "-INCP", put_complete=True, kind=Kind.config) + # PV to home axis + home = Component(EpicsSignal, "-HOME", kind=Kind.config) + ishomed = Component(EpicsSignal, "-AS00", kind=Kind.config) + + # HW status words + dshw = Component(EpicsSignalRO, "-DSHW", auto_monitor=True, kind=Kind.normal) + ashw = Component(EpicsSignalRO, "-ASHW", auto_monitor=True, kind=Kind.normal) + fslw = Component(EpicsSignalRO, "-FSLW", auto_monitor=True, kind=Kind.normal) + + # Rock movement + _rock = Component(EpicsSignal, "-ROCK", put_complete=True, kind=Kind.config) + _rock_dist = Component(EpicsSignal, "-RINCP", put_complete=True, kind=Kind.config) + _rock_velo = Component(EpicsSignal, "-RSETV", put_complete=True, kind=Kind.config) + _rock_count = Component(EpicsSignal, "-COUNT", put_complete=True, kind=Kind.config) + # _rock_accel = Component(EpicsSignal, "-RRATE", put_complete=True, kind=Kind.config) + + hlm = Component(Signal, kind=Kind.config) + llm = Component(Signal, kind=Kind.config) + vmin = Component(Signal, kind=Kind.config) + vmax = Component(Signal, kind=Kind.config) + offset = Component(EpicsSignal, "-OFF", put_complete=True, kind=Kind.config) + + # pylint: disable=too-many-arguments + def __init__( + self, + prefix="", + *, + name, + base_pv="", + kind=None, + read_attrs=None, + configuration_attrs=None, + parent=None, + llm=0, + hlm=0, + vmin=0, + vmax=0, + **kwargs, + ): + """__init__ MUST have a full argument list""" + + # Patching the parent's PVs into the axis class to check for direct/locked mode + if parent is None: + + def maybe_add_prefix(self, _, kw, suffix): + # Patched not to enforce parent prefix when no parent + if kw in self.add_prefix: + return suffix + return suffix + + self.__class__.__dict__["abr_mode"].maybe_add_prefix = types.MethodType( + maybe_add_prefix, self.__class__.__dict__["abr_mode"] + ) + self.__class__.__dict__["abr_mode_direct"].maybe_add_prefix = types.MethodType( + maybe_add_prefix, self.__class__.__dict__["abr_mode_direct"] + ) + logger.info(self.__class__.__dict__["abr_mode"].kwargs) + self.__class__.__dict__["abr_mode"].suffix = base_pv + "-DF1:AXES-MODE" + self.__class__.__dict__["abr_mode_direct"].suffix = base_pv + "-DF1:MODE-DIRECT" + + super().__init__( + prefix=prefix, + name=name, + kind=kind, + read_attrs=read_attrs, + configuration_attrs=configuration_attrs, + parent=parent, + **kwargs, + ) + self.llm.set(llm).wait() + self.hlm.set(hlm).wait() + self.vmin.set(vmin).wait() + self.vmax.set(vmax).wait() + + def omove( + self, + position, + wait=True, + timeout=None, + # moved_cb=None, + velocity=None, + relative=False, + direct=False, + **kwargs, + ) -> MoveStatus: + """Native absolute/relative movement on the A3200""" + + # Check if we're in direct movement mode + if self.abr_mode.value not in (AbrMode.DIRECT, "DIRECT"): + if direct: + self.abr_mode_direct.set(1).wait() + else: + raise RuntimeError(f"ABR axis not in direct mode: {self.abr_mode.value}") + + # Before moving, ensure we can stop (if a stop_signal is configured). + if self.stop_signal is not None: + self.stop_signal.wait_for_connection() + + # Set velocity if provided + if velocity is not None: + self.velocity.set(velocity).wait() + + # This is adapted from pv_positioner.py + self.check_value(position) + + # Get MoveStatus from parent of parent + status = PositionerBase.move(self, position=position, timeout=timeout, **kwargs) + + has_done = self.done is not None + if not has_done: + moving_val = 1 - self.done_value + self._move_changed(value=self.done_value) + self._move_changed(value=moving_val) + + try: + if relative: + # Relative movement instead of setpoint + self.relmove.put(position, wait=True) + else: + # Standard absolute movement + self.setpoint.put(position, wait=True) + if wait: + status.wait() + except KeyboardInterrupt: + self.stop() + raise + return status + + def describe(self): + """Workaround to schema expected by the BEC""" + d = super().describe() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def read(self) -> OrderedDict[str, dict]: + """Workaround to schema expected by the BEC""" + d = super().read() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def move(self, position, wait=True, timeout=None, moved_cb=None, **kwargs) -> MoveStatus: + """Exposes the ophyd move command through BEC abstraction""" + return self.omove(position, wait=wait, timeout=timeout, moved_cb=moved_cb, **kwargs) + + def rock(self, distance, counts: int, velocity=None, wait=True) -> Status: + """Repeated single axis zigzag scan I guess PSO should be configured for this""" + + self._rock_dist.put(distance) + self._rock_count.put(counts) + if velocity is not None: + self._rock_velo.put(velocity) + # if acceleration is not None: + # self._rock_accel.put(acceleration) + self._rock.put(1) + + status = super().move(position=distance) + if wait: + status.wait() + return status + + # def is_omega_ok(self): + # """Checks omega axis status""" + # return 0 == self.self.omega.status.get() + + # def is_homed(self): + # """Checks if omega is homed""" + # return 1 == self.omega.is_homed.get() + + # def do_homing(self, wait=True): + # """Execute the homing procedure. + + # Executes the homing procedure on omega and waits (default) until it is completed. + + # TODO: Return a status object to do this wwith futures and monitoring. + + # PARAMETERS + # `wait` true / false if the routine is to wait for the homing to finish. + # """ + # self.omega.home.set(1, settle_time=1).wait() + # if not wait: + # return + # while not self.omega.is_homed(): + # time.sleep(0.2) + + +# Automatically start an axis if directly invoked +if __name__ == "__main__": + omega = A3200Axis(prefix="X06DA-ES-DF1:OMEGA", base_pv="X06DA-ES", name="omega") + omega.wait_for_connection() diff --git a/pxiii_bec/devices/old/NDArrayPreview.py b/pxiii_bec/devices/old/NDArrayPreview.py new file mode 100644 index 0000000..f76c578 --- /dev/null +++ b/pxiii_bec/devices/old/NDArrayPreview.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +""" +``NDArrayPreview`` --- Standalone Preview for ImagePlugin +********************************************************* + +This module provides a standalone object to receive images to ophyd from the +AreaDetector's ImagePlugin. + +Created on Wed Jan 29 2025 + +@author: mohacsi_i +""" +import numpy as np +from ophyd import Device, Component, EpicsSignal, EpicsSignalWithRBV, Kind, Staged +from ophyd.areadetector import NDDerivedSignal + + +from bec_lib import bec_logger + +logger = bec_logger.logger + + +class SilentNDDerivedSignal(NDDerivedSignal): + """Silent version of NDDerivedSignal, it does not spam the terminal on + every defective frame (shit happens, ok?).""" + + def _array_shape_callback(self, **kwargs): + try: + super()._array_shape_callback(**kwargs) + except RuntimeError: + pass + + +class NDArrayPreview(Device): + """Wrapper class around AreaDetector's NDStdArray plugins + + This is a standalone class to display images from AreaDetector's + ImagePlugin without using a parent device. It also offers BEC exposed + methods to transfer image and change image array Kind-ness. + + NOTE: As an explicit request, it can toggle data recording + """ + + # Subscriptions for plotting image + USER_ACCESS = ["image", "savemode"] + SUB_MONITOR = "device_monitor_2d" + _default_sub = SUB_MONITOR + + # Status attributes + min_callback_time = Component( + EpicsSignalWithRBV, "MinCallbackTime", kind=Kind.config, put_complete=True + ) + array_size_x = Component(EpicsSignal, "ArraySize0_RBV", kind=Kind.config) + array_size_y = Component(EpicsSignal, "ArraySize1_RBV", kind=Kind.config) + array_size_z = Component(EpicsSignal, "ArraySize2_RBV", kind=Kind.config) + ndimensions = Component(EpicsSignal, "NDimensions_RBV", kind=Kind.config) + array_data = Component(EpicsSignal, "ArrayData", kind=Kind.omitted) + shaped_image = Component( + SilentNDDerivedSignal, + derived_from="array_data", + shape=("array_size_z", "array_size_y", "array_size_x"), + num_dimensions="ndimensions", + kind=Kind.omitted, + ) + + def read(self): + """Stream out data on every read()""" + if self._staged == Staged.yes: + image = self.shaped_image.get() + self._run_subs(sub_type=self.SUB_MONITOR, value=image) + return super().read() + + def savemode(self, save=False): + """Toggle save mode for the shaped image""" + # pylint: disable=protected-access + if save: + self.shaped_image._kind = Kind.normal + else: + self.shaped_image._kind = Kind.omitted + + def image(self): + """Fallback method in case image streaming fills up the BEC""" + array_size = (self.array_size_z.get(), self.array_size_y.get(), self.array_size_x.get()) + if array_size == (0, 0, 0): + raise RuntimeError("Invalid image; ensure array_callbacks are on") + + if array_size[-1] == 0: + array_size = array_size[:-1] + + image = self.array_data.get() + return np.array(image).reshape(array_size) + + +# Automatically connect to SAMCAM at PXIII if directly invoked +if __name__ == "__main__": + img = NDArrayPreview("X06DA-SAMCAM:image1:", name="samimg") + img.wait_for_connection() diff --git a/pxiii_bec/devices/old/PneumaticValve.py b/pxiii_bec/devices/old/PneumaticValve.py new file mode 100644 index 0000000..83761e5 --- /dev/null +++ b/pxiii_bec/devices/old/PneumaticValve.py @@ -0,0 +1,47 @@ +from ophyd import EpicsSignal +from ophyd.status import SubscriptionStatus + + +class PneumaticValve(EpicsSignal): + """Wrapper around EpicsSignal to wait until reaching target. Use the + status returned by set() to wait until movement is finished. Do NOT + use put if you want to wait, that's a low-level PV write op. + + NOTE: The SET and GET states do not match exactly + """ + + def set(self, value, *, timeout=5, settle_time=0.1): + """Overloaded setter that waits for target state + + NOTE: The SubscriptionStatus callback does not run in put() + """ + # Lazy hardcoded state lookup + target = 1 if value in (1, "Measure") else 2 + + # Define wait until an end state is reached + def on_target(*, value, **_): + return bool(value == target) + + # Subscribe a monitor in advance and wait for update + status = SubscriptionStatus(self, on_target, timeout=timeout, settle_time=0.1) + # Set value to start movement + super().set(value, settle_time=settle_time).wait() + # Return the monitor + return status + + def check_value(self, value): + """Input validation""" + if value not in (0, 1, "Measure", "Park"): + raise ValueError(f"Unsupported pneumatic valve target {value}") + return super().check_value(value) + + +if __name__ == "__main__": + pneum = PneumaticValve( + read_pv="X06DA-ES-BS:GET-POS", + write_pv="X06DA-ES-BS:SET-POS", + auto_monitor=True, + put_complete=True, + name="bspump", + ) + pneum.wait_for_connection() diff --git a/pxiii_bec/devices/old/SamCamDetector.py b/pxiii_bec/devices/old/SamCamDetector.py new file mode 100644 index 0000000..75da5b1 --- /dev/null +++ b/pxiii_bec/devices/old/SamCamDetector.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +""" +``SamCam`` --- Sample Camera control software +********************************************* + +This module provides an object to control the sample camera at the PX III +beamline. The camera should run continously and stream data via ZMQ for +the GUI and alignment scripts. + +Created on Thu Jan 30 2025 + +@author: mohacsi_i +""" +from ophyd import ADComponent +from ophyd_devices.devices.areadetector.cam import GenICam + +# from ophyd_devices.devices.areadetector.plugins import ImagePlugin_V35 +from ophyd_devices.interfaces.base_classes.psi_detector_base import ( + PSIDetectorBase, + CustomDetectorMixin, +) + +from bec_lib import bec_logger + +logger = bec_logger.logger + + +class SamCamSetup(CustomDetectorMixin): + """Simple camera mixin class, the SAMCAM is usually streaming""" + + def on_stage(self): + """Just make sure it's running continously""" + self.parent.cam.acquire.put(1, wait=True) + + def on_unstage(self): + """Should run continously""" + + def on_stop(self): + """Should run continously""" + + +class SamCamDetector(PSIDetectorBase): + """Sample camera device + + The SAMCAM continously streams images to the GUI and sample alignment + scripts via ZMQ. + """ + + custom_prepare_cls = SamCamSetup + + cam = ADComponent(GenICam, "cam1:") + # image = ADComponent(ImagePlugin_V35, "image1:") diff --git a/pxiii_bec/devices/old/SmarGonA.py b/pxiii_bec/devices/old/SmarGonA.py new file mode 100644 index 0000000..aa902d4 --- /dev/null +++ b/pxiii_bec/devices/old/SmarGonA.py @@ -0,0 +1,284 @@ +""" +``SmarGon`` --- SmarGon control software +****************************************** + +The module provides an object to control the SmarGon goniometer axes at PX III. +The SmarGon axes are interfaced as positioners. +""" + +import time +from threading import Thread, Lock +import requests +from requests.adapters import HTTPAdapter, Retry +from collections import OrderedDict +from ophyd import Component, Kind, Signal, PVPositioner +from ophyd.status import SubscriptionStatus + +try: + from bec_lib import bec_logger + + logger = bec_logger.logger +except ModuleNotFoundError: + import logging + + logger = logging.getLogger("SmarGon") + + +# SmarGon contoller can't really handle multiple connections +# Use this mutex to ensure one access at a time +mutex = Lock() + + +class SmarGonSignal(Signal): + """SmarGonSignal (R/W) + + Small helper class to read/write parameters from SmarGon. As there is no + motion status readback from smargopolo, this should be substituted with + setting with 'settle_time'. + """ + + def __init__(self, *args, write_addr="targetSCS", low_limit=None, high_limit=None, **kwargs): + super().__init__(*args, **kwargs) + self.write_addr = write_addr + self.addr = self.parent.name + self._limits = (low_limit, high_limit) + # self.get() + + def put(self, value, *, timestamp=None, **kwargs): + """Overriden put to add communication with smargopolo""" + # Validate new value and get timestamp + self.check_value(value) + if timestamp is None: + timestamp = time.time() + + # Perform the actual write to SmargoPolo + # pylint: disable=protected-access + r = self.parent._go_n_put(f"{self.write_addr}?{self.addr.upper()}={value}") + + # pylint: disable=attribute-defined-outside-init + old_value = self._readback + self._timestamp = timestamp + self._readback = r[self.addr.upper()] + self._value = r[self.addr.upper()] + + # Notify subscribers + self._run_subs( + sub_type=self.SUB_VALUE, old_value=old_value, value=value, timestamp=self._timestamp + ) + + @property + def limits(self): + return self._limits + + def check_value(self, value, **kwargs): + """Check if value falls within limits""" + lol = self.limits[0] + if lol is not None: + if value < lol: + raise ValueError(f"Target {value} outside of limits {self.limits}") + hil = self.limits[1] + if hil is not None: + if value > hil: + raise ValueError(f"Target {value} outside of limits {self.limits}") + + def get(self, **kwargs): + # pylint: disable=protected-access + r = self.parent._go_n_get(self.write_addr) + + # pylint: disable=attribute-defined-outside-init + self._value = r[self.addr.upper()] if isinstance(r, dict) else r + return super().get(**kwargs) + + +class SmarGonSignalRO(Signal): + """Small helper class for read-only parameters PVs from SmarGon. + + Reads and optionally monitors a variable on the SmarGon. + + """ + + def __init__(self, *args, read_addr="readbackSCS", auto_monitor=False, **kwargs): + super().__init__(*args, **kwargs) + self._metadata["write_access"] = False + self.read_addr = read_addr + self.addr = self.parent.name + + if auto_monitor: + self._mon = Thread(target=self.poll, daemon=True) + self._mon.start() + + def get(self, **kwargs): + # pylint: disable=protected-access + r = self.parent._go_n_get(self.read_addr) + + if isinstance(r, dict): + self.put(r[self.addr.upper()], force=True) + else: + self.put(r, force=True) + return self._readback + + def poll(self): + """Fooo""" + time.sleep(2) + while True: + time.sleep(0.25) + try: + self.get() + except requests.ConnectTimeout as ex: + logger.error(f"[{self.name}] {ex}") + + +class SmarGonAxis(PVPositioner): + """SmarGon client deice + + This class controls the SmarGon goniometer via the REST interface. All + SmarGon axes share a common mutex to manage actual HW access. + """ + + USER_ACCESS = ["omove"] + + # Status attributes + sg_url = Component(Signal, kind=Kind.config, metadata={"write_access": False}) + corr = Component(SmarGonSignalRO, read_addr="corr_type", kind=Kind.config) + mode = Component(SmarGonSignalRO, read_addr="mode", kind=Kind.config) + + # Axis parameters + readback = Component(SmarGonSignalRO, kind=Kind.hinted, auto_monitor=True) + setpoint = Component(SmarGonSignal, kind=Kind.normal) + done = Component(Signal, value=1, kind=Kind.normal) + # moving = Component(SmarGonMovingSignalRO, kind=Kind.config) + _tol = 0.001 + + # pylint: disable=too-many-arguments + def __init__( + self, + prefix="SCS", + *, + name, + kind=None, + read_attrs=None, + configuration_attrs=None, + parent=None, + sg_url: str = "http://x06da-smargopolo.psi.ch:3000", + low_limit=None, + high_limit=None, + **kwargs, + ) -> None: + self.__class__.__dict__["readback"].kwargs["read_addr"] = f"readback{prefix}" + self.__class__.__dict__["setpoint"].kwargs["write_addr"] = f"target{prefix}" + self.__class__.__dict__["setpoint"].kwargs["low_limit"] = low_limit + self.__class__.__dict__["setpoint"].kwargs["high_limit"] = high_limit + self.__class__.__dict__["sg_url"].kwargs["value"] = sg_url + # Fine-tune HTTP connection behavior + # NOTE: SmarGon has a few failed requests every one in a while + self._s = requests.Session() + retries = Retry(total=5, backoff_factor=0.05, status_forcelist=[500, 502, 503, 504]) + self._s.mount("http://", HTTPAdapter(max_retries=retries)) + + super().__init__( + prefix=prefix, + name=name, + kind=kind, + read_attrs=read_attrs, + configuration_attrs=configuration_attrs, + parent=parent, + **kwargs, + ) + + def initialize(self): + """Helper function for initial readings""" + # self.corr.get() + # self.mode.get() + r = self._go_n_get("corr_type") + print(r) + + def move(self, position, wait=True, timeout=None, moved_cb=None): + """Move command that's masked by BEC""" + return self.omove(position, wait, timeout, moved_cb) + + def omove(self, position, wait=True, timeout=2.0, moved_cb=None): + """Original move command without the BEC wrappers""" + status = self.setpoint.set(position, settle_time=0.1) + status.wait() + if not wait: + return status + + def on_target(*, value, **_): + distance = abs(value - self.setpoint._value) + print(f"[self.name] Distance: {distance}") + return bool(distance < self._tol) + + status = SubscriptionStatus(self.readback, on_target, timeout=timeout, settle_time=0.1) + return status + + def describe(self): + """Workaround to schema expected by the BEC""" + d = super().describe() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def read(self) -> OrderedDict[str, dict]: + """Workaround to schema expected by the BEC""" + d = super().read() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def _pos_changed(self, timestamp=None, value=None, **kwargs): + pass + + def _go_n_get(self, address, **kwargs): + """Helper function to connect to smargopolo""" + cmd = f"{self.sg_url.get()}/{address}" + try: + with mutex: + r = self._s.get(cmd, timeout=1, **kwargs) + except TimeoutError: + try: + time.sleep(0.05) + with mutex: + r = self._s.get(cmd, timeout=0.5, **kwargs) + except TimeoutError: + time.sleep(0.05) + with mutex: + r = self._s.get(cmd, timeout=0.5, **kwargs) + if not r.ok: + raise RuntimeError( + f"[{self.name}] Error getting {address}; reply was {r.status_code} => {r.reason}" + ) + return r.json() + + def _go_n_put(self, address, **kwargs): + """Helper function to connect to smargopolo""" + cmd = f"{self.sg_url.get()}/{address}" + try: + with mutex: + r = self._s.put(cmd, timeout=1, **kwargs) + except TimeoutError: + try: + time.sleep(0.05) + with mutex: + r = self._s.put(cmd, timeout=0.5, **kwargs) + except TimeoutError: + time.sleep(0.05) + with mutex: + r = self._s.put(cmd, timeout=0.5, **kwargs) + if not r.ok: + raise RuntimeError( + f"[{self.name}] Error putting {address}; reply was {r.status_code} => {r.reason}" + ) + return r.json() + + +if __name__ == "__main__": + shx = SmarGonAxis(prefix="SCS", name="shx", sg_url="http://x06da-smargopolo.psi.ch:3000") + shy = SmarGonAxis(prefix="SCS", name="shy", sg_url="http://x06da-smargopolo.psi.ch:3000") + shz = SmarGonAxis( + prefix="SCS", + name="shz", + low_limit=10, + high_limit=22, + sg_url="http://x06da-smargopolo.psi.ch:3000", + ) + shx.wait_for_connection() + shy.wait_for_connection() + shz.wait_for_connection() diff --git a/pxiii_bec/devices/old/SmarGonB.py b/pxiii_bec/devices/old/SmarGonB.py new file mode 100644 index 0000000..df50bfa --- /dev/null +++ b/pxiii_bec/devices/old/SmarGonB.py @@ -0,0 +1,249 @@ +""" +``SmarGon`` --- SmarGon control software +****************************************** + +The module provides an object to control the SmarGon goniometer axes at PX III. +The SmarGon axes are interfaced as positioners. +""" + +import time +import threading +from collections import OrderedDict +import requests +from requests.adapters import HTTPAdapter, Retry +from ophyd import Component, Kind, Signal, PVPositioner +from ophyd.status import SubscriptionStatus + +try: + from bec_lib import bec_logger + + logger = bec_logger.logger +except ModuleNotFoundError: + import logging + + logger = logging.getLogger("SmarGon") + + +# SmarGon contoller can't really handle multiple connections +# Use this mutex to ensure one access at a time +mutex = threading.Lock() + + +class LimitedSmarGonSignal(Signal): + """SmarGonSignal (R/W) + + Small helper class to read/write parameters from SmarGon. As there is no + motion status readback from smargopolo, this should be substituted with + setting with 'settle_time'. + """ + + def __init__(self, *args, write_addr="targetSCS", low_limit=None, high_limit=None, **kwargs): + self._limits = (low_limit, high_limit) + super().__init__(*args, **kwargs) + self.write_addr = write_addr + + @property + def limits(self): + return self._limits + + def check_value(self, value, **kwargs): + """Check if value falls within limits""" + lol = self.limits[0] + if lol is not None: + if value < lol: + raise ValueError(f"Target {value} outside of limits {self.limits}") + hil = self.limits[1] + if hil is not None: + if value > hil: + raise ValueError(f"Target {value} outside of limits {self.limits}") + + def put(self, value, *, timestamp=None, force=False, metadata=None, **kwargs): + """Overriden put to add communication with smargopolo""" + # Validate new value and get timestamp + if not force: + self.check_value(value) + if timestamp is None: + timestamp = time.time() + + # Perform the actual write to SmargoPolo + # pylint: disable=protected-access + r = self.parent._go_n_put(f"{self.write_addr}?{self.parent.name.upper()}={value}") + + # pylint: disable=attribute-defined-outside-init + old_value = self._readback + self._timestamp = timestamp + self._readback = r[self.parent.name.upper()] + self._value = r[self.parent.name.upper()] + + # Notify subscribers + self._run_subs( + sub_type=self.SUB_VALUE, old_value=old_value, value=value, timestamp=self._timestamp + ) + + +class SmarGonAxis(PVPositioner): + """SmarGon client deice + + This class controls the SmarGon goniometer via the REST interface. All + SmarGon axes share a common mutex to manage actual HW access. + """ + + USER_ACCESS = ["omove", "oldmove"] + + # Status attributes + sg_url = Component(Signal, kind=Kind.config, metadata={"write_access": False}) + + # Axis parameters + readback = Component(Signal, kind=Kind.hinted, metadata={"write_access": False}) + setpoint = Component(LimitedSmarGonSignal, kind=Kind.normal) + done = Component(Signal, value=1, kind=Kind.normal, metadata={"write_access": False}) + _tol = 0.001 + + # pylint: disable=too-many-arguments + def __init__( + self, + prefix="SCS", + *, + name, + kind=None, + read_attrs=None, + configuration_attrs=None, + parent=None, + sg_url: str = "http://x06da-smargopolo.psi.ch:3000", + low_limit=None, + high_limit=None, + **kwargs, + ) -> None: + # self.__class__.__dict__["setpoint"].kwargs["write_addr"] = f"target{prefix}" + self.__class__.__dict__["setpoint"].kwargs["low_limit"] = low_limit + self.__class__.__dict__["setpoint"].kwargs["high_limit"] = high_limit + self.__class__.__dict__["sg_url"].kwargs["value"] = sg_url + # Fine-tune HTTP connection behavior + # NOTE: SmarGon has a few failed requests every one in a while + self._s = requests.Session() + retries = Retry(total=5, backoff_factor=0.05, status_forcelist=[500, 502, 503, 504]) + self._s.mount("http://", HTTPAdapter(max_retries=retries)) + + super().__init__( + prefix=prefix, + name=name, + kind=kind, + read_attrs=read_attrs, + configuration_attrs=configuration_attrs, + parent=parent, + **kwargs, + ) + + def on_target(): + """Monitors the setpoint and readback and calculates the on_target flag""" + time.sleep(2) + while True: + # Read back target and setpoint values + # pylint: disable=protected-access + r = self._go_n_get("readbackSCS") + rb = r[self.name.upper()] + self.readback.set(rb, force=True).wait() + r = self._go_n_get("targetSCS") + sp = r[self.name.upper()] + self.setpoint._value = sp + # print(f"Readback: {rb}\tSetpoint: {sp}") + # Check if they're within tolerance + distance = abs(rb - sp) + done = 1 if distance < self._tol else 0 + self.done.put(done, force=True) + time.sleep(0.2) + + self._mon = threading.Thread(target=on_target, daemon=True) + self._mon.start() + + def omove(self, position, wait=True, timeout=None, moved_cb=None): + """Move command that's masked by BEC""" + self.done.put(0, force=True) + return self.move(position, wait, timeout, moved_cb) + + def oldmove(self, position, wait=True, timeout=2.0, moved_cb=None): + """Original move command without the BEC wrappers""" + status = self.setpoint.set(position, settle_time=0.1).wait() + if not wait: + return status + + def on_target(*, value, **_): + distance = abs(value - self.setpoint._value) + print(f"[self.name] Distance: {distance}") + return bool(distance < self._tol) + + status = SubscriptionStatus(self.readback, on_target, timeout=timeout, settle_time=0.1) + return status + + def describe(self): + """Workaround to schema expected by the BEC""" + d = super().describe() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def read(self) -> OrderedDict[str, dict]: + """Workaround to schema expected by the BEC""" + d = super().read() + d[str(self.name)] = d[f"{self.name}_readback"] + return d + + def _pos_changed(self, timestamp=None, value=None, **kwargs): + """Remove EPICS dependency""" + pass + + def _go_n_get(self, address, **kwargs): + """Helper function to connect to smargopolo""" + cmd = f"{self.sg_url.get()}/{address}" + try: + with mutex: + r = self._s.get(cmd, timeout=1, **kwargs) + except TimeoutError: + try: + time.sleep(0.05) + with mutex: + r = self._s.get(cmd, timeout=0.5, **kwargs) + except TimeoutError: + time.sleep(0.05) + with mutex: + r = self._s.get(cmd, timeout=0.5, **kwargs) + if not r.ok: + raise RuntimeError( + f"[{self.name}] Error getting {address}; reply was {r.status_code} => {r.reason}" + ) + return r.json() + + def _go_n_put(self, address, **kwargs): + """Helper function to connect to smargopolo""" + cmd = f"{self.sg_url.get()}/{address}" + try: + with mutex: + r = self._s.put(cmd, timeout=1, **kwargs) + except TimeoutError: + try: + time.sleep(0.05) + with mutex: + r = self._s.put(cmd, timeout=0.5, **kwargs) + except TimeoutError: + time.sleep(0.05) + with mutex: + r = self._s.put(cmd, timeout=0.5, **kwargs) + if not r.ok: + raise RuntimeError( + f"[{self.name}] Error putting {address}; reply was {r.status_code} => {r.reason}" + ) + return r.json() + + +if __name__ == "__main__": + shx = SmarGonAxis(prefix="SCS", name="shx", sg_url="http://x06da-smargopolo.psi.ch:3000") + shy = SmarGonAxis(prefix="SCS", name="shy", sg_url="http://x06da-smargopolo.psi.ch:3000") + shz = SmarGonAxis( + prefix="SCS", + name="shz", + low_limit=10, + high_limit=22, + sg_url="http://x06da-smargopolo.psi.ch:3000", + ) + shx.wait_for_connection() + shy.wait_for_connection() + shz.wait_for_connection() diff --git a/pxiii_bec/devices/old/SmarGon_orig.py b/pxiii_bec/devices/old/SmarGon_orig.py new file mode 100644 index 0000000..fb0066a --- /dev/null +++ b/pxiii_bec/devices/old/SmarGon_orig.py @@ -0,0 +1,393 @@ +# #!/usr/bin/env python3 + +# from time import sleep, time +# from typing import Tuple + +# from requests import get, put + +# from beamline import beamline +# from mx_redis import SMARGON + +# try: +# from mx_preferences import get_config + +# host = get_config(beamline)["smargon"]["host"] +# port = get_config(beamline)["smargon"]["port"] +# except Exception: +# host = "x06da-smargopolo.psi.ch" +# port = 3000 +# base = f"http://{host}:{port}" + + +# def gonget(thing: str, **kwargs) -> dict: +# """issue a GET for some API component on the smargopolo server""" +# cmd = f"{base}/{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# r = get(cmd) +# if not r.ok: +# raise Exception(f"error getting {thing}; server returned {r.status_code} => {r.reason}") +# return r.json() + + +# def gonput(thing: str, **kwargs): +# """issue a PUT for some API component on the smargopolo server""" +# cmd = f"{base}/{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# put(cmd) + + +# def scsput(**kwargs): +# """ +# Issue a new absolute target in the SH coordinate system. + +# The key "verbose" may be passed in kwargs with any true +# value for verbose behaviour. + + +# :param kwargs: a dict containing keys ("shx", "shy", "shz", "chi", "phi") +# :type kwargs: dict +# :return: +# :rtype: +# """ +# xyz = { +# k.upper(): v for k, v in kwargs.items() if k.lower() in ("shx", "shy", "shz", "chi", "phi") +# } +# thing = "&".join([f"{k.upper()}={float(v):.5f}" for k, v in xyz.items()]) +# cmd = f"{base}/targetSCS?{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# put(cmd) + + +# def bcsput(**kwargs): +# """ +# Issue a new absolute target in the beamline coordinate system. + +# The key "verbose" may be passed in kwargs with any true +# value for verbose behaviour. + + +# :param kwargs: a dict containing keys ("bx", "by", "bz", "chi", "phi") +# :return: +# :rtype: +# """ +# xyz = {k.upper(): v for k, v in kwargs.items() if k.lower() in ("bx", "by", "bz", "chi", "phi")} +# thing = "&".join([f"{k.upper()}={float(v):.5f}" for k, v in xyz.items()]) +# cmd = f"{base}/targetBCS?{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# put(cmd) + + +# def scsrelput(**kwargs) -> None: +# """ +# Issue relative increments to current SH coordinate system. + +# The key "verbose" may be passed in kwargs with any true +# value for verbose behaviour. + + +# :param kwargs: a dict containing keys ("shx", "shy", "shz", "chi", "phi") +# :type kwargs: dict +# :return: +# :rtype: +# """ +# xyz = { +# k.upper(): v for k, v in kwargs.items() if k.lower() in ("shx", "shy", "shz", "chi", "phi") +# } +# thing = "&".join([f"{k.upper()}={float(v):.5f}" for k, v in xyz.items()]) +# cmd = f"{base}/targetSCS_rel?{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# put(cmd) + + +# def bcsrelput(**kwargs): +# """ +# Issue relative increments to current beamline coordinate system. + +# The key "verbose" may be passed in kwargs with any true +# value for verbose behaviour. + +# :param kwargs: a dict containing keys ("bx", "by", "bz") +# :type kwargs: dict +# :return: +# :rtype: +# """ +# xyz = {k.upper(): v for k, v in kwargs.items() if k.lower() in ("bx", "by", "bz")} +# thing = "&".join([f"{k.upper()}={float(v):.5f}" for k, v in xyz.items()]) +# cmd = f"{base}/targetBCS_rel?{thing}" +# if kwargs.get("verbose", False): +# print(cmd) +# put(cmd) + + +# # url_redis = f"{beamline}-cons-705.psi.ch" +# # print(f"connecting to redis DB #3 on host: {url_redis}") +# # redis_handle = redis.StrictRedis(host=url_redis, db=3) +# # pubsub = redis_handle.pubsub() + +# MODE_UNINITIALIZED = 0 +# MODE_INITIALIZING = 1 +# MODE_READY = 2 +# MODE_ERROR = 99 + + +# class SmarGon(object): +# def __init__(self): +# super(SmarGon, self).__init__() +# self.__dict__.update(target=None) +# self.__dict__.update(bookmarks={}) +# self.__dict__.update(_latest_message={}) +# # pubsub.psubscribe(**{f"__keyspace@{SMARGON.value}__:*": self._cb_readbackSCS}) +# # pubsub.run_in_thread(sleep_time=0.5, daemon=True) + +# def __repr__(self): +# BX, BY, BZ, OMEGA, CHI, PHI, a, b, c = self.readback_bcs().values() +# return f"<{self.__class__.__name__} X={BX:.3f}, Y={BY:.3f}, Z={BZ:.3f}, CHI={CHI:.3f}, PHI={PHI:.3f}, OMEGA={OMEGA:.3f}>" + +# def _cb_readbackSCS(self, msg): +# if msg["data"] in ["hset"]: +# self._latest_message = msg + +# def move_home(self, wait=False) -> None: +# """move to beamline coordinate system X, Y, Z, Chi, Phi = 0 0 0 0 0""" +# self.apply_bookmark_sh({"shx": 0.0, "shy": 0.0, "shz": 18.0, "chi": 0.0, "phi": 0.0}) +# if wait: +# self.wait_home() + +# def xyz(self, coords: Tuple[float, float, float], wait: bool = True) -> None: +# """ +# Move smargon in absolute beamline coordinates + +# :param coords: a tuple of floats representing X, Y, Z coordinates +# :type coords: +# :param wait: +# :type wait: +# :return: +# :rtype: +# """ +# x, y, z = coords +# # the two steps below are necessary otherwise the control system +# # remembers *a* previous CHI +# bcs = self.bcs +# bcs.update({"BX": x, "BY": y, "BZ": z}) +# self.bcs = bcs +# if wait: +# self.wait() + +# def wait_home(self, timeout: float = 20.0) -> None: +# """ +# wait for the smargon to reach its home position: +# SHX = 0.0 +# SHY = 0.0 +# SHZ = 18.0 +# CHI = 0.0 +# PHI = 0.0 + +# :param timeout: time to wait for positions to be reached raises TimeoutError if timeout reached +# :type timeout: float +# :return: +# :rtype: +# """ +# tout = timeout + time() +# in_place = [False, False] +# rbv = -999.0 +# while not all(in_place) and time() < tout: +# rbv = self.readback_scs() +# in_place = [] +# for k, v in {"SHX": 0.0, "SHY": 0.0, "SHZ": 18.0, "CHI": 0.0, "PHI": 0.0}.items(): +# in_place.append(abs(rbv[k] - v) < 0.01) +# if time() > tout: +# raise TimeoutError(f"timeout waiting for smargon to reach home position: {rbv}") + +# def push_bookmark(self): +# """ +# save current absolute coordinates in FIFO stack +# :return: +# :rtype: +# """ +# t = round(time()) +# self.bookmarks[t] = self.readback_scs() + +# def pop_bookmark(self): +# return self.bookmarks.popitem()[1] + +# def apply_bookmark_sh(self, scs): +# scsput(**scs) + +# def apply_last_bookmark_sh(self): +# scs = self.pop_bookmark() +# scsput(**scs) + +# def readback_mcs(self): +# """current motor positions of the smargon sliders""" +# return gonget("readbackMCS") + +# def readback_scs(self): +# """current SH coordinates of the smargon model""" +# return gonget("readbackSCS") + +# def readback_bcs(self): +# """current beamline coordinates of the smargon""" +# return gonget("readbackBCS") + +# def target_scs(self): +# """currently assigned targets for the smargon control system""" +# return gonget("targetSCS") + +# def initialize(self): +# """initialize the smargon""" +# self.set_mode(MODE_UNINITIALIZED) +# sleep(0.1) +# self.set_mode(MODE_INITIALIZING) + +# def set_mode(self, mode: int): +# """put smargon control system in a given mode +# MODE_UNINITIALIZED = 0 +# MODE_INITIALIZING = 1 +# MODE_READY = 2 +# MODE_ERROR = 99 +# """ +# gonput(f"mode?mode={mode}") + +# def enable_correction(self): +# """enable calibration based corrections""" +# gonput("corr_type?corr_type=1") + +# def disable_correction(self): +# """disable calibration based corrections""" +# gonput("corr_type?corr_type=0") + +# def chi(self, val=None, wait=False): +# if val is None: +# return self.readback_scs()["CHI"] +# scsput(CHI=val) +# if wait: +# timeout = 10 + time() +# while time() < timeout: +# if abs(val - self.readback_scs()["CHI"]) < 0.1: +# break +# if time() > timeout: +# raise RuntimeError(f"SmarGon CHI did not reach requested target {val} in time") + +# def phi(self, val=None, wait=False): +# if val is None: +# return self.readback_scs()["PHI"] +# scsput(PHI=val) +# if wait: +# timeout = 70 + time() +# while time() < timeout: +# if abs(val - self.readback_scs()["PHI"]) < 0.1: +# break +# if time() > timeout: +# raise RuntimeError(f"SmarGon PHI did not reach requested target {val} in time") + +# def wait(self, timeout=60.0): +# """waits up to `timeout` seconds for smargon to reach target""" +# target = { +# k.upper(): v +# for k, v in self.target_scs().items() +# if k.lower() in ("shx", "shy", "shz", "chi", "phi") +# } + +# timeout = timeout + time() +# while time() < timeout: +# s = { +# k: (abs(v - target[k]) < 0.01) +# for k, v in self.readback_scs().items() +# if k.upper() in ("SHX", "SHY", "SHZ", "CHI", "PHI") +# } +# if all(list(s.values())): +# break +# if time() > timeout: +# raise TimeoutError("timed out waiting for smargon to reach target") + +# def __setattr__(self, key, value): +# key = key.lower() +# if key == "mode": +# self.set_mode(value) +# elif key == "correction": +# assert value in ( +# 0, +# 1, +# False, +# True, +# ), "correction is either 1 or True (enabled) or 0 (disabled)" +# gonput(f"corr_type?corr_type?{value}") +# elif key == "scs": +# scsput(**value) +# elif key == "bcs": +# bcsput(**value) +# elif key == "target": +# if not isinstance(value, dict): +# raise Exception( +# f"expected a dict with target axis and values got something else: {value}" +# ) +# for k in value.keys(): +# if k.lower() not in "shx shy shz chi phi ox oy oz".split(): +# raise Exception(f'unknown axis in target "{k}"') +# scsput(**value) +# elif key in "shx shy shz chi phi ox oy oz".split(): +# scsput(**{key: value}) +# elif key in "bx by bz".split(): +# bcs = self.readback_bcs() +# bcs[key] = value +# bcsput(**bcs) +# else: +# self.__dict__[key].update(value) + +# def __getattr__(self, key): +# key = key.lower() +# if key == "mode": +# return self.readback_mcs()["mode"] +# elif key == "correction": +# return gonget("corr_type") +# elif key == "bcs": +# return self.readback_bcs() +# elif key == "mcs": +# return self.readback_mcs() +# elif key == "scs": +# return self.readback_scs() +# elif key in "shx shy shz chi phi ox oy oz".split(): +# return self.readback_scs()[key.upper()] +# elif key in "bx by bz".split(): +# return self.readback_bcs()[key.upper()] +# else: +# return self.__getattribute__(key) + + +# if __name__ == "__main__": +# import argparse + +# parser = argparse.ArgumentParser(description="SmarGon client") +# parser.add_argument("-i", "--initialize", help="initialize smargon", action="store_true") +# args = parser.parse_args() + +# smargon = SmarGon() + +# if args.initialize: +# print("initializing smargon device") +# import Aerotech + +# print("moving aerotech back by 50mm") +# abr = Aerotech.Abr() + +# abr.incr_x(-50.0, wait=True, velo=100.0) + +# print("issuing init command to smargon") +# smargon.initialize() +# sleep(0.5) + +# print("waiting for init routine to complete") +# while MODE_READY != smargon.mode: +# sleep(0.5) + +# print("moving smargon to HOME position") +# smargon.move_home() + +# print("moving aerotech to its previous position") +# abr.incr_x(50.0, wait=True, velo=100.0) +# exit(0) diff --git a/pxiii_bec/devices/old/StdDaqPreview.py b/pxiii_bec/devices/old/StdDaqPreview.py new file mode 100644 index 0000000..afe4559 --- /dev/null +++ b/pxiii_bec/devices/old/StdDaqPreview.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +""" +Standard DAQ preview image stream module + +Created on Thu Jun 27 17:28:43 2024 + +@author: mohacsi_i +""" +import json +from time import sleep, time +from threading import Thread +import zmq +import numpy as np +from ophyd import Device, Signal, Component, Kind +from ophyd_devices.interfaces.base_classes.psi_detector_base import ( + CustomDetectorMixin, + PSIDetectorBase, +) + +from bec_lib import bec_logger + +logger = bec_logger.logger +ZMQ_TOPIC_FILTER = b"" + + +class StdDaqPreviewMixin(CustomDetectorMixin): + """Setup class for the standard DAQ preview stream + + Parent class: CustomDetectorMixin + """ + + _mon = None + + def on_stage(self): + """Start listening for preview data stream""" + if self._mon is not None: + self.parent.unstage() + sleep(0.5) + + logger.info(f"[{self.parent.name}] Attaching monitor to {self.parent.url.get()}") + self.parent.connect() + self._stop_polling = False + self._mon = Thread(target=self.poll, daemon=True) + self._mon.start() + + def on_unstage(self): + """Stop a running preview""" + if self._mon is not None: + self._stop_polling = True + # Might hang on recv_multipart + self._mon.join(timeout=1) + # So also disconnect the socket + try: + # pylint: disable=protected-access + self.parent._socket.disconnect(self.parent.url.get()) + except zmq.error.ZMQError: + # Might be already closed + pass + + def on_stop(self): + """Stop a running preview""" + self.on_unstage() + + def poll(self): + """Collect streamed updates""" + try: + t_last = time() + while True: + try: + # Exit loop and finish monitoring + if self._stop_polling: + logger.info(f"[{self.parent.name}]\tDetaching monitor") + break + + # pylint: disable=no-member + # pylint: disable=protected-access + r = self.parent._socket.recv_multipart(flags=zmq.NOBLOCK) + + # Length and throtling checks + if len(r) != 2: + logger.warning( + f"[{self.parent.name}] Received malformed array of length {len(r)}" + ) + t_curr = time() + t_elapsed = t_curr - t_last + if t_elapsed < self.parent.throttle.get(): + sleep(0.1) + continue + + # Unpack the Array V1 reply to metadata and array data + meta, data = r + + # Update image and update subscribers + header = json.loads(meta) + image = np.frombuffer(data, dtype=header["type"]) + if image.size != np.prod(header["shape"]): + err = f"Unexpected array size of {image.size} for header: {header}" + raise ValueError(err) + image = image.reshape(header["shape"]) + + # Update image and update subscribers + self.parent.array_counter.put(header["frame"], force=True) + self.parent.ndimensions.put(len(header["shape"]), force=True) + self.parent.array_size.put(header["shape"], force=True) + # self.parent.array_data.put(data, force=True) + self.parent.shaped_image.put(image, force=True) + + # pylint: disable=protected-access + self.parent._last_image = image + self.parent._run_subs(sub_type=self.parent.SUB_MONITOR, value=image) + t_last = t_curr + logger.info( + f"[{self.parent.name}] Updated frame {header['frame']}\t" + f"Shape: {header['shape']}\tMean: {np.mean(image):.3f}" + ) + except ValueError: + # Happens when ZMQ partially delivers the multipart message + pass + except zmq.error.Again: + # Happens when receive queue is empty + sleep(0.1) + except Exception as ex: + logger.info(f"[{self.parent.name}]\t{str(ex)}") + raise + finally: + self._mon = None + logger.info(f"[{self.parent.name}]\tDetaching monitor") + + +class StdDaqPreviewDetector(PSIDetectorBase): + """Detector wrapper class around the StdDaq preview image stream. + + This was meant to provide live image stream directly from the StdDAQ but + also works with other ARRAY v1 streamers, like the AreaDetector ZMQ plugin. + Note that the preview stream must be already throtled in order to cope with + the incoming data and the python class might throttle it further. + + NOTE: As an explicit request, it does not record the image data. + + You can add a preview widget to the dock by: + cam_widget = gui.add_dock('cam_dock1').add_widget('BECFigure').image('daq_stream1') + """ + + # Subscriptions for plotting image + USER_ACCESS = ["image", "savemode"] + SUB_MONITOR = "device_monitor_2d" + _default_sub = SUB_MONITOR + + custom_prepare_cls = StdDaqPreviewMixin + + # Configuration attributes + url = Component(Signal, kind=Kind.config, metadata={"write_access": False}) + throttle = Component(Signal, value=0.25, kind=Kind.config) + # Streamed data status + array_counter = Component(Signal, kind=Kind.hinted, metadata={"write_access": False}) + ndimensions = Component(Signal, kind=Kind.normal, metadata={"write_access": False}) + array_size = Component(Signal, kind=Kind.normal, metadata={"write_access": False}) + # array_data = Component(Signal, kind=Kind.omitted, metadata={"write_access": False}) + shaped_image = Component(Signal, kind=Kind.omitted, metadata={"write_access": False}) + _last_image = None + + def __init__( + self, *args, url: str = "tcp://129.129.95.38:20000", parent: Device = None, **kwargs + ) -> None: + super().__init__(*args, parent=parent, **kwargs) + self.url.set(url, force=True).wait() + # Connect to the DAQ + self.connect() + + def connect(self): + """Connect to te StDAQs PUB-SUB streaming interface + + StdDAQ may reject connection for a few seconds when it restarts, + so if it fails, wait a bit and try to connect again. + """ + # pylint: disable=no-member + # Socket to talk to server + context = zmq.Context() + self._socket = context.socket(zmq.SUB) + self._socket.setsockopt(zmq.SUBSCRIBE, ZMQ_TOPIC_FILTER) + try: + self._socket.connect(self.url.get()) + except ConnectionRefusedError: + sleep(1) + self._socket.connect(self.url.get()) + + def savemode(self, save=False): + """Toggle save mode for the shaped image""" + # pylint: disable=protected-access + if save: + self.shaped_image._kind = Kind.normal + else: + self.shaped_image._kind = Kind.omitted + + def image(self): + """ + Gets the last image as an attribute in case image must be abandoned + due to some caching on the BEC. + """ + return self._last_image + + +# Automatically connect to MicroSAXS testbench if directly invoked +if __name__ == "__main__": + daq = StdDaqPreviewDetector(url="tcp://129.129.95.111:20000", name="preview") + daq.wait_for_connection() diff --git a/pxiii_bec/devices/old/__init__.py b/pxiii_bec/devices/old/__init__.py new file mode 100644 index 0000000..f68521a --- /dev/null +++ b/pxiii_bec/devices/old/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" +Ophyd devices for the PX III beamline, including the MX specific Aerotech A3200 stage. + +@author: mohacsi_i +""" +from .A3200 import AerotechAbrStage +from .A3200utils import A3200Axis +from .SmarGonA import SmarGonAxis as SmarGonAxisA +from .SmarGonB import SmarGonAxis as SmarGonAxisB +from .StdDaqPreview import StdDaqPreviewDetector +from .NDArrayPreview import NDArrayPreview +from .SamCamDetector import SamCamDetector +from .PneumaticValve import PneumaticValve diff --git a/pxiii_bec/devices/old/aerotech.py b/pxiii_bec/devices/old/aerotech.py new file mode 100644 index 0000000..3189733 --- /dev/null +++ b/pxiii_bec/devices/old/aerotech.py @@ -0,0 +1,43 @@ +from ophyd import Component as Cpt + +from .http import TIMESTAMP_ID, HttpDeviceController, HttpDeviceSignal, HttpOphydDevice + + +class AerotechController(HttpDeviceController): + _readback_endpoint = "/status" + _target_endpoint = "/position" + + def __init__(self, *, prefix, **kwargs): + self._readbacks: dict[str, dict[str, float | bool]] = {} + super().__init__(prefix=prefix, **kwargs) + + def put(self, axis: str, val: float): + self._rest_post(body={axis: val}) + + def get_readback(self, axis_id: str) -> tuple[float, float] | None: + with self._readback_lock: + if axis_id not in self._readbacks or TIMESTAMP_ID not in self._readbacks: + return None + return self._readbacks.get(axis_id)["pos"], self._readbacks.get(TIMESTAMP_ID) # type: ignore + + +class Aerotech(HttpOphydDevice): + controller_class = AerotechController + + x = Cpt(HttpDeviceSignal, axis_identifier="x", tolerance=0.01) + y = Cpt(HttpDeviceSignal, axis_identifier="y", tolerance=0.01) + z = Cpt(HttpDeviceSignal, axis_identifier="z", tolerance=0.01) + u = Cpt(HttpDeviceSignal, axis_identifier="u", tolerance=0.01) + vel_u_deg_s = Cpt(HttpDeviceSignal, axis_identifier="vel_u_deg_s", tolerance=0.01) + + +def _test(): + a = Aerotech(name="aerotech", prefix="http://mx-x06da-queue-01:5234") + a.wait_for_connection() + return a + + +if __name__ == "__main__": + aerotech = _test() + print(aerotech.read()) + aerotech.stop() diff --git a/pxiii_bec/devices/old/http.py b/pxiii_bec/devices/old/http.py new file mode 100644 index 0000000..38b612a --- /dev/null +++ b/pxiii_bec/devices/old/http.py @@ -0,0 +1,178 @@ +import time +from abc import ABC, abstractmethod +from threading import Event, RLock, Thread +from typing import Any + +from ophyd import OphydObject +from ophyd_devices import PSIDeviceBase +from ophyd_devices.utils.socket import SocketSignal +from requests import Response, Session + +TIMESTAMP_ID = "__timestamp" +_POLL_INTERVAL_SLOW = 0.1 + + +class HttpRestError(Exception): + """Error for rest calls from a HttpRestSignal.""" + + def __init__(self, resp: Response, *args: object, value: Any | None = None) -> None: + method, url = resp.request.method, resp.request.url + data = f"{str(value)} to " if value is not None else "" + super().__init__( + f"Could not {method} {data}{url}. Code: {resp.status_code}. Reason: {resp.reason}.", + *args, + ) + + +class HttpDeviceController(OphydObject, ABC): + """Controller to consolidate polling loops and other REST calls for devices which communicate + with HTTP REST interfaces""" + + _readback_endpoint: str + _target_endpoint: str + + def __init__(self, *, prefix, **kwargs): + self._readbacks: dict + self._session = Session() + self._prefix = prefix + self._targets = {} + self._signal_registry: set[str] = set() + self._readback_poll_interval: float = _POLL_INTERVAL_SLOW + + super().__init__(**kwargs) + self._setup_readback() + + def _setup_readback(self): + self._stop_monitor_readback_event = Event() + self._readback_lock = RLock() + self._monitor_readback_thread = Thread( + target=self._monitor, + args=[ + self._readback_endpoint, + self._stop_monitor_readback_event, + self._readback_lock, + self._readbacks, + ], + ) + + def manual_update(self): + self._update_reading(self._readback_endpoint, self._readback_lock, self._readbacks) + + def _update_reading(self, endpoint: str, lock: RLock, buffer: dict): + data = self._rest_get(endpoint) + timestamp = time.monotonic() + with lock: + buffer.update(data) + buffer["__timestamp"] = timestamp + + def _monitor(self, endpoint: str, event: Event, lock: RLock, buffer: dict): + while not event.is_set(): + self._update_reading(endpoint, lock, buffer) + time.sleep(self._readback_poll_interval) + + def _clean_monitor(self): + if self._monitor_readback_thread.is_alive(): + self._stop_monitor_readback_event.set() + self._monitor_readback_thread.join(timeout=2) + if self._monitor_readback_thread.is_alive(): + raise RuntimeError("Failed to clean up Aerotech monitor thread.") + + def register(self, axis_id: str): + self._signal_registry.add(axis_id) + + def _rest_get(self, endpoint): + resp = self._session.get(self._prefix + endpoint) + if not resp.ok: + raise HttpRestError(resp) + return resp.json() + + def _rest_put(self, params: dict | None = None, body: dict | None = None): + resp = self._session.put(self._prefix + self._target_endpoint, params=params, json=body) + if not resp.ok: + raise HttpRestError(resp, value=params) + + def _rest_post(self, params: dict | None = None, body: dict | None = None): + resp = self._session.post(self._prefix + self._target_endpoint, params=params, json=body) + if not resp.ok: + raise HttpRestError(resp, value=params) + + def start_monitor(self): + """Start or restart the automonitor thread.""" + self._clean_monitor() + self._setup_readback() + self._monitor_readback_thread.start() + + def monitor_stopped(self): + return not self._monitor_readback_thread.is_alive() + + def put(self, axis: str, val: float): + self._rest_put({axis: val}) + + @abstractmethod + def get_readback(self, axis_id: str) -> tuple[float, float] | None: + """Return a tuple (reading, timestamp) if the axis_id exists""" + + def stop(self): + # There doesn't appear to be a stop endpoint on the server + # Best effort: set the target to the current position + pass + # TODO: self._rest_put(self._readbacks) + + +class HttpDeviceSignal(SocketSignal): + """Ophyd signal which gets and puts to a REST API rather than EPICS PVs, mediated through the Aerotech + Controller""" + + def __init__(self, *args, axis_identifier: str, **kwargs): + super().__init__(*args, **kwargs) + controller: HttpDeviceController | None = getattr(self.root, "controller", None) + if controller is None: + raise TypeError("HttpDeviceSignal must be used in a device with a HttpDeviceController") + self._controller = controller + self._axis_id = axis_identifier + self._controller.register(self._axis_id) + + def _socket_get(self): # type: ignore + self._readback, self.metadata["timestamp"] = self._controller.get_readback( + self._axis_id + ) or (0.0, 0.0) + return self._readback + + def _socket_set(self, val: float): + self._controller.put(self._axis_id, val) + + def get(self, **kwargs): + if self._controller.monitor_stopped(): + self._controller.start_monitor() + return super().get(**kwargs) + + +class HttpOphydDevice(PSIDeviceBase): + controller_class: type[HttpDeviceController] + + def __init__( + self, + *, + name: str, + prefix: str = "", + scan_info=None, + device_manager=None, + **kwargs, + ): + self.controller = self.controller_class(prefix=prefix) + super().__init__( + name=name, + prefix=prefix, + scan_info=scan_info, + device_manager=device_manager, + **kwargs, + ) + + def wait_for_connection(self, **kwargs): # type: ignore + self.controller.start_monitor() + self.controller.manual_update() + return super().wait_for_connection(**kwargs) + + def stop(self, *, success: bool = False) -> None: + self.controller.stop() + return super().stop(success=success) diff --git a/pxiii_bec/devices/old/smargopolo_smargon.py b/pxiii_bec/devices/old/smargopolo_smargon.py new file mode 100644 index 0000000..a7c4618 --- /dev/null +++ b/pxiii_bec/devices/old/smargopolo_smargon.py @@ -0,0 +1,42 @@ +from ophyd import Component as Cpt +from ophyd_devices import PSIDeviceBase + +from .http import HttpDeviceController, HttpDeviceSignal, HttpOphydDevice + +_TIMESTAMP_ID = "__timestamp" +_POLL_INTERVAL_SLOW = 0.1 + + +class SmargonController(HttpDeviceController): + """Controller to consolidate polling loops and other REST calls for the smargon""" + + _readback_endpoint = "/readbackSCS" + _target_endpoint = "/targetSCS" + + def __init__(self, *, prefix, **kwargs): + self._readbacks: dict[str, float] = {} + super().__init__(prefix=prefix, **kwargs) + + def get_readback(self, axis_id: str) -> tuple[float, float] | None: + with self._readback_lock: + if axis_id not in self._readbacks or _TIMESTAMP_ID not in self._readbacks: + return None + return self._readbacks.get(axis_id), self._readbacks.get(_TIMESTAMP_ID) # type: ignore + + def put(self, axis: str, val: float): + self._rest_put(params={axis: val}) + + def stop(self): + # There doesn't appear to be a stop endpoint on the server + # Best effort: set the target to the current position + self._rest_put(params=self._readbacks) + + +class Smargon(HttpOphydDevice): + controller_class = SmargonController + + x = Cpt(HttpDeviceSignal, axis_identifier="SHX", tolerance=0.01) + y = Cpt(HttpDeviceSignal, axis_identifier="SHY", tolerance=0.01) + z = Cpt(HttpDeviceSignal, axis_identifier="SHZ", tolerance=0.01) + phi = Cpt(HttpDeviceSignal, axis_identifier="PHI", tolerance=0.01) + chi = Cpt(HttpDeviceSignal, axis_identifier="CHI", tolerance=0.01) diff --git a/pxiii_bec/macros/daily.py b/pxiii_bec/macros/daily.py new file mode 100644 index 0000000..7baae4a --- /dev/null +++ b/pxiii_bec/macros/daily.py @@ -0,0 +1,2403 @@ +"""Daily setup routine at for local contacts""" + +# ============================================================================= +# Imports / context +# ============================================================================= + +import time +import subprocess +import shlex +import csv +import base64 +import html as html_lib +import numpy as np +from datetime import datetime +from contextlib import contextmanager +from dataclasses import dataclass +# from pxii_bec.scripts import beamline_context as bl +# from pxii_bec.macros.beamline_planner import BeamlineState +import matplotlib.pyplot as plt +from matplotlib.patches import Ellipse + + +@dataclass +class DailySetupContext: + plot1: object + plot2: object + plot3: object + plot4: object + log: object + progress: object + messages: list + progress_state: dict + + +# ============================================================================= +# Main daily setup +# ============================================================================= + + +def daily_setup( + energy=DailySetup.energy, + *, + pre_checks=True, + set_energy=False, #until PXIII energy is tested + mono_scan=True, + move_beam=True, # beam check only to start with + align_beamstop=False, + # measure_beampos=False, + align_collimator=False, + measure_flux=False, + save_scilog=False, +): + """Run selected daily beamline setup tasks.""" + + selected = { + "Pre checks": pre_checks, + "Set energy": set_energy, + "Move beam": move_beam, + "Align beamstop": align_beamstop, + # "Measure beam position": measure_beampos, + "Align collimator": align_collimator, + "Measure flux": measure_flux, + } + + results = {} + setup_start = time.perf_counter() + + ctx = get_daily_setup_context(selected) + + + for task, enabled in selected.items(): + ctx.progress_state[task] = "todo" if enabled else "skipped" + + update_progress(ctx.progress, ctx.progress_state) + update_log(ctx.log, ctx.messages, "Starting daily beamline setup") + + try: + # --------------------------------------------------------- + # Pre-flight checks + # --------------------------------------------------------- + if pre_checks: + with time_step(results, "Pre checks"): + prechecks_ok, results["Pre checks"] = run_pre_checks(ctx) + + # Machine checks are critical: stop daily setup + if not prechecks_ok: + update_log( + ctx.log, + ctx.messages, + f"Daily setup stopped because machine pre-checks failed." + ) + total_duration = time.perf_counter() - setup_start + + if save_scilog: + log_daily_setup_to_scilog( + bec, + results, + ctx.progress_state, + total_duration=total_duration, + messages=ctx.messages, + ) + return results + + # --------------------------------------------------------- + # Set energy + # --------------------------------------------------------- + if set_energy: + with time_step(results, "Set energy"): + results["Set energy"] = run_daily_energy( + energy, + mono_scan, + ctx, + ) + + # --------------------------------------------------------- + # Move beam + # --------------------------------------------------------- + if move_beam: + with time_step(results, "Move beam"): + results["Move beam"] = run_daily_movebeam(ctx) + + # --------------------------------------------------------- + # Align beamstop + # --------------------------------------------------------- + if align_beamstop: + with time_step(results, "Align beamstop"): + results["Align beamstop"] = run_daily_beamstop(ctx) + + # # --------------------------------------------------------- + # # Measure beam position + # # --------------------------------------------------------- + # if measure_beampos: + # with time_step(results, "Measure beam position"): + # results["Measure beam position"] = run_daily_beamposition(ctx) + + # --------------------------------------------------------- + # Align collimator + # --------------------------------------------------------- + if align_collimator: + with time_step(results, "Align collimator"): + results["Align collimator"] = run_daily_collimator(ctx) + + # --------------------------------------------------------- + # Measure flux + # --------------------------------------------------------- + if measure_flux: + with time_step(results, "Measure flux"): + results["Measure flux"] = run_daily_flux(ctx) + + # --------------------------------------------------------- + # Measure time taken + # --------------------------------------------------------- + + total_duration = time.perf_counter() - setup_start + update_log( + ctx.log, + ctx.messages, + f"Total duration: {format_duration(total_duration)}", + ) + + + # --------------------------------------------------------- + # Save daily diagnostic history + # --------------------------------------------------------- + log_daily_setup_to_csv(results) + + # --------------------------------------------------------- + # Save final beam image for HTML report and SciLog + # --------------------------------------------------------- + save_daily_beam_image(results) + + + # --------------------------------------------------------- + # Create and display final HTML report + # --------------------------------------------------------- + + html = create_daily_html_report( + results, + total_duration=total_duration, + messages=ctx.messages, + ) + + ctx.log.set_html_text(html) + + + # --------------------------------------------------------- + # SciLog + # --------------------------------------------------------- + if save_scilog: + log_daily_setup_to_scilog( + bec, + results, + ctx.progress_state, + total_duration=total_duration, + messages=ctx.messages, + ) + + return results + + finally: + print("done") + planner.move_to(BeamlineState.ROBOT_SAMPLE_EXCHANGE) + + +def get_daily_setup_context(tasks=None): + """Get widgets and state used by daily setup tasks.""" + + plot1, plot2, plot3, plot4, log, progress = select_daily_setup_gui() + + # Clear text from previous run + log.set_plain_text("") + progress.set_plain_text("") + + + if tasks is None: + tasks = [ + "Set energy", + "Move beam", + "Align beamstop", + # "Measure beam position", + "Align collimator", + "Measure flux", + "Save new positions to BEC", + ] + + return DailySetupContext( + plot1=plot1, + plot2=plot2, + plot3=plot3, + plot4=plot4, + log=log, + progress=progress, + messages=[], + progress_state={task: "todo" for task in tasks}, + ) + + +# ============================================================================= +# Pre-checks +# ============================================================================= + +def run_pre_checks(ctx): + """Run machine and experimental hutch pre-flight checks. + + Machine checks are critical and stop the setup if they fail. + Experimental hutch checks are advisory and do not stop the setup. + """ + + task = "Pre checks" + + clear_daily_plots() + set_progress( + ctx.progress, + ctx.progress_state, + task, + "running", + ) + + # --------------------------------------------------------- + # Machine checks - critical / fail fast + # --------------------------------------------------------- + machine_result = machine_prechecks() + + result = { + "ok": machine_result["ok"], + "warning": False, + "machine": machine_result, + "experiment_hutch": None, + } + + if not machine_result["ok"]: + update_log( + ctx.log, + ctx.messages, + format_prechecks_for_gui(result), + ) + + set_progress( + ctx.progress, + ctx.progress_state, + task, + "failed", + ) + + return False, result + + # --------------------------------------------------------- + # Experimental hutch checks - advisory + # --------------------------------------------------------- + # eh_result = EH_prechecks() + + # result["experiment_hutch"] = eh_result + + # # EH problems are warnings, not setup failures + # result["ok"] = True + # result["warning"] = not eh_result["ok"] + + # update_log( + # ctx.log, + # ctx.messages, + # format_prechecks_for_gui(result), + # ) + + # status = "warning" if result["warning"] else "done" + + # set_progress( + # ctx.progress, + # ctx.progress_state, + # task, + # status, + # ) + + # # EH warnings do NOT stop daily setup + # return True, result + + +def format_prechecks_for_gui(result): + """Format pre-flight check results for the daily setup GUI.""" + + lines = [] + + mach = result.get("machine") + + if mach is not None: + lines.append("") + + for check in mach["checks"]: + symbol = "✓" if check["ok"] else "✗" + lines.append(f"{symbol} {check['message']}") + + eh = result.get("experiment_hutch") + + if eh is not None: + lines.append("") + + for check in eh["checks"]: + symbol = "✓" if check["ok"] else "✗" + lines.append(f"{symbol} {check['message']}") + + return "\n".join(lines) + + +# -------------------------------------------------------------------------- +# Check machine current and shutter status +# -------------------------------------------------------------------------- +def machine_prechecks(): + """Run machine checks in dependency order. + Stop immediately if any machine check fails""" + + checks = [check_machine_current, + check_attended_mode, + check_fe_shutter, + check_hutch_shutter, + ] + + results = [] + + for check in checks: + result = check() + results.append(result) + + + if result["ok"]: + print(f"✓ {result['message']}") + else: + print(f"✗ {result['message']}") + + return{ + "ok": False, + "message": "Machine checks failed", + "checks": results, + } + + return { + "ok": True, + "message": "Machine checks passed", + "checks": results, + } + + +def check_machine_current(): + """Checks current is >30 mA""" + current = get_value(dev.sls_current) + + if current <= 30: + return { + "ok": False, + "message": f"Machine current too low {current:.1f} mA)", + "current": current, + } + + return { + "ok": True, + "message": f"Machine current OK ({current:.1f} mA)", + "current": current, + } + + + +def check_attended_mode(): + """Check beamline is in attended more""" + mode_pv = PreChecks.mode_pv + state = caget(mode_pv) + + if state == "offline": + return { + "ok": False, + "message": "Beamline is offline, please set to 'attended'", + } + + + return { + "ok": True, + "message": f"Beamline is not offline, (operation mode is {state})", + } + + + +def check_fe_shutter(): + """Check FE shutter is open""" + fe_shutter_pv = PreChecks.fe_shutter_pv + state = caget(fe_shutter_pv) + + if state != "Open": + return { + "ok": False, + "message": "FE shutter is not open'", + } + + return { + "ok": True, + "message": "FE shutter is open", + } + + + +def check_hutch_shutter(): + """Check hutch shutter is open""" + hutch_shutter_pv = PreChecks.hutch_shutter_pv + state = caget(hutch_shutter_pv) + + if state != "OPEN": + return { + "ok": False, + "message": "Hucth shutter is not open'", + } + + return { + "ok": True, + "message": "Hutch shutter is open", + } + + + + +# -------------------------------------------------------------------------- +# Check Experimental Hutch (EH) equipment +# -------------------------------------------------------------------------- +def EH_prechecks(): + """Check experimental hutch devices.""" + + checks = [ + check_xray_eye_out, + check_cryo_temp, + check_detector_height, + check_beamstop_position, + ] + + results = [] + + for check in checks: + result = check() + results.append(result) + + if result["ok"]: + print(f"✓ {result['message']}") + else: + print(f"✗ {result['message']}") + + all_ok = all(result["ok"] for result in results) + + return { + "ok": all_ok, + "message": ( + "Experiment hutch checks passed" + if all_ok + else "Experiment hutch checks require attention" + ), + "checks": results, + } + + +def check_xray_eye_out(): + ss_xi_pv = EHChecks.ss_xi_pv + ss_mot = EHChecks.ss_mot + + state = caget(ss_xi_pv) + try: + if state != "OUT": + umv(ss_mot, -7) + except Exception as exc: + return { + "ok": False, + "message": f"Moving X-ray eye failed: {exc}" + } + return { + "ok": True, + "message": "SS Xray eye is OUT" + } + + +def check_bcubpm(): + pass + +def check_beamstop_position(): + """Check that the beamstop blocks the direct beam. + + If the check fails, align the beamstop and verify again. + """ + + try: + if not planner.is_state(BeamlineState.DET_DIODE): + planner.move_to(BeamlineState.DET_DIODE) + + bl.d["det_cov"].move("close") + dev.transm.put(EnergyDefaults.default_trans) + dev.bcu_shutter.put(1) + + time.sleep(0.5) + + i2 = abs(dev.i2.read()["i2"]["value"]) + cutoff = Beamstop.i2_limit + + # Beamstop already OK + if i2 < cutoff: + return { + "ok": True, + "message": f"Beamstop blocking beam: I2 = {i2:.2e}", + "value": i2, + "realigned": False, + } + + print( + f"Beamstop check failed (I2={i2:.2e}). " + "Running beamstop alignment..." + ) + + # Close shutter before handing over to alignment routine + dev.bcu_shutter.put(0) + + alignment = daily_beamstop() + + if not alignment["ok"]: + return { + "ok": False, + "message": "Beamstop alignment failed", + "value": i2, + "realigned": True, + } + + # Verify after alignment + dev.bcu_shutter.put(1) + time.sleep(0.2) + + i2_after = abs(dev.i2.read()["i2"]["value"]) + + if i2_after < cutoff: + return { + "ok": True, + "message": ( + "Beamstop was misaligned and was successfully " + f"realigned (I2={i2_after:.2e})" + ), + "value": i2_after, + "realigned": True, + } + + return { + "ok": False, + "message": ( + "Beamstop still not blocking beam after alignment " + f"(I2={i2_after:.2e})" + ), + "value": i2_after, + "realigned": True, + } + + except Exception as exc: + return { + "ok": False, + "message": f"Beamstop check failed: {exc}", + } + + finally: + dev.bcu_shutter.put(0) + +def check_cryo_temp(): + cryo_pv = EHChecks.cryo_pv + temp = caget(cryo_pv) + + if temp is None: + return { + "ok":False, + "message": "Could not read cryostream temperature" + } + + if temp >= 110: + return { + "ok": False, + "message": f"Cryostream too warm ({temp} K)" + } + + return { + "ok":True, + "message": f"Cryostream temperature: {temp} K", + } + +def check_detector_height(): + height = get_value(dev.det_y) + tol = 0.1 + if abs(height-62) > tol: + return { + "ok":False, + "message": f"Detector not at operational height. Currently at {height} mm", + } + return { + "ok":True, + "message": f"Detector height: {height:.1f} mm" + } + +# ============================================================================= +# Energy +# ============================================================================= + + +def run_daily_energy(energy, mono_scan, ctx): + """Set beamline energy and log results.""" + + task = "Set energy" + + clear_daily_plots() + set_progress(ctx.progress, ctx.progress_state, task, "running") + + try: + current_energy = get_current_energy() + + if abs(energy - current_energy) > 1: + update_log( + ctx.log, + ctx.messages, + ( + f"\n▶ Changing energy from {current_energy:.0f} " + f"to {energy:.0f} ev.\n" + " Bragg movement is slow - this may take a few minutes. " + "Please wait....." + ), + ) + + result = daily_energy(energy, mono_scan, plot_widget=ctx.plot1) + + except Exception as exc: + result = { + "ok": False, + "message": f"Energy setup failed: {exc}", + } + + + update_log(ctx.log, ctx.messages, format_energy_for_gui(result)) + + status = "done" if result["ok"] else "failed" + + set_progress(ctx.progress, ctx.progress_state, task, status) + + return result + + +def daily_energy(energy, scan_mono, plot_widget=None): + """Set the beamline to the required energy and correct gap""" + + current_energy = get_current_energy() + + if abs(energy - current_energy) > 1: + bl_energy(energy, window_name="DailySetup", plot_widget=plot_widget) + + else: + gap_actual = dev.id_gap.position + gap_req = calc_gap(energy) + + if abs(gap_actual - gap_req) > 0.05: + if dev.id_gap.moving(): + return { + "ok": False, + "message": "Undulator gap is moving", + "energy": current_energy, + } + + umv(dev.id_gap, gap_req) + + if scan_mono: + mono_pitch_scan(window_name="DailySetup", plot_widget=plot_widget) + + new_energy = get_current_energy() + calib_pitch = get_dcm_motors_positions(energy)["dcm_pitch"] + pitch_offset = get_value(dev.dcm_pitch) - calib_pitch + + return { + "ok": True, + "message": f"Beamline energy set to {new_energy:.0f} eV, " + f"pitch offset = {pitch_offset:.3f} mrad", + "energy": new_energy, + "pitch_offset": pitch_offset, + } + + +def format_energy_for_gui(result): + "Format energy change output for Daily GUI" + + icon = "✓" if result["ok"] else "✗" + + return f"\n{icon} {result['message']}" + + + +# ============================================================================= +# Move beam +# ============================================================================= + + +def run_daily_movebeam(ctx): + """Move beam to the scintillator crosshair""" + + task = "Move beam" + + set_progress(ctx.progress, ctx.progress_state, task, "running") + + try: + + result = daily_movebeam() + + except Exception as exc: + result = { + "ok": False, + "message": f"Align beam step failed: {exc}", + } + + if result.get("ok"): + status = "done" + + elif result.get("warning"): + status = "warning" + + else: + status = "failed" + + update_log(ctx.log, ctx.messages, format_movebeam_for_gui(result)) + + set_progress(ctx.progress, ctx.progress_state, task, status) + return result + + +# def daily_movebeam(meas="scint", iterations=5): +# """ +# Move the beam onto the sample-camera crosshair using the VFM and HFM. +# The sample crosshair parameters are defined in BeamMove class. + +# The beam position is measured on the scintillator at 12.5X zoom. +# VFM motor to move the beam vertically is defined in BeamMove class. +# HFM motor to move beam horizontally is defined in BeamMove class. + +# Corrections are repeated until the beam is within tolerance or the +# maximum number of iterations is reached. +# """ + +# if meas != "scint": +# raise ValueError(f"Unknown beam position measurement: {meas}") + +# # ------------------------------------------------------------------ +# # Setup +# # ------------------------------------------------------------------ + +# zoom = BeamMove.zoom +# vfm_mot = BeamMove.vfm_mot +# hfm_mot = BeamMove.hfm_mot + +# x_target = BeamMove.scint_target_x +# y_target = BeamMove.scint_target_y +# tolerance = BeamMove.scint_tolerance + +# # Safety limit for a single mirror-jack correction +# max_move = BeamMove.max_move + +# # Starting mirror positions +# vfm_start = get_value(vfm_mot) +# hfm_start = get_value(hfm_mot) + +# print( +# "Moving beam to scintillator crosshair\n" +# f"Target: X={x_target:.1f}, Y={y_target:.1f} px" +# ) + +# # ------------------------------------------------------------------ +# # Initial measurement +# # ------------------------------------------------------------------ + +# prepare_scint_measurement(zoom=zoom) +# try: +# scint_result = read_scintXY() + +# if not scint_result["ok"]: +# print(f"✗ {scint_result['message']}") +# return { +# "ok": False, +# "warning": True, +# "message": scint_result["message"], +# } + +# x_start = scint_result["X_pixels"] +# y_start = scint_result["Y_pixels"] + +# # ------------------------------------------------------------------ +# # Beam corrections +# # ------------------------------------------------------------------ + +# for i in range(iterations): + +# x = scint_result["X_pixels"] +# y = scint_result["Y_pixels"] + +# diff_x = x_target - x +# diff_y = y_target - y + +# print( +# f"\nCorrection {i + 1}: " +# f"X={x:.2f}, Y={y:.2f} px " +# f"(error X={diff_x:+.2f}, Y={diff_y:+.2f})" +# ) + +# # Already aligned +# if abs(diff_x) <= tolerance and abs(diff_y) <= tolerance: +# print("Beam is within tolerance.") +# break + +# # -------------------------------------------------------------- +# # VFM: vertical beam position +# # -------------------------------------------------------------- + +# if abs(diff_y) > tolerance: + +# current_vfm = get_value(vfm_mot) +# vfm_change = diff_y / BeamMove.scint_y_slope + +# if abs(vfm_change) > max_move: +# message = ( +# f"VFM correction {vfm_change:+.5f} mm exceeds " +# f"maximum allowed move of {max_move:.3f} mm. " +# "Manual check required." +# ) +# print(message) + +# return { +# "ok": False, +# "warning": True, +# "message": message, +# "BeamX": None, +# "BeamY": None, +# } + +# move_with_offset( +# vfm_mot, +# current_vfm + vfm_change, +# ) + +# # Remeasure because VFM movement may also affect X +# scint_result = read_scintXY() + +# if not scint_result["ok"]: +# return { +# "ok": False, +# "warning": True, +# "message": scint_result["message"], +# } + +# x = scint_result["X_pixels"] +# y = scint_result["Y_pixels"] + +# # -------------------------------------------------------------- +# # HFM: horizontal beam position +# # -------------------------------------------------------------- + +# diff_x = x_target - x + +# if abs(diff_x) > tolerance: + +# current_hfm = get_value(hfm_mot) +# hfm_change = diff_x / BeamMove.scint_x_slope + +# if abs(hfm_change) > max_move: +# message = ( +# f"HFM correction {hfm_change:+.5f} mm exceeds " +# f"maximum allowed move of {max_move:.3f} mm. " +# "Manual check required." +# ) +# print(message) + +# return { +# "ok": False, +# "warning": True, +# "message": message, +# "BeamX": None, +# "BeamY": None, +# } + +# move_with_offset( +# hfm_mot, +# current_hfm + hfm_change, +# ) + +# # Measure again ready for next iteration +# scint_result = read_scintXY() + +# if not scint_result["ok"]: +# return { +# "ok": False, +# "warning": True, +# "message": scint_result["message"], +# } + +# # ------------------------------------------------------------------ +# # Final verification +# # ------------------------------------------------------------------ + +# final_scint = read_scintXY(image=True) + +# if not final_scint["ok"]: +# return { +# "ok": False, +# "warning": True, +# "message": final_scint["message"], +# } + +# final_x = final_scint["X_pixels"] +# final_y = final_scint["Y_pixels"] + +# diff_x = x_target - final_x +# diff_y = y_target - final_y + +# beamx = final_scint["X_diff_microns"] +# beamy = final_scint["Y_diff_microns"] + +# final_vfm = get_value(vfm_mot) +# final_hfm = get_value(hfm_mot) + +# success = ( +# abs(diff_x) <= tolerance +# and abs(diff_y) <= tolerance +# ) + +# print( +# f"\nStarting beam position: X={x_start:.2f}, Y={y_start:.2f} px\n" +# f"Final beam position: X={final_x:.2f}, Y={final_y:.2f} px\n" +# f"Final error: X={diff_x:+.2f}, Y={diff_y:+.2f} px\n" +# f"VFM MOT: {vfm_start:.6f} -> {final_vfm:.6f}\n" +# f"HFM MOT: {hfm_start:.6f} -> {final_hfm:.6f}" +# ) + +# if success: +# message = ( +# "Beam aligned\n" +# f"Displacement: Beam X: {beamx:.1f} microns, " +# f"Beam Y: {beamy:.1f} microns" +# ) +# warning = False + +# else: +# message = ( +# f"Beam is not within ±{tolerance:.1f} px after " +# f"{iterations} corrections." +# ) +# warning = True + +# print(message) + +# # ------------------------------------------------------------------ +# # Results +# # ------------------------------------------------------------------ + +# return { +# "ok": success, +# "warning": warning, +# "message": message, +# "BeamX": beamx, +# "BeamY": beamy, +# "FinalX": final_x, +# "FinalY": final_y, +# "X FWHM": final_scint["X_FWHM"], +# "Y FWHM": final_scint["Y_FWHM"], +# "StartX": x_start, +# "StartY": y_start, +# "Initial VFM MOT": vfm_start, +# "Initial HFM MOT": hfm_start, +# "Final VFM MOT": final_vfm, +# "Final HFM MOT": final_hfm, +# "image": final_scint["image"], +# } +# finally: +# finish_scint_measurement() + +def daily_movebeam(meas="scint"): + """Measure beam position relative to the scintillator crosshair.""" + + if meas != "scint": + raise ValueError(f"Unknown beam position measurement: {meas}") + + zoom = BeamMove.zoom + + prepare_scint_measurement(zoom=zoom) + + try: + result = read_scintXY(image=True) + + if not result["ok"]: + return { + "ok": False, + "warning": True, + "message": result["message"], + } + + beamx = result["X_diff_microns"] + beamy = result["Y_diff_microns"] + + return { + "ok": True, + "warning": False, + "message": ( + "Beam position measured\n" + f"Displacement: Beam X: {beamx:.1f} microns, " + f"Beam Y: {beamy:.1f} microns" + ), + "BeamX": beamx, + "BeamY": beamy, + "FinalX": result["X_pixels"], + "FinalY": result["Y_pixels"], + "X FWHM": result["X_FWHM"], + "Y FWHM": result["Y_FWHM"], + "image": result["image"], + } + + finally: + finish_scint_measurement() + +def format_movebeam_for_gui(result): + "Format move beam output for Daily GUI" + + icon = "✓" if result["ok"] else "✗" + return f"\n{icon} {result['message']}" + + +# ============================================================================= +# Beamstop alignment +# ============================================================================= + + +def run_daily_beamstop(ctx): + """Align beamstop and save new positions.""" + + task = "Align beamstop" + + # clear_daily_plots() + set_progress(ctx.progress, ctx.progress_state, task, "running") + + try: + result = daily_beamstop() + + except Exception as exc: + result = { + "ok": False, + "message": f"Beamstop alignment failed: {exc}", + } + + + status = "done" if result["ok"] else "failed" + + update_log(ctx.log, ctx.messages, format_beamstop_for_gui(result)) + + # save_current_position(dev.bs_x, "in") + # save_current_position(dev.bs_y, "in") + + set_progress(ctx.progress, ctx.progress_state, task, status) + return result + + +def daily_beamstop(): + """Centre the beamstop against the detector cover diode, i2""" + + plot1, plot2, plot3, plot4, log, progress = select_daily_setup_gui() + + result = {} + + dev.transm.put(EnergyDefaults.default_trans) + + try: + if not planner.is_state(BeamlineState.DET_DIODE): + planner.move_to(BeamlineState.DET_DIODE) + + bl.d["det_cov"].move("close") + dev.bcu_shutter.put(1) + + time.sleep(0.2) + + # Centre Y + y_result = find_feature( + dev.bs_y, + dev.i2, + -1, + 1, + 30, + settle=0.3, + feature="dip", + relative=True, + confirm=False, + window_name="DailySetup", + plot_widget=plot2, + ) + # Wait for bs_y to setlle + time.sleep(2) + # Centre X + x_result = find_feature( + dev.bs_x, + dev.i2, + -0.2, + 1.2, + 30, + feature="edge_offset", + offset=Beamstop.x_offset, + relative=True, + confirm=False, + window_name="DailySetup", + plot_widget=plot1, + ) + + result["bs_x_pos"] = x_result["centre"] + result["bs_y_pos"] = y_result["centre"] + result["intensity after alignment"] = read_i2() + + # message = ( + # "Intensity after Y scan: " + # f"{result['intensity after alignment']:.4g}\n" + # f"Centred position is {result["bs_x_pos"]:.5g}, {result["bs_y_pos"]:.5g}" + # ) + + message = f"BS_X: {result['bs_x_pos']:.3g} mm, " f"BS_Y: {result['bs_y_pos']:.3g} mm\n" + + print(message) + + result["ok"] = True + result["message"] = message + + return result + + finally: + dev.bcu_shutter.put(0) + + +def format_beamstop_for_gui(result): + "Format results for beamstop alignment" + icon = "✓" if result["ok"] else "✗" + return f"\n{icon} Beamstop aligned.\n{result['message']}" + + + +# ============================================================================= +# Beam-position measurement +# ============================================================================= + + +def run_daily_beamposition(ctx): + """Measure the beam position at the scintillator at Aare zoom levels""" + + task = "Measure beam position" + set_progress(ctx.progress, ctx.progress_state, task, "running") + + beampos_result = daily_beamposition() + + update_log(ctx.log, ctx.messages, format_beam_position(beampos_result)) + + set_progress(ctx.progress, ctx.progress_state, task, "done") + + return beampos_result + + +def daily_beamposition(): + """Measure beam positions at different zoom levels""" + results = {} + + try: + # set transmission to default + dev.transm.put(EnergyDefaults.default_trans) + + # move to beam visualisation + if not planner.is_state(BeamlineState.BEAM_VISUALISATION): + planner.move_to(BeamlineState.BEAM_VISUALISATION) + + # open shutter + dev.bcu_shutter.put(1) + + for zoom in CameraZoom: + print(f"Moving to {zoom.label}") + umv(dev.scam_zoom, zoom.position) + + # set autoexposure + auto_exposure(cam="samcam", max_iter=25) + time.sleep(0.2) + + # take readings + x = dev.samcam_x.read()["samcam_x"]["value"] + y = dev.samcam_y.read()["samcam_y"]["value"] + + # append results + results[zoom.label] = {"x": x, "y": y} + + print(f" {zoom.label}: x = {x:.4g}, y = {y:.4g}") + + finally: + dev.bcu_shutter.put(0) + + return results + + +def format_beamposition(pos_result): + """Format camera beam positions for display.""" + + lines = [f"{'Zoom':<8} {'X / px':>10} {'Y / px':>10}", "-" * 30] + + for zoom, pos in pos_result.items(): + lines.append(f"{zoom:<8} {pos['x']:>10.1f} {pos['y']:>10.1f}") + + return "\n".join(lines) + + +# ============================================================================= +# Collimator alignment +# ============================================================================= + + +def run_daily_collimator(ctx): + """Align the collimator and save positions""" + + task = "Align collimator" + set_progress(ctx.progress, ctx.progress_state, task, "running") + + try: + result = daily_collimator() + + except Exception as exc: + result = { + "ok": False, + "message": f"Collimator alignment step failed: {exc}" + } + + update_log(ctx.log, ctx.messages, format_collimator_for_gui(result)) + + status = "done" if result["ok"] else "failed" + + set_progress(ctx.progress, ctx.progress_state, task, status) + return result + + +def daily_collimator(): + """Centre the collimator in X and Y using the I1 diode.""" + plot1, plot2, plot3, plot4, log, progress = select_daily_setup_gui() + + result = {} + + try: + if not planner.is_state(BeamlineState.FLUX_MEASUREMENT): + planner.move_to(BeamlineState.FLUX_MEASUREMENT) + + dev.transm.put(EnergyDefaults.default_trans) + dev.bcu_shutter.put(1) + + time.sleep(0.2) + + get_value(dev.i1) + + result["intensity_coll_out"] = get_value(dev.i1) + print(f"Starting intensity is {result["intensity_coll_out"]:.3e}") + + bl.d["coll_y"].move("in") + + # Centre Y + result["start_intensity_coll_in"] = get_value(dev.i1) + print( + "Intensity with collimator in before scans: " f"{result['start_intensity_coll_in']:.3e}" + ) + + y_result = find_feature( + dev.coll_y, + dev.i1, + -0.3, + 0.3, + 30, + feature="peak", + relative=True, + confirm=False, + plot_widget=plot4, + ) + + result["coll_y_pos"] = y_result["centre"] + result["coll_y_width"] = y_result["width"] + + # Centre X + + x_result = find_feature( + dev.coll_x, + dev.i1, + -0.3, + 0.3, + 30, + feature="peak", + relative=True, + confirm=False, + plot_widget=plot3, + ) + + result["coll_x_pos"] = x_result["centre"] + result["final_intensity_coll_in"] = get_value(dev.i1) + result["coll_x_width"] = x_result["width"] + + print( + "Intensity with collimator in after scans: " f"{result['final_intensity_coll_in']:.3e}" + ) + + result["ok"] = True + + message = ( + f"Collimator X: {result['coll_x_pos']:.3f} mm, " + f"Collimator Y: {result['coll_y_pos']:.3f} mm" + ) + + result["message"] = message + + return result + + finally: + dev.bcu_shutter.put(0) + + +def format_collimator_for_gui(result): + """Format collimator result for the Daily Setup GUI.""" + icon = "✓" if result["ok"] else "✗" + return f"\n{icon} Collimator aligned\n{result['message']}" + + + +# ============================================================================= +# Flux measurement +# ============================================================================= + + +def run_daily_flux(ctx): + """Measure the beam intensity using BCU BPM.""" + + task = "Measure flux" + set_progress(ctx.progress, ctx.progress_state, task, "running") + + try: + flux, full_flux = bpm2flux() + + message = ( + f"Intensity at current transmission: " + f"{flux:.2e} ph/s\n" + f"Intensity at 100% transmission: " + f"{full_flux:.2e} ph/s" + ) + + result = {"ok": True, + "message": message, + "current_flux": flux, + "full_flux": full_flux, + } + + except Exception as exc: + result = { + "ok": False, + "message": f"(Flux measurement failed: {exc})", + } + + status = "done" if result["ok"] else "failed" + + update_log(ctx.log, ctx.messages, format_flux_for_gui(result)) + + set_progress(ctx.progress, ctx.progress_state, task, status) + return result + + +def format_flux_for_gui(result): + icon = "✓" if result["ok"] else "✗" + return f"\n{icon} Flux measured\n{result['message']}\n" + +# ============================================================================= +# Daily-setup GUI helpers +# ============================================================================= + + +def select_daily_setup_gui(): + """Return widgets belonging to the Daily Setup GUI.""" + + window_name = "DailySetup" + open_windows = bec.gui.windows + + if open_windows.get(window_name) is None: + gui = bec.gui.new(window_name) + + # Restore the standard Daily Setup layout + gui.load_profile("daily_setup") + + + else: + gui = open_windows[window_name] + + return ( + gui.Plot_1, + gui.Plot_2, + gui.Plot_3, + gui.Plot_4, + gui.Info, + gui.Progress, + ) + + +def clear_daily_plots(): + plot1, plot2, plot3, plot4, log, progress = select_daily_setup_gui() + plot1.clear_all() + plot2.clear_all() + plot3.clear_all() + plot4.clear_all() + + +def update_log(log_box, messages, message): + """Add new message to the daily setup log""" + messages.append(message) + log_box.set_plain_text("\n".join(messages)) + + +def update_progress(progress_box, progress_state): + """Sets up the status icons for the progress tracker""" + status = { + "todo": "\u25cb", + "running": "\u25b6", + "done": "\u2713", + "warning": "\u26a0", + "skipped": "–", + "failed": "\u2717", + } + + text = "\n".join(f"{status[state]} {label}" for label, state in progress_state.items()) + progress_box.set_plain_text(text) + + +def set_progress(progress_box, progress_state, step, status): + """Change the status of one step and update the display.""" + progress_state[step] = status + update_progress(progress_box, progress_state) + + +def plot_daily_setup_scan(motor_name, signal_name, plot="x", title=None): + """Plot live scan data in one of the Daily Setup waveform widgets.""" + + plot1, plot2, plot3, plot4, log, progress = select_daily_setup_gui() + + if plot.lower() == "plot_1": + wf = plot1 + elif plot.lower() == "plot_2": + wf = plot2 + elif plot.lower() == "plot_3": + wf = plot3 + elif plot.lower() == "plot_4": + wf = plot4 + else: + raise ValueError("plot must be 'x' or 'y'") + + wf.clear_all() + + if title is None: + title = f"{motor_name} scan" + + wf.title = title + wf.x_label = motor_name + wf.y_label = signal_name + + wf.plot(device_x=motor_name, device_y=signal_name) + + +# ============================================================================= +# SciLog +# ============================================================================= + + +def log_daily_setup_to_scilog( + bec, + results, + progress_state, + total_duration=None, + messages=None, +): + """Send compact daily setup summary to SciLog.""" + + msg = bec.messaging.scilog.new() + + date = datetime.now().strftime("%-d %B %Y") + + + msg.add_text(f"{DailySetup.beamline_name} Daily Setup — {date}\n\n", bold=True) + + add_prechecks_to_scilog(msg, results) + add_setup_results_to_scilog(msg, results, progress_state) + + msg.add_text("\n") + + overall = get_daily_setup_status(progress_state) + + msg.add_text("Overall status: ", bold=True) + msg.add_text(f"{overall}\n") + + if total_duration is not None: + msg.add_text("Total duration: ", bold=True) + msg.add_text(f"{format_duration(total_duration)}\n") + + # Final beam image, if move_beam produced one + move_result = results.get("Move beam", {}) + image_file = move_result.get("image_file") + + if image_file is not None: + msg.add_text("\nFinal beam position\n", bold=True) + msg.add_attachment(str(image_file), width=600) + + # Preserve the same information shown in the GUI log + if messages: + msg.add_text("\nSetup information\n", bold=True) + for message in messages: + msg.add_text(f"{message}\n") + + msg.add_tags(["daily-setup", DailySetup.beamline_name]) + msg.send() + + # Motor positions snapshot + log_daily_setup_positions(bec) + +def log_daily_setup_positions(bec): + """Record important motor positions after daily setup""" + + vfm_mot = BeamMove.vfm_mot + hfm_mot = BeamMove.hfm_mot + + bec.messaging.scilog.log_positions( + devices=[ + "dcm_bragg", + "dcm_froll", + "dcm_pitch", + "dcm_fpitch", + "vfm_y", + "vfm_pitch", + vfm_mot.name, + "hfm_x", + "hfm_pitch", + hfm_mot.name, + "coll_x", + "bs_x", + "bs_y", + ], + title=f"{DailySetup.beamline_name} Daily Setup - Motor Positions", + tags=["daily_setup", DailySetup.beamline_name, "positions"] + ) + +def add_prechecks_to_scilog(msg, results): + """Add pre-flight checks to the SciLog entry.""" + + if "Pre checks" not in results: + return + + result = results["Pre checks"] + + msg.add_text("Pre-flight\n", bold=True) + + machine = result.get("machine") + + if machine: + for check in machine["checks"]: + status = "OK" if check["ok"] else "FAILED" + msg.add_text( + f"{check['message']:<55} {status}\n" + ) + + eh = result.get("experiment_hutch") + + if eh: + for check in eh["checks"]: + status = "OK" if check["ok"] else "WARNING" + msg.add_text( + f"{check['message']:<55} {status}\n" + ) + + msg.add_text("\n") + +def add_setup_results_to_scilog(msg, results, progress_state): + """Add daily setup task results to SciLog.""" + + msg.add_text("Setup\n", bold=True) + + # --------------------------------------------------------- + # Energy + # --------------------------------------------------------- + if "Set energy" in results: + r = results["Set energy"] + + status = get_result_status("Set energy", r, progress_state) + + if r.get("energy") is not None: + detail = f"{r['energy'] / 1000:.3f} keV" + + if r.get("pitch_offset") is not None: + detail += ( + f", pitch offset = " + f"{r['pitch_offset']:.3f} mrad" + ) + + else: + detail = r.get("message", "") + + add_scilog_result( + msg, + "Set energy", + status, + detail, + ) + + # --------------------------------------------------------- + # Collimator + # --------------------------------------------------------- + if "Align collimator" in results: + r = results["Align collimator"] + + status = get_result_status( + "Align collimator", + r, + progress_state, + ) + + if r.get("ok"): + detail = ( + f"X={r['coll_x_pos']:.3f}, " + f"Y={r['coll_y_pos']:.3f} mm" + ) + else: + detail = r.get("message", "") + + add_scilog_result( + msg, + "Collimator alignment", + status, + detail, + ) + + # --------------------------------------------------------- + # Beamstop + # --------------------------------------------------------- + if "Align beamstop" in results: + r = results["Align beamstop"] + + status = get_result_status( + "Align beamstop", + r, + progress_state, + ) + + if r.get("ok"): + detail = ( + f"X={r['bs_x_pos']:.3f}, " + f"Y={r['bs_y_pos']:.3f} mm" + ) + else: + detail = r.get("message", "") + + add_scilog_result( + msg, + "Beamstop alignment", + status, + detail, + ) + + # --------------------------------------------------------- + # Move beam + # --------------------------------------------------------- + if "Move beam" in results: + r = results["Move beam"] + + status = get_result_status( + "Move beam", + r, + progress_state, + ) + + if r.get("ok"): + detail = ( + f"X={r['BeamX']:.1f}, " + f"Y={r['BeamY']:.1f} µm" + ) + else: + detail = r.get("message", "manual check required") + + add_scilog_result( + msg, + "Move beam", + status, + detail, + ) + + # --------------------------------------------------------- + # Flux + # --------------------------------------------------------- + if "Measure flux" in results: + r = results["Measure flux"] + + status = get_result_status( + "Measure flux", + r, + progress_state, + ) + + if r.get("full_flux") is not None: + detail = f"{r['full_flux']:.2e} ph/s" + else: + detail = r.get("message", "") + + add_scilog_result( + msg, + "Flux", + status, + detail, + ) + +def add_scilog_result(msg, label, status, detail=""): + """Add one formatted setup-result line.""" + + line = f"{label:<24} {status:<8}" + + if detail: + line += f" {detail}" + + msg.add_text(line + "\n") + + +def get_result_status(task, result, progress_state): + """Return human-readable status for a SciLog result.""" + + state = progress_state.get(task) + + if state == "warning": + return "WARNING" + + if state == "failed": + return "FAILED" + + if result.get("ok"): + return "OK" + + return "FAILED" + + +def get_daily_setup_status(progress_state): + """Return overall daily-setup status.""" + + states = progress_state.values() + + if "failed" in states: + return "FAILED" + + if "warning" in states: + return "PASSED WITH WARNINGS" + + return "PASSED" + + +# ============================================================================= +# Save values to csv file +# ============================================================================= +def log_daily_setup_to_csv(results): + """Append key daily setup diagnostics to the beamline history CSV.""" + + vfm_mot = BeamMove.vfm_mot + hfm_mot = BeamMove.hfm_mot + + filename = DailySetup.setup_dir / "daily_beamline_health.csv" + + move_results = results.get("Move beam", {}) + energy_result = results.get("Set energy", {}) + flux_result = results.get("Measure flux", {}) + + row = { + "timestamp": datetime.now().isoformat(timespec="seconds"), + + # Energy / flux + "energy_eV": format_value(energy_result.get("energy"), ".0f"), + "pitch_offset": format_value( + energy_result.get("pitch_offset"), ".3f" + ), + "flux_ph_s": format_value( + flux_result.get("full_flux"), ".2e" + ), + + # Beam position before move_beam + "beam_start_x_px": format_value( + move_results.get("StartX"), ".0f" + ), + "beam_start_y_px": format_value( + move_results.get("StartY"), ".0f" + ), + + # Mirror positions before move_beam + "vfm_mot_start_mm": format_value( + move_results.get("Initial VFM MOT"), ".5f" + ), + "hfm_mot_start_mm": format_value( + move_results.get("Initial HFM MOT"), ".5f" + ), + + # Mirror positions after move_beam + "vfm_mot_final_mm": format_value( + move_results.get("Final VFM MOT"), ".5f" + ), + "hfm_mot_final_mm": format_value( + move_results.get("Final HFM MOT"), ".5f" + ), + + # Final beam displacement from crosshair + "beam_final_x_um": format_value( + move_results.get("BeamX"), ".1f" + ), + "beam_final_y_um": format_value( + move_results.get("BeamY"), ".1f" + ), + + # Current mirror state after daily setup + "vfm_y_mm": format_value(get_value(dev.vfm_y), ".5f"), + "vfm_mot_mm": format_value(get_value(vfm_mot), ".5f"), + "vfm_pitch_mrad": format_value( + get_value(dev.vfm_pitch), ".5f" + ), + + "hfm_x_mm": format_value(get_value(dev.hfm_x), ".5f"), + "hfm_mot_mm": format_value(get_value(hfm_mot), ".5f"), + "hfm_pitch_mrad": format_value( + get_value(dev.hfm_pitch), ".5f" + ), + } + + file_exists = filename.exists() + + with open(filename, "a", newline="", encoding="utf-8") as f: + writer = csv.DictWriter(f, fieldnames=row.keys()) + + if not file_exists: + writer.writeheader() + + writer.writerow(row) + + print(f"✓ Daily beamline history saved to {filename}") + + +# ============================================================================= +# General helpers +# ============================================================================= +def format_value(value, fmt): + """Format a value for CSV file, return an empty string if unavailable""" + if value is None: + return "" + return format(value, fmt) + +def move_with_offset(motor, target, offset=0.002): + """Move motor to target using an overshoot to overcome deadband/backlash.""" + + current = get_value(motor) + dmove = target - current + + if abs(dmove) < 1e-9: + return current + + direction = np.sign(dmove) + overshoot = target + direction * abs(offset) + + umv(motor, overshoot) + umv(motor, target) + + final = get_value(motor) + + print(f"{motor.name}: requested {current:.6f} -> {target:.6f} " f"({dmove * 1000:+.3f} µm)") + print( + f"{motor.name}: actual {current:.6f} -> {final:.6f} " + f"({(final-current) * 1000:+.3f} µm), " + f"error {(final-target) * 1000:+.3f} µm" + ) + + return final + + +def set_zoom(zoom): + """Set sample camera zoom level.""" + + if isinstance(zoom, str): + zoom = CameraZoom.from_label(zoom) + umv(dev.scam_zoom, zoom.position) + else: + umv(dev.scam_zoom, zoom) + + +@contextmanager +def time_step(results, name): + """Time a daily setup step.""" + start = time.perf_counter() + + try: + yield + finally: + elapsed = time.perf_counter() - start + + if name not in results: + results[name] = {} + + results[name]["duration"] = elapsed + + +def format_duration(seconds): + if seconds < 60: + return f"{seconds:.1f} s" + + minutes, seconds = divmod(seconds, 60) + return f"{int(minutes)} min {seconds:.0f} s" + + + +def caget(pv): + """Read an EPICS PV using caget and return its value.""" + + try: + result = subprocess.run( + ["caget", "-t", pv], + capture_output=True, + text=True, + check=True, + timeout=2, + ) + + fields = shlex.split(result.stdout.strip()) + + # Find the PV name and take the value immediately after it + try: + pv_index = fields.index(pv) + value = fields[pv_index + 1] + except (ValueError, IndexError): + return None + + # Convert numeric values to float + try: + return float(value) + except ValueError: + return value + + except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as exc: + print(f"Could not read {pv}: {exc}") + return None + +def save_daily_beam_image(results): + """Save the final beam image with target crosshair to daily_setup_dir. + + The saved PNG is reused by both the HTML report and SciLog. + Returns the filename, or None if no beam image is available. + """ + + move_result = results.get("Move beam") + energy_result = results.get("Set energy") + + if not move_result: + return None + + image = move_result.get("image") + + if image is None: + return None + + # timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = DailySetup.setup_dir / f"daily_beam_{energy_result['energy']:.0f}eV.png" + + fig, ax = plt.subplots(figsize=(8, 6)) + ax.imshow(image) + + x = BeamMove.scint_target_x + y = BeamMove.scint_target_y + length = 40 + gap = 8 + + # Target crosshair + ax.plot([x - length, x - gap], [y, y], color="red", linewidth=1.0) + ax.plot([x + gap, x + length], [y, y], color="red", linewidth=1.0) + ax.plot([x, x], [y - length, y - gap], color="red", linewidth=1.0) + ax.plot([x, x], [y + gap, y + length], color="red", linewidth=1.0) + + ax.axis("off") + + fig.savefig( + filename, + format="png", + bbox_inches="tight", + pad_inches=0, + dpi=150, + ) + plt.close(fig) + + move_result["image_file"] = filename + print(f"✓ Final beam image saved to {filename}") + + return filename + + +def image_file_to_data_uri(filename): + """Convert a PNG file to an embedded HTML data URI.""" + + with open(filename, "rb") as f: + encoded = base64.b64encode(f.read()).decode("ascii") + + return f"data:image/png;base64,{encoded}" + + +def html_status(result): + """Return a simple HTML status for a daily setup result.""" + + if not result: + return "– Not run" + + if result.get("warning"): + return "⚠ Warning" + + if result.get("ok"): + return "✓ OK" + + return "✗ Failed" + + +def html_value(value, fmt="", units=""): + """Safely format a value for the HTML report.""" + + if value is None: + return "–" + + try: + text = format(value, fmt) if fmt else str(value) + except (TypeError, ValueError): + text = str(value) + + return f"{text} {units}".strip() + + +def create_daily_html_report(results, total_duration=None, messages=None): + """Create the final Daily Setup HTML report.""" + + date = datetime.now().strftime("%d %B %Y %H:%M") + + precheck_result = results.get("Pre checks") + energy_result = results.get("Set energy") + move_result = results.get("Move beam") + beamstop_result = results.get("Align beamstop") + collimator_result = results.get("Align collimator") + flux_result = results.get("Measure flux") + + # -------------------------------------------------------------- + # Beam image + # -------------------------------------------------------------- + + image_src = None + + if move_result: + image_file = move_result.get("image_file") + + if image_file is not None: + try: + image_src = image_file_to_data_uri(image_file) + except Exception as exc: + print(f"Could not add beam image to HTML report: {exc}") + + if image_src: + beam_image_html = f""" + Final beam position
+ +++ """ + else: + beam_image_html = """ ++
Final beam position
+ ++ Beam image not available ++ """ + + # -------------------------------------------------------------- + # Detailed results + # -------------------------------------------------------------- + + result_rows = [] + + if energy_result: + result_rows.append( + ( + "Energy", + html_value(energy_result.get("energy"), ".0f", "eV"), + ) + ) + + result_rows.append( + ( + "DCM pitch offset", + html_value( + energy_result.get("pitch_offset"), + ".4f", + "mrad", + ), + ) + ) + + if flux_result: + result_rows.append( + ( + "Flux at 100% transmission", + html_value( + flux_result.get("full_flux"), + ".2e", + "ph/s", + ), + ) + ) + + if move_result: + result_rows.append( + ( + "Beam position", + ( + f"X = {html_value(move_result.get('BeamX'), '.1f', 'µm')}, " + f"Y = {html_value(move_result.get('BeamY'), '.1f', 'µm')}" + ), + ) + ) + + result_rows.append( + ( + "Approximate beam size", + ( + f"{html_value(move_result.get('X FWHM'), '.1f', 'µm')} × " + f"{html_value(move_result.get('Y FWHM'), '.1f', 'µm')}" + ), + ) + ) + + if beamstop_result: + result_rows.append( + ( + "Beamstop position", + ( + f"X = {html_value(beamstop_result.get('bs_x_pos'), '.3f', 'mm')}, " + f"Y = {html_value(beamstop_result.get('bs_y_pos'), '.3f', 'mm')}" + ), + ) + ) + + if collimator_result: + result_rows.append( + ( + "Collimator position", + ( + f"X = {html_value(collimator_result.get('coll_x_pos'), '.3f', 'mm')}, " + f"Y = {html_value(collimator_result.get('coll_y_pos'), '.3f', 'mm')}" + ), + ) + ) + + result_rows_html = "\n".join( + f""" ++ + """ + for label, value in result_rows + ) + + if not result_rows_html: + result_rows_html = """ +{label} +{value} ++ + """ + + # -------------------------------------------------------------- + # Setup task summary + # -------------------------------------------------------------- + + task_rows = [] + + task_labels = [ + ("Pre checks", "Pre checks"), + ("Set energy", "Set energy"), + ("Move beam", "Move beam to crosshair"), + ("Align beamstop", "Align beamstop"), + ("Align collimator", "Align collimator"), + ("Measure flux", "Measure flux"), + ] + + for key, label in task_labels: + result = results.get(key) + + # Only show tasks that actually appear in results. + # Disabled tasks therefore disappear from the final report. + if result is not None: + duration = result.get("duration") + + duration_text = ( + format_duration(duration) + if duration is not None + else "–" + ) + + task_rows.append( + f""" +No detailed results available ++ + """ + ) + + task_rows_html = "\n".join(task_rows) + + total_duration_text = ( + format_duration(total_duration) + if total_duration is not None + else "–" + ) + + # -------------------------------------------------------------- + # Setup information / log messages + # -------------------------------------------------------------- + + if messages: + messages_text = "\n".join(messages) + + # Escape anything that could accidentally be interpreted as HTML + messages_text = html_lib.escape(messages_text) + + info_html = f""" +{label} +{html_status(result)} +{duration_text} +Setup information
+ ++ {messages_text} ++ """ + else: + info_html = "" + + # -------------------------------------------------------------- + # HTML + # -------------------------------------------------------------- + + html = f""" + + + + + + + + + + +{DailySetup.beamline_name} Daily Setup
+{date}
+ + +Setup tasks
+ ++ +
+ + ++ + + {task_rows_html} + +Task +Status +Duration ++ + +Total duration ++ {total_duration_text} +Results
+ ++ {result_rows_html} +
+ + + {beam_image_html} + + {info_html} + + + + + """ + + return html \ No newline at end of file diff --git a/pxiii_bec/macros/enums.bak b/pxiii_bec/macros/enums.bak deleted file mode 100644 index 40b8d9f..0000000 --- a/pxiii_bec/macros/enums.bak +++ /dev/null @@ -1,22 +0,0 @@ -"""Enums for beamline states""" -from enum import Enum - - -class BeamlineState(str, Enum): - """List of beamline states""" - ROBOT_SAMPLE_EXCHANGE = "robot_sample_exchange" - SAMPLE_ALIGNMENT = "sample_alignment" - DATA_COLLECTION = "data_collection" - DC_XRF = "DC_XRF" - MANUAL_SAMPLE_EXCHANGE = "manual_sample_exchange" - BEAM_VISUALISATION = "beam_visualisation" - FLUX_MEASUREMENT = "flux_measurement" - BEAMSTOP_ALIGNMENT = "beamstop_alignment" - MAINTENANCE = "maintenance" - XTAL_SNAPSHOT = "xtal_snapshot" - - -class TemperatureMode(str, Enum): - """List of temperature modes""" - CRYO = "cryo" - ROOM_TEMP = "room_temp" diff --git a/pxiii_bec/macros/katscripts.py-save b/pxiii_bec/macros/katscripts.py-save deleted file mode 100755 index 451fb84..0000000 --- a/pxiii_bec/macros/katscripts.py-save +++ /dev/null @@ -1,1536 +0,0 @@ -"""Some simple scripts for commissioning""" - -import time, os -from datetime import datetime, timedelta -from dataclasses import dataclass -import numpy as np -import matplotlib.pyplot as plt -from scipy.signal import find_peaks as fp -import pandas as pd -from scipy.optimize import linear_sum_assignment - - - -def bragg_scan(): - """Energy scans from 6 to 18 keV at various gap positions""" - - start_bragg = 110.05 # 18 keV - end_bragg = 335.77 # 6 keV - steps = 1200 - exp = 0.05 - gap = 7.5 - umv(dev.id_gap, gap) - time.sleep(10) - while gap < 9.6: - print(f"Scanning the dcm_bragg from {start_bragg} to {end_bragg} at a gap of {gap: .2f} mm") - umv(dev.id_gap, gap) - scans.line_scan( - dev.dcm_bragg, start_bragg, end_bragg, steps=steps, exp_time=exp, relative=False - ) - gap += 0.5 - - -def move_xeye(direction): - """Move the xeye in or out""" - if direction == "in": - umv(dev.ss_xicam_x, 7.0) - else: - umv(dev.ss_xicam_x, -7) - - -def close_fe_slits(close=True): - """Close FE slits to (0.3,0.3) or open the FE slits to (2.0,1.0)""" - if close: - umv(dev.fe_sl_xsize, 0.3, dev.fe_sl_ysize, 0.3) - else: - umv(dev.fe_sl_xsize, 1.5, dev.fe_sl_ysize, 1.0) - - -def energy_checks(start_energy=8000, end_energy=20000): - """Check gap, pitch and intensities at different energies""" - f = open("luts/test.csv", "a", encoding="utf-8") - - for energy in range(start_energy, end_energy, 1000): - f = open("luts/test.csv", "a", encoding="utf-8") - print(f"Moving to {energy} eV") - bl_energy - if energy < 16000: - close_fe_slits(True) - go_to_peak( - dev.id_gap, dev.lu_bpmsum, -0.3, 0.3, 40, relative=True, confirm=False, gomax=True - ) - scan_fe() - close_fe_slits(True) - go_to_peak( - dev.id_gap, dev.lu_bpmsum, -0.1, 0.1, 15, relative=True, confirm=False, gomax=True - ) - go_to_peak( - dev.id_gap, - dev.lu_bpmsum, - -0.025, - 0.025, - 15, - relative=True, - confirm=False, - gomax=True, - ) - close_fe_slits(False) - - else: - umv(dev.s1_xsize, 0.5) - go_to_peak( - dev.id_gap, dev.bcu_bpmsum, -0.3, 0.3, 40, relative=True, confirm=False, gomax=True - ) - scan_fe() - go_to_peak( - dev.id_gap, dev.bcu_bpmsum, -0.1, 0.1, 15, relative=True, confirm=False, gomax=True - ) - umv(dev.s1_xsize, 2.5) - mono_pitch_scan() - gap = dev.id_gap.read()["id_gap"]["value"] - pitch = dev.dcm_pitch.read()["dcm_pitch"]["value"] - fe_x = dev.fe_sxcen.read()["fe_sxcen"]["value"] - fe_y = dev.fe_sycen.read()["fe_sycen"]["value"] - lu_read = dev.lu_bpmsum.read()["lu_bpmsum"]["value"] - ss_read = dev.ss_bpmsum.read()["ss_bpmsum"]["value"] - bcu_read = dev.bcu_bpmsum.read()["bcu_bpmsum"]["value"] - f.write( - f"{energy}, {gap: .5g}, {pitch: .5g}, {lu_read: .5g}, " - f"{ss_read: .5g}, {bcu_read: .5g}, " - f"{fe_x: .5g}, {fe_y: .5g}\n" - ) - - f.close() - - -def scan_fe(): - """Scan the FE slits in X and Y""" - print("Scanning FE slits in X") - umv(dev.fe_sxsize, 0.05, dev.fe_sysize, 2) - go_to_peak(dev.fe_sxcen, dev.lu_bpmsum, -1.5, 1.5, 20, confirm=False, relative=True) - print("Scanning FE slits in Y") - umv(dev.fe_sxsize, 0.3, dev.fe_sysize, 0.05) - go_to_peak(dev.fe_sycen, dev.lu_bpmsum, -1.2, 1.2, 15, confirm=False, relative=True) - close_fe_slits(False) - - -def scan_gap(): - """Scan the gap and monitor on lu_bpmsum or bcu_bpmsum""" - # close_fe_slits(True) - current_gap = dev.id_gap.read()["id_gap"]["value"] - if current_gap > 4.6: - go_to_peak( - dev.id_gap, dev.lu_bpmsum, -0.1, 0.1, 25, relative=True, confirm=False, gomax=False - ) - else: - go_to_peak( - dev.id_gap, dev.lu_bpmsum, 4.5, 4.75, 25, relative=False, confirm=False, gomax=False - ) - # close_fe_slits(False) - - -def record_pitch(): - """Record the pitch and perp distance to file""" - with open("luts/pitch_record.csv", "a", encoding="utf-8") as f: - current_energy = get_current_energy() - pitch = dev.dcm_pitch.read()["dcm_pitch"]["value"] - gap = dev.id_gap.read()["id_gap"]["value"] - f.write(f"{current_energy: .0f}, {pitch: .5g}, {gap: .4g}\n") - f.close() - - -def record_roll(): - """Record the roll and perp distance to file""" - with open("luts/roll_record.csv", "a", encoding="utf-8") as f: - current_energy = get_current_energy() - roll = dev.dcm_froll.read()["dcm_froll"]["value"] - f.write(f"{current_energy:.0f}, {roll:.5g}\n") - f.close() - - -def record_perp(): - """Check perp calibrations at various energies""" - with open("luts/perp_record.csv", "a", encoding="utf-8") as f: - current_energy = get_current_energy() - perp = dev.dcm_perp.read()["dcm_perp"]["value"] - ss_xicam_x = dev.ss_xicam_x.read()["ss_xicam_x"]["value"] - ss_xicam_y = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - f.write(f"{current_energy:.0f},{perp:.5g},{ss_xicam_x:.5g},{ss_xicam_y:.5g}\n") - f.close() - - -def beam_centre_from_ss(): - """Compute the beam centre from the ss_cam""" - y = dev.ss_xicam_x.read()["ss_xicam_x"]["value"] - x = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - beampos = {"xpos": x, "ypos": y} - print(f"X is {x: .4g}, Y is {y: .4g}") - return beampos - - -def generate_dcm_lut(start_energy=6000, end_energy=30000, step=300): - """Generate a lookup table for the dcm from start_energy to end_energy in steps of step""" - now = datetime.now() - fnow = now.strftime("%d%m%H%M") - filename = f"luts/{fnow}_lut.csv" - zoom = dev.scam_zoom.read()['scam_zoom']['value'] - with open(filename, "w", encoding="utf-8") as f: - f.write(f"energy,harmonic,gap,pitch,roll,perp,samcam_x,samcam_y,zoom={zoom}\n") - - for energy in range(start_energy, end_energy, step): - print(f"Moving to {energy: .0f}eV") - bl_energy(energy, mono_scan=False) - try: - scan_gap() - except Exception as exc: - print(f"Gap scan failed at {energy:.0f} eV: {exc}") - set_gap(energy) # set fallback gap here - - mono_pitch_scan() - gap = dev.id_gap.read()["id_gap"]["value"] - harm = Gap() - h = harm.get_harmonic_by_energy(energy) - pitch = dev.dcm_pitch.read()["dcm_pitch"]["value"] - roll = dev.dcm_froll.read()["dcm_froll"]["value"] - perp = dev.dcm_perp.read()["dcm_perp"]["value"] - # auto_exposure(cam="ss_xicam", max_iter=25) - # x = dev.ss_xicam_x.read()["ss_xicam_x"]["value"] - # y = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - auto_exposure(cam="samcam", max_iter=20) - x = dev.samcam_x.read()['samcam_x']['value'] - y = dev.samcam_y.read()['samcam_y']['value'] - with open(filename, "a", encoding="utf-8") as f: - f.write( - f"{energy:.0f},{h},{gap:.5g},{pitch:.5g},{roll:.4g},{perp:.5g},{x:.4g},{y:.4g}\n" - ) - bl_energy(12400) - umv(dev.id_gap, 20.0) - - -def write_lut(): - """Write DCM parameters to file""" - filename = "luts/manual_big.csv" - energy = get_current_energy() - mono_pitch_scan() - roll_scan_to_target() - gap = dev.id_gap.read()["id_gap"]["value"] - pitch = dev.dcm_pitch.read()["dcm_pitch"]["value"] - roll = dev.dcm_froll.read()["dcm_froll"]["value"] - perp = dev.dcm_perp.read()["dcm_perp"]["value"] - x = dev.ss_xicam_x.read()["ss_xicam_x"]["value"] - y = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - with open(filename, "a", encoding="utf-8") as f: - f.write(f"{energy:.0f},{gap:.5g},{pitch:.5g},{roll:.4g},{perp:.5g},{x:.4g},{y:.4g}\n") - - -def measure_beamsize(cam="samcam"): - auto_exposure("samcam", max_iter=20) - a = dev.samcam_xsig.read()["samcam_xsig"]["value"] - b = dev.samcam_ysig.read()["samcam_ysig"]["value"] - zoom = dev.scam_zoom.read()["scam_zoom"]["value"] - sx = calc_scam_microns(a, zoom=zoom) * 2.35 - sy = calc_scam_microns(b, zoom=zoom) * 2.35 - print(f"FWHM in um : {sx, sy}") - return sx, sy - - -def write_beamsize(): - """Write beam size and flux to file""" - filename = "luts/beamsizes.csv" - with open(filename, "a", encoding="utf-8") as f: - f.write("lens_config,size_x,size_y,i1\n") - lens_config = input("Which lenses are in?") - if SE.scin.checkpos: - filters("out") - sx, sy = measure_beamsize() - else: - scin("in") - filters("out") - sx, sy = measure_beamsize() - i1_reading = i1() - with open(filename, "a", encoding="utf-8") as f: - f.write(f"{lens_config},{sx:.4g},{sy:.4g},{i1_reading:.4g}\n") - - - -def scan_Ge(): - scanbefore = 30 # eV - scanafter = 30 # eV - stepsize = 0.2 # eV - # Edge sgould be at 11103.1 - actual_edge_Ge = 11103.1 # eV - actual_bragg = convert_from_energy(actual_edge_Ge)["bragg_angle_mrad"] - current_edge = 11095 - current_bragg = convert_from_energy(current_edge)["bragg_angle_mrad"] - print(f"Ge edge should be at a bragg angle of {actual_bragg:.5g} mrad\n") - print(f"Current estimate of edge is {current_bragg:.5g} mrad\n") - xdata = [] - ydata = [] - filedir, fname = fnow() - filename = f"{filedir}{fname}_ge_edge.csv" - print(filename) - with open(filename, 'w') as f: - f.write(f"Energy,Bragg,bcu_bpmsum\n") - - # scanstart = edge_Ge + scanafter - # scanend = edge_Ge - scanbefore - # bragg_start = convert_from_energy(scanstart)["bragg_angle_mrad"] - # bragg_end = convert_from_energy(scanend)["bragg_angle_mrad"] - # stepnumber = abs(int((scanend - scanstart) / stepsize)) - # print(f"Changing energy to {scanstart}") - # bl_energy(scanstart) - # # scan_gap() - # umv(dev.ss_f4_x, 6) # Put Ge filter in place - # print(f"scanning from {bragg_start} to {bragg_end} with {stepnumber} steps") - # s = scans.line_scan(dev.dcm_bragg, bragg_start, bragg_end, steps=stepnumber, relative=False) - # print(s) - # umv(dev.ss_f4_x, 2) - - plot_live_data_bec(dev.dcm_bragg,dev.bcu_bpmsum) - scanpoints = np.linspace(current_bragg - 0.5, current_bragg + 0.5, 300) - start_energy = convert_from_bragg(current_bragg+0.5)["energy_ev"] - bl_energy(start_energy) - umv(dev.ss_f4_x, 6) # Put Ge filter in place - - for bragg in scanpoints: - scans.umv(dev.dcm_bragg, bragg, relative=False) - energy = convert_from_bragg(bragg)["energy_ev"] - inten = average_inten() - xdata.append(energy) - ydata.append(inten) - with open(filename, 'a') as f: - f.write(f"{energy:.2f},{bragg:.2f},{inten:.2f}\n") - data = { - "x_data": np.array(xdata), - "y_data": np.array(ydata), - "motor_name": "dcm_bragg", - "signal_name": "bcu_bpmsum", - "motor_device": dev.dcm_bragg, - "scan_number": "Current", - } - - # Define and fit model to scan data - fit_params = create_fit_parameters(deriv = True, - negative = False, - model = FitDefaults.MODEL, - baseline = FitDefaults.BASELINE) - fit_result = fit(data, fit_params) - - # Plot the fitted data if plot = True - - plot_fitted_data_bec(data, fit_result) - - - - -def cal_samcam_fixed_x(): - # lat = dev.hfm_x.read()["hfm_x"]["value"] - # pitch = dev.hfm_pitch.read()["hfm_pitch"]["value"] - fpitch = dev.dcm_fpitch.read()['dcm_fpitch']['value'] - scanpoints = np.linspace(3.75, 4.75, 7) - zoom_high = 800 - zoom_low = 200 - highs, lows = [], [] - high_fpitch, low_fpitch = [], [] - av_high = [] - av_low = [] - - # high zoom - umv(dev.scam_zoom, zoom_high) - auto_exposure("samcam") - for i in scanpoints: - umv(dev.dcm_fpitch, i) - time.sleep(0.2) - for _ in range(5): - reading = dev.samcam_x.read()["samcam_x"]["value"] - av_high.append(reading) - high_y = np.mean(av_high) - high_x = dev.dcm_fpitch.read()["dcm_fpitch"]["value"] - print(f"Xpos at zoom {zoom_high} is {high_y}") - highs.append(high_y) - high_fpitch.append(high_x) - - umv(dev.scam_zoom, zoom_low) - auto_exposure("samcam") - for i in scanpoints: - umv(dev.dcm_fpitch, i) - time.sleep(0.2) - for i in range(5): - reading = dev.samcam_x.read()["samcam_x"]["value"] - av_low.append(reading) - low_y = np.mean(av_low) - low_x = dev.dcm_fpitch.read()["dcm_fpitch"]["value"] - print(f"Xpos at zoom {zoom_low} is {low_y}") - lows.append(low_y) - low_fpitch.append(low_x) - - umv(dev.dcm_fpitch, 5) - - # Convert to numpy arrays - x_high = np.array(high_fpitch) - x_low = np.array(low_fpitch) - y_high = np.array(highs) - y_low = np.array(lows) - - # Fit linear models: y = m*x + b - m_high, b_high = np.polyfit(x_high, y_high, 1) - m_low, b_low = np.polyfit(x_low, y_low, 1) - - # Intersection point - x_intersect = (b_low - b_high) / (m_high - m_low) - y_intersect = m_high * x_intersect + b_high - - print(f"\nIntersection at:") - print(f" dcm_fpitch = {x_intersect:.5f}") - print(f" SamCam_x = {y_intersect:.2f}") - - # --- Plot --- - plt.figure(figsize=(7, 5)) - plt.scatter(x_high, y_high, color="red", label=f"Zoom = {zoom_high} data") - plt.scatter(x_low, y_low, color="blue", label=f"Zoom = {zoom_low} data") - - x_fit = np.linspace(min(x_high), max(x_high), 100) - plt.plot(x_fit, m_high * x_fit + b_high, "r--", label=f"Fit: Zoom {zoom_high}") - plt.plot(x_fit, m_low * x_fit + b_low, "b--", label=f"Fit: Zoom {zoom_low}") - - plt.scatter(x_intersect, y_intersect, color="green", s=80, zorder=5, label="Intersection") - - plt.xlabel("DCM Fine Pitch Position") - plt.ylabel("SamCam X") - plt.title("Zoom Calibration") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -def cal_samcam_fixed_y(): - vert = dev.vfm_y.read()["vfm_y"]["value"] - pitch = dev.vfm_pitch.read()["vfm_pitch"]["value"] - scanpoints = np.linspace(vert - 0.1, vert + 0.1, 7) - zoom_high = 800 - zoom_low = 200 - highs, lows = [], [] - high_vert, low_vert = [], [] - - # high zoom - umv(dev.scam_zoom, zoom_high) - auto_exposure("samcam") - for i in scanpoints: - umv(dev.vfm_y, i) - umv(dev.vfm_pitch, pitch) - time.sleep(0.2) - high_y = dev.samcam_y.read()["samcam_y"]["value"] - high_x = dev.vfm_y.read()["vfm_y"]["value"] - print(f"Ypos at zoom {zoom_high} is {high_y}") - highs.append(high_y) - high_vert.append(high_x) - - umv(dev.scam_zoom, zoom_low) - auto_exposure("samcam") - for i in scanpoints: - umv(dev.vfm_y, i) - umv(dev.vfm_pitch, pitch) - time.sleep(0.2) - low_y = dev.samcam_y.read()["samcam_y"]["value"] - low_x = dev.vfm_y.read()["vfm_y"]["value"] - print(f"Ypos at zoom {zoom_low} is {low_y}") - lows.append(low_y) - low_vert.append(low_x) - - umv(dev.vfm_y, vert) - umv(dev.vfm_pitch, pitch) - - # Convert to numpy arrays - x_high = np.array(high_vert) - x_low = np.array(low_vert) - y_high = np.array(highs) - y_low = np.array(lows) - - # Fit linear models: y = m*x + b - m_high, b_high = np.polyfit(x_high, y_high, 1) - m_low, b_low = np.polyfit(x_low, y_low, 1) - - # Intersection point - x_intersect = (b_low - b_high) / (m_high - m_low) - y_intersect = m_high * x_intersect + b_high - - print(f"\nIntersection at:") - print(f" vfm_y = {x_intersect:.5f}") - print(f" SamCam_y = {y_intersect:.2f}") - - # --- Plot --- - plt.figure(figsize=(7, 5)) - plt.scatter(x_high, y_high, color="red", label=f"Zoom = {zoom_high} data") - plt.scatter(x_low, y_low, color="blue", label=f"Zoom = {zoom_low} data") - - x_fit = np.linspace(min(x_high), max(x_high), 100) - plt.plot(x_fit, m_high * x_fit + b_high, "r--", label=f"Fit: Zoom {zoom_high}") - plt.plot(x_fit, m_low * x_fit + b_low, "b--", label=f"Fit: Zoom {zoom_low}") - - plt.scatter(x_intersect, y_intersect, color="green", s=80, zorder=5, label="Intersection") - - plt.xlabel("VFM Vert Position") - plt.ylabel("SamCam Y") - plt.title("Zoom Calibration") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -def correlate_froll(): - x_correlation = [] - y_correlation = [] - scanpoints = np.linspace(0, 0.2, 10) - for pos in scanpoints: - umv(dev.dcm_froll, pos) - xpos, ypos = compute_pos() - x_correlation.append(xpos) - y_correlation.append(ypos) - - x = np.array(scanpoints) - y1 = np.array(x_correlation) - y2 = np.array(y_correlation) - - xslope, xint = np.polyfit(x, y1, 1) - yslope, yint = np.polyfit(x, y2, 1) - - print(f"Fit for xpos is: y = {xslope}.x + {xint}") - print(f"Fit for ypos is: y = {yslope}.x + {yint}") - - plt.figure(figsize=(7, 5)) - # plt.scatter(x, y1, label='xpos') - plt.scatter(x, y2, label="beam y position", color="rebeccapurple") - - x_fit = np.linspace(min(x), max(x), 100) - # plt.plot(x_fit, xslope*x_fit + xint, 'r--', label=f'y = {xslope}*x + {xint}') - plt.plot( - x_fit, - yslope * x_fit + yint, - "r--", - label=f"y = {yslope:.3g}*x + ({yint:.3g})", - color="lightcoral", - ) - plt.xlabel("dcm fine roll (V)") - plt.ylabel("beam Y (from BCU BPM)") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -def correlate_fpitch(): - x_correlation = [] - y_correlation = [] - scanpoints = np.linspace(0, 0.2, 10) - for pos in scanpoints: - umv(dev.dcm_fpitch, pos) - xpos, ypos = compute_pos() - x_correlation.append(xpos) - y_correlation.append(ypos) - - x = np.array(scanpoints) - y1 = np.array(x_correlation) - y2 = np.array(y_correlation) - - xslope, xint = np.polyfit(x, y1, 1) - yslope, yint = np.polyfit(x, y2, 1) - - print(f"Fit for xpos is: y = {xslope}.x + {xint}") - print(f"Fit for ypos is: y = {yslope}.x + {yint}") - - plt.figure(figsize=(7, 5)) - # plt.scatter(x, y1, label='xpos') - plt.scatter(x, y1, label="beam x position", color="rebeccapurple") - - x_fit = np.linspace(min(x), max(x), 100) - # plt.plot(x_fit, xslope*x_fit + xint, 'r--', label=f'y = {xslope}*x + {xint}') - plt.plot( - x_fit, xslope * x_fit + xint, label=f"y = {xslope:.3g}*x + ({xint:.3g})", color="lightcoral" - ) - plt.xlabel("dcm fine pitch (V)") - plt.ylabel("beam X (from BCU BPM)") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -def correlate_hfm_x(): - x_correlation = [] - lat = dev.hfm_x.read()["hfm_x"]["value"] - scanpoints = np.linspace(lat - 0.1, lat + 0.1, 10) - for pos in scanpoints: - umv(dev.hfm_x, pos) - xpos, ypos = compute_pos() - x_correlation.append(xpos) - umv(dev.hfm_x, lat) - - x = np.array(scanpoints) - y1 = np.array(x_correlation) - - xslope, xint = np.polyfit(x, y1, 1) - - print(f"Fit for xpos is: y = {xslope}.x + {xint}") - plt.figure(figsize=(7, 5)) - # plt.scatter(x, y1, label='xpos') - plt.scatter(x, y1, label="beam x position", color="rebeccapurple") - - x_fit = np.linspace(min(x), max(x), 100) - # plt.plot(x_fit, xslope*x_fit + xint, 'r--', label=f'y = {xslope}*x + {xint}') - plt.plot( - x_fit, xslope * x_fit + xint, label=f"y = {xslope:.5g}*x + ({xint:.5g})", color="lightcoral" - ) - plt.xlabel("HFM lateral (mm)") - plt.ylabel("beam X (from BCU BPM)") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -# def correlate_vfm_y(): -# y_correlation = [] -# vert = dev.vfm_y.read()["vfm_y"]["value"] -# scanpoints = np.linspace(vert - 0.06, vert + 0.06, 10) -# for pos in scanpoints: -# umv(dev.vfm_y, pos) -# xpos, ypos = compute_pos() -# y_correlation.append(ypos) -# umv(dev.vfm_y, vert) - -# x = np.array(scanpoints) -# y1 = np.array(y_correlation) - -# yslope, yint = np.polyfit(x, y1, 1) - -# print(f"Fit for xpos is: y = {yslope}.x + {yint}") -# plt.figure(figsize=(7, 5)) -# # plt.scatter(x, y1, label='xpos') -# plt.scatter(x, y1, label="beam y position", color="rebeccapurple") - -# x_fit = np.linspace(min(x), max(x), 100) -# # plt.plot(x_fit, xslope*x_fit + xint, 'r--', label=f'y = {xslope}*x + {xint}') -# plt.plot( -# x_fit, yslope * x_fit + yint, label=f"y = {yslope:.5g}*x + ({yint:.5g})", color="lightcoral" -# ) -# plt.xlabel("VFM vertical (mm)") -# plt.ylabel("beam Y(from BCU BPM)") -# plt.legend() -# plt.grid(True) -# plt.tight_layout() -# plt.show() - - -def correlate_hfm_pitch(): - x_correlation = [] - pitch = dev.hfm_pitch.read()["hfm_pitch"]["value"] - scanpoints = np.linspace(pitch - 0.05, pitch + 0.05, 10) - for pos in scanpoints: - umv(dev.hfm_pitch, pos) - xpos, ypos = compute_pos() - x_correlation.append(xpos) - umv(dev.hfm_pitch, pitch) - - x = np.array(scanpoints) - y1 = np.array(x_correlation) - - xslope, xint = np.polyfit(x, y1, 1) - - print(f"Fit for xpos is: y = {xslope}.x + {xint}") - plt.figure(figsize=(7, 5)) - # plt.scatter(x, y1, label='xpos') - plt.scatter(x, y1, label="beam x position", color="rebeccapurple") - - x_fit = np.linspace(min(x), max(x), 100) - # plt.plot(x_fit, xslope*x_fit + xint, 'r--', label=f'y = {xslope}*x + {xint}') - plt.plot( - x_fit, xslope * x_fit + xint, label=f"y = {xslope:.5g}*x + ({xint:.5g})", color="lightcoral" - ) - plt.xlabel("HFM Pitch (mm)") - plt.ylabel("beam X (from BCU BPM)") - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - - -def move_to_x(targetx=0.13): - # Calibration and drift compensation - # target from previous run was 0.1465 - slope = -1.004 - intercept = 1.793 - - xpos, ypos = compute_pos() - - beam_drift = xpos - targetx # beam moved +0.1 mm (100 µm) - mot_current = dev.hfm_x.read()["hfm_x"]["value"] # current motor position (example) - - # Compute correction - delta = -beam_drift / slope - mot_new = mot_current + delta - umv(dev.hfm_x, mot_new) - - -# def move_to_y(targety=-0.033): -# # Calibration and drift compensation -# # target from previous run = -0.283 -# slope = -1.2779 -# intercept = 2.4374 - -# xpos, ypos = compute_pos() - -# beam_drift = ypos - targety # beam moved +0.1 mm (100 µm) -# mot_current = dev.vfm_y.read()["vfm_y"]["value"] # current motor position (example) - -# # Compute correction -# delta = -beam_drift / slope -# mot_new = mot_current + delta -# umv(dev.vfm_y, mot_new) - - -from epics import caget, caput -import time - - -def auto_exposure( - cam="samcam", target=200, tol=5, gain=0.9, min_exp=0.00001, max_exp=0.2, max_iter=10 -): - """ - Adjust camera exposure time to reach a target max pixel value. - - Parameters - ---------- - target : float - Desired MaxValue (counts) - tol : float - Acceptable deviation from target - min_exp, max_exp : float - Exposure time limits (s) - max_iter : int - Maximum number of adjustment iterations - """ - if cam == "samcam": - exposure = dev.samcam_exp.read()["samcam_exp"]["value"] - else: - exposure = dev.ss_xicam_exp.read()["ss_xicam_exp"]["value"] - - print(f"Starting exposure = {exposure:.4f} s") - - for i in range(max_iter): - time.sleep(0.1) # allow a frame or two to update - if cam == "samcam": - maxval = dev.samcam_max.read()["samcam_max"]["value"] - if maxval is None: - print("No reading — check camera.") - break - if cam == "ss_xicam": - maxval = dev.ss_xicam_max.read()["ss_xicam_max"]["value"] - if maxval is None: - print("No reading — check camera.") - break - - error = target - maxval - # print(f"Iter {i+1}: MaxValue = {maxval:.1f}, error = {error:.1f}") - - # stop if within tolerance - if abs(error) <= tol: - # print(f"Target reached (MaxValue={maxval:.1f}) after {i+1} iterations.") - break - - # proportional correction (simple gain control) - gain_setting = gain # moderate response - new_exp = exposure * (1 + gain_setting * error / target) - - # limit exposure bounds - new_exp = max(min_exp, min(max_exp, new_exp)) - - # update camera perp = dev.dcm_perp.read()["dcm_perp"]["value"] - y = dev.ss_xicam_x.read()["ss_xicam_x"]["value"] - x = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - if cam == "samcam": - dev.samcam_exp.put(new_exp) - print(f" → Adjusting exposure to {new_exp:.4f} s") - else: - dev.ss_xicam_exp.put(new_exp) - print(f" → Adjusting exposure to {new_exp:.4f} s") - - exposure = new_exp - - print(f"New exposure time is {exposure:.3g}") - return exposure - - -# def get_new_beamsizes(mirror): -# filename = f"luts/{mirror}_size.csv" -# if mirror == "hfm": -# bu = dev.hfm_bu -# bd = dev.hfm_bd -# step = 0.2 -# else: -# bu = dev.vfm_bu -# bd = dev.vfm_bd -# step = 0.05 -# beamsize("xs") -# move_targetx_with_hfm_x() -# move_targety_with_vfm_y() -# with open(filename, "w") as f: -# for _ in range(4): -# curr_bu = bu.user_readback.get() -# curr_bd = bd.user_readback.get() -# auto_exposure() -# umv(bu, curr_bu + step) -# umv(bd, curr_bd + step) -# move_targetx_with_hfm_x() -# move_targety_with_vfm_y() -# xpos = dev.samcam_x.read()["samcam_x"]["value"] -# ypos = dev.samcam_y.read()["samcam_y"]["value"] -# xsig = dev.samcam_xsig.read()["samcam_xsig"]["value"] -# ysig = dev.samcam_ysig.read()["samcam_ysig"]["value"] -# f.write(f"{curr_bu}, {curr_bd}, {xpos}, {ypos}, {xsig}, {ysig}\n") -# print(f"{curr_bu}, {curr_bd}, {xpos}, {ypos}, {xsig}, {ysig}") - - -def filters(pos="out"): - if pos == "out": - umv(dev.ss_f1_x, 2.0, dev.ss_f2_x, 2.0, dev.ss_f3_x, 12.0, dev.ss_f4_x, 8.0) - if SE.scin.checkpos(): - auto_exposure(cam="samcam", max_iter=20) - else: - umv(dev.ss_f1_x, 2.0, dev.ss_f2_x, 2.0, dev.ss_f3_x, 8.0, dev.ss_f4_x, 8.0) - if SE.scin.checkpos(): - auto_exposure(cam="samcam", max_iter=20) - -def fnow(): - now = datetime.now() - fnow = now.strftime("%Y%m%d-%H%M") - filedir = "luts/" - return filedir, fnow - -def energy_vs_height(start_energy=11000, end_energy=25000, step=1000): - """Correlate beam height with energy from start_energy to end_energy in steps of step""" - now = datetime.now() - # fnow = now.strftime("%d%m%H%M_") - fnow = now.strftime("%Y-%m-%d-%H%M") - filename = f"luts/{fnow}_energy-height-ss.csv" - with open(filename, "w", encoding="utf-8") as f: - # f.write("energy,bcu_norm_y,bcu_y,samcam_ypix,samcam_y\n") - f.write("energy,y_px,diffy_mic\n") - - for energy in range(start_energy, end_energy, step): - print(f"Moving to {energy: .0f}eV") - bl_energy(energy) - # scan_gap() - # mono_pitch_scan() - # scan_slits("s3",x=False,y=True) - # height = dev.s3_ycen.read()["s3_ycen"]["value"] - # bcu_norm_y = compute_norm()[1] - # bcu_y = compute_pos()[1] - # auto_exposure(cam="samcam", target=200) - # samcam_ypix, samcam_y = calc_from_centre() - # with open(filename, "a", encoding="utf-8") as f: - # f.write(f"{energy:.0f},{bcu_norm_y:.4g},{bcu_y:.4g},{samcam_ypix:.5g},{samcam_y:.4g}\n") - - auto_exposure(cam="ss_xicam", target=200, max_iter=25) - time.sleep(0.5) - ypx, diffm = calc_from_centre("ss_xicam") - # pitch = dev.dcm_pitch.read()['dcm_pitch']['value'] - - with open(filename, "a", encoding="utf-8") as f: - f.write(f"{energy:.0f},{ypx:.4g},{diffm:.4g}\n") - # umv(dev.id_gap, 20.0) - - - -def scan_in_x(xsize, xcen, mon, small, large, width, steps): - umv(xsize, small) - go_to_peak(xcen, mon, -(width * 0.5), (width * 0.5), steps=steps, relative=False) - umv(xsize, large) - - -def scan_in_y(ysize, ycen, mon, small, large, width, steps): - umv(ysize, small) - go_to_peak(ycen, mon, -(width * 0.5), (width * 0.5), steps=steps, relative=True, confirm=False) - umv(ysize, large) - - -def trans_fils(inc): - x1 = dev.ss_f1_x.read()["ss_f1_x"]["value"] - x2 = dev.ss_f2_x.read()["ss_f2_x"]["value"] - x3 = dev.ss_f3_x.read()["ss_f3_x"]["value"] - x4 = dev.ss_f4_x.read()["ss_f4_x"]["value"] - umv( - dev.ss_f1_x, - x1 + inc, - dev.ss_f2_x, - x2 + inc, - dev.ss_f3_x, - x3 + inc, - dev.ss_f4_x, - x4 + inc, - ) - - -def calc_from_centre(cam="samcam"): - if cam == "samcam": - read = dev.samcam_y.read()["samcam_y"]["value"] - diff = 1092 - read - diff_px = calc_scam_microns(diff, zoom=1000) - return read, float(diff_px) - else: - read = dev.ss_xicam_y.read()["ss_xicam_y"]["value"] - diff = 140 - read - diff_px = calc_ss_xicam_microns(diff) - return read, diff_px - - -def get_cam(low_zoom, high_zoom): - umv(dev.scam_zoom, low_zoom) - x = dev.samcam_x.read()["samcam_x"]["value"] - y = dev.samcam_y.read()["samcam_y"]["value"] - print(f"Low zoom: x = {x}, y = {y}") - umv(dev.scam_zoom, high_zoom) - x = dev.samcam_x.read()["samcam_x"]["value"] - y = dev.samcam_y.read()["samcam_y"]["value"] - print(f"High zoom: x = {x}, y = {y}") - - -# def read_currents(): -# """Read the individual bpm channels""" -# bpm1 = dev.bcu_bpm1.read()["bcu_bpm1"]["value"] -# bpm2 = dev.bcu_bpm2.read()["bcu_bpm2"]["value"] -# bpm3 = dev.bcu_bpm3.read()["bcu_bpm3"]["value"] -# bpm4 = dev.bcu_bpm4.read()["bcu_bpm4"]["value"] -# # print(f"bpm1 = {bpm1:.3f}, bpm2 = {bpm2:.3f}, bpm3 = {bpm3:.3f}, bpm4 = {bpm4:.3f}") -# return {"bpm1": bpm1, "bpm2": bpm2, "bpm3": bpm3, "bpm4": bpm4} - - -# def compute_norm(): -# """Compute normalised x and y positions""" -# readings = read_currents() -# total = readings["bpm1"] + readings["bpm2"] + readings["bpm3"] + readings["bpm4"] -# # print(f"Sum is {total:.2f}") -# xn = ((readings["bpm1"] + readings["bpm2"]) - (readings["bpm3"] + readings["bpm4"])) / total -# yn = ((readings["bpm1"] + readings["bpm3"]) - (readings["bpm2"] + readings["bpm4"])) / total -# return xn, yn - -def average_inten(): - vals_inten = [] - for _ in range(5): - vals_inten.append(dev.bcu_bpmsum.read()['bcu_bpmsum']['value']) - time.sleep(0.1) - inten = np.mean(vals_inten) - return inten - -def mirror_pitch(mirror = 'vfm'): - - if mirror == 'vfm': - pitch = dev.vfm_pitch.position - mot = dev.vfm_pitch - start = 2.94 - else: - pitch = dev.hfm_pitch.position - mot = dev.hfm_pitch - start = 3.3 - print(f"Scanning {mirror}_pitch from 10-29 keV") - pitch_range = [start - 0.25, start - 0.2, start -0.15, start - 0.1, start -0.05] - - umv(mot,start) - - results = [] - now = datetime.now() - fnow = now.strftime("%d%m%H%M") - csvfile = f"luts/{fnow}_{mirror}_pitch_energy.csv" - - with open(csvfile, "w") as f: - f.write("energy,pitch,diode\n") - - # for p in pitch_range: - for energy in range(17, 26): - bl_energy(energy) - time.sleep(1) - - for p in pitch_range: - umv(mot, p) - print(f"{mirror}_pitch = {p}") - time.sleep(0.2) - vals_diode = [] - - for _ in range(5): - vals_diode.append(dev.xidiode.read()['xidiode']['value']) - time.sleep(0.1) - - diode = np.mean(vals_diode) - - results.append([ - energy, - p, - diode, - ]) - - with open(csvfile, "a") as f: - f.write( - f"{energy:.2f},{p:.5f},{diode:.5g}\n" - ) - umv(mot,start) - bl_energy(12400) - results = np.array(results) - -def find_best_roll(low = 6000, high = 20000): - low_scanpoints = np.linspace(2.0, 7.0, 11) - high_scanpoints = np.linspace(1.0, 9.0,9) - highs_y, lows_y = [], [] - - # high energy - bl_energy(high) - filename = f"./luts/roll_{high:.0f}.csv" - with open(filename, "w", encoding="utf-8") as f: - f.write("Roll, Y pos\n") - auto_exposure("samcam", max_iter=25) - for i in high_scanpoints: - umv(dev.dcm_froll, i) - time.sleep(0.2) - high_y = dev.samcam_y.read()['samcam_y']['value'] - print(f"Ypos at sample cam is {high_y}") - highs_y.append(high_y) - with open(filename, "a", encoding="utf-8") as f: - f.write(f"{i:.4g},{high_y:.4g} \n") - - # low energy - bl_energy(low) - filename = f"./luts/roll_{low:.0f}.csv" - with open(filename, "w", encoding="utf-8") as f: - f.write("Roll, Y pos\n") - auto_exposure("samcam", max_iter=25) - for i in low_scanpoints: - umv(dev.dcm_froll, i) - time.sleep(0.2) - low_y = dev.samcam_y.read()['samcam_y']['value'] - print(f"Ypos at sample cam is {low_y}") - lows_y.append(low_y) - with open(filename, "a", encoding="utf-8") as f: - f.write(f"{i:.4g},{low_y:.4g} \n") - - - y_high = np.array(highs_y) - y_low = np.array(lows_y) - - - # # Fit linear models: y = m*x + b - m_high, b_high = np.polyfit(high_scanpoints, y_high, 1) - m_low, b_low = np.polyfit(low_scanpoints, y_low, 1) - - # # Intersection point - x_intersect = (b_low - b_high) / (m_high - m_low) - y_intersect = m_high * x_intersect + b_high - - print(f"\nIntersection at:") - print(f" DCM Roll = {x_intersect:.5f}") - print(f" samcam Y = {y_intersect:.2f}") - - # # --- Plot --- - plt.figure(figsize=(7,5)) - plt.scatter(high_scanpoints, y_high, color='red', label=f'High energy') - plt.scatter(low_scanpoints, y_low, color='blue', label=f'Low energy') - - x_fit = np.linspace(min(high_scanpoints), max(high_scanpoints), 100) - plt.plot(x_fit, m_high*x_fit + b_high, 'r--', label=f'High energy') - plt.plot(x_fit, m_low*x_fit + b_low, 'b--', label=f'Low energy') - - plt.scatter(x_intersect, y_intersect, color='green', s=80, zorder=5, label='Intersection') - - plt.xlabel('DCM fine roll') - plt.ylabel('samcam Y pos') - plt.title('Roll Calibration') - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - -def vfm_yaw_check(): - slit_size = 0.02 - slit_point1 = -1.2 - slit_point2 = -0.12 - mirror_start = 0.5 - mirror_end = -5 - yaw_values = [-1.5, -0.5, 0, 0.5, 1] - point1 = [] - point2 = [] - - umv(dev.ss_sl_ysize, slit_size) - - for yaw in yaw_values: - print(f"Moving VFM yaw to {yaw}") - umv(dev.vfm_yaw, yaw) - # Point 1 - print(f"Moving slits to position 1") - umv(dev.ss_sl_ycen, slit_point1) - scans.line_scan(dev.vfm_x, mirror_start, mirror_end, steps = 20, relative=False) - fit_result = fit_history(-1, "xidiode", deriv=True) - centre = fit_result['centre'] - print(f'Yaw = {yaw}, position = {slit_point1}, centre = {centre}') - point1.append(centre) - # Point 2 - print(f"Moving slits to position 2") - umv(dev.ss_sl_ycen, slit_point2) - scans.line_scan(dev.vfm_x, mirror_start, mirror_end, steps = 20, relative=False) - fit_result = fit_history(-1, "xidiode", deriv=True) - centre = fit_result['centre'] - print(f'Yaw = {yaw}, position = {slit_point2}, centre = {centre}') - point2.append(centre) - print(f"Point 1 values are {point1}") - print(f"Point 2 values are {point2}") - go_to_peak(dev.ss_sl_ycen, dev.xidiode, -2, 2, 100) - umv(dev.ss_sl_ysize, 2) - y_point1 = np.array(point1) - y_point2 = np.array(point2) - - - # # Fit linear models: y = m*x + b - m_point1, b_point1 = np.polyfit(yaw_values, y_point1, 1) - m_point2, b_point2 = np.polyfit(yaw_values, y_point2, 1) - - # # Intersection point - x_intersect = (b_point2 - b_point1) / (m_point1 - m_point1) - y_intersect = m_point1 * x_intersect + b_point1 - - print(f"\nIntersection at:") - print(f" Mirror yaw = {x_intersect:.5f}") - print(f" Y = {y_intersect:.2f}") - - # # --- Plot --- - plt.figure(figsize=(7,5)) - plt.scatter(yaw_values, y_point1, color='red', label=f'point1') - plt.scatter(yaw_values, y_point2, color='blue', label=f'point2') - - x_fit = np.linspace(min(yaw_values), max(yaw_values), 100) - plt.plot(x_fit, m_point1*x_fit + b_point1, 'r--', label=f'point1') - plt.plot(x_fit, m_point2*x_fit + b_point2, 'b--', label=f'point2') - - plt.scatter(x_intersect, y_intersect, color='green', s=80, zorder=5, label='Intersection') - - plt.xlabel('VFM yaw') - plt.ylabel('Edge') - plt.title('VFM Yaw Calibration') - plt.legend() - plt.grid(True) - plt.tight_layout() - plt.show() - -from dataclasses import dataclass -import time - - -@dataclass -class SlitAxis: - name: str - centre_motor: object # e.g. dev.slit1_x - size_motor: object # e.g. dev.slit1_xsize - scan_func: callable # your existing peak scan function - scan_range: float = 2.0 - open_size: float = 2.0 - min_size: float = -0.4 - max_size: float = 5.0 - - -@dataclass -class Slit: - name: str - x: SlitAxis - y: SlitAxis - - -def read_intensity(detector, n=5, delay=0.1): - values = [] - for _ in range(n): - values.append(detector.read()[detector.name]["value"]) - time.sleep(delay) - return sum(values) / len(values) - - - -def reduce_to_transmission(axis, detector, baseline, target=0.15, step=0.05): - """ - Close slit size until intensity is around target * baseline. - """ - size = axis.size_motor.position - - while size > axis.min_size: - intensity = read_intensity(detector) - transmission = intensity / baseline - - print( - f"{axis.name}: size={size:.4f}, " - f"I={intensity:.3g}, transmission={transmission:.3f}" - ) - - if transmission <= target: - return size, intensity - - size -= step - umv(axis.size_motor, size) - - raise RuntimeError(f"{axis.name}: reached minimum slit size without reaching target") - - -def open_to_transmission(axis, detector, baseline, target=0.99, step=0.05): - """ - Open slit until intensity is close to the original baseline. - """ - size = axis.size_motor.position - - while size < axis.max_size: - intensity = read_intensity(detector) - transmission = intensity / baseline - - print( - f"{axis.name}: size={size:.4f}, " - f"I={intensity:.3g}, transmission={transmission:.3f}" - ) - - if transmission >= target: - return size, intensity - - size += step - umv(axis.size_motor, size) - # final_size = axis.size.motor.position - # fudge = 0.5 - # umv(axis.size_motor,final_size + fudge) - - raise RuntimeError(f"{axis.name}: reached maximum slit size without restoring intensity") - -# def approx_centre_axis(axis, detector, slitsize=0.5): -# umv(axis.size_motor, slitsize) -# go_to_peak(axis.centre_motor, detector, -4, 4, 50, confirm=False) - - -def centre_axis(axis, detector, close_fraction=0.10, open_fraction=0.95): - print(f"\nAligning {axis.name}") - - # approx_centre_axis(axis, detector, slitsize=0.5) - - umv(axis.size_motor, axis.open_size) - - baseline = read_intensity(detector) - print(f"{axis.name}: baseline intensity = {baseline:.3g}") - - # if baseline <= 0: - # raise RuntimeError(f"{axis.name}: invalid baseline intensity") - - reduce_to_transmission( - axis, - detector, - baseline, - target=close_fraction, - ) - - go_to_peak(axis.centre_motor, detector, axis.centre_motor.position - axis.scan_range, - axis.centre_motor.position + axis.scan_range, - 50, - confirm=False) - print(f"{axis.name}: moving centre to peak position") - - open_to_transmission( - axis, - detector, - baseline, - target=open_fraction, - ) - - final_intensity = read_intensity(detector) - print( - f"{axis.name}: final intensity = {final_intensity:.3g}, " - f"transmission = {final_intensity / baseline:.3f}" - ) - -def open_slits(size=3): - slits = define_slits() - for slit in slits: - umv(slit.x.size_motor, size) - umv(slit.y.size_motor, size) - - -def centre_slit(slit, detector): - print(f"\n=== Aligning {slit.name} ===") - - centre_axis(slit.x, detector) - centre_axis(slit.y, detector) - - print(f"=== Finished {slit.name} ===") - - -def centre_all_slits(slits, detector): - for slit in slits: - try: - centre_slit(slit, detector) - except Exception as exc: - print(f"WARNING: failed to align {slit.name}: {exc}") - print("Continuing with next slit.") - -def centre_one(name, detector): - slits = define_slits() - for slit in slits: - if slit.name == name: - centre_slit(slit, detector) - -def define_slits(): - slits = [ - Slit( - name="bsf", - x=SlitAxis( - name="bsf_sl_x", - centre_motor=dev.bsf_sl_xcen, - size_motor=dev.bsf_sl_xsize, - scan_func=go_to_peak, - ), - y=SlitAxis( - name="bsf_sl_y", - centre_motor=dev.bsf_sl_ycen, - size_motor=dev.bsf_sl_ysize, - scan_func=go_to_peak, - ), - ), - Slit( - name="ss", - x=SlitAxis( - name="ss_sl_x", - centre_motor=dev.ss_sl_xcen, - size_motor=dev.ss_sl_xsize, - scan_func=go_to_peak, - ), - y=SlitAxis( - name="ss_sl_y", - centre_motor=dev.ss_sl_ycen, - size_motor=dev.ss_sl_ysize, - scan_func=go_to_peak, - ), - ), - Slit( - name="bcu", - x=SlitAxis( - name="bcu_sl_x", - centre_motor=dev.bcu_sl_xcen, - size_motor=dev.bcu_sl_xsize, - scan_func=go_to_peak, - ), - y=SlitAxis( - name="ss_sl_y", - centre_motor=dev.bcu_sl_ycen, - size_motor=dev.bcu_sl_ysize, - scan_func=go_to_peak, - ), - ), - ] - return slits - -def get_mirror_data(history_index: int): - """Read data from the BEC history and return the X and Y data as arrays.""" - motor1 = "vfm_bu" - motor2 = "vfm_bd" - - scan = bec.history[history_index] - md = scan.metadata["bec"] - x1_data = scan.devices[motor1][motor1].read()["value"] - x2_data = scan.devices[motor2][motor2].read()["value"] - y1_data = scan.devices['microscope_stats']['microscope_stats_data_sigma_y'].read()['value'] - y2_data = scan.devices['microscope_stats']['microscope_stats_data_eccentricity'].read()['value'] - np.savetxt("luts/x1_data", x1_data) - np.savetxt("luts/x2_data", x2_data) - np.savetxt("luts/y1_data", y1_data) - np.savetxt("luts/y2_data", y2_data) - - - # plt.imshow(y1_data, cmap="hot") - # plt.clf - # return { - # "signal_name": signal_name, - # "x_data": x_data, - # "y_data": y_data, - # "motor_name": motor_name, - # "scan_number": scan_number, - # } - - -def record_beampos_until(stop_time_str, planner, interval_minutes=10): - """ - Runs `record_beam()` every `interval_minutes` minutes - until the next occurrence of the given stop time (HH:MM). - """ - - # Prepare the file - now = datetime.now() - fnow = now.strftime("%d%m%H%M") - fdir = "/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/macros/" - fname = f"luts/beampos/beampos_{fnow}.csv" - filename = fdir + fname - scam_zoom = dev.scam_zoom.read()['scam_zoom']['value'] - umv(dev.scam_zoom, 1000) - dev.transm.put(0.1) - beam_size = "25 x 25" - - energy = get_current_energy() - - - # Write the header to the file - with open(filename, "w", encoding="utf-8") as f: - f.write(f"Beam size: {beam_size}, Energy: {energy:.0f} eV, Zoom: {scam_zoom}\n") - # f.write("Time,BPM_x,BPM_y,Scin_x,Scin_y,BPM_x,BPM_y\n") - f.write("Time,Scin_x,Scin_y,BPM_x,BPM_y\n") - - - # Parse the stop time (HH:MM) - stop_hour, stop_minute = map(int, stop_time_str.split(":")) - end_time = now.replace(hour=stop_hour, minute=stop_minute, second=0, microsecond=0) - - # If that time already passed today, set it for tomorrow - if end_time <= now: - end_time += timedelta(days=1) - - # Change to beam visualisation state, ensure shutter is closed first - dev.bcu_shutter.put(0) - planner.move_to(BeamlineState.BEAM_VISUALISATION) - - # Start recording beam position - print(f"Starting now ({now:%Y-%m-%d %H:%M}), running until {end_time:%Y-%m-%d %H:%M}") - print(f"Interval: {interval_minutes} minutes\n") - - while datetime.now() < end_time: - record_beam(filename) - next_run = datetime.now() + timedelta(minutes=interval_minutes) - if next_run > end_time: - break - print(f"Next run at {next_run:%H:%M:%S}") - time.sleep(interval_minutes * 60) - - print(f"Finished — reached {end_time:%H:%M}.") - planner.move_to(BeamlineState.MANUAL_SAMPLE_EXCHANGE) - - - - -def record_beam(filename): - """ - Record the beam position to file. - """ - # Set transmission and bpm position - dev.transm.put(0.1) - umv(dev.bcu_bpm_x, 0.43) - umv(dev.bcu_bpm_y, -1.543 ) - - # Open shutter and record positions - dev.bcu_shutter.put(1) - auto_exposure(cam="samcam") - time.sleep(2) - now = datetime.now() - - # Append data to the file - with open(filename, "a", encoding="utf-8") as f: - fnow = now.strftime("%H:%M:%S") - xpos_cam = dev.samcam_x.read()["samcam_x"]["value"] - ypos_cam = dev.samcam_y.read()["samcam_y"]["value"] - # x_bpm, y_bpm = get_beampos() - print(f"Time is {fnow}, X position is {xpos_cam:.5g}, Y position is {ypos_cam:.5g}") - x_bpm, y_bpm = compute_norm() - f.write( - # f"{fnow}, {xpos: .5g}, {ypos: .4g}, {xpos_cam: .5g}, {ypos_cam: .4g}\n" - f"{fnow},{xpos_cam: .5g},{ypos_cam: .4g},{x_bpm: .5g},{y_bpm: .5g}\n" - ) - # Close shutter - dev.bcu_shutter.put(0) - - -def analyse_beampos(file): - """Plot the recorded beam position data""" - # Load the CSV file into a Pandas DataFrame - filedir = "/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/macros/luts/beampos/" - filename = filedir + file - data = pd.read_csv(filename, skiprows=1) - print(data.head()) - - # ref_bpmx = 0.110 - # ref_bmpy = -0.175 - ref_scinx = 1024 - ref_sciny = 980 - scam_zoom = 1000 - - # Extract the first column (time) as the x-axis - meas_time = data["Time"] - - # subtract the reference positions from the measures position - # data["bpm_x"] = data["bpm_x"] - ref_bpmx - # data["bpm_y"] = data["bpm_y"] - ref_bmpy - data["Scin_x"] = (data["Scin_x"] - ref_scinx) * calc_scam_microns(1) - data["Scin_y"] = (data["Scin_y"] - ref_sciny) * calc_scam_microns(1) - - - # Extract Y-position columns (all columns except the first column) - y_positions = data.iloc[:, 1:] # Exclude the first column - - fig, axs = plt.subplots( - 2, 2, figsize=(12, 8), layout="constrained" - ) # Create a 2x2 grid for subplots - # Flatten axs for easy iteration (if axs is a 2D array of axes) - axs = axs.flatten() - # Specify which columns to color differently - red_columns = ["bpm_x", "scin_x"] - - for idx, column in enumerate(y_positions.columns): - ax = axs[idx] # Select the current subplot - - # Determine the color based on the column name - color = "red" if column in red_columns else "blue" - - # Plot the line and scatter with the chosen color - ax.plot(meas_time, y_positions[column], color=color, linewidth=0.5) # Line plot - ax.scatter( - meas_time, y_positions[column], color=color, label=column - ) # Scatter plot - - # Set x-axis tick positions and labels - tick_positions = range(0, len(meas_time), 7) # Adjust the step size as needed - ax.set_xticks(tick_positions) - ax.set_xticklabels([meas_time[i] for i in tick_positions], rotation=45) - - # Add labels, title, legend, and grid to each subplot - ax.set_xlabel("Time") - ax.set_ylabel("beam displacement (microns)") - ax.set_title(f"Beam position at {column}") - ax.legend() - ax.grid(True) - - # Show the resulting figure - plt.show() - -import time -import numpy as np -import matplotlib.pyplot as plt -from epics import caget - - - -def scan_scin_focus(planner, type = 'fine'): - dev.bcu_shutter.put(0) - planner.move_to(BeamlineState.BEAM_VISUALISATION) - dev.bcu_shutter.put(1) - z0 = dev.diag_z.position - - min = 0.1 - max = 9.9 - - - if type == 'fine': - steps = 100 - elif type == 'coarse': - steps = 30 - else: - steps = 60 - - umv(dev.scam_zoom, 1000) - dev.transm.put(0.1) - - auto_exposure("samcam", target=200, max_iter=20) - time.sleep(0.2) - - go_to_peak(dev.diag_z, dev.scam, min, max, steps, relative=True, gomax=True, confirm=False) - dev.bcu_shutter.put(0) diff --git a/pxiii_bec/macros/mx_basics.py b/pxiii_bec/macros/mx_basics.py deleted file mode 100644 index 492234c..0000000 --- a/pxiii_bec/macros/mx_basics.py +++ /dev/null @@ -1,252 +0,0 @@ -"""Get data from an h5 file or BEC history and perform fitting.""" - -import numpy as np -from lmfit.models import ( - GaussianModel, - LorentzianModel, - VoigtModel, - ConstantModel, - LinearModel, -) -from scipy.ndimage import gaussian_filter1d -import h5py -import matplotlib.pyplot as plt - - -def create_fit_parameters( - deriv: bool = False, - model: str = "Voigt", - baseline: str = "Linear", - smoothing: None = None, -): - """Store the fit parameters in a dictionary.""" - # map input model to lmfit model name - model_mappings = { - "Gaussian": GaussianModel, - "Lorentzian": LorentzianModel, - "Voigt": VoigtModel, - "Constant": ConstantModel, - "Linear": LinearModel, - } - return { - "deriv": deriv, - "model": model_mappings[model], - "baseline": model_mappings[baseline], - "smoothing": smoothing, - } - - -def get_data_from_h5(signal_name: str = "lu_bpmsum"): - """Get data from an h5 file.""" - with h5py.File("scan_676.h5", "r") as f: - entry = f["entry"]["collection"] - y_data = entry["devices"][signal_name][signal_name]["value"][:] - motor_data = entry["metadata"]["bec"] - motor_name = motor_data["scan_motors"][0].decode() - scan_number = motor_data["scan_number"][()] - x_data = entry["devices"][motor_name][motor_name]["value"][:] - return { - "x_data": x_data, - "y_data": y_data, - "signal_name": signal_name, - "motor_name": motor_name, - "scan_number": str(scan_number), - } - - -def get_data_from_history( - history_index: int, - signal_name: str = "lu_bpmsum", -): - """Read data from the BEC history and return the X and Y data as arrays.""" - scan = bec.history[history_index] - md = scan.metadata["bec"] - motor_name = md["scan_motors"][0].decode() - scan_number = md["scan_number"] - x_data = scan.devices[motor_name][motor_name].read()["value"] - y_data = scan.devices[signal_name][signal_name].read()["value"] - return { - "signal_name": signal_name, - "x_data": x_data, - "y_data": y_data, - "motor_name": motor_name, - "scan_number": scan_number, - } - - -def process_data(data, fit_params): - """ - Process the signal data for fitting based on derivative or smoothing. - """ - smoothing, deriv = fit_params["smoothing"], fit_params["deriv"] - signal_name = data["signal_name"] - y_data = data["y_data"] - - if deriv: - if smoothing: - y_smooth = gaussian_filter1d(y_data, smoothing) - fitting_data = np.gradient(y_smooth) - signal_name = f"Derivative of smoothed {signal_name}" - else: - fitting_data = np.gradient(y_data) - signal_name = f"Derivative of {signal_name}" - elif smoothing and smoothing > 0.01: - fitting_data = gaussian_filter1d(y_data, smoothing) - signal_name = f"Smoothed {signal_name}" - else: - fitting_data = y_data - - updated_data = { - "y_to_fit": fitting_data, - "signal_name": signal_name, - } - data.update(updated_data) - return data - - -def fit(data, fit_params): - """Fit a signal to a model and return the fitting results.""" - # Create the model - peak_model = fit_params["model"](prefix="peak_") - baseline_model = fit_params["baseline"](prefix="base_") - full_model = peak_model + baseline_model - - # Prepare data - processed_data = process_data(data, fit_params) - params = full_model.make_params() - y_min = np.min(processed_data["y_to_fit"]) - - # Configure baseline parameters - if fit_params["baseline"] == ConstantModel: - params["base_c"].set(value=y_min) - elif fit_params["baseline"] == LinearModel: - params["base_intercept"].set(value=y_min) - params["base_slope"].set(value=0) - - # Add peak-specific parameters - params.update( - peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"]) - ) - - # Perform the fitting - lmfit_result = full_model.fit( - processed_data["y_to_fit"], params, x=processed_data["x_data"] - ) - - # Find the X that gives the max Y - max_index = np.argmax(processed_data["y_to_fit"]) - x_max = processed_data["x_data"][max_index] - - # Generate data for a smoothed fit curve - fit_xdata = np.linspace(np.min(data["x_data"]), np.max(data["x_data"]), 500) - fit_ydata = lmfit_result.eval(x=fit_xdata, params=lmfit_result.params) - - # Collect results - return { - "model": fit_params["model"].__name__, - "fwhm": lmfit_result.params["peak_fwhm"].value, - "centre": lmfit_result.best_values["peak_center"], - "height": lmfit_result.params["peak_height"].value, - "chi_sq": lmfit_result.chisqr, - "lmfit_result": lmfit_result, - "x_max": x_max, - "fit_xdata": fit_xdata, - "fit_ydata": fit_ydata, - } - - -def plot_fitted_data(data, fit_result): - """Plot the original data and the fitted model.""" - plt.plot(data["x_data"], data["y_to_fit"], label="Data") - plt.plot(fit_result['fit_xdata'], fit_result['fit_ydata'], label="Fit") - plt.xlabel(data["motor_name"]) - plt.ylabel(data["signal_name"]) - plt.title(f"Scan {data['scan_number']}, fitted with {fit_result['model']}") - plt.grid(True) - plt.legend() - plt.show() - - -def select_bec_window(dock_area_name="Fitting"): - """Check to see if the fitting results dock is already open and re-create it if not""" - open_docks = bec.gui.windows - if open_docks.get(dock_area_name) is None: - dock_area = bec.gui.new(dock_area_name) - # wf = dock_area.new("Plot").new(bec.gui.available_widgets.Waveform) - wf = dock_area.new(widget='Waveform', object_name='Plot') - text_box = dock_area.new(widget='TextBox', object_name="Results", where="bottom") - else: - wf = bec.gui.Fitting.Plot - text_box = bec.gui.Fitting.Results - return wf, text_box - - -def plot_live_data_bec( - motor_name, - signal_name, - window_name="Fitting" -): - """ - Plotting live data for motor and signal using BEC. - - This function plots live data from a specified motor and signal. - It clears the current plot window, sets its title, labels the axes - with the provided motor and signal names, and initializes live plotting - on the given signal against the motor. - - Args: - motor_name (str): The name of the motor to be used as the x-axis. - signal_name (str): The name of the signal to be used as the y-axis. - - Returns: - None - """ - wf, text_box = select_bec_window(window_name) - text_box.set_plain_text("Plotting live data") - wf.clear_all() - wf.title = "Scan: Live scan" - wf.x_label = motor_name - wf.y_label = signal_name - wf.plot(device_x=motor_name, device_y=signal_name) - - -def plot_fitted_data_bec( - data, - fit_result, -): - """ - Plot fitted data and display fitting parameters in the specified window. - - This function selects a BEC window and plots the original data along with the - fitted function. Additionally, it displays the fitting results in a text - box within the same window for better visualization of the fit results. - - Parameters: - data : dict - Dictionary containing the original dataset, where 'x_data' and 'y_to_fit' - hold the independent variable and the dependent variable, respectively, - 'scan_number' represents the scan number, 'motor_name' and 'signal_name' - provide axis labels. - fit_result : dict - Dictionary containing the results of the fit, including parameters such - as 'centre', 'fwhm', 'height', and the fitted model stored under - 'lmfit_result', with its 'best_fit' attribute representing the fitted data. - """ - wf, text_box = select_bec_window() - fit_text = ( - f"Fit parameters: Centre = {fit_result['centre']:.4f}, " - f"FWHM = {fit_result['fwhm']:.3f}, " - f"Height = {fit_result['height']:.4f}\n" - f"Model = {fit_result['model']}\n" - f"Chi sq = {fit_result['chi_sq']:.3g}" - ) - text_box.set_plain_text(fit_text) - wf.clear_all() - wf.title = f"Scan: {data['scan_number']}" - wf.x_label = data["motor_name"] - wf.y_label = data["signal_name"] - wf.plot(x=data["x_data"], y=data["y_to_fit"], label="Data") - wf.plot(x=fit_result["fit_xdata"], y=fit_result["fit_ydata"], label="Fit") - # wf.Fit.set(symbol_size = 0) - wf.get_curve('Fit').set(symbol_size=0) - diff --git a/pxiii_bec/macros/mx_methods.py b/pxiii_bec/macros/mx_methods.py deleted file mode 100644 index 4714e4f..0000000 --- a/pxiii_bec/macros/mx_methods.py +++ /dev/null @@ -1,332 +0,0 @@ -"""Use the methods in mx_basics to perform: -1) a go_to_peak scan, that scans a motor, finds the peak position and moves to peak -2) fits data from a bec history file -""" - -from dataclasses import dataclass -import numpy as np - -# from pxiii_parameters import FitDefaults, BPMScans, MirrorConfig - -# from mx_basics import ( -# create_fit_parameters, -# get_data_from_history, -# fit, -# plot_fitted_data_bec, -# plot_live_data_bec, -# ) - - -@dataclass(frozen=True) -class FitDefaults: - """Default values for fitting routines""" - - # Constants for default models, baselines, and parameters - MODEL = "Voigt" - BASELINE = "Linear" - SETTLE_TIME = 0.1 - RELATIVE_MODE = True - - -# Method functions -def calculate_step_size(start: float, stop: float, steps: int) -> float: - """ - Provides the function to calculate the step size for dividing a specified range - into a given number of steps. - - Args: - start: The starting value of the range. - stop: The stopping value of the range. - steps: The number of steps to divide the range into. Must be at least 1. - - Raises: - ValueError: If the steps value is less than 1. - - Returns: - The calculated step size as a float, rounded to three decimal places. - """ - if steps < 1: - raise ValueError("Number of steps must be at least 1.") - return round((stop - start) / steps, 3) - - -def move_to_position(motor_device, motor_name: str, position: float, data: dict): - """ - Function to move a specified motor device to a given position. - - The function verifies if the requested position is within the scan range of the - motor device provided. If the position is outside the range, the motor is - moved to the center of its scan range, an error message is raised, and the - operation is halted. If the position is valid, the motor is moved to the - specified position. - - Parameters: - motor_device: The motor device to be moved. - motor_name: str - The name of the motor as a string - position: float - The desired position to move the motor to. Position should be within - the scan range of the motor determined by the provided data. - data: dict - A dictionary containing "x_data", which is used to determine the - scan range of the motor. - - Raises: - ValueError: Raised if the specified position is outside the valid scan - range determined by "x_data" in the data dictionary. The motor will - return to the center of its scan range in this case. - """ - - motor_min = np.min(data["x_data"]) - motor_max = np.max(data["x_data"]) - motor_centre = (motor_max + motor_min) / 2 - - if not motor_min <= position <= motor_max: - scans.umv(motor_device, motor_centre, relative=False) - msg = ( - f"Position {position: .2f} is outside the scan range of " - f"{motor_min: .2f} to {motor_max: .2f}. " - f"Returning to centre of scan range {motor_centre: .3f}." - ) - raise ValueError(msg) - motor_position = round(position, 4) - scans.umv(motor_device, motor_position, relative=False) - print(f"\n Moving {motor_name} to position {motor_position: .3f}") - - -# @dataclass(frozen=True) -# class FitDefaults: -# """Default values for fitting routines""" - -# # Constants for default models, baselines, and parameters -# MODEL = "Voigt" -# BASELINE = "Linear" -# SETTLE_TIME = 0.1 -# RELATIVE_MODE = True - - -def go_to_peak( - motor_device, - signal_device, - start: float, - stop: float, - steps: int, - relative: bool = FitDefaults.RELATIVE_MODE, - plot: bool = True, - settle: float = FitDefaults.SETTLE_TIME, - confirm: bool = True, - gomax: bool = False, -): - """ - Go to the peak of a signal by scanning a motor within a specified range and - identifying the optimal position based on signal peak data. - - Parameters: - motor_device: The motor device to be scanned. - signal_device: The signal device to monitor during the scan. - start (float): The starting position of the scan. Ignored if `relative` is True. - stop (float): The ending position of the scan. Ignored if `relative` is True. - steps (int): The number of steps to divide the scan range into. - relative (bool, optional): If True, interpret `start` and `stop` as relative to - the current motor position. Defaults to RELATIVE_MODE constant. - plot (bool, optional): If True, plot the scan data and the fitted results. - Defaults to True. - settle (float, optional): The time in seconds to wait after each step for the - signal to stabilize. Defaults to DEFAULT_SETTLE_TIME constant. - confirm (bool, optional): If True, ask for user confirmation before starting - the scan. Defaults to True. - - Raises: - Exception: Raises exceptions potentially raised by dependent functions or - operations such as plotting, fitting, or motor movement. - - Returns: - None - """ - motor_name = motor_device.name - signal_name = signal_device.name - # wf.plot(x_name=motor_name, y_name=signal_name) - if plot: - plot_live_data_bec(motor_name, signal_name) - - # Validate and calculate step size - step_size = calculate_step_size(start, stop, steps) - - # Confirm the scan range - # current_motor_position = motor_device.user_readback.get() - current_motor_position = motor_device.read()[motor_name]["value"] - if confirm: - if relative: - scan_start = current_motor_position + start - scan_end = current_motor_position + stop - print( - f"\nScanning from {scan_start: .6g} to {scan_end: .6g} in " - f"{steps} steps of size {step_size}" - ) - print(f"Relative mode = {relative}") - else: - print( - f"\nScanning from {start: .5g} to {stop: .5g} in {steps} steps of size {step_size}" - ) - print(f"Relative mode = {relative}") - input("Press Enter to continue...") - # Perform the scan - scan_result = scans.line_scan( - motor_device, start, stop, steps=steps, relative=relative, settling_time=settle - ) - motor_data = scan_result.scan.live_data[motor_name][motor_name].val - signal_data = scan_result.scan.live_data[signal_name][signal_name].val - scan_number = "Current" - - data = { - "x_data": np.array(motor_data), - "y_data": np.array(signal_data), - "motor_name": motor_name, - "signal_name": signal_name, - "motor_device": motor_device, - "scan_number": scan_number, - } - - # Define and fit model to scan data - fit_params = create_fit_parameters(False, FitDefaults.MODEL, FitDefaults.BASELINE) - fit_result = fit(data, fit_params) - - # Plot the fitted data if plot = True - if plot: - plot_fitted_data_bec(data, fit_result) - - # If gomax is set then move to the maximum value, rather than the fit centre - if gomax: - value = fit_result["x_max"] - print(f"Max position is at {value}") - move_to_position(data["motor_device"], data["motor_name"], fit_result["x_max"], data) - else: - # Safely move the motor to the peak position - move_to_position(data["motor_device"], data["motor_name"], fit_result["centre"], data) - - -def fit_history( - history_index: int, - signal_name: str, - deriv: bool = False, - model: str = FitDefaults.MODEL, - move_to_peak: bool = False, -): - """ - Retrieve and analyze historical data by fitting a model, optionally moving to - a peak position. - - Parameters: - history_index (int): Index of the historical data set to retrieve. - signal_name (str): Name of the signal to fit. - deriv (bool, optional): Whether to include the derivative in the fitting - procedure. Defaults to False. - model (str, optional): Name of the model to use for fitting. Defaults to - DEFAULT_MODEL. - move_to_peak (bool, optional): Whether to move the motor to the peak position - after fitting. Defaults to False. - - Raises: - KeyError: If required keys are not found in the retrieved data dictionary. - ValueError: If the fitting process fails or produces invalid results. - - Returns: - None - """ - # Retrieve historical data - data = get_data_from_history(history_index, signal_name) - - # Define fitting parameters - fit_params = create_fit_parameters(deriv, model, FitDefaults.BASELINE) - - # Perform fit and plot the data - fit_result = fit(data, fit_params) - plot_fitted_data_bec(data, fit_result) - - # Optionally move the motor to the peak position - if move_to_peak: - move_to_position(data["motor_device"], data["motor_name"], fit_result["centre"], data) - - -def scan_bpm(bpmname): - """ - Runs a grid scan of a BPM in x and y, and plots each channel - as a heatmap. - - Parameters: - bpmname: the name of the bpm to be scanned e.g. "fe" - - """ - - # Open a dock area and set up the heatmaps - dock_area = bec.gui.new("XBPM_Scan") - wf5 = dock_area.new("Sum").new(bec.gui.available_widgets.Heatmap) - wf1 = dock_area.new("Ch1", relative_to="Sum", position="bottom").new( - bec.gui.available_widgets.Heatmap - ) - wf3 = dock_area.new("Ch3", relative_to="Ch1", position="right").new( - bec.gui.available_widgets.Heatmap - ) - wf4 = dock_area.new("Ch4", relative_to="Ch3", position="bottom").new( - bec.gui.available_widgets.Heatmap - ) - wf2 = dock_area.new("Ch2", relative_to="Ch1", position="bottom").new( - bec.gui.available_widgets.Heatmap - ) - wfscan = dock_area.new("ScanControl").new(bec.gui.available_widgets.ScanControl) - - cfg = getattr(BPMScans, bpmname) - - wf1.x_label = cfg["x_name"] - wf1.y_label = cfg["y_name"] - wf1.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z1_name"], color_map="plasma") - - wf2.x_label = cfg["x_name"] - wf2.y_label = cfg["y_name"] - wf2.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z2_name"], color_map="plasma") - - wf3.x_label = cfg["x_name"] - wf3.y_label = cfg["y_name"] - wf3.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z3_name"], color_map="plasma") - - wf4.x_label = cfg["x_name"] - wf4.y_label = cfg["y_name"] - wf4.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z4_name"], color_map="plasma") - - wf5.x_label = cfg["x_name"] - wf5.y_label = cfg["y_name"] - wf5.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z5_name"], color_map="plasma") - # Run the scan - x_mot = cfg["x_device"] - y_mot = cfg["y_device"] - # scans.grid_scan(x_mot, -0.5, 0.5, 20, y_mot, -0.5, 0.5, 20, - # exp_time=0.5, relative=False, snaked=True) - - -def optimise_kb(mirror): - """ - Runs a grid scan of a the upstream and downstream benders, - and plots a heatmap of the sample camera x or y sigma. - - Parameters: - mirror: either "hfm" or :vfm" - - """ - - # Open a dock area and set up the heatmaps - dock_area = bec.gui.new(mirror) - wf1 = dock_area.new("Heatmap").new(bec.gui.available_widgets.Heatmap) - - wfscan = dock_area.new("ScanControl").new(bec.gui.available_widgets.ScanControl) - - cfg = getattr(MirrorConfig, mirror) - - wf1.x_label = cfg["bu_name"] - wf1.y_label = cfg["bd_name"] - wf1.plot(x_name=cfg["bu_name"], y_name=cfg["bd_name"], z_name=cfg["z_name"], color_map="plasma") - - # Run the scan - x_mot = cfg["x_device"] - y_mot = cfg["y_device"] - # scans.grid_scan(x_mot, -0.02, 0.02, 11, y_mot, -0.02, 0.02, 11, - # exp_time=0.5, relative=True, snaked=True) diff --git a/pxiii_bec/macros/mxcomm.tar b/pxiii_bec/macros/mxcomm.tar new file mode 100644 index 0000000..528b193 Binary files /dev/null and b/pxiii_bec/macros/mxcomm.tar differ diff --git a/pxiii_bec/macros/mxcomm_analysis.py b/pxiii_bec/macros/mxcomm_analysis.py new file mode 100644 index 0000000..f12d466 --- /dev/null +++ b/pxiii_bec/macros/mxcomm_analysis.py @@ -0,0 +1,320 @@ +"""Functions for fitting scan data""" + +from dataclasses import dataclass +import numpy as np +from lmfit.models import GaussianModel, LorentzianModel, VoigtModel, ConstantModel, LinearModel +from scipy.ndimage import gaussian_filter1d + + +@dataclass(frozen=True) +class FitDefaults: + """Default values for fitting routines""" + + # Constants for default models, baselines, and parameters + MODEL = "Voigt" + BASELINE = "Linear" + + +def create_fit_parameters( + deriv: bool = False, + negative: bool = False, + model: str = "Voigt", + baseline: str = "Linear", + smoothing: None = None, +): + """Store the fit parameters in a dictionary + + Parameters: optional derivative, negative peak, fit model, + baseline model, optional smoothing + Returns: dictionary of fit parameters + """ + # map input model to lmfit model name + model_mappings = { + "Gaussian": GaussianModel, + "Lorentzian": LorentzianModel, + "Voigt": VoigtModel, + "Constant": ConstantModel, + "Linear": LinearModel, + } + return { + "deriv": deriv, + "negative": negative, + "model": model_mappings[model], + "baseline": model_mappings[baseline], + "smoothing": smoothing, + } + + +def process_data(data, fit_params): + """ + Process the signal data for fitting based on derivative or smoothing + + Parameters: data and fitting parameter dictionary + Returns: processed data + """ + smoothing = fit_params["smoothing"] + deriv = fit_params["deriv"] + negative = fit_params["negative"] + + signal_name = data["signal_name"] + y_data = data["y_data"] + + if smoothing and smoothing > 0.01: + fitting_data = gaussian_filter1d(y_data, smoothing) + signal_name = f"Smoothed {signal_name}" + else: + fitting_data = y_data.copy() + + if deriv: + fitting_data = np.gradient(fitting_data) + signal_name = f"Derivative of {signal_name}" + + if negative: + fitting_data = -fitting_data + signal_name = f"Negative {signal_name}" + + data.update({"y_to_fit": fitting_data, "signal_name": signal_name}) + return data + + +def fit(data, fit_params): + """Fit a signal to a model and return the fitting results + + Parameters: data and fitting parameters dictionary + Returns: Fit results and quality indicators + """ + + # Create the model + peak_model = fit_params["model"](prefix="peak_") + baseline_model = fit_params["baseline"](prefix="base_") + full_model = peak_model + baseline_model + + # Prepare data + processed_data = process_data(data, fit_params) + params = full_model.make_params() + y_min = np.min(processed_data["y_to_fit"]) + + # Configure baseline parameters + if fit_params["baseline"] == ConstantModel: + params["base_c"].set(value=y_min) + elif fit_params["baseline"] == LinearModel: + params["base_intercept"].set(value=y_min) + params["base_slope"].set(value=0) + + # Add peak-specific parameters + params.update(peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"])) + + # Perform the fitting + lmfit_result = full_model.fit(processed_data["y_to_fit"], params, x=processed_data["x_data"]) + + # Find the X that gives the max Y + max_index = np.argmax(processed_data["y_to_fit"]) + x_max = processed_data["x_data"][max_index] + + # Generate data for a smoothed fit curve + fit_xdata = np.linspace(np.min(data["x_data"]), np.max(data["x_data"]), 500) + fit_ydata = lmfit_result.eval(x=fit_xdata, params=lmfit_result.params) + + # Fit diagnostics + residuals = lmfit_result.residual + noise = np.std(residuals) + + height = lmfit_result.params["peak_height"].value + centre = lmfit_result.best_values["peak_center"] + fwhm = lmfit_result.params["peak_fwhm"].value + + centre_stderr = lmfit_result.params["peak_center"].stderr + height_stderr = lmfit_result.params["peak_height"].stderr + + snr = height / noise if noise > 0 else np.inf + + # Collect results + return { + "model": fit_params["model"].__name__, + "fwhm": fwhm, + "centre": centre, + "height": height, + # Fit quality + "chi_sq": lmfit_result.chisqr, + "redchi": lmfit_result.redchi, + "aic": lmfit_result.aic, + "bic": lmfit_result.bic, + "noise": noise, + "snr": snr, + "centre_stderr": centre_stderr, + "height_stderr": height_stderr, + # Existing information + "lmfit_result": lmfit_result, + "x_max": x_max, + "fit_xdata": fit_xdata, + "fit_ydata": fit_ydata, + } + + +def check_peak_fit(x_data, result, min_fwhm_steps=3): + """Check whether a fitted peak is reliable + Parameters: X data, results from the fit step + Returns: success or problems""" + + x_data = np.asarray(x_data) + + x_min = np.min(x_data) + x_max = np.max(x_data) + scan_range = x_max - x_min + step = np.median(np.diff(np.sort(x_data))) + + centre = result["centre"] + fwhm = result["fwhm"] + + step_size = np.mean(np.diff(x_data)) + fwhm_steps = result["fwhm"] / abs(step_size) + + problems = [] + + if not x_min + 0.1 * scan_range < centre < x_max - 0.1 * scan_range: + problems.append("peak centre is too close to scan edge") + + if fwhm < min_fwhm_steps * step: + problems.append( + f"Peak FWHM spans only {fwhm_steps:.2f} scan steps " f"(minimum {min_fwhm_steps})" + ) + + if fwhm > 0.7 * scan_range: + problems.append("peak is too broad for scan range") + + if result["snr"] < 5: + problems.append(f"low SNR ({result['snr']:.1f})") + + centre_stderr = result["centre_stderr"] + + if centre_stderr is None: + problems.append("centre uncertainty could not be estimated") + elif centre_stderr > 0.2 * fwhm: + problems.append(f"centre uncertainty is large " f"({centre_stderr:.3g})") + + return {"success": not problems, "problems": problems} + + +def find_edge_offset(x, y, fraction=0.5, offset=0.0): + """ + Find a single signal edge and calculate a target position + at a known offset from that edge. + Parameters: xdata, ydata, fraction of edge, description, offset + Returns: edge, centre, threshold + """ + + x = np.asarray(x) + y = np.asarray(y) + + y_min = np.min(y) + y_max = np.max(y) + + threshold = y_min + fraction * (y_max - y_min) + + # Find threshold crossings + crossings = np.where(np.diff(np.sign(y - threshold)) != 0)[0] + + if len(crossings) == 0: + raise RuntimeError("No edge found in scan") + + # If we expect only one useful edge, use the strongest/first one + i = crossings[0] + + # Linear interpolation for more accurate edge position + x1, x2 = x[i], x[i + 1] + y1, y2 = y[i], y[i + 1] + + edge = x1 + (threshold - y1) * (x2 - x1) / (y2 - y1) + + centre = edge + offset + + return {"edge": edge, "centre": centre, "threshold": threshold} + + +def find_feature_centre(x, y, feature="peak", fraction=0.5): + """ + Find the centre of a peak-like or dip-like region from its two edges. + + Parameters + ---------- + x, y : array-like + Scan positions and measured signal. + + mode : {"peak", "dip"} + "peak": + Feature is the high-signal region, e.g. collimator scan. + + "dip": + Feature is the low-signal region, e.g. beamstop scan. + + fraction : float + Fraction of the signal range used for the edge threshold. + 0.5 means the 50% crossing points. + + Returns + ------- + dict + centre + left_edge + right_edge + width + threshold + """ + + x = np.asarray(x, dtype=float) + y = np.asarray(y, dtype=float) + + y_low = np.min(y) + y_high = np.max(y) + + threshold = y_low + fraction * (y_high - y_low) + + if feature == "peak": + inside = y >= threshold + + elif feature == "dip": + inside = y <= threshold + + else: + raise ValueError("mode must be 'peak' or 'dip'") + + # Find transitions into and out of the feature + transitions = np.diff(inside.astype(int)) + + entering = np.where(transitions == 1)[0] + leaving = np.where(transitions == -1)[0] + + if len(entering) == 0 or len(leaving) == 0: + raise ValueError("Could not find both feature edges") + + # Use first entrance and last exit + left_idx = entering[0] + right_idx = leaving[-1] + + left_edge = interpolate_crossing( + x[left_idx], y[left_idx], x[left_idx + 1], y[left_idx + 1], threshold + ) + + right_edge = interpolate_crossing( + x[right_idx], y[right_idx], x[right_idx + 1], y[right_idx + 1], threshold + ) + + centre = 0.5 * (left_edge + right_edge) + width = right_edge - left_edge + + return { + "centre": centre, + "left_edge": left_edge, + "right_edge": right_edge, + "width": width, + "threshold": threshold, + } + + +def interpolate_crossing(x1, y1, x2, y2, threshold): + """Linearly interpolate the x position where y crosses threshold.""" + + if y2 == y1: + return 0.5 * (x1 + x2) + + return x1 + (threshold - y1) * (x2 - x1) / (y2 - y1) diff --git a/pxiii_bec/macros/mxcomm_data.py b/pxiii_bec/macros/mxcomm_data.py new file mode 100644 index 0000000..b01b6ba --- /dev/null +++ b/pxiii_bec/macros/mxcomm_data.py @@ -0,0 +1,99 @@ +"""Get data from scan number, BEC history or H5 files""" + +import h5py + +# def get_data_from_h5(signal_name: str = "lu_bpmsum"): +# """Get data from an h5 file.""" +# root, name = get_signal_values(signal_name) +# with h5py.File("scan_676.h5", "r") as f: +# entry = f["entry"]["collection"] +# y_data = entry["devices"][root][name]["value"][:] +# motor_data = entry["metadata"]["bec"] +# motor_name = motor_data["scan_motors"][0].decode() +# scan_number = motor_data["scan_number"][()] +# x_data = entry["devices"][motor_name][motor_name]["value"][:] +# return { +# "x_data": x_data, +# "y_data": y_data, +# "signal_name": signal_name, +# "motor_name": motor_name, +# "scan_number": str(scan_number), +# } + + +def get_history(scan): + """Get scan container from the bec history + Parameters: scan number or relative number + Returns: scan container + + """ + + if isinstance(scan, int): + if scan < 0: + return bec.history[scan] + return bec.history.get_by_scan_number(scan) + # return bec.history.get_by_dataset_number(scan) + return scan + + +def get_data_from_history(scan: int, signal_dev): + """Get scan data from the BEC history + Parameters: scan number or relative number + Returns: the X and Y data as arrays + signal name, motor name and scan number + + """ + + data = get_history(scan) + md = data.metadata["bec"] + motor_name = md["scan_report_devices"][0].decode() + if "." in motor_name: + root = motor_name.split(".")[0] + name = motor_name.replace(".", "_") + else: + root = motor_name + name = motor_name + + x_data = data.devices[root][name].read()["value"] + y_res = get_value(signal_dev, True) + y_data = data.devices[y_res["root"]][y_res["name"]].read()["value"] + signal_name = y_res["name"] + + scan_number = md["scan_number"] + + return { + "signal_name": signal_name, + "x_data": x_data, + "y_data": y_data, + "motor_name": motor_name, + "scan_number": float(scan_number), + } + + +def get_value(dev_name, details=False): + """Get the value of a device + Parameters: device, details: bool + Returns: value or full details + + """ + + if dev_name == dev.scam: + root = "scam" + live_root = "scam" + name = "scam_contrast" + value = dev_name.read(cached=True)[name]["value"] + else: + try: + name = live_root = root = dev_name.name + value = dev_name.read(cached=True)[name]["value"] + except: + print("non-standard device") + root = dev_name.dotted_name + name = dev_name.full_name + live_root = dev_name.parent.name + value = dev_name.read(cached=True)[name]["value"] + + if details: + return {"value": value, "root": root, "name": name, "live_root": live_root} + + return value diff --git a/pxiii_bec/macros/mxcomm_plot.py b/pxiii_bec/macros/mxcomm_plot.py new file mode 100644 index 0000000..384761c --- /dev/null +++ b/pxiii_bec/macros/mxcomm_plot.py @@ -0,0 +1,119 @@ +"""Plotting routines for MX scans and fits in BEC.""" + + +def select_bec_window(window_name="Fitting"): + """ + Return the plot and results widgets for a BEC window. + + If the requested window does not already exist, it is created with + a Waveform plot and a TextBox for results. + """ + + open_docks = bec.gui.windows + + if open_docks.get(window_name) is None: + dock_area = bec.gui.new(window_name) + + plot_widget = dock_area.new(widget="Waveform", object_name="Plot") + + text_widget = dock_area.new(widget="TextBox", object_name="Results", where="bottom") + + else: + dock_area = open_docks[window_name] + plot_widget = dock_area.Plot + text_widget = dock_area.Results + + return plot_widget, text_widget + + +def plot_live_data( + motor_name, signal_name, window_name="Fitting", plot_widget=None, title="Live scan" +): + """ + Start live plotting of a signal against a motor in BEC. + + If plot_widget is supplied, the data are plotted in that widget. + Otherwise, the standard BEC fitting window is used. + """ + if isinstance(plot_widget, str): + dock_area = bec.gui.windows[window_name] + wf = getattr(dock_area, plot_widget) + + elif plot_widget is not None: + wf = plot_widget + else: + wf, text_widget = select_bec_window(window_name) + text_widget.set_plain_text("Plotting live data") + + wf.clear_all() + wf.title = title + wf.x_label = motor_name + wf.y_label = signal_name + + wf.plot(device_x=motor_name, device_y=signal_name) + + +def plot_fitted_data(data, fit_result, window_name="Fitting", plot_widget=None, title=None): + """ + Plot completed scan data and its fitted curve in BEC. + + If plot_widget is supplied, the fit is plotted in that widget. + Otherwise, the standard BEC fitting window is used and the fitting + results are displayed in its results text box. + """ + if isinstance(plot_widget, str): + dock_area = bec.gui.windows[window_name] + wf = getattr(dock_area, plot_widget) + + elif plot_widget is not None: + wf = plot_widget + + else: + wf, text_widget = select_bec_window(window_name) + + fit_text = ( + f"Centre = {fit_result['centre']:.5g}\n" + f"FWHM = {fit_result['fwhm']:.5f}\n" + f"Height = {fit_result['height']:.4g}\n" + f"Model = {fit_result['model']}\n" + f"Centre_StdErr = {fit_result['centre_stderr']:.3g}\n" + f"SNR = {fit_result['snr']:.3g}" + ) + + text_widget.set_plain_text(fit_text) + + wf.clear_all() + wf.title = f"Scan: {data['scan_number']}" + wf.x_label = data["motor_name"] + wf.y_label = data["signal_name"] + + wf.plot(x=data["x_data"], y=data["y_to_fit"], label="Data") + + wf.plot(x=fit_result["fit_xdata"], y=fit_result["fit_ydata"], label="Fit") + + # Display the fitted curve as a line without symbols. + wf.get_curve("Fit").set(symbol_size=0) + + +def plot_scan_data(data, window_name="Fitting", plot_widget=None, title=None): + """Plot completed scan data without a fitted curve.""" + + if isinstance(plot_widget, str): + dock_area = bec.gui.windows[window_name] + wf = getattr(dock_area, plot_widget) + + elif plot_widget is not None: + wf = plot_widget + + else: + wf, text_widget = select_bec_window(window_name) + text_widget.set_plain_text("Fit rejected") + + # Clear the live plot/subscription + wf.clear_all() + + wf.title = title or f"Scan: {data['scan_number']}" + wf.x_label = data["motor_name"] + wf.y_label = data["signal_name"] + + wf.plot(x=data["x_data"], y=data["y_data"], label="Data") diff --git a/pxiii_bec/macros/mxcomm_scan.py b/pxiii_bec/macros/mxcomm_scan.py new file mode 100755 index 0000000..deed280 --- /dev/null +++ b/pxiii_bec/macros/mxcomm_scan.py @@ -0,0 +1,551 @@ +"""Custom scan routines: +1) a go_to_peak scan, that scans a motor, finds the peak position and moves to peak +2) a find feature scan, that finds a non-Gaussian peak or dip or an edge +""" + +from dataclasses import dataclass +import numpy as np + + +@dataclass(frozen=True) +class ScanDefaults: + """Default values for fitting routines""" + + # Preferred scan parameters + SETTLE_TIME = 0.1 + RELATIVE_MODE = True + + +# Method functions +def calculate_step_size(start: float, stop: float, steps: int) -> float: + """ + Provides the function to calculate the step size for dividing a specified range + into a given number of steps. + + Args: + start: The starting value of the range. + stop: The stopping value of the range. + steps: The number of steps to divide the range into. Must be at least 1. + + Raises: + ValueError: If the steps value is less than 1. + + Returns: + The calculated step size as a float, rounded to three decimal places. + """ + if steps < 1: + raise ValueError("Number of steps must be at least 1.") + return round((stop - start) / (steps - 1), 5) + + +def move_to_scan_position(motor_device, motor_name: str, position: float, data: dict): + """ + Function to move a specified motor device to a given position. + + The function verifies if the requested position is within the scan range of the + motor device provided. If the position is outside the range, the motor is + moved to the center of its scan range, an error message is raised, and the + operation is halted. If the position is valid, the motor is moved to the + specified position. + + Parameters: + motor_device: The motor device to be moved. + motor_name: str + The name of the motor as a string + position: float + The desired position to move the motor to. Position should be within + the scan range of the motor determined by the provided data. + data: dict + A dictionary containing "x_data", which is used to determine the + scan range of the motor. + + Raises: + ValueError: Raised if the specified position is outside the valid scan + range determined by "x_data" in the data dictionary. The motor will + return to the center of its scan range in this case. + """ + + motor_min = np.min(data["x_data"]) + motor_max = np.max(data["x_data"]) + motor_centre = (motor_max + motor_min) / 2 + + if not motor_min <= position <= motor_max: + scans.umv(motor_device, motor_centre, relative=False) + msg = ( + f"Position {position: .2f} is outside the scan range of " + f"{motor_min: .2f} to {motor_max: .2f}. " + f"Returning to centre of scan range {motor_centre: .3f}." + ) + raise ValueError(msg) + motor_position = round(position, 4) + scans.umv(motor_device, motor_position, relative=False) + print(f"\n Moving {motor_name} to position {motor_position: .3f}") + + +def restore_position(motor_device, position): + """Return a motor to its position before the scan.""" + scans.umv(motor_device, position, relative=False) + + +def go_to_peak( + motor_device, + signal_device, + start: float, + stop: float, + steps: int, + relative: bool = ScanDefaults.RELATIVE_MODE, + plot: bool = True, + settle: float = ScanDefaults.SETTLE_TIME, + confirm: bool = True, + gomax: bool = False, + negative: bool = False, + gap: bool = False, + min_fwhm_steps: float = 3, + window_name: str = "Fitting", + plot_widget=None, +): + """ + Scan a motor and move either to the fitted peak centre or the + highest measured data point. + + If gomax=False: + Fit the scan, validate the fit using check_peak_fit(), + and move to the fitted centre. + + If gomax=True: + Skip peak-fit validation and move directly to the highest + measured signal value. Information about whether the maximum + occurred at a scan boundary is returned. + + Parameters + ---------- + motor_device + Motor device to scan. + signal_device + Signal device to monitor. + start : float + Scan start position. + stop : float + Scan end position. + steps : int + Number of scan steps. + relative : bool + If True, start and stop are relative to current motor position. + plot : bool + Plot scan data/results. + settle : float + Settling time at each scan point. + confirm : bool + Ask for confirmation before starting scan. + gomax : bool + If True, move to highest measured point rather than fitted centre. + negative : bool + Fit a negative-going peak. + gap : bool + Apply minimum-gap protection when using fitted peak position. + min_fwhm_steps : float + Minimum allowed fitted FWHM in scan steps. Only used when + gomax=False. + window_name : str + BEC GUI window name. + plot_widget + Optional explicit plot widget. + + Returns + ------- + dict + Result information. + + For a successful fitted peak: + success + problems + centre + fwhm + height + chi_sq + centre_stderr + snr + + For gomax=True: + success + problems + x_max + max_index + at_lower_boundary + at_upper_boundary + + For a rejected fit: + success=False + problems=list of fit rejection reasons + """ + + # ------------------------------------------------------------ + # Get motor and signal names + # ------------------------------------------------------------ + + mres = get_value(motor_device, True) + motor_name = mres["root"] + + sres = get_value(signal_device, True) + signal_name = sres["root"] + + print(f"Signal name is {signal_name}") + + # ------------------------------------------------------------ + # Set up live plotting + # ------------------------------------------------------------ + + if plot: + plot_live_data( + motor_name, + signal_name, + window_name=window_name, + plot_widget=plot_widget, + title=f"{motor_name} scan", + ) + + # ------------------------------------------------------------ + # Validate scan range and get starting position + # ------------------------------------------------------------ + + step_size = calculate_step_size(start, stop, steps) + + starting_position = mres["value"] + + print(f"Starting motor position = {starting_position}") + + if confirm: + if relative: + scan_start = starting_position + start + scan_end = starting_position + stop + + print( + f"\nScanning from {scan_start:.6g} to {scan_end:.6g} " + f"in {steps} steps of size {step_size}" + ) + print(f"Relative mode = {relative}") + + else: + print( + f"\nScanning from {start:.5g} to {stop:.5g} " + f"in {steps} steps of size {step_size}" + ) + print(f"Relative mode = {relative}") + + input("Press Enter to continue...") + + # ------------------------------------------------------------ + # Perform scan + # ------------------------------------------------------------ + + scan_result = scans.line_scan( + motor_device, start, stop, steps=steps, relative=relative, settling_time=settle + ) + + motor_data = scan_result.scan.live_data[mres["live_root"]][mres["name"]].val + + signal_data = scan_result.scan.live_data[sres["root"]][sres["name"]].val + + scan_number = "Current" + + data = { + "x_data": np.array(motor_data), + "y_data": np.array(signal_data), + "motor_name": motor_name, + "signal_name": signal_name, + "motor_device": motor_device, + "scan_number": scan_number, + } + + # ============================================================ + # GOMAX MODE + # ============================================================ + # + # Do not fit or apply peak-shape validation. + # Simply use the highest measured point. + # + + if gomax: + + if negative: + max_index = int(np.argmin(data["y_data"])) + else: + max_index = int(np.argmax(data["y_data"])) + + x_max = float(data["x_data"][max_index]) + + at_lower_boundary = max_index == 0 + at_upper_boundary = max_index == len(data["x_data"]) - 1 + + print(f"Maximum measured signal at {x_max:.6g}") + + if at_lower_boundary: + print("Maximum is at the lower scan boundary") + + if at_upper_boundary: + print("Maximum is at the upper scan boundary") + + # Plot raw scan rather than trying to assess a fitted peak + if plot: + plot_scan_data( + data, + window_name=window_name, + plot_widget=plot_widget, + title=f"{motor_name} scan - maximum at {x_max:.6g}", + ) + + # Move to measured maximum + move_to_scan_position(data["motor_device"], data["motor_name"], x_max, data) + + return { + "success": True, + "problems": [], + "x_max": x_max, + "max_index": max_index, + "at_lower_boundary": at_lower_boundary, + "at_upper_boundary": at_upper_boundary, + } + + # ============================================================ + # FITTED PEAK MODE + # ============================================================ + + fit_params = create_fit_parameters( + deriv=False, negative=negative, model=FitDefaults.MODEL, baseline=FitDefaults.BASELINE + ) + + fit_result = fit(data, fit_params) + + # ------------------------------------------------------------ + # Validate fitted peak + # ------------------------------------------------------------ + + check = check_peak_fit(data["x_data"], fit_result, min_fwhm_steps=min_fwhm_steps) + + if not check["success"]: + + print("Peak fit rejected:") + + for problem in check["problems"]: + print(f" - {problem}") + + if plot: + plot_scan_data( + data, + window_name=window_name, + plot_widget=plot_widget, + title=f"{motor_name} scan - FIT REJECTED", + ) + + print(f"Returning motor to start position, " f"{starting_position:.5g}") + + restore_position(motor_device, starting_position) + + return {"success": False, "problems": check["problems"]} + + # ------------------------------------------------------------ + # Plot accepted fit + # ------------------------------------------------------------ + + if plot: + plot_fitted_data(data, fit_result, window_name=window_name, plot_widget=plot_widget) + + # ------------------------------------------------------------ + # Move to fitted peak centre + # ------------------------------------------------------------ + + centre = fit_result["centre"] + + if gap and centre < 4.5: + print(f"Fitted gap position {centre:.5g} mm is below " "minimum gap of 4.5 mm") + umv(dev.id_gap, 4.5) + + else: + move_to_scan_position(data["motor_device"], data["motor_name"], centre, data) + + # ------------------------------------------------------------ + # Return successful fit information + # ------------------------------------------------------------ + + return { + "success": True, + "problems": [], + "centre": centre, + "fwhm": float(fit_result["fwhm"]), + "height": float(fit_result["height"]), + "chi_sq": float(fit_result["chi_sq"]), + "centre_stderr": float(fit_result["centre_stderr"]), + "snr": float(fit_result["snr"]), + } + + +def fit_history( + history_index: int, + signal_name: str, + deriv: bool = False, + negative: bool = False, + smoothing: bool = False, + model: str = "Voigt", + move_to_peak: bool = False, +): + """ + Retrieve and analyze historical data by fitting a model, optionally moving to + a peak position. + + Parameters: + history_index (int): Index of the historical data set to retrieve. + signal_name (str): Name of the signal to fit. + deriv (bool, optional): Whether to include the derivative in the fitting + procedure. Defaults to False. + model (str, optional): Name of the model to use for fitting. Defaults to + DEFAULT_MODEL. + move_to_peak (bool, optional): Whether to move the motor to the peak position + after fitting. Defaults to False. + + Raises: + KeyError: If required keys are not found in the retrieved data dictionary. + ValueError: If the fitting process fails or produces invalid results. + + Returns: + None + """ + # Retrieve historical data + data = get_data_from_history(history_index, signal_name) + + # Define fitting parameters + fit_params = create_fit_parameters(deriv, negative, model, FitDefaults.BASELINE) + + # Perform fit and plot the data + fit_result = fit(data, fit_params) + plot_fitted_data(data, fit_result) + + # Optionally move the motor to the peak position + if move_to_peak: + move_to_position(data["motor_device"], data["motor_name"], fit_result["centre"], data) + return fit_result + + +def find_feature( + motor_device, + signal_device, + start: float, + stop: float, + steps: int, + feature: str = "peak", + offset=None, + fraction: float = 0.5, + relative: bool = ScanDefaults.RELATIVE_MODE, + plot: bool = True, + settle: float = ScanDefaults.SETTLE_TIME, + confirm: bool = True, + window_name: str = "Fitting", + plot_widget=None, +): + """ + Scan a motor, determine the centre of a high- or low-signal region, + and move the motor to that position. + """ + + # Get motor and signal names + mres = get_value(motor_device, True) + motor_name = mres["root"] + + sres = get_value(signal_device, True) + signal_name = sres["root"] + + print(f"Signal name is {signal_name}") + + # Calculate step size + step_size = calculate_step_size(start, stop, steps) + + current_motor_position = mres["value"] + print(f"Starting motor position = {current_motor_position}") + + # Confirm scan range + if confirm: + if relative: + scan_start = current_motor_position + start + scan_end = current_motor_position + stop + else: + scan_start = start + scan_end = stop + + print( + f"\nScanning from {scan_start:.6g} to {scan_end:.6g} " + f"in {steps} steps of size {step_size}" + ) + print(f"Relative mode = {relative}") + print(f"Looking for a {feature} feature") + + input("Press Enter to continue...") + + # ------------------------------------------------- + # Set up live plot BEFORE starting the scan + # ------------------------------------------------- + if plot: + plot_live_data( + motor_name, + signal_name, + window_name=window_name, + plot_widget=plot_widget, + title=f"{motor_name} scans", + ) + # Perform scan + scan_result = scans.line_scan( + motor_device, start, stop, steps=steps, relative=relative, settling_time=settle + ) + + # Retrieve data + motor_data = scan_result.scan.live_data[mres["live_root"]][mres["name"]].val + + signal_data = scan_result.scan.live_data[sres["root"]][sres["name"]].val + + data = { + "x_data": np.array(motor_data), + "y_data": np.array(signal_data), + "motor_name": motor_name, + "signal_name": signal_name, + "motor_device": motor_device, + "scan_number": "Current", + } + + # Find feature centre + if feature in ("peak", "dip"): + result = find_feature_centre( + data["x_data"], data["y_data"], feature=feature, fraction=fraction + ) + elif feature == "edge_offset": + result = find_edge_offset(data["x_data"], data["y_data"], offset=offset) + else: + raise ValueError(f"Unknown feature type {feature}") + if feature in ("peak", "dip"): + print(f"\nLeft edge = {result['left_edge']:.4f}") + print(f"Right edge = {result['right_edge']:.4f}") + print(f"Width = {result['width']:.4f}") + print(f"Centre = {result['centre']:.4f}") + elif feature == "edge_offset": + print(f"Edge = {result['edge']:.4f}") + print(f"Offset is {offset}") + print(f"Centre = {result['centre']:.4f}") + + # Move safely to centre + move_to_scan_position(data["motor_device"], data["motor_name"], result["centre"], data) + + if plot and plot_widget is not None: + # Replace the live subscription with static completed scan data + plot_widget.clear_all() + + plot_widget.plot(x=data["x_data"], y=data["y_data"], label="Scan data") + # Mark centre + + plot_widget.plot( + x=[result["centre"], result["centre"]], + y=[np.min(data["y_data"]), np.max(data["y_data"])], + label="Centre", + ) + + plot_widget.title = f"{motor_name} scan" + plot_widget.x_label = motor_name + plot_widget.y_label = signal_name + + return result diff --git a/pxiii_bec/macros/mxcomm_utils.py b/pxiii_bec/macros/mxcomm_utils.py new file mode 100644 index 0000000..db6fc76 --- /dev/null +++ b/pxiii_bec/macros/mxcomm_utils.py @@ -0,0 +1,324 @@ +"""General reusable utilities for MX beamline commissioning and operation.""" + +import epics +import time +import numpy as np +import matplotlib.pyplot as plt + + +# ============================================================================= +# Camera utilities +# ============================================================================= +def predict_scint_transmission(target_flux=None): + """Predict transmission required for a scintillator measurement.""" + + if target_flux is None: + target_flux = BeamMove.scint_target_flux + + _, full_flux = bpm2flux() + + if not np.isfinite(full_flux) or full_flux <= 0: + raise ValueError( + f"Cannot predict scintillator transmission: " + f"invalid full flux ({full_flux:.3g} ph/s)" + ) + + transmission = target_flux / full_flux + + # Prevent an unreasonable attenuator setting + transmission = np.clip(transmission, 0.001, 1.0) + + return float(transmission) + + +def prepare_scint_measurement(autoexp=True, zoom=1000): + """Prepare for taking a reading of the beam from the scintillator""" + + # set transmission + transmission = predict_scint_transmission() + print( + f"Predicted scintillator transmission: " + f"{transmission:.2%}" + ) + dev.transm.put(transmission) + time.sleep(3) + + + # set camera zoom + if get_value(dev.scam_zoom) != zoom: + umv(dev.scam_zoom, zoom) + + # move to beam visualisation + if not planner.is_state(BeamlineState.BEAM_VISUALISATION): + planner.move_to(BeamlineState.BEAM_VISUALISATION) + + # open shutter + dev.bcu_shutter.put(1) + time.sleep(0.5) + + # set autoexposure and check there is a reading in the image + if autoexp: + auto_exposure(cam="samcam", max_iter=25) + + return zoom + + + +def read_scintXY(image=False, measure_size=True): + """Get the X and Y beam positions from the sample camera at + a sepcified zoom. Default zoom is 1000""" + + # Target position on sample camera + x_target = BeamMove.scint_target_x + y_target = BeamMove.scint_target_y + zoom = get_value(dev.scam_zoom) + + results = {} + + + max_signal = get_value(dev.samcam_max) + results["max_signal"] = max_signal + thresh = get_value(dev.samcam_thresh) + + if max_signal < thresh: + return { + "ok": False, + "message": ( + f"Insufficient signal for centroid calculation " + f"(max signal = {max_signal:.0f}, threshold = {thresh:.0f})" + ), + "max_signal": max_signal, + } + + + x_px = dev.samcam_x.read()["samcam_x"]["value"] + y_px = dev.samcam_y.read()["samcam_y"]["value"] + results["X_pixels"] = x_px + results["Y_pixels"] = y_px + + results["ok"] = True + results["message"] = ( + f"Beam detected at X={x_px:.1f}, Y ={y_px:.1f} px" + ) + + # Calculate difference from target position + diff_x = x_target - x_px + diff_y = y_target - y_px + results["X_diff_px"] = diff_x + results["Y diff_px"] = diff_y + + # Convert to pixels + diff_x_mic = calc_scam_microns(diff_x, zoom) + diff_y_mic = calc_scam_microns(diff_y, zoom) + results["X_diff_microns"] = diff_x_mic + results["Y_diff_microns"] = diff_y_mic + + # Measure beamsize + if measure_size: + x_fwhm, y_fwhm = measure_beamsize() + results["X_FWHM"] = x_fwhm + results["Y_FWHM"] = y_fwhm + + print(f"Beam position: X = {results['X_pixels']:.1f} px, " + f"Y = {results['Y_pixels']:.1f} px\n" + f"Distance from crosshair: X = {results['X_diff_microns']:.1f} microns, " + f"Y = {results['Y_diff_microns']:.1f} microns\n") + + if image: + imagedata = get_cam_image(Cameras.sample) + results["image"] = imagedata + + + return results + +def finish_scint_measurement(): + dev.bcu_shutter.put(0) + + +def get_cam_image(prefix): + """Return the current RGB image from an EPICS areaDetector camera.""" + + width = int(epics.caget(f"{prefix}:image1:ArraySize1_RBV")) + height = int(epics.caget(f"{prefix}:image1:ArraySize2_RBV")) + + data = epics.caget(f"{prefix}:image1:ArrayData") + + if data is None: + raise RuntimeError(f"Could not read camera image from {prefix}") + + expected_size = width * height * 3 + + if data.size < expected_size: + raise RuntimeError( + f"Camera returned {data.size} bytes; " + f"expected {expected_size}" + ) + + return np.asarray( + data[:expected_size], + dtype=np.uint8, + ).reshape(height, width, 3) + +def save_cam_image( + image, + filename, + *, + crosshair=None, + beam_position=None, + crop=None, + title=None, +): + """Save a camera image, optionally with crosshair and beam position.""" + + fig, ax = plt.subplots(figsize=(4, 4)) + + ax.imshow(image) + + # Target crosshair + if crosshair is not None: + x, y = crosshair + ax.axvline(x, linewidth=1) + ax.axhline(y, linewidth=1) + + # Measured beam position + if beam_position is not None: + x, y = beam_position + ax.plot( + x, + y, + marker="+", + markersize=12, + markeredgewidth=2, + ) + + # Crop around crosshair + if crop is not None: + if crosshair is None: + raise ValueError( + "crosshair must be supplied when using crop" + ) + + x, y = crosshair + + ax.set_xlim(x - crop, x + crop) + + # Image coordinates have Y increasing downwards + ax.set_ylim(y + crop, y - crop) + + if title: + ax.set_title(title) + + ax.axis("off") + + fig.tight_layout() + fig.savefig(filename, dpi=150, bbox_inches="tight") + plt.close(fig) + + return filename + + + +def create_cam_report( + image, + pdf_filename, + *, + crosshair=None, + beam_position=None, + crop=None, + title="Camera snapshot", +): + """Create a one-page PDF containing an annotated camera image.""" + + fig, ax = plt.subplots(figsize=(6, 6)) + + ax.imshow(image) + + if crosshair is not None: + x, y = crosshair + ax.axvline(x, linewidth=1) + ax.axhline(y, linewidth=1) + + if beam_position is not None: + x, y = beam_position + ax.plot( + x, + y, + marker="+", + markersize=12, + markeredgewidth=2, + ) + + if crop is not None: + if crosshair is None: + raise ValueError( + "crosshair must be supplied when using crop" + ) + + x, y = crosshair + ax.set_xlim(x - crop, x + crop) + ax.set_ylim(y + crop, y - crop) + + ax.set_title(title) + ax.axis("off") + + fig.tight_layout() + + fig.savefig( + pdf_filename, + format="pdf", + bbox_inches="tight", + ) + + plt.close(fig) + + return pdf_filename + +# ============================================================================= +# Daily-setup PDF reports +# ============================================================================= + +def create_empty_daily_report(filename): + """Create the placeholder Daily Setup report.""" + + + fig, ax = plt.subplots(figsize=(8, 6)) + + ax.axis("off") + + ax.text( + 0.5, + 0.60, + "Daily Setup", + ha="center", + va="center", + fontsize=20, + weight="bold", + ) + + ax.text( + 0.5, + 0.48, + "Setup in progress.", + ha="center", + va="center", + fontsize=12, + ) + + ax.text( + 0.5, + 0.42, + "The report will appear here when complete.", + ha="center", + va="center", + fontsize=10, + ) + + fig.savefig( + filename, + format="pdf", + bbox_inches="tight", + ) + plt.close(fig) + + return filename + diff --git a/pxiii_bec/macros/pxiii_energy.py b/pxiii_bec/macros/pxiii_energy.py index 622e39b..7923d42 100644 --- a/pxiii_bec/macros/pxiii_energy.py +++ b/pxiii_bec/macros/pxiii_energy.py @@ -140,12 +140,17 @@ def set_mirror_stripe(energy_ev): print(f"Selected mirror stripe: {selected_stripe}") -def mono_pitch_scan(plot=True): +def mono_pitch_scan( + plot=True, + window_name='Fitting', + plot_widget=None, + ): + """Scan the monochromator pitch and move to the peak.""" if plot: print("Scanning monochromator pitch and moving to peak, with plotting.") - go_to_peak( + result = go_to_peak( EnergyDefaults.mono_pitch, EnergyDefaults.signals["sig2"], -EnergyDefaults.pitch_scan["halfwidth"], @@ -155,10 +160,13 @@ def mono_pitch_scan(plot=True): settle=0.01, plot=True, confirm=False, + min_fwhm_steps=1.1, + window_name=window_name, + plot_widget=plot_widget, ) else: print("Scanning monochromator pitch and moving to peak, without plotting.") - go_to_peak( + result = go_to_peak( EnergyDefaults.mono_pitch, EnergyDefaults.signals["sig2"], -EnergyDefaults.pitch_scan["halfwidth"], @@ -169,7 +177,7 @@ def mono_pitch_scan(plot=True): plot=False, confirm=False, ) - + return result def get_dccm_motors_positions(energy_ev): @@ -212,7 +220,13 @@ def move_dccm_motors(energy_ev): -def bl_energy(energy_ev, plot=True): +def bl_energy( + energy_ev, + mono_scan=True, + plot=True, + window_name="Fitting", + plot_widget=None, + ): """ Adjusts the beamline's energy to the specified energy in electron volts (eV). The function validates the target energy, checks the current energy, and makes diff --git a/pxiii_bec/macros/pxiii_parameters.py b/pxiii_bec/macros/pxiii_parameters.py index cba3d5b..eb6c63e 100644 --- a/pxiii_bec/macros/pxiii_parameters.py +++ b/pxiii_bec/macros/pxiii_parameters.py @@ -49,22 +49,18 @@ class BPMScans: "y_device": dev.ss_bpm_y, } +# @dataclass(frozen=True) +class PreChecks: + mode_pv = "AGEOP-BL:STATUS-X06DA" + fe_shutter_pv = "X06DA-FE-BST1-EMLS-0010:OPEN" + hutch_shutter_pv = "X06DA-OP-PSH1-EMLS:STATE" + # @dataclass(frozen=True) -# class MirrorConfig: -# """Define the names of the mirror channels""" +class EHChecks: + cryo_pv = "X06DA-ES-CS:TEMP_RBV" + +# @dataclass(frozen=True) +class DailySetup: + energy = 13000 -# hfm = { -# "bu_name": dev.hfm_bu.name, -# "bd_name": dev.hfm_bd.name, -# "z_name": dev.samcam_xsig.name, -# "x_device": dev.hfm_bu, -# "y_device": dev.hfm_bd, -# } -# vfm = { -# "bu_name": dev.vfm_bu.name, -# "bd_name": dev.vfm_bd.name, -# "z_name": dev.samcam_ysig.name, -# "x_device": dev.vfm_bu, -# "y_device": dev.vfm_bd, -# }