Китайський часофон AN1 Smart Watch

    Box
 
Здравствуйте, любителі китайських і не дуже гаджетів. Упевнений, багатьом набрид цей нескінченний потік безликих планшетів, тим більше, наприклад, компанії на зразок гугла підтискають цінову та якісну планки своїми Nexus, роблячи придбання чергового китайського ноу-нейм планшета сумнівною витівкою.
Гарантую — в даному огляді планшетів не буде. Поки всі з нетерпінням чекають нової хвилі носяться гаджетів, а саме «розумних годин» від компаній Apple, Motorola, LG та інших, китайці не стали довго тягнути і в терміновому порядку випустили свою версію розумних годин, зразок яких і потрапив до мене в руки.
 
Зустрічайте, 100% ноу-нейм часофон — SmartWatch AN1.
 Спойлер: в кінці огляду він буде хакнутим.
 
 

Історія

Якщо ви коли-небудь робили огляд чого-небудь на Хабре, то будьте впевнені — рано чи пізно вам постукають в личку добрі китайці і запропонують розповісти Хабре про той чи інший гаджет, причому вибір-то ого-го який широкий: крім планшетів, як відомо, на їх сумовитих складах ніяких корисних предметів для айтішника немає. А китайські планшети оглядати, тим більше на Хабре — справа неблагородне, починаючи з 2012 року.
Але цього разу фартануло: мила дівчина запропонувала мені подивитися на їх розумні годинник і, якщо зацікавлять, зробити огляд. Зрозуміло, адже тема носяться гаджетів мене хвилює давно, а тут такий випадок випав оцінити китайський підхід. 23 квітня відправлено через Сінгапур, 19 травня на нашій пошті, досить спритно. Більшість фотографій клікабельні.
 
 Parcel
 Figure 1. Добре вони заповнили декларацію. Сподіваюся, вміст
заповітної коробочки потягне на більше, ніж MP4 плеєр за $ 0.06.

 
 

Комплект і характеристики

З характеристиками дивна ситуація: на сайтах магазинів, на коробці, і на ділі характеристики відрізняються.
                              
OS Android 4.0.4, на коробці і в прошивці значиться 4.1.1
Процесор 1GHz, Single Core, MT6515 ARMv7, графіка: OpenGL ES 1.1, PowerVR SGX 531, AnTuTu score: 5855
Пам'ять 512M RAM, 4GB NAND (розмітка така, що доступно близько 512M — навпіл на / system і / data)
Екран 2 ", 320x240, ємнісний TFT (5 точок)
Зв'язок GSM, EDGE, GPS, FM, Bluetooth 3.0, WiFi b / g / n (чип MT6628 )
Слоти і порти microUSB, microSD, SIM
Габарити 60 x 41 x 15, 72г з батареєю (900mAh, Lithium, 3.7V)
Специфікація на коробці Box fake spec
 Дамп build.prop
# begin build properties
# autogenerated by buildinfo.sh
ro.build.id=IMM76D
ro.build.display.id=ALPS.ICS2.MP.V1.18
ro.build.version.incremental=eng.lt.1395940871
ro.custom.build.version=1395940871
ro.build.version.sdk=15
ro.build.version.codename=REL
ro.build.version.release=4.1.1
ro.build.date=Fri Mar 28 01:23:10 CST 2014
ro.build.date.utc=1395940990
ro.build.type=user
ro.build.user=lt
ro.build.host=ubuntu
ro.build.tags=test-keys
ro.product.model=AN1
ro.product.brand=XINGHAN
ro.product.name=F9-2S
ro.product.device=F9-2S
ro.product.board=XINGHAN
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=XH_F9
ro.product.locale.language=zhr
ro.product.locale.region=CN
ro.wifi.channels=
ro.board.platform=
# ro.build.product is obsolete; use ro.product.device
ro.build.product=F9-2S
# Do not try to parse ro.build.description or .fingerprint
ro.build.description=fise15_ics2-user 4.0.4 IMM76D eng.lt.1395940871 test-keys
ro.build.fingerprint=alps/fise15_ics2/fise15_ics2:4.0.4/IMM76D/1395940871:user/test-keys
ro.build.flavor=
ro.build.characteristics=default
persist.sys.timezone=Asia/Shanghai
# end build properties

