Jump to content
RTFC

CodeCrypter - Encrypt your Script

Recommended Posts

:'(Why can't people be satisfied with strings having a maximum length of 80 characters anymore?:( Life used to be so much simpler when CPUs ran only in real- or protected mode, and no rainbow had more than 255 colours. (sigh)

Well, souldjer777, I can reproduce your issue (with a slightly longer string than the one you posted). It's obviously a fairly trivial clipping issue. I'll see what I can do...

 

Share this post


Link to post
Share on other sites

LOL, right on :) I know man, guess what?! Today I hit the max character limit of a URL string as well LOL. 2,083 in IE.

I appreciate everything you've done! :cheer: You rock RTFC  :graduated: 

(Can't find the emoticon with the guitar :huh2:

 

Edited by souldjer777

"Maybe I'm on a road that ain't been paved yet. And maybe I see a sign that ain't been made yet"
Song Title: I guess you could say
Artist: Middle Class Rut

Share this post


Link to post
Share on other sites

:guitar::guitar:(click default at top right of emoticon child window)

Don't get me wrong, though. For progress's sake, I think people should be encouraged to keep pushing the envelope, only I wish I would not find myself so often inside that punchbag envelope at that time:D Good to hear URLs have their limitations too, so it's not just me.

Anyroad, see if spankingly new bundle version 1.8 provides any relief. From my earlier script annotations I could tell that this string clipping exercise was quite underdeveloped, and it's still far from robust (some strings may still require manual restoration). But I'm now using two recursive clipping calls (on ampersands outside strings and the approximate midpoint of very long strings), whose operation can be user-controlled by editing the values of two new Globals in MCF.au3:

Global $maxLineLength=1024
Global $maxStringLength=64

At the moment, these string barbers grab their scissors whenever a line threatens to become >2048 chars.

And while I'm at it, I should also mention that Codecrypter's Tab "Single-Build" now has two new checkboxes:

  • "Break Long Strings into multilines", corresponding to MCF's internal global $MCF_BREAK_LONGSTRINGS

This was my initial stab at line length reduction. You can leave it off by default, as the new clippers are always imposed when a line is over 2048 chars long. All it does is add extra line-breaks following the ampersand in any {string: #} & {string: #} metacode sequence. This just provides some extra optional multi-string division power.

  • Skip MetaCoding Funcs in strings, corresponding to MCF's internal global $MCF_REPLACE_FUNCSINSTRINGS

This relates to an issue addressed earlier in this thread, in which (case-insensitive) AutoIt function names doubled as case-sensitive) machine-code function names, which had to be reprocuded unaltered to work. And because metacoding standardises function names to their first occurrence, their "restoration" created a mismatch that caused those machine code calls to fail. If you use lots of Ward's UDFs, you'll probably want to tick this box.

Share this post


Link to post
Share on other sites

Hi RTFC

 I'm interested to implement the $CCkey part
with this: https://www.autoitscript.com/forum/topic/145433-my-version-of-a-robust-license-key-system-example-code/

I didn't try anything yet
just wondering how you would do it, as its mentioned that CodeCrypter edits this part in some way and I just want to make sure I understand how this part can be changed safely

another question I want to address is how is it possible if at-all to run codecrepter on a stripped form made by autoit stripper
just wondering what can I do to make both play together since last time i tried it out, it was something to do with memory constants ..
so for instance: would it help if I used the parameter /mo : "Just merges the Include files into the source and strips the Comments." (with autoit stripper) and codecrypter Will know how to adjust the memory constants as needed

I need to try this again for testing the $CCkey decryption query at startup in MCFinclude.au3 but also wanted to know if it it will work with autoit stripper  (as already mentioned)

TIA
 

Edited by Deye

Share this post


Link to post
Share on other sites

Hi Deye,

I see no reason why your implementation wouldn't work in principle (or in practice). :)Looking at Morthawt's codes, there's an inputbox query at startup (name for generator, serial key for checker); I'm not clear how you would wish to implement that; presumably it would be too tedious for a user to have to type in a serial key every time they use your software, but you don't want to store this serial key on a user's machine, but (re)generate it on the fly. You could opt to use the generator function itself, and have the user enter their registered name at startup. Alternatively, you could use multiple keys, of which the (for example registry-stored) serial code would be just one, and username and, say, motherboard ID being other possible candidates to include.

The way to do this is to edit MCFinclude.au3 to incorporate all necessary functions to generate/check the serial code. Now it's crucial where you put these:

  • above or inside #region Encryption1: content will be obfuscated only (if obfuscation is switched on);
  • inside #region Encryption2 (above function MCF_Init()): content will be obfuscated and fixed-key encrypted (independent of $CCkey[...] contents); this is the only type of encryption that will work (see below);
  • below #region Encryption2 (that is, anywhere below function MCF_Init()): this will not work! Another member ran into this gotcha earlier in this thread. Doing this would create a circular argument (literally) of the code needing its own unencrypted content in order to decrypt that same content. So do not paste any of your key-generating code at the end of MCFinclude.au3, but always above/inside #region Encryption2, and above its last function MCF_Init() which is used as marker for the end of that #region!:P

If you do decide to go with user query at startup, an empty key definition will trigger a password inputbox in MCFinclude (see just below $CCkey definitions); you could edit that and wrap whatever InputBox returns inside your own call to your own serial-generating function, so its return is stored in $CCkey[1].

Once MCFinclude works the way you want it, you can then quickly generate multiple software copies for individual users using only CodeCrypter (without having to edit MCFinclude.au3 each time) by providing a user-specific, expected serial code (twice) in the key definition box (under Tab Encrypt). That will then be the actual encryption key. This can also be automated through CodeCrypter's command-line options (haven't tested that bit extensively though:>). For a valid user's entry at startup, the same serial would be produced by Morthawt's functions to be used for decrypting your script at runtime.

Regarding your second question about stripped code, doubtless you already know that CodeCrypter will by default do that for you, but if you wish to have full control yourself, you can of course generate a single .au3 file with all #includes incorporated beforehand. If that runs okay, and CodeScanner reports no issues (so all required constants are present), then there should be no problem Codecrypting that script either (in that case there will be just a single metacode file: MCF1.txt, and building MCF0.au3 should be really quick). You can test a BackTranslated version (without encryption or obfuscation or any other alterations) first, if you're not sure.


Hope this clarifies matters.;)

EDIT: actually, just remembered that CodeCrypter does expect MCFinclude to be a separate #include file when encryption is switched on. So you would either have to disable that check inside CodeCrypter, or keep MCFinclude as your only external #include file, while stripping the rest.

Edited by RTFC
omission

Share this post


Link to post
Share on other sites

thanks for the clarifications 
that was what I intended to do: if I just wanted the part of MCFinclude , I would put "#include "MCFinclude.au3"" at the top of a stripped script with a routine that checks a registry key at launch.
 

Edited by Deye

Share this post


Link to post
Share on other sites

@Deye: You're very welcome.^_^

Having thought about it a bit more, there's an alternative approach that you may wish to consider. Instead of user-query (tedious for users) or registry keys (could be access-monitored and copied to other machines), you could have your software read in a tiny ini file at startup, which just contains the registered user's name and other details. This doesn't even have to be encrypted. You'll have your software display its contents in a splashscreen or something, stating: Software license xyz for registered user so and so at company this and that, etc. Unbeknownst to the vile hackers that would attempt to rip off your work, you also send the exact same contents of that ini file to the serial key generator in MCFinclude, and use the returned serial as your decryption key. When anyone then tries to tamper with the contents of the ini file, changing even a single byte will produce a completely different serial, hence also a completely different decryption key, and nothing wil work anymore.:P The beauty would be that the user details would be plain for all to see, but any edit thereof will produce garbage code. Of course, you could make things even harder by encrypting the ini contents themselves as well, with some basic Crypt function. It's just because the registry is such an obvious place to store serials. Anyway, best of luck; hope it works out.

Share this post


Link to post
Share on other sites

HI RTFC

lets say i know the expected diff criterion's that will need to meet $CCkey[3] for 20 machines 
and i want to batch create\compile 20 outputs, for these machines. and repeat this in-case of an update

basically i wanted to have a workable variable to play in MCFinclude, that will be workable from the top of the batch building process too
this Var's availability will simply help pair a thing on the expected host before setting a $CCkey .. and even for the output name of the file, that will later be compiled to an exe with the same name

must I have to run codescanner repeatedly before codecrypter to generate single builds since I only need that variable in MCFinclude ?
I only need to know how to shorten the process if possible, since after codescanner is done. I only need to change a parameter in MCFinclude.au3 and define the expected $CCkey

and a question I have related to the command lines :
can you give an example how to set expected returns for $CCkeys 

and of course any other info that jumps to mind that may help advance what I'm looking to do ..

TIA

Edit:  presuming i can define expected  $CCkeys I may pend a parameter to $CCkey[2] and work it from there to set $CCkey[3] that might as well act as the var I'm looking for ..  ?

Edited by Deye

Share this post


Link to post
Share on other sites

Updated bundle version 1.9 is now available for download; fixed various command-line usage issues (file paths that got irretrievably lost, non-existent logfiles, and other regrettable oversights, ahem :>). Nothing like a user-base to identify all kinds of hidden problems and situations I never tested for, so thanks, Deye!;) Note: I've noticed that commandline processing can occasionally still error out, but so far I haven't been able to identify the cause (it's a Heisenbug,:mad: so not reliably repeatable). When I find it, I'll post another update.

@Deye: I'm not entirely clear what you are suggesting, but I'll do my best to clarify, based upon:

On 23/04/2016 at 1:50 AM, Deye said:

lets say i know the expected diff criterion's that will need to meet $CCkey[3] for 20 machines 
and i want to batch create\compile 20 outputs, for these machines. and repeat this in-case of an update

Any change you make to the calls defined in MCfinclude's $CCkey have to be made before you run CodeScanner. So if the difference between your 20 machines is recognisable through what an existing macro, function call, or UDF returns (and in the latter case, this UDF is placed in Region Encryption2 above MCFCC_Init() so it can be accessed by MCFCC_Init()), then call it in your selected key ID ( = $CCkey index). Now you can generate machine-specific executables automatically with CodeCrypter.exe + commandline parameters, like so:

codecrypter.exe /fhelloworld.au3 /b /e /k3 /dAlice
<compile MCF0test.au3 and copy exe to Alice's machine>
codecrypter.exe /fhelloworld.au3 /e /k3 /dBob
<compile MCF0test.au3 and copy exe to Bob's machine>
codecrypter.exe /fhelloworld.au3 /e /k3 /dCaroline
<compile MCF0test.au3 and copy exe to Caroline's machine>
...

In this example I'm using existing key ID=3 (macro @UserName) with different users. Each version will have a unique encryption that works only in environments where @username returns the exact string parsed after the /d parameter.

If, alternatively, you're using the GUI, you would define that variable decryption key (Alice, Bob, etc.) under Tab Encrypt, under button "Decryptor."

 

It is not a good idea to have a call in CCkey[2] alter the contents of CCkey[3] at runtime, as this region will itself be encrypted beforehand. You could however consider a scenario where you predefine in your key UDF an array of all valid responses (e.g., valid IP addresses), call your environment-query there (e.g., @IPaddress1), and add its response to that array, then apply an _ArrayUnique, and return _ArrayToString. If the IP is already in the list, its double is removed; if not, the returned string is different, causing decryption to fail. However, this is not as secure as generating individual exes on a per-case basis, as your key-generating UDF is itself only fixed-key encrypted, so could be vulnerable to attack.

So the general idea is to keep MCFinclude unchanged from the way you set it up, and let the environment in which it is calling a $CCkey definition speak for you at runtime.

Hope that clarifies matters.:)

Edited by RTFC

Share this post


Link to post
Share on other sites

I'm running into a problem using MCFinclude.au3 and am hoping RTFC or someone can shed some light...

If I add the MCFinclude.au3 to an AutoIt script on my 64-bit Windows 10 box, it blows up when running as a 64-bit process. For example, if I use this piece of code:

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=testing_x86.exe
#AutoIt3Wrapper_Outfile_x64=testing_x64.exe
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <MCFinclude.au3>
Msgbox(64, "test", "testing, testing, 1,2,3...")

When I just select Tools | Go, I get the message that Autoit has stopped working, and a return code of -1073741819

Any idea of what I might need to adjust in order to get this working under 64-bit Windows 10? And it's only if I select to compile it as an x64 target. x86 seems just fine (or just commenting out the include).

Thanks for all the hard work on this UDF!

Share this post


Link to post
Share on other sites

@Lucid: Very sorry to hear about this issue.:(

I've isolated the problem. this wrapper directive:

#AutoIt3Wrapper_UseX64=y

causes function _AES_Startup() in Ward's AES.au3 to fail ca line 46, here:

Local $Opcode = String(_AES_CodeDecompress($Code))

The odd thing is that it's not due to 64-bitness itself, as I'm running on 64-bit too (but compiling for 32-bit architectures for compatibility reasons). So the bad news is, I cannot fix this, as it's Ward's compressed machine code routine that is failing when that directive changes the default work environment for it.) I would suggest you contact Ward by posting in the AES thread. Alternatively, if you are comfortable with encryption UDFs, you could of course opt to replace Ward's AES library with a different encryption library (you'd have to change only a few calls in MCF.au3). But I would advise against using native AutoIt encryption functions, as they are too slow to be effective in this context.

Sorry there's no quick fix from my end for this.:( Hope Ward can find a solution.

Share this post


Link to post
Share on other sites

RTFC, thanks for the speedy reply!

Right now I just have a super small bit of code that needs to be encrypted. So I don't think speed will be an issue. Do you have any suggestions on alternate algorithms that would work well with CodeCrypter? At least something to help me get my utility out the door and buy me time to try and track down Ward and ask him about the AES.au3 stuff...

Share this post


Link to post
Share on other sites

For something quick and dirty (or if you're encrypting only a few percent of your code), I suppose you could try BitXORing the returned key (or some hash thereof), extended multiple times to fit whatever is to be encrypted (length-adjusted per case). Ward wrote machine code functions for that too, but they may suffer from the same issue; haven't tested.

But if speed is not an issue, then you can always revert to native AutoIt encryption functions ( _Crypt_EncryptData/Decryptdata etc). That would probably be the easiest to implement and test. And I know those work well with Codecrypter, because I used those as placeholder functions when I wrote it, before decryption speed was considered. And they should work when x64-compiled.:) Of course, having the foresight of a blind wombat, I've long since discarded those very early test versions,o:) so you'll have to patch it in yourself.

FYI, quoting MCF.au3 remarks:

;       Steps for changing the encryption algorithm:
;       - rename a copy of MCFinclude.au3 as <newname>
;       - remove #include AES.au3 from <newname>
;       - if your algorithm requires some other external #include, add this at the top of <newname>
;       - in <newname>'s UDF _MCFCC(), replace the decryption call
;       - edit <newname>'s Global $MCFinclude = "MCFinclude.au3" => "<newname>"
;       - change in MCF.au3: #include "MCFinclude.au3" => "<newname>"
;       - change in MCF.au3: replace all encryption calls in UDF: _EncryptEntry()
;       - Test, test, and test, then test again (and do more tests). Then test.

So in this case, do not forget to #include <Crypt.au3> at the top of your alternative MCFinclude.au3

Best of luck,

RT

Edited by RTFC

Share this post


Link to post
Share on other sites

@Lucid: Okay, to expand on my earlier response, and because this may help others as well, here's what you'd need to change in the CodeCrypter environment to replace Ward's AES calls with native AutoIt Crypt functions. This example can also serve as a generic template for incorporating some other encryption library or dll.

Start by copying MCFinclude.au3 to a file with a new name; here we'll name it "MCFincludeSlow.au3", because using native functions is going to be excruciatingly slow:yawn: (always use machine code or dll calls here if you can, folks).

In MCFincludeSlow.au3, replace:

#include ".\AES.au3"    ; by Ward

by this:

#include <Crypt.au3>

And replace this:

#region Encryption1 (to be obfuscated only)

_AES_Startup()

; do NOT edit this part!
Global $MCFinclude="MCFinclude.au3"     ; this script (do NOT use @ScriptName)

with this:

#region Encryption1 (to be obfuscated only)

; do NOT edit this part!
Global $MCFinclude="MCFincludeSlow.au3"     ; this script (do NOT use @ScriptName!)

Note that the _AES_Startup() call is now gone. We also need to replace the original decryption function in MCFincludeSlow.au3 (just below the previous edit) with:

Func _MCFCC(Const $hexstring,$index=0)
    Return BinaryToString(_Crypt_DecryptData($hexstring,$CCKey[$index],$CALG_AES_256))
EndFunc

Next, open MCF.au3, and change:

#include ".\MCFinclude.au3"         ; default MCFinclude, using AES.au3, by Ward

to this:

#include ".\MCFincludeSlow.au3" ; alternative version that uses native AutoIt Crypt functions (SLOW!)

IMPORTANT: you also need to do this in CodeCrypter.au3 and in any script you wish to encrypt in this way, and then run CodeScanner on that script again, before starting CodeCrypter!

But before doing that, please also replace the existing _EncryptEntry() UDF in MCF.au3 with this alternative:

