Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Поиск в бинарном файле   Найти похожие ветки 

 
Defunct ©   (2004-10-05 13:50) [200]

> Поздравляю! Пора заново открывать PosChallenge.
пасиба

GuAV ©   (05.10.04 12:19) [197]
> Не всё так однозначно...

Попробуйте для Celeron"a найти наилучшее соотношение символов в строке, которое обробатывается как маленькая строка. Поменяйте цифры в сл. коде:

 ....
 Cmp  ECx,32
 Jb   @Small_String
 ...
 ...
 Cmp  ECx, 16
 Jb   @@SmallScan

Sha ©   (05.10.04 12:25) [198]
> Подправь свою функцию, чтобы проходила тест Validation0 (здесь учтены предложения GuAV):

Ок вечерком, посмотрю.


 
GuAV ©   (2004-10-05 22:15) [201]


> Попробуйте для Celeron"a найти наилучшее соотношение символов
> в строке, которое обробатывается как маленькая строка. Поменяйте
> цифры в сл. коде:

Лучше не становится, только хуже.

ИМХО, ещё быстрее будет, если искать в обратном порядке. Можно сначала что-то типа And ECx, 7 и просмотреть остаток, потом вернуть ECx и сделать And ECx not 7 и искать строку используя ММХ... это ИМХО сделает запрет выхода за буфер проще.... попробую сам сделать... если получится, выложу.


 
Defunct ©   (2004-10-05 23:31) [202]

> ИМХО, ещё быстрее будет, если искать в обратном порядке.

Не совсем понял вашу идею. Можно пояснить? мы же ищем первое вхождение, а если сканировать в обратном порядке, тогда можно получить неверный результат.

PS: для инициализации MMX требуется значительное время, сканирование целесообразно делать на MMX только для больших строк.


 
GuAV ©   (2004-10-06 01:03) [203]


> а если сканировать в обратном порядке, тогда можно получить
> неверный результат

Я сам уже понял, когда написал WideScan а он не хочет проходить валидацию. Вот код, если интересно:

@@WideScan:
 Cmp  ECx, 16
 Jb   @@SmallScan

 Mov  Al,[EAx]
 Mov  Ah, Al
 MovD MM6, EAx
 PUNPCKLWD MM6, MM6
 PUNPCKLDQ MM6, MM6

 Push EBx
 Push ECx
 Mov  EBx, ECx
 And  EBx, not 7
 And  ECx, 7
 Jz   @@ReverseScan
 Xor  ECx, ECx

@@RemainingDword:
 MovD      MM7, [EDx+EBx]  // load a part of buffer that needs to be scaned
 PCMPEQB   MM7, MM6    // make a bit mask (mm6 filled by 1st char of da constant)
 MovD  EAx, MM7        // get mixed dword
 Test  EAx, EAx
 Jnz   @@FoundInDWord
 Add  ECx, 4
 Jna  @@ReverseScan

 MovD      MM7, [EDx+EBx+4]  // load a part of buffer that needs to be scaned
 PCMPEQB   MM7, MM6    // make a bit mask (mm6 filled by 1st char of da constant)
 MovD  EAx, MM7        // get mixed dword
 Test  EAx, EAx
 Jnz   @@FoundInDWord

 Jmp  @@ReverseScan

@@FoundInDWord:
 Inc   Ecx
 Test  Al,Al
 Js    @@InDWord_pos
 Shr   EAx,8
 Jmp   @@FoundInDWord

@@InDWord_pos:
 Emms
 Pop  EAx
 Test ECx, ECx
 Js   @@InDWord_Failed
 Mov  EAx, ECx
 Add  EAx, EBx
 Pop  EBx
 Ret

@@InDWord_Failed:
 Xor  EAx, EAx
 Pop  EBx
 Ret

@@ReverseScan:
 Mov  ECx, EBx
@@ScanLoop:
 Sub       ECx, 8
 Js        @@ScanLoopExit
 MovQ      MM7, [EDx+ECx]
 PCMPEQB   MM7, MM6
 PACKSSWB  MM7, MM7
 MovD  EAx, MM7
 Test  EAx, EAx
 Jz   @@ScanLoop

@@ScanLoopFound:
 MovQ      MM7, [EDx+ECx]
 PCMPEQB   MM7, MM6
 MovD  EAx, MM7
 Test  EAx, EAx
 Jnz   @@SLFoundInDword
 Add   ECx,4
 PSRLQ MM7,32
 MovD  EAx, MM7
@@SLFoundInDword:
 Inc   Ecx
 Test  Al,Al
 Js    @@SLInDWord_pos
 Shr   EAx,8
 Jmp   @@SLFoundInDword

@@SLInDWord_pos:
 Mov   EAx, ECx
 Pop   ECx
 Pop   EBx
 Emms
 Ret

@@ScanLoopExit:
 Pop   ECx
 Pop   EBx
 Xor   EAx, EAx
 Emms
 Ret


 
Ihor Osov'yak ©   (2004-10-06 01:06) [204]

Ребята, влом отслеживать полет изменений кода.. :-)
Если можно, полный код в студию...


 
GuAV ©   (2004-10-06 01:16) [205]

Ihor Osov"yak ©   (06.10.04 01:06) [204]
пока что [193]. Однако он ещё не проходит тест на выход из буфера.  

[203] - я привел ошибочный код. как сейчас понял зря.


 
Ihor Osov'yak ©   (2004-10-06 01:20) [206]

2 [205] GuAV ©   (06.10.04 01:16)

ок, либо подожду, либо когда-то повожусь с вашим кодом. может. если будет время и энтузиазм..


 
GuAV ©   (2004-10-06 01:28) [207]

Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь договорились, что строка начинается на границе двойного слова или как ? [183]
Видимо прийдётся делать Validate для Validate 0 8-))


 
Ihor Osov'yak ©   (2004-10-06 01:49) [208]

2 [207] GuAV ©   (06.10.04 01:28)
ну, иногда лучше перебдить, чем недобдить..
Предположим фантастический вариант - я содал тело строки ручками.. не на границе двойного слова. И передал как параметр.. :-)
Лично я не сторонник таких финтов, но в принцыпе такое может быть. Поэтому я бы дал предпочтение функции, прошедшей валидацию от Sha.


 
GuAV ©   (2004-10-06 01:58) [209]

Тогда берите любую функцию от JOH. Они прошли даже мой агрессивный тест, когда даже к 0-терминатору обратится нельзя.


 
GuAV ©   (2004-10-06 02:07) [210]

Хотя поскольку ошибка приведёт AV именно в месте его причины, а не далеко после процедуры можно просто завернуть её в try... except on EAccesViolation do Result:=0 end;
Этот код может кому-то не понравится, но он нужен только в случае вольностей упомянутых в [208], в "нормальном" режиме функция не приводит к AV.


 
GuAV ©   (2004-10-06 03:12) [211]

Тут появиась мысль, ка сделать фцию, проходящую любые подобные validate0. Надо сделать вначале test edx, 3; jnz odd_align и там обработать такую ситуацию, обработав эти 1..3 байт и вернуться. Код обработки может быть и не оптимальным, лишь бы он корректно работал.


 
Sha ©   (2004-10-06 09:47) [212]

> GuAV ©   (06.10.04 01:28) [207]
> Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь
> договорились, что строка начинается на границе двойного слова или как ? [183]

У меня так и сделано.
Длина строки = 4n+3.
Конец строки (терминатор) фиксирован на нижней границе страницы.
Начало строки плавает. Но всегда находится на грацице двойного слова.


 
Sha ©   (2004-10-06 09:48) [213]

Конец строки (терминатор) фиксирован на верхней границе страницы.


 
GuAV ©   (2004-10-06 12:13) [214]

Sha ©   (06.10.04 09:47) [212]
Я поняла в чём дело.
 Call @@CharPos
Отсюда вход с not alined EDX.


 
GuAV ©   (2004-10-06 12:13) [215]

Sha ©   (06.10.04 09:47) [212]
Я понял в чём дело.
 Call @@CharPos
Отсюда вход с not alined EDX.


 
Defunct ©   (2004-10-06 16:33) [216]

>Sha [198]

Функция [193] прошла тест [198] так что можете смело использовать.

> Ihor Osov"yak ©   (06.10.04 01:06) [204]

[193] - полный рабочий вариант кода.
[195] - тесты PosDef_MMX = [193]


 
Sha ©   (2004-10-06 17:02) [217]

> Defunct ©   (06.10.04 16:33) [216]
> Функция [193] прошла тест [198] так что можете смело использовать.

На моем компьютере не проходит.


 
Defunct ©   (2004-10-06 17:25) [218]

> Sha

хм..

    if Validate0 {[198]} and
       Validate1 and
       Validate2 and
       Validate3 and
       Validate4 and
       Validate5 and
       Validate6 and
       Validate7 and
       Validate8 and
       Validate9 and
       Validate10 and
       Validate11 then

PosDef_MMX  Passed

Если вас не затруднит, можете посмотреть где именно происходит выход за границу последнего Dword, потому как проверял на разных компах, везде проходит. (сам я не могу найти).


 
Sha ©   (2004-10-06 17:43) [219]

> Defunct ©   (06.10.04 17:25) [218]
> if Validate0 {[198]} and

Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?

> Если вас не затруднит, ...
Давай на "ты". Конечно, посмотрю. Но чуть позже.


 
Defunct ©   (2004-10-06 17:51) [220]

> Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?


Исправил только ValidateAll,
все теперь порядок, вижу где выходит.

сейчас подправлю.


 
Jeer ©   (2004-10-06 18:04) [221]

Грандиозно мужики !
Живо мне напомнило успешные попытки втиснуть в 64K и добиться нужного быстродействия для бортового компьютера на i8080 (580)
решения навигационных задач подводного средства движения в далекие 70-е годы.

Так держать !


 
Defunct ©   (2004-10-06 18:07) [222]

Или я что-то там не понял, или тест работает не совсем корректно.

Хочу немного уточнить задачу.

Допустим строка из одного символа "a", она ведь поидее выровняна до DWord т.е. реальная длинна = |-8| +  4 = 12

-8 Dword
-4 Dword
0  "a"
1  0  
2  мусор
3  мусор

У меня происходит чтение строки
@CharPos:
Mov EAx, [EDx]
за DWord выхода нет, но Validation0 вызывает исключение именно на этой строчке. Поставил проверку на 0 (думал может туда случайно проходит вызов при буфере = 0) ничего не изменилось.


 
Sha ©   (2004-10-06 18:13) [223]

> Defunct

Ломается при таком обращении ConstantPos("ef9","efg").
Первая пересылка
@@Scan4:
 Mov  Ch,[EAx]

проходит нормально, т.к. адрес в edx выровнен.
При заходе на вторую пересылку адрес в edx уже на 1 больше.
Старший байт читаемого слова лежит на защищенной странице => AV.


 
Sha ©   (2004-10-06 18:18) [224]

Defunct ©   (06.10.04 18:07) [222]

Строку из одного "a" тест никогда не генерирует.
В тесте используются строки длиной 4*n+3 - они с учетом
терминатора всегда занимают целое число двойных слов.


 
Defunct ©   (2004-10-06 18:26) [225]

Еще один загадочный эксепшин. Идет проверка, не выходит ли подстрока за границу буфера, и если не выходит, тогда происходит сканирование в обратном порядке (с конца строки). Опять же Exception?


  Cmp  Cl, Bl      <-- проверка на выход за границу буфера
  Jb   @NotFound2  <-- буфер меньше длинны подстроки - выход

  Push ECx
  Mov  ECx, EBx
@Loop2:
  Mov  Al, [ESi+ECx]
  Cmp  Al, [EDx+ECx-1] <--- Exceptoin здесь
  Jnz  @Scan7
  Loop @Loop2

100% где-то в тесте что-то не учтено.


 
Sha ©   (2004-10-06 18:27) [226]

в Sha ©   (06.10.04 18:13) [223] случайно выкусил не тот код.
Ошибка происходит, там где ты ее нашел.


 
Defunct ©   (2004-10-06 18:29) [227]

> При заходе на вторую пересылку адрес в edx уже на 1 больше.

Понял


 
Sha ©   (2004-10-06 18:32) [228]

> Defunct ©   (06.10.04 18:26) [225]
> 100% где-то в тесте что-то не учтено.

