RbBFBlokProj+[PSIVStrn5.5OPSpStrn FocusTest.rbACnmStrnAChpStrnACsvStrnlocalhost:7325Ver1Strn1Ver2Strn0Ver3Strn0RelsStrn0NnRlStrn0RegnStrn0SVerStrnLVerStrnIVerStrnDVewInt 4prTpInt DLanInt CLanInt DEncInt BflgInt BCXFInt IconGrupEndGInt CPalGrupflagInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt elemInt EndGInt MacCStrn????BMacStrnMy Application (Classic)BCarStrnMy ApplicationBSizInt @BMSzInt BSzSStrn4096BMSSStrn2048MDIcStrnMy ApplicationBWinStrnMy Application.exeBMDIInt BL86Strn MyApplicationrEdtRect2fTypGrupLnameStrntextMacCStrnR*chtypeStrnTEXTdefnStrnflagInt EndGInt PadnPadn4****************************************************BlokpVew4$+[NameStrnWindow1ContInt rEdtRect-!eSptInt bPGpGrupPbPElGrup4scKyInt rEdtRect-!eSptInt EndGInt EndGInt lstHInt HlstVInt PDefGrup4nameStrnNamePValStrnWindow1EncoInt EndGInt PDefGrup(nameStrnFramePValStrn0EndGInt PDefGrup0 nameStrn CompositePValStrnFalseEndGInt PDefGrup0 nameStrn HasBackColorPValStrnFalseEndGInt PDefGrup0 nameStrn BackColorPValStrn16777215EndGInt PDefGrup( nameStrnBackdropPValStrn0EndGInt PDefGrup8 nameStrnTitlePValStrnUntitledEncoInt EndGInt PDefGrup(nameStrnVisiblePValStrnTrueEndGInt PDefGrup0nameStrn FullScreenPValStrnFalseEndGInt PDefGrup0nameStrnMenuBarVisiblePValStrnTrueEndGInt PDefGrup(nameStrnCloseBoxPValStrnTrueEndGInt PDefGrup,nameStrnGrowIconPValStrnFalseEndGInt PDefGrup0nameStrn LiveResizePValStrnFalseEndGInt PDefGrup,nameStrnZoomIconPValStrnFalseEndGInt PDefGrup(nameStrn BalloonHelpPValStrnEndGInt PDefGrup,nameStrn MacProcIDPValStrn0EndGInt PDefGrup0nameStrnMenuBarPValStrn -1096141599EndGInt PDefGrup,nameStrn PlacementPValStrn0EndGInt PDefGrup(nameStrnWidthPValStrn474EndGInt PDefGrup(nameStrnHeightPValStrn132EndGInt PDefGrup(nameStrnMinWidthPValStrn64EndGInt PDefGrup,nameStrn MinHeightPValStrn64EndGInt PDefGrup,nameStrnMaxWidthPValStrn32000EndGInt PDefGrup0nameStrn MaxHeightPValStrn32000EndGInt FDefGrup4NameStrnWindow1SizeInt SuprStrnWindowbNtrInt HInsGrup EncoInt nameStrnKeyDownsorcGrup!stsrInt stscInt ndsrInt ndscInt EncoInt srclStrn*Function KeyDown(Key As String) As BooleansrclStrnsrclStrn End FunctionEndGInt !EndGInt EndGInt CBhvGrup@"NameStrnSizeInt SuprStrn PushButtonbNtrInt EndGInt "CBhvGrup@#NameStrnSizeInt SuprStrn PushButtonbNtrInt EndGInt #CBhvGrup$NameStrnSizeInt SuprStrnFocusableSwitcherbNtrInt HInsGrup%EncoInt nameStrnActionsorcGrup&stsrInt stscInt ,ndsrInt ndscInt ,EncoInt srclStrn Sub Action(focusPart as Integer)srclStrn,MsgBox "Action for part " + Str( focusPart )srclStrnEnd SubEndGInt &EndGInt %HInsGrup'EncoInt nameStrnEnableMenuItemssorcGrup(stsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub EnableMenuItems()srclStrnsrclStrnEnd SubEndGInt (EndGInt 'HInsGrup)EncoInt nameStrn MouseDragsorcGrup*stsrInt stscInt ndsrInt ndscInt EncoInt srclStrn)Sub MouseDrag(X As Integer, Y As Integer)srclStrnsrclStrnEnd SubEndGInt *EndGInt )HInsGrup+EncoInt nameStrnGivePreviousControlFocussorcGrup,stsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub GivePreviousControlFocus()srclStrnsrclStrnEnd SubEndGInt ,EndGInt +HInsGrup-EncoInt nameStrnGiveNextControlFocussorcGrup.stsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub GiveNextControlFocus()srclStrnsrclStrnEnd SubEndGInt .EndGInt -EndGInt $CtrlGrup4/cclsStrn PushButtonnameStrn PushButtonPDefGrup80nameStrnNamePValStrn PushButton1EncoInt EndGInt 0PDefGrup01nameStrnIndexPValStrn -2147483648EndGInt 1PDefGrup02nameStrn TabPanelIndexPValStrn0EndGInt 2PDefGrup(3nameStrnVisiblePValStrnTrueEndGInt 3PDefGrup$4nameStrnLeftPValStrn57EndGInt 4PDefGrup$5nameStrnTopPValStrn48EndGInt 5PDefGrup(6nameStrnWidthPValStrn69EndGInt 6PDefGrup(7nameStrnHeightPValStrn22EndGInt 7PDefGrup,8nameStrn InitialParentPValStrnEndGInt 8PDefGrup$9nameStrnHelpTagPValStrnEndGInt 9PDefGrup(:nameStrn BalloonHelpPValStrnEndGInt :PDefGrup0;nameStrnDisabledBalloonHelpPValStrnEndGInt ;PDefGrup0nameStrnLockTopPValStrnFalseEndGInt >PDefGrup0?nameStrn LockRightPValStrnFalseEndGInt ?PDefGrup0@nameStrn LockBottomPValStrnFalseEndGInt @PDefGrup8AnameStrnTextFontPValStrnSystemEncoInt EndGInt APDefGrup(BnameStrnTextSizePValStrn12EndGInt BPDefGrup(CnameStrnBoldPValStrnFalseEndGInt CPDefGrup,DnameStrnItalicPValStrnFalseEndGInt DPDefGrup0EnameStrn UnderlinePValStrnFalseEndGInt EPDefGrup8FnameStrnCaptionPValStrnUntitledEncoInt EndGInt FPDefGrup,GnameStrnDefaultPValStrnFalseEndGInt GPDefGrup,HnameStrnCancelPValStrnFalseEndGInt HPDefGrup(InameStrnEnabledPValStrnTrueEndGInt ICBixInt EndGInt /CtrlGrupJcclsStrnFocusableSwitchernameStrnCanvasPDefGrup<KnameStrnNamePValStrnCustomCanvas11EncoInt EndGInt KPDefGrup0LnameStrnIndexPValStrn -2147483648EndGInt LPDefGrup0MnameStrn TabPanelIndexPValStrn0EndGInt MPDefGrup(NnameStrnVisiblePValStrnTrueEndGInt NPDefGrup$OnameStrnLeftPValStrn138EndGInt OPDefGrup$PnameStrnTopPValStrn43EndGInt PPDefGrup(QnameStrnWidthPValStrn159EndGInt QPDefGrup(RnameStrnHeightPValStrn27EndGInt RPDefGrup,SnameStrn InitialParentPValStrnEndGInt SPDefGrup$TnameStrnHelpTagPValStrnEndGInt TPDefGrup(UnameStrn BalloonHelpPValStrnEndGInt UPDefGrup0VnameStrnDisabledBalloonHelpPValStrnEndGInt VPDefGrup0WnameStrnAutoDeactivatePValStrnTrueEndGInt WPDefGrup,XnameStrnLockLeftPValStrnFalseEndGInt XPDefGrup,YnameStrnLockTopPValStrnFalseEndGInt YPDefGrup0ZnameStrn LockRightPValStrnFalseEndGInt ZPDefGrup0[nameStrn LockBottomPValStrnFalseEndGInt [PDefGrup(\nameStrnBackdropPValStrn0EndGInt \PDefGrup(]nameStrnEnabledPValStrnTrueEndGInt ]PDefGrup,^nameStrn UseFocusRingPValStrnTrueEndGInt ^PDefGrup0_nameStrn AcceptFocusPValStrnFalseEndGInt _PDefGrup0`nameStrn AcceptTabsPValStrnFalseEndGInt `CBixInt EndGInt JCtrlGrup4acclsStrn PushButtonnameStrn PushButtonPDefGrup8bnameStrnNamePValStrn PushButton2EncoInt EndGInt bPDefGrup0cnameStrnIndexPValStrn -2147483648EndGInt cPDefGrup0dnameStrn TabPanelIndexPValStrn0EndGInt dPDefGrup(enameStrnVisiblePValStrnTrueEndGInt ePDefGrup$fnameStrnLeftPValStrn313EndGInt fPDefGrup$gnameStrnTopPValStrn48EndGInt gPDefGrup(hnameStrnWidthPValStrn69EndGInt hPDefGrup(inameStrnHeightPValStrn22EndGInt iPDefGrup,jnameStrn InitialParentPValStrnEndGInt jPDefGrup$knameStrnHelpTagPValStrnEndGInt kPDefGrup(lnameStrn BalloonHelpPValStrnEndGInt lPDefGrup0mnameStrnDisabledBalloonHelpPValStrnEndGInt mPDefGrup0nnameStrnAutoDeactivatePValStrnTrueEndGInt nPDefGrup,onameStrnLockLeftPValStrnFalseEndGInt oPDefGrup,pnameStrnLockTopPValStrnFalseEndGInt pPDefGrup0qnameStrn LockRightPValStrnFalseEndGInt qPDefGrup0rnameStrn LockBottomPValStrnFalseEndGInt rPDefGrup8snameStrnTextFontPValStrnSystemEncoInt EndGInt sPDefGrup(tnameStrnTextSizePValStrn12EndGInt tPDefGrup(unameStrnBoldPValStrnFalseEndGInt uPDefGrup,vnameStrnItalicPValStrnFalseEndGInt vPDefGrup0wnameStrn UnderlinePValStrnFalseEndGInt wPDefGrup8xnameStrnCaptionPValStrnUntitledEncoInt EndGInt xPDefGrup,ynameStrnDefaultPValStrnFalseEndGInt yPDefGrup,znameStrnCancelPValStrnFalseEndGInt zPDefGrup({nameStrnEnabledPValStrnTrueEndGInt {CBixInt EndGInt aPadnPadn************************************************************************************************************************************************************************************************BlokpMnu4+[NameStrnMenuBar1ContInt rEdtRectdd,MItmGrup|spmuInt nameStrntextStrnindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt MItmGrup}spmuInt nameStrntextStrnindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt }EndGInt |MItmGrup~spmuInt nameStrnFileMenutextStrn&FileindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt MItmGrupspmuInt nameStrnFileQuittextStrnE&xitindxInt scutStrnQbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrn QuitMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrntextStrnindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt EndGInt ~MItmGrup spmuInt nameStrnEditMenutextStrn&EditindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt MItmGrupspmuInt nameStrnEditUndotextStrn&UndoindxInt scutStrnZbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrntextStrn-indxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrnEditCuttextStrnCu&tindxInt scutStrnXbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrnEditCopytextStrn&CopyindxInt scutStrnCbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrn EditPastetextStrn&PasteindxInt scutStrnVbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrn EditCleartextStrnClearindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt MItmGrupspmuInt nameStrntextStrnindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt EndGInt MItmGrupspmuInt nameStrntextStrnindxInt scutStrnbhlpStrndhlpStrnstylInt EncoInt flagInt maEnInt NameStrnSizeInt LSuprStrnMenuItembNtrInt EndGInt PadnPadn,********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpObj4+[NameStrnAppContInt rEdtRect_K!eSptInt bPGpGrupPbPElGrup4scKyInt rEdtRect_K!eSptInt EndGInt EndGInt bClsInt NameStrnAppSizeInt 4SuprStrn ApplicationbNtrInt IntrStrnbApOInt PDefGrup0nameStrnMenuBarPValStrn -1096141599EndGInt PadnPadn****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpObj5=(+[NameStrnFocusableSwitcherContInt rEdtRect]!eSptInt bPGpGrupPbPElGrup4scKyInt rEdtRect]!eSptInt EndGInt EndGInt bClsInt NameStrnFocusableSwitcherSizeInt SuprStrnCanvasbNtrInt PropGrupdEncoInt declStrnmFocusIndex as IntegerflagInt sorcGrup stsrInt stscInt ndsrInt ndscInt EncoInt ntlnStrnmFocusIndex as IntegerntlnStrn3This holds the index (0-based) of which part of thentlnStrn:control currently has focus. It will be -1 if no part hasntlnStrnfocus.ntlnStrnEndGInt EndGInt PropGrupEncoInt declStrnmNumParts as IntegerflagInt sorcGrupstsrInt stscInt 'ndsrInt ndscInt 'EncoInt ntlnStrnmNumParts as IntegerntlnStrn'The number of parts to our radio group.ntlnStrnEndGInt EndGInt PropGruplEncoInt declStrnmLastFocusIndex as IntegerflagInt sorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt ntlnStrnmLastFocusIndex as IntegerntlnStrn6This stores the last part index (0-based) that had thentlnStrn4focus. This way the focus can be restored later if ntlnStrn appropriate.ntlnStrnEndGInt EndGInt MethGrupEncoInt nameStrn DrawFocusRingparmStrn2g as Graphics, pos as Integer, oneThird as IntegerrsltStrnflagInt sorcGrup`stsrInt stscInt ndsrInt ndscInt EncoInt srclStrnESub DrawFocusRing(g as Graphics, pos as Integer, oneThird as Integer)srclStrn#if TargetWin32srclStrnFDeclare Sub DrawFocusRect Lib "User32" ( hdc as Integer, rect as Ptr )srclStrnEDeclare Function REALGraphicsDC Lib "" ( gfx as Graphics ) as IntegersrclStrnsrclStrn5// One thing to note about the DrawFocusRect functionsrclStrn:// is that it needs the coordinates to draw that are localsrclStrn:// to the window, not the canvas itself. So we have to besrclStrn;// sure to include the Left and Top properties when settingsrclStrn>// the left and top on the rect. Also, Win32 RECT structures srclStrn@// are left, top, right, bottom -- which is different than usualsrclStrn2// RB rects which are left, top, width and height.srclStrn!dim rect as new MemoryBlock( 16 )srclStrn"rect.Long( 0 ) = me.Left + pos + 3srclStrnrect.Long( 4 ) = me.Top + 3srclStrn.rect.Long( 8 ) = rect.Long( 0 ) + oneThird - 6srclStrn/rect.Long( 12 ) = rect.Long( 4 ) + g.Height - 6srclStrnsrclStrn(dim hdc as Integer = REALGraphicsDC( g )srclStrnDrawFocusRect( hdc, rect )srclStrn#elsesrclStrng.ForeColor = &c000000srclStrn4g.DrawRect( pos + 3, 3, oneThird - 6, g.Height - 6 )srclStrn#endifsrclStrnEnd SubEndGInt EndGInt HookGrup\EncoInt nameStrnActionparmStrnfocusPart as IntegerrsltStrnflagInt !EndGInt HInsGrupEncoInt nameStrn MouseDownsorcGrupstsrInt stscInt $ndsrInt ndscInt $EncoInt srclStrn9Function MouseDown(X As Integer, Y As Integer) As BooleansrclStrn9// Note: to have a truly decent control, you should neversrclStrn=// fire the action in the MouseDown event. You should alwayssrclStrn:// display the button in a pushed state when the mouse is srclStrn>// down and over the control. Once it leaves the control, yousrclStrn;// should show it in a non-pushed state. You should handlesrclStrn@// the action in the MouseUp event only if the mouse is releasedsrclStrnF// aboved the pushed control. This is a UI standard on all platforms,srclStrn*// and is an exercise left for the reader.srclStrnsrclStrn5// We need to figure out which part the user selectedsrclStrn%// so that it gets the focus properlysrclStrnsrclStrn/dim partWidth as Integer = me.Width \ mNumPartssrclStrndim i as IntegersrclStrnsrclStrnfor i = 0 to mNumPartssrclStrn5if x > partWidth * i and x < partWidth * (i + 1) thensrclStrn*// This works around a strange bug where asrclStrn-// MsgBox steals the focus but doesn't returnsrclStrn// it to a canvas properlysrclStrn me.SetFocussrclStrnsrclStrn// Set the focus indexsrclStrnmFocusIndex = isrclStrnsrclStrn// Redraw with our new statesrclStrnme.Refresh( false )srclStrnsrclStrn.// And since we have a focus index, let's firesrclStrn// the action event as wellsrclStrnAction( mFocusIndex )srclStrnsrclStrn// We're done lookingsrclStrnexitsrclStrnend ifsrclStrnnext isrclStrn End FunctionEndGInt EndGInt HInsGrupEncoInt nameStrn MouseDragsorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrn)Sub MouseDrag(X As Integer, Y As Integer)srclStrnsrclStrnEnd SubEndGInt EndGInt HInsGrupEncoInt nameStrnEnableMenuItemssorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub EnableMenuItems()srclStrnsrclStrnEnd SubEndGInt EndGInt HInsGrupXEncoInt nameStrnKeyDownsorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrn*Function KeyDown(Key As String) As BooleansrclStrndim focusChange as BooleansrclStrnsrclStrn)// Check for arrow navigation keys or thesrclStrn // action keysrclStrnselect case Asc( key )srclStrncase kLeftArrowsrclStrnmFocusIndex = mFocusIndex - 1srclStrnfocusChange = truesrclStrnsrclStrncase kRightArrowsrclStrnmFocusIndex = mFocusIndex + 1srclStrnfocusChange = truesrclStrnsrclStrncase kSpace, kReturnsrclStrn'// We might also want to put a "pushed"srclStrn'// graphic in here so that there's moresrclStrn*// visual feedback. But that's left as ansrclStrn// exercise for the reader.srclStrnAction( mFocusIndex )srclStrnsrclStrn end selectsrclStrnsrclStrn(// If the focus changed, then we need tosrclStrn*// make sure it's constrained properly andsrclStrn// it gets redrawnsrclStrnif focusChange thensrclStrnif mFocusIndex = -1 thensrclStrnmFocusIndex = mNumParts - 1srclStrn#elseif mFocusIndex = mNumParts thensrclStrnmFocusIndex = 0srclStrnend ifsrclStrnsrclStrnme.Refresh( false )srclStrnsrclStrn return truesrclStrnend ifsrclStrn End FunctionEndGInt EndGInt HInsGrupEncoInt nameStrn LostFocussorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub LostFocus()srclStrn$// Save the last focus index so thatsrclStrn// we can restore itsrclStrnmLastFocusIndex = mFocusIndexsrclStrnmFocusIndex = -1srclStrnsrclStrn&// Now refresh our drawing so that thesrclStrn// focus rect is removedsrclStrnme.Refresh( false )srclStrnEnd SubEndGInt EndGInt HInsGrupEncoInt nameStrnMouseUpsorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrn'Sub MouseUp(X As Integer, Y As Integer)srclStrnsrclStrnEnd SubEndGInt EndGInt HInsGrupEncoInt nameStrnOpensorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrn Sub Open()srclStrn// Nothing has the focus yetsrclStrnmFocusIndex = -1srclStrnsrclStrn// We want to accept the focussrclStrnme.AcceptFocus = truesrclStrnsrclStrn&// This is how many parts or "buttons"srclStrn// that the control hassrclStrn mNumParts = 3srclStrnEnd SubEndGInt EndGInt HInsGrup`EncoInt nameStrnPaintsorcGrup$stsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub Paint(g As Graphics)srclStrn0dim i, oneThird as Integer = g.Width / mNumPartssrclStrn?dim colors(-1) as Color = Array( &cFF0000, &c00FF00, &c0000FF )srclStrnsrclStrn#// Draw all the parts of the canvassrclStrnfor i = 0 to mNumPartssrclStrng.ForeColor = colors( i mod 3 )srclStrn1g.FillRect( oneThird * i, 0, oneThird, g.Height )srclStrnnext isrclStrnsrclStrn*// Now draw the focus rect on the properlysrclStrn/// focused index -- but only if we have a focussrclStrn// index selected.srclStrn+dim pos as Integer = oneThird * mFocusIndexsrclStrnif mFocusIndex <> -1 thensrclStrn!DrawFocusRing( g, pos, oneThird )srclStrnend ifsrclStrnEnd SubEndGInt EndGInt HInsGrupEncoInt nameStrnGotFocussorcGrupstsrInt stscInt ndsrInt ndscInt EncoInt srclStrnSub GotFocus()srclStrn*// Restore our focus index so that we havesrclStrn// the proper part selectedsrclStrnmFocusIndex = mLastFocusIndexsrclStrnsrclStrn%// And we want to refresh our drawingsrclStrn"// so that the focus rect is shownsrclStrnme.Refresh( false )srclStrnEnd SubEndGInt EndGInt CnstGrupPEncoInt nameStrn kLeftArrowtypeInt defnStrn28flagInt EndGInt CnstGrupPEncoInt nameStrn kRightArrowtypeInt defnStrn29flagInt EndGInt CnstGrupLEncoInt nameStrnkSpacetypeInt defnStrn32flagInt EndGInt CnstGrupLEncoInt nameStrnkReturntypeInt defnStrn13flagInt EndGInt IntrStrnPadnPadn`********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************EOF!