bug 1019660 - add Turkish configs for Yandex custom builds, a=mconnor FIREFOX_31_0b3_BUILD1 FIREFOX_31_0b3_RELEASE
authorGluk <gluk@yandex-team.ru>
Tue, 03 Jun 2014 14:45:57 +0400
changeset 565 ce057cd010371c2926b44a003515e5a8f7a7fd3e
parent 564 da94a6ec816ff659f88b218fc11050c29c37a7f5
child 566 1896bf83736c81504f009e6699a1b2d3eb37c4b5
push id463
push usermconnor@mozilla.com
push dateTue, 17 Jun 2014 18:41:10 +0000
reviewersmconnor
bugs1019660
bug 1019660 - add Turkish configs for Yandex custom builds, a=mconnor
partners/yandex-tr-gezginler/distribution/distribution.ini
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/META-INF/manifest.mf
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/META-INF/zigbert.rsa
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/META-INF/zigbert.sf
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/app.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/aboutSupport.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonStatus.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonfs.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonmgr.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/backgroundImages.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/backup.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/barnavig.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/blacklist.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/bookmarks.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/branding.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/clids.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/cloudsource.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/colors.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/databaseMigration.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/dataprovider.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/fastdial.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/favicons.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/frontendHelper.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/installer.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/internalStructure.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/layout.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/metrika.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration/install.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration/l-2_0.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration/l-2_12.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration/l-2_3.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/migration/l-2_9.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/package.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/protocolSupport.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/safebrowsing.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/screenshots.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/screenshotsGrabber.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/searchExample.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/searchSuggest.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/strbundle.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/sync.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/syncPinned.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/syncTopHistory.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/thumbs.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/usageHistory.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/workers/barnavig.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/ycookie.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/chrome.manifest
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/chrome/yandex-vb.jar
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/components/core.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/config.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/defaults/preferences/yandex-vb.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/defaults/vendor/vendor.xml
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/install.rdf
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/AddonManager.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/DataURI.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/Foundation.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/Log4Moz.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/Preferences.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/SimpleHTMLParser.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/SimpleProtocol.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/Stemmer.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/WinReg.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/WindowListener.jsm
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/async.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/database.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/ecustom.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/fileutils.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/misc.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/netutils.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/patterns.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/promise.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/strutils.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/sysutils.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/task.js
partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/modules/foundation/xmlutils.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/META-INF/manifest.mf
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/META-INF/zigbert.rsa
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/META-INF/zigbert.sf
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/bar.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/aboutSupport.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/addonStatus.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/addonfs.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/addonmgr.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/anonymousStatistic.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/autoinst.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/barnavig.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/bookmarksStat.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/brand_prov.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/branding.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/browserTheme.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/browserUsage.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/clids.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/compsusage.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/defender.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/distribution.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/incoming.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/installer.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/mailruStat.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/install.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-5_2_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-6_4_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-7_0_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-7_6_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-7_8_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-7_8_1.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-8_0_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-8_1_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/migration/l-8_3_0.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/barplugin.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/brandsvc.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/compapi.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/ncparser.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/npwidget.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native/sliceapi.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/native_comps.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/notifications.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/overlay_prov.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/pacman.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/cachedres.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/manifest.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/package.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/preset-with-manifest.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/preset.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/platform/unit.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/safeBrowsing.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/slices.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/strbundle.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/update.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/vendorCookie.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/widgetlib.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/workers/barnavig.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/xb.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/cbapp/parts/ycookie.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/chrome.manifest
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/chrome/yasearch.jar
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/components/core.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/components/nsIYaSearch.xpt
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/components/nsSearchSuggestions.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/components/nsYaSearch.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/components/xbProtocol.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/config.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/dynamic-preferences/brand/ua/safebrowsing.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/dynamic-preferences/locale/tr/safebrowsing.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/dynamic-preferences/safebrowsing.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/preferences/yasearch.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/presets/http%3A%2F%2Fbar.yandex.ru%2Fpresets%2Fdefault-partner.xml
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/presets/http%3A%2F%2Fbar.yandex.ru%2Fpresets%2Fdefault.xml
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/presets/http%3A%2F%2Fbar.yandex.ru%2Fpresets%2Ftb.xml
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/presets/http%3A%2F%2Fbar.yandex.ru%2Fpresets%2Fua.xml
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/defaults/vendor/vendor.xml
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/install.rdf
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/AddonManager.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/DataURI.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/Foundation.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/Log4Moz.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/Preferences.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/SimpleHTMLParser.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/SimpleProtocol.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/Stemmer.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/WinReg.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/WindowListener.jsm
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/async.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/database.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/dlqueue.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/ecustom.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/fileutils.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/legacy.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/misc.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/netutils.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/patterns.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/promise.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/strutils.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/sysutils.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/task.js
partners/yandex-tr-gezginler/distribution/extensions/yasearch@yandex.ru/modules/foundation/xmlutils.js
partners/yandex-tr-gezginler/distribution/searchplugins/common/bing.xml
partners/yandex-tr-gezginler/distribution/searchplugins/common/yasearch.xml
partners/yandex-tr-gezginler/repack.cfg
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/distribution.ini
@@ -0,0 +1,45 @@
+# Partner Distribution Configuration File for Yandex
+# Author: http://yandex.ru/
+
+[Global]
+id=yandex
+version=1.1
+about="Yandex'in Firefox Uygulaması"
+
+[Preferences]
+app.distributor="yandex"
+app.distributor.channel=
+app.partner.yandex="yandex"
+browser.search.distributionID="ru.yandex"
+mozilla.partner.id="yandex"
+browser.safebrowsing.enabled=true
+browser.safebrowsing.malware.enabled=true
+browser.safebrowsing.malware.reportURL="http://yandex.com.tr/infected?l10n=%LOCALE%&url="
+browser.safebrowsing.gethashURL="http://sba.yandex.net/gethash?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2"
+browser.safebrowsing.keyURL="https://sba.yandex.net/newkey?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2"
+browser.safebrowsing.reportURL="http://sba.yandex.net/report?"
+browser.safebrowsing.updateURL="http://sba.yandex.net/downloads?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2"
+browser.safebrowsing.reportPhishURL="http://webmaster.yandex.com.tr/delspam.xml?l10n=tr&request=Page%20looks%20like%20phishing&"
+browser.safebrowsing.reportMalwareURL="http://yandex.com.tr/infected?l10n=%LOCALE%&url="
+browser.safebrowsing.reportGenericURL="http://webmaster.yandex.com.tr/delspam.xml?l10n=%LOCALE%&request=Page%20looks%20like%20malicious&"
+browser.safebrowsing.reportErrorURL="http://webmaster.yandex.com.tr/delspam.xml?l10n=%LOCALE%&request=Page%20looks%20like%20not%20malware&"
+browser.safebrowsing.reportMalwareErrorURL="http://webmaster.yandex.com.tr/delspam.xml?l10n=%LOCALE%&request=Page%20looks%20like%20not%20malware&"
+
+[LocalizablePreferences]
+browser.search.defaultenginename="Yandex"
+browser.search.order.1="Yandex"
+browser.search.order.2="Google"
+browser.startup.homepage="http://www.yandex.com.tr/?clid=1945715"
+browser.startup.homepage_reset="http://www.yandex.com.tr/?clid=1945715" 
+
+[BookmarksToolbar]
+item.1.title=Yandex
+item.1.link=http://yandex.com.tr/
+item.2.title=Yandex.Hava
+item.2.link=http://hava.yandex.com.tr/
+item.3.title=Yandex.Haber
+item.3.link=http://haber.yandex.com.tr
+item.4.title=Yandex.Video
+item.4.link=http://video.yandex.com.tr/
+item.5.title=Yandex.Mail
+item.5.link=http://mail.yandex.com.tr/
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/META-INF/manifest.mf
@@ -0,0 +1,366 @@
+Manifest-Version: 1.0
+
+Name: config.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: dTdg9MF/l5DlDOVbIu9fMA==
+SHA1-Digest: cfp6KHkRSxZSRoHsAUebhITf0E4=
+
+Name: chrome.manifest
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +6QzgzTrncXUpdCcA86zbw==
+SHA1-Digest: S181eO0KVVCQQDOBhYNNQSy9WCA=
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: lZrfT7rrxYsifyf24msg4Q==
+SHA1-Digest: zDinyVutChehRX9PGB21A4ZlpAc=
+
+Name: components/core.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QbQTpZhY5R+tCc0qTRCRmg==
+SHA1-Digest: elOc6rXV2aJw1KldkYXgck9sL1w=
+
+Name: cbapp/app.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: qPkS3nx7elnmIZCLQZ5Ewg==
+SHA1-Digest: OCtgTWeS2w9gK2SCXoBledkH5NI=
+
+Name: cbapp/parts/colors.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ff0rfepnB9TyIPEEiEKMPg==
+SHA1-Digest: jp2kMYN8UuMRep0G8KXMI/DvgUo=
+
+Name: cbapp/parts/favicons.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +ZsU0Kt1P2zTCC/RGW5Qmg==
+SHA1-Digest: nkfQsHB+m0YAd3LBU4w77XEh3W0=
+
+Name: cbapp/parts/barnavig.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: oCMUlKYvSF9nVSXPLBAA3w==
+SHA1-Digest: 5yHKSV0EyODvlh+KMju7c3XF5AM=
+
+Name: cbapp/parts/strbundle.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: jnY2ilJxX3SvCMTwOzwHkQ==
+SHA1-Digest: ywGViFlCDeuZhxyJcq0vimoA3To=
+
+Name: cbapp/parts/fastdial.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Llu+OC9sBjFh2lPtC+LrwQ==
+SHA1-Digest: W4ShHiA9wjazRs1M7H/3AN0BM+I=
+
+Name: cbapp/parts/thumbs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: V1by84WVx0hKxEBQPngl+Q==
+SHA1-Digest: Kwea60Nnfud7csdJ+On1YQ6PnVY=
+
+Name: cbapp/parts/bookmarks.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9z0ky6t57oriC2dSF9RdAA==
+SHA1-Digest: IG1Md/nzjl4/EKcTJsuv8qTFuM0=
+
+Name: cbapp/parts/addonfs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aA8FbY57nyk1mQquPNQo4w==
+SHA1-Digest: 9gWO+NrZoufY4j002LSTBOtHqX0=
+
+Name: cbapp/parts/searchExample.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Up0q3a4NJO70xL0MTxYoMg==
+SHA1-Digest: 7deTiQiHOaeL+f7cAMqbtaGbTTU=
+
+Name: cbapp/parts/addonStatus.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 3XKNiEEX5drLzJjvYh3S2Q==
+SHA1-Digest: xTrNSsC5Gg/HHr3/0MOdTdljDtE=
+
+Name: cbapp/parts/screenshots.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: a1nNl3ZFqWWyTTRs9GyKIQ==
+SHA1-Digest: jxcYNMHC2MzV9p1uYbkhOBUq4HA=
+
+Name: cbapp/parts/backup.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 0beEsghAaUw5dd7Sx6TAZw==
+SHA1-Digest: j1/9+5nTZhWJ2mXk29XURy8N4r0=
+
+Name: cbapp/parts/databaseMigration.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GUkwD4po2g06y7ozSJ7Veg==
+SHA1-Digest: o4zg05xzMLYtyOvdRZmess9+QO8=
+
+Name: cbapp/parts/usageHistory.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GFat4iVIH5hPdkIZ2DPl+Q==
+SHA1-Digest: rnSXLLKLqGvdgciBReGMCmG6CdU=
+
+Name: cbapp/parts/protocolSupport.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6hX0gijeiKahmrv9d/zdzw==
+SHA1-Digest: miHJgSRqoT+g4IbpBkbLUc06mWs=
+
+Name: cbapp/parts/searchSuggest.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: HWKDkHyAvkEa05ZSdcQYtg==
+SHA1-Digest: 0sakYfAjl8LnMY7PpPgBVnLEpfo=
+
+Name: cbapp/parts/frontendHelper.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Fb+A93ozHbZY1ged3O7XJA==
+SHA1-Digest: LGKAlijX0gFDW9HtV5VTtTTo9LI=
+
+Name: cbapp/parts/dataprovider.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GgVrGvtpDJw0RAGtlCYfZg==
+SHA1-Digest: lKItP5z5G7uDi4dFK0h1qtg8Bu8=
+
+Name: cbapp/parts/addonmgr.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ixqqpDLz77KNY6qsf6RAcw==
+SHA1-Digest: RfXlzyKkYwLGaKg9jND9lgsvqms=
+
+Name: cbapp/parts/aboutSupport.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 601dG5dRlu1ciVGHQKq0iQ==
+SHA1-Digest: BF6i1OPVzHu/UyqkEv773ECJ7m4=
+
+Name: cbapp/parts/migration.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: OCrORUBF2QfIGscinVEfow==
+SHA1-Digest: SYrOxNDtlUvM5zOjAU3TnB81YQU=
+
+Name: cbapp/parts/safebrowsing.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /rUX3yx3mXsWEvAXuLSYaQ==
+SHA1-Digest: WzxzrwtHiXrc0ZRH1Hq9k/xIXyw=
+
+Name: cbapp/parts/installer.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: yuQee4JROOM1LrNijWxTLg==
+SHA1-Digest: yT4qlqNSHvAG4FEAM8TCeDZnAG8=
+
+Name: cbapp/parts/syncPinned.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 7TyVgBipu1LH6/ei1k+KLA==
+SHA1-Digest: hRM/VRC61tlrIhbaiZONtaUlhRA=
+
+Name: cbapp/parts/clids.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fYFPkliuwkolV3ZEBuLUUA==
+SHA1-Digest: 6Br84o20w0g/GyqJfAeoARueuaQ=
+
+Name: cbapp/parts/package.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: nkZxDSOxT+zD8IrOqLGKzw==
+SHA1-Digest: k3trjDaqOVTMvb8P+W+VXgtZAsE=
+
+Name: cbapp/parts/metrika.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: V2sjfCmWt3UpUZEPPHVi1w==
+SHA1-Digest: sO3yVwP6OABRcC2teadbyoZd5sA=
+
+Name: cbapp/parts/syncTopHistory.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: LYbowiAIS85yBrAbe3PbtQ==
+SHA1-Digest: 4GpzOskH4P3u909GrWe/Lk8eizY=
+
+Name: cbapp/parts/backgroundImages.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: yzO1mVWaLlWWaPW3AZKoXA==
+SHA1-Digest: O/dQJTOPkHnCsUGREGhCtUHcGGo=
+
+Name: cbapp/parts/cloudsource.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: rIyeNYDmoBcfgSu6A20DYg==
+SHA1-Digest: B6bQVJ26dObNxQCPowrxhCgup2Q=
+
+Name: cbapp/parts/layout.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4StZ7t9r3Asv8ltFwd8i9A==
+SHA1-Digest: tuReuVQVpZl6+nHslVkpFT8pB0g=
+
+Name: cbapp/parts/screenshotsGrabber.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: hMJvqYKmW8RZNAmAlUI0Xw==
+SHA1-Digest: EYbGU5tOk5FpYUt44WJTFu4e52s=
+
+Name: cbapp/parts/ycookie.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: lAxDPLHXbv/wIpGHaa2aAA==
+SHA1-Digest: ycloRtbu1VgYreDgDO/N2sO6n8s=
+
+Name: cbapp/parts/sync.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 8wGIv80m4s5ae+rbkXtIEQ==
+SHA1-Digest: fkCQlIOEbIyMtM09Qt6LcGnYe5c=
+
+Name: cbapp/parts/branding.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 91qMo2TH41+gqgDFhAsrVQ==
+SHA1-Digest: cDQnEztc9A7H6hAcF2OmHXUYzt4=
+
+Name: cbapp/parts/blacklist.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xJUdkgxiFVwXo89DcX6Bmw==
+SHA1-Digest: RjhdutLekbxxORbn1aaWrgDElyw=
+
+Name: cbapp/parts/internalStructure.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: s91fas/rTEKeXIq6Ezv9Fw==
+SHA1-Digest: O6Ga18r2a4tXIibuvPwlsyWyUm0=
+
+Name: cbapp/parts/workers/barnavig.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: B6jUp2pwJBnGET108ZG3EA==
+SHA1-Digest: 4B2PiWR7aMcgBtsq7sJ8hVT+h1s=
+
+Name: cbapp/parts/migration/l-2_12.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: p6dsfKliN7Xqbwvc5NhGsg==
+SHA1-Digest: YKKPV9n+9+tsFIgTFRVwq7oQlhU=
+
+Name: cbapp/parts/migration/l-2_9.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 3f70t9dPUjXrR/1QsAHWEw==
+SHA1-Digest: 1nhsMg5vMCupmZcj5cGRalDluL4=
+
+Name: cbapp/parts/migration/install.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WnYGN8tAFognwNvoBZWu2g==
+SHA1-Digest: V9tYLk3j/NKTCItO1uvsDY1nqXI=
+
+Name: cbapp/parts/migration/l-2_3.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5ByXpocFhtWSoLoU0WpjWA==
+SHA1-Digest: we4R8rKaOFEVC9a3vHRdzjREIx0=
+
+Name: cbapp/parts/migration/l-2_0.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kFKWf5g48YetV0W9HxylZw==
+SHA1-Digest: x+LxKgIvOfKHygC6+cC0UJ+P4GE=
+
+Name: chrome/yandex-vb.jar
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: R8JI1RjfSAie/7cUG8t1Fw==
+SHA1-Digest: bmH7YKNQYPRyFQt8Fx5NyPtPCHc=
+
+Name: defaults/vendor/vendor.xml
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QDF3Q//rJRSVouA/kuUcNA==
+SHA1-Digest: bmoKFUkaMitZAFUAgAo13c9oDtw=
+
+Name: defaults/preferences/yandex-vb.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: F0fLqYaM9vwVhIusF+3rvQ==
+SHA1-Digest: 7YvDsfkI7JUXeeG4zfCA4iOgTgU=
+
+Name: modules/SimpleProtocol.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: eaewrG55YertFKYGtpuD1g==
+SHA1-Digest: Mw3sIpcJvEChvAp/+KzLhQJYJ/s=
+
+Name: modules/DataURI.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kXvR6+vfQVKXxeIT9PvhVA==
+SHA1-Digest: TmWwxgGgYGQU0E+XaKFv1aj2A9A=
+
+Name: modules/Preferences.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: b06G+h+px6z4/X1wjbVrHQ==
+SHA1-Digest: 7m/e8ImuIoWJKE6g3oC4YErAbFw=
+
+Name: modules/AddonManager.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: npg1Ch3L3v8nNycZYRo0tA==
+SHA1-Digest: GTL5o8sjICH3TVvRoaaJ2HWcW00=
+
+Name: modules/SimpleHTMLParser.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Xnw5LvpMXZX1T1ZEOi1m8g==
+SHA1-Digest: 9lSpXv+Vn/G8GklRJwYiq8XTc+M=
+
+Name: modules/Foundation.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: a+pkP4TALVVJni/2pyhAOg==
+SHA1-Digest: KUvD6SIBtmD3HLFlbpZocLC/Fts=
+
+Name: modules/Stemmer.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mDYPg77lHvw8u59KTaaT0Q==
+SHA1-Digest: NqR1rkr+i+fFEl6zTLIakVhg05k=
+
+Name: modules/WinReg.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: i0h+ZrjPf37kD/u1/Jd+rQ==
+SHA1-Digest: jBUfSPdS61l2cLk5Zr8l/xJNHMY=
+
+Name: modules/Log4Moz.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: OPcdC1TNylt+YqxvYS/p9g==
+SHA1-Digest: nAMDHC9CD2qNPb+0Cel1nR3PKTY=
+
+Name: modules/WindowListener.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +vABDdLQbWyl7Vo6hjE20Q==
+SHA1-Digest: +3JSN2qS2D4P3qJRDD1Aeopa36k=
+
+Name: modules/foundation/database.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: alF0zvXABSXPHT4ZEbNi4w==
+SHA1-Digest: 4VWhscuhrOCYhmxQZ7Awh2iBekg=
+
+Name: modules/foundation/task.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Nsrs/GSNs2bd6rORht45ug==
+SHA1-Digest: KnhzcTtJk+IKVMrYD1vjYssP/Vc=
+
+Name: modules/foundation/xmlutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: dgf5jbj/S6kjUuBdfN/jhg==
+SHA1-Digest: URnJH9dg+SpCooNMgh/w8WENIAA=
+
+Name: modules/foundation/sysutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: tGMhdXO5I1S89IxJ2XPpuA==
+SHA1-Digest: IfZ7Y+wM+f7+uhb9zNHUPMRBmxI=
+
+Name: modules/foundation/misc.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DvFnbwn+rTvvw2w/UPL+Nw==
+SHA1-Digest: gdSaVp6hAYFM2Bhd297DUNmgjv4=
+
+Name: modules/foundation/netutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: NZqmjHzVhHfA/MRlNAMwWg==
+SHA1-Digest: BPNQhIiGQ6yTSoEN2i21uwZvdhg=
+
+Name: modules/foundation/strutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WtTc/+Vi3srsCg1kiAS3ZQ==
+SHA1-Digest: ooR8gO5JU7EFqFy3bslj2PO1CLA=
+
+Name: modules/foundation/ecustom.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1d78b7XV5c5aHqad8F+BLQ==
+SHA1-Digest: DviWywjBmtgDqMUyYPS1quf+2Go=
+
+Name: modules/foundation/patterns.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kv2XBg/Zgv24tUt9WCqSiA==
+SHA1-Digest: BM6hMdeQZM51d52/Ot0HQlAXTa0=
+
+Name: modules/foundation/promise.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Yjc8CGiF6rVP4Ls6WAa32A==
+SHA1-Digest: tq06ni7VzfzdoFHBISR1kurUVUs=
+
+Name: modules/foundation/fileutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: KsvNrVCR9YEB8zcAAslLdQ==
+SHA1-Digest: IUVW8zk3QzguF0kRl+ZhFPrd508=
+
+Name: modules/foundation/async.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: vbOQYp121NZa1q/7YreZNA==
+SHA1-Digest: XvNs25HD/WO1l/3MhH+SFpYzsXY=
new file mode 100644
index 0000000000000000000000000000000000000000..eb6e8af4e5e65aaa493e8e34f35bce1a9a2c8f4d
GIT binary patch
literal 4896
zc%0psdpwle8pr3I8Dm@qxnJ{ACSh1(3<@FS9=Vsq7(){pW(LQdDN`Y$I9(7$%1-IF
zOS<pcx{#DqB<&*Fl9C9e^A3^r?(Dt)IG@k?>^*<X=Y5{F)-&r_>sjCTHw*A&RB<9Y
zd<Xsr0TM=+@?;2rCnJJ}AhH+`!3pU~V9?4!C?NK=6I9BRvIIOKAHc&dDaD{6G+N3y
z>=(aN^RIut*lnt?fdBRxAk6fKgplFsCnv*Uys<bLw6`Z&0mumqQ5gvz2Ak>03|p@U
zJFchelhuKmpg~MVe!2nnV#jc}@Nxz>j>Qfqn}J1B9Spq~>_`sG3WZ}h44B4+*K)a0
zoW%wPadC0_vB+Q!GFYF^iZozH(O_-*LNXxh13kfDjEvSybejkohXYe!8&(Jd7I>KJ
z!(c-|2C$7an5#e_QvjJv1(Tmuh-oY^4Jp(`)J3a6`mR}Nd3cj0k-QNDFN1Ssap<hL
zX@~HPLk7&5Ok7rUrS)=KJ3rXP#fH2Dm`~+IwPl7exwHt_(ROBHB-oWnXR|o0P%i9=
ze8th&4A_Sj!3?2snXL72tl@M}%<Q0m2WigU1xN^m;X#rp#4n2GK@h4Q`|>>M<Fg9t
z(hF)ATF;g@L*lSwW<V8DUE)c}9-40}DLmT))i?SXtLS0B$6qf{F8ax-#pRz)oVfd;
zvr_5j;8%WD-Y4H?bdDdl-CDh^GC^WfuJqa(J?HtJ;UN~`8_h1P+TE+nJpL$7#rkS8
zj{Z*P5=bmCT3wvCyc63HdL<wKRwJ9*+o!QG$-u_Zs`~gPJF0_J$;x%hlB1sMNoc$I
zx0|lq9%Oy*ok!SQG2&z9?c_p}0`C<!xWytiw0GA+rAJ>jcGek?s~~VLjr%4+O*&)w
z^To@`-OEIb#R!Lth1%1Hs`eh3SXMg}mSLs3JK_hD#oKUo>A7#<0#~OVGzLOJ`*~0z
zvLbPlo2Vv(MFSL&5Ijmk&}S?bgBDH$Rsvfcy9k&7YAL0Z%r_8J8d7L<4xK_0lnRN?
zj`+6ZY&>nIn)Hz-U@M3KV=aK7c*TPF4iNu?9VD!P0Xje%hu6g+XG9nc$*cZR2?H5H
z6fLYc5S<=^!GP%LX9&VF03FPqwgJRf{4!4#ofGv<IAAu@3;msJXiVCF&4$4S>VkR9
z!zu##G})$Ihki{Y4msb*$$jufh&b^4Ze=l2j3QGxE=4AVtRYqk$m2wjAH+gD6EviP
z#RD8tfXE8}1``-TU0S~!2T>x9WebiRv9o=i@3F+_kXA>VD0mutIwc{d5%jr4W<~}L
z#b@K(lJi$R+Y)<|;U;D9z`O0J*u{BC;Z34T0zXk}%bY?xJ2smXc*<YrMBaZSX6NeY
zv>>DAzMXy@X^5iHx_d;E@UW|EPc2z9VbH*}=4Dpcr!HV^pTo~O{|*$#2QgyJwr+6c
zE6bee_h0_GXkQ)Sy46qD$yFwt8{S4SJx(~?=shns_w_dj+11GDYgJhIUwnR=^{V(2
zF+FaJl0q}Prfs*o%dWXuD^T@LIYCe7z#rE<(YL=ly0Iv9Z0l>)k+FmF8;5(xqkLnv
zvz7!Dty!5KllAOJwhltodw_?j`$AU5w&oIIa&MiJhF@btxS7-M$a?dCMb^c@bgBax
zfhB@KU<`j70zuI-78|C;aM!Zf%mhZrBzaluBjU++z-9`p=D!20drWWylMcJHnUOSh
zJZ!^YbD5z``V_pZr($vAk=XWB0dIjZnG8&4cuO$`CS>Co-u{!4{WCxxosY*aOrVwo
ziC6VFn=OBwbk5vPwNCfx#6t9_FMfYWhTMYpZ>z79w*+YR>Qo(AdLs8jt@r6;r=3qs
z<faJwz8bJ;4-J;1H3bpMA3pi;^rv9Fg_lg9<IR;`8N_bgT$R0j@5}P8P#hoH(ARl5
z-_7lfTH)Hfg_&3%HGJZ+G`Br5z}e?s;YGQ)vYMfNT7ySb^TQOohj7?|ZM9vfu8zg0
zls==+4w=7xn$>5L^=jzB;lbfI7Dqc`@+eAbs#dqS^OZEVKa!m|tm9FidmroAwUuta
z*_^rI)`b0e-4wTL1xF-`TbgYyg>jzC;#0aU_j1lqM4JLEjW!i#zV__ZlA8i_`f-qc
z6i80uS-@l=fDwS>8%RSq5IMs^aV!l4mIajhgO$J+c*~0*TM@=E2xEo<4WJH$zi1k)
zY;N~GW&Yu<IpIGwrLAjmP}ECQ(g#}d^S<yff)&R47K5>zNuMB+pt{r~u<}^h)O(D|
zD;=-u-T;wzHjBp4M=6M6_zu>#&vycW!A%d9cN$py`gj-VeB5wFyr$`^tCgkylCBPx
zu!{=0*7NUB(oT_-z@x1V+KfS{3a@PcWOOtse-)ky6CN#zTyIWT|L_Ga&q}fO!{z?Y
zcI&FAh478W5INKI8#`X_+qh6nhLzJU-l2tVFV9l4y=$Ey#B}m=3%Z%YTPKFD(o$G-
zsy(%5BSWVk^F05_nsoUMB&micpAPbLBDK{CVpqF+l!;2e49#Ilohta)vsB2i{dVz+
zHQGOxWZd%~s7SW6V&|Ne2$#T(Q>YHnXNnhOU1bCk__0N{3Bv`ehXV}plya{h6)o4U
z9$e~_Vd}LZu(?-n@bH}0gZ=b%fQJ)B&^Gu5YaXcXDlMOn%KZMq8!gV1`hPms$N(75
z!kVGLG?~HL-%}m`8NlApb6!*NAhXW!WsC2~Kvz96rCMp{#KGd^9mB@qQV(L%K`M4_
z>Mh-vxs7W0>`vy6N|XIXiD^%F{qowxHSo5X>}!6@o%ai<=d{F3E3@gv3j6UDKh%sj
zt_$Y5+}CJRdGz-AMzc&Ew+#PnklT&QSgF(nn4}9wQj#xsj0&AoaVTQ;Tq-v=w?-}L
zEbPA4wIjOK8>&YUovh4Hl@Sk#S4O7gY|~0?x@f7|XHYoSy(#YJQ$EKN%)Ef7N@uXq
z=ef;8tF~)rbh{`lPx1d$zI|6}XX8M5%)o%$uzk-5CH6yoBjp1pD_v5~*SU#X_`U_L
z2aI!C(_$Ye=~pzS7?HM2E6fRGMaF>i48kVm&u27*0#Q@KkO{&7<6B|q^B097J&FT#
zW_qH*T;)F&k^g6I8ck_w63_(;OBa-C@ux@qPC-Y}X%tczby7bY%@VoVfcO_huG*Ad
zmItykdKo=SIcp1==U|cC%GH1hSqUgi6~EMU@w>V^JCY1Zrn6xGUAa435C7G-fsf`3
zqw=e?TMo5Qwa>v2$w%3FSL+(YyQ>pQHB&q7O`S*)&8gAKNw1;~9ed-}B`NMXCbwpS
zyVG%gMmkY7Pu9N1g`QnkX4LYtT`wVn$idt>lpPZJI6D7@olub6$`y+~`pJe*w3PS9
zhvUVq**zwjIFSqUURv7jp8Jwk+;D8$>W>z8w;o<<!7y$)X<?<EyGN>N9<jk0zO_v~
zAlt?0ruoBelU7y*eBP*!_~;0s=i2U(vXdHl6c)eNuTCq8E8#a0qe8d5O-|aAt5R5U
z%`<kRe^GVb*x~-|X9KQlcwXUo(vM0L+&9fpvGDRJ%+xEg$XCYi7SgZZUg3~;kIX|?
z03Nyw4M8CN#@`fx-?{eqdSg<WehetiY`h4DJo^R(e7$oK5h6<>uLmPQ6<jn>Ovpy7
zz`U=mSTa&}ca-?e(nY$rEil((TfO+!x+kPlfXCNPl7bhN;BVoS10#$a^XX?a8jVUr
zO7N=<Sxp~i;cxxgzo9vn2cZsB-;Z?7+>kjiS`xV|*UO>UKd(2MF?QBxo3F<Oz$(4G
z4Mi=Amp8hfU$+wCx@MT(Ne^QGpmM<Rb!5tw+B;f~TNn~lPle-4*B|pqzRtR6C$U+T
zxT)=2%}*hlo3;B$&qhyf5*_ilc`(AT2Mosbd#G7@nQdO{!mLSbT=V|nbJe{BMRZD=
z11d%ty)UNH%Uw}g(rv^&Q@lS;w?ZnsWlpLu-uCe3z^B>PyboLaRBGX5jSlT2>!Qbf
z6jfW??@pYD>q{=b*zRvWuBpdV>TetQDBCqYdZ<3&a`qVvW8J{md)xfjcD=gG!v9(=
YZmD!B>q&)nvD0NuzLRG3ULEd#01nNPIsgCw
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/META-INF/zigbert.sf
@@ -0,0 +1,369 @@
+Signature-Version: 1.0
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: eFYI3OJFwJR3tmcPfUASxg==
+SHA1-Digest: d/6Z68ulBRyiureYHLr1x/FPYaw=
+
+Name: config.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xYTvsngq9Y9RBJmjKVmLfA==
+SHA1-Digest: vRJu9tQo76lsh0TcF3K5hK9r070=
+
+Name: chrome.manifest
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Ms/f33A7LpXGNKcbSqU7sA==
+SHA1-Digest: qk/d8TNqUz7GvEo8O7y0qKjyus8=
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: hR3FfwNdBVPrmap9V98N8g==
+SHA1-Digest: CQR++VY3QkNpUWKuDrQCVOILwn0=
+
+Name: components/core.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: XXlrfL3aiRwPjeo/jSjBUw==
+SHA1-Digest: 3TPBprdUusoM9y5XZv/RNjUlzL8=
+
+Name: cbapp/app.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: oVnoGE08qhp3S0oUQX97AQ==
+SHA1-Digest: t7AMbBW7tNlOo4lG+5WY5nwkNak=
+
+Name: cbapp/parts/colors.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: oUjSJUgR9Nb2RLeO9CyO/A==
+SHA1-Digest: 1dh790+RUYjnUTiEdkweECVHL3s=
+
+Name: cbapp/parts/favicons.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: f3b3SJru/toLhQIhiNY1cg==
+SHA1-Digest: 1fb1hw8ONbSdHfHayTBTNclyyRA=
+
+Name: cbapp/parts/barnavig.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aO5LOOQBJsaXM1CQ2XllyQ==
+SHA1-Digest: 25uVrGX1qj6D299CT5k118ys1o4=
+
+Name: cbapp/parts/strbundle.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GEEo+Gys+2SJZrZZV2X0mw==
+SHA1-Digest: mCFpHCwW4ZKrBOJYk/01CQZ+uzc=
+
+Name: cbapp/parts/fastdial.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: qWHMn2bnht3bt1sodzAsng==
+SHA1-Digest: CofwRNVHKGT0iwJ6ZEycDzhEnbQ=
+
+Name: cbapp/parts/thumbs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 3XHzWU/kFvSiXdHDIJWRjQ==
+SHA1-Digest: ggB1tqFrPpjMO8q/uteMrkIcLz4=
+
+Name: cbapp/parts/bookmarks.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: T8n02Xj/O0hy1ER1ZVHi/g==
+SHA1-Digest: 1alaQ4BjoH/hOBBz58ReFRB5IHc=
+
+Name: cbapp/parts/addonfs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DKebsBo0/t3iRkjBFDmqIg==
+SHA1-Digest: l7jWqcmZAslp6dAcS6a7FvtcwI4=
+
+Name: cbapp/parts/searchExample.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Ue4cPyclezstJpqD9FjfAg==
+SHA1-Digest: S3BcBcSTNuNeagCBw3DPcAPGGTA=
+
+Name: cbapp/parts/addonStatus.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 0Ru4aXKoNcFwpHbqt70EBg==
+SHA1-Digest: xSw4nM58dLKJTUpzufopN+igrOM=
+
+Name: cbapp/parts/screenshots.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: sQ/J7MPipMPu9htqWo59HA==
+SHA1-Digest: dgthZg1LKan2bD68edJbd3eq/s8=
+
+Name: cbapp/parts/backup.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: lPvRFq/OdMfMyiEi3pVkVw==
+SHA1-Digest: 2xHX/5qZwmA6Di4DTvUNw/csHDw=
+
+Name: cbapp/parts/databaseMigration.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: sPMZ15rbmNaZu9FIVaHdKA==
+SHA1-Digest: h5jnTuWlyfhBNKYGFmPTaRKuMaY=
+
+Name: cbapp/parts/usageHistory.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: tyF5zySr+xLFNDOiuR9HZg==
+SHA1-Digest: GqT8seCoXNmYKyXSanH47W1ppZM=
+
+Name: cbapp/parts/protocolSupport.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GKCo7Zr17vrQ0GdMsGvzMw==
+SHA1-Digest: Sbrcms7oKLz4i0mCDQiLXjDSe+E=
+
+Name: cbapp/parts/searchSuggest.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Yuz1Ycx3eVxrXCpwMqQjiA==
+SHA1-Digest: B6l69mBTyLWkk6kYf2nyXyli014=
+
+Name: cbapp/parts/frontendHelper.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: VtPY3TcjBj9gPHpe1n+i8w==
+SHA1-Digest: N91QBKLYgw1CHn//fhn4jhwmcIs=
+
+Name: cbapp/parts/dataprovider.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: EzdTXvyuYPT2M6RTAcfGLw==
+SHA1-Digest: mB012XbKFj8/pn82at7ILt4OxVA=
+
+Name: cbapp/parts/addonmgr.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 88TdB8twLKoOvAPOz/ouWA==
+SHA1-Digest: v+Ddv2H5885bW+H1wVqlqyPm/HM=
+
+Name: cbapp/parts/aboutSupport.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: gYH6m8j3zn/L8WScP7NUGg==
+SHA1-Digest: sepFdji6YnAG7AemLg5DY/pZK7Q=
+
+Name: cbapp/parts/migration.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Y8DqPIV8wCJmRTpluEONHQ==
+SHA1-Digest: 3qwkQRolX2+RGDH+joAXNx6r8+k=
+
+Name: cbapp/parts/safebrowsing.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 8x1s/zt9mE2PXM8y2nPAWw==
+SHA1-Digest: e/lGzT0hoaP27dPgPyOPZsy7R5w=
+
+Name: cbapp/parts/installer.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GIT+X8ekn8dMGohvbS4Uhg==
+SHA1-Digest: mfBuGG7YYrgLYRThBMbJE3B1cJE=
+
+Name: cbapp/parts/syncPinned.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: M7+l1cj8lm0hrHI7JxDu8Q==
+SHA1-Digest: 0TlpBNHAAU40cz72Kk93MKG+3Hk=
+
+Name: cbapp/parts/clids.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: gCNS7SyJHsAM4N/tyG1cfQ==
+SHA1-Digest: +IWLkT7bi0qjCSZ2zYHpO2CuEfI=
+
+Name: cbapp/parts/package.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: KXWLdwW/jxFP5GAVG3Qy8g==
+SHA1-Digest: YaBM7x16+3z4fW9cTdBLgNy9+jM=
+
+Name: cbapp/parts/metrika.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SIVEl3jyJL9FhQqdtTnafg==
+SHA1-Digest: VjqbPaNsbVN61F0nNW65EFjKMxY=
+
+Name: cbapp/parts/syncTopHistory.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: zABsebfWZzZzUfHnHJJ9Ow==
+SHA1-Digest: SH9sks/U3RQl57dZG1U7SDwBcLs=
+
+Name: cbapp/parts/backgroundImages.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: tFRgBq4Fd4nwfLf8q+xXHA==
+SHA1-Digest: CHhjU9mLO7HztPqJ/ZBHDNrtXtg=
+
+Name: cbapp/parts/cloudsource.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: NwcNj3QRYDMSfXXvqRtHXg==
+SHA1-Digest: XJO5y9GSr3QfdFVTBLEqINr/o3k=
+
+Name: cbapp/parts/layout.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: i2n8f0HHjIP2PsM6vI7OzQ==
+SHA1-Digest: yL38S696KWQ5CUFHYqNefWDVYnw=
+
+Name: cbapp/parts/screenshotsGrabber.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Sd5960UvLGFZsZ1eThRJKQ==
+SHA1-Digest: y41llCMStwIT6NKYyn1UwQ7zz3A=
+
+Name: cbapp/parts/ycookie.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 70eVrrlvVB77wVxUyrlLVQ==
+SHA1-Digest: GuEXSA2LiFSSoJKUgN6e961vmDU=
+
+Name: cbapp/parts/sync.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ztohVeSkn0sxEpaIhv4I0g==
+SHA1-Digest: a+pXIc9+rUbB5JT441COIMeHdSM=
+
+Name: cbapp/parts/branding.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: apUEWbEz+rak4y9gJbc5OQ==
+SHA1-Digest: gQKcnPvxbaohIE5Y9DdYCh2Y6q0=
+
+Name: cbapp/parts/blacklist.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: u6B8llPHd9hX5KeP28gMZQ==
+SHA1-Digest: tl8OTVZpUEu4B+4u6zCoFyEBYsg=
+
+Name: cbapp/parts/internalStructure.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /m7KcFJEvIYpmSe4ukrGFg==
+SHA1-Digest: 26UTuoluCyJZgg6Iyntm5YpNi3M=
+
+Name: cbapp/parts/workers/barnavig.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: lP1U3KH/+LHfy0t9/WZX2w==
+SHA1-Digest: LLMzjdDBfnk+dSzyR4lAWlDuIi0=
+
+Name: cbapp/parts/migration/l-2_12.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9YQDe3lRMHPVVJl21h/o3g==
+SHA1-Digest: eJZ5OCpLAKHi6q5fbZoTJNkNk0Y=
+
+Name: cbapp/parts/migration/l-2_9.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: j1W83zTysdwgMyLDIy5GCQ==
+SHA1-Digest: vJogL/ILIbsZdt/OrU9zfKjbrHs=
+
+Name: cbapp/parts/migration/install.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: eCSwSxMLIknu8rBTMbFc0g==
+SHA1-Digest: ynlBHkDrjw88xpMP21yaS5js4CY=
+
+Name: cbapp/parts/migration/l-2_3.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 0TtWTHJg0Pw2QInp+ucPfQ==
+SHA1-Digest: nHuieU+iOi2WWqviobBS2G/F/Hs=
+
+Name: cbapp/parts/migration/l-2_0.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +4htOFpGVd2xHeUoYpX/5Q==
+SHA1-Digest: mN6Ynon8KeU+QZwLaNYCnSyWXeE=
+
+Name: chrome/yandex-vb.jar
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +8M7PSGnltXU3K3Kw+Qgvw==
+SHA1-Digest: Kpo11oyhXRwMYM94VI8wfT7qbsA=
+
+Name: defaults/vendor/vendor.xml
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: JPQjVeBAEZIwBQ2A+ofwJw==
+SHA1-Digest: eGigziNSftqz5yOg6v7PK2HXjvE=
+
+Name: defaults/preferences/yandex-vb.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: FUlUty9Dp8hifNA8tgx/yA==
+SHA1-Digest: oDJwiN4j8KXMEOkA5cf9QSvJE58=
+
+Name: modules/SimpleProtocol.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: bCMOCdeOAkx8AA9oo+f10w==
+SHA1-Digest: cv5gnrVo76XjAv3bP+2PM1muh/0=
+
+Name: modules/DataURI.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: rvEjIZ4grsEMtnH19RjaBg==
+SHA1-Digest: is7bmnwiFbDotR+McIQdtLUnl2E=
+
+Name: modules/Preferences.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: f0Jj3u8X/eVrksYoXyoQtA==
+SHA1-Digest: 4++0P9e4pzdnPYzmVclemRQKcQA=
+
+Name: modules/AddonManager.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: i5GThewxdr1z+tQP87M4IQ==
+SHA1-Digest: 85Zj65uojTLVYBEYAXxczsnKKWw=
+
+Name: modules/SimpleHTMLParser.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6r2hE/y1IL/A/WJY/A152g==
+SHA1-Digest: 3PfdEoJkH/3x5wRrvR4OU7fsS9s=
+
+Name: modules/Foundation.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: T3ng84PRvO1FPLVZs8LYXA==
+SHA1-Digest: Qt2hsS/96VXAwfuZhPJf+MPqgCg=
+
+Name: modules/Stemmer.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: JnS5RhD7mukH82jks8cI2g==
+SHA1-Digest: PV0w69nG5S1TH1Z7bGksKdhoMX0=
+
+Name: modules/WinReg.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: flYVH315etyT49G9qgc5ZQ==
+SHA1-Digest: pHXVlckBOqRm7KXp3NcCEOXqS7Q=
+
+Name: modules/Log4Moz.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: RfBXZWy46iDT+ul82V5Oaw==
+SHA1-Digest: oMefBXl1VDe0mkJiRAFZ0KpFUwA=
+
+Name: modules/WindowListener.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6H7kE0Ul1kkxF6tk95lSYQ==
+SHA1-Digest: qLFNENZW1v8qVxXVWF8IXkh96uE=
+
+Name: modules/foundation/database.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: i3uRv67xfsELTZ2L7kA8zw==
+SHA1-Digest: xnIjObCMr4SfbO2wPmMWkXQNI3E=
+
+Name: modules/foundation/task.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4SAiQ8l9wult1t2kCKxuZA==
+SHA1-Digest: WaBOlYM83CCRgM4pNu1t5AF8qKQ=
+
+Name: modules/foundation/xmlutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xEZmBHj7CbrTRUuz4zuLVw==
+SHA1-Digest: zEWAVS+tc6MaEbk8AkAEUoQGx1I=
+
+Name: modules/foundation/sysutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /iNoSAi4qMNH8AipjV0AFg==
+SHA1-Digest: Ht0vi/6B2opdrDc1X3dP/+ZhJJE=
+
+Name: modules/foundation/misc.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1Bsq14aP22eGJeixGIa0Bg==
+SHA1-Digest: cWWj2tLrDrE1HE8FbHSK23QocbQ=
+
+Name: modules/foundation/netutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 08zk5Lzco2UmBDu60M2ivQ==
+SHA1-Digest: mruKSjaa83r6NYQBNZwnB3DcSDY=
+
+Name: modules/foundation/strutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DMcMHLIFFbgOrcHGip+7TQ==
+SHA1-Digest: Kx68Stwb2ssIE3Ijw4/omEabhn0=
+
+Name: modules/foundation/ecustom.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1oBj3vgGJXYxINYS1kgHdg==
+SHA1-Digest: 0uQIMJkl/DnTc2jBzkwHBNPr+Do=
+
+Name: modules/foundation/patterns.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: b/GwBqANYvpUy8aN2n5MVw==
+SHA1-Digest: eOD/ELHVJcggygJcoxo8vdgJJs4=
+
+Name: modules/foundation/promise.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fuGRMaMfFi1CL03Ui8GOJw==
+SHA1-Digest: 61eqMKzZe914Azd9hMXdRkpK1dI=
+
+Name: modules/foundation/fileutils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: L+TaPZRPx9NDbU72Cdmq3A==
+SHA1-Digest: re5hWfmG3+8J7auXzxulha7p1XI=
+
+Name: modules/foundation/async.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: sSQgLz17RTX8zDfKJDiRKw==
+SHA1-Digest: nS6wV9iLy+zDdncfxySum2FPBkc=
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/app.js
@@ -0,0 +1,512 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["application"];
+const Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils, GLOBAL = this;
+Cu.import("resource://gre/modules/Services.jsm");
+const application = {
+        init: function VBApp_init(core) {
+            this._barCore = core;
+            core.Lib.sysutils.copyProperties(core.Lib, GLOBAL);
+            this._logger = Log4Moz.repository.getLogger(core.appName + ".App");
+            this._dirs._barApp = this;
+            this._init();
+            this.addonManager.saveBuildDataToPreferences();
+        },
+        finalize: function VBApp_finalize(callback) {
+            var doFinalCleanup = this.addonManager.isAddonUninstalling;
+            var addonId = this.addonManager.addonId;
+            var partsFinalizedCallback = function partsFinalizedCallback() {
+                    this._logger.debug("Finalize process finished.");
+                    if (doFinalCleanup) {
+                        this._finalCleanup(addonId);
+                    }
+                    this._logger = null;
+                    this._barCore = null;
+                    callback();
+                }.bind(this);
+            this._finalizeParts(doFinalCleanup, partsFinalizedCallback);
+        },
+        get core() {
+            return this._barCore;
+        },
+        get name() {
+            return this._barCore.appName;
+        },
+        get preferencesBranch() {
+            var appPrefsBranch = "extensions." + this.addonManager.addonId + ".";
+            delete this.preferencesBranch;
+            this.__defineGetter__("preferencesBranch", function () appPrefsBranch);
+            return appPrefsBranch;
+        },
+        get preferences() {
+            var appPrefs = new Preferences(this.preferencesBranch);
+            delete this.preferences;
+            this.__defineGetter__("preferences", function () appPrefs);
+            return appPrefs;
+        },
+        generateDelay: function VBApp_generateDelay() {
+            if (!this._delayMultiplier)
+                this._delayMultiplier = this.preferences.get("debug.delayMultiplier", 60);
+            this._lastGeneratedDelay += this._delayMultiplier;
+            return this._lastGeneratedDelay;
+        },
+        getLogger: function VBApp_getLogger(name) {
+            return Log4Moz.repository.getLogger(this.name + "." + name);
+        },
+        get localeString() {
+            if (!this._localeString) {
+                let xulChromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry);
+                try {
+                    this._localeString = xulChromeReg.getSelectedLocale(this.name);
+                } catch (ex) {
+                    this._localeString = xulChromeReg.getSelectedLocale("global");
+                }
+            }
+            return this._localeString || "ru";
+        },
+        get locale() {
+            if (!this._locale)
+                this._locale = misc.parseLocale(this.localeString);
+            return this._locale;
+        },
+        get soundsEnabled() {
+            return this.preferences.get("sounds.enabled", true);
+        },
+        get directories() {
+            return this._dirs;
+        },
+        get partsURL() {
+            return "resource://" + this.name + "-app/parts/";
+        },
+        navigate: function VBApp_navigate(aNavigateData) {
+            if (typeof aNavigateData != "object")
+                throw new Error("Object required.");
+            var url;
+            var unsafe = false;
+            if ("url" in aNavigateData) {
+                url = aNavigateData.url;
+            } else if ("unsafeURL" in aNavigateData) {
+                url = aNavigateData.unsafeURL;
+                unsafe = true;
+            }
+            if (!url)
+                return false;
+            var uri = misc.tryCreateFixupURI(url);
+            if (!uri)
+                throw new CustomErrors.EArgRange("url", "URL", url);
+            if (unsafe && !/^(http|ftp)s?$/.test(uri.scheme))
+                throw new CustomErrors.ESecurityViolation("application.navigate", "URL=" + url);
+            url = uri.spec;
+            var target = "target" in aNavigateData ? aNavigateData.target : null;
+            if (!target) {
+                let eventInfo = "eventInfo" in aNavigateData ? aNavigateData.eventInfo : null;
+                if (eventInfo) {
+                    if (eventInfo instanceof Ci.nsIDOMEvent) {
+                        if (eventInfo.ctrlKey || eventInfo.metaKey || eventInfo.button == 1)
+                            target = "new tab";
+                        else if (eventInfo.shiftKey)
+                            target = "new window";
+                    } else {
+                        if (eventInfo.keys.ctrl || eventInfo.keys.meta || eventInfo.mouse.button == 1)
+                            target = "new tab";
+                        else if (eventInfo.keys.shift)
+                            target = "new window";
+                    }
+                }
+            }
+            var postData = "postData" in aNavigateData ? aNavigateData.postData : null;
+            var referrer = "referrer" in aNavigateData ? aNavigateData.referrer : null;
+            var sourceWindow = "sourceWindow" in aNavigateData ? aNavigateData.sourceWindow : null;
+            if (!sourceWindow && target != "new popup") {
+                sourceWindow = misc.getTopBrowserWindow();
+                if (!sourceWindow) {
+                    let sa = Cc["@mozilla.org/supports-array;1"].createInstance(Ci.nsISupportsArray);
+                    let wuri = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+                    wuri.data = url;
+                    let allowThirdPartyFixupSupports = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
+                    allowThirdPartyFixupSupports.data = false;
+                    sa.AppendElement(wuri);
+                    sa.AppendElement(null);
+                    sa.AppendElement(referrer);
+                    sa.AppendElement(postData);
+                    sa.AppendElement(allowThirdPartyFixupSupports);
+                    let windowWatcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
+                    windowWatcher.openWindow(null, "chrome://browser/content/browser.xul", null, "chrome,dialog=no,all", sa);
+                    return true;
+                }
+            }
+            switch (target) {
+            case "new tab":
+                sourceWindow.gBrowser.loadOneTab(url, referrer, null, postData, false);
+                break;
+            case "new window":
+                sourceWindow.openNewWindowWith(url, null, postData, false, referrer);
+                break;
+            case "new popup": {
+                    let windowProperties = "windowProperties" in aNavigateData ? aNavigateData.windowProperties : {};
+                    let title = "title" in windowProperties ? windowProperties.title : null;
+                    let wndWidth = Math.max(parseInt(windowProperties.width, 10) || 300, 50);
+                    let wndHeight = Math.max(parseInt(windowProperties.height, 10) || 300, 50);
+                    let winFeatures = "chrome,all,dialog=no,resizable,centerscreen,width=" + wndWidth + ",height=" + wndHeight;
+                    let args = {
+                            url: url,
+                            title: title,
+                            postData: postData,
+                            referrer: referrer
+                        };
+                    args.wrappedJSObject = args;
+                    let popupChromeURL = "chrome://" + this.name + "/content/dialogs/popup_browser/popup_browser.xul";
+                    if (sourceWindow) {
+                        sourceWindow.openDialog(popupChromeURL, null, winFeatures, args);
+                    } else {
+                        let windowWatcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
+                        windowWatcher.openWindow(null, popupChromeURL, null, winFeatures, args);
+                    }
+                    break;
+                }
+            default:
+                sourceWindow.gBrowser.loadURI(url, referrer, postData, false);
+                break;
+            }
+            return true;
+        },
+        isYandexHost: function VBApp_isYandexHost(hostName) {
+            return /(^|\.)(yandex\.(ru|ua|by|kz|net|com(\.tr)?)|(ya|narod|moikrug)\.ru)$/i.test(hostName);
+        },
+        isYandexURL: function VBApp_isYandexURL(url) {
+            try {
+                let uri = Services.io.newURI(url, null, null);
+                return this.isYandexHost(uri.host);
+            } catch (e) {
+                return false;
+            }
+        },
+        _consts: {
+            DOWNLOAD_HOST_NAME: "download.yandex.ru",
+            BARQA_HOST_NAME: "bar.qa.yandex.net",
+            BAR_HOSTS: {
+                "bar.yandex.ru": 0,
+                "toolbar.yandex.ru": 0
+            }
+        },
+        _barCore: null,
+        _barless: null,
+        _logger: null,
+        _localeString: null,
+        _dirs: {
+            get appRootDir() {
+                if (!this._appRoot) {
+                    this._appRoot = this._barApp.core.rootDir;
+                }
+                var dirFile = this._appRoot.clone();
+                this._forceDir(dirFile);
+                return dirFile;
+            },
+            get vendorDir() {
+                var vendorDir = this.appRootDir;
+                vendorDir.append("vendor");
+                this._forceDir(vendorDir);
+                return vendorDir;
+            },
+            get vbDataDir() {
+                var vbDataDir = this.appRootDir;
+                vbDataDir.append("ftab-data");
+                this._forceDir(vbDataDir);
+                return vbDataDir;
+            },
+            get vbShotsDir() {
+                var shotsDir = this.vbDataDir;
+                shotsDir.append("shots");
+                this._forceDir(shotsDir);
+                return shotsDir;
+            },
+            get userDir() {
+                var isWindowsOS = sysutils.platformInfo.os.name == "windows";
+                var userDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get(isWindowsOS ? "AppData" : "Home", Ci.nsIFile);
+                userDir.append(isWindowsOS ? "Yandex" : ".yandex");
+                this.__defineGetter__("userDir", function _userDir() {
+                    this._forceDir(userDir);
+                    return userDir.clone();
+                }.bind(this));
+                return this.userDir;
+            },
+            makePackageDirName: function VBApp_makePackageDirName() {
+                return this._uuidGen.generateUUID().toString();
+            },
+            _barApp: null,
+            _uuidGen: Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator),
+            _forceDir: function BarAppDirs_forceDir(dirFile, perm) {
+                fileutils.forceDirectories(dirFile, perm);
+            }
+        },
+        _finalCleanup: function VBApp__finalCleanup(aAddonId) {
+            this._logger.debug("Cleanup...");
+            this._logger.debug("Removing all files");
+            this._barCore.logging = false;
+            fileutils.removeFileSafe(this.directories.appRootDir);
+            this.preferences.resetBranch("");
+        },
+        _init: function VBApp__init() {
+            this._logger.config(strutils.formatString("Initializing '%1' application: r%2 dated %3", [
+                this.name,
+                this._barCore.buidRevision,
+                this._barCore.buildDate
+            ]));
+            try {
+                this._loadParts();
+            } catch (e) {
+                this._finalizeParts();
+                throw e;
+            }
+            var resource = netutils.ioService.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
+            var alias = netutils.ioService.newFileURI(this.core.rootDir);
+            resource.setSubstitution("vb-profile-data", alias);
+            var disableBarnavigIfYBarIsActive = function (aBarAddon) {
+                    if (!aBarAddon || !aBarAddon.isActive)
+                        return;
+                    try {
+                        let barAppBarNavig = Cc["@yandex.ru/custombarcore;yasearch"].getService().wrappedJSObject.application.barnavig;
+                        if (barAppBarNavig.alwaysSendUsageStat === false)
+                            return;
+                    } catch (e) {
+                    }
+                    this._logger.config("Yandex.Bar is active. Will turn off barnavig events (page load, downloads, etc.) listening...");
+                    this.barnavig.listenStatEventsEnabled = false;
+                }.bind(this);
+            AddonManager.gre_AddonManager.getAddonByID("yasearch@yandex.ru", disableBarnavigIfYBarIsActive);
+            this.addonStatus.onApplicationInitialized();
+        },
+        _loadParts: function VBApp__loadParts() {
+            const partsDirPath = this.partsURL;
+            let (i = 0, len = this._partNames.length) {
+                for (; i < len; i++) {
+                    let partDescr = this._partNames[i];
+                    let partName = partDescr.name;
+                    let partPath = partsDirPath + partDescr.file;
+                    this._logger.debug("Loading " + partName + " part from " + partPath + "...");
+                    Cu.import(partPath, this._parts);
+                    let part = this._parts[partName];
+                    if (!part)
+                        throw new Error("Part " + partName + " not loaded!");
+                    sysutils.defineLazyGetter(this, partName, function () part);
+                    if (typeof part.init == "function") {
+                        this._logger.trace("Part " + partName + " start init...");
+                        part.init(this);
+                        this._logger.trace("Part " + partName + " inited!");
+                    }
+                }
+            }
+        },
+        _finalizeParts: function VBApp__finalizeParts(doCleanup, partsFinalizedCallback) {
+            var partNames = this._partNames;
+            var asyncFinalizingParts = {};
+            var finalizeInProgress = true;
+            var callback = function callback() {
+                if (finalizeInProgress)
+                    return;
+                if (typeof partsFinalizedCallback === "function" && sysutils.isEmptyObject(asyncFinalizingParts))
+                    partsFinalizedCallback();
+            };
+            this._partNames.reverse().forEach(function (part) {
+                var partName = part.name;
+                var part = this._parts[partName];
+                if (part && typeof part.finalize == "function") {
+                    this._logger.debug("Finalizing " + partName + " part");
+                    try {
+                        let finalizeIsAsync = part.finalize(doCleanup, function () {
+                                delete asyncFinalizingParts[partName];
+                                callback();
+                            }.bind(this));
+                        if (finalizeIsAsync === true)
+                            asyncFinalizingParts[partName] = true;
+                    } catch (e) {
+                        this._logger.error("Error finalizing part. " + strutils.formatError(e));
+                        this._logger.debug(e.stack);
+                    }
+                }
+                delete this._parts[partName];
+                delete this[partName];
+            }, this);
+            finalizeInProgress = false;
+            callback();
+        },
+        _openWindow: function VBApp__openWindow(navigatorWindow, path, windowClass, focusIfOpened, resizeable, modal, windowArgs) {
+            var baseNameMatch = path.match(/(\w+)\.x[um]l$/i);
+            windowClass = windowClass || (this.name + baseNameMatch ? ":" + baseNameMatch[1] : "");
+            if (focusIfOpened) {
+                let chromeWindow = misc.getTopWindowOfType(windowClass);
+                if (chromeWindow) {
+                    chromeWindow.focus();
+                    return chromeWindow;
+                }
+            }
+            var features = [
+                    "chrome",
+                    "titlebar",
+                    "toolbar",
+                    "centerscreen",
+                    modal ? "modal" : "dialog=no"
+                ];
+            if (resizeable)
+                features.push("resizable");
+            var ownerWindow = navigatorWindow || misc.getTopBrowserWindow();
+            var openParams = [
+                    path,
+                    windowClass,
+                    features.join()
+                ].concat(windowArgs);
+            return ownerWindow.openDialog.apply(ownerWindow, openParams);
+        },
+        _parts: {},
+        _partNames: [
+            {
+                "name": "addonManager",
+                "file": "addonmgr.js"
+            },
+            {
+                "name": "addonFS",
+                "file": "addonfs.js"
+            },
+            {
+                "name": "appStrings",
+                "file": "strbundle.js"
+            },
+            {
+                "name": "FilePackage",
+                "file": "package.js"
+            },
+            {
+                "name": "frontendHelper",
+                "file": "frontendHelper.js"
+            },
+            {
+                "name": "internalStructure",
+                "file": "internalStructure.js"
+            },
+            {
+                "name": "clids",
+                "file": "clids.js"
+            },
+            {
+                "name": "branding",
+                "file": "branding.js"
+            },
+            {
+                "name": "brandingPlus",
+                "file": "dataprovider.js"
+            },
+            {
+                "name": "addonStatus",
+                "file": "addonStatus.js"
+            },
+            {
+                "name": "installer",
+                "file": "installer.js"
+            },
+            {
+                "name": "yCookie",
+                "file": "ycookie.js"
+            },
+            {
+                "name": "aboutSupport",
+                "file": "aboutSupport.js"
+            },
+            {
+                "name": "barnavig",
+                "file": "barnavig.js"
+            },
+            {
+                "name": "metrika",
+                "file": "metrika.js"
+            },
+            {
+                "name": "databaseMigration",
+                "file": "databaseMigration.js"
+            },
+            {
+                "name": "migration",
+                "file": "migration.js"
+            },
+            {
+                "name": "backgroundImages",
+                "file": "backgroundImages.js"
+            },
+            {
+                "name": "blacklist",
+                "file": "blacklist.js"
+            },
+            {
+                "name": "usageHistory",
+                "file": "usageHistory.js"
+            },
+            {
+                "name": "protocolSupport",
+                "file": "protocolSupport.js"
+            },
+            {
+                "name": "layout",
+                "file": "layout.js"
+            },
+            {
+                "name": "syncTopHistory",
+                "file": "syncTopHistory.js"
+            },
+            {
+                "name": "syncPinned",
+                "file": "syncPinned.js"
+            },
+            {
+                "name": "sync",
+                "file": "sync.js"
+            },
+            {
+                "name": "safebrowsing",
+                "file": "safebrowsing.js"
+            },
+            {
+                "name": "colors",
+                "file": "colors.js"
+            },
+            {
+                "name": "bookmarks",
+                "file": "bookmarks.js"
+            },
+            {
+                "name": "cloudSource",
+                "file": "cloudsource.js"
+            },
+            {
+                "name": "favicons",
+                "file": "favicons.js"
+            },
+            {
+                "name": "searchSuggest",
+                "file": "searchSuggest.js"
+            },
+            {
+                "name": "screenshots",
+                "file": "screenshots.js"
+            },
+            {
+                "name": "screenshotsGrabber",
+                "file": "screenshotsGrabber.js"
+            },
+            {
+                "name": "fastdial",
+                "file": "fastdial.js"
+            },
+            {
+                "name": "thumbs",
+                "file": "thumbs.js"
+            },
+            {
+                "name": "searchExample",
+                "file": "searchExample.js"
+            },
+            {
+                "name": "backup",
+                "file": "backup.js"
+            }
+        ],
+        _delayMultiplier: 0,
+        _lastGeneratedDelay: 0
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/aboutSupport.js
@@ -0,0 +1,71 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["aboutSupport"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const GLOBAL = this;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+const aboutSupport = {
+        init: function AboutSupport_init(aApplication) {
+            aApplication.core.Lib.sysutils.copyProperties(aApplication.core.Lib, GLOBAL);
+            this._application = aApplication;
+            this._logger = this._application.getLogger("AboutSupport");
+            switch (this._application.core.CONFIG.APP.TYPE) {
+            case "barff":
+                this.aboutPrefix = "elements-support";
+                this._classID = Components.ID("{75ec0b66-60ec-11e2-90b8-60334b147402}");
+                this._classDescription = "Elements support page protocol handler";
+                break;
+            case "vbff":
+                this.aboutPrefix = "visualbookmarks-support";
+                this._classID = Components.ID("{8c844382-614d-11e2-848d-60334b147402}");
+                this._classDescription = "Visual Bookmarks support page protocol handler";
+                break;
+            }
+            Components.manager.QueryInterface(Ci.nsIComponentRegistrar).registerFactory(this._classID, this._classDescription, "@mozilla.org/network/protocol/about;1?what=" + this.aboutPrefix, this);
+        },
+        finalize: function Defender_finalize(aDoCleanup) {
+            Components.manager.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactory(this._classID, this);
+            this._logger = null;
+            this._application = null;
+        },
+        get _appName() {
+            delete this._appName;
+            switch (this._application.core.CONFIG.APP.TYPE) {
+            case "barff":
+                return this._appName = "yasearch";
+            case "vbff":
+                return this._appName = "yandex-vb";
+            }
+        },
+        get _appProtocol() {
+            delete this._appProtocol;
+            return this._appProtocol = this._application.core.CONFIG.APP.PROTOCOL || "yasearch";
+        },
+        createInstance: function AboutSupport_createInstance(outer, iid) {
+            if (outer != null)
+                throw Cr.NS_ERROR_NO_AGGREGATION;
+            return this.QueryInterface(iid);
+        },
+        QueryInterface: XPCOMUtils.generateQI([
+            Ci.nsIFactory,
+            Ci.nsIAboutModule
+        ]),
+        getURIFlags: function AboutSupport_getURIFlags(aURI) {
+            return Ci.nsIAboutModule.ALLOW_SCRIPT | Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT;
+        },
+        newChannel: function AboutSupport_newChannel(aURI) {
+            var url = "chrome://" + this._appName + "/content/support/about.xhtml";
+            var pageSource = fileutils.readStringFromStream(this._application.addonFS.getStream(url)).replace(/__APP_NAME__/g, this._appName).replace(/__APP_PROTOCOL__/g, this._appProtocol);
+            var inputStream = strutils.utf8Converter.convertToInputStream(pageSource);
+            var channel = Cc["@mozilla.org/network/input-stream-channel;1"].createInstance(Ci.nsIInputStreamChannel).QueryInterface(Ci.nsIChannel);
+            channel.setURI(aURI);
+            channel.originalURI = aURI;
+            channel.owner = sysutils.scriptSecurityManager.getSystemPrincipal();
+            channel.contentStream = inputStream;
+            return channel;
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonStatus.js
@@ -0,0 +1,396 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["addonStatus"];
+const GLOBAL = this;
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+function isErrorRequest(aReq) !!(!aReq || aReq.type == "error" || !aReq.target || aReq.target.status != 200)
+const addonStatus = {
+        init: function addonStatus_init(aApplication) {
+            this._application = aApplication;
+            aApplication.core.Lib.sysutils.copyProperties(aApplication.core.Lib, GLOBAL);
+            this._logger = aApplication.getLogger("AddonStatus");
+            this._database = new this._application.core.Lib.Database(this._logsFile, [
+                this._consts.INIT_QUERIES_TABLE_QUERY,
+                this._consts.INIT_ADDONEVENTS_TABLE_QUERY
+            ]);
+        },
+        finalize: function addonStatus_finalize(aDoCleanup, callback) {
+            if (this._collectTimer) {
+                this._collectTimer.cancel();
+                this._collectTimer = null;
+            }
+            if (this._requestTimer) {
+                this._requestTimer.cancel();
+                this._requestTimer = null;
+            }
+            if (aDoCleanup) {
+                this._sendRequestOnUninstall();
+            }
+            if (this._database) {
+                let logsFile = this._logsFile;
+                this._database.close(function addonStatus__onDBClosed() {
+                    if (aDoCleanup) {
+                        fileutils.removeFileSafe(logsFile);
+                    }
+                    callback();
+                });
+                return true;
+            }
+            this._database = null;
+            this._guidString = null;
+            return false;
+        },
+        onApplicationInitialized: function addonStatus_onApplicationInitialized() {
+            if (this._application.addonManager.info.isFreshAddonInstall) {
+                let oldDataDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
+                oldDataDir.append("yandex");
+                oldDataDir.append("ftab-data");
+                if (!oldDataDir.exists())
+                    this._logData({ stat: "install" });
+            }
+            this._startTimers();
+        },
+        get guidString() {
+            if (this._guidString !== null)
+                return this._guidString;
+            const preferences = this._application.preferences;
+            const guidPrefName = "guid.value";
+            var guidStr = "";
+            var uiFile = this._uiFile;
+            if (uiFile.exists()) {
+                try {
+                    guidStr = this._getGuidDataFromString(this._application.core.Lib.fileutils.readTextFile(uiFile));
+                } catch (e) {
+                    this._logger.error("Can not get ui from file. Error: " + e);
+                }
+            } else {
+                const WinReg = Cu.import("resource://" + this._application.name + "-mod/WinReg.jsm", {}).WinReg;
+                let uiWasCreated = false;
+                let currentWinUser;
+                if (this._appType !== "barffport") {
+                    currentWinUser = WinReg.read("HKCU", "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", "Logon User Name");
+                    if (currentWinUser)
+                        uiWasCreated = !!WinReg.read("HKCU", "Software\\Yandex", "UICreated_" + currentWinUser);
+                }
+                if (!uiWasCreated) {
+                    if (preferences.has(guidPrefName)) {
+                        guidStr = this._getGuidDataFromString(preferences.get(guidPrefName, ""));
+                    } else {
+                        guidStr = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID().toString();
+                    }
+                    if (guidStr) {
+                        try {
+                            this._application.core.Lib.fileutils.writeTextFile(uiFile, guidStr);
+                            if (currentWinUser)
+                                WinReg.write("HKCU", "Software\\Yandex", "UICreated_" + currentWinUser, 1, "int");
+                        } catch (e) {
+                            this._logger.error("Can not write ui to file. Error: " + e);
+                        }
+                    }
+                }
+            }
+            if (guidStr)
+                preferences.set(guidPrefName, guidStr);
+            return this._guidString = "" + (guidStr || "");
+        },
+        _startTimers: function addonStatus__startTimers() {
+            this._collectTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+            var nextCollectInterval = this._consts.CHECK_INTERVAL - Math.abs(this._lastCollectTime * 1000 - Date.now());
+            nextCollectInterval = Math.max(nextCollectInterval, 1 * 60 * 1000);
+            this._collectTimer.initWithCallback(this, nextCollectInterval, this._collectTimer.TYPE_ONE_SHOT);
+            this._setRequestTimer(2 * 60 * 1000);
+        },
+        testSendStat: function addonStatus_testSendStat() {
+            this.notify(this._requestTimer);
+        },
+        testCollectStat: function addonStatus_testCollectStat() {
+            this.notify(this._collectTimer);
+        },
+        notify: function addonStatus_notify(aTimer) {
+            if (!aTimer)
+                return;
+            switch (aTimer) {
+            case this._requestTimer:
+                let [
+                        id,
+                        query
+                    ] = this._getDataForSend();
+                this._sendingLogId = id;
+                if (query)
+                    this._sendRequest(this._appendTimeParamsToURLString(query));
+                break;
+            case this._collectTimer:
+                this._logData();
+                this._collectTimer.initWithCallback(this, this._consts.CHECK_INTERVAL * 1000, this._collectTimer.TYPE_ONE_SHOT);
+                break;
+            default:
+                break;
+            }
+        },
+        logAddonEvents: function addonStatus_logAddonEvents(aEvents) {
+            this._database.execQuery("BEGIN TRANSACTION");
+            for (let [
+                        key,
+                        value
+                    ] in Iterator(aEvents)) {
+                this._database.execQuery("INSERT OR REPLACE INTO addonevents (key, value) VALUES (:key, :value)", {
+                    key: key,
+                    value: "" + value
+                });
+            }
+            this._database.execQuery("COMMIT TRANSACTION");
+        },
+        fetchAddonEvents: function addonStatus_fetchAddonEvents() {
+            var rows = this._database.execQuery("SELECT * FROM addonevents");
+            this.clearAddonEvents();
+            return rows;
+        },
+        clearAddonEvents: function addonStatus_clearAddonEvents() {
+            this._database.execQuery("DELETE FROM addonevents");
+        },
+        _collectTimer: null,
+        _requestTimer: null,
+        _sendingLogId: null,
+        _database: null,
+        _guidString: null,
+        _consts: {
+            LAST_COLLECT_TIME_PREF_NAME: "daylyaddonstat.collect",
+            LAST_SEND_TIME_PREF_NAME: "daylyaddonstat.send",
+            CLIDS_DATE_PREF_NAME: "clids.creationDate",
+            CHECK_INTERVAL: 24 * 60 * 60 * 1000,
+            STAT_URL: "http://soft.export.yandex.ru/status.xml",
+            INIT_QUERIES_TABLE_QUERY: "            CREATE TABLE IF NOT EXISTS queries (                id INTEGER PRIMARY KEY,                         query BLOB,                                     timeCreated INTEGER,                            sendAttempts INTEGER                        )",
+            INIT_ADDONEVENTS_TABLE_QUERY: "            CREATE TABLE IF NOT EXISTS addonevents (                key TEXT,                                           value BLOB                                  )"
+        },
+        _appendTimeParamsToURLString: function addonsStatus__appendTimeParamsToURLString(aQuery) {
+            var query = aQuery + "&tl=" + encodeURIComponent(this._lastSendTime);
+            var clidsCreationDate = this._clidsCreationDate;
+            if (clidsCreationDate !== null) {
+                if (!clidsCreationDate) {
+                    clidsCreationDate = strutils.formatDate(new Date(), "%Y.%M.%D");
+                }
+                query += "&fd=" + encodeURIComponent(clidsCreationDate);
+            }
+            return query;
+        },
+        get _logsFile() {
+            var logsFile = this._application.directories.appRootDir;
+            logsFile.append("addonstat.sqlite");
+            return logsFile;
+        },
+        _logData: function addonStatus__logData(aData) {
+            this._lastCollectTime = Date.now();
+            var onDataInserted = function onDataInserted() {
+                    this._cleanupLoggedData();
+                    this._setRequestTimer();
+                }.bind(this);
+            this._database.execQueryAsync("INSERT INTO queries (query, timeCreated, sendAttempts)                                        VALUES (:query, :timeCreated, :sendAttempts)", {
+                query: this._collectData(aData),
+                timeCreated: Date.now(),
+                sendAttempts: 0
+            }, onDataInserted);
+        },
+        _cleanupLoggedData: function addonsStatus__cleanupLoggedData() {
+            this._database.execQueryAsync("DELETE FROM queries                                        WHERE (timeCreated < :timeCreated OR sendAttempts > :sendAttempts)", {
+                timeCreated: Date.now() - 2 * 24 * 60 * 60 * 1000,
+                sendAttempts: 5
+            });
+        },
+        _collectData: function addonStatus__collectData(aData) {
+            var data = this._versionData;
+            var rows = this.fetchAddonEvents();
+            if (rows && rows.length) {
+                let (i = 0, len = rows.length) {
+                    for (; i < len; i++)
+                        data[rows[i].key] = rows[i].value;
+                }
+            }
+            var defender = this._application.defender;
+            if (defender) {
+                let defenceTimesData = defender.changesTime;
+                if (defenceTimesData) {
+                    for (let [
+                                propName,
+                                propValue
+                            ] in Iterator(defenceTimesData))
+                        data[propName] = propValue;
+                    defender.changesTime = null;
+                }
+            }
+            if (aData) {
+                for (let [
+                            propName,
+                            propValue
+                        ] in Iterator(aData))
+                    data[propName] = propValue;
+            }
+            var dataArray = [];
+            for (let [
+                        propName,
+                        propValue
+                    ] in Iterator(data))
+                dataArray.push(propName + "=" + encodeURIComponent(propValue));
+            return dataArray.join("&");
+        },
+        _getDataForSend: function addonStatus__getDataForSend() {
+            var id = null;
+            var query = null;
+            var queryData = this._database.execQuery("SELECT id, query FROM queries LIMIT 1")[0];
+            if (queryData) {
+                id = queryData.id;
+                query = queryData.query;
+            }
+            return [
+                id,
+                query
+            ];
+        },
+        _setRequestTimer: function addonStatus__setRequestTimer(aTimeout) {
+            if (this._requestTimer)
+                this._requestTimer.cancel();
+            else
+                this._requestTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+            this._requestTimer.initWithCallback(this, aTimeout || 1000, this._requestTimer.TYPE_ONE_SHOT);
+        },
+        _sendRequestOnUninstall: function addonStatus__sendRequestOnUninstall() {
+            var url = this._consts.STAT_URL + "?";
+            var versionData = this._versionData;
+            var data2Server = [];
+            [
+                "yasoft",
+                "brandID",
+                "ui",
+                "ver",
+                "os",
+                "clid",
+                "lang",
+                "bn",
+                "bv"
+            ].forEach(function (prop) {
+                if (versionData[prop])
+                    data2Server.push(prop + "=" + encodeURIComponent(versionData[prop]));
+            });
+            data2Server.push("stat=uninstall");
+            url += data2Server.join("&");
+            url = this._appendTimeParamsToURLString(url);
+            var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            req.open("GET", url, false);
+            req.send(null);
+        },
+        _sendRequest: function addonStatus__sendRequest(aQuery) {
+            var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            request.mozBackgroundRequest = true;
+            request.open("GET", this._consts.STAT_URL + "?" + aQuery, true);
+            request.setRequestHeader("Cache-Control", "no-cache");
+            var callbackFunc = function callbackFunc(aResponse) this._onResponse(aResponse);
+            callbackFunc = callbackFunc.bind(this);
+            var target = request.QueryInterface(Ci.nsIDOMEventTarget);
+            target.addEventListener("load", callbackFunc, false);
+            target.addEventListener("error", callbackFunc, false);
+            request.send(null);
+        },
+        _onResponse: function addonStatus__onResponse(aRequest) {
+            if (!this._sendingLogId)
+                throw new Error("Unexpected ID of sended log data.");
+            if (isErrorRequest(aRequest)) {
+                this._database.execQueryAsync("UPDATE queries SET sendAttempts = sendAttempts + 1 WHERE id = :id", { id: this._sendingLogId });
+            } else {
+                this._database.execQueryAsync("DELETE FROM queries WHERE id = :id", { id: this._sendingLogId });
+                this._lastSendTime = Date.now();
+                this._clidsCreationDate = new Date();
+            }
+            this._sendingLogId = null;
+            this._setRequestTimer(5 * 60 * 1000);
+            this._cleanupLoggedData();
+        },
+        get _versionData() {
+            var gApp = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).QueryInterface(Ci.nsIXULRuntime);
+            var versionData = {
+                    stat: "dayuse",
+                    ui: this.guidString,
+                    ver: this._application.addonManager.addonVersion,
+                    lang: this._application.locale.language,
+                    bn: gApp.name,
+                    bv: gApp.version,
+                    os: gApp.OS,
+                    yasoft: this._appType,
+                    brandID: this._appBrandID
+                };
+            var clidData = this._application.clids.vendorData.clid1;
+            if (clidData && clidData.clidAndVid)
+                versionData.clid = clidData.clidAndVid;
+            return versionData;
+        },
+        get _appType() {
+            var appType = this._application.core.CONFIG.APP.TYPE;
+            this.__defineGetter__("_AppType", function _AppType() appType);
+            return this._AppType;
+        },
+        get _appBrandID() {
+            return this._application.branding.productInfo.BrandID.toString();
+        },
+        get _lastCollectTime() {
+            var collectTimePrefValue = this._application.preferences.get(this._consts.LAST_COLLECT_TIME_PREF_NAME, 0);
+            return parseInt(collectTimePrefValue, 10) || 0;
+        },
+        set _lastCollectTime(aTimestamp) {
+            var secondsSinceUnixEpoch = Math.floor((aTimestamp || Date.now()) / 1000);
+            this._application.preferences.set(this._consts.LAST_COLLECT_TIME_PREF_NAME, secondsSinceUnixEpoch);
+        },
+        get _lastSendTime() {
+            var sendTimePrefValue = this._application.preferences.get(this._consts.LAST_SEND_TIME_PREF_NAME, 0);
+            var lastSendTime = parseInt(sendTimePrefValue, 10) || 0;
+            if (!lastSendTime && this._appType === "barff") {
+                let oldBarSendTime = this._application.core.Lib.Preferences.get("yasearch.guid.time", 0);
+                oldBarSendTime = oldBarSendTime && new Date(parseInt(oldBarSendTime, 10)).valueOf();
+                lastSendTime = Math.floor(oldBarSendTime && oldBarSendTime / 1000 || 0);
+            }
+            return lastSendTime;
+        },
+        set _lastSendTime(aTimestamp) {
+            var secondsSinceUnixEpoch = Math.floor((aTimestamp || Date.now()) / 1000);
+            this._application.preferences.set(this._consts.LAST_SEND_TIME_PREF_NAME, secondsSinceUnixEpoch);
+        },
+        get _clidsCreationDate() {
+            var dateString = this._application.preferences.get(this._consts.CLIDS_DATE_PREF_NAME, "");
+            if (!dateString && this._appType === "barff")
+                dateString = this._application.core.Lib.Preferences.get("yasearch.guid.clids.creationDate", "");
+            if (!dateString)
+                return "";
+            dateString = dateString.split(this._clidsCreationDatePrefPrefix)[1];
+            return (dateString && /^\d{4}\.\d{2}\.\d{2}$/.test(dateString) ? dateString : null) || null;
+        },
+        set _clidsCreationDate(aDate) {
+            if (this._clidsCreationDate)
+                return;
+            if (!(aDate instanceof Date) || isNaN(aDate.getTime())) {
+                this._logger.error("Bad Date for clidsCreationDate setter.");
+                return;
+            }
+            var dateString = strutils.formatDate(aDate, "%Y.%M.%D");
+            this._application.preferences.set(this._consts.CLIDS_DATE_PREF_NAME, this._clidsCreationDatePrefPrefix + dateString);
+        },
+        get _clidsCreationDatePrefPrefix() {
+            var clidData = this._application.clids.vendorData.clid1;
+            var clid = clidData && clidData.clid || "";
+            var prefix = [
+                    clid,
+                    this.guidString,
+                    this._appType
+                ].join(":") + ":";
+            this.__defineGetter__("_clidsCreationDatePrefPrefix", function _clidsCreationDatePrefPrefix() prefix);
+            return this._clidsCreationDatePrefPrefix;
+        },
+        get _uiFile() {
+            var vendorFile = this._application.directories.userDir;
+            vendorFile.append("ui");
+            return vendorFile;
+        },
+        _getGuidDataFromString: function addonStatus__getGuidDataFromString(aGuidString) {
+            var guid = aGuidString && aGuidString.toString();
+            return guid && /^\{[0-9a-f]{2,8}(\-[0-9a-f]{2,4}){2}\-[0-9a-f]{1,4}\-[0-9a-f]{2,12}\}$/i.test(guid) ? guid : false;
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonfs.js
@@ -0,0 +1,106 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["addonFS"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+const PERMS_FILE = parseInt("0644", 8);
+const PERMS_DIRECTORY = parseInt("0755", 8);
+const PERMS_OWNER_FULL = parseInt("0700", 8);
+const addonFS = {
+        init: function AddonFS_init(application) {
+            this._logger = application.getLogger("AddonFS");
+            this._CHROME_APP_PATH = "chrome://" + application.name + "/";
+            this._EXTENSION_PATH_FILE = application.core.extensionPathFile;
+        },
+        getChannel: function AddonFS_getChannel(path) {
+            return Services.io.newChannelFromURI(this._convertPathToURI(path));
+        },
+        getStream: function AddonFS_getStream(path) {
+            return this.getChannel(path).open();
+        },
+        copySource: function AddonFS_copySource(aSource, aDestination, aNewName, aPermissions) {
+            if (!(aDestination instanceof Ci.nsIFile))
+                throw new TypeError("nsIFile required");
+            var destination = aDestination.clone();
+            var sourceURI = this._convertPathToURI(aSource);
+            if (sourceURI.schemeIs("chrome"))
+                sourceURI = this._CHROME_REGISTRY_SERVICE.convertChromeURL(sourceURI);
+            switch (sourceURI.scheme) {
+            case "jar": {
+                    let jarURI = sourceURI.QueryInterface(Ci.nsIJARURI);
+                    let entryPath = jarURI.JAREntry;
+                    this._logger.debug("JAR entry requested: " + entryPath);
+                    if (!entryPath)
+                        break;
+                    let archiveFile = jarURI.JARFile.QueryInterface(Ci.nsIFileURL).file;
+                    let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].createInstance(Ci.nsIZipReader);
+                    zipReader.open(archiveFile);
+                    try {
+                        if (!zipReader.hasEntry(entryPath)) {
+                            entryPath = entryPath.replace(/(\/?)$/, "/");
+                        }
+                        if (!zipReader.hasEntry(entryPath))
+                            throw new Error("No JAR entry for " + aSource);
+                        let getTargetFile = function (aTargetPath) {
+                            var targetFile = destination.clone();
+                            aTargetPath.replace(entryPath, "").split("/").forEach(function (aPart) targetFile.append(aPart));
+                            return targetFile;
+                        };
+                        let zipEntry = zipReader.getEntry(entryPath);
+                        if (!zipEntry.isDirectory) {
+                            let targetPath = entryPath + "/" + (aNewName || entryPath.split("/").pop());
+                            let targetFile = getTargetFile(targetPath);
+                            if (!targetFile.exists()) {
+                                targetFile.create(Ci.nsIFile.FILE_TYPE, PERMS_FILE);
+                            }
+                            zipReader.extract(entryPath, targetFile);
+                            targetFile.permissions = aPermissions || PERMS_FILE;
+                            return;
+                        }
+                        destination.append(aNewName || jarEntry.split("/").slice(-2, -1)[0] || "");
+                        let entries = zipReader.findEntries(entryPath + "*");
+                        while (entries.hasMore()) {
+                            let entryPath = entries.getNext();
+                            let targetFile = getTargetFile(entryPath);
+                            if (!targetFile.exists())
+                                targetFile.create(Ci.nsIFile.DIRECTORY_TYPE, aPermissions || PERMS_DIRECTORY);
+                            else if (targetFile.isDirectory())
+                                continue;
+                            zipReader.extract(entryPath, targetFile);
+                            targetFile.permissions = zipReader.getEntry(entryPath).isDirectory ? PERMS_DIRECTORY : PERMS_FILE;
+                        }
+                    } finally {
+                        zipReader.close();
+                    }
+                    break;
+                }
+            case "file": {
+                    let protocolHandler = Cc["@mozilla.org/network/protocol;1?name=file"].createInstance(Ci.nsIFileProtocolHandler);
+                    let file = protocolHandler.getFileFromURLSpec(sourceURI.spec);
+                    if (file instanceof Ci.nsIFile) {
+                        file.copyTo(destination, aNewName || "");
+                        file.permissions = aPermissions || (file.isDirectory() ? PERMS_DIRECTORY : PERMS_FILE);
+                    }
+                    break;
+                }
+            default:
+                throw new Error("Copying from '" + sourceURI.scheme + "' scheme is not implemented");
+            }
+        },
+        _CHROME_APP_PATH: undefined,
+        _EXTENSION_PATH_FILE: undefined,
+        _CHROME_REGISTRY_SERVICE: Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry),
+        _convertPathToURI: function AddonFS__convertPathToURI(aPath) {
+            if (!(typeof aPath == "string"))
+                throw new TypeError("String required");
+            var path = aPath.replace(/^\$(content|locale|skin)\//, this._CHROME_APP_PATH + "$1/").replace(/^\$chrome\//, this._CHROME_APP_PATH);
+            if (path.indexOf("chrome://") == 0)
+                return Services.io.newURI(path, null, null);
+            var file = this._EXTENSION_PATH_FILE.clone();
+            aPath.split("/").forEach(function (part) file.append(part));
+            return Services.io.newFileURI(file);
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/addonmgr.js
@@ -0,0 +1,98 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["addonManager"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const GLOBAL = this;
+const addonManager = {
+        init: function AddonManager_init(aApplication) {
+            this._application = aApplication;
+            aApplication.core.Lib.sysutils.copyProperties(aApplication.core.Lib, GLOBAL);
+            this._logger = aApplication.getLogger("AddonMgr");
+            this.info = {
+                __proto__: null,
+                addonVersionState: 0,
+                get addonVersionChanged() this.addonVersionState != 0,
+                get addonUpgraded() this.addonVersionState > 0,
+                get addonDowngraded() this.addonVersionState < 0,
+                addonLastVersion: "0",
+                buildNumberChanged: false,
+                get isFreshAddonInstall() this.addonLastVersion === "0"
+            };
+            AddonManager.watchAddonUninstall(this.addonId);
+            this._checkVersions();
+        },
+        finalize: function AddonManager_finalize() {
+            this._application = null;
+            this.info = null;
+        },
+        get addonDir() {
+            return this._application.core.extensionPathFile;
+        },
+        get addonId() {
+            var id = AddonManager.getAddonId(this.addonDir);
+            this.__defineGetter__("addonId", function addonId() id);
+            return this.addonId;
+        },
+        get addonVersion() {
+            var ver = AddonManager.getAddonVersion(this.addonDir);
+            this.__defineGetter__("addonVersion", function addonVersion() ver);
+            return this.addonVersion;
+        },
+        get isAddonUninstalling() {
+            return AddonManager.isAddonUninstalling(this.addonId);
+        },
+        isAddonDisabled: function AddonManager_isAddonDisabled() {
+            var defer = promise.defer();
+            AddonManager.getAddonsByIDs([this.addonId], function (addons) {
+                defer.resolve(addons.length && addons[0].userDisabled || false);
+            });
+            return defer.promise;
+        },
+        disableAddon: function AddonManager_disableAddon() {
+            AddonManager.disableAddonByID(this.addonId, function AddonManager__disableAddon() {
+                var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+                timer.initWithCallback({
+                    notify: function AddonManager__disableAddonTimed() {
+                        const nsIAppStartup = Ci.nsIAppStartup;
+                        Cc["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup).quit(nsIAppStartup.eForceQuit | nsIAppStartup.eRestart);
+                    }
+                }, 50, timer.TYPE_ONE_SHOT);
+            });
+        },
+        removeAddon: function AddonManager_removeAddon() {
+            var ftabUrl = this._application.protocolSupport.url;
+            this._application.installer.closeTabs(ftabUrl);
+            AddonManager.uninstallAddonsByIDs([this.addonId], true, function AddonManager_getAddonByID(addon) {
+                Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore).getBrowserState();
+            });
+        },
+        get _addonLastInstalledVersion() {
+            return Preferences.get("extensions." + this.addonId + ".versions.lastAddon", "0");
+        },
+        set _addonLastInstalledVersion(aValue) {
+            Preferences.set("extensions." + this.addonId + ".versions.lastAddon", aValue);
+        },
+        get _lastRunBuildNumber() {
+            return Preferences.get("extensions." + this.addonId + ".versions.lastBuild", 0);
+        },
+        set _lastRunBuildNumber(aValue) {
+            Preferences.overwrite("extensions." + this.addonId + ".versions.lastBuild", aValue);
+        },
+        _checkVersions: function AddonManager__checkVersions() {
+            var currentVersion = this.addonVersion;
+            var lastVersion = this._addonLastInstalledVersion;
+            this.info.addonLastVersion = lastVersion;
+            const versionComparator = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator);
+            this.info.addonVersionState = versionComparator.compare(currentVersion, lastVersion);
+            this.info.buildNumberChanged = this._lastRunBuildNumber != this._application.core.buidRevision;
+        },
+        saveBuildDataToPreferences: function AddonManager_saveBuildDataToPreferences() {
+            this._addonLastInstalledVersion = this.addonVersion;
+            this._lastRunBuildNumber = this._application.core.buidRevision;
+        },
+        _application: null,
+        _logger: null
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/backgroundImages.js
@@ -0,0 +1,473 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["backgroundImages"];
+const GLOBAL = this;
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const SYNC_JSON_URL = "https://download.cdn.yandex.net/bar/vb/bgs.json";
+const BG_IMAGES_BASEPATH = "resource://vb-profile-data/backgroundImages/";
+const USER_FILE_LEAFNAME = "user.jpg";
+const INTERVAL_SEC = 86400;
+const PREF_LAST_REQUEST_TIME = "backgroundImages.lastRequestTime";
+const PREF_HEADER_LASTMODIFIED = "backgroundImages.lastModified";
+const PREF_LAST_SYNCED_VERSION = "backgroundImages.lastVersion";
+const PREF_SELECTED_SKIN = "ftabs.backgroundImage";
+const OVERLAY_FILENAME = "skins_fontcolors.json";
+const OVERLAY_COLOR_WHITE = "ffffff";
+const OVERLAY_COLOR_BLACK = "000000";
+const MODIFICATOR_OVERLAY_NEEDS_BLACK = "vb-sync_status-bg";
+const MAX_DOWNLOAD_BACKGROUND_MS = 30000;
+const backgroundImages = {
+        init: function BackgroundImages_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("BackgroundImages");
+            this._initFileSystem();
+            var now = Math.round(Date.now() / 1000);
+            var lastRequestTime = this._application.preferences.get(PREF_LAST_REQUEST_TIME, 0);
+            var requestDateDiff = Math.abs(now - lastRequestTime);
+            var requestTimeoutMs = Math.max(INTERVAL_SEC - requestDateDiff, 0) * 1000;
+            this._syncTimer = new sysutils.Timer(this._sync.bind(this), requestTimeoutMs, INTERVAL_SEC * 1000);
+        },
+        finalize: function BackgroundImages_finalize(doCleanup, callback) {
+            Object.keys(this._downloadTasks).forEach(function (downloadTask) {
+                downloadTask.abort(Components.results.NS_ERROR_NET_INTERRUPT);
+            });
+            this._application = null;
+            this._logger = null;
+        },
+        get list() {
+            var cloudSkins = this._cloudSkins;
+            var downloadedCloudSkins = {};
+            var output = {};
+            var previouslySelectedImage;
+            this._brandingSkins.forEach(function (imgFile) {
+                var uri = BG_IMAGES_BASEPATH + imgFile.leafName;
+                output[imgFile.leafName] = {
+                    id: imgFile.leafName,
+                    preview: uri,
+                    image: uri
+                };
+            });
+            var bgImagesDirEntries = this._imagesDir.directoryEntries;
+            while (bgImagesDirEntries.hasMoreElements()) {
+                let imgFile = bgImagesDirEntries.getNext().QueryInterface(Ci.nsIFile);
+                if (/^\./.test(imgFile.leafName) || imgFile.leafName === USER_FILE_LEAFNAME || output[imgFile.leafName] !== undefined) {
+                    continue;
+                }
+                let uri = BG_IMAGES_BASEPATH + imgFile.leafName;
+                if (cloudSkins[imgFile.leafName] !== undefined) {
+                    downloadedCloudSkins[imgFile.leafName] = uri;
+                } else {
+                    output[imgFile.leafName] = {
+                        id: imgFile.leafName,
+                        preview: uri,
+                        image: uri
+                    };
+                }
+            }
+            Object.keys(cloudSkins).forEach(function (id) {
+                output[id] = cloudSkins[id];
+                if (downloadedCloudSkins[id]) {
+                    output[id].image = downloadedCloudSkins[id];
+                }
+            });
+            return Object.keys(output).map(function (key) output[key]);
+        },
+        get userImageURL() {
+            this._userUploadedRandom = this._userUploadedRandom || Math.floor(Math.random() * Date.now());
+            var userUploadedFile = this._imagesDir;
+            userUploadedFile.append(USER_FILE_LEAFNAME);
+            return userUploadedFile.exists() && userUploadedFile.isFile() && userUploadedFile.isReadable() ? BG_IMAGES_BASEPATH + userUploadedFile.leafName + "?rnd=" + this._userUploadedRandom : null;
+        },
+        get currentSelected() {
+            var prefValue = this._application.preferences.get(PREF_SELECTED_SKIN, "");
+            var fontColors = this._fontColors;
+            var output = {
+                    id: "",
+                    color: OVERLAY_COLOR_BLACK,
+                    image: "",
+                    preview: ""
+                };
+            if (prefValue === USER_FILE_LEAFNAME) {
+                let userImageURL = this.userImageURL;
+                if (userImageURL) {
+                    output.id = userImageURL;
+                    output.image = userImageURL;
+                    output.preview = userImageURL;
+                    if (fontColors[USER_FILE_LEAFNAME]) {
+                        output.color = fontColors[USER_FILE_LEAFNAME];
+                    } else {
+                        this._calculateFontColor(USER_FILE_LEAFNAME);
+                    }
+                }
+                return output;
+            }
+            this.list.forEach(function ({
+                id: id,
+                image: image,
+                preview: preview,
+                color: color
+            }) {
+                if (output.image)
+                    return;
+                var leafName = image.split("/").pop();
+                if (leafName !== prefValue)
+                    return;
+                output.id = id;
+                output.preview = preview;
+                output.image = image;
+                if (fontColors[leafName]) {
+                    output.color = fontColors[leafName];
+                } else if (color) {
+                    output.color = color;
+                } else {
+                    this._calculateFontColor(image);
+                }
+            }, this);
+            return output;
+        },
+        select: function BackgroundImages_select(outerWindowId, id) {
+            this._logger.debug("Select " + id + " as background, windowId: " + outerWindowId);
+            var fontColors = this._fontColors;
+            this._waitingForBackground = null;
+            if (id === "user") {
+                let userImageURL = this.userImageURL;
+                if (!userImageURL) {
+                    this._logger.error("User-uploaded image needs to be set as background, but it does not exist");
+                    return;
+                }
+                this._application.preferences.set(PREF_SELECTED_SKIN, USER_FILE_LEAFNAME);
+                this._application.fastdial.sendRequest("backgroundChanged", {
+                    image: userImageURL,
+                    color: fontColors[USER_FILE_LEAFNAME] || OVERLAY_COLOR_BLACK
+                });
+                if (fontColors[USER_FILE_LEAFNAME] === undefined) {
+                    this._calculateFontColor(USER_FILE_LEAFNAME);
+                }
+                return;
+            }
+            if (this._downloadTasks[id]) {
+                this._logger.trace("Background '" + id + "' downloading process has already been started");
+                return;
+            }
+            var skinSelectedData;
+            this.list.forEach(function (skinData) {
+                if (skinSelectedData || skinData.id !== id)
+                    return;
+                skinSelectedData = skinData;
+            });
+            if (!skinSelectedData) {
+                this._logger.error("Selected skin doesn't exist in skins list: " + id);
+                return;
+            }
+            var leafName = skinSelectedData.image.split("/").pop();
+            var resultFile = this._imagesDir;
+            resultFile.append(leafName);
+            var resultFileExists = resultFile.exists() && resultFile.isFile() && resultFile.isReadable();
+            if (resultFileExists) {
+                this._logger.trace("Background '" + id + "' has already been downloaded");
+                this._application.preferences.set(PREF_SELECTED_SKIN, leafName);
+                let fontColor;
+                if (this._cloudSkins[leafName] !== undefined) {
+                    fontColor = this._cloudSkins[leafName].color;
+                } else if (fontColors[leafName] !== undefined) {
+                    fontColor = fontColors[leafName];
+                } else {
+                    fontColor = OVERLAY_COLOR_BLACK;
+                }
+                this._application.fastdial.sendRequest("backgroundChanged", {
+                    image: BG_IMAGES_BASEPATH + leafName,
+                    color: fontColor
+                });
+                return;
+            }
+            var self = this;
+            this._downloadTasks[id] = new netutils.DownloadTask(skinSelectedData.image, resultFile);
+            this._waitingForBackground = skinSelectedData.image;
+            var timer = new sysutils.Timer(function () {
+                    this._downloadTasks[id].abort(Cr.NS_ERROR_NET_TIMEOUT);
+                }.bind(this), MAX_DOWNLOAD_BACKGROUND_MS);
+            this._downloadTasks[id].start({
+                onTaskFinished: function (task) {
+                    var isStatusOK = task.statusCode === Cr.NS_OK;
+                    var isImageDownloaded = isStatusOK && task.findHttpResponseHeader("content-type").indexOf("image/") === 0;
+                    var isDownloadOK = isImageDownloaded && resultFile.fileSize > 0;
+                    if (isDownloadOK) {
+                        timer.cancel();
+                        self._logger.debug("Background '" + id + "' downloaded");
+                        if (self._cloudSkins[leafName] !== undefined) {
+                            fontColors[leafName] = self._cloudSkins[leafName].color;
+                        } else if (fontColors[leafName] === undefined) {
+                            self._calculateFontColor(skinSelectedData.image);
+                        }
+                        if (self._waitingForBackground === skinSelectedData.image) {
+                            self._application.preferences.set(PREF_SELECTED_SKIN, leafName);
+                            self._application.fastdial.sendRequest("backgroundChanged", {
+                                image: BG_IMAGES_BASEPATH + leafName,
+                                color: fontColors[leafName] || OVERLAY_COLOR_BLACK
+                            });
+                        }
+                    } else {
+                        self._logger.warn("Background '" + id + "' download process failed: " + task.statusCode);
+                        fileutils.removeFileSafe(resultFile);
+                        self._application.fastdial.sendRequestToTab(outerWindowId, "backgroundChanged", { error: true });
+                    }
+                    delete self._downloadTasks[id];
+                    if (timer.isRunning) {
+                        timer.cancel();
+                    }
+                },
+                onTaskProgress: function () {
+                }
+            });
+        },
+        upload: function BackgroundImages_upload(aWindow, callback) {
+            var filepickerBundle = new this._application.appStrings.StringBundle("chrome://global/locale/filepicker.properties");
+            var filterTitle = filepickerBundle.tryGet("imageTitle");
+            if (filterTitle.length === 0) {
+                this._logger.warn("Can not find \"imageTitle\" key in the filepicker.properties");
+            }
+            var filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+            filePicker.init(aWindow, null, filePicker.modeOpen);
+            filePicker.appendFilter(filterTitle, "*.jpg; *.jpeg; *.gif; *.png");
+            var modalDialog = filePicker.show();
+            if (modalDialog !== filePicker.returnOK)
+                return callback("");
+            this._userUploadedRandom = null;
+            var resultFile = this._imagesDir;
+            resultFile.append(USER_FILE_LEAFNAME);
+            fileutils.removeFileSafe(resultFile);
+            var output = "";
+            try {
+                filePicker.file.copyTo(this._imagesDir, USER_FILE_LEAFNAME);
+                output = this.userImageURL;
+                let fontColors = this._fontColors;
+                delete fontColors[USER_FILE_LEAFNAME];
+                this._fontColors = fontColors;
+            } catch (ex) {
+                this._logger.error("Could not copy user image: " + strutils.formatError(ex));
+                this._logger.debug(ex.stack);
+            }
+            callback(output);
+        },
+        get _imagesDir() {
+            var bgImagesDir = this._application.core.rootDir;
+            bgImagesDir.append("backgroundImages");
+            return bgImagesDir;
+        },
+        get _skinsFile() {
+            var resultFile = this._application.core.rootDir;
+            resultFile.append("skins.json");
+            return resultFile;
+        },
+        get _cloudSkins() {
+            var skinsFile = this._skinsFile;
+            var output = {};
+            var skinsData;
+            if (skinsFile.exists() && skinsFile.isFile() && skinsFile.isReadable()) {
+                try {
+                    skinsData = fileutils.jsonFromFile(skinsFile);
+                } catch (ex) {
+                    this._logger.error(ex.message);
+                    this._logger.debug(ex.stack);
+                }
+            }
+            (skinsData || []).forEach(function ({
+                id: id,
+                preview: preview,
+                image: image,
+                modificators: modificators
+            }) {
+                var leafName = image.split("/").pop();
+                if (preview && image) {
+                    output[leafName] = {
+                        id: id,
+                        preview: preview,
+                        image: image,
+                        color: Array.isArray(modificators) && modificators[0] === MODIFICATOR_OVERLAY_NEEDS_BLACK ? OVERLAY_COLOR_BLACK : OVERLAY_COLOR_WHITE
+                    };
+                }
+            });
+            return output;
+        },
+        get _brandingSkins() {
+            var brandingBgImages = this._application.branding.brandPackage.findFile("fastdial/backgrounds/").directoryEntries;
+            var output = [];
+            while (brandingBgImages.hasMoreElements()) {
+                let imgFile = brandingBgImages.getNext().QueryInterface(Ci.nsIFile);
+                if (/^\./.test(imgFile.leafName))
+                    continue;
+                output.push(imgFile);
+            }
+            delete this._brandingSkins;
+            return this._brandingSkins = output;
+        },
+        get brandingXMLDoc() {
+            delete this.brandingXMLDoc;
+            return this.brandingXMLDoc = this._application.branding.brandPackage.getXMLDocument("fastdial/config.xml");
+        },
+        _initFileSystem: function BackgroundImages__initFileSystem() {
+            var bgImagesDir = this._imagesDir;
+            var needsUpdateDirContents = false;
+            if (!bgImagesDir.exists()) {
+                bgImagesDir.create(Ci.nsIFile.DIRECTORY_TYPE, fileutils.PERMS_DIRECTORY);
+                needsUpdateDirContents = true;
+            }
+            var appInfo = this._application.addonManager.info;
+            if (needsUpdateDirContents || appInfo.isFreshAddonInstall || appInfo.addonUpgraded) {
+                this._logger.debug("Update background images directory contents");
+                let backgroundImagePref = this._application.preferences.get(PREF_SELECTED_SKIN, "");
+                let files = bgImagesDir.directoryEntries;
+                while (files.hasMoreElements()) {
+                    let imgFile = files.getNext().QueryInterface(Ci.nsIFile);
+                    if (/^\./.test(imgFile.leafName) || imgFile.leafName === USER_FILE_LEAFNAME || imgFile.leafName === backgroundImagePref) {
+                        continue;
+                    }
+                    this._logger.debug("Remove " + imgFile.leafName + " skin");
+                    fileutils.removeFileSafe(imgFile);
+                }
+                this._brandingSkins.forEach(function (imgFile) {
+                    try {
+                        imgFile.copyTo(bgImagesDir, imgFile.leafName);
+                        this._logger.debug("Copy " + imgFile.leafName + " skin");
+                    } catch (ex) {
+                    }
+                }, this);
+                let forceChangeBg = false;
+                if (backgroundImagePref) {
+                    let bgImage = bgImagesDir.clone();
+                    bgImage.append(backgroundImagePref);
+                    if (!bgImage.exists() || !bgImage.isFile() || !bgImage.isReadable()) {
+                        forceChangeBg = true;
+                    }
+                }
+                let backgroundElem = this.brandingXMLDoc.querySelector("background");
+                let hasJustMigrated = appInfo.isFreshAddonInstall && this._application.preferences.get("yabar.migrated", false) || appInfo.addonUpgraded && /^1\./.test(appInfo.addonLastVersion);
+                let force = forceChangeBg || backgroundElem.getAttribute("force") === "true" || hasJustMigrated && this._application.preferences.get(PREF_SELECTED_SKIN).length === 0;
+                if (force || appInfo.isFreshAddonInstall && this._application.preferences.get("yabar.migrated", false) === false) {
+                    this._application.preferences.set(PREF_SELECTED_SKIN, backgroundElem.getAttribute("file"));
+                }
+            }
+        },
+        _sync: function BackgroundImages_sync() {
+            var self = this;
+            this._logger.debug("Sync background images");
+            var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            request.mozBackgroundRequest = true;
+            request.QueryInterface(Ci.nsIDOMEventTarget);
+            request.open("GET", SYNC_JSON_URL, true);
+            request.responseType = "json";
+            var skinsFile = this._skinsFile;
+            var skinsFileExists = skinsFile.exists() && skinsFile.isFile() && skinsFile.isReadable();
+            if (!skinsFileExists) {
+                this._application.preferences.reset(PREF_LAST_SYNCED_VERSION);
+            }
+            var lastModified = this._application.preferences.get(PREF_HEADER_LASTMODIFIED);
+            if (lastModified && skinsFileExists) {
+                request.setRequestHeader("If-Modified-Since", lastModified);
+            }
+            var timer = new sysutils.Timer(request.abort.bind(request), 10000);
+            request.addEventListener("load", function () {
+                timer.cancel();
+                var now = Math.round(Date.now() / 1000);
+                self._application.preferences.set(PREF_LAST_REQUEST_TIME, now);
+                if (request.status === 304) {
+                    self._logger.debug("JSON file on server has not yet changed, status = 304");
+                    return;
+                }
+                if (!request.response) {
+                    self._logger.error("Not valid JSON: " + request.responseText);
+                    return;
+                }
+                var lastModified = request.getResponseHeader("last-modified");
+                if (lastModified) {
+                    self._application.preferences.set(PREF_HEADER_LASTMODIFIED, lastModified);
+                }
+                var lastVersion = self._application.preferences.get(PREF_LAST_SYNCED_VERSION);
+                var newVersion = request.response.version || 1;
+                if (newVersion > lastVersion) {
+                    self._logger.debug("Replace old skins.json (" + lastVersion + ") with a new one (" + newVersion + ")");
+                    let skins = Array.isArray(request.response.skins) ? request.response.skins : [];
+                    fileutils.jsonToFile(skins, self._skinsFile);
+                    self._application.preferences.set(PREF_LAST_SYNCED_VERSION, newVersion);
+                    let selectedBgImage = self._application.preferences.get(PREF_SELECTED_SKIN);
+                    let brandingSkins = self._brandingSkins.map(function (imgFile) imgFile.leafName);
+                    let bgImagesDirEntries = self._imagesDir.directoryEntries;
+                    while (bgImagesDirEntries.hasMoreElements()) {
+                        let imgFile = bgImagesDirEntries.getNext().QueryInterface(Ci.nsIFile);
+                        if (/^\./.test(imgFile.leafName))
+                            continue;
+                        if (imgFile.leafName === USER_FILE_LEAFNAME || imgFile.leafName === selectedBgImage || brandingSkins.indexOf(imgFile.leafName) !== -1)
+                            continue;
+                        self._logger.debug("Remove " + imgFile.leafName + " skin");
+                        fileutils.removeFileSafe(imgFile);
+                    }
+                }
+            });
+            var errorListener = function BackgroundImages_sync_errorListener(evt) {
+                self._logger.debug(evt.type);
+            };
+            request.addEventListener("abort", errorListener, false);
+            request.addEventListener("error", errorListener, false);
+            request.send();
+        },
+        _calculateFontColor: function Background__calculateFontColor(url) {
+            var self = this;
+            var fontColorKey = url === USER_FILE_LEAFNAME ? USER_FILE_LEAFNAME : url.split("/").pop();
+            var imageURL = url === USER_FILE_LEAFNAME ? this.userImageURL : BG_IMAGES_BASEPATH + fontColorKey;
+            this._application.colors.requestImageDominantColor(imageURL, {
+                bottomQuarter: true,
+                rightHalf: true,
+                minifyCanvas: true,
+                preventSkipColors: true
+            }, function (err, color) {
+                var fontColor;
+                if (err) {
+                    fontColor = OVERLAY_COLOR_BLACK;
+                } else {
+                    let fontColorNum = self._application.colors.getFontColorByBackgroundColor(color);
+                    fontColor = fontColorNum === 1 ? OVERLAY_COLOR_WHITE : OVERLAY_COLOR_BLACK;
+                }
+                var fontColors = self._fontColors;
+                fontColors[fontColorKey] = fontColor;
+                self._fontColors = fontColors;
+                var backgroundImagePref = self._application.preferences.get(PREF_SELECTED_SKIN, "");
+                if (backgroundImagePref === fontColorKey) {
+                    self._application.fastdial.sendRequest("backgroundChanged", {
+                        image: imageURL,
+                        color: fontColor
+                    });
+                }
+            });
+        },
+        get _fontColors() {
+            var colorsData;
+            var colorsFile = this._application.core.rootDir;
+            colorsFile.append(OVERLAY_FILENAME);
+            if (colorsFile.exists() && colorsFile.isFile() && colorsFile.isReadable()) {
+                try {
+                    colorsData = fileutils.jsonFromFile(colorsFile);
+                } catch (ex) {
+                    this._logger.error(ex.message);
+                    this._logger.debug(ex.stack);
+                }
+            }
+            return colorsData || {};
+        },
+        set _fontColors(json) {
+            var colorsFile = this._application.core.rootDir;
+            colorsFile.append(OVERLAY_FILENAME);
+            fileutils.jsonToFile(json, colorsFile);
+            return json;
+        },
+        _application: null,
+        _logger: null,
+        _userUploadedRandom: null,
+        _waitingForBackground: null,
+        _syncTimer: null,
+        _downloadTasks: {}
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/backup.js
@@ -0,0 +1,283 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["backup"];
+const GLOBAL = this;
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const DB_FILENAME = "fastdial.sqlite";
+const PREF_LASTDUMP_NAME = "backup.lastTime";
+const INTERVAL_SEC = 86400;
+const FILES_MAX_NUMBER = 10;
+const SYNC_THROTTLE_TIMEOUT_MS = 3000;
+const SYNC_THROTTLE_PROCESS_FINISH = "ftabs-backup-sync-finish";
+const backup = {
+        init: function Backup_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("Backup");
+            this.__proto__ = new patterns.NotificationSource();
+            this._initDatabase();
+            var now = Math.round(Date.now() / 1000);
+            var lastBackupTimeSec = this._application.preferences.get(PREF_LASTDUMP_NAME, 0);
+            if (!lastBackupTimeSec) {
+                this._application.preferences.set(PREF_LASTDUMP_NAME, now);
+                lastBackupTimeSec = now;
+            }
+            var diffSec = Math.abs(now - lastBackupTimeSec);
+            var timeoutMs = Math.max(INTERVAL_SEC - diffSec, 0) * 1000;
+            new sysutils.Timer(this._dumpCurrentData.bind(this), timeoutMs, INTERVAL_SEC * 1000);
+        },
+        finalize: function Backup_finalize(doCleanup, callback) {
+            if (this._throttleTimer && this._throttleTimer.isRunning) {
+                this.addListener(SYNC_THROTTLE_PROCESS_FINISH, this);
+                this._finalizeDoCleanup = doCleanup;
+                this._finalizeCallback = callback;
+                this._throttleTimer.notify();
+                return true;
+            }
+            var dbClosedCallback = function Backup_finalize_dbClosedCallback() {
+                    this._finalizeDoCleanup = null;
+                    this._finalizeCallback = null;
+                    this._database = null;
+                    this._application = null;
+                    this._logger = null;
+                    callback();
+                }.bind(this);
+            if (this._database) {
+                this._database.close(dbClosedCallback);
+                return true;
+            }
+            dbClosedCallback();
+        },
+        get list() {
+            var dirEntries = this._backupsDir.directoryEntries;
+            var files = [];
+            while (dirEntries.hasMoreElements()) {
+                let file = dirEntries.getNext().QueryInterface(Ci.nsIFile);
+                files.push(file);
+            }
+            return files.sort(function (a, b) b.lastModifiedTime - a.lastModifiedTime).map(function (file) {
+                return {
+                    date: file.lastModifiedTime,
+                    name: file.leafName
+                };
+            });
+        },
+        restore: function Backup_restore(fileName) {
+            var backupFile = this._backupsDir;
+            backupFile.append(fileName);
+            if (!backupFile.exists() || !backupFile.isFile() || !backupFile.isReadable())
+                throw new Error("No such backup file: " + fileName);
+            var json = fileutils.jsonFromFile(backupFile);
+            var thumbs = {};
+            var newThumbs = {};
+            this._dbTables.forEach(function (tableName) {
+                this._database.execQuery("DELETE FROM " + tableName, {});
+            }, this);
+            this._dbTables.forEach(function (tableName) {
+                json[tableName].forEach(function (row) {
+                    this._database.execQuery("INSERT INTO " + tableName + " (" + Object.keys(row).join(", ") + ") VALUES (" + Object.keys(row).map(function (field) ":" + field).join(", ") + ")", row);
+                    if (tableName === "thumbs") {
+                        thumbs[row.rowid] = row;
+                    } else if (tableName === "thumbs_shown") {
+                        let dbStructure = {
+                                url: thumbs[row.thumb_id].url,
+                                title: thumbs[row.thumb_id].title,
+                                backgroundColor: thumbs[row.thumb_id].backgroundColor,
+                                favicon: thumbs[row.thumb_id].favicon,
+                                insertTimestamp: thumbs[row.thumb_id].insertTimestamp,
+                                rowid: row.thumb_id,
+                                syncId: row.syncId,
+                                syncInstance: row.syncInstance,
+                                syncTimestamp: row.syncTimestamp
+                            };
+                        newThumbs[row.position] = this._application.internalStructure.convertDbRow(dbStructure, row.fixed);
+                    }
+                }, this);
+            }, this);
+            this._application.thumbs.resetPickupTimer();
+            this._application.internalStructure.clear();
+            this._application.internalStructure.setItem(newThumbs);
+            this._application.fastdial.sendRequest("thumbChanged", this._application.frontendHelper.fullStructure);
+            this._application.internalStructure.iterate({ nonempty: true }, function (thumbData) {
+                this._application.thumbs.getMissingData(thumbData);
+            }, this);
+        },
+        syncThumbs: function Backup_syncThumbs() {
+            if (this._throttleTimer)
+                this._throttleTimer.cancel();
+            this._throttleTimer = new sysutils.Timer(this._dumpThumbs.bind(this), SYNC_THROTTLE_TIMEOUT_MS);
+        },
+        observe: function Backup_observe(aSubject, aTopic, aData) {
+            switch (aTopic) {
+            case SYNC_THROTTLE_PROCESS_FINISH:
+                this.removeAllListeners();
+                this.finalize(this._finalizeDoCleanup, this._finalizeCallback);
+                break;
+            }
+        },
+        _initDatabase: function Backup__initDatabase() {
+            var dbFile = this._application.core.rootDir;
+            dbFile.append(DB_FILENAME);
+            this._database = new Database(dbFile);
+        },
+        _dumpThumbs: function Backup__dumpThumbs() {
+            var self = this;
+            var thumbsTasks = {};
+            var replaceShownTasks = [];
+            var thumbsRowIds;
+            this._application.internalStructure.iterate(null, function (thumbData, index) {
+                if (thumbData.source) {
+                    thumbsTasks[thumbData.source] = function (callback) {
+                        self._database.execQueryAsync("SELECT rowid, * FROM thumbs WHERE url = :url", { url: thumbData.source }, function (rowsData, storageError) {
+                            if (storageError)
+                                return callback(storageError);
+                            if (rowsData.length) {
+                                let rowId = rowsData[0].rowid;
+                                let needsUpdate = [
+                                        "title",
+                                        "backgroundColor",
+                                        "favicon"
+                                    ].some(function (field) {
+                                        return thumbData.thumb[field] !== rowsData[0][field];
+                                    });
+                                needsUpdate = needsUpdate || (!thumbData.screenshot || thumbData.screenshot.color !== rowsData[0].screenshotColor);
+                                if (!needsUpdate)
+                                    return callback(null, rowId);
+                                self._database.execQueryAsync("UPDATE thumbs SET title = :title, backgroundColor = :backgroundColor, favicon = :favicon, screenshotColor = :screenshotColor WHERE url = :url", {
+                                    url: thumbData.source,
+                                    title: thumbData.thumb.title || null,
+                                    backgroundColor: thumbData.thumb.backgroundColor || null,
+                                    favicon: thumbData.thumb.favicon || null,
+                                    screenshotColor: thumbData.screenshot && thumbData.screenshot.color || null
+                                }, function (rowsData, storageError) {
+                                    callback(storageError, rowId);
+                                });
+                            } else {
+                                self._database.execQueryAsync("INSERT INTO thumbs (url, title, backgroundImage, backgroundColor, favicon, insertTimestamp, screenshotColor) VALUES (:url, :title, '', :backgroundColor, :favicon, :ts, :screenshotColor)", {
+                                    url: thumbData.source,
+                                    title: thumbData.thumb.title || null,
+                                    backgroundColor: thumbData.thumb.backgroundColor || null,
+                                    favicon: thumbData.thumb.favicon || null,
+                                    ts: Math.round(Date.now() / 1000),
+                                    screenshotColor: thumbData.screenshot && thumbData.screenshot.color || null
+                                }, function (rowsData, storageError) {
+                                    if (storageError)
+                                        return callback(storageError);
+                                    self._database.execQueryAsync("SELECT rowid FROM thumbs WHERE url = :url", { url: thumbData.source }, function (rowsData, storageError) {
+                                        if (!storageError)
+                                            self._logger.debug("Thumb (URL: " + thumbData.source + ") was inserted into DB with rowid: " + rowsData[0].rowid);
+                                        callback(storageError, rowsData[0].rowid);
+                                    });
+                                });
+                            }
+                        });
+                    };
+                }
+                replaceShownTasks.push(function (callback) {
+                    self._database.execQueryAsync("INSERT OR REPLACE INTO thumbs_shown (thumb_id, position, fixed, syncId, syncInstance, syncTimestamp) VALUES(:id, :index, :pinned, :syncId, :syncInstance, :syncTimestamp)", {
+                        id: thumbData.source ? thumbsRowIds[thumbData.source] : 0,
+                        index: index,
+                        pinned: Number(thumbData.pinned),
+                        syncId: thumbData.sync && thumbData.sync.id || null,
+                        syncInstance: thumbData.sync && thumbData.sync.instance || null,
+                        syncTimestamp: thumbData.sync && thumbData.sync.timestamp || null
+                    }, function (rowsData, storageError) {
+                        callback(storageError);
+                    });
+                });
+            }, this);
+            async.parallel(thumbsTasks, function (storageError, thumbs) {
+                if (storageError) {
+                    let errorMsg = strutils.formatString("Get thumbs rowid error: %1 (code %2)", [
+                            storageError.message,
+                            storageError.result
+                        ]);
+                    self._logger.error(errorMsg);
+                    return;
+                }
+                thumbsRowIds = thumbs;
+                self._database.execQueryAsync("SELECT MAX(rowid) AS rowid FROM thumbs_shown", {}, function (rowsData, storageError) {
+                    if (storageError)
+                        throw new Error(strutils.formatString("Get max thums_shown rowid error: %1 (code %2)", [
+                            storageError.message,
+                            storageError.result
+                        ]));
+                    if (rowsData.length) {
+                        replaceShownTasks.push(function (callback) {
+                            self._database.execQueryAsync("DELETE FROM thumbs_shown WHERE rowid <= :maxint", { maxint: rowsData[0].rowid }, function (rowsData, storageError) {
+                                callback(storageError);
+                            });
+                        });
+                    }
+                    async.parallel(replaceShownTasks, function (storageError) {
+                        if (storageError) {
+                            let errorMsg = strutils.formatString("Replace shown error: %1 (code %2)", [
+                                    storageError.message,
+                                    storageError.result
+                                ]);
+                            self._logger.error(errorMsg);
+                            return;
+                        }
+                        self._logger.trace("Thumbs structure synced");
+                        self._throttleTimer = null;
+                        self._notifyListeners(SYNC_THROTTLE_PROCESS_FINISH);
+                    });
+                });
+            });
+        },
+        _dumpCurrentData: function Backup__dumpCurrentData() {
+            var self = this;
+            var tasks = {};
+            this._dbTables.forEach(function (tableName) {
+                tasks[tableName] = function (callback) {
+                    self._database.execQueryAsync("SELECT rowid, * FROM " + tableName + " ORDER BY rowid", {}, function (rowsData, storageError) {
+                        callback(storageError, rowsData);
+                    });
+                };
+            });
+            async.parallel(tasks, function Backup__initDatabase_onParallelReady(storageError, results) {
+                if (storageError)
+                    throw new Error(strutils.formatString("Dump error: %1 (code %2)", [
+                        storageError.message,
+                        storageError.result
+                    ]));
+                var file = self._backupsDir;
+                file.append(Date.now() + ".json");
+                fileutils.jsonToFile(results, file);
+                var now = Math.round(Date.now() / 1000);
+                self._application.preferences.set(PREF_LASTDUMP_NAME, now);
+                self._cleanOldFiles();
+            });
+        },
+        _cleanOldFiles: function Backup__cleanOldFiles() {
+            this.list.slice(FILES_MAX_NUMBER).forEach(function (fileData) {
+                var file = this._backupsDir;
+                file.append(fileData.name);
+                fileutils.removeFileSafe(file);
+            }, this);
+        },
+        get _backupsDir() {
+            var dir = this._application.core.rootDir;
+            dir.append("backups");
+            if (!dir.exists()) {
+                dir.create(Ci.nsIFile.DIRECTORY_TYPE, fileutils.PERMS_DIRECTORY);
+            }
+            return dir;
+        },
+        _application: null,
+        _logger: null,
+        _database: null,
+        _dbTables: [
+            "blacklist",
+            "thumbs",
+            "thumbs_shown",
+            "cloud_data",
+            "unsafe_domains"
+        ],
+        _throttleTimer: null,
+        _finalizeDoCleanup: null,
+        _finalizeCallback: null
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/barnavig.js
@@ -0,0 +1,1339 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["barnavig"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const GLOBAL = this;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+if ("nsIPrivateBrowsingChannel" in Ci) {
+    XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm");
+    this.isWindowPrivate = function _isWindowPrivate(aWindow) {
+        if (aWindow)
+            return PrivateBrowsingUtils.isWindowPrivate(aWindow);
+        return false;
+    };
+} else {
+    this.isWindowPrivate = function _isWindowPrivateEmpty(aWindow) false;
+}
+XPCOMUtils.defineLazyGetter(this, "mozWorker", function () {
+    var mozWorker = new Worker("resource://" + barnavig._application.name + "-app/parts/workers/barnavig.js");
+    mozWorker.postMessage({
+        type: "setModulesPath",
+        data: "resource://" + barnavig._application.name + "-mod/"
+    });
+    var dictionary = null;
+    try {
+        dictionary = fileutils.readTextFile(barnavig._application.branding.brandPackage.findFile("/search/dictionary.txt"));
+    } catch (e) {
+    }
+    mozWorker.postMessage({
+        type: "setSearchDictionary",
+        data: dictionary
+    });
+    return mozWorker;
+});
+function isErrorRequest(aReq) !!(!aReq || aReq.type == "error" || !aReq.target || aReq.target.status != 200)
+function getWindowListenerForWindow(window) {
+    var controllerName = barnavig._application.name + "OverlayController";
+    return controllerName in window ? window[controllerName].windowListener : null;
+}
+function getTabDataForTab(tab, key) {
+    var winListener = getWindowListenerForWindow(tab.ownerDocument.defaultView);
+    return winListener && winListener.getTabData(tab, key) || null;
+}
+const ABOUT_BLANK_URI = Services.io.newURI("about:blank", null, null);
+const barnavig = {
+        init: function BarNavig_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("BarNavig");
+            this._dataProviders = [];
+            this.transmissionEnabled = true;
+            this.listenStatEventsEnabled = true;
+            try {
+                this._sendWaitingRequests();
+            } catch (e) {
+                this._logger.debug(e);
+            }
+            Services.obs.addObserver(linkClickListener, "http-on-modify-request", false);
+        },
+        finalize: function BarNavig_finalize(aDoCleanup) {
+            Services.obs.removeObserver(linkClickListener, "http-on-modify-request");
+            this.listenStatEventsEnabled = false;
+            this.transmissionEnabled = false;
+            if (aDoCleanup)
+                this._application.core.Lib.fileutils.removeFileSafe(this._barnavigR1File);
+            this._dataProviders = [];
+            this._logger = null;
+            this._application = null;
+        },
+        get application() {
+            return this._application;
+        },
+        get transmissionEnabled() {
+            return this._transmit;
+        },
+        set transmissionEnabled(val) {
+            this._transmit = !!val;
+        },
+        get listenStatEventsEnabled() {
+            return this._listenStatEvents;
+        },
+        set listenStatEventsEnabled(val) {
+            if (!!val == this._listenStatEvents)
+                return;
+            this._listenStatEvents = !!val;
+            if (this._application.core.CONFIG.APP.TYPE === "vbff") {
+                try {
+                    let barAppBarNavig = Cc["@yandex.ru/custombarcore;yasearch"].getService().wrappedJSObject.application.barnavig;
+                    if (!this._listenStatEvents)
+                        barAppBarNavig.addDataProvider(this._barAppDataProvider);
+                    else
+                        barAppBarNavig.removeDataProvider(this._barAppDataProvider);
+                } catch (e) {
+                }
+            }
+            if (this._listenStatEvents) {
+                downloadsStat.init();
+                windowMediatorListener.enable();
+            } else {
+                downloadsStat.finalize();
+                windowMediatorListener.disable();
+            }
+        },
+        _barAppDataProvider: {
+            onWindowLocationChange: function BarNavig__barAppDataProvider_onWindowLocationChange() {
+            },
+            onPageLoad: function BarNavig__barAppDataProvider_onPageLoad(barAppParams) {
+                if (!barnavig.transmissionEnabled)
+                    return;
+                if (barnavig.alwaysSendUsageStat === false)
+                    return;
+                var barNavigParamsLength = Object.keys(barAppParams.barNavigParams).length;
+                var [
+                        params,
+                        callbacks
+                    ] = barnavig._callDataProviders("onPageLoad", barAppParams);
+                if (barNavigParamsLength < Object.keys(barAppParams.barNavigParams).length) {
+                    let emptyParams = barnavig._emptyBarNavigParamsObject;
+                    [
+                        "ver",
+                        "clid",
+                        "yasoft",
+                        "brandID"
+                    ].forEach(function (paramName) barAppParams.barNavigParams["vb" + paramName] = emptyParams[paramName]);
+                }
+                if (!callbacks.length)
+                    return;
+                return function BarNavig__barAppDataProvider_onPageLoadCallback(params) {
+                    callbacks.filter(function (callback) typeof callback == "object" || typeof callback == "function").forEach(function (callback) {
+                        try {
+                            if (typeof callback == "function")
+                                callback(params);
+                            else
+                                callback.onBarNavigResponse(params);
+                        } catch (e) {
+                            barnavig._logger.error("Notify provider error \"onBarNavigResponse\": " + e);
+                        }
+                    });
+                };
+            }
+        },
+        addDataProvider: function BarNavig_addDataProvider(aProvider) {
+            if (!this._dataProviders.some(function (provider) provider === aProvider))
+                this._dataProviders.push(aProvider);
+        },
+        removeDataProvider: function BarNavig_removeDataProvider(aProvider) {
+            this._dataProviders = this._dataProviders.filter(function (provider) provider !== aProvider);
+        },
+        sendRequest: function BarNavig_sendRequest(aRequestParams, aCallback) {
+            if (!this.transmissionEnabled || this.alwaysSendUsageStat === false)
+                return;
+            this._prepeareAndSendRequest(aRequestParams, aCallback);
+        },
+        forceRequest: function BarNavig_forceRequest(aRequestParams, aCallback) {
+            if (!this.transmissionEnabled)
+                return;
+            this._prepeareAndSendRequest(aRequestParams, aCallback);
+        },
+        get barnavigR1String() {
+            if (this._barnavigR1String === null) {
+                let r1;
+                try {
+                    r1 = this._application.core.Lib.fileutils.readTextFile(this._barnavigR1File);
+                } catch (e) {
+                }
+                this._barnavigR1String = r1 || "";
+            }
+            return this._barnavigR1String;
+        },
+        set barnavigR1String(val) {
+            if (val === this.barnavigR1String)
+                return;
+            try {
+                this._application.core.Lib.fileutils.writeTextFile(this._barnavigR1File, val);
+            } catch (e) {
+            }
+            this._barnavigR1String = null;
+        },
+        get alwaysSendUsageStat() {
+            return this._application.preferences.get("stat.usage.send", null);
+        },
+        _sendWaitingRequests: function BarNavig__sendWaitingRequests() {
+            var requests = this._application.preferences.get("stat.usage.requests", null);
+            if (!requests)
+                return;
+            this._application.preferences.reset("stat.usage.requests");
+            if (this._application.preferences.get("stat.usage.requests", null))
+                return;
+            requests = JSON.parse(requests);
+            (requests.forced || []).forEach(function (params) {
+                this.forceRequest(params);
+            }, this);
+            (requests.common || []).forEach(function (params) {
+                this.sendRequest(params);
+            }, this);
+        },
+        __emptyBarNavigParamsObject: null,
+        get _emptyBarNavigParamsObject() {
+            if (this.__emptyBarNavigParamsObject === null) {
+                this.__emptyBarNavigParamsObject = {
+                    ver: this._application.addonManager.addonVersion,
+                    clid: "",
+                    yasoft: this._application.core.CONFIG.APP.TYPE,
+                    brandID: this._application.branding.productInfo.BrandID.toString(),
+                    ui: this._guidString,
+                    show: 1,
+                    post: 0,
+                    urlinfo: 0,
+                    referer: null,
+                    oldurl: null
+                };
+                let clidData = this._application.clids.vendorData.clid1;
+                if (clidData && clidData.clidAndVid)
+                    this.__emptyBarNavigParamsObject.clid = clidData.clidAndVid;
+            }
+            var cloned = this._application.core.Lib.sysutils.copyObj(this.__emptyBarNavigParamsObject);
+            var r1 = this.barnavigR1String;
+            if (r1)
+                cloned.r1 = this.barnavigR1String;
+            return cloned;
+        },
+        _prepeareAndSendRequest: function BarNavig__prepeareAndSendRequest(aRequestParams, aCallback) {
+            var params = {
+                    uri: null,
+                    url: null,
+                    browser: null,
+                    barNavigParams: this._makeBarNavigParams()
+                };
+            if (aRequestParams) {
+                if (typeof aRequestParams == "function") {
+                    aRequestParams(params);
+                } else {
+                    for (let [
+                                key,
+                                value
+                            ] in Iterator(aRequestParams))
+                        params.barNavigParams[key] = value;
+                }
+            }
+            this._appendOtherStatParams(params, false).then(function () {
+                params._callbacks = aCallback ? [].concat(aCallback) : [];
+                this._sendRequest(this.BARNAVIG_URL_PATH, params);
+            }.bind(this));
+        },
+        _makeBarNavigParams: function BarNavig__makeBarNavigParams(aWindowListenerData) {
+            var params = this._emptyBarNavigParamsObject;
+            if (!aWindowListenerData)
+                return params;
+            var browser = aWindowListenerData.tab;
+            var [
+                    uri,
+                    url
+                ] = this._getBrowserURI(browser);
+            params.url = url;
+            var webNavigation = browser.webNavigation;
+            try {
+                if (webNavigation instanceof Ci.nsIWebPageDescriptor) {
+                    let descriptor = webNavigation.currentDescriptor;
+                    if (descriptor instanceof Ci.nsISHEntry && descriptor.postData)
+                        params.post = 1;
+                }
+            } catch (e) {
+            }
+            var referringURI = webNavigation.referringURI;
+            if (referringURI && !referringURI.userPass)
+                params.referer = referringURI.spec;
+            if (browser.contentTitle)
+                params.title = String(browser.contentTitle || "").substr(0, 1000);
+            var {
+                    originalURL: originalURL,
+                    responseStatus: responseStatus
+                } = (aWindowListenerData.docShellProps || {}).currentDocumentChannel || {};
+            if (originalURL && originalURL !== "about:blank" && originalURL !== url)
+                params.oldurl = originalURL;
+            if (responseStatus)
+                params.httpstatus = parseInt(responseStatus, 10) || 0;
+            return params;
+        },
+        get BAR_NAVIG_URL() {
+            delete this.BAR_NAVIG_URL;
+            this.BAR_NAVIG_URL = {
+                primary: "bar-navig.yandex.ru",
+                backup: "backup.bar-navig.com"
+            };
+            var statisticsDoc;
+            try {
+                statisticsDoc = this._application.branding.brandPackage.getXMLDocument("/statistics/statistics.xml");
+            } catch (e) {
+                this._logger.error("Can not get \"statistics/statistics.xml\" file from branding");
+            }
+            var domainElement = statisticsDoc && statisticsDoc.querySelector("Statistics > BarNavigDomain");
+            if (domainElement) {
+                for (let prop in this.BAR_NAVIG_URL) {
+                    let value = domainElement.getAttribute(prop);
+                    if (value)
+                        this.BAR_NAVIG_URL[prop] = value;
+                }
+            }
+            return this.BAR_NAVIG_URL;
+        },
+        get BARNAVIG_URL_PATH() {
+            delete this.BARNAVIG_URL_PATH;
+            return this.BARNAVIG_URL_PATH = this.BAR_NAVIG_URL.primary + "/u";
+        },
+        get BARNAVIG_BACKUP_URL_PATH() {
+            delete this.BARNAVIG_BACKUP_URL_PATH;
+            return this.BARNAVIG_BACKUP_URL_PATH = this.BAR_NAVIG_URL.backup + "/u";
+        },
+        _sendRequest: function BarNavig__sendRequest(aURL, aParams) {
+            task.spawn(function () {
+                var ip = null;
+                var callbackFunc = function callbackFunc(aResponse) {
+                        this.onBarNavigResponse(aParams, aResponse, ip);
+                    }.bind(this);
+                if (!this.transmissionEnabled) {
+                    callbackFunc(null);
+                    return;
+                }
+                var url = aURL;
+                if (url.indexOf(this.BARNAVIG_URL_PATH) == 0) {
+                    ip = yield DNSInfo.getIPForURL(url);
+                    if (!ip)
+                        url = url.replace(this.BARNAVIG_URL_PATH, this.BARNAVIG_BACKUP_URL_PATH);
+                }
+                url = "https://" + url;
+                var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+                request.mozBackgroundRequest = true;
+                request.open("POST", url, true);
+                request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+                request.setRequestHeader("Connection", "close");
+                var target = request.QueryInterface(Ci.nsIDOMEventTarget);
+                target.addEventListener("load", callbackFunc, false);
+                target.addEventListener("error", callbackFunc, false);
+                var params = [];
+                for (let [
+                            key,
+                            value
+                        ] in Iterator(aParams.barNavigParams)) {
+                    if (value !== null)
+                        params.push(key + "=" + encodeURIComponent(String(value)));
+                }
+                request.send(params.join("&"));
+            }.bind(this));
+        },
+        _getBrowserURI: function BarNavig__getBrowserURI(aBrowser) {
+            if (!aBrowser)
+                return [
+                    null,
+                    null
+                ];
+            var uri;
+            try {
+                uri = aBrowser.currentURI;
+            } catch (e) {
+                uri = ABOUT_BLANK_URI.clone();
+            }
+            var url = null;
+            try {
+                url = uri.spec || "";
+                if (url == "about:blank")
+                    url = "";
+            } catch (e) {
+            }
+            return [
+                uri,
+                url
+            ];
+        },
+        _appendOtherStatParams: function BarNavig__appendOtherStatParams(aParams, onPageLoad) {
+            var defer = promise.defer();
+            if (this.alwaysSendUsageStat === false) {
+                defer.resolve();
+                return defer.promise;
+            }
+            var params = aParams.barNavigParams;
+            var app = this._application;
+            params.action = app.componentsUsage && app.componentsUsage.readActions() || null;
+            var downloadData = downloadsStat.getRecord();
+            if (downloadData) {
+                params.dlu = downloadData.prePath;
+                params.dlr = downloadData.referrer;
+                params.dle = downloadData.extension;
+                params.dls = downloadData.size;
+            }
+            pageStat.appendYammData(aParams);
+            params.target = "c";
+            var browser = aParams.browser;
+            if (browser) {
+                let docShellProps = aParams.windowListenerData.docShellProps;
+                if (docShellProps && docShellProps.loadType & Ci.nsIDocShell.LOAD_CMD_NORMAL) {
+                    try {
+                        let sessionHistory = browser.webNavigation.sessionHistory;
+                        if (sessionHistory.count == 1) {
+                            params.target = "t";
+                            if (browser.getTabBrowser().browsers.length == 1)
+                                params.target = "w";
+                        }
+                    } catch (e) {
+                    }
+                }
+            }
+            if (app.browserUsage) {
+                let browserUsage = app.browserUsage.readUsageStat();
+                let (i = 0, len = browserUsage.length) {
+                    for (; i < len; i++)
+                        params["k" + (i + 1)] = browserUsage[i];
+                }
+            }
+            linkClickListener.appendLinkData(aParams);
+            task.spawn(function () {
+                if (onPageLoad) {
+                    pageStat.appendTimesData(aParams);
+                    yield pageStat.appendCheckSumData(aParams);
+                    yield searchPersonalization.appendBarNavigParam(aParams);
+                }
+                params.hip = (yield DNSInfo.getHIPString(aParams.url)) || null;
+                defer.resolve();
+            }.bind(this));
+            return defer.promise;
+        },
+        _makeParamsForNotification: function BarNavig__makeParamsForNotification(aWindowListenerData) {
+            var [
+                    uri,
+                    url
+                ] = this._getBrowserURI(aWindowListenerData.tab);
+            return {
+                uri: uri,
+                url: url,
+                browser: aWindowListenerData.tab,
+                windowListenerData: aWindowListenerData,
+                get barNavigParams() {
+                    delete this.barNavigParams;
+                    return this.barNavigParams = barnavig._makeBarNavigParams(aWindowListenerData);
+                }
+            };
+        },
+        onWindowLocationChange: function BarNavig_onWindowLocationChange(aWindowListenerData) {
+            if (isWindowPrivate(aWindowListenerData.tab.contentWindow))
+                return;
+            if (!this._dataProviders.length)
+                return;
+            var [
+                    params,
+                    callbacks
+                ] = this._callDataProviders("onWindowLocationChange", aWindowListenerData);
+        },
+        onPageLoad: function BarNavig_onPageLoad(aWindowListenerData) {
+            if (isWindowPrivate(aWindowListenerData.tab.contentWindow))
+                return;
+            if (!this._dataProviders.length && this.alwaysSendUsageStat !== true)
+                return;
+            var [
+                    params,
+                    callbacks
+                ] = this._callDataProviders("onPageLoad", aWindowListenerData);
+            if (!callbacks.length) {
+                if (this.alwaysSendUsageStat !== true)
+                    return;
+                let [
+                        uri,
+                        url
+                    ] = this._getBrowserURI(aWindowListenerData.tab);
+                if (!/^https?/.test(url))
+                    return;
+            }
+            this._appendOtherStatParams(params, true).then(function () {
+                params._callbacks = callbacks.filter(function (c) typeof c == "object" || typeof c == "function");
+                this._sendRequest(this.BARNAVIG_URL_PATH, params);
+            }.bind(this));
+        },
+        _callDataProviders: function BarNavig__callDataProviders(eventType, windowListenerData) {
+            var params = typeof windowListenerData === "object" && "windowListenerData" in windowListenerData ? windowListenerData : this._makeParamsForNotification(windowListenerData);
+            var callbacks = [];
+            this._dataProviders.forEach(function BarNavig__callDataProviders_NotificatorFunc(provider) {
+                try {
+                    if (this._dataProviders.indexOf(provider) != -1)
+                        callbacks.push(provider[eventType](params));
+                } catch (e) {
+                    this._logger.error("Notify provider error \"" + eventType + "\": " + e);
+                }
+            }, this);
+            callbacks = callbacks.filter(function (c) !!c);
+            return [
+                params,
+                callbacks
+            ];
+        },
+        onBarNavigResponse: function BarNavig_onBarNavigResponse(aParams, aRequest, aIP) {
+            if (aRequest && isErrorRequest(aRequest)) {
+                try {
+                    let reqURL = aRequest.target.channel.name;
+                    if (reqURL && reqURL.indexOf(this.BARNAVIG_BACKUP_URL_PATH) == -1) {
+                        let status = 0;
+                        try {
+                            status = parseInt(aRequest.target.status, 10) || 0;
+                        } catch (ex) {
+                        }
+                        if (status === 0) {
+                            let extraParams = "";
+                            if (aIP) {
+                                let nipString = "";
+                                let parts = aIP && aIP.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
+                                if (parts) {
+                                    let nip = parts[1] * 16777216 + parts[2] * 65536 + parts[3] * 256 + parts[4] * 1;
+                                    nipString = "&nip=" + nip;
+                                }
+                                extraParams = "?pstatus=-1" + nipString;
+                            }
+                            this._sendRequest(this.BARNAVIG_BACKUP_URL_PATH + extraParams, aParams);
+                            return;
+                        }
+                    }
+                } catch (e) {
+                }
+            }
+            aParams.request = aRequest;
+            try {
+                aParams.responseXML = aRequest.target.responseXML;
+                if (!(aParams.responseXML instanceof Ci.nsIDOMDocument))
+                    delete aParams.responseXML;
+            } catch (e) {
+            }
+            if (aParams.responseXML) {
+                let r1 = aParams.responseXML.querySelector("urlinfo > r1");
+                r1 = r1 && r1.textContent;
+                if (r1)
+                    this.barnavigR1String = r1;
+            }
+            aParams._callbacks.filter(function (callback) typeof callback == "object" || typeof callback == "function").forEach(function (callback) {
+                try {
+                    if (typeof callback == "function")
+                        callback(aParams);
+                    else
+                        callback.onBarNavigResponse(aParams);
+                } catch (e) {
+                    this._logger.error("Notify provider error \"onBarNavigResponse\": " + e);
+                }
+            }, this);
+        },
+        get _guidString() {
+            return this._application.addonStatus.guidString;
+        },
+        get _barnavigR1File() {
+            var r1File = this._application.directories.userDir;
+            r1File.append("r1-" + this._application.core.CONFIG.APP.TYPE);
+            return r1File;
+        },
+        _dataProviders: [],
+        _transmit: false,
+        _listenStatEvents: false,
+        _barnavigR1String: null,
+        get _brandId() {
+            delete this._brandId;
+            return this._brandId = this._application.branding.productInfo.BrandID.toString();
+        }
+    };
+const windowMediatorListener = {
+        enable: function WML_enable() {
+            Services.ww.registerNotification(this);
+        },
+        disable: function WML_disable() {
+            Services.ww.unregisterNotification(this);
+        },
+        observe: function WML_observe(aSubject, aTopic, aData) {
+            aSubject.addEventListener("load", this, false);
+        },
+        handleEvent: function WML_handleEvent(aEvent) {
+            var win = aEvent.target.defaultView;
+            switch (aEvent.type) {
+            case "load":
+                win.removeEventListener("load", this, false);
+                let winListener = getWindowListenerForWindow(win);
+                if (winListener) {
+                    win.addEventListener("unload", function WML_win_onUnload() {
+                        win.removeEventListener("unload", WML_win_onUnload, false);
+                        win.removeEventListener("click", linkClickListener, true);
+                        winListener.removeListener("PageStateStart", linkClickListener);
+                        winListener.removeListener("WindowLocationChange", windowEventsListener);
+                        winListener.removeListener("PageLoad", windowEventsListener);
+                    }, false);
+                    winListener.addListener("WindowLocationChange", windowEventsListener);
+                    winListener.addListener("PageLoad", windowEventsListener);
+                    winListener.addListener("PageStateStart", linkClickListener);
+                    win.addEventListener("click", linkClickListener, true);
+                }
+                break;
+            }
+        }
+    };
+const linkClickListener = {
+        appendLinkData: function linkClickListener_appendLinkData({
+            browser: tab,
+            uri: uri,
+            barNavigParams: barNavigParams
+        }) {
+            if (!(uri && /^https?/.test(uri.scheme)))
+                return;
+            var winListener = getWindowListenerForWindow(tab.ownerDocument.defaultView);
+            if (!winListener)
+                return;
+            var tabData = winListener.getTabData(tab, "linkClick");
+            if (!tabData)
+                return;
+            if (tabData.linkText)
+                barNavigParams.lt = tabData.linkText;
+            winListener.removeTabData(tab, "linkClick");
+        },
+        handleEvent: function linkClickListener_handleEvent(event) {
+            if (!barnavig.transmissionEnabled || barnavig.alwaysSendUsageStat === false)
+                return;
+            switch (event.type) {
+            case "click":
+                this._lastActionText = this._getLinkText(event);
+                this._lastActionTimestamp = Date.now();
+                break;
+            }
+        },
+        observe: function linkClickListener_observe(subject, topic, data) {
+            switch (topic) {
+            case "PageStateStart":
+                this._onPageStateStart(data);
+                break;
+            case "http-on-modify-request":
+                this._onModifyRequest(subject);
+                break;
+            }
+        },
+        ACTION_LIVE_TIME: 1000,
+        PAGE_START_WAIT_TIME: 10000,
+        _lastActionTimestamp: null,
+        _lastActionText: null,
+        _getLinkText: function linkClickListener__getLinkText(event) {
+            var protocol = event.view.location.protocol;
+            var target = event.originalTarget;
+            if (protocol === "chrome:") {
+                return target.localName === "menuitem" && target.parentNode && target.parentNode.id === "contentAreaContextMenu" && this._lastActionText || null;
+            }
+            if (protocol !== "http:")
+                return null;
+            while (target && target.localName !== "a")
+                target = target.parentNode;
+            return target && target.textContent.trim().substr(0, 500) || null;
+        },
+        _onPageStateStart: function linkClickListener__onPageStateStart({
+            tab: tab,
+            request: request
+        }) {
+            if (Date.now() - this._lastActionTimestamp > this.PAGE_START_WAIT_TIME)
+                return;
+            if (!barnavig.transmissionEnabled || barnavig.alwaysSendUsageStat === false)
+                return;
+            var winListener = getWindowListenerForWindow(tab.ownerDocument.defaultView);
+            if (!winListener)
+                return;
+            var tabData = winListener.getTabData(tab, "linkClick");
+            if (!tabData)
+                return;
+            var requestName;
+            try {
+                requestName = request.name;
+            } catch (e) {
+            }
+            if (!requestName || tabData.lastURL !== requestName)
+                winListener.removeTabData(tab, "linkClick");
+        },
+        _onModifyRequest: function linkClickListener__onModifyRequest(channel) {
+            if (!this._lastActionText)
+                return;
+            if (Date.now() - this._lastActionTimestamp > this.ACTION_LIVE_TIME) {
+                this._lastActionText = null;
+                return;
+            }
+            try {
+                channel.QueryInterface(Ci.nsIHttpChannel);
+                if (!(channel.loadFlags & Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI))
+                    return;
+            } catch (e) {
+                return;
+            }
+            var tabData = this._getTabDataForChannel(channel);
+            if (!tabData)
+                return;
+            tabData.linkText = this._lastActionText;
+            tabData.lastURL = channel.URI.spec;
+            this._lastActionText = null;
+        },
+        _getTabDataForChannel: function linkClickListener__getTabDataForChannel(channel) {
+            var win = this._getDOMWindowForChannel(channel);
+            if (!(win && win === win.parent))
+                return null;
+            return this._getTabDataForDOMWindow(win);
+        },
+        _getDOMWindowForChannel: function linkClickListener__getDOMWindowForChannel(channel) {
+            try {
+                return channel.loadGroup.groupObserver.QueryInterface(Ci.nsIWebProgress).DOMWindow;
+            } catch (e) {
+            }
+            return null;
+        },
+        _getTabDataForDOMWindow: function linkClickListener__getTabDataForDOMWindow(window) {
+            var docShellTree = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem);
+            if (docShellTree.itemType !== Ci.nsIDocShellTreeItem.typeContent)
+                return null;
+            try {
+                let chromeWindow = docShellTree.rootTreeItem.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow).wrappedJSObject;
+                if (!chromeWindow)
+                    return null;
+                let tab = chromeWindow.getBrowser().getBrowserForDocument(window.document);
+                if (!tab)
+                    return null;
+                return getTabDataForTab(tab, "linkClick");
+            } catch (e) {
+            }
+            return null;
+        }
+    };
+const windowEventsListener = {
+        observe: function WindowEventsListener_observe(aSubject, aTopic, aData) {
+            if (!barnavig.listenStatEventsEnabled)
+                return;
+            switch (aTopic) {
+            case "WindowLocationChange":
+                barnavig.onWindowLocationChange(aData);
+                break;
+            case "PageLoad":
+                barnavig.onPageLoad(aData);
+                break;
+            }
+        }
+    };
+const DNSInfo = {
+        getHIPString: function DNSInfo_getHIPString(strURL) {
+            var defer = promise.defer();
+            this.getIPsForURL(strURL).then(function (ips) {
+                var strHIP = "";
+                if (ips) {
+                    ips.some(function makeHIP4(ip) {
+                        var parts = ip ? ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) : null;
+                        if (!parts)
+                            return false;
+                        strHIP = parts[1] * 16777216 + parts[2] * 65536 + parts[3] * 256 + parts[4] * 1;
+                        return true;
+                    });
+                    if (!strHIP) {
+                        ips.some(function makeHIP6(ip) {
+                            if (ip && /:/.test(ip)) {
+                                strHIP = ip;
+                                return true;
+                            }
+                            return false;
+                        });
+                    }
+                }
+                defer.resolve(strHIP);
+            });
+            return defer.promise;
+        },
+        getIPForURL: function DNSInfo_getIPForURL(strURL) {
+            var defer = promise.defer();
+            this.getIPsForURL(strURL).then(function (ips) {
+                defer.resolve(ips && ips[0] || null);
+            });
+            return defer.promise;
+        },
+        getIPsForURL: function DNSInfo_getIPsForURL(strURL) {
+            var defer = promise.defer();
+            var host;
+            try {
+                let url = strURL;
+                if (!/^https?:\/\//.test(strURL))
+                    url = "http://" + url;
+                host = Services.io.newURI(url, null, null).host;
+            } catch (e) {
+            }
+            if (!host) {
+                defer.resolve(null);
+            } else {
+                let arrCachedIPs = this._dnsCache.get(host);
+                if (!(arrCachedIPs && arrCachedIPs.length)) {
+                    try {
+                        let cbl = false;
+                        let dnsListener = new this.DNSListener(host, function (arrIPs) {
+                                this._dnsCache.put(host, arrIPs);
+                                cbl = true;
+                            }.bind(this));
+                        this._dnsService.asyncResolve(host, 0, dnsListener, this._currentThread);
+                        sysutils.promiseSleep(2000, function () !!cbl).then(function () {
+                            defer.resolve(this._dnsCache.get(host));
+                        }.bind(this));
+                    } catch (e) {
+                        defer.resolve(null);
+                    }
+                } else {
+                    defer.resolve(arrCachedIPs);
+                }
+            }
+            return defer.promise;
+        },
+        _dnsCache: {
+            MAX_CACHED_COUNT: 100,
+            _cached: [],
+            clear: function dnsCache_clear() {
+                this._cached = [];
+            },
+            put: function dnsCache_put(strHost, arrIPs) {
+                var cached = {
+                        host: strHost,
+                        data: arrIPs
+                    };
+                if (this._cached.unshift(cached) > this.MAX_CACHED_COUNT)
+                    this._cached.splice(-this.MAX_CACHED_COUNT / 2);
+            },
+            get: function dnsCache_get(strHost) {
+                var cached = null;
+                this._cached.some(function (item) strHost === item.host && (cached = item.data));
+                return cached;
+            }
+        },
+        get _dnsService() {
+            delete this._dnsService;
+            return this._dnsService = Cc["@mozilla.org/network/dns-service;1"].getService(Ci.nsIDNSService);
+        },
+        get _currentThread() {
+            delete this._currentThread;
+            this.__defineGetter__("_currentThread", function _currentThread() Services.tm.currentThread);
+            return this._currentThread;
+        },
+        get DNSListener() {
+            function DNSListener(strHost, callback) {
+                this.host = strHost;
+                this.callback = callback;
+            }
+            DNSListener.prototype = {
+                host: null,
+                callback: null,
+                onLookupComplete: function DNSListener_onLookupComplete(aRequest, aRecord, aStatus) {
+                    var arrIPs = [];
+                    if (aStatus === 0 && aRecord) {
+                        while (aRecord.hasMore())
+                            arrIPs.push(aRecord.getNextAddrAsString());
+                    }
+                    if (this.callback)
+                        this.callback(arrIPs);
+                },
+                QueryInterface: XPCOMUtils.generateQI([
+                    Ci.nsIDNSListener,
+                    Ci.nsISupports
+                ])
+            };
+            delete this.DNSListener;
+            return this.DNSListener = DNSListener;
+        }
+    };
+const pageStat = {
+        appendTimesData: function pageStat_appendTimesData(aParams) {
+            if (!aParams.browser)
+                return;
+            var contentWindow = aParams.browser.contentWindow;
+            if (!contentWindow)
+                return;
+            if (!this._checkConditions(contentWindow.location))
+                return;
+            var winPerformance = "performance" in contentWindow && contentWindow.performance;
+            var timing = winPerformance && winPerformance.timing;
+            if (!timing)
+                return;
+            if (!timing.loadEventEnd)
+                return;
+            if (aParams.windowListenerData.hashOnlyChanged)
+                return;
+            if (aParams.windowListenerData.URIWasModified)
+                return;
+            var times = [
+                    timing.responseStart - timing.navigationStart,
+                    timing.domContentLoadedEventEnd - timing.responseStart,
+                    timing.loadEventEnd - timing.domContentLoadedEventEnd
+                ];
+            if (times.some(function (v) !(typeof v == "number" && v >= 0)))
+                return;
+            if (times[0] == 0 || times[1] == 0)
+                return;
+            var params = aParams.barNavigParams;
+            params.tv = 5;
+            params.t = times.map(function (t) parseInt(t / 10, 10)).join("-");
+        },
+        appendYammData: function pageStat_appendYammData(aParams) {
+            if (!aParams.browser)
+                return;
+            var contentDocument = aParams.browser.contentDocument;
+            if (!contentDocument)
+                return;
+            if (!this._isYandexHost(contentDocument.location))
+                return;
+            var metaNodes = contentDocument.getElementsByTagName("meta");
+            let (i = 0, len = metaNodes.length) {
+                for (; i < len; i++) {
+                    let metaName = (metaNodes[i].name || "").toLowerCase();
+                    if (metaName == "yamm" && metaNodes[i].content) {
+                        aParams.barNavigParams.yamm = ("" + metaNodes[i].content).substr(0, 10);
+                        break;
+                    }
+                }
+            }
+        },
+        appendCheckSumData: function pageStat_appendCheckSumData(aParams) {
+            var defer = promise.defer();
+            var workerTaskType = "calculateCheckSum";
+            var workerTaskId = [
+                    workerTaskType,
+                    Date.now(),
+                    Math.random() * 10000
+                ].join(":");
+            var listener = function listener(event) {
+                var {
+                        type: type,
+                        data: data,
+                        taskId: taskId
+                    } = event.data;
+                if (type !== workerTaskType)
+                    return;
+                if (taskId !== workerTaskId)
+                    return;
+                mozWorker.removeEventListener("message", listener, false);
+                var apiCrypto = barnavig.application.core.Lib.misc.CryptoHash;
+                var hash = data && pageStat._fnv1a_32(apiCrypto.getBinaryFromString(data, "MD5"));
+                if (hash)
+                    aParams.barNavigParams.psu = hash;
+                defer.resolve();
+            };
+            mozWorker.addEventListener("message", listener, false);
+            var contentDocument = aParams.browser.contentDocument;
+            var documentInnerHTML;
+            try {
+                documentInnerHTML = contentDocument && contentDocument.documentElement.innerHTML;
+            } catch (e) {
+            }
+            mozWorker.postMessage({
+                type: workerTaskType,
+                data: documentInnerHTML,
+                taskId: workerTaskId
+            });
+            return defer.promise;
+        },
+        _fnv1a_32: function pageStat__fnv1a_32(aString) {
+            var hash = 2166136261;
+            let (i = 0) {
+                for (; i < aString.length; i++) {
+                    hash ^= aString.charCodeAt(i);
+                    hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
+                }
+            }
+            return hash >>> 0;
+        },
+        _hostQuickRe: /(^|\.)((yandex|ya|moikrug)\.(com(\.tr)?|ru|ua|by|kz)|(google)\.(com|ru)|(mail|rambler)\.ru)$/i,
+        _hostYaRe: new RegExp("(^|\\.)(yandex\\.(?:com(\\.tr)?|ru|ua|by|kz)|(ya|moikrug)\\.ru)$", "i"),
+        _hostOnlyRe: new RegExp("(^|www\\.)(yandex|ya|moikrug|google|mail|rambler)\\.", "i"),
+        _hostReS: new RegExp("(^|(nova|www|go)\\.)(yandex|google|mail|rambler)\\.(?:com(\\.tr)?|ru|ua|by|kz)$", "i"),
+        _pathReS: new RegExp("^((yand)?search|srch)\\?", "i"),
+        _hostReM: new RegExp("^((web)?mail\\.yandex\\.(com(\\.tr)?|ru|ua|by|kz)|(win|e)\\.mail\\.ru|mail\\.rambler\\.ru)$", "i"),
+        _urlReM: new RegExp("^https?://([^/]+/(cgi\\-bin/sendmsg\\?)?compose|webmail\\.yandex\\.(com(\\.tr)?|ru|ua|by|kz)/messages|mail\\.yandex\\.(com(\\.tr)?|ru|ua|by|kz)/((classic|modern|neo)/)?(messages|compose)|(win|e)\\.mail\\.ru/cgi\\-bin/(sentmsg\\?compose|msglist))|mail\\.rambler\\.ru/m/(folder/INBOX|compose)|mail\\.rambler\\.ru/mail/(startpage\\?|mail.cgi\\?(r|mode=(startpage|compose|mailbox;mbox=INBOX)))", "i"),
+        _checkConditions: function pageStat__checkConditions(aURL) {
+            var url = String(aURL);
+            if (!url || !url.match(/^https?:\/\/([^\/]+)\/?(.*)/))
+                return false;
+            var host = RegExp.$1;
+            var path = RegExp.$2;
+            if (!this._hostQuickRe.test(host))
+                return false;
+            if (!path && this._hostOnlyRe.test(host))
+                return true;
+            if (this._hostReM.test(host) && url.match(this._urlReM))
+                return true;
+            if (this._pathReS.test(path) && host.match(this._hostReS)) {
+                let q = "text";
+                switch (RegExp.$3) {
+                case "google":
+                    q = "(as_)?q";
+                    break;
+                case "mail":
+                    q = "q";
+                    break;
+                case "rambler":
+                    q = "(query|words)";
+                    break;
+                }
+                let re = new RegExp("[?&](?:" + q + ")=([^#&?]*)");
+                if (re.test(path))
+                    return true;
+            }
+            if (this._hostYaRe.test(host))
+                return true;
+            return false;
+        },
+        _isYandexHost: function pageStat__isYandexHost(aURL) {
+            var url = String(aURL);
+            if (!url || !url.match(/^https?:\/\/([^\/]+)\/?(.*)/))
+                return false;
+            return this._hostYaRe.test(RegExp.$1);
+        }
+    };
+const downloadsStat = {
+        init: function DlStat_init() {
+            Services.obs.addObserver(this, "final-ui-startup", true);
+        },
+        finalize: function DlStat_finalize() {
+            try {
+                let {Downloads: Downloads} = Cu.import("resource://gre/modules/Downloads.jsm");
+                if (!("getList" in Downloads))
+                    throw new Error("Old 'Downloads' module");
+                let that = this;
+                Downloads.getList(Downloads.PUBLIC).then(function (list) list.removeView(that));
+            } catch (e) {
+                const DownloadManager = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager);
+                DownloadManager.removeListener(this);
+            }
+            this._activeDownloads = Object.create(null);
+            this._downloadsData = [];
+            this.__httpCacheSession = null;
+        },
+        getRecord: function DlStat_getRecord() {
+            return this._downloadsData.shift();
+        },
+        _activeDownloads: Object.create(null),
+        _downloadsData: [],
+        EXT_TYPES: {
+            __proto__: null,
+            1: {
+                extensions: " bat bin com cmd deb dll dmg exe hqx img iso java msi msm msp scr ",
+                mimes: " application/bat                           application/x-bat                           application/x-apple-diskimage                           application/x-msdos-program                           application/x-msdownload                           application/x-msi                           application/mac-binhex40                           application/macbinhex40                           application/mac-binary                           application/macbinary                           application/x-binary                           application/x-macbinary                           application/java                           application/java-byte-code                           application/x-java-class                         "
+            },
+            2: {
+                extensions: " 7z boz bz bz2 gtar gz lha lhz rar tar tar.bz2 tar.gz tbz tgz x zip ",
+                mimes: " application/gnutar                           application/x-gzip                           application/x-tgz                           application/x-tar                           application/zip                           application/x-bzip                           application/x-bzip2                           application/x-bzip-compressed-tar                           application/x-7z-compressed                           application/x-rar-compressed                           application/rar                           application/x-compress                           application/x-compressed                           application/x-zip-compressed                           application/x-gtar                           multipart/x-zip                         "
+            },
+            3: {
+                extensions: " 3gp 3gpp afl asf asf asr asx avi avs flv lsf lsx m1v m2v mng mov movie                           mp2 mp4 mpa mpe mpeg mpg mpv2 qt qtc swf viv vivo wmv ",
+                mimes: " application/x-mplayer2                           application/x-shockwave-flash                         "
+            },
+            4: {
+                extensions: " aif aifc aiff au cda flac kar m2a m3u m4a mid midi mp3 ogg ra ram rmi snd voc wav ",
+                mimes: " application/ogg                           application/x-cda                           application/x-midi                         "
+            },
+            5: {
+                extensions: " art bm bmp cmx cod gif ico ico ief jfif jng jpe jpeg jpg pbm pct pcx pgm                           pic pict png pnm ppm qif qti qtif ras rgb svg tif tiff wbmp xbm xpm xwd ",
+                mimes: ""
+            },
+            6: {
+                extensions: " ai djv djvu doc docx dot eps epub fb2 latex ltx odt odg odp ods odc odi odf odm                           pdf pps ppt pptx ps rtf rtx txt word xl xla xlb xlc xld xlk xll xlm xls                           xlsx xlt xlv xlw ",
+                mimes: " application/pdf                           application/msword                           application/rtf                           application/postscript                           application/x-rtf                           application/x-latex                           text/richtext                           application/excel                           application/x-excel                           application/x-msexcel                           application/vnd.ms-excel                           application/vnd.ms-powerpoint                           application/vnd.openxmlformats-officedocument.presentationml.presentation                           application/vnd.openxmlformats-officedocument.spreadsheetml.sheet                           application/vnd.openxmlformats-officedocument.wordprocessingml.document                           application/vnd.oasis.opendocument.text                           application/vnd.oasis.opendocument.graphics                           application/vnd.oasis.opendocument.presentation                           application/vnd.oasis.opendocument.spreadsheet                           application/vnd.oasis.opendocument.chart                           application/vnd.oasis.opendocument.image                           application/vnd.oasis.opendocument.formula                           application/vnd.oasis.opendocument.text-master                           image/vnd.djvu                         "
+            },
+            7: {
+                extensions: " torrent ",
+                mimes: " application/x-bittorrent "
+            }
+        },
+        _getIdForDownload: function DlStat__getIdForDownload(aDownload) {
+            return [
+                aDownload.source.spec,
+                aDownload.target.spec
+            ].join("|");
+        },
+        __httpCacheSession: null,
+        get httpCacheSession() {
+            if (!this.__httpCacheSession) {
+                const CACHE_SERVICE = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
+                this.__httpCacheSession = CACHE_SERVICE.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true);
+                this.__httpCacheSession.doomEntriesIfExpired = false;
+            }
+            return this.__httpCacheSession;
+        },
+        _getMIMETypeFromRequest: function DlStat__getMIMEFromRequest(aRequest) {
+            if (aRequest) {
+                try {
+                    aRequest.QueryInterface(Ci.nsIChannel);
+                    return aRequest.contentType || null;
+                } catch (e) {
+                }
+            }
+            return null;
+        },
+        _getMIMETypeFromCacheEntry: function DlStat__getMIMEFromCacheEntry(aURL) {
+            var defer = promise.defer();
+            var cacheKey = aURL.replace(/#.*$/, "");
+            try {
+                cacheKey = barnavig.application.core.Lib.misc.tryCreateFixupURI(cacheKey).asciiSpec;
+            } catch (e) {
+            }
+            var redirects = 0;
+            var cacheSession = this.httpCacheSession;
+            var listener = {
+                    onCacheEntryAvailable: function cacheHelper_listener(descriptor, accessGranted, status) {
+                        var type = null;
+                        if (status === Cr.NS_OK && descriptor) {
+                            let response = "";
+                            try {
+                                response = descriptor.getMetaDataElement("response-head");
+                            } catch (e) {
+                            }
+                            if (redirects++ < 10) {
+                                let location = /^Location:\s*(.+)$/im.exec(response);
+                                location = location && location[1] || null;
+                                if (location) {
+                                    cacheSession.asyncOpenCacheEntry(location.replace(/#.*$/, ""), Ci.nsICache.ACCESS_READ, listener, true);
+                                    return;
+                                }
+                            }
+                            type = /^Content\-Type:\s*(.*?)\s*(?:\;|$)/im.exec(response);
+                            type = type && type[1].toLowerCase() || null;
+                        }
+                        defer.resolve(type);
+                    },
+                    onCacheEntryDoomed: function cacheHelper_onCacheEntryDoomed() {
+                    }
+                };
+            cacheSession.asyncOpenCacheEntry(cacheKey, Ci.nsICache.ACCESS_READ, listener, true);
+            return defer.promise;
+        },
+        _getExtensionTypeForMIME: function DlStat__getExtensionTypeForMIME(aMIMEType) {
+            var mime = (" " + aMIMEType + " ").toLowerCase();
+            for (let [
+                        type,
+                        data
+                    ] in Iterator(this.EXT_TYPES)) {
+                if (data.mimes.indexOf(mime) != -1)
+                    return type;
+            }
+            return null;
+        },
+        _getExtensionTypeForExtension: function DlStat__getExtensionTypeForExtension(aExtension) {
+            var extension = (" " + aExtension + " ").toLowerCase();
+            for (let [
+                        type,
+                        data
+                    ] in Iterator(this.EXT_TYPES)) {
+                if (data.extensions.indexOf(extension) != -1)
+                    return type;
+            }
+            return null;
+        },
+        _collectDownloadData: function DlStat__collectDownloadData(aDownload, aRequest) {
+            var downloadId = this._getIdForDownload(aDownload);
+            var downloadData = this._activeDownloads[downloadId] || null;
+            if (!downloadData)
+                return;
+            delete this._activeDownloads[downloadId];
+            var downloadURI = aDownload.source;
+            var url = downloadURI.spec;
+            var prePath = downloadURI.prePath;
+            var userName = downloadURI.userName;
+            if (userName)
+                prePath = prePath.split(userName + "@").join("");
+            var referrerURL = downloadData.referrerURL;
+            var collect = function collect(mimeType) {
+                    var extensionType;
+                    if (mimeType) {
+                        extensionType = this._getExtensionTypeForMIME(mimeType);
+                        if (!extensionType) {
+                            switch ((/^(audio|image|video)\//.exec(mimeType || "") || "")[1]) {
+                            case "video":
+                                extensionType = 3;
+                                break;
+                            case "audio":
+                                extensionType = 4;
+                                break;
+                            case "image":
+                                extensionType = 5;
+                                break;
+                            }
+                        }
+                    }
+                    if (!extensionType) {
+                        let extension = (/\.([^.]+)$/.exec(aDownload.target.spec) || "")[1];
+                        extensionType = extension ? this._getExtensionTypeForExtension(extension) || 8 : 0;
+                    }
+                    this._downloadsData.push({
+                        prePath: prePath,
+                        referrer: referrerURL,
+                        size: aDownload.size,
+                        extension: extensionType
+                    });
+                }.bind(this);
+            var mimeType = aDownload.MIMEInfo && aDownload.MIMEInfo.type || this._getMIMETypeFromRequest(aRequest) || null;
+            if (mimeType) {
+                collect(mimeType);
+            } else {
+                this._getMIMETypeFromCacheEntry(url).then(function (mtype) collect(mtype || null));
+            }
+        },
+        QueryInterface: XPCOMUtils.generateQI([
+            Ci.nsIDownloadProgressListener,
+            Ci.nsIObserver,
+            Ci.nsISupportsWeakReference
+        ]),
+        observe: function DlStat_observe(aSubject, aTopic, aData) {
+            switch (aTopic) {
+            case "final-ui-startup":
+                Services.obs.removeObserver(this, "final-ui-startup", true);
+                try {
+                    let {Downloads: Downloads} = Cu.import("resource://gre/modules/Downloads.jsm");
+                    if (!("getList" in Downloads))
+                        throw new Error("Old 'Downloads' module");
+                    let that = this;
+                    Downloads.getList(Downloads.PUBLIC).then(function (list) list.addView(that));
+                } catch (e) {
+                    const DownloadManager = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager);
+                    DownloadManager.addListener(this);
+                }
+                break;
+            }
+        },
+        _wrapDownloadObject: function DlStat__wrapDownloadObject(download) {
+            var sourceURI = barnavig.application.core.Lib.misc.tryCreateFixupURI(download.source.url);
+            if (!sourceURI)
+                return null;
+            var targetURI = barnavig.application.core.Lib.misc.tryCreateFixupURI(download.target.path);
+            if (!targetURI)
+                return null;
+            var referrerURI = barnavig.application.core.Lib.misc.tryCreateFixupURI(download.source.referrer);
+            return {
+                id: download.source.url + "|" + download.target.path,
+                source: sourceURI,
+                target: targetURI,
+                referrer: referrerURI,
+                size: download.currentBytes,
+                MIMEInfo: { type: download.contentType }
+            };
+        },
+        _setReferrerForDownload: function DlStat__setReferrerForDownload(download) {
+            var downloadId = this._getIdForDownload(download);
+            if (downloadId in this._activeDownloads)
+                return;
+            var referrerURL = download.referrer && download.referrer.spec;
+            if (!referrerURL) {
+                try {
+                    let win = Services.wm.getMostRecentWindow("navigator:browser");
+                    let ref = win.gBrowser.mCurrentBrowser.currentURI.spec;
+                    if (/^(http|ftp)s?:\/\//.test(ref))
+                        referrerURL = ref;
+                } catch (e) {
+                }
+            }
+            if (referrerURL)
+                this._activeDownloads[downloadId] = { referrerURL: referrerURL };
+        },
+        onDownloadAdded: function DlStat_onDownloadAdded(download) {
+            var wrappedDownload = this._wrapDownloadObject(download);
+            if (wrappedDownload)
+                this._setReferrerForDownload(wrappedDownload);
+        },
+        onDownloadChanged: function DlStat_onDownloadChanged(download) {
+            if (!download.succeeded)
+                return;
+            var wrappedDownload = this._wrapDownloadObject(download);
+            if (wrappedDownload)
+                this._collectDownloadData(wrappedDownload);
+        },
+        onDownloadStateChange: function DlStat_onDownloadStateChange(aState, aDownload) {
+            if (!/^(http|ftp)s?:\/\//.test(aDownload.source.spec))
+                return;
+            const nsIDM = Ci.nsIDownloadManager;
+            var state = aDownload.state;
+            switch (state) {
+            case nsIDM.DOWNLOAD_QUEUED:
+                this._setReferrerForDownload(aDownload);
+                break;
+            case nsIDM.DOWNLOAD_BLOCKED_POLICY:
+            case nsIDM.DOWNLOAD_FAILED:
+            case nsIDM.DOWNLOAD_CANCELED:
+            case nsIDM.DOWNLOAD_BLOCKED_PARENTAL:
+            case nsIDM.DOWNLOAD_DIRTY:
+            case nsIDM.DOWNLOAD_FINISHED:
+                this._collectDownloadData(aDownload);
+                break;
+            }
+        },
+        onProgressChange: function DlStat_onProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress, aDownload) {
+            this._collectDownloadData(aDownload, aRequest);
+        },
+        onStateChange: function DlStat_onStateChange(aWebProgress, aRequest, aState, aStatus, aDownload) {
+        },
+        onSecurityChange: function DlStat_onSecurityChange(aWebProgress, aRequest, aState, aDownload) {
+        }
+    };
+const searchPersonalization = {
+        appendBarNavigParam: function searchPersonalization_appendBarNavigParam(aParams) {
+            var defer = promise.defer();
+            function resolvedPromise() {
+                defer.resolve();
+                return defer.promise;
+            }
+            if (!aParams.browser)
+                return resolvedPromise();
+            var contentDocument = aParams.browser.contentDocument;
+            if (!contentDocument)
+                return resolvedPromise();
+            if (!/^http:\/\//.test(contentDocument.location))
+                return resolvedPromise();
+            var documentInnerHTML;
+            try {
+                documentInnerHTML = contentDocument.documentElement.innerHTML;
+            } catch (e) {
+                barnavig._logger.debug("searchPersonalization.appendBarNavigParam, innerHTML error: " + e);
+            }
+            if (!documentInnerHTML)
+                return resolvedPromise();
+            var workerTaskType = "calculateSearchPersonalization";
+            var workerTaskId = [
+                    workerTaskType,
+                    Date.now(),
+                    Math.random() * 10000
+                ].join(":");
+            var listener = function listener(event) {
+                var {
+                        type: type,
+                        data: data,
+                        taskId: taskId
+                    } = event.data;
+                if (type !== workerTaskType)
+                    return;
+                if (taskId !== workerTaskId)
+                    return;
+                mozWorker.removeEventListener("message", listener, false);
+                if (data)
+                    aParams.barNavigParams.body = data;
+                defer.resolve();
+            };
+            mozWorker.addEventListener("message", listener, false);
+            mozWorker.postMessage({
+                type: workerTaskType,
+                data: documentInnerHTML,
+                taskId: workerTaskId
+            });
+            return defer.promise;
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/blacklist.js
@@ -0,0 +1,166 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["blacklist"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const GLOBAL = this;
+const DB_FILENAME = "fastdial.sqlite";
+const SERVER_URL = "http://download.cdn.yandex.net/bar/vb/bl.xml";
+const SYNC_INTERVAL_SEC = 86400;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+const blacklist = {
+        init: function Blacklist_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("Blacklist");
+            this._initDatabase();
+            this._initServerSync();
+        },
+        finalize: function Blacklist_finalize(doCleanup, callback) {
+            if (this._timer && this._timer.isRunning)
+                this._timer.cancel();
+            var dbClosedCallback = function Backup_finalize_dbClosedCallback() {
+                    this._database = null;
+                    this._application = null;
+                    this._logger = null;
+                    callback();
+                }.bind(this);
+            if (this._database) {
+                this._database.close(dbClosedCallback);
+                return true;
+            }
+            dbClosedCallback();
+        },
+        getAll: function Blacklist_getAll(callback) {
+            var serverFile = this._serverFile;
+            var output = {
+                    domains: [],
+                    regexps: []
+                };
+            var itemNodeProcess = function Blacklist_getAll_itemNodeProcess(item) {
+                var domain = item.getAttribute("domain");
+                var regexp = item.getAttribute("url_regex");
+                if (domain) {
+                    output.domains.push(domain);
+                } else if (regexp) {
+                    output.regexps.push(regexp);
+                }
+            };
+            Array.forEach(this._brandingDoc.querySelectorAll("list > item"), itemNodeProcess);
+            if (serverFile.exists() && serverFile.isFile() && serverFile.isReadable()) {
+                try {
+                    let serverXML = fileutils.xmlDocFromFile(serverFile);
+                    Array.forEach(serverXML.querySelectorAll("list > item"), itemNodeProcess);
+                } catch (ex) {
+                    this._logger.error("Error while reading synced XML: " + strutils.formatError(ex));
+                    this._logger.debug(ex.stack);
+                }
+            }
+            this._database.execQueryAsync("SELECT domain FROM blacklist", {}, function (rowsData, storageError) {
+                if (storageError) {
+                    let errorMsg = strutils.formatString("DB error while fetching blacklist: %1 (code %2)", [
+                            storageError.message,
+                            storageError.result
+                        ]);
+                    throw new Error(errorMsg);
+                }
+                rowsData.forEach(function (row) {
+                    output.domains.push(row.domain);
+                });
+                callback(null, output);
+            });
+        },
+        upsertDomain: function Blacklist_upsertDomain(domain, callback) {
+            this._database.execQueryAsync("INSERT OR REPLACE INTO blacklist (domain) VALUES (:domain)", { domain: domain }, function (rowsData, storageError) {
+                if (storageError) {
+                    let errorMsg = strutils.formatString("DB error while upserting item into blacklist: %1 (code %2)", [
+                            storageError.message,
+                            storageError.result
+                        ]);
+                    throw new Error(errorMsg);
+                }
+                callback && callback();
+            });
+        },
+        deleteDomain: function Blacklist_deleteDomain(domain, callback) {
+            this._database.execQueryAsync("DELETE FROM blacklist WHERE domain = :domain", { domain: domain }, function (rowsData, storageError) {
+                if (storageError) {
+                    let errorMsg = strutils.formatString("DB error while deleting item from blacklist: %1 (code %2)", [
+                            storageError.message,
+                            storageError.result
+                        ]);
+                    throw new Error(errorMsg);
+                }
+                callback && callback();
+            });
+        },
+        get _brandingDoc() {
+            delete this._brandingDoc;
+            return this._brandingDoc = this._application.branding.brandPackage.getXMLDocument("fastdial/blacklist.xml");
+        },
+        get _serverFile() {
+            var file = this._application.directories.appRootDir;
+            file.append("blacklist.xml");
+            return file;
+        },
+        _initDatabase: function Blacklist__initDatabase() {
+            var dbFile = this._application.core.rootDir;
+            dbFile.append(DB_FILENAME);
+            this._database = new Database(dbFile);
+        },
+        _initServerSync: function Blacklist__initServerSync() {
+            var lastSyncTime = this._application.preferences.get("blacklist.lastSyncTime", 0);
+            var now = Math.round(Date.now() / 1000);
+            var delay = Math.max(SYNC_INTERVAL_SEC - Math.abs(now - lastSyncTime), 0);
+            this._timer = new sysutils.Timer(this._syncServerXML.bind(this), delay * 1000, SYNC_INTERVAL_SEC * 1000);
+        },
+        _syncServerXML: function Blacklist__syncServerXML() {
+            var self = this;
+            this._logger.debug("Sync blacklist data");
+            var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            request.mozBackgroundRequest = true;
+            request.QueryInterface(Ci.nsIDOMEventTarget);
+            request.open("GET", SERVER_URL, true);
+            var lastModified = this._application.preferences.get("blacklist.lastModified");
+            if (lastModified) {
+                request.setRequestHeader("If-Modified-Since", lastModified);
+            }
+            var timer = new sysutils.Timer(request.abort.bind(request), 5000);
+            request.addEventListener("load", function () {
+                timer.cancel();
+                var setLastSyncTime = function setLastSyncTime() {
+                    var now = Math.round(Date.now() / 1000);
+                    self._application.preferences.set("blacklist.lastSyncTime", now);
+                };
+                if (request.status === 304) {
+                    self._logger.debug("XML file on server has not yet changed, status = 304");
+                    setLastSyncTime();
+                    return;
+                }
+                if (!request.responseXML || request.responseXML.documentElement.nodeName !== "list") {
+                    self._logger.error("Not valid XML: " + request.responseText);
+                    return;
+                }
+                try {
+                    let serializedXML = xmlutils.serializeXML(request.responseXML);
+                    fileutils.writeTextFile(self._serverFile, serializedXML);
+                    self._logger.debug("XML is valid, saved into filesystem");
+                    setLastSyncTime();
+                    let lastModified = request.getResponseHeader("last-modified");
+                    if (lastModified) {
+                        self._application.preferences.set("blacklist.lastModified", lastModified);
+                    }
+                } catch (ex) {
+                    self._logger.error("Error while writing synced XML: " + strutils.formatError(ex));
+                    self._logger.debug(ex.stack);
+                }
+            });
+            request.send();
+        },
+        _application: null,
+        _logger: null,
+        _timer: null
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/bookmarks.js
@@ -0,0 +1,332 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["bookmarks"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const GLOBAL = this;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/PlacesUtils.jsm");
+XPCOMUtils.defineLazyServiceGetter(GLOBAL, "LIVEMARKS_SVC", "@mozilla.org/browser/livemark-service;2", "mozIAsyncLivemarks" in Ci ? "mozIAsyncLivemarks" : "nsILivemarkService");
+const bookmarks = {
+        init: function Bookmarks_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            PlacesUtils.bookmarks.addObserver(this._changesObserver, false);
+            this._application = application;
+            this._logger = application.getLogger("Bookmarks");
+        },
+        finalize: function Bookmarks_finalize(doCleanup, callback) {
+            PlacesUtils.bookmarks.removeObserver(this._changesObserver);
+            if (this._bookmarksStateTimer)
+                this._bookmarksStateTimer.cancel();
+            this._application = null;
+            this._logger = null;
+        },
+        requestBranch: function Bookmarks_requestBranch(id, callback) {
+            var self = this;
+            var options = PlacesUtils.history.getNewQueryOptions();
+            options.queryType = options.QUERY_TYPE_BOOKMARKS;
+            options.excludeQueries = true;
+            options.excludeItems = false;
+            options.asyncEnabled = true;
+            id = id || PlacesUtils.bookmarks.toolbarFolder;
+            var query = PlacesUtils.history.getNewQuery();
+            query.setFolders([id], 1);
+            var historyResultObserver = {
+                    batching: function Bookmarks_requestBookmarksBranch_batching() {
+                    },
+                    containerClosed: function Bookmarks_requestBookmarksBranch_containerClosed() {
+                    },
+                    containerOpened: function Bookmarks_requestBookmarksBranch_containerOpened() {
+                    },
+                    invalidateContainer: function Bookmarks_requestBookmarksBranch_invalidateContainer() {
+                    },
+                    nodeAnnotationChanged: function Bookmarks_requestBookmarksBranch_nodeAnnotationChanged() {
+                    },
+                    nodeDateAddedChanged: function Bookmarks_requestBookmarksBranch_nodeDateAddedChanged() {
+                    },
+                    nodeHistoryDetailsChanged: function Bookmarks_requestBookmarksBranch_nodeHistoryDetailsChanged() {
+                    },
+                    nodeIconChanged: function Bookmarks_requestBookmarksBranch_nodeIconChanged() {
+                    },
+                    nodeInserted: function Bookmarks_requestBookmarksBranch_nodeInserted() {
+                    },
+                    nodeKeywordChanged: function Bookmarks_requestBookmarksBranch_nodeKeywordChanged() {
+                    },
+                    nodeLastModifiedChanged: function Bookmarks_requestBookmarksBranch_nodeLastModifiedChanged() {
+                    },
+                    nodeMoved: function Bookmarks_requestBookmarksBranch_nodeMoved() {
+                    },
+                    nodeRemoved: function Bookmarks_requestBookmarksBranch_nodeRemoved() {
+                    },
+                    nodeReplaced: function Bookmarks_requestBookmarksBranch_nodeReplaced() {
+                    },
+                    nodeTagsChanged: function Bookmarks_requestBookmarksBranch_nodeTagsChanged() {
+                    },
+                    nodeTitleChanged: function Bookmarks_requestBookmarksBranch_nodeTitleChanged() {
+                    },
+                    nodeURIChanged: function Bookmarks_requestBookmarksBranch_nodeURIChanged() {
+                    },
+                    sortingChanged: function Bookmarks_requestBookmarksBranch_sortingChanged() {
+                    },
+                    containerStateChanged: function Bookmarks_requestBookmarksBranch_historyContainerStateChanged(node, oldState, newState) {
+                        if (newState !== Ci.nsINavHistoryContainerResultNode.STATE_OPENED)
+                            return;
+                        result.removeObserver(historyResultObserver);
+                        if (result.root.childCount) {
+                            let tasks = [];
+                            let (i = 0) {
+                                for (; i < result.root.childCount; i++) {
+                                    (function (i) {
+                                        tasks.push(function (callback) {
+                                            var node = result.root.getChild(i);
+                                            var isFolder = node.type === node.RESULT_TYPE_FOLDER;
+                                            if (!isFolder && node.type !== node.RESULT_TYPE_URI) {
+                                                return callback();
+                                            }
+                                            var id = isFolder ? node.itemId + "" : "";
+                                            var bookmark = {
+                                                    url: isFolder ? "" : node.uri,
+                                                    title: node.title || "",
+                                                    id: id,
+                                                    isFolder: isFolder
+                                                };
+                                            if (isFolder) {
+                                                bookmark.favicon = "";
+                                                return callback(null, bookmark);
+                                            }
+                                            if (node.icon) {
+                                                bookmark.favicon = node.icon;
+                                                return callback(null, bookmark);
+                                            }
+                                            var locationObj = self._application.fastdial.getDecodedLocation(node.uri);
+                                            if (locationObj.location) {
+                                                self._application.favicons.requestFaviconForURL(locationObj.location, function (faviconData) {
+                                                    bookmark.favicon = faviconData || self._application.favicons.EMPTY_ICON;
+                                                    return callback(null, bookmark);
+                                                });
+                                            } else {
+                                                bookmark.favicon = "";
+                                                callback(null, bookmark);
+                                            }
+                                        });
+                                    }(i));
+                                }
+                            }
+                            async.parallel(tasks, function (err, results) {
+                                var bookmarks = results.filter(function (bookmark) !!bookmark);
+                                callback(bookmarks);
+                            });
+                            result.root.containerOpen = false;
+                            return;
+                        }
+                        result.root.containerOpen = false;
+                        self._getLivemark({ id: id }, function (aStatus, aLivemark) {
+                            if (aStatus !== Cr.NS_OK) {
+                                callback([]);
+                                return;
+                            }
+                            self._fetchLivemarkChildren(aLivemark, node, callback);
+                        });
+                    },
+                    QueryInterface: XPCOMUtils.generateQI([Ci.nsINavHistoryResultObserver])
+                };
+            var result = PlacesUtils.history.executeQuery(query, options);
+            result.addObserver(historyResultObserver, false);
+            result.root.containerOpen = true;
+        },
+        _getLivemark: function Bookmarks__getLivemark(aLivemarkInfo, aCallback) {
+            if ("getLivemark" in LIVEMARKS_SVC) {
+                LIVEMARKS_SVC.getLivemark(aLivemarkInfo, aCallback);
+            } else {
+                aCallback(LIVEMARKS_SVC.isLivemark(aLivemarkInfo.id) ? Cr.NS_OK : null);
+            }
+        },
+        _fetchLivemarkChildren: function Bookmarks__fetchLivemarkChildren(aLivemark, aContainerNode, callback, onContainerRelease) {
+            var self = this;
+            var livemarks = [];
+            var livemarksParsedNum = 0;
+            var totalLivemarksNum = 0;
+            var asyncFetch = false;
+            var onLivemarkReady = function Bookmarks__fetchLivemarkChildren_onLivemarkReady(node) {
+                var isFolder = node.type === node.RESULT_TYPE_FOLDER;
+                var livemark = {
+                        url: isFolder ? "" : node.uri,
+                        title: node.title || "",
+                        id: node.itemId,
+                        isFolder: isFolder
+                    };
+                if (!isFolder) {
+                    if (node.icon) {
+                        onIconReady(livemark, node.icon);
+                    } else {
+                        let locationObj = self._application.fastdial.getDecodedLocation(node.uri);
+                        if (locationObj.location) {
+                            self._application.favicons.requestFaviconForURL(locationObj.location, function (faviconData) {
+                                onIconReady(livemark, faviconData);
+                            });
+                        } else {
+                            onIconReady(livemark);
+                        }
+                    }
+                } else {
+                    onIconReady(livemark);
+                }
+            };
+            var onIconReady = function _fetchLivemarkChildren__onIconReady(livemark, url) {
+                livemark.favicon = url || self._application.favicons.EMPTY_ICON;
+                livemarks.push(livemark);
+                livemarksParsedNum += 1;
+                if (livemarksParsedNum === totalLivemarksNum) {
+                    if (asyncFetch) {
+                        aLivemark.unregisterForUpdates(aContainerNode);
+                    }
+                    callback(livemarks);
+                }
+            };
+            var cachedChildren = aLivemark.getNodesForContainer(aContainerNode);
+            if (cachedChildren.length) {
+                totalLivemarksNum = cachedChildren.length;
+                cachedChildren.forEach(onLivemarkReady);
+                return;
+            }
+            var livemarkResultObserver = {
+                    batching: function () {
+                    },
+                    containerClosed: function () {
+                    },
+                    containerOpened: function () {
+                    },
+                    invalidateContainer: function (aContainerNode) {
+                        var children = aLivemark.getNodesForContainer(aContainerNode);
+                        totalLivemarksNum = children.length;
+                    },
+                    nodeAnnotationChanged: function () {
+                    },
+                    nodeDateAddedChanged: function () {
+                    },
+                    nodeHistoryDetailsChanged: onLivemarkReady,
+                    nodeIconChanged: function () {
+                    },
+                    nodeInserted: function () {
+                    },
+                    nodeKeywordChanged: function () {
+                    },
+                    nodeLastModifiedChanged: function () {
+                    },
+                    nodeMoved: function () {
+                    },
+                    nodeRemoved: function () {
+                    },
+                    nodeReplaced: function () {
+                    },
+                    nodeTagsChanged: function () {
+                    },
+                    nodeTitleChanged: function () {
+                    },
+                    nodeURIChanged: function () {
+                    },
+                    sortingChanged: function () {
+                    },
+                    containerStateChanged: function () {
+                    },
+                    QueryInterface: XPCOMUtils.generateQI([Ci.nsINavHistoryResultObserver])
+                };
+            asyncFetch = true;
+            aLivemark.registerForUpdates(aContainerNode, livemarkResultObserver);
+            aLivemark.reload(true);
+            var livemarkLoadChecker = new sysutils.Timer(function () {
+                    if (aLivemark.status == Ci.mozILivemark.STATUS_FAILED) {
+                        callback(livemarks);
+                    }
+                }, 1000);
+        },
+        _sendStateChanged: function Bookmarks__sendStateChanged() {
+            if (this._bookmarksStateTimer)
+                this._bookmarksStateTimer.cancel();
+            var self = this;
+            var showBookmarks = this._application.preferences.get("ftabs.showBookmarks");
+            this._bookmarksStateTimer = new sysutils.Timer(function () {
+                if (showBookmarks) {
+                    self.requestBranch("", function (bookmarks) {
+                        self._application.fastdial.sendRequest("bookmarksStateChanged", bookmarks);
+                    });
+                }
+            }, 50);
+        },
+        _changesObserver: {
+            onBeforeItemRemoved: function Bookmarks__changesObserver_onBeforeItemRemoved() {
+            },
+            onBeginUpdateBatch: function Bookmarks__changesObserver_onBeginUpdateBatch() {
+            },
+            onEndUpdateBatch: function Bookmarks__changesObserver_onEndUpdateBatch() {
+            },
+            onSeparatorAdded: function Bookmarks__changesObserver_onSeparatorAdded() {
+            },
+            onSeparatorRemoved: function Bookmarks__changesObserver_onSeparatorRemoved() {
+            },
+            onFolderAdded: function Bookmarks__changesObserver_onFolderAdded() {
+            },
+            onFolderRemoved: function Bookmarks__changesObserver_onFolderRemoved() {
+            },
+            onFolderMoved: function Bookmarks__changesObserver_onFolderMoved() {
+            },
+            onFolderChanged: function Bookmarks__changesObserver_onFolderChanged() {
+            },
+            onItemVisited: function Bookmarks__changesObserver_onItemVisited() {
+            },
+            onItemReplaced: function Bookmarks__changesObserver_onItemReplaced() {
+            },
+            onItemAdded: function Bookmarks__changesObserver_onItemAdded(aItemId, aParentId, aIndex) {
+                bookmarks._logger.trace("onItemAdded [id=" + aItemId + "] [parentId=" + aParentId + "] [index=" + aIndex + "]");
+                if (~[
+                        PlacesUtils.bookmarks.toolbarFolder,
+                        PlacesUtils.bookmarks.bookmarksMenuFolder,
+                        PlacesUtils.bookmarks.unfiledBookmarksFolder
+                    ].indexOf(aParentId))
+                    bookmarks._sendStateChanged();
+            },
+            onItemRemoved: function Bookmarks__changesObserver_onItemRemoved(aItemId, aParentId, aIndex) {
+                bookmarks._logger.trace("onItemRemoved [id=" + aItemId + "] [parentId=" + aParentId + "] [index=" + aIndex + "]");
+                if (~[
+                        PlacesUtils.bookmarks.toolbarFolder,
+                        PlacesUtils.bookmarks.bookmarksMenuFolder,
+                        PlacesUtils.bookmarks.unfiledBookmarksFolder
+                    ].indexOf(aParentId))
+                    bookmarks._sendStateChanged();
+            },
+            onItemChanged: function Bookmarks__changesObserver_onItemChanged(aItemId, aProperty, aIsAnnotationProperty, aNewValue) {
+                bookmarks._logger.trace("onItemChanged [id=" + aItemId + "] [property=" + aProperty + "] [isAnnotationProperty=" + aIsAnnotationProperty + "] [newValue=" + aNewValue + "]");
+                var parentId = PlacesUtils.bookmarks.getFolderIdForItem(aItemId);
+                if (~[
+                        PlacesUtils.bookmarks.toolbarFolder,
+                        PlacesUtils.bookmarks.bookmarksMenuFolder,
+                        PlacesUtils.bookmarks.unfiledBookmarksFolder
+                    ].indexOf(parentId))
+                    bookmarks._sendStateChanged();
+            },
+            onItemMoved: function Bookmarks__changesObserver_onItemMoved(aItemId, aOldParentId, aOldIndex, aNewParentId, aNewIndex) {
+                bookmarks._logger.trace("onItemMoved [id=" + aItemId + "] [oldParentId=" + aOldParentId + "] [oldIndex=" + aOldIndex + "] [newParentId=" + aNewParentId + "] [newIndex=" + aNewIndex + "]");
+                if (~[
+                        PlacesUtils.bookmarks.toolbarFolder,
+                        PlacesUtils.bookmarks.bookmarksMenuFolder,
+                        PlacesUtils.bookmarks.unfiledBookmarksFolder
+                    ].indexOf(aOldParentId) || ~[
+                        PlacesUtils.bookmarks.toolbarFolder,
+                        PlacesUtils.bookmarks.bookmarksMenuFolder,
+                        PlacesUtils.bookmarks.unfiledBookmarksFolder
+                    ].indexOf(aNewParentId))
+                    bookmarks._sendStateChanged();
+            },
+            QueryInterface: XPCOMUtils.generateQI([
+                Ci.nsISupports,
+                Ci.nsINavBookmarksObserver
+            ])
+        },
+        _application: null,
+        _logger: null,
+        _bookmarksStateTimer: null
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/branding.js
@@ -0,0 +1,361 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["branding"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const GLOBAL = this;
+const PKG_UPD_TOPIC = "package updated";
+const branding = {
+        init: function PartnerPack_init(application) {
+            this._logger = application.getLogger("Branding");
+            this._application = application;
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this.__proto__ = new patterns.NotificationSource();
+            this._loadPackage();
+            try {
+                if (this._application.addonManager.info.addonVersionChanged)
+                    this._checkBPAndReplaceIfSame();
+            } catch (e) {
+                this._logger.error("Failed replacing the same BP with internal version. \n" + strutils.formatError(e));
+                this._logger.debug(e.stack);
+            }
+            this._trySetAddonDescription();
+        },
+        updateFrom: function Branding_updateFrom(newPkgDir, newProductInfo, responseDate) {
+            this._logger.config(strutils.formatString("Preparing to update to a new branding package. BrandID: '%1', date: %2", [
+                newProductInfo.BrandID,
+                responseDate
+            ]));
+            try {
+                fileutils.safeReplace(this._currPackageDir, newPkgDir);
+            } catch (e) {
+                this._logger.error("Could not replace old directory with a new one. \n" + strutils.formatError(e));
+                return;
+            } finally {
+                fileutils.removeFileSafe(newPkgDir);
+            }
+            this._updatePackage(newProductInfo, responseDate);
+        },
+        finalize: function PartnerPack_finalize() {
+            if (this._package) {
+                this._package.finalize();
+                this._package = null;
+            }
+            this._application = null;
+        },
+        get brandPackage() {
+            return this._package;
+        },
+        get barless() {
+            if (this._barless === null) {
+                try {
+                    this._barless = strutils.xmlAttrToBool(this.productInfo.Barless && this.productInfo.Barless.enabled);
+                } catch (e) {
+                    this._barless = false;
+                }
+            }
+            return this._barless;
+        },
+        get brandTemplateMap() {
+            return this._brandTemplateMap;
+        },
+        getYandexFeatureState: new function () {
+            var cache = {};
+            return function PartnerPack_getYandexFeatureState(aFeatureName) {
+                if (aFeatureName in cache)
+                    return cache[aFeatureName];
+                return cache[aFeatureName] = strutils.xmlAttrToBool(this.productInfo.YandexFeatures[aFeatureName]);
+            };
+        }(),
+        expandBrandTemplatesEscape: function PartnerPack_expandBrandTemplatesEscape(aTemplateStr, aParams) {
+            return this.expandBrandTemplates(aTemplateStr, aParams, true);
+        },
+        expandBrandTemplates: function PartnerPack_expandBrandTemplates(aTemplateString, aParams, aEncodeParams) {
+            var result = "" + aTemplateString;
+            if (!/\{/.test(result))
+                return result;
+            function encode(str) aEncodeParams ? encodeURIComponent(str) : str
+            var self = this;
+            function replacer(aMatch) {
+                var match = aMatch.replace(/[{}]/g, "");
+                if (aParams && aParams.hasOwnProperty(match))
+                    return encode(aParams[match]);
+                if (match == "brandID")
+                    return encode(self.productInfo.BrandID);
+                if (/clid(.+)/.test(match)) {
+                    let clidData = self._vendorData[match];
+                    if (!(clidData && clidData.clidAndVid))
+                        return "";
+                    return encode(clidData.clidAndVid);
+                }
+                const namesRe = /^(product[12]|vendor)\.(\w+)$/;
+                var matchNames = match.match(namesRe);
+                if (matchNames) {
+                    try {
+                        switch (matchNames[1]) {
+                        case "product1":
+                            return encode(self.productInfo.ProductName1[matchNames[2]] || "");
+                        case "product2":
+                            return encode(self.productInfo.ProductName2[matchNames[2]] || "");
+                        case "vendor":
+                            return encode(self.productInfo.VendorName[matchNames[2]] || "");
+                        }
+                    } catch (e) {
+                        self._logger.error("Could not expand branding templates. \n" + strutils.formatError(e));
+                        return "";
+                    }
+                }
+                return aMatch;
+            }
+            return result.replace(/\{[^\{\}]+\}/g, replacer);
+        },
+        get productInfo() {
+            if (this._productInfo === undefined) {
+                try {
+                    this._productInfo = this._getBPProductInfo(this._package);
+                } catch (e) {
+                    this._logger.error("Could not read file '/about/product.xml' \n" + strutils.formatError(e));
+                    this._productInfo = null;
+                }
+            }
+            return this._productInfo;
+        },
+        get browserConf() {
+            if (this._browserConf === undefined) {
+                try {
+                    this._browserConf = xmlutils.dom2jsObj(this._package.getXMLDocument("/browser/browserconf.xml"));
+                } catch (e) {
+                    this._logger.error("Could not read file '/browser/browserconf.xml'");
+                    this._browserConf = null;
+                }
+            }
+            return this._browserConf;
+        },
+        _application: null,
+        _logger: null,
+        _package: null,
+        _productInfo: undefined,
+        _browserConf: undefined,
+        _updateUrl: undefined,
+        _barless: null,
+        _consts: {
+            GCASES: [
+                "nom",
+                "gen",
+                "dat",
+                "acc",
+                "ins",
+                "pre",
+                "loc",
+                "ex1",
+                "ex2"
+            ],
+            BRAND_TS_PREF_NAME: "branding.lastupdate",
+            PKG_DIR_NAME: "branding"
+        },
+        get _brandingDate() {
+            var brandTimestamp = Number(this._application.preferences.get(this._consts.BRAND_TS_PREF_NAME, undefined));
+            var brandingDate = brandTimestamp ? new Date(brandTimestamp * 1000) : this._application.core.buildDate;
+            if (!brandTimestamp) {
+                let seconds = parseInt(brandingDate.getTime() / 1000, 10);
+                this._application.preferences.overwrite(this._consts.BRAND_TS_PREF_NAME, seconds);
+            }
+            return brandingDate;
+        },
+        set _brandingDate(newDate) {
+            var seconds = parseInt(newDate.getTime() / 1000, 10);
+            this._application.preferences.overwrite(this._consts.BRAND_TS_PREF_NAME, seconds);
+        },
+        _beforeBrandReplacement: function PartnerPack__beforeBrandReplacement() {
+            var btm = this._brandTemplateMap;
+            var bc = this.browserConf;
+        },
+        _afterBrandReplacement: function PartnerPack__afterBrandReplacement() {
+            var [
+                    _,
+                    newProductInfo
+                ] = this._validateBrandPkg(this._currPackageDir, true);
+            this._updatePackage(newProductInfo, new Date(), this._brandTemplateMap, this.browserConf);
+        },
+        get _currPackageDir() {
+            var currPkgDir = this._application.directories.vendorDir;
+            currPkgDir.append(this._consts.PKG_DIR_NAME);
+            return currPkgDir;
+        },
+        _loadPackage: function PartnerPack__loadPackage() {
+            var package_;
+            var productInfo;
+            try {
+                let currPkgDir = this._currPackageDir;
+                if (!currPkgDir.exists())
+                    this._application.addonFS.copySource("$content/branding", this._application.directories.vendorDir, this._consts.PKG_DIR_NAME);
+                [
+                    package_,
+                    productInfo
+                ] = this._validateBrandPkg(currPkgDir);
+            } catch (e) {
+                this._logger.error("Existing branding package is invalid! Will try internal version. \n" + strutils.formatError(e));
+                this._logger.debug(e.stack);
+                fileutils.removeFileSafe(this._currPackageDir);
+                this._application.addonFS.copySource("$content/branding", this._application.directories.vendorDir, this._consts.PKG_DIR_NAME);
+                [
+                    package_,
+                    productInfo
+                ] = this._validateBrandPkg(this._currPackageDir);
+                this._brandingDate = this._application.core.buildDate;
+            }
+            this._package = package_;
+            this._productInfo = productInfo;
+        },
+        _checkBPAndReplaceIfSame: function PartnerPack__checkBPAndReplaceIfSame() {
+            var currentPackage = this._package;
+            var currPkgDir = currentPackage.rootDirectory;
+            var currentProductInfo = this._productInfo;
+            var internalPkgDir = this._application.directories.vendorDir;
+            internalPkgDir.append("tmp");
+            if (internalPkgDir.exists())
+                internalPkgDir.remove(true);
+            this._application.addonFS.copySource("$content/branding", this._application.directories.vendorDir, "tmp");
+            var internalProductInfo;
+            var internalTmpPkg = new this._application.FilePackage(internalPkgDir);
+            try {
+                internalProductInfo = this._getBPProductInfo(internalTmpPkg);
+                this._validateProductInfo(internalProductInfo);
+            } finally {
+                internalTmpPkg.finalize();
+                if (!internalProductInfo)
+                    fileutils.removeFileSafe(internalPkgDir);
+            }
+            var canUpdatePackage = true;
+            if (this._application.core.CONFIG.APP.TYPE === "barff") {
+                let sameAddresses = String(currentProductInfo.BrandingURL) == String(internalProductInfo.BrandingURL);
+                if (sameAddresses)
+                    this._logger.debug("Package addresses are the same: " + currentProductInfo.BrandingURL);
+                else
+                    this._logger.debug(strutils.formatString("Package addresses are: %1, %2", [
+                        currentProductInfo.BrandingURL,
+                        internalProductInfo.BrandingURL
+                    ]));
+                let currentIsBarless = strutils.xmlAttrToBool(currentProductInfo.Barless && currentProductInfo.Barless.enabled);
+                let internalIsBarless = strutils.xmlAttrToBool(internalProductInfo.Barless && internalProductInfo.Barless.enabled);
+                let viewModeChanged = currentIsBarless != internalIsBarless;
+                this._logger.debug(strutils.formatString("Barless modes are: %1, %2", [
+                    currentIsBarless,
+                    internalIsBarless
+                ]));
+                canUpdatePackage = sameAddresses || viewModeChanged;
+            }
+            if (canUpdatePackage) {
+                this._logger.debug("Replacing existing BP with internal one");
+                this.updateFrom(internalPkgDir, internalProductInfo, this._application.core.buildDate);
+            } else {
+                fileutils.removeFileSafe(internalPkgDir);
+            }
+        },
+        _trySetAddonDescription: function PartnerPack__trySetAddonDescription() {
+            var productInfo = this.productInfo;
+            var prefs = this._application.preferences;
+            try {
+                prefs.set("name", productInfo.ProductName1.nom);
+                prefs.set("description", productInfo.ProductDescription.fx);
+                prefs.set("creator", productInfo.VendorName.nom);
+                let homepageURL = productInfo.HomePage && productInfo.HomePage.toString() || "";
+                prefs.set("homepageURL", homepageURL);
+            } catch (e) {
+                this._logger.error("Could not set branded addon description. " + strutils.formatError(e));
+            }
+        },
+        _validateBrandPkg: function PartnerPack__validateBrandPkg(packageDir, autoFinalizePkg) {
+            var package_ = new this._application.FilePackage(packageDir);
+            try {
+                let productInfo = this._getBPProductInfo(package_);
+                this._validateProductInfo(productInfo);
+                return [
+                    package_,
+                    productInfo
+                ];
+            } finally {
+                if (autoFinalizePkg) {
+                    try {
+                        package_.finalize();
+                    } catch (e) {
+                        this._logger.error("Error finalizing temporary package instance. \n" + strutils.formatError(e));
+                    }
+                    package_ = null;
+                }
+            }
+        },
+        _validateProductInfo: function Branding__validateProductInfo(productInfo) {
+            this._logger.debug("Validating product info...");
+            if (!productInfo.BrandID || productInfo.BrandID == "")
+                throw new Error("No brand ID");
+            if (!productInfo.ProductName1.nom)
+                throw new Error("No product name");
+            try {
+                let updateURL = productInfo.BrandingURL;
+                netutils.newURI(updateURL, null, null);
+            } catch (e) {
+                throw new Error("Branding update URL unavailable. \n" + strutils.formatError(e));
+            }
+        },
+        _updatePackage: function PartnerPack__updatePackage(newProductInfo, responseDate) {
+            this._package.finalize();
+            this._browserConf = undefined;
+            this._brandTemplateMap = undefined;
+            this._package = new this._application.FilePackage(this._currPackageDir);
+            this._productInfo = newProductInfo;
+            this._brandingDate = responseDate;
+            this._application.preferences.set(this._consts.BRAND_TS_PREF_NAME, Math.round(responseDate.getTime() / 1000));
+            this._logger.config("Branding replaced. Notifying listeners...");
+            this._notifyListeners(PKG_UPD_TOPIC, this._package);
+        },
+        get _vendorData() {
+            delete this._vendorData;
+            return this._vendorData = sysutils.copyObj(this._application.clids.vendorData);
+        },
+        get _brandTemplateMap() {
+            if (!this.__brandMap)
+                this.__brandMap = this._makeBrandTemplateMap(this._package);
+            return this.__brandMap;
+        },
+        set _brandTemplateMap(val) {
+            this.__brandMap = val;
+        },
+        _makeBrandTemplateMap: function PartnerPack__makeBrandTemplateMap(brandPackage) {
+            var productInfo = this._getBPProductInfo(brandPackage || this._package);
+            var result = {};
+            result.brandID = productInfo.BrandID;
+            for (let [
+                        _,
+                        gCase
+                    ] in Iterator(this._consts.GCASES)) {
+                result["product1." + gCase] = productInfo.ProductName1[gCase] || "";
+                result["product2." + gCase] = productInfo.ProductName2[gCase] || "";
+                result["vendor." + gCase] = productInfo.VendorName[gCase] || "";
+            }
+            for (let [
+                        clidName,
+                        clidData
+                    ] in Iterator(this._vendorData))
+                result[clidName] = clidData ? clidData.clidAndVid : "";
+            return result;
+        },
+        _getBPProductInfo: function Branding__getBPProductInfo(brandPackage) {
+            var productInfo = xmlutils.dom2jsObj(brandPackage.getXMLDocument("/about/product.xml"));
+            if (!brandPackage.findFile("/fx/about/product.xml"))
+                return productInfo;
+            try {
+                let fxProductInfo = xmlutils.dom2jsObj(brandPackage.getXMLDocument("/fx/about/product.xml"));
+                this._application.core.Lib.sysutils.copyProperties(fxProductInfo, productInfo);
+            } catch (e) {
+                this._logger.error("Could not read '/fx/about/product.xml'. " + e);
+            }
+            return productInfo;
+        },
+        _getBPBrowserConf: function Branding__getBPBrowserConf(brandPackage) {
+            return xmlutils.dom2jsObj(brandPackage.getXMLDocument("/browser/browserconf.xml"));
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/clids.js
@@ -0,0 +1,201 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["clids"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const DEFAULT_VENDOR_XML_PATH = "defaults/vendor/vendor.xml";
+const clids = {
+        init: function clids_init(aApplication) {
+            this._application = aApplication;
+            this._logger = aApplication.getLogger("Clids");
+            if (aApplication.addonManager.info.addonVersionChanged) {
+                if (aApplication.addonManager.info.isFreshAddonInstall) {
+                    if (aApplication.core.CONFIG.APP.TYPE == "vbff")
+                        this._migrateBarsClidsOnInstall();
+                } else {
+                    this._mergeWithInternalData();
+                }
+            }
+        },
+        finalize: function clids_finalize(aDoCleanup) {
+            if (aDoCleanup) {
+                this._removeVendorFile();
+            }
+            this.__vendorData = null;
+            this._logger = null;
+            this._application = null;
+        },
+        get vendorData() {
+            if (this.__vendorData)
+                return this.__vendorData;
+            var data = { __proto__: null };
+            var vendorXML = this._vendorXML;
+            if (!vendorXML) {
+                try {
+                    this._application.addonFS.copySource(DEFAULT_VENDOR_XML_PATH, this._vendorFile.parent, this._vendorFileName);
+                } catch (e) {
+                    this._logger.error("Can not create vendor file from internal xml.");
+                    this._logger.debug(e);
+                }
+                vendorXML = this._vendorXML;
+            }
+            if (vendorXML) {
+                let nodes = vendorXML.querySelectorAll("vendor > *");
+                let (i = nodes.length) {
+                    for (; i--;) {
+                        let node = nodes[i];
+                        let nodeName = node.nodeName;
+                        if (!/^clid/.test(nodeName))
+                            continue;
+                        let clidData = data[nodeName] = { __proto__: null };
+                        let attributes = node.attributes;
+                        let (i = attributes.length) {
+                            for (; i--;) {
+                                let attribute = attributes[i];
+                                clidData[attribute.name] = attribute.value;
+                            }
+                        }
+                        clidData.clid = node.textContent || null;
+                        if (clidData.clid) {
+                            clidData.clidAndVid = clidData.clid;
+                            if (clidData.vid)
+                                clidData.clidAndVid += "-" + clidData.vid;
+                        }
+                    }
+                }
+            }
+            return this.__vendorData = data;
+        },
+        __vendorData: null,
+        get _vendorFileName() {
+            return "clids-" + this._application.core.CONFIG.APP.TYPE + ".xml";
+        },
+        get _vendorFile() {
+            var vendorFile = this._application.directories.userDir;
+            vendorFile.append(this._vendorFileName);
+            return vendorFile;
+        },
+        get _vendorXML() {
+            var vendorFile = this._vendorFile;
+            if (!vendorFile.exists())
+                return;
+            var vendorXML;
+            try {
+                vendorXML = this._application.core.Lib.fileutils.xmlDocFromFile(vendorFile);
+            } catch (e) {
+                this._logger.error("Can not read vendor file.");
+                this._logger.debug(e);
+            }
+            return vendorXML;
+        },
+        _mergeWithInternalData: function clids__mergeWithInternalData() {
+            this.__vendorData = null;
+            var installedFile = this._vendorFile;
+            if (!installedFile.exists())
+                return;
+            try {
+                installedFile.permissions = parseInt("0644", 8);
+            } catch (e) {
+            }
+            var installedXML = this._vendorXML;
+            if (!installedXML) {
+                this._removeVendorFile();
+                return;
+            }
+            var fileutils = this._application.core.Lib.fileutils;
+            var distribXML;
+            try {
+                distribXML = fileutils.xmlDocFromStream(this._application.addonFS.getStream(DEFAULT_VENDOR_XML_PATH));
+            } catch (e) {
+                this._logger.error("Can not read internal vendor file.");
+                this._logger.debug(e);
+            }
+            if (!distribXML)
+                return;
+            var writeNewData = false;
+            var nodes = distribXML.querySelectorAll("vendor > *");
+            let (i = nodes.length) {
+                for (; i--;) {
+                    let node = nodes[i];
+                    let nodeName = node.nodeName;
+                    let nodeValue = node.textContent;
+                    if (!nodeValue)
+                        continue;
+                    let existsNode;
+                    try {
+                        existsNode = installedXML.querySelector("vendor > " + nodeName);
+                    } catch (e) {
+                        this._logger.debug(e);
+                        continue;
+                    }
+                    if (!existsNode) {
+                        installedXML.documentElement.appendChild(node);
+                        writeNewData = true;
+                    } else {
+                        if (!existsNode.textContent) {
+                            existsNode.textContent = node.textContent || "";
+                            writeNewData = true;
+                        }
+                        let attributes = node.attributes;
+                        let (i = attributes.length) {
+                            for (; i--;) {
+                                let attribute = attributes[i];
+                                if (existsNode.hasAttribute(attribute.name))
+                                    continue;
+                                existsNode.setAttribute(attribute.name, attribute.value);
+                                writeNewData = true;
+                            }
+                        }
+                    }
+                }
+            }
+            if (writeNewData)
+                fileutils.xmlDocToFile(installedXML, installedFile);
+        },
+        _migrateBarsClidsOnInstall: function clids__migrateBarsClidsOnInstall() {
+            var vendorFile = this._vendorFile;
+            if (vendorFile.exists())
+                return;
+            var fileutils = this._application.core.Lib.fileutils;
+            var barClidsFile = this._application.directories.userDir;
+            barClidsFile.append("clids-barff.xml");
+            if (barClidsFile.exists() && barClidsFile.isFile() && barClidsFile.isReadable()) {
+                try {
+                    let barClidsXML;
+                    try {
+                        barClidsXML = fileutils.xmlDocFromFile(barClidsFile);
+                    } catch (ex) {
+                        this._logger.error("Can not read bar clids file.");
+                        this._logger.debug(ex);
+                    }
+                    if (barClidsXML) {
+                        let nodes = barClidsXML.querySelectorAll("vendor > *");
+                        let (i = nodes.length) {
+                            for (; i--;) {
+                                let node = nodes[i];
+                                let nodeName = node.nodeName;
+                                let nodeValue = node.textContent;
+                                if ([
+                                        "clid1",
+                                        "clid7",
+                                        "clid8"
+                                    ].indexOf(nodeName) == -1)
+                                    barClidsXML.documentElement.removeChild(node);
+                            }
+                        }
+                        fileutils.xmlDocToFile(barClidsXML, vendorFile);
+                    }
+                } catch (e) {
+                    this._logger.error("Can not migrate clids on install.");
+                    this._logger.debug(e);
+                    return;
+                }
+            }
+            this._mergeWithInternalData();
+        },
+        _removeVendorFile: function clids__removeVendorFile() {
+            this._application.core.Lib.fileutils.removeFileSafe(this._vendorFile);
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/cloudsource.js
@@ -0,0 +1,299 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["cloudSource"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+const GLOBAL = this;
+const DB_FILENAME = "fastdial.sqlite";
+const API_DATA_RECEIVED_EVENT = "ftabs-api-data-received";
+const SELF_DATA_RECEIVED_EVENT = "ftabs-self-data-received";
+const CLOUD_API_URL = "http://api.browser.yandex.ru/dashboard/v2/get/?nodes=";
+const MAX_LOGO_WIDTH = 150;
+const MAX_LOGO_HEIGHT = 60;
+var cachedCloudData = Object.create(null);
+const cloudSource = {
+        init: function CloudSource_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this.__proto__ = new patterns.NotificationSource();
+            this.addListener(API_DATA_RECEIVED_EVENT, this);
+            this.addListener(SELF_DATA_RECEIVED_EVENT, this);
+            this._application = application;
+            this._logger = application.getLogger("CloudSource");
+            this._initDatabase();
+        },
+        finalize: function CloudSource_finalize(doCleanup, callback) {
+            this.removeAllListeners();
+            this._pendingRequests.forEach(function (request) {
+                request.abort();
+            });
+            this._pagesLoadQueue = null;
+            this._manifestLoadQueue = null;
+            var dbClosedCallback = function _dbClosedCallback() {
+                    this._database = null;
+                    this._application = null;
+                    this._logger = null;
+                }.bind(this);
+            if (this._database) {
+                this._database.close(function () {
+                    dbClosedCallback();
+                    callback();
+                });
+                return true;
+            }
+            dbClosedCallback();
+        },
+        observe: function CloudSource_observe(aSubject, aTopic, aData) {
+            switch (aTopic) {
+            case API_DATA_RECEIVED_EVENT:
+                let self = this;
+                this._database.execQueryAsync("SELECT domain, logo, backgroundColor FROM cloud_data WHERE domain = :domain AND user_supplied = 1", { domain: aData.domain }, function (rowsData, storageError) {
+                    if (storageError) {
+                        let msg = strutils.formatString("DB error while selecting local cloud data: %1 (code %2)", [
+                                storageError.message,
+                                storageError.result
+                            ]);
+                        throw new Error(msg);
+                    }
+                    if (rowsData.length)
+                        return;
+                    var newData = {
+                            backgroundImage: aData.logo,
+                            backgroundColor: aData.color,
+                            domain: aData.domain
+                        };
+                    cachedCloudData[aData.domain] = {
+                        backgroundColor: aData.color,
+                        backgroundImage: aData.logo
+                    };
+                    self._database.execQueryAsync("INSERT INTO cloud_data (domain, logo, backgroundColor, user_supplied) VALUES (:domain, :logo, :color, 0)", {
+                        domain: aData.domain,
+                        logo: aData.logo,
+                        color: aData.color
+                    });
+                    Services.obs.notifyObservers(self, self._application.core.eventTopics.CLOUD_DATA_RECEIVED_EVENT, JSON.stringify(newData));
+                });
+                break;
+            case SELF_DATA_RECEIVED_EVENT:
+                let newData = {
+                        backgroundImage: aData.logo,
+                        backgroundColor: aData.color,
+                        domain: aData.domain
+                    };
+                this._database.execQueryAsync("INSERT OR REPLACE INTO cloud_data (domain, logo, backgroundColor, user_supplied) VALUES (:domain, :logo, :color, 1)", {
+                    domain: aData.domain,
+                    logo: aData.logo,
+                    color: aData.color
+                });
+                cachedCloudData[aData.domain] = {
+                    backgroundColor: aData.color,
+                    backgroundImage: aData.logo
+                };
+                Services.obs.notifyObservers(this, this._application.core.eventTopics.CLOUD_DATA_RECEIVED_EVENT, JSON.stringify(newData));
+                break;
+            }
+        },
+        getCachedExistingData: function CloudSource_getCachedData(host) {
+            return cachedCloudData[host] || {};
+        },
+        requestExistingTile: function CloudSource_requestExistingTile(host, callback) {
+            if (cachedCloudData[host])
+                return callback(null, cachedCloudData[host]);
+            this._database.execQueryAsync("SELECT domain, logo, backgroundColor FROM cloud_data WHERE domain = :domain", { domain: host }, function CloudSource_requestTileFromDatabase_onDataReady(rowsData, storageError) {
+                if (storageError || !rowsData.length)
+                    return callback(storageError);
+                cachedCloudData[host] = {
+                    backgroundImage: rowsData[0].logo,
+                    backgroundColor: rowsData[0].backgroundColor
+                };
+                callback(null, cachedCloudData[host]);
+            });
+        },
+        fetchTileFromWeb: function CloudSource_fetchTileFromWeb(uri, useBothSources) {
+            var host;
+            try {
+                uri.QueryInterface(Ci.nsIURL);
+                host = uri.asciiHost.replace(/^www\./, "");
+            } catch (ex) {
+            }
+            if (!host)
+                return;
+            uri.host = uri.host.replace(/^www\./, "");
+            this._requestAPI(uri);
+            if (useBothSources && !this._application.isYandexHost(uri.host)) {
+                this._requestPageManifest(uri);
+            }
+        },
+        _requestPageManifest: function CloudSource__requestPageManifest(uri) {
+            if (!uri.spec || this._pagesLoadQueue[uri.spec])
+                return;
+            this._pagesLoadQueue[uri.spec] = 1;
+            var self = this;
+            var xhr = this._createXHR();
+            uri = uri.clone();
+            uri.QueryInterface(Ci.nsIURL);
+            if (this._application.isYandexHost(uri.host)) {
+                let parsedQuery = netutils.querystring.parse(uri.query);
+                parsedQuery.nugt = "vbff-" + this._application.addonManager.addonVersion;
+                uri.query = netutils.querystring.stringify(parsedQuery);
+            }
+            xhr.open("GET", uri.spec, true);
+            var timer = new sysutils.Timer(function () {
+                    xhr.abort();
+                }, 25000);
+            xhr.addEventListener("load", function () {
+                timer.cancel();
+                delete self._pagesLoadQueue[uri.spec];
+                var responseText = (xhr.responseText || "").replace(/<\/head>[\s\S]*/i, "</head><body/></html>").replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
+                var domParser = xmlutils.getDOMParser();
+                var xmlDocument;
+                try {
+                    xmlDocument = domParser.parseFromString(responseText, "text/html");
+                } catch (e) {
+                }
+                if (!xmlDocument)
+                    return;
+                var link = xmlDocument.querySelector("link[rel='yandex-tableau-widget']");
+                if (!link)
+                    return;
+                var manifestUrl = netutils.resolveRelativeURL(link.getAttribute("href"), uri);
+                self._validatePageManifest(manifestUrl, uri.asciiHost);
+            });
+            var errorHandler = function errorHandler(e) {
+                delete self._pagesLoadQueue[uri.spec];
+            };
+            xhr.addEventListener("error", errorHandler, false);
+            xhr.addEventListener("abort", errorHandler, false);
+            xhr.send();
+        },
+        _validatePageManifest: function CloudSource__validatePageManifest(url, domain) {
+            if (this._manifestLoadQueue[url])
+                return;
+            this._manifestLoadQueue[url] = 1;
+            var self = this;
+            var xhr = this._createXHR();
+            xhr.open("GET", url, true);
+            xhr.responseType = "json";
+            var timer = new sysutils.Timer(function () {
+                    xhr.abort();
+                }, 25000);
+            xhr.addEventListener("load", function () {
+                timer.cancel();
+                delete self._manifestLoadQueue[url];
+                if (!xhr.response) {
+                    self._logger.warn("Server response is not a valid JSON");
+                    return;
+                }
+                if (!xhr.response.api_version || !xhr.response.layout || !xhr.response.layout.logo || !xhr.response.layout.color)
+                    return;
+                var color = typeof xhr.response.layout.color === "object" ? xhr.response.layout.color[self._application.locale.language] || xhr.response.layout.color.default : xhr.response.layout.color;
+                var logo = typeof xhr.response.layout.logo === "object" ? xhr.response.layout.logo[self._application.locale.language] || xhr.response.layout.logo.default : xhr.response.layout.logo;
+                if (!logo || !color || !/^#/.test(color) || [
+                        4,
+                        7
+                    ].indexOf(color.length) === -1)
+                    return;
+                color = color.substr(1);
+                if (color.length === 3)
+                    color = color.split("").map(function (symbol) symbol + symbol).join("");
+                var logoSource = netutils.resolveRelativeURL(logo, netutils.newURI(url));
+                self._validateImageAgainstSize(logoSource, function (valid) {
+                    if (!valid)
+                        return;
+                    self._notifyListeners(SELF_DATA_RECEIVED_EVENT, {
+                        domain: domain,
+                        color: color,
+                        logo: logoSource
+                    });
+                });
+            });
+            var errorHandler = function errorHandler(e) {
+                delete self._manifestLoadQueue[url];
+            };
+            xhr.addEventListener("error", errorHandler, false);
+            xhr.addEventListener("abort", errorHandler, false);
+            xhr.send();
+        },
+        _validateImageAgainstSize: function CloudSource__validateImageAgainstSize(imgSource, callback) {
+            var self = this;
+            var hiddenWindow = misc.hiddenWindows.appWindow;
+            var hiddenWindowDoc = hiddenWindow.document;
+            var image = hiddenWindowDoc.createElementNS("http://www.w3.org/1999/xhtml", "img");
+            image.onload = function imgOnLoad() {
+                self._logger.trace("Image proportions: " + image.width + "x" + image.height);
+                callback(image.width <= MAX_LOGO_WIDTH && image.height <= MAX_LOGO_HEIGHT);
+            };
+            image.onerror = function imgOnError() {
+                callback(false);
+            };
+            image.src = imgSource;
+        },
+        _requestAPI: function CloudSource__requestAPI(uri) {
+            var host;
+            try {
+                uri.QueryInterface(Ci.nsIURL);
+                host = uri.asciiHost.replace(/^www\./, "");
+            } catch (ex) {
+            }
+            if (!host)
+                return;
+            if (this._cloudDataDomainsQueue[host])
+                return;
+            this._cloudDataDomainsQueue[host] = 1;
+            var self = this;
+            var cloudURL = CLOUD_API_URL + encodeURIComponent(host) + "&brandID=" + this._application.branding.productInfo.BrandID + "&lang=" + this._application.locale.language;
+            var xhr = this._createXHR();
+            xhr.open("GET", cloudURL, true);
+            xhr.responseType = "json";
+            var timer = new sysutils.Timer(function () {
+                    xhr.abort();
+                }, 25000);
+            xhr.addEventListener("load", function () {
+                timer.cancel();
+                delete self._cloudDataDomainsQueue[host];
+                if (!xhr.response)
+                    return self._logger.error("Server response is not a valid JSON: " + xhr.responseText);
+                if (xhr.response.error || !xhr.response[0].color || !xhr.response[0].resources.logo)
+                    return;
+                self._notifyListeners(API_DATA_RECEIVED_EVENT, {
+                    domain: host,
+                    color: xhr.response[0].color.replace(/^#/, ""),
+                    logo: xhr.response[0].resources.logo.url
+                });
+            });
+            var errorHandler = function errorHandler(e) {
+                delete self._cloudDataDomainsQueue[host];
+            };
+            xhr.addEventListener("error", errorHandler, false);
+            xhr.addEventListener("abort", errorHandler, false);
+            xhr.send();
+        },
+        _createXHR: function CloudSource__createXHR() {
+            var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            xhr.mozBackgroundRequest = true;
+            xhr.QueryInterface(Ci.nsIDOMEventTarget);
+            var dropFromQueue = function () {
+                    var pos = this._pendingRequests.indexOf(xhr);
+                    this._pendingRequests.splice(pos, 1);
+                }.bind(this);
+            xhr.addEventListener("load", dropFromQueue, false);
+            xhr.addEventListener("error", dropFromQueue, false);
+            xhr.addEventListener("abort", dropFromQueue, false);
+            this._pendingRequests.push(xhr);
+            return xhr;
+        },
+        _initDatabase: function CloudSource__initDatabase() {
+            var dbFile = this._application.core.rootDir;
+            dbFile.append(DB_FILENAME);
+            this._database = new Database(dbFile);
+        },
+        _database: null,
+        _application: null,
+        _logger: null,
+        _pendingRequests: [],
+        _cloudDataDomainsQueue: {},
+        _pagesLoadQueue: {},
+        _manifestLoadQueue: {}
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/colors.js
@@ -0,0 +1,182 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["colors"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const GLOBAL = this;
+const DEFAULT_BGCOLOR = "f2f2f2";
+const FONT_COLOR_THRESHOLD = 170;
+const MAX_THRESHOLD = 238;
+const MIN_THRESHOLD = 20;
+const PASTEL_THRESHOLD = 92;
+const CANVAS_SIZE_THRESHOLD = 800;
+const colors = {
+        init: function Safebrowsing_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("Colors");
+        },
+        finalize: function Safebrowsing_finalize(doCleanup, callback) {
+            this._application = null;
+            this._logger = null;
+        },
+        getFontColorByBackgroundColor: function Colors_getFontColorByBackgroundColor(bgColor) {
+            bgColor = bgColor || DEFAULT_BGCOLOR;
+            const FONT_COLOR_THRESHOLD = 170;
+            var [
+                    red,
+                    green,
+                    blue
+                ] = [
+                    parseInt(bgColor.substr(0, 2), 16),
+                    parseInt(bgColor.substr(2, 2), 16),
+                    parseInt(bgColor.substr(4, 2), 16)
+                ];
+            var tone = (red + green + blue) / 3;
+            return tone < FONT_COLOR_THRESHOLD && (red < FONT_COLOR_THRESHOLD || green < FONT_COLOR_THRESHOLD) ? 1 : 0;
+        },
+        requestImageDominantColor: function Colors_requestImageDominantColor(url, options, callback) {
+            if (typeof options === "function") {
+                callback = options;
+                options = {};
+            }
+            var self = this;
+            var hiddenWindow = misc.hiddenWindows.appWindow;
+            var hiddenWindowDoc = hiddenWindow.document;
+            var image = hiddenWindowDoc.createElementNS("http://www.w3.org/1999/xhtml", "img");
+            const MOZ_ANNO_PREFIX = "moz-anno:favicon:";
+            if (url.indexOf(MOZ_ANNO_PREFIX) === 0)
+                url = url.replace(MOZ_ANNO_PREFIX, "");
+            image.onload = function imgOnLoad() {
+                if (image.width === 1 && image.height === 1)
+                    return callback(null, null);
+                var canvas = hiddenWindowDoc.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
+                var ctx = canvas.getContext("2d");
+                ctx.mozImageSmoothingEnabled = false;
+                var canvasWidth = image.width;
+                var canvasHeight = image.height;
+                if (image.width > image.height) {
+                    if (options.minifyCanvas && image.width > CANVAS_SIZE_THRESHOLD) {
+                        canvasWidth = CANVAS_SIZE_THRESHOLD;
+                        canvasHeight = Math.round(canvasWidth * image.height / image.width);
+                    }
+                } else {
+                    if (options.minifyCanvas && image.height > CANVAS_SIZE_THRESHOLD) {
+                        canvasHeight = CANVAS_SIZE_THRESHOLD;
+                        canvasWidth = Math.round(canvasHeight * image.width / image.height);
+                    }
+                }
+                canvas.setAttribute("width", canvasWidth);
+                canvas.setAttribute("height", canvasHeight);
+                ctx.drawImage(image, 0, 0, canvasWidth, canvasHeight);
+                var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
+                options.startY = options.bottomQuarter ? Math.round(imgPixels.height * 0.75) : 0;
+                options.startX = options.rightHalf ? Math.round(imgPixels.width / 2) : 0;
+                options.url = url;
+                callback(null, self.getPixelsDominantColor(imgPixels, options));
+            };
+            image.onerror = function imgOnError() {
+                callback(new Error("Failed to load image " + url));
+            };
+            image.src = url;
+        },
+        getPixelsDominantColor: function Colors_getPixelsDominantColor(imgPixels, options) {
+            var maxValueKey = null;
+            var colorsContainer = Object.create(null);
+            var pixelColorData = new Array(4);
+            let (y = options.startY) {
+                for (; y < imgPixels.height; y++) {
+                    let (x = options.startX) {
+                        for (; x < imgPixels.width; x++) {
+                            let index = y * 4 * imgPixels.width + x * 4;
+                            pixelColorData[0] = imgPixels.data[index];
+                            pixelColorData[1] = imgPixels.data[index + 1];
+                            pixelColorData[2] = imgPixels.data[index + 2];
+                            pixelColorData[3] = imgPixels.data[index + 3];
+                            if (isAlmostTransparent(pixelColorData[3]))
+                                continue;
+                            if (pixelColorData[3] !== 255) {
+                                let (z = 0) {
+                                    for (; z < 3; z++) {
+                                        let colorStep = (255 - pixelColorData[z]) / 255;
+                                        pixelColorData[z] = Math.round(255 - colorStep * pixelColorData[3]);
+                                    }
+                                }
+                            }
+                            if (!options.preventSkipColors && (isAlmostWhite(pixelColorData) || isAlmostBlack(pixelColorData) || isLightGrey(pixelColorData)))
+                                continue;
+                            let color = toRGB(pixelColorData[0]) + toRGB(pixelColorData[1]) + toRGB(pixelColorData[2]);
+                            colorsContainer[color] = colorsContainer[color] || 0;
+                            colorsContainer[color] += 1;
+                            if (maxValueKey === null || colorsContainer[maxValueKey] < colorsContainer[color]) {
+                                maxValueKey = color;
+                            }
+                        }
+                    }
+                }
+            }
+            if (maxValueKey) {
+                let [
+                        red,
+                        green,
+                        blue
+                    ] = [
+                        parseInt(maxValueKey.substr(0, 2), 16),
+                        parseInt(maxValueKey.substr(2, 2), 16),
+                        parseInt(maxValueKey.substr(4, 2), 16)
+                    ];
+                if (isAcidColor(red, green, blue)) {
+                    red = Math.max(red, PASTEL_THRESHOLD);
+                    green = Math.max(green, PASTEL_THRESHOLD);
+                    blue = Math.max(blue, PASTEL_THRESHOLD);
+                    maxValueKey = toRGB(red) + toRGB(green) + toRGB(blue);
+                }
+            }
+            if (options.url)
+                this._logger.trace("Most frequent color for " + options.url + " is " + (maxValueKey || "undefined"));
+            return maxValueKey;
+        },
+        _application: null,
+        _logger: null
+    };
+function isAcidColor(red, green, blue) {
+    var sum = red + green + blue;
+    if (sum >= MAX_THRESHOLD * 2 && (red <= MIN_THRESHOLD || green <= MIN_THRESHOLD || blue <= MIN_THRESHOLD))
+        return true;
+    if (sum <= MAX_THRESHOLD + MIN_THRESHOLD * 2 && (red >= MAX_THRESHOLD || green >= MAX_THRESHOLD || blue >= MAX_THRESHOLD))
+        return true;
+    return false;
+}
+function toRGB(num) {
+    return (num < 16 ? "0" : "") + num.toString(16);
+}
+function isAlmostTransparent(opacity) {
+    return opacity < 230;
+}
+function isAlmostWhite(rgb) {
+    var [
+            red,
+            green,
+            blue
+        ] = rgb;
+    return red > 253 && green > 253 && blue > 253;
+}
+function isAlmostBlack(rgb) {
+    var [
+            red,
+            green,
+            blue
+        ] = rgb;
+    return red < 10 && green < 10 & blue < 10;
+}
+function isLightGrey(rgb) {
+    var [
+            red,
+            green,
+            blue
+        ] = rgb;
+    var meanValue = (red + green + blue) / 3;
+    return Math.abs(meanValue - red) + Math.abs(meanValue - green) + Math.abs(meanValue - blue) < 15;
+}
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/databaseMigration.js
@@ -0,0 +1,126 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["databaseMigration"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const GLOBAL = this;
+const databaseMigration = {
+        init: function migration_init(aApplication) {
+            aApplication.core.Lib.sysutils.copyProperties(aApplication.core.Lib, GLOBAL);
+            this._application = aApplication;
+            this._logger = aApplication.getLogger("DatabaseMigration");
+            try {
+                this._migrate();
+            } catch (ex) {
+                this._logger.error("Failed while running database migration process. " + strutils.formatError(ex));
+                this._logger.debug(ex.stack);
+            }
+        },
+        finalize: function databaseMigration_finalize(doCleanup, callback) {
+            this._application = null;
+            this._logger = null;
+        },
+        _migrate: function migration__migrate() {
+            var installInfo = this._application.addonManager.info;
+            for (let name in schema) {
+                let dbFile;
+                try {
+                    dbFile = this._getDatabaseFile(name);
+                } catch (ex) {
+                    this._logger.error(ex.message);
+                    this._logger.debug(ex.stack);
+                    continue;
+                }
+                if (installInfo.isFreshAddonInstall) {
+                    fileutils.removeFileSafe(dbFile);
+                } else {
+                    let isDbFileOk = dbFile.exists() && dbFile.isFile() && dbFile.isReadable();
+                    if (!installInfo.addonVersionChanged) {
+                        if (isDbFileOk) {
+                            continue;
+                        }
+                        this._application.preferences.set("ftabs.dataDirCrash", true);
+                        this._logger.debug("Data directory crash: " + name + " database missing");
+                    }
+                }
+                let database = new Database(dbFile);
+                let currentSchemaVersion = database.schemaVersion;
+                let maxSchemaVersion = Object.keys(schema[name]).sort(function (a, b) parseInt(a, 10) - parseInt(b, 10)).pop();
+                let migrateSchemaVersion;
+                if (installInfo.addonLastVersion === "2.4" && name === "fastdial")
+                    currentSchemaVersion = 4;
+                this._logger.config("Database migration started (" + name + "). " + "Current schema version: " + currentSchemaVersion + "; " + "Max schema version: " + maxSchemaVersion + ".");
+                try {
+                    for (migrateSchemaVersion = currentSchemaVersion + 1; migrateSchemaVersion <= maxSchemaVersion; migrateSchemaVersion++) {
+                        schema[name][migrateSchemaVersion](database);
+                        database.schemaVersion = migrateSchemaVersion;
+                    }
+                } catch (ex) {
+                    this._logger.error("Failed database migrating " + name + " to schema version " + migrateSchemaVersion + " another version. " + strutils.formatError(ex));
+                    this._logger.debug(ex.stack);
+                }
+                database.close();
+                this._logger.config("Database migration finished");
+            }
+        },
+        _getDatabaseFile: function Migration__getDatabaseFile(dbName) {
+            var path;
+            switch (dbName) {
+            case "fastdial":
+            case "usageHistory":
+                path = dbName.toLowerCase() + ".sqlite";
+                break;
+            default:
+                throw new Error("Bad name for DB file ('" + dbName + "')");
+            }
+            var dbFile = this._application.core.rootDir;
+            path.split("/").forEach(function (p) {
+                if (p)
+                    dbFile.append(p);
+            });
+            return dbFile;
+        },
+        _application: null,
+        _logger: null
+    };
+const schema = {
+        fastdial: {
+            1: function schema_fastdial_1(database) {
+                database.execQuery("CREATE TABLE IF NOT EXISTS blacklist (domain TEXT UNIQUE)");
+                database.execQuery("CREATE TABLE IF NOT EXISTS thumbs (url TEXT UNIQUE, title TEXT, backgroundImage TEXT, backgroundColor TEXT, favicon TEXT, insertTimestamp INTEGER)");
+                database.execQuery("CREATE TABLE IF NOT EXISTS thumbs_shown (thumb_id INTEGER, position INTEGER UNIQUE, fixed INTEGER)");
+            },
+            2: function schema_fastdial_2(database) {
+                database.execQuery("UPDATE thumbs SET backgroundColor = NULL, favicon = NULL, backgroundImage = NULL");
+            },
+            3: function schema_fastdial_3(database) {
+                database.execQuery("UPDATE thumbs SET backgroundColor = NULL WHERE backgroundColor = ''");
+                database.execQuery("UPDATE thumbs SET title = NULL WHERE title = ''");
+                database.execQuery("UPDATE thumbs SET backgroundImage = NULL");
+            },
+            4: function schema_fastdial_4(database) {
+                database.execQuery("CREATE TABLE IF NOT EXISTS cloud_data (domain TEXT UNIQUE, logo TEXT, backgroundColor TEXT)");
+                database.execQuery("CREATE TABLE IF NOT EXISTS unsafe_domains (domain TEXT UNIQUE, insertTimestamp INTEGER)");
+            },
+            5: function schema_fastdial_5(database) {
+                database.execQuery("ALTER TABLE cloud_data ADD COLUMN user_supplied INTEGER");
+            },
+            6: function schema_fastdial_6(database) {
+                database.execQuery("ALTER TABLE thumbs_shown ADD COLUMN syncInstance TEXT");
+                database.execQuery("ALTER TABLE thumbs_shown ADD COLUMN syncId TEXT");
+                database.execQuery("ALTER TABLE thumbs_shown ADD COLUMN syncTimestamp INTEGER");
+                database.execQuery("UPDATE thumbs SET backgroundColor = NULL WHERE backgroundColor = ''");
+                database.execQuery("UPDATE thumbs SET backgroundColor = NULL, favicon = NULL WHERE favicon LIKE 'http://favicon.yandex.net/favicon/%'");
+            },
+            7: function schema_fastdial_7(database) {
+                database.execQuery("ALTER TABLE thumbs ADD COLUMN screenshotColor TEXT");
+            }
+        },
+        usageHistory: {
+            1: function schema_usageHistory_1(database) {
+                database.execQuery("CREATE TABLE IF NOT EXISTS usagehistory (date INTEGER, action TEXT, info TEXT)");
+            }
+        }
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/dataprovider.js
@@ -0,0 +1,50 @@
+"use strict";
+const Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils, EXPORTED_SYMBOLS = ["brandingPlus"], GLOBAL = this;
+const PKG_UPD_TOPIC = "package updated";
+const brandingPlus = {
+        init: function brandingPlus_init(application) {
+            this._application = application;
+            this._logger = this._application.getLogger("Package");
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application.core.protocol.addDataProvider(this);
+            this._application.branding.addListener(PKG_UPD_TOPIC, this);
+        },
+        finalize: function brandingPlus_finalize() {
+            this._application.branding.removeListener(PKG_UPD_TOPIC, this);
+            this._application.core.protocol.removeDataProvider(this);
+            this._application = null;
+            this._logger = null;
+        },
+        newURI: function brandingPlus_newURI(aSpec, aOriginalCharset, aBaseURI, simpleURI) {
+            if (!aSpec)
+                return null;
+            var spec = aBaseURI ? aBaseURI.resolve(aSpec) : aSpec;
+            var resourcePath = spec && spec.split(/:\/\/branding\//)[1];
+            var brandingPackageURL = resourcePath && this._application.branding.brandPackage.resolvePath(resourcePath);
+            return misc.tryCreateFixupURI(brandingPackageURL);
+        },
+        newChannel: function brandingPlus_newChannel(aURI, isSimpleURI) {
+            if (isSimpleURI || aURI.host != "plus.branding" || aURI.path != "/names.dtd")
+                return null;
+            var stream = strutils.utf8Converter.convertToInputStream(this._namesDTDContent);
+            var channel = Cc["@mozilla.org/network/input-stream-channel;1"].createInstance(Ci.nsIInputStreamChannel).QueryInterface(Ci.nsIChannel);
+            channel.setURI(aURI);
+            channel.originalURI = aURI;
+            channel.contentStream = stream;
+            return channel;
+        },
+        observe: function brandingPlus_observe(aSubject, aTopic, aData) {
+            if (aTopic == PKG_UPD_TOPIC)
+                this._namesStr = undefined;
+        },
+        get _namesDTDContent() {
+            if (!this._namesStr) {
+                this._namesStr = this._application.branding.expandBrandTemplates(this._namesTpl);
+            }
+            return this._namesStr;
+        },
+        _namesStr: undefined,
+        _namesTpl: "        <!ENTITY product1.nom \"{product1.nom}\">        <!ENTITY product1.gen \"{product1.gen}\">        <!ENTITY product1.dat \"{product1.dat}\">        <!ENTITY product1.acc \"{product1.acc}\">        <!ENTITY product1.ins \"{product1.ins}\">        <!ENTITY product1.pre \"{product1.pre}\">        <!ENTITY product1.loc \"{product1.loc}\">                <!ENTITY product2.nom \"{product2.nom}\">        <!ENTITY product2.gen \"{product2.gen}\">        <!ENTITY product2.dat \"{product2.dat}\">        <!ENTITY product2.acc \"{product2.acc}\">        <!ENTITY product2.ins \"{product2.ins}\">        <!ENTITY product2.pre \"{product2.pre}\">        <!ENTITY product2.loc \"{product2.loc}\">                <!ENTITY vendor.nom \"{vendor.nom}\">        <!ENTITY vendor.gen \"{vendor.gen}\">        <!ENTITY vendor.dat \"{vendor.dat}\">        <!ENTITY vendor.acc \"{vendor.acc}\">        <!ENTITY vendor.ins \"{vendor.ins}\">        <!ENTITY vendor.pre \"{vendor.pre}\">        <!ENTITY vendor.loc \"{vendor.loc}\">",
+        _application: null,
+        _logger: null
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/fastdial.js
@@ -0,0 +1,888 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["fastdial"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu,
+        results: Cr
+    } = Components;
+const GLOBAL = this;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/PlacesUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+[
+    [
+        "SESSION_STORE_SVC",
+        "@mozilla.org/browser/sessionstore;1",
+        "nsISessionStore"
+    ],
+    [
+        "DOWNLOAD_MANAGER_SVC",
+        "@mozilla.org/download-manager-ui;1",
+        "nsIDownloadManagerUI"
+    ],
+    [
+        "UUID_SVC",
+        "@mozilla.org/uuid-generator;1",
+        "nsIUUIDGenerator"
+    ]
+].forEach(function ([
+    name,
+    contract,
+    intf
+]) XPCOMUtils.defineLazyServiceGetter(GLOBAL, name, contract, intf));
+const FILE_PROTOCOL_HANDLER = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
+const OUTER_WINDOW_DESTROY_EVENT = "outer-window-destroyed";
+const XUL_WINDOW_DESTROY_EVENT = "xul-window-destroyed";
+const CLEAR_HISTORY_THUMBS_INTERVAL = 3600;
+const RECENTLY_CLOSED_TABS = 15;
+const BAR_EXTENSION_ID = "yasearch@yandex.ru";
+const NATIVE_RESTORETAB_PREFIX = "current-tab-";
+const NATIVE_RESTOREWIN_PREFIX = "current-win-";
+const CLCK_URL = "http://clck.yandex.ru/click/dtype=stred/pid=12/cid=72480/path=%p/*http://yandex.ru";
+const fastdial = {
+        init: function Fastdial_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            this._application = application;
+            this._logger = application.getLogger("Fastdial");
+            var dataProvider = this._barnavigDataProvider.init(this._application);
+            this._application.barnavig.addDataProvider(dataProvider);
+            Services.obs.addObserver(this, OUTER_WINDOW_DESTROY_EVENT, false);
+            Services.obs.addObserver(this, XUL_WINDOW_DESTROY_EVENT, false);
+            Services.obs.addObserver(this, this._application.core.eventTopics.CLOUD_DATA_RECEIVED_EVENT, false);
+            this._clearHistoryThumbsTimer = new sysutils.Timer(function () {
+                this._historyThumbs = {};
+            }.bind(this), CLEAR_HISTORY_THUMBS_INTERVAL * 1000, true);
+        },
+        finalize: function Fastdial_finalize(doCleanup, callback) {
+            Services.obs.removeObserver(this, OUTER_WINDOW_DESTROY_EVENT);
+            Services.obs.removeObserver(this, XUL_WINDOW_DESTROY_EVENT);
+            Services.obs.removeObserver(this, this._application.core.eventTopics.CLOUD_DATA_RECEIVED_EVENT);
+            if (this._clearHistoryThumbsTimer)
+                this._clearHistoryThumbsTimer.cancel();
+            this._barnavigDataProvider.finalize();
+            this._application.barnavig.removeDataProvider(this._barnavigDataProvider);
+            this._registeredListeners = null;
+            this._historyThumbs = null;
+            this._application = null;
+            this._logger = null;
+        },
+        observe: function Fastdial_observe(aSubject, aTopic, aData) {
+            switch (aTopic) {
+            case OUTER_WINDOW_DESTROY_EVENT:
+                let outerWindowId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data;
+                delete this._registeredListeners[outerWindowId];
+                break;
+            case XUL_WINDOW_DESTROY_EVENT:
+                this.sendRequest("closedTabsListChanged", { empty: this._recentlyClosedTabs.length === 0 });
+                break;
+            case this._application.core.eventTopics.CLOUD_DATA_RECEIVED_EVENT:
+                aData = JSON.parse(aData);
+                for (let [
+                            url,
+                            historyThumbData
+                        ] in Iterator(this._historyThumbs)) {
+                    let historyThumbHost = this.getDecodedUrlHost(url);
+                    if (!historyThumbHost || historyThumbHost !== aData.domain)
+                        continue;
+                    sysutils.copyProperties(aData, historyThumbData.cloud);
+                    this.sendRequest("historyThumbChanged", this._application.frontendHelper.getDataForThumb(historyThumbData));
+                }
+                break;
+            case "status":
+                break;
+            }
+        },
+        setListenersForWindow: function Fastdial_setListenersForWindow(outerWindowId, command, callback) {
+            if (arguments.length === 1) {
+                this._registeredListeners[outerWindowId] = {};
+                return;
+            }
+            this._registeredListeners[outerWindowId] = this._registeredListeners[outerWindowId] || {};
+            var listeners = this._registeredListeners[outerWindowId];
+            if (!listeners[command])
+                return listeners[command] = [callback];
+            if (listeners[command].indexOf(callback) === -1) {
+                listeners[command].push(callback);
+            }
+        },
+        removeListenersForWindow: function Fastdial_removeListenersForWindow(outerWindowId, command, callback) {
+            var listeners = this._registeredListeners[outerWindowId];
+            if (!listeners || !listeners[command])
+                return;
+            if (callback === undefined) {
+                delete listeners[command];
+            } else {
+                let index = listeners[command].indexOf(callback);
+                if (index !== -1) {
+                    listeners[command].splice(index, 1);
+                }
+            }
+        },
+        hasListenerForWindow: function Fastdial_hasListenerForWindow(outerWindowId, command, callback) {
+            var listeners = this._registeredListeners[outerWindowId];
+            return listeners[command] && listeners[command].indexOf(callback) !== -1;
+        },
+        sendRequest: function Fastdial_sendRequest(command, data) {
+            this._logger.trace("SendRequest [" + command + "]: every window: " + JSON.stringify(data));
+            for (let outerWindowId in this._registeredListeners) {
+                this.sendRequestToTab(outerWindowId, command, data, false);
+            }
+        },
+        sendRequestToTab: function Fastdial_sendRequestToTab(outerWindowId, command, data, needsTraceLog) {
+            var listeners = this._registeredListeners[outerWindowId];
+            if (!listeners || !listeners[command])
+                return;
+            if (needsTraceLog !== false) {
+                this._logger.trace("SendRequest [" + command + "]: outer_window_id " + outerWindowId + ": " + JSON.stringify(data));
+            }
+            listeners[command].forEach(function (callback) {
+                if (!(outerWindowId in this._registeredListeners))
+                    return;
+                data = sysutils.copyObj(data, true);
+                try {
+                    callback(data);
+                } catch (ex) {
+                    this._logger.error("Frontend callback execution failed: " + ex.message);
+                }
+            }, this);
+        },
+        openExternalWindow: function Fastdial_openExternalWindow(externalWindowName, window) {
+            if ([
+                    "downloads",
+                    "bookmarks",
+                    "history"
+                ].indexOf(externalWindowName) === -1)
+                throw new Error("Wrong window type selected");
+            if (externalWindowName === "downloads") {
+                DOWNLOAD_MANAGER_SVC.show(window);
+                return;
+            }
+            var leftPaneRoot;
+            if (externalWindowName === "bookmarks")
+                leftPaneRoot = "AllBookmarks";
+            else if (externalWindowName === "history")
+                leftPaneRoot = "History";
+            var organizer = misc.getTopWindowOfType("Places:Organizer");
+            if (!organizer) {
+                let topWindow = misc.getTopBrowserWindow();
+                topWindow.openDialog("chrome://browser/content/places/places.xul", "", "chrome,toolbar=yes,dialog=no,resizable", leftPaneRoot);
+            } else {
+                organizer.PlacesOrganizer.selectLeftPaneQuery(leftPaneRoot);
+                organizer.focus();
+            }
+        },
+        requestInit: function Fastdial_requestInit(outerWindowId, ignoreBookmarks) {
+            var self = this;
+            var backboneXY = this._application.layout.getThumbsNumXY();
+            var maxThumbIndex = backboneXY[0] * backboneXY[1];
+            var showBookmarks = this._application.preferences.get("ftabs.showBookmarks");
+            var requestData = {
+                    debug: this._application.preferences.get("ftabs.debug", false),
+                    x: backboneXY[0],
+                    y: backboneXY[1],
+                    showBookmarks: showBookmarks,
+                    background: this._application.backgroundImages.currentSelected,
+                    thumbs: this._application.frontendHelper.fullStructure,
+                    hasClosedTabs: this._recentlyClosedTabs.length > 0,
+                    hasApps: false,
+                    sync: this._application.sync.state
+                };
+            var brandingLogo = this.brandingXMLDoc.querySelector("logo");
+            var brandingSearch = this.brandingXMLDoc.querySelector("search");
+            var brandingSearchURL = brandingSearch.getAttribute("url");
+            var searchURL = this._application.branding.expandBrandTemplates(brandingSearchURL);
+            var imgFile = this._application.branding.brandPackage.findFile("fastdial/" + brandingLogo.getAttribute("img_clear")) || "";
+            if (imgFile)
+                imgFile = FILE_PROTOCOL_HANDLER.getURLSpecFromFile(imgFile);
+            requestData.branding = {
+                logo: {
+                    url: this.expandBrandingURL(brandingLogo.getAttribute("url")),
+                    img: imgFile,
+                    alt: brandingLogo.getAttribute("alt"),
+                    title: brandingLogo.getAttribute("title")
+                },
+                search: {
+                    url: searchURL,
+                    placeholder: brandingSearch.getAttribute("placeholder"),
+                    example: this._application.searchExample.current,
+                    navigateTitle: brandingSearch.getAttribute("navigate_title") || ""
+                }
+            };
+            var onSearchStatusReady = function Fastdial_requestInit_onSearchStatusReady(searchStatus) {
+                    requestData.searchStatus = searchStatus;
+                    if (outerWindowId !== undefined) {
+                        this.sendRequestToTab(outerWindowId, "init", requestData);
+                    } else {
+                        this.sendRequest("init", requestData);
+                    }
+                    if (showBookmarks && !ignoreBookmarks) {
+                        this._application.bookmarks.requestBranch("", function (bookmarks) {
+                            if (outerWindowId !== undefined) {
+                                self.sendRequestToTab(outerWindowId, "bookmarksStateChanged", bookmarks);
+                            } else {
+                                self.sendRequest("bookmarksStateChanged", bookmarks);
+                            }
+                        });
+                    }
+                    if (outerWindowId !== undefined && !this._outerWindowIdList[outerWindowId]) {
+                        this._outerWindowIdList[outerWindowId] = true;
+                        if (this._logTabShowFlag) {
+                            this._application.usageHistory.logAction("show");
+                            this._tabsShownCounter++;
+                        }
+                        this._logTabShowFlag = true;
+                    }
+                }.bind(this);
+            var searchStatusInternal = this._application.preferences.get("ftabs.searchStatus") === 1 ? false : true;
+            var searchStudyOmni = this._application.preferences.get("ftabs.searchStudyOmnibox");
+            if (searchStatusInternal) {
+                onSearchStatusReady(2);
+                return;
+            }
+            if (!searchStudyOmni) {
+                onSearchStatusReady(1);
+                return;
+            }
+            AddonManager.gre_AddonManager.getAddonByID(BAR_EXTENSION_ID, function (addonData) {
+                var isBarInstalled = addonData !== null && addonData.installDate && addonData.isActive;
+                onSearchStatusReady(isBarInstalled ? 3 : 1);
+            });
+        },
+        requestSettings: function Fastdial_requestSettings(callback) {
+            var productInfo = this._application.branding.productInfo;
+            var possibleLayouts = this._application.layout.getPossibleLayouts();
+            var userImageURL = this._application.backgroundImages.userImageURL;
+            var userImage = null;
+            if (userImageURL) {
+                userImage = {};
+                userImage[userImageURL] = userImageURL;
+            }
+            callback({
+                bgImages: this._application.backgroundImages.list,
+                userImage: userImage,
+                showBookmarks: this._application.preferences.get("ftabs.showBookmarks"),
+                sendStat: this._application.preferences.get("stat.usage.send", false),
+                isHomePage: Preferences.get("browser.startup.homepage").split("|").indexOf(this._application.protocolSupport.url) !== -1,
+                showSearchForm: [
+                    0,
+                    2
+                ].indexOf(this._application.preferences.get("ftabs.searchStatus")) !== -1,
+                selectedBgImage: this._application.backgroundImages.currentSelected.id,
+                layouts: possibleLayouts.layouts,
+                currentLayout: possibleLayouts.current,
+                licenseURL: productInfo.LicenseURL.fx,
+                copyright: productInfo.Copyright.fx,
+                rev: this._application.addonManager.addonVersion,
+                build: this._application.core.CONFIG.BUILD.REVISION,
+                buildDate: Math.round(new Date(this._application.core.CONFIG.BUILD.DATE).getTime() / 1000),
+                sync: this._application.sync.state,
+                thumbStyle: this._application.preferences.get("ftabs.thumbStyle", 1)
+            });
+        },
+        getLocalizedString: function Fastdial_getLocalizedString(key) {
+            var node = this.i18nXMLDoc.querySelector("key[name='" + key + "']");
+            if (node === null) {
+                throw new Error("Unknown i18n key: " + key);
+            }
+            return this.expandBrandingURL(node.getAttribute("value"));
+        },
+        applySettings: function Fastdial_applySettings(layout, showBookmarks, showSearchForm, thumbStyle) {
+            var self = this;
+            var oldThumbsNum = this._application.layout.getThumbsNum();
+            var layoutXY = this._application.layout.getThumbsXYOfThumbsNum(layout);
+            var needsFastPickup = this._application.layout.layoutX * this._application.layout.layoutY < layoutXY[0] * layoutXY[1];
+            var oldShowBookmarks = this._application.preferences.get("ftabs.showBookmarks");
+            var ignoreBookmarks;
+            if (!oldShowBookmarks && showBookmarks) {
+                ignoreBookmarks = false;
+            } else {
+                ignoreBookmarks = true;
+            }
+            this._application.preferences.set("ftabs.showBookmarks", showBookmarks);
+            this._application.preferences.set("ftabs.searchStatus", showSearchForm ? 0 : 1);
+            this._application.preferences.set("ftabs.thumbStyle", thumbStyle);
+            this._application.layout.layoutX = layoutXY[0];
+            this._application.layout.layoutY = layoutXY[1];
+            this.requestInit(undefined, ignoreBookmarks);
+            if (needsFastPickup) {
+                let unpinned = {};
+                this._application.internalStructure.iterate({ nonempty: true }, function (thumbData, index) {
+                    if (thumbData.pinned)
+                        return;
+                    unpinned[index] = thumbData;
+                });
+                this._application.thumbs.fastPickup(unpinned);
+            }
+            this._application.thumbs.getMissingScreenshots();
+        },
+        requestRecentlyClosedTabs: function Fastdial_requestRecentlyClosedTabs(callback) {
+            var self = this;
+            var tasks = [];
+            this._recentlyClosedTabs.forEach(function (tabData) {
+                tasks.push(function (callback) {
+                    if (tabData.favicon || tabData.isWindow) {
+                        delete tabData.url;
+                        callback(null, tabData);
+                        return;
+                    }
+                    var uri = netutils.newURI(tabData.url);
+                    self._application.favicons.requestFaviconForURL(uri, function (faviconData, dominantColor) {
+                        tabData.favicon = faviconData || "";
+                        delete tabData.url;
+                        callback(null, tabData);
+                    });
+                });
+            });
+            async.parallel(tasks, function (err, results) {
+                callback(results);
+            });
+        },
+        restoreTab: function Fastdial_restoreTab(id) {
+            if (id.indexOf(NATIVE_RESTORETAB_PREFIX) === 0) {
+                id = parseInt(id.replace(NATIVE_RESTORETAB_PREFIX, ""), 10);
+                let topWindow = misc.getTopBrowserWindow();
+                SESSION_STORE_SVC.undoCloseTab(topWindow, id);
+            } else if (id.indexOf(NATIVE_RESTOREWIN_PREFIX) === 0) {
+                id = parseInt(id.replace(NATIVE_RESTOREWIN_PREFIX, ""), 10);
+                SESSION_STORE_SVC.undoCloseWindow(id);
+            } else {
+                throw new Error("Unknown tab id: " + id);
+            }
+            this.sendRequest("closedTabsListChanged", { empty: this._recentlyClosedTabs.length === 0 });
+        },
+        onTabClose: function Fastdial_onTabClose() {
+            this.sendRequest("closedTabsListChanged", { empty: this._recentlyClosedTabs.length === 0 });
+        },
+        requestLastVisited: function Fastdial_requestLastVisited(offset, callback) {
+            var self = this;
+            async.parallel({
+                blacklist: function (callback) {
+                    self._application.blacklist.getAll(callback);
+                },
+                tabs: function Fastdial_requestLastVisited_tabs(callback) {
+                    var urls = [];
+                    misc.getBrowserWindows().forEach(function (chromeWin) {
+                        var tabBrowser = chromeWin.gBrowser;
+                        var tabs = tabBrowser && tabBrowser.tabContainer && Array.slice(tabBrowser.tabContainer.childNodes);
+                        if (!Array.isArray(tabs))
+                            return;
+                        tabs.forEach(function (tab) {
+                            try {
+                                let browser = tabBrowser.getBrowserForTab(tab);
+                                let currentURI = browser.currentURI.spec;
+                                if (/^(chrome|about|yafd|bar):/.test(currentURI))
+                                    return;
+                                urls.push({
+                                    url: currentURI,
+                                    title: browser.contentTitle
+                                });
+                            } catch (e) {
+                            }
+                        });
+                    });
+                    callback(null, urls);
+                },
+                pickup: function Fastdial_requestLastVisited_pickup(callback) {
+                    var output = {
+                            pages: [],
+                            domains: {},
+                            pinned: []
+                        };
+                    var maxThumbIndex = self._application.layout.getThumbsNum();
+                    self._application.internalStructure.iterate({ nonempty: true }, function (thumbData, i) {
+                        if (i < maxThumbIndex) {
+                            try {
+                                let host = thumbData.location.asciiHost.replace(/^www\./, "");
+                                output.domains[host] = 1;
+                            } catch (ex) {
+                            }
+                        } else {
+                            let pushData = { url: thumbData.source };
+                            if (thumbData.thumb.title)
+                                pushData.title = thumbData.thumb.title;
+                            if (thumbData.pinned) {
+                                output.pinned.push(pushData);
+                            } else {
+                                output.pages.push(pushData);
+                            }
+                        }
+                    });
+                    callback(null, output);
+                },
+                lastVisited: function Fastdial_requestLastVisited_lastVisited(callback) {
+                    var urls = [];
+                    var query = PlacesUtils.history.getNewQuery();
+                    var options = PlacesUtils.history.getNewQueryOptions();
+                    query.minVisits = 2;
+                    options.maxResults = 100;
+                    options.sortingMode = options.SORT_BY_DATE_DESCENDING;
+                    var result = PlacesUtils.history.executeQuery(query, options);
+                    result.root.containerOpen = true;
+                    let (i = 0) {
+                        for (; i < result.root.childCount; i++) {
+                            let node = result.root.getChild(i);
+                            if (!node.title)
+                                continue;
+                            if (!/^(https?|ftp):\/\//.test(node.uri))
+                                continue;
+                            urls.push({
+                                url: node.uri,
+                                title: node.title,
+                                favicon: node.icon
+                            });
+                        }
+                    }
+                    result.root.containerOpen = false;
+                    callback(null, urls);
+                }
+            }, function (err, results) {
+                if (err)
+                    throw new Error(err);
+                const MAX_VISITED_NUM = 24;
+                var excludeDomains = results.pickup.domains;
+                var output = [];
+                var pages = {};
+                Array.concat(results.pickup.pinned, results.tabs, results.pickup.pages, results.lastVisited).forEach(function (page) {
+                    pages[page.url] = pages[page.url] || {};
+                    sysutils.copyProperties(page, pages[page.url]);
+                });
+                for (let [
+                            ,
+                            page
+                        ] in Iterator(pages)) {
+                    let pageHost = self.getDecodedUrlHost(page.url);
+                    if (pageHost && (results.blacklist.domains.indexOf(pageHost) !== -1 || excludeDomains[pageHost]))
+                        continue;
+                    let isDeniedByRegexp = results.blacklist.regexps.some(function (regexpString) {
+                            var regex = new RegExp(regexpString);
+                            return regex.test(page.url);
+                        });
+                    if (isDeniedByRegexp)
+                        continue;
+                    if (pageHost) {
+                        excludeDomains[pageHost] = 1;
+                    }
+                    if (!self._historyThumbs[page.url]) {
+                        self._historyThumbs[page.url] = self._application.internalStructure.convertDbRow(page, false);
+                        self._application.thumbs.getMissingData(self._historyThumbs[page.url], { historyOnly: true });
+                    } else {
+                        sysutils.copyProperties(page, self._historyThumbs[page.url].thumb);
+                    }
+                    output.push(page.url);
+                    if (output.length >= MAX_VISITED_NUM) {
+                        break;
+                    }
+                }
+                if (offset) {
+                    output = output.splice(offset, 9);
+                } else {
+                    output.length = Math.min(output.length, 9);
+                }
+                var outputData = output.map(function (url) {
+                        var cacheData = self._historyThumbs[url];
+                        return self._application.frontendHelper.getDataForThumb(cacheData);
+                    });
+                callback(outputData);
+            });
+        },
+        thumbOpened: function Fastdial_thumbOpened(outerWindowId, url, index, navigateCode) {
+            async.nextTick(function Fastdial_thumbOpened_openSpeculativeConnect() {
+                this.openSpeculativeConnect(url);
+            }, this);
+            if (this._application.barnavig.alwaysSendUsageStat === false)
+                return;
+            this._barnavigDataProvider.addURLData(url, { vtbNum: index + 1 });
+        },
+        openSpeculativeConnect: function Fastdial_openSpeculativeConnect(url) {
+            if (!("nsISpeculativeConnect" in Ci))
+                return;
+            var uri;
+            try {
+                uri = netutils.newURI(url);
+            } catch (e) {
+            }
+            if (!uri)
+                return;
+            Services.io.QueryInterface(Ci.nsISpeculativeConnect).speculativeConnect(uri, null, null);
+        },
+        onShortcutPressed: function Fastdial_onShortcutPressed(thumbIndex) {
+            var thumb = this._application.internalStructure.getItem(thumbIndex);
+            if (thumb && thumb.source) {
+                misc.navigateBrowser({
+                    url: thumb.source,
+                    target: "current tab"
+                });
+            }
+        },
+        navigateUrlWithReferer: function Fastdial_navigateUrlWithReferer(url, navigateCode) {
+            var brandingLogoURL = this.brandingXMLDoc.querySelector("logo").getAttribute("url");
+            brandingLogoURL = this._application.branding.expandBrandTemplates(brandingLogoURL);
+            var target = {
+                    1: "current tab",
+                    2: "new window",
+                    3: "new tab"
+                }[navigateCode];
+            misc.navigateBrowser({
+                url: url,
+                target: target,
+                referrer: brandingLogoURL
+            });
+        },
+        setAsHomePage: function Fastdial_setAsHomePage() {
+            var currentHomePages = Preferences.get("browser.startup.homepage").split("|");
+            if (currentHomePages.length > 1) {
+                currentHomePages.unshift(this._application.protocolSupport.url);
+                Preferences.set("browser.startup.homepage", currentHomePages.join("|"));
+            } else {
+                Preferences.set("browser.startup.homepage", this._application.protocolSupport.url);
+            }
+        },
+        onHiddenTabAction: function Fastdial_onHiddenTabAction(action) {
+            switch (action) {
+            case "hide":
+                this._logTabShowFlag = false;
+                break;
+            case "show":
+                this._application.usageHistory.logAction("show");
+                this._tabsShownCounter++;
+                Services.obs.notifyObservers(this, this._application.core.eventTopics.APP_TAB_SHOWN, this._tabsShownCounter);
+                break;
+            }
+        },
+        getDecodedUrlHost: function Fastdial_getDecodedUrlHost(url) {
+            var decodedURL = this._decodeURL(url);
+            var uri;
+            try {
+                uri = netutils.newURI(decodedURL);
+            } catch (ex) {
+            }
+            return uri ? uri.asciiHost.replace(/^www\./, "") : null;
+        },
+        getDecodedLocation: function Fastdial_getDecodedLocation(url) {
+            var decodedURL = this._decodeURL(url);
+            var uriObj;
+            try {
+                uriObj = netutils.newURI(decodedURL);
+                try {
+                    uriObj.QueryInterface(Ci.nsIURL);
+                } catch (ex) {
+                }
+            } catch (ex) {
+            }
+            return {
+                source: url,
+                location: uriObj || null
+            };
+        },
+        get cachedHistoryThumbs() {
+            return this._historyThumbs;
+        },
+        get brandingXMLDoc() {
+            delete this.brandingXMLDoc;
+            return this.brandingXMLDoc = this._application.branding.brandPackage.getXMLDocument("fastdial/config.xml");
+        },
+        get brandingClckrDoc() {
+            delete this.brandingClckrDoc;
+            return this.brandingClckrDoc = this._application.branding.brandPackage.getXMLDocument("fastdial/clckr.xml");
+        },
+        get i18nXMLDoc() {
+            delete this.i18nXMLDoc;
+            var stream = this._application.addonFS.getStream("$content/fastdial/i18n.xml");
+            return this.i18nXMLDoc = fileutils.xmlDocFromStream(stream);
+        },
+        get _sessionStoreFileData() {
+            var tabsData = [];
+            var sessionstoreData;
+            var sessionFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
+            sessionFile.append("sessionstore.js");
+            if (!sessionFile.exists() || !sessionFile.isFile() || !sessionFile.isReadable())
+                return tabsData;
+            try {
+                sessionstoreData = fileutils.jsonFromFile(sessionFile);
+            } catch (e) {
+                this._logger.warn(e.message);
+                return tabsData;
+            }
+            return tabsData;
+            return tabsData;
+        },
+        get _recentlyClosedTabs() {
+            const SKIP_URLS = [
+                    "about:blank",
+                    "about:newtab",
+                    this._application.protocolSupport.url
+                ];
+            const EXTENSION_NAME = this._application.branding.productInfo.ProductName1.nom;
+            var windows = [];
+            var windowsData;
+            try {
+                windowsData = JSON.parse(SESSION_STORE_SVC.getClosedWindowData());
+            } catch (ex) {
+            }
+            (windowsData || []).forEach(function Fastdial___recentlyClosedTabs_parseWindowsData(windowData, index) {
+                if (windows.length >= RECENTLY_CLOSED_TABS)
+                    return;
+                var domains = [];
+                windowData.tabs.forEach(function (tabData) {
+                    if (!Array.isArray(tabData.entries) || !tabData.entries.length)
+                        return;
+                    var hasValuableTabs = tabData.entries.some(function Fastdial___recentlyClosedTabs_parseWindowsData_hasValuableTabs(tabEntry) {
+                            return SKIP_URLS.indexOf(tabEntry.url) === -1;
+                        });
+                    if (!hasValuableTabs)
+                        return;
+                    var lastTabEntry = tabData.entries.pop();
+                    if (lastTabEntry.url === this._application.protocolSupport.url) {
+                        domains.push(EXTENSION_NAME);
+                    } else {
+                        try {
+                            let uri = netutils.newURI(lastTabEntry.url);
+                            domains.push(uri.host.replace(/^www\./, ""));
+                        } catch (ex) {
+                            domains.push(lastTabEntry.url);
+                        }
+                    }
+                }, this);
+                if (!domains.length)
+                    return;
+                windows.push({
+                    id: NATIVE_RESTOREWIN_PREFIX + index,
+                    title: "",
+                    favicon: "",
+                    isWindow: true,
+                    domains: domains
+                });
+            }, this);
+            var tabs = [];
+            var tabsData;
+            try {
+                let topWindow = misc.getTopBrowserWindow();
+                if (topWindow) {
+                    tabsData = JSON.parse(SESSION_STORE_SVC.getClosedTabData(topWindow));
+                }
+            } catch (ex) {
+            }
+            (tabsData || []).forEach(function Fastdial___recentlyClosedTabs_parseTabsData(tabData, index) {
+                if (tabs.length >= RECENTLY_CLOSED_TABS)
+                    return;
+                if (!tabData.state || !Array.isArray(tabData.state.entries) || !tabData.state.entries.length)
+                    return;
+                var hasValuableEntries = tabData.state.entries.some(function Fastdial___recentlyClosedTabs_parseWindowsData_hasValuableTabs(entry) {
+                        return SKIP_URLS.indexOf(entry.url) === -1;
+                    });
+                if (!hasValuableEntries)
+                    return;
+                var lastTabEntry = tabData.state.entries.pop();
+                tabs.push({
+                    id: NATIVE_RESTORETAB_PREFIX + index,
+                    title: lastTabEntry.title || lastTabEntry.url,
+                    favicon: lastTabEntry.image,
+                    url: lastTabEntry.url,
+                    isWindow: false
+                });
+            }, this);
+            var output = windows.splice(0, 5);
+            let (i = 0, len = tabs.length) {
+                for (; i < len; i++) {
+                    output.splice(i, 0, tabs[i]);
+                    if (output.length >= RECENTLY_CLOSED_TABS) {
+                        break;
+                    }
+                }
+            }
+            if (output.length < RECENTLY_CLOSED_TABS && windows.length) {
+                output = output.concat(windows);
+                output.length = Math.min(RECENTLY_CLOSED_TABS, output.length);
+            }
+            return output;
+        },
+        _barnavigDataProvider: {
+            init: function Fastdial_BNDP_init() {
+                this._dataContainer = new sysutils.DataContainer({ expirationTime: 1 * 60 * 60 * 1000 });
+                return this;
+            },
+            finalize: function Fastdial_BNDP_finalize() {
+                this._dataContainer.finalize();
+                this._dataContainer = null;
+                return this;
+            },
+            addURLData: function Fastdial_BNDP_addURLData(aURL, aThumbData) {
+                if (typeof aURL == "string" && typeof aThumbData == "object")
+                    this._dataContainer.set(aURL, aThumbData);
+            },
+            onWindowLocationChange: function Fastdial_BNDP_onWindowLocationChange() {
+            },
+            onPageLoad: function Fastdial_BNDP_onPageLoad(aParams) {
+                var url = aParams.barNavigParams.oldurl || aParams.url;
+                var thumbData = url && this._dataContainer.get(url);
+                if (thumbData) {
+                    this._dataContainer.remove(url);
+                    aParams.barNavigParams.vtbNum = thumbData.vtbNum;
+                    return this;
+                }
+                return false;
+            },
+            onBarNavigResponse: function Fastdial_BNDP_onBarNavigResponse() {
+            },
+            _dataContainer: null
+        },
+        requestTitleForURL: function Fastdial_requestTitleForURL(url, callback) {
+            var self = this;
+            var seriesTasks = {};
+            var locationObj = this.getDecodedLocation(url);
+            var titleFound;
+            if (!locationObj.location)
+                return callback("URL is not valid: " + url);
+            seriesTasks.history = function Fastdial_requestTitleForURL_historySeriesTask(callback) {
+                try {
+                    PlacesUtils.asyncHistory.getPlacesInfo(locationObj.location, {
+                        handleResult: function handleResult(aPlaceInfo) {
+                            titleFound = aPlaceInfo.title;
+                            if (titleFound)
+                                return callback("stop");
+                            callback();
+                        },
+                        handleError: function handleError(aResultCode, aPlaceInfo) {
+                            if (aResultCode !== Cr.NS_ERROR_NOT_AVAILABLE)
+                                self._logger.error("Error in asyncHistory.getPlacesInfo (" + JSON.stringify(locationObj.location) + "): " + aResultCode);
+                            callback();
+                        }
+                    });
+                } catch (ex) {
+                    titleFound = PlacesUtils.history.getPageTitle(locationObj.location);
+                    if (titleFound)
+                        return callback("stop");
+                    callback();
+                }
+            };
+            seriesTasks.request = function Fastdial_requestTitleForURL_requestSeriesTask(callback) {
+                var isStandardURL = true;
+                try {
+                    locationObj.location.QueryInterface(Ci.nsIURL);
+                } catch (ex) {
+                    isStandardURL = false;
+                }
+                if (!isStandardURL || !locationObj.location.host)
+                    return callback("Not a valid nsIURL: " + url);
+                if (self._application.isYandexHost(locationObj.location.host)) {
+                    try {
+                        locationObj.location.QueryInterface(Ci.nsIURL);
+                        let parsedQuery = netutils.querystring.parse(locationObj.location.query);
+                        parsedQuery.nugt = "vbff-" + self._application.addonManager.addonVersion;
+                        locationObj.location.query = netutils.querystring.stringify(parsedQuery);
+                    } catch (ex) {
+                        self._logger.error("URI is not URL: " + url);
+                    }
+                }
+                var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+                xhr.overrideMimeType("text/plain; charset=x-user-defined");
+                xhr.mozBackgroundRequest = true;
+                xhr.QueryInterface(Ci.nsIDOMEventTarget);
+                xhr.open("GET", locationObj.location.spec, true);
+                var timer = new sysutils.Timer(function () {
+                        xhr.abort();
+                    }, 25000);
+                xhr.setRequestHeader("Cache-Control", "no-cache");
+                xhr.addEventListener("load", function () {
+                    timer.cancel();
+                    var responseText = (xhr.responseText || "").replace(/<\/head>[\s\S]*/i, "</head><body/></html>").replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
+                    var title = "";
+                    var domParser = xmlutils.getDOMParser();
+                    var xmlDocument, charset;
+                    try {
+                        xmlDocument = domParser.parseFromString(responseText, "text/html");
+                    } catch (e) {
+                    }
+                    var contentTypeHeader = xhr.getResponseHeader("Content-Type");
+                    var charsetHeader = contentTypeHeader && contentTypeHeader.match(/charset=(.+)$/);
+                    var charsetTagHTML5 = xmlDocument && xmlDocument.querySelector("meta[charset]");
+                    var charsetHttpEquivTag = xmlDocument && xmlDocument.querySelector("meta[http-equiv='Content-Type'][content]");
+                    if (charsetHeader) {
+                        charset = charsetHeader[1];
+                    } else if (xmlDocument) {
+                        if (charsetHttpEquivTag) {
+                            charset = charsetHttpEquivTag.getAttribute("content").match(/charset=(.+)$/);
+                            charset = charset && charset[1];
+                        } else if (charsetTagHTML5) {
+                            charset = charsetTagHTML5.getAttribute("charset");
+                        }
+                    }
+                    charset = (charset || "UTF-8").replace(/[^a-z\d-]/gi, "");
+                    var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
+                    try {
+                        converter.charset = charset;
+                        responseText = converter.ConvertToUnicode(responseText);
+                        xmlDocument = domParser.parseFromString(responseText, "text/html");
+                    } catch (e) {
+                    }
+                    var titleNode = xmlDocument && xmlDocument.querySelector("head > title");
+                    if (titleNode) {
+                        title = titleNode.textContent;
+                    } else {
+                        let titleMatches = responseText.match(/<title>(.*?)<\/title>/im);
+                        title = titleMatches ? titleMatches[1] : "";
+                    }
+                    title = title.substr(0, 1000) || url;
+                    callback(null, title);
+                }, false);
+                var errorHandler = function (e) {
+                    callback(e.type);
+                };
+                xhr.addEventListener("error", errorHandler, false);
+                xhr.addEventListener("abort", errorHandler, false);
+                xhr.send();
+            };
+            async.series(seriesTasks, function Fastdial_requestTitleForURL_onSeriesTasksRun(err, results) {
+                if (titleFound)
+                    return callback(null, titleFound);
+                if (results && results.request)
+                    return callback(null, results.request);
+                callback(err);
+            });
+        },
+        expandBrandingURL: function Fastdial_expandBrandingURL(url) {
+            return this._application.branding.expandBrandTemplates(url, { vbID: this._application.core.CONFIG.APP.TYPE });
+        },
+        sendClickerRequest: function Fastdial_sendClickerRequest(param) {
+            var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
+            request.mozBackgroundRequest = true;
+            request.open("GET", CLCK_URL.replace("%p", param), true);
+            request.setRequestHeader("Cache-Control", "no-cache");
+            request.send();
+        },
+        _decodeURL: function Fastdial__decodeURL(url) {
+            var outputURL;
+            try {
+                let uri = netutils.newURI(url);
+                if (uri.host === "clck.yandex.ru") {
+                    let clickrMatches = uri.path.match(/.+?\*(.+)/);
+                    if (clickrMatches) {
+                        let regexFromOld = new RegExp("\\?from=vb-fx$");
+                        let regexFromNew = new RegExp("\\?from=" + this._application.core.CONFIG.APP.TYPE + "$");
+                        clickrMatches[1] = clickrMatches[1].replace(/[?&]clid=[^&]+/, "").replace(regexFromOld, "").replace(regexFromNew, "");
+                        outputURL = clickrMatches[1];
+                    } else {
+                        let clckrItem = this.brandingClckrDoc.querySelector("item[url='" + url + "']");
+                        outputURL = clckrItem ? "http://" + clckrItem.getAttribute("domain") : url;
+                    }
+                } else {
+                    outputURL = url;
+                }
+            } catch (ex) {
+                outputURL = url;
+            }
+            return outputURL;
+        },
+        _application: null,
+        _logger: null,
+        _applyingThumbsSettings: false,
+        _applyThumbsSettingsQueue: [],
+        _registeredListeners: {},
+        _historyThumbs: {},
+        _pickupGUID: null,
+        _clearHistoryThumbsTimer: null,
+        _outerWindowIdList: {},
+        _logTabShowFlag: true,
+        _tabsShownCounter: 0
+    };
new file mode 100644
--- /dev/null
+++ b/partners/yandex-tr-gezginler/distribution/extensions/vb@yandex.ru/cbapp/parts/favicons.js
@@ -0,0 +1,67 @@
+"use strict";
+const EXPORTED_SYMBOLS = ["favicons"];
+const {
+        classes: Cc,
+        interfaces: Ci,
+        utils: Cu
+    } = Components;
+const GLOBAL = this;
+const FAVICON_URL = "http://favicon.yandex.net/favicon/";
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+XPCOMUtils.defineLazyServiceGetter(GLOBAL, "FAVICON_SRV", "@mozilla.org/browser/favicon-service;1", "nsIFaviconService");
+XPCOMUtils.defineLazyServiceGetter(GLOBAL, "@mozilla.org/browser/livemark-service;2", "mozIAsyncLivemarks" in Ci ? "mozIAsyncLivemarks" : "nsILivemarkService");
+const favicons = {
+        init: function Favicons_init(application) {
+            application.core.Lib.sysutils.copyProperties(application.core.Lib, GLOBAL);
+            XPCOMUtils.defineLazyModuleGetter(GLOBAL, "DataURI", "resource://" + application.name + "-mod/DataURI.jsm");
+            this._application = application;
+            this._logger = application.getLogger("Favicons");
+        },
+        finalize: function Favicons_finalize(doCleanup, callback) {
+            this._application = null;
+            this._logger = null;
+        },