Zedna

RegExp - optimize --> ReduceSpaces()

14 posts in this topic

#1 ·  Posted (edited)

I have got this simple function for reduction of more than 3 spaces to only two spaces

 

ConsoleWrite(ReduceSpaces(' abc def 1 2 ')& @CRLF)
ConsoleWrite(ReduceSpaces('a b c d e')& @CRLF)
ConsoleWrite(ReduceSpaces('abc')& @CRLF)
ConsoleWrite(ReduceSpaces('')& @CRLF)

; 3 and more spaces reduces to 2 spaces
Func ReduceSpaces($s)
  Return StringRegExpReplace($s, "\x20{3,}", "  ")
EndFunc
 

But I want also more general version of this function where as parameters will be number of spaces.

Here is my function but it's not optimal and I hope it can be done by some more clever RegExp without FOR/NEXT loop.

 

Please some RegExp guru help me increase my RegExp experiencies :-)

 

; N1 and more spaces reduces to N2 spaces
Func ReduceSpaces($s, $n1=3, $n2=2)
    $space2 = ''
    For $i = 1 To $n2
        $space2 &= ' '
    Next
    Return StringRegExpReplace($s, "\x20{"&$n1&",}", $space2)
EndFunc
Edited by Zedna

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Zedna,

One possible way...

#include <string.au3>

$string = 'abc      def  123         456                                   ' & @crlf & '          mmmm     12'

ConsoleWrite(ReduceSpaces($string,3,2) & @LF)

; N1 and more spaces reduces to N2 spaces
Func ReduceSpaces($s, $n1=3, $n2=2)
    local $spaces = _stringrepeat(' ',$n2)
    Return StringRegExpReplace($s, "\x20{"&$n1&",}", $spaces)
EndFunc

kylomas

edit: hmmm...unintended consequence...it can also expand spaces to whatever you like...

#include <string.au3>

$string = 'abc      def  123         456                                   ' & @crlf & '          mmmm     12'

ConsoleWrite(ReduceSpaces($string,2,40) & @LF)

; N1 and more spaces reduces to N2 spaces
Func ReduceSpaces($s, $n1=3, $n2=2)
    local $spaces = _stringrepeat(' ',$n2)
    Return StringRegExpReplace($s, "\x20{"&$n1&",}", $spaces)
EndFunc
Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Zedna,

Try this one:

ConsoleWrite("|" & ReduceSpaces('    abc   def  1 2 ') & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('a           b      c d  e') & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('abc') & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('') & "|" & @CRLF)


Func ReduceSpaces($sString, $iAccept = 4, $iReplace = 2)

    If $iReplace > $iAccept Then
        Return SetError(1, 0, "")
    EndIf

    Return StringRegExpReplace($sString, "(\x20{" & $iReplace & "})\x20{" & $iAccept - $iReplace + 1 & ",}", "$1")

EndFunc
We look for the Replace number of spaces followed by enough spaces to take it over the Accept limit - if found we replace them all by the Replace number of spaces - which we captured when searching.  Obviously you need to accept at least the same number as you expect to replace - hence the check. ;)

It works for me when I play around with the different values. :)

 

M23

Edited by Melba23
Better explanation - I hope

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

@kylomas

_stringrepeat does the same FOR/NEXT loop internally as my original (not optimal) version

@Melba

Thanks!!

Not tested yet but it looks very good.

Nice view on problem from different angle :-)

Share this post


Link to post
Share on other sites

Zedna,

 

Nice view on problem from different angle

Edward de Bono was always one of my heroes. ;)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

Zedna,

@kylomas
_stringrepeat does the same FOR/NEXT loop internally as my original (not optimal) version

 

Yes, just thought I would offer it...should have known that you already considered it...

Speedy recovery by the way!

kylomas

editL spelling

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

I did testing of Melba's solution and there was bug:
Instead of $iAccept - $iReplace + 1
should be $iAccept - $iReplace

I also changed behaviour at error state, when error occurs (bad parametres) then original (not empty) string returned.

So here is final version
 

ConsoleWrite("|" & ReduceSpaces('    abc   def  1 2     3 ',5,2) & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('    abc   def  1 2     3 ',4,2) & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('    abc   def  1 2     3 ',3,2) & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('a           b      c d  e') & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('abc') & "|" & @CRLF)
ConsoleWrite("|" & ReduceSpaces('') & "|" & @CRLF)

Func ReduceSpaces($sString, $iAccept = 3, $iReplace = 2)
    If $iReplace > $iAccept Then Return SetError(1, 0, $sString)

    Return StringRegExpReplace($sString, "(\x20{" & $iReplace & "})\x20{" & $iAccept - $iReplace & ",}", "$1")
EndFunc

Thanks

Share this post


Link to post
Share on other sites

Zedna,

Sorry, I misunderstood the limit for change - I am glad you were able to fix it. :)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

@kylomas

_stringrepeat does the same FOR/NEXT loop internally as my original (not optimal) version

Not in the AutoIt beta, this is a lot more optimisied.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

Not in the AutoIt beta, this is a lot more optimisied.

 

