Google ΠΈ Binomial ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ ΠΊΠΎΠ΄ систСмы сТатия тСкстур Basis Universal

Компании Google ΠΈ Binomial ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ исходныС тСксты Basis Universal, ΠΊΠΎΠ΄Π΅ΠΊΠ° для эффСктивного сТатия тСкстур ΠΈ связанного с Π½ΠΈΠΌ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° «.basis» для распространСния тСкстур Π½Π° Π±Π°Π·Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ. Код эталонной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ написан Π½Π° языкС Π‘++ ΠΈ поставляСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Apache 2.0.

Basis Universal дополняСт Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΡƒΡŽ систСму сТатия 3D-Π΄Π°Π½Π½Ρ‹Ρ… Draco ΠΈ пытаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с поставкой тСкстур для GPU. Π”ΠΎ сих ΠΏΠΎΡ€ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ высокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ спСцифичными для GPU ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌΠΈ ΠΌΠ½ΠΎΠ³ΠΎ мСста Π½Π° дискС, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с GPU-тСкстурами ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Basis Universal позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ уровня Ρ€ΠΎΠ΄Π½Ρ‹Ρ… для GPU тСкстур, Π½ΠΎ обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сТатия.
Basis являСтся ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ быстроС ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ тСкстур GPU, примСняСмых ΠΊΠ°ΠΊ Π½Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… систСмах, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройствах. Π’ настоящСС врСмя поддСрТиваСтся трансляция Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ PVRTC1 (4bpp RGB), BC7 (Ρ€Π΅ΠΆΠΈΠΌ 6 RGB), BC1-5, ETC1, ΠΈ ETC2. Π’ дальнСйшСм оТидаСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ASTC (RGB ΠΈΠ»ΠΈ RGBA) ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² 4/5 RGBA для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° BC7 ΠΈ 4bpp RGBA для PVRTC1.

Google ΠΈ Binomial ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ ΠΊΠΎΠ΄ систСмы сТатия тСкстур Basis Universal

ВСкстуры Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ basis Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π² 6-8 Ρ€Π°Π· мСньшС видСопамяти ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Π΄Π²Π° Ρ€Π°Π·Π° мСньшС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ тСкстуры Π½Π° основС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° JPEG ΠΈ Π½Π° 10-25% мСньшС, Ρ‡Π΅ΠΌ тСкстуры Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ RDO. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ JPEG-изобраТСния Π² 891 Кб, Π° тСкстуры ETC1 Π² 1 Мб, Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Basis составляСт 469 Кб Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠ΅Π³ΠΎ качСства. ΠŸΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ тСкстуры Π² видСопамяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² тСстах тСкстуры Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JPEG ΠΈ PNG израсходовали 16 Мб памяти, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ для тСкстур Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅
Basis ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ 2 Мб памяти Π² случаС трансляции Π² BC1, PVRTC1 ΠΈ ETC1, ΠΈ 4 Мб Π² случаС трансляции Π² BC7.

Google ΠΈ Binomial ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ ΠΊΠΎΠ΄ систСмы сТатия тСкстур Basis Universal

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Basis Universal достаточно прост. Достаточно ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ тСкстуры ΠΈΠ»ΠΈ изобраТСния Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ прСдоставляСмой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ «basisu», Π²Ρ‹Π±Ρ€Π°Π² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ качСства. Π”Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠ΄ΠΎΠΌ отрисовки Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ basisu, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ GPU Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ΠŸΡ€ΠΈ этом изобраТСния Π½Π° всСй Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ сТатыми, Π² Ρ‚ΠΎΠΌ числС Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² сТатом Π²ΠΈΠ΄Π΅ Π² GPU. ВмСсто ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ пСрСкодирования изобраТСния Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, GPU Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ части изобраТСния.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ сохранСниС Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π½Π΅ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… массивов тСкстур (cubemap), ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹Ρ… тСкстур, массивов тСкстур, ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ mipmap, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Ρ€Ρ‹Π²ΠΊΠΎΠ² тСкстур. НапримСр, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ сСрии ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для создания Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ»ΠΈ объСдинСниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тСкстур с использованиСм ΠΎΠ±Ρ‰Π΅ΠΉ для всСх ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΈ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… шаблонов ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. РСализация ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Basis Universal ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с использованиСм OpenMP. ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ доступСн Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Basis Universal для Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ², поставляСмый Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ WebAssembly, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² web-прилоТСниях Π½Π° Π±Π°Π·Π΅ WebGL. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счётС, Google Π½Π°ΠΌΠ΅Ρ€Π΅Π½ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈ Basis Universal Π²ΠΎ всСх основных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π² качСствС пСрСносимого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° тСкстур для WebGL ΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ спСцификации WebGPU, ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ схоТСй с API Vulkan, Metal ΠΈ Direct3D 12.

ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ встраивания Π²ΠΈΠ΄Π΅ΠΎ с Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сторонС GPU Π΄Π΅Π»Π°Π΅Ρ‚ Basis Universal интСрСсным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для создания динамичСских интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° WebAssembly ΠΈ WebGL, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ сотни Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²ΠΈΠ΄Π΅ΠΎ с минимальной Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½Π° CPU. Π”ΠΎ появлСния возмоТности использования инструкций SIMD Π² WebAssembly ΠΏΡ€ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΊΠΎΠ΄Π΅ΠΊΠ°Ρ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΊΠ° нСдостиТим, поэтому Π²ΠΈΠ΄Π΅ΠΎ Π½Π° основС тСкстур ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² областях, Π³Π΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ. Π’ настоящСС врСмя готовится ΠΊ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ оптимизациями для Π²ΠΈΠ΄Π΅ΠΎ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования I-ΠΊΠ°Π΄Ρ€ΠΎΠ² ΠΈ P-ΠΊΠ°Π΄Ρ€ΠΎΠ² с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ заполнСния (CR).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru