ObfuscateMe (Joomla! plugin)
Written by Adrian Cozma
Friday, 19 November 2010 04:08
Update
ObfuscateMe released for Joomla 1.7 & 2.5.
About
ObfuscateMe is a Joomla! 1.5, 1.7 & 2.5 extension that hides part of (or whole) pages into JavaScript code in order to prevent (primarily) spambots to gather e-mail addresses from your published content. But it also prevents the content to be seen by web crawlers (like Google's, Yahoo!'s) who don't execute the JavaScript code in the pages they visit.
It hides anything, be it plain text or HTML, except for JavaScript code you want to be executed on the client side (which it hides from bots, but will not be executed).
For clients who don't have JavaScript enabled, it displays a customizable fall-back message.
In over two years of being published in the contact page and obfuscated with this plugin (check that page's source), I have got no spam in the mailbox of my e-mail address.
How it works
On the server's side, the page part to be obfuscated is encrypted with the simplest of all encryption algorithms (Caesar cipher) and a random key. On the client's side, the ciphertext is transformed into plaintext by JavaScript.
Though the encryption is simple, the text will appear to bots as a string of random alphanumeric characters, good enough for hiding it. The weakest link is not the strength of the encryption (because the decryption is automatic in the client's browser, so it needs the key anyway), but the ability of the bot to execute Javascript.
Usage
In the article editor
{obfuscate}
<!-- insert plain text, or well formatted HTML code here -->
<!-- insert anything -->
<!-- except for JavaScript code you want to be executed -->
{/obfuscate}
You can have as many {obfuscate}{/obfuscate} tags as you wish in one page. Check the live examples below.
Configuration (in the Plugin Manager)
- Alternative tag to trigger the plugin: Here you can write another trigger for the plugin. E.g. if you write here NewTriggeringTag, you'll invoke the plugin with: {NewTriggeringTag}{/NewTriggeringTag}.
- Alternative message when JavaScript is not enabled: If the client browser has JavaScript disabled, this message will appear informing the user he needs to enable JavaScript. Let the field blank for the default message.
Conflicts with other plugins
- Email Cloaking: If you intend to obfuscate e-mail addresses, you have to disable this plugin which is superseded by ObfuscateMe. (Email Cloaking transforms any e-mail address into JavaScript code which is executed by the browser — see below.)
- Generally, any plugin that will generate JavaScript code (e.g. as does Email Cloaking) between {obfuscate}{/obfuscate} tags will not work, because ObfuscateMe encrypts that part, sends it to the browser, which decrypts and displays it via JavaScript. And a piece of JavaScript code written in the document by another piece of JavaScript code will not be executed.
Live examples
Refresh the page. The IDs, the cyphertext, and the key in the generated HTML will change. The content seen by the user will remain the same.
When you use more than one pair of {obfuscate}{/obfuscate} tags in the same page, the probability of name collisions in the generated code between different chunks of obfuscated data is practically zero (the suffixes' namespace size is 62^12 = 3226266762397899821056 > 10^21).
Example #1 (simple text):
- Joomla code:
{obfuscate}a simple text{/obfuscate}
- Generated HTML source:
<!-- ObfuscateMe -->
<span id='m31_wrapper_6XyqdnapAAky' class='m31_encr_wrapper'>
<span id='m31_cyphertext_6XyqdnapAAky' class='m31_encr_item'>1bda2d23272a261fda2e1f322e</span>
<span id='m31_token_6XyqdnapAAky' class='m31_encr_item'>FKfSQJjwx3pjghGHooEdQ0CFBM9sE</span>
<span id='m31_algorithm_6XyqdnapAAky' class='m31_encr_item'>caesar</span>
<!-- fallback if no javascript -->This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.<!-- /fallback --></span>
<script type='text/javascript' language='JavaScript'>
var encr_cyphertext = document.getElementById('m31_cyphertext_6XyqdnapAAky').innerHTML;
var encr_token = document.getElementById('m31_token_6XyqdnapAAky').innerHTML;
var encr_algorithm = document.getElementById('m31_algorithm_6XyqdnapAAky').innerHTML;
var encr_plaintex = '';
document.getElementById('m31_wrapper_6XyqdnapAAky').innerHTML = 'loading...';
switch (encr_algorithm)
{
case 'caesar':
encr_plaintex = m31_CaesarDecrypt(m31_hexDecode(encr_cyphertext),m31_CaesarKeyFromToken(encr_token));
break;
default:
}
document.getElementById('m31_wrapper_6XyqdnapAAky').innerHTML = encr_plaintex;
</script>
<!-- /ObfuscateMe -->
- HTML output:
7d3c8f85898c88813c90819490
ASZSGMgung61sT00KFTswMNwyosYIdrT
caesar
This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.
Example #2 (HTML elements):
- Joomla code:
{obfuscate}
a <b>formatted</b> <i>text</i> is also <span style="color:yellow">possible</span>,<br/>
as well as an e-mail address: <a href="mailto:account@mailserver.com">account@mailserver.com</a>
{/obfuscate}
- Generated HTML source:
<!-- ObfuscateMe -->
<span id='m31_wrapper_4PvLlaFYGMZ7' class='m31_encr_wrapper'>
<span id='m31_cyphertext_4PvLlaFYGMZ7' class='m31_encr_item'>22353576353b81895088898784837c3b7c89507b8487827689897a793b8189504488898784837c3b7c8950353b8189507e3b7c8950897a8d893b818950447e3b7c8950357e88357681888435858488887e77817a411f2235357688358c7a8181357688357683357a4282767e8135767979877a88884f353b81895076357d877a7b523782767e8189844f767878848a83895582767e81887a878b7a8743788482373b7c8950767878848a83895582767e81887a878b7a87437884823b81895044763b7c8950223535</span>
<span id='m31_token_4PvLlaFYGMZ7' class='m31_encr_item'>a79pb0lyNgvBXSU9IyEitZTTp0jAarz9</span>
<span id='m31_algorithm_4PvLlaFYGMZ7' class='m31_encr_item'>caesar</span>
<!-- fallback if no javascript -->This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.<!-- /fallback --></span>
<script type='text/javascript' language='JavaScript'>
var encr_cyphertext = document.getElementById('m31_cyphertext_4PvLlaFYGMZ7').innerHTML;
var encr_token = document.getElementById('m31_token_4PvLlaFYGMZ7').innerHTML;
var encr_algorithm = document.getElementById('m31_algorithm_4PvLlaFYGMZ7').innerHTML;
var encr_plaintex = '';
document.getElementById('m31_wrapper_4PvLlaFYGMZ7').innerHTML = 'loading...';
switch (encr_algorithm)
{
case 'caesar':
encr_plaintex = m31_CaesarDecrypt(m31_hexDecode(encr_cyphertext),m31_CaesarKeyFromToken(encr_token));
break;
default:
}
document.getElementById('m31_wrapper_4PvLlaFYGMZ7').innerHTML = encr_plaintex;
</script>
<!-- /ObfuscateMe -->
- HTML output:
37344a4a8b4a669d9e9c9998916890999c978b9e9e8f8e66599d9e9c999891684a6693689e8fa29e665993684a939d4a8b969d994a669d9a8b984a9d9ea3968f674c8d9996999c64a38f969699a14c689a999d9d938c968f66599d9a8b986856668c9c4a596837344a4a8b9d4aa18f96964a8b9d4a8b984a8f57978b93964a8b8e8e9c8f9d9d644a668b4a929c8f90674c978b93969e99648b8d8d999f989e6a978b93969d8f9ca08f9c588d99974c688b8d8d999f989e6a978b93969d8f9ca08f9c588d999766598b6837344a4a
C4D9Iv1sOUhODry4q72y6d6pAdEcL9XX
caesar
This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.
Example #3 (HTML elements - a more complex example):
- Joomla code:
{obfuscate}
<table style="border:solid 1px red;width:30%;text-align:center">
<tr>
<td style="color:blue">00</td>
<td>01</td>
</tr>
<tr>
<td>10</td>
<td>11</td>
</tr>
</table>
{/obfuscate}
- Generated HTML source:
<!-- ObfuscateMe -->
<span id='m31_wrapper_EkgXfiP2C5QP' class='m31_encr_wrapper'>
<span id='m31_cyphertext_EkgXfiP2C5QP' class='m31_encr_item'>4646464646464c929a619a8788928b46999a9f928b63488895988a8b98609995928f8a4657969e46988b8a619d8f8a9a8e6059564b619a8b9e9a5387928f8d9460898b949a8b98484c8d9a614646464c929a619a984c8d9a6146464646464c929a619a8a46999a9f928b634889959295986088929b8b484c8d9a6156564c929a61559a8a4c8d9a6146464646464c929a619a8a4c8d9a6156574c929a61559a8a4c8d9a614646464c929a61559a984c8d9a614646464c929a619a984c8d9a6146464646464c929a619a8a4c8d9a6157564c929a61559a8a4c8d9a6146464646464c929a619a8a4c8d9a6157574c929a61559a8a4c8d9a614646464c929a61559a984c8d9a614c929a61559a8788928b4c8d9a61</span>
<span id='m31_token_EkgXfiP2C5QP' class='m31_encr_item'>OUlWWic9pRJSfwnoSJ2BZqhytt2IIyh</span>
<span id='m31_algorithm_EkgXfiP2C5QP' class='m31_encr_item'>caesar</span>
<!-- fallback if no javascript -->This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.<!-- /fallback --></span>
<script type='text/javascript' language='JavaScript'>
var encr_cyphertext = document.getElementById('m31_cyphertext_EkgXfiP2C5QP').innerHTML;
var encr_token = document.getElementById('m31_token_EkgXfiP2C5QP').innerHTML;
var encr_algorithm = document.getElementById('m31_algorithm_EkgXfiP2C5QP').innerHTML;
var encr_plaintex = '';
document.getElementById('m31_wrapper_EkgXfiP2C5QP').innerHTML = 'loading...';
switch (encr_algorithm)
{
case 'caesar':
encr_plaintex = m31_CaesarDecrypt(m31_hexDecode(encr_cyphertext),m31_CaesarKeyFromToken(encr_token));
break;
default:
}
document.getElementById('m31_wrapper_EkgXfiP2C5QP').innerHTML = encr_plaintex;
</script>
<!-- /ObfuscateMe -->
- HTML output:
585587bfacadb7b06bbebfc4b7b0886dadbabdafb0bd856bbebab7b4af6b7cbbc36bbdb0af866bc2b4afbfb3856b7e7b70866bbfb0c3bf78acb7b4b2b9856baeb0b9bfb0bd866d6badbabdafb0bd886d7b6d89585587bfadbaafc489585587bfbd89585587bfaf6bbebfc4b7b0886daebab7babd85adb7c0b06d897b7b877abfaf89585587bfaf897b7c877abfaf895855877abfbd89585587bfbd89585587bfaf897c7b877abfaf89585587bfaf897c7c877abfaf895855877abfbd895855877abfadbaafc4895855877abfacadb7b0895855
Uh8ojJnI9UF1NHKfF1RyDkP1AeGwM9cq
caesar
This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.
Example #4 (non-ASCII characters):
If your OS does not have installed a font with proper Eastern European characters (in this case s and t with comma for Romanian), you will see scrambled text (mojibake) both in source and output.
- Joomla code:
{obfuscate}
<span style="font-size:120%"><b>LUCEAFĂRUL</b></span><br/>
<span style="color:#999999"><i>a poem by Mihail Eminescu</i></span><br/>
<br/>
A fost odată ca-n povești <br/>
A fost ca niciodată, <br/>
Din rude mari împărătești, <br/>
O prea frumoasă fată.<br/>
<br/>
Și era una la părinți <br/>
Și mândră-n toate cele, <br/>
Cum e Fecioara între sfinți <br/>
Și luna între stele.<br/>
<br/>
Din umbra falnicelor bolți <br/>
Ea pasul și-l îndreaptă <br/>
Lângă fereastră, unde-n colț <br/>
Luceafărul așteaptă.<br/>
<br/>
Privea în zare cum pe mări <br/>
Răsare și străluce, <br/>
Pe mișcătoarele cărări <br/>
Corăbii negre duce,<br/>
<br/>
Îl vede azi, îl vede mâni,<br/>
Astfel dorința-i gata; <br/>
El iar, privind de săptămâni, <br/>
Îi cade dragă fata.
{/obfuscate}
- Generated HTML source:
<!-- ObfuscateMe -->
<span id='m31_wrapper_rkea3QsDv7FH' class='m31_encr_wrapper'>
<span id='m31_cyphertext_rkea3QsDv7FH' class='m31_encr_item'>ff054b531a524f404dff5253584b441c01454e4d530c524859441910110f04010546531a054b531a410546531a2b342224202505021114171a31342b054b531a0e410546531a054b531a0e524f404d0546531a054b531a41510e0546531aff054b531a524f404dff5253584b441c01424e4b4e511902181818181818010546531a054b531a480546531a40ff4f4e444cff4158ff2c484740484bff244c484d44524254054b531a0e480546531a054b531a0e524f404d0546531a054b531a41510e0546531a054b531a41510e0546531a20ff454e5253ff4e43405305021114181aff42400c4dff4f4e554405021412161a5348ff054b531a41510e0546531aff20ff454e5253ff4240ff4d4842484e43405305021114181a0bff054b531a41510e0546531aff23484dff51544344ff4c405148ff0548424851421a4c4f05021114181a5105021114181a534405021412161a53480b054b531a41510e0546531aff2eff4f514440ff4551544c4e405205021114181aff45405305021114181a0d054b531a41510e0546531aff054b531a41510e0546531aff05021412151a48ff445140ff544d40ff4b40ff4f05021114181a51484d05021412181a48ff054b531a41510e0546531aff05021412151a48ff4c0540424851421a4d435105021114181a0c4dff534e405344ff42444b440bff054b531a41510e0546531aff22544cff44ff254442484e405140ff0548424851421a4d535144ff5245484d05021412181a48ff054b531a41510e0546531aff05021412151a48ff4b544d40ff0548424851421a4d535144ff5253444b440d054b531a41510e0546531a054b531a41510e0546531aff23484dff544c415140ff45404b4d4842444b4e51ff414e4b05021412181a48ff054b531a41510e0546531aff2440ff4f4052544bff05021412161a480c4bff0548424851421a4d435144404f5305021114181aff054b531a41510e0546531a2b0540424851421a4d4605021114181aff454451444052535105021114181a0bff544d43440c4dff424e4b05021412181aff054b531a41510e0546531aff2b544244404505021114181a51544bff4005021412161a5344404f5305021114181a0d054b531a41510e0546531aff054b531a41510e0546531aff2f5148554440ff0548424851421a4dff59405144ff42544cff4f44ff4c05021114181a5148054b531a41510e0546531aff3105021114181a52405144ff05021412161a48ff52535105021114181a4b5442440bff054b531a41510e0546531aff2f44ff4c4805021412161a4205021114181a534e4051444b44ff4205021114181a5105021114181a5148ff054b531a41510e0546531aff224e5105021114181a414848ff4d44465144ff435442440b054b531a41510e0546531aff054b531a41510e0546531aff0528424851421a4bff55444344ff4059480bff0548424851421a4bff55444344ff4c0540424851421a4d480b054b531a41510e0546531aff20525345444bff434e51484d05021412181a400c48ff464053401aff054b531a41510e0546531aff244bff4840510bff4f514855484d43ff4344ff5205021114181a4f5305021114181a4c0540424851421a4d480bff054b531a41510e0546531aff0528424851421a48ff42404344ff4351404605021114181aff454053400dff</span>
<span id='m31_token_rkea3QsDv7FH' class='m31_encr_item'>ZxebOcp70rIf6D0Gpr7YUhcvZpqg364d</span>
<span id='m31_algorithm_rkea3QsDv7FH' class='m31_encr_item'>caesar</span>
<!-- fallback if no javascript -->This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.<!-- /fallback --></span>
<script type='text/javascript' language='JavaScript'>
var encr_cyphertext = document.getElementById('m31_cyphertext_rkea3QsDv7FH').innerHTML;
var encr_token = document.getElementById('m31_token_rkea3QsDv7FH').innerHTML;
var encr_algorithm = document.getElementById('m31_algorithm_rkea3QsDv7FH').innerHTML;
var encr_plaintex = '';
document.getElementById('m31_wrapper_rkea3QsDv7FH').innerHTML = 'loading...';
switch (encr_algorithm)
{
case 'caesar':
encr_plaintex = m31_CaesarDecrypt(m31_hexDecode(encr_cyphertext),m31_CaesarKeyFromToken(encr_token));
break;
default:
}
document.getElementById('m31_wrapper_rkea3QsDv7FH').innerHTML = encr_plaintex;
</script>
<!-- /ObfuscateMe -->
- HTML output:
aeca01feeffcae010207faf3cbb0f4fdfc02bb01f708f3c8bfc0beb3b0ccca010200fdfcf5ccdae3d1d3cfd4b4b1c0c3c6c9e0e3dacabd010200fdfcf5cccabd01feeffccccaf000aebdccaeca01feeffcae010207faf3cbb0f1fdfafd00c8b1c7c7c7c7c7c7b0cccaf3fbccefaefefdf3fbaef007aedbf7f6eff7faaed3fbf7fcf301f103cabdf3fbcccabd01feeffccccaf000aebdccaecaf000aebdccaecfaef4fd0102aefdf2ef02b4b1c0c3c7c9aef1efbbfcaefefd04f3b4b1c3c1c5c902f7aecaf000aebdccaecfaef4fd0102aef1efaefcf7f1f7fdf2ef02b4b1c0c3c7c9baaecaf000aebdccaed2f7fcae0003f2f3aefbef00f7aeb4f7f1f700f1c9fbfeb4b1c0c3c7c900b4b1c0c3c7c902f3b4b1c3c1c5c902f7baaecaf000aebdccaeddaefe00f3efaef40003fbfdef01b4b1c0c3c7c9aef4ef02b4b1c0c3c7c9bccaf000aebdccaecaf000aebdccaeb4b1c3c1c4c9f7aef300efae03fcefaefaefaefeb4b1c0c3c7c900f7fcb4b1c3c1c7c9f7aecaf000aebdccaeb4b1c3c1c4c9f7aefbb4eff1f700f1c9fcf200b4b1c0c3c7c9bbfcae02fdef02f3aef1f3faf3baaecaf000aebdccaed103fbaef3aed4f3f1f7fdef00efaeb4f7f1f700f1c9fc0200f3ae01f4f7fcb4b1c3c1c7c9f7aecaf000aebdccaeb4b1c3c1c4c9f7aefa03fcefaeb4f7f1f700f1c9fc0200f3ae0102f3faf3bccaf000aebdccaecaf000aebdccaed2f7fcae03fbf000efaef4effafcf7f1f3fafd00aef0fdfab4b1c3c1c7c9f7aecaf000aebdccaed3efaefeef0103faaeb4b1c3c1c5c9f7bbfaaeb4f7f1f700f1c9fcf200f3effe02b4b1c0c3c7c9aecaf000aebdccaedab4eff1f700f1c9fcf5b4b1c0c3c7c9aef4f300f3ef010200b4b1c0c3c7c9baae03fcf2f3bbfcaef1fdfab4b1c3c1c7c9aecaf000aebdccaeda03f1f3eff4b4b1c0c3c7c90003faaeefb4b1c3c1c5c902f3effe02b4b1c0c3c7c9bccaf000aebdccaecaf000aebdccaede00f704f3efaeb4f7f1f700f1c9fcae08ef00f3aef103fbaefef3aefbb4b1c0c3c7c900f7aecaf000aebdccaee0b4b1c0c3c7c901ef00f3aeb4b1c3c1c5c9f7ae010200b4b1c0c3c7c9fa03f1f3baaecaf000aebdccaedef3aefbf7b4b1c3c1c5c9f1b4b1c0c3c7c902fdef00f3faf3aef1b4b1c0c3c7c900b4b1c0c3c7c900f7aecaf000aebdccaed1fd00b4b1c0c3c7c9f0f7f7aefcf3f500f3aef203f1f3bacaf000aebdccaecaf000aebdccaeb4d7f1f700f1c9faae04f3f2f3aeef08f7baaeb4f7f1f700f1c9faae04f3f2f3aefbb4eff1f700f1c9fcf7bacaf000aebdccaecf0102f4f3faaef2fd00f7fcb4b1c3c1c7c9efbbf7aef5ef02efc9caf000bdccaed3faaef7ef00baaefe00f704f7fcf2aef2f3ae01b4b1c0c3c7c9fe02b4b1c0c3c7c9fbb4eff1f700f1c9fcf7baaecaf000aebdccaeb4d7f1f700f1c9f7aef1eff2f3aef200eff5b4b1c0c3c7c9aef4ef02efbcaeaeaeaeae
2FstMQN32Icr7IuENXH5liQnGnf5of9q
caesar
This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.
Example #5 (east-Asian characters):
If your OS does not have installed a font with East-Asian characters (in this case Japanese), you will see scrambled text (mojibake) both in source and output.
- Joomla code:
{obfuscate}
<p>A haiku by Matsuo Bashō:<p>
<p>古池や 蛙飛込む 水の音</p>
<p>furuike ya kawazu tobikomu mizu no oto</p>
<p>old pond... a frog leaps inwater’s sound</p>
{/obfuscate}
- Generated HTML source:
<!-- ObfuscateMe -->
<span id='m31_wrapper_u0jGR6JTOwKW' class='m31_encr_wrapper'>
<span id='m31_cyphertext_u0jGR6JTOwKW' class='m31_encr_item'>45427958a099a1a3ad589ab1588599acabada7587a99aba05e5b6b6b6b737245425e5b6a696c6f6e735e5b6a6f6f6c6c735e5b696a6c6a68735e5b696a6a7070735e5b6b6c6d6a69735e5b6b71696b69735e5b6b6e6f716e735e5b696a6c696e735e5b696a6a7070735e5b6a6f6f6868735e5b696a6b7170735e5b6b707071717345429eadaaada1a39d58b19958a399af99b2ad58aca79aa1a3a7a5ad58a5a1b2ad58a6a758a7aca74542a7a49c58a8a7a69c6666665899589eaaa79f58a49d99a8ab58a1a6af99ac9daa5eaaaba9ada773ab58aba7ada69c45</span>
<span id='m31_token_u0jGR6JTOwKW' class='m31_encr_item'>Ekbl0gWj6Iuy4hcEXWEFmgM59l1UGFi</span>
<span id='m31_algorithm_u0jGR6JTOwKW' class='m31_encr_item'>caesar</span>
<!-- fallback if no javascript -->This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.<!-- /fallback --></span>
<script type='text/javascript' language='JavaScript'>
var encr_cyphertext = document.getElementById('m31_cyphertext_u0jGR6JTOwKW').innerHTML;
var encr_token = document.getElementById('m31_token_u0jGR6JTOwKW').innerHTML;
var encr_algorithm = document.getElementById('m31_algorithm_u0jGR6JTOwKW').innerHTML;
var encr_plaintex = '';
document.getElementById('m31_wrapper_u0jGR6JTOwKW').innerHTML = 'loading...';
switch (encr_algorithm)
{
case 'caesar':
encr_plaintex = m31_CaesarDecrypt(m31_hexDecode(encr_cyphertext),m31_CaesarKeyFromToken(encr_token));
break;
default:
}
document.getElementById('m31_wrapper_u0jGR6JTOwKW').innerHTML = encr_plaintex;
</script>
<!-- /ObfuscateMe -->
- HTML output:
7e7bade1afb291d9d2dadce691d3ea91bed2e5e4e6e091b3d2e4d99794a4a4a4acabada0e1af7e7bade1af9794a3a2a5a8a7ac9794a3a8a8a5a5ac9794a2a3a5a3a1ac9794a2a3a3a9a9ac9794a4a5a6a3a2ac9794a4aaa2a4a2ac9794a4a7a8aaa7ac9794a2a3a5a2a7ac9794a2a3a3a9a9ac9794a3a8a8a1a1ac9794a2a3a4aaa9ac9794a4a9a9aaaaacada0e1af7e7bade1afd7e6e3e6dadcd691ead291dcd2e8d2ebe691e5e0d3dadce0dee691dedaebe691dfe091e0e5e0ada0e1af7e7bade1afe0ddd591e1e0dfd59f9f9f91d291d7e3e0d891ddd6d2e1e491dadfe8d2e5d6e397e3e4e2e6e0ace491e4e0e6dfd5ada0e1af7e7b
Cr1kMG8xLE65GaMWHMLkNsj7Ur0EfD
caesar
This page part is protected against spam bots and web crawlers. In order to be displayed you need to enable Javascript in your browser, and then reload the page.
Download
License
Copyright © 2010 Adrian Cozma, http://pte.ro. All rights reserved.
Released under GPL 2.0.
Full license text at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.