Thanks for info I will look at it.

I'm old school guy.

I use 3.2.12.1 as my release a 3.3.7.23 as my latest beta.

It's due to many script breaking changes and many my live big projects

(the most compatible with 3.2.12.1 and few compatible with 3.3.7.x)

where I would make changes and testing to follow these script breaking changes from newer release/beta versions.

So I don't  have installed newer release/beta on my computer, 

I look at changes in changelogs and and download only ZIP packages of newer release/beta to look at it.

I would be happy to have possibility to install/use more AutoIt/Scite4AutoIt3 versions into different folders at the same time

so I could compile all my older projects with older AutoIt

and I could use latest release/beta for new projects.

Unfortunatelly it's not possible as far as I know :-(

If there is some trick how to do it, please share it with me, thanks.

Share this post


Link to post
Share on other sites

This is the beta version of _StringRepeat >> #2172 (the while loop is the most important and doesn't reflect the version in the beta.)

What about using AutoItWrapper to change the AutoIt install path e.g.

#AutoIt3Wrapper_Autoit3Dir=                     ;Optionally override the base AutoIt3 install directory.
#AutoIt3Wrapper_Aut2exe=                        ;Optionally override the Aut2exe.exe to use for this script
#AutoIt3Wrapper_AutoIt3=                        ;Optionally override the Autoit3.exe to use for this script

Source: http://www.autoitscript.com/autoit3/scite/docs/directives.html


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

What about using AutoItWrapper to change the AutoIt install path e.g.

#AutoIt3Wrapper_Autoit3Dir=                     ;Optionally override the base AutoIt3 install directory.
#AutoIt3Wrapper_Aut2exe=                        ;Optionally override the Aut2exe.exe to use for this script
#AutoIt3Wrapper_AutoIt3=                        ;Optionally override the Autoit3.exe to use for this script

Source: http://www.autoitscript.com/autoit3/scite/docs/directives.html

As far as I know there is problem with standard include files.

If I manually copy new beta (from sfx or zip) to some nonstandard folder and use these directives, include folder is still not changed (?).

Edited by Zedna

Share this post


Link to post
Share on other sites

I honestly don't know as I've always had a stable version and beta version. But it seems you want more than 2 installations of AutoIt.

_StringRepeat: v3.3.9.5+

; #FUNCTION# ====================================================================================================================
; Name ..........: _StringRepeat
; Description ...: Repeats a string a specified number of times.
; Syntax.........: _StringRepeat ( $sString, $iRepeatCount )
; Parameters ....: $sString             - String to repeat
;                  $iRepeatCount        - Number of times to repeat the string
; Return values .: Success - Returns string with specified number of repeats
;                  Failure - Returns an empty string and sets @error = 1
;                  |@error  - 0 = No error.
;                  |@error  - 1 = One of the parameters is invalid
; Author ........: Jeremy Landes <jlandes at landeserve dot com>
; Modified.......: guinness - Removed Select...EndSelect statement and replaced with an If...EndIf as well as optimised the code.
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _StringRepeat($sString, $iRepeatCount)
    ; Casting Int() takes care of String/Int, Numbers.
    $iRepeatCount = Int($iRepeatCount)
    ; Zero is a valid repeat integer.
    If StringLen($sString) < 1 Or $iRepeatCount < 0 Then Return SetError(1, 0, "")
    Local $sResult = ""
    While $iRepeatCount > 1
        If BitAND($iRepeatCount, 1) Then $sResult &= $sString
        $sString &= $sString
        $iRepeatCount = BitShift($iRepeatCount, 1)
    WEnd
    Return $sString & $sResult
EndFunc   ;==>_StringRepeat

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

I use 3.2.12.1 as my release a 3.3.7.23 as my latest beta.

 

It's due to many script breaking changes and many my live big projects

(the most compatible with 3.2.12.1 and few compatible with 3.3.7.x)

where I would make changes and testing to follow these script breaking changes from newer release/beta versions.

So I don't  have installed newer release/beta on my computer, 

I would be happy to have possibility to install/use more AutoIt/Scite4AutoIt3 versions into different folders at the same time

so I could compile all my older projects with older AutoIt

and I could use latest release/beta for new projects.

Unfortunatelly it's not possible as far as I know :-(

If there is some trick how to do it, please share it with me, thanks.

 

Just for the reference:

My solution is as follows:

I unpacked latest release+beta+Scite4AutoIt3 from ZIP packages to different directory: "C:Program FilesAutoIt3312"

https://www.autoitscript.com/autoit3/files/archive/autoit/

In "C:Program FilesAutoIt3" I have got installed my main 3.2.12.1+3.3.7.23+old scite4autoit3

AU3 scripts are opened/ran/compiled in my default 3.2.12.1 editor+autoit+compiler by default (when opened from file manager by Enter or doubleclick).

When I need to open/run/compile AU3 in latest release/beta then I open it in new scite4autoit3 from Total Commander by Start menu:

 

title: AU3 3.3.12.0

command: C:Program FilesAutoIt3312SciTeSciTE.exe

param: %p%n

dir: %p

 

Edited by Zedna

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now