Форум Flasher.ru
Ближайшие курсы в Школе RealTime
[см.]  
  
[см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Рейтинг: 5.00. Голосов: 8.

Тяжёлые алгоритмы на стероидах (MD5, Base64, CRC32, JPEG, PNG)

Запись от BlooDHounD размещена 11.06.2010 в 19:51
Обновил(-а) BlooDHounD 11.04.2016 в 22:18 (поменял вложения)

Реализовал парочку алгоритмов на замену аналогам из as3corelib:
  • MD5
  • Base64
  • JPEG
  • PNG
результаты бенчмарка на моей машине:
Код:
by.blooddy.crypto.MD5.hashBytes: 40
com.adobe.crypto.MD5.hashBytes:  4483

by.blooddy.crypto.Base64.encode: 115
mx.utils.Base64Encoder:          1635

by.blooddy.crypto.Base64.decode: 141
mx.utils.Base64Decoder:          2762

by.blooddy.crypto.image.JPEGEncoder.encode: 447
com.adobe.images.JPGEncoder:                3496

by.blooddy.crypto.image.PNG24Encoder.encode: 538
com.adobe.images.PNGEncoder.encode:          1423
исходник бенчмарка:
Код AS3:
package { 
 
	import by.blooddy.crypto.Base64;
	import by.blooddy.crypto.MD5;
	import by.blooddy.crypto.image.JPEGEncoder;
	import by.blooddy.crypto.image.PNG24Encoder;
 
	import com.adobe.crypto.MD5;
	import com.adobe.images.JPGEncoder;
	import com.adobe.images.PNGEncoder;
 
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.ByteArray;
	import flash.utils.getTimer;
 
	import mx.utils.Base64Decoder;
	import mx.utils.Base64Encoder;
 
	[SWF( scriptTimeLimit="255" )]
	public class test extends Sprite {
 
		/**
		 * Constructor
		 */
		public function test() {
			super();
 
			var text:String = '';
			var t:Number;
 
			// BitmapData для тестов
			var bmp:BitmapData = new BitmapData( 1024, 1024, true, 0xFFFF0000 );
			bmp.noise( int( Math.random() * int.MAX_VALUE ), 0, 0xFF, 7, false ); // генерируем шум
 
			// ByteArray для тестов
			var bytes:ByteArray = bmp.getPixels( bmp.rect );
 
			// тест MD5
			t = getTimer();
			by.blooddy.crypto.MD5.hashBytes( bytes );
			text += '\nby.blooddy.crypto.MD5.hashBytes: ' + ( getTimer() - t ); // 40
 
			t = getTimer();
			com.adobe.crypto.MD5.hashBytes( bytes );
			text += '\ncom.adobe.crypto.MD5.hashBytes: ' + ( getTimer() - t ); // 4483
 
			// тест Base64 encode
			t = getTimer();
			var s1:String = by.blooddy.crypto.Base64.encode( bytes, true );
			text += '\nby.blooddy.crypto.Base64.encode: ' + ( getTimer() - t ); // 115
 
			t = getTimer();
			var e:Base64Encoder = new Base64Encoder();
			e.encodeBytes( bytes );
			var s2:String = e.flush();
			text += '\nmx.utils.Base64Encoder: ' + ( getTimer() - t ); // 1635
 
			// тест Base64 decode
			t = getTimer();
			by.blooddy.crypto.Base64.decode( s1 );
			text += '\nby.blooddy.crypto.Base64.decode: ' + ( getTimer() - t ); // 141
 
			t = getTimer();
			var d:Base64Decoder = new Base64Decoder();
			d.decode( s2 );
			d.flush();
			text += '\nmx.utils.Base64Decoder: ' + ( getTimer() - t ); // 2762
 
			// тест JPEG
			t = getTimer();
			by.blooddy.crypto.image.JPEGEncoder.encode( bmp, 60 );
			text += '\nby.blooddy.crypto.image.JPEGEncoder.encode: ' + ( getTimer() - t ); // 447
 
			t = getTimer();
			( new com.adobe.images.JPGEncoder( 60 ) ).encode( bmp );
			text += '\ncom.adobe.images.JPGEncoder: ' + ( getTimer() - t ); // 3496
 
			// тест PNG
			t = getTimer();
			by.blooddy.crypto.image.PNG24Encoder.encode( bmp );
			text += '\nby.blooddy.crypto.image.PNG24Encoder.encode: ' + ( getTimer() - t ); // 538
 
			t = getTimer();
			com.adobe.images.PNGEncoder.encode( bmp );
			text += '\ncom.adobe.images.PNGEncoder.encode: ' + ( getTimer() - t ); // 1423
 
			var tf:TextField = new TextField();
			tf.autoSize = 'left';
			tf.text = text;
			super.addChild( tf );
 
		}
 
	}
 
}
некоторые особенности реализации:
  • всё это дело написано при помощи haXe, после чего пропущено через mxmlc, что бы убрать мусор, которым haXe всё засоряет
  • все классы на полную катушку используют скрытые операторы для работы с памятью
  • JPEGEncoder кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.

---------------
Вложения
Тип файла: swf benchmark.swf (28.9 Кб, 602 просмотров)
Размещено в ActionScript , compiler , haXe
Комментарии 63 Отправить другу ссылку на эту запись
Всего комментариев 63

Комментарии

Старый 11.06.2010 20:54 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А код можно пощупать? HaXe почти не знаю, однако результаты впечатляют =) Отличная работа.
Старый 11.06.2010 21:23 dimarik вне форума
dimarik
 
Аватар для dimarik
Браво, маэстро! С такими скоростями эта штука позволит мне реализовать старую задумку.
Старый 11.06.2010 21:25 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
у меня жпеги кодятся по разному
Код AS3:
const bmd:BitmapData = new BitmapData(320, 240, true, 0);
bmd.noise(0);
 
//const f:FileReference = new FileReference();
//f.save((new com.adobe.images.JPGEncoder(60)).encode(bmd), "qwe1.jpg");
//f.save(by.blooddy.crypto.image.JPEGEncoder.encode(bmd, 60), "qwe2.jpg");
 
trace((new com.adobe.images.JPGEncoder(60)).encode(bmd).length) // 75871
trace(by.blooddy.crypto.image.JPEGEncoder.encode(bmd, 60).length) // 38861
в файле от адоби видно картинку-шум
а файл от тебя не просматривается и при открытии пишет что "Bad or unrecognized image header"
тестирую последним плеером 10.1
Старый 11.06.2010 21:57 Котяра вне форума
Котяра
 
Аватар для Котяра
Знай наших! Респект и уважуха!
А что значит "пропущен через mxmlc"?
Можно подробности?
Обновил(-а) Котяра 11.06.2010 в 22:00
Старый 12.06.2010 18:17 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
перезалил swc с исправленным JPEGEncoder'ом.
Старый 12.06.2010 19:02 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
заработало
как насчет лицензии использования?
и сам как, используешь в своих проектах, или только намереваешься?
Старый 12.06.2010 21:15 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
kutuzov, ну рас я swc выложил, то наверно не для "подразниться" =) юзай конечно. использую в своих проектах по прямому назначению =)
Старый 13.06.2010 23:02 tonnon вне форума
tonnon
 
Аватар для tonnon
было бы классно, если гиф добавил.
спасибо.
Старый 14.06.2010 17:07 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Кстати,
Цитата:
JPEGEncoder кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.
со второй аналогичной картинки или со второй картинки вообще? Если вообще - почему нельзя сразу вшить эти кешируемые значения в флешку?
Старый 14.06.2010 17:45 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
tonnon, а зачем гиф? и из чего делать гиф? из мувика?
Psycho Tiger, со второй вообще. вшить нельзя так как там куча таблиц вычисляемых.
есть 2 вида таблиц. одни зависят от конкретного сжатия, а вторые можно зашить, но там 20кб =) к тому генерация таблиц довольно быстрая операция. прирост совсем небольшой получается.
Старый 14.06.2010 17:54 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
а можно вычислить предполагаемый размер картинки
то есть (битмапДата, качество):предполагаемыйРазмерКартинкиБайт
или (битмапДата, желаемыйРазмерБайт):качество
но без непосредственного сжатия

просто есть такая задача, заливать на сервер картинки размером не более 50 кб, и качество не ниже 50
сейчас это реализовано через массив качеств и обхода его до получения нужного размера
Старый 14.06.2010 18:10 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
kutuzov, предполагаемый размер можно вычислить только как это делаются остальные =) написали формулу основываясь на средних показателях и выдают. без запуска алгоритма я не умею.
Старый 19.06.2010 02:00 Сайлас вне форума
Сайлас
Эм.
Такой вопрос: а CRC32 можно добавить метод из стринга для удобства сразу?
А жаль исходников нет чистых, а то еще понадобился CRC64, который ничем не отличается почти.

P.S. Спасибо
Обновил(-а) Сайлас 19.06.2010 в 02:02
Старый 19.06.2010 02:35 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
CRC32 используется в PNG. поэтому он есть в библиотеке.
Старый 24.06.2010 14:21 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
большое спасибо, крайне полезно.
Старый 29.06.2010 19:13 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Забавная штука )
Использовали методы Base64 encode/decode и JPEGEncoder.encode размер флешки вырос с 336кб до 511кб, причем никаких лишних классов в декомпиляторе не появилось.
Чем это можно объяснить? Либа то полезная, но не такой ценой )
Старый 29.06.2010 19:27 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, без понятия, что Вы туда напихали. вся либа целиком весит 25кб. и увеличить размер флэшки на 200кб она к сожалению не может. максиму, что мне удавалось, это увеличить размер на 25кб. и то это только в случаи с дебаговой версией.
Старый 29.06.2010 19:58 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Ну справедливости ради надо сказать, что на демке действительно использование этих же методов увеличивает размер swf всего на 12 кб, но в игрвом проекте замена всего трех строк с as3corelib на эту либу приводит с увеличению флешки на 175кб. Самому удивительно, как 9 кб swc приводит к такому факту, но пока решил оставить на свободное время )
собираем антом, все либы, классы и параметры компиляции под учетом, так что ничего лишнего мы никуда не пихаем, наоборот все что можно эксклудим и грузим в рантайме.
Старый 29.06.2010 21:17 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, чудес не бывает.
Старый 30.06.2010 11:20 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
С флешом все бывает, думаю, все заглядывали в жиру адоба ) BlooDHounD, сам ведь вчера писал про баг с мусором в ByteArray, разве это не чудеса плеера?

Пробовали на другом проекте, там использование JpegEncoder добавило 100кб к общему размеру, похоже добавленный размер пропорционален общему размеру swf и составляет 50-60% от размера swf.
Старый 30.06.2010 12:10 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, да быть такого не может -) может Вы optimize убираете вместе с добавлением либы?
Старый 30.06.2010 12:56 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Да я сам глазам не верю )
Либы у нас лежат в двух папках libs и external, в первой прописываются в compiler.library-path:
<compiler.library-path dir="${swc.lib.dir}" append="true">
<include name="*.swc" />
</compiler.library-path>
Вторые в external:
<compiler.external-library-path dir="${swc.lib.external.dir}" append="true">
<include name="*.swc" />
</compiler.external-library-path>

В коде есть строка:
Base64.decode("234");

Если положить blooddy_crypto.swc в папку libs
swf весит 657 кб
Если положить в папку external:
swf весит 346 кб

Если удалить строку Base64.decode("234"), swf в обоих случаях весит 346 кб.
И это факт ) Такое поведение наблюдается на всех проектах, собираем SDK 3.4.1 и SDK 3.2.0, другие параметры сборки:
debug="false"
target-player="10.0.0"
flex-config.xml дефолтный из sdk.
Обновил(-а) FSBmipt 30.06.2010 в 15:37
Старый 30.06.2010 13:57 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
ну что я вам могу сказать ... у меня as3corelib весит 250кб. моя библиотека весит 25кб.
генерируейте отчёт о компиляции и смотри сколько у вас что весит.
Старый 30.06.2010 15:33 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Ты будешь смеяться, но с твоей либой -link-report не рабоет ) Выдает жавные эксепшены на два экрана, вот последние строчки:

[mxmlc] Loading configuration file C:\Program Files (x86)\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0\frameworks\flex-config.xml
[mxmlc] macromedia.abc.DecoderException: unknown opcode?? 53
[mxmlc] at macromedia.abc.Decoder$Opcodes.decode(Decoder.java:1700)