Func _EncryptEntry($inputstring,$keytype,$AddSpaces=True)

    Switch $AddSpaces
        Case True   ; same content = different encryption
            $pass1='"' & _Crypt_EncryptData(_StringRepeat(" ",Random(0,4,1)) & $inputstring & _StringRepeat(" ",Random(0,4,1)) ,$CCKey[$keytype],$CALG_AES_256)& '"'
        Case Else                           ; same content = same encryption
            $pass1='"' & _Crypt_EncryptData($inputstring,$CCKey[$keytype],$CALG_AES_256)& '"'
    EndSwitch

    Switch $MCF_ENCRYPT_NESTED
        Case True
            Return "'" & _Crypt_EncryptData($pass1,$CCKey[0],$CALG_AES_256) & "'"

        Case Else
            Switch $keytype
                Case 0  ; default option requires no explicit parameter
                    Return $pass1

                Case Else
                    Return $pass1 & "," & $keytype
            EndSwitch
    EndSwitch

EndFunc

That's all.:) In this example, I've kept using the AES-256 algorithm in _MCFCC() and _EncryptEntry(), but you can of course use any other supported method, just as long as you use the same method in both UDFs, obviously.:D

Just to be clear, I'm not recommending that anyone follow this procedure, unless you absolutely have to, as in Lucid's case, where the code has to be compiled for x64, which currently causes an issue in Ward's AES_Startup() call (let's hope this gets resolved).

Edited by RTFC

Share this post


Link to post
Share on other sites

hey rtfc, first and foremost i want to thank you for your awesome work!
I already stumbled upon it a couple of weeks ago, but decided to work with your script first for some time befor wasting your time with stupid questions.

At first i had some troubles obfuscating and encrypting my script (3000 lines of code) but after optimizing my script on several ends the output is not only working perfectly, it also looks pretty great.

 

Sadly I'm stuck now trying to create a function to decrypt the script using a server response.

My exact case :

.) nKey is automaticly beeing created and handed over to customer
.) nKey status is verifieable via get request to web-api
.) if nkey status = active -> decrypt

Since the nKey is known to my clients anyway and i want to make this endevor as painfree to them as possible my thoughts are :
First time they start their software  ($nKey=0) a msgbox should appear that asks them to input their serial which is then stored in the ini (and $nKey=realvalue) and should be used as variable in the get request.

I'm able to do the webrequest, but how do i get the var $nkey into the _MCFCC_init function?

Func getulkey($pdid, $login, $mail)
    Local $out
    HttpSetUserAgent($pdid)
    $gdata = InetRead($activurl & "&email=" & $mail & "&licence_key=" & $login & "&request=status" & "&product_id=" & $pdid, 1)
    $nbytesread = @extended
    Local $fData = BinaryToString($gData)
    Local $hData = StringRegExp($fData, '"(\w+)":([^,\{\}]+),?', 3)
    If IsArray($hData) or UBound($hData) <> 19 Then
      Return $hdata
    ElseIf IsArray($hData) or UBound($hData) <> 8 Then
        Return -1
   EndIf

    Return $hData
EndFunc


Func chill()
        checkulkey($pdid, $login, $mail)
EndFunc

 

Now with my checkulkey function i tried several things.

For one :

 

Func checkulkey($pdid, $login, $mail)
    Return _MCFCC_Init(getulkey($pdid, $login, $mail))
EndFunc

This calls the mfcinit though and I can't even start the decrypter.

 

Then i tried :

Quote

Func getulkey($ulkey)

    global $gogo = $ulkey[3]

EndFunc

and set $CCkey[8]=$ulkey[3]

which gave me an array error.

 

Could you maybe give me some tips on how you would best solve an auto-decryption via a positive serial-authentification?

 

One thing that I plan to implement later was to add a check that opens an inputbox in case the serial is not stored in the ini so users can add it themselves befor starting the webrequest. This should be no problem though once I managed to establish a basic functionality, right?

 


 

 

Edited by Mentis

Share this post


Link to post
Share on other sites

Hey Mentis, hello!:welcome:Thanks for the kind words.

On 17/07/2016 at 7:32 PM, Mentis said:

wasting your time with stupid questions

Actually, the benefit of those is that it takes no time at all to come up with an answer,:D whereas yours require me to corral countless neurons in the quagmire between my ears.:think:  Let's see if we can break this down:

On 17/07/2016 at 7:32 PM, Mentis said:

First time they start their software  ($nKey=0) a msgbox should appear that asks them to input their serial which is then stored in the ini (and $nKey=realvalue) and should be used as variable in the get request.

The code that does this you'll have to place in MCFinclude.au3, well above Func _MCFCC_Init. This is not a problem, since this information is public anyway.

On 17/07/2016 at 7:32 PM, Mentis said:

I'm able to do the webrequest, but how do i get the var $nkey into the _MCFCC_init function?

General point: any internet traffic containing decryption keys can be intercepted, so at the very least I would add my own encryption layer there, and/or maybe take the hash of what is returned, or something. See earlier in this thread for the example of valid/invalid LAN IP addresses; that may give you an idea how to make this part less transparent.

Then to your key question (pun intended). You appear to have misunderstood how _MCFCC_Init() works. You do not parse a key to it at runtime, but call it to fill array $CCkey, which may contain your own calls to produce a key (or several). So if you want your server response to be stored there, you''ll have to edit MCFCC_Init() first. Your function getulkey($pdid, $login, $mail) will need to be available to MCFInit, so like your first-time serial input routine, you'll have to place it well before _ MCFCC_Init(), e.g., in region Encryption 1 (obfuscated only), or at the top of region Encryption 2 (fixed-key encrypted). Next, You got to _ MCFCC_Init  and replace one of the existing $CCkey definitions, or add a new one at the bottom. For example, assuming the parsed variables $pdid, $login, and $mail are Globals, and you're not also using macro @LogonDomain as a key, you could do something like this:

$CCkey[4]=getulkey($pdid, $login, $mail)

Then you need to run Codescanner on your main code (which has MCFinclude.au3 included, and when you start CodeCrypter, select decryption key number 4. Now presuming that your server response is unique for each login ID, you'll also have to provide the correct, expected response manually, unless Codecrypter's call to getulkey can access your server directly already, and the account in question has been activated there, so a real, valid server response is returned to CodeCrypter when it encrypts your source.

That actually sounds way more complicated than it is.^_^ So the way to test this would be to create the same dummy/duplicate account on two machines that your server recognises as valid, encrypt your source on one, and run that encrypted version on the other. Or in a real world scenario, when a new user wishes to download your software, your server first generates a unique serial, calls Codecrypter to generate an encryption with that serial (or hash thereof, be creative), and send that encrypted version plus the serial to the user. Note that this set-up means that you (or your server) will have to generate a uniquely encrypted version for each user/login ID, but this can of course easily be automated (see CodeCrypter's command line options).

Hope this helps.:)

PS To avoid internet traffic sniffers catching your server response = key, I would do something slightly more sophisticated myself. I'd let a new user download a little download programme first, maybe to establish your unique serial number. That programme would also get some physical hardware specs from the machine it's running on,  plus @computername, username etc (have a look at the macros list), and send these back to your server so it can use these too as part of a composite key. That would be somewhat less vulnerable than downloading a plaintext decryption key every time. Just my two cents...;)

Anyway, hope it works out.

Edited by RTFC

Share this post


Link to post
Share on other sites

Hi, can you explain me why....

my program starts with windows 7 pro 32 "virtual machine" but I can not see the GUI, and it works with Windows 10 and Windows XP.

THX

Share this post


Link to post
Share on other sites

Hello rootx, sorry to hear your code is running slower than you would like in your VM. If the encryption slows it down too much, you may benefit from exploring the various options to reduce the amount of encrypted code in your script, for example, by encrypting only every Nth line, or specific UDFs only. See the Codecrypter FAQ for details.

Share this post


Link to post
Share on other sites

I encrypt my program following the default settings that you wrote in your guide...

I would like to know why on some Windows machines work and others do not.

Also this code example does not work if you encrypt it...