При этом хорошо бы еще сказать что именно не учтено :)

Давай начнем с исправления очевидной ошибки в ConstantPos("ef9","efg");


 
GuAV ©   (2004-10-06 22:19) [229]

Такой WideScan не вылазит за буфер ни на байт.
Имхо надо сделать остальное типа так же.
@@WideScan:
 Cmp  ECx, 16
 Jb   @@SmallScan
 Mov  Al,[EAx]
 Mov  Ah, Al
 MovD MM6, EAx
 PUNPCKLWD MM6, MM6
 PUNPCKLDQ MM6, MM6

 Push EBx
 Push EDx
 Mov  EBx, ECx
 And  EBx, not 7
 Add  EBx, EDx
@@WSc_Scan5:
 MovQ      MM7, [EDx]
 PCMPEQB   MM7, MM6
 PACKSSWB  MM7, MM7
 MovD  EAx, MM7
 Test  EAx, EAx
 Jnz   @@WSc_QFound
 Add   EDx, 8
 Cmp   EDx, EBx
 Jl    @@WSc_Scan5

 Mov   EBx, ECx
 And   EBx, 7      // is anything left ?
 Jz    @@WSc_Done
 Test  EBx, 4      // dword or more left ?
 Jz    @@WSc_Last123

@@WSc_LastDword2:
 MovD      MM7, [EDx]  // load a part of buffer that needs to be scaned
 PCMPEQB   MM7, MM6    // make a bit mask (mm6 filled by 1st char of da constant)
 MovD  EAx, MM7        // get mixed dword
 Test  EAx, EAx
 Jnz   @@WSc_DFound
 Add   EDx, 4

@@WSc_Last123:
 MovD  EAx, MM6  // no MMX anymore
 Test  EBx, 2
 Jz    @@WSc_LastOne
 Cmp   AL, [EDx]
 Jz    @@WSc_AtLast1
 Inc   EDx
 Cmp   AL, [EDx]
 Jz    @@WSc_AtLast1
 Inc   EDx

@@WSc_LastOne:
 Test  EBx, 1
 Jz    @@WSc_Done
 Cmp   AL, [EDx]
 Jz    @@WSc_AtLast1

@@WSc_Done:
 Pop  EDx
 Xor   EAx, EAx
 Pop  EBx
 Emms
 Ret

@@WSc_AtLast1:
 Inc  EDx
@@WSc_AtLast:
 Mov  EAx, EDx
 Pop  EDx
 Sub  EAx, EDx
 Pop  EBx
 Emms
 Ret

@@WSc_QFound:
 MovQ      MM7, [EDx]
 PCMPEQB   MM7, MM6
 MovD  EAx, MM7
 Test  EAx, EAx
 Jnz   @@WSc_DFound
 Add   EDx,4
 PSRLQ MM7,32
 MovD  EAx, MM7

@@WSc_DFound:
 Inc   EDx
 Test  EAx, $000000FF
 Jnz   @@WSc_AtLast
 Inc   EDx
 Test  EAx, $0000FF00
 Jnz   @@WSc_AtLast
 Inc   EDx
 Test  EAx, $00FF0000
 Jnz   @@WSc_AtLast
 Inc   EDx
 Jmp   @@WSc_AtLast

@Small_String:


 
GuAV ©   (2004-10-06 23:22) [230]

Мой smallscan тоже не выходит за буфер. кроме того вместе с предыдущим кодом у меня быстрее чем [193]
@@SmallScan:
 Mov   Al, [EAx]
 Push  ECx
 Xchg  EDx, EDi
 Shr   ECx, 2
 Jz    @@SSc_SkipD
 Repne ScasD
 Je    @@SSc_D
@@SSc_SkipD:
 Mov   ECx, [ESp]
 And   ECx, 3
 Jz    @@SSc_Done
 Repne ScasB
 Jne   @@SSc_Done
 Xchg  EDx, EDi
 Pop   EAx
 Sub   EAx, ECx
 Ret
@@SSc_Done:
 Xchg  EDx, EDi
 Pop   EAx
 Xor   EAx, EAx
 Ret
@@SSc_D:
 Add   ECx, ECx
 Xchg  EDx, EDi
 Add   ECx, ECx
 Pop   EAx
 Sub   EAx, ECx
 Ret

Проверте на Р4, плиз.


 
kaZaNoVa ©   (2004-10-06 23:24) [231]

2ALL выложите плиз полный окончательный вариант "ускоренной POS"  ;)


 
GuAV ©   (2004-10-06 23:42) [232]

[230] не то выложил. не работает. вот что имелось ввиду:
@@SmallScan:
 Mov   Al, [EAx]
 Push  ECx
 Xchg  EDx, EDi
 Repne ScasB
 Jne   @@SSc_Done
 Xchg  EDx, EDi
 Pop   EAx
 Sub   EAx, ECx
 Ret
@@SSc_Done:
 Xchg  EDx, EDi
 Pop   EAx
 Xor   EAx, EAx
 Ret


 
GuAV ©   (2004-10-06 23:49) [233]

kaZaNoVa ©   (06.10.04 23:24) [231]
Как только, так сразу.


 
Defunct ©   (2004-10-07 00:00) [234]

2 GuruAV

На P4 - очень хорошо:
PosGuru&Def     4       188     134     322
PosDef_MMX      C       194     139     333


на P2 тоже стало лучше но не на много:
PosGuru&Def     4       1148    692     1840
PosDef_MMX      C       1168    699     1867
PosJOH_MMX_a    8       1139    933     2072


 
Defunct ©   (2004-10-07 00:03) [235]

с новым SmallScan [232] стало гораздо хуже:

PosGuru&Def     4       194     134     328


 
Defunct ©   (2004-10-07 00:14) [236]

Guru, а вы учитываете выравнивание на границу QWord при MMX сканировании? На очень больших строках будет существенный проигрыш если не учитываете.

Это же было не от фонаря сделано [193]:

 MovQ      MM7, [Edi]
 PCMPEQB   MM7, MM6
 PACKSSWB  MM7, MM7
 MovD  EAx, MM7
 Test  EAx, EAx
 Jnz   @@CharFound
 Add   EDi, 8
 Mov   EAx, Edi
 And   EAx, 7
 Sub   EDi,EAx         // Aligning index
 Sub   ECx,8
 Add   ECx,EAx
 
 Cmp   ECx,4
 Jnge  @@LastDword

У меня получалось добиться индекса 133 в SB2, но тогда мой тест (просмотр 12.5Gb) выполнялся на 2 секунды дольше.


 
GuAV ©   (2004-10-07 00:33) [237]

Defunct ©   (07.10.04 00:14) [236]

не знал про это. тогда так:

@@WideScan:
Cmp  ECx, 16
Jb   @@SmallScan
Mov  Al,[EAx]
Mov  Ah, Al
MovD MM6, EAx
PUNPCKLWD MM6, MM6
PUNPCKLDQ MM6, MM6

Push EBx
Push EDx
Mov  EBx, ECx
And  EBx, not 7
Add  EBx, EDx
Test EDx, 4
Jz   @@WSc_Scan5

MovD      MM7, [EDx]  // load a part of buffer that needs to be scaned
PCMPEQB   MM7, MM6    // make a bit mask (mm6 filled by 1st char of da constant)
MovD  EAx, MM7        // get mixed dword
Test  EAx, EAx
Jnz   @@WSc_DFound
Add   EDx, 4
Sub   EBx, 4          // do not check dword again

@@WSc_Scan5:
MovQ      MM7, [EDx]

и далее по тексту.
то есть, если был DWord align, то при WSc_Scan5 будет QWord align, а не быть его может только в извращённых условиях типа validate0, под которые подстраиваемся, но не оптимизируем.


 
Defunct ©   (2004-10-07 01:09) [238]

У меня промелькнула идея которая не только может значительно ускорить функцию, но и решит проблему с validate 0. Как вы думаете, если при MMX сканировании и при CharPos (раскрученном цикле) формировать массив найденных символов и потом с ним и работать. (т.е. например, просмотрели 8 символов, нашли 3 совпадения и дальше уже работает с совпадениями, все найденные совпадения не подходят - тогда продолжаем смотреть следующие 8 символов).

