Jump to content

AutoIt Machine Code Algorithm Collection


Ward
 Share

Recommended Posts

I think this is a bug of AU3Check.

In fact, AutoIt3.exe allows function returned value passed into another function as ByRef parameter, but somehow, AU3Check don't like it.

新版 _ArrayAdd 的白痴作者,不管是誰,去死一死好了

 

Link to comment
Share on other sites

  • 4 months later...

I download AutoIt Machine Code Algorithm Collection.zip and test to run AESTest 2.au3.

I got this error message.

#Include "AES.au3"

Dim $Key = Binary('0x11111111111111111111111111111111')
Dim $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F')
Dim $Encrypt = _AesEncryptECB(_AesEncryptKey($Key), $Data)
Dim $Decrypt = _AesDecryptECB(_AesDecryptKey($Key), $Encrypt)
ConsoleWrite('=== Encrypt Two Block With AES128 ECB Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)

Error Message:

>"D:Program Files (x86)AutoIt3SciTEAutoIt3WrapperAutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "D:FtprootSoftwareAutoit 3.0ScriptNewAutoIt Machine Code Algorithm CollectionEncodeAESTest 2.au3" /UserParams

+>19:08:50 Starting AutoIt3Wrapper v.2.1.0.33 Environment(Language:0404 Keyboard:00000404 OS:WIN_7/Service Pack 1 CPU:X64 OS:X64)

>Running AU3Check (1.54.19.0) from:D:Program Files (x86)AutoIt3

D:AutoIt Machine Code Algorithm CollectionEncodeAESTest 2.au3(14,58) : ERROR: _AesEncryptECB() called with Const or expression on ByRef-param(s).

Dim $Encrypt = _AesEncryptECB(_AesEncryptKey($Key), $Data)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

D:AutoIt Machine Code Algorithm CollectionEncodeAES.au3(171,42) : REF: definition of _AesEncryptECB().

Func _AesEncryptECB(ByRef $AesCtx, $Data)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

D:AutoIt Machine Code Algorithm CollectionEncodeAESTest 2.au3(15,61) : ERROR: _AesDecryptECB() called with Const or expression on ByRef-param(s).

Dim $Decrypt = _AesDecryptECB(_AesDecryptKey($Key), $Encrypt)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

replace the invoke method of function,then it's OK. :)

like this:

; -----------------------------------------------------------------------------
; AES Machine Code UDF Example
; Purpose: Provide Machine Code Version of AES Algorithm In AutoIt
; Author: Ward
; -----------------------------------------------------------------------------
#include "AES.au3"
Local $AesEK, $AesDK
Local $Key = Binary('0x11111111111111111111111111111111')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptECB($AesEK, $Data)
Local $Decrypt = _AesDecryptECB($AesDK, $Encrypt)
ConsoleWrite('=== Encrypt Two Block With AES128 ECB Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x11111111111111111111111111111111')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptCBC($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesDecryptCBC($AesDK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block With AES128 CBC Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x11111111111111111111111111111111')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0FFF')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptCBC_Pad($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesDecryptCBC_Pad($AesDK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block + 1 Byte With AES128 CBC Bit Padding Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x11111111111111111111111111111111')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0FFF')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptCFB($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesDecryptCFB($AesEK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block + 1 Byte With AES128 CFB Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x11111111111111111111111111111111')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0FFF')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesCryptOFB($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesCryptOFB($AesEK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block + 1 Byte With AES128 OFB Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x111111111111111111111111111111112222222222222222')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0FFF')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptCBC_Pad($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesDecryptCBC_Pad($AesDK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block + 1 Byte With AES192 CBC Bit Padding Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)
Local $Key = Binary('0x1111111111111111111111111111111122222222222222223333333333333333')
Local $IV = Binary('0x00000000000000000000000000000000')
Local $Data = Binary('0x000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0FFF')
$AesEK = _AesEncryptKey($Key)
$AesDK = _AesDecryptKey($Key)
Local $Encrypt = _AesEncryptCBC_Pad($AesEK, $IV, $Data)
Local $IV = Binary('0x0000000000000000')
Local $Decrypt = _AesDecryptCBC_Pad($AesDK, $IV, $Encrypt)
ConsoleWrite('=== Encrypt Two Block + 1 Byte With AES256 CBC Bit Padding Mode ===' & @CRLF)
ConsoleWrite('Encrypt: ' & $Encrypt & @CRLF & 'Decrypt: ' & $Decrypt & @CRLF & @CRLF)

Thanksgiving...

Link to comment
Share on other sites

  • 3 weeks later...
  • 3 months later...
  • 5 months later...

Hi Ward. I've been using the base64 functions successfully up until the current AutoIt beta .21, which is the first beta version I've tested with in the new beta series. I'm now getting a crash in the x64 version somewhere in the _Base64EncodeEnd function (x86 still works). If you have time, could you take a look? No idea if the problem is in your code or something in the AutoIt betas.

Link to comment
Share on other sites

The example script in the download crashes when run as x64 (x86 is, again, ok). And this is on Win 8 x64 as well, in case it matters. I can successfully use the CryptBinaryToString and CryptStringToBinary functions.

Edited by wraithdu
Link to comment
Share on other sites

Then you should show me your changes. There could be some stack allocation issues caused by number of functions arguments, but I'm pretty sure that opcodes aren't manually written by Ward and probably are generated by some compiler. That's why it would be weird if that's the case. Still I would like to see the way you call his machine code now.

And do check content of $State structure before the crash.

Edited by trancexx

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

Using the Base64Test.au3 from the archive and the original Base64.au3, I get the crash in the _Base64EncodeEnd function, and this is the content of $State

0x01000000300000000E00000013000000

Here is my version of Base64.au3, which also crashes in the same place.

; -----------------------------------------------------------------------------
; Base64 Machine Code UDF
; Purpose: Provide  Machine Code Version of Base64 Encoder/Decoder In AutoIt
; Author: Ward
; -----------------------------------------------------------------------------

#Include-once
#Include <Memory.au3>

Global $_B64E_CodeBuffer, $_B64E_CodeBufferMemory, $_B64E_Init, $_B64E_EncodeData, $_B64E_EncodeEnd
Global $_B64D_CodeBuffer, $_B64D_CodeBufferMemory, $_B64D_Init, $_B64D_DecodeData

Func _B64E_Exit()
    $_B64E_CodeBuffer = 0
    _MemVirtualFree($_B64E_CodeBufferMemory, 0, $MEM_RELEASE)
EndFunc

Func _B64D_Exit()
    $_B64D_CodeBuffer = 0
    _MemVirtualFree($_B64D_CodeBufferMemory, 0, $MEM_RELEASE)
EndFunc

Func _Base64EncodeInit($LineBreak = 76)
    If Not IsDllStruct($_B64E_CodeBuffer) Then
        Local $Opcode
        If @AutoItX64 Then
            $Opcode = '0x89C08D42034883EC0885D2C70100000000C64104000F49C2C7410800000000C1F80283E20389410C740683C00189410C4883C408C389C94883EC3848895C242848897424304889CB8B0A83F901742083F9024889D87444C6000A4883C001488B74243029D8488B5C24284883C438C30FB67204E803020000BA3D0000004080FE3F7F08480FBEF60FB614308813C643013D488D4303C643023DEBBC0FB67204E8D7010000BA3D0000004080FE3F7F08480FBEF60FB614308813C643013D488D4302EB9489DB4883EC68418B014863D248895C242848897424304C89C348897C24384C896424484C89CE83F80148896C24404C896C24504C897424584C897C24604C8D2411410FB6790474434D89C64989CD0F82F700000083F8024C89C5747B31C0488B5C2428488B742430488B7C2438488B6C24404C8B6424484C8B6C24504C8B7424584C8B7C24604883C468C34C89C54989CF4D39E70F840B010000450FBE374D8D6F014489F025F0000000C1F80409C7E8040100004080FF3FBA3D0000007F08480FBEFF0FB614384489F78855004883C50183E70FC1E7024D39E50F84B2000000450FB675004983C5014489F025C0000000C1F80609C7E8BD0000004080FF3FBA3D0000007F08480FBEFF0FB61438BF3F0000008855004421F74C8D7502E896000000480FBED70FB604108845018B460883C0013B460C89460875104C8D7503C645020AC7460800000000904D39E5742E410FBE7D004D8D7D01498D6E01E8560000004889FA83E70348C1EA02C1E70483E23F0FB60410418806E913FFFFFF4489F040887E04C7060000000029D8E9CCFEFFFF89E840887E04C7060200000029D8E9B9FEFFFF89E840887E04C7060100000029D8E9A6FEFFFFE8400000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F58C3'
        Else
            $Opcode = '0x89C08B4C24088B44240489CAC1FA1FC1EA1E01CAC1FA0283E103C70000000000C6400400C740080000000089500C740683C20189500CC2100089C983EC0C8B4C2414895C24048B5C2410897424088B1183FA01741D83FA0289D87443C6000A83C0018B74240829D88B5C240483C40CC210000FB67104E80C020000BA3D00000089F180F93F7F0989F20FBEF20FB6143088138D4303C643013DC643023DEBBD0FB67104E8DF010000BA3D00000089F180F93F7F0989F20FBEF20FB6143088138D4302C643013DEB9489DB83EC3C895C242C8B5C244C896C24388B542440897424308B6C2444897C24348B030FB6730401D583F801742D8B4C24488954241C0F820101000083F80289CF747D31C08B5C242C8B7424308B7C24348B6C243883C43CC210008B4C244889D739EF0F84400100008D57010FBE3F89542418894C241489F825F0000000C1F80409C6897C241CE8330100008B542418C644240C3D8B4C241489C789F03C3F7F0B0FBEF00FB604378844240C0FB644240C8D790188018B74241C83E60FC1E60239EA0F84CB0000000FB60A83C2018954241C89C825C0000000C1F80609C6884C2414E8D8000000BA3D0000000FB64C24148944240C89F03C3F7F0B0FBEF08B44240C0FB6143083E13F881789CEE8AD00000089F10FBED18D4F020FB604108847018B430883C0013B430C894308750EC647020A8D4F03C7430800000000396C241C743A8B44241C8B7C241C0FBE30894C241483C701E8650000008B4C241489F283E60381E2FC000000C1EA02C1E6040FB60410880183C101E9E4FEFFFF89F088430489C8C703000000002B442448E9B2FEFFFF89F189F8884B04C703020000002B442448E99CFEFFFF89F088430489C8C703010000002B442448E986FEFFFFE8400000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F58C3'
        EndIf
        $_B64E_Init = (StringInStr($Opcode, "89C0") - 3) / 2
        $_B64E_EncodeData = (StringInStr($Opcode, "89DB") - 3) / 2
        $_B64E_EncodeEnd = (StringInStr($Opcode, "89C9") - 3) / 2
        $Opcode = Binary($Opcode)

        $_B64E_CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
        $_B64E_CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $_B64E_CodeBufferMemory)
        DllStructSetData($_B64E_CodeBuffer, 1, $Opcode)
        OnAutoItExitRegister("_B64E_Exit")
    EndIf

    Local $State = DllStructCreate("byte[16]")
    DllCallAddress("none", DllStructGetPtr($_B64E_CodeBuffer) + $_B64E_Init, _
            "struct*", $State, "uint", $LineBreak, "int", 0, "int", 0)

    Return $State
EndFunc

Func _Base64EncodeData(ByRef $State, $Data)
    If Not IsDllStruct($_B64E_CodeBuffer) Or Not IsDllStruct($State) Then Return SetError(1, 0, "")

    $Data = Binary($Data)
    Local $InputLen = BinaryLen($Data)
    Local $Input = DllStructCreate("byte[" & $InputLen & "]")
    DllStructSetData($Input, 1, $Data)

    Local $OputputLen = Ceiling(BinaryLen($Data) * 1.4) + 3
    Local $Output = DllStructCreate("char[" & $OputputLen & "]")

    DllCallAddress("int", DllStructGetPtr($_B64E_CodeBuffer) + $_B64E_EncodeData, _
            "struct*", $Input, "uint", $InputLen, "struct*", $Output, "struct*", $State)

    Return DllStructGetData($Output, 1)
EndFunc

Func _Base64EncodeEnd(ByRef $State)
    If Not IsDllStruct($_B64E_CodeBuffer) Or Not IsDllStruct($State) Then Return SetError(1, 0, "")

    Local $Output = DllStructCreate("char[5]")
    DllCallAddress("int", DllStructGetPtr($_B64E_CodeBuffer) + $_B64E_EncodeEnd, _
            "struct*", $Output, "struct*", $State, "int", 0, "int", 0)

    Return DllStructGetData($Output, 1)
EndFunc

Func _Base64DecodeInit()
    If Not IsDllStruct($_B64D_CodeBuffer) Then
        Local $Opcode
        If @AutoItX64 Then
            $Opcode = '0x89C04883EC08C70100000000C64104004883C408C389DB4156415541544D89CC555756534C89C34883EC20410FB64104418800418B3183FE010F84AB00000073434863D24D89C54889CE488D3C114839FE0F84A50100000FB62E4883C601E8B501000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D3C1E20241885500EB7383FE020F841C01000031C083FE03740F4883C4205B5E5F5D415C415D415EC34863D24D89C54889CE488D3C114839FE0F84CA0000000FB62E4883C601E85301000083ED2B4080FD5077E2480FBEED0FB6042884C078D683E03F410845004983C501E964FFFFFF4863D24D89C54889CE488D3C114839FE0F84E00000000FB62E4883C601E80C01000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D389D04D8D7501C1E20483E03041885501C1F804410845004839FE747B0FB62E4883C601E8CC00000083ED2B4080FD5077E6480FBEED0FB6042884C00FBED078D789D0C1E2064D8D6E0183E03C41885601C1F8024108064839FE0F8536FFFFFF41C7042403000000410FB6450041884424044489E84883C42029D85B5E5F5D415C415D415EC34863D24889CE4D89C6488D3C114839FE758541C7042402000000410FB60641884424044489F04883C42029D85B5E5F5D415C415D415EC341C7042401000000410FB6450041884424044489E829D8E998FEFFFF41C7042400000000410FB6450041884424044489E829D8E97CFEFFFFE8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
        Else
            $Opcode = '0x89C08B442404C70000000000C6400400C2100089DB5557565383EC1C8B6C243C8B5424388B5C24308B7424340FB6450488028B550083FA010F84A1000000733F8B5424388D34338954240C39F30F848B0100000FB63B83C301E8890100008D57D580FA5077E50FBED20FB6041084C00FBED078D78B44240CC1E2028810EB6B83FA020F841201000031C083FA03740A83C41C5B5E5F5DC210008B4C24388D3433894C240C39F30F84CD0000000FB63B83C301E8300100008D57D580FA5077E50FBED20FB6041084C078DA8B54240C83E03F080283C2018954240CE96CFFFFFF8B4424388D34338944240C39F30F84D00000000FB63B83C301E8EA0000008D57D580FA5077E50FBED20FB6141084D20FBEC278D78B4C240C89C283E230C1FA04C1E004081189CF83C70188410139F374750FB60383C3018844240CE8A80000000FB654240C83EA2B80FA5077E00FBED20FB6141084D20FBEC278D289C283E23CC1FA02C1E006081739F38D57018954240C8847010F8533FFFFFFC74500030000008B4C240C0FB60188450489C82B44243883C41C5B5E5F5DC210008D34338B7C243839F3758BC74500020000000FB60788450489F82B44243883C41C5B5E5F5DC210008B54240CC74500010000000FB60288450489D02B442438E9B1FEFFFFC7450000000000EB99E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
        EndIf
        $_B64D_Init = (StringInStr($Opcode, "89C0") - 3) / 2
        $_B64D_DecodeData = (StringInStr($Opcode, "89DB") - 3) / 2
        $Opcode = Binary($Opcode)

        $_B64D_CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
        $_B64D_CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $_B64D_CodeBufferMemory)
        DllStructSetData($_B64D_CodeBuffer, 1, $Opcode)
        OnAutoItExitRegister("_B64D_Exit")
    EndIf

    Local $State = DllStructCreate("byte[16]")
    DllCallAddress("none", DllStructGetPtr($_B64D_CodeBuffer) + $_B64D_Init, _
            "struct*", $State, "int", 0, "int", 0, "int", 0)

    Return $State
EndFunc

Func _Base64DecodeData(ByRef $State, $Data)
    If Not IsDllStruct($_B64D_CodeBuffer) Or Not IsDllStruct($State) Then Return SetError(1, 0, Binary(""))

    $Data = String($Data)
    Local $Length = StringLen($Data)
    Local $Output = DllStructCreate("byte[" & $Length & "]")

    Local $Ret = DllCallAddress("int", DllStructGetPtr($_B64D_CodeBuffer) + $_B64D_DecodeData, _
            "str", $Data, "uint", $Length, "struct*", $Output, "struct*", $State)

    Return BinaryMid(DllStructGetData($Output, 1), 1, $Ret[0])
EndFunc

Func _Base64Encode($Data, $LineBreak = 76)
    Local $State = _Base64EncodeInit($LineBreak)
    Return _Base64EncodeData($State, $Data) & _Base64EncodeEnd($State)
EndFunc

Func _Base64Decode($Data)
    Local $State = _Base64DecodeInit()
    Return _Base64DecodeData($State, $Data)
EndFunc
Link to comment
Share on other sites

Correct, 3.3.8.1 works.

Edit:

The oldest beta I could find to download was .20, which also crashes. If anyone has other betas archived (only need AutoIt3_x64.exe), I'd be happy to test where this crash might have started happening.

Edited by wraithdu
Link to comment
Share on other sites

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...