# begin mediatek build properties
ro.mediatek.version.release=ALPS.ICS2.MP.V1.18
ro.mediatek.platform=MT6575
ro.mediatek.chip_ver=S01
ro.mediatek.version.branch=ALPS.ICS2.MP
# end mediatek build properties
#
# system.prop for generic sdk
#

rild.libpath=/system/lib/mtk-ril.so
rild.libargs=-d /dev/ttyC0


# MTK, Infinity, 20090720 {
wifi.interface=wlan0
# MTK, Infinity, 20090720 }

# MTK, mtk03034, 20101210 {
ro.mediatek.wlan.wsc=1
# MTK, mtk03034 20101210}
# MTK, mtk03034, 20110318 {
ro.mediatek.wlan.p2p=1
# MTK, mtk03034 20110318}

# MTK, mtk03034, 20101213 {
mediatek.wlan.ctia=0
# MTK, mtk03034 20101213}


# MTK, TeChien {
ro.media.enc.hprof.file.format=3gp
ro.media.enc.hprof.codec.vid=m4v
ro.media.enc.hprof.vid.width=720
ro.media.enc.hprof.vid.height=480
ro.media.enc.hprof.vid.fps=30
ro.media.enc.hprof.vid.bps=3400000
ro.media.enc.hprof.codec.aud=amrnb
ro.media.enc.hprof.aud.bps=12200
ro.media.enc.hprof.aud.ch=1
ro.media.enc.hprof.aud.hz=8000

ro.media.enc.mprof.file.format=3gp
ro.media.enc.mprof.codec.vid=m4v
ro.media.enc.mprof.vid.width=352
ro.media.enc.mprof.vid.height=288
ro.media.enc.mprof.vid.fps=30
ro.media.enc.mprof.vid.bps=990000
ro.media.enc.mprof.codec.aud=amrnb
ro.media.enc.mprof.aud.bps=12200
ro.media.enc.mprof.aud.ch=1
ro.media.enc.mprof.aud.hz=8000

ro.media.enc.lprof.file.format=3gp
ro.media.enc.lprof.codec.vid=h263
ro.media.enc.lprof.vid.width=176
ro.media.enc.lprof.vid.height=144
ro.media.enc.lprof.vid.fps=30
ro.media.enc.lprof.vid.bps=384000
ro.media.enc.lprof.codec.aud=amrnb
ro.media.enc.lprof.aud.bps=12200
ro.media.enc.lprof.aud.ch=1
ro.media.enc.lprof.aud.hz=8000
# MTK, TeChien }

#
wifi.tethering.interface=ap0
#

ro.opengles.version=131072

wifi.direct.interface=p2p0
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=128m


# Encrypt phone function
ro.crypto.tmpfs_options=mode=0771,uid=1000,gid=1000
ro.crypto.fs_type=ext4
ro.crypto.fs_real_blkdev=/emmc@usrdata
ro.crypto.fs_mnt_point=/data
ro.crypto.fs_options=noauto_da_alloc
ro.crypto.fs_flags=0x00000406

# audio
ro.camera.sound.forced=0
ro.audio.silent=0

# USB Config Type
ro.sys.usb.storage.type=mtp,mass_storage

# USB MTP WHQL
ro.sys.usb.mtp.whql.enable=0

# Power off opt in IPO
sys.ipo.pwrdncap=2

ro.sys.usb.storage.type=mtp,mass_storage

#
# ADDITIONAL_BUILD_PROPERTIES
#
fmradio.driver.chip=3
ril.external.md=1
ro.sf.hwrotation=0
ril.current.share_modem=1
launcherplus.allappsgrid=2d
launcher2.allappsgrid=3d_20
curlockscreen=2
ro.mediatek.gemini_support=false
drm.service.enabled=true
fmradio.driver.enable=1
mediatek.wlan.chip=MT6628
mediatek.wlan.module.postfix=_mt6628
dalvik.vm.mtk-stack-trace-file=/data/anr/mtk_traces.txt
ro.config.notification_sound=OnTheHunt.ogg
ro.config.alarm_alert=Alarm_Classic.ogg
ro.config.ringtone=Backroad.ogg
net.bt.name=Android
dalvik.vm.stack-trace-file=/data/anr/traces.txt

 Специфікація NAND image
 Розмітка NAND
[PART] blksz: 2048B
[PART] [0x0000000000000000-0x000000000003FFFF] "PRELOADER" (128 blocks)
[PART] [0x0000000000040000-0x00000000000FFFFF] "DSP_BL" (384 blocks)
[PART] [0x0000000000100000-0x00000000003FFFFF] "NVRAM" (1536 blocks)
[PART] [0x0000000000400000-0x000000000041FFFF] "SECCNFG" (64 blocks)
[PART] [0x0000000000420000-0x000000000047FFFF] "UBOOT" (192 blocks)
[PART] [0x0000000000480000-0x000000000097FFFF] "BOOTIMG" (2560 blocks)
[PART] [0x0000000000980000-0x0000000000E7FFFF] "RECOVERY" (2560 blocks)
[PART] [0x0000000000E80000-0x0000000000F9FFFF] "SECSTATIC" (576 blocks)
[PART] [0x0000000000FA0000-0x0000000000FFFFFF] "MISC" (192 blocks)
[PART] [0x0000000001000000-0x00000000012FFFFF] "LOGO" (1536 blocks)
[PART] [0x0000000001300000-0x000000000139FFFF] "EXPDB" (320 blocks)
[PART] [0x00000000013A0000-0x000000000FE9FFFF] "ANDSYSIMG" (120320 blocks)
[PART] [0x000000000FEA0000-0x0000000011C9FFFF] "CACHE" (15360 blocks)
[PART] [0x0000000011CA0000-0x0000000011C9FFFF] "USER" (0 blocks)

Для довідки: процесор MT6515 є абсолютним двійником MT6575 , відмінність лише у відсутності 3G у 6515. MT6575 вийшов в 2011 році, а на ринок потрапив до початку 2012. Операційна система AN1 всюди вказана як Android 4.1.1, навіть в прошивці, але за фактом там стоїть Android 4.0.4 ICS, який вийшов у 2012 ж році.
 
Девайс поставляється в 5 різних кольорах: чорна, біла, рожева, золота з білим, золота з чорним. Як бачите, мої шанси отримати на огляд девайс нормального кольору становили 20%. З іншого боку, шанси отримати саме рожевий такі ж, тому я безмежно вдячний за золотий. SWAG!
 
 image
 Figure 1. Влітку рука буквально кипить під ними.
 
awolf:
ппц, нафіг ВОНО тобі взагалі
тільки не кажи що зібрався використовувати як годинник
ним же вбивати можна
 
xlab:
Це годинник, як їх ще використовувати
Чи не дрова ж колоти
хоча стривайте-ка…
 PackageManual
 Figure 2-3. Стандартне вміст коробки: сабж, навушники, провід, блок живлення, інструкція на ламаній англійській.
 
 CapCap2
 Figure 4-5. Кнопка Vol +, кнопка back, пластикова кришечка usb, динамік, видно дірку для камери
 
Кришечка для usb складається з твердого пластика, відразу ж почала відходити і стала абсолютно марною — довелося видалити. Ремінець зроблений з силікон-гуми, затягує добре (при бажанні, можна накласти джгут).
 
 Buttons 2Battery
 Figure 6-7. Кнопка home, кнопка power з іншого боку корпусу. Батарея знімається дуже легко, під нею розташовані слоти для карт microSD і SIM.
 
Роз'єм audio jack відсутня, в комплекті йшли навушники microUSB, вони ж виступають в якості антени для FM-радіо. Краще застосування — відрізати половину, а залишився шматок дроту використовувати як антену, радіо при цьому буде працювати через динамік.
 
 103Nikolay
 Figure 8-9. Носиться на зап'ясті музична шкатулка умовного дяді Васі.
 
 DisplayCWM
 Figure 10-11. Екран TFT ледве тягне, але все добре видно. Найкраще, звичайно, вночі.
 
Екран поводиться як будь-який подібний з сімейства TFT — під різними кутами інвертує кольори, на сонці його видно погано, є зернистість, плями засветов. Насчет TTX не знаю. Підсвічування відрегулювати не можна.
 
 image
 Figure 12. SWAAAAG!
 
 

Ціна і наявність

Ніяких купонів і реф-посилань у мене для вас немає, а ціна на мій погляд, кусюча — 4300руб. Купити дану модель можна в TinyDeal (там же є й інші моделі нормальних квітів, на чорний навіть варто знижка). На DealExtreme вказані невірні характеристики з коробки і на фотографіях у годинника переплутано верх і низ, так що туди я посилань не дам. Нехай навчаться вивчати свій товар.
 
 

Софт і прошивка

Як я вже писав вище, на девайсі варто Android 4.0.4. Перевірити це просто: по-перше, можна подивитися дамп build.prop (під таблицой характеристик) і знайти індентіфікатор збірки
ALPS.ICS2.MP.V1.18
, по-друге, можна кілька разів ткнути по рядку з 4.1.1 в налаштуваннях і зловити пасхалка від 4.0.x:
 
 abouteaster
 Figure 13-14. About Phone.
 
Прошивка є практично AOSP, з невеликими модифікаціями в бік зменшення ваги і зручності використання на екрані 2 ". Стандартний андроїд — ні більше, ні менше. Далі будуть лише обрані скріншоти.
 
 lockhome
 Figure 14-15. Екран блокування і робочий стіл (встановив годинник MIUI ).
 
 apps1apps2apps3
 Figure 16-18. 3 екрану вбудованих додатків. Крім SuperSU.
 
З вбудованих додатків можна відзначити наступні:
 
     
Dialer 2 — альтернативна стандартної звонилка, коректно відображається на екрані 2 ", скріншоти на Fig. 19-20;
 File Manager — зручний проводничок, вміє бачити приховані файли і відкривати файли з карти у відповідних додатках;
 CameraMX — стороннє багатофункціональний додаток як фотокамера, скріншот на Fig. 23. Приклади фото ви не хочете бачити;
 One Shot — при запуску відкриває CameraMX і без питань робить знімок. Шпигунська фіча;
 Sound Recorder — зручний у використанні диктофон, пише в. amr. Шпигунська фіча;
 Іконка з ієрогліфами — секундомір, скріншот на Fig. 24. Коли я дістав девайс з коробочки, там було встановлено більше додатків з аналогічними назвами і ще більш стремним вмістом, але після скидання всіх даних вони кудись поділися, а значить не були вбудованими;
 
 
 listussd
 Figure 19-20. Зовнішній вигляд і зручність звонилки мені безумовно подобаються.
 
 incomingoutgoing
 Figure 21-22. Вхідний дзвінок і вихідний.
 
 cameraMXtimer
 Figure 23-24. CameraMX з платними фільтрами (in-app purchases). Якась подоба секундоміра (з банером).
 
 smscontacts
 Figure 25-26. Повідомлення й контакти.
 
 emailmail
 Figure 26-27. Поштове додаток. До речі, можна використовуватися на повному серйозі — перевіряти повідомлення дуже зручно.
 
 browsertabs
 Figure 28-29. Браузер. Не дивлячись на розміри екрана, тачскрін виконує свою функцію на рідкість добре.
 
Браузер працює плавно, полотно масштабується без гальм, відео відкривається прямо на сторінці або в окремому додатку, коротка демонстрація в ролику нижче.
 
  
Автор огляду не має відношення до відео.
 
 gallerymusic
 Figure 30-31. Галерея і музика. Музичне додаток коректно працює навіть с. M4a з iTunes.
 
Вбудованого Google Play немає, мабуть заради економії місця і для позбавлення від google-зондів. Установка GApps вручну можлива, тільки слід врахувати, що версія android — 4.0.4 і SDK — 15. На / system розділі місця мало, слід ставити вибірково. Я не фанат сервісів google у своїх годиннику , тому вирішив, що обійдуся форумом 4PDA і Яндекс.Store.
 
 storestatus
 Figure 32-33. Yandex.Store, коректно працює на 2 ". Статус встановлюваних додатків (все як завжди).
 
 pdfmaps
 Figure 34-35. Читання PDF (з продуктивністю нормально, але на 2 "320x240 — збочення). Картки.
 
 agpsgps
 Figure 35-36. Є підтримка A-GPS. Тест GPS пройшов гладко — супутники швидко знайшлися, хоча я був усередині кімнати біля вікна.
 
Що стосується програвання відео, то тут MK6575 явно не тягне. Зразок дозволу 720x304 йшов з помітними лагами в стандартному відеоплеєрі, VLC і MX Player (при активному HW Decoding). Тому, при необхідності подивитися кіно на годиннику, слід сконвертировать попередньо під дозвіл екрана (320x240). Тільки слід врахувати, що при активному використання ресурсів CPU / GPU батарея тримає близько 2-3х годин.
 
 powerimage
 Figure 37-38. Споживання батареї в режимі очікування (залишені на ніч). Бенчмарк CPU / GPU в AnTuTu.
 
 

Трохи Фрікінг

Перш ніж творити непотребства з прошивкою і тушкою годинникофона, слід обзавестися дампами NAND, поки девайс ще живий. Насамперед потрібно рутануть систему, якщо ви ще не зробили це — особисто я рутанул як тільки дістав з коробки. Framaroot відмінно справляється зі своїм завданням.
 
 imagerequest
 Figure 39-40. SuperSU встановлений, запит доступу працює.
 
Тепер слід скористатися кухнею Mtk Droid Tools , створеної нашим співвітчизником.
 
 mtktools
Скористаємося опцією Backup (1) для копіювання блоків з усіх розділів NAND. Опція (2) перепакует викачані блоки у формат, що сприймається SP Flash Tool. Опція (3) автоматично генерує і прошиває CWM recovery . Кнопкою входу в режим recovery є VolUp, досить просто утримувати її при включенні пристрою і до появи CWM.
 
Процес завантаження всього сімейства MTK, а mt6575 зокрема, протікає так: preloader -> uboot -> kernel. Відповідно, preloader робить початкову ініціалізацію, читає розмітку NAND і здійснює стрибок за адресою uboot. Залежно від причини включення (звичайне, застромлять кабель, ...), uboot продовжує завантаження чи ні. Preloader відповідає за отрисовку індикації заряду і логотипу, поки uboot вирішує, що йому робити.
 
Preloader також відповідає за прошивку NAND за допомогою утиліти SP Flash Tool , яка використовується, грубо кажучи, китайцями на заводі. У більш старих моделях Mediatek, прошивка проводилася через UART, проте в нашому випадку все відбувається швидко і через USB.
 Інтерфейс SP Flash Tool image
Для прошивки частин NAND слід вимкнути пристрій, натиснути «Download» і підключити кабель. Під час підключення кабелю Preloader виявляти програмою і починається процес. Всі частини автоматично чіпляються з scatter-файла, сгенерированном в MTK Droid Tools (MT6575_Android_scatter.txt). Однак, опис розмітки NAND має повністю співпадати з фактичною розміткою на пристрої. У випадку розбіжності програма безпечно повідомить про помилку і напише в лог, що саме не співпало.
 Актуальна розмітка NAND у Smart Watch AN1 (взято з логу UART)
part PRELOADER size 0 40000
part DSP_BL size 40000 C0000
part __NODL_NVRAM size 100000 300000
part __NODL_SECCFG size 400000 20000
part UBOOT size 420000 60000
part BOOTIMG size 480000 500000
part RECOVERY size 980000 500000
part SEC_RO size E80000 120000
part __NODL_MISC size FA0000 60000
part LOGO size 1000000 300000
part __NODL_EXPDB size 1300000 A0000
part ANDROID size 13A0000 EB00000
part __NODL_CACHE size FEA0000 1E00000
part USRDATA size 11CA0000 D920000

Таким чином, при наявності бекапів і поки живий preloader — пристрій є невбиваним. У разі ж запороти preloader, в mt65xx є спеціальний meta-mode , поки не довелося його перевіряти (на щастя), але цей режим викликається шляхами або а) затискання VolUp при підключенні usb кабелю, або б) замикання спеціального тест-пина на землю.
 
І тут я не витримав.
 
 f9-s2
+ часткове фото зворотної сторони (там немає нічого цікавого).
 
Чим дешевше зроблений девайс, тим простіше його розбирати. Корпус був скріплений 8ю абсолютно однаковими хрестовими гвинтами, після вигвинчування яких він розпався сам собою (собою). Всередині, як виявилося, не використовуються традиційний термоклей або яка-небудь жовта ізолента. Вся перефирія акуратно розкладена по поличках і притиснута корпусом зверху. На цій же стороні A розташовуються всі цікавлять нас Піни. По-перше, судячи з аналогічного наприклад для mk6577 , що активує meta-mode пін знаходиться праворуч у кутку і маркований як KCOLO . По-друге, маються Піни tx4 , rx4 , tx1 , rx1 , хтось із них явно відповідає за UART. Методом тику з'ясувалося, що tx1 і rx1 в правому нижньому кутку.
 
 uart wiringsurgery
 
Батарею можна підрізати ножиком і тоді проводочки від UART виведуться без перешкод батареї. Тепер до такого НЕХ на руці ще більше питань у оточуючих.
 
Рядок завантаження ядра a.k.a. param line:
console=tty0 console=ttyMT0,921600n1 root=/dev/ram nand_manf_id=0xad nand_dev_id=0xbc uboot_ver=2010.06 uboot_build_ver=MAIN2.2.ubt.2274 lcm=1-nt35582_mcu_6575 fps=4732
, а значить minicom потрібно налаштувати на baudrate 921600. Мій pl2303 з кварцом начебто справляється. Після завантаження спілкуватися з uart tx / rx можна через / dev/ttyMT0 і ніщо не буде цьому перешкоджати.
 
     
Лог завантаження в режимі preloader (після підключення кабелю): http://pastebin.com/9Qe9H9Z6
 Лог завантаження в стандартному режимі (після натискання кнопки power): http://pastebin.com/0XtVkSzj
 
Отриманий висновок допоміг у розумінні процесів mk65xx і надалі сильно стане в нагоді при налагодженні кастомних збірок ядра / uboot, якщо буде не лінь.
 
Подальший хакинг можна робити в режимі любителя (налагодження та кастомизация прошивки, поки пристрій морально не застаріє) або в режимі гуру — спробувати склеїти наявні вихідні коди в один пазл і сборать AOSP 4.1 + наприклад. До речі, вихідні коди до SoC mk65xx є у відкритому доступі. Різні компанії викладають вихідні коди прошивок, дотримуючись GPL, але заодно у них виходить злити ті чи інші конфіденційні частини, що належать Mediatek. Репозиторії на GitHub точково видаляються по DMCA, але на 4PDA лежать безсмертні архіви: http://4pda.ru/forum/index.php?showtopic=535287 . Особливим ентузіазмом в сторону mt65xx відрізняються наші співвітчизники, наприклад luckasfb , почесний форумчанин 4PDA і любитель збирати кастомниє прошивки для сімейства mt65xx з утекших початкових кодів. Я найближчим часом трохи глибше перевірю ситуацію для MT6575, оскільки Android 4.1 дозволить використовувати новий Google Search з розпізнаванням російської мови і, зокрема, незрівнянного асистента Дусю прямо на годиннику на руці.
 
 

Підсумки

Бренд і виробника знайти не вдалося, в мітках і відбитках миготить XINGHAN, нічого путнього нагугліть не вийшло. Як і модель — F9-2S. Пристрій зроблено в період жовтень 2013 — березень 2014 року, у продаж надійшло в квітні 2014. Загальна якість відрізняється винятковою економією на всьому. Платформа і OS — кінця 2011ого.
Все це походить на якийсь експеримент малого тиражу і з великою, в наслідок цього, ціною. Ще й зі спробами обдурити рядового покупця.: <
 
З іншого боку, хай вибачать мене любителі гігагерц ядра і мегабайт оперативки, ці характеристики не є першочерговими. Система працює відчутно швидко (краще, ніж на деяких телефонах, які мені доводилося мацати), браузер гортає плавно, швидкість Wi-Fi звичайна (у мене в мережі до 15MBit / s), батареї вистачає на перегляд часу протягом усього дня. У кожному разі, відео дивитися чи книжки читати на наручних годинниках — це можна лікоть лівої руки пошкодити.
 
І, нарешті, найголовніша складова для мене — це хакабельность пристрою. За шкалою хакабельності Smart Watch AN1 заслуговують тверду 8/10 , де 0 за шкалою — це Geeksphone Peak (огляд я робив рівно рік тому, до речі), а 10 за шкалою — це SoC Allwinner A10 і все що з ним пов'язано.
 
 
Це прозвучить нерозумно, але я боюся годин. Вони цокає. І проникають у мозок.
-Денніс Лехейн. Острів проклятих.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.