ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π²ΡΠΏΡΡΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libmdbx 0.13.7 (MDBX) Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠΉ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΠ΄ libmdbx ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ Apache 2.0. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π²ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡΡΠΈΠΉΡΠΊΠΈΠΉ ΠΠ»ΡΠ±ΡΡΡ 2000. ΠΠ»Ρ libmdbx ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΡΠ°Π·Π²ΠΈΡΠΎΠ΅ API Π΄Π»Ρ C++, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ½ΡΡΠ·ΠΈΠ°ΡΡΠ°ΠΌΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΡΠ·ΡΠΊΠ°ΠΌ Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala. ΠΠ· ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ libmdbx, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ Isar, Erigon ΠΈ Reth, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ StarkWare ΠΈ Positive Technologies.
ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ libmdbx ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»ΡΠ±ΠΎΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π‘Π£ΠΠ LMDB ΠΈ ΠΏΡΠ΅Π²ΠΎΡΡ ΠΎΠ΄ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠ°ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈ, Π½Π°Π±ΠΎΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ LMDB, Π² libmdbx Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Ρ ΠΊΠΎΠ΄Π°, ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ API, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌ. ΠΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΡΠΈΠ»ΠΈΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΠ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ libmdbx ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ACID, ΡΡΡΠΎΠ³ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΌ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠ΄ΡΠ°ΠΌ Π¦ΠΠ£. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π°Π²ΡΠΎΡΠΏΠ»ΠΎΡΠ½Π΅Π½ΠΈΠ΅, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΠ, ΠΎΡΠ΅Π½ΠΊΠ° ΠΎΠ±ΡΡΠΌΠ° Π²ΡΠ±ΠΎΡΠΎΠΊ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ (range query estimation).
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
- Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ mdbx_env_resurrect_after_fork() ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ SysV-ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΡΠΎΡΠ²Π»ΡΠ»Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ fork() Π½Π° ΡΠΎΠ½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΉΡΡ ΠΏΠΈΡΡΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π½Π΅Π²Π΅ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² ΠΈ Π΄Π°Π»Π΅Π΅ ΠΊ ΡΠ°ΠΌΡΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ, Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΠ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»Π° Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ mdbx_env_resurrect_after_fork() ΠΈ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π»Π° macOS, Π° ΡΠ°ΠΊΠΆΠ΅ POSIX-ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ MDBX_LOCKING=5.
- Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² API ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΠ, ΠΏΡΠΎΡΠ²Π»ΡΠ²ΡΠ°ΡΡΡ Π½Π° ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ Linux ΡΠΈΡΡΠ΅ΠΌΠ°Ρ POSIX (Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π² macOS), Π° ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π° Π½Π΅-Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ EWOULDBLOCK/EAGAIN, ΡΡΠΎ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΎΠΌ/ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ fcntl(F_SETLK) ΠΈ flock() Π² ΡΠ΄ΡΠ΅ ΠΠ‘. ΠΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠ°Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π·Π°Ρ Π²Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π² API ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ POSIX.
- Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ²ΡΠ°Ρ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΡ MDBX_BAD_DBI ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΡΡΠ°ΡΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΊΡΡΡΠΈΡ ΠΠ.
- Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ²ΡΠ°Ρ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΡ MDBX_DBS_FULL ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠΆΠ΅ ΠΎΡΠΊΡΡΡΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΡΠΆΠ΅ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠΎΠΌ Π»ΠΈΠΌΠΈΡΠ΅ ΠΎΡΠΊΡΡΡΡΡ DBI-Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ².
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ±ΠΎΡΠΊΠΈ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Android ΠΏΡΠΈ ΡΠ²Π½ΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ _FILE_OFFSET_BITS.
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ENOMEM Π²ΠΌΠ΅ΡΡΠΎ MDBX_ENOMEM. Π§ΡΠΎ ΠΌΠΎΠ³Π»ΠΎ Π»ΠΎΠΌΠ°ΡΡ ΡΠ±ΠΎΡΠΊΡ Π½Π° Π½Π΅-POSIX/Windows ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ , Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ/ΠΈΠ»ΠΈ Π²Π΅ΡΡΠΈΠΈ SDK.
- ΠΠΎΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π»ΠΈΠ±ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π²Π΅ΡΠ½ΡΡ assert-ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΠΈΠ·-Π·Π° ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΡΠ±ΠΎΡΠΎΠΊ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ . ΠΠ»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΠΊΠΎΠ΄Π΅ ΡΡΠ½ΠΊΡΠΈΠΉ txn_end(), txn_lock() ΠΈ txn_unlock() ΠΊΠ°ΠΊ Π½Π° Windows, ΡΠ°ΠΊ ΠΈ Π½Π° POSIX.
- Π£ΡΡΡΠ°Π½Π΅Π½Ρ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ MSVC. ΠΡΠΊΠ»ΡΡΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ C5286 ΠΈ C5287.
- ΠΠΎΡΠ°Π±ΠΎΡΠ°Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΡΠΊΠ°Π·Π° ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ OFD-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π½Π° POSIX-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ . Π’Π΅ΠΏΠ΅ΡΡ ΠΊΡΠΎΠΌΠ΅ EINVAL ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΎΠΊ (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΄ΡΠΎ/ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ/ΡΠΌΡΠ»ΡΡΠΎΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
- Π ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΠΏΡΠΈΠΈ Β«βnuma <num>Β» Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΡΡΠΎΡ Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ° ΠΊ NUMA-ΡΠ·Π»Ρ. Π battery/tmux-ΡΠΊΡΠΈΠΏΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΡΠ²Π½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ NUMA-ΡΠ·Π»Π°ΠΌ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ»ΠΎ ΠΠΠ ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° NUMA-ΠΌΠ°ΡΠΈΠ½Π°Ρ .
- Π ΡΡΠΎΡ Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠΊΡΠΈΠΏΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ².
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