Before encryption run....

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "MCFinclude.au3"
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 440, 192, 124)
$Button1 = GUICtrlCreateButton("Button1", 160, 152, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button1
            MsgBox(48,"test","test")
    EndSwitch
WEnd

After no

#pragma compile(inputboxres, true)

Global Const $GUI_EVENT_CLOSE = -3

Global Const $MEM_COMMIT = 0x00001000
Global Const $PAGE_EXECUTE_READWRITE = 0x00000040
Global Const $MEM_RELEASE = 0x00008000

Global Enum $TOKENPRIMARY = 1, $TOKENIMPERSONATION
Global Enum $SECURITYANONYMOUS = 0, $SECURITYIDENTIFICATION , $SECURITYIMPERSONATION , $SECURITYDELEGATION
Global Enum $TOKENUSER = 1, $TOKENGROUPS , $TOKENPRIVILEGES , $TOKENOWNER , $TOKENPRIMARYGROUP , $TOKENDEFAULTDACL , $TOKENSOURCE , $TOKENTYPE , $TOKENIMPERSONATIONLEVEL , $TOKENSTATISTICS , $TOKENRESTRICTEDSIDS , $TOKENSESSIONID , $TOKENGROUPSANDPRIVILEGES , $TOKENSESSIONREFERENCE , $TOKENSANDBOXINERT , $TOKENAUDITPOLICY , $TOKENORIGIN , $TOKENELEVATIONTYPE , $TOKENLINKEDTOKEN , $TOKENELEVATION , $TOKENHASRESTRICTIONS , $TOKENACCESSINFORMATION , $TOKENVIRTUALIZATIONALLOWED , $TOKENVIRTUALIZATIONENABLED , $TOKENINTEGRITYLEVEL , $TOKENUIACCESS , $TOKENMANDATORYPOLICY , $TOKENLOGONSID
Global Enum $NOT_USED_ACCESS = 0, $GRANT_ACCESS , $SET_ACCESS , $DENY_ACCESS , $REVOKE_ACCESS , $SET_AUDIT_SUCCESS , $SET_AUDIT_FAILURE
Global Enum $TRUSTEE_IS_UNKNOWN = 0, $TRUSTEE_IS_USER , $TRUSTEE_IS_GROUP , $TRUSTEE_IS_DOMAIN , $TRUSTEE_IS_ALIAS , $TRUSTEE_IS_WELL_KNOWN_GROUP , $TRUSTEE_IS_DELETED , $TRUSTEE_IS_INVALID , $TRUSTEE_IS_COMPUTER
Global Enum $SIDTYPEUSER = 1, $SIDTYPEGROUP , $SIDTYPEDOMAIN , $SIDTYPEALIAS , $SIDTYPEWELLKNOWNGROUP , $SIDTYPEDELETEDACCOUNT , $SIDTYPEINVALID , $SIDTYPEUNKNOWN , $SIDTYPECOMPUTER , $SIDTYPELABEL

Func _MemVirtualAlloc($pAddress,$iSize,$iAllocation,$iProtect)
    Local $aResult=DllCall("kernel32.dll","ptr","VirtualAlloc","ptr",$pAddress,"ulong_ptr",$iSize,"dword",$iAllocation,"dword",$iProtect)
    If @error  Then Return SetError(@error,@extended, 0 )
    Return $aResult[0]
EndFunc

Func _MemVirtualFree($pAddress,$iSize,$iFreeType)
    Local $aResult=DllCall("kernel32.dll","bool","VirtualFree","ptr",$pAddress,"ulong_ptr",$iSize,"dword",$iFreeType)
    If @error  Then Return SetError(@error,@extended, False )
    Return $aResult[0]
EndFunc

Global $_AES_CodeBuffer
Global $_AES_CodeBufferMemory
Global $_AES_EncryptOffset
Global $_AES_DecryptOffset
Global $_AES_EncryptKeyOffset
Global $_AES_DecryptKeyOffset
Global $_AES_EncryptECBOffset
Global $_AES_DecryptECBOffset
Global $_AES_EncryptCBCOffset
Global $_AES_DecryptCBCOffset
Global $_AES_EncryptCFBOffset
Global $_AES_DecryptCFBOffset
Global $_AES_CryptOFBOffset
Global $_AES_ModeResetOffset
Global Const $AES_CBC_MODE = 0
Global Const $AES_CFB_MODE = 1
Global Const $AES_OFB_MODE = 2

Func _AES_Exit()
    $_AES_CodeBuffer= 0
    _MemVirtualFree($_AES_CodeBufferMemory, 0 ,$MEM_RELEASE)
EndFunc

Func _AES_Startup()
    If Not IsDllStruct($_AES_CodeBuffer)  Then
    If @AutoItX64  Then
    Local $Code='0IUAAIcM20iJyAbRdkw8wkmHwOnGDw4Fh8k8E65EGdKMRkQR1zIj9mLEYAcJcEiD7AjZHIHRnhTEhunvDCtH28T6Dl+iUjhBYAZEJCDoNnQKLD8KOMMJ0hvwGQ2FEPaorkIGiP9UIcMCROQqOBtChu3rE4CeMcAcxoHyKRY+jsNBV05WgVVNic3kVEU8MeT+oOLHVsZyzlMIYNNbKEyLvCIkkApBD7aHNTAO6IXtbnRWr8BGjjzrPIP9eTyPM9AZwDCJ6YVJjRQAASnx6wVEOeczfiIqBhyKxgHcxcYyAkHc858awkGIA40EMZgSwyz4DzF+2YAQuEmM7EToOon4DingwawEtnQDb0D2xgMPyakBvDKywxOgJ0GnxaB0TemV0BeuJPivG+oG6egEJV8XizWnByGLRQMzBgzPEIkDGQT4RuflQ9sgFQjnB2iQDHOrkX5Czg/D5EGNgCEPOccof6+4UvawKE3b/oQpRgHWgX80SGPVoCvQOFQVfQoIkOskIhUf0kXOo4nSaM9k/QjcqCoxRO5Xf7PkiK+RMhMxQCjEKFteXxxdQVy3CI7eQ8PrA5BDAsWEPw1i4kxogsYQxDIG0K4NaNCRPTtDUAsCg5wdoRADc4IkIQQc4O0IBYOcHaEQBnODtCIHDnB2hEEIzg7QiAk5wdoRCgc4O0IgC+cHaEQMHODtCA2DnB2hEA5zg7Qn6DtITZse7I9NSA4YI/8C6apo/gricF0MhjKEqS24S2CGJtIVXi4M/P0Q65BehgGTjfFo7IuUIiTQyfqCnIxDXhF2A89tMMJBiehmjUgEOhspyMKXdJCIvyeBFjeRUr1MIyQyDyDwiLsUMJHDMwjAJDb6xxPUO5ZAv8Kqu0aa9FhBAgrxG46rL1HUiYgIVQUATQOJbCRc6HzoWPXwdQGxhDe451TmOEVEBwjPGkysKE8GoxvuLWIKUH0ChiNQP0IJM0AKxw0G1ekqsyMsQbcm2DvCHDJVD4gTnNVF5EgYQBAW/l' & _  
    'PxAwYhHwIQF3iBBxSDlYtj0ygyEXwm5gHIJQREMGfIZAUiODPkMgYRQBnyGQcJ0jPkMggRUBnyGQmiG5n94jEKoh+J70yIC6a27bwe1bf2JAwjVbYi8xfYkA3doPMX2JAO3aDzF9ikaGgVvsH2KR5yyQhYBINqVg+rhOjQpHTuSAnOcKDreokk74ubFihy7Vvq2ykwKRwlR3CI9DuBxQ3VBQAL6yzkAkyQOMgjpvfpHDiRMiQ8JDRk/QvYHvtMsKmkwPxAiKpK8jJraO8DLMV5P0yqdFaDpi7U8mWflRiJ8pAUlZIoa0CyXJAv5SFDFMiVX4Lh/Wk9CIKKz+tPi2MjmlXmOxMxwokcI+D+Rrr+ZhYdUxD+BsgcCBAXniBABwzUGlaQEWWeB1RiVYY5xcwg1P6vToibCEN0mtOxVDlGXOk14RQN02eQycv8ZMcRhTxZ0PohW5A/ojYyUVzlCpUUYpgkW2HniGllXy6aJRFj12PN8p0WRiuIhsQDSwQ0yZulMkooxKpkMEUFUzLEOCUHCxZAMt9u1pnS6ZnNBRXO3kzElyXixKrJwXPkXKxMv5QZZngoJPe/Ikpe6SgQQTDqGQQYOIPUMgUxQAeoZAZnSD1DIwcQUHqGQQi6FtKKSlEDhn3tVHnUr6MGkaBKPQqlHx4O0h+PEmkfTxa3J+5rQxWoEFq4QUYGIeBkdGxVhSQclmsipThxmekEDCmm3CchPpuRDCQFSW6dRtqTK6KTOKCfQwUjiBDWyMxZwhojSFlHPJ+0yZw5o33+RrGZJxGlB5AYCHaDthacpe0d5s2YkOS4A6yceqJYwZj0wpDAc184QiwJkPpjjZ+Kk6aKkdY7y42B7IijBc4Qhc4mbKZJryK9LBmaeBtkjvL4wRNIjUcIighXCZIUaIV8MXcBCG8CAWcDMvEmcO1POUUKEwsYLH8ECE8FoRpQnysMYFAGIljIPQ0KXwcaEWAoDhZEaA+hEnhjRRbrI8WnFAXubRxq43fpkBqBgnYJVQcnGXTtsXSJ8fkwqdGuN+wG'
    $Code&='DwKCUnyeFD+bBCQRrBAeIAVEAQaBApAPBywDDEZwGXsIsycyFwkxUBIKMVgSCzFgEgwxaBINMXgSDjFAF+iJifoRnPANLFZ9uSgyClxgCeheSAOlmjwOFrCeooDUFv+b8qiCQsRJf7eZEIKFfjj+/8R0THpHGHEECHkIgEkMkYIq3aYuuFwk6xkvk0lVWDOzdLyTJ0LoBCMxkm5n+hJEmQ8SckqG+QsQCCgHCEAMRZJtaHSQu1gB5hPorwIwVKnpX6mhkGEi4VyPEesTVAGpIUoCgMxiTUVKhIPsIMhHdUwyQ5C4ijqsRjF6Xw1Ke8eiinQol6jxMRQ+CAw7hXrg6EIibeHJgCAhDUsGFMOQEWj4DshwaR68lEblOBByvy+skqeHMuAJucHCE+iENzGNYP+m4B0ZID6cEelNaFixBzC6Tp1HAZxD8g8CDnEgA+cSBA5xIAXnEgYOcSAH5xIIDnEgCecSCg5xIAvnEgwOcSAN5xIODnF6g+0UirRZBUC3B8gPCDWMoVNje0jUXCiQzTIBNAZBFuiZONoG8QZbNotGVVwS6BULjCdJQf99z1Ms3LolwwkEMDEO/4xSbfTH6zguEwQgMQPDGAStEtFbHgycCAw50pDhdDZLjLf0Ctwhc4p6JISRoqwWjpEgfQgdCl01tbFmIMggyQp8yaPPlgYUxLXEZ1SxBCYQMh9kkhjCnrBk4xjoalEKSYHugNQZGXJIXxQkTxEWVwULM4AYEg6YhIZxiIYikIyYdpANGoH+oBXQUJKx3RihiGQBROBAdAxIx8Bi/wPpTNDOP0WLMbAIULQBWLgBYLyY9PAG/MED6BBEM0z1hgoUZP0DE5gWXPViAgpU/Wl/84YG/8HrR/0ITISDE0BdI1yEQfHcwemL9CJUEggTVhACmUfyAP7B6ov0IlwSCBNWEAKPAUaJyAZA09mB4lKowCTESMiQzL7y0CTUSNiQ3L7y4CTkSOiQ7L7y8CT0SPiQ/L7iCKSnBF4iQgz7hUgQSKg' & _  
    'UkRghHH3kIEgkkSghLH3kMEg0kTghPH3kQF9i8xJMF95EUFSLjEhcX3lgEmQkaEhsX3lwEnQkeEh8X1BIgXDFTwhJjojr2hAOkITPmPDEoIxQu6+gSIscUCS2C8YGUwQIIFsIFmMMSOA+i7TGusJ6ivKuaSAK6OaDxFswE2vP+6F2Vw6ZSMdp4hQzhxh2KJ+EBiGPiAiXjKeX+nlUHyFkcVwfIUxxZB8hVHFMHyFc/IWod6e9+iGoXenv+kioV3p7+tIVqNye+vSlT3envfohqF3p7/pIqFd6e/rSFajenvr0hah3p736Iahd6e/6SKhXenv60hWo1J761yO7/Se1+uJWUyn4hWBBnVkCweBzGAzjEAnYGBmgBVkByBwIG4m+GBhJByEGQSjB4SLuCWXZHQQjBwVsSxXeSm8EUUgLkAoj4CBGUggHfKso1A1C4fueWSBRDjNxDLkNMjYYZuKD3AnTZ8Lk83DLUOgYW10fXi3gQ/eJEloMMQxiTyEz8rD63vbudRgP9kSLFHJZRmrKATHRoh0Z+W8MRvYpCI7IFxi7/lDJnRDGpsVchyxIBMQSMUbkShQ0VMONGKliHF5b4iAEajIIOSQYKIZHLOgwgQ8MDI5GNCE4kTz6IEAhtFsRENzjEEjITP0QUCFZkRTIVM/QyFz9EGAQ/lqIGORkYmgZbB+icASjMhw5dBh4hkd8vIq5QDK8RRkgGIq5TSJhLoKISWzImnCMm+T2KoqQZyHeWREkyJRZmBNButqkapxYdOoYz91FxtJGkFaQZ2U+0zQPG2JhGU8QRSzSfg8HkGXIGIWLhlSsQ6AHyceC8AoBSIAQyCKkVMYToMjhqEMx2CcVrHMoBFtew68u4FiE63yORuMj2zvC3qBCWiNRkeKI2s7wt6gdUvNRSZxLDrbURgwhDWQMIhMkEm0MBxG51GQQSxelzxYinuaGwPMZZhTHFRSx0yzRiEdYcRQTftxoi3o08M4lEDEF9fNICwgp7mgRkBhQTcujkcaULv1XyFIrygy7DtGA'
    $Code&='UiC7e/IXYOUwIlY0MTgYPIsh8IWgw8jBQG8xrzJIkD0ZDFzATIxdUCr5C2DyYJFWZIvO1laU3oFgaBhsjENwI3ReZHiyfTIUucB8DJKeI0mX2chsXybQ4g5W5fAy35rE0IRyQpjInFmgCiOkfJm0IWgQrLKwmIaIVZQbUmf2Mvm0Fli4/rLAmYO8d87IBEnjCCwM20wXyF9tKBTMBpgdCLpa1iNnXThl2QiRyhXEZhSSyI7IypfMPEwFlWfQLEZfMhZ55kX+56kg35oZBAzOQscSiXrrK7gaP2LFJCLeWzK13TyLEolykzrsdY+KIwwQDbIMEs46sYroB2URy4ohEBEXIxZkFGIVFkIUIhtIGo0Q+1NQPSBcWJSUJwTE6DJUFiycGIxCGcgYkB8QaR6I5RnrGRya6x0UxpzLFu+pR4PNJKi43cHtg5mLLOvDzRCcMewq6wxFCAQciTEIHhiKhqTnvDxiIKT+NxkkHvPP4vVBHijnL2lMKz8MfqQUeKinUzOP6kCDwDuJi3XCCUubkOEztWlhlv/qYrowe/q9ocU+n91IUutPDOXpaljaTN9iNJgehlbGHtuLHLwmy+UM2UISoIEIBjCTbiIZQRjJz5mMQK79Qa9EReqMvoBIybTcY9ulCLDjHWKQRjeYMryrQdijFNtG3nX0l8kSCAsYi2lHQWoUMyHkVirGKMXmf1WUMFKIqo0it8rmXFs2xb2KujJASu4l0t1mcB/RYWW1ESfCk8EC/FFsE9DMzWTmCMxop8kQbKvLcEUDEMWQv6J8FVJ5CyG4C7qEm1fSUVOlosVKqolaCsgloig2y1XEkqVGPAzyxRaG1FqqNAx/18igUup5Mc2oGyGsXqEPIs5ZW6HXXkKwyLRZuA8hvF0QwKLEK5b4huFU7uTIjZDMrSgQyeAfuOjekNDNygbnKRvU4WTYzDX8Tk40Eh646euQ3N8jEMDEBIC3ZGUqxdRYFhI3XHSot2/I4L4/+TLOFOQuxbLoTG7mEuyWa1J' & _  
    'fOCEUkKUBaUt4mPogdA4/fiKB8icxpiQQ4AG1RBT2Kh2DwoBPNbjUS8zDUhD+JsIKGHXs3wgsEgPp/fT/jOokSGERLPkvzRAYEFhE8Ar/O8uAkoz0RJb1bosCZKLnEsAFAV4G++QgCFOZGohVUQethUTiIyrCKR0EBxUFK3qAkqSMIlkLtkcU4yuIw5QIB58qK/UBmqgUsw8UQQ4pkSEqDAZsDU8S6CSVTValBMz381UPwekYwcmLDIjjqRAz2noToNAsTYgIWJ6b1MbS1kFo7eTGRZLQ/t7MHs0KgTXlgAMZthrJIN8H/OFhfwONbG0heP8kDO3QB82J6SbvamjsMic7KOcfzHzM+gcGAf+NDEkGSMnzZz7IJ89SgeCUIpJFwUFHjQRAls7PXGf21BtAwMehLvjfaaSGKD/oE89KyMTCsiD8iBONyIu+0ozTSA+QlUeUmQ/tZEnNzCzpBu+tlSOSbd4GkZiFHZDtmoUoj9dm73ztmRjN+tlNkQOgzngamc2gmymB5oWmKCKexSjuB4S3WKHyNHajd9Vmlh9Y9jAilIGUQSI9VFz3rI+KiRJ1LY3qGI/PzcjNKgQeUOORwO8HRQHtJI08TJnNDP91G6KBncwS2QzpW0W0MPWklULPQpLMxxzNppOKpxSUR8+EupgoRdCjl3mkd4Qi+6rvRN3vKnVsz0jx+a6UipEojsXMEvGryCRE2lLPMiUrSjTpl0jQMvgYm4rvhkjFoidwHcRB6UnXCPofJJotsk1FoRNCC6KAJArGwaOJSio1dJxaCIqEHPDVMIi8wKYWQxgmzliyxsq6/kpgMcPuJDrApPuE8NLcG8x+NQb1Pz1fs6FN7SZ824RMCcDIUugQxyTFEaEp5O8lJBNZ5A//kFL9Nu8MWYOX4siU9EfgZRT4JvE1sFdo0av6ZPijVSKAoiZBF4QUCbz+BIyIWDzOSbJ01FoWxLKMed6k9sqBFnNJPOLNRjOSvsldFjP+0SQU6RZP9BbIGKRIsvbLysVuK/si2ZIL4UUZHm3C'
    $Code&='xiP7BzgzBuxCQygj5BHpe4KN1gmNyDHhRiUFNHnnpyaR75QViMzE/AjnMlnpSvYNyHDx7HVFTBXMifkZ/gTZjBLhWknXAMm6DWQ5KEpwtagdanSkzbTrmHgocnybHKLmlYIYbUgT9NocZODYzhzIzaoIogVNG5HtlAXixcRKpAVG4MjoyRQaQ+AkxAV1MlnoahqUBfMLI/gUyK13kvPUsQGI+LQa8/8qYPykBEhkAchokWyPiHAgy/xHtMVpHgeB6NkzB/VJT86VBlyZviwSyg21KyUKJgernEqXSDYRYJZEJAREUInFJQ9IBVTJdP8EBVjyXwkzBIhhqM5rCABGNxzCFFit7HJkwXpJXAhO1RWVkJRn2DoY2SOoxqQ8IKq3XObi5mhc1CKUBVghpc2dkk7yKALili3I2xfSZNzsnpVPJcoeB2jFUzCGweoHjjMUUgnSNizVkQxKwnKiymSPsh7vRQqFG1vLOyk04PkyFOoGwDWYElLh9VIAaID4TvfFFvE+EvxIFP0CzAJuRRkYCRL5TDKoZvp88sONoffznCneFkLJklJGNklGuxFE6WZKqgZMH2rNkeqh90TRLMmFpqntL5dJwGQJLffOWjsoSjD7UzT3ITjkyw93cMgc5Dwo2YVkxVzhEeWi7RpK83EczFjqk/DxzgzmpSOlGVnSCUnGzqTpyLNiN/Jl2Unt6leGOxnuyhe6+WbQKYSrvIY62eIkIFOoA5G9NMD5RmUa+uyiZE7XkvUo0aoQuCD7LYJDZsMQizy4E3osxGrgJt+wcp6vm/8rJyIYmsaJyMfIScTFIP1Bnp0hIc+1IlYPkoXO4WE51tEmiO5pyj8LrohR6UwO91FBUzyeVeo9npo56dzNE9tbLcX/qa7jyiwmFOVl1/lnQOUY0BjeEKRCfJXB4VhS3BxCHPO+EqDJ+JJU4vDQuLT0RcqJ9U3hV/PbFuNABMiJwsrYMWbWBtOvZQwe86yVTpc21RrzTNe4wNeOUJbe4FvC62nx3wv' & _  
    'B5cRgQMUB1grZ3IUSiarA468vaTHa5RjFjO8LeoCqxIxHYSPkEcSd4W9QFKLIK45JcVrNJAcriJQMB4oNK71AikbMfUQTEr6Fe/UyBxH7hqwBu0nRlcotJZJtgswBwEjGMcY5ifAS8yUy7OMS2opL2xjrBsAxHNiJx5PDEAMdsu8RPO7LVjoM/6b7gy3CqY9q2U7wejIQwHYBkviG0BZs0H4UiS+CsJCqeReIFsFD5yLHVBQGFZFLNnqQaPjAZiGbhMHrBxIEFY9AADMoWI0cZlsG2+CwMJg3WCXI5CKnyTpiUQXFwdrcWNvSIq75keLxY75bGbpM2EmmFKCHQPfwpc4zpchAFKW0ikGW+ChXFOhfdx8siFL5ozCWEiRIec/NGKw2atMuIetBIL+xY+Ix7ZHDyVy6yyCJ3oeeSJxImpfyknXiNEPqFhRSGUAN0nOAIMpay5aaWkvel8K07uLuL9ZmPUreTb3pH2XHDUQJUYmOibJ6m5SWe+Wpzk0jK9GzIqqWCuXsWrFkG7N13OUEbdUM00fKR0SXTUouJr9TX86JBf9mqfziGE7rKAnOmg9R23oMq/OkgJctZ7qXVuHdgQje26immry7HRRFmtB57Qd26j8Z2U7eSR2nMsLEzqucQkvC6/UEvyC2pFiykpSh47pRb7IRY/FRzxLPlaYbO+V8RJaIFeOnfYIruIam+9Fti5EjkqCa5cMYcEG8aqVK/VtN2xJI8kQ72DUzrSmLfiJKVKmuEQfPOiZ2bHIz0SOSW1/T1PqPlmbunssyLGyZi5vdspZpYFk0JcI7FqPNI8DOLPekKqeI8WThaOmMWix08FyK6nLxJjcpwZ8pLqcJVeqvWdkgqDYzfEgjsplfqGLR+b9+EPDI4NJk2LZr6MZkxzSolumx9g3/REiCyKab1PsmcdCxo5kq+CJOf6arxBaLfBpR9wlFwWVJIcTi+YQlq4okp8mqZS7yaYSwRAj3CQo8W3+INLARziDxQP7uhFP2FiEYpcISOu/9r0D/ae8JgeVzaQV2'
    $Code&='Ae1k9bBc9ZyBaWJ6W5qzYxxCMS5lVDERD6916aET+0TlLO2Gbc3rBFgA/aguie6pi0E5jiT1E6Vk+oPgNUvpHREJlFUjejbcShPfi1wi3vsCupR+WO1Exn4EvbPjFmRnnBbRfEkz6SLVIMgvmphmElScB4pDgBGChGyaUyyQFqFa+3sWcuHVl7kot/w7MxqoQCeCSsA6InAI3ntu8gUIif2916YigZ70IQM0gYFT5PCaswK2weyb9NNkLQnk4v+G3+X05zzHVhiI7WnFx77uRvlS7iJTyfU6nC7QM6MSJ+GR0PE6JgYr1DN1bU90tmwQxKI3qE6qRPH1z5tFHCQ2SSAzSKlIiBViQYwsDlp6cJFTktr46S0sxszzGSoEuUJ8oKX39jxJJCMf7xjS/1MlybVHH2aoGEjrHhGiORB4DKDvid2RRSsixO8N/OJFOD8iQtpSJpDRpS0uFe9tMf35JjNC2FM3QttSO5DJ1pcG6FHlCyHtlv3NAUwu745DzyH5NRxxJkpgIyNb0izaQgJfiigZYlpoSR1sGFCUYo9CVCvf8g3UQB7VG+GHOAn+FWoZNNaOPaVSDypAlAHrWwl47zIAqQm6eLoDBN9YzXD1zyYHfJVmukNAPVJIpqViCkhJCEy/J8Qg3REkMW6p8zcbiGw3RBQr9CSrny6UIdC2pI8uQbMiMrkEziTUU9I0cdUkUD7dSEH8iWveIMLZRUYRMIk0MT84GDyVK1MKcDqoLkn2PCUkdHesda8WbpVsFbGGr5hHOzaIcBiEvkOQ/qj+lUlM99+kqST9l97v9coEn70Cp/Tx6APXF58il+daK6J+qRN7J0TuYTR2AvRWMm77WTKm5hLsif9KTy7KNyF4zAh4SozhImSRZJssPtJ8ejCgNUoo3zBnQQA1ADNoHE5YiE3LzSwslVkmIIL7kygl2A5Nz2KLGGnY2SQrHLbc0y9Ay2MLXx3SswQFyemmbi5LxdClZCqg7atGhGoEbk9iDIf8DwyVUjG+UNk' & _  
    'EKi5AJ1gFQnHpIIjmxMY3aFvUD7IRZFMHSgYoSCGVBAZfW0ISIUrkreYZtxzvXgiKFmESiZroKjIPeVQ6xOdixzO8LeoCuuwdZMUkt7AtJeXtEMDCxYnoBCW4b+f4S8aVSPj6f+THtFskSdHpDAxbSYSb81paxem4UC366+ElXOhORJWJSHE6LxGh+I8ZiYIXtkciF0YWyBTEFSjVygbQsi+WTkXtLikDHrLy1zRC+8jLkdCi2DnUGElEGxqVtMn1GBmFJeGCyF6yosMR4xoh668kqM9i3wT7CvyyRMMizCTIMthVGZfgSbLwiYL/GGlEHx6XNNFGHCEdSdCgaOjgsnHvCTP2SsIL+EIhVKlyYKTGMcKvMzBYVrPZxRLlHkLtXohy6YbtP09ky6n5JAH4mGbolax+Cs2RZJrIFASx3EpMiiVJt6hSZTR8EhbpPd1ts2Q8zekz0qUnO20mrSXq9jLMC8fbRIox9s6vg5h0JN3ZvRXalLjoAYSJ/cgB/K29LMKjwCzNKbhovqViGFRE1EfxeazmsmSK5fFWk9yyPy/MhnNEL5eEE8CogOQQsrFBsHgP9eIOXB0kRIHJQWZASXUGq+GErtTja6wz0L2s0IZWb1x0SN3QjSvxiqUEoP2igCjdpYmNQKUc4sk0i5W92qCmgqoSFzKuJXRAUq51KdbLqEvOjdkMct/295eTlyoQz3KB67o7JhBa0kyl2AxQ44yK3ynbWbFUlZQ4c96lr+lSkY6zWvG1pHojL8+05Q6gYANR/p95LUhBkrS/zpg+2GU1ibKdkoB+mCVqKkd1J+qOUHOflIiftJnzDMOKFa1O0Ijjel5Tegai3zyVHxUnwp9UFszS39ZW8YC8oFuVhu8JYgxZJhLZ42BoH65NSwfArDxU/jzIMRBpW7ki2fc6cDyJirCVZFf00sktPHkPaXG0dImKRE6xzTOZf3VgNOa4mdoGCv91kjziaozTituXrZeQoZ2noDqeF0KatPmANB6oKyvhtr3KV7nX9JlKvFwZ70nJe8AQ'
    $Code&='ytOjdKTpI5pI1IIU0bH4HIXEyQjTKEJSHLHIyhDaIfq+Q3ps6SGw7526oixbLJKdmqGUvkhDMSz/WZLZuBykpXysMIsS2Thzz4H5KsSHuLe5KKreoz9A2bx7ROkU1ErC5/ll2S/EaJGpOkksf5mWrcGB6XsidIp2i5pJUu1JpcASuEWB/QH4KwoZPLibCDNoKu/BlyUS/zIWGCuRXXSnvkJu0wKmcaXO/4EbOBl6NkUkRTHVi6MvL2oTlfYYkSzJ8xNamt78g1HmDiP2N/w14fiGzf5ZJU5sOCj3q070UwHkS97KJwyoSXDX/WxotA27MwrydEu0NrlXJyDi4YUlCKtne7ocNUODm+9VrlZCNrp07aHNLBARrHpOqqOJKOcrnQ2a+FYWTE/54g/LCMSNXv12ckZe/z2E6i5o8JPzpMsg+QS22E6MJgFO/9Qi6CCy+ATEC8fR5hPkzwYh7K863PyIGeZO528/1S335dAU/LFsEJ/jlyT9zwnzShNhZjPaxIw0zBAzwnCQKZmP2lP3PFo3owpQJUif7hOfxi6fzCvNVvVRLwng76tj4sUN6iAwO4sqJLhReDN4sNIlBligKWX8YJfOjsxs9GTul82QNCddjurIlq9SBJDmkuyJrxZTZQRS8hECyxCJ+E7cW+aFkPbk7HxK8AzBph2bTCRaRebZPEK+CH4B62v3m85kZarxhJ+SFBh86xBEL8Rq3UY+WsiCNMx+JZA4G/SJOyJDQL7av6VkIl6igGYdRYSVQUAhZJVM1CKUHtI7x3Y8S/rqnYQm+bo0DFT4WIg4kIySiWmm4I0MNIAYBEqI495ExfiVz/Q+bS2KOwuU8FkOp8Rlh+elWPbLl0hZG2jkL8STZMwGyNRIrjkkalIRG0thJqTLT1Ip2CtP+LiXTWpKK6+b2b5ZpGfyyJtTIpxRCFNE+STMTb3DMTJ2ISATPFNWoUh8wM50kqK+JHhARTwJHhyTYuhKfEWTVD/A7ppRifbFJjpC/Exj0GVKiPS' & _  
    'ImFYgSifycCQMWCdv0ugbrU8nfofkGCT1L0orb1mSPy9XLVMq7TRBDJMupGakNWTmiSIk1kyTPCdSjNIbvOPcty3mZAtCi1EMPVViTmJgXQkmLTwbcip7Tc9W0jU0Uh68P1ixWKfEcmzVdI+PSE6kmRIiUq3h8zZUtI5Q0lQ5JKuSbU4mS1UYIkp1XQiYicO6UUVORFBiVDFYCohcfYj8JE+R60xxr0lCvyFM+QgafYU8wn6RMSTYSjJPsyfV2bo+RjSxu5JixeisGH/yar6LE89aQUVMRfMZcbxx12Cv9pdCnlPelqiz1YtEW+dvUInwKSbUgVOx5X8UmVN0oe2Q1bmjZOivIiXFWd4T4eNXyOlru570lklOT82a4k7L3hkx9Q3kVM+aGi3pa+Uts8ts5UvzibwiHcYx6zf/YxJJRU4SKBZC+KCy5VjvkTTpxDWRNZbt/blO0YxKPG4o/UHSLwQ5wyIk+Kmk+Slayv6I9jLa9H5A0gRmGPxF07LW16JB2o93BPXw6mnVL83UKnSGWeSy7JMG6GtlST+JCLFs4JZg9o0EpXDZMxLwqWl+tH2viaoaPnkdksY0y4MGIDJ5TE7mX5F7+eua+9gz2RYwJHhgT7R5elsoEj+D6zgnjAjxdRL3WRksLGl7T7ZiJ/4e5Muq8dCk7oFO5y23bRol9mwzzaL9YATvLB3thJW5c/UC6EKTWfXyCcD2UmTGhtlSvEqg3H3rS/6ityLOUsPSNfMmjTXq+nyfqtT0xRToHJK8rFviCnfZFnXLYj5Q2epaILMSRdpvjvaT5VmnHMxZn8pk9zPKCc7MiQopOaRjBI09K9Gpegxq2bc+CGFY8RNqzgCsDUfezzzR4QzSA+iDEByCxmNUpQQc+HxQhIfudxSZIfZ7xY0I/3HyQg0c1mtQvYfebxSxIZHFxVQIYHEwQlAcAgFQA4fOZxSpIVYrxX0I53H+QhkctddQYodNqxTmIex2xZoIj3HKQkUcH4JQnZIcXVRABBz6fVCHj+8+kBWHslkU6yGO'
    $Code&='R8XJCPtx8EILHEGtUOyHs9QUZyFfosX9CEVxr0LqHCOcUL+HU6QU9yHkcsWWCJtxwEJbHHW3UMKH4f0UHCE9k8WuCExxJkJqHGw2UFqHfj8UQSH198UCCINxzEJPHGg0UFyHUaUU9CHR5cf0IfnxxQgI4nFxQpMcq9hQc4diMRRTISoVxT8ICHEEQgwclcdQUodGIxRlIZ3DxV4IMHEYQigcN5ZQoYcKBRQPIS+axbUIDnEHQgkcJBJQNosbBR6bBwTf4hQ9Ic3rxSYITnEnQmkcf7J/whzqdVCfhxIJFBshHYPFnghYcSxCdBw0GlAum6KKLYME3G6KshC0WuLuhDhboKH7DqRSKPZDdjuKTRC31uJhhDh9s6HODlIpKHtD3eOKPhBeL+JxhDgThKGXDqZTKPVDudGKaBOFNAHH/hUsBwRAIBRgIeP8xR8IeXGxQsgctltQ7YfUahS+IY3LxUYIZ/392QhycTlCSxyUSlDeh5hMFNQhsFjF6AiFcc9CShy70FBrh8XvFCohT6rF5QjtcftCFhyGQ1DFh5pNFNchZjPFVQgRcYVClByKRVDPh+n5FBAhBALFBgj+nYjLBA6gUCjwQ3g8ikQQJZ/iuoQ4S6ih4w6iUSjzQ12jiv4QgEDiwIQ4BY+hig4/kiitQyGdirwQcDjiSIQ48fWhBA5jvCjfQ3e2isEQr9ridYQ4QiGhYw4gECgwReWC8BqDBP3zig4Qv9LibYQ4gc2hTA4YDCgUQyYTijUQw+ziL4Q4vl+h4Q41lyiiQ4hEiswQLhfiOYQ4k8ShVw5VpyjyQ/x+ioIQej3iR4Q4yGShrA66XSjnQzIZiisQ5nPilYQ4wGChoA4ZgSiYQ55PitEQo9zif4Q4RCKhZg5UKih+RTvCxKuDBAuIioMQjEbiyoQ4x+6hKQ5ruCjTQygUijwQp97ieYQ4vF6h4g4WCygdQ63binYTu+CKOxBkMuJWhDh0OqFODhQKKB5DkkmK2xAMBuP6EEgk4myEOLh' & _  
    'coeQOn8IoXUO904puEEOs4u+EOMRioaYOOZEoqEMxlYqkENPk4jeEOPJ5oYsJ1ecIEwQ+uMihQw5uNyhZQ9ptircQAY3ijIQ4sdWhZA6cTijSQ0mpiuAQ2GzitIQ4rFah+g7z9CgHQ8/qiiUQymXir4Q49Hqhjg5HrijpQxAIihgQb7ri1YSQoeKIoARKJeP+EFwu4nKEODgcoSQOV6Yo8UNztIrHEJfG4lGEOMvooSMOod0ofE/udCicQz4fiiEQlkvi3YQ4Yb2h3A4NiyiGQw+KioUQ4HDikIQ4fD6hQg5xtSjEQ8xmiqoQkEji2IQ4BgOhBQ739igBQxwOihIQwmHio4Q4ajWhXw6uVyj5Q2m5itAQF4bikYQ4mcGhWA46HSgnTq6eKLlD2eGKOBDr+OIThDgrmKGzDiIRKDND0mmKuxCp2eJwhDgHjqGJDjOUKKdDLZuKthA8HuIihDgVh6GSDsnpKCBP7s4oSUOqVYr/EFAo4niEOKXfoXoOA4woj0NZoYr4EAmJ4oCEOBoNoRcOZb8o2kPX5ooxEIRC4saEONBoobgOgkEow0MpmYqwEFot4neEOB4PoREOe7Aoy0OoVIr8EG274taEOCwWoToSY4RsCAR85HdyeznyHGuOR28jxZEwyAHkZ3IrOf4c145HqyN2kcrIguTJcn05+hxZjkdHI/CRrcjU5KJyrzmcHKSOR3IjwJG3yP3kk3ImOTYcP45H9yPMkTTIpeTlcvE5cRzYjkcxIxWRBMjH5CNywzkYHJaORwUjmpEHyBLkgHLiOescJ45HsiN1kQnIg+Qscho5GxxujkdaI6CRUsg75NZyszkpHOOORy8jhJFTyNHoAcXtMgQgOfwcsY5HWyNqkcvIvuQ5cko5TBxYjkfPI9CR78iq5PtyQzlNHDOOR4UjRZH5yALkf3JQOTwcn45HqCNRkaPIQOSPcpI5nRw4jkf1I7yRtsja5CFyEDn/HPOOR9IjzZEMyBPk7HJfOZccRI5HFyPEkafIfuQ9cmQ5XRwZjkdz'
    $Code&='I2CRgchP5NxyIjkqHJCOR4gjRpHuyLjkFHLeOV4cC45H2yPgkTLIOuQKckk5BhwkjkdcI8KR08is5GJykTmVHOSOR3kj55HIyDfkbXKNOdUcTo5HqSNskVbI9OTqcmU5ehyujkcII7qReMgl5C5yHDmmHLSOR8Yj6JHdyHTkH3JLOb0ci45HiiNwkT7IteRmckg5Axz2jkcOI2GRNchX5LlyhjnBHB2OR54j4ZH4yJjkEXJpOdkcjo5HlCObkR7Ih+Tpcs45VRwojkffI4yRociJ5A1yvznmHEKOR2gjQZGZyC3kD3KwOVQcu45HFhJdw/IHBlH0p1AJBFJ+QWVTQAkaF6TDiGo6ESdelgLVO6tryyAwH51FRPE2H6z6WKIEpUvjA5NDOCAw6lUgv612bUT2QDyIzKKRBKP1AkwlQJ5P5df8iIHFPCrLxPMIJjVEgL4EtWKjj0D73rFaSYh8JRG6G2cC40XqDpggOV3+wEThggjDL3UCgZuBTPASF+CNRpejiP9rEdP5xgKHA49f5yA0FZKcRJWOCL9teuufQ0RSWdpARNS+gy2IxFgRdCHTAt5J4GkpIOmOychERMsIdcKJao9U9KR5eEB7mVg+a4iUJxG5cd0CMr7hT7YgpvCIrUQXwgjJIKxmgSN9zjq0ED1j3yJKGATu5RoxgkBMl1EzYIiVYhFTf0UCC7Fkd+AgQrtrrkSE+gj+gaAcgcP5CCuUEE5wSCJoWPyPEUX9GQIulN5shyChUnv4RLdmCKtz0yOBKHJLAuIQ2eMfIo9XBCRmVasqTrIi6ygHIHYvtcJEA1sIhsV7moGi0zcIpRBJMCgih/IfbSO/0bICiwIDarog0e0WgkRcJQiKzxwrgXKnebSSEPjzByLy8AT2TmnioUBkZdr0zYiGBhEFvtUCaNE0Yh8gmMSm/kSKFv4uIlOdBNSi81WgQKQFiuEyiVzk9utEdcwIC4PsOYFdQGDvqhBlXnEinwYEtr1uEFFAkj4hivmIbJYR3QY' & _  
    '9O3D9IgWuBEhN5r1GQFCRVI21iP1xEcRdBQLtBAbUbyC5YFAVRP/aCBmY+ySBXta96ZcQFYlAIkPMBEZn2Z53QFew6EK9iKcHEYmLiAKN5xlbOCCdecjuRNuECKF8CkedkMRCD+lA2PiEHsmJqz2PwQmAhoOBCYwyK+1IELweESJwrATTbFpyTkAK/Q7/+4j3DxGFOFYC5D2u1R4gWDYtOUQnBQgKD9lkgbhoXKYhELObWyJU0QRFJDYuOkAGDApnsYjQkxFX5w8CLLTultIgHhubkUSejwiAwMVPgcph3CCiED9adyJLaQQPHBIaFlIDFZO6CgIJwcCgKuUgrzwi4ERDvQgSGxcdgQMOCQ0LEAHyiyLHrQQTLbaouUCKFB6pyIhrVxHxGYUCOq91B0wgke6Z3US7EQijf2D9gUH3ASafEE9cciL1vARnRGY7xUDcW/t+NIjqixFDKXYCl8sjxtwg8rbt/ERozwi45PFjgc7XMdzKEfBC+IUQiLQTEZciQALmhMYRICBzhUokRX0A9bs9+MAJrK75MhGIdMcRKaFtAiIdni9LIOfcsjBE860IDYZS7IE1d8Hj0BCFK7MiFmwE4qlwuZlA+RGUSPqIN0cR6WQiAuio/IzEIByg8D9EGnUIVn0s2IHfIjOQ7xBuh0kiTscER9k40cFA8YzKov6IGpgR1As2AnGm9YHPIB2let5EKCkI2reOJoHFP62/pBCJLDoineQEb1B4kg1At2pfzJuIYlQhfkYBDvaNE8IQqpDYIrjoBBguOfdeS76D2a/1Bwkbn12AyIn8aYYCfAkEVm/VLalAPs8lErOIS8gRrJk7AsYQGH2nINLonGNEbnkI2zu7e4EgzSZ4CRCablkiGPQ92+wRtwEPwINPKKiB/uaVbmUQeKr/9H6IzSERvM8IB1rvFejYgfS655vZEB9KbyI2zgTd6p8J1ECoKbB81ogzMRGksq8HiCo/I7iBB8allDAQxzWiImbABDF0Trw3QLH8gsqmiBLgEZDQsAIQM6fYFSBZ'
    $Code&='8QSYREonCEHs2veBgH/NUA4X4BeR9i+IX3YRTdaNB2BD77Coh1HMqtRUQH/klgTfiKmeEdG14wIZTGqIGy+hwSwfuBBKRmUiUX8EDZ1e6gRALQGMNV2I5foRh3RzAnr7C0EuIJ+zZx1EWpMIktvSUoHJ6RBWMxCcbdYiRxME75rXYYxAoDehDHqI4FkR+BSOAjvrEzyJIE3OqSdE7q4It2HJNYEq4Rzl7RD1ekcisTwEsJzS31lAyFXycz+I6xgRFM55P7sIxze/gTxT983qEINf/SKqW/7fET1vFAKZeETbhiBhyq/zRIEXCLloxD6BKzgkNCwQBMKjIkBfBH4WHcNyQLq84iUMiHcoETxJiwLW/w2VQSAmOagBRHHhCAgMs96Badi05JwQFGRWIsGQBGN7y4RhQFXVMrZwiCFIEWxcdAIM0LhXQiR9qcfSpw9fdVend0rd5yt0D6nv152POafXnb95z9PdZ23f151/LnUP92dLnX8qdSf3v0udFz1n0qc/XnTP929K3Yc9n9fdt3mv152neQ/T3Z8qdDf3H0ud9z3f150Xaf/W3e8rdafn5150f6ln1t3veW/T3bcudM+t39bdz22P1t13aQ/W3QdpN9adh3mH0rfPS91PK3QXvQfXnb95T9bdfyt1b7fvS90XbQfW3Wd9v9bdR2l31t0naUfS939L3Wd9H9L3J191/+ePSp2vKnXf58dedQ+390rdPy90n7kX1t3fKnXv999L3VcqdRfnD0qdn31P0rdPS52HKnRXvafTp6dGAVt0p61v193vKnQn6RfX3d8udGe9r9Knl0vdFy50N6lX0ueHS91/eU/S5wdO3Sc6dYe330udb3nf06f3X3Vv9zdO3Z8rdd/3f07d1yp096mv153/eV/St5dO3d8rdJ+pZ9LnH0+dLy91X+f/Tt2vKnU/589LnQc6dN+tP9KnR0rd/yt0J+3v193vL3SH6e/S94dK3UcqdJ+px9On9190f+nX0+dXTt23OnT/7b/SpzdOnc8+df/3r0/dFz50T63/0qenTp1XO3TP6afTt19Ond8rdMetD9K3P0rdby90t7k/07cfT50PLnTX+d/T939K3d8vdO/tx9LnL0rdryt0x+mf06fvS91vPnRv+a/T589O3Zc+dIfpd9P3t0+dfz50n+lf9OkH07cPTt0/LnTn6TfS5x9O3dcrdCep99P3f0ud7zt0b/3X1qdfWp0XO3T3+c/Tpw9Pnc87dPe9N9Onh07dfyt0X72/0/dvSt1nO3T3/V/T5+9K3a8udL/tT9a3N1qdFzt0T72n1refT91nanSnucfS569Onf9rdN+5f9PnF07d72t0Z7gHLkAj5QIyewhOw04gYtOAbqtwNq0BRliO1nniUZGqW4pFWWZbijkpMGuVZ+7SVqLiHZKFxrgRosm6nlgytZT9ska1lPGU4i1l5S1k3bWc1Vv9jsktNse9FszjsYvlcaXF2LiZ4gTcjXHDbjiBBbccdVsSjmkt68ddFnXjUYsscUXFbrg54lLcLXGzbjghL7ccFVvRjgktIGf9Fluz8Yu+WeXFTKzZ4tDWzXH7azjBM7WctVr5zqktUGedFqizkYtAWYXFnax54rzWbXEhazhh87WcVVoMzkktX2c9FhezMYt+WSXFXawZ4mDWDXHcazgBkLUc9Vrujukt3kfdFtuj0Ys6UcXFBqi54sLUrXFiajih5LUclVrIjoktjUd9FqmjcYv0UWXFeqhZ4rrUTXEuajhBtLUcNVrdjiktS0cdFoqjEYu1UQXEA/z54mF+7XG5PzjhHZ+c1U/4zsknaee9E5TzsYmH+aXEVfyZ4ox+jXENPziBQp+cdU+ZzmknsOddFxY2BwA='
    Else
    Local $Code='magAAIcA24PsHItEJCBmiQgIEUQoBIvvjt8H6EMQDgGDxBzCig6HySfWIWgcZNJvEAE3svY3iPFiUAnAhEFUFhsQaAwYK01OAA8I6BxXDSsj2/kPxhaJyyyZPzBXNBIQJDw5Ajo4ojNwChEsCNKF+fTuFkL2/M1CBsj/X4gSA1nkC/MrhCztkXxKbJwGIUwlBBvGgPIhgDHAw3RVCu1XVlNcMy5Qo1yjQMN0x6ybSBQPtrgkB4X/dFNH0tGOgQK+gXjyj2F4E4tMJMsdcIl8gBgB+esEORjqfiNcA4N9xebH5jLMCsMGwfaIZwajGMfG9412BXIN+A9+2dqegBAalAxAHyHHHYnQKcPB+ASF8A+EDv+GovbDAxJEkY14RTM5wtz6aPW/vjIITKHWGOmzFshABxA2MgO2FGZH0kPIdkbIFQI5wdokAxzg7RIEDnB2iQUHODtEBoOcHaJBB84O0SAI5wdokAlzg7RICjnB2iQLHODtEgwOcHaJDQc4O0QOg5wdovsHavYbEBo7DMZSwkX6AsRCqs9VSMiopUE8NAHoTdw2QvQYMf8CuAGTqgFbXl9dwyYd1VEkcniSQEZwf+YafpBI4XGVa8jVRMcIw0TFZVtnWUNORsXruFR+PiwUfORM3C/oVFaGi9AxihR0oYbF6XVRkC4F+oiQ8maXmIaZGPfGAyEPhTNj/kT2fonIFlirqJpScbSoPeszSKSdnwNk/yiF+weIMhIIDnB2gQwHOS0pGOZHKQp+HYspJc9xELcLgXS16dqU04teb7Wt5xshdNy2/dIOKLQ8iWASUCRUzrAyXS9YSWaORK2ctEPzFipNXLTA+OsGOWzGRn4naFETriOxUFGJJtEyCxIOXUpUEHB5TMC6d0AV+oHTG0FdIrzInFAgAozZO/CGJvo2XJEIQUyV6yzIfNypycICJYYYFB66PQOpVN22QkpkIDoECAWpBQYo6QyJmVWoLgfCMheIFimprwzynRjPIRHKVqc+5CMCSB' & _  
    'zPcMgDkSCe4ZEEcYz3DAWJKBnuGQadG1d2HAZ7R8gfB06weIPcSAhOsHiD3EgJTrB4g9xICk6weIPcSAtOsHiD3EgMTrB4g9xIDU6weIPcSA5OsHiD3FMkQh4S4JlHNyqZFlBCe0C2YJklT3EWkglhStj+CyE8epHncTQUR7FMFeQPJN59SRYEQtAhx5HFp+XAjFPbjxKvNNOVdkukBBNXwhTBTwdMi3RZokueIzFE+YjGzEtHPMTU/TJcJ8m4yOdlTxA65ylcZKQ3RCAxwQQCCIaRDOtEGBySAfLr6IuZHTq3F2XgMcKJFuQH+WVv5DMR9yHp6oYpASCYcx4KMcFUTqYzAiUc7Y19CRMygWgse2N+LSw/YIPRNM4YnOlGoTwsrLJ/wvH8pxAglKJTO4hCvkyM41r6TCTJCAZR/WIqGgw6dhnO+ieHJSG2QV2I2IWNRJOCxvSyP0LUTYm4X4Ue72HkSV9dQmxyTA4CiRwCAyQgCAS/wAWxnD201xvCc+xZZO76/AxyIAKWaaUOYbkfHA32E8RIIGQDJ1i4wyEEOsQohkIFSil/2lmC77LPhX2WiHvss4vfZZ6O+yyR99lnlL7LPZf2W5rNEiid8lgEbCV89T9ZBlOI+FSippLzmahPm1UYc9SS3FnEVEstC5MpiZfFChId258liLShS994539YuSrC+oiQPJtipTm5GAoQnQWyiDFZFMpYEQX+LMJWkfyniKjoTQgEiwwTVPFKBCPyHRzrJbKuZjD3LLQlAa6zstO1Ak0UN9KXuulsufH374k0R2ri50dnTOQUmks99FyyyxQZRLAVNEPCRrgwNP2BVWM7AmyLrCSIrr7unOqABx+8kISPtMiMhPfFD+N8ROvBJv0E4GRkRoXtEO4CgY0wd4P3Mt40MBSI0DjIDgWQQCIGQEgHiVACCCRYCAmQNCIKQDwLi8wIDJBMIg1AVA70VqFQXAMP6k7EMUssQaPrJ4sGrOhhs81Hn82h25/NdXDWhFV5kFUaHPPqi6j8MAazKCY1PTcCDU7W'
    $Code&='Jzi9Fb40RDiJBFIKQCQFMkgkBjJQJAcyWCQIMjQkCTI8JAoyRCQLMkwkDDfIkA3IXJAOyCy+xIT0kLZRpST5dJKlNNGNiU8DGaUoMvQQG/9IgCZsVWu0rSCQ/qRwcJGESARtxFYIlzjSTf/mxGQsJziQ/DTrIJAmkk6w7acpQHRUg+mRCr+LBCsxwxuvftSh2xVoRHucSBKROA8MAe+UtbQ8sZ5CAoF0lOlOWbI3MklOgxyLdDODfM1sQKbCD4h1NwDB/gSF9nQ9gwLuATHb6wpLrCIdL9KVBQdUHQXWBB8Xx41ILVkQOQKGdNe4SBwO5huHaZI8JqPLvDK9RdrBeA8D8BNfwfpjqPGESNIYd4mD6uqNljSSlYlhRus+6kaYH3NDyA8COcQDg5xIBDnEBYOcSAY5xAeDnEgIOcQJg5xICjnEC4OcSAw5xA2DnEgOOcXqCJMW0hbiiYtoiNaNhTXEA5jfhFSuSLuQnhyLRSS1usN7hvkJZ4dYAiRcH5IsYYRmDXODJRwkKTCMgzyZNXOy/yHSdH5c+etMORoTMQNdFVBDmwycCAw51p6hdEVbmqHMDAoFdJDpZWSbjh6sZ0cMtsoyFIm6EKSXDNK5CFITyusY/zsyXhJOg71WDEv5CTe9kSszR9wzXQSxTQjkVQwagf+gJYRTdpZBGEPAEL4BiOCFdAq4XtDE6cELjbUR8ot1hZp9DMEYr5jpVxjoUYOdNK/OGO7OtNwbBHvS74QKDCDqX1Yo6DohIDyudux2vIxQ6woIhB7oiyyfwc0QJRiPxgnYTOqp3BQzrJ4njd4VCEjaPYucUjEe1TOUlh6P0E8cQ8HoEJvpIGnR+VggvIEMDF6gnbSCi6qXkRvUvXZQG185iegl8YgVyisGIdbQe4KP4mSCP3DegY34pYGP4o6BP3EIHqHPgB/EuIB+4TKAG/H5fx/E4n9+4Vx/G/IjFU8x+8SGfm/ETX5/ETZ++4SwfW/Pd3H8YEd97hHafL8RoXz8ikd87iM' & _  
    'E1CPLe/viez9wLnuN+PV6j+Leej9wWHqN+R8Kogg/eIJ5jfhJeY/iMnk/cKx4jfhiaI/iS2g/cMVnh8jSWl5DRwInWp6ncgiAegwxwL4CEhCxN+opUvuA88QUCsPrEpAB+vFMVheNdhDfT4iWec4KxDIMfMCMI+BWkO+y6BEICjnJxyHtZOwiDBHrCUE2geMjcj3DoulAx4aMesX16jDJiyOEjgfLMwSsDM7toCAkqq2Zps4kXlbjCI+kMW/KdlQxjc9WDBTLqY47CLyoTF6JTetPuRzeAoVQ61WH3ojVgVWn5aHeViFdVfb+VY/kDT/xo1QPoX9UD7FGVBrZmzIUUOXe/oTFUz6EoVM+xGhTehBUU/+TaHjeQlK8w0NS7IpHUvFzUnZWv3Cl3tDlUYfYrFGP4pVRNfgiUYV5Bw/hzlAfxLdQa/FEUArxKVAPsfBPH8TZT2vxZk8K8UtPD7ISFUL7TjX4iE6FeG1Oh9g0To/kHW6hqk0K97RNPsRWTX8RP02vxMxMK8SxTD7EeEx/EWFMr8TuSyvE00s+xIk7fxFyO/xepd9srDOEKayH5W9Qso8W9Q3aNoXeWOQ6jS8Wv0VsuRTB2o/eMF47wFvUYapSmamtYJ56A8Hnxw9KAnDhEAnPyhIKBT8yARwIA4k4HhZyB9TmICEGGc4TBFIGBY8h54lw7BhafAtQ4yIKhETLCKsG3R8iz4lY0D9q/ELlIQ4Z6SEMQQZSDf3ih0TRiUjhUOhePkTwOFgP7WlMcc0DqonNweIYj9odvAkQMe8opAuQCEEYQWnl/8NEAhMYiXiURv6LPRQ289weZNmiHAgNQngEiFJNfxAgiCREKCIsAsB9EQgbojARNAg4hEA8c4ZGDOhAhEJEIUgQTCEmkRC6IVAQVJxhEFx2QnwjFHRCYCFkEGiIbBCMyBjdEHCIdE9wiHwQP8gc163Ly4ahKLCECMWmmIgbCKy7jGIRsuZ7ESAbopA5lB3GOZwMjYZDJLwUgcoC1wSgcqQ5qAjLyBCsh8eA8AoB'
    $Code&='RcZFCqC4FwzzOIkM/m7pqWaE2uUszYTrCn4giShAeueFkM/doUmF+3iS2nIE5izOhu0KTfx+i/xiDhRDDCMNE1ygClhkDE0TYhIUhAZWESYgBEQQF4xCFjLZIRSCBlIV7ib9ATh6Eigk3cL5diAsmonLJMHrWR4cO3iB3QLZpAsIEBhcj1NZQBMYiWgzXX6EoiIvm8rzoc9KM4KjhibxUM95iGgEid1PZeIwETQIOI0QPOJAEUQCahkIG6JIEUwIUI0QVOTK1CoFZUYM6GCEQmR7jRBs4nARdAGgeAgQjdF4CHyJsGKpQmjLmBKxOmtvt5UvcSMUXliot9NIv5TlmGx3nI2RoMikYrh3ERgbpxjDPCQj9Ky4w4WYtBIMx6DG30DjCPnI6LxkRDWE+/hfTZIo7SWxUTUPj1XJ/eB+geG7UxCKjNX8wIv2+IT4R8QiyPDeyxDMl1aQwMKDxAznWZEUIihALHKB5gshzjrClgsWMKR5B2IGOstZtClgemieM1UOHCRrWJVcLBBEDCdmDSzUSpMtTEFuSHRceoHnCyHPu0KWVsYqWEBnFKkGFXJ+iAwRFCMbFRomn2GXGTzKGIkfGB6FEByHUh304g3TRDh5EZR1JjAjns/MgnEXNBKKidkUkqg8DHZAyc6By1ILCA0wTqpAExiKw5qq9UTqoibCll2NKwflKPHp7pvt7B6ltExCCHyWklJTpc+RJXjyP0wME26n0Bo0Mw4IxwQ9izgx66mUYQB0EXAEEu+MqrbdmVLA7g+26473pTC+AMYmcEC3UgSuiERSwZrpPJlGqrxQjRBU4lgRXAI8GQgbomA0QmSeoRFsryNwRHQ4eIRAfJJCcyMMXrkEoa3EqKIERrB8lAJE6WRrtpOJrw+5JagoALxb9PK9Qb/eeb2I0HKKcBDC3RGg8qQe+xysjfGwHyO0ZLhyvBkODBSN0cAfIcTkyHLMHICNz8Fv77pOut43pN0qzqQLGBAYZLrnNBATxMjQiDN8MhTUMQg' & _  
    'C2CIx+4S63DFUcQgYhRXfXZl+/pQm+2je5ZZiQTyZ3feO4EhRBIHkF6lpaugtSonsReTE4HIUG8DsCIu9SZlE0RA/1wvw+CB0TcQLfwwPEEgnABh1G+suPZEbHJBPdCU8L2Ofuyy6gJAQB7jcHxfrDalM/WuAZJvx/+P5GlgOZET1DIUIr/ky6ghbVREgIjRAOFqB4wsgy3UyQPNygeYHmcaIlT+Mr2p42TUtPLll8SEIXgboTv9qiACIUqgpc4xCDogMSVOat1L5lK4J9ei0a/bRRAyizY8zabICr6VvKxOWUPw+NBKywc4PnfEbGcruQaHmDQIVGBsQNt4zMxQJDNUkr6msJMvHGoADgNAHjRxb5jRQ2xF/zwMBU8MX3kSGHe6ANHaB9jEOIVASHf9J8f6iOgxk9pn9xMVIKe0ObG0bCMSD9+47R90szS1qehP1Ut3l9aQZzLS24qlJVUUf2tEWpQVmCCqQ7AS7nqqojZB8QxzfIVJk+FaYjyEM9EA83qWDn/4U95uzz0Lcj+WCHP3icUIQyV3+My9ZESbeTW7s7g4QqMOwnLYvaSuuB1nraxr4Q4OyigIibV7r6KITGNhdz/GnGT5fgxXUieZlFOqu9do8GYfpAQxJQtDJiBGkb1MrmXOBzUS1Sx3tYc/rS/Yt+xEb61stNjMrTtbiVpAm9w2yybCn0xOlhvdlLz7ZNajVkwlkqGT5REzp+dokiDIMDQfyWfkm3+SMmAUcjkA0zoO0RB1s9x9F2j1i26XlomSlcwUU1dkJ2k0FucDzpdyfyxTZHfI8BNmLIlBDz5lt6OJNIRIt7wI8fwX/Mv35wvSk2M2Y1u6CRFlb3lgK/EhwuhRTBNpB8vPdH8d9bwcreKUgCDfutXxI6xQX98poOzNdcxEyaxdYDDJ0FDnzF8hUgRUMt9yZaZWcaLp4LP+ZrekqmPh6yixlTOYzL9pS3kq/hRbr9fHOiOuWaZBC34laeDKB/RUnljvzIpVfF1Y4XJqASWqJSD2HNVw89l482WsZ72Cg'
    $Code&='Fc3riQ1jMfzdpd2W9RZpPTFEMwrp7i3ZM6YrpGTPkhbxZExd+SmP2YjNLwTZUIzQ7oxCVIhYcVxjwNI4u2JPaXSs1MCPu3yFy/RgJG1u3RPxKpos85N52TLUot/nfablcfEqIkX5ti28bbROjbdCss5st0bLIM/E/HhAms4hRERIOEyJHArEe2giGBkcD3yHRBQ3aP9EMGg0hRA44jzMnq/OiJRnRBwyFB75Dp6hu1yF+lLO+yT+G2JwIKXVBGfp+FEoDiIsRwx8gc0HaIirZohoIGQMcs3RIaPpyBUyDOniGpXMPM5qy9SPjhiJ/hfMMsL346DEU5nSLNGaEg2xG74vTmjTaKITSb0UCfUYM7p9t2pyVsAI1GWecKdE5EY0yN5z3CsHifIx2iTRiCkzm74UGAx4l4wU0EjPvFB2o7qwg8QgnRxkRDBEiUgf14mkjx5aB+vjxQ8Qy92hS5kNmH29S99v0yJomPran5XPb/lSzBk/ftJ/m7biHMlpBRA9X70sTrPf4vtlGShMlHF0NTHrSifZhc2joCTd7cUI+Ql3nlvnzVTPNKk3To4FlqJdgsqJ0dMK5dFqq98U06n8iaGl1Uqn8rQpAn5WY3Y+x96yOl8QmYlM04LeI57a/fuMQ9PImaWR6QjR82dm0+ViNmitM/xbOzU+i1ok2zLR9TEEGd7xN1G4P2LiM2SM0AmbuBiN0RgbiBhrYtIcnNAbna2iIJ5GvCIYRRTSFxEUuiMUcRQOoiAEoGIUJAxdIXEMG6IMNxAM6mlCedcs7eUQie8LnogQ3REQuBCORiifYXkEOzFpM1SSndPfcyPTXErW2j7I1WUsKJIoi+xeI+QoEuNFTKI11tzwu7GGQJlnQl+TKNjfhcXfvCWXzWnaldEW+5oQsv4kLDoiLHjft5EnfJJF96WymxyLGUoq2BTf6s2C3Mdp81Em3TpFrwkN7ywCBLh+W8QUXTItIC6QI5gRDHSJHBdIEZyIELpEBIukqmO16iIhKOkChE0' & _  
    '/ECwgze0RKF5+dUIoP92FxN0y61aoXJyD9ZAs6Cy0zU7XpGjfkPiC1btDSRYP1EmXLByIkz/ori/LiORYCJiMk0JEXFAEElhwLT/+KAQJWHQWPL2UlUl4OX2KDwSpfJd1ifJcXoHpPXWRbB39iaNXt8tpYkNp4e8h8zdPaRY6cWRUkXVieGBZT+kWciV4ZDrERW+JeGhOOZFsYnhs5a4kaVpXhAXay2Z9TFRjvMVfW93bJ2OyfCPvibQr7GhNWGCoWPMyXeJAFxBEuEiNEEy8lUtat0RIXfriMB8QNLg4hcQ8LiMgTxC8aEpZt1BIXe+l7AMtKGvOV2Ymf0ssiLLzkSC+pxCaS+XnJA0pErunGCuSs9XrHCdLCAQAWKs13QkB/gERuYnXbyftiET9CvoLkAh1SOoSIeKKPJGRSIESOL2WKgT0JFgIim785VnD+TAPIkDlEljeblZrCgruX/0z/RKY4KJj6BCB5AuyDAToLkqi1qT58CXsRWLRBA6IBPRMzgOz3uLzVGJxBD95AM5hMPulRuTlWc1AJN9zafuvkM5ehWzpx0qyWawYp6NEGG6IGNRGGLLUMlW/1hQUo+gUjdEUGogU1kbYSuNT0iMLHEoM51MJ0YnKiPpVkOoUFFKAKNIRi3TVx13F0yqdIdbT4sudm4qJ1ZnR2t3KAtc53BS8DsTGVK2Qj91vtNCS8xKtKieQqHTxG6IcNxAc18U2t4kiCPsXiVFXWcAYHL659W81nqfoXnQwI6jEEhCn9atCnq14xSXITvVtHFwGCpyaJDWbwjQktZoKLCSZdRA8To2UBIGVeYnQ306uIpWyCWvkbTA4otv083ppHDyo+YkoiXztiFJeNvUh0eQEdKjBuLCdPzlRLAp6lbPNzH2JQqi00zn1FTSep9henTJ1VTc7WThKkiI0+xeI+TQ7NWnHQtTOypZbCCuaCWpPc/2uReTfLkrX/ahu0LrIOHRBOD3Aa+JEa/0uNP7rzdX2qRlxAOlZ0SXb6xIc47+IMLpApJc265WxxagX'
    $Code&='pevZPZEtPHSfRg6alZVO01gIyJUfTLauXjpE5W8ZIQRRBB3iPk44jhqILLpCtL0wiZh+VmnjvyIpNMkIuFzuxQTod6g0S03d9K1h53c+QuWxfg2T26Lp1uD7zPbjqfHrPEbpEs4geeH6RiZGgLKEHZCIgukzDGcjkYxBpkoHSSIa2TMSalF9lF7rMh2kvPTqxDQkqDOttChKTsE4y920C3ksuQql0UZYaHCVtGC4S7lPCWh0WWBLK8AYxGh4lztyLic0RWRo6Moy/4EEV5wMQLomQ0uJBGzyePvSGbkM8t5VnDxb8nxU8o9E1bo6+FA775kOcN0zRHTW9O6MW/d1Vos0E3hgOwsTeGQrCCd40J+RAm+pbBj/6DFwRuFyJpIeBGHk3y5Pzje9ZiGzPLXeIE/JN/IXi3hQnRqLeFSVF494WOnrlgexGEd42agHsiXER0OyILonIUlupNZXqYbSZSyqeYhjE9LiS78hONE4YxkjIM0jLSSeI+kCGWhA8ZXsRzC8EUJoRHRpUtCCtIZJ/GIZ2Rs8F0gXTGoYkvNMq1YBsyy1zhmiMB8QNLg4hcQ8ENEn3pxbQKoPT0edhiMSiN90St+JPxSl4l++j3j3Kyc+eF0jt/53dx+ULKyRtJIC8XUMIgz1nU4BdYmUCNsnuvNRCt7nAvWW53z9Su+j+JGFXAKpCZom0F4yv/Vk66ThXv3dIPKTxidI/lIdfu7QPfCWqKJ1nyx/DhSLxBDOLnwbZwj4J2Q9sMbIMzQRHErHlfVF7nJb7xLHDif6RE7zthIk9+txNALOCN0SMLKpEnAEshJ3nelcSOJ/nxeRQKhShP0ILImQggN1HOsvf7IbfxUcbqjU0AXfjQhW7M8bTFBpjF7154MQMxJSGwkiCWpE1TCJNhKlJDhIv5FAIqNEnoGJ8xLXJPtIfJHjIjlEgpuJLxL/JIdINJGOIkNERMSJ3hLpJMtIVJF7IpREMqaJwhIjJD1I7pFMIpVEC0KJ+hLDJE5ICJEuIqF' & _  
    'EZiiJ2RIkJLJIdpFbIqJESW2JixLRJCVIcpH4IvZEZIaJaBKYJBZI1JGkIlxEzF2JZRK2JJJIbJFwIkhEUP2J7RK5JNpIXpEVIkZEV6eJjRKdJIRIkJHYJqsp6eqP8tNk0wkKSPeR5CJYRAW4ibMSRSQGSNCRLCIeRI/KiT8SDyQCSMGRryK9RAMBiRMSiiRrSDqRkSIRREFPiWcS3CTqSJeR8iLPRM7wibQS5iRzSJaRrCJ0RCLnia0SNSSFSOKR+SI3ROgciXUS3yRuSEeR8SIaRHEdiSkSxSSJSG+RtyJiRA6qiRgSviQbSPyRViI+REvGidISeSQgSJqR2yLARP54ic0SWiT0SB+R3SKoRDOIiQcSxyQxSLGREiIQRFkniYAS7CRfSGCRUSJ/RKkZibUSSiQNSC2R5SJ6RJ+TickSnCTvSKCR4CI7RE2uiSoS9SSwSMiR6yK7RDyDiVMSmSRhSBeRKyIERH66iXcS1iQmSOGRaSIURGNViSESDCR9VmoBqqhel74RAFH0p1B+QWVTABoXpMM6J16WADura8sfnUXxHqz6WIBL4wOTIDDyVQOtdm32iMyokfUCAEwlT+XX/MUqdcsAJjVEgLVio48A3rFaSSW6G2cAReoOmF3+wOEAwy91AoFM8BIAjUaXo2vT+cYAA49f5xWSnJUOv21666BSWdrUvgCDLVh0IdNJ4ABpKY7JyER1wh6JavRAeXiZWD5rACe5cd2+4U+2APCIrRfJIKxmAH3OOrRj30oYAOUaMYKXUTNgAGJTf0WxZHfgALtrroT+gaAcAPkIK5RwSGhYD49F/Rkg3myHUnsA+Lerc9MjcksAAuLjH49XZlX8KgCy6ygHL7XCAwCGxXua0zcIpX8wDofyI7/gsgIDaroA7RaCXIrPHCsAp3m0kvMH8vAATmnioWXa9M0ABgW+1dE0Yh8OxKb+iuAuU52i8x5VoAWA4TKk9ut1AAuD7DlAYO+qAF5xnwa9bhBRAz4hivmW3ds9n5AFrk3mAL1GkVSNtXHE'
    $Code&='fV0ABAbUb2BQFf8AGZj7JNa96ZcAiUBDzGfZnncfsOhCnwdAi4jnGVs4AHnI7tuhfApH5kICD+n4hB7JEAmAA4aDMivtSPARcKwAbFpyTv0O//sAD4U4Vj2u1R4HNi05JwrQ2WRoXACmIZtbVNEkNgAuOgwKZ7GTVwDnD7TultIbmwCRnoDAxU9h3AAgolp3S2kcEgAaFuKTugrAoAMq5Twi4EP4GxcdAA4JDQvyi8etAC22qLkUHqnIAFfxGYWvdQdMAO6Z3bujf2D9APcBJp9ccvW8AERmO8Vb+340AItDKXbLI8bcALbt/Gi45PFjPdcxncpCgIUQE5ciQA+ExhEgQEokfdK7Bz34rvky0McpoW0AHZ4vS9yyMPMADYZS7HfB49AAK7MWbKlwuZkAEZRI+kfpZCIAqPyMxKDwPxoPVn0s2KAzkO+HSQBOx9k40cGMygCi/pjUCzam9QCBz6V63ijatwCOJj+tv6QsOgCd5FB4kg1qXwDMm1R+RmL2jQATwpDYuOguOZjCAILDr/WfXYC+AGnQk3xv1S2pAM8lErPIrJk7ABAYfafonGNuetsDu3vNJngJyFkY9APsmrcBg0+oqOaV/GU7qv8AfiG8zwjvFX/oALrnm9lKbzbOAOqfCdQpsHzWATGksq8qPyPcxqUAlDA1ombAdE4AvDf8gsqm4JAA0LAzp9gV8QQAmEpB7Nr3f80AUA4XkfYvdk0H1o1D77BjzKrIVOSWAATfntG140xqAIgbwSwfuEZlAFF/nV7qBAGMADVd+od0c/sLAEEus2cdWpLbANJS6RBWM23WAEcTmtdhjDehAQx6WfgUjuv4PIkAzqkn7rdhyTUA4Rzl7XpHsTwAnNLfWVXycz8OGBTOecDHN79T9wDN6l/9qlvfPQBvFHhE24bKrwDzgbloxD44JAA0LMKjQF8WHQDDcrziJQwoPABJi/8NlUE5qB8BcQiAs97YtOScAGRWwZB7y4RhFtUytgA3bFx00LgXV0JQSAF' & _  
    'TkcMilkTL8Yu0SJORVSL2RJElifwXGJGAIo9ESWeJmBLhJAJIEpGjIsZE55WJ6xLaJC1I05EpIkREaniJaxLdJLZIF5FmIrREGIKJYBJFJOBIhJEcIpREWBmJhxK3JCNI4pFXIipEBwOJmhKlJPJIspG6IlxEK5KJ8BKhJM1I1ZEfIopEnaCJMhJ1JDlIqpEGIlFE+T2JrhJGJLVeYkRv/4kkEpckzEh3vUSIiTgS2yRHSOmRyXCJgxJIJKxITpH7Ilb/EickZEghkdEiOkSxD4nSEp4kT0iikWkiFkQK5YlDEh0kC0itkbkiyESFTIm7Ev0kn0i8kcUiNER23IloEmMkykgQkUAiIER9+IvMSG2RSyLzROzQiWwSmST6SCKRxCIaRNjviccSwST+SDaRzyIoRCakieQSDSSbSGKRwiLoRF71ib4SfCSpSLOROyKnRG57iQkS9CQBSKiRZSJ+RQjuJNlIzpHUItZFr84kMEjAkTcipkSwFYlKEvckDkgvkY1yiVQS3yTjSBuRuCJ/RARdiXMSLiRaSFKRMyITRIx6iY4SiSTuSDWR7X2JWRI/JHlIv5HqIlv9EoYkgUg+kSwiX0RyDImLEkEkcUjekZwikERhcIl0EkIkp0hlkaQiXkRrRYlYEgMusSJt4xJMJNdIy5FEIqNEWhuJDhLAJHVI8JGXIvlEX5yJehJZJINIIZFpIshEiXmJPhJxJE9IrZGsIjpESjGJMxJ/JHdIrpGgIitEaP2JbBL4JNNIApGPeokoEsIke0gIkYd3iWoSgiQcSLSR8iLiRPS+iWIS/iRTSFWR4SLrROzviZ8SECSKXuJFBfokjUhdkdQiFUT76YlDEp4kQkiLkVsi7kQKD4keFwiRhiLtRHByif8SOCTVSDmR2SKmRFQuiWcS5ySWSJGRxSIgREsaiboSKiTgSBeRDSLHRKipiRkSByTdSGCRJiL1RDt+iSkSxiT8SPG9xIWJIhIRJCRIPZEyIqFELzCJUhLjJBZIuZFIImREjD+JLBKQJE5I'
    $Code&='0ZGiIgtEgd6JjhK/JJ1IkpHMIkZEE7iJ9xKvJIBIk5EtIhJEmX2JYxK7JHhfYkW3xi9RconPEugkm0g2kQkifESyI4mUEmYkvEjKkdAi2ESY2olQEvYk1kiwusQEibUSiCQfSFGR6iI1RHRBiR0S0iRWSEeRYSIMRBQ8iScSySTlSLGR3yJzRM43ic0SqiRvSNuR8yLERDRAicMSJSRJSJWRASKzROTBiYQStiRcSFeR9CJBRBcniasSnST6SOORMCJ2RMwCieUSKiQ1SGKRsSK6ROr+iS8STCRGSNORjyKSRG1Sib4SdCTgSMmRwnWJWBK5JOFIiJEgIs5E3xqJURJTJGRIa5GBIghESEWJ3hJ7JHNIS5EfIlVE67WJxRI3L/Eiv0QDFonPEnkkB0hpkdoiBUQ0pokuEvMvUSL2RINgiXESbiQhSN26xOaJVBLEJAZIUJGYIr1EQNmJ6BeYkRkiyER8QomEFwiRgCIrRBFaiQ4ShSSuSC28xFyJWxfYvsRXie4SmyTASNyRdyISRJOgiSISGyQJSIuRtiIeRPF1iZkSfyQBSHKRZiL7REMjie0S5CQxXaJEl8aJShK7JPlIKZGeIrJEhsGJsxJwJJRI6ZH8IvBEfTOJSRI4JMpI1JH1InpEt62JOhJ4JF9IfpGNIthEOcOJXRLQJNVIJZGsIhhFnOokJkhZkZoiT0SV/4m8EhUk50hvkZ8isESkP4mlEqIkTkiCkZAip0QE7InNEpEkTUjvkaoilkTRaoksEmUkXkiMkYciC0Rn24kQEtYk10ihkfh+iakSYSQcSEeR0iLyRBTHifcS/SQ9SESRryJoRCSjiR0S4iQ8SA2RqH6JtBJWJMtIMpFsIriXFRETY+bjJ3fMp07y2DdvnTGjMDtiU2deh8T+/RuJq/N7E8r2FyfJ7HBO+phHR52xS60+YmOidqfEnPlviXLTsxO35lMlk+zPTjbY3/efMY80P2Kr5XZHxHH5T4kx83cTBKbLJyPsM04Y2LM' & _  
    'FnbEbBzpi34B2q8Tr6eOJstunEwmmcycsbKNOG9i3Wp0xu1Ic1p8xlylqYg8vfN/EU/1rnCfsF04g2LOxn7GXampiB77UQ8RK/e+JWPNzE9C2Jy2qTG9OQ9gnM58xX0UcAp2xg1A7YiefdtPFUam7iUD7HxOS9nsnOGxjT7zYy9qdsRcQamK783xHxM3tK4kT2fPFl6nLixdTzxOntnstPUxDT12YB3OfMR+BP2JX3H4jxCr994uIUxcT7vbXLRRsG1pemOvbnzEbMj9ipwrUw8UGqd+LXFsrE9P2gydi7MtalZgzeZ+xj8g/Yn9t1HvF1a07i6lTvxNW9gst6kzbT3qYhwifMU94a2IrLn6/xaapA4nG+9MT3fb/Jx/sg1q92GOKtbEbPj9iE2bWJ8UDrW+JDvPDFjW2Gy25bH9awZgHnp8xv/hrYo8RfMvF2blTi5RzbxYe5mst6UyjW1WYB9+1sU+hamJLDdzPxea5R4toU/MTmfanJw/sc09U2G8Wis0BVVUlxRFDxmOIpfh84oQ47neOmfZ7I43/8ogN1mvivTjeb46xkcUjVGAwiFACAeIDOM5njqlWKyN95/6IGbXX4mI4TauO5ux2I5qPyohFH4LinTiJyY5A+n0nh+9ewxWyWYjrjkfiyTj78I4LQa0j7LPUiGdfouL9OEWvjuojnCO/U6SI9+Ry4pY4m8COW3W3I8Lh/YgcPZPirjhMJo5qbDYjWn4/iEH19+ICOIPMjk9oNCNcUaWI9NHl4+j58eIIOOJxjpOr2CNzYjGIUyoV4j84CASODJXHI1JGI4hlncPiXjgwGI4oN5YjoQoFiA8vmuK1OA4HjgkkEiM2G4CIm9/i4j04zeuOJk4nI2l/so+z6nWInxIJ4hs4HYOOnlgsI3Q0Gosuf1IcLdxuR7K0WhHuW6DE+6RxUhz2djtHTbfWEWF9s8XO/SnEe91x4xw+Xi9HcROEEZemU8T1uXHRkXko5nHtHCxAIEdg4/wRH3mxxMi2cVsc7dRqR76NyxNGZ7dx'
    $Code&='2XI5xEuUcUoc3phMR9SwWBHohc/H8bvQxGvFce8cKk+qR+Xt+xEWhkPH+ZpNxNdmcTMcVRGFR5SKRRHP6fnEEARxAhwG/n9HgaBQEfB4PMREJXGfHLpLqEfjolER812jxP6AcUAcwAWPR4o/khGtIZ3EvHBxOBxI8fVPBGNex993thHBr9rEdUJxIf4gcRAcMOX/Rxr98xEOv9LEbYFxzRxMGAxHFCYTETXD7MQvvnFfeeFxlxyiiERHzC4XETmTxMRXVXGnHPL8fkeCej0RR8hkxKy6cV0c5zIZRyvmcxGVwGDFoO2BxJiecU8c0aPcR39EIhFmVCrEfjtxkByrC4hHg4xGEcrH7sQpa3G4HNMoFEc8p94RebxexOIWcQscHa3bXHbc4Ec7ZDIRVnQ6xE4UcQocHpJJR9sMBh9HSCQRbLhcxOSfccIcXb3TR25DrBHvxGLEpjlxkRyoMZVHpNPkETfyecSL1VHni9XIxENu/fxZ2nFtHLcBjUeMsdURZJxOxNJJcakc4NhsR7SsVhH68/TEB89x6hwlymVer9x6Zp8crkfpEAgRGG+6xdUhUcSISnEl9lxxLhxyOBxHJFemEfFztMTHl3HGHFHL6Ecjod0XfHd0EZw+H8QhlnFL/GFxvRzcDYtHhg+KEYXgcMSQfHE+HEJxtUfEzGYXqtdIEdgGA8QF93H2HAEcDkcSwmERo2o1xF+ucVcc+Wm5R9AXhhGRmcHEWDpxHZiGcZ4cudnhRzjr+BETK5jEsyJxERwz0mlHu6nZEXAHjsWJ9ZTEpy1xmxy2PB5HIhWHEZLJ6cUg3c7ESapxVRz/UChHeKXfEXoDjMSPWXGhHPgJiUeAGg0RF2W/xNrXceYcMYRCR8bQaBG4gkHEwylxmRywWi1Hdx4PExF717HLqFTE/G1xuxzWLBZLOqWkAYRImZGNIg1EvbGJVBJQJANIqZF9IhlEYuaJmhJFJJ1IQJGHIhVF6/okC0jskWci/UTqv4n3EpYkW0jCkRw' & _  
    'irkRqWolBEgIkT0hckfR2iQgSkyRzSFORPyIMRFJliV4SKCShSA+RtSIJRDabiT0SJiRpXeJEnxuJnhJ0JC5ILZGyIu5E+/aJTRJhJM5Ie5E+InFEl/WJaBcIkSwiYEQfyIv0SL6RRiLZREveidQS6C9RImtEKuWJFhe4kdciVUSUz4kQEgYkgUjwkUQiukTj84n+EsAkikitkbwiSEQE34nBEnUvcSIwRBoOiW0STCQUSDWRLyLhRKLMiTkSVyTySIKRRyKsROcriZUSoCSYSNGRfyJmRH6riYMSyiQpSNORPCJ5ROIdiXYSOyRWSE6RHn+LtEhskeQiXURu74mmEqgkpEg3kYsiMkRDWYm3EowkZEjSkeAitET6B4klEq8kjkjpkRgi1UWI3iRySCSR8SLHRFEjiXwSnCQhXqJE3IaJhRKQJEJIxJGqIthEBQGJEhKjJF9I+ZHQIpFEWCeL9Eg4kRMis0Qzu4lwEokkp0i2kSIikkQgSYn/EngkekiPkfgigEQX2okxEsYkuEjDkbAid0QRy4n8EtYkOkhjkXwid0R78olrEm8kxUgwkQEiZ0Qr/onXEqskdkjKkYIiyUV9yiRZSEeR8CKtRNSiia8SnCSkSHKRwCK3RP2TiSYSNiQ/SPeRzCI0RKXlifEScSTYSDGRFSIERMcjicMSGCSWSAWRmiIHRBKAieIS6yQnSLKRdSIJRIMsiRoX+JFuIlpEoFKJOxLWJLNIKZHjIi9EhFOJ0RcIke0iIET8sYlbEmoky13iRDlKiUwSWCTPSNCR7yKqRPtDiU0SMySFSEWR+SICRH9QiTwSnySoSFGRoyJARI+SiZ0SOCT1XuJEttqJIRIQJP9I85HSIs1EDBOJ7BJfJJdIRJEXIsREp36JPRJkJF1IGZFzImBEgU+J3BIiJCpIkJGIIkZE7riJFBLeJF5IC5HbIuBEMjqJChJJJAZIJJFcIsJE06yJYhKRJJVI5JF5IudFyP4kbUiNkdUiTkSpbIlWEvQk6khlkXoirkQIuol4'
    $Code&='EiUkLkgckaYitETG6IndEnQkH0hLkb0ii0SKcIk+ErUkZkhIkQMi9kQOYYk1ElckuUiGkcEiHUSe4Yn4EpgkEUhpkdkijkSUm4keEock6UjOkVUiKETfjImhEokkDUi/keYiQkRoQYmZEi0kD17iRFS7iRYSYyR8SHeReyLyRGtvicUSMCQBSGeRKyL+RNeriXYSyiSCSMmRfXGJWRJHJPBIrZHUIqJEr5yJpBJyJMBIt5H9IpNEJjaJPxL3JMxINJGlIuVE8XGJ2BIxJBVIBJHHIiNEwxiJlhIFJJpIB5ESIoBE4uuJJxKyJHVICZGDIixFGvokbkhakaAiUkQ71omzEikk40gvkYQiU0XRYwBZASIgRPyxiVsSaiTLXaJEOUqJTBJYJM9I0JHvIqpE+0OJTRIzJIVIRZH5IgJEf1CJPBKfJKhIUZGjIkBEj5KJnRI4JPVeokS22okhEhAk/0jzkdIizUQME4nsEl8kl0hEkRcixESnfok9EmQkXUgZkXMiYESBT4ncEiIkKkiQkYgiRkTuuIkUEt4kXkgLkdsi4EQyOokKEkkkBkgkkVwiwkTTrIliEpEklUjkkXki50XI+iRtSI2R1SJORKlsiVYS9CTqSGWReiKuRAi6iXgSJSQuSByRpiK0RMboid0SdCQfSEuRvSKLRIpwiT4StSRmSEiRAyL2RA5hiTUSVyS5SIaRwSIdRJ7hifgSmCQRSGmR2SKORJSbiR4ShyTpSM6RVSIoRN+MiaESiSQNSL+R5iJCRGhBiZkSLSQPXqJEVLuJFhBew1KXmBHRWovVvCCqqtZLB0A54wJnTyYIJ+Qg3FeAsxecNisBUFjDwAA='
    EndIf
    Local $Opcode=String(_AES_CodeDecompress($Code))
    $_AES_EncryptOffset=(StringInStr($Opcode,"87DB")- 3 )/ 2
    $_AES_DecryptOffset=(StringInStr($Opcode,"87C9")- 3 )/ 2
    $_AES_EncryptKeyOffset=(StringInStr($Opcode,"87D2")- 3 )/ 2
    $_AES_DecryptKeyOffset=(StringInStr($Opcode,"87F6")- 3 )/ 2
    $_AES_EncryptECBOffset=(StringInStr($Opcode,"09C0")- 3 )/ 2
    $_AES_DecryptECBOffset=(StringInStr($Opcode,"09DB")- 3 )/ 2
    $_AES_EncryptCBCOffset=(StringInStr($Opcode,"09C9")- 3 )/ 2
    $_AES_DecryptCBCOffset=(StringInStr($Opcode,"09D2")- 3 )/ 2
    $_AES_EncryptCFBOffset=(StringInStr($Opcode,"09F6")- 3 )/ 2
    $_AES_DecryptCFBOffset=(StringInStr($Opcode,"09FF")- 3 )/ 2
    $_AES_CryptOFBOffset=(StringInStr($Opcode,"09E4")- 3 )/ 2
    $_AES_ModeResetOffset=(StringInStr($Opcode,"09ED")- 3 )/ 2
    $Opcode=Binary($Opcode)
    $_AES_CodeBufferMemory=_MemVirtualAlloc( 0 ,BinaryLen($Opcode),$MEM_COMMIT,$PAGE_EXECUTE_READWRITE)
    $_AES_CodeBuffer=DllStructCreate("byte["&BinaryLen($Opcode)&"]",$_AES_CodeBufferMemory)
    DllStructSetData($_AES_CodeBuffer, 1 ,$Opcode)
    OnAutoItExitRegister("_AES_Exit")
    EndIf
EndFunc

Func _AesPrepareKey($Key)
    $Key=Binary($Key)
    Switch BinaryLen($Key)
    Case 0 To 16
    Local $KeyLen= 16
    Case 17 To 24
    Local $KeyLen= 24
    Case Else
    Local $KeyLen= 32
    EndSwitch
    Local $KeyBuffer=DllStructCreate("byte["&$KeyLen&"]")
    DllStructSetData($KeyBuffer, 1 ,$Key)
    Return DllStructGetData($KeyBuffer, 1 )
EndFunc

Func _AesEncryptKey($Key)
    If Not IsDllStruct($_AES_CodeBuffer)  Then _AES_Startup()
    $Key=_AesPrepareKey($Key)
    Local $AesCtx=DllStructCreate("byte[244]")
    Local $AesKey=DllStructCreate("byte["&BinaryLen($Key)&"]")
    DllStructSetData($AesKey, 1 ,$Key)
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_EncryptKeyOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($AesKey),"uint",BinaryLen($Key)* 8 ,"int", 0 )
    Return $AesCtx
EndFunc

Func _AesDecryptKey($Key)
    If Not IsDllStruct($_AES_CodeBuffer)  Then _AES_Startup()
    $Key=_AesPrepareKey($Key)
    Local $AesCtx=DllStructCreate("byte[244]")
    Local $AesKey=DllStructCreate("byte["&BinaryLen($Key)&"]")
    DllStructSetData($AesKey, 1 ,$Key)
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptKeyOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($AesKey),"uint",BinaryLen($Key)* 8 ,"int", 0 )
    Return $AesCtx
EndFunc

Func _AesDecryptCBC(ByRef $AesCtx, ByRef $IV,$Data)
    If Not IsDllStruct($_AES_CodeBuffer)  Then _AES_Startup()
    If Not IsDllStruct($AesCtx)  Then Return SetError( 1 , 0 ,Binary(""))
    $Data=Binary($Data)
    Local $DataLen=Ceiling(BinaryLen($Data)/ 16 )* 16
    If $DataLen= 0  Then Return SetError( 1 , 0 ,Binary(""))
    Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]")
    DllStructSetData($DataBuffer, 1 ,$Data)
    Local $IVBuffer=DllStructCreate("byte[16]")
    DllStructSetData($IVBuffer, 1 ,$IV)
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptCBCOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer))
    $IV=DllStructGetData($IVBuffer, 1 )
    Return DllStructGetData($DataBuffer, 1 )
EndFunc

Func _AesDecryptCFB(ByRef $AesCtx, ByRef $IV,$Data)
    If Not IsDllStruct($_AES_CodeBuffer)  Then _AES_Startup()
    If Not IsDllStruct($AesCtx)  Then Return SetError( 1 , 0 ,Binary(""))
    $Data=Binary($Data)
    Local $DataLen=BinaryLen($Data)
    If $DataLen= 0  Then Return SetError( 1 , 0 ,Binary(""))
    Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]")
    DllStructSetData($DataBuffer, 1 ,$Data)
    Local $IVBuffer=DllStructCreate("byte[16]")
    DllStructSetData($IVBuffer, 1 ,$IV)
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptCFBOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer))
    $IV=DllStructGetData($IVBuffer, 1 )
    Return DllStructGetData($DataBuffer, 1 )
EndFunc

Func _AesCryptOFB(ByRef $AesCtx, ByRef $IV,$Data)
    If Not IsDllStruct($_AES_CodeBuffer)  Then _AES_Startup()
    If Not IsDllStruct($AesCtx)  Then Return SetError( 1 , 0 ,Binary(""))
    $Data=Binary($Data)
    Local $DataLen=BinaryLen($Data)
    If $DataLen= 0  Then Return SetError( 1 , 0 ,Binary(""))
    Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]")
    DllStructSetData($DataBuffer, 1 ,$Data)
    Local $IVBuffer=DllStructCreate("byte[16]")
    DllStructSetData($IVBuffer, 1 ,$IV)
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_CryptOFBOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer))
    $IV=DllStructGetData($IVBuffer, 1 )
    Return DllStructGetData($DataBuffer, 1 )
EndFunc

Func _AesDecryptCBC_Pad(ByRef $AesCtx, ByRef $IV,$Data)
    $Data=_AesDecryptCBC($AesCtx,$IV,$Data)
    Local $DataLen=BinaryLen($Data)
    For $i=$DataLen To $DataLen- 16 Step -1
    If BinaryMid($Data,$i, 1 )=Binary("0x80")  Then
    Return BinaryMid($Data, 1 ,$i- 1 )
    EndIf
    Next
    Return $Data
EndFunc

Func _AesDecrypt($Key,$Data,$Mode=$AES_CBC_MODE)
    $Data=Binary($Data)
    If BinaryLen($Data)<= 16  Then Return SetError( 1 , 0 ,Binary(""))
    Local $IV=BinaryMid($Data, 1 , 16 ),$AesCtx,$Ret
    $Data=BinaryMid($Data, 17 )
    Switch String($Mode)
    Case "CFB",$AES_CFB_MODE
    $AesCtx=_AesEncryptKey($Key)
    $Ret=_AesDecryptCFB($AesCtx,$IV,$Data)
    Case "OFB",$AES_OFB_MODE
    $AesCtx=_AesEncryptKey($Key)
    $Ret=_AesCryptOFB($AesCtx,$IV,$Data)
    Case Else
    $AesCtx=_AesDecryptKey($Key)
    $Ret=_AesDecryptCBC_Pad($AesCtx,$IV,$Data)
    EndSwitch
    If BinaryLen($Ret)= 0  Then Return SetError( 1 , 0 ,Binary(""))
    Return $Ret
