Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1492613-08-2020 15:03:00

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Я имел ввиду выделять userChoice, а не наоборот, у себя изменил.
   
По поводу пунктов true-false:
Текст значения после заголовка добавьте пожалуйста, что бы к единому стилю привести. Например после:

скрытый текст

Выделить код

Код:

pref: ["javascript.enabled", "Выполнять скрипты Java", "", "javascript.enabled"],
			userChoice: true, refresh: true,
			values: [[true, "Да"], [false, "Нет"]]

"Выполнять скрипты Java" должно быть длинное тире и "Да"/"Нет" (по подобию с другими пунктами).
   
По поводу всех подменю и выделения в них дефолтных / не дефолтных значений:
Вот здесь же bold для user задается, или я чего то не понял.
скрытый текст

Выделить код

Код:

user
				? node.style.setProperty("font-weight", "bold", "important")
				: node.style.removeProperty("font-weight");

Т.е. получить значение по умолчанию, и выделить его (или отличное от него), можно.
Или как вы это вообще задумывали? То что пишет Dobrov для меня не соответствует действительности, у меня все что отлично от дефолта выделяется.
Заменил себе на курсив:
2020.1597319645.png
   
------------------
У меня ESR 78

Отредактировано _zt (13-08-2020 18:33:41)

Отсутствует

 

№1492713-08-2020 15:46:16

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 80.0

Re: Custom Buttons

_zt пишет

Вот здесь же bold для user задается, или я чего то не понял.

это для текущего значения - prefHasUserValue, а чтобы проверить другие значения (в подменю) нужно определить его дефолтное значение,
не переключать же настройку и проверять каждое...

Отсутствует

 

№1492813-08-2020 16:10:02

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Vitaliy V.
Теперь понятно. Тогда может на базе вашего кода решение найдется.
   
Dumby
maroon я у помянул так как он у меня не работает. Сами видите какое у меня меню, так что не удивительно, что цвета в нем не работают.
Вы все правильно сделали, только, на мой взгляд, логичнее UserChoice выделять, а не отличные от него.
Хотя, ради баловства, можно для каждого значения свою иконку назначить - UserChoice / notUserChoice.

Отредактировано _zt (13-08-2020 16:12:57)

Отсутствует

 

№1492913-08-2020 18:02:20

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Все таки добавил иконку на notUserChoice. Казалось, что будет сложнее.
2020.1597330070.png
Теперь вопрос появился, а нельзя ли на иконку (или весь пункт) клик ЛКМ повесить? (ПКМ там и так работает, сбрасывает значение на "по умолчанию" (я так понимаю)).
   
Дело в том, что подменю может появится и справа и слева, и все это приводит к бестолковым перемещениям мыши. А так можно будет только информацию снимать глазами с подменю, а переключать щелчком мыши.
   
Последовательное переключение неприемлемо (из-за refresh: true, restart: true), но можно добавить какой нибудь UserAlt и переключать по клику ЛКМ (UserChoice > UserAlt, UserAlt > UserChoice), если UserAlt назначен пункту.
   
В этом случае, UserAlt тоже можно будет свою иконку приделать.

Отредактировано _zt (13-08-2020 18:29:59)

Отсутствует

 

№1493014-08-2020 05:34:27

Kero
Участник
 
Группа: Members
Зарегистрирован: 09-11-2012
Сообщений: 221
UA: Firefox 52.0

Re: Custom Buttons

а есть ли где коллекция уже готовых кнопок в файле buttonsoverlay.xul ?
И как то можно отключить backup или задать только 1 backup ?

Отредактировано Kero (14-08-2020 05:36:45)

Отсутствует

 

№1493114-08-2020 13:34:51

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Добрый день. Посмотрите пожалуйста  код для FF71 " Удалить куки текущего сайта в контекстном меню на странице" для контекстного меню.


скрытый текст

Выделить код

Код:

// Удалить куки текущего сайта в контекстном меню на странице, от 06.03.2017. ................
  
 (()=> {
(contextMenu=> {
   var menu = contextMenu.appendChild(document.createElement("menu"));
   menu.id = "content-removeCookies."
   menu.setAttribute("label", "Удалить куки текущего сайта");
   menu.setAttribute("class", "menu-iconic");
   addEventListener("popupshowing", ()=> menu.setAttribute("image", gBrowser.mCurrentTab.image), false, contextMenu);
   addDestructor(()=> menu.remove() );
   
   var menuPopup = menu.appendChild(document.createElement("menupopup"));
   var menuitem = menuPopup.appendChild(document.createElement("menuitem"));               
   menuitem.setAttribute("label", "Удалить");
   menuitem.onclick =()=> {
      var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

      for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
            var cookie = en.getNext().QueryInterface(Ci.nsICookie);
            ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
            }
   
      var reversedDomain = host.split("").reverse().join("") + ".";
      Cu.import("resource://gre/modules/FileUtils.jsm");
      var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
      var dbConn = Services.storage.openDatabase(file);
      dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
      dbConn.close();
      
      var host = content.document.domain;
      for( var tab of gBrowser.tabs ) {  
           var tabHost = tab.linkedBrowser.contentDocument.location.host;
           if ( host == tabHost ) gBrowser.reloadTab(tab);
           }
          
      // очистить кэш ....
      try { 
          Services.cache.evictEntries(1);
          Services.cache.evictEntries(2);
          } 
      catch(e) { Services.cache2.clear() };
   
      // удалить все Flash куки
      var dir = Services.dirsvc.get('Home', Ci.nsIFile);
      dir.append("Application Data");
      dir.append("Macromedia");
      //dir.remove(true);
      //dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
      dir.exists() && dir.remove(true);                      // Удалить Flash кукисы222 ....
      !dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
   
      // Всплывающее сообщение ....
      var win = openDialog("chrome://global/content/alerts/alert.xul", "", "popup=yes", (gBrowser.mCurrentTab.image || "chrome://global/skin/icons/Portrait.png"),
           "", "Очистил куки, кеш текущего сайта и удалил Flash куки", false, null, 4);
      setTimeout(()=> win && win.close(), 2500);          
  };
})(document.getElementById("contentAreaContextMenu"));
})();

Отредактировано Duche (14-08-2020 13:41:07)

Отсутствует

 

№1493214-08-2020 16:20:19

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 52.0

Re: Custom Buttons

firepox пишет

пробовал в начало кода добавлять это:
gBrowser.selectedTab = gBrowser.addTab('http://site.ru');
Не работает)

Направление мысли верное, но следует дождаться пока загрузится.
Попробуй разместить в Инициализации, и если «нужный сайт»
прям после загрузки ещё не готов быть снапшотнутым, тогда
подними таймаут с нуля до какого-нибудь эмпирического значения.

скрытый текст

Выделить код

Код:

(exec => addEventListener("click", e => {
	if (e.button) return;
	e.preventDefault();

	var url = "http://site.ru";

	var br = (gBrowser.selectedTab = gBrowser.addTab(url)).linkedBrowser;
	br.addEventListener("pageshow", () => setTimeout(exec, 0, br, url), {once: true});

}, true, this))((br, url) => gBrowser.selectedBrowser == br
	&& br.currentURI.spec == url && custombutton.buttonCbExecuteCode(null, this, this.cbCommand)
);

Dobrov пишет

Хотелось бы совместить оба варианта - для _zt и для меня с методом londPress, они почему-то сильно различаются…

Ну, ты выразил пожелание чтобы менюшки закрывались,
а _zt к этому пожеланию не присоединился, и направился
куда-то в сторону единостилия. Поэтому и различаются.


Но londPress достаточно автономен, там только здесь вписан "mousedown":
for(var type of ["command", "contextmenu", "mousedown"])
и, в конце, метод mousedown, обрабатывающий это событие,
и метод londPress, куда передаётся результат обработки.


Vitaliy V. пишет

может как то так

Да! Это работает! Спасибо!
И ведь что-то подобное в коде есть, но мысль проверить
что возвращает defaultBranch мою тупую голову не посетила.


_zt пишет

у себя изменил

Смотрю много измененений.
Скинь тогда свой код целиком, чтобы было с чем возиться.
С проставленными userAlt и userAltImg.


Резюмирую, скорее для себя, что попробовать сделать:
1. italic в субменюшках для недефолтных значений,
    учитывая наставление Виталия.
2. длинное тире + лейбл и для true-false <menu>
    при наличии "values".
3. Последовательное переключение по клику на <menu>
    если отсутствуют restart и refresh,


    иначе, переключение между userChoice и userAlt,
    если присутствуют оба. Плюс иконка userAlt.
    (Если текущее значение не userChoice и не userAlt
    переключать на userChoice или на userAlt ?)
Всё это займёт какое-то время, полагаю.


Kero пишет

как то можно отключить backup

Наверно да, %Profile%\extensions\custombuttons@xsms.org\components\CustomButtonsService.js
function backupProfile (phase) {if(true)return;


Duche пишет

Удалить куки текущего сайта в контекстном меню на странице

Может подойдёт в контекстном меню не на странице, а на кнопке?

Отсутствует

 

№1493314-08-2020 21:03:43

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

Dumby пишет

firepox пишетпробовал в начало кода добавлять это:gBrowser.selectedTab = gBrowser.addTab('http://site.ru');Не работает)Направление мысли верное, но следует дождаться пока загрузится.Попробуй разместить в Инициализации, и если «нужный сайт»прям после загрузки ещё не готов быть снапшотнутым, тогдаподними таймаут с нуля до какого-нибудь эмпирического значения.

код вставил в инициализацию -  ничего не сохраняется вообще

Отредактировано firepox (15-08-2020 11:40:37)

Отсутствует

 

№1493414-08-2020 21:24:56

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dumby

Резюмирую, скорее для себя, что попробовать сделать:

1. italic в субменюшках для недефолтных значений,
    учитывая наставление Виталия.
2. длинное тире + лейбл и для true-false <menu>
    при наличии "values".
3. Здесь, переключение только между userChoice и userAlt, если userAlt существует.
    Если сделать иначе (например, последовательно), будет путаница и проблемы с restart и refresh.
    ... Думаю не стоит усложнять. Более двух никогда не нужно, и ведь еще есть уже работающий ПКМ.
        Да и вообще, при последовательном переключении смысл UserAlt теряется,
        он был выдуман, что бы избежать проблем последовательного переключения.
   

Если текущее значение не userChoice и не userAlt
    переключать на userChoice или на userAlt ?

На userChoice. Так как он основной.
UserAlt в немногих пунктах потребуется, а userChoice можно прописать везде.
   

Смотрю много измененений.

Вы мне льстите. Не много.
Иконку UserAlt прописал и она работает, но вы проверьте за мной, я просто интуитивно сделал. В трех пунктах добавил новый атрибут.

скрытый текст

Выделить код

Код:

data:text/plain;charset=utf-8;base64,Ly8g0JHRi9GB0YLRgNC+0LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQvtCyIGFib3V0OmNvbmZpZw0KKGFzeW5jIChuYW1lLCBpZCwgZnVuYykgPSZndDsgew0KCWlmIChuYW1lID09ICZxdW90O09iamVjdCZxdW90OykgcmV0dXJuIEN1c3RvbWl6YWJsZVVJLmNyZWF0ZVdpZGdldChmdW5jKCkpOw0KCXZhciB3aW4gPSBuYW1lID09ICZxdW90O1dpbmRvdyZxdW90OywgZyA9IENvbXBvbmVudHMudXRpbHMuaW1wb3J0KCZxdW90O3Jlc291cmNlOi8vZ3JlL21vZHVsZXMvU2VydmljZXMuanNtJnF1b3Q7LCB7fSk7DQoJaWYgKGdbaWRdKSB7aWYgKHdpbikgcmV0dXJuO30gZWxzZSBnW2lkXSA9IGZ1bmMoKTsNCglpZiAod2luKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGdbaWRdKTsNCglhZGREZXN0cnVjdG9yKHIgPSZndDsgcls1XSA9PSAmcXVvdDtlJnF1b3Q7ICZhbXA7JmFtcDsgZGVsZXRlIGdbaWRdKTsNCglnW2lkXS5vbkNyZWF0ZWQodGhpcyk7DQp9KSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICZxdW90O1F1aWNrVG9nZ2xlQWJvdXRDb25maWdTZXR0aW5ncyZxdW90OywgKCkgPSZndDsgew0KDQoJdmFyIHtwcmVmc30gPSBTZXJ2aWNlcywgZGIgPSBwcmVmcy5nZXREZWZhdWx0QnJhbmNoKCZxdW90OyZxdW90Oyk7DQoJdmFyIHB2ID0gcGFyc2VJbnQoU2VydmljZXMuYXBwaW5mby5wbGF0Zm9ybVZlcnNpb24pOw0KCXZhciB4dWxfbnMgPSAmcXVvdDtodHRwOi8vd3d3Lm1vemlsbGEub3JnL2tleW1hc3Rlci9nYXRla2VlcGVyL3RoZXJlLmlzLm9ubHkueHVsJnF1b3Q7Ow0KDQoJdmFyIGxvY2FsaG9zdCA9ICZxdW90OzEyNy4wLjAuMSZxdW90OzsNCgl2YXIgYW50aWNlbnNvcml0eSA9ICZxdW90O2h0dHBzOi8vZ2l0LmlvL2FjLWFudGljZW5zb3JpdHktcGFjJnF1b3Q7Ow0KCXZhciBhbnRpemFwcmV0ID0gJnF1b3Q7aHR0cHM6Ly9hbnRpemFwcmV0LnByb3N0b3Zwbi5vcmcvcHJveHkucGFjJnF1b3Q7Ow0KCXZhciBwYWNmaWxlID0gcHJlZnMuZ2V0U3RyaW5nUHJlZigmcXVvdDt1c2VyLnBhY2ZpbGUmcXVvdDssICZxdW90O2ZpbGU6Ly8vZXRjL3Byb3h5LnBhYyZxdW90Oyk7DQoJdmFyIHVzZXJhZ2VudCA9ICZxdW90O01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV09XNjQ7IHJ2OjU2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNTYuMCZxdW90OzsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCgkvLyByZWZyZXNoOg0KCS8vCWZhbHNlIC0gcmVsb2FkIGN1cnJlbnQgdGFiDQoJLy8JdHJ1ZSAtIHJlbG9hZCBjdXJyZW50IHRhYiBza2lwIGNhY2hlDQoJLy8NCgkvLyByZXN0YXJ0Og0KCS8vCWZhbHNlIC0gcmVzdGFydCBicm93c2VyDQoJLy8JdHJ1ZSAtIHJlc3RhcnQgYnJvd3NlciB3aXRoIGNvbmZpcm0NCg0KCXZhciBwcmltYXJ5ID0gW3sNCg0KCQkJcHJlZjogWyZxdW90O25ldHdvcmsucHJveHkudHlwZSZxdW90OywgJnF1b3Q70J3QsNGB0YLRgNC+0LnQutC4INC/0YDQvtC60YHQuCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLnByb3h5LnR5cGUmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogNSwgdXNlckFsdDogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVswLCAmcXVvdDvQndC1INC/0YDQvtC60YHQuNGA0L7QstCw0YLRjCZxdW90OywgJnF1b3Q7MCZxdW90O10sIFs1LCAmcXVvdDvQodC40YHRgtC10LzQvdGL0LUgKNC40LcgSUUpJnF1b3Q7LCAmcXVvdDs1JnF1b3Q7XSwgWzIsICZxdW90O9CQ0LLRgtC+IChwYWNmaWxlKSZxdW90OywgJnF1b3Q7MiZxdW90O10sDQoJCQkJWzEsICZxdW90O9Cf0YDQvtC/0LjRgdCw0L3QvdGL0LUmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbNCwgJnF1b3Q70JDQstGC0L7QvtC/0YDQtdC00LXQu9C10L3QuNC1JnF1b3Q7LCAmcXVvdDs0JnF1b3Q7XQ0KCV19LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbJnF1b3Q7cGVybWlzc2lvbnMuZGVmYXVsdC5pbWFnZSZxdW90OywgJnF1b3Q70JfQsNCz0YDRg9C20LDRgtGMINCz0YDQsNGE0LjQutGDJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O3Blcm1pc3Npb25zLmRlZmF1bHQuaW1hZ2UmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAmcXVvdDvQlNCwJnF1b3Q7XSwgWzMsICZxdW90O9ChINGB0LDQudGC0LAmcXVvdDtdLCBbMiwgJnF1b3Q70J3QtdGCJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDticm93c2VyLmRpc3BsYXkudXNlX2RvY3VtZW50X2ZvbnRzJnF1b3Q7LCAmcXVvdDvQl9Cw0LPRgNGD0LbQsNGC0Ywgd2ViLdGI0YDQuNGE0YLRiyZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmRpc3BsYXkudXNlX2RvY3VtZW50X2ZvbnRzJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDEsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbMSwgJnF1b3Q70JTQsCZxdW90O10sIFswLCAmcXVvdDvQndC10YImcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2phdmFzY3JpcHQuZW5hYmxlZCZxdW90OywgJnF1b3Q70JLRi9C/0L7Qu9C90Y/RgtGMINGB0LrRgNC40L/RgtGLIEphdmEmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7amF2YXNjcmlwdC5lbmFibGVkJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IHRydWUsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbdHJ1ZSwgJnF1b3Q70JTQsCZxdW90O10sIFtmYWxzZSwgJnF1b3Q70J3QtdGCJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5hdXRvcGxheS5kZWZhdWx0JnF1b3Q7LCAmcXVvdDvQkNCy0YLQvtC30LDQv9GD0YHQuiDQvNC10LTQuNCwJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O21lZGlhLmF1dG9wbGF5LmRlZmF1bHQmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogNSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVs1LCAmcXVvdDvQkdC70L7QutC40YDQvtCy0LDRgtGMINCy0YHQtSZxdW90OywgJnF1b3Q7NSZxdW90O10sDQoJCQkJWzEsICZxdW90O9CR0LvQvtC60LjRgNC+0LLQsNGC0Ywg0L3QtSDQv9GA0LjQs9C70YPRiNC10L3QvdC+0LUmcXVvdDssICZxdW90OzEmcXVvdDtdLA0KCQkJCVswLCAmcXVvdDvQoNCw0LfRgNC10YjQuNGC0Ywg0LLRgdC1JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XQ0KCV19LHsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5hdXRvcGxheS5ibG9ja2luZ19wb2xpY3kmcXVvdDssICZxdW90O9CQ0LLRgtC+0LfQsNC/0YPRgdC6ICjQv9C+0LvQuNGC0LjQutCwKSZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDttZWRpYS5hdXRvcGxheS5ibG9ja2luZ19wb2xpY3kmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMiwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVsxLCAmcXVvdDvQktGA0LXQvNC10L3QvdCw0Y8mcXVvdDssICZxdW90OzEmcXVvdDtdLA0KCQkJCVsyLCAmcXVvdDvQn9C+INC00LXQudGB0YLQstC40Y4mcXVvdDssICZxdW90OzImcXVvdDtdLA0KCQkJCVswLCAmcXVvdDvQn9C+0YHRgtC+0Y/QvdC90LDRjyZxdW90OywgJnF1b3Q7MCZxdW90O10NCgldfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5jb29raWUuY29va2llQmVoYXZpb3ImcXVvdDssICZxdW90O0Nvb2tpZXMmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5jb29raWUuY29va2llQmVoYXZpb3ImcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMywgcmVmcmVzaDogZmFsc2UsDQoJCQl2YWx1ZXM6IFsNCgkJCQlbMSwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0YHRgtC+0YDQvtC90L3QuNC1JnF1b3Q7XSwgWzMsICZxdW90O9Cd0LUg0L/RgNC40L3QuNC80LDRgtGMINGBINC90LUg0L/QvtGB0LXRidC10L3QvdGL0YUmcXVvdDtdLCBbNCwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0L7RgiDRgtGA0LXQutC10YDQvtCyJnF1b3Q7XSwNCgkJCQlbMiwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0YHQviDQstGB0LXRhSZxdW90O10sIFswLCAmcXVvdDvQn9GA0LjQvdC40LzQsNGC0Ywg0YHQviDQstGB0LXRhSZxdW90O10NCgldfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyZxdW90O2RvbS5zdG9yYWdlLmVuYWJsZWQmcXVvdDssICZxdW90O9Cb0L7QutCw0LvRjNC90L7QtSDRhdGA0LDQvdC40LvQuNGJ0LUmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7ZG9tLnN0b3JhZ2UuZW5hYmxlZCZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiB0cnVlDQoJfQ0KXTsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCgl2YXIgc2Vjb25kYXJ5ID0gW3sNCg0KCQkJcHJlZjogWyZxdW90O2RvbS5zZXJ2aWNlV29ya2Vycy5lbmFibGVkJnF1b3Q7LCAmcXVvdDvQktC40LTQtdC+IGRvbS5zZXJ2aWNlV29ya2VycyZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtkb20uc2VydmljZVdvcmtlcnMuZW5hYmxlZCZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2RvbS5lbmFibGVfcGVyZm9ybWFuY2UmcXVvdDssICZxdW90O9Ch0YLQsNGC0YPRgSDQt9Cw0LPRgNGD0LfQutC4INGB0YLRgNCw0L3QuNGG0YsmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7ZG9tLmVuYWJsZV9wZXJmb3JtYW5jZSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDticm93c2VyLmNhY2hlLm1lbW9yeS5lbmFibGUmcXVvdDssICZxdW90O9Ca0Y3RiCDQsiDQvtC/0LXRgNCw0YLQuNCy0L3QvtC5INC/0LDQvNGP0YLQuCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmNhY2hlLm1lbW9yeS5lbmFibGUmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogdHJ1ZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDtpbnRsLmFjY2VwdF9sYW5ndWFnZXMmcXVvdDssICZxdW90O9Cv0LfRi9C6INC00LvRjyDQstC10LEt0YHRgtGA0LDQvdC40YYmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7aW50bC5hY2NlcHRfbGFuZ3VhZ2VzJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6ICZxdW90O2VuLVVTLCBlbiZxdW90OywNCgkJCXZhbHVlczogW1smcXVvdDtlbi1VUywgZW4mcXVvdDssICZxdW90O2VuLVVTLCBlbiZxdW90O10sIFsmcXVvdDtlbi1VUywgZW4sIHJ1LVJVLCBydSZxdW90OywgJnF1b3Q7ZW4tVVMsIGVuLCBydS1SVSwgcnUmcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2Jyb3dzZXIuZGlzcGxheS5kb2N1bWVudF9jb2xvcl91c2UmcXVvdDssICZxdW90O9CY0YHQv9C+0LvRjNC30L7QstCw0YLRjCDRhtCy0LXRgtCwINGB0LDQudGC0L7QsiZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmRpc3BsYXkuZG9jdW1lbnRfY29sb3JfdXNlJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgJnF1b3Q70JDQstGC0L4mcXVvdDssICZxdW90OzAmcXVvdDtdLCBbMSwgJnF1b3Q70JLRgdC10LPQtNCwJnF1b3Q7LCAmcXVvdDsxJnF1b3Q7XSwgWzIsICZxdW90O9Cd0LjQutC+0LPQtNCwJnF1b3Q7LCAmcXVvdDsyJnF1b3Q7XV0NCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnNlbmRSZWZlcmVySGVhZGVyJnF1b3Q7LCAmcXVvdDtSZWZlcmVyIC0g0LTQu9GPINGH0LXQs9C+JnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O25ldHdvcmsuaHR0cC5zZW5kUmVmZXJlckhlYWRlciZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAxLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9Cd0Lgg0LTQu9GPINGH0LXQs9C+JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XSwgWzEsICZxdW90O9Ci0L7Qu9GM0LrQviDRgdGB0YvQu9C60LgmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q70KHRgdGL0LvQutC4INC4INC40LfQvtCx0YAuJnF1b3Q7LCAmcXVvdDsyJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci50cmltbWluZ1BvbGljeSZxdW90OywgJnF1b3Q7UmVmZXJlciAtINGH0YLQviZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci50cmltbWluZ1BvbGljeSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9Cf0L7Qu9C90YvQuSBVUkwmcXVvdDssICZxdW90OzAmcXVvdDtdLCBbMSwgJnF1b3Q7c2NoZW1lK2hvc3QrcG9ydCtwYXRoJnF1b3Q7LCAmcXVvdDsxJnF1b3Q7XSwgWzIsICZxdW90O3NjaGVtZStob3N0K3BvcnQmcXVvdDssICZxdW90OzImcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O25ldHdvcmsuaHR0cC5yZWZlcmVyLlhPcmlnaW5Qb2xpY3kmcXVvdDssICZxdW90O1JlZmVyZXJYTyAtINC60L7Qs9C00LAmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblBvbGljeSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9CSINC70Y7QsdC+0Lwg0YHQu9GD0YfQsNC1JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XSwgWzEsICZxdW90O9Cf0YDQuCDRgdC+0LLQvy4g0LHQsNC3LiDQtNC+0LzQtdC90LAmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q70J/RgNC4INGB0L7QstC/0LDQtNC10L3QuNC4INCw0LTRgNC10YHQsCZxdW90OywgJnF1b3Q7MiZxdW90O11dDQoJfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblRyaW1taW5nUG9saWN5JnF1b3Q7LCAmcXVvdDtSZWZlcmVyWE8gLSDRh9GC0L4mcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblRyaW1taW5nUG9saWN5JnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgJnF1b3Q70J/QvtC70L3Ri9C5IFVSTCZxdW90OywgJnF1b3Q7MCZxdW90O10sIFsxLCAmcXVvdDtzY2hlbWUraG9zdCtwb3J0K3BhdGgmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q7c2NoZW1lK2hvc3QrcG9ydCZxdW90OywgJnF1b3Q7MiZxdW90O11dDQoJfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuc3Bvb2ZTb3VyY2UmcXVvdDssICZxdW90O1JlZmVyZXIgLSDQutC+0YDQtdC90Ywg0YHQsNC50YLQsCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci5zcG9vZlNvdXJjZSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5wZWVyY29ubmVjdGlvbi5lbmFibGVkJnF1b3Q7LCAmcXVvdDtXZWJSVEMg0YPRgtC10YfQutCwIElQJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O21lZGlhLnBlZXJjb25uZWN0aW9uLmVuYWJsZWQmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogZmFsc2UNCgl9DQoJXTsNCg0KCXJldHVybiB7DQoJCWxhYmVsOiAmcXVvdDtRdWljayB0b2dnbGUmcXVvdDssDQoJCWlkOiAmcXVvdDtRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MmcXVvdDssDQoJCWxvY2FsaXplZDogZmFsc2UsDQoJCWltYWdlOiAmcXVvdDtkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRlBTVVJCVkRoUG5WUE5Tc05BRUo1dGFtbkJrK0E3Qk1FY2lrb2hwL2dpOWkxOG5SYWZRb1QwMGtLMTZ0bm44Q0pvNHZwOW01bTQxZVNnSDB6bWQzZCtkaUovZ2ZkZWR2bDBRVzdrMVBjTHdlbSszVGpvd1phZ0srTm42eWMzZ05DSitMQ0NoOUx6elRNZHFlb05ia1FTRlptcEpMR0NXNUd4MmhaYVFhaE1iWjUyVnVEU2ZIcG5BVkpYT2I0Rkt6aWFuYnpDWGlMckhMWWw1QzN0NU5UUnd0eGFLSnhVVFovSmNPVHI2cTJSeHdmMGFWYjIvaExzNEtxTDNJc2Nrei9tbVNkUlJrc2p5Zyt6N0lNNkx6RENCZnV2QUVPSm1JS0JPcUFXbW8xWW9keExsUU5zeU8wcnNJVi9BWk0rSkdjMmE0R2d6aFoycDltRm1ycGJvQ01xTllCRGRNbHdvbXBvVFdONkYybkZUNWhCWGIwUEVwbW8vR2srb0grUnJxTlpJTlBlSWxuWlZpVjFqUXVMRkpRdVdHQjBnSmR3Z1NodnFkUFhadjZKK0YvUVM3b1hxUTl4QlRGWjVvYThmQUdzOWZlZDVZaFBTd0FBQUFCSlJVNUVya0pnZ2c9PSZxdW90OywNCgkJb25DcmVhdGVkKGJ0bikgew0KCQkJYnRuLnNldEF0dHJpYnV0ZSgmcXVvdDtpbWFnZSZxdW90OywgdGhpcy5pbWFnZSk7DQoJCQl2YXIgZG9jID0gYnRuLm93bmVyRG9jdW1lbnQ7DQoNCgkJCWJ0bi5idG4gPSB0cnVlOw0KCQkJYnRuLmRvbVBhcmVudCA9IG51bGw7DQoJCQlidG4ucG9wdXBzID0gbmV3IGJ0bi5vd25lckdsb2JhbC5BcnJheSgpOw0KCQkJdGhpcy5jcmVhdGVQb3B1cChkb2MsIGJ0biwgJnF1b3Q7cHJpbWFyeSZxdW90OywgcHJpbWFyeSk7DQoJCQl0aGlzLmNyZWF0ZVBvcHVwKGRvYywgYnRuLCAmcXVvdDtzZWNvbmRhcnkmcXVvdDssIHNlY29uZGFyeSk7DQoNCgkJCWJ0bi5saW5rZWRPYmplY3QgPSB0aGlzOw0KCQkJZm9yKHZhciB0eXBlIG9mIFsmcXVvdDtjb21tYW5kJnF1b3Q7LCAmcXVvdDtjb250ZXh0bWVudSZxdW90O10pDQoJCQkJYnRuLnNldEF0dHJpYnV0ZSgmcXVvdDtvbiZxdW90OyArIHR5cGUsIGBsaW5rZWRPYmplY3QuJHt0eXBlfShldmVudClgKTsNCgkJfSwNCgkJY3JlYXRlUG9wdXAoZG9jLCBidG4sIG5hbWUsIGRhdGEpIHsNCgkJCXZhciBwb3B1cCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAmcXVvdDttZW51cG9wdXAmcXVvdDspOw0KCQkJdmFyIHByb3AgPSBuYW1lICsgJnF1b3Q7UG9wdXAmcXVvdDs7DQoJCQlidG4ucG9wdXBzLnB1c2goYnRuW3Byb3BdID0gcG9wdXApOw0KCQkJcG9wdXAuaWQgPSB0aGlzLmlkICsgJnF1b3Q7LSZxdW90OyArIHByb3A7DQoJCQlwb3B1cC5zZXRBdHRyaWJ1dGUoJnF1b3Q7b25wb3B1cHNob3dpbmcmcXVvdDssICZxdW90O3BhcmVudE5vZGUubGlua2VkT2JqZWN0LnBvcHVwc2hvd2luZyhldmVudCkmcXVvdDspOw0KCQkJZm9yKHZhciBvYmogb2YgZGF0YSkgcG9wdXAuYXBwZW5kKHRoaXMuY3JlYXRlRWxlbWVudChkb2MsIG9iaikpOw0KCQkJYnRuLmFwcGVuZChwb3B1cCk7DQoJCX0sDQoJCWNyZWF0ZUVsZW1lbnQoZG9jLCBvYmopIHsNCgkJCWlmICghb2JqKSByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICZxdW90O21lbnVzZXBhcmF0b3ImcXVvdDspOw0KCQkJdmFyIHByZWYgPSBkb2Mub3duZXJHbG9iYWwuT2JqZWN0LmNyZWF0ZShudWxsKSwgbm9kZSwgaW1nOw0KCQkJZm9yKHZhciBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHsNCgkJCQlpZiAoa2V5ID09ICZxdW90O3ByZWYmcXVvdDspIHsNCgkJCQkJdmFyIFthcHJlZiwgbGFiLCBha2V5LCB0dHRdID0gdmFsOw0KCQkJCQlwcmVmLnByZWYgPSBhcHJlZjsgcHJlZi5sYWIgPSBsYWIgfHwgYXByZWY7DQoJCQkJCWlmICh0dHQpIHByZWYudHR0ID0gdHR0Ow0KCQkJCX0NCgkJCQllbHNlIGlmIChrZXkgPT0gJnF1b3Q7aW1hZ2UmcXVvdDspIGltZyA9IHZhbCwgcHJlZi5pbWcgPSB0cnVlOw0KCQkJCWVsc2UgaWYgKGtleSAhPSAmcXVvdDt2YWx1ZXMmcXVvdDspIHByZWZba2V5XSA9IHZhbDsNCgkJCX0NCgkJCXZhciB0eXBlID0gcHJlZnMuZ2V0UHJlZlR5cGUocHJlZi5wcmVmKSwgc3RyLCBib29sOw0KCQkJdmFyIHBpbnQgPSB0eXBlID09IHByZWZzLlBSRUZfSU5ULCBpbnYgPSB0eXBlID09IHByZWZzLlBSRUZfSU5WQUxJRDsNCgkJCWlmIChpbnYgJmFtcDsmYW1wOyBvYmoudmFsdWVzIHx8IHBpbnQgfHwgdHlwZSA9PSBwcmVmcy5QUkVGX1NUUklORykNCgkJCQlzdHIgPSBwaW50IHx8IChpbnYgJmFtcDsmYW1wOyB0eXBlb2Ygb2JqLnZhbHVlc1swXVswXSA9PSAmcXVvdDtudW1iZXImcXVvdDspID8gJnF1b3Q7SW50JnF1b3Q7IDogJnF1b3Q7U3RyaW5nJnF1b3Q7LA0KCQkJCXByZWYuYm9vbCA9IGZhbHNlOw0KCQkJZWxzZQ0KCQkJCXN0ciA9ICZxdW90O0Jvb2wmcXVvdDssIHByZWYuYm9vbCA9IHRydWU7DQoJCQlwcmVmLmdldCA9IHByZWZzW2BnZXQke3N0cn1QcmVmYF07DQoJCQlwcmVmLnNldCA9IHByZWZzW2BzZXQke3N0cn1QcmVmYF07DQoNCgkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgJnF1b3Q7bWVudSZxdW90Oyk7DQoJCQlub2RlLmNsYXNzTmFtZSA9ICZxdW90O21lbnUtaWNvbmljJnF1b3Q7Ow0KCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7Y2xvc2VtZW51JnF1b3Q7LCAmcXVvdDtub25lJnF1b3Q7KTsNCgkJCWltZyAmYW1wOyZhbXA7IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2ltYWdlJnF1b3Q7LCBpbWcpOw0KCQkJYWtleSAmYW1wOyZhbXA7IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2FjY2Vzc2tleSZxdW90OywgYWtleSk7DQoJCQkobm9kZS5wcmVmID0gcHJlZikudmFscyA9IGRvYy5vd25lckdsb2JhbC5PYmplY3QuY3JlYXRlKG51bGwpOw0KCQkJdGhpcy5jcmVhdGVSYWRpb3MoZG9jLA0KCQkJCXByZWYuYm9vbCA/IFtbdHJ1ZSwgJnF1b3Q7dHJ1ZSZxdW90O10sIFtmYWxzZSwgJnF1b3Q7ZmFsc2UmcXVvdDtdXSA6IG9iai52YWx1ZXMsDQoJCQkJbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgJnF1b3Q7bWVudXBvcHVwJnF1b3Q7KSkNCgkJCSk7DQoJCQlyZXR1cm4gbm9kZTsNCgkJfSwNCgkJVXNlckNob2ljZUltZzogJnF1b3Q7ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ1JVbEVRVlI0MnFXVFMyZ1RRUmpIL3pQSlpvMkJEZmdrQjYydllnNUNqUWR2UlVFOFdCOEhLeWFoWW90SVFRT2VGS0dDRjdFZ3ZRbEJxT0NqV0ZLbGV2QlJEeUw0dUhsb0xYaFlxV0pyb2FFcWxFVFNwdG5kR2IrWlBESDBvak44Tzh2QTk4dnYrL0l0dzM4dTFuU1JZUkU2VWhLeWc0RkYxUjI5Mi9RK3hoaExpNFRJcmdqZ0l6d2U0TWJnbVIybnJaTXR4eEVONjN6WU9SdVBacDdnenBlaHZDdTlYamZ1UG13Q1VISWlFdHc0Zks4OXpWdkQyK0ZIQUQ1NnF1WEJwVjNDVk80cmV0Nm54SHp4WnhkQlJ1cUFEQ0ttejdSSEQ5eTJ0bG1iWWJCVmZ3RThEWEJrRWQveTM5SDUrbXplOFp5b1NJcHNGWEM5dS9WRTMvbGRweWc1QUFNRW9KTVRRaTJoQU5LQmd5S2R5MGgvZW9DaHFjZjlNaW12VkFIamQvZmRpRzBOUndnUXBEQXAxYWdCcERad2RIS0pMS1p6YytoNWUza0NTZXhoNWM1ajhmbWhXMEhHcE5aWEZrcWZzUXBBS2djRktHbUFsQXhIWHA1YmtrbXNyaG9zamg0Y0NJSjVwRzVxZlFYZ3RNc2xxTzFxZ0VNV1RQclIrZXJpRWhvQTR3TjdMOFRXaDBLVlh6ZmdZMlJRQVVqVkJlbldMSDRVQ3JqMDRXYTlCTlhFbzV2YSt3NjN4Q2lKNldSVlAyTVZnTlFJZ2pnRUExN01UT0RaN0x0K0F0U2FHREc0Mzc3YTFtMkZBa0tyYzExL2RVd0lJRDFkU0tIRWNXM3lmdDRSYnBSNmtLMVBZZ2FKdGFZMW5OcDVqSWVNc2pLTmJzMUFXUlVjanZUbnAyS2g5THRMSkdURElOVWhjVElaM0wraHpkcTlaZ3ZXbVNGOS9XdTVnSThMMDNnelA1bDNoZGRMLzMvektEZEE5TWRFMFVFUnJkemFGR01VYWFwNzVZL3BYOVlmYXA3NkVRWWFDZUVBQUFBQVNVVk9SSzVDWUlJPSZxdW90OywNCgkJbm90VXNlckNob2ljZUltZzogJnF1b3Q7ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ05VbEVRVlI0MnFYVFQyalRVQndIOEc5ZTB0YTJrczVORDBXdy9xWDFvR3lldkV3UW5PQkE2RUhYd0x3b1VoM2VSR1JzNTAxUlBFNnhncDZLcmV4UUVDWlk4REJQWG1iUlM0Wi9LMGdSdG1tRGEyeWI1UGxMWDdwMkd3cGk0RWZDeThzbjMvZFB3bjllMHNhR25DUkY2WFlGbkE5RGtoS3RSczUxZXA2am10RWNwL0pISU05WWl2bDltZjBYTkRWMk5nbjFZTHpWeGRCMWxKOFU4UDVoenVDV25SNnhyUHdtSU04a0xSamRrVDMyNkJhTEhOZ0xLQUZBOW91WGRoT3c2cWkrKzRqNTg5Y2Q4OXZTYU1xeWMyc0FQVVhsZ0Y4Znl0OVdJM3QyQXY0dzROc0NNSjhBSEFLYXY2aHFxSDc2aXVMSU5jTnVOaE9hd3l0dFlDcCs3dFJFLzZYVDlHRlFBRzRDcG5pQVRRa0lhTlFJTVZHNi94U0wyV2ZUR3VlVGJXRGg1TDJyQTl0MjlRR0JyUVFFUFVEdUF1b0VtRlNyK1A1bEdjOHYzM210QVVmYVFPM000L0dnRE9vWUNJa1VpbjhEMEJERG9CUTJaTXhxTjB3Q1FoMGdNeGFVblliNHV6dCtkd0laOHdCSFRHUWJZQUhNcHUrdUF4YUd4cE1EdlNyM0FIY0ZhQUlsRCtCdG9ONmFnNVdxaE9MTndyb2hUTVdQSDVyb1A3cGRMSXdiM3dXNkV6aVdHQVpocFZkTFdIenhkcHFBeWM0eUtySis0dUtnMm9NVitsZ1JLOUNkd0FWc0cxV3BGOFVIODRadDJRa0NLbXNiaVJBdEZBbGxCNU9IV1E5ZnByODFPd2xjZ0JMOWtQcndzdkRHTVExek5NVjVaeU4xSVNsWllabDkvVEUxdGp1TVNGZ0ExVldPOHVlZitGQXFHNDd0cEZNY203ZHlGeUlPRXpCTWxmQ2FkYW81cWhrMzlsOVA0NzlldndGYmlPY1JTWEt1ZUFBQUFBQkpSVTVFcmtKZ2dnPT0mcXVvdDssDQoJCVVzZXJBbHRJbWc6ICZxdW90O2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFJZlNVUkJWRGhQcFZNOWI5TlFGRDAyY1NLS0ZWR0tJRkZSRUZzbUZpQ0ExQUVRUXJRakMwZ3NzTENrQzBqSmowaUZXRm9HZGlUNEF5MFNFbUpCaFBJNUZCb2tpa0w0U0NDMFRlMlV4SW50MTNNZHUxQ1ZyVmM2NzEzZmU4NngvVDZ3MDlEQ2VUTktKN1EwcHp5VW1vQ21aWU9pVWhYbXM4Uk1jZDZ2QjdVd3RoaE01ZlRMV2l4MkwzUG1ZaktkT3dkejlEREZHdHIxS3Vvdm5xRDI5SkdsZk85R29ldzlEQ1YvRGFaeTJwWEU4UEQ5WS9tYnVwazZ4RTZjVldQUWhFdWpIbzIrNGZYZE83Nnp0bnExVVBZZlNDY3dLQjFIV2plTXl1bkNyYVNaT3NEcWJrQlBzQk9UTm9NR3ZrT1RMdG8vZitGNTZiYmxlMjYyT0svcWVzaVl6SXlkVEpvakZManJnRWU0YmNJT0VkWFdZZTZMSVROMktnbUZTUkZHQnVQcG8wZUFuZ1gwU2V4VEpIRDVMT2dMcEVaVGNnS3VVdU1pakF5eTVsNytyME5TYjIxZzVMUUk1Z0dZU3kyQWpZQkxqUXlSQVVuaVRuSlhzQm9heUJ6bTNSQkJuZHd3SW9PSzNmZ05kSVJFUVlDVi8wRHFMZGlOWnFDUklUS1lheXg4NVJmUXVVTmlaM2s3SWdPK3ZmR2VYR3BraUF5bWErK1dMSHRaaFo4bzVIL0ZFVnBvczFWN3U4VEZ3TFFJZDhudytBZmE1MU9xMnZ5eWNtbGs5S0NXMEdYRlpldTYzSVVPOHo4OEJ4NXMyOFNidVVYZmRkenJ4VmNvYnhwSTBHVGg3SDczNC9kUHpRdDlkMC9DR0JwQ1BCN25iaG13YkFQVnhSNCtQUHRzdVU3L1d1RWx0aC9sS09SVWNzb1RFOFRnTWcwV2JKYVk0WnUzWEtZZEJyQUJBUlVrK2xzNERmUUFBQUFBU1VWT1JLNUNZSUk9JnF1b3Q7LA0KCQl1cGQobm9kZSkgew0KCQkJdmFyIHtwcmVmfSA9IG5vZGUsIGRlZiA9IGZhbHNlLCB1c2VyID0gZmFsc2UsIHZhbDsNCgkJCWlmIChwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpICE9IHByZWZzLlBSRUZfSU5WQUxJRCkgew0KCQkJCXZhciBwbiA9IHByZWYucHJlZjsNCgkJCQl0cnkge3ZhbCA9IGRiW3ByZWYuZ2V0Lm5hbWVdKHBuKTsgZGVmID0gdHJ1ZX0gY2F0Y2goZXgpIHtkZWYgPSBmYWxzZTt9DQoJCQkJdmFyIHVzZXIgPSBwcmVmcy5wcmVmSGFzVXNlclZhbHVlKHBuKTsNCgkJCQlpZiAodXNlcikgdHJ5IHt2YWwgPSBwcmVmLmdldChwbiwgdW5kZWZpbmVkKTt9IGNhdGNoKGV4KSB7fQ0KCQkJfQ0KCQkJaWYgKHZhbCA9PSBwcmVmLnZhbCAmYW1wOyZhbXA7IGRlZiA9PSBwcmVmLmRlZiAmYW1wOyZhbXA7IHVzZXIgPT0gcHJlZi51c2VyKSByZXR1cm47DQoJCQlwcmVmLnZhbCA9IHZhbDsgcHJlZi5kZWYgPSBkZWY7IHByZWYudXNlciA9IHVzZXI7DQoJCQl2YXIgZXhpc3RzID0gZGVmIHx8IHVzZXI7DQoNCgkJCXZhciB0dHQgPSBleGlzdHMgPyB2YWwgOiAmcXVvdDvQrdGC0L7Qs9C+INC/0YDQtdGE0LAg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiZxdW90OzsNCgkJCWlmICh0dHQgPT09ICZxdW90OyZxdW90OykgdHR0ID0gJnF1b3Q7WyBlbXB0eV9zdHJpbmcgXSZxdW90OzsNCgkJCWlmIChwcmVmLnR0dCkgdHR0ICs9ICZxdW90O1xuJnF1b3Q7ICsgcHJlZi50dHQ7DQoJCQlub2RlLnRvb2x0aXBUZXh0ID0gdHR0Ow0KDQoJCQlpZiAoJnF1b3Q7dXNlckNob2ljZSZxdW90OyBpbiBwcmVmKQ0KCQkJCWlmICh2YWwgPT0gcHJlZi51c2VyQ2hvaWNlKQ0KCQkJCQlub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCZxdW90O2NvbG9yJnF1b3Q7KSwNCgkJCQkJcHJlZi5pbWcgfHwgbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7aW1hZ2UmcXVvdDssIHRoaXMuVXNlckNob2ljZUltZyk7DQoJCQkJZWxzZQ0KCQkJCQlub2RlLnN0eWxlLnNldFByb3BlcnR5KCZxdW90O2NvbG9yJnF1b3Q7LCAmcXVvdDttYXJvb24mcXVvdDssICZxdW90O2ltcG9ydGFudCZxdW90OyksDQoJCQkJCXByZWYuaW1nIHx8IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2ltYWdlJnF1b3Q7LCB0aGlzLm5vdFVzZXJDaG9pY2VJbWcpOw0KCQkJZWxzZSAoJnF1b3Q7dXNlckFsdCZxdW90OyBpbiBwcmVmKQ0KCQkJCWlmICh2YWwgPT0gcHJlZi51c2VyQWx0KQ0KCQkJCQlwcmVmLmltZyB8fCBub2RlLnNldEF0dHJpYnV0ZSgmcXVvdDtpbWFnZSZxdW90OywgdGhpcy5Vc2VyQWx0SW1nKTsNCgkJCXVzZXINCgkJCQk/IG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoJnF1b3Q7Zm9udC1zdHlsZSZxdW90OywgJnF1b3Q7aXRhbGljJnF1b3Q7LCAmcXVvdDtpbXBvcnRhbnQmcXVvdDspDQoJCQkJOiBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCZxdW90O2ZvbnQtc3R5bGUmcXVvdDspOw0KDQoJCQl2YXIge2xhYn0gPSBwcmVmOw0KCQkJaWYgKGV4aXN0cyAmYW1wOyZhbXA7ICFwcmVmLmJvb2wpIHsNCgkJCQlpZiAodmFsIGluIHByZWYudmFscykgdmFyIHNmeCA9IHByZWYudmFsc1t2YWxdIHx8IHZhbDsNCgkJCQllbHNlIHZhciBzZnggPSB1c2VyID8gJnF1b3Q70JTRgNGD0LPQvtC1JnF1b3Q7IDogJnF1b3Q70J/QviDRg9C80L7Qu9GH0LDQvdC40Y4mcXVvdDs7DQoJCQkJbGFiICs9IGAgJm1kYXNoOyAmcXVvdDske3NmeH0mcXVvdDtgOw0KCQkJfQ0KCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7bGFiZWwmcXVvdDssIGxhYik7DQoJCX0sDQoJCWNyZWF0ZVJhZGlvcyhkb2MsIHZhbHMsIHBvcHVwKSB7DQoJCQlmb3IodmFyIGFyciBvZiB2YWxzKSB7DQoJCQkJaWYgKCFhcnIpIHsNCgkJCQkJcG9wdXAuYXBwZW5kKGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAmcXVvdDttZW51c2VwYXJhdG9yJnF1b3Q7KSk7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCgkJCQl2YXIgW3ZhbCwgbGFiLCBrZXksIHR0dF0gPSBhcnI7DQoJCQkJdmFyIG1lbnVpdGVtID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICZxdW90O21lbnVpdGVtJnF1b3Q7KTsNCgkJCQltZW51aXRlbS5zZXRBdHRyaWJ1dGUoJnF1b3Q7dHlwZSZxdW90OywgJnF1b3Q7cmFkaW8mcXVvdDspOw0KCQkJCW1lbnVpdGVtLnNldEF0dHJpYnV0ZSgmcXVvdDtjbG9zZW1lbnUmcXVvdDssICZxdW90O25vbmUmcXVvdDspOw0KCQkJCW1lbnVpdGVtLnNldEF0dHJpYnV0ZSgmcXVvdDtsYWJlbCZxdW90OywgcG9wdXAucGFyZW50Tm9kZS5wcmVmLnZhbHNbdmFsXSA9IGxhYik7DQoJCQkJa2V5ICZhbXA7JmFtcDsgbWVudWl0ZW0uc2V0QXR0cmlidXRlKCZxdW90O2FjY2Vzc2tleSZxdW90Oywga2V5KTsNCgkJCQl2YXIgdGlwID0gbWVudWl0ZW0udmFsID0gdmFsOw0KCQkJCWlmICh0dHQpIHRpcCArPSAmcXVvdDtcbiZxdW90OyArIHR0dDsNCgkJCQltZW51aXRlbS50b29sdGlwVGV4dCA9IHRpcDsNCgkJCQlwb3B1cC5hcHBlbmQobWVudWl0ZW0pOw0KCQkJfQ0KCQl9LA0KCQlvcGVuUG9wdXAocG9wdXApIHsNCgkJCXZhciBidG4gPSBwb3B1cC5wYXJlbnROb2RlOw0KCQkJaWYgKGJ0bi5kb21QYXJlbnQgIT0gYnRuLnBhcmVudE5vZGUpIHsNCgkJCQlidG4uZG9tUGFyZW50ID0gYnRuLnBhcmVudE5vZGU7DQoJCQkJdmFyIHBvczsNCgkJCQlpZiAoYnRuLm1hdGNoZXMoJnF1b3Q7LndpZGdldC1vdmVyZmxvdy1saXN0ICZndDsgOnNjb3BlJnF1b3Q7KSkNCgkJCQkJcG9zID0gJnF1b3Q7YWZ0ZXJfc3RhcnQmcXVvdDs7DQoJCQkJZWxzZSB2YXIgd2luID0gYnRuLm93bmVyR2xvYmFsLCB7d2lkdGgsIGhlaWdodCwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSA9DQoJCQkJCWJ0bi5jbG9zZXN0KCZxdW90O3Rvb2xiYXImcXVvdDspLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBwb3MgPSB3aWR0aCAmZ3Q7IGhlaWdodA0KCQkJCQkJPyBgJHt3aW4uaW5uZXJIZWlnaHQgLSBib3R0b20gJmd0OyB0b3AgPyAmcXVvdDthZnRlciZxdW90OyA6ICZxdW90O2JlZm9yZSZxdW90O31fc3RhcnRgDQoJCQkJCQk6IGAke3dpbi5pbm5lcldpZHRoIC0gcmlnaHQgJmd0OyBsZWZ0ID8gJnF1b3Q7ZW5kJnF1b3Q7IDogJnF1b3Q7c3RhcnQmcXVvdDt9X2JlZm9yZWA7DQoJCQkJZm9yKHZhciBwIG9mIGJ0bi5wb3B1cHMpIHAuc2V0QXR0cmlidXRlKCZxdW90O3Bvc2l0aW9uJnF1b3Q7LCBwb3MpOw0KCQkJfQ0KCQkJcG9wdXAub3BlblBvcHVwKGJ0bik7DQoJCX0sDQoJCW1heWJlUmVzdGFydChub2RlLCBjb25mKSB7DQoJCQl2YXIgbXNnUmVzdCA9ICZxdW90O9Cf0LXRgNC10LfQsNC/0YPRgdGC0LjRgtGMINCx0YDQsNGD0LfQtdGAPyZxdW90OywgbXNnQWJvcnQgPSAmcXVvdDvQl9Cw0L/RgNC+0YEg0L3QsCDQstGL0YXQvtC0INC+0YLQvNC10L3QtdC9LiZxdW90OzsNCgkJCWlmIChwdiAmZ3Q7PSA3Nykgew0KCQkJCXZhciB0aXRsZSA9IG5vZGUuY2xvc2VzdCgmcXVvdDt0b29sYmFyYnV0dG9uJnF1b3Q7KS5sYWJlbDsNCgkJCQl2YXIgcHAgPSBkb21XaW4gPSZndDsgU2VydmljZXMucHJvbXB0LndyYXBwZWRKU09iamVjdC5waWNrUHJvbXB0ZXIoew0KCQkJCQlkb21XaW4sIG1vZGFsVHlwZTogQ2kubnNJUHJvbXB0Lk1PREFMX1RZUEVfV0lORE9XDQoJCQkJfSk7DQoJCQkJdmFyIGNvbmZpcm0gPSB3aW4gPSZndDsgcHAod2luKS5jb25maXJtKHRpdGxlLCBtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPSZndDsgcHAod2luKS5hbGVydCh0aXRsZSwgbXNnQWJvcnQpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgY29uZmlybSA9IHdpbiA9Jmd0OyB3aW4uY29uZmlybShtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPSZndDsgd2luLmFsZXJ0KG1zZ0Fib3J0KTsNCgkJCX0NCgkJCXJldHVybiAodGhpcy5tYXlCZVJlc3RhcnQgPSAobm9kZSwgY29uZikgPSZndDsgew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmIChjb25mICZhbXA7JmFtcDsgIWNvbmZpcm0od2luKSkgcmV0dXJuOw0KCQkJCWlmICh3aW4uQnJvd3NlclV0aWxzLnJlc3RhcnRBcHBsaWNhdGlvbigpID09PSBmYWxzZSkgYWxlcnQod2luKTsNCgkJCQllbHNlIHJldHVybiB0cnVlOw0KCQkJfSkobm9kZSwgY29uZik7DQoJCX0sDQoJCXJlZ2V4cFJlZnJlc2g6IC9eKD86dmlldy1zb3VyY2U6KT8oPzpodHRwcz98ZnRwKS8sDQoJCW1heWJlUmUobm9kZSwgZmUpIHsNCgkJCXZhciB7cHJlZn0gPSBub2RlOw0KCQkJaWYgKCZxdW90O3Jlc3RhcnQmcXVvdDsgaW4gcHJlZikgew0KCQkJCWlmICh0aGlzLm1heWJlUmVzdGFydChub2RlLCBwcmVmLnJlc3RhcnQpKSByZXR1cm47DQoJCQl9DQoJCQllbHNlIHRoaXMucG9wdXBzaG93aW5nKGZlLCBub2RlLnBhcmVudE5vZGUpOw0KCQkJaWYgKCZxdW90O3JlZnJlc2gmcXVvdDsgaW4gcHJlZikgew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmICh0aGlzLnJlZ2V4cFJlZnJlc2gudGVzdCh3aW4uZ0Jyb3dzZXIuY3VycmVudFVSSS5zcGVjKSkgcHJlZi5yZWZyZXNoDQoJCQkJCT8gd2luLkJyb3dzZXJSZWxvYWRTa2lwQ2FjaGUoKSA6IHdpbi5Ccm93c2VyUmVsb2FkKCk7DQoJCQl9DQoJCX0sDQoJCWNvbW1hbmQoZSkgew0KCQkJdmFyIHRyZyA9IGUudGFyZ2V0Ow0KCQkJaWYgKHRyZy5idG4pIHJldHVybiB0aGlzLm9wZW5Qb3B1cCh0cmcucHJpbWFyeVBvcHVwKTsNCg0KCQkJdmFyIG1lbnUgPSB0cmcuY2xvc2VzdCgmcXVvdDttZW51JnF1b3Q7KSwgbmV3VmFsID0gdHJnLnZhbDsNCgkJCWlmIChuZXdWYWwgIT0gbWVudS5wcmVmLnZhbCkNCgkJCQltZW51LnByZWYuc2V0KG1lbnUucHJlZi5wcmVmLCBuZXdWYWwpLA0KCQkJCXRoaXMubWF5YmVSZShtZW51LCB0cnVlKTsNCgkJfSwNCgkJcG9wdXBzaG93aW5nKGUsIHRyZyA9IGUudGFyZ2V0KSB7DQoJCQlpZiAodHJnLmlkKSB7DQoJCQkJZm9yKHZhciBub2RlIG9mIHRyZy5jaGlsZHJlbikgew0KCQkJCQlpZiAobm9kZS5ub2RlTmFtZS5lbmRzV2l0aCgmcXVvdDtyJnF1b3Q7KSkgY29udGludWU7DQoJCQkJCXRoaXMudXBkKG5vZGUpOw0KCQkJCQkhZSAmYW1wOyZhbXA7IG5vZGUub3BlbiAmYW1wOyZhbXA7IHRoaXMucG9wdXBzaG93aW5nKG51bGwsIG5vZGUucXVlcnlTZWxlY3RvcigmcXVvdDttZW51cG9wdXAmcXVvdDspKTsNCgkJCQl9DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJdmFyIHt2YWx9ID0gdHJnLmNsb3Nlc3QoJnF1b3Q7bWVudSZxdW90OykucHJlZjsNCgkJCXZhciBjaGVja2VkID0gdHJnLnF1ZXJ5U2VsZWN0b3IoJnF1b3Q7W2NoZWNrZWRdJnF1b3Q7KTsNCgkJCWlmIChjaGVja2VkKSB7DQoJCQkJaWYgKGNoZWNrZWQudmFsID09IHZhbCkgcmV0dXJuOw0KCQkJCWVsc2UgY2hlY2tlZC5yZW1vdmVBdHRyaWJ1dGUoJnF1b3Q7Y2hlY2tlZCZxdW90Oyk7DQoJCQl9DQoJCQlmb3IodmFyIG5vZGUgb2YgdHJnLmNoaWxkcmVuKSBpZiAoJnF1b3Q7dmFsJnF1b3Q7IGluIG5vZGUgJmFtcDsmYW1wOyBub2RlLnZhbCA9PSB2YWwpIHsNCgkJCQlub2RlLnNldEF0dHJpYnV0ZSgmcXVvdDtjaGVja2VkJnF1b3Q7LCB0cnVlKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfSwNCgkJY29udGV4dG1lbnUoZSkgew0KCQkJdmFyIHRyZyA9IGUudGFyZ2V0Ow0KCQkJaWYgKHRyZy5idG4pIHsNCgkJCQlpZiAoZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpIHJldHVybjsNCgkJCQlpZiAoZS5kZXRhaWwgPT0gMikgcmV0dXJuIHRyZy5zZWNvbmRhcnlQb3B1cC5oaWRlUG9wdXAoKTsNCgkJCQl0aGlzLm9wZW5Qb3B1cCh0cmcuc2Vjb25kYXJ5UG9wdXApOw0KCQkJfQ0KCQkJZWxzZSBpZiAoJnF1b3Q7cHJlZiZxdW90OyBpbiB0cmcgJmFtcDsmYW1wOyB0cmcucHJlZi51c2VyKQ0KCQkJCXByZWZzLmNsZWFyVXNlclByZWYodHJnLnByZWYucHJlZiksDQoJCQkJdGhpcy5tYXliZVJlKHRyZyk7DQoJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCX0NCgl9Ow0KfSk7


