From 7dfcc927f6630185f6518bf50e3b90a10bf0a5e6 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 16 Nov 2016 12:38:16 +0300 Subject: [PATCH 01/42] Interface customization using plugins. Need to append config->editorConfig->pluigns->UIpluginsData field with list of customizer plugins. --- apps/common/main/lib/util/utils.js | 42 ++++++++++++ .../main/app/controller/Main.js | 64 ++++++++++++------- .../main/app/controller/Main.js | 64 ++++++++++++------- .../main/app/controller/Main.js | 63 +++++++++++------- 4 files changed, 167 insertions(+), 66 deletions(-) diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 26b80a9df..77cd28771 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -602,6 +602,48 @@ Common.Utils.applyCustomization = function(config, elmap) { } }; +Common.Utils.applyCustomizationPlugins = function(plugins) { + if (!plugins || plugins.length<1) return; + + var _createXMLHTTPObject = function() { + var xmlhttp; + try { + xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) { + try { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (E) { + xmlhttp = false; + } + } + if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { + xmlhttp = new XMLHttpRequest(); + } + return xmlhttp; + }; + + var _getPluginCode = function(url) { + if (!url) return ''; + try { + var xhrObj = _createXMLHTTPObject(); + if (xhrObj && url) { + xhrObj.open('GET', url, false); + xhrObj.send(''); + if (xhrObj.status == 200) + eval(xhrObj.responseText); + } + } + catch (e) {} + return null; + }; + + plugins.forEach(function(url){ + if (url) _getPluginCode(url); + }); +}; + Common.Utils.fillUserInfo = function(info, lang, defname) { var _user = info || {}; !_user.id && (_user.id = ('uid-' + Date.now())); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 31283a5bb..ba9097302 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -147,6 +147,7 @@ define([ this.editorConfig = {}; this.appOptions = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -857,7 +858,7 @@ define([ application.getController('Common.Controllers.ExternalMergeEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); documentHolderController.setApi(me.api); @@ -900,9 +901,14 @@ define([ toolbarController.onApiCoAuthoringDisconnect(); me.api.UpdateInterfaceState(); me.fillTextArt(me.api.asc_getTextArtPreviews()); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Document Editor'); @@ -1008,7 +1014,9 @@ define([ params.asc_getTrial() && headerView.setDeveloperMode(true); this.appOptions.canRename && headerView.setCanRename(true); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); this.applyModeCommonElements(); this.applyModeEditorElements(); @@ -1443,13 +1451,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } Common.NotificationCenter.trigger('layout:changed', 'main'); @@ -1782,8 +1792,11 @@ define([ if (url) this.iframePrint.src = url; }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1821,7 +1834,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1834,14 +1847,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1852,7 +1865,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)) { + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1869,10 +1884,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1882,11 +1898,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1895,7 +1915,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 24e97d8c8..e8d5efe80 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -142,6 +142,7 @@ define([ this.editorConfig = {}; this.appOptions = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -636,7 +637,7 @@ define([ application.getController('Common.Controllers.ExternalDiagramEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); documentHolderController.setApi(me.api); @@ -681,9 +682,14 @@ define([ if (me.needToUpdateVersion) toolbarController.onApiCoAuthoringDisconnect(); me.api.UpdateInterfaceState(); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Presentation Editor'); @@ -773,7 +779,9 @@ define([ params.asc_getTrial() && headerView.setDeveloperMode(true); this.appOptions.canRename && headerView.setCanRename(true); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); this.applyModeCommonElements(); this.applyModeEditorElements(); @@ -1196,13 +1204,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } Common.NotificationCenter.trigger('layout:changed', 'main'); @@ -1563,8 +1573,11 @@ define([ } }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1602,7 +1615,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1615,14 +1628,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1633,7 +1646,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)){ + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1650,10 +1665,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1663,11 +1679,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1676,7 +1696,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, // Translation diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 70208e2b6..c692cf809 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -147,6 +147,7 @@ define([ // Initialize api gateway this.editorConfig = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -614,7 +615,7 @@ define([ if (!me.appOptions.isEditMailMerge && !me.appOptions.isEditDiagram) { pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); } @@ -684,9 +685,13 @@ define([ } if (me.needToUpdateVersion) toolbarController.onApiCoAuthoringDisconnect(); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); if (me.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Spreadsheet Editor'); @@ -782,7 +787,9 @@ define([ if (this.appOptions.canBranding) this.headerView.setBranding(this.editorConfig.customization); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); params.asc_getTrial() && this.headerView.setDeveloperMode(true); this.appOptions.canRename && this.headerView.setCanRename(true); @@ -1325,13 +1332,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } this.stackLongActions.pop({id: InitApplication, type: Asc.c_oAscAsyncActionType.BlockInteraction}); @@ -1773,8 +1782,11 @@ define([ if (url) this.iframePrint.src = url; }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1812,7 +1824,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1825,14 +1837,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1843,7 +1855,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)) { + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1860,10 +1874,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1873,11 +1888,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1886,7 +1905,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', From c18729622292807992897d4b979b9c5874454f87 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 25 Nov 2016 15:05:17 +0300 Subject: [PATCH 02/42] [embed] removed unnecessary symbol --- apps/common/embed/lib/controller/modals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/embed/lib/controller/modals.js b/apps/common/embed/lib/controller/modals.js index d31e41f67..f85f39e92 100644 --- a/apps/common/embed/lib/controller/modals.js +++ b/apps/common/embed/lib/controller/modals.js @@ -53,7 +53,7 @@ $dlgShare = common.view.modals.create('share'); var _encoded = encodeURIComponent(appConfig.shareUrl); - var _mailto = 'mailto:?subject=I have shared a document with you: ' + appConfig.docTitle + '&body=I have shared a document with you: ' + _encoded + '"'; + var _mailto = 'mailto:?subject=I have shared a document with you: ' + appConfig.docTitle + '&body=I have shared a document with you: ' + _encoded; $dlgShare.find('#btn-copyshort').on('click', copytext.bind(this, $dlgShare.find('#id-short-url'))); $dlgShare.find('.share-buttons > span').on('click', function(e){ From ff73fca1e27b69158d9cb7427534782ea5f1de32 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 28 Nov 2016 19:25:37 +0300 Subject: [PATCH 03/42] Links to new files. --- apps/documenteditor/sdk_dev_scripts.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index 915b58c45..eb9739e1f 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -11,7 +11,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", - "../../../../sdkjs/common/NumFormat.js", + "../../../../sdkjs/common/HistoryCommon.js", + "../../../../sdkjs/common/TableId.js", + "../../../../sdkjs/common/TableIdChanges.js", + "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", "../../../../sdkjs/common/FontsFreeType/font_engine.js", @@ -28,7 +31,6 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Hit.js", "../../../../sdkjs/common/Drawings/ArcTo.js", "../../../../sdkjs/common/Drawings/ColorArray.js", - "../../../../sdkjs/common/Drawings/Format/Constants.js", "../../../../sdkjs/common/Drawings/CommonController.js", "../../../../sdkjs/word/Editor/GraphicObjects/DrawingStates.js", "../../../../sdkjs/common/Drawings/Format/CreateGeometry.js", @@ -82,12 +84,21 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/GraphicObjects/WrapManager.js", "../../../../sdkjs/word/Editor/CollaborativeEditing.js", "../../../../sdkjs/word/Editor/Comments.js", + "../../../../sdkjs/word/Editor/CommentsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", + "../../../../sdkjs/word/Editor/StylesChanges.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawing.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawingChanges.js", "../../../../sdkjs/word/Editor/Paragraph.js", + "../../../../sdkjs/word/Editor/ParagraphChanges.js", "../../../../sdkjs/word/Editor/DocumentContentBase.js", "../../../../sdkjs/word/Editor/Document.js", + "../../../../sdkjs/word/Editor/DocumentChanges.js", "../../../../sdkjs/word/Editor/DocumentContent.js", + "../../../../sdkjs/word/Editor/DocumentContentChanges.js", "../../../../sdkjs/word/Editor/DocumentControllerBase.js", "../../../../sdkjs/word/Editor/LogicDocumentController.js", "../../../../sdkjs/word/Editor/DrawingsController.js", @@ -95,25 +106,35 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/FlowObjects.js", "../../../../sdkjs/word/Editor/ParagraphContentBase.js", "../../../../sdkjs/word/Editor/Hyperlink.js", + "../../../../sdkjs/word/Editor/HyperlinkChanges.js", "../../../../sdkjs/word/Editor/Field.js", + "../../../../sdkjs/word/Editor/FieldChanges.js", "../../../../sdkjs/word/Editor/Run.js", + "../../../../sdkjs/word/Editor/RunChanges.js", "../../../../sdkjs/word/Editor/Math.js", + "../../../../sdkjs/word/Editor/MathChanges.js", "../../../../sdkjs/word/Editor/Paragraph_Recalculate.js", "../../../../sdkjs/word/Editor/Sections.js", + "../../../../sdkjs/word/Editor/SectionsChanges.js", "../../../../sdkjs/word/Editor/Numbering.js", "../../../../sdkjs/word/Editor/HeaderFooter.js", "../../../../sdkjs/word/Editor/Common.js", "../../../../sdkjs/word/Editor/Numbering.js", + "../../../../sdkjs/word/Editor/NumberingChanges.js", "../../../../sdkjs/word/Editor/Table.js", + "../../../../sdkjs/word/Editor/Table/TableChanges.js", "../../../../sdkjs/word/Editor/Table/TableRecalculate.js", "../../../../sdkjs/word/Editor/Table/TableDraw.js", "../../../../sdkjs/word/Editor/Table/TableRow.js", + "../../../../sdkjs/word/Editor/Table/TableRowChanges.js", "../../../../sdkjs/word/Editor/Table/TableCell.js", + "../../../../sdkjs/word/Editor/Table/TableCellChanges.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/Search.js", "../../../../sdkjs/word/Editor/FontClassification.js", "../../../../sdkjs/word/Editor/Spelling.js", "../../../../sdkjs/word/Editor/Footnotes.js", + "../../../../sdkjs/word/Editor/FootnotesChanges.js", "../../../../sdkjs/word/Editor/FootEndNote.js", "../../../../sdkjs/word/Drawing/Graphics.js", "../../../../sdkjs/word/Drawing/ShapeDrawer.js", From 0fb162320d5f8976e57e58a37f4ae73f33839a9f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 29 Nov 2016 12:51:23 +0300 Subject: [PATCH 04/42] Added links to the new files. --- apps/presentationeditor/sdk_dev_scripts.js | 22 ++++++++++++++++++++- apps/spreadsheeteditor/sdk_dev_scripts.js | 23 +++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/apps/presentationeditor/sdk_dev_scripts.js b/apps/presentationeditor/sdk_dev_scripts.js index 0be236e9a..29cf9bb73 100644 --- a/apps/presentationeditor/sdk_dev_scripts.js +++ b/apps/presentationeditor/sdk_dev_scripts.js @@ -8,6 +8,9 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", + "../../../../sdkjs/common/HistoryCommon.js", + "../../../../sdkjs/common/TableId.js", + "../../../../sdkjs/common/TableIdChanges.js", "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", @@ -25,7 +28,6 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Hit.js", "../../../../sdkjs/common/Drawings/ArcTo.js", "../../../../sdkjs/common/Drawings/ColorArray.js", - "../../../../sdkjs/common/Drawings/Format/Constants.js", "../../../../sdkjs/common/Drawings/CommonController.js", "../../../../sdkjs/common/Drawings/States.js", "../../../../sdkjs/common/Drawings/Format/CreateGeometry.js", @@ -75,17 +77,23 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/slide/Drawing/ThemeLoader.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/Numbering.js", + "../../../../sdkjs/word/Editor/NumberingChanges.js", "../../../../sdkjs/slide/Editor/CollaborativeEditing.js", "../../../../sdkjs/word/Drawing/GraphicsEvents.js", "../../../../sdkjs/word/Drawing/Rulers.js", "../../../../sdkjs/word/Editor/Table.js", + "../../../../sdkjs/word/Editor/Table/TableChanges.js", "../../../../sdkjs/word/Editor/Table/TableRecalculate.js", "../../../../sdkjs/word/Editor/Table/TableDraw.js", "../../../../sdkjs/word/Editor/Table/TableRow.js", + "../../../../sdkjs/word/Editor/Table/TableRowChanges.js", "../../../../sdkjs/word/Editor/Table/TableCell.js", + "../../../../sdkjs/word/Editor/Table/TableCellChanges.js", "../../../../sdkjs/word/Editor/Common.js", "../../../../sdkjs/word/Editor/Sections.js", + "../../../../sdkjs/word/Editor/SectionsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", + "../../../../sdkjs/word/Editor/StylesChanges.js", "../../../../sdkjs/slide/Editor/Format/StylesPrototype.js", "../../../../sdkjs/word/Drawing/Graphics.js", "../../../../sdkjs/word/Drawing/ShapeDrawer.js", @@ -99,10 +107,17 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/slide/Editor/Format/Layout.js", "../../../../sdkjs/slide/Editor/Format/Comments.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawing.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawingChanges.js", "../../../../sdkjs/word/Editor/Paragraph.js", + "../../../../sdkjs/word/Editor/ParagraphChanges.js", "../../../../sdkjs/word/Editor/DocumentContentBase.js", "../../../../sdkjs/word/Editor/Document.js", + "../../../../sdkjs/word/Editor/DocumentChanges.js", "../../../../sdkjs/word/Editor/DocumentContent.js", + "../../../../sdkjs/word/Editor/DocumentContentChanges.js", "../../../../sdkjs/word/Editor/DocumentControllerBase.js", "../../../../sdkjs/word/Editor/LogicDocumentController.js", "../../../../sdkjs/word/Editor/DrawingsController.js", @@ -115,8 +130,11 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/Numbering.js", "../../../../sdkjs/word/Editor/ParagraphContentBase.js", "../../../../sdkjs/word/Editor/Hyperlink.js", + "../../../../sdkjs/word/Editor/HyperlinkChanges.js", "../../../../sdkjs/word/Editor/Field.js", + "../../../../sdkjs/word/Editor/FieldChanges.js", "../../../../sdkjs/word/Editor/Run.js", + "../../../../sdkjs/word/Editor/RunChanges.js", "../../../../sdkjs/word/Math/mathTypes.js", "../../../../sdkjs/word/Math/mathText.js", "../../../../sdkjs/word/Math/mathContent.js", @@ -134,8 +152,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/Paragraph_Recalculate.js", "../../../../sdkjs/word/Editor/HeaderFooter.js", "../../../../sdkjs/word/Editor/Math.js", + "../../../../sdkjs/word/Editor/MathChanges.js", "../../../../sdkjs/word/Editor/Spelling.js", "../../../../sdkjs/word/Editor/Footnotes.js", + "../../../../sdkjs/word/Editor/FootnotesChanges.js", "../../../../sdkjs/word/Editor/FootEndNote.js", "../../../../sdkjs/word/Editor/Search.js", "../../../../sdkjs/word/Editor/FontClassification.js", diff --git a/apps/spreadsheeteditor/sdk_dev_scripts.js b/apps/spreadsheeteditor/sdk_dev_scripts.js index b290dad2c..56246072f 100644 --- a/apps/spreadsheeteditor/sdk_dev_scripts.js +++ b/apps/spreadsheeteditor/sdk_dev_scripts.js @@ -8,6 +8,9 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", + "../../../../sdkjs/common/HistoryCommon.js", + "../../../../sdkjs/common/TableId.js", + "../../../../sdkjs/common/TableIdChanges.js", "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", @@ -25,7 +28,6 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Hit.js", "../../../../sdkjs/common/Drawings/ArcTo.js", "../../../../sdkjs/common/Drawings/ColorArray.js", - "../../../../sdkjs/common/Drawings/Format/Constants.js", "../../../../sdkjs/common/Drawings/CommonController.js", "../../../../sdkjs/common/Drawings/States.js", "../../../../sdkjs/common/Drawings/Format/CreateGeometry.js", @@ -114,12 +116,21 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/cell/Private/comments.js", "../../../../sdkjs/word/Editor/Common.js", "../../../../sdkjs/word/Editor/Comments.js", + "../../../../sdkjs/word/Editor/CommentsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", + "../../../../sdkjs/word/Editor/StylesChanges.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawing.js", + "../../../../sdkjs/word/Editor/Paragraph/ParaDrawingChanges.js", "../../../../sdkjs/word/Editor/Paragraph.js", + "../../../../sdkjs/word/Editor/ParagraphChanges.js", "../../../../sdkjs/word/Editor/DocumentContentBase.js", "../../../../sdkjs/word/Editor/Document.js", + "../../../../sdkjs/word/Editor/DocumentChanges.js", "../../../../sdkjs/word/Editor/DocumentContent.js", + "../../../../sdkjs/word/Editor/DocumentContentChanges.js", "../../../../sdkjs/word/Editor/DocumentControllerBase.js", "../../../../sdkjs/word/Editor/LogicDocumentController.js", "../../../../sdkjs/word/Editor/DrawingsController.js", @@ -127,22 +138,32 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/FlowObjects.js", "../../../../sdkjs/word/Editor/ParagraphContentBase.js", "../../../../sdkjs/word/Editor/Hyperlink.js", + "../../../../sdkjs/word/Editor/HyperlinkChanges.js", "../../../../sdkjs/word/Editor/Field.js", + "../../../../sdkjs/word/Editor/FieldChanges.js", "../../../../sdkjs/word/Editor/Run.js", + "../../../../sdkjs/word/Editor/RunChanges.js", "../../../../sdkjs/word/Editor/Math.js", + "../../../../sdkjs/word/Editor/MathChanges.js", "../../../../sdkjs/word/Editor/Paragraph_Recalculate.js", "../../../../sdkjs/word/Editor/Sections.js", + "../../../../sdkjs/word/Editor/SectionsChanges.js", "../../../../sdkjs/word/Editor/Numbering.js", + "../../../../sdkjs/word/Editor/NumberingChanges.js", "../../../../sdkjs/word/Editor/HeaderFooter.js", "../../../../sdkjs/word/Editor/Table.js", + "../../../../sdkjs/word/Editor/Table/TableChanges.js", "../../../../sdkjs/word/Editor/Table/TableRecalculate.js", "../../../../sdkjs/word/Editor/Table/TableDraw.js", "../../../../sdkjs/word/Editor/Table/TableRow.js", + "../../../../sdkjs/word/Editor/Table/TableRowChanges.js", "../../../../sdkjs/word/Editor/Table/TableCell.js", + "../../../../sdkjs/word/Editor/Table/TableCellChanges.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/FontClassification.js", "../../../../sdkjs/word/Editor/Spelling.js", "../../../../sdkjs/word/Editor/Footnotes.js", + "../../../../sdkjs/word/Editor/FootnotesChanges.js", "../../../../sdkjs/word/Editor/FootEndNote.js", "../../../../sdkjs/word/Editor/GraphicObjects/WrapManager.js", "../../../../sdkjs/word/Math/mathTypes.js", From 93cf75ce81bd3866923fb78947f9acdece58dea7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 29 Nov 2016 14:59:05 +0300 Subject: [PATCH 05/42] [SSE] Disable adding formula from the cell editor line only when input text to the cell. --- apps/spreadsheeteditor/main/app/controller/CellEditor.js | 2 ++ apps/spreadsheeteditor/main/app/view/CellEditor.js | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/main/app/controller/CellEditor.js b/apps/spreadsheeteditor/main/app/controller/CellEditor.js index 2147bd64c..27ddf7fbe 100644 --- a/apps/spreadsheeteditor/main/app/controller/CellEditor.js +++ b/apps/spreadsheeteditor/main/app/controller/CellEditor.js @@ -125,6 +125,7 @@ define([ this.api.isCEditorFocused = false; this.editor.cellNameDisabled(false); } + this.editor.$btnfunc.toggleClass('disabled', state == Asc.c_oAscCellEditorState.editText); }, onApiCellSelection: function(info) { @@ -147,6 +148,7 @@ define([ onCellsRange: function(status) { this.editor.cellNameDisabled(status != Asc.c_oAscSelectionDialogType.None); + this.editor.$btnfunc.toggleClass('disabled', status != Asc.c_oAscSelectionDialogType.None); }, onLayoutResize: function(o, r) { diff --git a/apps/spreadsheeteditor/main/app/view/CellEditor.js b/apps/spreadsheeteditor/main/app/view/CellEditor.js index 2e4671261..43f05f074 100644 --- a/apps/spreadsheeteditor/main/app/view/CellEditor.js +++ b/apps/spreadsheeteditor/main/app/view/CellEditor.js @@ -102,7 +102,6 @@ define([ cellNameDisabled: function(disabled){ (disabled) ? this.$cellname.attr('disabled', 'disabled') : this.$cellname.removeAttr('disabled'); - this.$btnfunc.toggleClass('disabled', disabled); this.btnNamedRanges.setDisabled(disabled); }, From 28a4bf62b7d4816c7dacd18703992caa2acc1c1c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 29 Nov 2016 15:01:29 +0300 Subject: [PATCH 06/42] [SSE] Added hints for the table templates. --- apps/spreadsheeteditor/main/app/controller/Toolbar.js | 3 ++- apps/spreadsheeteditor/main/app/view/TableSettings.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 1a8b32f99..e215f313e 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -1385,7 +1385,8 @@ define([ type : item.asc_getType(), imageUrl : item.asc_getImage(), allowSelected : true, - selected : false + selected : false, + tip : item.asc_getDisplayName() }); }); diff --git a/apps/spreadsheeteditor/main/app/view/TableSettings.js b/apps/spreadsheeteditor/main/app/view/TableSettings.js index bafa46c25..99192676a 100644 --- a/apps/spreadsheeteditor/main/app/view/TableSettings.js +++ b/apps/spreadsheeteditor/main/app/view/TableSettings.js @@ -387,7 +387,8 @@ define([ type : template.asc_getType(), imageUrl : template.asc_getImage(), allowSelected : true, - selected : false + selected : false, + tip : template.asc_getDisplayName() }); }); self.cmbTableTemplate.menuPicker.store.add(arr); From 2600efb38c0a51a08ceca2c097d4a8afb2df0572 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 29 Nov 2016 15:48:18 +0300 Subject: [PATCH 07/42] [SSE] Update table templates depending on whether or not a table is selected. Query table templates when theme colors are changed. --- apps/spreadsheeteditor/main/app/controller/Toolbar.js | 11 +++++++++-- apps/spreadsheeteditor/main/app/view/TableSettings.js | 10 +++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index e215f313e..84e898f9a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -272,7 +272,7 @@ define([ setApi: function(api) { this.api = api; - this.api.asc_registerCallback('asc_onInitTablePictures', _.bind(this.onApiInitTableTemplates, this)); + this.api.asc_registerCallback('asc_onSendThemeColors', _.bind(this.onSendThemeColors, this)); this.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(this.onApiInitEditorStyles, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onApiCoAuthoringDisconnect, this, true)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onApiCoAuthoringDisconnect, this)); @@ -1366,14 +1366,21 @@ define([ }, onTableTplMenuOpen: function(cmp) { - var scroller = this.toolbar.mnuTableTemplatePicker.scroller; + this.onApiInitTableTemplates(this.api.asc_getTablePictures(this.api.asc_getCellInfo().asc_getFormatTableInfo())); + var scroller = this.toolbar.mnuTableTemplatePicker.scroller; if (scroller) { scroller.update({alwaysVisibleY: true}); scroller.scrollTop(0); } }, + onSendThemeColors: function() { + // get new table templates + if (this.toolbar.btnTableTemplate.rendered && this.toolbar.btnTableTemplate.cmpEl.hasClass('open')) + this.onTableTplMenuOpen(); + }, + onApiInitTableTemplates: function(images) { var store = this.getCollection('TableTemplates'); if (store) { diff --git a/apps/spreadsheeteditor/main/app/view/TableSettings.js b/apps/spreadsheeteditor/main/app/view/TableSettings.js index 99192676a..355b471d0 100644 --- a/apps/spreadsheeteditor/main/app/view/TableSettings.js +++ b/apps/spreadsheeteditor/main/app/view/TableSettings.js @@ -140,7 +140,7 @@ define([ setApi: function(o) { this.api = o; if (o) { - this.api.asc_registerCallback('asc_onInitTablePictures', _.bind(this.onApiInitTableTemplates, this)); + this.api.asc_registerCallback('asc_onSendThemeColors', _.bind(this.onSendThemeColors, this)); } return this; }, @@ -347,6 +347,14 @@ define([ } }, + onSendThemeColors: function() { + // get new table templates + if (this.cmbTableTemplate) { + this.onApiInitTableTemplates(this.api.asc_getTablePictures(this._originalProps)); + this.cmbTableTemplate.menuPicker.scroller.update({alwaysVisibleY: true}); + } + }, + onApiInitTableTemplates: function(Templates){ var self = this; this._isTemplatesChanged = true; From 2d7f7737b717ce93e0605a1e077bde86f999d5ee Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 30 Nov 2016 17:08:26 +0300 Subject: [PATCH 08/42] [SSE] Added data and location ranges for sparklines. --- .../app/template/ChartSettingsDlg.template | 58 +++++++++---------- .../main/app/view/ChartSettingsDlg.js | 10 +++- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/template/ChartSettingsDlg.template b/apps/spreadsheeteditor/main/app/template/ChartSettingsDlg.template index f005dc48c..e694f2ce4 100644 --- a/apps/spreadsheeteditor/main/app/template/ChartSettingsDlg.template +++ b/apps/spreadsheeteditor/main/app/template/ChartSettingsDlg.template @@ -335,35 +335,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + ', '', - '', - '', - '', '', '', '', '', '', '', @@ -99,14 +99,20 @@ define([ '', '', '', - '', '', + '', + '', + '', '', '', '', '', @@ -212,6 +218,18 @@ define([ }); this.cmbNumbering.setValue(Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous); + this.txtCustom = new Common.UI.InputField({ + el : $('#note-settings-txt-custom'), + allowBlank : true, + validateOnChange: true, + validateOnBlur: false, + style : 'width: 100px; vertical-align: middle;', + value : '' + }).on ('changing', function (input, value) { + me.cmbFormat.setDisabled(value.length>0); + me.spnStart.setDisabled(value.length>0); + }); + this.cmbApply = new Common.UI.ComboBox({ el: $('#note-settings-combo-apply'), cls: 'input-group-nr', @@ -253,6 +271,11 @@ define([ this.cmbNumbering.setValue(val); /* + val = props.get_Custom(); + this.txtCustom.setValue(val); + this.cmbFormat.setDisabled(!_.isEmpty(val)); + this.spnStart.setDisabled(!_.isEmpty(val)); + val = props.get_ApplyTo(); this.cmbApply.setValue(val); */ @@ -265,13 +288,17 @@ define([ props.put_Pos(this.cmbFootnote.getValue()); props.put_NumRestart(this.cmbNumbering.getValue()); - var val = this.cmbFormat.getValue(); - - props.put_NumFormat(val); - // if (val==1) + var val = this.txtCustom.getValue(); + if (_.isEmpty(val)) { + val = this.cmbFormat.getValue(); + props.put_NumFormat(val); + // if (val==1) props.put_NumStart(this.spnStart.getNumberValue()); - // else - // props.put_NumStart(this.txtStart.getValue()); + // else + // props.put_NumStart(this.txtStart.getValue()); + } else { + // props.set_Custom(val); + } // props.put_ApplyTo(this.cmbApply.getValue()); @@ -368,7 +395,8 @@ define([ textSection: 'Current section', textApply: 'Apply', textInsert: 'Insert', - textCancel: 'Cancel' + textCancel: 'Cancel', + textCustom: 'Custom Mark' }, DE.Views.NoteSettingsDialog || {})) }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index ac70b561f..48e35c562 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1298,7 +1298,6 @@ define([ new Common.UI.Menu({ items: [ { caption: this.mniInsFootnote, value: 'ins_footnote' }, - { caption: this.mniDelFootnote, value: 'delele' }, { caption: '--' }, this.mnuGotoFootnote = new Common.UI.MenuItem({ template: _.template([ @@ -1314,6 +1313,7 @@ define([ stopPropagation: true }), { caption: '--' }, + { caption: this.mniDelFootnote, value: 'delele' }, { caption: this.mniNoteSettings, value: 'settings' } ] }) diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 44f996cd9..9acef8bfc 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -302,6 +302,7 @@ "DE.Controllers.Statusbar.textTrackChanges": "The document is opened with the Track Changes mode enabled", "DE.Controllers.Statusbar.zoomText": "Zoom {0}%", "DE.Controllers.Toolbar.confirmAddFontName": "The font you are going to save is not available on the current device.
The text style will be displayed using one of the system fonts, the saved font will be used when it is available.
Do you want to continue?", + "DE.Controllers.Toolbar.confirmDeleteFootnotes": "Do you want to delete all footnotes?", "DE.Controllers.Toolbar.notcriticalErrorTitle": "Warning", "DE.Controllers.Toolbar.textAccent": "Accents", "DE.Controllers.Toolbar.textBracket": "Brackets", @@ -1133,6 +1134,7 @@ "DE.Views.NoteSettingsDialog.textApply": "Apply", "DE.Views.NoteSettingsDialog.textInsert": "Insert", "DE.Views.NoteSettingsDialog.textCancel": "Cancel", + "DE.Views.NoteSettingsDialog.textCustom": "Custom Mark", "DE.Views.PageMarginsDialog.cancelButtonText": "Cancel", "DE.Views.PageMarginsDialog.notcriticalErrorTitle": "Warning", "DE.Views.PageMarginsDialog.okButtonText": "Ok", From 59a8fb5867d17295050d057610cc4fe79e8ea30b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 21 Dec 2016 12:13:33 +0300 Subject: [PATCH 26/42] [DE] get_PropertyThemeColorSchemes -> asc_onSendThemeColorSchemes. --- apps/documenteditor/main/app/view/Toolbar.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 48e35c562..691640944 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1089,10 +1089,6 @@ define([ createDelayedElements: function() { if (this.api) { - var schemes = this.api.get_PropertyThemeColorSchemes(); - if (schemes) - this.onSendThemeColorSchemes(schemes); - this.mnuNonPrinting.items[0].setChecked(this.api.get_ShowParaMarks(), true); this.mnuNonPrinting.items[1].setChecked(this.api.get_ShowTableEmptyLine(), true); this.btnShowHidenChars.toggle(this.mnuNonPrinting.items[0].checked, true); @@ -1501,6 +1497,7 @@ define([ setApi: function(api) { this.api = api; /** coauthoring begin **/ + this.api.asc_registerCallback('asc_onSendThemeColorSchemes', _.bind(this.onSendThemeColorSchemes, this)); this.api.asc_registerCallback('asc_onCollaborativeChanges', _.bind(this.onCollaborativeChanges, this)); this.api.asc_registerCallback('asc_onAuthParticipantsChanged', _.bind(this.onApiUsersChanged, this)); this.api.asc_registerCallback('asc_onParticipantsChanged', _.bind(this.onApiUsersChanged, this)); From c490430580644cd31946464eadced09d284fde02 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 21 Dec 2016 15:40:22 +0300 Subject: [PATCH 27/42] [DE] Note settings: support start position in different formats. --- .../main/lib/component/MetricSpinner.js | 36 +++- .../main/app/view/NoteSettingsDialog.js | 172 +++++++++++------- 2 files changed, 141 insertions(+), 67 deletions(-) diff --git a/apps/common/main/lib/component/MetricSpinner.js b/apps/common/main/lib/component/MetricSpinner.js index 8611da192..5b2a1584e 100644 --- a/apps/common/main/lib/component/MetricSpinner.js +++ b/apps/common/main/lib/component/MetricSpinner.js @@ -244,6 +244,10 @@ define([ if (this.$input) this.$input.val(value); }, + getRawValue: function () { + return this.$input.val(); + }, + setValue: function(value, suspendchange) { var showError = false; this._fromKeyDown = false; @@ -290,6 +294,10 @@ define([ } }, + setMask: function(value) { + this.options.maskExp = value; + }, + onMouseDown: function (type, e) { if ( this.disabled ) return; @@ -336,7 +344,7 @@ define([ } } else if (e.keyCode==Common.UI.Keys.RETURN) { if (this.options.defaultUnit && this.options.defaultUnit.length) { - var value = this.$input.val(); + var value = this.getRawValue(); if (this.value != value) { this.onEnterValue(); return false; @@ -384,7 +392,7 @@ define([ onEnterValue: function() { if (this.$input) { - var val = this.$input.val(); + var val = this.getRawValue(); this.setValue((val==='') ? this.value : val ); this.trigger('entervalue', this); } @@ -392,7 +400,7 @@ define([ onBlur: function(e){ if (this.$input) { - var val = this.$input.val(); + var val = this.getRawValue(); this.setValue((val==='') ? this.value : val ); if (this.options.hold && this.switches.fromKeyDown) this._stopSpin(); @@ -430,7 +438,7 @@ define([ if (!me.readOnly) { var val = me.options.step; if (me._fromKeyDown) { - val = this.$input.val(); + val = this.getRawValue(); val = _.isEmpty(val) ? me.oldValue : parseFloat(val); } else if(me.getValue() !== '') { if (me.options.allowAuto && me.getValue()==me.options.autoText) { @@ -451,7 +459,7 @@ define([ if (!me.readOnly) { var val = me.options.step; if (me._fromKeyDown) { - val = this.$input.val(); + val = this.getRawValue(); val = _.isEmpty(val) ? me.oldValue : parseFloat(val); } else if(me.getValue() !== '') { if (me.options.allowAuto && me.getValue()==me.options.autoText) { @@ -520,4 +528,22 @@ define([ return v_out; } }); + + Common.UI.CustomSpinner = Common.UI.MetricSpinner.extend(_.extend({ + initialize : function(options) { + this.options.toCustomFormat = (options.toCustomFormat) ? options.toCustomFormat : function(value) { return value; }; + this.options.fromCustomFormat = (options.fromCustomFormat) ? options.fromCustomFormat : function(value) { return value; }; + + Common.UI.MetricSpinner.prototype.initialize.call(this, options); + }, + + setRawValue: function (value) { + if (this.$input) this.$input.val(this.options.toCustomFormat(value)); + }, + + getRawValue: function () { + return this.options.fromCustomFormat(this.$input.val()); + } + + }, Common.UI.CustomSpinner || {})); }); diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index 7bbd304b1..089f4fb4d 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -43,7 +43,6 @@ define([ 'common/main/lib/util/utils', 'common/main/lib/component/MetricSpinner', 'common/main/lib/component/ComboBox', - 'common/main/lib/component/InputField', 'common/main/lib/view/AdvancedSettingsWindow' ], function () { 'use strict'; @@ -95,7 +94,6 @@ define([ '', '', '', @@ -177,34 +175,19 @@ define([ this.cmbFormat.setValue(this.FormatType); this.cmbFormat.on('selected', _.bind(this.onFormatSelect, this)); - this.spnStart = new Common.UI.MetricSpinner({ + // this.spnStart = new Common.UI.MetricSpinner({ + this.spnStart = new Common.UI.CustomSpinner({ el: $('#note-settings-spin-start'), step: 1, width: 100, defaultUnit : "", - value: '1', + value: 1, maxValue: 16383, - minValue: 1 + minValue: 1, + allowDecimal: false, + maskExp: /[0-9]/ }); -/* - this.txtStart = new Common.UI.InputField({ - el : $('#note-settings-txt-start'), - allowBlank : true, - validateOnChange: false, - style : 'width: 100px; vertical-align: middle;', - cls : 'masked-field', - maskExp : /[a-z]/, - value : 'a', - visible: false, - validation : function(value) { - if (this.options.maskExp.test(value)) { - } else - me.txtFieldNum.setValue(''); - return true; - } - }); -*/ this.cmbNumbering = new Common.UI.ComboBox({ el: $('#note-settings-combo-numbering'), cls: 'input-group-nr', @@ -260,12 +243,10 @@ define([ val = props.get_NumFormat(); this.cmbFormat.setValue(val); - // this.spnStart.setVisible(val==1); - // this.txtStart.setVisible(val!=1); + this.onFormatSelect(this.cmbFormat, this.cmbFormat.getSelectedRecord()); val = props.get_NumStart(); this.spnStart.setValue(val); - // this.txtStart.setValue(val); val = props.get_NumRestart(); this.cmbNumbering.setValue(val); @@ -320,44 +301,40 @@ define([ }, onFormatSelect: function(combo, record) { - return; + if (!record) return; - this.spnStart.setVisible(record.value == 1); - this.txtStart.setVisible(record.value != 1); + this.spnStart.setMask(record.maskExp); - if (record.value !== 1) - this.txtStart.setMask(record.maskExp); - - var value = 0; - if (this.FormatType == 1) { // from 1,2,3, - this.StartValue = value = this.spnStart.getNumberValue(); - - if (record.value == 4 || record.value == 5) { - value = this._10toA(value); - this.txtStart.setValue((record.value == 5) ? value.toLocaleLowerCase() : value); - } else if (this.FormatType !== record.value) - this.txtStart.setValue(record.defValue); - } else if (this.FormatType == 4 || this.FormatType == 5) { - if (this.FormatType == 4 && record.value == 5) - this.txtStart.setValue(this.txtStart.getValue().toLocaleLowerCase()); - else if (this.FormatType == 5 && record.value == 4) - this.txtStart.setValue(this.txtStart.getValue().toLocaleUpperCase()); - else if (record.value == 1) { - value = this._Ato10((record.value == 5) ? this.txtStart.getValue().toLocaleLowerCase() : this.txtStart.getValue()); - this.spnStart.setValue(value); - } else if (this.FormatType !== record.value) - this.txtStart.setValue(record.defValue); - } else if (this.FormatType !== record.value){ - if (record.value==1) - this.spnStart.setValue(this.StartValue); - else - this.txtStart.setValue(record.defValue); + var me = this; + switch (record.value) { + case 3: // I, II, III, ... + this.spnStart.options.toCustomFormat = this._10toRome; + this.spnStart.options.fromCustomFormat = this._Rometo10; + break; + case 7: // i, ii, iii, ... + this.spnStart.options.toCustomFormat = function(value) { return me._10toRome(value).toLocaleLowerCase(); }; + this.spnStart.options.fromCustomFormat = function(value) { return me._Rometo10(value.toLocaleUpperCase()); }; + break; + case 4: // A, B, C, ... + this.spnStart.options.toCustomFormat = this._10toS; + this.spnStart.options.fromCustomFormat = this._Sto10; + break; + case 5: // a, b, c, ... + this.spnStart.options.toCustomFormat = function(value) { return me._10toS(value).toLocaleLowerCase(); }; + this.spnStart.options.fromCustomFormat = function(value) { return me._Sto10(value.toLocaleUpperCase()); }; + break; + default: // 1, 2, 3, ... + this.spnStart.options.toCustomFormat = function(value) { return value; }; + this.spnStart.options.fromCustomFormat = function(value) { return value; }; + break; } + this.spnStart.setValue(this.spnStart.getValue()); this.FormatType = record.value; }, - _10toA: function(value) { + _10toS: function(value) { + value = parseInt(value); var n = Math.ceil(value / 26), code = String.fromCharCode((value-1) % 26 + "A".charCodeAt(0)) , result = ''; @@ -368,14 +345,85 @@ define([ return result; }, - _Ato10: function(str) { - if ( (new RegExp('[^' + str.charAt(0) + ']')).test(str) ) return 1; + _Sto10: function(str) { + if ( str.length<1 || (new RegExp('[^' + str.charAt(0) + ']')).test(str) || !/[A-Z]/.test(str)) return 1; var n = str.length-1, - value = str.charCodeAt(0) - "A".charCodeAt(0) + 1; - value += 26*n; + result = str.charCodeAt(0) - "A".charCodeAt(0) + 1; + result += 26*n; - return value; + return result; + }, + + _10toRome: function(value) { + value = parseInt(value); + var result = '', + digits = [ + ['M', 1000], + ['CM', 900], + ['D', 500], + ['CD', 400], + ['C', 100], + ['XC', 90], + ['L', 50], + ['XL', 40], + ['X', 10], + ['IX', 9], + ['V', 5], + ['IV', 4], + ['I', 1] + ]; + + var val = digits[0][1], + div = Math.floor(value / val), + n = 0; + + for (var i=0; i0) { + val = digits[n][1]; + div = value - val; + if (div>=0) { + result += digits[n][0]; + value = div; + } else + n++; + } + + return result; + }, + + _Rometo10: function(str) { + if ( !/[IVXLCDM]/.test(str) || str.length<1 ) return 1; + + var digits = { + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000 + }; + + var n = str.length-1, + result = digits[str.charAt(n)], + prev = result; + + for (var i=n-1; i>=0; i-- ) { + var val = digits[str.charAt(i)]; + if (val10) return 1; + val *= -1; + } + + result += val; + } + + return result; }, textTitle: 'Notes Settings', From 2387729e0cd4d4d6244ffede123c1ad6b3530b90 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 21 Dec 2016 17:01:03 +0300 Subject: [PATCH 28/42] add script --- apps/spreadsheeteditor/sdk_dev_scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/spreadsheeteditor/sdk_dev_scripts.js b/apps/spreadsheeteditor/sdk_dev_scripts.js index d0f471fbf..258055eb2 100644 --- a/apps/spreadsheeteditor/sdk_dev_scripts.js +++ b/apps/spreadsheeteditor/sdk_dev_scripts.js @@ -64,6 +64,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/HatchPattern.js", "../../../../sdkjs/common/scroll.js", "../../../../sdkjs/common/Scrolls/iscroll.js", + "../../../../sdkjs/common/Scrolls/mobileTouchManagerBase.js", "../../../../sdkjs/common/wordcopypaste.js", "../../../../sdkjs/cell/apiDefines.js", "../../../../sdkjs/cell/document/empty-workbook.js", From 857d1ff790dde88862604644e2541af224aca28b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 22 Dec 2016 14:14:15 +0300 Subject: [PATCH 29/42] [DE] Remove all footnotes. --- apps/documenteditor/main/app/controller/Toolbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index c9fddd361..38b1e7278 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2002,7 +2002,7 @@ define([ primary: 'yes', callback: _.bind(function(btn) { if (btn == 'yes') { - this.api.deleteFootnotes(); + this.api.asc_RemoveAllFootnotes(); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, this) From 4178a2ee57a8e3d2d65877b62725635cb44495b3 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 23 Dec 2016 11:51:32 +0300 Subject: [PATCH 30/42] [SSE] Update translations. --- apps/spreadsheeteditor/main/locale/en.json | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index f03932323..cc71ba0be 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -741,6 +741,18 @@ "SSE.Views.ChartSettings.textLineSpark": "Line", "SSE.Views.ChartSettings.textColumnSpark": "Column", "SSE.Views.ChartSettings.textWinLossSpark": "Win/Loss", + "SSE.Views.ChartSettings.strSparkColor": "Color", + "SSE.Views.ChartSettings.strLineWeight": "Line Weight", + "SSE.Views.ChartSettings.textMarkers": "Markers", + "SSE.Views.ChartSettings.textNewColor": "Add New Custom Color", + "SSE.Views.ChartSettings.textHighPoint": "High Point", + "SSE.Views.ChartSettings.textLowPoint": "Low Point", + "SSE.Views.ChartSettings.textNegativePoint": "Negative Point", + "SSE.Views.ChartSettings.textFirstPoint": "First Point", + "SSE.Views.ChartSettings.textLastPoint": "Last Point", + "SSE.Views.ChartSettings.strTemplate": "Template", + "SSE.Views.ChartSettings.textShow": "Show", + "SSE.Views.ChartSettings.textBorderSizeErr": "The entered value is incorrect.
Please enter a value between 0 pt and 1584 pt.", "SSE.Views.ChartSettingsDlg.cancelButtonText": "Cancel", "SSE.Views.ChartSettingsDlg.errorMaxRows": "ERROR! The maximum number of data series per chart is 255", "SSE.Views.ChartSettingsDlg.errorStockChart": "Incorrect row order. To build a stock chart place the data on the sheet in the following order:
opening price, max price, min price, closing price.", @@ -855,6 +867,21 @@ "SSE.Views.ChartSettingsDlg.textLineSpark": "Line", "SSE.Views.ChartSettingsDlg.textColumnSpark": "Column", "SSE.Views.ChartSettingsDlg.textWinLossSpark": "Win/Loss", + "SSE.Views.ChartSettingsDlg.textSparkRanges": "Sparkline Ranges", + "SSE.Views.ChartSettingsDlg.textLocationRange": "Location Range", + "SSE.Views.ChartSettingsDlg.textEmptyCells": "Hidden and Empty cells", + "SSE.Views.ChartSettingsDlg.textShowEmptyCells": "Show empty cells as", + "SSE.Views.ChartSettingsDlg.textShowData": "Show data in hidden rows and columns", + "SSE.Views.ChartSettingsDlg.textGroup": "Group Sparkline", + "SSE.Views.ChartSettingsDlg.textSingle": "Single Sparkline", + "SSE.Views.ChartSettingsDlg.textGaps": "Gaps", + "SSE.Views.ChartSettingsDlg.textZero": "Zero", + "SSE.Views.ChartSettingsDlg.textEmptyLine": "Connect data points with line", + "SSE.Views.ChartSettingsDlg.textShowSparkAxis": "Show Axis", + "SSE.Views.ChartSettingsDlg.textReverseOrder": "Reverse order", + "SSE.Views.ChartSettingsDlg.textAutoEach": "Auto for Each", + "SSE.Views.ChartSettingsDlg.textSameAll": "Same for All", + "SSE.Views.ChartSettingsDlg.textTitleSparkline": "Sparkline - Advanced Settings", "SSE.Views.DigitalFilterDialog.cancelButtonText": "Cancel", "SSE.Views.DigitalFilterDialog.capAnd": "And", "SSE.Views.DigitalFilterDialog.capCondition1": "equals", From 705677a3e1492352264be697abe26c700c115d33 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 23 Dec 2016 13:03:08 +0300 Subject: [PATCH 31/42] [SSE] Update hints for inserting and editing chart/sparklines buttons. [Common] Fix updating hints for buttons. --- apps/common/main/lib/component/Button.js | 4 +++- apps/spreadsheeteditor/main/app/controller/RightMenu.js | 2 ++ apps/spreadsheeteditor/main/app/view/RightMenu.js | 1 + apps/spreadsheeteditor/main/app/view/Toolbar.js | 5 +++-- apps/spreadsheeteditor/main/locale/en.json | 2 ++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 7c52029dd..61968da31 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -467,8 +467,10 @@ define([ var cmpEl = this.cmpEl, modalParents = cmpEl.closest('.asc-window'); + if (cmpEl.data('bs.tooltip')) + cmpEl.removeData('bs.tooltip'); cmpEl.attr('data-toggle', 'tooltip'); - cmpEl.tooltip('destroy').tooltip({ + cmpEl.tooltip({ title : hint, placement : this.options.hintAnchor || 'cursor' }); diff --git a/apps/spreadsheeteditor/main/app/controller/RightMenu.js b/apps/spreadsheeteditor/main/app/controller/RightMenu.js index 403f6f009..a004411b9 100644 --- a/apps/spreadsheeteditor/main/app/controller/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/RightMenu.js @@ -150,6 +150,7 @@ define([ if (settingsType == Common.Utils.documentSettingsType.Image) { if (value.asc_getChartProperties() !== null) { settingsType = Common.Utils.documentSettingsType.Chart; + this._settings[settingsType].btn.updateHint(this.rightmenu.txtChartSettings); } else if (value.asc_getShapeProperties() !== null) { settingsType = Common.Utils.documentSettingsType.Shape; if (value.asc_getShapeProperties().asc_getTextArtProperties()) { @@ -177,6 +178,7 @@ define([ this._settings[settingsType].props = sparkLineInfo; this._settings[settingsType].locked = isSparkLocked; this._settings[settingsType].hidden = 0; + this._settings[settingsType].btn.updateHint(this.rightmenu.txtSparklineSettings); } var lastactive = -1, currentactive, priorityactive = -1, diff --git a/apps/spreadsheeteditor/main/app/view/RightMenu.js b/apps/spreadsheeteditor/main/app/view/RightMenu.js index 14cdd13ed..ce4c6d5d2 100644 --- a/apps/spreadsheeteditor/main/app/view/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/view/RightMenu.js @@ -255,6 +255,7 @@ define([ txtShapeSettings: 'Shape Settings', txtTextArtSettings: 'Text Art Settings', txtChartSettings: 'Chart Settings', + txtSparklineSettings: 'Sparkline Settings', txtTableSettings: 'Table Settings' }, SSE.Views.RightMenu || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 998503ac3..fd6b26c71 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1284,7 +1284,7 @@ define([ this.btnWrap.updateHint(this.tipWrap); this.btnTextOrient.updateHint(this.tipTextOrientation); this.btnInsertImage.updateHint(this.tipInsertImage); - this.btnInsertChart.updateHint(this.tipInsertChart); + this.btnInsertChart.updateHint(this.tipInsertChartSpark); this.btnInsertText.updateHint(this.tipInsertText); this.btnInsertHyperlink.updateHint(this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); this.btnInsertShape.updateHint(this.tipInsertShape); @@ -2102,6 +2102,7 @@ define([ textWinLossSpark: 'Win/Loss', tipInsertEquation: 'Insert Equation', textCharts: 'Charts', - textSparks: 'Sparklines' + textSparks: 'Sparklines', + tipInsertChartSpark: 'Insert Chart or Sparkline' }, SSE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index cc71ba0be..5c9560616 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1252,6 +1252,7 @@ "SSE.Views.RightMenu.txtParagraphSettings": "Text Settings", "SSE.Views.RightMenu.txtSettings": "Common Settings", "SSE.Views.RightMenu.txtShapeSettings": "Shape Settings", + "SSE.Views.RightMenu.txtSparklineSettings": "Sparkline Settings", "SSE.Views.RightMenu.txtTableSettings": "Table Settings", "SSE.Views.RightMenu.txtTextArtSettings": "Text Art Settings", "SSE.Views.SetValueDialog.cancelButtonText": "Cancel", @@ -1536,6 +1537,7 @@ "SSE.Views.Toolbar.tipInsertOpt": "Insert Cells", "SSE.Views.Toolbar.tipInsertShape": "Insert Autoshape", "SSE.Views.Toolbar.tipInsertText": "Insert Text", + "SSE.Views.Toolbar.tipInsertChartSpark": "Insert Chart or Sparkline", "SSE.Views.Toolbar.tipMerge": "Merge", "SSE.Views.Toolbar.tipNewDocument": "New Document", "SSE.Views.Toolbar.tipNumFormat": "Number Format", From 265bf5084dd4549099aa916fedc8ad78dffb6c4a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 23 Dec 2016 13:07:07 +0300 Subject: [PATCH 32/42] [DE] Fix bug with review changes panel (it was over dropdown menu in the right panel). --- apps/common/main/resources/less/review-changes.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/main/resources/less/review-changes.less b/apps/common/main/resources/less/review-changes.less index 68c96b186..f4f5da96c 100644 --- a/apps/common/main/resources/less/review-changes.less +++ b/apps/common/main/resources/less/review-changes.less @@ -5,7 +5,7 @@ background: @gray-light; border: 1px solid @gray-dark; height: 35px; - z-index: 1000; + z-index: @zindex-dropdown - 1; .review-group { display: inline-block; From e1049695fc4bee5c2055a93f467c4ab56ece0b64 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 23 Dec 2016 15:29:16 +0300 Subject: [PATCH 33/42] [DE] Update note settings. --- .../main/app/controller/Toolbar.js | 4 +- .../main/app/template/Toolbar.template | 9 +-- .../main/app/view/NoteSettingsDialog.js | 62 ++++++++---------- .../main/resources/img/toolbar-menu.png | Bin 17160 -> 24063 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 42897 -> 55989 bytes .../main/resources/less/toolbar.less | 2 +- 6 files changed, 34 insertions(+), 43 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 38b1e7278..cb747531e 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2033,14 +2033,14 @@ define([ onFootnotePrevClick: function(btn) { if (this.api) - this.api.GotoFootnotePrev(); + this.api.asc_GotoFootnote(false); Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onFootnoteNextClick: function(btn) { if (this.api) - this.api.GotoFootnoteNext(); + this.api.asc_GotoFootnote(true); Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index 3b6e4cbcd..6a71a0ac4 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -153,6 +153,7 @@ +
@@ -160,7 +161,7 @@ - +
@@ -191,12 +192,6 @@ -
-
-
- -
-
diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index 089f4fb4d..f32005b37 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -59,66 +59,62 @@ define([ title: this.textTitle, template: [ '
', - '
', + '
', '
', - '
+ +
+
+
+ +
+ +
+
+
+ +
diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js index f3ed54337..142f74bba 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js @@ -840,7 +840,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' labelText: this.textSingle, name: 'asc-radio-sparkline' }); - + */ this.txtSparkDataRange = new Common.UI.InputField({ el : $('#spark-dlg-txt-range'), name : 'range', @@ -868,7 +868,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' el: $('#spark-dlg-btn-data') }); // this.btnSelectLocationData.on('click', _.bind(this.onSelectData, this)); - */ + this._arrEmptyCells = [ { value: Asc.c_oAscEDispBlanksAs.Gap, displayValue: this.textGaps }, @@ -1373,6 +1373,12 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' this.spnSparkMinValue.setValue((props.asc_getManualMin() !== null) ? props.asc_getManualMin() : '', true); this.spnSparkMaxValue.setValue((props.asc_getManualMax() !== null) ? props.asc_getManualMax() : '', true); + var value = props.asc_getDataRanges(); + if (value && value.length==2) { + this.txtSparkDataRange.setValue((value[0]) ? value[0] : ''); + this.txtSparkDataLocation.setValue((value[1]) ? value[1] : ''); + } + this._changedProps = new Asc.sparklineGroup(); this._noApply = false; } From 641a4962e84c63bc97bbafbd077298d91b019259 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 30 Nov 2016 18:00:23 +0300 Subject: [PATCH 09/42] change scripts list --- apps/spreadsheeteditor/sdk_dev_scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/sdk_dev_scripts.js b/apps/spreadsheeteditor/sdk_dev_scripts.js index 56246072f..d0f471fbf 100644 --- a/apps/spreadsheeteditor/sdk_dev_scripts.js +++ b/apps/spreadsheeteditor/sdk_dev_scripts.js @@ -63,7 +63,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Overlay.js", "../../../../sdkjs/common/Drawings/HatchPattern.js", "../../../../sdkjs/common/scroll.js", - "../../../../sdkjs/cell/view/iscroll.js", + "../../../../sdkjs/common/Scrolls/iscroll.js", "../../../../sdkjs/common/wordcopypaste.js", "../../../../sdkjs/cell/apiDefines.js", "../../../../sdkjs/cell/document/empty-workbook.js", From 6f83abb8ee8a8d6a129a4ad7ded63e56caf691aa Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Tue, 6 Dec 2016 14:32:37 +0300 Subject: [PATCH 10/42] refactoring mobile (web) --- apps/documenteditor/sdk_dev_scripts.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index eb9739e1f..9d88f2f9a 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -67,6 +67,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/HatchPattern.js", "../../../../sdkjs/common/scroll.js", "../../../../sdkjs/common/Scrolls/iscroll.js", + "../../../../sdkjs/common/Scrolls/mobileTouchManagerBase.js", "../../../../sdkjs/common/wordcopypaste.js", "../../../../sdkjs/word/apiDefines.js", "../../../../sdkjs/cell/utils/utils.js", @@ -143,6 +144,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Drawing/Rulers.js", "../../../../sdkjs/word/Drawing/HtmlPage.js", "../../../../sdkjs/word/Drawing/documentrenderer.js", + "../../../../sdkjs/word/Drawing/mobileTouchManager.js", "../../../../sdkjs/word/apiCommon.js", "../../../../sdkjs/common/apiBase.js", "../../../../sdkjs/word/api.js", From 747d24cbd71b22e36f6dbe8c3f56be4fa5601c85 Mon Sep 17 00:00:00 2001 From: Pavel Lobashov Date: Wed, 7 Dec 2016 13:00:05 +0300 Subject: [PATCH 11/42] update about.js for 4.3 --- apps/common/main/lib/view/About.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/About.js b/apps/common/main/lib/view/About.js index 29e0789ac..c79cc8f55 100644 --- a/apps/common/main/lib/view/About.js +++ b/apps/common/main/lib/view/About.js @@ -52,7 +52,7 @@ define([ initialize: function(options) { Common.UI.BaseView.prototype.initialize.call(this,arguments); - this.txtVersionNum = '4.2'; + this.txtVersionNum = '4.3'; this.txtAscMail = 'support@onlyoffice.com'; this.txtAscTelNum = '+371 660-16425'; this.txtAscUrl = 'www.onlyoffice.com'; From bad28bbe332e81fda061b77d68b3ac613ae5d6fc Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 7 Dec 2016 13:54:26 +0300 Subject: [PATCH 12/42] Remove zoom correction on mobile devices. --- apps/common/main/lib/util/utils.js | 70 ++++++++++-------------------- 1 file changed, 23 insertions(+), 47 deletions(-) diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 8a18386d4..08d845fdd 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -102,57 +102,33 @@ Common.Utils = _.extend(new(function() { Chart : 7, MailMerge : 8 }, + isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera), me = this, checkSize = function() { me.zoom = 1; - if (isChrome && !isOpera && document && document.firstElementChild && document.body) + if (isChrome && !isOpera && !isMobile && document && document.firstElementChild && document.body) { - if (false) - { - // этот код - рабочий, но только если этот ифрейм открыт на весь размер браузера - // (window.outerWidth и window.innerWidth зависимы) - if (window.innerWidth > 300) - me.zoom = window.outerWidth / window.innerWidth; - - if (Math.abs(me.zoom - 1) < 0.1) - me.zoom = 1; - - me.zoom = window.outerWidth / window.innerWidth; - - var _devicePixelRatio = window.devicePixelRatio / me.zoom; - - // device pixel ratio: кратно 0.5 - _devicePixelRatio = (5 * (((2.5 + 10 * _devicePixelRatio) / 5) >> 0)) / 10; - me.zoom = window.devicePixelRatio / _devicePixelRatio; - - // chrome 54.x: zoom = "reset" - clear retina zoom (windows) - //document.firstElementChild.style.zoom = "reset"; - document.firstElementChild.style.zoom = 1.0 / me.zoom; - } - else - { - // делаем простую проверку - // считаем: 0 < window.devicePixelRatio < 2 => _devicePixelRatio = 1; zoom = window.devicePixelRatio / _devicePixelRatio; - // считаем: window.devicePixelRatio >= 2 => _devicePixelRatio = 2; zoom = window.devicePixelRatio / _devicePixelRatio; - if (window.devicePixelRatio > 0.1) - { - if (window.devicePixelRatio < 1.99) - { - var _devicePixelRatio = 1; - me.zoom = window.devicePixelRatio / _devicePixelRatio; - } - else - { - var _devicePixelRatio = 2; - me.zoom = window.devicePixelRatio / _devicePixelRatio; - } - // chrome 54.x: zoom = "reset" - clear retina zoom (windows) - //document.firstElementChild.style.zoom = "reset"; - document.firstElementChild.style.zoom = 1.0 / me.zoom; - } - else - document.firstElementChild.style.zoom = "normal"; - } + // делаем простую проверку + // считаем: 0 < window.devicePixelRatio < 2 => _devicePixelRatio = 1; zoom = window.devicePixelRatio / _devicePixelRatio; + // считаем: window.devicePixelRatio >= 2 => _devicePixelRatio = 2; zoom = window.devicePixelRatio / _devicePixelRatio; + if (window.devicePixelRatio > 0.1) + { + if (window.devicePixelRatio < 1.99) + { + var _devicePixelRatio = 1; + me.zoom = window.devicePixelRatio / _devicePixelRatio; + } + else + { + var _devicePixelRatio = 2; + me.zoom = window.devicePixelRatio / _devicePixelRatio; + } + // chrome 54.x: zoom = "reset" - clear retina zoom (windows) + //document.firstElementChild.style.zoom = "reset"; + document.firstElementChild.style.zoom = 1.0 / me.zoom; + } + else + document.firstElementChild.style.zoom = "normal"; } me.innerWidth = window.innerWidth * me.zoom; me.innerHeight = window.innerHeight * me.zoom; From 59eb32939a5c5b49d55a6cee3fe6dd9ffcc67424 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Fri, 9 Dec 2016 13:09:45 +0300 Subject: [PATCH 13/42] scripts --- apps/presentationeditor/sdk_dev_scripts.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/presentationeditor/sdk_dev_scripts.js b/apps/presentationeditor/sdk_dev_scripts.js index 29cf9bb73..76168a3a7 100644 --- a/apps/presentationeditor/sdk_dev_scripts.js +++ b/apps/presentationeditor/sdk_dev_scripts.js @@ -171,5 +171,8 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/plugins.js", "../../../../sdkjs/word/apiBuilder.js", "../../../../sdkjs/slide/apiBuilder.js", - "../../../../sdkjs/common/text_input.js" + "../../../../sdkjs/common/text_input.js", + "../../../../sdkjs/common/Scrolls/iscroll.js", + "../../../../sdkjs/common/Scrolls/mobileTouchManagerBase.js", + "../../../../sdkjs/slide/Drawing/mobileTouchManager.js" ]; \ No newline at end of file From 5ea7c5965e08eeb7d91bc065258c0c60c056946b Mon Sep 17 00:00:00 2001 From: Alexey Golubev Date: Tue, 13 Dec 2016 11:45:56 +0300 Subject: [PATCH 14/42] Version up --- apps/api/documents/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index adbc4a6d9..fd79dd7d9 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -557,7 +557,7 @@ }; DocsAPI.DocEditor.version = function() { - return '4.2.0'; + return '4.3.0'; }; MessageDispatcher = function(fn, scope) { From 6c75dbabdeabd9d0f953aac5a1359909317829cf Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 13 Dec 2016 15:33:28 +0300 Subject: [PATCH 15/42] Bug 33646 --- apps/documenteditor/main/app.js | 1 + apps/documenteditor/main/app/view/FileMenu.js | 17 +++++++---------- apps/documenteditor/main/app_dev.js | 1 + apps/presentationeditor/main/app.js | 1 + .../main/app/view/FileMenu.js | 19 ++++++++----------- apps/presentationeditor/main/app_dev.js | 1 + apps/spreadsheeteditor/main/app.js | 1 + .../main/app/view/FileMenu.js | 19 ++++++++----------- apps/spreadsheeteditor/main/app_dev.js | 1 + 9 files changed, 29 insertions(+), 32 deletions(-) diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 40df85e8a..6160cf190 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -178,6 +178,7 @@ require([ 'documenteditor/main/app/controller/RightMenu', 'documenteditor/main/app/controller/LeftMenu', 'documenteditor/main/app/controller/Main', + 'documenteditor/main/app/view/FileMenuPanels', 'documenteditor/main/app/view/ParagraphSettings', 'documenteditor/main/app/view/HeaderFooterSettings', 'documenteditor/main/app/view/ImageSettings', diff --git a/apps/documenteditor/main/app/view/FileMenu.js b/apps/documenteditor/main/app/view/FileMenu.js index d9a6eed04..292dc34c5 100644 --- a/apps/documenteditor/main/app/view/FileMenu.js +++ b/apps/documenteditor/main/app/view/FileMenu.js @@ -178,18 +178,15 @@ define([ ); var me = this; - this.panels = {}; - require(['documenteditor/main/app/view/FileMenuPanels'], function(){ - me.panels = { + me.panels = { // 'saveas' : (new DE.Views.FileMenuPanels.ViewSaveAs({menu:me})).render(), - 'opts' : (new DE.Views.FileMenuPanels.Settings({menu:me})).render(), - 'info' : (new DE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), - 'rights' : (new DE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), - 'help' : (new DE.Views.FileMenuPanels.Help({menu:me})).render() - }; + 'opts' : (new DE.Views.FileMenuPanels.Settings({menu:me})).render(), + 'info' : (new DE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), + 'rights' : (new DE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), + 'help' : (new DE.Views.FileMenuPanels.Help({menu:me})).render() + }; - me.$el.find('.content-box').hide(); - }); + me.$el.find('.content-box').hide(); return this; }, diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index c4a8a9888..92212bc32 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -168,6 +168,7 @@ require([ 'documenteditor/main/app/controller/RightMenu', 'documenteditor/main/app/controller/LeftMenu', 'documenteditor/main/app/controller/Main', + 'documenteditor/main/app/view/FileMenuPanels', 'documenteditor/main/app/view/ParagraphSettings', 'documenteditor/main/app/view/HeaderFooterSettings', 'documenteditor/main/app/view/ImageSettings', diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index f241c26f6..18a13c411 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -172,6 +172,7 @@ require([ 'presentationeditor/main/app/controller/RightMenu', 'presentationeditor/main/app/controller/LeftMenu', 'presentationeditor/main/app/controller/Main', + 'presentationeditor/main/app/view/FileMenuPanels', 'presentationeditor/main/app/view/ParagraphSettings', 'presentationeditor/main/app/view/ImageSettings', 'presentationeditor/main/app/view/ShapeSettings', diff --git a/apps/presentationeditor/main/app/view/FileMenu.js b/apps/presentationeditor/main/app/view/FileMenu.js index da463c62d..39364b3c1 100644 --- a/apps/presentationeditor/main/app/view/FileMenu.js +++ b/apps/presentationeditor/main/app/view/FileMenu.js @@ -175,18 +175,15 @@ define([ ); var me = this; - this.panels = {}; - require(['presentationeditor/main/app/view/FileMenuPanels'], function(){ - me.panels = { - 'saveas' : (new PE.Views.FileMenuPanels.ViewSaveAs({menu:me})).render(), - 'opts' : (new PE.Views.FileMenuPanels.Settings({menu:me})).render(), - 'info' : (new PE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), - 'rights' : (new PE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), - 'help' : (new PE.Views.FileMenuPanels.Help({menu:me})).render() - }; + me.panels = { + 'saveas' : (new PE.Views.FileMenuPanels.ViewSaveAs({menu:me})).render(), + 'opts' : (new PE.Views.FileMenuPanels.Settings({menu:me})).render(), + 'info' : (new PE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), + 'rights' : (new PE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), + 'help' : (new PE.Views.FileMenuPanels.Help({menu:me})).render() + }; - me.$el.find('.content-box').hide(); - }); + me.$el.find('.content-box').hide(); return this; }, diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index d3e8cfecd..1348fc7b5 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -163,6 +163,7 @@ require([ 'presentationeditor/main/app/controller/RightMenu', 'presentationeditor/main/app/controller/LeftMenu', 'presentationeditor/main/app/controller/Main', + 'presentationeditor/main/app/view/FileMenuPanels', 'presentationeditor/main/app/view/ParagraphSettings', 'presentationeditor/main/app/view/ImageSettings', 'presentationeditor/main/app/view/ShapeSettings', diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index b1640b119..70cd97b97 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -174,6 +174,7 @@ require([ 'spreadsheeteditor/main/app/controller/LeftMenu', 'spreadsheeteditor/main/app/controller/Main', 'spreadsheeteditor/main/app/controller/Print', + 'spreadsheeteditor/main/app/view/FileMenuPanels', 'spreadsheeteditor/main/app/view/ParagraphSettings', 'spreadsheeteditor/main/app/view/ImageSettings', 'spreadsheeteditor/main/app/view/ChartSettings', diff --git a/apps/spreadsheeteditor/main/app/view/FileMenu.js b/apps/spreadsheeteditor/main/app/view/FileMenu.js index ff7b248c5..0c58d1bb3 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenu.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenu.js @@ -162,18 +162,15 @@ define([ ); var me = this; - this.panels = {}; - require(['spreadsheeteditor/main/app/view/FileMenuPanels'], function(){ - me.panels = { - 'saveas' : (new SSE.Views.FileMenuPanels.ViewSaveAs({menu:me})).render(), - 'opts' : (new SSE.Views.FileMenuPanels.Settings({menu:me})).render(), - 'info' : (new SSE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), - 'rights' : (new SSE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), - 'help' : (new SSE.Views.FileMenuPanels.Help({menu:me})).render() - }; + me.panels = { + 'saveas' : (new SSE.Views.FileMenuPanels.ViewSaveAs({menu:me})).render(), + 'opts' : (new SSE.Views.FileMenuPanels.Settings({menu:me})).render(), + 'info' : (new SSE.Views.FileMenuPanels.DocumentInfo({menu:me})).render(), + 'rights' : (new SSE.Views.FileMenuPanels.DocumentRights({menu:me})).render(), + 'help' : (new SSE.Views.FileMenuPanels.Help({menu:me})).render() + }; - me.$el.find('.content-box').hide(); - }); + me.$el.find('.content-box').hide(); return this; }, diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index 74387f0d2..690ac2a92 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -164,6 +164,7 @@ require([ 'spreadsheeteditor/main/app/controller/LeftMenu', 'spreadsheeteditor/main/app/controller/Main', 'spreadsheeteditor/main/app/controller/Print', + 'spreadsheeteditor/main/app/view/FileMenuPanels', 'spreadsheeteditor/main/app/view/ParagraphSettings', 'spreadsheeteditor/main/app/view/ImageSettings', 'spreadsheeteditor/main/app/view/ChartSettings', From d5df1f4302edfece05734ebe7211f121236b5e0c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 13 Dec 2016 15:54:58 +0300 Subject: [PATCH 16/42] [SSE] Select data ranges for sparklines. --- .../main/app/view/CellRangeDialog.js | 6 +- .../main/app/view/ChartSettingsDlg.js | 87 +++++++++++++++++-- 2 files changed, 85 insertions(+), 8 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js index 9654c6ce7..66babb558 100644 --- a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js +++ b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js @@ -112,17 +112,17 @@ define([ if (settings.api) { me.api = settings.api; - me.api.asc_setSelectionDialogMode(Asc.c_oAscSelectionDialogType.Chart, settings.range ? settings.range : ''); + me.api.asc_setSelectionDialogMode(settings.type, settings.range ? settings.range : ''); me.api.asc_unregisterCallback('asc_onSelectionRangeChanged', _.bind(me.onApiRangeChanged, me)); me.api.asc_registerCallback('asc_onSelectionRangeChanged', _.bind(me.onApiRangeChanged, me)); - Common.NotificationCenter.trigger('cells:range', Asc.c_oAscSelectionDialogType.Chart); + Common.NotificationCenter.trigger('cells:range', settings.type); } me.inputRange.validation = function(value) { if (settings.validation) { return settings.validation.call(me, value); } else { - var isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, value, false); + var isvalid = me.api.asc_checkDataRange(settings.type, value, false); return (isvalid==Asc.c_oAscError.ID.DataRangeError) ? me.txtInvalidRange : true; } }; diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js index 4a07fbdfa..de23d41bd 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js @@ -94,6 +94,8 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' this.horAxisProps = null; this.currentAxisProps = null; this.dataRangeValid = ''; + this.sparkDataRangeValid = ''; + this.dataLocationRangeValid = ''; this.currentChartType = this._state.ChartType; this.storageName = (this.isChart) ? 'sse-chart-settings-adv-category' : 'sse-spark-settings-adv-category'; }, @@ -853,7 +855,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' this.btnSelectSparkData = new Common.UI.Button({ el: $('#spark-dlg-btn-data') }); -// this.btnSelectSparkData.on('click', _.bind(this.onSelectData, this)); + this.btnSelectSparkData.on('click', _.bind(this.onSelectSparkData, this)); this.txtSparkDataLocation = new Common.UI.InputField({ el : $('#spark-dlg-txt-location'), @@ -865,11 +867,10 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' }); this.btnSelectLocationData = new Common.UI.Button({ - el: $('#spark-dlg-btn-data') + el: $('#spark-dlg-btn-location-data') }); -// this.btnSelectLocationData.on('click', _.bind(this.onSelectData, this)); + this.btnSelectLocationData.on('click', _.bind(this.onSelectLocationData, this)); - this._arrEmptyCells = [ { value: Asc.c_oAscEDispBlanksAs.Gap, displayValue: this.textGaps }, { value: Asc.c_oAscEDispBlanksAs.Zero, displayValue: this.textZero }, @@ -1375,6 +1376,24 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' if (value && value.length==2) { this.txtSparkDataRange.setValue((value[0]) ? value[0] : ''); this.txtSparkDataLocation.setValue((value[1]) ? value[1] : ''); + + this.sparkDataRangeValid = value[0]; + this.txtSparkDataRange.validation = function(value) { + if (_.isEmpty(value)) + return true; + + var isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, value, false); + return (isvalid==Asc.c_oAscError.ID.DataRangeError) ? me.textInvalidRange : true; + }; + + this.dataLocationRangeValid = value[1]; + this.txtSparkDataLocation.validation = function(value) { + if (_.isEmpty(value)) + return true; + + var isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.FormatTable, value, false); + return (isvalid==Asc.c_oAscError.ID.DataRangeError) ? me.textInvalidRange : true; + }; } this._changedProps = new Asc.sparklineGroup(); @@ -1478,7 +1497,8 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' win.setSettings({ api : me.api, isRows : (me.cmbDataDirect.getValue()==0), - range : (!_.isEmpty(me.txtDataRange.getValue()) && (me.txtDataRange.checkValidate()==true)) ? me.txtDataRange.getValue() : me.dataRangeValid + range : (!_.isEmpty(me.txtDataRange.getValue()) && (me.txtDataRange.checkValidate()==true)) ? me.txtDataRange.getValue() : me.dataRangeValid, + type : Asc.c_oAscSelectionDialogType.Chart }); } }, @@ -1495,6 +1515,63 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' } }, + onSelectSparkData: function() { + var me = this; + if (me.api) { + var handlerDlg = function(dlg, result) { + if (result == 'ok') { + me.sparkDataRangeValid = dlg.getSettings(); + me.txtSparkDataRange.setValue(me.sparkDataRangeValid); + me.txtSparkDataRange.checkValidate(); + } + }; + + var win = new SSE.Views.CellRangeDialog({ + handler: handlerDlg + }).on('close', function() { + me.show(); + }); + + var xy = me.$window.offset(); + me.hide(); + win.show(xy.left + 160, xy.top + 125); + win.setSettings({ + api : me.api, + range : (!_.isEmpty(me.txtSparkDataRange.getValue()) && (me.txtSparkDataRange.checkValidate()==true)) ? me.txtSparkDataRange.getValue() : me.sparkDataRangeValid, + type : Asc.c_oAscSelectionDialogType.Chart + }); + } + }, + + + onSelectLocationData: function() { + var me = this; + if (me.api) { + var handlerDlg = function(dlg, result) { + if (result == 'ok') { + me.dataLocationRangeValid = dlg.getSettings(); + me.txtSparkDataLocation.setValue(me.dataLocationRangeValid); + me.txtSparkDataLocation.checkValidate(); + } + }; + + var win = new SSE.Views.CellRangeDialog({ + handler: handlerDlg + }).on('close', function() { + me.show(); + }); + + var xy = me.$window.offset(); + me.hide(); + win.show(xy.left + 160, xy.top + 125); + win.setSettings({ + api : me.api, + range : (!_.isEmpty(me.txtSparkDataLocation.getValue()) && (me.txtSparkDataLocation.checkValidate()==true)) ? me.txtSparkDataLocation.getValue() : me.dataLocationRangeValid, + type : Asc.c_oAscSelectionDialogType.FormatTable + }); + } + }, + show: function() { Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); From 3612a75823bf1e2d6da59b3fe29278a3e0b4e85f Mon Sep 17 00:00:00 2001 From: "Alexander.Trofimov" Date: Wed, 14 Dec 2016 15:23:53 +0300 Subject: [PATCH 17/42] asc_setSheetViewSettings -> asc_setDisplayGridlines + asc_setDisplayHeadings --- apps/spreadsheeteditor/main/app/controller/Toolbar.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 84e898f9a..d79bf0bd3 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -2009,17 +2009,13 @@ define([ if (!_.isUndefined(opts.headings)) { if (this.api) { - var current = this.api.asc_getSheetViewSettings(); - current.asc_setShowRowColHeaders(!opts.headings); - this.api.asc_setSheetViewSettings(current); + this.api.asc_setDisplayHeadings(!opts.headings); } } if (!_.isUndefined(opts.gridlines)) { if (this.api) { - current = this.api.asc_getSheetViewSettings(); - current.asc_setShowGridLines(!opts.gridlines); - this.api.asc_setSheetViewSettings(current); + this.api.asc_setDisplayGridlines(!opts.gridlines); } } From 3fe8ee259f924f7110223ca4a9ba78cc06748a56 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 16 Dec 2016 11:37:57 +0300 Subject: [PATCH 18/42] Changed layout for chart/sparkline type menu. [SSE] Select chart/sparkline type from toolbar. --- apps/common/main/lib/component/DataView.js | 55 +++++------ apps/common/main/resources/less/dataview.less | 14 ++- .../main/app/view/ChartSettings.js | 24 ++--- apps/documenteditor/main/app/view/Toolbar.js | 29 +++--- apps/documenteditor/main/locale/en.json | 29 +++--- .../main/resources/less/leftmenu.less | 2 - .../main/resources/less/toolbar.less | 10 +- .../main/app/view/ChartSettings.js | 24 ++--- .../main/app/view/Toolbar.js | 29 +++--- apps/presentationeditor/main/locale/en.json | 29 +++--- .../main/resources/less/leftmenu.less | 2 - .../main/resources/less/toolbar.less | 10 +- .../main/app/controller/Toolbar.js | 57 +++++------ .../main/app/view/ChartSettings.js | 42 ++++---- .../main/app/view/ChartSettingsDlg.js | 30 +++--- .../main/app/view/Toolbar.js | 97 ++++++------------- apps/spreadsheeteditor/main/locale/en.json | 44 ++++++--- .../main/resources/less/leftmenu.less | 2 - .../main/resources/less/rightmenu.less | 10 +- 19 files changed, 248 insertions(+), 291 deletions(-) diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index b9e68a11f..502c51852 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -84,7 +84,9 @@ define([ defaults: function() { return { id: Common.UI.getId(), - caption: '' + caption: '', + inline: false, + headername: undefined } } }); @@ -190,10 +192,15 @@ define([ template: _.template([ '
', '<% _.each(groups, function(group) { %>', - '
', - '
', - '<%= group.caption %>', - '
', + '<% if (group.headername !== undefined) { %>', + '
<%= group.headername %>
', + '<% } %>', + '
', + '<% if (!_.isEmpty(group.caption)) { %>', + '
', + '<%= group.caption %>', + '
', + '<% } %>', '
', '
', '
', @@ -696,39 +703,29 @@ define([ fillIndexesArray: function() { if (this.dataViewItems.length<=0) return; - var top, left, - el = $(this.dataViewItems[0].el), - itemW = el.outerWidth() + parseInt(el.css('margin-left')) + parseInt(el.css('margin-right')), - itemH = el.outerHeight() + parseInt(el.css('margin-top')) + parseInt(el.css('margin-bottom')), - offsetLeft = this.$el.offset().left, - offsetTop = this.$el.offset().top, - idxOffset = 0; - this._layoutParams = { itemsIndexes: [], columns: 0, rows: 0 }; - if (this.groups && this.groups.length > 0) { - var group_desc = this.cmpEl.find('.group-description:first'); - if (group_desc.length>0) - offsetLeft += group_desc.width(); - } + var el = $(this.dataViewItems[0].el), + itemW = el.outerWidth() + parseInt(el.css('margin-left')) + parseInt(el.css('margin-right')), + offsetLeft = this.$el.offset().left, + prevtop = -1, topIdx = 0, leftIdx = 0; + for (var i=0; i this._layoutParams.itemsIndexes.length-1) { + var top = $(this.dataViewItems[i].el).offset().top; + leftIdx = Math.floor(($(this.dataViewItems[i].el).offset().left - offsetLeft)/itemW); + if (top>prevtop) { + prevtop = top; this._layoutParams.itemsIndexes.push([]); + topIdx = this._layoutParams.itemsIndexes.length-1; } - this._layoutParams.itemsIndexes[top][left] = i; - this.dataViewItems[i].topIdx = top; - this.dataViewItems[i].leftIdx = left; - if (this._layoutParams.columns div { + &.inline { display: inline-block; + &.margin .group-items-container { + margin-right: 20px; + } } .group-items-container { overflow: hidden; + margin-bottom: 5px; & > div { display: inline-block; float: left; - margin: 4px; + margin: 2px 4px 4px; cursor: pointer; .box-shadow(0 0 0 1px @gray); @@ -53,4 +57,10 @@ } } } + + .header-name { + padding: 10px 2px 12px 4px; + font-weight: bold; + cursor: default; + } } \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/ChartSettings.js b/apps/documenteditor/main/app/view/ChartSettings.js index 08ca005e6..a4424e7ad 100644 --- a/apps/documenteditor/main/app/view/ChartSettings.js +++ b/apps/documenteditor/main/app/view/ChartSettings.js @@ -244,7 +244,7 @@ define([ cls : 'btn-large-dataview', iconCls : 'item-chartlist bar-normal', menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px; padding-top: 12px;', items: [ { template: _.template('') } ] @@ -254,15 +254,15 @@ define([ me.mnuChartTypePicker = new Common.UI.DataView({ el: $('#id-chart-menu-type'), parentMenu: btn.menu, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ { id: 'menu-chart-group-bar', caption: me.textColumn }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, iconCls: 'column-normal', selected: true}, @@ -545,13 +545,13 @@ define([ txtInFront: 'In front', textEditData: 'Edit Data', textChartType: 'Change Chart Type', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'XY (Scatter) Chart', - textStock: 'Stock Chart', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', textStyle: 'Style' }, DE.Views.ChartSettings || {})); diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 14d17c2ce..32c9d739e 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -489,7 +489,7 @@ define([ cls : 'btn-toolbar', iconCls : 'btn-insertchart', menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px;', items: [ { template: _.template('') } ] @@ -1362,15 +1362,15 @@ define([ el: $('#id-toolbar-menu-insertchart'), parentMenu: this.btnInsertChart.menu, showLast: false, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-bar', caption: me.textColumn }, + { id: 'menu-chart-group-bar', caption: me.textColumn, headername: me.textCharts }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, allowSelected: true, iconCls: 'column-normal', selected: true}, @@ -1827,13 +1827,13 @@ define([ textNewColor: 'Add New Custom Color', textAutoColor: 'Automatic', tipInsertChart: 'Insert Chart', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'XY (Scatter) Chart', - textStock: 'Stock Chart', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', tipColorSchemas: 'Change Color Scheme', tipInsertText: 'Insert Text', tipHAligh: 'Horizontal Align', @@ -1910,7 +1910,8 @@ define([ textPageSizeCustom: 'Custom Page Size', textPortrait: 'Portrait', textLandscape: 'Landscape', - textInsertPageCount: 'Insert number of pages' + textInsertPageCount: 'Insert number of pages', + textCharts: 'Charts' }, DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 72563c3a0..b5f7d1d36 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -637,18 +637,18 @@ "DE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "DE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", "DE.Views.ChartSettings.textAdvanced": "Show advanced settings", - "DE.Views.ChartSettings.textArea": "Area Chart", - "DE.Views.ChartSettings.textBar": "Bar Chart", + "DE.Views.ChartSettings.textArea": "Area", + "DE.Views.ChartSettings.textBar": "Bar", "DE.Views.ChartSettings.textChartType": "Change Chart Type", - "DE.Views.ChartSettings.textColumn": "Column Chart", + "DE.Views.ChartSettings.textColumn": "Column", "DE.Views.ChartSettings.textEditData": "Edit Data", "DE.Views.ChartSettings.textHeight": "Height", - "DE.Views.ChartSettings.textLine": "Line Chart", + "DE.Views.ChartSettings.textLine": "Line", "DE.Views.ChartSettings.textOriginalSize": "Default Size", - "DE.Views.ChartSettings.textPie": "Pie Chart", - "DE.Views.ChartSettings.textPoint": "XY (Scatter) Chart", + "DE.Views.ChartSettings.textPie": "Pie", + "DE.Views.ChartSettings.textPoint": "XY (Scatter)", "DE.Views.ChartSettings.textSize": "Size", - "DE.Views.ChartSettings.textStock": "Stock Chart", + "DE.Views.ChartSettings.textStock": "Stock", "DE.Views.ChartSettings.textStyle": "Style", "DE.Views.ChartSettings.textUndock": "Undock from panel", "DE.Views.ChartSettings.textWidth": "Width", @@ -1430,12 +1430,13 @@ "DE.Views.Toolbar.mniImageFromFile": "Picture from File", "DE.Views.Toolbar.mniImageFromUrl": "Picture from URL", "DE.Views.Toolbar.strMenuNoFill": "No Fill", - "DE.Views.Toolbar.textArea": "Area Chart", + "DE.Views.Toolbar.textArea": "Area", "DE.Views.Toolbar.textAutoColor": "Automatic", - "DE.Views.Toolbar.textBar": "Bar Chart", + "DE.Views.Toolbar.textBar": "Bar", "DE.Views.Toolbar.textBold": "Bold", "DE.Views.Toolbar.textBottom": "Bottom: ", - "DE.Views.Toolbar.textColumn": "Column Chart", + "DE.Views.Toolbar.textCharts": "Charts", + "DE.Views.Toolbar.textColumn": "Column", "DE.Views.Toolbar.textColumnsLeft": "Left", "DE.Views.Toolbar.textColumnsOne": "One", "DE.Views.Toolbar.textColumnsRight": "Right", @@ -1461,7 +1462,7 @@ "DE.Views.Toolbar.textItalic": "Italic", "DE.Views.Toolbar.textLandscape": "Landscape", "DE.Views.Toolbar.textLeft": "Left: ", - "DE.Views.Toolbar.textLine": "Line Chart", + "DE.Views.Toolbar.textLine": "Line", "DE.Views.Toolbar.textMarginsLast": "Last Custom", "DE.Views.Toolbar.textMarginsModerate": "Moderate", "DE.Views.Toolbar.textMarginsNarrow": "Narrow", @@ -1474,11 +1475,11 @@ "DE.Views.Toolbar.textOddPage": "Odd Page", "DE.Views.Toolbar.textPageMarginsCustom": "Custom margins", "DE.Views.Toolbar.textPageSizeCustom": "Custom Page Size", - "DE.Views.Toolbar.textPie": "Pie Chart", - "DE.Views.Toolbar.textPoint": "XY (Scatter) Chart", + "DE.Views.Toolbar.textPie": "Pie", + "DE.Views.Toolbar.textPoint": "XY (Scatter)", "DE.Views.Toolbar.textPortrait": "Portrait", "DE.Views.Toolbar.textRight": "Right: ", - "DE.Views.Toolbar.textStock": "Stock Chart", + "DE.Views.Toolbar.textStock": "Stock", "DE.Views.Toolbar.textStrikeout": "Strikeout", "DE.Views.Toolbar.textStyleMenuDelete": "Delete style", "DE.Views.Toolbar.textStyleMenuDeleteAll": "Delete all custom styles", diff --git a/apps/documenteditor/main/resources/less/leftmenu.less b/apps/documenteditor/main/resources/less/leftmenu.less index 92a926d22..964bf5c26 100644 --- a/apps/documenteditor/main/resources/less/leftmenu.less +++ b/apps/documenteditor/main/resources/less/leftmenu.less @@ -375,8 +375,6 @@ button.notify .btn-menu-comments {background-position: -0*@toolbar-icon-size -60 .header-name { padding: 7px 2px 7px 10px; - font-weight: bold; - cursor: default; } } } diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index 85120fdda..d7d71fe4d 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -163,20 +163,12 @@ // charts .menu-insertchart { .group-description { - float: left; - width: 125px; - line-height: 58px; - padding-left: 6px; + padding-left: 4px; } .group-items-container { float: left; position: relative; - -// & > div { -// float: left; -// margin: 0 0 0 14px; -// } } } diff --git a/apps/presentationeditor/main/app/view/ChartSettings.js b/apps/presentationeditor/main/app/view/ChartSettings.js index 80ab24a9c..c8123238c 100644 --- a/apps/presentationeditor/main/app/view/ChartSettings.js +++ b/apps/presentationeditor/main/app/view/ChartSettings.js @@ -200,7 +200,7 @@ define([ cls : 'btn-large-dataview', iconCls : 'item-chartlist bar-normal', menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px; padding-top: 12px;', items: [ { template: _.template('') } ] @@ -210,15 +210,15 @@ define([ me.mnuChartTypePicker = new Common.UI.DataView({ el: $('#id-chart-menu-type'), parentMenu: btn.menu, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ { id: 'menu-chart-group-bar', caption: me.textColumn }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, iconCls: 'column-normal', selected: true}, @@ -487,13 +487,13 @@ define([ textHeight: 'Height', textEditData: 'Edit Data', textChartType: 'Change Chart Type', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'XY (Scatter) Chart', - textStock: 'Stock Chart', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', textStyle: 'Style' }, PE.Views.ChartSettings || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 46bcc4ddb..835419d9c 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -554,7 +554,7 @@ define([ iconCls : 'btn-insertchart', lock : [_set.slideDeleted, _set.lostConnect, _set.noSlides, _set.disableOnStart], menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px;', items: [ { template: _.template('') } ] @@ -564,15 +564,15 @@ define([ el: $('#id-toolbar-menu-insertchart'), parentMenu: btn.menu, showLast: false, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-bar', caption: me.textColumn }, + { id: 'menu-chart-group-bar', caption: me.textColumn, headername: me.textCharts }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, allowSelected: true, iconCls: 'column-normal', selected: true}, @@ -1676,13 +1676,13 @@ define([ textFitWidth: 'Fit to Width', textZoom: 'Zoom', tipInsertChart: 'Insert Chart', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'XY (Scatter) Chart', - textStock: 'Stock Chart', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', tipSynchronize: 'The document has been changed by another user. Please click to save your changes and reload the updates.', txtScheme1: 'Office', txtScheme2: 'Grayscale', @@ -1712,6 +1712,7 @@ define([ textShowBegin: 'Show from Beginning', textShowCurrent: 'Show from Current slide', textShowSettings: 'Show Settings', - tipInsertEquation: 'Insert Equation' + tipInsertEquation: 'Insert Equation', + textCharts: 'Charts' }, PE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 550f76e57..823150e19 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -578,18 +578,18 @@ "PE.Controllers.Toolbar.txtSymbol_vdots": "Vertical Ellipsis", "PE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "PE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", - "PE.Views.ChartSettings.textArea": "Area Chart", - "PE.Views.ChartSettings.textBar": "Bar Chart", + "PE.Views.ChartSettings.textArea": "Area", + "PE.Views.ChartSettings.textBar": "Bar", "PE.Views.ChartSettings.textChartType": "Change Chart Type", - "PE.Views.ChartSettings.textColumn": "Column Chart", + "PE.Views.ChartSettings.textColumn": "Column", "PE.Views.ChartSettings.textEditData": "Edit Data", "PE.Views.ChartSettings.textHeight": "Height", "PE.Views.ChartSettings.textKeepRatio": "Constant Proportions", - "PE.Views.ChartSettings.textLine": "Line Chart", - "PE.Views.ChartSettings.textPie": "Pie Chart", - "PE.Views.ChartSettings.textPoint": "XY (Scatter) Chart", + "PE.Views.ChartSettings.textLine": "Line", + "PE.Views.ChartSettings.textPie": "Pie", + "PE.Views.ChartSettings.textPoint": "XY (Scatter)", "PE.Views.ChartSettings.textSize": "Size", - "PE.Views.ChartSettings.textStock": "Stock Chart", + "PE.Views.ChartSettings.textStock": "Stock", "PE.Views.ChartSettings.textStyle": "Style", "PE.Views.ChartSettings.textWidth": "Width", "PE.Views.DocumentHolder.aboveText": "Above", @@ -1190,15 +1190,16 @@ "PE.Views.Toolbar.textAlignMiddle": "Align text to the middle", "PE.Views.Toolbar.textAlignRight": "Align text right", "PE.Views.Toolbar.textAlignTop": "Align text to the top", - "PE.Views.Toolbar.textArea": "Area Chart", + "PE.Views.Toolbar.textArea": "Area", "PE.Views.Toolbar.textArrangeBack": "Send to Background", "PE.Views.Toolbar.textArrangeBackward": "Move Backward", "PE.Views.Toolbar.textArrangeForward": "Move Forward", "PE.Views.Toolbar.textArrangeFront": "Bring To Foreground", - "PE.Views.Toolbar.textBar": "Bar Chart", + "PE.Views.Toolbar.textBar": "Bar", "PE.Views.Toolbar.textBold": "Bold", "PE.Views.Toolbar.textCancel": "Cancel", - "PE.Views.Toolbar.textColumn": "Column Chart", + "PE.Views.Toolbar.textCharts": "Charts", + "PE.Views.Toolbar.textColumn": "Column", "PE.Views.Toolbar.textCompactView": "View Compact Toolbar", "PE.Views.Toolbar.textFitPage": "Fit to Slide", "PE.Views.Toolbar.textFitWidth": "Fit to Width", @@ -1208,11 +1209,11 @@ "PE.Views.Toolbar.textInsText": "Insert text box", "PE.Views.Toolbar.textInsTextArt": "Insert Text Art", "PE.Views.Toolbar.textItalic": "Italic", - "PE.Views.Toolbar.textLine": "Line Chart", + "PE.Views.Toolbar.textLine": "Line", "PE.Views.Toolbar.textNewColor": "Custom Color", "PE.Views.Toolbar.textOK": "OK", - "PE.Views.Toolbar.textPie": "Pie Chart", - "PE.Views.Toolbar.textPoint": "XY (Scatter) Chart", + "PE.Views.Toolbar.textPie": "Pie", + "PE.Views.Toolbar.textPoint": "XY (Scatter)", "PE.Views.Toolbar.textShapeAlignBottom": "Align Bottom", "PE.Views.Toolbar.textShapeAlignCenter": "Align Center", "PE.Views.Toolbar.textShapeAlignLeft": "Align Left", @@ -1222,7 +1223,7 @@ "PE.Views.Toolbar.textShowBegin": "Show from Beginning", "PE.Views.Toolbar.textShowCurrent": "Show from Current slide", "PE.Views.Toolbar.textShowSettings": "Show Settings", - "PE.Views.Toolbar.textStock": "Stock Chart", + "PE.Views.Toolbar.textStock": "Stock", "PE.Views.Toolbar.textStrikeout": "Strikeout", "PE.Views.Toolbar.textSubscript": "Subscript", "PE.Views.Toolbar.textSuperscript": "Superscript", diff --git a/apps/presentationeditor/main/resources/less/leftmenu.less b/apps/presentationeditor/main/resources/less/leftmenu.less index 5fde48cd0..a624d8907 100644 --- a/apps/presentationeditor/main/resources/less/leftmenu.less +++ b/apps/presentationeditor/main/resources/less/leftmenu.less @@ -394,8 +394,6 @@ .header-name { padding: 7px 2px 7px 10px; - font-weight: bold; - cursor: default; } } } diff --git a/apps/presentationeditor/main/resources/less/toolbar.less b/apps/presentationeditor/main/resources/less/toolbar.less index 83235f262..22a026dfc 100644 --- a/apps/presentationeditor/main/resources/less/toolbar.less +++ b/apps/presentationeditor/main/resources/less/toolbar.less @@ -174,20 +174,12 @@ // charts .menu-insertchart { .group-description { - float: left; - width: 125px; - line-height: 58px; - padding-left: 6px; + padding-left: 4px; } .group-items-container { float: left; position: relative; - - & > div { - float: left; - margin: 0 0 0 14px; - } } } diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index d79bf0bd3..68dddab0c 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -205,10 +205,8 @@ define([ toolbar.btnTextOrient.menu.on('item:click', _.bind(this.onTextOrientationMenu, this)); toolbar.btnInsertImage.menu.on('item:click', _.bind(this.onInsertImageMenu, this)); toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlink, this)); - toolbar.btnInsertChart.on('click', _.bind(this.onInsertChart, this)); -// if (toolbar.mnuInsertChartPicker) toolbar.mnuInsertChartPicker.on('item:click', _.bind(this.onSelectChart, this)); -// if (toolbar.mnuInsertSparkPicker) toolbar.mnuInsertSparkPicker.on('item:click', _.bind(this.onSelectSpark, this)); - toolbar.btnEditChart.on('click', _.bind(this.onInsertChart, this)); + toolbar.mnuInsertChartPicker.on('item:click', _.bind(this.onSelectChart, this)); + toolbar.btnEditChart.on('click', _.bind(this.onEditChart, this)); toolbar.btnInsertText.on('click', _.bind(this.onBtnInsertTextClick, this)); toolbar.btnInsertText.menu.on('item:click', _.bind(this.onInsertTextClick, this)); toolbar.btnInsertShape.menu.on('hide:after', _.bind(this.onInsertShapeHide, this)); @@ -743,7 +741,7 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Add Hyperlink'); }, - onInsertChart: function(btn) { + onEditChart: function(btn) { if (!this.editMode) return; var me = this, info = me.api.asc_getCellInfo(); if (info.asc_getFlags().asc_getSelectionType()!=Asc.c_oAscSelectionType.RangeImage) { @@ -774,37 +772,30 @@ define([ onSelectChart: function(picker, item, record, e) { if (!this.editMode) return; - var me = this, info = me.api.asc_getCellInfo(); - if (info.asc_getFlags().asc_getSelectionType()!=Asc.c_oAscSelectionType.RangeImage) { - var win, props; - if (me.api){ - var ischartedit = ( info.asc_getFlags().asc_getSelectionType() == Asc.c_oAscSelectionType.RangeChart || info.asc_getFlags().asc_getSelectionType() == Asc.c_oAscSelectionType.RangeChartText); - if (ischartedit) { - } else { - props = me.api.asc_getChartObject(); - if (props) { - props.putType(record.get('type')); - me.api.asc_addChartDrawingObject(props); - } - } - } - } - if (e.type !== 'click') - me.toolbar.btnInsertChart.menu.hide(); - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, + var me = this, + info = me.api.asc_getCellInfo(), + type = info.asc_getFlags().asc_getSelectionType(), + group = record.get('group'), + isSpark = (group == 'menu-chart-group-sparkcolumn' || group == 'menu-chart-group-sparkline' || group == 'menu-chart-group-sparkwin'); - onSelectSpark: function(picker, item, record, e) { - if (!this.editMode) return; - var me = this, info = me.api.asc_getCellInfo(), type = info.asc_getFlags().asc_getSelectionType(); - if (type==Asc.c_oAscSelectionType.RangeCells || type==Asc.c_oAscSelectionType.RangeCol || - type==Asc.c_oAscSelectionType.RangeRow || type==Asc.c_oAscSelectionType.RangeMax) { - var props; - if (me.api){ + if (type!=Asc.c_oAscSelectionType.RangeImage && me.api) { + var win, props; + if (isSpark && (type==Asc.c_oAscSelectionType.RangeCells || type==Asc.c_oAscSelectionType.RangeCol || + type==Asc.c_oAscSelectionType.RangeRow || type==Asc.c_oAscSelectionType.RangeMax)) { + var sparkLineInfo = info.asc_getSparklineInfo(); + if (!!sparkLineInfo) { + var props = new Asc.sparklineGroup(); + props.asc_setType(record.get('type')); + this.api.asc_setSparklineGroup(sparkLineInfo.asc_getId(), props); + } else { + // add sparkline + } + } else if (!isSpark) { + var ischartedit = ( type == Asc.c_oAscSelectionType.RangeChart || type == Asc.c_oAscSelectionType.RangeChartText); props = me.api.asc_getChartObject(); if (props) { props.putType(record.get('type')); - me.api.asc_addChartDrawingObject(props); + (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props); } } } @@ -1440,7 +1431,7 @@ define([ }, onApiChartDblClick: function() { - this.onInsertChart(this.btnInsertChart); + this.onEditChart(this.btnInsertChart); }, onApiCanRevert: function(which, can) { diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettings.js b/apps/spreadsheeteditor/main/app/view/ChartSettings.js index a422d2bb1..10463b21b 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettings.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettings.js @@ -654,7 +654,7 @@ define([ cls : 'btn-large-dataview', iconCls : 'item-chartlist bar-normal', menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px; padding-top: 12px;', items: [ { template: _.template('') } ] @@ -665,15 +665,15 @@ define([ me.mnuChartTypePicker = new Common.UI.DataView({ el: $('#id-chart-menu-type'), parentMenu: btn.menu, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ { id: 'menu-chart-group-bar', caption: me.textColumn }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, iconCls: 'column-normal', selected: true}, @@ -762,9 +762,9 @@ define([ cls : 'btn-large-dataview', iconCls : 'item-chartlist spark-column', menu : new Common.UI.Menu({ - style: 'width: 210px;', + style: 'width: 200px; padding-top: 12px;', items: [ - { template: _.template('') } + { template: _.template('') } ] }) }); @@ -772,17 +772,17 @@ define([ me.mnuSparkTypePicker = new Common.UI.DataView({ el: $('#id-spark-menu-type'), parentMenu: btn.menu, - restoreHeight: 200, + restoreHeight: 120, allowScrollbar: false, groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-sparkcolumn', caption: me.textColumnSpark }, - { id: 'menu-chart-group-sparkline', caption: me.textLineSpark }, - { id: 'menu-chart-group-sparkwin', caption: me.textWinLossSpark } + { id: 'menu-chart-group-sparkcolumn', inline: true }, + { id: 'menu-chart-group-sparkline', inline: true }, + { id: 'menu-chart-group-sparkwin', inline: true } ]), store: new Common.UI.DataViewStore([ - { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column'}, - { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line'}, - { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win'} + { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column', tip: me.textColumnSpark}, + { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line', tip: me.textLineSpark}, + { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win', tip: me.textWinLossSpark} ]), itemTemplate: _.template('
') }); @@ -1305,13 +1305,13 @@ define([ textHeight: 'Height', textEditData: 'Edit Data and Location', textChartType: 'Change Chart Type', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'XY (Scatter) Chart', - textStock: 'Stock Chart', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', textStyle: 'Style', textAdvanced: 'Show advanced settings', strSparkColor: 'Color', diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js index de23d41bd..92b0b4316 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js @@ -127,7 +127,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' cls : 'btn-large-dataview', iconCls : 'item-chartlist bar-normal', menu : new Common.UI.Menu({ - style: 'width: 560px;', + style: 'width: 435px; padding-top: 12px;', additionalAlign: menuAddAlign, items: [ { template: _.template('') } @@ -138,15 +138,15 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' me.mnuChartTypePicker = new Common.UI.DataView({ el: $('#id-chart-dlg-menu-type'), parentMenu: btn.menu, - restoreHeight: 411, + restoreHeight: 421, groups: new Common.UI.DataViewGroupStore([ { id: 'menu-chart-group-bar', caption: me.textColumn }, { id: 'menu-chart-group-line', caption: me.textLine }, { id: 'menu-chart-group-pie', caption: me.textPie }, { id: 'menu-chart-group-hbar', caption: me.textBar }, - { id: 'menu-chart-group-area', caption: me.textArea }, - { id: 'menu-chart-group-scatter', caption: me.textPoint }, - { id: 'menu-chart-group-stock', caption: me.textStock } + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, iconCls: 'column-normal', selected: true}, @@ -784,10 +784,10 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' cls : 'btn-large-dataview', iconCls : 'item-chartlist spark-column', menu : new Common.UI.Menu({ - style: 'width: 210px;', + style: 'width: 200px; padding-top: 12px;', additionalAlign: menuAddAlign, items: [ - { template: _.template('') } + { template: _.template('') } ] }) }); @@ -795,16 +795,16 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' me.mnuSparkTypePicker = new Common.UI.DataView({ el: $('#id-spark-dlg-menu-type'), parentMenu: btn.menu, - restoreHeight: 200, + restoreHeight: 120, groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-sparkcolumn', caption: me.textColumnSpark }, - { id: 'menu-chart-group-sparkline', caption: me.textLineSpark }, - { id: 'menu-chart-group-sparkwin', caption: me.textWinLossSpark } + { id: 'menu-chart-group-sparkcolumn', inline: true }, + { id: 'menu-chart-group-sparkline', inline: true }, + { id: 'menu-chart-group-sparkwin', inline: true } ]), store: new Common.UI.DataViewStore([ - { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column'}, - { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line'}, - { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win'} + { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column', tip: me.textColumnSpark}, + { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line', tip: me.textLineSpark}, + { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win', tip: me.textWinLossSpark} ]), itemTemplate: _.template('
') }); @@ -1594,7 +1594,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template' textBar: 'Bar', textArea: 'Area', textPie: 'Pie', - textPoint: 'Point', + textPoint: 'XY (Scatter)', textStock: 'Stock', textDataRows: 'in rows', textDataColumns: 'in columns', diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index fc1f8abb1..998503ac3 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -505,33 +505,13 @@ define([ id : 'id-toolbar-btn-insertchart', cls : 'btn-toolbar', iconCls : 'btn-insertchart', - lock : [_set.editCell, _set.selChartText, _set.selShape, _set.selShapeText, _set.selImage, _set.lostConnect, _set.coAuth] - /*,menu : new Common.UI.Menu({ - items : [ - this.mnuInsertChart = new Common.UI.MenuItem({ - caption: this.textInsCharts, - value: 'chart', - menu: new Common.UI.Menu({ - menuAlign: 'tl-tr', - style: 'width: 560px;', - items: [ - { template: _.template('') } - ] - }) - }), - this.mnuInsertSparkline = new Common.UI.MenuItem({ - caption: this.textInsSparklines, - value: 'chart', - menu: new Common.UI.Menu({ - menuAlign: 'tl-tr', - style: 'width: 210px;', - items: [ - { template: _.template('') } - ] - }) - }) + lock : [_set.editCell, _set.selChartText, _set.selShape, _set.selShapeText, _set.selImage, _set.lostConnect, _set.coAuth], + menu : new Common.UI.Menu({ + style: 'width: 435px;', + items: [ + { template: _.template('') } ] - })*/ + }) }); me.btnEditChart = new Common.UI.Button({ @@ -1714,20 +1694,22 @@ define([ ] })); - /* this.mnuInsertChartPicker = new Common.UI.DataView({ el: $('#id-toolbar-menu-insertchart'), - parentMenu: this.mnuInsertChart.menu, + parentMenu: this.btnInsertChart.menu, showLast: false, - restoreHeight: 411, + restoreHeight: 539, groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-bar', caption: this.textColumn }, - { id: 'menu-chart-group-line', caption: this.textLine }, - { id: 'menu-chart-group-pie', caption: this.textPie }, - { id: 'menu-chart-group-hbar', caption: this.textBar }, - { id: 'menu-chart-group-area', caption: this.textArea }, - { id: 'menu-chart-group-scatter', caption: this.textPoint }, - { id: 'menu-chart-group-stock', caption: this.textStock } + { id: 'menu-chart-group-bar', caption: me.textColumn, headername: me.textCharts }, + { id: 'menu-chart-group-line', caption: me.textLine }, + { id: 'menu-chart-group-pie', caption: me.textPie }, + { id: 'menu-chart-group-hbar', caption: me.textBar }, + { id: 'menu-chart-group-area', caption: me.textArea, inline: true }, + { id: 'menu-chart-group-scatter', caption: me.textPoint, inline: true }, + { id: 'menu-chart-group-stock', caption: me.textStock, inline: true }, + { id: 'menu-chart-group-sparkcolumn', inline: true, headername: me.textSparks }, + { id: 'menu-chart-group-sparkline', inline: true }, + { id: 'menu-chart-group-sparkwin', inline: true } ]), store: new Common.UI.DataViewStore([ { group: 'menu-chart-group-bar', type: Asc.c_oAscChartTypeSettings.barNormal, allowSelected: true, iconCls: 'column-normal', selected: true}, @@ -1754,29 +1736,13 @@ define([ { group: 'menu-chart-group-area', type: Asc.c_oAscChartTypeSettings.areaStacked, allowSelected: true, iconCls: 'area-stack'}, { group: 'menu-chart-group-area', type: Asc.c_oAscChartTypeSettings.areaStackedPer, allowSelected: true, iconCls: 'area-pstack'}, { group: 'menu-chart-group-scatter', type: Asc.c_oAscChartTypeSettings.scatter, allowSelected: true, iconCls: 'point-normal'}, - { group: 'menu-chart-group-stock', type: Asc.c_oAscChartTypeSettings.stock, allowSelected: true, iconCls: 'stock-normal'} + { group: 'menu-chart-group-stock', type: Asc.c_oAscChartTypeSettings.stock, allowSelected: true, iconCls: 'stock-normal'}, + { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column', tip: me.textColumnSpark}, + { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line', tip: me.textLineSpark}, + { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win', tip: me.textWinLossSpark} ]), itemTemplate: _.template('
') }); - this.mnuInsertSparkPicker = new Common.UI.DataView({ - el: $('#id-toolbar-menu-insertspark'), - parentMenu: this.mnuInsertSparkline.menu, - showLast: false, - restoreHeight: 200, - allowScrollbar: false, - groups: new Common.UI.DataViewGroupStore([ - { id: 'menu-chart-group-sparkcolumn', caption: this.textColumnSpark }, - { id: 'menu-chart-group-sparkline', caption: this.textLineSpark }, - { id: 'menu-chart-group-sparkwin', caption: this.textWinLossSpark } - ]), - store: new Common.UI.DataViewStore([ - { group: 'menu-chart-group-sparkcolumn', type: Asc.c_oAscSparklineType.Column, allowSelected: true, iconCls: 'spark-column'}, - { group: 'menu-chart-group-sparkline', type: Asc.c_oAscSparklineType.Line, allowSelected: true, iconCls: 'spark-line'}, - { group: 'menu-chart-group-sparkwin', type: Asc.c_oAscSparklineType.Stacked, allowSelected: true, iconCls: 'spark-win'} - ]), - itemTemplate: _.template('
') - }) - */ }, setApi: function(api) { @@ -2124,17 +2090,18 @@ define([ textInsText: 'Insert text box', textInsTextArt: 'Insert Text Art', textInsCharts: 'Charts', - textLine: 'Line Chart', - textColumn: 'Column Chart', - textBar: 'Bar Chart', - textArea: 'Area Chart', - textPie: 'Pie Chart', - textPoint: 'Point Chart', - textStock: 'Stock Chart', - textInsSparklines: 'Sparklines', + textLine: 'Line', + textColumn: 'Column', + textBar: 'Bar', + textArea: 'Area', + textPie: 'Pie', + textPoint: 'XY (Scatter)', + textStock: 'Stock', textLineSpark: 'Line', textColumnSpark: 'Column', textWinLossSpark: 'Win/Loss', - tipInsertEquation: 'Insert Equation' + tipInsertEquation: 'Insert Equation', + textCharts: 'Charts', + textSparks: 'Sparklines' }, SSE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 863ccaaf9..f03932323 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -721,33 +721,36 @@ "SSE.Views.CellRangeDialog.txtInvalidRange": "ERROR! Invalid cells range", "SSE.Views.CellRangeDialog.txtTitle": "Select Data Range", "SSE.Views.ChartSettings.textAdvanced": "Show advanced settings", - "SSE.Views.ChartSettings.textArea": "Area Chart", - "SSE.Views.ChartSettings.textBar": "Bar Chart", + "SSE.Views.ChartSettings.textArea": "Area", + "SSE.Views.ChartSettings.textBar": "Bar", "SSE.Views.ChartSettings.textChartType": "Change Chart Type", - "SSE.Views.ChartSettings.textColumn": "Column Chart", + "SSE.Views.ChartSettings.textColumn": "Column", "SSE.Views.ChartSettings.textEditData": "Edit Data and Location", "SSE.Views.ChartSettings.textHeight": "Height", "SSE.Views.ChartSettings.textKeepRatio": "Constant Proportions", - "SSE.Views.ChartSettings.textLine": "Line Chart", - "SSE.Views.ChartSettings.textPie": "Pie Chart", - "SSE.Views.ChartSettings.textPoint": "XY (Scatter) Chart", + "SSE.Views.ChartSettings.textLine": "Line", + "SSE.Views.ChartSettings.textPie": "Pie", + "SSE.Views.ChartSettings.textPoint": "XY (Scatter)", "SSE.Views.ChartSettings.textRanges": "Data Range", "SSE.Views.ChartSettings.textSelectData": "Select Data", "SSE.Views.ChartSettings.textSize": "Size", - "SSE.Views.ChartSettings.textStock": "Stock Chart", + "SSE.Views.ChartSettings.textStock": "Stock", "SSE.Views.ChartSettings.textStyle": "Style", "SSE.Views.ChartSettings.textType": "Type", "SSE.Views.ChartSettings.textWidth": "Width", + "SSE.Views.ChartSettings.textLineSpark": "Line", + "SSE.Views.ChartSettings.textColumnSpark": "Column", + "SSE.Views.ChartSettings.textWinLossSpark": "Win/Loss", "SSE.Views.ChartSettingsDlg.cancelButtonText": "Cancel", "SSE.Views.ChartSettingsDlg.errorMaxRows": "ERROR! The maximum number of data series per chart is 255", "SSE.Views.ChartSettingsDlg.errorStockChart": "Incorrect row order. To build a stock chart place the data on the sheet in the following order:
opening price, max price, min price, closing price.", - "SSE.Views.ChartSettingsDlg.textArea": "Area Chart", + "SSE.Views.ChartSettingsDlg.textArea": "Area", "SSE.Views.ChartSettingsDlg.textAuto": "Auto", "SSE.Views.ChartSettingsDlg.textAxisCrosses": "Axis Crosses", "SSE.Views.ChartSettingsDlg.textAxisOptions": "Axis Options", "SSE.Views.ChartSettingsDlg.textAxisPos": "Axis Position", "SSE.Views.ChartSettingsDlg.textAxisSettings": "Axis Settings", - "SSE.Views.ChartSettingsDlg.textBar": "Bar Chart", + "SSE.Views.ChartSettingsDlg.textBar": "Bar", "SSE.Views.ChartSettingsDlg.textBetweenTickMarks": "Between Tick Marks", "SSE.Views.ChartSettingsDlg.textBillions": "Billions", "SSE.Views.ChartSettingsDlg.textBottom": "Bottom", @@ -755,7 +758,7 @@ "SSE.Views.ChartSettingsDlg.textCenter": "Center", "SSE.Views.ChartSettingsDlg.textChartElementsLegend": "Chart Elements &
Chart Legend", "SSE.Views.ChartSettingsDlg.textChartTitle": "Chart Title", - "SSE.Views.ChartSettingsDlg.textColumn": "Column Chart", + "SSE.Views.ChartSettingsDlg.textColumn": "Column", "SSE.Views.ChartSettingsDlg.textCross": "Cross", "SSE.Views.ChartSettingsDlg.textCustom": "Custom", "SSE.Views.ChartSettingsDlg.textDataColumns": "in columns", @@ -813,8 +816,8 @@ "SSE.Views.ChartSettingsDlg.textOut": "Out", "SSE.Views.ChartSettingsDlg.textOuterTop": "Outer Top", "SSE.Views.ChartSettingsDlg.textOverlay": "Overlay", - "SSE.Views.ChartSettingsDlg.textPie": "Pie Chart", - "SSE.Views.ChartSettingsDlg.textPoint": "XY (Scatter) Chart", + "SSE.Views.ChartSettingsDlg.textPie": "Pie", + "SSE.Views.ChartSettingsDlg.textPoint": "XY (Scatter)", "SSE.Views.ChartSettingsDlg.textReverse": "Values in reverse order", "SSE.Views.ChartSettingsDlg.textRight": "Right", "SSE.Views.ChartSettingsDlg.textRightOverlay": "Right Overlay", @@ -828,7 +831,7 @@ "SSE.Views.ChartSettingsDlg.textShowGrid": "Grid Lines", "SSE.Views.ChartSettingsDlg.textShowValues": "Display chart values", "SSE.Views.ChartSettingsDlg.textSmooth": "Smooth", - "SSE.Views.ChartSettingsDlg.textStock": "Stock Chart", + "SSE.Views.ChartSettingsDlg.textStock": "Stock", "SSE.Views.ChartSettingsDlg.textStraight": "Straight", "SSE.Views.ChartSettingsDlg.textStyle": "Style", "SSE.Views.ChartSettingsDlg.textTenMillions": "10 000 000", @@ -849,6 +852,9 @@ "SSE.Views.ChartSettingsDlg.textXAxisTitle": "X Axis Title", "SSE.Views.ChartSettingsDlg.textYAxisTitle": "Y Axis Title", "SSE.Views.ChartSettingsDlg.txtEmpty": "This field is required", + "SSE.Views.ChartSettingsDlg.textLineSpark": "Line", + "SSE.Views.ChartSettingsDlg.textColumnSpark": "Column", + "SSE.Views.ChartSettingsDlg.textWinLossSpark": "Win/Loss", "SSE.Views.DigitalFilterDialog.cancelButtonText": "Cancel", "SSE.Views.DigitalFilterDialog.capAnd": "And", "SSE.Views.DigitalFilterDialog.capCondition1": "equals", @@ -1425,6 +1431,15 @@ "SSE.Views.Toolbar.textBottomBorders": "Bottom Borders", "SSE.Views.Toolbar.textCenterBorders": "Inside Vertical Borders", "SSE.Views.Toolbar.textClockwise": "Angle Clockwise", + "SSE.Views.Toolbar.textArea": "Area", + "SSE.Views.Toolbar.textBar": "Bar", + "SSE.Views.Toolbar.textColumn": "Column", + "SSE.Views.Toolbar.textLine": "Line", + "SSE.Views.Toolbar.textPie": "Pie", + "SSE.Views.Toolbar.textPoint": "XY (Scatter)", + "SSE.Views.Toolbar.textStock": "Stock", + "SSE.Views.Toolbar.textCharts": "Charts", + "SSE.Views.Toolbar.textSparks": "Sparklines", "SSE.Views.Toolbar.textCompactToolbar": "View Compact Toolbar", "SSE.Views.Toolbar.textCounterCw": "Angle Counterclockwise", "SSE.Views.Toolbar.textDelLeft": "Shift Cells Left", @@ -1578,6 +1593,9 @@ "SSE.Views.Toolbar.txtTime": "Time", "SSE.Views.Toolbar.txtUnmerge": "Unmerge Cells", "SSE.Views.Toolbar.txtYen": "¥ Yen", + "SSE.Views.Toolbar.textLineSpark": "Line", + "SSE.Views.Toolbar.textColumnSpark": "Column", + "SSE.Views.Toolbar.textWinLossSpark": "Win/Loss", "SSE.Views.Top10FilterDialog.cancelButtonText": "Cancel", "SSE.Views.Top10FilterDialog.okButtonText": "OK", "SSE.Views.Top10FilterDialog.textType": "Show", diff --git a/apps/spreadsheeteditor/main/resources/less/leftmenu.less b/apps/spreadsheeteditor/main/resources/less/leftmenu.less index 4c74d623b..df99dd51d 100644 --- a/apps/spreadsheeteditor/main/resources/less/leftmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/leftmenu.less @@ -459,8 +459,6 @@ .header-name { padding: 7px 2px 7px 10px; - font-weight: bold; - cursor: default; } } } diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less index 801c35841..2c65f6014 100644 --- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less @@ -172,20 +172,12 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .menu-insertchart { .group-description { - float: left; - width: 125px; - line-height: 58px; - padding-left: 6px; + padding-left: 4px; } .group-items-container { float: left; position: relative; - - & > div { - float: left; - margin: 0 0 0 14px; - } } } From cb05587be1572b4ac005e261088c9313b7b91929 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 16 Dec 2016 14:33:38 +0300 Subject: [PATCH 19/42] [DE] [PE] Change chart type from the toolbar when chart is selected . --- .../main/app/controller/Toolbar.js | 61 +++++++++++++------ .../main/app/controller/Toolbar.js | 43 +++++++++---- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 8ed872111..2fdede3ba 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -563,6 +563,7 @@ define([ var pr, sh, i = -1, type, paragraph_locked = false, header_locked = false, + image_locked = false, can_add_table = false, can_add_image = false, enable_dropcap = undefined, @@ -590,6 +591,7 @@ define([ in_header = true; } else if (type === Asc.c_oAscTypeSelectElement.Image) { in_image = in_header = true; + image_locked = pr.get_Locked(); if (pr && pr.get_ChartProperties()) in_chart = true; } else if (type === Asc.c_oAscTypeSelectElement.Math) { @@ -670,16 +672,18 @@ define([ } need_disable = paragraph_locked || header_locked || !can_add_image || in_equation; - if (need_disable != toolbar.btnInsertChart.isDisabled()) { - toolbar.btnInsertChart.setDisabled(need_disable); + if (need_disable != toolbar.btnInsertImage.isDisabled()) { toolbar.btnInsertImage.setDisabled(need_disable); toolbar.btnInsertShape.setDisabled(need_disable); toolbar.btnInsertText.setDisabled(need_disable); } - need_disable = need_disable || in_image; - if (need_disable != toolbar.mnuInsertTextArt.isDisabled()) - toolbar.mnuInsertTextArt.setDisabled(need_disable); + if ((need_disable || in_image) != toolbar.mnuInsertTextArt.isDisabled()) + toolbar.mnuInsertTextArt.setDisabled(need_disable || in_image); + + need_disable = in_chart && image_locked || !in_chart && need_disable; + if (need_disable != toolbar.btnInsertChart.isDisabled()) + toolbar.btnInsertChart.setDisabled(need_disable); need_disable = paragraph_locked || header_locked || in_chart || !can_add_image&&!in_equation; if (need_disable !== toolbar.btnInsertEquation.isDisabled()) toolbar.btnInsertEquation.setDisabled(need_disable); @@ -1675,20 +1679,43 @@ define([ onSelectChart: function(picker, item, record) { var me = this, - type = record.get('type'); + type = record.get('type'), + chart = false; - if (!this.diagramEditor) - this.diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor'); - - if (this.diagramEditor && me.api) { - this.diagramEditor.setEditMode(false); - this.diagramEditor.show(); - - var chart = me.api.asc_getChartObject(type); - if (chart) { - this.diagramEditor.setChartData(new Asc.asc_CChartBinary(chart)); + var selectedElements = me.api.getSelectedElements(); + if (selectedElements && _.isArray(selectedElements)) { + for (var i = 0; i< selectedElements.length; i++) { + if (Asc.c_oAscTypeSelectElement.Image == selectedElements[i].get_ObjectType()) { + var elValue = selectedElements[i].get_ObjectValue().get_ChartProperties(); + if (elValue) { + chart = elValue; + break; + } + } + } + } + + if (chart) { + var props = new Asc.asc_CImgProperty(); + chart.changeType(type); + props.put_ChartProperties(chart); + this.api.ImgApply(props); + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + } else { + if (!this.diagramEditor) + this.diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor'); + + if (this.diagramEditor && me.api) { + this.diagramEditor.setEditMode(false); + this.diagramEditor.show(); + + chart = me.api.asc_getChartObject(type); + if (chart) { + this.diagramEditor.setChartData(new Asc.asc_CChartBinary(chart)); + } + me.toolbar.fireEvent('insertchart', me.toolbar); } - me.toolbar.fireEvent('insertchart', me.toolbar); } }, diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 2bfe4873a..2707e9f24 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -1450,20 +1450,39 @@ define([ onSelectChart: function(picker, item, record) { var me = this, - type = record.get('type'); + type = record.get('type'), + chart = false; - if (!this.diagramEditor) - this.diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor'); - - if (this.diagramEditor && me.api) { - this.diagramEditor.setEditMode(false); - this.diagramEditor.show(); - - var chart = me.api.asc_getChartObject(type); - if (chart) { - this.diagramEditor.setChartData(new Asc.asc_CChartBinary(chart)); + var selectedElements = me.api.getSelectedElements(); + if (selectedElements && _.isArray(selectedElements)) { + for (var i = 0; i< selectedElements.length; i++) { + if (Asc.c_oAscTypeSelectElement.Chart == selectedElements[i].get_ObjectType()) { + chart = true; + break; + } + } + } + + if (chart) { + var props = new Asc.CAscChartProp(); + props.changeType(type); + this.api.ChartApply(props); + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + } else { + if (!this.diagramEditor) + this.diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor'); + + if (this.diagramEditor && me.api) { + this.diagramEditor.setEditMode(false); + this.diagramEditor.show(); + + chart = me.api.asc_getChartObject(type); + if (chart) { + this.diagramEditor.setChartData(new Asc.asc_CChartBinary(chart)); + } + me.toolbar.fireEvent('insertchart', me.toolbar); } - me.toolbar.fireEvent('insertchart', me.toolbar); } }, From 09671949ea7102a22c84cdefb18471065d3f95a8 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 16 Dec 2016 16:26:37 +0300 Subject: [PATCH 20/42] Bug 20101. Bug with hiding tooltips for disabled split buttons (after timout only). --- apps/common/main/lib/component/Button.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 3f251628c..7c52029dd 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -430,10 +430,11 @@ define([ isGroup && decorateBtn(el.children('button')); } - if (disabled) { + if (disabled || !Common.Utils.isGecko) { var tip = this.cmpEl.data('bs.tooltip'); if (tip) { - tip.hide(); + disabled && tip.hide(); + !Common.Utils.isGecko && (tip.enabled = !disabled); } } } From fa6d7451e69e456fce6f7f3013eb11f01df3e1a5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 19 Dec 2016 14:44:02 +0300 Subject: [PATCH 21/42] [DE] Add footnote settings. --- .../main/app/controller/Toolbar.js | 50 ++- .../app/template/NoteSettingsDialog.template | 0 .../main/app/template/Toolbar.template | 6 + .../main/app/view/FootnoteTip.js | 134 +++++++ .../main/app/view/NoteSettingsDialog.js | 379 ++++++++++++++++++ apps/documenteditor/main/app/view/Toolbar.js | 54 ++- apps/documenteditor/main/locale/en.json | 26 +- .../main/resources/less/footnote.less | 124 ++++++ .../main/resources/less/toolbar.less | 3 +- 9 files changed, 771 insertions(+), 5 deletions(-) create mode 100644 apps/documenteditor/main/app/template/NoteSettingsDialog.template create mode 100644 apps/documenteditor/main/app/view/FootnoteTip.js create mode 100644 apps/documenteditor/main/app/view/NoteSettingsDialog.js create mode 100644 apps/documenteditor/main/resources/less/footnote.less diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 2fdede3ba..d08783599 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -53,7 +53,8 @@ define([ 'documenteditor/main/app/view/MailMergeRecepients', 'documenteditor/main/app/view/StyleTitleDialog', 'documenteditor/main/app/view/PageMarginsDialog', - 'documenteditor/main/app/view/PageSizeDialog' + 'documenteditor/main/app/view/PageSizeDialog', + 'documenteditor/main/app/view/NoteSettingsDialog' ], function () { 'use strict'; @@ -264,6 +265,9 @@ define([ toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); + toolbar.btnNotes.menu.on('item:click', _.bind(this.onNotesClick, this)); + toolbar.mnuGotoFootPrev.on('click', _.bind(this.onFootnotePrevClick, this)); + toolbar.mnuGotoFootNext.on('click', _.bind(this.onFootnoteNextClick, this)); $('#id-save-style-plus, #id-save-style-link', toolbar.$el).on('click', this.onMenuSaveStyle.bind(this)); @@ -1987,6 +1991,50 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, + onNotesClick: function(menu, item) { + if (this.api) { + if (item.value == 'ins_footnote') + this.api.asc_AddFootnote(); + else if (item.value == 'delele') + this.api.deleteFootnotes(); + else if (item.value == 'settings') { + var me = this; + (new DE.Views.NoteSettingsDialog({ + api: me.api, + handler: function(result, settings) { + if (settings) { + if (result == 'insert') { + me.api.asc_SetFootnoteProps(settings); + me.api.asc_AddFootnote(); + } else if (result == 'apply') { + me.api.asc_SetFootnoteProps(settings); + } + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }, + props : me.api.asc_GetFootnoteProps() + })).show(); + } else + return; + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + } + }, + + onFootnotePrevClick: function(btn) { + if (this.api) + this.api.GotoFootnotePrev(); + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, + + onFootnoteNextClick: function(btn) { + if (this.api) + this.api.GotoFootnoteNext(); + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, + _clearBullets: function() { this.toolbar.btnMarkers.toggle(false, true); this.toolbar.btnNumbers.toggle(false, true); diff --git a/apps/documenteditor/main/app/template/NoteSettingsDialog.template b/apps/documenteditor/main/app/template/NoteSettingsDialog.template new file mode 100644 index 000000000..e69de29bb diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index c6d15c865..3b6e4cbcd 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -191,6 +191,12 @@
+
+
+
+ +
+
diff --git a/apps/documenteditor/main/app/view/FootnoteTip.js b/apps/documenteditor/main/app/view/FootnoteTip.js new file mode 100644 index 000000000..ca07deb04 --- /dev/null +++ b/apps/documenteditor/main/app/view/FootnoteTip.js @@ -0,0 +1,134 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2016 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7  3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * in every copy of the program you distribute. + * Pursuant to Section 7  3(e) we decline to grant you any rights under trademark law for use of our trademarks. + * +*/ + +define([ + 'common/main/lib/component/BaseView' +], function () { + 'use strict'; + + DE.Views.FootnoteTip = Common.UI.BaseView.extend(_.extend((function() { + var tipEl; + + return { + options : { + name : '', + text : '', + target : null, + placement: 'bottom' + }, + + template: _.template([ + '
', + '
', + '
', + '
', + '', + '', + '
', + '', + '', + '
', + '
', + '', + '
', + '
' + ].join('')), + + initialize : function(options) { + Common.UI.BaseView.prototype.initialize.call(this, options); + this.text = this.options.text; + this.name = this.options.name; + this.target = this.options.target; + this.placement = this.options.placement; + }, + + render: function() { + tipEl = $(this.template({ scope: this })); + + this.btnPrev = new Common.UI.Button({ + el: $('#footnote-btn-prev',tipEl) + }); + + this.btnNext = new Common.UI.Button({ + el: $('#footnote-btn-next',tipEl) + }); + + tipEl.find('.show-link label').on('click', _.bind(function() { this.trigger('settingsclick');}, this)); + this.btnPrev.on('click', _.bind(function(btn) { + this.trigger('prevclick'); + }, this)); + this.btnNext.on('click', _.bind(function(btn) { + this.trigger('nextclick'); + }, this)); + + this.lblName = tipEl.find('.tip-name'); + this.lblText = tipEl.find('.tip-text'); + + $(document.body).append(tipEl); + this.applyPlacement(this.target); + + return this; + }, + + show: function(name, text, target){ + if (tipEl) { + this.lblName.text(name); + this.lblText.text(text); + this.applyPlacement(target); + tipEl.show() + } else + this.render(); + }, + + hide: function() { + if (tipEl) tipEl.hide(); + }, + + applyPlacement: function (target) { + if (!target) + target = {top: 0, left: 0, width: 1, height: 1}; + var docHeight = Common.Utils.innerHeight(), + elHeight = tipEl.height(), + elWidth = tipEl.width(), + placement = this.placement; + + if (this.placement == 'bottom') { + if (target.top + target.height + elHeight > docHeight) + placement = 'top'; + } else if (this.placement == 'top') { + if (target.top - elHeight < 0) + placement = 'bottom'; + } + tipEl.removeClass(placement == 'top' ? 'bottom' : 'top'); + tipEl.addClass(placement); + (placement == 'top') ? tipEl.css({top: 'auto', bottom : docHeight - target.top + 'px', left: target.left + target.width/2 - elWidth/2 + 'px'}) + : tipEl.css({top : target.top + target.height + 'px', bottom: 'auto', left: target.left + target.width/2 - elWidth/2 + 'px'}); + }, + + textSettings: 'Note Settings' + } + })(), DE.Views.FootnoteTip || {})); +}); + diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js new file mode 100644 index 000000000..5c666be1e --- /dev/null +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -0,0 +1,379 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2016 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, + * EU, LV-1021. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +/** + * NoteSettingsDialog.js.js + * + * Created by Julia Radzhabova on 18.12.2016 + * Copyright (c) 2016 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/MetricSpinner', + 'common/main/lib/component/ComboBox', + 'common/main/lib/component/InputField', + 'common/main/lib/view/AdvancedSettingsWindow' +], function () { 'use strict'; + + DE.Views.NoteSettingsDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + contentWidth: 300, + height: 335 + }, + + initialize : function(options) { + var me = this; + + _.extend(this.options, { + title: this.textTitle, + template: [ + '
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '', + '
', + '', + // '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + '', + '
', + '
', + '', + '
', + // '
', + '
', + '', + '
', + '
', + '
', + '
', + '', + '
', + '', + '', + '
', + '
', + '
', + '
', + '
', + '' + ].join('') + }, options); + + this.api = options.api; + this.handler = options.handler; + this.props = options.props; + + Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); + + this.FormatType = 1; + this.StartValue = 1; + }, + + render: function() { + Common.Views.AdvancedSettingsWindow.prototype.render.call(this); + var me = this; + + this.cmbFootnote = new Common.UI.ComboBox({ + el: $('#note-settings-combo-footnote'), + cls: 'input-group-nr', + menuStyle: 'min-width: 140px;', + editable: false, + data: [ + { displayValue: this.textPageBottom, value: Asc.section_footnote_PosPageBottom }, + { displayValue: this.textTextBottom, value: Asc.section_footnote_PosBeneathText } + ] + }); + this.cmbFootnote.setValue(Asc.section_footnote_PosPageBottom); + + this.cmbFormat = new Common.UI.ComboBox({ + el: $('#note-settings-combo-format'), + cls: 'input-group-nr', + menuStyle: 'min-width: 100px;', + editable: false, + data: [ + { displayValue: '1, 2, 3,...', value: 1, maskExp: /[0-9]/, defValue: 1 }, + { displayValue: 'a, b, c,...', value: 5, maskExp: /[a-z]/, defValue: 'a' }, + { displayValue: 'A, B, C,...', value: 4, maskExp: /[A-Z]/, defValue: 'A' }, + { displayValue: 'i, ii, iii,...', value: 7, maskExp: /[ivxlcdm]/, defValue: 'i' }, + { displayValue: 'I, II, III,...', value: 3, maskExp: /[IVXLCDM]/, defValue: 'I' } + ] + }); + this.cmbFormat.setValue(this.FormatType); + this.cmbFormat.on('selected', _.bind(this.onFormatSelect, this)); + + this.spnStart = new Common.UI.MetricSpinner({ + el: $('#note-settings-spin-start'), + step: 1, + width: 100, + defaultUnit : "", + value: '1', + maxValue: 16383, + minValue: 1 + }); +/* + this.txtStart = new Common.UI.InputField({ + el : $('#note-settings-txt-start'), + allowBlank : true, + validateOnChange: false, + style : 'width: 100px; vertical-align: middle;', + cls : 'masked-field', + maskExp : /[a-z]/, + value : 'a', + visible: false, + validation : function(value) { + if (this.options.maskExp.test(value)) { + } else + me.txtFieldNum.setValue(''); + + return true; + } + }); +*/ + this.cmbNumbering = new Common.UI.ComboBox({ + el: $('#note-settings-combo-numbering'), + cls: 'input-group-nr', + menuStyle: 'min-width: 140px;', + editable: false, + data: [ + { displayValue: this.textContinue, value: Asc.section_footnote_RestartContinuous }, + { displayValue: this.textEachSection, value: Asc.section_footnote_RestartEachSect }, + { displayValue: this.textEachPage, value: Asc.section_footnote_RestartEachPage } + ] + }); + this.cmbNumbering.setValue(Asc.section_footnote_RestartContinuous); + + this.cmbApply = new Common.UI.ComboBox({ + el: $('#note-settings-combo-apply'), + cls: 'input-group-nr', + menuStyle: 'min-width: 140px;', + editable: false, + data: [ + { displayValue: this.textDocument, value: Asc.section_footnote_RestartContinuous }, + { displayValue: this.textSection, value: Asc.section_footnote_RestartEachSect } + ] + }); + this.cmbApply.setValue(Asc.section_footnote_RestartContinuous); + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + show: function() { + Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); + }, + + _setDefaults: function (props) { + if (props) { + var val = props.get_Pos(); + this.cmbFootnote.setValue(val); + + val = props.get_NumFormat(); + this.cmbFormat.setValue(val); + // this.spnStart.setVisible(val==1); + // this.txtStart.setVisible(val!=1); + + val = props.get_NumStart(); + this.spnStart.setValue(val); + // this.txtStart.setValue(val); + + val = props.get_NumRestart(); + this.cmbNumbering.setValue(val); + + /* + val = props.get_ApplyTo(); + this.cmbApply.setValue(val); + */ + } + }, + + getSettings: function () { + var props = new Asc.CAscFootnotePr(); + + props.put_Pos(this.cmbFootnote.getValue()); + props.put_NumRestart(this.cmbNumbering.getValue()); + + var val = this.cmbFormat.getValue(); + + props.put_NumFormat(val); + // if (val==1) + props.put_NumStart(this.spnStart.getNumberValue()); + // else + // props.put_NumStart(this.txtStart.getValue()); + + // props.put_ApplyTo(this.cmbApply.getValue()); + + return props; + }, + + onDlgBtnClick: function(event) { + var me = this; + var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; + if (state == 'insert' || state == 'apply') { + this.handler && this.handler.call(this, state, (state == 'insert' || state == 'apply') ? this.getSettings() : undefined); + } + + this.close(); + }, + + onPrimary: function() { + return true; + }, + + onFormatSelect: function(combo, record) { + return; + + this.spnStart.setVisible(record.value == 1); + this.txtStart.setVisible(record.value != 1); + + if (record.value !== 1) + this.txtStart.setMask(record.maskExp); + + var value = 0; + if (this.FormatType == 1) { // from 1,2,3, + this.StartValue = value = this.spnStart.getNumberValue(); + + if (record.value == 4 || record.value == 5) { + value = this._10toA(value); + this.txtStart.setValue((record.value == 5) ? value.toLocaleLowerCase() : value); + } else if (this.FormatType !== record.value) + this.txtStart.setValue(record.defValue); + } else if (this.FormatType == 4 || this.FormatType == 5) { + if (this.FormatType == 4 && record.value == 5) + this.txtStart.setValue(this.txtStart.getValue().toLocaleLowerCase()); + else if (this.FormatType == 5 && record.value == 4) + this.txtStart.setValue(this.txtStart.getValue().toLocaleUpperCase()); + else if (record.value == 1) { + value = this._Ato10((record.value == 5) ? this.txtStart.getValue().toLocaleLowerCase() : this.txtStart.getValue()); + this.spnStart.setValue(value); + } else if (this.FormatType !== record.value) + this.txtStart.setValue(record.defValue); + } else if (this.FormatType !== record.value){ + if (record.value==1) + this.spnStart.setValue(this.StartValue); + else + this.txtStart.setValue(record.defValue); + } + + this.FormatType = record.value; + }, + + _10toA: function(value) { + var n = Math.ceil(value / 26), + code = String.fromCharCode((value-1) % 26 + "A".charCodeAt(0)) , + result = ''; + + for (var i=0; i', + 'data-stopPropagation="true"', + '<% } %>', '>', + '', + '', + '', + '
' + ].join('')), + stopPropagation: true + }), + { caption: '--' }, + { caption: this.mniNoteSettings, value: 'settings' } + ] + }) + ); + + this.mnuGotoFootPrev = new Common.UI.Button({ + el : $('#id-menu-goto-footnote-prev'), + cls : 'btn-toolbar' + }); + this.mnuGotoFootNext = new Common.UI.Button({ + el : $('#id-menu-goto-footnote-next'), + cls : 'btn-toolbar' + }); + // set dataviews var _conf = this.mnuMarkersPicker.conf; @@ -1517,6 +1561,7 @@ define([ this.cmbFontName.setDisabled(true); this.cmbFontSize.setDisabled(true); this.listStyles.setDisabled(true); + this.btnNotes.setDisabled(true); if (mode.disableDownload) this.btnPrint.setDisabled(true); } @@ -1911,7 +1956,12 @@ define([ textPortrait: 'Portrait', textLandscape: 'Landscape', textInsertPageCount: 'Insert number of pages', - textCharts: 'Charts' - + textCharts: 'Charts', + tipNotes: 'Footnotes', + mniInsFootnote: 'Insert Footnote', + mniDelFootnote: 'Delete All Footnotes', + mniNoteSettings: 'Notes Settings', + textGotoFootnote: 'Go to Footnotes' + }, DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index b5f7d1d36..44f996cd9 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1115,6 +1115,24 @@ "DE.Views.MailMergeSettings.txtPrev": "To previous record", "DE.Views.MailMergeSettings.txtUntitled": "Untitled", "DE.Views.MailMergeSettings.warnProcessMailMerge": "Starting merge failed", + "DE.Views.NoteSettingsDialog.textTitle": "Notes Settings", + "DE.Views.NoteSettingsDialog.textLocation": "Location", + "DE.Views.NoteSettingsDialog.textFootnote": "Footnote", + "DE.Views.NoteSettingsDialog.textPageBottom": "Bottom of page", + "DE.Views.NoteSettingsDialog.textTextBottom": "Below text", + "DE.Views.NoteSettingsDialog.textFormat": "Format", + "DE.Views.NoteSettingsDialog.textNumFormat": "Number Format", + "DE.Views.NoteSettingsDialog.textStart": "Start at", + "DE.Views.NoteSettingsDialog.textNumbering": "Numbering", + "DE.Views.NoteSettingsDialog.textContinue": "Continuous", + "DE.Views.NoteSettingsDialog.textEachPage": "Restart each page", + "DE.Views.NoteSettingsDialog.textEachSection": "Restart each section", + "DE.Views.NoteSettingsDialog.textApplyTo": "Apply changes to", + "DE.Views.NoteSettingsDialog.textDocument": "Whole document", + "DE.Views.NoteSettingsDialog.textSection": "Current section", + "DE.Views.NoteSettingsDialog.textApply": "Apply", + "DE.Views.NoteSettingsDialog.textInsert": "Insert", + "DE.Views.NoteSettingsDialog.textCancel": "Cancel", "DE.Views.PageMarginsDialog.cancelButtonText": "Cancel", "DE.Views.PageMarginsDialog.notcriticalErrorTitle": "Warning", "DE.Views.PageMarginsDialog.okButtonText": "Ok", @@ -1566,5 +1584,11 @@ "DE.Views.Toolbar.txtScheme6": "Concourse", "DE.Views.Toolbar.txtScheme7": "Equity", "DE.Views.Toolbar.txtScheme8": "Flow", - "DE.Views.Toolbar.txtScheme9": "Foundry" + "DE.Views.Toolbar.txtScheme9": "Foundry", + "DE.Views.Toolbar.tipNotes": "Footnotes", + "DE.Views.Toolbar.mniInsFootnote": "Insert Footnote", + "DE.Views.Toolbar.mniDelFootnote": "Delete All Footnotes", + "DE.Views.Toolbar.mniNoteSettings": "Notes Settings", + "DE.Views.Toolbar.textGotoFootnote": "Go to Footnotes" + } \ No newline at end of file diff --git a/apps/documenteditor/main/resources/less/footnote.less b/apps/documenteditor/main/resources/less/footnote.less new file mode 100644 index 000000000..d50272e28 --- /dev/null +++ b/apps/documenteditor/main/resources/less/footnote.less @@ -0,0 +1,124 @@ +.footnote-tip-root { + position: absolute; + z-index: @zindex-tooltip + 5; + width: 250px; + + .tip-arrow { + position: absolute; + overflow: hidden; + } + + &.bottom { + margin: 15px 0 0 0; + + .tip-arrow { + left: 50%; + top: -15px; + width: 26px; + height: 15px; + margin-left: -13px; + &:after { + top: 8px; + left: 5px; + .box-shadow(0 0 8px -1px rgba(0, 0, 0, 0.2)); + } + } + } + + &.top { + margin: 0 0px 15px 0; + + .tip-arrow { + left: 50%; + bottom: -15px; + width: 26px; + height: 15px; + margin-left: -13px; + &:after { + top: -8px; + left: 5px; + } + } + } +} + +.asc-footnotetip { + padding: 15px 8px 10px 15px; + border-radius: 5px; + background-color: #fff; + overflow: visible; + + .box-shadow(0 4px 15px -2px rgba(0, 0, 0, 0.5)); + font-size: 11px; +} + +.asc-footnotetip .tip-arrow:after { + content: ''; + position: absolute; + top: 5px; + left: 8px; + background-color: #fff; + width: 15px; + height: 15px; + + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + + .box-shadow(0 4px 8px -1px rgba(0, 0, 0, 0.2)); +} + +.asc-footnotetip .show-link { + margin-top: 15px; + + label { + border-bottom: 1px dotted #445799; + color: #445799; + cursor: pointer; + } +} + +.asc-footnotetip .move-ct { + position: absolute; + right: 0; + bottom: 0; + height: 16px; + margin: 8px; + + .prev, .next { + width: 16px; + height: 16px; + display: inline-block; + cursor: pointer; + } + + .prev { + background-position: @search-dlg-offset-x @search-dlg-offset-y; + } + + .next { + background-position: @search-dlg-offset-x @search-dlg-offset-y - 16px; + } + + .btn { + &:hover, + .over, + &:active, + &.active { + background-color: transparent !important; + } + + &.disabled{ + cursor: default; + .prev { + background-position: @search-dlg-offset-x - 32px @search-dlg-offset-y; + } + + .next{ + background-position: @search-dlg-offset-x - 32px @search-dlg-offset-y - 16px; + } + } + } +} diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index d7d71fe4d..55a28fad9 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -149,7 +149,7 @@ .title { padding: 5px 0 5px 20px; float: left; - max-width: 95px; + //max-width: 95px; overflow: hidden; text-overflow: ellipsis; } @@ -333,6 +333,7 @@ .button-normal-icon(btn-zoomout, 58, @toolbar-icon-size); .button-normal-icon(btn-columns, 82, @toolbar-icon-size); .button-normal-icon(btn-pagemargins, 83, @toolbar-icon-size); +.button-normal-icon(btn-notes, 83, @toolbar-icon-size); .button-normal-icon(mmerge-next, 71, @toolbar-icon-size); .button-normal-icon(mmerge-last, 72, @toolbar-icon-size); From 4d49adbc00f5241a0572b39ff43e610a8e5ee148 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 19 Dec 2016 15:02:03 +0300 Subject: [PATCH 22/42] [DE] Debug footnote settings. --- .../main/app/template/NoteSettingsDialog.template | 0 apps/documenteditor/main/app/view/NoteSettingsDialog.js | 5 ----- 2 files changed, 5 deletions(-) delete mode 100644 apps/documenteditor/main/app/template/NoteSettingsDialog.template diff --git a/apps/documenteditor/main/app/template/NoteSettingsDialog.template b/apps/documenteditor/main/app/template/NoteSettingsDialog.template deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index 5c666be1e..002c8a69b 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -109,11 +109,6 @@ define([ '
', '
', - '', - '
', '', From 8175061cc1e8a5f2104683d5c798b1c45b5cd159 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 20 Dec 2016 16:12:03 +0300 Subject: [PATCH 23/42] [DE] Add sdk constants for footnotes. --- .../main/app/view/NoteSettingsDialog.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index 002c8a69b..195294861 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -149,11 +149,11 @@ define([ menuStyle: 'min-width: 140px;', editable: false, data: [ - { displayValue: this.textPageBottom, value: Asc.section_footnote_PosPageBottom }, - { displayValue: this.textTextBottom, value: Asc.section_footnote_PosBeneathText } + { displayValue: this.textPageBottom, value: Asc.c_oAscFootnotePos.section_footnote_PosPageBottom }, + { displayValue: this.textTextBottom, value: Asc.c_oAscFootnotePos.section_footnote_PosBeneathText } ] }); - this.cmbFootnote.setValue(Asc.section_footnote_PosPageBottom); + this.cmbFootnote.setValue(Asc.c_oAscFootnotePos.section_footnote_PosPageBottom); this.cmbFormat = new Common.UI.ComboBox({ el: $('#note-settings-combo-format'), @@ -205,12 +205,12 @@ define([ menuStyle: 'min-width: 140px;', editable: false, data: [ - { displayValue: this.textContinue, value: Asc.section_footnote_RestartContinuous }, - { displayValue: this.textEachSection, value: Asc.section_footnote_RestartEachSect }, - { displayValue: this.textEachPage, value: Asc.section_footnote_RestartEachPage } + { displayValue: this.textContinue, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous }, + { displayValue: this.textEachSection, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartEachSect }, + { displayValue: this.textEachPage, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartEachPage } ] }); - this.cmbNumbering.setValue(Asc.section_footnote_RestartContinuous); + this.cmbNumbering.setValue(Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous); this.cmbApply = new Common.UI.ComboBox({ el: $('#note-settings-combo-apply'), From a2c03c3ea0821a3d123b2e430c2bde0d6105e97c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 20 Dec 2016 17:29:37 +0300 Subject: [PATCH 24/42] Show co-authoring mode settings regardless of the license. --- apps/documenteditor/main/app/controller/LeftMenu.js | 2 +- apps/documenteditor/main/app/controller/Main.js | 4 ++-- apps/documenteditor/main/app/view/FileMenuPanels.js | 4 ++-- apps/presentationeditor/main/app/controller/LeftMenu.js | 2 +- apps/presentationeditor/main/app/controller/Main.js | 4 ++-- apps/presentationeditor/main/app/view/FileMenuPanels.js | 4 ++-- apps/spreadsheeteditor/main/app/controller/LeftMenu.js | 2 +- apps/spreadsheeteditor/main/app/controller/Main.js | 4 ++-- apps/spreadsheeteditor/main/app/view/FileMenuPanels.js | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index 30626e67f..93b10ee92 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -283,7 +283,7 @@ define([ this.api.SetTextBoxInputMode(parseInt(value) == 1); /** coauthoring begin **/ - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) { + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { value = Common.localStorage.getItem("de-settings-coauthmode"); var fast_coauth = (value===null || parseInt(value) == 1); this.api.asc_SetFastCollaborative(fast_coauth); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index a064b1363..e0f3eb217 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -822,7 +822,7 @@ define([ me.api.SetTextBoxInputMode(value!==null && parseInt(value) == 1); /** coauthoring begin **/ - if (me.appOptions.isEdit && me.appOptions.canLicense && !me.appOptions.isOffline && me.appOptions.canCoAuthoring) { + if (me.appOptions.isEdit && !me.appOptions.isOffline && me.appOptions.canCoAuthoring) { value = Common.localStorage.getItem("de-settings-coauthmode"); if (value===null && Common.localStorage.getItem("de-settings-autosave")===null && me.appOptions.customization && me.appOptions.customization.autosave===false) { @@ -1755,7 +1755,7 @@ define([ }, applySettings: function() { - if (this.appOptions.isEdit && this.appOptions.canLicense && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { + if (this.appOptions.isEdit && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { var value = Common.localStorage.getItem("de-settings-coauthmode"), oldval = this._state.fastCoauth; this._state.fastCoauth = (value===null || parseInt(value) == 1); diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 311edaa73..2a047e51b 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -315,7 +315,7 @@ define([ } /** coauthoring begin **/ $('tr.coauth', this.el)[mode.isEdit && mode.canCoAuthoring ? 'show' : 'hide'](); - $('tr.coauth.changes', this.el)[mode.isEdit && mode.canLicense && !mode.isOffline && mode.canCoAuthoring ? 'show' : 'hide'](); + $('tr.coauth.changes', this.el)[mode.isEdit && !mode.isOffline && mode.canCoAuthoring ? 'show' : 'hide'](); /** coauthoring end **/ }, @@ -375,7 +375,7 @@ define([ Common.localStorage.setItem("de-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ Common.localStorage.setItem("de-settings-livecomment", this.chLiveComment.isChecked() ? 1 : 0); - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) { + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { Common.localStorage.setItem("de-settings-coauthmode", this.cmbCoAuthMode.getValue()); Common.localStorage.setItem(this.cmbCoAuthMode.getValue() ? "de-settings-showchanges-fast" : "de-settings-showchanges-strict", this.cmbShowChanges.getValue()); } diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 7e563df19..5d8200b7c 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -231,7 +231,7 @@ define([ this.api.SetTextBoxInputMode(parseInt(value) == 1); /** coauthoring begin **/ - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) { + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { value = Common.localStorage.getItem("pe-settings-coauthmode"); this.api.asc_SetFastCollaborative(value===null || parseInt(value) == 1); } diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index d2f978d8e..54d94c1f3 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -610,7 +610,7 @@ define([ me.api.SetTextBoxInputMode(value!==null && parseInt(value) == 1); /** coauthoring begin **/ - if (me.appOptions.isEdit && me.appOptions.canLicense && !me.appOptions.isOffline && me.appOptions.canCoAuthoring) { + if (me.appOptions.isEdit && !me.appOptions.isOffline && me.appOptions.canCoAuthoring) { value = Common.localStorage.getItem("pe-settings-coauthmode"); if (value===null && Common.localStorage.getItem("pe-settings-autosave")===null && me.appOptions.customization && me.appOptions.customization.autosave===false) { @@ -1510,7 +1510,7 @@ define([ }, applySettings: function() { - if (this.appOptions.isEdit && this.appOptions.canLicense && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { + if (this.appOptions.isEdit && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { var value = Common.localStorage.getItem("pe-settings-coauthmode"), oldval = this._state.fastCoauth; this._state.fastCoauth = (value===null || parseInt(value) == 1); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index ff96d1159..aa48251d3 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -260,7 +260,7 @@ define([ this.lblAutosave.text(this.textAutoRecover); } /** coauthoring begin **/ - $('tr.coauth.changes', this.el)[mode.isEdit && mode.canLicense && !mode.isOffline && mode.canCoAuthoring ? 'show' : 'hide'](); + $('tr.coauth.changes', this.el)[mode.isEdit && !mode.isOffline && mode.canCoAuthoring ? 'show' : 'hide'](); /** coauthoring end **/ }, @@ -303,7 +303,7 @@ define([ Common.localStorage.setItem("pe-settings-inputmode", this.chInputMode.isChecked() ? 1 : 0); Common.localStorage.setItem("pe-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) { + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { Common.localStorage.setItem("pe-settings-coauthmode", this.cmbCoAuthMode.getValue()); } /** coauthoring end **/ diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index 3bc0df158..13a22a08b 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -257,7 +257,7 @@ define([ (!(value!==null && parseInt(value) == 0)) ? this.api.asc_showComments() : this.api.asc_hideComments(); // this.getApplication().getController('DocumentHolder').setLiveCommenting(!(value!==null && parseInt(value) == 0)); - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) { + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { value = Common.localStorage.getItem("sse-settings-coauthmode"); this.api.asc_SetFastCollaborative(value===null || parseInt(value) == 1); } diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index ade7181d6..25455056e 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -581,7 +581,7 @@ define([ this.isLiveCommenting = !(value!==null && parseInt(value) == 0); this.isLiveCommenting?this.api.asc_showComments():this.api.asc_hideComments(); - if (this.appOptions.isEdit && this.appOptions.canLicense && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { + if (this.appOptions.isEdit && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { value = Common.localStorage.getItem("sse-settings-coauthmode"); if (value===null && Common.localStorage.getItem("sse-settings-autosave")===null && this.appOptions.customization && this.appOptions.customization.autosave===false) { @@ -1761,7 +1761,7 @@ define([ }, applySettings: function() { - if (this.appOptions.isEdit && this.appOptions.canLicense && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { + if (this.appOptions.isEdit && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { var value = Common.localStorage.getItem("sse-settings-coauthmode"), oldval = this._state.fastCoauth; this._state.fastCoauth = (value===null || parseInt(value) == 1); diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index d55744713..0551bcda4 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -652,7 +652,7 @@ define([ this.lblAutosave.text(this.textAutoRecover); } $('tr.coauth', this.el)[mode.canCoAuthoring && mode.isEdit ? 'show' : 'hide'](); - $('tr.coauth.changes', this.el)[mode.isEdit && mode.canLicense && !mode.isOffline && mode.canCoAuthoring? 'show' : 'hide'](); + $('tr.coauth.changes', this.el)[mode.isEdit && !mode.isOffline && mode.canCoAuthoring? 'show' : 'hide'](); }, setApi: function(api) { @@ -733,7 +733,7 @@ define([ Common.localStorage.setItem("sse-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ Common.localStorage.setItem("sse-settings-livecomment", this.chLiveComment.isChecked() ? 1 : 0); - if (this.mode.isEdit && this.mode.canLicense && !this.mode.isOffline && this.mode.canCoAuthoring) + if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) Common.localStorage.setItem("sse-settings-coauthmode", this.cmbCoAuthMode.getValue()); /** coauthoring end **/ Common.localStorage.setItem("sse-settings-fontrender", this.cmbFontRender.getValue()); From 6faa69ff4d59f412d9933b84f348bad227123c05 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 20 Dec 2016 17:34:01 +0300 Subject: [PATCH 25/42] [DE] Update footnotes settings. --- .../main/app/controller/Toolbar.js | 15 +++++- .../main/app/view/NoteSettingsDialog.js | 50 +++++++++++++++---- apps/documenteditor/main/app/view/Toolbar.js | 2 +- apps/documenteditor/main/locale/en.json | 2 + 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index d08783599..c9fddd361 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -1996,7 +1996,17 @@ define([ if (item.value == 'ins_footnote') this.api.asc_AddFootnote(); else if (item.value == 'delele') - this.api.deleteFootnotes(); + Common.UI.warning({ + msg: this.confirmDeleteFootnotes, + buttons: ['yes', 'no'], + primary: 'yes', + callback: _.bind(function(btn) { + if (btn == 'yes') { + this.api.deleteFootnotes(); + } + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, this) + }); else if (item.value == 'settings') { var me = this; (new DE.Views.NoteSettingsDialog({ @@ -3067,7 +3077,8 @@ define([ confirmAddFontName: 'The font you are going to save is not available on the current device.
The text style will be displayed using one of the device fonts, the saved font will be used when it is available.
Do you want to continue?', notcriticalErrorTitle: 'Warning', txtMarginsW: 'Left and right margins are too high for a given page wight', - txtMarginsH: 'Top and bottom margins are too high for a given page height' + txtMarginsH: 'Top and bottom margins are too high for a given page height', + confirmDeleteFootnotes: 'Do you want to delete all footnotes?' }, DE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index 195294861..7bbd304b1 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -50,7 +50,7 @@ define([ DE.Views.NoteSettingsDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ options: { contentWidth: 300, - height: 335 + height: 380 }, initialize : function(options) { @@ -79,7 +79,7 @@ define([ '
', - '
', + '
', '
', + '', '', '
', '
', + '', + '
', + '
', - '
', + '
', '
', '', '
', - // '
', '
', + '
', '', - '', '', '', - '', '', '', '', - '', '', '', - '', '', '', '', + '', + '', '', - '', - '', - '', '', '', - '', '', '', - '', '', '', '', - '', '', '
', + '', '', '
', - '', - // '
', - '
', - '
', + '', + '
', '
', - '
', + '
', + '
', '
', + '', '', '
', - '', - '
', + '
', + '', + '
', + '
','
', + '', + '
', + '
', '
', - '', - '
', - '
', '', - '
', + '
', '
', + '', '', '
', '
', - '
', + '
', + '
', '
', - '', - '', - '
', + '', + '
', '
', @@ -150,7 +146,7 @@ define([ this.cmbFootnote = new Common.UI.ComboBox({ el: $('#note-settings-combo-footnote'), cls: 'input-group-nr', - menuStyle: 'min-width: 140px;', + menuStyle: 'min-width: 150px;', editable: false, data: [ { displayValue: this.textPageBottom, value: Asc.c_oAscFootnotePos.section_footnote_PosPageBottom }, @@ -162,7 +158,7 @@ define([ this.cmbFormat = new Common.UI.ComboBox({ el: $('#note-settings-combo-format'), cls: 'input-group-nr', - menuStyle: 'min-width: 100px;', + menuStyle: 'min-width: 150px;', editable: false, data: [ { displayValue: '1, 2, 3,...', value: 1, maskExp: /[0-9]/, defValue: 1 }, @@ -179,7 +175,7 @@ define([ this.spnStart = new Common.UI.CustomSpinner({ el: $('#note-settings-spin-start'), step: 1, - width: 100, + width: 85, defaultUnit : "", value: 1, maxValue: 16383, @@ -191,7 +187,7 @@ define([ this.cmbNumbering = new Common.UI.ComboBox({ el: $('#note-settings-combo-numbering'), cls: 'input-group-nr', - menuStyle: 'min-width: 140px;', + menuStyle: 'min-width: 150px;', editable: false, data: [ { displayValue: this.textContinue, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous }, @@ -206,7 +202,7 @@ define([ allowBlank : true, validateOnChange: true, validateOnBlur: false, - style : 'width: 100px; vertical-align: middle;', + style : 'width: 85px; vertical-align: middle;', value : '' }).on ('changing', function (input, value) { me.cmbFormat.setDisabled(value.length>0); @@ -216,7 +212,7 @@ define([ this.cmbApply = new Common.UI.ComboBox({ el: $('#note-settings-combo-apply'), cls: 'input-group-nr', - menuStyle: 'min-width: 140px;', + menuStyle: 'min-width: 150px;', editable: false, data: [ { displayValue: this.textDocument, value: Asc.section_footnote_RestartContinuous }, diff --git a/apps/documenteditor/main/resources/img/toolbar-menu.png b/apps/documenteditor/main/resources/img/toolbar-menu.png index 4a3467f6cc60220ae2c5d44a6bd04134cd091c51..91fc2ad348c7ffca4d17d3481bc8c847c21a8ebb 100644 GIT binary patch literal 24063 zcmaI7Wmucb8a9eUaCa^4P%J=jcXtZK3IPg13PEeQyB8_$P6Ne?7B5~PxR(|P(Bkl= zYwf+ibIy-*@gwB*cP8`9Z4<4pt44rJi;IGSLZG3pY>4~>p`c*FaIld7!3jDdkRLR@ zD(1dMo-cg;?Yx~(6dXP6otQOV+BrKJI@vh}c#SwA&v;g(p{!sGUH`zU2CSVZC{_Sjd!kBuN%Mef2G4zsm*~t&%G-zrZt}c zS-$^PZC0-=kBN!tB;Za;^X$5+KBCppDz@}VozM2J#n!GGiLS7mu}5dH2SKh2rvSjC z6SNYUBH;YX7}hom7<qbVMog+A96?RT-3e)jTfd_Lj&izMgXvKD6Xo$56Q+h*n!stx}+z1iyDM`IV}XW{$zj{jcd|L+UB;lb^u zO;_M`7x=T%F17=q82&&kdfCo-&?_mWUA^}^A^|Mj>bu+*?a`w|6`hn@J#9NfR`q9k z7wv7M&y3gV&iY^+@kG0Uqhkkf0H8L8jA&i%wR`~HhZVsL4I|f*vu8Y)rq}vXmv(5V z?FiROxWO*Ev4{MAsIKM}zUEfVQnB=Qw5fvcY#t!C zEAEiB+|kn|oWdLJ{j+yKRUs8no$j68E*vveqy~+Yj=f1C-{n40}R1{O;=TDIs4FL*y78R^_S6~ zq+?F4Yqx|XC*!Y_JUZtsRUEyo87NSIn$;#c3DQq6c81()=4UvD-HJu?+`v!U0re|u z1*s+9HA~sUn%mC{ubae^yTDl8!klZ~4Y`nZPz*$3FLE?qLP2}^iH5c1Kfi)kE1OZw z7INuov-=M`iC%&O_-mM3n58(^%N4=2A)$J^gP~`o{NY*w9X<~BvMwH=O!w~cAlUbT z*%;EvUqgcwDRfg>3%@9DQgrEX{bOwD7?sqK2mL&fT@2RPr^fMzji#C$lQ8eNXf;_w z1uWQz*wVa5VG%LzU(Q%!gN8a$ zqN(p2#51S^)q!#>B3Kgu2^(SyxtV~qy^;DET(U_Wb1XRtcjK)h26v$$kWjwhwy&;SzIHnGi`)puMB zv*S-QoRa7Sr?vtett}VTBP#K|w+|h7YDZftBT_RIJUTmJPRq*u^vHvzq+P}TaCj+% zEW&6vhwy&j4KF}Gp?ukL4Wsi^M49$pIcOYh9c!8{wxgMw6~+4kLuhYVjlINieip3t ze+z^W9CIMw?AklsQ;>@bnx&8+1LeWqviKTF_Jzeg$4J~a>7dfKVA+f#KHGb$nC5=KWv<}rW$G%YT5aG@c0FDTz~#xk9b$R96j zz(UK}>6S0wv@OVzbe8mgg)1D=UTT=1@zSvY^f5i}3=>Q(@x+t*-7Im8zoUc(99mJ4 z!?Ngx^(yWi&ZT}p$LQ^?wVT4CZXHmjzhp`I--%S+=1|oPQ}4EGSxr2GgfE1EsFe`7^-<)*RSwd+7X>(pY)IJ59P!M zxck?*ePKhZBW#ZJ6OiqI@}2hc>>F&bl>538%46mdm!pFg@`UAY(2*rnwrg(`BZYSYta~M-@qP z&x){}!|>KYRAc094Bc9?R(LLhxU1Uq)NmxNX0;8Qw}+JMdBt?pQhu}2Q%=*VED4q> zj&gF^e5bB8;=V1t6CxPJF zq3hn_TM(Cs^Q87!PwA<9s+z1nOX}sv9g#yKrW#a6e1yH8Q*@+3{C(>b-PWHB-}2y` zKa!Qm{#EyD|05~9*#l-t-Dlopi+$Rww34q_5cGzuEnbIOrw%}_m*SrC4Zj`nEzGUD zGogDi;ptJ!+v{4xYu1}?o+29W?IM7u(KXslH~(mj5B@k2)xE3cwWU<%K%OMxTOJ~Q zsE4~pZ{NPPzwUZsadKjDT&PacXS02;Q&swts)*YmQLG#H|Imq93X1$I3mZ*E5OXz% zO}8oElxB0#rqZcq6#a|ENrV!yH5lNa>-lu^HwGt1n^?l$J22pb)PiJyI*Ab-UfGU&=pCsxFh4$Uh@dEHzG9NPsr9jZT##SvW$>)n|IDe;KJMv z&s_DKWcU#+qrI~!Lbdu9=qnceTGC^D;>gwi*Kus6TIh4p!D zGgKx|gl}O++monn*1g}l?mp(xP$Em(9q<|HIFDR4$=n-c`H35e+QoDTuLOkc49$*s zl=;-FB@^=WJKy49UtE)S__c*2XUCpX7QBmVv5r4@bOd?^?bV}hA$9l4i+<)fU*jWt zt_6W#K%UEri?}awJpX_sJuTh9p>XKuLg=(mPs=kjlr2l#zqkiE?&=2aH%t06MvFc9 z`ZIt}7&rJRd{Qv6x~qRtdVioJGP7`f@z%_~$4jn{D{lg?fonYtIph*r4&0Rm0-xUu z_i7JNPVKaUyI=BuKwDe<0Eb>bzrGRGEp1J2XWSfGNe_bzImEm!dfLuWCWM?F8E5l# zDCYbK35p>~#`*7c?9o`pa6QGH^42a@i4Wy zW)2vFgU$Oln*cv@F85Ogv6ZF&qFqQCXldzo|90Il5WmRBJeo}9ZNtMqTTZ{IwK+7_ z3}VvAn#CAH)6=&6-=CC~PGD6jfFl|__{GWtJVQF05*7Ksezyhy$_=??daAu`haN-C zc9o%w*OR90Vwn+ERdB+X#c(Cn`mr{OHskkF>quXW(V{Bxv{#$2bO!}Uj8e2pCk&#Ly(%%|w4Ey?xyAx&Q zYR;4Zm^(v9nqM%qVI4DGrs)}a-u)F0y-R%$gJEdi+g;Tm548Axi>ZFF4l>5-Y?fm- zX`anTukFozqT`ha@eMxxj0$`rG-u4G+MkScve>+~Lu$M|Z-UcCJvrx3Nz?U=uQk&3 zB6b?NJUVrFdaBOQ0+VvLU4UOjZupzaDX0X$&Pv6N&1&ZG%+n&~>oPL_9eOZL_NB`P zshkV!9fpwJ3nn;pKl#%ungOO&#nh9}DAu#>TjYz2*FL$zUd>t!40G)hg5EkEXmA zTtQ_Vqw&s`8Rt3xXD18YOoydvawo}hv{9Szj9pQsrDic5kIsswJWnlP^{98pKii$6 z!GQk`IpxYx3rK5sx~k z$d$T$*e((Dtrt@1x0S)^qw7L*Rmj`#3r*4tsq~9` z&&{kDKYSiNslKCDsvV6t!x?n*4w*F2V$ym6B?RP%BHNO^*<;XYhUx7WP+;spe5BTw zdx>N+=6{JMq%{tj_G+$}kCky=so!#6%002KLIzM2hxqsh#Md}n1lUY{VlB6#noC!2 z5ynds)KiM@Q}T{ZP|#zi|Hb=CWkv=O8(A|NN&+)y0_XgkPk$9VoWiwC|WIg~PSo=>Cs0HPJSw6&M?sN{v`FYOn zBV?OD@w7a1h4gr+M%beh;KeWh4@P&^7+_r)2DhJSXpa>dF)jvd42f7~v&TS;xm2m( zjxJ~tHpVV$uZg?g&-G!IselJcQ1^#sm81=5C!56%YvQcS95STuJ0_qSNO|J@k!ms2 zT{P8h!8gKUHb9(qvV&IonZj;;->6UPB1B(Jrj8kjhZ!Ef(;ib6M*pQ1xx|G??ZRse zV$6p-D~d&y7)wR5;(a2_k@sr5&9QjcU5|9OijssV0ZLNV6a)4ec;h}KRU}>y(sb$1#(2QQ97VlbkBE0*+K+X z@lpFipU!$yy(~jtxGMtP_L()K)c&REf2S*q`^_Jnc=D~HVC$AZE@14Er&&PtsBQI~ zUV7r(@$H9AWb4nHwDSUEw{5G>#CR?_sr;CJb+c**9}4j38Mil%%Drm_N#epIo<4l} z<$EF&Wy6(A=V_ZBRBdgwJHg}m5xYTR*N;c9JP1(~OsPs;FlnA%fbJ}FaMF4!q0j8bSjT{g73*Kl z|L~LLFO={Ua6+`OZL$0ZDZ!esQBwSx#vD+E39s)!wH3l9bQO=1lczl}#K$3*UxkE2 z5@j5}2vrf?hdw>q`R^amoSE2D2jce$JrLcJzCAq}Z{LV(gn%VND$XqCD%a_!6)JE# z3!+73zkXOFjMOPDy)C3R04nVcli>`-m-om%Qy@B3wjzk^>dh}bd)wA6En*X@yx!j3 z(m&t9kig|!R%Ve8U6|c+(vNk4(Ykzh?8wX2j-d0}&erakJ&9+_n;$FFnlq#)`cGM{ z`4EYenJmnfka}F6(ND!LVRl;^{Odk5;zVW?VMgMkt!o=JlC#~$oR*3HN*vpjlg*NC zmnrtD<1eUe^_6#RQkVK@zuJ{AHxvfO&VSh-O%g>{%Jg#ggz!$Yi(4z5vARf z64?L({5O>yTf zey1gBtxBH)B?fcmZY;ULgi1_@&oh6K2vy;WY+SoQ!vOgPGy>G7Z0;oH^$HAHkJk;7 z9O;HbO0p#Rb$0Bw-Q4-FXv&zHTN}L)??xfy`M<|nk~pb((KuJ#jKa6fnko%1Q$eS+d&kdB>3%8uXo92@fH1z zxutFR#!`lzyC&9~bDpzMuC+H}9z6aax>Rw!7aZm+P|`ArK1JZ?chJxWPsi_r_T>48 z;;$7RnlFv#V)#pU&RwCz0H>!)HT!d*+hd!Kj62qZ79AXcHDCCGyi%eS@L3Lb=d_}}mD94C18LY5~QP0dI=D=cYu@R!F z3~^B=nkY&BX=cg3r?pTYM17$K4D)0);i3u%j}#!hY!+Q!~DnDyMa6%D;*dS;*Ww*~~Vb0SkHO1ck>8};mz4AA$?9NocSJ>&9U^|+h(4LG9RG;m8!(D#MEbM*Y z1(NUf9WQbf;Hah?({nQN{B$dbQvdlh7&F|^lI;LLjh!*V5Aw3EqwE9T>}3BcAW#_& z4W<2QOu5=mdExADWsQ$iU_m8ryT%E?z^0me;OWZRRLeR4n^MDE6WkQE$ugE_P za-O=(%o2>^N@{NFi1RwOu*P^0NsMjc#(q8kscQC%f1)Ap@c?6yxZ$Xy$p5cc|D%bE zlvZSA&@u6lh+BN}Sk0e864jR9AzGVDY>C0n(_SAdgY8%t>Fsc6v|x#ZcqEl%9M3nfOeS(Y{j74)o>|`1`}Rdov(UZ_ zG~dVT)G|feW$5V8N9&gq)?Uz?DdxF6;&XH^N#d3R`nL|XP{A~MQCg?TZm1={+xvZi z<8mTC8G}?JB{|@9RU^P|G0)34?>1sXpQ*V!HcV7(pA;(l;$_T!jz~hA&pI#;A$*je zER}M)`GfoZXQc|&bbCMGicjZjMVJ*uT3@kGWYDq^S!YNZpOsAOS)kM>qLE9yc;9HY z|F3dCo)(ObV&}y_kvRk~C>YO^JU1A7yoh!C_2vD6&X(e~WsYFH8=}VaEaU|(0um$= z>QxbaaV?qEKR8o42tFL=F4h+x`QhO@ zP47Y()N9(W@)l)&>JH9N_ru33ovLz*> zo@`l$o?(&@#=8v?e`Bk2N<|)SCzqC$@jqIHWT%k!aHzI_B46SMK7u~!g)`)B90Fu{ zypWDfe&$oYuxeJjli#%CkD26x6o}QBQ_X_O0Bpz~%=lCoqOB7C)rYXhGhU0@O!PK# zG;;cqV`KdCUQhck^9pYv6P;-_ktNieS9ifn zTucR)cjhYPc?@*{_`7zeK2<|fBb6p+{e%-RjTDC0i&s9|;gZyier@9&&-i1*k}697 zAJ0F=`wP*c{ocW@k`Fz|`Yc*QX=KC@IDJ?!H$0H=+b`YAaYY|uDkp-}>27v-gI5xR z(k{)eY18XVJ?zaOrbZ$^Kp;gTv=2Wci-7p=Ng_&lPVgrEu&%ISbK`S3$k#}S+;Up@ z?D~Ne9_>s;8%b;^Ys zHV5~gQyXfb0&W)1_F7a1SL^V{zn2{b_u2I+*uMW_f%;2z%pM8uNzyz;o8)tbz79J+ z@tEghVDf&68~)OrRKmu5>2bu3pCio6Cq^#J`V+%br0$UWEKFy{n$#qs`6VXe$1kwP z{|mU0Bm$GeW2igQjJq2$!D5wT)Dkv?ugHiD+A}I|XKuDkEM!y2E@*$IjEoT8 z^A$09O5aZbLkLCuW&s{ScC~1bW#~JX$u-0I4CQkRVGpg38HN%6DvmJHQlKzDeZEkd z?0VH%Ls(<2A=FNS?rUT}Lx-zORX|&A*)1UR464~r`cKK<3j);#cxf;5<{j}9I6cWF zM>;9LyE}&X`<1d+k$Qezl2FusW+0UQ0YCjS3@HMIm!l_R=L@rnhv}g@8;^4{Zf<2r zc!1ziKk2#F6vx@6r_xTDxol`EBRSwZS$`EGz#uPw>$k7@WXj?-84JAR&tTlbV+<1c zHVTK1uVZ+IC9zt|>i`MMK<@lc;tOJKCr}Jgio8}YLr_myr}=)uk#cfGfL<=$fH=;0)Y5OIjHs+C~lgv(&Q=T%^helzLDQe zwHQ&LQ?6s&8aQmJ}`)^52wKK@I+N?=db&9zYnS`RmyKVoHll|h6ZE|tM_q_ zIh5dy#btU1kf;7F`>x>1($b7Np6(0d209_}f0P+3LM-%epvy=kExOZhM@lo-jTnfq ze|?*()_#>rvw9oP>i$F2%yn)qE@1yzk0PQFdJZfu+39~d{7yX0vT7&SMI|eYclU=K z%;?@CukGgr@uD!Hjh5VE^3GWEOhcsp(3D_VkYPmQfjUU4;OU%4zMk60umYXSouFMU z?4(y_B7K}0xQE1!bN2=%S{va>n%PNy(J~-3};CKHHIT3J(k7RAxEBAm$4%mx&YVEG-eM z=lESSmZ{bQ5Cwm-A1UMj0Jj51xjXj6<{M&o&`YtC0-4?b@~sSZi#Rm8k@)Z0w>Ioh z4GTroNT8Ht3>PnWw85-@h$5rfWFk!q46Nvjan0z<_sc6%L#k^m_x7K;5$IU>-wHZx z6J|Y{Hj{$`WS1urp~MeiY6J(c zCFrv}=Y^urWId(n#mZdKfn!e+Medl8Vu!FL3^;nb!8hqfz9q?Bg8hDd%J^CgvJl1S zfJ6@YvZ`Z8Hd~hxCdWFD&ELh5g9O4&9Y<-e3=tvMi;2mFAwoH3u9*GbIkVW1^@Vy+ z*R8~{%r|zt@t_fj@}$|M;pnlM#tnQU^Qx~d*z3|Nr}Rug_@+M(YS+aMPdZjfcmc@t z4y4KZb+9tol)HgI70-HENi~Ofccwhe-Jj@Kio|qgH|_YfBy6_ z+&E4Si-eHYeuttBJDXvl%HJ?=M9^y+lfdFE#Z%$MUG1n^s>Ht5cgLvdXFTgl1&dX| zO%fi)5l{}L45=!3wyY;-(@}~q(Fr?&w!!r~Vx(c}Ntisav~_aen0gV}sOF99aFR&p zX_1u6W1xj(TF9({Fn=^yLz@@R-cmSFdzW^$=?6arel8iq`Gte~{Kq7l$za z>&`pkYt7-71G$$urBuC3RzlmUc!yHPejvKO%m{emzF;$XgW{?C6GoNiU0AR9R)>&O zq=~DC9=aA4Ns|A{dbzwai^HSy4hR*ejfmoOp_|o=$=p|y#jRg<1M*>oBg*j5d9dI< zn-pVNru3Z+Ss5hxI@;Al?QdAWEGZt4#TeEQT@y&Gg_S_t>e$x!NlETaDDJ0?De?L0O^#YOfBdiSC=ev zEM{Qr69LKrz+u?)Do>6sFR9`sa{3mw=?aNJ=rHRThZi2@3gu=LXNkqFaxFL3!; zw-+npm0~+@wjFkQWOXpc+cxZ%3+kAgPEqhLJUu06(L5*UlX0SV-AktZS04i~fFeU} zRiONQj&76JY!Rw3grPChh886F*$uzlCgKXn5${wi4wSa5{q~WPsWLd!c*2|zy8lfn zPmSo?FBX98%Qim)!fqq`nA!?~Kn&}hl8~8gdNT@S$SVS>%`NG(-;VdvSCMi9_ zmd)o-XD{--{IEfQ6;pA>?$B)xPZfHvMJa(-PtnZOG9?Df5yx1u`yRgrO*$}gH4=uI4#ao6D80gv5%siRO!VO7Yw}bkBsXoy;-Na2=GOF<1@8(y?H}y zl`ID%EysL3Co24|2zU+(DgMY+-?^P6wqE!}Aw^cL7Wo3Yf<8nPSjN}+kWnF8Nk-Dyrw7Dgr8QAtr&_@e!WXfU zEmYWoQ{Sc%<^#UUpB;L`p=<10PjsIBtFu5BNb6F_N=iSGZ;WYb^D3ldA=3;0eZ-{%RO#AypP0MboplG}N-nurr!PdtuZ%D1s;2~j98zoM4YboTHs@tIRFXsUOm-k73sAQ*%yJB0&jAQkj)7@3VID$*zHq^ zg#3166dH!rTM^sD4#0F*3k`8t@BC=6a)$pztG9OX>#X=I*|GAvD$s?~) zSo09;m-jjBbMykX@7?_7(4DjCtc%DqVHN0;Jp7O7&f)CV^+)XN>uo}MZtU$2{2HuR zX^>nuYvUbpm~W;Z+>ObE*XFM3M0MC9CkjNh0u)5|cOZ7#exbfA=k3E6 z)`zzkkc>oycsQVez%fz)d4K*zjXKYNuZCiAn`?36F#L;&vUI!9E) zt@D&&_|x2F2~Psa)H=E9f!ZB2tL(*`r7*0A!tT4WmQ>B z_TeNreV^xgLFIQw!?Vt~1bL@wJb;)=wTT*ULqEZ?jsr+a6}juf2jx~#eG8Q)B*fCQ zoECJ%wcb}%O!}`^7bNb${QhfevZuDGuNkC2e z;>@M0FT+HKpYebLy9!3n$3N#MbHUa+!z4ST_Ss_+?ve2b{FTjc!#aBXh=RBuJ%CP)m0i-Czee>~<)>y6bcKa_* zGFBU;{NCS(s>+{*>XKgx$COcsrzo>|q{)tr`EY0AY zlH`RX_=|a>(jO9dqkY{8Y}H;wDsBSf+zx%LS0EX8SzQsp#s8*xY z>1`Lj%!^IjPP#Q>68Csar#mr*V7=Xb?gRJxOrT<7e;Fx!5FuO<$*t+-)%OQ!D3>1< zg-n@Tb3Km&Z`P2&ztTJC_n^BQ}{T8uRKk(d*8N96v!LrfQ z`Db^3)GUrr*(-b?>#t1C=~EL&Kl42ysVm+nn^;zDs7Gg;)+Op7;#wBO3l~=cIERlW4SyN1PN;a$)K9xiIvgv^Ra{O2!rm6kTfQ|>)BS{F2dCyudiLmYno4U^1NpB zp7QI+FT2I-!*OW1>%ie$pZ{jW^T@5p3Wrh$zn1$ryWvW2<}0b1!>-piuM4?=%i#x# zU5)O1h(O%ViY0QtPYfr;@B>$A4zEQC}hL%%0c5vh7``U3}d+bfl zQ;+fwbe74E?=i@LX?(}7 zTdQ0>N9=UNB`1ZDaS7a?&#>@T-eV8);&5sJA4vP9>C%GbyfZdIPKvcOv8IgK5@xRT zJ1Z+u4X)!Np@OyKD6VMxh;0@8fiB0ZeFc&TbEsxpC(5;cGmHq|BmCXluKY4u)!{-6 zFlGd8Z!P-SNZK^HRrPr+L04H^qAHb9_Ue1=KO#kXYfuI4Zz0e9 zKpAnzEJcL-iXr>@+K$0>DUsrzkQq4BJmKwbzDy9IX*=^lU>wNYNgTw!GR;%)^7eDf zX6j4j$*!X$xr+Qf1^{0*Ipg)L*Xo32SgYKJ8{-iPRt*|PZ4ZWyNLc0U^QVt6aKoO* zvC?|#27}6(9Z7)hZt=+7HVMbet%a=jVs@!GP;3>T`KfyD3D0$c--r>6lhN);N0zo1 zzmn5PjGA)e)9T7I!h{!ehm(XKYP0S0 zE(BDhVW$v2Qz~{Q542cmNBg<6gRjSS15ihQ&!$F}5aX4cj`H{j)}3mV)(Z){vn8md zTlRQ;&1sujwhy=7SZYGCcf_#ihWqQ-Aix&$Q~bz>*n~1Z;j!42u^>&CGafSN_)7!|l@TB_i z#;%OE+iaJt=t8KM!1&AaA%#L^OkUcDV%D)Lf%}Vk@dwBJdlS= ztRCdiok+e9I<>pAdI$YGRanp>lCr_`EM>bx5xq-wYoc~5OZ+=h5{zxN$XGGtLq5PR zOb_idm94=qS_vDGu?^e&NEtIo>QR7bZsc{DbmPRE9jJ+y6CmqnVtA)?sFXN6~9 zP@Sl!9IR>0%-oz6p|PXX#6eM`nG*43N4W%lCFA6H3GP7es;S?Dz9E@9{9S3H-ZVxp zN8>+bivqbT%h`WH#9RCSN$21{{YL|ewd|icdC>1$%@XU4mtaW__%E$vR|3tmM5XL(`n*-fPLywCw~?U!~BluWm)SBk^P9+3-fqI!JYQHG?RVjA-Sz zc-o~AGP{n9JkaDVmd4)a^fMD|ulVG#yhHztsFe}0u#QbAKDfgdDsV%Jp@N^i4r%C7 z5{gkEr`NN-cR7=`>X#~{0y(6`XU%gFTVt-)JoeZOYO?{I58ZE*kO4b1^Z;A^+_)UL z_CjNJw_f4VexOEq2qQ|)!s^99-%Ki-=-O-RH%LRhh^7E*Qc=Yq_KyHFe&=IPT|kgn zT=VBPI-LEo^23Kh?m9Ts+y;-}YsVp8M~@B?iDJZY@&!rtANq$z)145Xj@tw0`}@rVr+FPmn1)bKh|)^?qX*xDWdrdDRPtMj;pj^s|#VaKCm9NDkB= zQaDL%aQks4?i;$Qt(W6g0MZ-jD$WiFr>pb4wqG)n0xz$gyE^qUo$kngh;$vK~7OI-rG(U z&KIp12&Bu-lK+EjAT=vvpasd`gllW!!Kgmkyo75kBn(*5VD^8$j!_Eolwsxx^W(5k zaF$VE3-Xm=vJfG|LL9#qq#V>9S4?C*rcw@$^amh6*t*%|9>9eJpsH+ zJx~~f7cBKGEu;@9E?isTNH-gkQm?Gd%gKyIF?T$XNHe?D=i^{WObk03W0?K1!Rm+{ zN&Gg(+HN&OhhMW6 z-<8<}i<54s1&9zQ2Bc;!VAN$Tq>c;oTY>&+SIE|zmy8;w;Nl(IElnAvYUw2JZVuoY zc>K-rlNwGq$xF~P5bw_g3~HDY8R$2V!6d&wWxvA*eqQ-rQlN|@f_{u z>PmXujX?>ZGOCs}L_5S3_`sYU(M9BFv#m_~C)rcIqFiM@^qafzC15MTBonJ;z3vFw zuF6H6m=6u~%}<3u&DXqu z07(-@&-cwbW${Q=r{Uz5Iz;wupW3#`aq(qr|7l;KmXb#AiBLzO{ORo&38Fev2a)EN zx)q`>zFtFt&uoSYzFr!SSkG))cUDc6_aul&DJ5GkO8Vs~_{T`=(vTB$7{ z;WmEyiSfQF8&^S{Lk~6)zPK*YjF2qOD*|D!b08e#9U=9JIR%mw0l*KE&MaK2yk%53 zmqn&O?&RTTm4kZ_5d!)WDYMl}aLv;i8I+%IH)caLccn?^dZSM}X%`q#5=33}NRkhS z(lZJo<_ikt-+!SY`c3yrkHe0@8f~g<_0McW3K8cE1|6qA=slmZCGBYaL_!{0rQqdf z($r-J&%-kkV!9=H%SfSfi4)&lzE51-3(W`|*8>6Rn`V%mrmJodL7Uic|%9J#@4FA|8?!Xhlv9Frho#A$0S@BH<^5|1lj;*ViJac(ApWv&Xx{6Q+U_IUMxunSz4qZNNU`k=ezBRuT zQ|_sK!P9AqkNfOtVw6dMpkc3LynIQ*wyx5k-t4b;5u@u>!NBn69RtKkWO%dmKP&|d z0$73DvJl#1-e@VJs+%5yJcWer0=L zEI;W~=2(r&fgL)A)3Em8)==J`n%)QxMaj*2D7^KurOFmnOG@IjT)5;UjZBX80}hj>7i1P@L#i?mH{;Q=j~! z#zy1N$w+rA$j}RZmXBjfr++x{dOr~|aW7F~&d>O#j!CTcHm#M$iEYQqDtg=7{ZJUQz1eF6t@SD8%IOzQLopj*f5j-wc25trN&eFGGwS}yTScu3E;+|!cpe3 zbfp9wLNyPR$qEZ!6FGdJfMTpDpP@oze)JAYfFazW_@sDy%~#fxW-mbj$s?^Ez&l!0 zGhVbG5>>LKu?FMK)CUKw+;O)_|Jk2zZX9J8{mS1R;4_T8#)3XWVR=UW@kbMW2I}`b z!a5x885LmdF~_S=aOa~zeB$}X1;eQdXM+i*cT{C|KYbp;Zz|=7S16V+g~hgF%fn*B z%X9M6l{-W}NVOeYG)VHMLM_?t^;tt72kQ%=E%6dmiiiuE=Bx#?a<)NU3pfY zi5XzoEnMLrF`4Zt`B@ZHCRTqKJiAmX#W=VkWn?9r$J1S=*eqFnA&yqoyl{`VgH z7&XUugt3U|0LsZJS0~ViXxf$mF!@G5uPXreN+(IQfY-bZI^@7FqkD@IB}dnyh^RXG zIpc0?Gn%gVF(WOs=uGZQfLH5>gsU!-@yE@felH7HDq~$Cl%L`Abbwpm!NkT)tegQs zB%+-0A_VK%C!`RMo%A^-_I(%OBz5iL;cd9@Doid;u=jyrQmdM%^?Y6bHRby0rY7$2 z2_m|mOu{B4&;{tDV@vLYuEK|iXQA}7*0C>+j_`^Y!AXP!-Xzr#iO*q4tWD3=6I!C~ zId_DnRcaJep1pqZK>leBG^Q`_(TOf^r2%9P(Rmd?vYBCA6vmEUC?SG0Du{*+RcnXe zJGIwwZs)WY28;Qx*@5{H(J63Sh-G?NdQ0&XVT9` zK?x#kkHF@VB<1`oX$*`I5_kHtC9Hkn4_(Y69XdTsH?CdB98~f`TydtC>tFY(tJ0EDw)Wfb1pUr1hmf040kKwUG}o6upq(mup|5e@dz3q9L9mi3NDsJ_SlSVxg`wUu zPmqmyWZ*kUaQESdnp8y)EbL=kD40S_tS%{QNEK%!{u4KwYFqr*j*@3;oO79kTCj_2 zL9q!C!3e1YV|Pb(3HZj5j35^$8nBqpF!U{YbI7U&^I^}6*e{&E|GUrjkQKhH;E$^H zLQ0xw&ah@)lU%VaCn;--2Mrq*SpP?yp{W)vZ^cfhbXH!yPbF|ct1x$?q`QMq*%lAzb`nH!oAz(48P zHq^U9TegWx+*0=Wobc;y1WNIpS@<1|#2PuIuLDSYCk^rY>Jv#)d~z7F{pKW(Ba$S+ za`xVRtQ;BALIwHjDd#}~u)=+Gi`_igD_bBg4=(~!4%TI}8^*o1?GCW~QF`U&bgxBd zOK2&!XcS&FM^%1AqVSZf7~c@M=9r)tz|0hCS{%wYz>19e%vb6H(>iLiVZYo4;h)_e)rV-xb@&v%NgJ`fR6R7QIo(csWD)=i&IwVH(8OQQ5}- zth4@S+4W}3Yy&J~&Z;r`R$JuY9CSPq!m6o=a z_HwEaW4PxHL~7DcsvE~op}lFK|BA9(asYL2aRwoZ1323a%aRg^jH~9^ND9oeMu;(d zLK3}vHv?ZF!ux<_llXP8T-?!8UAY6x2f2|%TVlK5F@FN!k;1leH5mXW5w^zLecVYq zZX4je&62J3B|s-8RoaGqA1m?I;ayQ^#&y2&XE} zaD3!mjEJKR>-dKYnaqUG2Y1yMT^8hadFJ7c6H^eK;OkOhxArD5p`coBF@x#lei z(j45Z>MI~M$g6$lljH@+qxBs)i5+kIhSTmhsq8amlpgMljQ?07%&Gj9lH*@ zky7L(+5E-W*Ussu%gG!ovzHmZt6hR=LT!=$r1Gz;)E8z`pQ)`2vZuDE9upyL512{c zw6VtKoCTcI9^1rl_WRLG0%+B8~rIy`*&~? z7GH*(VeLI@$m@bSL16&O^N#Q>J)&d{-T99svxj%hz6HnyGPhBu9VyWTYWvAMxKfX$ zwjsnj;9n(w&b^uXX7JhGmvf<;WU9Gz>o4hZ?V-sXfuH%A1UPMCKvm*%3SNsD z4>U2(kZ#FMPA zb|hJC3fnd{jwAEsUwz`*c_iHJrF;gNr{`G>glY^>GBV-Fkc;%FIzsC*eV6x93&E=d z(_>m74aM#IVazO637eQc#pWn|b4z(@=;P~W=YL#ba=(FhVdv-iNR9dy`;J?}hVBQ& zb@K0^;wwy~74@~G9_KJ0vum7Dx91$$8Ikg*jtO^3$2%+vVbZDF1QE2TJpKw=O~?f$ zrQSplv{<+(qJ&T27(bm;YiCf$sO!bQPwDbD$|xpG75s7rM3tCE;!H(o#J5vbTEvN)8O^lo`;8-`EH2cc51TFJ}lYq>;QZ@|;@QeCrj;%Ti^*&1pw8 z3F?I^iEsDC=nrvpp28}kQq&7G3kPUiFK){V}k~dcM#T^zYcDVQN@a$`k|XJuCfHyQ+RX|D1YP}9NaUS-Ch`) z&}asCc)r*01U$Cj{q}(T*%PY$GZ5o~k^KRD57tW5i(?A2OYQaPQd{->WPA$ z&WXf#l(5o-6x1s>=jogh%Bd1Op4!i9`_U6u2E8Me=S%o3^Xij5Gd39$v9G}0vxj(5 zZ7<{AxgRGZZ~q}4^l?YPJtzrWnEI>c4{K`ql><-j^KR0Yvg(hifh03+==1kP#(C$3 zL25VvKU33BXGsZShU=jB6@_;^J^0Lv1C0Ply1YuUTE6fC!;LvJ4Yx`Q!W z7hg!{?rwaTQv|lCupJL|Soyj0X<3$K-NC1{!BzNX8Qn~nsqwkRl}o-Dtkv!6#@iWb z96yMCqZ>_~MZ|o*sqD#%D9eps(^2?ZjQf|w5GS?;ct)a;y$@!pTo=$*Y}k!zf{Vp| z<68JoI#Z)Cddvs_$OFzQ=&v9+JMLYiZ>lI4zZ`Fp0s(K8(0PhKmwt!{0uUzmH6L*x{>Ociz|?Xoz(K=dVk$|aAa;Xc4i@^gRn z0=&`3@;=vQT4_(A-6&y7{2<`oeb}2u2=CD&vvis9BX<3Ur+Doup>seKbx$p+(SX7 zJ9!2#^(1F~^i!7W%amlh**K2;#N(>;d{ z*lMW5-ywt4>PGJ~aWH)Nbvjo&wr2O{A*zsYvcFy(mCw9(*Gt}fI`{rY_kFq#i5$Rs zlT*HQ{WLIhd75bME*Ii;j#BbYm@blD8LF~sB81a6xeLDv%GfVX zV8B#5z|eQdCq(=_{+-2#^QbcjEbp$4po-QQgCyUl@w`-Xkg>JhkK5Ti6HeVG)Fi$j z?C$?Mn*YTXiSxN}nKco7u!&KxpaWbPO^myKWpqSPASkx_e$iF%2#>tCCuvI>q+VFl zss|=XT@>*3W|xRYadzP=k2erUTh$|Q$!C?W|OQ=J{1;@umGlT5y$8cIDK*^K4pHz!rH89%sjg)B9p z`;+NC%(>EGK`^1u3W(=Y=Ox1-`eT>=Zb)CMd7hc|fU96qilR@2j|8WcN6YYomN2Lg z3%h=+Wzi)x)1C0CLb5jY7~R~&JNoTb1xHJkM*G`^u5Xrq56>m}x|ROYWG@^LUiEVv zV;g2iJ~_C4|4q-gHw|MCfa!K!4?|z{t_E{0-XD;DHUNgsY}bRTjtw7s7eC;^PJVNl zDdA0|juHNCHTo+>{kI(fZb)q(O^*KgGAk{ z&8r!lK8YA+4km>cZeu?5v-bfi9DYU@KjFdsXHY?f#rW$9Ur;#uqb%*>z0OG@I%LBl zOZ>O(BV-Ag@?^jDk@r_|Q<4Q7wfaf0!I(j|HrA{>3f)+_>zW|7(w)+! zWXp~EW3#S#&wE$mBzGo}WBi##pVd9_;T6#C2m%bL%71ZRp~){RpqV~0_Vu>Q;cs8w z6aVgc*unBwsjXVXLbVgJq$SoERq}!R?9pgdmKw$BLV?7wz8GhvANNE`NrKCTl{72J zMuS2)eua6Q_G+n9xl%^XxBQq^{J!?O=`Cr7zB?B z{dobkZmMyXRoPB4HVPwF^xA+w#V^TqY3*6&iOS)8_Z;GSb4PL{h6*?YRG<+(J+WU~ zJdU^0AsPd7aS274A*w?4hh)Kc;j6j|sd}r{&mQ~~TOMYuPdlTC<|HpuY;VYBH!UUz zzHplzbJb5rKO3ths}2U8`JEXloJ_*ni=`nFzNagvh1zWmsVy{b#J&U``$UmhU-S=; z3IuK{zn*~Sde4S57=WvRb9ARkeVJ&%r077%y^?r0a)oGsAn50v4Gx5XI?SxV$-sU) zEwwl`voI2KPsr-Dd2rki)du?Y6lK5Ngw`u@`XK9p(6ynoiMTiH<@1ZC*z@7hdZ_BN z2=EWO<_u*0`5{e5gz&VB(IxMB*%$FVq#%H2c*y1;T~fRz@lC>)70naWTOde`Mc5!? z4f13eOfGiq>%Yzz3Hgc}D_av-pQ(Aj5%tha_uk4q*VAl9h&2>j*hbT5V)IVXeU5m~ zYZXaRpMUtmA<;r#6#XeS-DG0PRSOZ{{=9rVutoS_zgDiS7yu7LOp6QFt9$*Z=I`qT5%`D%+)zFcb=qmtI>I^ z#H#w4YhqDGkzP{)mOT`^X{=V^t9-VE0O*988(;Zn44I0@Hu?uZem;<}FTf36nncv- zzKlnu@0gCfjaLdR=Du+C8Co3mB#5{(C*{(^%%va|%-63GbFrg9H>EVPFfLQ86Qp`@ zSXx2=wdz z(qj9;7KePVXWYCWGA@)qkanW>XoHSyh(zC~!+6BT>6cx+SMflxomb-u zl-yJ<6*z+Sal{GzD4)5aEemF0n(&J06CQ|WlGtV$E;36<9H^TOOW`cavEFDQ9SVqf z&HbSZSDdd{dfGcW{Vs*B5(B1{b+3<`BkeG`9IA53jnA?k@W@2%Wp4L*JLQLW)_6-{ zYes5>URnFqjyvP6htK*sadjp7*%(icdYY|C+HxSCr6d!aU(`D&e;}h8I_DS-u}a@^ zGP1N}Kpqc379cRPsBKseuF8FCoiKZ}Zq!hH`6N3;<`lQF^Cm0H#xzO&>}VA@1(lUsA(p8(Fu??=V#0)A;tjoK(t5g?!R z(Va&R$=~Y;WsvH0Qbvb$Xqr2jm%*qJ`P%Cin z9pAaU^e|iB^#>sW_L61{bej|!_?oxK3AU_K*QcqT^d2Vm>tM4}w+j&NFXt5438D0rxO7&-tJ|+)WP+=S+ zBROzX!)NJ29%?%x=NrGJE;(>XV`@sw>5(&==%^N&uJ3S<_O(tNyZr~L)y+@?>^{R- z5y%78Tw{}-y1#JkqUoE|j&xuquyrk&V_x{6wfSgz68ZQnlKd4W0dr7V$B!nn?H}YH z>_vhx8+eflX2=VmLT4&wJW1(#FmrF!5>z(p>9$gpvEMX1O;|j#s**)#I9j<8fp`0L z-70mFbNfcY`(-h>ojo>qQ=;dbfzwJd*tZ~6cC#ZHZ&aQEL}_b2_YB>i4nAP9*gl>; zN>~$2>N@EYXM_<@zHk0{e41!ij(eFI=uAGV=Ck=k`DURjE*{(1=QF|}mHF&lL6|`k zKOZ_J(G%`4)9fnf(Bx3xk#L@Cf7K)*5(dKAl7fz22DAW=-I}uj2FX3}u9FCyyW76e zSJRe{SYn3Z)A(}6V)xZfHRAjQ(on`Z7K#tk*w(NFNkm*#miqzM#sQKcEyoYAb+QBh zoIaAg)5bS3M`8FUXschX^FX4JMh>~}02d2YMx3%7HZ5{|`4z5id9bOmbuL?dX{w71 zHplqwi9)_en0ZYqt<%kK;)%%n#t?c(^KN&p+9aV?r><%(YwRHstkqaH^3|>)9>h5| zl5=TI=vGV6j~K0$Af!dEq#*KmT;6FdTC%!+q%#pbkV8D@c+EjcUuG-Rz;|>jmZXK= z{oqU*(G|9-XlM--q&>7dH2ge|=9bJUvwHEEHtI74bUEsascXY3PWEQ8Mn6<948P4R z+Vv{$>!U)mwXy)?*O*k1eM)xC$j0d^JB|P1ka8wNRz$+*XPb7JOwEx#6OGtbH98w% z?y~Cfj~YK+-oj=Y?n+s{pQv2(f-647yged2oP{&AIE)^VG^UgIQ+_e+HHbbt1JSx-yPk&0(F zwR)btVGN+`7AslN-P}k^0_)EvYePzB=Nnt+<{J8%(Atf0LcfVvwY9Z8&T`c@Kc2GI z>pqe&8qbm-`o+;f$;no69q*RDwooQ^orLD!~J`wCJ9$;!SzY`PsyZy99#QQZIS+u&be zoUCUaPkl3*S;$g4qUwj_og`)M5yc8xm)7j2Y{1Fc%}kMj0o>T;uZp%xFwO$^BFAoh zo=33iYV=gqt!LFWoLPm*eWI@kuOCIh27+Wlr|Ee_U8_x3W^nR0HTQbWxq(VV2ytWJ zg}td&h=H%kMn&tP?()^yYTrQPfx6v&m&?L|vm@II$t`RlWn3SuK|=wv(HEG^7a|Vk zk8iKIuWjbcNQ-jUM&E+8(iVx^vgM=uqjQv*a5?qfv20<=984BK+liv|( zqQ`g7FF-`gn4u1-)5MyJXHoIK67<@ z^&kyjL)%LG*0Z^0Xr3SH-5q}+3Cfm(n{B|ak?id3qU&}6#+CKNX{Fy7LpGk^9^Y~d zFyldCUK81u2)%%hq*WKop+TI@(@C8O+Su;7X4*C)?+`NXW6x`q z)Dq|Ay=NPU;}#BfA9s}XD12$-V1DLk7v=hBQr?N|?Cz-P{GXR=1a52$aS=kO|H;Q@ z)~m#JDtvmRwv(ZNnteMo;N?R;zz|K)F<}QAfwT`(UM$s1@m%aY9Sac5eHvNc3K?UB=n!T|rkYEB@C=2&jW|k6sg9sohx(v!mC^ z386awhefp?l6IQ$^?ES_tO^TJ{H9)~+fgUwkP2hV;1(t9gQpRdGiS^5i-D?*u6A6K zWdo27=z7Txk$XPuSgQo=!o%#2&Qdl`t_J6wDSJAARKR!pvkz2fL*|eRXV>P!W#j+u zqO{8@Q485I-{YqeK5a_%kl+SYU(-+6=vB`|&X?|u8fMB^HF!>aSE}{Es5#EmdFj7b zgjhBDxx$e!^-XKD7f$pc&HB#EKQXR5M-dKO(CxgBeWg=Xigs+=Y^QwLz9h3dGN*@{ zLmeA9#G_WbEGO+0ppWrcD`7Z)$+4XTno5~_=ALpa$MdVCISw_6KYE`@oj zKZ)`9+l|z=4JgKv(UiC!Ri6<_;-of5kGD*$>IZ_ z&lX68t8cI<5a!maRy$@Kp`{nwg$E7$RJ;WW8tTH1XvMcH7#*vl(5En1=39nmYneVYjB6G! z6SX+dG)<}rgZ`?C?oZoJjjpO)!s*mi_+@VxNrc|Dn4>quBLS?|a@=)8CmfOPSRTh- zcxtpy>8=3g*(^8aNm!_D@a6+ce=>KJoZ%9gw3u2IHr!WoY1HS6RrpP_wzMEw*LRsU ztrfkTz%A=l=4J)Tv^vO zXwvC|&QMijj$KfXPQ>SHUn&(d+Jtox9IV#?-rg!v%RCR~w|lEVjpX+dxZURiXuy}V z-w9kRb?0+eU*Jr~gq`2pKpSOLUHtT!$xg%$xZMLu%VDYi7(^kDl%AOy^UzvhG_-OE!8W3 zm$Yw>xI;MIF`+0&_1BAL>_hkGBZ)W>RB;orB&_HN9L!5?$Y(eYr=Uqd9x2DDpAkL5 z7m4ES-!BbH#lIEE>>^o<9_!6nl-3u(RZ5=fHiD|EsxG?^yJN8=v2(NuJA0>+9Nf+~ z=P%1&ezRnv51Ig`N?m8!V#AUixr0+kuLxh#03UNsBp$YTV@aLv>!5YUr95D#aG^o| z??p*iquV%rcsPEO7&kVO$35$o2<1w}2|Qk$p*i-cO~D_KqD9J8i>_Rom1{+yVk4Zb zG?|x~T83=EhW9-IMO<%cd!(PtPtC3gJ4_eXb$uU0nfz|;OqM=fQVnMR$8h(W(UgkR z<2L;7w%W0a1Fd0Yns(svt#rk=}wRy#<6w6BMOar6@H>1QZAfp@?)) z2t5I5(t@-|eZl{|_q*SFZ#J3v&Dq&yX7 zMpZ&XMMCengI&qUZVukPrS%|qay=iI{L{Q4p8uEh?z0cttQM0p(CUe@mlnESqSDyO)?dkdEvIvdqh77nRrE=wJ(dm^I|dOQV(2s( z=IG8SG_s1?%TemMI>Jvj_I*1lSOTh`7bne(ZN5-5Kq(23RFv8@x&q)N=gj2{Drbgr zwr}*$d>LKQSg#z|ceH=n06MCWgKovoDV*gLwFhCga-t0H;aTy;OEIMTol5%)o;uEJ zFbu)sNG+0iz9O#6yF@<4{;pCnd8h`9q{Y%H-)C1I1b6&a`AUjzKVKp2m~mJ_*@=Jp zm~CdMuVo9`3!Jse$${#@98C!8PpY+qkwmi0z)JIFb{ng@i0-H7NT8g~t6U)#AO;6? zcaP+EIIkN0uGN1-~4UT+gc*Lc;?pZc<~IEaH5>Cr7vo zDo_4b%r*wwH&o^MpZLptOTiq*zqeia4TmmyM0^2z7ll|AN`iP-Qpd_8EJfiUePEzt z0;;1R8)Q9OGLc$b=BO}4D9-Y@R7bE>~kLwV^+l+50bdr@Q1+|pt z{Wx|~Ck01Scu7^$iNR||SxDX6v=VNvwgV|dM@Fo>5h!Im=XIP^aG42FntV)P+o!oy z1LegYxYY_?+A2C~Z`)EzUa zG5o+Yvamne#@IzP#2W3dl+3q9tHx9Fh*>p&tr$OY^$lfY#6xBtNgtD*%TEeJ7EVv8 z56ug%I%0HnJF3BbDZ`wy&OrFkQ-2V5X`!$=8> zqb`7jIup&~{Ne}Oy|8pwepV3r2@iuAtsSQ_4DpY#Z^e@1kYlVXIh1csc;qi+NqrR$ zj;Ft6L6k@kJI;Vs!^3>dziEJ}%Qi7ESEh~9I326&%zy0yk8v$f=~{Lhxs4d)5rSj7 z=+P+^q#7r4bg#2`q2eWKfuP#tQW#>5ZTSQJUzrVFs6Kx3B++F@=dBqMu7scubBtY> zqYu+=hS%*)2)5UbJFCkN!M zuBDk;&J1}Gzox)6&A3+STa1A=J4XDFc%lqZs;UirH*`wxr-(Rf&t=?bBS?b!=c1H* z<6O5i^A>N`9|+b6(An~IE#-;nFU#Rn>2o(-#p9HW{hfhmw2I2XEfvG*R`8)zTp8`)y#lJ#yF^W- zL;v?T;WPzb&9MM`fPH*njMpQo379do_O6K|=gN9=2O#K=ug*MRHahd72rjQPqkVx+8Y|pLuCvE$X^K@K>T#9Brdtpku`wTe4c%IGUbCJ$xlJ zn7`%XHU<{h!*IH7lE%0pAO)0=7Yy_ny_xPP_s-v)Q&Elw7U(EAChJ91vPqhD}E zw`1b$1OC+?3}oX5?h_u;bL`j@NVpVTX)$fo?0NO?d`M~hh;Jr71Qpn+{DtufLaf0L z&;T&HCFpcRqA<1(E$(+Io(L0YB6~_QaCzewS(=QVVxV%dOzSZvbn9i=s}!2~%7oDb zio#iCh~OOgK{QC%b7U(z3wB=8GBR|3RWE(*D4W(oaK@}q=W7@mX3K>*hB z#>g(7m);g>QpRrtN5w=&Fzn#>rD?6vY8wi-vDLWzG`qq&MKIbfr0Sz7ZDljpRqH~t zefO;74;}p>qCNpSmI`j?hj#y;k&b`9%F4n2_!Ea=j?^cu(%UDH(KGTj)FA2;YfAYz zv=HhgB0A(rxY6X9_$CEaS@qTeRs9uyg&=AP0hWxpbrRhwS8jf}w%Ol|tU_UL_%U^aoADtkA|zI@5!d@;Hz6cQvAuVRz&o|FK4Sq||0D;nNmtCg%< zrL{&anRc(8q&6%LC*~FK%LKQi@n?k?YW7+l4@S{*^&0BW*hucMy*O)xh+w@db-b_L z{aRD=HIx)RaC^`F0V3ibr?x64{vGy%bl5Ar2UU^|`g2#wUA(#u(KT{2LS+c{0hy_<=KgI1RLe-6@Qa6#=*FBlIP(=G={h-XZ&ht_Q6fzrY2eu zGl7ka;k@B$&6y2Tn`6*0l=^C`JclLwDP;kph2A~98QvH-0V$;fKI9f457PS)bpSh~ zIHS=lxJWo9MBxPS-K^eoWn(4Fm=ift`<-;&&4InU+mw^ex-M<2Nw5y1ROIH;DO{1| zH0*_fCwIfsY4Z-Cw9~a;G~l9Dbd~L&eEzxtHu%RPq7+kesjfe;j~AgETfg=u9-EO; z(|WycnLF%}h>FQlXhfXE9lIEM8#BCVWyJVHR<Csb z4EQj5$C){rS+bj-Cs~3XPgznCs%KGGs?oY6ohTY~QCSIi$aHFBe%y;tRKr0K6XdXf zx8`PR=1rURh+qGX5tA=37*fdf>fF2sohaMTh8s@7F6IWFp|8kAD)2WqTn6T>HXrbbd3Sj5An2uqKgIjHE>up9QIF40`H|2zOTa%ZYZn1 z47>Owe~j#0+YT=N61W8n>{s^9Rd-%>uXhvAXAS>x+(vIMac|?skBZ7_l%Y8N^s|qo zgmL;&xfzEtVwCQI^2bp+;HHJ)Rmd#$Rmhp=7~}f>2vllP_33{nSD%zO=~yY$j_N6A zY?cV>|J83Av=$g~c!j`2orD-DzT79^gm*c$JkJrU15LAc^EzFVRn0|Ol!MRQP%aS3ydU+`15eExK;ajb2u8uI;XF%ANd&N5EpwnC@uGMW>nvqqysh1{ z(*25SN(eWaCb7L8U zeAkJd8*ZPQXlG>Se+qCT|3x_f5TZ4pqCrtFrM@-@`ZH9BzipWMdRo>Ct%*sxsjFuc zBr^aYdB0amFA>#Sjuo_62S$Ne$CfR=&>d$~|D$NBZ@} z?}a&QRAq}-y%ev?HoLe2BUAkyKV+Y&n$9F#32@V@0I*_=&4Q!l5)Ix1@~_>^{$j@Go+1|eX>GziNuxZyN>05ALus{ zMzc^N?LovhEKuWTThZSSr$egL@mATo7T>9^S9t#zU^NS)uT=b`5j3-0@F;yBPt>r{ zNYNZ~p)f}4Pum^dy-Z+h>DVactsT^O6&MheSl?n|@)PI39wy@xK1a@J1*X1!`#f6sq9@I$IBd|LJ^Q*q9<`o}*Vu>EB5 zi0YJL0m4$i>OSzfazC-);9r?j$xkZkQ%Znt+`#wj-ah!77wtVc(4+Yb?zqT^V!2FT zl85YEykw);FAC=I7+@d0igzzj$uz8|tF;gz+zj?xx>kmctGR1o-Vta*;(IcTl1~i3 zJdS8cSN$-!o1Pd_bN5|)Z0z6W4uwcW1%E9V{|$q!|AmF;@c10w`3raduL5`S|EFxh zc%q=dm)J;>h_L(#yc<$2ymIY_mFDxTYsIX6}+RO zx&f13`A!g`X_e&c&@os9j+#3HV&BXl%(74rVI?2otArB>r;-n6ussHKfU%uM*y17> z8@C=Q_ZsE`jXimY&V*WsZde=hv7t<>BQ6!)*3Q3iqC-&X+>M`V)U+XkZJh8BxSFCy zQQCwPf^XK8*LLK4N8BZ1WU!KW)70$I-tEXHC&A#$-VB_3 zAT3aF?!m`ny_cx2T)hnY>nzx5b=JR}_dC<$1n+iqx=j|AD*I~h!Ur> zNg=H!WnYEAl!c5NoIiKDrSF4(q?HDZrO8wT1B=JqGPMzXwy&P`C;Pf9db>U$Eg+rj zU9_=;8NS2p$CqJ#87a&wU6{DK5k>LRXXI4rf~n$ao$t!6lb|YIRl~E}mh>}1Rdc+l zpDhFxzbFX=)M|J?@oR|-^Whk?$e80j`u01_*?vM^P@RLcjC3T)IksoJk&=Ky4t|7A zv~EA)%=45l-TsX_Uqf83nv@1%YlsZK7@Cd5joj$!Xx8mI`MPi>VqH*ppG`vxAV`~} zz^qNYZwI{cQ8O2w+L<{5%^iROKT(tVmF;wVg8D%$sikT?-6OSN(j8Z($F}q}!lLGI zN2PO^Rbm9j9^+-W5d5mv@B|!4xwu?+<^AsvD8+NTlVi_m@@JUAEf$sNm0#t|N&%D^ z{=4x`8QVW9Yaj$vaYg%^{wd)53W&>2Ai18{dWP7{{o7&;QT7e*63w}ek>0xO)zW+* z1vh*Ao%&5{E!~ob#ujKhivBNlrY^Y%n9s=eqD>mgPml^=aklSx5rS(3nc<1uj8iam zZ^8X%N7Bch4rGKM6{w>9!$g-#044;wkxOm;hCJr*hQ^K8wdOz?RVk8^$jJTURbrTCPdLMijEq1hUm=~?R4DggXo>;46>V}4e_ML$C7Zg^2Zx3$*F$|x(B5J9 zpG0|~9g}@9s5SE#M!5z?irOhUCTH(8T8^*4FxkZ4u553ngT$-#Gvt_qpe;r$R_}$^Qf|e*DdJtBGas?=5X(A3 zaD9gYOmyv){_vHhPJsK5b5Ya+EQ5}RS^a0MQUoZhBOpt|HK6Tz?Xf{X4}oc@l|2eX z_@Esh6untZ42w4Amu+EK|B)Ca1)mnis9m89DtDM-*h;=Iogd>P*D`$<-YXRq4HM?h zIQ>l>j2(ZNqZutT0onx74Mhv9pjqA5r0*k-ur=icyn&n=5W*B^gN8_WQ-vYWu*!d z)gCUVCXYpkERPIU+Ds*}5&}SxWD(9jhnL~Poa-E^G3nju55Pp-UFMHrxlfpS7kZZ9 z@&!Kea?H;uMN)Oqv1xC{#IeZQ$KOHz|wOh%;~xl8rgLpKJIUF>8vxx3{E$8Q=si-JJdnj`@3ag14|xrN+x{<>1&kKJ^Fy) z+d{*XEro8rE19+A!!+8`@0c^LVz3jKQ5K@6Kl;h2av=KM%?`&a`_nM7cr*Z zeq^aJOhwGe5Vkx_AUKQs_YL-yMWL+I`wpC3WWInlYBjCwYKKEzsI3E86Ya6UI;BfP z%<2}@A4HcZM)i0E*A^k7VNk+i%dH6OLr4P+@U1a~dXE4do~UH>8N(%SW6 z8E2FqDi?PF#z3toEbq!dWDI7NE_fgvk!Q7jKn{zck{%Mq1jVvQvw|5;$&ILQgT3`6 zfOCv`CPfIoo;dc+DCR9onZ;wR1q~7r7v}^R(&Z> zHqn=Sj!GSM5u%1=$dLdBm8|GUCuWupIIt)K#1mP;EXho?1-H-?S1K5@xzJb8D`~j9 zY+(4C?Gs>X)-PZvj55;%vTWWJ^a^b1MOW*w1>@l3*YX!z7rOukCR6`c)`n`IDoLCE z1^6D8PS`&tib?jT{vmP@qr!?l6enc^r!sdV3Sj}SZ+9((2pPU8_LFztJ*=8+P&(Hb z1%;Ct?UO&3UeFSRm9=*+XE_5N!0F72FmyR7x2hvE&v1VezIjMT=Tm zSRFRQJpYDMLocf@BPQr@{&J2uPy z1_g%BjZ1_rOc=|g7|V`xJ@g~*Mcbow(aQK!MrwUDa}kR{QPkxlXw+S4BbF)= z;sv(Y6V%nAq^Z!lHmPe%O$9PeBz~(Ug9Uj5TAQjlkB(xTUL?Kf?z?Yr=^8l<$}~L& zJz?>+zx+*JuBmoAX~ZqM?vgz}F<0nH9}d|irB_Ja6(9ce23sn(IPKnn>*K>`6o$nZVhBM3F0(Q^*MVtP)$vxaq{_Jo+up%hJ2(%OwE7o+1z<#1#(?r@-qLU{&t4BJ_aMQL2l;)veBj!SI2k} z>DaK?kghD1BB@4W91)8Nz3t94$B}~>jG5972#$j=)zb9ir)~xiA40<1nQAW#;J-ar z0fP)!`W&|(hQ3{{-@P^Hwra9gkMQTONorymSG9w!U9Q1=DyYSDHjLxNKEFE5tsD80 zeImi;RX=h_bKGy~G1GU-k;q<)xVCi1xl{pqawSeof@l1jjMr*GhS#cqjF(3U*wqT2 zG1gqF?)8uA9y+Ib=HLT;&$Z6gQm%@7jAZhEeE%DW={Fa&{nBUA<3>rK(~=?L&{Rnf z;nV1RY#Re2XvN0_DY)K5EcyyUuX>B1HoV#XTvE>Wc^l03nR2~5&`;-+{rNI?%cO2(O0bLKe{Z8U$;Cxp(nvveFtJozAMk zsS4ExXzVlg)K#4N7-E(>VSbxeED0UyeMJ2F8`wA7Q{ZXEDIFpbR^h?lvHoLtQ5fU) zaqkUYZsPD8;WR<6FFGi0i69R#ZC44maAz{6Q2LXDVbi>HKmNzh088KB3`qw6)T`1X zUOhYKpHNc~9}Pn>?cBvYqHY8+|4$adKdo`ADa!U?%0pKTk1X+p{hC(}Z>r2|D1{#u zRKQ;?h&p$ef3*6{^7>Ztbt*BH8WVzhPG=Dln@;lepZlG4sb!8!MjWTcg^U8<6yvj5 zJ26f5T4TX|Hu;b~eN?&3<-lihygQW{!WX^30yS|HzC6hWQWj`h zrqz0|;D}p@M#(`Y--uapx_KS0#EkvQThS*Yq8xdMits|jEjLfsP`3^j50OR-Iys9T zgRSHy@r|E>_rZw;R2jN985sd;ofUtd!uf;v^Q~JBDG-h-{V8{GOnl$3W_(cJG+F5# zm)}*+cjuOF*6nNBRX9H%?YBRw8=_gDp;@LEl#Ai{fy{j;xuA^4b6*HgKUF%I?y@>~ z#xUf*EhIB#eS~FGr+z)0e~0iOjeLCg%>%-N3tS7r95z%V4t%zel}j-l(Ks=0q;_h^x%GGuGzmw%WjzYMvQWjw5p4sY)J=mM9&U6yiMX)>&nTlN(( z9Aze+BXLlkbGb4lvh|I7VP+{q|FZDiT8w?vKaP{?SS9l(v2osb3#i9kU#?$QJS`Sp z(ZND&Jq-6+MnqY~!PCHVA6V8^rfXw)FA& zx-q$E4mkZItZ(t0sNG7rPAa9?jhu~_y9Xa>0|8hn^O)EhnL|B}*G~Lm7vh|Z$)-?x zkP9m}qd28spEjbm+fORV>9zQmACsQ|*T?RN zz-c=nW(F}p6geZaGY2H>$Re89U(5 zf?h!H{sZmgriTOK)eZ;YGki!jC#JatW!M%~^@MuCGJ$RA{@}>QnQ9gH{>O~jl@N*6 zI*IWSAHRPLsMYAmCxlS5d5}JUmEM&X_Q^qTq2#6wrHG&|xqo&bN8cDiDCV8)RE_LE zwp9TW%0G7QqyIIr`|ck^fE>}Ea1?2d%^9b!7xxtYSN3!<8tp)32^jHq8!B{Wt>Tm4 z&anY~yFoq`dYF6T^F41B_j!fS0zD6cA%V;$OfaiE+o`eA<8aYl#}?Y>^S}jVjW>(Z8VnC; z4{8$^0^U-|Lq1$jiopff>Fmn6iui#og}cjYvEy2Y$@(C{7!hK2r*fg z-2G)DOL*5iGQ^$Rv>FR90Vz57A-U8Ttv=4_^H62>d%W?iq#`Q@{{md9Z zL-8lXbww*gU4|qO=#BAOrR)Cmg!xXL!q|v!kbZv=umuyT-QHa4Is}+?Y`cV?8M!?4 z)jYEC`~JVYwQ3I!LwzqRtI@Y1RUX4FKM?Mxo>uaH?4X>mPHhL09x&9GEry))C@(9g z|E6Jo=dMemIb*fgYCtCuSlHZ$vOTfHHSH+DeS8pU9=hp&dzZ5=>iJW{UK_iCJQX=- zNih{8t5H>%C4Wwl$9ae{Gp}{~NgMOWdDezWF|9uk*Rbc{7o znDifrpD_o=<-ymmpUZ?<#cMri8%dRVjNVj`pqiN%!%QPPE#f~%>4w&N+($I#aNG{7 zB!OV2#;G8I-B#g+3u(wOtaz12!mRqwCc4xu0m+Zm9zMzMJ$#;2{Y}xe=lt@#VcBlT z5C<`=B-DA?MMZ9q!Wtb&%cmyQdukSwj+$UmZjjBzf%s0-XL~MVRqei~P@GlE@$YZ# z{xlB0aB4`kw5FT=$Io^i9+mk#N?M(_Ax2KdRXD4*{?di>@#6MB40e=lT}~iK!vh== z-*zZ>rkqn-C3~DH5EJ~H!TAjNsx#e9nZioFBgjtON7! zSc9qZXzi%D;Z$rRZJfk7?RdACOf3hm8<$SP$k&2f25oz^n*@Fi7gBRrxnYmzDA%+= zgj++6CxY@Fh2&$g0ytV6U+R$(k2v7A!`-2vL^n!xfpvfgAuZ&b96R(W><7c?gWnps} zsacOn20Oyj<0kqsd5@tuR>8Ubw-IwNUEZSAyi6Axv>f%&KSmfPv-Nf<=7iNPYm2j% z+8(-)?)qQI?_hw+D z(+lT!Oi0>?hYf>>Xk?3(BQ zPeygqnkngJRZifag1f_*`I ze3!C~_K+8O3Z2s;7ws8nt#ezK|6C%PZYcYNWj`t1E@yzUl6csS zdq(;6mmFFYc`BoP36IHOZaynmTeYjD!GYC(9lgffPN-jk3}YD{+)tf@EdB$yy5 zordJuw}^QiH^c`46G2>e>=}>5w7&U&IWb;IlXPtx*oRWbIgk@6h_u*otQ|0tGLn8N z_E`KTJsLouCa}V5>sslKX^uJisQ<*gnRAdXgh3MOT6yInu5nSC_&a6B7^7w!Z2GV$ z0l*Y`#JociSQy=`^+^0hKHXo*dt+9pi-YV6YrUU~1JB-ix)07PkJX93D|Xz9d7B5G z$ev7{eEZ$@`!$!(eyu0~$wXWZ{Zjn>)mS~E=C2R1SJhDKQHrvZ43J{5+Bfwv9rQfP z88eXPeJ!mbyguli8)`l^jxYk+GTM)$<`n-Hua@@{$Xa~!Pg!%G*E~p*G~a&;z9758 zF!%i51@|bIp-%f@b#wI_zaIM7kMdBIZSV0(PkX7aE!ywT2od+oTFUlDZux_uxCud@ zl~$t*#&(0RBAOrAjea}{{7@H#K?93;Bh-cGB;SnJ|D2nBJ&q7x*dDDrig6C1IcP`` zsdbZa;QO7EVGBmGhcYSiF+fP`VQvpkKp)E%B?Q7nVvz##J!=omxjC|2;-wO_1&rN) z`}sAb2A{UIPV8^*PL+CkZVX#aSTfE6B)lzlV*GrnysN1EpczFjbJqnltL2#Fqq~Y+ z+S0wMS12I&-xrt-oE|kOT+x`E|4-JTZ1HrDLLa4tA9Sy4Q^xwTdSB>#G4T6ZLJ;~! zF;(MGN@6Tx_3Kj{%c4ZtT6i9%bQ>hiZ^QXHqp_aDVu#3ng+<@u?=q+W0bAQ$-rc;uFDNRRD{tBdy5`<>Dn z!NK~eiC7K3W7a%}kc`bYrLR5%zGLlRbJUzMTE%D2>8~kLXi)1~+5EQzK8SwFF^=y9 z^9C`U=O(y#VM7L)N2fcjV?X zmDlIq*6y%&j7k>n|KZWpvLOUtANk_&mmsf;DofTE$a*J^GV~TQOP%p<%gy_oU48FD zi=jEyAtVRy5SFmqu6!gh;{ujj2G|lRfE?A5Jo!9*fY56F(<4~v){%5NG|#v9O*fu)g5@Sp_!rA(HaU5`VZ^tmP6ZC#~ z@eo)eafuN^kELsXx4t=b2tzK8j_{yvLD-aK-6#BT`>!7m7;%~mzlE-m=T2x0pw5`O zXn}KNrxY(Jjbm8g*&7SEYlJO_JjhuWi778SFkPe6h37MV`yA1-3)QHNWp^gl*YCd1%c=Yu;K@;+mYfI15q5@X- z@YAz`^4$@4fV=OquG~EBFCK>lghiz(2(*>_NO1b5eM&$w0TlQe@BFT`8jQ|FUnNlf zc`XqwIHgi^oACb;xi@_-65yj+N?Y_MKPC~5lpMz^IQ3$cmYjh7Eb}FZ#F2jhv0#YL zu3sh0KrEmst|k8A7v10W@+qL!Gtw&%rbM)B1AdK=`fMC82tB)pTPWi4cI8Df$ra#6 zde)?~@)uRXI$sE1mCUWIztXQy)gXSSycy&84LG`MVWs=c-0JtICvxtNYt9lg3|81f zOMNLoiudOX^S}C|+vPO_fOCYC$$F2E6n<kaI?gVeSqPPu4WnFS+<`?cqcE;aztou%byR-m;CpBQlfg}zI2EAZuVG@TB<9ePltF)N&0i=22wy564roWVhvi!z7S7mwF z+G5P@fF?UhOL>@BM-1>UZDDJFkOEn7@{YzE zWsJLpzt2o}w?*(!)%;}6_A3{zjXO2fNi6-2l9N$n8WheX@A1@W7KCzhs7h7o6U4bw zMpP|J+iNlnlwyBO2Uhgo{rYuj0cVqF+i#dG!s`7fKv6lmw%dOS>FZ`|PRJf^GhIKa zaq~E=%=!;(mU*XpfBpL{H;?_c&Qtm#(^s|lx-*GDd$Rmj;f$##_b(a_|8YXgn8jz_ zFdJEuZhT5E1r-$>cQk+Wf@bN)<`8YP2pIa|zw-$KAGk zv4J9(4a~>Va+I+h_M#_?yo^_gX949tJdgIug$XW+uf&eb%p>4%H4 z{Wthhl|a<7v<5dPzaBCd1^qO-xiPfIfmV9H zGb2bRz8juTuZPxf_!#y9=FA0AU!iVL$qaSyUXIx-62vZ9{-UMd98A0;0w03mOosX} zhXJ4%eJwfA+8`_aQg=q*pqDT+n6|2%00Pq#P>z`rsRbxAV5bwjba4B9jA}1gbveVcuCWgLB`C5rc#LuZG1M;sVp$@=61=ShJj8_RKo4Hu3-D zc3ZU>qFl0k^pQe2S=T1O&aqu2Pa%ni1|3mJpS1ME$+9iXV)dNI&$6K5tynr41|BxCIU>GILc_Qhm)bJO8uOQH>*l|>9K3;R?Cbg zCCNC3XMCJDk->MjJm6V{D#%{Mp9C z`S-%Z?@wEiKATHv@P}Rjca#yI6uX~+rq&RRsvC3{6vKQf&7$Fr;|*4~X~Q%&W-_Om zxi8vaJ>+gQd6)O!!6QE(sRBtm73k;=CfS(nrl;jKHwCW_=}*dAeHOSh?an%1_G9&d z7oqHjheGh^FGT3ABGZ|b2eqii(i9!r!FFE8X1iBHcmIAMqhFAb?2kt2$Q32d!io%g z+euhUvHEhdf&_iKp%~=^B2jt_A#R{pec{pQ2*AgR<7%!s%|{OpsN(;pfM~nr=tt=Z z#7#0ouV`t#fB%)pGy(;X2>kOV-gXeg!V{pbc{y<)H95_@`st;M6IN>ouFwir&0}kX zchSl%uX!n|L?eVw(#K2Xs!zx2gf4}DRf*ubK}-t>mAK$Ytp-!O7hJY+1E1Z1d6qI- z#aeADvHPlqDIpNlT2iU~cIHYuusc{cgixk1K87>&s;Rz?e>~|Nbpk+2q$vCf%@FVs zsez^cs{<0+cF!AB;qfPd#_ylTRd_t)`X5O559E69@$mnJr0f1I{on9JS2Wk0)coJ; zdq?h5`|AQP6q{Q79$%VAT&W38PtGc%@Gj-br>j8gZRk&(_%=aLym z&dH|-Bvg0?E}!0E%zYjIdE*wcWf{CYc~rKOTgiIW;OuM^bJOX0b0~;@0^C7s;340o zY6M#LVR>ZQA_RBdCEyaDdLtc;G-0Xi*E$qWpnJ2hAKKVrs7nf};?nvdYA0Z6UN9pK zsjJUZBIFU57r+{>AY-qs z0=Q&9K89RG7_z8)R|kFgt`f|}5UmrjNK~()hi{BTG4)dP7R2R$f+-}_8SN7;&S6L| z5n7=W`m&Fa-P(84)#HDiA$~q_jmUcF?$;1wEhkU)BmUqRr$1GYB+Y&UU8R;(-9VT~{2cJeobE59)pG0u<-qizS!Ho+wIulq$ zhHC9KgO8n#MvUl z>DQ)UcwTMAW1^!+R=}qla;a373(oE7ZALd;Z2C-od081cRml^2DuagJbyJ4#Bb7pz zJd#qyZlmvAq|DC&b-rsp5RT@559>_h2v7+$1T)0NI9$5}Y)`9{dRxBbX#EZ35!R0v zF)oNs8Y@lW^k3MIxMeU46`zfLIm{KSff-LYsA+QFUMl&Xh7goCY?WZXi#6qVF!f4| z%u6*K!lb4F|2b@8CKB!PsPJ8BGLM1p#nMK)9Pvks^k=Ulf`>c-O$#qxaQyoCjv`QS zzc{P$*OllwN%nUcpQ6TI27|woH;o(FA4B?{FK?G#UwXKlgSyl_h1(q#<>Ft0@f5ze zy~pF6?Z!W4Lm&Ke*0m|%EnnBOJrncEyHXxb4~!dzyA`6B1>K`Xwp~z{ri(G+9SpN6 zg;AfMsRaoXd-UFR@T*VJpl7phChyglrNse79oj#H1$C@YG==RXdXbyHd&M>4HGcM- z)|GW?Mcdwjj3de1%LQ7|7nexS(FtC|>IjYlIHpEYD|`|{>Lfl3!4GkD-NQ@*46o7x z1SB@Drm$y3ybD0N1zHBBv`;N(4wCF*if<%nEyKOlu7pVeiaG=KpC|zKI zJBxECFluuF_L3J_P6;>U6#sLz=p_1Njq0NFatI(JWSmNJ+Fv!JTKO4vZ|-6`Ah&tc zJCkbca@V&3#}oSta|H^513x8eZYLWu{?+PtluUPhW3CdrdGLycXo$4u38%=h%jHE}DkFIOr(CjB5njuSUgJ*8|t zpjIatK|Y-$pQO~T04=m_gH8o-XusYPw*yYj{NObOTJC#DbV8*XR$`jH6!Cgn7b;PK zr!LlXjH|hg9ckubX3_j^!>Xm?R&}P3fy!bp3hPW>>}RNg9$D|5vv;NIz+MgT9gUWi zvjD4!Zta9_({2jn_xEfAZ$yh3u^5W>tROnv)aW;S=p$|)lwbshiX}Y2>X{IV-r;CtJ&{uK3_}@xxbZ$;`?TNT1^SA1SAe|R%9Y*mAL~99Axr< z@Donv|7)zrnp@>Yk-cC*-kmeX=~6J~GC*3G~JMW12**IxSAOKt-X4u}TT9d!Waq*!^5)C#6aG z3!f42b-PmBZ#541x)kO+s@SyhQXo{O4z{z5k$Rel`yOrbVy_L~yF^Yz$0ChR9S3H)e*WwQ!hn^hn zQG|zw&sUgNtLonER`A9`$ku+q+q-h!!j-MBdw;XKKyMAimHVCD&TR;|!D{?Ke(Z$U z-&S;fGs|Z3ObKg6)6PV8HlHZA;Iqctb)i~+$OON7= zEt7-dTWiWpv0xhqq}uA!((%rqCO5Bw=Oe1L{InEarGl>4i&qVEvLm{j@QhjUatCDU$C)zH2C)RHBvp<2#13o zabJ&C@xyM+FZhoDZVhbp+)akLiu5(M%^7o#WEsiRU~nW7X`219FSMc2^M@xCL*_T} z5s3Veh;D8Gg(_Z4>PZ)wV3@A8ZyU63^z~t&qmyO+=+c{U`pwX?xCAPGbaZs!sCL5V zaHm(wYO29UY_86^`{A>-+19Z2QvFOi(N~F*1l`B_h@bUn6q%ExA`9R0|Qim3~vh$LV5vzTdb4x*(^xaYtrmbR8fMNJL++Z|hI z=i#K-?zb7IwcucQipH)BgY!lpf{hAiD`}D#Of7n@3GK^fy1n8PuQaSarf5{UO8y8( zyjI!)-?{6zGq@bbvk1E~*}~W2Z19jXt(IqmQ(m~dBdNguLGC&^xJJj;+kK3=n<<}a zS^uV#rnmQeQcs;oTIqv6{kI>!4N&Lxb@`DSsHhX3`SU`Wyo`_eWXYZ#FD{EIPnPno zy;^^mLpJMlEj~S-PO8#Va9ZtDj%4Vo66*r9F?F45&il!JS`KA~Etz$a69OElHm+pi zUL4JDV!K(Mk0w_X*RO@QAshnvU!qMJF?kRnZ=>`+;Svy3iJw7#_UzMfXUzD_8 z_dCToX&GimGR@ zr0pl~r$YprFP;;>aDN6$D>JHRoqXNoLDpkK%8hb4gPIH}0bx2jaF_h!0N(LpeAA0T zk2|mcp5fw`a1y)$tEaO#Oj@aVKurQUtN)~j`73sxnOwP2Za;B}FJ@Z(#_&$2Y?K}J zg!s`PCdC^>j9Xb@h+>&xd^*7G`i1vbp4_p{6T$akU&X4nqtv@@t7l4sZg(oL&$QSTm@a`udAod#|6*k{7ieQXUjw~g_V zpQ&sr`E`t{N68(`wjOvtG%`xLm`-2ragp!}o8X1ui^Ny&S+lYGkNJCjdPOozqM0UK z@SfScmV&ZFPAY`&F#Vb%#G82&KP9)jeve#*FvXvXaT#u35+V9C_hKdG2538p*>38n zHf4mAErhZIIS`$hLfH{!EwHF%HByje6)-sxORPf3zAcV@#y}ZG+#|`bXnkSPddW8G z<;5lIC2J+Y7fex1SARAT_oSD3;>xQHF96+CT3r*LGp;jiP`J6h4S&;q;UBZTK%i)S zf#A}0h8KS|$6fu}hXtMlC6U%-#t8;jjT0_EX6!IdSe6?79C;<~CH&?2jLrwUAjNS0 z0DcJY`2EdAB|%T%aXtrN7HmZ9z~d6K1KDu_X#Q}@6eVq--G?VV&|*&KXZr= zmNv--p7(qxT`oE!B7o-$Cw2yBgskdK|B)9ZOy<5yj+hBcgD&>-H99|gPe(SpmQ34z zi7A1SAn5n3+RvBf&sF(*K3bVC2V!K)`W_InhrnNE2omLK8zx-R68&RQfCc%-qFe|L z2EWx#e)?9MPS=9atUbNVrahha?G&)eyu`I^j|OQ|NkS3W6^D_vQIv}s%Z5dpcO_7vJ{(trn~rxWQd1h{aZRQ9a=)=g+v}NAH}jn# ze9zdL(hyaQQ^1Hw0d*ej)Dd5zcCu+OG)gMVCI1nT6Q^@YRMBG zU@Y8!K9Fe}nPFL>Crf-}!Q<|$l+oI3UYBfi7xTi=R zZ7KSaSj_oJQV-fH#d!*~$obNh~<4=fF*3pXyK zCQ#e0{sc5#s@NNi?1$oueovr!4wwVZ$yx)ddqR)A5f}b2Jb&6nwi{Je^oDwG1e8P) zMZPX6}s z;g+R7n`dUjEqm_kQrhV2c*PNgA$Ct^l7%VIw)+14%i3ieZjYC^567tLUfn+HRCapaSAz4>x0$s(jeq~t9b}gybbcnJqXeCDDyZ% zsYwUEX@5jT&5M}J*r-VaStYA184{ruGmjZ2-N4%k%o@I4SKx|VzXlt>@WDdkX5tmW zIZ}QVqQhRd)wKKBu;z`)BEbpLkE{7QVmO+#M|AHj(TlhAK1K?>SKNb#;j;+vO$5IBhj(^x-r`XSggPB_>6XL4t@ry;C9`KuXuo~QgIC0KR5Vf+pFOijGT zaLUo=PQ}bm7B;`76l6t|ls%E-I8j7HZxS2Ox@8qQcjr5OM1YIB;yc}?oW3(iS$?7< zWSE^1w4lw;?O_U0l(h@7x^$Gf;euc_+m7Z8r~v_O7BA-*5UQ`NCKukM3V;L>pFe-Q z$1-t6Mj^Vv@iL0rElk_dKAH4g5c~9qr=`IH=WdhIp`3YD!>tw5MH_9d<2cvba2ZLU zGa-t{jhMg6Pjr$L5d^n)e?b6oh4m7*ZJXdr=p+bpdadaB;orabA;Qdb=5rU`G-Pb# zXzHFpER+}CSU73G)NLh)%SQ75R!|M}a zY*1wuF8K7E?UFV>8&+59=}XW;;hHjr66(HYd_+?phCD_N)mQA!@nR?^(;6ImJ4}>j zRn^MPLK>h-_AtNX+iooI&_1C{7GW87oIKIUV*@rfI=Cy$&aZehY;ZepprFCge?$*{ zW)mV%kR#fm)O;;_Zqq2Zp$>VgjSD>bspsOS%92?ucx{iBQ{<^YPn6`91{#Ud_NZZF zZKj;hxQYj8Nfn>2UqzAfD& z{L{mJz7{TGVn9RX_=bSj;7Fj)FKj;hW=BXKlJiDTo6D!RfG!0yuK*OT7B`J1B-=O+ zSm+&a-2Q*Es%UZ@{6DO!!#B&CtjG;>%n$dJ#z!J;`)d5YdlDc9%1m;;>{DObyHiI# z&we#AQ$}gi{b>p>5N-*zn|n*)1?jH=AzErA|CK@IORHeOR3p=0LM?U*S^Sg4S7;=S zWE3px(FzYMB`{ByV&+B2PG9b|7kCce@c_KS!5H;hHu?BrBy&gojW)7@NWd{k^i`C{ zUx@hdHsSI=BQrL^zhk7!x&~a4BfPbUnnMaov_8A>dUi-}wq@ErW!yOPmf4Z7P{FwtL#mCj~ zJ1I2GTFIlpuh~%;#%veF2CRhno!$bexn+jOGHt#Tm9!xfdEw>BYDkM7YMTlSlG{FL?5rrLZM<`7_%5?e1PEwCAyPca^Q5D z+cVP_X0lIY6#p`CyN!<&@PgYE{7fCS`*Ti6$kfr;6e|$LCeB5UCoiUlvjRa}EoIbp z#7s0W$i*|t4TMTk?7J9W7{9Xv-!5fGMbBGhXFV})1tZ&~^jbuOlAx2r5hHuk`m?v% zhF+Jlc>nM=K)&#gfb;Ejsy2RE{7&b3w)uKSadPrETH%R=P1U;04Ohg;cEcjM)~Ru% z)hrnlJNFEsg*1foaW=irKI@N~Cql|U6xYhE&uK2aJaxpZBR)zP$v_wRxfc^--Fp}> zxuF9tGA5tV3_p*QED5vJ#mA_gpY(fri3yu{-E6Q%xy=GF8FF3ZdWkCSfSKS7PbJq6>-%!?DB{ZV!OZj6z=4 z;1-z_qFfj$`OGz%jA!T6x&rTY$=#1>4BaSr(3wx;P*j08fSXqZd+++e+wxGy`r&#V z>(P}F&2_;XE@OC=gdFm)!^+r0clIM0?yW&lz4Zt4rCq_AE7M9?-y5d95mI%enDQ0X z!#a|PRL2Fs3uL^f0jc=jhYrv{Ttup^S7e6KJP}w;NK5{iW!55VZqU5rFV%ieOM4ht zC*{u8uJBSCJ9ANiPmDq^{y_f7-6@-50JL)*(o?60*)4n6vNyJWOj0eX3`gpa{30m| z)`JB85-4wPf@@K7d789|IBS)6$IT#m7=|zZz?Qz`lZ%u|-C&?Rx=dX?mLGFAKD^#0 zx;QUjf;#q(!o5LiKI9wRmnADmo7+!r_+rzw`PAn$J}!VlzlHczU@c$Jmn%RRD^DQ> zbHY?2XT;j2QAEPH$aaagmU5QkoW2#+*=>Q&hW8|=>#ocg^LYicY8l4frRux_DVI_a z6pr>55H1PWy7CR52^5OdUY-mVu8M!P7op-&&MECZt4)d7o%zWMu1~i%Ti$TsuiCf+ zJ(8v%AM6$&$idgu*$*VEgg6Nx*tG`fM#IkP;!>>kZtZkp4~vzPGcqWUr>v7f>DH0< z<(8YV1-PBJL`2fxxrPIG0(4k(Y93wGvBt|yR)BTVtjQe9Ee~cF+WZ2En`0&6>UGI&6(}ruO(d(p**rVL@RJWE9MnX6za|af5A~$N4?b&;c;=s?g#?>*?@Yt@^!C zBQp{8r%8grZ?op24ZWBPlT8;`9EQAStbTTyc}ecxq<-E_7wT1Di;KAXA^ZJXS!yhuBP8A}%JSIz)Bp{09WV`oc z3U@Zz3{|z4vvGQmL3CR*+_uwy013JMAEBsAOE%gQZP zHUVIVfCVGJJ^{esZv501?`I!+OzXI+e94min-PCk-lA}O7hMb4@7f%vZUi-qD2hOfjyIeC!dD&(i@-gO8QjBUXZgIioIOEq|5zjzJ z>Z$|Q@~69&Zt;@oTDt?|Qy_I?L^a0szZ>m%Bt^b*?GX{&!o?|ttr*xakb>z9E#2pK zN#hVf8Mj=Ll2N>&w0L^D#wPyL4{7&@q7MS0-zsK+_A_3C_) zFeciA#xmCNA0y!gl9hUg1(b~+8kBoG^tiH1yP(mZ1h}y=72QLkqfS8l|)QRH&FJ>K>Jzy|8;X=~f!dv%vuZCXlbB%`jnVUv-I-Poz;Rb=Hs z`7RC^dKG?&z8s`&QS-iCl^pVo(;8UocGDf~)MYRQ{3IiU696m3g&3RQS@*>2oPrfG z77qa5+_pThZwo#96p>Y&Wp!t35!@zmpOT@jX!%4gA`JcGGxSVjKYef354r#TTlmz` zEz zcZ%?OKfawgj5mvFXEk`S>w)>=x8SKG*BpKGm~nlurb}!jg|?Tcz#_eGLSK@3+g)mk z?S9*_&!}Oy(MDLWXd1(jF-w-pPNm37v4i{)=Ze&gl0%PdUzmX1;JcCMfsrI7JG>e^ zZic~|Ypwp;gVU3D2>=_mhV%zvHlt{_lyx+}cX4M<+`&uhhiz!0n-}LzwaZ3@L+{3CRIKunfZUYl zpj#5igW;}DT%fXlb`U7T<>x&ag_xxyVU<%Q|DDQ4{0mb8%zMZ)(~JCkH)1DHm2$mL zUCdrsg_dg5eZIH4{2e96p=86pyS_76IkP87;(#C?w{$lKkVb9=CQ9_uz56?yM4&&B zLI4B)3kUu$z(UxwyhQU3cCVGBPD=P0#gNL#C0QDofsl{*{s$pv4G3*3XzO6thTGtx zf)VAQbHIdH$Bzhp=xpJt$~ekh?e;hSK4+(NhuOA|XhNA)%Xm!D9Z$d#m|MK?vw6-| zH(K^y^6dj_OFz-L4UMYc!i8G3Yd!9wCaefd_b;UL*wQ@lv*~Vs?DO=!U;fzHpAlI_ zS#v#{-z2(IZChr|W;4uc+nXW&LX(fG?I)PFRkpdd4K@KxOC{CXi%DVtw}-vX+oC{mm?cV|sb!KP(DtXaI|2NRmp@5VNN>XR0EMN39Kh`WJI z+bzRi#?~#Z?HcTgB{a{PMFUxlhjQQ;R%E~;&$%_rQ2)}5cFK;Hwc_7)HLPu4PdE`= zX<_XTFd!>Sn)C`H%Yt?3$VouAB7b=4t#mxl0HG~Cm8hI1Y-HgI@uG$YtkpN3p1l63P>u2z{k zicWlID)&?5vVAR9#Uo=mu}W;~R6IOee+g=$mzyPQBP)GE`%(qO&s&$?C=^QW$9irYaY*aRv}I}OdM}UB^tN*M zZe?O#eh94T3#MiM6GOXa{U0-e#EA3(duk_jN#$-IndUsF|8mu}KS#%6O&u{9XI9S{ z)|qn%J8QO21)85$0=m}X(C$ol-2d866}aV0yu>^OL6XcB95SIU??%mmtMv{{k@|K^ z<$a^HE8!V40M#CIx99eLT7>}zZQy47v)&CqeM zBT|bCNZH^=C{K9``k9|bZ@gu|IKJ?Op{x8eH&z%RJhAf=9NdL>nVyOh zDA4_M`_jT$a{%!$4G!XBPJXSzRf7xQSXNTCqs05&jV zyFiN4#5nF`hM@J@fpoKHM+17+0C*u#+OZuwk=tFQ zO+JWkNs=Hs_RfYo>u{e#67t<*o|`Wtlsr~tt=f3U4RqNy@ed$@Cs>n!7Di&JhEU9W zgUrm?Gfb*+oX(C0bgeC~pZGOSc1I3e??%x)Lyxf_oMKq)^kZDZ|ijB-}77P{nUj9P-* z^F2Y4Pxhu#^nzixKsnH*fFyGas?yj1{44N9uvK_MB8jg;81JE*2^7&+C?#Usuh$26 z4Y7Z)$A}TMp%4n!t?0$2ew44y`*bvye8xnCNnJ*bp<*Zaa3!iaV#O&m;eTN{f&+wP z132J{9c%Vr+ivW_pQ~&Uw+B4!# zNaU5zeFSWRaa=^0a>bw{*$|3_nrWV~pU$9S3W)y0v7Nb;zF+Y(4^A`6`9h|V<6<4Tb;_jO zfawaO^&a4fo+r!%b{9=WwbZ+Zy|95AW*7K|q5XU#bv^rH%s#2Hg@_uv$FbN9 zy;tjGO=0um5Vl3_f}v`An4*$(5AOuMA7zKEWRNNZSCqvXI{+nG;Ht=YYD9qB_-u_h z)0@IOVtOU46|Az_a<#lOB;$6?{`=qodHJ^vgcR|;v>F)-oA_V-i`=Y3)se*VR@h$f z?_p&gZUqia5YbSkX0+ukAK7VSJRQO}KxZFhE9B|Tj|dC8|24oGJ8z}n@I>g_SBeRj zoDu&q2mO=moznHwGK{vlr7dLFpIGSaF?NdEJMJ*~yfAuVI$~9la*9ld^Y8+>Oo{9rz!ahwJ2&``u07h|`ZXAexSu*Lx1L=9Za(!X0 z@WRF~uaW$h-KsL}d7st+5SK6PU2&GsaEl*e)Y_(hq9nu@mUY*vv^nAO9fChB+T*)B z%J!Qk?;3vhfm9p5eu^;H_O4ONq|Lfn2Fx%mEOq4lK>y`z2AqS=HN$J0cxiS}=mH&8 z!`Mseyo96lw^=zq8dvkxgh-Xg2P;Le#u4q%aoK{+=Et?1rJ6A4IJjWb{E3#Kj!Grf zw#}Rzcxbiw2S6Qbk$)|5@nj46*F@(Zp+oQkHN1R78CKy|dR5e;GMk>Ok zj$~ZUrw^A$b3y@x?b^N{NyhDJ2XI4TB(i}0UEkJP7UTPj+GazXj?bMe*E)H5bUmrH zMatB)3vJxeMkK(i8;qg-B+dH{H=BTboBcRS0Y_~Ko!cLx{?E5A+ z1HfXBK_Rf)mG8snr>U@+bbm2x>7nWX8_z&w%M=9>{OiqC>;HKVG`{$+_P;w^`bTGp zSxE-FL_zZZ5mWrPk@{PnaK4GqwtzZ-1$e%Q;Jmq>8+ma(myBRN7q>JY*6Gyp#%H89 z*k|NC2=E!{e&I868TfRWo#DLW@ym-A1h(erdy5OQf4^Evp&)Ww-ZKLLD!te6o0`vX zMu$Tn9mG8i4Z%I#P=K#rxN?)8{r7Kzu*XJP5Jy3(79bD-qKP}wTR&$?0q}YC??VI7 zlX<<}{J=3b-HSH#l)rll0cMlw4~@gWA_C`XgCP={2RK5$(*dfElmv_NZ$(o_o2tHV z(~0ZcUN9rIIgW2mDw66)*~6OOx?e)LB75RmO10)Mf`@rxNH_8R14BguL}YXc(Mgzt zJLkbQ50Y~Lw59AEaupCy!=rw_0OIdYZc6pue%!YhB+mT4}FiLrldxkkQvixTfl z?Q;AXIFY4rM;%QqK~53gehjtUQNl_3g7XS+bKI*YYZjOkMI6{Y`p#f?_7aGQkn)QA zc8COI-RIka2~AlpJcu(6Mh)LQ63)X~Nga_kA1&RHP|ToJVjBh5v~Fa(rW@O2BY2MU zIA|0nuM`dhCX1eGfk+m%0OP1YdGi6mwaW;yS8TR5vQvvg+!+5_-0_PIz3ReOU2M>r z-cCzQ?m7w6tj}|_5@H)Z^CSd8d=mgY0&JLSUBOKWEv_MmYfhZf4QWTzlPusfZQt;< z(;=-fua>E!avkw(7vf23aIC6nQVjQH`$q>4i{{^!*xTMrwNgMVa!|~<&{V7*UYSe= zME_Lz~42^nFN<^0FL)I`dI(1h_SrGzvMP%rJc&7A#oHk;W%O=nW?H z)-A4y%=&ZDPen%MM<%80O2~&RZnd6{O)m{Ewm2wxw8|DaUM)#8GbiVFeGbTv2>)9L z1dP>3Iq3Bv!@u7hlA7?{cnHlPtAL)<-_rWkJP5G&F+scn4fyRFH)19Rqajv&MKV3A zSZLaB`hL@c(qW}%o+@&}i7iCKPmA39-#VLnwrmjoj~o6v(dLY$PG@6SW>7;xxuQhoS!KBXaHU z{q7cqTho(^_6*CL4WXmhA<=hrn-E6*L9^X68+r2iz@pPsnm8Wxc+K27mmY3 z7V{bq;paz_sRH?#5Wm|JL|37?y6`KFY2*L0+ixCZB?XUBDOb0k9M zHRziGEh8g8&y)iOQ_>$3tx4d?S|Tf%dqUBawz*a4wv% zg7VmNyfiCH%sFctF)^ivpJL9ksx~UW1qy17bT3hnsH z`G$?0PyF_3Lj)WeAI&)(>_I5t5}&6j;Lz^CHi0Nmz#7zB8?hYt0(8SmHK zn)C;^aLgyCS<^1dBK-O+xsDr9dv#m^eXrX)k+6IF$_ROq-m6s8X&VFJl!O_L{XhgN zb+PTi{zKLCgxCThryQ3*US0W3#S;zVG)_8d2xI9c2NQ9UWEOV_OfBfxFBRr|6=Sb6Zxw^tr{$w5i3On1TJ^ zu575Lso%=Am<{6a!DeepKah-}+x*9cLf72hw72%Qhp{Nm<4co|5k(w9<#94W`OjA& zoOf>CJotVbCwH6B!W&zIV{{5hkN^I3mps%+^Fzi$U|(hFtFwF5yz_Gpc<)}zVv~3> zqvg9t$ijyD!A^3P(+6WGkF>cviL*IV9OtC`U^ZBl$LwPWFt96Uf{l9e$)Y=eKke37 zyTE@vMscZ!fyry*O$DcPt5%)ZWENN^{)D>&3YjM#xCs6t7efG~D#~sTV#e3|EH$r7 zkmGJ|4(^F1bo=!kfhW|w#1(q?=o11hKb}^+%d%o!d+)Wq@9TIUVe=Z@%o9kAm!jTq zkYQJR-1Xhy)*28_yV`~@#~#>+O-b@5(zQ3X2MkC;>^g#emQpY=quESQGtWD2A8q+c5SX>3Ez@0N-$>_hrYp*H9?G@<$ZQqoV#G3)z|-{ z+3IFXw=S?=9E*FOR+q!)Z!aDcEu?47k=dv?6JFAIaSm`O{gaLVcR}aX;NTUdAr2Y4 zEkpO8Stq6^fXuEBaNNq@o9~q)hsSsL6=p%gotO@q~Kg>2mjv02$x&M5Tc_ znd8=0s#S({tQV_e`5UKodNw%+H}OVx+CUcM zz>EnNj}QqpIOqDZWTbiME9aP~F`ABB4a9vySbQ~UXw1}6An1g!M~!}QK7ZChkL!(` zG3#ekWoIz5C%>5JO&SpO{FOg_1-WzaY!@ydG&lh(Wod}HdLDKB)Rxfdugoi>_)By9 zx84;{5EERIPj@&Cf$Hlw^SUvuNH)Cjh2e)DpAj&Z`cD8-jHlASRP*LR6Hg@@0HMV} z0VRk?KHix=W`0_8*Y3SMur*R>Tk8Ue$cssaJZ-;YOjyHkGZ2TARNRx zFOa87BWWe0(DW*vVn_Jx-nkxnAap65j{n<@l_=pzzrt5jdt(dLG5)8{25L7wR@)E< zoI<|01LQ}i@e=;u(l^8qMaa_)Hb3b_Rga-cB-PYf7;&=ig0S2}6g% z(LUylt~Ih-C4!P)cOwto$q@IklHZgG>l+-j!JN#?hItL9{NaPS?jsY z;Maui+qJgTF3(e!Vf@mqqjCBXAS0Q!@-j?sy7jeve2J$=M(ud)h)6qDmY>5G@f6;&e3yahs2hEu zd)v6y6yxqF-2|MM9QinQGZMfDO+Zb=&8i*-e)5Mqd1ho#3dVtpeul|Mf}thA)gYD9ix+}`)<;Mv?hv=;~&cMlalvf~e_ z+sU)sZdk(9X&YW=Zi1f-5|)zrKW!#B^PXl0&#?t~`g{$xa)ZfBn>>G#O}1>cyr4Yk z$0ceJkg?TN;a1heCtBnh(12pYrHld7_74GgPt4e+7;Z2V~y9%s0ET9;7$A#(qlx)Qze z12!3#TQlO<$1f(8Qj)A|Qgpp7SM9sPX-H6JUt?lj_E|~Td^qRf)Ve)_oo4nYz`D0w zw_NO=<9A&t317MM%<2?UXEZcL*7uROsp1WeAJp`XP>iE>OHe}$w|M6S;bC*!Oj5G{ z&7t1q`8CMoVbha};_3vl;NFMS2kee3b?^y+XeN4o#_!^5G!XxI9H*%^FOZw6s8Qn+ zMLUDyCVG`))~`1ux#Xj1)E9hBLG*ObN+efQu?Lz^SKa7E84!7t^zdoZ9l$|wUwPRVtL`~l?n+Kxn1>un2Hf}>OOBf6Xtp-2!I3=` zM?0ay8^+u%a7RD!`rTzXW_ z7v$cp-vF}$X2JdjQBeoqf@t1nXmtCwR_XA(lDQFq7ZqkIEQQAhpcBx$A9FTLCKf(k zm)v+~!J#dSS_Ojc@AM#|Fl3O=$;EQ=%%{9uPBcb5ZL9SbM2ClQK+tDu(%ri~8_Xf2 zMNW)fQp@Z^LTLHjZdf3cq@ ziJ2PNE>8r_DWjTrzjtL>wXUSRX;%9mKa3wZo%-a`5f{bkmMigQJP1jTIpN; z4w*PFMvM$BGRta8Q>+inZ9j9NtHljeAGuf{W^JN4py{qTl!GXLWqX?j&AHlsH@8i^ ze6o-ry`)0g#%Dyp$jjRYEjidNSDwlHQ%8GAX#BEtZwp(jVn5xp;H#e|;fwk#R{IRb zB5ih5?|6TPCHAJslV@|s*7l?pDaG&wq~@p1@j4$Szk3ornv?9`S-O9STi^U4JYnOA81GvMRCu{0C7?cYhk_*52a&nM6LIr&F;G2lSxO+S zrKk1`ka)U}FYv`!*sP~xB|OB0+it-xtlN3I3F5|-aM>*UAZ+|MPkpVsxhl)O0WpU0 zfdF0qtoWzClJzX6vmmg7hS7l=AKiLosrNYUSDc){c(3)%q}EK%iik;GsDtr{&`13P`?d9S~O9 zC^P`51DuxJ`A>e@tqJZ!?g~`irPv(^|gYo8)3zEM-o|2BNOMY=4b0hXQ!kq#;P$b@;$*()n)6^ zKC%ITs8a1lN$vRBPn>$2Y1MD3VNrPruS4YMowX+rL;@3SL=G{#}~dZnTN1I zvF@tM{wkT?X1^Bq}4P znv46I_fdoCS@4on4xr%BX(_v;G_T5$+d`gz7|+Aj22|=D*_Ed(yZSwOv@NP7SAtSg zI{J1#%hB6cltjr z)vN>liwd=(alCiFYWxZ1mWD>Nq9Nzymj8PR*`H{&TKJ$0Bd2ESb^cBlb!dN4uMSYe zT9AKsm%i<4FFnDL06Ow39GmF7YXvBuUbO$KOFsA3j8D>9ME5eTsG#m%0Xql<@N}4zP#YV8(GtH$|x)`J$@;mlPqpWx^G4 z3@kAquaWH|EC}@#ys!5o0eQuEn<8$4CCT=%m%V~}1lYwm$Fwa?6qfRu-)Lk^D zJE-I=W_s)-kY4(3>*2l@qPOdP-AmSlgMH!MvB!amG72j@^avs?-MX^`yv1XPhF7)LkG9iSX)2-}nz?u;O3Td7bkXj-}Qzlg;C)KfGl zZXhN}s5u{NIQ1vqy|(#S>l}UTBCgv3kgf`^K|#cDs&y%n1)PyKKT!f*J_RA_wLU<9 zxFHz(RwS1yvsky`{_jyj>+!A}vPVzR6YT5GA#xo&njd_YFCiwul^NEySt7xe;vErZ zXVFl1KSae# zRZ0Aj+oRSe&)mm)`K3+P<4)o?c*dPikU)&<7UG)PB7*O1#_U}UPqk$_4^ik2?oqqw z*Gg6Eejgv+VvgF(yVIH zWg1geBfaxgX4}f7U@gYAiTyg{dxmfkBqmX7p)Q`EEU{C zhQ28Sl&b&@)JVVSM|+0Nb{wB*N9(*{-xo%bO4r*up%Y7Zyro`nr-P0si+jF&LYc^l z+}52zDqEs6>PdPnUHM=cx}dnA=kS+8E%q=zv99Il*@N^$Q>N1Vyzc#Ew97O+n)>@u zAwB`mYRM@rIl&w^FPkv`*$N(gD}x)lD#M}*=#Y2qw=*<V(L|Kgj4PQ0{q<)?5$ zt!8>nw-hQcXTt&Ej6{`w@fPDza0}VijA*4fo8BBPo$b3#<9(M~(9gk=&*PMIt=3Z; zpGkBceVTc?T9(BZ2F5JeV+g!-wo1vj76b-9cZdOAnOFE#|4aU~{2MEZ^M-3JbUq-7 z(4hT!K*eVY7S1n5qRrb@N)yIF+Om1`K5p2r;Ug%4%-x#?J2%}AsU*D@1ehg9p3#_y zD6rd3=~W0!@w~PbRRj>_e&$yo-l1#HS^tzY{<&MvgDA!Ss^7l%UajS5&|oH9rLql9 zZ*WwJjMc|lrdGnU>_b|F)+eM|H)!L4baB0p5nU(N0bBBC9Fu8Q@gQv05yJ;sMg!8# zgM&A1tY!Q}2kL9hboxUd?SNmQA2I!esjL*mzGD)>o=15YeV5%ck{Ew^`Q*kXzHUrj zb4sxh*r|*m5JBDd?Xf&(IY8o9WHCQ?*AEDLDjn!ko3?cBp5tof%I>Z9!Hwn@QjP*1 zy+5ZQ(^-S~9xgR!@m37iq>%KJL6}Qo6VK&bD_)l-Uvd^F?1fiSa0}D7pb5uJf^I@B z24Xw`i96wFwT<|ckR~8t`A2beJEK3exo)4-84xkBhXiYY820!gI~)TaDtRPa>Q)0J zFMsMI{)kG0!C&$6-wf7RKfMEUwH$9XVX&;7Z>}w}y0yOAU^z9r?^vL71kd6L@>@)y zCqI$MbaBSc#VjbCK5?AolxYIWfq<-BDJrN3Zw~S$W0Xm>Tx1o?E}rLnO70iYP#;z` zZ+ch@uZ$_^W$yEHM^w#YP0hx%L?Z*>VbaMPl2ujsn{BGY6cxtkNTsiC_@&wsz(~4+ zet@YrG{6~ymAe5{GfBiQkptT6HM5Ht>NPnS>>UBb_NWg>MjJMeJC$_t@W^|2j>UkO ziB^JqLn&rKkv1#?sgu55(j9#%a!^lJ){ko-sp03r4~gZ9QfbUMb^VXbX)QG9TxSd~{8Rvhh{}(-%7L4KF)Vyj)}F#w=!t69zw0Y82s0 zS#94o(KAoUkxlM%r`VnIUKisJV5ldCl^t%2xog$Tc)y|qjWGHeyRB?BH`}v6Ke4&t zm3*UP=1@JcqFcxEpkJUTsFTCLlY9*BJxGU5kKWlsdGMOsbMY|cOfImbu({DL4vyh@ zA+Zmy*OS7`)Nsy`#}kAQnTLHH=(4cD`&<3t8r>%$WB3xv3GAH3LR%Go*B)g@TM9{( zE;`&Ww7?0Xu*{YFX2EyS2(lz>2|sUNGYsXfZcrv%G50O<*8Zj)xniECk-;C6VTou6 z2L@{bib>GlvCvJMX%#Pig>-9Jri=;KGNnXi`*$?zk)QoW=0cN} zn!`a`?+h_(enL_QWQN)+F^^5~pBk6H3)j1V5k+RGYZ=az{=WIR^qVc7VFBG3Wu zSxOPDmlYr7mEmKUP1iT47C~h(h);~xIHbawr3w}IWG*kHr$V-VerWVv14>{P-cWi) zh9IM<>os7GUDw!uX-%+N3J|fHE=Im|KwZNm4`iolq?^U8pv6lS4d~uX94@e>dv!K0 zPuh__e>8~p3`8KcI949O zg8HbWJBG%Z;;D4|(VkIfzKQmJmds}b*=GBbk(SQ>T75tB`q(ON!jjKo24%wajIH~M zYU%t8_}naD1`#|*qIfJDxn;K&bw|o8D;A~9Vmr4ZDxNlAqugJTXMsVlQ$p2l0EMpL znN9)?ovG8=pT=v~AJ1&euoGBl*t+n#TGHh6mYe?7P~t20FN<1ixM!VwOgxN z-Vrg-+#p5tarhNGMZZ*7eo8Vh;8L@*e%q==F*X3HNqf94g_tn+D_#K5MlJFUt^ZK_ zulu4)fRV{CO#RyBG2hI0E@vD^9D`27i z)rKXa9w^JqL5X;7s{ajbt5gK)!imYVFzXYaK9Z8=0~HBwp#GSseY~iP zz!XZ^x58_$e!%>FnpMDU`leru0H&`UN~aUl6hQ+BpJY#FVu)3^$o@&?ojZjC25bJ0 zOt93*D<#p^gUa-mR&p=?F1iN~bu{xo)2C?BVDusdYW-O&&9-t1CNgj$o~k=(m(M!< zQ|&@tFGJsD%?0ie-U*9cI{(78XZsTtP$R|iOk0?7T%>uR_^(6$11Y+93w(0fqhfwv z0_y*)M}Ir6mtEGVhG%e?OA0$Tg7vPBDr)76t+(3+q*Ij5bf1t&(~Od`ZH`(T8M}n@ zW|?{EgX|xr6jIhQ zTnoBa@r5sbtu{FXo>A|IUSN;61xfS;ZQf-U|Iy|K*Q^9!GRlq_57mAdN%xo^5zn;^ zf#BHp_5+zw6^9z9Fjr^F66zbQ zzfgyq%j$Qt-^9;G;pHl8h{?Ch&~I=TY)mZlh@VnKbs0LaLz% zGoRYT5fwEHzJ&DUYU0^!5bljKnB8^ehgGmk^#ncPZ!wi5=gi3RMQ4cG8c2q`Px~g0 z9lf`99i1eoBpJWaK;>>YhDQcnVi%|a3Ou?jh6xoS>+Kw+Qg;w?Pc?^oM{ugngA2{f zDT|+^+$i99&)WpOaJv;umBa}&0F|0eQGnUzU^<3>GhO`d5hLSzo4&7um0L#v_yZsU zi;7f6-o|sBCmJln$kBj2+`-$>Q*YEIlI>81Ux#Cvlr3~^QJA3q*p1*<2Ti*oM{QdE zdMw*Rt8KT?pGKv;sAegG53&`5Ib{U?V&U)ky9vsNbpojDA zr@gGa&1f^zVKpSOp16={6~8ys5y%J27DWzhLlLkiuXgje&RTSN#>V?Qwo?*&SNfSV z&i_IQ-`!!DW*xT|`IYobssCP=@OQ>VdTamKI<)E9qfVUZ+M{=ULA9+r3jKrwh7ov| zp)cSZu8i;BgGN!YM#@-3`swA0jyb4~SO+N$M$7yE5cbw_QGIQ@xYC`{ATX5D(%mU7 z(k-R*kRk}uA>G~5jdX*=kOBhIHA6@b2#nO(_`@Zh` zx|Y_?3r~8Va0fGd0I{ekZHbB=R;Q!d{u)6VJfX4}ll~Qh!#7t@<2KpBnfL&E(_;^!R=eg=#zWrTqZ)+RP8gAI&U*Xa{8QwrS+6FP?s*@~=&G7KVt7 zbh!S=wmt+UUGu+#N95+lV&%I!!-uVL5=kS7kBM1UWtt*DECAI?M$S)BPJ&0piL0Jd zWYn&6VDp<11dq8r_<&YS6riVFP=gv;`XPfEBHbc}19Is1W550tm#q0GE;;;_Wq>m? zIiRgM0WF4Ef)$qfrl8Q&x%J7tMR`4Bsv>xj+%nMYm&CN4q0LLT{>;4GnxE(Z2ErrV zOP)hPW$uBq24uY@qv~LeiFe&Ii;5P1A?LW@AU?PiUPCeB9trmJ8+%9F`nd4jTiLp7 zIcON8Vk)x>?OuFLYTfdE-0ff_8uP7uJz(X^H)Wr{NlkqQaG|T<-VCa>$GgJB4lZWq z^1nU%+`i%*JMq5oN%DoQ=Z2rzD5vHyShStLP8~jThWPl7R#tigi!ro;IgRldCwYE2wzGF4eEMApxJRp*yJOLYd^e!@gJkin! zy4;7<%%~sE06Sg8nePyAbs_|UxAErm0;xl(yvAp+;Z{?I_x9dnaHc=l2DWcA(#(XO zjKG=v-ycYkb?#PE#wU8&Jnty}Y+4RP&iFy1T-^k0qv7l6x}3_Nr{MYuTEH+tYG}Fg z6(iQ<02FBSN`wJhJ$0xo#MNE%sVnCafqoNiM`fp1zQ__}&hg7=4j5J9aEVxIm(> z&zbX~5>q$pjshJX2#2eT1KG;ed!F}_?uA-*xLI!cdpOY`(I!F;!iD6(liP$#X? zr{)qKuU_$O0w`=qlIpU}FDJ5THg5eo6OB|np%%>gr~a{htAJVoJ73LJ$3jsBf!P9g zgeYwoc_)y%OG7BK^8IlmYbKSxJNkd4WE?3=Q83|uhd$)YM43PSWkrGvEGWPdW&Q)g ziuMCiPF|V_8;&SV)KRti0kL!SD@~luy8*IutoW?6*=cOA*p_W0Br!+r-C}!!@6fSXBXV^WSg5_z2 zUSa=pNnhG!=!pcL=ldN&?CuyI1pU7Sz8+M?T)8z}Q2?UAK#26<6KJwca-pZ6_r8@d zY^P9tZY_SrIgqQYA#id7#%rbouKeHjCEAP|KU?eVK-rEw9)IcpRyCUy6t#gM?CI+bMqltj>kA?%s$7j zqPAh->&*y&Gsh|#Tb>s@NBo6MiT?+77ay+OguDhoyPoIMYqsV`jm%5#r79Ox>Ty zDI3(DC#!GF=tWZ;QdoB0?KJ0Lk~Y|u)eH;vXx7oFYG$1?&>~&dWnJbhKG1e zP`wSz)$V>h0fToMTYpRs8=f7jnI%f~;t*pMoQ6NSCtGXTf*N-XMq9C&?5sC@d&~t1 zQ&Zm%V;E9RaWiFHnuVrGIV1U5vV)!Jd^oH{^f`y%!nDKu3fH?08OkyXO zVcr!J@Z^(+6y3JHC3fnD8?&&eQ~c5m*K={YzpSnVJ$Uz^Sb6yM5|9TG*7LEFnS+ZI zVriz)39u3jtCYq**CO?ZkfUFk7m*0D3ps+kR(p_gJG=NV9s~9PL{Er-d-O116P_T47*kyY8;MkgHeGPInGNrwuIe}Y~Oty$% z8mH+7C6f3QQ{NB%esS@&8YUK41M+!kquo;BPqgsq$qsIuC2hQ0Zi;;?0Ph+P*>x=| zu_QP;{?gD69f!}k;^kgPA463w? zdoqiCk5PyZJhw>DI$%LwXUTQ*KuYA@^R=bOgD1o{zIgY{(@hy4raC&#UEduc=DV8c zuCw{1+cSRwNjxH$_xf3^GxgDC0MNo-5wO(Y^+V#V$$cG?T zjs132(Q&#t>P}}upPZ$=?fK89{AIO@(tqyP*hqB93K)D}3UEG|5&Z;7!Ga=dQa zOg)N`R};)4@O9b{lw+*jIMdCKHsk8&3`O($vy;t$vGW98YYKTJsBB4-JeSnK8TA}Nql31d7}d+5~P)k z7mYg&HSn>AHo_$YQ_)kQ0O#p_CDoCl-(cl)+Frrs@-+HcP^+*YhswG#&sksRtbYx$ ze5^7{nBc2U!vx?xVs|I4ubvZo6x_(|1=pQ;*vGXT$=^3baC!HfbsHNWoDs>3vD|nN z|EOan26O;zHdS~kxzylIx>g#z(%DthDBB&UnZx#3{aqX}upQdbZ+&0j9jbsAWIBdB zs}ic#4ms1XdVg7@+`RH5y=OUFa;@@t@HA-3rA!XJdxCh6Ovyb7;OF#N#78?a+4aBS zu2Di~)7B!_Lke^2Tz=u*>t6HgPp~TIGK2q_p8GuqOQK-fc>=7Q924e<~h*R~-JzPrI_-`3eg3V5soB*)bR zUFc%)+v{OU^qK^*Yjk2&9Z!QmNh#09lcQQW&Skk=`f;5rUr*>QY5Horfe1%UQdaj@ z;0=Gn&m9_1IAq&`hpE;PMTNMz7;E7>ZF36r`Z@vpd@ekyL=Q^*3icT+-$uDX5#1RV zFRL3}rmttB-%-}|!78qwI&7MG+&+GE5f504r*{83ixNr>q?5GEDbIzxal<+Rkc0^6 zFvpt=7%s!de68u}^U+g^R#5}nxhwR;i6QN2E6u5vD%*SeE;t*40GpKiO5KT!kQxlg#SNkOa@v6kb3>Y$1YUFKnH>E z0Vr~>OLvy75p)s&y_iCIS07y{ITzE6FKgTw?JN^ zI0&6#o^`A--28#I_%GBJ*11cnSo4r~P7`CQh=RPgZ-uBlTQ5*g(e<;)uJnw(>6nGM zKF;;1=R0Yy$$5mTWtd%A4urZEMGWpl7)$GeEQtP7!s{Pjt{lii_eT0<^>|jH_K`=?6q6yHWwgj-{#_Y)^dF{56GKD{LI4nK09Z(nf%5;+YWy#N=NVy$zi!Ff zx_H3tcqKoT!RIH3QWyc$()V+u`(TGM%&w;WgdIt(bAO=6jm7M0v?CLhHPxm+F}2!> z|J`W1&sKBztU_aNMu@_Qe>9YG6!}aq8<3HCRZ+k&+-)WH> z$gq#^fw8bx&S^tmK9wXwRSi(A`WWG0=Izkn^m5R5|0g2;auKu>0@! zQlmdoNIC1$K>p=CwY6a-7?-Wy)Y)+v>9JS=Z^@>1V*u0=eUC0VSe&3e-YZuS+m_9p zg4QGZh-)Dr#GxMnZ}YuFgRjc$XPqF>T*vlZCxTp~HKBf-psVwfBW5sHk^%9c^7;9` z)g)w#b)VYLuX-7L^B%N7178i%Ey_CT2`Dj|^0E-BlidznTN7Sy&L;Ud14Asqy=R6= zhYLHuhUQ92U37`9((jPBDv(2#=B`iLR6L7h`StF^d|z6rvkyI4K^aY_nt^STxSI?5 zft(24w^)RQ)hH`w>;5E&b&nIVatSbq8s^;R;vnD}I+2gaMssahs4ooaMIodQdT5^y zl7cP!?TxeMygl-=X|caQpB!SO=1n-zudj*wsFM?`DkRXMVEfEzL!C5YEIV$^Ra?R9 z*TS4hJEpj?vZwe$zSVwW6$?$!KD4u{QYD*Ve8agaCK|hPn~cx^yIXw^*@1*GeO?t% z*lOIc>Qp;H{qEu&y+%bq=*8BmYny?8q*Jo6kogoZado?Tj^+;A`>qClSp{G0Opv@t zou6!?wpAR;*<3H#L5a+JPaS!Y?!7i=utb#NOf^ z6i>tDjt5O>t}VJ_5%Hwp+QSajP8vS2O?*nlcl)zkb`4f*EO+|73rAP zZQOR)AK%)sV6w^PlRDEBk@aBxn%FPZqo%k1srfNb8IhjO;93=akBF zTvLtdnqh&fY8Q9SUxGfhT1n_4)wQZ@E^0naOwC;q(tV$Ba`#i|j4#2`H$(n;7O4UPXVu)yUP5-IAV`n?q0NN7xBEwT8Qd=~+xpE~rmLG9An zSq3K(+FOhK^;I>Afd9p{0m10xFG9U>uCd(q(dY}|djD|f47dM>uf>*)H@arcSeq9Go- zR;#m~Ue~J3YtZ>i)kTc-&J8|3brIhV#3o+GybQ1RkG=UA!WUsy$v==n6l*YX*;hli zZ8*M952~ecj5UgH^_F2fk%J!JS}*%}Q6jzT=7b)rc)z+wBZ9u%M|-b$beH&L=`J6d zE(&uJW#PFT*$G{P8$)Zk>N0YD6)-q%uJ*f5jOdNlnTWErt@_@y{$vLl{`E7^$-Zk< zQy(vo4oP6Y$oZU1jZ`I5R3pjWbi=$0$UOH;Ay;mN^VfZC{m9n3?e<&b(>u@=HvFm~ z%{gHr#n{8MPfl*x$2U56^lXM&ZphBh=FmBT?*zMh+GnovR&AR6o$?@~YSOpP%cj#S zj}4}x)9z{et$`OT@@N+ol~lIYjDddiHR;zWPnEn5k-w|5T;H{@2eQFR#WYw5O>$gOP<$1(qw_CEM37llP#t>d%SMseU~TXg%qPsg(qvOTb+yp{^TY>fTU3ij0) zBHc{w#rM{LWu68HUpn#eckQcfDUz89)CS$npr}~Lu&2yFeK8Bf`!9=_3@kdEWK4Z( zb_aZfL5TZ^2j!F4tG0y`4-3FtlQqwa4=_vyn2Y}rx2EU*&R5#}@rP)D&2xqF*)TvW zmAaSIcigt^Pp286stE{ptR%AlWWL%N(S>KReA+ri0O#_r9Q%I)JpY?;Jo5ihWBx&U z{#KY=^d^(~?f;Ew8v!tFwP=_lZOU7;o9=z@o}qsaCuINGhtj>}RlIk{_5xpl%w8Z-}s`f0TGW_h*Lzk0|1x^Johu7 zF6jZQ^YLftdB)hI_-Vzf;eu5rd*x}gNqcIfQ1BZIwuCD%J4BgZmg}zo5oNRhek~6DHjVZA zxikhC)bB%o)$o6q_gA5c=yK)$zFtb!YwdA-rjP<)!A!tB2M%BXaP-nuBOx~C8G)Tc8)vvuKLILo=C1#(SxN1oM>L(t-?h`l9^ z>xoT#n-d%e7mTd9()eL%S(wXV2i=f~35wqbyHju0K-WwQ2k!rG4Lx}aHgFo2#R=@wBtF^w zVOuEhO%*cIh#e~#8$l^t54Gf7PvYTM?ZKBboaHh5`X~I|^toWa34cJUVjOmw3~YDO zi7+C#k36RmNX65u#(4TXHr9unM~n~=B?hQmfy4%UDh(ErD$PK$-_&dXDt0 zpSq#K?_BK-9oS+UBIQmP-yyZ|)>iblJCjkYo;22Qx&ZTlm?p(M#ZN{Pg*L|lV& zx?zWN+uTJ_Xn zjKL~39uTDALN5CarIxtVYMnDd4W*6#b}ao)0l}-z*E=>h$h<@*-U-e62m@+n!S%3> zWv<^feF2l@teZ*KUd+J$ru8Lg%U4nSH9&^=(45I{CU9Wov7X@ST6GFel{=Cxo)G&A zaUnaE9QktUFMWYOy&Uy5l<0SlTS<*dk%>v|0+4gd{*5nvYIC_YJ<4nbPa9!WC_hcq zp;==v!Qg^%#|-Vr;+3@q2#BcfGIX|TlaOBu@d?*jq5sD~@(%&&zhjt`1g(A^*1(J^ zx%pxDJocn!WPM4`wT-#*!6TDGrkk>NOOa161UxQCtWR>!*3?}0!~k;QWO|D!=%;JW z+#3D#1lN=1{!4UvU^ECnL zj^{4fm>0NeUoJS4-Vui)*6!{U(9egX;^2-Lvp7r59v5Z7AS)kaGX&-FW z-%3zho}^#DpTQH0eH^Q}OhNR{7r`&>hSZkLYH?5gYWjD+x91#n8Sh#HES+{F$bW2*skCMQa( z;2(xPelvoIoaY-T;mE!tT(S+z(Ya#P1Ctq#!0}kjMdxb-^@*yQC7*ppHI!=*Q^P33 zQyVBsK-wqQ7(%wDMm|B}LjXQZEP=k0SaEQ~5 z9W_wOSRFvj)E89ai0?13AGPWb<=yPQW{A(45dJ;#>_xufQ*Y>uFFV%?x667DasL^~ z$BpicT+ET%g-t!QQGbh_Ll5|xZvIuW{{|P-!8ZG?y9|>gu$|FaXM3l)n5m2j^eWQf zYXtSXY7b0m67P+^5Q5fE!`6Rl_*s<0m+3%-y4L@XJbpk&X!-AqE-p0=q+?k;)-Mfw z?A%UynGO+5_aQ#s4d#T1Mv?_ojU%fqU$WN<(&qKwoBkOw(k`Ha zq_i@}A+F8ac>7J@#Jf%vu2gS{bkBH6oRF)4dL+BAf_58pNj{{8Y_A7;JwHAbmd_Ze zeb*OQT3)y&|LJoz@1O2&_ck^#LRDyS8o!UfP2`!xA;FXnrROmd zoEOWJEFm`Lh5ZFH#}lyRVeOR97HhOQ=){EH%Z|@*Puz3eYcHOmwLE&R0x=-B?*YI2 zU0e{o4$WLqt>t?6_mJ&QDsflF$qLp$jrd~5>azXX53M=^0-dag5H&7@bFkd6M}$o^ z1`YeQ)6`<7gZT_!&ZeKMZK}RQsww{&R*s0MMGr3>wc@eLS4|s>yDTS68xFB1B>koq z7=EQwKqZ-I>{7`J?ytuk-DH-QyLrj*zC-A=GMJ(|9;?7B4r&n%Fdwyj{rhnAs;QTM zJ%6=XU?h8*3^)=Qq<$ZX3w+#Xku;LGk6*P5r|evC?wrEabQbi-xu&UW25JiM=Goun z3@wb;iAfH|xFd?ojRVRI49sz5iwPn)1;9Bb$nc~{o2a%^UTOJ9{6OMOZVG;iWGww! zV?#ts?p$e7<|l3CU-jbNU22=#4w};)r5%#1c3AD>Bg10*NUij~{JlY{H+m5p*DF`@ zF}OZIO|O*QmQwHTL-HGF=$%C?Y^zhz(F?_*Y6u^{5dw1(yudjP^; zqoR1GibS_vR+f+^x}_`!@p=j7Qp7ptLc5i7oVdmX_rgkXmNhRB4T*@zx9V5rW@_!y z=i2CcCGtsSm=wF@a@Zy_YV<=rRtM*T;6UiSkdwH#6)M9}7*V6SvRM5*=9wyP4{e zamq|xnYab*1tZQ(8AWpsE}m>nG(&QjuT_MUSb(e+HmmLg{}U&4Ao}tUOm(gg8(uAU z!~1+oxNz;-5XymHl0^dzHD(|8+%V-MgDg*>po(9<+~_cD;5TEs4)DF`7K#LNIGRYo z!mpfF>79u5PkbObabjIz6%Uc9_xuZCcy}A4P%zhDIg2#0F7vr3G#r7pP;hAl^B=Jn zdTF-Hq-=oIFa1JK-|kh4{5MrnoBw$_oV-Vk>3ib(ZM0Ypf1@+qZUX3E|a)jV73GQO9s>FnUmYhWy`@9M`Ydqu4`77xN2(1E= zj*@({eOdI?F0fvbz{oRT`5%X`~3OJO?vtK}dpIfFuY!$7uUWHQ^f zo1hxifB_0#Ar!QK}xCp`PDd0Eo3*>OU&C)+g8n6>5;w+4nnawo+MK-EzZPcYg)6 zzNM4oCNue1WXVZc$_Y$I21p}}6OQc%3XaE(!p+qK0GHJAqz!gAc&vfO4xs`B5w6hf z1F&PWwH{_|BEOs^>Uk`|!|$hAVT!V5bHmBb1w^~ajqy%_XQv0UJC>zb{zv8`ADSl1 zC<7q&2wWBQ|HIpX000S`7tN#o6RVrcGR+~91cN$nH}|G7ozCZn>JaVhA2p-}@gZ(eATr+#L5k_N@}E&(sNLBHatQ2 z229S}gufsN*^W1n_DmO=2h4s;LNDf}_)4?B7yFSfhO&oK62uiRqQZ~W)+av`heFo4 z;#ZVB(HG9F&S1ZLtt^M}SVRLHe28xzoy~tk_@6ukNt@`G^uAg8DqXb6?IICQho1y7 zwl#y6dQc>B#&0{p>WMU^i z($$^SzPii-*TX^yr(A=R^*=aUo8l*bCB6{h1KiZ@871chvOfFcv?A+-p0H8IUTrIU zEBBYAwvu$Yb#=ZrhHrP8)1$0+Y!5h^GadFzc7|=w6DP+Qxh-8WwLLd%spGZGfiAbv04XI~r2w}8}iB==exF=FgBlCv|D>)Ly*r_G}-fFj97DrFa; z-yj;;nORLI6n#=7erCGE)PB&~k0TIwgzF%VLoMEI2H2vwIX!G^ld=1Vl3JPYCjXoo zeN>+flLIq8-a7Zle4lp)cv{$WgLOsYX(a=_Yr_Hkk?lvDUl@J{PZg705)TOwV|;)q z(yzpM5rJ#J@<|!VYh>#&69JCo)+x>oaEE$N1)m3)T~VCXWB7)N<-A7fO=QSTM+4Y# z9I-~JJY0809G8lX^-$l^Vcml zlh_LW*eZ74b*jA_T;m-f);(=yWDm@O#}((Jo^!nS;=|C$mK(E$mT8p*k$?PznaU|o zivNjJOpSM~+>o^}Ae|CRHvG{c5XN69ezIkcm%96rc`t8HgqLwGX-ATNX_UUT6PlqQ z!7v#W3t(fX8(vKvAKXf1{bXSoQSTZJQ$G;X`1AF;zN#j2t6*R`Vw(TOHP2Ze2uSkk zeL+AGp$s$;Vy~-bRjN(gLaZ~=*-aO?4H6J5R<^J)Zw}WZ6W1z;&3JhP2pA&@uNv=j zJNF;eln>wSd|?UJL<(LFeEs~DoR;Qm0z%Ph>-qYM`s%i(mBu>{0~4=VlcmMF&-HC@ z^q$nxnLoxbEAi_VKvOXD3In+s9^NEK67x znW#ZkcfS8wEaS*oyNlp1J$dJqAJcS0-g|s8MO5MENWIKjz2b@)r|htIAx7l~@QvLC zvb-znA+7E|>~Akt=7MlQo;?Q05uE2Yr*2%8;w? zk_+B%>hW;x$L~UBV_@~8VRCtAQcpWo#dlkOHtlFOmy;WcbZucI|GKJ<(bWl1i#cXJ ziS_54=E!?bjrYafC+!+f%jbgpr)UUsyYIpeGaA%LXI>(~&{xl1C(b#cWTsY^&h49( z-A7Pz(`1l&c@)^YP=vO%*kgV%bU_0yH)()8^1Y<(3J1630>m`Uzk6w{z#qBwdGhtT zU5Caq2*v_Tw(ml-9+!HLbEKE}PL(?d(}uejhdHemg;(`5NLW2Z*d>cSw4IXrv54bhJZ|Y2Z&f@({#Tx~nugk>q(+Od>4F zS7FPFV#*Zw8wlJhHgKy3z zGxo9q=lp$g?~`Cj;xY3;ihsWv?OXGhcxybK6k2;1qv>@F;5o(wW2sr#uweE&;QEsQ zY-s~nn6}&Eo>106FJg4zJZw2Uktx&n4qP8u$_xqXnF(1b+up;$8-ny9wNu@sI1dgC zAkdoj_xGnnk#;1&o3|3IN?9wtSK8{|AXv|6zb9Z zP3<^9x1NKX3K_6S116(7+RmmGgwZTd$bdE=7+hbARmX}qYf&qqo>B=f1J)0d1k_2} zBJ)^sb-<+)kLT{qtA@#W`^N-Z!M!O9p;Cibh4Jwv>bl}9f%M8lC*IAV$ zuRRQ+$(}hk06UX4q7y?7cWkJjOETV>F^L|6Kgq&=IsI{9R!@n7zuU5^YO2$y+I9rW zRHzk97{~e$IwfRKKT}J1!NT@aDWy#4H5jaDV`OGVd*BK*fa)8WK?qiH?}sf-)cz}s>PBAm6eIW^ zQ1Lh>3@vlOh0Lb%`t=A&3$)`*x^DSCyzuJl~oSnh)DeXOrJLF z`PYNzCI6d$A9A`BSqgu01CC4N(#)!CpywI#dPKHq6&*})Cq>yp!lEMZ(3m~u z;>fV5St>{%L%^#;8iF9jB$E7IM_vE-hxWG*N;5|zUQQu!VH_O~cdQbg&W?f&Q7)76 z>mwVx{HA+GXfn<2C!pZkFFYA89Zs#;MeX9=-3XZSG!3SUInKwpLnp}@+BW>AG8y?J z!o(Ay&g8nY$i8O$VQwkjaH>T3=WA6#m)HY1uDfQJD#J<lEke#LEV>1~k#T&>$$~ZW9`^J$KNOxl<6uGMXC|yFV4Rt?jl7 zEhcTV)ne{oQ-`Nz+^|w1o&ndo0*zMMkDbu=IW$D&GfAT*^YQ-dAFQ{IF1+4PDfsoZ z{oKC%F#o32$@WnmLz*<;-RdjuY(73eO*sFIa+yfXGdxC%hI}qaM|dHqR7Y7=X-rV1-bU@L7DPmFX8! zThUKZdi(Y_0&Q@tT$8#r(fGd+7g4>5@LhBY(Sd6rP~8@KKgODpm4TEl^w~@vKY{6r z?bmp|;~xAfWya{PCmpe5PwBjThW|17<`U`GY{ALFECDc9(Uy_zSMO`Qsb~_izqRs&LA#+9LnUU zSkxEXM7bw!+x;;qFMhAYn}I#)hx@Jy&M`w!Wmm6Q*gDELpO(TkQ6M9SgZb(`xlS>V zS_D-r^EFJUDVj71jI)2)MV<&q$?$lFhJMFcCKjXuWe)b+Pc7Uu<3XBNP!X?r+Joul z-4W?DS4$cio7a%dUk9SVbhPS@hi1k@BMS7W6<3=Y}X_-o(17DzGVLPX`n)hJ7 z_O-<)2ZrrITSc9!%UtcgtgUCjS=o;l!Bk_8wP$&reL+vd?J_rPlIG~*JgZ(LFLb!T z$Qbg!<6w_YmZD{*TT(xcoUET)?7&aT%V@D?<%Idp2R6;{AW$k(oMR$<)*f5iOE@B; z(FbZMJH_zgvySX)4YR)+h55<%?+O{pz~a;;y5alSBVAGNRhwmk#C2b@$S6gvf2da4 zk}}vlt+jG2F@cXal-|_p?%_u+aeOd(%3?(2TfKdjn&(i}B@G%+HtD*{m~7#_dU}G5 zcVtC%Fs1K979JdON%iLtS7g=R;(j)2t|G%e)mLG0-8%zLMMsoS!C9cqFkKTbA2f;U za%7~;ucv_cgD&LNGvZg9FQ7iN{ReO=63)%C6P$B;;o3{a{^PeIKgC~EQcRV#HZ}Ja zbe_B&^Dg0IND%nB6}bJ&DM%hMK9gkjEn`0oEzzPU!@l|kG-qtIXnvp1L*rOIzv*XR z^zBL($uYP{+S7p|x|Yb#TMzibNu^LgM zJ-yf|L&XUl zOb(QsvF+#P&txo5wIA5ficbhKe#JCh1rpzRMdD~Eky){`kyp8gTl{v{8;(p(0q(hD zHN@~L6B1JixkSUvP~8&}NmZRU{w0G@=E!{}xy-sF2O`VfcVS6RefCjmXLC10I>xS+ z0MAl!V>^yKd|!mMNa`v`Y4Q_MJg#8L;!Yfz5p%8@v|#C|MhYBjLLnm?M%=q=jgZ8s zwJbBC6br?2)(Y=K{^Lk!B04CI8gJ6&4)W3{{gvvsBs*X1Ci!4q_x{N{^3E*ZTI3T+ z5xMFH-hNEXsYtb2o@G@cN<~iK2T)nLQI?*l{-^p;J=$I&Id&SVEXEd1OZH${JrR-C z#Iysr&UL48ew@QLD&I>NP90ukJ{_gnUtefV+9!LFl1wBHj@IEx7ZyU{`8LHbG|3dMRw*}M{ch&Z@Ej@=P&Y)#A^7d=(zWP0X}$n=pWRe&uRi1-Nc3xxc57Gg z8!{((9MH|D#0&)zMSiC>0XB&YwJUFOeCz$gvb!(y_USV{4sCuAo9S5@HtMrR-+~*L zN0!7Nv$t)vEN5P1OE?$w;_3bA^+&Sq-@F5<&1L1PIxd0Q204Z~*DgVaUs5&NFXg=K zd@jH9AK|!%HxsB`;yzwXh<9Ip`=g^7zB%OM-tZ>2)D-ePo0>5vrNG?9)Be(06zSJbaz*ao z5TX=B!!B6{BZkd~m?RzfYZH>s=k(8vFx`=v4mO#2 za6Ishe!+L?qUDdnM)SOPk5Rvq`5@K!n-;O{iFPHEvtZrkH5ovsEHZsb?G9YZnSL0$ zu?1sxOND=NS}~9Ibk2WG4cN&<>?rNjNpb%D{3WN+{+dO(pqt#?4}r2lJBa9QG3H?3 ze)9!k5G^0N>gObVMpUnNdqu*XL3W=DFdFvNO*-%V27hW4+%zew))F`s+XSIaKvfs;y4Gvbd9&Msh%f<9^w)o7S&z(X?d9QfeeCURJ7lJBxY9QHzg1 z1+EP6u};;<{yfp7)rFgJ=lV_8omNDI5MI+9;A54lacE?=`N{V%>O3fWIh}9rh%*Np zE-Z|5@M2aC%ThJ1Emx0h(a7(wQ`?~YKNysN7if$&1bNd^(fi1vgSX3ubc9T=T*p|gV{L3&)rGX#F8A$yw(@` zZl-txOVC(SG!hGE>PeX09)rDXGYyr8LOHF+aCo>~R%ISMV#kP>W%QFTdBdxuwa2HY z&*FK)HRS|Fo)W<3-xlAzXJi|(0G!XcN52*g9DBx!gk|7 zhbKbGvW{aQ?qwaN=(=V5C>JMAo$g?My{v3eibm4f+v%Ux88edcxGp`I2#4rI>jt#U z*hK3>w9oMVuEUzWeLtS8IjPao`t@Qoqo-jbZ*b#HB={S+dcWz{8z5u|9lWVoi3hdq zlQcXMmY~JHO@oj=L8o5v%sl%c!$Je-((~LJ!xd0lkH_^voCfZ_PhvXU=l+=LrM%wr z@lxNWA;^b=?5^4xZbFcI_h1Fs_@dc!6upxcS&15hUPg@~c{0Ib9ij5U*VvHI>*rg< z0woKZR5FiFkw)H^nkRU2)cDeGIGVl-RDhvUom=n)6Tb_YU+Lez}#embj)|mx>*X{D2a67t-`dv1W<+7!$Wnf zh13UAzzF%*UT{Hw9Ckf6=)@EBHawF_8&QYWERQ<}#z#Zz)k=!Ud%v+&P5X0Z=t^7Y zGD7sj-TJ0K;M>10?_wkqX=!Fj2Y=*=QQyEJ`4B+bBF&8#zahiHpGW=yW&0BkbEMB@ z9uR1I3W)MGyWdRp_9dEhN$1H;Xo(BkN4yr>lyP51w6j4XZ|XnR?|H1eSDHAosKM@nsHo8kXzrn4s=fKy^Ngly&Ol}W7-yv4i(Tl3zbJF z=@a~$63yA4L^XL5iQ`~{731vdTv9bfab=k`YwZmPrx{MCYD?f_n!~Qp^;4<1 z8{?Pa%7etE5eANWf_vVq9bQuDvCH|q$2C$Bz2Tf}UNXB7FfRafJeTAAkmHN=C#W;8 z@aZ4bEi80*4azs@y<|c4HAk$PzA+5Z=Yd_^JFi6HQN@m5vFb-tm1kWazjG>LqhKp- zl14s|d)qp=z}E}5s(qb!`pWV|qd@*W6$Rm?fdj`VyBQ9}Yo%YQ=G-XA?{4sa#Kbly zm@i+GW+$8GAB9kKs4JjW8)`I{J_5`%!LM?*t&Zm0pCZwA&2&`xWfF8ya@B_J4Nh#Q z-s?-DO;M1N3&mlTq;7k+>=Np=0vmp@_raHgw&9!6#lZ$tu6OSTJevU!d?0%iwq z3|==qzu?zrTz68NwMGSuB$~!tUGLXP?;du&#$LqZh~y6<(v|W=Z1ybvG-}L{CRV}V zZ2G<~kr%MQG@NJBzl(WbS6|ZcLTtBq>($t{T)9b!$qvZ$KRY>E+n7VmEW@?rh z>&dT84ES4xKgX;YCgmQ$VcH&cI+?3_i8V|p-D*Q@96UlU+(=<7l^Ij1CS4BQ8NCiZ z65(iW7Y6d&oaJ{>e=-x*u-;RpU*02aF{oFmNn|}=RJq+aVm_mkbvy}G^10(K-JY6?U<}mok?&DvatRHCZfw|yfwwnrrjIgz!)?)6x0%}$1oh!{t*PU zFqjrYrsel|FexeU_AHX`Y4{)8e(K^tyMbgEZ(xSmw(Bc%BiS0bTyo<)3tYwD*=u15 zC>PJd+^ZB`i(eFC!`AXd2+Vv=Q?LI$55d06P4~NXO}ZXaQkt{xvy{`N{_annv zr3v%J93@77ED@wO6ywY%eTT%hyxW09fg0`kC^nm?`^XZwBhoRZ3%tYB6^F0fvi_UhpP$b zC8dOQPQ?l{;V<_H!`a~y0Y873tC_eWRP!>`S$&{JqP1Y z0R%fp=+!Rs0>_Y-JGp4~>USx})%JBxpc#GofY~U$2z_T$`IhZExEHGqxdnd#hArj$O(m!I=*G#%4M4p(S88#k`(rcX^^{m7(6jrs#$kpVk4XVteV zlc{F!_Fgf--P(ztGD1mhW7cPN-bX4Ov>rWS8OFMbKt$e72uLD5gOiDob>ebiqYM!wi0i^4w;tH4LzoGxv~7)4!zn;lEV z^5#*U)8nH(66uX(t<|Ba1`yC#H$De+y=uQH*Tl(wPs*q0BKXpY21fIPRwb4sI>zR% zOUX_C4;u-{?)zhrHEr$p{)PJofVXVXdwu;fx{&WPUu)z<$=l&^q|bfNDEFAlPzyQa z@JUw9(Xne9M^eAg|6vDF9MH`_>kYsnd?6RuXU_qDr>xsdwELF7)du5&OD?YT#PBnK z8TI11juYYdp)zZ4G?F6f1AS9M%?+@t`5~#+w%cN_DPTZ&LH6;0*D3YCNc*aQINEK? z1b250PH=}{!8KTLhv4q+?rsV0?(WdI26uO-@y40{&z(DSXU?6cc>}7dtLXZ+t-aR% z!0(DX0vu_zs<4U6ZP*}67Lmb+XH?&BHG=R{%~@(#IADj>@an+;Citb={0DN`hHPs8 z&oBQK$o%(XR^T-PF8#I0euMur^hq0*>dBMOhahr<5N}M-7!zqVvCL=ihOr@Dp@zua ztNWx#u+e4SDG^{`*3N?m;zxd9wxLE4Za`O5$ApOM(?j@OXvGFRxK$&8^PfibpBVxa zdpcsgyUMfR)Wgfjn?`5#)g9f~&(AE4DAC%82 ze_~_}`yitR)t?y0N>RyUM$ar<;#xR@JKc(Xa^$2K79mm~e+<_t_z@;jL9almjiA?T z5qOYRCfrywzOB$7vzCMqyJe@`b84Ec#i%5ALM8Gn>5#%*K@4Lo-JpeoI%nW@a$1ToFE~tRh(t$cd>*5G zd&#v9cR}d-k%JjQw>aDO*LhN_9-EFfj{T0S#&d0(rj+q&7SdN7W}K4Epc}z{>Q}~+LkcOHgf{;k^HT5y8PQ5yQQDcX4V zebDHH+q(=wWZf%1oJ4-BCA=|9ic}`&b^_zojjnQdbajA3uMqw23)U{5VzU}hMxs|a z_k19x!;Hqi9{vW$a?k&!J?SRfx*nXE*g+8ckz4WP>>rD{_8#O~|I!uHikUowR}nCq zcC+@2I_V+fir@&nc^~;f$gfq1d9s6Q`8TGhr0`BRqRbV(7H3Ilg(2FgLvWOW&Dqyh8Knw5qoBODv&FiTkfN3Pe?;1B$uWPBx2tr{uX;hDI53ct$xN}l9@-&Kqr4f{p82Pqnf5TD{K|*`qg>s)pDv6O0G6b{Z|6&?Ryl^@22Dmj z?T70i4xwp5h@I6rfi26wlUH7$=p#%y?JU(ThdQ5;Ifo?U75F!tgq*75w%C!-UrC6W zKbtrbls@+ly+e48J8Zwx6DSbNpWyPkky;EvtEiT}b)Y2EC`xY9f^+<=Vj?jLQ=tVX zB7E-?j#I9v@=N(-rhKP8X=T`H0lu$sP-Dt3;P2ZmR|(5|xPEF%qJ=o zx(-20L^QBPnM5IojpBy=z=7|eZFb;`h*dlg%|e4b<~JF_SGi(bD=d746%HX~(Kl1n z4fYI}ZwQ>KcX(s$-!o%!%@_z^FCExkO%;pVs`FvpO98`w2wjlREu1@rjo>=Piv>^! zcY~j!l5yY5yclX3{^@slOy%3IF`ag}y z-IR~clM&d!;AGwiJ8b_UkJ_2OT3r*k?!};4#5}v^O0yBP8kAs~s;LOZCBxJNR9^17BIad0;lpOfJE#VH&_Sei<8_hM!=dkf0*ue@W*~ zxHA(wqzhZh(2P#HwHeOM#=uyhv5rS6!DiVvxAq)#7=r$D=k`Os_L9UKTDaLswjcIX zszw#11e$USOLnDpPw-uDbeDOj4ivgh+#7RIH$0e?$TnX(yfvWxyHPj2duZEZI*qN&#}S zPnkd|S&?Q7oNDV@@op)!;#W_!Jbc~;KB1x2cd7BerTQEMTr`S7eke`Y{kcU(-@0w0 z%CgoF{(__1&2bw~-$KsnTI}@fbr)Vb@m5rf;K=z{XjL)^#5ZszG&rxWZ?^==GbW!L zgqy?q-{9%t1W-if&J@9k-?f~isQ!$_akesA+CvHDkY$zu)Nz)|^NpHMA)_Hrjzj$C zbRKzkCgigEKNMV_6ak*fA|N82?0irCT?7#w)lw#i;rU}MfQHoZZ&zY?960>sX^IaC z#ZHJBuWJVu);Dab8?uPjY2-9N7;Ww3AMhq(G<=yNVl`7axgKB38KLxlgn+eL1#zs; zHZoXgr`u!I9&a;7e+}WTb*M9odkNRJo9U!tsa=2FLJPFBRjr!o0A&6>Z1} zpxEjLDVF|)10_2zt+BQoOM5#%{MeWWlze%CoifYR2fvJd;I3ITQx4uFOc$fQ17~%| z8wIW4_&-J9H1-jcc`SLn)j8lRJCX z_6_#V&a^G%Mm{w4THF~uQ|L`<;3Gg_2e~tud%6LGd>-Y`K~&x;=7?4^qU9z9#5I28 z_6dhnF4Ii(z^`aZ>X3G^26`wx(RrIqY_L6$Wc%Ujeu=XG!yu^ z#$5awGUxQD68btthxe*9az~zEfhZ+Z1um(hP_HNe%6jmo3`VmF65Q1gV9yUgk)W5L z4P5BeJwX{s_>YhLhqE#I`6=-=yDVz^!kOsQ-(M8`Gc34}-(A94i--m2^(sP{%{bIU zLX=Nw5CR11$KB#%H;CgEd?XAhp_udbo>1W21Gd=j!E0q6Zw8Vm-p+rE-32pxv4DVU zi>cJ`_BuwNhz!6so+i6!(>|$H8G1i#b`cY7U|pM&KXp2Us|I=7nIrfe68({&3F2v5 zSUx6`8z2!lJa=sdx1Eezoe_+A!owJ1%djM-Nb8A6c+3B%anAwLPaeEDg;Dl?<#|oA zWP!xkaAG_jC@>0<9?^iM4Xg z`n~3V8*NW*5nA8!Pj`Mc<~{I8g7(t@TYZ$C-T=|*7!VSZiRa$WYR2KKsBA^z0QY_--RaL)c$&roG$ve4xervV>*KS6jvzL=j&Ih)LE zXqTKp?9Q^ctbt~v7SK*=<|J6iG=O7%q7iFH_%|=R0N;V`OI7V^osR2MJe)JhNI_Z| ztN`xX1JS7(wy5l|8&Td*;;n_5a=O~lYhCDf2c*!58I78fK)}Cq;0A@Z`y*Oer`hl< zzWlc=xU!eC9dH-LVF|op+%^)ps?G@lbS{b9?y_@a+5_QSZq4qzm^V1S zl8uAUZ^#V2XjdRmOz;l2;r;%PQtY4hfvs#j+pMlttRs!~e*lownV-iHKqOoOUM*5R zLED6qp+Vq^^QU}f{f|27ZbwC~n^n6;?FTCe?6k0Whz zGY`1k0sE@X8*)7siZ}?O`JBE(L@w>UVbBGf-^7qP&Lr4XVG~#vEkv%`Gt=4@^uR#M zn^Y+Z(pOpPxQ8bAjg|IXHU%0~Tz#Rft~^GGJhO|UoI_eU;7e`9eFHdH*Gr^w;l;&? zIGqolk=3W%R_O}TuNvq$7Y`MSnSsaT$1pT3(D0^JD6KefoSH;5f`b=Y>lfV^g18E< zW=$J$LYqAn$LA<=UFofv)eZo4qH(HScEm?We~#rRp7~X~i(_hhMt-8DuH^1LwuF`K zAMv&3@u;JN4oAXwUFoYEwTOFQYDTB8H1;Q4pPj_$inr?FV=Frg1XRYEt#}hlSTJ4| ztN+u1Ym|%QlVpkI$l%8vr{-S+SO5UwUSbRgoj_7NrQr^Y=PGSQO&&Cq2S1>HxwbdD zLrYr39lnVeFd!iPY*EDDfL^{4a8~9c40*tOH?*U*fuC+AIERGeZgbqy4D%G&1XyOU zCWAyMcy`V$79}Lt;QP%gsgPlNFSRHz-TD5&-_y4yuBuPb3cGTkU0?xvc}XC2X6d&? zeh8f=V(9D;)}*Qt$5suJN5TR7=S;NpnEhQxwU1+;`#c!-%z1-cF58%`HbMpxhH%rT zT01Wmp%)!=3kvB)3PT>rsZ_bz&#$v`MbjW%nDhNXsW1cfiex1RY@(- z!4rdc{hizbFv>)FkGauYd+Ryej^fuChbafdG2fKZN9e4qdpp7(5lPgA^LX^>mRT{}ppL8$PjB2M^@ zZGIgJPByqKQ>+TyhgnOofu*IViKAu&@qkgOq}!khcxu=-6kSn=r6~nz<;+M^ zu(P$uJ+}*gpJ`p)DfqHvsP6_%Yb#PZikbNZub{`^HT-ifLpm?C2y;)bNGAqX32^Pp ztDf%+lRhpvZc9ghczvsvb}96U)D4@Z;53|UOOk<3Ol(xLgX}y=JRSZShr#IcmaOVF zB-cNWw$pskFmg5i*+kPSEB2+ljQXZjizp(&WPlH~gUIPitD7%_Y62cmdIRMFTahbO ztbiQT*|uO6VV@m5@6swURrDA;sq{d1RBEEcYbc=pj$`sK-Lrn~BNKOU*@JCv`o1&< zUQEcxY}@T>tvBJw<87!%*}}-DQ`6-bW9OZ=cU#GJ$nu}|G*(2l0!ga`ufFsyrys;7 zH=4xX31XPnJ#kt}FJwa(1=)za#@KMGE}MPOiMeMSD91|>E!h*Khx?t+84v-M!746r zm!F8)H3W4Pt3I50%VkXyO~_icjOI%(;K;KN=0ZZhOe#k+Kvk%2NXU_*DGl75h?sr% zNIce{Km_1UUla4j=I+U-D&WFAj?P8I7P(4f41QVln{g13aLtel9fx(k@H5-$d+}+sr6Yz?#!y_#~mk%|QJl z&7O@|eRlkG#{6zmienj5!ljb*@4o#l|-V@GQhmjt$hoc2Zv#g_E-nI~8qr?!h#LR{a5{GemtbY#X*PxH2-6!D6;tW z_~tuY3qD#azrth%bH^lakqj$c@PK*hp(86ILc)yrv=%=D3r!18OPR68O98J-Ss9r} z9znr}h4%JV0VbT>Q^c46e%L^a9th&$12i5(4pf7KC#oqaXgTrI z6lP1+P!82>RBaoM*Dqv>%}P@)E5B7BlkajxstW0pw4Q>wxJPLkzbz>RzKsr1mRpQW zjR)oD=NoEs*>$Tmj#Iomob~*S*V%Xc{A~1FYAF!I%ZLhJU+HTO6%^tb{&bI)Iirf2 zs<5Vqhqr~abTLaihUfid5-Dj;JgVd8f<5EJ;{Bj5zK9Mw@C9IvFQkvRcPF>fofjrX z(rIF1Qsgfqfg+K%aVk3gg}I(s4#=v-(v&HTKqaRH1M9f8k|I^-lf>+`Chei>Zl7oG zjCiyjt$N{5gz`(*fO-<1@`EULS%xNnp0KTth=_h6w!FFBR9Rfy z!@;PaMGvB?w4|>edL2*39h)}6DU!_oH403WWC7gY-^*Rt4#$EwFTOv$cM|#aOHD>* z?6k45u_=q!^_7a-O+SUwD#zaEVk&o_N+_l`Z(P6ksSB4pQ9GX} zXUOIlLDO?>>;n`1^R*Vcn%aDN&xdo>EhZ}H@(Mb@^QT($&mBUoH^h)N2DK?&g})kHEz4;r3c_0Qx`lBjN6=5iXQSE5 zWjZk|Y!RPum~@WODZPrmXsFCkIXE~Jk*f|24X7c;U^ioF&BfH4OToLaD$25GSyPOJ z;M~CfvPp=;^_Tp%T=0LR>;{4VU0drvwIctE+GkJb59Y>0KBJBhe)F7o9T*6{e{pmg zZ?WBgfQE)t$Fq%QH>%--U0#2v=)&qOsr zVS`E)g3O#WH)nD2LI1?W*&E-t=lkR3y1mup{rw9Ehq{~Jh5+a6qZcBf&8W6)!N%=kR@Ya_eGJgMFw$2+Z3fzIw zsoDSa*;KKKPrDG1d*1PaOv_qoFQ*tZZVa2O5Wh~DgKbPm-I|w2R$O0?ftz7s3>*;RhoOOiW48#ZpaqWuvu_hlhuph<9J8OsVxJ(4MGku?P|JnC0_l z6?gDfs$k!?3g$oeLsdj|qQ}IPH52sCMr3JBCTO|tm`cg%!tLXwv+7<5wsvYLWvdEfP3pbki0PqrzDJv^8`TF&u zzQgt6nGpt-l-K(B^yVgVUEtfd>EriY*aw>NQq)&Q7tz`)V|XC~MM0ZjO+%#)Nqev_ zxeZ0aZuE+6Q220htOLoh(?=761oGz#Wj|Ohi z?+xvUJfYI9dWBno^}E6dPxHFHgLNU^yE<-?@QdVRWSeSZoU<+H2OrM1^>(Ki)W1SFl^B@4uJvbS}1NzT17A z-=8gJH*j-1AFwA$1Hl1PFAM=ul9VU@ zJFnlzJA4Q%Dhe|_z0J|Rr}skhIF!+Tt6uIvc3-gYP-qawyco;AdEanSknF_-F`>L(Qm}C2R=W7i zG(0@onEOyH=}C-!@nZ~-hxi(Ypd>X$orZgd!tw@Rs9=-kC?=<-s!cOd6_IqvbkjD7 zI8m`yvQU1h&Sm~Yr4ncj{zP`wyUmJ z!(9lc=-coFD|@OpEH*vkNc@X%?_#*i>Ae0!GSSd#I)0V-oF;1ew&rRSoG$LBjvZ9SCrqJWdC@|0M6e{AM{p zWuL0-F3*53xG2QDja~VjuWf&`_}tFsN`RC~W;xBi8|{0MktnE@H8oLby@f+~6H^II zk*Q}E9Jws0CE3q)gTC@GfXQ47d{*i4_p;MU;UC z1`MP=EJqP)6Qa{REkXHO|KFyJ{;gZzd1g?M=CozYcRa|U{`nq=O3ddPoVBu2oAk@X z<#c|9-TlhIJZG_c>M}F)Y_Uq)%SBF3u1nORUWEpzSg|p`WuLI*LavJ(nbdZ1!>H3b zO|x~r(jY)q4Nsd>;ZW~gBtZ|?rDtbtWMpKmtE*ctRkrH{n_#TvPb>?cX7y`180E_n zgoErsL-6+RWepzh$6Dqq8Bfon;Mv*4uY}yTzf+SM&XV&*!*;>`#aPQ7T=WE*%g%1Wu;y8Lh(V>+4xz5fPY1wbD3muk!L6J)<3uY#FFfu@%WJAcqE9 zp^{U)EO^VEJ1T6zmMMPq?(_0#@29IYaP}K#(;I7>7bupQVIuuYqpOb6PTt@A3sv&V z){b|0(%79(thLMTiur5NkkTS}KXqi*_Sr@4BTGG%5fBl*Qd5&jlr=RSWPE)$;l;(n zyx?r)`=&$jI%dTWRFoiU~!Tp3}osXO4xS!h(>9@1KV2Dq|7&0!#FdPoO|VCCTixy;#MEMMQB% zkM>OX!KsI%Id6;eB@{N3VHPQ&-5)ApW&NMrH6|v0RZ)K_ufD!hS=A+lhKXsj07j(0 z0O~Aufk}d979q|UijO?!kCdC&s@riqr$KM;U18zAVSf9iimvK`1=fIPSIjQ-)lVtW zC4VxsdNCPTs&pNiQ7PAdxrXxOPo3-Zb7IrVmqyDfcpZ)wwCd}yT zl4eD+Y)R?j?XB1mv(WAJ^ixYbUgzV(O&@~t;D80`Liqf0c{HD$2cAT#atm%zvHe-} zpcvJJ&>y)0!4Dii!D8~LOQrub=QjguD^{HzDNPrbCRDeR*`|+pGEqrvA|Cs`MMiB2 z6%{pSKsYe_H(m>&@qA*KFnp^(WIF}LNb6^KB$l=P2Jl$K#&)W}bJeo43$^>RB|l{e z36S>;3NCoT9u=mquA=1Yx_VW%1ec5b$Pj`j4i^?ufPf#$5BXOOwDR+*G9qbV`qRmY zZfm;THC8OAgpg81Hpe880XZ*CP z&8$LAO?7d(TBYsdmYqZeUqBeO;o!L zenN@6ld)*=Jt0`NmEq0%z&L9OtVTdyxpi~B_KHv#I{n%h9ie3DD=h1sfwgP%6Llnv z)~YihQTdoDJs$$6hPaU`_IdXOmxk9!E43l!&i5g(s7%(T76-Ci7AykU5;9d~tuSx2 zxY86c0xmZoBr-%+g*J$I>e+vAx!IT&Q!zibuItzap-a(XcrE5xtBsq_8B`}0v?4dR z%a|gkLg`RRf`w|Tj#ySK>Z4p}mG_m~bl=9{NI--&9RPsdOP5=2X(H)9-8bHf7DtJfp+E4>vPYHeC zn}@WlQS@JJ`1xE}=8qafWZ$;q@5NPawn4;!S{tVV^)P1x>6})z#0bo#ITG5c;*ws3 zL=B;Mt`t=kMOy3S92!{lZke*E!*zMr|03?$*b`10bhJw=ZNW5LIucq}zy!(DucjV> z>0jm-_CBSKuY2FaxgO*BP;qUp(wCT7m4bd()DvrZ!`uR^9s!&NCUtqWkhn7p*yJ{#qzqDD@2QwFLd5jl||t8jYx z3dnqX^xR|n*jRy8r&;iD)qkoHp}Qb4LLx@ntJf5jsfMkxXa3H9)GV1hCtRx& z;W~zHH5~0ZP2RNh5iHAPmzEW&PJ#=6&}7Wa1sDCMj5^|Dj9sJ-qd!BOf`;*z7L+} zF*c!Zq6-NYPU06+=aq>2abB4BuvGX>PZ}9MKr0Z8ragp5%x=E?OJ>0!*YN*4m>G|U0baq6Y~*K!1|wO|L=I}*%E~kq7nix|BcUaTStLsIU@$&6V?Qnvv>DWh zwqM>`?gf%0ZOX>b2-?x;+L=Q?1#;#rE|cEswT#Q}F!SX`9gQe8T{sAA$G9r*2>p;e zUQvWnw&D_Mk;~9R?vZI+NkQK*T3F;&P4O~Zo7&r--nPSxMKb?Gx`v)@?#Fc=a{dv%srzIqL1bW>}YcnMojniq#oAi|eZU4V$l z;b+BHe`s{E3{}ph^4@JtHt}{ouSE@acWu^6J5pW_8&MysiQg`cXC8xKCc^tg?Qp*I zmy8mtAQaW-IDTF4nd|8qJB0bA6qw0M`ByG`1G?8!^(2wQLHoMMha6hPmzszOhpRp( zbwCq$Cj_4xj;OT`!oa}5-g{5CB|ay&a{NnTE43imdw4>ffsY}DM69Y1g_*GS8TC`# zFAK9oFy4g(d<99gzD=;8|!tfEF8tX6!`Y+<6uHE zG2?}Y8??OT^N}vBq#WVeFbB2*mX1v=7rK~F+ilN?yPU_je{>$Jg}cY$R-2bN1N176 z;a#Y4;M^0vj=@`Z^9_t*F}JH?tTQ&_*#6jneA_Me*?JjP1Ne=-hzN^9XshnP@EQ*< z2mfsC5p~6EgL{oW8lp;OE2v7@*0|~u{|dW(_~7+raL#@J=zd9kO{f>N#HOW$y+Kw? zQmwFo*uP7kTP+BKQ;mm^Q-u$=^1}Bu)qSepe&{ia#p_1xcZxR}%%EzY@_|ooVM0qt zVmDMM+|Li%5%EOCNagJzv*P~d^;9*GLPz`4Y}giR=!Z@VRH$pEKP>P0RYGS|wQdHr z#ws0w%`STq;?CbjBGR_fwtx|v83pW~HzgfqZPK%jBNPYb!yUuGgTU2nz0Aa|`Rwiv zM{_Ah)mQRr54(f-Vpqc3)~`|>ld6q~LQ#(}Gtj3@?IK!*4+6MqeqNuG)0RY}rLp%f z=|gOKh=MC!UJNc)eH4|~er)HH!uAc)aL2{xx%lXZS-SspE^=L>VFlP4I_?@i+H|~i z3nTgQ->(|FU;EjK49AXwm#HLP@*k9>SRiaqhavAfws&OFgjl|WyGt$Pv^LNoToJ4N6-RSs6|!sQ)U z=ucW=ME5b&A4kk+!FsIj_#oAPihb*kt#&%&AarN(p$1MEo7aF9;rgs6_5Dz?aFll;H+rf2 z2UTNp>R#3}7I-pP%&U@DIBC!#K#3N`k8wow(s#u6Y61|U2Ns~gbTXamV#{&NCnvP) zumbUe;BnLK-LyOGYNu<4lzH{yXt)T3T9qKYZqmPj+x)DzZB%<^8^ zRos6Kwb;)c(Qss`_Z*Qbqg>cNL$WWea%#xh<^rQ>%kq_+@RfdC1r(nBree3b+P@|E zLS46+62`sAA@s_c6Ll$ZJ28#?jquZR_NSZ;R$?`4flo!}UcgbgQZecI&WbI8~Fgm-|7)aL$S`l(ye@d2}eM+!D8q-uX1OrQS@eYjHiUlJd1PtNr|Xd~7)dIOsq-FB7b zcfXg_Z`(WX%*8d;p5rL$txL<#uO|(-IzI0{$b{#hC=&c5d9>7=(-ds%x)aH^o7Yg$ zHJ@SMY!&tFo;B^iV0pkl!=rw%P^5QA8_Hb-yGwQ5{4{q1XvVWx*8+7eQuT9pH{$YM z7ofMRs`e7CtDuG-M*M9*e9$o@=&Hk1bNrx-rn-?h&$#GRg~Cv#?Q7#@>p3x^(<`W2 z9s?xv_GiqrTsi6J@;06ta$V0{OV>JMWE(lrGd%~XCeu3}D=0=(9m7K!3H?wvBN2Gq z2VJHWH3o`Swcu>IU(SoCil#cf2Y^|ZZ-|XO&umwXve!PqE*nmjSD+~EYk!WG+~>@O zXOkt|+zwN5nrMQVyEfN11<6;vn|(yZ7ALnk(6d0BqVtQ6TE?QOIIQU2&acvUOAlqv z%c}Cwq1pQI8x7xUQe0nNq7E+y#Iu9j{zTXJ}(l`=}d4#~=H=4h}rzzhb zSB)j;XSO3lNQHMFS-Yn!{2sGJa{V~pM&{&lqHL{v7H-3a-%%Djcve`d4THQ0bl#t} z6+5K=AjxGrAUL`gs$dbCGu_h&^vqGdPwnJ^IR2DzWlUS*F#z? zkEsmpgpB|G<}LMhQA2jGek3%TEZwaF8b_hU)y=GCp658RYdN6gjUlvmIB{`bt~i{2fJ8|Ts_^mg|L zP;GMXU#lRvCLbSW`<`8wpJdTMdvn^T6(dqB(8$v(w;#N3#;-<fK^hvm% z{V^Zbl)YMM56c3IpQCd7t}edP486pT;tmTB_IS96t5~o!cU`|>Un`qYvm{k*MB0Lm z+@-#K?LP6cZaK8XkGOnxkcm2z%`OdCWhSU>Nu}ueYjW1UfL5sn$f}k_c=XzZ8_Z~U zH=w}U(6vEs(-G%Wa0Fz^kVXV3HkFegFqIlRYC91|@27Mr6JE85rl|-URi|m%Tu7+R zw)Qg0&W3O`@+^nK$Vk)}1@==o6wYogzOH`~|ELTdk`cGUq`5ASq=>E**H`Zy36@YN zv8DW^)n`$Mmb4pCk7|{-k29#0=PCzT_&pIxx?nFC%JTQZVkO|(=vVI5LpimhPwH*E z1dqK8w2EEnky6#-s@x5b2|6&VWRras>)5;j#g0q%|0-N46}B9pfVMo_~IkL_a-i-q7M;pxZ<~sgqBtfpb2~~wvFPHly z!C(ou&P`ahS6>k)fTBz9I~hu-pfd6j<4+h!8U1IpAyc!L*xzU-RuzUXHqg^&r?C^p zEXYGUk}knA%tJri`x3*{RWG68FaU;o0TMX@2XX3pZy0)B_tYA)TZ9!|g2<+gZ1n9; z^{|#4omt*DGxmci3XdbY&DP3uPszg9ido}liGh|Z@)qMGa0ETQ%h8jF*Q!YWSDE8Ep@YPLf5bS1Uf4%N*mtMr`aE zfcnF>uN<3mwN1Xe?;OHtI9rfst~29c1Q#}Jm4!V1t((3rkDWIB#Ws(#C^~BCG#BPV zlLOzxB!|1W<7}wuyGF%RvyO6WL}0&35Xl`ugNLqgr3( z!6DIS(XVCM@oIhWV285ZM$^<#@fQ6uhQf&)ks|k9;>|r%O47Q)wYx=D-GN6MtX#TB zFAI|5`4v;_5+KzYbQlTZ4}pc?FaJ9AAiKzEF%{cRu=T-wJdZlG=|OQv%n65pAhT0e zlGcw};Yyq^nmF}w%;(F!mx*&k<5N9hFPC$@pMaXp^U1c=7s2@~6~>F}(!c5B71f!q z()#opt>6skV`@3aCIaH+!nO>ZiRj47b4^+&dRyaO* zPd{+2Dtss04x{OzQ&>jM2=dFNHO5oPMs;!9g3O?v3`W%NB>l@{M8}|4kAKe2p`_kU>y?~EiBcCu>Y-?E5`Irl1cGgT5=h4k+v^8g5AsSdiEW3lw)`WuCyijfFLdM9PVnvaOI< z1n-$e!xS=xJBU7v;SkkCDBiaMPn7xIarpcqeo8iL-VReEhX&e>x`s-4anFU#a=dtA z@tqm2W%GfU55(9jQ1G4dF5Ae)Q@Vmi9qNLgjcPD^$TEZVD?`! z-9mcvYz#vE-pWBOPLhJkL z(oU&UXxF%k%jqXR(pBEpzKIlQWrttSGzb&hj zKHXAn-YE<`NuGcR-_O1|`;xnVFbZzbRab$<3v0i_zPQ#sdcz-dP50;%PMDlT3^PIX zVtt-}KgT!5DwUFt4O7?ap0GQoMMU_kwUZ6QJ&)c0s_Yw>^L^{nciXB!((amo$XP9o z=Tm~#mq_4wq6HQXR)}h7> zN{GlfdAO<}U%g*Vm+xdCGE=f3vT{5>wWAP1e*SyuB#&r90Saq7|z z?B#cDRQf)gA(R;+KF`uFF^%1Z`=Z23J)vsh5i7@H@l3N`8dOKAHV#9YZ8anDdb<@r zuG8KLpr8;l_^*mC^=h`{&@;7;qx_jQcRr=a3s}8HY}|rw)2<~9c6sv3=evg~%pE@{ z^YwU}WRBy)onSM@?s7a-n07za?4DX9x$5Hvec!esF+(Cf;_KN>l(QYXT)RVsO(YC3 zlnO%4CPBql?}iP7{$uXT)alOj2bQDY9n;dNnIbX9zi+5Aj!MXS@@jZD8$1T z4$wlG&(3fm;r3|F-v-g*80SnW95#6p@W3*Sly!oub*9D}Wx1^Hf$-=$jp8NFmVX*zs zhwEfJrSh;x4FSgwGJcdUc&@Iv7fF^kzZd26Ng>891 z(S1C>&B>^)su&OBw$3g~v1QOgi^K#izW}4Fpt3vGls!+|vdbOvCpRcZbY&K=}7&Gm0d%k)sm?G10HgL%r-|`!dckvf=URUGUnG=Wi|T~eRM5byhndLZ37uBL~Gjr z+OgD6DOVfTSkUX*VL$enU}^mT<^US!J|HX9j)Jkh@8ddrmUacYhLCO#0>G$Nce5Tp z_^!{<4c=3>QBXNj`}t-=ej`qMp7s8GPwibYq${M70c=L|5!GGt>o3S09Uostm0#^- zp0_!V!5t`G!MA35Z+W*Q1y8JO-$TOEnx*f0q2N0x%lpo!!5$vy+w8Gluf#eh1-f&$ zLnGk@Zsd}_uI~Fqls~GPyJieV1fw`h!z0HVka`xiZfc zh$cbW^3I`x(?Z$$sAb>Y4)#>Yy=D- zW9gXDL`YJzv~iG@-J$2I>Mvd+h~`ilDCA?-Z7`iKn~bXKN6colsIzDgib=3;f22Ge@4?~h{vo^-amVzvd+!o@%-i#W zIhjgG9QCW3OF`J{;-dKCA_{84bQ;~VToIWA0;X*AFo}G@7yw!VQ&JaEE$ym8`SK(g6fAM8c=P`1=8nCYuaZY zbRko9w|AchVe{9y4lr0Dan}Se|%BfqYBQjO0TDKsm>qMIgW!ylSTMN(fN|4X4sn+qg8^irX~W5K*CSb*rG97jw>9Gv|Cc`{RDzz1Ci9Kl}ag zfBw&J5A`WrNfDBQ}!$lV9S&DeXepG~ibbX<)8{oc#i-;?#xYj58 z78SiJc>$~Cbjv(zX=Ug5QR2sQSBI2^pwuRH4 z^nps}tm{H7#b)Y`(hn@?SYi=zm=77X6$7<+NsV0r;y*s(qkq{JSlxVdt{NYej5oc^ zG~CnRk_+4OT56^9!bL@nrwM>!mu7bgBKQCG0RAZQW=mMb@~p!Qt-yT?3HG7Ac2lKzx7aYJjgnkjfy6sfsWSu z5VXH@@)=*VCy4u+SQ@WEsp=!Ba6aZ-o6`{{!>S8w^oNkrENg8(YW(hI!dtdw81Dj- z*LtI;Xtp;YRO^uXq3$9joLGovAw}^8$ zlr&u~l=DRzmyUT5Os;^gnfKhx(RfPkDOrfif#sJ_4^@Yz+PxMb9(Tl;E@ff&a`_g| zKFBP#_AgYDPk0B3Ir8rDscUQ?^M6im#JW)6S&nA~3xqm%Tn+jtJ2FwPY!ozfW^T4^7?SLNDWM~Ri(3FdDX1$nD)ii`v_9K0Vty&x zf+>dNVXW^T90u7P-(lC(cr6|4C)0x+!U|s08_Qjo>4IW1-z79sHZB7{3A;qe5+H&9 ztHb5b`OE@OG)ZvFkyOPr94Qjh5@$$BOPpfv|&bi5SZUT!W9h>HtC*2vRw{sd>KE^^B_9@Ah|zSqEZ~W8mQ=TWM20Ow09+d2n2PzqX5Xl$YpBP(VvEn z_8!zH>Z8WpsiW%5#ZT?Z=jsBo4F~SV-CkQoBU+K)Rl|PS;FHr}=-+rr!wJ~Ls5$Ou zHv&-~An~huZ+dPula08tRpPpq@%?S8tfD!>x^ zzKl^^9r8)qhHE|^IH0pVDNs1Ixo_}2a!b3fBNw7kUH@Rqo_*0T*<c+uyMAgo%T)o7mde$&;S4c literal 42897 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 Date: Mon, 26 Dec 2016 12:27:01 +0300 Subject: [PATCH 34/42] Update version --- apps/api/documents/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index adbc4a6d9..179c2eeb9 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -557,7 +557,7 @@ }; DocsAPI.DocEditor.version = function() { - return '4.2.0'; + return '4.2.4'; }; MessageDispatcher = function(fn, scope) { From e93ec60426e9654466534ffd17df2330a08dc4f5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 26 Dec 2016 13:54:36 +0300 Subject: [PATCH 35/42] [DE] Insert custom footnotes. --- .../main/app/controller/Toolbar.js | 6 +-- .../main/app/view/NoteSettingsDialog.js | 49 +++++++++---------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index cb747531e..a77014f83 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2014,10 +2014,10 @@ define([ handler: function(result, settings) { if (settings) { if (result == 'insert') { - me.api.asc_SetFootnoteProps(settings); - me.api.asc_AddFootnote(); + me.api.asc_SetFootnoteProps(settings.props); + me.api.asc_AddFootnote(settings.custom); } else if (result == 'apply') { - me.api.asc_SetFootnoteProps(settings); + me.api.asc_SetFootnoteProps(settings.props); } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index f32005b37..ab2049642 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -123,7 +123,7 @@ define([ '', '' ].join('') @@ -149,11 +149,11 @@ define([ menuStyle: 'min-width: 150px;', editable: false, data: [ - { displayValue: this.textPageBottom, value: Asc.c_oAscFootnotePos.section_footnote_PosPageBottom }, - { displayValue: this.textTextBottom, value: Asc.c_oAscFootnotePos.section_footnote_PosBeneathText } + { displayValue: this.textPageBottom, value: Asc.c_oAscFootnotePos.PageBottom }, + { displayValue: this.textTextBottom, value: Asc.c_oAscFootnotePos.BeneathText } ] }); - this.cmbFootnote.setValue(Asc.c_oAscFootnotePos.section_footnote_PosPageBottom); + this.cmbFootnote.setValue(Asc.c_oAscFootnotePos.PageBottom); this.cmbFormat = new Common.UI.ComboBox({ el: $('#note-settings-combo-format'), @@ -161,11 +161,11 @@ define([ menuStyle: 'min-width: 150px;', editable: false, data: [ - { displayValue: '1, 2, 3,...', value: 1, maskExp: /[0-9]/, defValue: 1 }, - { displayValue: 'a, b, c,...', value: 5, maskExp: /[a-z]/, defValue: 'a' }, - { displayValue: 'A, B, C,...', value: 4, maskExp: /[A-Z]/, defValue: 'A' }, - { displayValue: 'i, ii, iii,...', value: 7, maskExp: /[ivxlcdm]/, defValue: 'i' }, - { displayValue: 'I, II, III,...', value: 3, maskExp: /[IVXLCDM]/, defValue: 'I' } + { displayValue: '1, 2, 3,...', value: c_oAscNumberingFormat.Decimal, maskExp: /[0-9]/, defValue: 1 }, + { displayValue: 'a, b, c,...', value: c_oAscNumberingFormat.LowerLetter, maskExp: /[a-z]/, defValue: 'a' }, + { displayValue: 'A, B, C,...', value: c_oAscNumberingFormat.UpperLetter, maskExp: /[A-Z]/, defValue: 'A' }, + { displayValue: 'i, ii, iii,...', value: c_oAscNumberingFormat.LowerRoman, maskExp: /[ivxlcdm]/, defValue: 'i' }, + { displayValue: 'I, II, III,...', value: c_oAscNumberingFormat.UpperRoman, maskExp: /[IVXLCDM]/, defValue: 'I' } ] }); this.cmbFormat.setValue(this.FormatType); @@ -190,12 +190,12 @@ define([ menuStyle: 'min-width: 150px;', editable: false, data: [ - { displayValue: this.textContinue, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous }, - { displayValue: this.textEachSection, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartEachSect }, - { displayValue: this.textEachPage, value: Asc.c_oAscFootnoteRestart.section_footnote_RestartEachPage } + { displayValue: this.textContinue, value: Asc.c_oAscFootnoteRestart.Continuous }, + { displayValue: this.textEachSection, value: Asc.c_oAscFootnoteRestart.EachSect }, + { displayValue: this.textEachPage, value: Asc.c_oAscFootnoteRestart.EachPage } ] }); - this.cmbNumbering.setValue(Asc.c_oAscFootnoteRestart.section_footnote_RestartContinuous); + this.cmbNumbering.setValue(Asc.c_oAscFootnoteRestart.Continuous); this.txtCustom = new Common.UI.InputField({ el : $('#note-settings-txt-custom'), @@ -207,6 +207,7 @@ define([ }).on ('changing', function (input, value) { me.cmbFormat.setDisabled(value.length>0); me.spnStart.setDisabled(value.length>0); + me.btnApply.setDisabled(value.length>0); }); this.cmbApply = new Common.UI.ComboBox({ @@ -221,6 +222,10 @@ define([ }); this.cmbApply.setValue(Asc.section_footnote_RestartContinuous); + this.btnApply = new Common.UI.Button({ + el: $('#note-settings-btn-apply') + }); + this.afterRender(); }, @@ -248,11 +253,6 @@ define([ this.cmbNumbering.setValue(val); /* - val = props.get_Custom(); - this.txtCustom.setValue(val); - this.cmbFormat.setDisabled(!_.isEmpty(val)); - this.spnStart.setDisabled(!_.isEmpty(val)); - val = props.get_ApplyTo(); this.cmbApply.setValue(val); */ @@ -269,17 +269,14 @@ define([ if (_.isEmpty(val)) { val = this.cmbFormat.getValue(); props.put_NumFormat(val); - // if (val==1) props.put_NumStart(this.spnStart.getNumberValue()); - // else - // props.put_NumStart(this.txtStart.getValue()); } else { // props.set_Custom(val); } // props.put_ApplyTo(this.cmbApply.getValue()); - return props; + return {props: props, custom: _.isEmpty(val) ? undefined : val}; }, onDlgBtnClick: function(event) { @@ -303,19 +300,19 @@ define([ var me = this; switch (record.value) { - case 3: // I, II, III, ... + case c_oAscNumberingFormat.UpperRoman: // I, II, III, ... this.spnStart.options.toCustomFormat = this._10toRome; this.spnStart.options.fromCustomFormat = this._Rometo10; break; - case 7: // i, ii, iii, ... + case c_oAscNumberingFormat.LowerRoman: // i, ii, iii, ... this.spnStart.options.toCustomFormat = function(value) { return me._10toRome(value).toLocaleLowerCase(); }; this.spnStart.options.fromCustomFormat = function(value) { return me._Rometo10(value.toLocaleUpperCase()); }; break; - case 4: // A, B, C, ... + case c_oAscNumberingFormat.UpperLetter: // A, B, C, ... this.spnStart.options.toCustomFormat = this._10toS; this.spnStart.options.fromCustomFormat = this._Sto10; break; - case 5: // a, b, c, ... + case c_oAscNumberingFormat.LowerLetter: // a, b, c, ... this.spnStart.options.toCustomFormat = function(value) { return me._10toS(value).toLocaleLowerCase(); }; this.spnStart.options.fromCustomFormat = function(value) { return me._Sto10(value.toLocaleUpperCase()); }; break; From 96dba54f6d623f9b19d196321cb9372c9c74866c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 26 Dec 2016 17:07:50 +0300 Subject: [PATCH 36/42] [DE] Show footnote tooltip. Debug applying note settings. Fix fast mousemove from one footnote/hyperlink to another. --- apps/common/main/lib/component/Tooltip.js | 4 +- apps/common/main/resources/less/tooltip.less | 4 + .../main/app/controller/Toolbar.js | 7 +- .../main/app/view/DocumentHolder.js | 104 +++++++++++------- .../main/app/view/NoteSettingsDialog.js | 17 +-- 5 files changed, 78 insertions(+), 58 deletions(-) diff --git a/apps/common/main/lib/component/Tooltip.js b/apps/common/main/lib/component/Tooltip.js index 71e36dd4c..c9af406cf 100644 --- a/apps/common/main/lib/component/Tooltip.js +++ b/apps/common/main/lib/component/Tooltip.js @@ -120,8 +120,8 @@ this.getBSTip().show(at); }, - hide: function() { - this.getBSTip().hide(); + hide: function(callback) { + this.getBSTip().hide(callback); }, setTitle: function(title) { diff --git a/apps/common/main/resources/less/tooltip.less b/apps/common/main/resources/less/tooltip.less index d2ae02886..728459182 100644 --- a/apps/common/main/resources/less/tooltip.less +++ b/apps/common/main/resources/less/tooltip.less @@ -50,3 +50,7 @@ word-wrap: break-word; max-width: 300px; } + +.link-tooltip .tooltip-inner { + max-width: 500px; +} \ No newline at end of file diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index a77014f83..6a7508131 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2013,12 +2013,9 @@ define([ api: me.api, handler: function(result, settings) { if (settings) { - if (result == 'insert') { - me.api.asc_SetFootnoteProps(settings.props); + me.api.asc_SetFootnoteProps(settings.props, settings.applyToAll); + if (result == 'insert') me.api.asc_AddFootnote(settings.custom); - } else if (result == 'apply') { - me.api.asc_SetFootnoteProps(settings.props); - } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); }, diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 7cd5aef47..47d1b05d5 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -327,7 +327,8 @@ define([ toolTip: new Common.UI.Tooltip({ owner: this, html: true, - title: '
Press Ctrl and click link' + title: '
Press Ctrl and click link', + cls: 'link-tooltip' // style: 'word-wrap: break-word;' }), strTip: '', @@ -335,7 +336,6 @@ define([ isVisible: false }; - /** coauthoring begin **/ var userTooltip = true; @@ -401,7 +401,6 @@ define([ }; var onMouseMoveStart = function() { - screenTip.isHidden = true; /** coauthoring begin **/ if (me.usertips.length>0) { @@ -418,10 +417,18 @@ define([ /** coauthoring end **/ }; + var mouseMoveData = null, + isTooltipHiding = false; + var onMouseMoveEnd = function() { if (screenTip.isHidden && screenTip.isVisible) { screenTip.isVisible = false; - screenTip.toolTip.hide(); + isTooltipHiding = true; + screenTip.toolTip.hide(function(){ + isTooltipHiding = false; + if (mouseMoveData) onMouseMove(mouseMoveData); + mouseMoveData = null; + }); } }; @@ -436,42 +443,63 @@ define([ } if (moveData) { - var showPoint, ToolTip; + var showPoint, ToolTip, + type = moveData.get_Type(); - if (moveData.get_Type()==1) { // 1 - hyperlink - var hyperProps = moveData.get_Hyperlink(); - var recalc = false; - if (hyperProps) { - screenTip.isHidden = false; - - ToolTip = (_.isEmpty(hyperProps.get_ToolTip())) ? hyperProps.get_Value() : hyperProps.get_ToolTip(); - ToolTip = Common.Utils.String.htmlEncode(ToolTip); - - if (screenTip.tipLength !== ToolTip.length || screenTip.strTip.indexOf(ToolTip)<0 ) { - screenTip.toolTip.setTitle(ToolTip + '
' + me.txtPressLink + ''); - screenTip.tipLength = ToolTip.length; - screenTip.strTip = ToolTip; - recalc = true; - } - - showPoint = [moveData.get_X(), moveData.get_Y()]; - showPoint[1] += (me._XY[1]-15); - showPoint[0] += (me._XY[0]+5); - - if (!screenTip.isVisible || recalc) { - screenTip.isVisible = true; - screenTip.toolTip.show([-10000, -10000]); - } - - if ( recalc ) { - screenTip.tipHeight = screenTip.toolTip.getBSTip().$tip.height(); - screenTip.tipWidth = screenTip.toolTip.getBSTip().$tip.width(); - } - showPoint[1] -= screenTip.tipHeight; - if (showPoint[0] + screenTip.tipWidth > me._BodyWidth ) - showPoint[0] = me._BodyWidth - screenTip.tipWidth; - screenTip.toolTip.getBSTip().$tip.css({top: showPoint[1] + 'px', left: showPoint[0] + 'px'}); + if (type==1 || type==3) { // 1 - hyperlink, 3 - footnote + if (isTooltipHiding) { + mouseMoveData = moveData; + return; } + + if (type==1) { + var hyperProps = moveData.get_Hyperlink(); + if (!hyperProps) return; + ToolTip = (_.isEmpty(hyperProps.get_ToolTip())) ? hyperProps.get_Value() : hyperProps.get_ToolTip(); + } else { + ToolTip = moveData.get_FootnoteText(); + if (ToolTip.length>1000) + ToolTip = ToolTip.substr(0, 1000) + '...'; + } + + var recalc = false; + screenTip.isHidden = false; + + ToolTip = Common.Utils.String.htmlEncode(ToolTip); + + if (screenTip.tipType !== type || screenTip.tipLength !== ToolTip.length || screenTip.strTip.indexOf(ToolTip)<0 ) { + screenTip.toolTip.setTitle((type==1) ? (ToolTip + '
' + me.txtPressLink + '') : ToolTip); + screenTip.tipLength = ToolTip.length; + screenTip.strTip = ToolTip; + screenTip.tipType = type; + recalc = true; + } + + showPoint = [moveData.get_X(), moveData.get_Y()]; + showPoint[1] += (me._XY[1]-15); + showPoint[0] += (me._XY[0]+5); + + if (!screenTip.isVisible || recalc) { + screenTip.isVisible = true; + screenTip.toolTip.show([-10000, -10000]); + } + + if ( recalc ) { + screenTip.tipHeight = screenTip.toolTip.getBSTip().$tip.height(); + screenTip.tipWidth = screenTip.toolTip.getBSTip().$tip.width(); + } + + recalc = false; + if (showPoint[0] + screenTip.tipWidth > me._BodyWidth ) { + showPoint[0] = me._BodyWidth - screenTip.tipWidth; + recalc = true; + } + if (showPoint[1] - screenTip.tipHeight < 0) { + showPoint[1] = (recalc) ? showPoint[1]+30 : 0; + } else + showPoint[1] -= screenTip.tipHeight; + + screenTip.toolTip.getBSTip().$tip.css({top: showPoint[1] + 'px', left: showPoint[0] + 'px'}); } /** coauthoring begin **/ else if (moveData.get_Type()==2 && me.mode.isEdit) { // 2 - locked object diff --git a/apps/documenteditor/main/app/view/NoteSettingsDialog.js b/apps/documenteditor/main/app/view/NoteSettingsDialog.js index ab2049642..518239fb8 100644 --- a/apps/documenteditor/main/app/view/NoteSettingsDialog.js +++ b/apps/documenteditor/main/app/view/NoteSettingsDialog.js @@ -216,11 +216,11 @@ define([ menuStyle: 'min-width: 150px;', editable: false, data: [ - { displayValue: this.textDocument, value: Asc.section_footnote_RestartContinuous }, - { displayValue: this.textSection, value: Asc.section_footnote_RestartEachSect } + { displayValue: this.textDocument, value: 1 }, + { displayValue: this.textSection, value: 0 } ] }); - this.cmbApply.setValue(Asc.section_footnote_RestartContinuous); + this.cmbApply.setValue(1); this.btnApply = new Common.UI.Button({ el: $('#note-settings-btn-apply') @@ -251,11 +251,6 @@ define([ val = props.get_NumRestart(); this.cmbNumbering.setValue(val); - - /* - val = props.get_ApplyTo(); - this.cmbApply.setValue(val); - */ } }, @@ -270,13 +265,9 @@ define([ val = this.cmbFormat.getValue(); props.put_NumFormat(val); props.put_NumStart(this.spnStart.getNumberValue()); - } else { - // props.set_Custom(val); } - // props.put_ApplyTo(this.cmbApply.getValue()); - - return {props: props, custom: _.isEmpty(val) ? undefined : val}; + return {props: props, applyToAll: (this.cmbApply.getValue()==1), custom: _.isEmpty(val) ? undefined : val}; }, onDlgBtnClick: function(event) { From b2c3707a6e823f1095b04af1d38df45643a7362d Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 27 Dec 2016 12:34:08 +0300 Subject: [PATCH 37/42] [DE] [PE] Change tooltip for Insert Chart button in the toolbar when chart is selected. --- apps/documenteditor/main/app/controller/Toolbar.js | 8 +++++++- apps/documenteditor/main/app/view/Toolbar.js | 3 ++- apps/documenteditor/main/locale/en.json | 1 + .../main/app/controller/Toolbar.js | 12 ++++++++++-- apps/presentationeditor/main/app/view/Toolbar.js | 3 ++- apps/presentationeditor/main/locale/en.json | 1 + 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 6a7508131..554b9e0f5 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -93,7 +93,8 @@ define([ can_copycut: undefined, pgmargins: undefined, fontsize: undefined, - in_equation: false + in_equation: false, + in_chart: false }; this.flg = {}; this.diagramEditor = null; @@ -685,6 +686,11 @@ define([ if ((need_disable || in_image) != toolbar.mnuInsertTextArt.isDisabled()) toolbar.mnuInsertTextArt.setDisabled(need_disable || in_image); + if (in_chart !== this._state.in_chart) { + toolbar.btnInsertChart.updateHint(in_chart ? toolbar.tipChangeChart : toolbar.tipInsertChart); + this._state.in_chart = in_chart; + } + need_disable = in_chart && image_locked || !in_chart && need_disable; if (need_disable != toolbar.btnInsertChart.isDisabled()) toolbar.btnInsertChart.setDisabled(need_disable); diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 691640944..d67518c35 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1958,7 +1958,8 @@ define([ mniInsFootnote: 'Insert Footnote', mniDelFootnote: 'Delete All Footnotes', mniNoteSettings: 'Notes Settings', - textGotoFootnote: 'Go to Footnotes' + textGotoFootnote: 'Go to Footnotes', + tipChangeChart: 'Change Chart Type' }, DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 9acef8bfc..33103d0c9 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1520,6 +1520,7 @@ "DE.Views.Toolbar.tipAlignLeft": "Align Left", "DE.Views.Toolbar.tipAlignRight": "Align Right", "DE.Views.Toolbar.tipBack": "Back", + "DE.Views.Toolbar.tipChangeChart": "Change Chart Type", "DE.Views.Toolbar.tipClearStyle": "Clear Style", "DE.Views.Toolbar.tipColorSchemas": "Change Color Scheme", "DE.Views.Toolbar.tipColumns": "Insert columns", diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 2707e9f24..90be0964d 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -95,7 +95,8 @@ define([ zoom_type: undefined, zoom_percent: undefined, fontsize: undefined, - in_equation: undefined + in_equation: undefined, + in_chart: false }; this._isAddingShape = false; this.slideSizeArr = [ @@ -570,7 +571,8 @@ define([ no_paragraph = true, no_text = true, no_object = true, - in_equation = false; + in_equation = false, + in_chart = false; while (++i < selectedObjects.length) { type = selectedObjects[i].get_ObjectType(); @@ -589,11 +591,17 @@ define([ if (type !== Asc.c_oAscTypeSelectElement.Image) { no_text = false; } + in_chart = type == Asc.c_oAscTypeSelectElement.Chart; } else if (type === Asc.c_oAscTypeSelectElement.Math) { in_equation = true; } } + if (in_chart !== this._state.in_chart) { + this.toolbar.btnInsertChart.updateHint(in_chart ? this.toolbar.tipChangeChart : this.toolbar.tipInsertChart); + this._state.in_chart = in_chart; + } + if (paragraph_locked!==undefined && this._state.prcontrolsdisable !== paragraph_locked) { if (this._state.activated) this._state.prcontrolsdisable = paragraph_locked; this.toolbar.lockToolbar(PE.enumLock.paragraphLock, paragraph_locked, {array: me.toolbar.paragraphControls}); diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 835419d9c..b0e19e85a 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1713,6 +1713,7 @@ define([ textShowCurrent: 'Show from Current slide', textShowSettings: 'Show Settings', tipInsertEquation: 'Insert Equation', - textCharts: 'Charts' + textCharts: 'Charts', + tipChangeChart: 'Change Chart Type' }, PE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 823150e19..fd577aea1 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -1233,6 +1233,7 @@ "PE.Views.Toolbar.tipAddSlide": "Add Slide", "PE.Views.Toolbar.tipAdvSettings": "Advanced Settings", "PE.Views.Toolbar.tipBack": "Back", + "PE.Views.Toolbar.tipChangeChart": "Change Chart Type", "PE.Views.Toolbar.tipChangeSlide": "Change Slide Layout", "PE.Views.Toolbar.tipClearStyle": "Clear Style", "PE.Views.Toolbar.tipColorSchemas": "Change Color Scheme", From a67e3d77905266c5cb924e49f90509cd8bcb3f15 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 27 Dec 2016 16:39:16 +0300 Subject: [PATCH 38/42] [SSE] Fix Bug 33733. --- apps/spreadsheeteditor/main/app/view/CellRangeDialog.js | 3 +++ apps/spreadsheeteditor/main/app/view/ChartSettings.js | 3 ++- apps/spreadsheeteditor/main/app/view/NamedRangeEditDlg.js | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js index 66babb558..6a16694b1 100644 --- a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js +++ b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js @@ -109,6 +109,9 @@ define([ this.inputRange.setValue(settings.range ? settings.range : ''); + if (settings.type===undefined) + settings.type = Asc.c_oAscSelectionDialogType.Chart; + if (settings.api) { me.api = settings.api; diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettings.js b/apps/spreadsheeteditor/main/app/view/ChartSettings.js index 10463b21b..0afaa942c 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettings.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettings.js @@ -979,7 +979,8 @@ define([ win.setSettings({ api : me.api, range : props.getRange(), - validation: validation + validation: validation, + type : Asc.c_oAscSelectionDialogType.Chart }); } }, diff --git a/apps/spreadsheeteditor/main/app/view/NamedRangeEditDlg.js b/apps/spreadsheeteditor/main/app/view/NamedRangeEditDlg.js index 3a8092487..429f06179 100644 --- a/apps/spreadsheeteditor/main/app/view/NamedRangeEditDlg.js +++ b/apps/spreadsheeteditor/main/app/view/NamedRangeEditDlg.js @@ -251,7 +251,8 @@ define([ win.show(xy.left + 65, xy.top + 77); win.setSettings({ api : me.api, - range : (!_.isEmpty(me.txtDataRange.getValue()) && (me.txtDataRange.checkValidate()==true)) ? me.txtDataRange.getValue() : me.dataRangeValid + range : (!_.isEmpty(me.txtDataRange.getValue()) && (me.txtDataRange.checkValidate()==true)) ? me.txtDataRange.getValue() : me.dataRangeValid, + type : Asc.c_oAscSelectionDialogType.Chart }); } }, From 1ed82bd37a1e33dcf00471db9f928f0f12248db7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Dec 2016 14:05:01 +0300 Subject: [PATCH 39/42] [DE] Disable insert footnotes button when paragraph is locked. --- apps/documenteditor/main/app/view/Toolbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index d67518c35..e7fd84e34 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -743,7 +743,7 @@ define([ iconCls : 'btn-notes', menu : true }); - this.toolbarControls.push(this.btnNotes); + this.paragraphControls.push(this.btnNotes); this.btnMailRecepients= new Common.UI.Button({ id : 'id-toolbar-btn-mailrecepients', From 14c2a177dead1a98c971607f4ec72256ec20bba4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Dec 2016 14:28:27 +0300 Subject: [PATCH 40/42] [SSE] Disable inserting sparklines when objects are selected (shape, image, chart). --- apps/common/main/lib/component/DataView.js | 8 +++++++- apps/common/main/resources/less/dataview.less | 13 ++++++++++--- .../main/app/controller/Toolbar.js | 13 ++++++++++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index 502c51852..8ece277ca 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -101,7 +101,8 @@ define([ id: Common.UI.getId(), selected: false, allowSelected: true, - value: null + value: null, + disabled: false } } }); @@ -142,6 +143,7 @@ define([ el.off('click').on('click', _.bind(this.onClick, this)); el.off('dblclick').on('dblclick', _.bind(this.onDblClick, this)); el.off('contextmenu').on('contextmenu', _.bind(this.onContextMenu, this)); + el.toggleClass('disabled', this.model.get('disabled')); if (!_.isUndefined(this.model.get('cls'))) el.addClass(this.model.get('cls')); @@ -159,10 +161,14 @@ define([ }, onClick: function(e) { + if (this.model.get('disabled')) return false; + this.trigger('click', this, this.model, e); }, onDblClick: function(e) { + if (this.model.get('disabled')) return false; + this.trigger('dblclick', this, this.model, e); }, diff --git a/apps/common/main/resources/less/dataview.less b/apps/common/main/resources/less/dataview.less index fa606e047..a212b8b65 100644 --- a/apps/common/main/resources/less/dataview.less +++ b/apps/common/main/resources/less/dataview.less @@ -46,12 +46,19 @@ display: inline-block; float: left; margin: 2px 4px 4px; - cursor: pointer; + + &:not(.disabled) { + cursor: pointer; + } + + &.disabled { + opacity: 0.5; + } .box-shadow(0 0 0 1px @gray); - &:hover, - &.selected { + &:hover:not(.disabled), + &.selected:not(.disabled) { .box-shadow(0 0 0 2px @primary); } } diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 68dddab0c..6c589aff1 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -100,7 +100,8 @@ define([ tablename: undefined, namedrange_locked: false, fontsize: undefined, - multiselect: false + multiselect: false, + sparklines_disabled: false }; var checkInsertAutoshape = function(e, action) { @@ -1625,6 +1626,16 @@ define([ toolbar.lockToolbar(SSE.enumLock.cantHyperlink, (selectionType == Asc.c_oAscSelectionType.RangeShapeText) && (this.api.asc_canAddShapeHyperlink()===false), { array: [toolbar.btnInsertHyperlink]}); + need_disable = selectionType != Asc.c_oAscSelectionType.RangeCells && selectionType != Asc.c_oAscSelectionType.RangeCol && + selectionType != Asc.c_oAscSelectionType.RangeRow && selectionType != Asc.c_oAscSelectionType.RangeMax; + if (this._state.sparklines_disabled !== need_disable) { + var len = toolbar.mnuInsertChartPicker.store.length; + for (var i=0; i<3; i++) { + toolbar.mnuInsertChartPicker.store.at(len-i-1).set({disabled: need_disable}); + this._state.sparklines_disabled = need_disable; + } + } + if (editOptionsDisabled) return; /* read font params */ From cf8ee5878d413ac6897ec37a3191d18bbe06613b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Dec 2016 14:54:48 +0300 Subject: [PATCH 41/42] [SSE] Disable changing type for the locked chart. --- apps/spreadsheeteditor/main/app/controller/Toolbar.js | 1 + apps/spreadsheeteditor/main/app/view/Toolbar.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 6c589aff1..869f4c620 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -2400,6 +2400,7 @@ define([ clear: [_set.selImage, _set.selChart, _set.selChartText, _set.selShape, _set.selShapeText, _set.coAuth] }); toolbar.lockToolbar(SSE.enumLock.coAuthText, is_objLocked); + toolbar.lockToolbar(SSE.enumLock.coAuthText, is_objLocked && (seltype==Asc.c_oAscSelectionType.RangeChart || seltype==Asc.c_oAscSelectionType.RangeChartText), { array: [toolbar.btnInsertChart] } ); } $('#ce-func-label').toggleClass('disabled', is_image || is_mode_2 || coauth_disable); diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index fd6b26c71..79ec7f70c 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -505,7 +505,7 @@ define([ id : 'id-toolbar-btn-insertchart', cls : 'btn-toolbar', iconCls : 'btn-insertchart', - lock : [_set.editCell, _set.selChartText, _set.selShape, _set.selShapeText, _set.selImage, _set.lostConnect, _set.coAuth], + lock : [_set.editCell, _set.selChartText, _set.selShape, _set.selShapeText, _set.selImage, _set.lostConnect, _set.coAuth, _set.coAuthText], menu : new Common.UI.Menu({ style: 'width: 435px;', items: [ From e9ae465f20af4f3789c5f489c11f9c3083005a4f Mon Sep 17 00:00:00 2001 From: Alexey Golubev Date: Mon, 9 Jan 2017 12:29:17 +0300 Subject: [PATCH 42/42] Changed version --- apps/api/documents/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index fd79dd7d9..179c2eeb9 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -557,7 +557,7 @@ }; DocsAPI.DocEditor.version = function() { - return '4.3.0'; + return '4.2.4'; }; MessageDispatcher = function(fn, scope) {