Без либы отчет нормально генерится.
Старый 30.06.2010 15:59 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, логично. я уверен на 99.999999999999999999999999% что проблема не в моей либе. просто там нечему появится на 200 кб. ну просто даже если код текстом напишу он столько не займёт. а уж в байткоде тем более. сделайте пример где кода минимум и где при этом наблюдается увеличение размера, и скиньте сюда.
Старый 30.06.2010 16:03 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
>сделайте пример где кода минимум и где при этом наблюдается увеличение размера, и скиньте сюда.
Я же говорю, размер swf вырастает пропорционально начальному размеру, может там байты нулями забиваются или каким-нибудь мусором, но на маленьких демках это не воспроизвести. Неужели у тебя нет никакого мало мальски большого проекта с классами килобайт на 200-300 чтобы протестировать? ) Добавть туда вызов любого метода из либы и посмотри на размер.
Я не говорю, что причина именно в либе, но использование либы приводит к увеличению размера, скорее всего какая-то очередная ошибка в mxmlc.
Старый 30.06.2010 16:26 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
кхм ... как бы вам сказать ... у меня проекты меньше 400кб не бывают обычно. это чистый код без какой-либо графики.

в общем всунул в парочку в проектов. увеличение на пару кб в каждом произошло.
в общем повторюсь: ищите косяк у себя. декомпилятором откройте в конце концов.

и на последок: кучу нулевых байт после сжатия превращаются в парочку не нулевых. то есть мы можете 10мб нулей сжать до килобайта.
Старый 30.06.2010 16:26 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Вы бы СДК какой-нибудь по-новее попробовали. Просто кто его знает как там оно в 3.2 было. Кажется что или только начиная с 3.3 можно было под десятый плеер компилировать, или в 3.2 могли быть с этим какие-то проблемы...
Старый 30.06.2010 16:29 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
>Вы бы СДК какой-нибудь по-новее попробовали.
Пробовали и в 3.4.1 я писал выше, такой же результат (

>в общем повторюсь: ищите косяк у себя. декомпилятором откройте в конце концов.
Это делали в первую очередь, кроме упомянутых классов ничего нет.

Так же тестили на _чистом_ Flex проекте с строкой Base64.encode("awsd"), размер вырастает так же на ~150кб. Кстати это не только у меня, но и у всех наших разработчиков наблюдается.
Обновил(-а) FSBmipt 30.06.2010 в 16:40
Старый 30.06.2010 16:41 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ну так откройте вашу флешку чем-нибудь и посмотрите что вы туда запихали. Не может быть чтобы каких-то десять классов не особо больших добавили столько. Судя по цифре и СДК вы туда пихаете весь фреймворк - почему - это уже или у вас или у компилятора надо спрашивать.
Старый 30.06.2010 16:45 Diestro вне форума
Diestro
 
Аватар для Diestro
Наверное нужен доктор Хаус. У моего подопытного симптомы те-же.
Можно потестить создав пустой Flex проект с единственным xml файлом:
Код AS1/AS2:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
	<![CDATA[
		import by.blooddy.crypto.Base64;
		public function init():void{
			var ba:ByteArray = Base64.decode("qwerty");
		}
 
	]]>
</mx:Script>
</mx:Application>
Компилим релиз - флэшка весит 317 кб
Коментим 2 строчки с Base64 получаем релиз 177 кб.
Обновил(-а) Diestro 30.06.2010 в 16:47
Старый 30.06.2010 17:11 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
			import by.blooddy.crypto.Base64;
		]]>
	</fx:Script>
	<s:applicationComplete>
		<![CDATA[
			var ba:ByteArray = Base64.decode("qwerty");
		]]>
	</s:applicationComplete>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
</s:Application>
релиз билд получается 220К если так, и 219К если закоментировать обе строчки.
Старый 30.06.2010 17:13 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
создал пустой Flex 4 проект. вставил код. увеличение размера файла на фоне 1 мб даже не заметил. что-то около 2 кб. что я сделал не так?
Старый 30.06.2010 17:23 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
>создал пустой Flex 4 проект

Речь идет о Flex 3 проекте

UPD. На Flex SDK 4.0 такой баги нет, мы проверили.
Старый 30.06.2010 17:26 Diestro вне форума
Diestro
 
Аватар для Diestro
Я ж вроде от 3го Flex`a код показал
Старый 30.06.2010 17:43 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Diestro, ну я вообще флексом не пользуюсь. у меня всё и так в шоколаде )
Старый 30.06.2010 17:49 alekslitvinenk вне форума
alekslitvinenk
 
Аватар для alekslitvinenk
А у всех кто пользуется FlexSDK 3.x и вашей либой все не так шоколадно.
И вообще, отнеситесь к этому не как к критике, а как к баг-репорту
Старый 30.06.2010 17:50 Diestro вне форума
Diestro
 
Аватар для Diestro
А какая разница кто чем код редактирует? Я естественно имел ввиду флэксовый фреймворк 3й версии. Версии SDK тоже пробовал разные и 3.2, и 3.4.1.10084 - результат тот же.
Старый 30.06.2010 18:01 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
alekslitvinenk, а где тут критика? меня никто не критикует -)
к тому же мне кажется что проблема не в моей либе. дело в чём-то другом, просто оно как-то вызывается присутствием моей либы. может быть не только моей, а любой другой. или каких-то особенных. в общем что-то на флэшку влияет, но вряд ли это моя либа. может быть влияет факт, что я её собрал в 4м флексе, и умный компилятор 3го, чего где-то откапывает. в общем не знаю. лично в байт-коде я никаких коварностей не нашёл.
Старый 30.06.2010 18:03 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Diestro, а кто где говорил про редакторы?
Старый 30.06.2010 18:03 Diestro вне форума
Diestro
 
Аватар для Diestro
Цитата:
просто оно как-то вызывается присутствием моей либы
Именно!

А... если имелся ввиду флэксовый фреймворк, то в данном примере он как раз позволяет нагнать кучу кода в пару строчек, чтобы увеличить размер флэшки на выходе. При использовании либы флэшка растет независимо от использования флэксовых классов.
Обновил(-а) Diestro 30.06.2010 в 18:10
Старый 30.06.2010 18:13 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Diestro, а вы другие либы подключали?
Старый 30.06.2010 18:17 Diestro вне форума
Diestro
 
Аватар для Diestro
Ага, при использовании аналогов из as3corelib размер растет как положено по килобайтикам. Я ж говорю, симптомы те же.
Старый 30.06.2010 20:01 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Diestro, то есть независимо от того флексовый это проект или нет, он у вас всё равно на 150кб больше?
Старый 30.06.2010 23:24 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
http://bugs.adobe.com/jira/browse/SDK-26814
Вот такие вот пироги с котятами.
Старый 01.07.2010 00:38 Diestro вне форума
Diestro
 
Аватар для Diestro
Цитата:
Diestro, то есть независимо от того флексовый это проект или нет, он у вас всё равно на 150кб больше?
Я уже писал что:
Цитата:
При использовании либы флэшка растет независимо от использования флэксовых классов.
И дело не в 150 кб. Размер увеличивается почти в 2 раза (+/-).

Цитата:
Вот такие вот пироги с котятами.
Фуф. Семь потов сошло...
Обновил(-а) Diestro 01.07.2010 в 01:14
Старый 15.08.2010 20:53 expl вне форума
expl
Цитата:
При использовании либы флэшка растет независимо от использования флэксовых классов.
Можно попытаться скомпилировать либу haX'ом отдельно в swf и вэмбедить в класс - обертку, который скомпилировать в swc

Из минусов - необходимо будет асинхронно проинициализировать либу (лоадер для swf-ки синхронно работать не умеет) где-нть при старте приложения,
зато с размером приложения, использующего эту либу будет все ОК.
Обновил(-а) expl 15.08.2010 в 20:56
Старый 16.08.2010 12:56 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
expl, а можно просто взять компилятор поновее.
Старый 17.08.2010 23:16 expl вне форума
expl
Ктож спорит, лучше, но многие до сих пор на 3-м flex-фремворке работают.
Старый 18.08.2010 04:36 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
а кто мешает работать с новым компилятором но со старым фрэймворком?
 

 


Часовой пояс GMT +4, время: 16:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.