2020.1597428606.png

Отредактировано _zt (14-08-2020 21:39:11)

Отсутствует

 

№1493515-08-2020 08:53:18

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Dumby пишет

Может подойдёт в контекстном меню не на странице, а на кнопке?

Это не кнопка,это комбайн какой то . Нет нужно попроще, только из контекстного меню. Желательно по возможности ,реанимировать старый код. Просто у некоторых, руки работаю быстрее головы, жмут на всё подряд, а до контекстного меню не дотягиваются, тонкой тайм-аут. Может у кого получится починить код.

Отсутствует

 

№1493615-08-2020 13:04:43

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 52.0

Re: Custom Buttons

firepox пишет

код вставил инициализацию -  ничего не сохраняются вообще

Ну не знаю, может CB какой-то несоответствующий.
Тогда попробуй изменить вкладку Код.

скрытый текст

Выделить код

Код:

(f => {
    var url = "http://site.ru";

    var br = (gBrowser.selectedTab = gBrowser.addTab(url)).linkedBrowser;
    br.addEventListener("pageshow", () => setTimeout(
        () => gBrowser.selectedBrowser == br && br.currentURI.spec == url && f()
    , 0), {once: true});
})(() => {

//======================
// Здесь расположить
// весь код вкладки Код.
//======================

});


_zt
скрытый текст

Что-то по клику на <menu> не готов сказать, что сложилась
у меня какая-то полная ясность.
Сделал так: если userChoice отсутствует, то клик не делает ничего,
иначе — переключает на userChoice, а если текущее значение
уже совпадает с userChoice, тогда переключает на userAlt, если таковой имеется.

Иконку UserAlt прописал и она работает, но вы проверьте за мной

Вот эта строка:
            else ("userAlt" in pref)
не делает ничего (значимого), просто по else вычисляет есть ли у этого объекта такое свойство,
вычисляет в пустоту. Ну а дальше там просто установка "image", если совпадение с userAlt.
Всё бы ничего, но бывает, перед этим, чуть выше по коду, ставится notUserChoiceImg,
и сразу UserAltImg. То есть двойная установка, а это, наверно, нехорошо. Переделал.


И ещё, немного похозяйничал. Заметил, что в каждом(!) pref'е, в конце,
продублировано имя настройки, чтобы оно отображалось в тултипе.
Показалось похожим на концепцию, поэтому поудалял их все, а отображение
имени настройки в тултипе добавил в код.
Ну и оставшиеся пустые "" под accesskey тоже удалил. Сама возможность
дописывать accesskey и дополнительный текст к тултипу, разумеется, никуда не делась.
Если рассудил неверно, тогда упс.


Вобщем вот. Но выложенный код далеко не убирай, в том смысле, что если
я там чего-то испортил, и надо будет откатить, и понадеяться на тот, что на форуме,
то придётся реплейсить &quot; &amp; &gt; &mdash; которые там прописались, как-то.

Выделить код

Код:

data:text/plain;charset=utf-8;base64,Ly8g0JHRi9GB0YLRgNC+0LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQvtCyIGFib3V0OmNvbmZpZw0KKGFzeW5jIChuYW1lLCBpZCwgZnVuYykgPT4gew0KCWlmIChuYW1lID09ICJPYmplY3QiKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGZ1bmMoKSk7DQoJdmFyIHdpbiA9IG5hbWUgPT0gIldpbmRvdyIsIGcgPSBDb21wb25lbnRzLnV0aWxzLmltcG9ydCgicmVzb3VyY2U6Ly9ncmUvbW9kdWxlcy9TZXJ2aWNlcy5qc20iLCB7fSk7DQoJaWYgKGdbaWRdKSB7aWYgKHdpbikgcmV0dXJuO30gZWxzZSBnW2lkXSA9IGZ1bmMoKTsNCglpZiAod2luKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGdbaWRdKTsNCglhZGREZXN0cnVjdG9yKHIgPT4gcls1XSA9PSAiZSIgJiYgZGVsZXRlIGdbaWRdKTsNCglnW2lkXS5vbkNyZWF0ZWQodGhpcyk7DQp9KSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICJRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MiLCAoKSA9PiB7DQoNCgl2YXIge3ByZWZzfSA9IFNlcnZpY2VzLCBkYiA9IHByZWZzLmdldERlZmF1bHRCcmFuY2goIiIpOw0KCXZhciBwdiA9IHBhcnNlSW50KFNlcnZpY2VzLmFwcGluZm8ucGxhdGZvcm1WZXJzaW9uKTsNCgl2YXIgeHVsX25zID0gImh0dHA6Ly93d3cubW96aWxsYS5vcmcva2V5bWFzdGVyL2dhdGVrZWVwZXIvdGhlcmUuaXMub25seS54dWwiOw0KDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KCS8vIHJlZnJlc2g6DQoJLy8JZmFsc2UgLSByZWxvYWQgY3VycmVudCB0YWINCgkvLwl0cnVlIC0gcmVsb2FkIGN1cnJlbnQgdGFiIHNraXAgY2FjaGUNCgkvLw0KCS8vIHJlc3RhcnQ6DQoJLy8JZmFsc2UgLSByZXN0YXJ0IGJyb3dzZXINCgkvLwl0cnVlIC0gcmVzdGFydCBicm93c2VyIHdpdGggY29uZmlybQ0KDQoJdmFyIHByaW1hcnkgPSBbew0KDQoJCQlwcmVmOiBbIm5ldHdvcmsucHJveHkudHlwZSIsICLQndCw0YHRgtGA0L7QudC60Lgg0L/RgNC+0LrRgdC4Il0sDQoJCQl1c2VyQ2hvaWNlOiA1LCB1c2VyQWx0OiAxLCByZWZyZXNoOiB0cnVlLA0KCQkJdmFsdWVzOiBbDQoJCQkJWzAsICLQndC1INC/0YDQvtC60YHQuNGA0L7QstCw0YLRjCIsICIwIl0sIFs1LCAi0KHQuNGB0YLQtdC80L3Ri9C1ICjQuNC3IElFKSIsICI1Il0sIFsyLCAi0JDQstGC0L4gKHBhY2ZpbGUpIiwgIjIiXSwNCgkJCQlbMSwgItCf0YDQvtC/0LjRgdCw0L3QvdGL0LUiLCAiMSJdLCBbNCwgItCQ0LLRgtC+0L7Qv9GA0LXQtNC10LvQtdC90LjQtSIsICI0Il0NCgldfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJwZXJtaXNzaW9ucy5kZWZhdWx0LmltYWdlIiwgItCX0LDQs9GA0YPQttCw0YLRjCDQs9GA0LDRhNC40LrRgyJdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAi0JTQsCJdLCBbMywgItChINGB0LDQudGC0LAiXSwgWzIsICLQndC10YIiXV0NCgl9LHsNCgkJCXByZWY6IFsiYnJvd3Nlci5kaXNwbGF5LnVzZV9kb2N1bWVudF9mb250cyIsICLQl9Cw0LPRgNGD0LbQsNGC0Ywgd2ViLdGI0YDQuNGE0YLRiyJdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAi0JTQsCJdLCBbMCwgItCd0LXRgiJdXQ0KCX0sew0KCQkJcHJlZjogWyJqYXZhc2NyaXB0LmVuYWJsZWQiLCAi0JLRi9C/0L7Qu9C90Y/RgtGMINGB0LrRgNC40L/RgtGLIEphdmEiXSwNCgkJCXVzZXJDaG9pY2U6IHRydWUsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbdHJ1ZSwgItCU0LAiXSwgW2ZhbHNlLCAi0J3QtdGCIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm1lZGlhLmF1dG9wbGF5LmRlZmF1bHQiLCAi0JDQstGC0L7Qt9Cw0L/Rg9GB0Log0LzQtdC00LjQsCJdLA0KCQkJdXNlckNob2ljZTogNSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVs1LCAi0JHQu9C+0LrQuNGA0L7QstCw0YLRjCDQstGB0LUiLCAiNSJdLA0KCQkJCVsxLCAi0JHQu9C+0LrQuNGA0L7QstCw0YLRjCDQvdC1INC/0YDQuNCz0LvRg9GI0LXQvdC90L7QtSIsICIxIl0sDQoJCQkJWzAsICLQoNCw0LfRgNC10YjQuNGC0Ywg0LLRgdC1IiwgIjAiXQ0KCV19LHsNCgkJCXByZWY6IFsibWVkaWEuYXV0b3BsYXkuYmxvY2tpbmdfcG9saWN5IiwgItCQ0LLRgtC+0LfQsNC/0YPRgdC6ICjQv9C+0LvQuNGC0LjQutCwKSJdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMiwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVsxLCAi0JLRgNC10LzQtdC90L3QsNGPIiwgIjEiXSwNCgkJCQlbMiwgItCf0L4g0LTQtdC50YHRgtCy0LjRjiIsICIyIl0sDQoJCQkJWzAsICLQn9C+0YHRgtC+0Y/QvdC90LDRjyIsICIwIl0NCgldfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yIiwgIkNvb2tpZXMiXSwNCgkJCXVzZXJDaG9pY2U6IDEsIHVzZXJBbHQ6IDMsIHJlZnJlc2g6IGZhbHNlLA0KCQkJdmFsdWVzOiBbDQoJCQkJWzEsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgdGC0L7RgNC+0L3QvdC40LUiXSwgWzMsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgSDQvdC1INC/0L7RgdC10YnQtdC90L3Ri9GFIl0sIFs0LCAi0J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0L7RgiDRgtGA0LXQutC10YDQvtCyIl0sDQoJCQkJWzIsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgdC+INCy0YHQtdGFIl0sIFswLCAi0J/RgNC40L3QuNC80LDRgtGMINGB0L4g0LLRgdC10YUiXQ0KCV19LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImRvbS5zdG9yYWdlLmVuYWJsZWQiLCAi0JvQvtC60LDQu9GM0L3QvtC1INGF0YDQsNC90LjQu9C40YnQtSJdLA0KCQkJdXNlckNob2ljZTogdHJ1ZQ0KCX0NCl07DQoNCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoJdmFyIHNlY29uZGFyeSA9IFt7DQoNCgkJCXByZWY6IFsiZG9tLnNlcnZpY2VXb3JrZXJzLmVuYWJsZWQiLCAi0JLQuNC00LXQviBkb20uc2VydmljZVdvcmtlcnMiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfSx7DQoJCQlwcmVmOiBbImRvbS5lbmFibGVfcGVyZm9ybWFuY2UiLCAi0KHRgtCw0YLRg9GBINC30LDQs9GA0YPQt9C60Lgg0YHRgtGA0LDQvdC40YbRiyJdLA0KCQkJdXNlckNob2ljZTogZmFsc2UNCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImJyb3dzZXIuY2FjaGUubWVtb3J5LmVuYWJsZSIsICLQmtGN0Ygg0LIg0L7Qv9C10YDQsNGC0LjQstC90L7QuSDQv9Cw0LzRj9GC0LgiXSwNCgkJCXVzZXJDaG9pY2U6IHRydWUNCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImludGwuYWNjZXB0X2xhbmd1YWdlcyIsICLQr9C30YvQuiDQtNC70Y8g0LLQtdCxLdGB0YLRgNCw0L3QuNGGIl0sDQoJCQl1c2VyQ2hvaWNlOiAiZW4tVVMsIGVuIiwNCgkJCXZhbHVlczogW1siZW4tVVMsIGVuIiwgImVuLVVTLCBlbiJdLCBbImVuLVVTLCBlbiwgcnUtUlUsIHJ1IiwgImVuLVVTLCBlbiwgcnUtUlUsIHJ1Il1dDQoJfSx7DQoJCQlwcmVmOiBbImJyb3dzZXIuZGlzcGxheS5kb2N1bWVudF9jb2xvcl91c2UiLCAi0JjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGG0LLQtdGC0LAg0YHQsNC50YLQvtCyIl0sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICLQkNCy0YLQviIsICIwIl0sIFsxLCAi0JLRgdC10LPQtNCwIiwgIjEiXSwgWzIsICLQndC40LrQvtCz0LTQsCIsICIyIl1dDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAuc2VuZFJlZmVyZXJIZWFkZXIiLCAiUmVmZXJlciAtINC00LvRjyDRh9C10LPQviJdLA0KCQkJdXNlckNob2ljZTogMSwNCgkJCXZhbHVlczogW1swLCAi0J3QuCDQtNC70Y8g0YfQtdCz0L4iLCAiMCJdLCBbMSwgItCi0L7Qu9GM0LrQviDRgdGB0YvQu9C60LgiLCAiMSJdLCBbMiwgItCh0YHRi9C70LrQuCDQuCDQuNC30L7QsdGALiIsICIyIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5yZWZlcmVyLnRyaW1taW5nUG9saWN5IiwgIlJlZmVyZXIgLSDRh9GC0L4iXSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgItCf0L7Qu9C90YvQuSBVUkwiLCAiMCJdLCBbMSwgInNjaGVtZStob3N0K3BvcnQrcGF0aCIsICIxIl0sIFsyLCAic2NoZW1lK2hvc3QrcG9ydCIsICIyIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5yZWZlcmVyLlhPcmlnaW5Qb2xpY3kiLCAiUmVmZXJlclhPIC0g0LrQvtCz0LTQsCJdLA0KCQkJdXNlckNob2ljZTogMCwNCgkJCXZhbHVlczogW1swLCAi0JIg0LvRjtCx0L7QvCDRgdC70YPRh9Cw0LUiLCAiMCJdLCBbMSwgItCf0YDQuCDRgdC+0LLQvy4g0LHQsNC3LiDQtNC+0LzQtdC90LAiLCAiMSJdLCBbMiwgItCf0YDQuCDRgdC+0LLQv9Cw0LTQtdC90LjQuCDQsNC00YDQtdGB0LAiLCAiMiJdXQ0KCX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAucmVmZXJlci5YT3JpZ2luVHJpbW1pbmdQb2xpY3kiLCAiUmVmZXJlclhPIC0g0YfRgtC+Il0sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICLQn9C+0LvQvdGL0LkgVVJMIiwgIjAiXSwgWzEsICJzY2hlbWUraG9zdCtwb3J0K3BhdGgiLCAiMSJdLCBbMiwgInNjaGVtZStob3N0K3BvcnQiLCAiMiJdXQ0KCX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAucmVmZXJlci5zcG9vZlNvdXJjZSIsICJSZWZlcmVyIC0g0LrQvtGA0LXQvdGMINGB0LDQudGC0LAiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJtZWRpYS5wZWVyY29ubmVjdGlvbi5lbmFibGVkIiwgIldlYlJUQyDRg9GC0LXRh9C60LAgSVAiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfQ0KCV07DQoNCglyZXR1cm4gew0KCQlsYWJlbDogIlF1aWNrIHRvZ2dsZSIsDQoJCWlkOiAiUXVpY2tUb2dnbGVBYm91dENvbmZpZ1NldHRpbmdzIiwNCgkJbG9jYWxpemVkOiBmYWxzZSwNCgkJaW1hZ2U6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRlBTVVJCVkRoUG5WUE5Tc05BRUo1dGFtbkJrK0E3Qk1FY2lrb2hwL2dpOWkxOG5SYWZRb1QwMGtLMTZ0bm44Q0pvNHZwOW01bTQxZVNnSDB6bWQzZCtkaUovZ2ZkZWR2bDBRVzdrMVBjTHdlbSszVGpvd1phZ0srTm42eWMzZ05DSitMQ0NoOUx6elRNZHFlb05ia1FTRlptcEpMR0NXNUd4MmhaYVFhaE1iWjUyVnVEU2ZIcG5BVkpYT2I0Rkt6aWFuYnpDWGlMckhMWWw1QzN0NU5UUnd0eGFLSnhVVFovSmNPVHI2cTJSeHdmMGFWYjIvaExzNEtxTDNJc2Nrei9tbVNkUlJrc2p5Zyt6N0lNNkx6RENCZnV2QUVPSm1JS0JPcUFXbW8xWW9keExsUU5zeU8wcnNJVi9BWk0rSkdjMmE0R2d6aFoycDltRm1ycGJvQ01xTllCRGRNbHdvbXBvVFdONkYybkZUNWhCWGIwUEVwbW8vR2srb0grUnJxTlpJTlBlSWxuWlZpVjFqUXVMRkpRdVdHQjBnSmR3Z1NodnFkUFhadjZKK0YvUVM3b1hxUTl4QlRGWjVvYThmQUdzOWZlZDVZaFBTd0FBQUFCSlJVNUVya0pnZ2c9PSIsDQoJCW9uQ3JlYXRlZChidG4pIHsNCgkJCWJ0bi5zZXRBdHRyaWJ1dGUoImltYWdlIiwgdGhpcy5pbWFnZSk7DQoJCQl2YXIgZG9jID0gYnRuLm93bmVyRG9jdW1lbnQ7DQoNCgkJCWJ0bi5idG4gPSB0cnVlOw0KCQkJYnRuLmRvbVBhcmVudCA9IG51bGw7DQoJCQlidG4ucG9wdXBzID0gbmV3IGJ0bi5vd25lckdsb2JhbC5BcnJheSgpOw0KCQkJdGhpcy5jcmVhdGVQb3B1cChkb2MsIGJ0biwgInByaW1hcnkiLCBwcmltYXJ5KTsNCgkJCXRoaXMuY3JlYXRlUG9wdXAoZG9jLCBidG4sICJzZWNvbmRhcnkiLCBzZWNvbmRhcnkpOw0KDQoJCQlidG4ubGlua2VkT2JqZWN0ID0gdGhpczsNCgkJCWZvcih2YXIgdHlwZSBvZiBbImNvbW1hbmQiLCAiY29udGV4dG1lbnUiXSkNCgkJCQlidG4uc2V0QXR0cmlidXRlKCJvbiIgKyB0eXBlLCBgbGlua2VkT2JqZWN0LiR7dHlwZX0oZXZlbnQpYCk7DQoJCX0sDQoJCWNyZWF0ZVBvcHVwKGRvYywgYnRuLCBuYW1lLCBkYXRhKSB7DQoJCQl2YXIgcG9wdXAgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVwb3B1cCIpOw0KCQkJdmFyIHByb3AgPSBuYW1lICsgIlBvcHVwIjsNCgkJCWJ0bi5wb3B1cHMucHVzaChidG5bcHJvcF0gPSBwb3B1cCk7DQoJCQlwb3B1cC5pZCA9IHRoaXMuaWQgKyAiLSIgKyBwcm9wOw0KCQkJZm9yICh2YXIgdHlwZSBvZiBbInBvcHVwc2hvd2luZyIsICJjbGljayJdKQ0KCQkJCXBvcHVwLnNldEF0dHJpYnV0ZSgib24iICsgdHlwZSwgYHBhcmVudE5vZGUubGlua2VkT2JqZWN0LiR7dHlwZX0oZXZlbnQpYCk7DQoJCQlmb3IodmFyIG9iaiBvZiBkYXRhKSBwb3B1cC5hcHBlbmQodGhpcy5jcmVhdGVFbGVtZW50KGRvYywgb2JqKSk7DQoJCQlidG4uYXBwZW5kKHBvcHVwKTsNCgkJfSwNCgkJY3JlYXRlRWxlbWVudChkb2MsIG9iaikgew0KCQkJaWYgKCFvYmopIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVzZXBhcmF0b3IiKTsNCgkJCXZhciBwcmVmID0gZG9jLm93bmVyR2xvYmFsLk9iamVjdC5jcmVhdGUobnVsbCksIG5vZGUsIGltZywgYm9vbDsNCgkJCWZvcih2YXIgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7DQoJCQkJaWYgKGtleSA9PSAicHJlZiIpIHsNCgkJCQkJdmFyIFthcHJlZiwgbGFiLCBha2V5LCB0dHRdID0gdmFsOw0KCQkJCQlwcmVmLnByZWYgPSBhcHJlZjsgcHJlZi5sYWIgPSBsYWIgfHwgYXByZWY7DQoJCQkJCWlmICh0dHQpIHByZWYudHR0ID0gdHR0Ow0KCQkJCX0NCgkJCQllbHNlIGlmIChrZXkgPT0gImltYWdlIikgaW1nID0gdmFsLCBwcmVmLmltZyA9IHRydWU7DQoJCQkJZWxzZSBpZiAoa2V5ICE9ICJ2YWx1ZXMiKSBwcmVmW2tleV0gPSB2YWw7DQoJCQkJZWxzZSBwcmVmLmhhc1ZhbHMgPSB0cnVlOw0KCQkJfQ0KCQkJdmFyIHR5cGUgPSBwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpLCBzdHIsIGJvb2w7DQoJCQl2YXIgcGludCA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlQsIGludiA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlZBTElEOw0KCQkJaWYgKGludiAmJiBvYmoudmFsdWVzIHx8IHBpbnQgfHwgdHlwZSA9PSBwcmVmcy5QUkVGX1NUUklORykNCgkJCQlzdHIgPSBwaW50IHx8IChpbnYgJiYgdHlwZW9mIG9iai52YWx1ZXNbMF1bMF0gPT0gIm51bWJlciIpID8gIkludCIgOiAiU3RyaW5nIjsNCgkJCWVsc2UNCgkJCQlzdHIgPSAiQm9vbCIsIGJvb2wgPSB0cnVlOw0KCQkJcHJlZi5nZXQgPSBwcmVmc1tgZ2V0JHtzdHJ9UHJlZmBdOw0KCQkJcHJlZi5zZXQgPSBwcmVmc1tgc2V0JHtzdHJ9UHJlZmBdOw0KDQoJCQlub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICJtZW51Iik7DQoJCQlub2RlLmNsYXNzTmFtZSA9ICJtZW51LWljb25pYyI7DQoJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2xvc2VtZW51IiwgIm5vbmUiKTsNCgkJCWltZyAmJiBub2RlLnNldEF0dHJpYnV0ZSgiaW1hZ2UiLCBpbWcpOw0KCQkJYWtleSAmJiBub2RlLnNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWtleSk7DQoJCQkobm9kZS5wcmVmID0gcHJlZikudmFscyA9IGRvYy5vd25lckdsb2JhbC5PYmplY3QuY3JlYXRlKG51bGwpOw0KCQkJdGhpcy5jcmVhdGVSYWRpb3MoZG9jLA0KCQkJCWJvb2wgJiYgIXByZWYuaGFzVmFscyA/IFtbdHJ1ZSwgInRydWUiXSwgW2ZhbHNlLCAiZmFsc2UiXV0gOiBvYmoudmFsdWVzLA0KCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICJtZW51cG9wdXAiKSkNCgkJCSk7DQoJCQlpZiAoInVzZXJDaG9pY2UiIGluIG9iaikgcHJlZi5ub0FsdCA9ICEoInVzZXJBbHQiIGluIG9iaik7DQoJCQlyZXR1cm4gbm9kZTsNCgkJfSwNCgkJVXNlckNob2ljZUltZzogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNSVWxFUVZSNDJxV1RTMmdUUVJqSC96UEpabzJCRGZna0I2MnZZZzVDalFkdlJVRThXQjhIS3lhaFlvdElRUU9lRktHQ0Y3RWd2UWxCcU9DaldGS2xldkJSRHlMNHVIbG9MWGhZcVdKcm9hRXFsRVRTcHRuZEdiK1pQREgwb2pOOE84dkE5OHZ2Ky9JdHczOHUxblNSWVJFNlVoS3lnNEZGMVIyOTIvUSt4aGhMaTRUSXJnamdJendlNE1iZ21SMm5yWk10eHhFTjYzellPUnVQWnA3Z3pwZWh2Q3U5WGpmdVBtd0NVSElpRXR3NGZLODl6VnZEMitGSEFENTZxdVhCcFYzQ1ZPNHJldDZueEh6eFp4ZEJSdXFBRENLbXo3UkhEOXkydGxtYlliQlZmd0U4RFhCa0VkL3kzOUg1K216ZThaeW9TSXBzRlhDOXUvVkUzL2xkcHlnNUFBTUVvSk1UUWkyaEFOS0JneUtkeTBoL2VvQ2hxY2Y5TWltdlZBSGpkL2ZkaUcwTlJ3Z1FwREFwMWFnQnBEWndkSEtKTEtaemMraDVlM2tDU2V4aDVjNWo4Zm1oVzBIR3BOWlhGa3Fmc1FwQUtnY0ZLR21BbEF4SFhwNWJra21zcmhvc2poNGNDSUo1cEc1cWZRWGd0TXNscU8xcWdFTVdUUHJSK2VyaUVob0E0d043TDhUV2gwS1ZYemZnWTJSUUFValZCZW5XTEg0VUNyajA0V2E5Qk5YRW81dmErdzYzeENpSjZXUlZQMk1WZ05RSWdqZ0VBMTdNVE9EWjdMdCtBdFNhR0RHNDM3N2ExbTJGQWtLcmMxMS9kVXdJSUQxZFNLSEVjVzN5ZnQ0UmJwUjZrSzFQWWdhSnRhWTFuTnA1akllTXNqS05iczFBV1JVY2p2VG5wMktoOUx0TEpHVERJTlVoY1RJWjNMK2h6ZHE5Wmd2V21TRjkvV3U1Z0k4TDAzZ3pQNWwzaGRkTC8zL3pLRGRBOU1kRTBVRVJyZHphRkdNVWFhcDc1WS9wWDlZZmFwNzZFUVlhQ2VFQUFBQUFTVVZPUks1Q1lJST0iLA0KCQlub3RVc2VyQ2hvaWNlSW1nOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ05VbEVRVlI0MnFYVFQyalRVQndIOEc5ZTB0YTJrczVORDBXdy9xWDFvR3lldkV3UW5PQkE2RUhYd0x3b1VoM2VSR1JzNTAxUlBFNnhncDZLcmV4UUVDWlk4REJQWG1iUlM0Wi9LMGdSdG1tRGEyeWI1UGxMWDdwMkd3cGk0RWZDeThzbjMvZFB3bjllMHNhR25DUkY2WFlGbkE5RGtoS3RSczUxZXA2am10RWNwL0pISU05WWl2bDltZjBYTkRWMk5nbjFZTHpWeGRCMWxKOFU4UDVoenVDV25SNnhyUHdtSU04a0xSamRrVDMyNkJhTEhOZ0xLQUZBOW91WGRoT3c2cWkrKzRqNTg5Y2Q4OXZTYU1xeWMyc0FQVVhsZ0Y4Znl0OVdJM3QyQXY0dzROc0NNSjhBSEFLYXY2aHFxSDc2aXVMSU5jTnVOaE9hd3l0dFlDcCs3dFJFLzZYVDlHRlFBRzRDcG5pQVRRa0lhTlFJTVZHNi94U0wyV2ZUR3VlVGJXRGg1TDJyQTl0MjlRR0JyUVFFUFVEdUF1b0VtRlNyK1A1bEdjOHYzM210QVVmYVFPM000L0dnRE9vWUNJa1VpbjhEMEJERG9CUTJaTXhxTjB3Q1FoMGdNeGFVblliNHV6dCtkd0laOHdCSFRHUWJZQUhNcHUrdUF4YUd4cE1EdlNyM0FIY0ZhQUlsRCtCdG9ONmFnNVdxaE9MTndyb2hUTVdQSDVyb1A3cGRMSXdiM3dXNkV6aVdHQVpocFZkTFdIenhkcHFBeWM0eUtySis0dUtnMm9NVitsZ1JLOUNkd0FWc0cxV3BGOFVIODRadDJRa0NLbXNiaVJBdEZBbGxCNU9IV1E5ZnByODFPd2xjZ0JMOWtQcndzdkRHTVExek5NVjVaeU4xSVNsWllabDkvVEUxdGp1TVNGZ0ExVldPOHVlZitGQXFHNDd0cEZNY203ZHlGeUlPRXpCTWxmQ2FkYW81cWhrMzlsOVA0NzlldndGYmlPY1JTWEt1ZUFBQUFBQkpSVTVFcmtKZ2dnPT0iLA0KCQlVc2VyQWx0SW1nOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQUlmU1VSQlZEaFBwVk05YjlOUUZEMDJjU0tLRlZHS0lGRlJFRnNtRmlDQTFBRVFRclFqQzBnc3NMQ2tDMGpKajBpRldGb0dkaVQ0QXkwU0VtSkJoUEk1RkJva2lrTDRTQ0MwVGUyVXhJbnQxM01kdTFDVnJWYzY3MTNmZTg2eC9UNncwOURDZVROS0o3UTBwenlVbW9DbVpZT2lVaFhtczhSTWNkNnZCN1V3dGhoTTVmVExXaXgyTDNQbVlqS2RPd2R6OURERkd0cjFLdW92bnFEMjlKR2xmTzlHb2V3OURDVi9EYVp5MnBYRThQRDlZL21idXBrNnhFNmNWV1BRaEV1akhvMis0ZlhkTzc2enRucTFVUFlmU0Njd0tCMUhXamVNeXVuQ3JhU1pPc0RxYmtCUHNCT1ROb01HdmtPVEx0by9mK0Y1NmJibGUyNjJPSy9xZXNpWXpJeWRUSm9qRkxqcmdFZTRiY0lPRWRYV1llNkxJVE4yS2dtRlNSRkdCdVBwbzBlQW5nWDBTZXhUSkhENUxPZ0xwRVpUY2dLdVV1TWlqQXl5NWw3K3IwTlNiMjFnNUxRSTVnR1lTeTJBallCTGpReVJBVW5pVG5KWHNCb2F5QnptM1JCQm5kd3dJb09LM2ZnTmRJUkVRWUNWLzBEcUxkaU5acUNSSVRLWWF5eDg1UmZRdVVOaVozazdJZ08rdmZHZVhHcGtpQXltYSsrV0xIdFpoWjhvNUgvRkVWcG9zMVY3dThURndMUUlkOG53K0FmYTUxT3Eydnl5Y21sazlLQ1cwR1hGWmV1NjNJVU84ejg4Qng1czI4U2J1VVhmZGR6cnhWY29ieHBJMEdUaDdINzM0L2RQelF0OWQwL0NHQnBDUEI3bmJobXdiQVBWeFI0K1BQdHN1VTcvV3VFbHRoL2xLT1JVY3NvVEU4VGdNZzBXYkphWTRadTNYS1lkQnJBQkFSVWsrbHM0RGZRQUFBQUFTVVZPUks1Q1lJST0iLA0KCQl1cGQobm9kZSkgew0KCQkJdmFyIHtwcmVmfSA9IG5vZGUsIGRlZiA9IGZhbHNlLCB1c2VyID0gZmFsc2UsIHZhbDsNCgkJCWlmIChwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpICE9IHByZWZzLlBSRUZfSU5WQUxJRCkgew0KCQkJCXZhciBwbiA9IHByZWYucHJlZjsNCgkJCQl0cnkge3ZhbCA9IHByZWYuZGVmVmFsID0gZGJbcHJlZi5nZXQubmFtZV0ocG4pOyBkZWYgPSB0cnVlfQ0KCQkJCWNhdGNoKGV4KSB7ZGVmID0gZmFsc2U7fQ0KCQkJCXZhciB1c2VyID0gcHJlZnMucHJlZkhhc1VzZXJWYWx1ZShwbik7DQoJCQkJaWYgKHVzZXIpIHRyeSB7dmFsID0gcHJlZi5nZXQocG4sIHVuZGVmaW5lZCk7fSBjYXRjaChleCkge30NCgkJCX0NCgkJCWlmICh2YWwgPT0gcHJlZi52YWwgJiYgZGVmID09IHByZWYuZGVmICYmIHVzZXIgPT0gcHJlZi51c2VyKSByZXR1cm47DQoJCQlwcmVmLnZhbCA9IHZhbDsgcHJlZi5kZWYgPSBkZWY7IHByZWYudXNlciA9IHVzZXI7DQoJCQl2YXIgZXhpc3RzID0gZGVmIHx8IHVzZXI7DQoNCgkJCXZhciB0dHQgPSBleGlzdHMgPyB2YWwgOiAi0K3RgtC+0LPQviDQv9GA0LXRhNCwINC90LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIiOw0KCQkJaWYgKHR0dCA9PT0gIiIpIHR0dCA9ICJbIGVtcHR5X3N0cmluZyBdIjsNCgkJCXR0dCArPSAiXG4iICsgcHJlZi5wcmVmOw0KCQkJaWYgKHByZWYudHR0KSB0dHQgKz0gIlxuIiArIHByZWYudHR0Ow0KCQkJbm9kZS50b29sdGlwVGV4dCA9IHR0dDsNCg0KCQkJdmFyIGltZywgYWx0ID0gInVzZXJBbHQiIGluIHByZWYgJiYgdmFsID09IHByZWYudXNlckFsdDsNCgkJCWlmIChhbHQpIGltZyA9IHRoaXMuVXNlckFsdEltZzsNCgkJCWlmICgidXNlckNob2ljZSIgaW4gcHJlZikNCgkJCQlpZiAodmFsID09IHByZWYudXNlckNob2ljZSkNCgkJCQkJbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiY29sb3IiKSwNCgkJCQkJaW1nID0gdGhpcy5Vc2VyQ2hvaWNlSW1nOw0KCQkJCWVsc2Ugew0KCQkJCQlub2RlLnN0eWxlLnNldFByb3BlcnR5KCJjb2xvciIsICJtYXJvb24iLCAiaW1wb3J0YW50Iik7DQoJCQkJCWlmICghYWx0KSBpbWcgPSB0aGlzLm5vdFVzZXJDaG9pY2VJbWc7DQoJCQkJfQ0KCQkJaWYgKCFwcmVmLmltZykgaW1nDQoJCQkJPyBub2RlLnNldEF0dHJpYnV0ZSgiaW1hZ2UiLCBpbWcpDQoJCQkJOiBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiaW1hZ2UiKTsNCgkJCXVzZXINCgkJCQk/IG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoImZvbnQtc3R5bGUiLCAiaXRhbGljIiwgImltcG9ydGFudCIpDQoJCQkJOiBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJmb250LXN0eWxlIik7DQoNCgkJCXZhciB7bGFifSA9IHByZWY7DQoJCQlpZiAoZXhpc3RzICYmIHByZWYuaGFzVmFscykgew0KCQkJCWlmICh2YWwgaW4gcHJlZi52YWxzKSB2YXIgc2Z4ID0gcHJlZi52YWxzW3ZhbF0gfHwgdmFsOw0KCQkJCWVsc2UgdmFyIHNmeCA9IHVzZXIgPyAi0JTRgNGD0LPQvtC1IiA6ICLQn9C+INGD0LzQvtC70YfQsNC90LjRjiI7DQoJCQkJbGFiICs9IGAg4oCUICIke3NmeH0iYDsNCgkJCX0NCgkJCW5vZGUuc2V0QXR0cmlidXRlKCJsYWJlbCIsIGxhYik7DQoJCX0sDQoJCWNyZWF0ZVJhZGlvcyhkb2MsIHZhbHMsIHBvcHVwKSB7DQoJCQlmb3IodmFyIGFyciBvZiB2YWxzKSB7DQoJCQkJaWYgKCFhcnIpIHsNCgkJCQkJcG9wdXAuYXBwZW5kKGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAibWVudXNlcGFyYXRvciIpKTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KCQkJCXZhciBbdmFsLCBsYWIsIGtleSwgdHR0XSA9IGFycjsNCgkJCQl2YXIgbWVudWl0ZW0gPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVpdGVtIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJjbG9zZW1lbnUiLCAibm9uZSIpOw0KCQkJCW1lbnVpdGVtLnN0eWxlLnNldFByb3BlcnR5KCJmb250LXN0eWxlIiwgIml0YWxpYyIsICJpbXBvcnRhbnQiKSwNCgkJCQltZW51aXRlbS5zZXRBdHRyaWJ1dGUoImxhYmVsIiwgcG9wdXAucGFyZW50Tm9kZS5wcmVmLnZhbHNbdmFsXSA9IGxhYik7DQoJCQkJa2V5ICYmIG1lbnVpdGVtLnNldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iiwga2V5KTsNCgkJCQl2YXIgdGlwID0gbWVudWl0ZW0udmFsID0gdmFsOw0KCQkJCWlmICh0dHQpIHRpcCArPSAiXG4iICsgdHR0Ow0KCQkJCW1lbnVpdGVtLnRvb2x0aXBUZXh0ID0gdGlwOw0KCQkJCXBvcHVwLmFwcGVuZChtZW51aXRlbSk7DQoJCQl9DQoJCX0sDQoJCW9wZW5Qb3B1cChwb3B1cCkgew0KCQkJdmFyIGJ0biA9IHBvcHVwLnBhcmVudE5vZGU7DQoJCQlpZiAoYnRuLmRvbVBhcmVudCAhPSBidG4ucGFyZW50Tm9kZSkgew0KCQkJCWJ0bi5kb21QYXJlbnQgPSBidG4ucGFyZW50Tm9kZTsNCgkJCQl2YXIgcG9zOw0KCQkJCWlmIChidG4ubWF0Y2hlcygiLndpZGdldC1vdmVyZmxvdy1saXN0ID4gOnNjb3BlIikpDQoJCQkJCXBvcyA9ICJhZnRlcl9zdGFydCI7DQoJCQkJZWxzZSB2YXIgd2luID0gYnRuLm93bmVyR2xvYmFsLCB7d2lkdGgsIGhlaWdodCwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSA9DQoJCQkJCWJ0bi5jbG9zZXN0KCJ0b29sYmFyIikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHBvcyA9IHdpZHRoID4gaGVpZ2h0DQoJCQkJCQk/IGAke3dpbi5pbm5lckhlaWdodCAtIGJvdHRvbSA+IHRvcCA/ICJhZnRlciIgOiAiYmVmb3JlIn1fc3RhcnRgDQoJCQkJCQk6IGAke3dpbi5pbm5lcldpZHRoIC0gcmlnaHQgPiBsZWZ0ID8gImVuZCIgOiAic3RhcnQifV9iZWZvcmVgOw0KCQkJCWZvcih2YXIgcCBvZiBidG4ucG9wdXBzKSBwLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBwb3MpOw0KCQkJfQ0KCQkJcG9wdXAub3BlblBvcHVwKGJ0bik7DQoJCX0sDQoJCW1heWJlUmVzdGFydChub2RlLCBjb25mKSB7DQoJCQl2YXIgbXNnUmVzdCA9ICLQn9C10YDQtdC30LDQv9GD0YHRgtC40YLRjCDQsdGA0LDRg9C30LXRgD8iLCBtc2dBYm9ydCA9ICLQl9Cw0L/RgNC+0YEg0L3QsCDQstGL0YXQvtC0INC+0YLQvNC10L3QtdC9LiI7DQoJCQlpZiAocHYgPj0gNzcpIHsNCgkJCQl2YXIgdGl0bGUgPSBub2RlLmNsb3Nlc3QoInRvb2xiYXJidXR0b24iKS5sYWJlbDsNCgkJCQl2YXIgcHAgPSBkb21XaW4gPT4gU2VydmljZXMucHJvbXB0LndyYXBwZWRKU09iamVjdC5waWNrUHJvbXB0ZXIoew0KCQkJCQlkb21XaW4sIG1vZGFsVHlwZTogQ2kubnNJUHJvbXB0Lk1PREFMX1RZUEVfV0lORE9XDQoJCQkJfSk7DQoJCQkJdmFyIGNvbmZpcm0gPSB3aW4gPT4gcHAod2luKS5jb25maXJtKHRpdGxlLCBtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gcHAod2luKS5hbGVydCh0aXRsZSwgbXNnQWJvcnQpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgY29uZmlybSA9IHdpbiA9PiB3aW4uY29uZmlybShtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gd2luLmFsZXJ0KG1zZ0Fib3J0KTsNCgkJCX0NCgkJCXJldHVybiAodGhpcy5tYXlCZVJlc3RhcnQgPSAobm9kZSwgY29uZikgPT4gew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmIChjb25mICYmICFjb25maXJtKHdpbikpIHJldHVybjsNCgkJCQlpZiAod2luLkJyb3dzZXJVdGlscy5yZXN0YXJ0QXBwbGljYXRpb24oKSA9PT0gZmFsc2UpIGFsZXJ0KHdpbik7DQoJCQkJZWxzZSByZXR1cm4gdHJ1ZTsNCgkJCX0pKG5vZGUsIGNvbmYpOw0KCQl9LA0KCQlyZWdleHBSZWZyZXNoOiAvXig/OnZpZXctc291cmNlOik/KD86aHR0cHM/fGZ0cCkvLA0KCQltYXliZVJlKG5vZGUsIGZlKSB7DQoJCQl2YXIge3ByZWZ9ID0gbm9kZTsNCgkJCWlmICgicmVzdGFydCIgaW4gcHJlZikgew0KCQkJCWlmICh0aGlzLm1heWJlUmVzdGFydChub2RlLCBwcmVmLnJlc3RhcnQpKSByZXR1cm47DQoJCQl9DQoJCQllbHNlIHRoaXMucG9wdXBzaG93aW5nKGZlLCBub2RlLnBhcmVudE5vZGUpOw0KCQkJaWYgKCJyZWZyZXNoIiBpbiBwcmVmKSB7DQoJCQkJdmFyIHdpbiA9IG5vZGUub3duZXJHbG9iYWw7DQoJCQkJaWYgKHRoaXMucmVnZXhwUmVmcmVzaC50ZXN0KHdpbi5nQnJvd3Nlci5jdXJyZW50VVJJLnNwZWMpKSBwcmVmLnJlZnJlc2gNCgkJCQkJPyB3aW4uQnJvd3NlclJlbG9hZFNraXBDYWNoZSgpIDogd2luLkJyb3dzZXJSZWxvYWQoKTsNCgkJCX0NCgkJfSwNCgkJY29tbWFuZChlKSB7DQoJCQl2YXIgdHJnID0gZS50YXJnZXQ7DQoJCQlpZiAodHJnLmJ0bikgcmV0dXJuIHRoaXMub3BlblBvcHVwKHRyZy5wcmltYXJ5UG9wdXApOw0KDQoJCQl2YXIgbWVudSA9IHRyZy5jbG9zZXN0KCJtZW51IiksIG5ld1ZhbCA9IHRyZy52YWw7DQoJCQlpZiAobmV3VmFsICE9IG1lbnUucHJlZi52YWwpDQoJCQkJbWVudS5wcmVmLnNldChtZW51LnByZWYucHJlZiwgbmV3VmFsKSwNCgkJCQl0aGlzLm1heWJlUmUobWVudSwgdHJ1ZSk7DQoJCX0sDQoJCXBvcHVwc2hvd2luZyhlLCB0cmcgPSBlLnRhcmdldCkgew0KCQkJaWYgKHRyZy5pZCkgew0KCQkJCWZvcih2YXIgbm9kZSBvZiB0cmcuY2hpbGRyZW4pIHsNCgkJCQkJaWYgKG5vZGUubm9kZU5hbWUuZW5kc1dpdGgoInIiKSkgY29udGludWU7DQoJCQkJCXRoaXMudXBkKG5vZGUpOw0KCQkJCQkhZSAmJiBub2RlLm9wZW4gJiYgdGhpcy5wb3B1cHNob3dpbmcobnVsbCwgbm9kZS5xdWVyeVNlbGVjdG9yKCJtZW51cG9wdXAiKSk7DQoJCQkJfQ0KCQkJCXJldHVybjsNCgkJCX0NCgkJCXZhciB7cHJlZn0gPSB0cmcuY2xvc2VzdCgibWVudSIpLCBmaW5kQ2hlY2tlZCA9IHRydWU7DQoNCgkJCXZhciBmaW5kRGVmID0gImRlZlZhbCIgaW4gcHJlZjsNCgkJCXZhciBjaGVja2VkID0gdHJnLnF1ZXJ5U2VsZWN0b3IoIltjaGVja2VkXSIpOw0KCQkJaWYgKGNoZWNrZWQpIHsNCgkJCQlpZiAoY2hlY2tlZC52YWwgPT0gcHJlZi52YWwpIHsNCgkJCQkJaWYgKGZpbmREZWYpIGZpbmRDaGVja2VkID0gZmFsc2U7DQoJCQkJCWVsc2UgcmV0dXJuOw0KCQkJCX0NCgkJCQllbHNlIGNoZWNrZWQucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7DQoJCQl9DQoJCQlpZiAoZmluZERlZikgew0KCQkJCXZhciBkZWYgPSB0cmcucXVlcnlTZWxlY3RvcigibWVudWl0ZW06bm90KFtzdHlsZSo9Zm9udC1zdHlsZV0iKTsNCgkJCQlpZiAoZGVmKQ0KCQkJCQlpZiAoZGVmLnZhbCA9PSBwcmVmLmRlZlZhbCkgew0KCQkJCQkJaWYgKGZpbmRDaGVja2VkKSBmaW5kRGVmID0gZmFsc2U7DQoJCQkJCQllbHNlIHJldHVybjsNCgkJCQkJfQ0KCQkJCQllbHNlIGRlZi5zdHlsZS5zZXRQcm9wZXJ0eSgiZm9udC1zdHlsZSIsICJpdGFsaWMiLCAiaW1wb3J0YW50Iik7DQoJCQl9DQoJCQlmb3IodmFyIG5vZGUgb2YgdHJnLmNoaWxkcmVuKSBpZiAoInZhbCIgaW4gbm9kZSkgew0KCQkJCWlmIChmaW5kQ2hlY2tlZCAmJiBub2RlLnZhbCA9PSBwcmVmLnZhbCkgew0KCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOw0KCQkJCQlpZiAoZmluZERlZikgZmluZENoZWNrZWQgPSBmYWxzZTsNCgkJCQkJZWxzZSBicmVhazsNCgkJCQl9DQoJCQkJaWYgKGZpbmREZWYgJiYgbm9kZS52YWwgPT0gcHJlZi5kZWZWYWwpIHsNCgkJCQkJbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiZm9udC1zdHlsZSIpOw0KCQkJCQlpZiAoZmluZENoZWNrZWQpIGZpbmREZWYgPSBmYWxzZTsNCgkJCQkJZWxzZSBicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0sDQoJCWNvbnRleHRtZW51KGUpIHsNCgkJCXZhciB0cmcgPSBlLnRhcmdldDsNCgkJCWlmICh0cmcuYnRuKSB7DQoJCQkJaWYgKGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5KSByZXR1cm47DQoJCQkJaWYgKGUuZGV0YWlsID09IDIpIHJldHVybiB0cmcuc2Vjb25kYXJ5UG9wdXAuaGlkZVBvcHVwKCk7DQoJCQkJdGhpcy5vcGVuUG9wdXAodHJnLnNlY29uZGFyeVBvcHVwKTsNCgkJCX0NCgkJCWVsc2UgaWYgKCJwcmVmIiBpbiB0cmcgJiYgdHJnLnByZWYudXNlcikNCgkJCQlwcmVmcy5jbGVhclVzZXJQcmVmKHRyZy5wcmVmLnByZWYpLA0KCQkJCXRoaXMubWF5YmVSZSh0cmcpOw0KCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQl9LA0KCQljbGljayhlKSB7DQoJCQlpZiAoZS5idXR0b24pIHJldHVybjsNCgkJCXZhciB0cmcgPSBlLnRhcmdldCwge3ByZWZ9ID0gdHJnOw0KCQkJaWYgKCFwcmVmIHx8ICEoIm5vQWx0IiBpbiBwcmVmKSkgcmV0dXJuOw0KDQoJCQlpZiAocHJlZi52YWwgPT0gcHJlZi51c2VyQ2hvaWNlKQ0KCQkJCWlmIChwcmVmLm5vQWx0KSByZXR1cm47DQoJCQkJZWxzZSAgcHJlZi5zZXQocHJlZi5wcmVmLCBwcmVmLnVzZXJBbHQpOw0KCQkJZWxzZQ0KCQkJCXByZWYuc2V0KHByZWYucHJlZiwgcHJlZi51c2VyQ2hvaWNlKTsNCgkJCXRoaXMubWF5YmVSZSh0cmcpOw0KCQl9DQoJfTsNCn0pOw==

Отсутствует

 

№1493715-08-2020 15:27:52

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 56.0

Re: Custom Buttons

Dumby ещё просьба по QuickSettings - сделать константу в коде, которая управляет скрытием меню после клика.
Например const HideMenu = 1; // автоскрывать после клика…


Может ещё константу для отключения default иконок сделаете ?
Чтобы иконки были как раньше, только на пунктах меню, в которых прописано userChoice: значение по-умолчанию.

Отредактировано Dobrov (15-08-2020 15:33:46)

Отсутствует

 

№1493815-08-2020 16:00:54

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dumby

скрытый текст

Сделал так: если userChoice отсутствует, то клик не делает ничего,
иначе — переключает на userChoice, а если текущее значение
уже совпадает с userChoice, тогда переключает на userAlt, если таковой имеется

Все верно, я почти так и писал. Переключение на userChoice из любого отличного значения это уже вами добавленный бонус.
   

Заметил, что в каждом(!) pref'е, в конце,
продублировано имя настройки, чтобы оно отображалось в тултипе.
Показалось похожим на концепцию, поэтому поудалял их все, а отображение
имени настройки в тултипе добавил в код.

Тоже верно. Тултип никому не мешает, но зато всегда можно увидеть реальный преф скрытый под заголовком.
   

Ну и оставшиеся пустые "" под accesskey тоже удалил.

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

&quot; &amp; &gt; &mdash; которые там прописались, как-то

Из-за перевода? Как их увидеть? Если об этом речь.
2020.1597495749.png
2020.1597497830.png

Спасибо. На первый взгляд все нормально, поставил на основной профиль, сейчас наполню префами и посмотрю за поведением.
   
Согласен с Dobrov, быстрое переключение "скрывать"/"не скрывать" меню после клика, тут не помешало бы. Для тестов удобнее как сейчас, а при постоянном использовании нескрываемое меню будет отвлекать.
А интересно, нельзя ли эту опцию во вторичное меню вывести? ) Например, добавлением этой настройки в about:config и последующем ее чтением.
   
Добавлено 15-08-2020 16:07:56
Dumby
скрытый текст

Выделить код

Код:

node.style.removeProperty("color"),
и
node.style.setProperty("color", "maroon", "important");

Можно удалить, ничего не поломав?

Отредактировано _zt (15-08-2020 17:25:31)

Отсутствует

 

№1493915-08-2020 18:26:22

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dobrov
Просто удалите иконки, приведите соответствующие строки к такому виду:

скрытый текст

Выделить код

Код:

notUserChoiceImg: "",
UserAltImg: "",

После этого у вас не останется индикации UserAlt.
   
userChoice это не значение по умолчанию, значение по умолчанию будет когда вы ПКМ по пункту щелкнете.

Отредактировано _zt (15-08-2020 18:27:24)

Отсутствует

 

№1494016-08-2020 09:59:57

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Добрый день. Посмотрите пожалуйста  код для FF71 "Удалить скролл" . Работал нормально , но после моих переделок, перестал. Какой код конфликтует не нашел. Возможно изменить этот или добавить код , устанавливающий приоритет над всеми другими кодами.


скрытый текст

Выделить код

Код:

/* Scrollbar hidden / hide scrollbars totally */


 //@-moz-document url("https://yandex.ru/"), url("https://www.yandex.ru/") { /* Disable scrollbar Firefox только  yandex.ru*/

  @-moz-document url-prefix() { /* Disable scrollbar Firefox */
          html{
              scrollbar-width: none;
            }
          }
          body {
            margin: 0; /* remove default margin */
            scrollbar-width: none; /* Also needed to disable scrollbar Firefox */
            overflow-y: scroll;
          }


Вопрос снимается ,разобрался.

Отредактировано Duche (16-08-2020 13:22:43)

Отсутствует

 

№1494116-08-2020 19:40:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 52.0

Re: Custom Buttons

_zt

скрытый текст

Из-за перевода? Как их увидеть? Если об этом речь.

Не-не, увидеть очень просто: если открыть во вкладке base64 адрес с кодом
из этого поста, и приглядеться к содержимому, то видно, что оно словно
пропущено через подготовщик для XML. Самое заметное — &quot; вместо кавычек.


Можно удалить, ничего не поломав?

Думаю да, на эти строки ничего не завязано, закомментировал.


Согласен с Dobrov, быстрое переключение "скрывать"/"не скрывать" меню после клика, тут не помешало бы. Для тестов удобнее как сейчас, а при постоянном использовании нескрываемое меню будет отвлекать.
А интересно, нельзя ли эту опцию во вторичное меню вывести? ) Например, добавлением этой настройки в about:config и последующем ее чтением.

OK, попробую добавить во вторичное меню.
Сам этот пункт, при переключении, закрытие меню не вызывает (фишка такая).
Предусмотрено не закрывать, если зажат Ctrl.

Выделить код

Код:

...
	return {
		label: "Quick toggle",
		id: "QuickToggleAboutConfigSettings",
		localized: false,
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFPSURBVDhPnVPNSsNAEJ5tamnBk+A7BMEcikohp/gi9i18nRafQoT00kK16tnn8CJo4vp9m5m41eSgH0zmd3d+diJ/gfdedvl0QW7k1PcLwem+3TjowZagK+Nn6yc3gNCJ+LCCh9LzzTMdqeoNbkQSFZmpJLGCW5Gx2hZaQahMbZ52VuDSfHpnAVJXOb4FKzianbzCXiLrHLYl5C3t5NTRwtxaKJxUTZ/JcOTr6q2Rxwf0aVb2/hLs4KqL3Isckz/mmSdRRksjyg+z7IM6LzDCBfuvAEOJmIKBOqAWmo1YodxLlQNsyO0rsIV/AZM+JGc2a4GgzhZ2p9mFmrpboCMqNYBDdMlwompoTWN6F2nFT5hBXb0PEpmo/Gk+oH+RrqNZINPeIlnZViV1jQuLFJQuWGB0gJdwgShvqdPXZv6J+F/QS7oXqQ9xBTFZ5oa8fAGs9fed5YhPSwAAAABJRU5ErkJggg==",
		onCreated(btn) {
			btn.setAttribute("image", this.image);
			var doc = btn.ownerDocument;

			btn.btn = true;
			btn.domParent = null;
			btn.popups = new btn.ownerGlobal.Array();
			this.createPopup(doc, btn, "primary", primary);
			this.createPopup(doc, btn, "secondary", secondary);
			this.createCloseMenusOption(doc, btn);

			btn.linkedObject = this;
			for(var type of ["command", "contextmenu"])
				btn.setAttribute("on" + type, `linkedObject.${type}(event)`);
		},
		createPopup(doc, btn, name, data) {
			var popup = doc.createElementNS(xul_ns, "menupopup");
			var prop = name + "Popup";
			btn.popups.push(btn[prop] = popup);
			popup.id = this.id + "-" + prop;
			for (var type of ["popupshowing", "click"])
				popup.setAttribute("on" + type, `parentNode.linkedObject.${type}(event)`);
			for(var obj of data) popup.append(this.createElement(doc, obj));
			btn.append(popup);
		},
		map: {b: "Bool", n: "Int", s: "String"},
		createElement(doc, obj) {
			if (!obj) return doc.createElementNS(xul_ns, "menuseparator");
			var pref = doc.ownerGlobal.Object.create(null), node, img, bool;
			for(var [key, val] of Object.entries(obj)) {
				if (key == "pref") {
					var [apref, lab, akey, ttt] = val;
					pref.pref = apref; pref.lab = lab || apref;
					if (ttt) pref.ttt = ttt;
				}
				else if (key == "image") img = val, pref.img = true;
				else if (key != "values") pref[key] = val;
				else pref.hasVals = true;
			}
			var type = prefs.getPrefType(pref.pref);
			var str = this.map[type == prefs.PREF_INVALID
				? obj.values ? (typeof obj.values[0][0])[0] : "b"
				: type == prefs.PREF_BOOL ? "b" : type == prefs.PREF_INT ? "n" : "s"
			];
			pref.get = prefs[`get${str}Pref`];
			pref.set = prefs[`set${str}Pref`];

			node = doc.createElementNS(xul_ns, "menu");
			node.className = "menu-iconic";
			node.setAttribute("closemenu", "none");
			img && node.setAttribute("image", img);
			akey && node.setAttribute("accesskey", akey);
			(node.pref = pref).vals = doc.ownerGlobal.Object.create(null);
			this.createRadios(doc,
				str.startsWith("B") && !pref.hasVals ? [[true, "true"], [false, "false"]] : obj.values,
				node.appendChild(doc.createElementNS(xul_ns, "menupopup"))
			);
			if ("userChoice" in obj) pref.noAlt = !("userAlt" in obj);
			return node;
		},
		createCloseMenusOption(doc, btn) {
			var pn = this.closePref = "QuickToggleAboutConfigSettings.closeMenus";
			var data = [null, {
				pref: [pn, "Закрывать меню этой кнопки"], values: [[true, "Да"], [false, "Нет"]]
			}];
			var setCloseMenus = e => {
				e.stopPropagation();
				var trg = e.target, {pref, val} = trg, updPopup = true, clear;
				switch(e.type) {
					case "command": pref = (trg = trg.closest("menu")).pref; updPopup = false; break;
					case "click": if (e.button) return; break;
					case "contextmenu": e.preventDefault(); clear = pref;
				}
				if (!pref) return;
				if (clear) prefs.clearUserPref(pn);
				else if (!updPopup && val === pref.val) return;
				else pref.set(pn, val !== undefined ? val : !pref.val);
				this.upd(trg);
				updPopup && this.popupshowing(null, trg.querySelector("menupopup"));
			}
			(this.createCloseMenusOption = (doc, btn) => {
				for(var obj of data)
					btn.secondaryPopup.append(this.createElement(doc, obj));
				var m = btn.secondaryPopup.lastChild;
				m.style.cssText = "fill: lightblue !important; list-style-image: url(chrome://browser/skin/menu.svg) !important;";
				m.setAttribute("oncommand", "setCloseMenus(event)");
				m.onclick = m.oncontextmenu = m.setCloseMenus = setCloseMenus;
			})(doc, btn);
		},
		UserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRUlEQVR42qWTS2gTQRjH/zPJZo2BDfgkB62vYg5CjQdvRUE8WB8HKyahYotIQQOeFKGCF7EgvQlBqOCjWFKlevBRDyL4uHloLXhYqWJroaEqlETSptndGb+ZPDH0ojN8O8vA98vv+/Itw38u1nSRYRE6UhKyg4FF1R292/Q+xhhLi4TIrgjgIzwe4MbgmR2nrZMtxxEN63zYORuPZp7gzpehvCu9XjfuPmwCUHIiEtw4fK89zVvD2+FHAD56quXBpV3CVO4ret6nxHzxZxdBRuqADCKmz7RHD9y2tlmbYbBVfwE8DXBkEd/y39H5+mze8ZyoSIpsFXC9u/VE3/ldpyg5AAMEoJMTQi2hANKBgyKdy0h/eoChqcf9MimvVAHjd/fdiG0NRwgQpDAp1agBpDZwdHKJLKZzc+h5e3kCSexh5c5j8fmhW0HGpNZXFkqfsQpAKgcFKGmAlAxHXp5bkkmsrhosjh4cCIJ5pG5qfQXgtMslqO1qgEMWTPrR+eriEhoA4wN7L8TWh0KVXzfgY2RQAUjVBenWLH4UCrj04Wa9BNXEo5va+w63xCiJ6WRVP2MVgNQIgjgEA17MTODZ7Lt+AtSaGDG4377a1m2FAkKrc11/dUwIID1dSKHEcW3yft4RbpR6kK1PYgaJtaY1nNp5jIeMsjKNbs1AWRUcjvTnp2Kh9LtLJGTDINUhcTIZ3L+hzdq9ZgvWmSF9/Wu5gI8L03gzP5l3hddL/3/zKDdA9MdE0UERrdzaFGMUaap75Y/pX9Yfap76EQYaCeEAAAAASUVORK5CYII=",
		notUserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVR42qXTT2jTUBwH8G9e0ta2ks5ND0Ww/qX1oGyevEwQnOBA6EHXwLwoUh3eRGRs501RPE6xgp6KrexQECZY8DBPXmbRS4Z/K0gRtmmDa2yb5PlLX7p2Gwpi4EfCy8sn3/dPwn9e0saGnCRF6XYFnA9DkhKtRs51ep6jmtEcp/JHIM9Yivl9mf0XNDV2Ngn1YLzVxdB1lJ8U8P5hzuCWnR6xrPwmIM8kLRjdkT326BaLHNgLKAFA9ouXdhOw6qi++4j589cd89vSaMqyc2sAPUXlgF8fyt9WI3t2Av4w4NsCMJ8AHAKav6hqqH76iuLINcNuNhOawyttYCp+7tRE/6XT9GFQAG4CpniATQkIaNQIMVG6/xSL2WfTGueTbWDh5L2rA9t29QGBrQQEPUDuAuoEmFSr+P5lGc8v33mtAUfaQO3M4/GgDOoYCIkUin8D0BDDoBQ2ZMxqN0wCQh0gMxaUnYb4uzt+dwIZ8wBHTGQbYAHMpu+uAxaGxpMDvSr3AHcFaAIlD+BtoN6ag5WqhOLNwrohTMWPH5roP7pdLIwb3wW6EziWGAZhpVdLWHzxdpqAyc4yKrJ+4uKg2oMV+lgRK9CdwAVsG1WpF8UH84Zt2QkCKmsbiRAtFAllB5OHWQ9fpr81OwlcgBL9kPrwsvDGMQ1zNMV5ZyN1ISlZYZl9/TE1tjuMSFgA1VWO8uef+FAqG47tpFMcm7dyFyIOEzBMlfCadao5qhk39l9P479evwFbiOcRSXKueAAAAABJRU5ErkJggg==",
		UserAltImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIfSURBVDhPpVM9b9NQFD02cSKKFVGKIFFREFsmFiCA1AEQQrQjC0gssLCkC0jJj0iFWFoGdiT4Ay0SEmJBhPI5FBokikL4SCC0Te2UxInt13Mdu1CVrVc6713fe86x/T6w09DCeTNKJ7Q0pzyUmoCmZYOiUhXms8RMcd6vB7UwthhM5fTLWix2L3PmYjKdOwdz9DDFGtr1KuovnqD29JGlfO9Goew9DCV/DaZy2pXE8PD9Y/mbupk6xE6cVWPQhEujHo2+4fXdO76ztnq1UPYfSCcwKB1HWjeMyunCraSZOsDqbkBPsBOTNoMGvkOTLto/f+F56bble262OK/qesiYzIydTJojFLjrgEe4bcIOEdXWYe6LITN2KgmFSRFGBuPpo0eAngX0SexTJHD5LOgLpEZTcgKuUuMijAyy5l7+r0NSb21g5LQI5gGYSy2AjYBLjQyRAUniTnJXsBoayBzm3RBBndwwIoOK3fgNdIREQYCV/0DqLdiNZqCRITKYayx85RfQuUNiZ3k7IgO+vfGeXGpkiAyma++WLHtZhZ8o5H/FEVpos1V7u8TFwLQId8nw+Afa51Oq2vyycmlk9KCW0GXFZeu63IUO8z88Bx5s28SbuUXfddzrxVcobxpI0GTh7H734/dPzQt9d0/CGBpCPB7nbhmwbAPVxR4+PPtsuU7/WuElth/lKORUcsoTE8TgMg0WbJaY4Zu3XKYdBrABARUk+ls4DfQAAAAASUVORK5CYII=",
		upd(node) {
			var {pref} = node, def = false, user = false, val;
			if (prefs.getPrefType(pref.pref) != prefs.PREF_INVALID) {
				var pn = pref.pref;
				try {val = pref.defVal = db[pref.get.name](pn); def = true}
				catch(ex) {def = false;}
				var user = prefs.prefHasUserValue(pn);
				if (user) try {val = pref.get(pn, undefined);} catch(ex) {}
			}
			if (val == pref.val && def == pref.def && user == pref.user) return;
			pref.val = val; pref.def = def; pref.user = user;
			var exists = def || user;

			var ttt = exists ? val : "Этого префа не существует";
			if (ttt === "") ttt = "[ empty_string ]";
			ttt += "\n" + pref.pref;
			if (pref.ttt) ttt += "\n" + pref.ttt;
			node.tooltipText = ttt;

			var img, alt = "userAlt" in pref && val == pref.userAlt;
			if (alt) img = this.UserAltImg;
			if ("userChoice" in pref)
				if (val == pref.userChoice)
					//node.style.removeProperty("color"),
					img = this.UserChoiceImg;
				else {
					//node.style.setProperty("color", "maroon", "important");
					if (!alt) img = this.notUserChoiceImg;
				}
			if (!pref.img) img
				? node.setAttribute("image", img)
				: node.removeAttribute("image");
			user
				? node.style.setProperty("font-style", "italic", "important")
				: node.style.removeProperty("font-style");

			var {lab} = pref;
			if (exists && pref.hasVals) {
				if (val in pref.vals) var sfx = pref.vals[val] || val;
				else var sfx = user ? "Другое" : "По умолчанию";
				lab += ` — "${sfx}"`;
			}
			node.setAttribute("label", lab);
		},
		createRadios(doc, vals, popup) {
			for(var arr of vals) {
				if (!arr) {
					popup.append(doc.createElementNS(xul_ns, "menuseparator"));
					continue;
				}
				var [val, lab, key, ttt] = arr;
				var menuitem = doc.createElementNS(xul_ns, "menuitem");
				menuitem.setAttribute("type", "radio");
				menuitem.setAttribute("closemenu", "none");
				menuitem.style.setProperty("font-style", "italic", "important"),
				menuitem.setAttribute("label", popup.parentNode.pref.vals[val] = lab);
				key && menuitem.setAttribute("accesskey", key);
				var tip = menuitem.val = val;
				if (ttt) tip += "\n" + ttt;
				menuitem.tooltipText = tip;
				popup.append(menuitem);
			}
		},
		openPopup(popup) {
			var btn = popup.parentNode;
			if (btn.domParent != btn.parentNode) {
				btn.domParent = btn.parentNode;
				var pos;
				if (btn.matches(".widget-overflow-list > :scope"))
					pos = "after_start";
				else var win = btn.ownerGlobal, {width, height, top, bottom, left, right} =
					btn.closest("toolbar").getBoundingClientRect(), pos = width > height
						? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
						: `${win.innerWidth - right > left ? "end" : "start"}_before`;
				for(var p of btn.popups) p.setAttribute("position", pos);
			}
			popup.openPopup(btn);
		},
		maybeRestart(node, conf) {
			var msgRest = "Перезапустить браузер?", msgAbort = "Запрос на выход отменен.";
			if (pv >= 77) {
				var title = node.closest("toolbarbutton").label;
				var pp = domWin => Services.prompt.wrappedJSObject.pickPrompter({
					domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW
				});
				var confirm = win => pp(win).confirm(title, msgRest);
				var alert = win => pp(win).alert(title, msgAbort);
			} else {
				var confirm = win => win.confirm(msgRest);
				var alert = win => win.alert(msgAbort);
			}
			return (this.mayBeRestart = (node, conf) => {
				var win = node.ownerGlobal;
				if (conf && !confirm(win)) return;
				if (win.BrowserUtils.restartApplication() === false) alert(win);
				else return true;
			})(node, conf);
		},
		regexpRefresh: /^(?:view-source:)?(?:https?|ftp)/,
		maybeRe(node, fe) {
			var {pref} = node;
			if ("restart" in pref) {
				if (this.maybeRestart(node, pref.restart)) return;
			}
			else this.popupshowing(fe, node.parentNode);
			if ("refresh" in pref) {
				var win = node.ownerGlobal;
				if (this.regexpRefresh.test(win.gBrowser.currentURI.spec)) pref.refresh
					? win.BrowserReloadSkipCache() : win.BrowserReload();
			}
		},
		maybeClosePopup(e, trg) {
			!e.ctrlKey && prefs.getBoolPref(this.closePref, undefined)
				&& trg.parentNode.hidePopup();
		},
		command(e) {
			var trg = e.target;
			if (trg.btn) return this.openPopup(trg.primaryPopup);

			var menu = trg.closest("menu"), newVal = trg.val;
			this.maybeClosePopup(e, menu);
			if (newVal != menu.pref.val)
				menu.pref.set(menu.pref.pref, newVal),
				this.maybeRe(menu, true);
		},
		popupshowing(e, trg = e.target) {
			if (trg.state == "closed") return;
			if (trg.id) {
				for(var node of trg.children) {
					if (node.nodeName.endsWith("r")) continue;
					this.upd(node);
					!e && node.open && this.popupshowing(null, node.querySelector("menupopup"));
				}
				return;
			}
			var {pref} = trg.closest("menu"), findChecked = true;

			var findDef = "defVal" in pref;
			var checked = trg.querySelector("[checked]");
			if (checked) {
				if (checked.val == pref.val) {
					if (findDef) findChecked = false;
					else return;
				}
				else checked.removeAttribute("checked");
			}
			if (findDef) {
				var def = trg.querySelector("menuitem:not([style*=font-style]");
				if (def)
					if (def.val == pref.defVal) {
						if (findChecked) findDef = false;
						else return;
					}
					else def.style.setProperty("font-style", "italic", "important");
			}
			for(var node of trg.children) if ("val" in node) {
				if (findChecked && node.val == pref.val) {
					node.setAttribute("checked", true);
					if (findDef) findChecked = false;
					else break;
				}
				if (findDef && node.val == pref.defVal) {
					node.style.removeProperty("font-style");
					if (findChecked) findDef = false;
					else break;
				}
			}
		},
		contextmenu(e) {
			var trg = e.target;
			if (trg.btn) {
				if (e.ctrlKey || e.shiftKey) return;
				if (e.detail == 2) return trg.secondaryPopup.hidePopup();
				this.openPopup(trg.secondaryPopup);
			}
			else if ("pref" in trg) {
				this.maybeClosePopup(e, trg);
				if (trg.pref.user)
					prefs.clearUserPref(trg.pref.pref),
					this.maybeRe(trg);
			}
			e.preventDefault();
		},
		click(e) {
			if (e.button) return;
			var trg = e.target, {pref} = trg;
			if (!pref) return;

			this.maybeClosePopup(e, trg);
			if (!("noAlt" in pref)) return;

			if (pref.val == pref.userChoice)
				if (pref.noAlt) return;
				else  pref.set(pref.pref, pref.userAlt);
			else
				pref.set(pref.pref, pref.userChoice);
			this.maybeRe(trg);
		}
	};
});

Отсутствует

 

№1494216-08-2020 21:40:33

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Custom Buttons

Dumby

&quot; вместо кавычек

Делал первым попавшимся онлайн-сервисом, теперь нашел плагин для npp++, в нем такого нет. Учту на будущее.
   
Спасибо. Получилась отличное меню в едином стиле, с традиционной индикацией состояния параметров и всякими дополнительными плюшками. Так намного лучше воспринимается, чем все вместе в стилях шрифта.

Отсутствует

 

№1494316-08-2020 23:47:42

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Подправьте пожалуйста, если возможно, этот скрипт для 79+
javascript.options.asyncstack — true в 79+ теперь по умолчанию, но никак не влияет на нужное поведение скрипта.
Add: т.е. в любом случае, через звёздочку или меню страницы, сохранение идёт в меню закладок. Спасибо.

Отредактировано sandro79 (17-08-2020 00:33:50)

Отсутствует

 

№1494417-08-2020 05:01:09

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 56.0

Re: Custom Buttons

Dumby QuickSettings не работает на Basilisk (старый код работал)
можно сделать отдельную версию или адаптировать новый код для совместимости с Basilisk ?


Vitaliy V. а как отлаживать код для user_chrome_files без перезагрузки браузера ?
или это уже есть ? То есть в [CB] я выбираю: Редактировать код и изменения сразу начинают работать.
Как сделать, чтобы после правки скриптов user_chrome_files изменённые скрипты перезагружались автоматически ?

Отсутствует

 

№1494517-08-2020 09:23:51

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 52.0

Re: Custom Buttons

sandro79 пишет

javascript.options.asyncstack — true в 79+ теперь по умолчанию

Да, вижу (bug). Поставили true и выключили (псевдопарадокс).
На сей раз предлагать включить обратно не стану,
поскольку запугали, что мол это не по-перформансу.


Может тогда попробуй ещё более грубое

скрытый текст

Выделить код

Код:

try {((obj, key) => {
	var funcs = [eval(`(${obj[key]})`.replace(" ", " function ").replace("unfiledGuid", "menuGuid")), obj[key]];
	obj[key] = (...args) => funcs[+Components.stack.formattedStack.includes("nsContextMenu")](...args);
})(PlacesCommandHook, "bookmarkPage");} catch(ex) {Cu.reportError(ex);}

Dobrov пишет

QuickSettings не работает на Basilisk

Ага, на Firefox 2.0.0.8 тоже не работает.
А вообще который? Я вот попробовал поставить (как кнопку) тот,
что последний для _zt на Basilisk 2020.08.05, и, не скажу чтобы
прямо всё проверил, но на первый взгляд выглядит вполне рабочей.


Но засчёт того, что там (в кнопке) нет строковых настроек.
Если «не работает» в этом смысле, тогда попробуй заменить свойство map
на такой геттер

скрытый текст

Выделить код

Код:

...
		//map: {b: "Bool", n: "Int", s: "String"},
		get map() {
			if (!prefs.getStringPref) {
				var ssi = Components.interfaces.nsISupportsString;
				var gs = (o, name) => o.getComplexValue(name, ssi).data;
				var ss = (o, name, val) => {
					var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(ssi);
					str.data = val;
					o.setComplexValue(name, ssi, str);
				}
				var p = {...prefs}, d = {...db};
				[[p, prefs], [d, db]].forEach(([o, b]) => {
					o.getStringPref = function getStringPref(name) {return gs(b, name);}
					o.setStringPref = function setStringPref(name, val) {ss(b, name, val);}
				});
				prefs = p; db = d;
			}
			delete this.map;
			return this.map = {b: "Bool", n: "Int", s: "String"};
		},

Отсутствует

 

№1494617-08-2020 12:43:07

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

Может тогда попробуй ещё более грубое

Благодарю! Работает! :beer:

Отсутствует

 

№1494717-08-2020 22:23:20

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 80.0

Re: Custom Buttons

Dobrov пишет

Как сделать, чтобы после правки скриптов user_chrome_files изменённые скрипты перезагружались автоматически ?

Не к чему это усложнять, к тому же это нужно в каждом куске коде предусматривать методы для инициализации и разрушения,
почти на каждый листенер, обсервер, добавленный элемент и т.д. лепить addDestructor() как в CB... Кроме того есть инструменты браузера.

Отсутствует

 

№1494818-08-2020 00:52:39

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 56.0

Re: Custom Buttons

Vitaliy V. пишет

Не к чему это усложнять …  Кроме того есть инструменты браузера.

А как после правки user_chrome_files скриптов перезагрузить весь их код кнопкой или HotKey ?
То есть неавтоматически, но без перезапуска браузера ?

Отсутствует

 

№1494918-08-2020 01:53:26

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 56.0

Re: Custom Buttons

Общий вопрос - нужна кнопка, которая откроет html-файл, расположенный например, в profile/chrome
Нужно открыть справку в новой вкладке, а по повторному клику закрыть (если во вкладке открыта именно htm-справка)

В html будет справка по горячим клавишам, использованию функций кнопок (в моём профиле их много)…

Отсутствует

 

№1495018-08-2020 10:21:32

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 52.0

Re: Custom Buttons

Dobrov пишет

Общий вопрос - нужна кнопка, которая откроет html-файл, расположенный например, в profile/chrome
Нужно открыть справку в новой вкладке, а по повторному клику закрыть (если во вкладке открыта именно htm-справка)

Звучит как-то так

скрытый текст

Выделить код

Код:

this._handleClick = () => {

	var fileName = "help.html";
	var params = {
		inBackground: false,
		relatedToCurrent: true
	};

	var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
	file.append(fileName);
	var uri = Services.io.newFileURI(file);
	var open = window.openTrustedLinkIn || openUILinkIn;
	(this._handleClick = () => uri.equals(gBrowser.currentURI)
		? gBrowser.removeCurrentTab() : open(uri.spec, "tab", params)
	)();
}

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]