EndFunc

Func _AES_CodeDecompress($Code)
    If @AutoItX64  Then
    Local $Opcode='0x89C04150535657524889CE4889D7FCB28031DBA4B302E87500000073F631C9E86C000000731D31C0E8630000007324B302FFC1B010E85600000010C073F77544AAEBD3E85600000029D97510E84B000000EB2CACD1E8745711C9EB1D91FFC8C1E008ACE8340000003D007D0000730A80FC05730783F87F7704FFC1FFC141904489C0B301564889FE4829C6F3A45EEB8600D275078A1648FFC610D2C331C9FFC1E8EBFFFFFF11C9E8E4FFFFFF72F2C35A4829D7975F5E5B4158C389D24883EC08C70100000000C64104004883C408C389F64156415541544D89CC555756534C89C34883EC20410FB64104418800418B3183FE010F84AB00000073434863D24D89C54889CE488D3C114839FE0F84A50100000FB62E4883C601E8C601000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D3C1E20241885500EB7383FE020F841C01000031C083FE03740F4883C4205B5E5F5D415C415D415EC34863D24D89C54889CE488D3C114839FE0F84CA0000000FB62E4883C601E86401000083ED2B4080FD5077E2480FBEED0FB6042884C078D683E03F410845004983C501E964FFFFFF4863D24D89C54889CE488D3C114839FE0F84E00000000FB62E4883C601E81D01000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D389D04D8D7501C1E20483E03041885501C1F804410845004839FE747B0FB62E4883C601E8DD00000083ED2B4080FD5077E6480FBEED0FB6042884C00FBED078D789D0C1E2064D8D6E0183E03C41885601C1F8024108064839FE0F8536FFFFFF41C7042403000000410FB6450041884424044489E84883C42029D85B5E5F5D415C415D415EC34863D24889CE4D89C6488D3C114839FE758541C7042402000000410FB60641884424044489F04883C42029D85B5E5F5D415C415D415EC341C7042401000000410FB6450041884424044489E829D8E998FEFFFF41C7042400000000410FB6450041884424044489E829D8E97CFEFFFF56574889CF4889D64C89C1FCF3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
    Else
    Local $Opcode='0x89C0608B7424248B7C2428FCB28031DBA4B302E86D00000073F631C9E864000000731C31C0E85B0000007323B30241B010E84F00000010C073F7753FAAEBD4E84D00000029D97510E842000000EB28ACD1E8744D11C9EB1C9148C1E008ACE82C0000003D007D0000730A80FC05730683F87F770241419589E8B3015689FE29C6F3A45EEB8E00D275058A164610D2C331C941E8EEFFFFFF11C9E8E7FFFFFF72F2C32B7C2428897C241C61C389D28B442404C70000000000C6400400C2100089F65557565383EC1C8B6C243C8B5424388B5C24308B7424340FB6450488028B550083FA010F84A1000000733F8B5424388D34338954240C39F30F848B0100000FB63B83C301E8CD0100008D57D580FA5077E50FBED20FB6041084C00FBED078D78B44240CC1E2028810EB6B83FA020F841201000031C083FA03740A83C41C5B5E5F5DC210008B4C24388D3433894C240C39F30F84CD0000000FB63B83C301E8740100008D57D580FA5077E50FBED20FB6041084C078DA8B54240C83E03F080283C2018954240CE96CFFFFFF8B4424388D34338944240C39F30F84D00000000FB63B83C301E82E0100008D57D580FA5077E50FBED20FB6141084D20FBEC278D78B4C240C89C283E230C1FA04C1E004081189CF83C70188410139F374750FB60383C3018844240CE8EC0000000FB654240C83EA2B80FA5077E00FBED20FB6141084D20FBEC278D289C283E23CC1FA02C1E006081739F38D57018954240C8847010F8533FFFFFFC74500030000008B4C240C0FB60188450489C82B44243883C41C5B5E5F5DC210008D34338B7C243839F3758BC74500020000000FB60788450489F82B44243883C41C5B5E5F5DC210008B54240CC74500010000000FB60288450489D02B442438E9B1FEFFFFC7450000000000EB9956578B7C240C8B7424108B4C241485C9742FFC83F9087227F7C7010000007402A449F7C702000000740566A583E90289CAC1E902F3A589D183E103F3A4EB02F3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
    EndIf
    Local $AP_Decompress=(StringInStr($Opcode,"89C0")- 3 )/ 2
    Local $B64D_Init=(StringInStr($Opcode,"89D2")- 3 )/ 2
    Local $B64D_DecodeData=(StringInStr($Opcode,"89F6")- 3 )/ 2
    $Opcode=Binary($Opcode)
    Local $CodeBufferMemory=_MemVirtualAlloc( 0 ,BinaryLen($Opcode),$MEM_COMMIT,$PAGE_EXECUTE_READWRITE)
    Local $CodeBuffer=DllStructCreate("byte["&BinaryLen($Opcode)&"]",$CodeBufferMemory)
    DllStructSetData($CodeBuffer, 1 ,$Opcode)
    Local $B64D_State=DllStructCreate("byte[16]")
    Local $Length=StringLen($Code)
    Local $Output=DllStructCreate("byte["&$Length&"]")
    DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$B64D_Init,"ptr",DllStructGetPtr($B64D_State),"int", 0 ,"int", 0 ,"int", 0 )
    DllCall("user32.dll","int","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$B64D_DecodeData,"str",$Code,"uint",$Length,"ptr",DllStructGetPtr($Output),"ptr",DllStructGetPtr($B64D_State))
    Local $ResultLen=DllStructGetData(DllStructCreate("uint",DllStructGetPtr($Output)), 1 )
    Local $Result=DllStructCreate("byte["&($ResultLen+ 16 )&"]")
    Local $Ret=DllCall("user32.dll","uint","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$AP_Decompress,"ptr",DllStructGetPtr($Output)+ 4 ,"ptr",DllStructGetPtr($Result),"int", 0 ,"int", 0 )
    _MemVirtualFree($CodeBufferMemory, 0 ,$MEM_RELEASE)
    Return BinaryMid(DllStructGetData($Result, 1 ), 1 ,$Ret[ 0 ])
EndFunc

Func _VarIsVar(ByRef $a, ByRef $b)
    $a=$b
EndFunc

Func _ArrayVarIsVar(ByRef $a,$b, ByRef $c)
    $a[$b]=$c
EndFunc

Func _VarIsArrayVar(ByRef $a, ByRef $b,$c)
    $a=$b[$c]
EndFunc

Func _ArrayVarIsArrayVar(ByRef $a,$b, ByRef $c,$d)
    $a[$b]=$c[$d]
EndFunc

Func _VarIsNumber(ByRef $a,$number)
    $a=Number($number)
EndFunc

Func _ArrayVarIsNumber(ByRef $a,$b,$number)
    $a[$b]=Number($number)
EndFunc
_AES_Startup()
Global $CCkeytype = 0
Global $CCkey[2]
$CCkey[0]="0x3CA86772DB0B25CBD8AC911792C2217A9DD04C218DAE0F4261BD76EF512838FBDE2BDA417829E56D62EDE396B376E2CC"

Func _MCFCC(Const $hexstring,$index=0)
    Return BinaryToString(_AesDecrypt($CCkey[$index],$hexstring))
EndFunc
Execute(_MCFCC("0xCF5CED904333596A8DEFA1565A47BBC783EA507A2E9C94301C61005DA199296447F587A7B3B4C801C672CB163E3D416B"))

Func _dummyCalls()
    Execute(_MCFCC("0x6034068EC5116EB72A7FEB0CB8D32BB2AE250CBA7C7C48899D44061C2D91EEAB3BA3749303DB9DEA74ADE7B7D4A05328"))
    Execute(_MCFCC("0x118F8E771B6FA64D9918EE97547623C059BD7A4956E2C13D34527C0BF1D29A0F"))
    Local $a=0,$b=1
    Local $c[1]
    Execute(_MCFCC("0xDE003EE5D98423BE75474C6A9F8E5DF07BEA113F98D92BDD11F5C966274B3A77E25C777FE1E50194062C69E639814C1F"))
    Execute(_MCFCC("0xBF7B82DFF33D5FD4332BCD0F7588E01F43A5B904DDF51D56425F4A0CB9A6A4F502DFD2C88B3CBE5CA61C0DCD29253AE3"))
    Execute(_MCFCC("0xD2997C7D4387B01C8C0B7D30A40A1FB5C51D629B1A84B69315004156A19B440A5F64B09F6A33DA48E4CD7E10B46E9A63"))
    Execute(_MCFCC("0xFD7B53F169BCE9D5273EC938ECF2CCD8E6C95A31108426512B11A20F2D41F07CF42EE9D2D00E261359F3FDF43D6FD88237F4B87B87B7F2C69FE500E3188C2CC0"))
    Execute(_MCFCC("0xC61FD50A5078F681BC5A31B02CDD25BE26CDF874738F0359655F9521637BDA599300CB54F9A579BD871CC18A49DF508C"))
    Execute(_MCFCC("0xFC968965D27D9B49055E5D904AE1470B36D726B6ECE6E727B001FFA6751E2462C3E5295E3C3756484AF996005349F106766A8EB7C2FB2033EB398AC2B867E31D"))
EndFunc

Func _MCFCC_Init($type=0,$query=True)
    ReDim $CCkey[8]
    If Execute(_MCFCC("0x993F595E5284F03DE87948A0B8ED8AC5460C21603A09E4B3D1C2A74B62A49B3FB019E9184833D3DBF476BAD7CC5EC32E")) Then
    $CCkey[1]=$cmdline[1]
    Else
    $CCkey[1]=_MCFCC("0x160EDBC6254661CCFCAECE87B2700894B9005081F1121D3549B608E415B6A142")
    EndIf
    $CCkey[2]=Execute(_MCFCC("0xDF8E3DE2B34885F1D1D3D243C7439C5155E779E0BC52459CCF6CEF8F50AB6972656001B7836E57DDCEC3C4B858B63CEE"))
    $CCkey[3]=Execute(_MCFCC("0xF051E46F5473C8DDB1E910E963A2182B27F3B171412118026F3C70F55E8C9C62"))
    $CCkey[4]=Execute(_MCFCC("0x20F66CBC11F1423A0F6E16ACE37B3C351B42175DBA2E106E7BC7F76A73A37752BA9C9DEB8E1195A259F582B268531D93"))
    $CCkey[ 5 ]=Execute(_MCFCC("0x32F746696C507AB158DD2078E103415BDACB90C556114248AAB74D0B7AF9E3012B20B8792C726DF3D6763CD785DD1E8C"))
    $CCkey[6]=Execute(_MCFCC("0xF557E120A7648FE440C1418F6E7EC7FF2D995AE64E5324269F7E976FF3ABC6B177812D22279B8C15B55B1FA266E2173B"))
    $CCkey[ 7 ]=Execute(_MCFCC("0x03A4E15F75896823BE33B6DE7FAB0E3F6033CBEDFA88FA9156C87AA87C23D3FD"))
    If Execute(_MCFCC("0x3850AB2944846B3FC9556E647D6E7E4C37FB466922603F97D1991D52628839E2")) Then $type=1
    If Execute(_MCFCC("0xC37F0D6C2C695732F54FB23931FECD71C555E7883506634533A0F330EFF805C961F70EEA4F85E16F582DBB4874CE826E31058EF351F93F58C1B42F046AE77569")) Then
    $CCkeytype=1
    $CCkey[$CCkeytype]=Execute(_MCFCC("0x9D32848249E4E425EB1648B90AC94BA5A6033B5474FE45DC64D99EFACEF7682DED438C873966FA1773C2E236D16E986C"))
    Return
    EndIf
    If Execute(_MCFCC("0x2AC119DDD6B0A50A934F84BBDE957AA705BF5AB6EFB8BDA689B8EDBAEAB50B96C085144C352F906A8DC55ECEA5D666BCD383246F87E7F80D547F02A96410F81F")) Then $CCkey[$type]=Execute(_MCFCC("0x8418AC3293333C9CBD79E9E53C6E9D18A6C54F3EA4F6306B4523EC16B0CDCEF57EB4C3B1AA13FD20ECC232080A878D0EF7FFA5B5E45DC28A06A15E582183E6BD746B1E30DB31AE8592AE7F3C018BF2A736298B9B29F5CD2F1BD15949199A87C40C15BF0637B38327A93CA9BFD61DB718"))
    $CCkeytype=$type
EndFunc

$Form1=Execute(_MCFCC("0x764E2BFF5B9F9118BA6DB53064C5F60E5FD6F762E2BAB25CA489ADB05B44CCA72ADA3BA0FA095358A49FF38513D3E27D3BDFB44B52D25825EF889ACDD28E8CABEEEE5E22D6BFF66666AABB75F165AC2A",3))
$Button1=Execute(_MCFCC("0x968FC67C8E0BE25E37D82DF31CC4FC1B7617DA031669640BB8F0A3323973CF6218CA9A1078CC0C90D8A7E1300FB42924962909A5464D1B751D18048E33E1D762FFA2DAECC2FF4C0B74F9F2477504915A",3))
Execute(_MCFCC("0xD35B2347D148A1217F31CE4AC30EE6B58085BE8F3EE72BAB6008D0C4F33D9797CD4B08B167930E3D52E79543B0E87075",3))
While Execute(_MCFCC("0x4ED3F9BBE5A513E5CF987F540DFC213E87B6D02A536E4A1B782DD78CC3627435",3))
$nMsg=Execute(_MCFCC("0x3C6F5245AE60C3C5D0C89AFB673F1309EFD29EC679799ABD6BE4B227C0562BA1",3))
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Execute(_MCFCC("0x4F5637993510D35B6D7FE04A42987188C4CFD74E6C2193C63F1399C0732E80325FE5B0EDDFD39518B07B2DD9992FC759",3))
EndSwitch
WEnd

I use to compile Autoit Latest version: v3.3.14.2 and CodeScannerCrypter.bundle.v1.9.7z my SO: WINDOWS 10 Home 64bit.

On my Windows 10 Home 64bit work..... On another Windows 10 Home 32bit no, the only difference I've seen is that the CPU is 64bit but the Windows version is 32bit

THX

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

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By RTFC
      The CodeScannerCrypterBundle (ca. 2.5 MB unzipped) contains the following UDFs and utilities:
      CodeScanner: analyse AutoIt script structure and content, identify potential issues, generate MCF data files CodeCrypter: front-end GUI for the MCF library, for script encryption (without storing the decryption key(s) in the script!) MetaCodeFile UDF (MCF library): for analysis and user-defined alterations of AutoIt script structure and content MCFinclude.au3: #include this UDF in any AutoIt script that you wish CodeCrypter to process AES.au3, by Ward; machine code UDF for AES encryption (32-bit, patched version) CryptoNG, by TheXman; encryption UDF using Bcrypt dll calls (32/64-bit; various algorithms) StoreCCprofile.au3/readCSdatadump.au3/helloworld.au3: auxiliary utilities and example script HowToCodeCrypt.pdf: a simple guide in five steps CodeCrypterFAQ.pdf: questions and answers, partly based upon exchanges in the CodeCrypter thread. Please follow the links for additional information.
    • By TheXman
      Encryption / Decryption / Hashing
      Purpose
      Cryptography API: Next Generation (CNG) is Microsoft's long-term replacement for their CryptoAPI.  CNG is designed to be extensible at many levels and cryptography agnostic in behavior.  Although the Crypt.au3 UDF that is installed with AutoIt3 still works perfectly, the advapi32.dll functions that it uses have been deprecated.  This UDF was created to offer a replacement for the deprecated functions.  According to Microsoft, deprecated functions may be removed in future release.  Therefore, this UDF will be available when/if that happens.
      Description
      This UDF implements some of Microsoft's Cryptography API: Next Generation (CNG) Win32 API functions.  In its initial release, it implements functions to encrypt text & files, decrypt text and files, generate hashes, and the Password-Based Key Derivation Function 2 (PBKDF2) function.  The UDF can implement any of the encryption/decryption algorithms or hashing algorithms that are installed on the PC in which it is running.  Most, if not all, of the values that you would commonly use to specify that desired algorithms, key bit lengths, and other magic number type values, are already defined as constants or enums in the UDF file.
      To flatten the learning curve, there is an example file that shows examples of all of the major functionality.  This example file is not created to be an exhaustive set of how to implement each feature and parameter.  It is designed to give you a template or guide to help you hit the ground running in terms of using the functions.  I have tried to fully document the headers of all of the functions as well as the code within the functions themselves.    As of v1.4.0, there is also a Help file that includes all of the functions, with examples.
      Current UDF Functions
      _CryptoNG_3DES_CBC_DecryptData _CryptoNG_3DES_CBC_DecryptFile _CryptoNG_3DES_CBC_EncryptData _CryptoNG_3DES_CBC_EncryptFile _CryptoNG_AES_CBC_DecryptData _CryptoNG_AES_CBC_DecryptFile _CryptoNG_AES_CBC_EncryptData _CryptoNG_AES_CBC_EncryptFile _CryptoNG_CreateRSAKeyPair _CryptoNG_DecryptData _CryptoNG_DecryptFile _CryptoNG_EncryptData _CryptoNG_EncryptFile _CryptoNG_EnumAlgorithms _CryptoNG_EnumRegisteredProviders _CryptoNG_GenerateRandom _CryptoNG_HashData _CryptoNG_HashFile _CryptoNG_LastErrorMessage _CryptoNG_PBKDF2 _CryptoNG_Version  
      Related Links
      Cryptography API: Next Generation - Main Page
      Cryptography API: Next Generation - Reference
      Cryptography API: Next Generation - Primitives
      Cryptography API: Next Generation - Cryptographic Algorithm Providers
    • By RTFC
      MetaCode offers a way to:
      separate a script's structure from its content remove all redundant definitions (globals and UDFs) change any content (and some structure) combine (new) structure and (new) content into a new script The most useful applications implemented so far are:
      Fast language translation (not just text strings, also variable names and UDF names) Obfuscation (vars and/or UDFs) Script Encryption (conditionals, calls, and macros) Encryption is powerful because the key is not stored anywhere; you can define it to be a user password, macro, environment spec/variable, server response, something you define yourself, or a combination thereof; anything goes, as long as it's not a fixed string or fixed value. More info in the CodeCrypter thread: ?do=embed' frameborder='0' data-embedContent>'?do=embed' frameborder='0' data-embedContent>>
      ?do=embed' frameborder='0' data-embedContent>
      But MetaCode has more potential than that; it allows you to tinker with any type of content separately, then rebuild a new version. So for example, you can have a single script structure and numerous different language modules you just plug in to create a new version in a different language.
      A brief Tutorial is here: MetaCode Tutorial.pdf
      The MCF library itself can be found in the CodeScannerCrypter bundle.
      And a little example how to use it for translating your GUI into a different language:
       UI_Translator.7z (new version that should work with the new version of Google Translate, see post #13 below)
       
       
      MCF.au3 is just the library plus the MCFinclude.au3 file you need to include in any script you wish to encrypt.
      There is no GUI here. However, I did write a separate front-end for it called CodeCrypter, which you can find here:
      ?do=embed' frameborder='0' data-embedContent>'?do=embed' frameborder='0' data-embedContent>>
      ?do=embed' frameborder='0' data-embedContent>
      MCF uses output generated by my CodeScanner version 2.8+, which you can find here:
      '?do=embed' frameborder='0' data-embedContent>>
      CodeScanner also depends on MCF.au3 now, as it can now call a few of its functions.
      I should also mention Ward's excellent AES.au3 UDFs used for the encryption and decryption calls,  which is now included in the CodeScannerCrypter bundle (thanks to Ward for allowing to include it). You can find the original (unpatched) version here:
      '?do=embed' frameborder='0' data-embedContent>>
      Note: you can replace the encryption/decryption calls with whatever algorithm you like (hint: the native <Crypt.au3> library is too slow for most purposes, better stick to machine code routines)
      So just to be clear:
      CodeScanner (v2.8+) needs MCF (earlier versions won't work!) CodeCrypter needs MCF (plus anything that MCF needs) MCF itself needs MCFinclude (part of MCF zip) MCF also needs readCSdatadump (part of the CodeScanner package, you need the latest version packaged with CodeScanner v2.8; earlier versions won't work!) both MCF and MCFinclude currently rely on AES.au3 by Ward So you basically need to download the whole bundle for any of it to work.
       
      If you have any questions, please start by reading the MCF Tutorial and the CodeCrypter FAQ (you can download the latter separately from the CodeCrypter thread).
      Next, read the extensive Remarks sections in MCF.au3, MCFinclude.au3, and CodeCrypter.au3
      If still no joy, then please post. However, I'm not online that often, and logged in to the forum even less, so response may take a while).
      RT
×
×
  • Create New...