У меня в браузере создаётся на веб-страницах див с моим текстом. Можно ли сделать, чтобы размер текста в этом диве
не менялся, если я меняю шрифт на самой странице?
Шрифт на странице я меняю СВ кнопкой "Zoom", если это имеет значение.
Отсутствует
Dumby
Я пытаюсь присобачить PasteButtonsForStylish к редактору Custom Buttons (уж больно там удобнее реализовано добавление всяких кнопок, менюшек и т.д., в отличии от старой версии CustomPaste for CustomButtons, что в готовых кнопках) и, в общем-то, все получилось, за исключением главного - вставки шаблонов в редактор.
На ReferenceError: insertCodeAtCaret is not defined в
else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) { insertCodeAtCaret(trg.value); codeElementWrapper.focus(); }
моя фантазия зашла в тупик. Это что-то из самого Stylish'а?
Можно тебя попросить о помощи?
Отсутствует
Это что-то из самого Stylish'а?
Да, insertCodeAtCaret это из самого́ Stylish'а.
Можно тебя попросить о помощи?
Разумеется можно, но смогу ли я помочь... . А вместо того, чтобы ногой шаркать,
лучше бы дал кнопку в которой «... в общем-то, все получилось, за исключением ...».
Правда же это было бы мне удобней?
И почему бы не уточнить что-нибудь про тот CB-редактор,
который ты используешь, ну типа классика или красава,
или подкинуть каких-нибудь иных всяких прочих подробностей.
Может попробуй так
else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) { var controller = commandDispatcher.getControllerForCommand("cmd_insertText"); if (!controller || !controller.isCommandEnabled("cmd_insertText")) return; controller.QueryInterface(Ci.nsICommandController); var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams); params.setStringValue("state_data", trg.value); controller.doCommandWithParams("cmd_insertText", params); // Select var se = activeElement.parentNode.__sourceEditor; if (se) { var endPosition = se.getOffset(se.getCursor("end")); se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition)); } else activeElement.selectionStart = activeElement.selectionEnd - trg.value.length; }
Отсутствует
или подкинуть каких-нибудь иных всяких прочих подробностей.
Э, не подумал. Собственно, окромя элемента, за который цепляться будет и адреса окна, ничего и не менял. Редактор - да, использую тот что "красава".
gBrowser.currentURI.spec == "about:customizing" || (() => { var obsId = "CB" + _id.slice(20) + "_PasteButtonsForCB"; var storageId = obsId + "Storage"; var help = self.Help; // ----------------------------------- Storage ---------------------------------- // Simple replacement for Application.storage // See https://github.com/Infocatcher/Custom_Buttons/commit/14d4c33bee20528da14793d3b4a3773a8a34d048 var storage = (function() { var global = Cu.import("resource://gre/modules/Services.jsm", {}); var ns = storageId; var storage = global[ns] || (global[ns] = global.Object.create(null)); return { get: function(key, defaultVal) { if(key in storage) return storage[key]; return defaultVal; }, set: function(key, val) { if(key === null) delete storage[key]; else storage[key] = val; } }; })(); // ------------------------------------------------------------------------------ var obs = storage.get(obsId, null); if (!obs) { obs = { id: obsId, boxId: obsId + "_Box", brURL: location.href, topic: "document-shown", init: function() { this.proceedAll(true); Services.obs.addObserver(this, this.topic, false); }, destroy: function() { this.proceedAll(false); try {Services.obs.removeObserver(this, this.topic);} catch(ex) {Cu.reportError(ex);} }, // ----------------------------------- OBS ---------------------------------- observe: function(doc) {this.proceedDoc(doc, true)}, isCBDoc(doc) { return doc.location && doc.location.href.startsWith("chrome://custombuttons/content/editor.xul") }, isBrowserDoc(doc) { return doc.location && doc.location.href == this.brURL }, proceedAll(init) { var en = Services.wm.getEnumerator(null); while(en.hasMoreElements()) { var doc = en.getNext().document; if (this.isBrowserDoc(doc)) { for(var br of doc.defaultView.gBrowser.browsers) { this.proceedDoc(br.contentDocument, init); } var sidebarDoc = doc.getElementById("sidebar").contentDocument; this.proceedDoc(sidebarDoc, init); var wpb = sidebarDoc.getElementById("web-panels-browser"); wpb && this.proceedDoc(wpb.contentDocument, init); } else this.proceedDoc(doc, init); } }, proceedDoc(doc, add) { if (!this.isCBDoc(doc) || doc.readyState != "complete") return; var box = doc.getElementById(this.boxId); if (add && !box) { var tabbox = doc.getElementById("custombuttons-editbutton-tabbox"); var before = tabbox.getElementsByTagName("tabs")[0]; this.addBox(before); } else if (!add && box) { box && box.remove(); } }, // --------------------------------------------- BOX -------------------------------------------- get box() { delete this.box; return this.box = this.createBox(); }, createBox() { var box = this.insertElement("hbox", null, { id: this.boxId, onclick: ` if (event.button != 2) return; var popup = this.linkedPopup; if (popup.state != "closed") popup.hidePopup(); popup.linkedTarget = event.originalTarget; popup.openPopupAtScreen(event.screenX, event.screenY); `, oncommand: ` event.stopPropagation(); var trg = event.originalTarget; if (trg.nodeName == "toolbarbutton") trg.firstChild.openPopup(trg); else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) { var controller = commandDispatcher.getControllerForCommand("cmd_insertText"); if (!controller || !controller.isCommandEnabled("cmd_insertText")) return; controller.QueryInterface(Ci.nsICommandController); var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams); params.setStringValue("state_data", trg.value); controller.doCommandWithParams("cmd_insertText", params); // Select var se = activeElement.parentNode.__sourceEditor; if (se) { var endPosition = se.getOffset(se.getCursor("end")); se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition)); } else activeElement.selectionStart = activeElement.selectionEnd - trg.value.length; } ` }); return box; }, get boxContent() { delete this.boxContent; return this.boxContent = help.trim(); }, addBox(before) { var box = before.appendChild(this.box.cloneNode(false)); box.innerHTML = this.boxContent; box.linkedPopup = box.appendChild(this.popup.cloneNode(true)); box.linkedPopup.creator = this; box.style.cssText = "max-height: 32px !important; max-width: 320px !important;"; }, // ------------------------------------------- CONTEXT ------------------------------------------ popupXUL: ` <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" id="${obsId + "_Context"}" oncommand="event.stopPropagation(); creator.cmdDispatcher(event);" onpopupshowing="creator.contextPopupshowing(this);"> <menuitem label="Изменить" value="openEditor"/> <menuseparator/> <menuitem label="Выше" value="moveUp"/> <menuitem label="Ниже" value="moveDown"/> <menuseparator/> <menuitem label="Копировать" value="copyItem" closemenu="none"/> <menuitem label="Вставить" value="pasteItem"/> <menuitem label="Удалить" value="deleteItem"/> <menuseparator/> <menuitem label="Новый menuitem" value="newMenuitem"/> <menuitem label="Новoe menu" value="newMenu"/> <menuitem label="Новый toolbarbutton" value="newButton"/> <menuitem label="Новый menuseparator" value="newSeparator"/> <menuseparator/> <menuitem label="Картинка base64" value="imgBase64"/> </menupopup> `, get popup() { delete this.popup; return this.popup = this.createPopup(); }, createPopup() { var xul = this.popupXUL.trim().replace(/>\s+</g, "><"); var popup = new DOMParser().parseFromString(xul, "application/xml").documentElement; popup.creator = this; return popup; }, cmdDispatcher(e) { var trg = e.originalTarget, popup = trg.parentNode, cmd = trg.value; if (!cmd) return; var popupNode = popup.linkedTarget; cmd.startsWith("new") ? this.newItem(popupNode, cmd.slice(3)) : this[cmd](popupNode, popup); "copyItem openEditor imgBase64".includes(cmd) || this.save(popupNode); }, get emptySeparator() { delete this.emptySeparator; return this.emptySeparator = this.insertElement("menuseparator"); }, get emptyMenuitem() { delete this.emptyMenuitem; return this.emptyMenuitem = this.insertElement("menuitem", null, {label: "menuitem", value: ""}); }, get emptyMenupopup() { delete this.emptyMenupopup; var popup = this.insertElement("menupopup"); popup.appendChild(this.emptyMenuitem.cloneNode(false)); return this.emptyMenupopup = popup; }, get emptyMenu() { delete this.emptyMenu; var menu = this.insertElement("menu", null, {label: "menu"}); menu.appendChild(this.emptyMenupopup.cloneNode(true)); return this.emptyMenu = menu; }, get emptyButton() { delete this.emptyButton; var btn = this.insertElement("toolbarbutton", null, { image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////////////////////////////////////////////////////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////AAAA/wAAAP///////////////////////////////////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEH4KxBB+CsQQfgrEEH4KxBB+CsQQfgrEEAAKxBAACsQQAArEEAAKxBAACsQQ==" }); btn.appendChild(this.emptyMenupopup.cloneNode(true)); return this.emptyButton = btn; }, newItem(node, name) { var newItem = this["empty" + name].cloneNode(true); node.parentNode.insertBefore(newItem, node.nextSibling); if (name == "Button") newItem.firstChild.setAttribute("position", "after_start"); }, deleteItem(node) { var win = this.top(node); if (!win.confirm("Удалить ?")) return; node.remove(); }, moveUp(node) { node.parentNode.insertBefore(node, node.previousSibling); }, moveDown(node) { node.parentNode.insertBefore(node, node.nextSibling.nextSibling); }, copyItem(node, popup) { this.transactionNode = node.cloneNode(true); popup.querySelector('menuitem[value="pasteItem"]').disabled = false; }, pasteItem(node) { node.parentNode.insertBefore(this.transactionNode, node); }, imgBase64(node) { var obs = this; var picker = makeFilePicker(); picker.appendFilters(picker.filterImages); picker.init(this.top(node), "Изображение", picker.modeOpen); picker.open({done: function(result) { if (result != picker.returnOK) return; var reader = new FileReader(); reader.onload = function() { if (!reader.result) return; var name = node.nodeName; "menuitem".includes(name) && node.classList.add(name + "-iconic"); node.setAttribute("image", reader.result); obs.save(node); } reader.readAsDataURL(new File(picker.file)); }}); }, disablers: { moveUp(node) {return !node.previousSibling}, moveDown(node) {return !node.nextSibling || node.nextSibling.nodeName == "menupopup"}, deleteItem(node) { var count = node.parentNode.childElementCount; return count == 1 || (node.nodeName == "toolbarbutton" && count == 2); }, top(node) {return "toolbarbutton hbox".includes(node.nodeName);}, newMenuitem(node) {return this.top(node);}, newMenu(node) {return this.top(node);}, newSeparator(node) {return this.top(node);}, newButton(node) {return !this.top(node);}, copyItem(node) {return node.nodeName == "hbox";}, pasteItem() {return !("transactionNode" in this.obs);}, imgBase64(node) {return !"toolbarbutton menu menuitem".includes(node.nodeName);} }, contextPopupshowing(popup) { this.disablers.obs = this; var node = popup.linkedTarget; for(var key in this.disablers) { var menuitem = popup.querySelector(`menuitem[value="${key}"]`); if (menuitem) menuitem.disabled = this.disablers[key](node) || node.nodeName == "menupopup"; } popup.querySelector('menuitem[value="openEditor"]').disabled = node.nodeName == "hbox"; }, // ----------------------------------------------- EDITOR ---------------------------------------------- editorXUL: ` <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/"?> <?xml-stylesheet href="chrome://custombuttons/content/codeeditor.css" type="text/css"?> <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="Изменить" onload="obs = Components.utils.import('resource://gre/modules/Services.jsm')['${storageId}']['${obsId}']; obs.initEditor(window);" ondialogaccept="obs.setAttributes(window);" buttons="extra2,accept,cancel" buttonlabelextra2="Удалить атрибут" ondialogextra2="obs.deleteAttribute(window);"> <hbox align="center"> <label value="Новый атрибут"/> <textbox flex="1" multiline="false" onkeydown="obs.onTexboxKeydown(event);"/> <button label="Добавить" oncommand="obs.newAttribute(window, textbox.value);"/> </hbox> <tabbox flex="1"> <tabs/> <tabpanels flex="1"/> </tabbox> </dialog> `, get editorURL() { delete this.editorURL; var xul = this.editorXUL.trim(); return this.editorURL = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(xul); }, openEditor(node) { this.node = node; this.elm = this.insertElement("box"); Services.ww.openWindow(this.top(node), this.editorURL, "", "chrome,modal,resizable,centerscreen,width=700,height=500" , null); }, initEditor(win) { for(var str of ["tabs", "tabpanels", "textbox"]) { win[str] = win.document.querySelector(str); } for(var {name, value} of this.node.attributes) { var isVal = name == "value"; var tab = this.addTab(win, name, value, isVal); if (isVal) tab.style.cssText = "font-weight: bold; color: navy;"; } if (win.tabs.selectedIndex == -1) win.tabs.selectedIndex = 0; }, addTab(win, name, value, sel) { var tab = this.insertElement("tab", win.tabs, {label: name}); tab.linkedCbeditor = this.insertElement("cbeditor", win.tabpanels, { class: "custombuttons-editor-codeBox", multiline: "true", flex: "1", value: value }); if (sel) { win.tabs.selectedItem = tab; tab.linkedCbeditor.focus(); } return tab; }, newAttribute(win, name) { name && this.addTab(win, name, "", true); win.textbox.value = ""; }, onTexboxKeydown(e) { if (e.keyCode == e.DOM_VK_RETURN) { e.preventDefault(); this.newAttribute(e.target.ownerGlobal, e.target.value); } else try { var attr = e.target.value + e.key; this.elm.setAttribute(attr, true); this.elm.removeAttribute(attr); } catch(ex) { e.preventDefault(); } }, setAttributes(win) { for(var tab of win.tabs.childNodes) { var val = tab.linkedCbeditor.value; this.node.setAttribute(tab.label, val); } this.save(); }, deleteAttribute(win) { var tab = win.tabs.selectedItem; var attr = tab.label; if (!win.confirm("Удалить атрибут " + attr + " ?")) return; this.node.removeAttribute(tab.label); tab.linkedCbeditor.remove(); tab.remove(); win.tabs.selectedIndex = 0; }, save(node = this.node) { var box = node.ownerDocument.getElementById(this.boxId); if (!box) return; box.removeChild(box.linkedPopup); var xul = box.innerHTML.replace(/\t/g, "	").replace(/\n/g, "
").replace(/\r/g, "
"); var link = custombuttons.makeButtonLink("edit", _id); var param = custombuttons.cbService.getButtonParameters(link); param = param.wrappedJSObject || param; param.help = xul; custombuttons.cbService.installButton(param); }, // ----------------------------------------------- MISC ------------------------------------------ insertElement(element, parent, attributes, before = null) { var notExist = typeof element != "object"; if (notExist) element = document.createElement(element); if (notExist && attributes) { for(var attribute in attributes) { attribute == "data" || element.setAttribute(attribute, attributes[attribute]); } } parent && parent.insertBefore(element, before); return element; }, top(node) { var win = node.ownerGlobal; if (!(win instanceof ChromeWindow)) win = Services.wm.getMostRecentWindow("navigator:browser"); return win; } }; storage.set(obsId, obs); obs.init(); } function destructor(reason) { if (reason[5] != "e") return; var obs = storage.get(obsId, null); if (obs) { obs.destroy(); storage.set(obsId, null); } } addDestructor(reason => { destructor(reason); setTimeout(function() { custombuttons.palette.querySelector('toolbarbutton[id="' + _id + '"]') && destructor("delete"); }, 500); }); })();
Добавлено 30-05-2016 20:26:41
Раз уж пошла такая пьянка, помучаю тогда Infocatcher'а насчет "красавы".
Infocatcher
А можно ли приделать к CB_Source_Editor автодополнение во вкладках с кодом, как во вкладке "помощь" для стилей, и как это сделано у консоли браузера, вместо того, что сейчас, по Ctrl + Space?
Отредактировано turbot (30-05-2016 20:26:41)
Отсутствует
Если мне надо заменить в строке все вхождения подстроки через регулярку, как будет быстрее работать
так
или так
Отсутствует
как будет быстрее работать
У меня так алертится разница примерно раза в три-четыре
var string = "Preference", num = 200000, str; var now = Date.now(); for(let n = num; n; n--) str = string.replace(/re/g, 'abc'); var delta1 = Date.now() - now; now = Date.now(); for(let n = num; n; n--) str = string.split(/re/).join('abc'); var delta2 = Date.now() - now; var res = delta1/delta2, factor = (res < 1 ? 1/res : res).toFixed(2); alert( "string.replace(/re/g, 'abc')\t" + delta1 + "\n" + "string.split(/re/).join('abc')\t" + delta2 + "\n" + "factor\t" + factor );
Отсутствует
del. не туда
https://forum.mozilla-russia.org/viewto … 29#p716429
Отредактировано Stakhovsky (01-06-2016 18:30:22)
Отсутствует
Подскажите, что я неправильно делаю?
Алерт показывает мне те же самые символы.
Хотя по идее функция decodeURIComponent должна бы превратить их в "
Отредактировано beggrr (01-06-2016 21:43:15)
Отсутствует
beggrr
"" - это %22%22. А " - это html спецсимволы. Их, вроде, только регуляркой заменять.
Отсутствует
beggrr
"" - это %22%22. А " - это html спецсимволы. Их, вроде, только регуляркой заменять.
А почему он-лайновый декодер http://pressbin.com/tools/urlencode_urldecode/ заменяет эти спецсимволы через decodeURIComponent() и decodeURI() и unescape()
Отсутствует
beggrr
"" - это %22%22. А " - это html спецсимволы. Их, вроде, только регуляркой заменять.
Я вот нашёл в Интернете интересное решение.
var string = '" "'; var textarea = document.createElement('textarea'); textarea.innerHTML = string; alert(textarea.value)
Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?
Отсутствует
Я вот нашёл в Интернете интересное решение.
Ну так там у beggrr по ссылке так и сделано:
function encode(text) { if (document.getElementById('which_urlencode').checked == true) { document.getElementById('escape').innerHTML = escape(text); document.getElementById('encodeURI').innerHTML = encodeURI(text); document.getElementById('encodeURIComponent').innerHTML = encodeURIComponent(text); document.getElementById('urlencode').innerHTML = urlencode(text); } else { document.getElementById('unescape').innerHTML = unescape(text); document.getElementById('decodeURI').innerHTML = decodeURI(text); document.getElementById('decodeURIComponent').innerHTML = decodeURIComponent(text); document.getElementById('urldecode').innerHTML = urldecode(text); } }
Отсутствует
Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?
Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.
А как можно потом проверить, поудалялись ли эти textarea?
Отсутствует
rbfyec
Никак не проверить.
Чтобы проверить, нужна ссылка, а пока есть ссылка – ничего не удалится.
Если есть опасения, что создаются в той же области видимости функции и что осядет в замыкании – можно принудительно сделать
Если делать расширение, можно в about:memory смотреть, там по адресу скрипта видно будет, если что-то в памяти осталось после выключения.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
В 47.0/win64 сломались кнопки:
Zoom
Menuitem hider
Почините, пожалуйста...если возможно.
[CB]Изменить масштаб тоже перестает работать после перезапуска
Отредактировано oleg.sgh (07-06-2016 12:33:48)
Отсутствует
В 47.0/win64 сломались кнопки:
Отсутствует
bunda1
Menuitem hider
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.
Отсутствует
bunda1
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.
Упс Исправил: Menuitem hider
Отсутствует
bunda1
Еще обнаружил:
1. FF Exp Imp CB - не фурычит совсем
2. Переключать проигрывания анимации(gif) - неактивна (серая)
3. Save - не работает Сохранить ярлык страницы как…
Отредактировано bezuma (08-06-2016 04:27:20)
Отсутствует