PS: меня сейчас время поджимает, смогу рассмотреть эту идею только на выходных, если у вас есть время можете попробовать раньше.


 
GuAV ©   (2004-10-07 01:49) [239]

@@CompareWholeString:
 Test  EBx, EBx
 Jz    @@Constant_Exists
 Cmp   EDx, EBx
 Jna   @@Exit_False

 MOV   ECX, EBX

@@CWs_1:
 Test  ECx, 1
 Jz    @@CWs_2
 MOV   AL, [ESi+ECx]
 CMP   AL, [EDi+ECx]
 Sub   ECx, 1

@@CWs_2:
 Test  ECx, 2
 Jz    @@CWs_4
 MOV   AX, [ESi+ECx]
 CMP   AX, [EDi+ECx]
 Sub   ECx, 4

@@CWs_4:
 Test  ECx, 4
 Jz    @@CWs_8
 MOV   EAX, [ESi+ECx]
 CMP   EAX, [EDi+ECx]
 Sub   ECx, 8

@@CWs_8:

@@CW_Loop:
 SUB   ECX, 8
 JL    @@Constant_Exists
 MovQ     MM3,  [ESi+ECx]
 MovQ     MM2,  [EDi+ECx]
 PCMPEQB   MM3,  MM2
 PACKSSWB MM3,  MM3
 MovD  EAX, MM3
 Cmp   EAX, -1
 JE   @@CW_Loop

@@SkipBTest:
 Mov   ECx, EDx
 Cmp   EDx,4
 Jg    @@Scan
 Jmp   @@LastDWord

@@Constant_Exists:
 Pop   EAx
 Sub   EAx, EDx


Defunct ©   (07.10.04 01:09) [238]
Не думаю что я справлюсь раньше. Пока я ещё не полностью понимаю работу имеющесйся. Однако, завтра у меня будет много времени.


 
GuAV ©   (2004-10-07 02:05) [240]

[239] опять не рабочий код дал, блин... вот рабочий:
@@CompareWholeString:
 Test  EBx, EBx
 Jz    @@Constant_Exists
 Cmp   EDx, EBx
 Jna   @@Exit_False

 MOV   ECX, EBX

@@CWs_1:
 Test  ECx, 1
 Jz    @@CWs_2
 Sub   ECx, 1
 MOV   AL, [ESi+ECx]
 CMP   AL, [EDi+ECx]
 JNE   @@SkipBTest

@@CWs_2:
 Test  ECx, 2
 Jz    @@CWs_4
 Sub   ECx, 2
 MOV   AX, [ESi+ECx]
 CMP   AX, [EDi+ECx]
 JNE   @@SkipBTest

@@CWs_4:
 Test  ECx, 4
 Jz    @@CWs_8
 Sub   ECx, 4
 MOV   EAX, [ESi+ECx]
 CMP   EAX, [EDi+ECx]
 JNE   @@SkipBTest

@@CWs_8:

@@CW_Loop:
 SUB   ECX, 8
 JL    @@Constant_Exists
 MovQ     MM3,  [ESi+ECx]
 MovQ     MM2,  [EDi+ECx]
 PCMPEQB   MM3,  MM2
 PACKSSWB MM3,  MM3
 MovD  EAX, MM3
 Cmp   EAX, -1
 JE   @@CW_Loop

@@SkipBTest:
 Mov   ECx, EDx
 Cmp   EDx,4
 Jg    @@Scan
 Jmp   @@LastDWord

@@Constant_Exists:
 Pop   EAx
 Sub   EAx, EDx



Страницы: 1 2 3 4 5 6 7 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 1.1 MB
Время: 0.066 c
1-1096054352
Dimaxx
2004-09-24 23:32
2004.10.24
Поиск в бинарном файле


14-1096547992
aleshap
2004-09-30 16:39
2004.10.24
Таблица - Grid


1-1097473055
Alekzzzz
2004-10-11 09:37
2004.10.24
Иконка из exe


14-1096651198
quickblack
2004-10-01 21:19
2004.10.24
Кто знает, когда выйдет новый виндоус


4-1095502259
banderas
2004-09-18 14:10
2004.10.24
Alt+F4?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский